# -- # 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::Service; use strict; use warnings; use Kernel::System::VariableCheck (qw(:all)); our @ObjectDependencies = ( 'Kernel::Config', 'Kernel::System::Cache', 'Kernel::System::CheckItem', 'Kernel::System::DB', 'Kernel::System::Log', 'Kernel::System::Main', 'Kernel::System::Valid', ); =head1 NAME Kernel::System::Service - service lib =head1 DESCRIPTION All service functions. =head1 PUBLIC INTERFACE =head2 new() create an object my $ServiceObject = $Kernel::OM->Get('Kernel::System::Service'); =cut sub new { my ( $Type, %Param ) = @_; # allocate new hash for object my $Self = {}; bless( $Self, $Type ); $Self->{CacheType} = 'Service'; $Self->{CacheTTL} = 60 * 60 * 24 * 20; # load generator preferences module my $GeneratorModule = $Kernel::OM->Get('Kernel::Config')->Get('Service::PreferencesModule') || 'Kernel::System::Service::PreferencesDB'; if ( $Kernel::OM->Get('Kernel::System::Main')->Require($GeneratorModule) ) { $Self->{PreferencesObject} = $GeneratorModule->new(); } return $Self; } =head2 ServiceList() return a hash list of services my %ServiceList = $ServiceObject->ServiceList( Valid => 0, # (optional) default 1 (0|1) UserID => 1, ); =cut sub ServiceList { my ( $Self, %Param ) = @_; # check needed stuff if ( !$Param{UserID} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Need UserID!', ); return; } # check valid param if ( !defined $Param{Valid} ) { $Param{Valid} = 1; } # read cache my $CacheKey = 'ServiceList::Valid::' . $Param{Valid}; if ( $Param{Valid} && defined $Param{KeepChildren} && $Param{KeepChildren} eq '1' ) { $CacheKey .= '::KeepChildren::' . $Param{KeepChildren}; } my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return %{$Cache} if ref $Cache eq 'HASH'; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # ask database $DBObject->Prepare( SQL => 'SELECT id, name, valid_id FROM service', ); # fetch the result my %ServiceList; my %ServiceValidList; while ( my @Row = $DBObject->FetchrowArray() ) { $ServiceList{ $Row[0] } = $Row[1]; $ServiceValidList{ $Row[0] } = $Row[2]; } if ( !$Param{Valid} ) { $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \%ServiceList, ); return %ServiceList if !$Param{Valid}; } # get valid ids my @ValidIDs = $Kernel::OM->Get('Kernel::System::Valid')->ValidIDsGet(); # duplicate service list my %ServiceListTmp = %ServiceList; # add suffix for correct sorting for my $ServiceID ( sort keys %ServiceListTmp ) { $ServiceListTmp{$ServiceID} .= '::'; } my %ServiceInvalidList; SERVICEID: for my $ServiceID ( sort { $ServiceListTmp{$a} cmp $ServiceListTmp{$b} } keys %ServiceListTmp ) { my $Valid = scalar grep { $_ eq $ServiceValidList{$ServiceID} } @ValidIDs; next SERVICEID if $Valid; $ServiceInvalidList{ $ServiceList{$ServiceID} } = 1; delete $ServiceList{$ServiceID}; } # delete invalid services and children if ( !defined $Param{KeepChildren} || !$Param{KeepChildren} ) { for my $ServiceID ( sort keys %ServiceList ) { INVALIDNAME: for my $InvalidName ( sort keys %ServiceInvalidList ) { if ( $ServiceList{$ServiceID} =~ m{ \A \Q$InvalidName\E :: }xms ) { delete $ServiceList{$ServiceID}; last INVALIDNAME; } } } } # set cache $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \%ServiceList, ); return %ServiceList; } =head2 ServiceListGet() return a list of services with the complete list of attributes for each service my $ServiceList = $ServiceObject->ServiceListGet( Valid => 0, # (optional) default 1 (0|1) UserID => 1, ); returns $ServiceList = [ { ServiceID => 1, ParentID => 0, Name => 'MyService', NameShort => 'MyService', ValidID => 1, Comment => 'Some Comment' CreateTime => '2011-02-08 15:08:00', ChangeTime => '2011-06-11 17:22:00', CreateBy => 1, ChangeBy => 1, }, { ServiceID => 2, ParentID => 1, Name => 'MyService::MySubService', NameShort => 'MySubService', ValidID => 1, Comment => 'Some Comment' CreateTime => '2011-02-08 15:08:00', ChangeTime => '2011-06-11 17:22:00', CreateBy => 1, ChangeBy => 1, }, # ... ]; =cut sub ServiceListGet { my ( $Self, %Param ) = @_; # check needed stuff if ( !$Param{UserID} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Need UserID!', ); return; } # check valid param if ( !defined $Param{Valid} ) { $Param{Valid} = 1; } # check cached results my $CacheKey = 'Cache::ServiceListGet::Valid::' . $Param{Valid}; my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return $Cache if defined $Cache; # create SQL query my $SQL = 'SELECT id, name, valid_id, comments, create_time, create_by, change_time, change_by ' . 'FROM service'; if ( $Param{Valid} ) { $SQL .= ' WHERE valid_id IN (' . join ', ', $Kernel::OM->Get('Kernel::System::Valid')->ValidIDsGet() . ')'; } $SQL .= ' ORDER BY name'; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # ask database $DBObject->Prepare( SQL => $SQL, ); # fetch the result my @ServiceList; my %ServiceName2ID; while ( my @Row = $DBObject->FetchrowArray() ) { my %ServiceData; $ServiceData{ServiceID} = $Row[0]; $ServiceData{Name} = $Row[1]; $ServiceData{ValidID} = $Row[2]; $ServiceData{Comment} = $Row[3] || ''; $ServiceData{CreateTime} = $Row[4]; $ServiceData{CreateBy} = $Row[5]; $ServiceData{ChangeTime} = $Row[6]; $ServiceData{ChangeBy} = $Row[7]; # add service data to service list push @ServiceList, \%ServiceData; # build service id lookup hash $ServiceName2ID{ $ServiceData{Name} } = $ServiceData{ServiceID}; } for my $ServiceData (@ServiceList) { # create short name and parentid $ServiceData->{NameShort} = $ServiceData->{Name}; if ( $ServiceData->{Name} =~ m{ \A (.*) :: (.+?) \z }xms ) { my $ParentName = $1; $ServiceData->{NameShort} = $2; $ServiceData->{ParentID} = $ServiceName2ID{$ParentName}; } # get service preferences my %Preferences = $Self->ServicePreferencesGet( ServiceID => $ServiceData->{ServiceID}, ); # merge hash if (%Preferences) { %{$ServiceData} = ( %{$ServiceData}, %Preferences ); } } if (@ServiceList) { # set cache $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \@ServiceList, ); } return \@ServiceList; } =head2 ServiceGet() return a service as hash Return $ServiceData{ServiceID} $ServiceData{ParentID} $ServiceData{Name} $ServiceData{NameShort} $ServiceData{ValidID} $ServiceData{Comment} $ServiceData{CreateTime} $ServiceData{CreateBy} $ServiceData{ChangeTime} $ServiceData{ChangeBy} my %ServiceData = $ServiceObject->ServiceGet( ServiceID => 123, UserID => 1, ); my %ServiceData = $ServiceObject->ServiceGet( Name => 'Service::SubService', UserID => 1, ); =cut sub ServiceGet { my ( $Self, %Param ) = @_; # check needed stuff if ( !$Param{UserID} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need UserID!", ); return; } # either ServiceID or Name must be passed if ( !$Param{ServiceID} && !$Param{Name} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Need ServiceID or Name!', ); return; } # check that not both ServiceID and Name are given if ( $Param{ServiceID} && $Param{Name} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Need either ServiceID OR Name - not both!', ); return; } # lookup the ServiceID if ( $Param{Name} ) { $Param{ServiceID} = $Self->ServiceLookup( Name => $Param{Name}, ); } # check cached results my $CacheKey = 'Cache::ServiceGet::' . $Param{ServiceID}; my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return %{$Cache} if ref $Cache eq 'HASH'; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # get service from db $DBObject->Prepare( SQL => 'SELECT id, name, valid_id, comments, create_time, create_by, change_time, change_by ' . 'FROM service WHERE id = ?', Bind => [ \$Param{ServiceID} ], Limit => 1, ); # fetch the result my %ServiceData; while ( my @Row = $DBObject->FetchrowArray() ) { $ServiceData{ServiceID} = $Row[0]; $ServiceData{Name} = $Row[1]; $ServiceData{ValidID} = $Row[2]; $ServiceData{Comment} = $Row[3] || ''; $ServiceData{CreateTime} = $Row[4]; $ServiceData{CreateBy} = $Row[5]; $ServiceData{ChangeTime} = $Row[6]; $ServiceData{ChangeBy} = $Row[7]; } # check service if ( !$ServiceData{ServiceID} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "No such ServiceID ($Param{ServiceID})!", ); return; } # create short name and parentid $ServiceData{NameShort} = $ServiceData{Name}; if ( $ServiceData{Name} =~ m{ \A (.*) :: (.+?) \z }xms ) { $ServiceData{NameShort} = $2; # lookup parent my $ServiceID = $Self->ServiceLookup( Name => $1, ); $ServiceData{ParentID} = $ServiceID; } # get service preferences my %Preferences = $Self->ServicePreferencesGet( ServiceID => $Param{ServiceID}, ); # merge hash if (%Preferences) { %ServiceData = ( %ServiceData, %Preferences ); } # set cache $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \%ServiceData, ); return %ServiceData; } =head2 ServiceLookup() return a service name and id my $ServiceName = $ServiceObject->ServiceLookup( ServiceID => 123, ); or my $ServiceID = $ServiceObject->ServiceLookup( Name => 'Service::SubService', ); =cut sub ServiceLookup { my ( $Self, %Param ) = @_; # check needed stuff if ( !$Param{ServiceID} && !$Param{Name} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Need ServiceID or Name!', ); return; } if ( $Param{ServiceID} ) { # check cache my $CacheKey = 'Cache::ServiceLookup::ID::' . $Param{ServiceID}; my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return $Cache if defined $Cache; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # lookup $DBObject->Prepare( SQL => 'SELECT name FROM service WHERE id = ?', Bind => [ \$Param{ServiceID} ], Limit => 1, ); my $Result = ''; while ( my @Row = $DBObject->FetchrowArray() ) { $Result = $Row[0]; } $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => $Result, ); return $Result; } else { # check cache my $CacheKey = 'Cache::ServiceLookup::Name::' . $Param{Name}; my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return $Cache if defined $Cache; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # lookup $DBObject->Prepare( SQL => 'SELECT id FROM service WHERE name = ?', Bind => [ \$Param{Name} ], Limit => 1, ); my $Result = ''; while ( my @Row = $DBObject->FetchrowArray() ) { $Result = $Row[0]; } $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => $Result, ); return $Result; } } =head2 ServiceAdd() add a service my $ServiceID = $ServiceObject->ServiceAdd( Name => 'Service Name', ParentID => 1, # (optional) ValidID => 1, Comment => 'Comment', # (optional) UserID => 1, ); =cut sub ServiceAdd { my ( $Self, %Param ) = @_; # check needed stuff for my $Argument (qw(Name ValidID UserID)) { if ( !$Param{$Argument} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Argument!", ); return; } } # set comment $Param{Comment} ||= ''; # cleanup given params for my $Argument (qw(Name Comment)) { $Kernel::OM->Get('Kernel::System::CheckItem')->StringClean( StringRef => \$Param{$Argument}, RemoveAllNewlines => 1, RemoveAllTabs => 1, ); } # check service name if ( $Param{Name} =~ m{ :: }xms ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Can't add service! Invalid Service name '$Param{Name}'!", ); return; } # create full name $Param{FullName} = $Param{Name}; # get parent name if ( $Param{ParentID} ) { my $ParentName = $Self->ServiceLookup( ServiceID => $Param{ParentID}, ); if ($ParentName) { $Param{FullName} = $ParentName . '::' . $Param{Name}; } } # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # find existing service $DBObject->Prepare( SQL => 'SELECT id FROM service WHERE name = ?', Bind => [ \$Param{FullName} ], Limit => 1, ); my $Exists; while ( $DBObject->FetchrowArray() ) { $Exists = 1; } # add service to database if ($Exists) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "A service with the name and parent '$Param{FullName}' already exists.", ); return; } return if !$DBObject->Do( SQL => 'INSERT INTO service ' . '(name, valid_id, comments, create_time, create_by, change_time, change_by) ' . 'VALUES (?, ?, ?, current_timestamp, ?, current_timestamp, ?)', Bind => [ \$Param{FullName}, \$Param{ValidID}, \$Param{Comment}, \$Param{UserID}, \$Param{UserID}, ], ); # get service id $DBObject->Prepare( SQL => 'SELECT id FROM service WHERE name = ?', Bind => [ \$Param{FullName} ], Limit => 1, ); my $ServiceID; while ( my @Row = $DBObject->FetchrowArray() ) { $ServiceID = $Row[0]; } # reset cache $Kernel::OM->Get('Kernel::System::Cache')->CleanUp( Type => $Self->{CacheType}, ); return $ServiceID; } =head2 ServiceUpdate() update an existing service my $True = $ServiceObject->ServiceUpdate( ServiceID => 123, ParentID => 1, # (optional) Name => 'Service Name', ValidID => 1, Comment => 'Comment', # (optional) UserID => 1, ); =cut sub ServiceUpdate { my ( $Self, %Param ) = @_; # check needed stuff for my $Argument (qw(ServiceID Name ValidID UserID)) { if ( !$Param{$Argument} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Argument!", ); return; } } # set default comment $Param{Comment} ||= ''; # cleanup given params for my $Argument (qw(Name Comment)) { $Kernel::OM->Get('Kernel::System::CheckItem')->StringClean( StringRef => \$Param{$Argument}, RemoveAllNewlines => 1, RemoveAllTabs => 1, ); } # check service name if ( $Param{Name} =~ m{ :: }xms ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Can't update service! Invalid Service name '$Param{Name}'!", ); return; } # get old name of service my $OldServiceName = $Self->ServiceLookup( ServiceID => $Param{ServiceID}, ); if ( !$OldServiceName ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Can't update service! Service '$Param{ServiceID}' does not exist.", ); return; } # create full name $Param{FullName} = $Param{Name}; # get parent name if ( $Param{ParentID} ) { # lookup service my $ParentName = $Self->ServiceLookup( ServiceID => $Param{ParentID}, ); if ($ParentName) { $Param{FullName} = $ParentName . '::' . $Param{Name}; } # check, if selected parent was a child of this service if ( $Param{FullName} =~ m{ \A ( \Q$OldServiceName\E ) :: }xms ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Can\'t update service! Invalid parent was selected.' ); return; } } # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # find exists service $DBObject->Prepare( SQL => 'SELECT id FROM service WHERE name = ?', Bind => [ \$Param{FullName} ], Limit => 1, ); my $Exists; while ( my @Row = $DBObject->FetchrowArray() ) { if ( $Param{ServiceID} ne $Row[0] ) { $Exists = 1; } } # update service if ($Exists) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "A service with the name and parent '$Param{FullName}' already exists.", ); return; } # update service return if !$DBObject->Do( SQL => 'UPDATE service SET name = ?, valid_id = ?, comments = ?, ' . ' change_time = current_timestamp, change_by = ? WHERE id = ?', Bind => [ \$Param{FullName}, \$Param{ValidID}, \$Param{Comment}, \$Param{UserID}, \$Param{ServiceID}, ], ); my $LikeService = $DBObject->Quote( $OldServiceName, 'Like' ) . '::%'; # find all childs $DBObject->Prepare( SQL => "SELECT id, name FROM service WHERE name LIKE ?", Bind => [ \$LikeService ], ); my @Childs; while ( my @Row = $DBObject->FetchrowArray() ) { my %Child; $Child{ServiceID} = $Row[0]; $Child{Name} = $Row[1]; push @Childs, \%Child; } # update childs for my $Child (@Childs) { $Child->{Name} =~ s{ \A ( \Q$OldServiceName\E ) :: }{$Param{FullName}::}xms; $DBObject->Do( SQL => 'UPDATE service SET name = ? WHERE id = ?', Bind => [ \$Child->{Name}, \$Child->{ServiceID} ], ); } # reset cache $Kernel::OM->Get('Kernel::System::Cache')->CleanUp( Type => $Self->{CacheType}, ); return 1; } =head2 ServiceSearch() return service ids as an array my @ServiceList = $ServiceObject->ServiceSearch( Name => 'Service Name', # (optional) Limit => 122, # (optional) default 1000 UserID => 1, ); =cut sub ServiceSearch { my ( $Self, %Param ) = @_; # check needed stuff if ( !$Param{UserID} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Need UserID!', ); return; } # set default limit $Param{Limit} ||= 1000; # create sql query my $SQL = "SELECT id FROM service WHERE valid_id IN ( ${\(join ', ', $Kernel::OM->Get('Kernel::System::Valid')->ValidIDsGet())} )"; my @Bind; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); if ( $Param{Name} ) { # quote $Param{Name} = $DBObject->Quote( $Param{Name}, 'Like' ); # replace * with % and clean the string $Param{Name} =~ s{ \*+ }{%}xmsg; $Param{Name} =~ s{ %+ }{%}xmsg; my $LikeString = '%' . $Param{Name} . '%'; push @Bind, \$LikeString; $SQL .= " AND name LIKE ?"; } $SQL .= ' ORDER BY name'; # search service in db $DBObject->Prepare( SQL => $SQL, Bind => \@Bind, ); my @ServiceList; while ( my @Row = $DBObject->FetchrowArray() ) { push @ServiceList, $Row[0]; } return @ServiceList; } =head2 CustomerUserServiceMemberList() returns a list of customeruser/service members ServiceID: service id CustomerUserLogin: customer user login DefaultServices: activate or deactivate default services Result: HASH -> returns a hash of key => service id, value => service name Name -> returns an array of user names ID -> returns an array of user ids Example (get services of customer user): $ServiceObject->CustomerUserServiceMemberList( CustomerUserLogin => 'Test', Result => 'HASH', DefaultServices => 0, ); Example (get customer user of service): $ServiceObject->CustomerUserServiceMemberList( ServiceID => $ID, Result => 'HASH', ); =cut sub CustomerUserServiceMemberList { my ( $Self, %Param ) = @_; # check needed stuff if ( !$Param{Result} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Need Result!', ); return; } # set default (only 1 or 0 is allowed to correctly set the cache key) if ( !defined $Param{DefaultServices} || $Param{DefaultServices} ) { $Param{DefaultServices} = 1; } else { $Param{DefaultServices} = 0; } # get options for default services for unknown customers my $DefaultServiceUnknownCustomer = $Kernel::OM->Get('Kernel::Config')->Get('Ticket::Service::Default::UnknownCustomer'); if ( $DefaultServiceUnknownCustomer && $Param{DefaultServices} && !$Param{ServiceID} && !$Param{CustomerUserLogin} ) { $Param{CustomerUserLogin} = ''; } # check more needed stuff if ( !$Param{ServiceID} && !$Param{CustomerUserLogin} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Need ServiceID or CustomerUserLogin!', ); return; } # create cache key my $CacheKey = 'CustomerUserServiceMemberList::' . $Param{Result} . '::' . 'DefaultServices::' . $Param{DefaultServices} . '::'; if ( $Param{ServiceID} ) { $CacheKey .= 'ServiceID::' . $Param{ServiceID}; } elsif ( $Param{CustomerUserLogin} ) { $CacheKey .= 'CustomerUserLogin::' . $Param{CustomerUserLogin}; } # check cache my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); if ( $Param{Result} eq 'HASH' ) { return %{$Cache} if ref $Cache eq 'HASH'; } else { return @{$Cache} if ref $Cache eq 'ARRAY'; } # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # db quote for ( sort keys %Param ) { $Param{$_} = $DBObject->Quote( $Param{$_} ); } for (qw(ServiceID)) { $Param{$_} = $DBObject->Quote( $Param{$_}, 'Integer' ); } # sql my %Data; my @Data; my $SQL = 'SELECT scu.service_id, scu.customer_user_login, s.name ' . ' FROM ' . ' service_customer_user scu, service s' . ' WHERE ' . " s.valid_id IN ( ${\(join ', ', $Kernel::OM->Get('Kernel::System::Valid')->ValidIDsGet())} ) AND " . ' s.id = scu.service_id AND '; if ( $Param{ServiceID} ) { $SQL .= " scu.service_id = $Param{ServiceID}"; } elsif ( $Param{CustomerUserLogin} ) { $SQL .= " scu.customer_user_login = '$Param{CustomerUserLogin}'"; } $DBObject->Prepare( SQL => $SQL ); while ( my @Row = $DBObject->FetchrowArray() ) { my $Value = ''; if ( $Param{ServiceID} ) { $Data{ $Row[1] } = $Row[0]; $Value = $Row[0]; } else { $Data{ $Row[0] } = $Row[2]; } } if ( $Param{CustomerUserLogin} && $Param{CustomerUserLogin} ne '' && $Param{DefaultServices} && !keys(%Data) ) { %Data = $Self->CustomerUserServiceMemberList( CustomerUserLogin => '', Result => 'HASH', DefaultServices => 0, ); } # return result if ( $Param{Result} eq 'HASH' ) { $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \%Data, ); return %Data; } if ( $Param{Result} eq 'Name' ) { @Data = values %Data; } else { @Data = keys %Data; } $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \@Data, ); return @Data; } =head2 CustomerUserServiceMemberAdd() to add a member to a service if 'Active' is 0, the customer is removed from the service $ServiceObject->CustomerUserServiceMemberAdd( CustomerUserLogin => 'Test1', ServiceID => 6, Active => 1, UserID => 123, ); =cut sub CustomerUserServiceMemberAdd { my ( $Self, %Param ) = @_; # check needed stuff for my $Argument (qw(CustomerUserLogin ServiceID UserID)) { if ( !$Param{$Argument} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Argument!", ); return; } } # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # delete existing relation return if !$DBObject->Do( SQL => 'DELETE FROM service_customer_user WHERE customer_user_login = ? AND service_id = ?', Bind => [ \$Param{CustomerUserLogin}, \$Param{ServiceID} ], ); # return if relation is not active if ( !$Param{Active} ) { $Kernel::OM->Get('Kernel::System::Cache')->CleanUp( Type => $Self->{CacheType}, ); return; } # insert new relation my $Success = $DBObject->Do( SQL => 'INSERT INTO service_customer_user ' . '(customer_user_login, service_id, create_time, create_by) ' . 'VALUES (?, ?, current_timestamp, ?)', Bind => [ \$Param{CustomerUserLogin}, \$Param{ServiceID}, \$Param{UserID} ] ); $Kernel::OM->Get('Kernel::System::Cache')->CleanUp( Type => $Self->{CacheType}, ); return $Success; } =head2 ServicePreferencesSet() set service preferences $ServiceObject->ServicePreferencesSet( ServiceID => 123, Key => 'UserComment', Value => 'some comment', UserID => 123, ); =cut sub ServicePreferencesSet { my ( $Self, %Param ) = @_; $Self->{PreferencesObject}->ServicePreferencesSet(%Param); $Kernel::OM->Get('Kernel::System::Cache')->CleanUp( Type => $Self->{CacheType}, ); return 1; } =head2 ServicePreferencesGet() get service preferences my %Preferences = $ServiceObject->ServicePreferencesGet( ServiceID => 123, UserID => 123, ); =cut sub ServicePreferencesGet { my ( $Self, %Param ) = @_; return $Self->{PreferencesObject}->ServicePreferencesGet(%Param); } =head2 ServiceParentsGet() return an ordered list all parent service IDs for the given service from the root parent to the current service parent my $ServiceParentsList = $ServiceObject->ServiceParentsGet( ServiceID => 123, UserID => 1, ); returns $ServiceParentsList = [ 1, 2, ...]; =cut sub ServiceParentsGet { my ( $Self, %Param ) = @_; # check needed stuff for my $Needed (qw(UserID ServiceID)) { if ( !$Param{$Needed} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Need $Needed!', ); return; } } # read cache my $CacheKey = 'ServiceParentsGet::' . $Param{ServiceID}; my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return $Cache if ref $Cache; # get the list of services my $ServiceList = $Self->ServiceListGet( Valid => 0, UserID => 1, ); # get a service lookup table my %ServiceLookup; SERVICE: for my $ServiceData ( @{$ServiceList} ) { next SERVICE if !$ServiceData; next SERVICE if !IsHashRefWithData($ServiceData); next SERVICE if !$ServiceData->{ServiceID}; $ServiceLookup{ $ServiceData->{ServiceID} } = $ServiceData; } # exit if ServiceID is invalid return if !$ServiceLookup{ $Param{ServiceID} }; # to store the return structure my @ServiceParents; # get the ServiceParentID from the requested service my $ServiceParentID = $ServiceLookup{ $Param{ServiceID} }->{ParentID}; # get all partents for the requested service while ($ServiceParentID) { # add service parent ID to the return structure push @ServiceParents, $ServiceParentID; # set next ServiceParentID (the parent of the current parent) $ServiceParentID = $ServiceLookup{$ServiceParentID}->{ParentID} || 0; } # reverse the return array to get the list ordered from old to young (in parent context) my @Data = reverse @ServiceParents; # set cache $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \@Data, ); return \@Data; } =head2 GetAllCustomServices() get all custom services of one user my @Services = $ServiceObject->GetAllCustomServices( UserID => 123 ); =cut sub GetAllCustomServices { my ( $Self, %Param ) = @_; # check needed stuff if ( !$Param{UserID} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => 'Need UserID!', ); return; } # check cache my $CacheKey = 'GetAllCustomServices::' . $Param{UserID}; my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return @{$Cache} if $Cache; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # search all custom services return if !$DBObject->Prepare( SQL => ' SELECT service_id FROM personal_services WHERE user_id = ?', Bind => [ \$Param{UserID} ], ); # fetch the result my @ServiceIDs; while ( my @Row = $DBObject->FetchrowArray() ) { push @ServiceIDs, $Row[0]; } # set cache $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \@ServiceIDs, ); return @ServiceIDs; } 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