# -- # Copyright (C) 2001-2019 OTRS AG, https://otrs.com/ # -- # This software comes with ABSOLUTELY NO WARRANTY. For details, see # the enclosed file COPYING for license information (GPL). If you # did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt. # -- package Kernel::System::SystemAddress; use strict; use warnings; our @ObjectDependencies = ( 'Kernel::System::Cache', 'Kernel::System::DB', 'Kernel::System::Log', 'Kernel::System::Valid', ); =head1 NAME Kernel::System::SystemAddress - all system address functions =head1 DESCRIPTION Global module to add/edit/update system addresses. =head1 PUBLIC INTERFACE =head2 new() create an object my $SystemAddressObject = $Kernel::OM->Get('Kernel::System::SystemAddress'); =cut sub new { my ( $Type, %Param ) = @_; # allocate new hash for object my $Self = {}; bless( $Self, $Type ); $Self->{CacheType} = 'SystemAddress'; $Self->{CacheTTL} = 60 * 60 * 24 * 20; return $Self; } =head2 SystemAddressAdd() add system address with attributes my $ID = $SystemAddressObject->SystemAddressAdd( Name => 'info@example.com', Realname => 'Hotline', ValidID => 1, QueueID => 123, Comment => 'some comment', UserID => 123, ); =cut sub SystemAddressAdd { my ( $Self, %Param ) = @_; # check needed stuff for my $Needed (qw(Name ValidID Realname QueueID UserID)) { if ( !$Param{$Needed} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Needed!", ); return; } } # check if a system address with this name already exists if ( $Self->NameExistsCheck( Name => $Param{Name} ) ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "A system address with the name '$Param{Name}' already exists.", ); return; } # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # insert new system address return if !$DBObject->Do( SQL => 'INSERT INTO system_address (value0, value1, valid_id, comments, queue_id, ' . ' create_time, create_by, change_time, change_by)' . ' VALUES (?, ?, ?, ?, ?, current_timestamp, ?, current_timestamp, ?)', Bind => [ \$Param{Name}, \$Param{Realname}, \$Param{ValidID}, \$Param{Comment}, \$Param{QueueID}, \$Param{UserID}, \$Param{UserID}, ], ); # get system address id $DBObject->Prepare( SQL => 'SELECT id FROM system_address WHERE value0 = ? AND value1 = ?', Bind => [ \$Param{Name}, \$Param{Realname}, ], Limit => 1, ); # fetch the result my $ID; while ( my @Row = $DBObject->FetchrowArray() ) { $ID = $Row[0]; } $Kernel::OM->Get('Kernel::System::Cache')->CleanUp( Type => $Self->{CacheType}, ); return $ID; } =head2 SystemAddressGet() get system address with attributes my %SystemAddress = $SystemAddressObject->SystemAddressGet( ID => 1, ); returns: %SystemAddress = ( ID => 1, Name => 'info@example.com' Realname => 'Hotline', QueueID => 123, Comment => 'some comment', ValidID => 1, CreateTime => '2010-11-29 11:04:04', ChangeTime => '2010-12-07 12:33:56', ) =cut sub SystemAddressGet { my ( $Self, %Param ) = @_; # check needed stuff if ( !$Param{ID} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need ID!", ); return; } my $CacheKey = 'SystemAddressGet::' . $Param{ID}; my $Cached = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return %{$Cached} if ref $Cached eq 'HASH'; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # get system address return if !$DBObject->Prepare( SQL => 'SELECT value0, value1, comments, valid_id, queue_id, change_time, create_time ' . ' FROM system_address WHERE id = ?', Bind => [ \$Param{ID} ], Limit => 1, ); # fetch the result my %Data; while ( my @Data = $DBObject->FetchrowArray() ) { %Data = ( ID => $Param{ID}, Name => $Data[0], Realname => $Data[1], Comment => $Data[2], ValidID => $Data[3], QueueID => $Data[4], ChangeTime => $Data[5], CreateTime => $Data[6], ); } $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \%Data, ); return %Data; } =head2 SystemAddressUpdate() update system address with attributes $SystemAddressObject->SystemAddressUpdate( ID => 1, Name => 'info@example.com', Realname => 'Hotline', ValidID => 1, QueueID => 123, Comment => 'some comment', UserID => 123, ); =cut sub SystemAddressUpdate { my ( $Self, %Param ) = @_; # Check needed stuff. for my $Needed (qw(ID Name ValidID Realname QueueID UserID)) { if ( !$Param{$Needed} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Needed!", ); return; } } # Check if a system address with this name already exists. if ( $Self->NameExistsCheck( ID => $Param{ID}, Name => $Param{Name} ) ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "A system address with the name '$Param{Name}' already exists.", ); return; } # Check if a system address is used in some queue's or auto response's. if ( $Self->SystemAddressIsUsed( SystemAddressID => $Param{ID} ) && $Param{ValidID} > 1 ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "This system address '$Param{Name}' cannot be set to invalid, because it is used in one or more queue(s) or auto response(s).", ); return; } # Update system address. return if !$Kernel::OM->Get('Kernel::System::DB')->Do( SQL => 'UPDATE system_address SET value0 = ?, value1 = ?, comments = ?, valid_id = ?, ' . ' change_time = current_timestamp, change_by = ?, queue_id = ? WHERE id = ?', Bind => [ \$Param{Name}, \$Param{Realname}, \$Param{Comment}, \$Param{ValidID}, \$Param{UserID}, \$Param{QueueID}, \$Param{ID}, ], ); $Kernel::OM->Get('Kernel::System::Cache')->CleanUp( Type => $Self->{CacheType}, ); return 1; } =head2 SystemAddressList() get a list of system addresses my %List = $SystemAddressObject->SystemAddressList( Valid => 0, # optional, defaults to 1 ); returns: %List = ( '1' => 'sales@example.com', '2' => 'purchasing@example.com', '3' => 'service@example.com', ); =cut sub SystemAddressList { my ( $Self, %Param ) = @_; my $Valid = 1; if ( !$Param{Valid} && defined $Param{Valid} ) { $Valid = 0; } my $CacheKey = 'SystemAddressList::' . $Valid; my $Cached = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return %{$Cached} if ref $Cached eq 'HASH'; my $ValidSQL = ''; if ($Valid) { my $ValidIDs = join ',', $Kernel::OM->Get('Kernel::System::Valid')->ValidIDsGet(); $ValidSQL = " WHERE valid_id IN ($ValidIDs)"; } # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # get system address return if !$DBObject->Prepare( SQL => " SELECT id, value0 FROM system_address $ValidSQL", ); my %List; while ( my @Data = $DBObject->FetchrowArray() ) { $List{ $Data[0] } = $Data[1]; } $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \%List, ); return %List; } =head2 SystemAddressIsLocalAddress() Checks if the given address is a local (system) address. Returns true for local addresses. if ( $SystemAddressObject->SystemAddressIsLocalAddress( Address => 'info@example.com' ) ) { # is local } else { # is not local } =cut sub SystemAddressIsLocalAddress { my ( $Self, %Param ) = @_; # check needed stuff for my $Needed (qw(Address)) { if ( !$Param{$Needed} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Needed!", ); return; } } return $Self->SystemAddressQueueID(%Param); } =head2 SystemAddressQueueID() find dispatching queue id of email address my $QueueID = $SystemAddressObject->SystemAddressQueueID( Address => 'info@example.com' ); =cut sub SystemAddressQueueID { my ( $Self, %Param ) = @_; # check needed stuff for my $Needed (qw(Address)) { if ( !$Param{$Needed} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Needed!", ); return; } } # remove spaces $Param{Address} =~ s/\s+//g; my $CacheKey = 'SystemAddressQueueID::' . $Param{Address}; my $Cached = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return ${$Cached} if ref $Cached eq 'SCALAR'; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); if ( $DBObject->GetDatabaseFunction('CaseSensitive') ) { return if !$DBObject->Prepare( SQL => "SELECT queue_id FROM system_address WHERE " . "valid_id IN ( ${\(join ', ', $Kernel::OM->Get('Kernel::System::Valid')->ValidIDsGet())} ) " . "AND LOWER(value0) = LOWER(?)", Bind => [ \$Param{Address} ], Limit => 1, ); } else { return if !$DBObject->Prepare( SQL => "SELECT queue_id FROM system_address WHERE " . "valid_id IN ( ${\(join ', ', $Kernel::OM->Get('Kernel::System::Valid')->ValidIDsGet())} ) " . "AND value0 = ?", Bind => [ \$Param{Address} ], Limit => 1, ); } # fetch the result my $QueueID; while ( my @Row = $DBObject->FetchrowArray() ) { $QueueID = $Row[0]; } $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \$QueueID, ); return $QueueID; } =head2 SystemAddressQueueList() get a list of the queues and their system addresses IDs my %List = $SystemAddressObject->SystemAddressQueueList( Valid => 0, # optional, defaults to 1 ); returns: %List = ( '5' => 3, '7' => 1, '9' => 2, ); =cut sub SystemAddressQueueList { my ( $Self, %Param ) = @_; # set default value my $Valid = $Param{Valid} // 1; # create the valid list my $ValidIDs = join ', ', $Kernel::OM->Get('Kernel::System::Valid')->ValidIDsGet(); # build SQL my $SQL = 'SELECT queue_id, id FROM system_address'; # add WHERE statement in case Valid param is set to '1', for valid system address if ($Valid) { $SQL .= ' WHERE valid_id IN (' . $ValidIDs . ')'; } # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # get data from database return if !$DBObject->Prepare( SQL => $SQL, ); # fetch the result my %SystemAddressQueueList; while ( my @Row = $DBObject->FetchrowArray() ) { $SystemAddressQueueList{ $Row[0] } = $Row[1]; } return %SystemAddressQueueList; } =head2 NameExistsCheck() return 1 if another system address with this name already exists $Exist = $SystemAddressObject->NameExistsCheck( Name => 'Some Address', ID => 1, # optional ); =cut sub NameExistsCheck { my ( $Self, %Param ) = @_; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); return if !$DBObject->Prepare( SQL => 'SELECT id FROM system_address WHERE value0 = ?', Bind => [ \$Param{Name} ], ); # fetch the result my $Flag; while ( my @Row = $DBObject->FetchrowArray() ) { if ( !$Param{ID} || $Param{ID} ne $Row[0] ) { $Flag = 1; } } if ($Flag) { return 1; } return 0; } =head2 SystemAddressIsUsed() Return 1 if system address is used in one of the queue's or auto response's. $SytemAddressIsUsed = $SystemAddressObject->SystemAddressIsUsed( SystemAddressID => 1, ); =cut sub SystemAddressIsUsed { my ( $Self, %Param ) = @_; # Check needed param. if ( !$Param{SystemAddressID} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need SystemAddressID!" ); return; } # Get database object. my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); return if !$DBObject->Prepare( SQL => 'SELECT DISTINCT sa.id FROM system_address sa LEFT JOIN queue q ON q.system_address_id = sa.id LEFT JOIN auto_response ar ON ar.system_address_id = sa.id WHERE q.system_address_id = ? OR ar.system_address_id = ?', Bind => [ \$Param{SystemAddressID}, \$Param{SystemAddressID} ], Limit => 1, ); # Fetch the result. my $SystemAddressIsUsed; while ( my @Row = $DBObject->FetchrowArray() ) { $SystemAddressIsUsed = $Row[0] ? 1 : 0; } return $SystemAddressIsUsed; } 1; =head1 TERMS AND CONDITIONS This software is part of the OTRS project (L). This software comes with ABSOLUTELY NO WARRANTY. For details, see the enclosed file COPYING for license information (GPL). If you did not receive this file, see L. =cut