Files
scripts/Perl OTRS/Kernel/Modules/AdminCustomerUserService.pm
2024-10-14 00:08:40 +02:00

647 lines
20 KiB
Perl

# --
# 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::Modules::AdminCustomerUserService;
use strict;
use warnings;
use Kernel::Language qw(Translatable);
our $ObjectManagerDisabled = 1;
sub new {
my ( $Type, %Param ) = @_;
# allocate new hash for object
my $Self = {%Param};
bless( $Self, $Type );
return $Self;
}
sub Run {
my ( $Self, %Param ) = @_;
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request');
my $ServiceObject = $Kernel::OM->Get('Kernel::System::Service');
my $CustomerUserObject = $Kernel::OM->Get('Kernel::System::CustomerUser');
# set search limit
my $SearchLimit = 200;
# ------------------------------------------------------------ #
# allocate customer user
# ------------------------------------------------------------ #
if ( $Self->{Subaction} eq 'AllocateCustomerUser' ) {
# get params
$Param{CustomerUserLogin} = $ParamObject->GetParam( Param => 'CustomerUserLogin' )
|| '<DEFAULT>';
$Param{CustomerUserSearch} = $ParamObject->GetParam( Param => 'CustomerUserSearch' )
|| '*';
# output header
my $Output = $LayoutObject->Header();
$Output .= $LayoutObject->NavigationBar();
# get service member
my %ServiceMemberList = $ServiceObject->CustomerUserServiceMemberList(
CustomerUserLogin => $Param{CustomerUserLogin},
Result => 'HASH',
DefaultServices => 0,
);
# List services.
my %ServiceData = $ServiceObject->ServiceList(
KeepChildren => 1,
UserID => $Self->{UserID},
);
if ( $Param{CustomerUserLogin} eq '<DEFAULT>' ) {
$Param{Name} = q{};
}
else {
$Param{Name} = $CustomerUserObject->CustomerName( UserLogin => $Param{CustomerUserLogin} )
. " ($Param{CustomerUserLogin})";
}
$Output .= $Self->_Change(
ID => $Param{CustomerUserLogin},
Name => $Param{Name},
Data => \%ServiceData,
Selected => \%ServiceMemberList,
CustomerUserSearch => $Param{CustomerUserSearch},
ServiceSearch => $Param{ServiceSearch},
SearchLimit => $SearchLimit,
Type => 'CustomerUser',
);
$Output .= $LayoutObject->Footer();
return $Output;
}
# ------------------------------------------------------------ #
# allocate service
# ------------------------------------------------------------ #
elsif ( $Self->{Subaction} eq 'AllocateService' ) {
# get params
$Param{ServiceID} = $ParamObject->GetParam( Param => "ServiceID" );
$Param{Subaction} = $ParamObject->GetParam( Param => 'Subaction' );
$Param{CustomerUserSearch} = $ParamObject->GetParam( Param => "CustomerUserSearch" )
|| '*';
# output header
my $Output = $LayoutObject->Header();
$Output .= $LayoutObject->NavigationBar();
# get service
my %Service = $ServiceObject->ServiceGet(
ServiceID => $Param{ServiceID},
UserID => $Self->{UserID},
);
# get customer user member
my %CustomerUserMemberList = $ServiceObject->CustomerUserServiceMemberList(
ServiceID => $Param{ServiceID},
Result => 'HASH',
DefaultServices => 0,
);
# search customer user
my %CustomerUserList = $CustomerUserObject->CustomerSearch(
Search => $Param{CustomerUserSearch},
);
my @CustomerUserKeyList = sort { $CustomerUserList{$a} cmp $CustomerUserList{$b} } keys %CustomerUserList;
# set max count
my $MaxCount = @CustomerUserKeyList;
if ( $MaxCount > $SearchLimit ) {
$MaxCount = $SearchLimit;
}
my %CustomerData;
# output rows
for my $Counter ( 1 .. $MaxCount ) {
# get service
my %User = $CustomerUserObject->CustomerUserDataGet(
User => $CustomerUserKeyList[ $Counter - 1 ],
);
my $UserName = $CustomerUserObject->CustomerName(
UserLogin => $CustomerUserKeyList[ $Counter - 1 ]
);
my $CustomerUser = "$UserName <$User{UserEmail}> ($User{UserCustomerID})";
$CustomerData{ $User{UserID} } = $CustomerUser;
}
$Output .= $Self->_Change(
ID => $Param{ServiceID},
Name => $Service{Name},
ItemList => \@CustomerUserKeyList,
Data => \%CustomerData,
Selected => \%CustomerUserMemberList,
CustomerUserSearch => $Param{CustomerUserSearch},
SearchLimit => $SearchLimit,
Type => 'Service',
%Param,
);
$Output .= $LayoutObject->Footer();
return $Output;
}
# ------------------------------------------------------------ #
# allocate customer user save
# ------------------------------------------------------------ #
elsif ( $Self->{Subaction} eq 'AllocateCustomerUserSave' ) {
# challenge token check for write action
$LayoutObject->ChallengeTokenCheck();
# get params
$Param{CustomerUserLogin} = $ParamObject->GetParam( Param => 'ID' );
$Param{CustomerUserSearch} = $ParamObject->GetParam( Param => 'CustomerUserSearch' )
|| '*';
my @ServiceIDsSelected = $ParamObject->GetArray( Param => 'ItemsSelected' );
my @ServiceIDsAll = $ParamObject->GetArray( Param => 'ItemsAll' );
# create hash with selected ids
my %ServiceIDSelected = map { $_ => 1 } @ServiceIDsSelected;
# check all used service ids
for my $ServiceID (@ServiceIDsAll) {
my $Active = $ServiceIDSelected{$ServiceID} ? 1 : 0;
# set customer user service member
$ServiceObject->CustomerUserServiceMemberAdd(
CustomerUserLogin => $Param{CustomerUserLogin},
ServiceID => $ServiceID,
Active => $Active,
UserID => $Self->{UserID},
);
}
# if the user would like to continue editing the customer user allocating just redirect to the edit screen
if (
defined $ParamObject->GetParam( Param => 'ContinueAfterSave' )
&& ( $ParamObject->GetParam( Param => 'ContinueAfterSave' ) eq '1' )
)
{
return $LayoutObject->Redirect(
OP =>
"Action=$Self->{Action};Subaction=AllocateCustomerUser;CustomerUserLogin=$Param{CustomerUserLogin};CustomerUserSearch=$Param{CustomerUserSearch}"
);
}
else {
# otherwise return to relations overview
return $LayoutObject->Redirect(
OP => "Action=$Self->{Action};CustomerUserSearch=$Param{CustomerUserSearch}"
);
}
}
# ------------------------------------------------------------ #
# allocate service save
# ------------------------------------------------------------ #
elsif ( $Self->{Subaction} eq 'AllocateServiceSave' ) {
# challenge token check for write action
$LayoutObject->ChallengeTokenCheck();
# get params
$Param{ServiceID} = $ParamObject->GetParam( Param => "ID" );
$Param{CustomerUserSearch} = $ParamObject->GetParam( Param => 'CustomerUserSearch' )
|| '*';
my @CustomerUserLoginsSelected = $ParamObject->GetArray( Param => 'ItemsSelected' );
my @CustomerUserLoginsAll = $ParamObject->GetArray( Param => 'ItemsAll' );
# create hash with selected customer users
my %CustomerUserLoginsSelected;
for my $CustomerUserLogin (@CustomerUserLoginsSelected) {
$CustomerUserLoginsSelected{$CustomerUserLogin} = 1;
}
# check all used customer users
for my $CustomerUserLogin (@CustomerUserLoginsAll) {
my $Active = $CustomerUserLoginsSelected{$CustomerUserLogin} ? 1 : 0;
# set customer user service member
$ServiceObject->CustomerUserServiceMemberAdd(
CustomerUserLogin => $CustomerUserLogin,
ServiceID => $Param{ServiceID},
Active => $Active,
UserID => $Self->{UserID},
);
}
# if the user would like to continue editing the customer user allocating just redirect to the edit screen
if (
defined $ParamObject->GetParam( Param => 'ContinueAfterSave' )
&& ( $ParamObject->GetParam( Param => 'ContinueAfterSave' ) eq '1' )
)
{
return $LayoutObject->Redirect(
OP =>
"Action=$Self->{Action};Subaction=AllocateService;ServiceID=$Param{ServiceID};CustomerUserSearch=$Param{CustomerUserSearch}"
);
}
else {
# otherwise return to relations overview
return $LayoutObject->Redirect(
OP =>
"Action=$Self->{Action};CustomerUserSearch=$Param{CustomerUserSearch}"
);
}
}
# ------------------------------------------------------------ #
# overview
# ------------------------------------------------------------ #
else {
# get params
$Param{CustomerUserSearch} = $ParamObject->GetParam( Param => 'CustomerUserSearch' )
|| '*';
# output header
my $Output = $LayoutObject->Header();
$Output .= $LayoutObject->NavigationBar();
# search customer user
my %CustomerUserList = $CustomerUserObject->CustomerSearch(
Search => $Param{CustomerUserSearch},
);
my @CustomerUserKeyList = sort { $CustomerUserList{$a} cmp $CustomerUserList{$b} } keys %CustomerUserList;
# count results
my $CustomerUserCount = @CustomerUserKeyList;
# set max count
my $MaxCustomerCount = $CustomerUserCount;
if ( $MaxCustomerCount > $SearchLimit ) {
$MaxCustomerCount = $SearchLimit;
}
# output rows
my %UserRowParam;
for my $Counter ( 1 .. $MaxCustomerCount ) {
# set customer user row params
if ( defined( $CustomerUserKeyList[ $Counter - 1 ] ) ) {
# Get user details
my %User = $CustomerUserObject->CustomerUserDataGet(
User => $CustomerUserKeyList[ $Counter - 1 ]
);
my $UserName = $CustomerUserObject->CustomerName(
UserLogin => $CustomerUserKeyList[ $Counter - 1 ]
);
$UserRowParam{ $User{UserID} } = "$UserName <$User{UserEmail}> ($User{UserCustomerID})";
}
}
my %ServiceData = $ServiceObject->ServiceList(
KeepChildren => 1,
UserID => $Self->{UserID},
);
$Output .= $Self->_Overview(
CustomerUserCount => $CustomerUserCount,
CustomerUserKeyList => \@CustomerUserKeyList,
CustomerUserData => \%UserRowParam,
ServiceData => \%ServiceData,
SearchLimit => $SearchLimit,
CustomerUserSearch => $Param{CustomerUserSearch},
);
$Output .= $LayoutObject->Footer();
return $Output;
}
}
sub _Change {
my ( $Self, %Param ) = @_;
my $SearchLimit = $Param{SearchLimit};
my %Data = %{ $Param{Data} };
my $Type = $Param{Type} || 'CustomerUser';
my $NeType = $Type eq 'Service' ? 'CustomerUser' : 'Service';
my %VisibleType = (
CustomerUser => 'Customer',
Service => 'Service',
);
my %Subaction = (
CustomerUser => 'Change',
Service => 'ServiceEdit',
);
my %IDStrg = (
CustomerUser => 'ID',
Service => 'ServiceID',
);
my @ItemList = ();
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
if ( $VisibleType{$NeType} eq 'Customer' ) {
$Param{BreadcrumbTitle} = Translatable('Allocate Customer Users to Service');
}
else {
$Param{BreadcrumbTitle} = Translatable('Allocate Services to Customer User');
}
# overview
$LayoutObject->Block(
Name => 'Overview',
Data => {
%Param,
OverviewLink => $Self->{Action} . ';CustomerUserSearch=' . $Param{CustomerUserSearch},
},
);
$LayoutObject->Block( Name => 'ActionList' );
$LayoutObject->Block(
Name => 'ActionOverview',
Data => {
CustomerUserSearch => $Param{CustomerUserSearch},
},
);
if ( $NeType eq 'CustomerUser' ) {
@ItemList = @{ $Param{ItemList} };
# output search block
$LayoutObject->Block(
Name => 'Search',
Data => {
%Param,
CustomerUserSearch => $Param{CustomerUserSearch},
},
);
$LayoutObject->Block(
Name => 'SearchAllocateService',
Data => {
%Param,
Subaction => $Param{Subaction},
ServiceID => $Param{ServiceID},
},
);
}
else {
$LayoutObject->Block( Name => 'Filter' );
}
$LayoutObject->Block(
Name => 'AllocateItem',
Data => {
ID => $Param{ID},
ActionHome => 'Admin' . $Type,
Type => $Type,
NeType => $NeType,
VisibleType => $VisibleType{$Type},
VisibleNeType => $VisibleType{$NeType},
SubactionHeader => $Subaction{$Type},
IDHeaderStrg => $IDStrg{$Type},
Subaction => $Self->{Subaction},
%Param,
},
);
my $ColSpan = 2;
if ( $NeType eq 'CustomerUser' ) {
# output count block
if ( !@ItemList ) {
$LayoutObject->Block(
Name => 'AllocateItemCountLimit',
Data => { ItemCount => 0 },
);
$LayoutObject->Block(
Name => 'NoDataFoundMsgList',
Data => {
ColSpan => $ColSpan,
},
);
}
elsif ( @ItemList > $SearchLimit ) {
$LayoutObject->Block(
Name => 'AllocateItemCountLimit',
Data => { ItemCount => ">" . $SearchLimit },
);
}
else {
$LayoutObject->Block(
Name => 'AllocateItemCount',
Data => { ItemCount => scalar @ItemList },
);
}
}
# Service sorting.
my %ServiceData;
if ( $NeType eq 'Service' ) {
%ServiceData = %Data;
# add suffix for correct sorting
for my $DataKey ( sort keys %Data ) {
$Data{$DataKey} .= '::';
}
if ( !%ServiceData ) {
$LayoutObject->Block(
Name => 'NoDataFoundMsgList',
Data => {
ColSpan => $ColSpan,
},
);
}
}
# output rows
for my $ID ( sort { uc( $Data{$a} ) cmp uc( $Data{$b} ) } keys %Data ) {
# set checked
my $Checked = $Param{Selected}->{$ID} ? "checked='checked'" : '';
# Recover original Service Name
if ( $NeType eq 'Service' ) {
$Data{$ID} = $ServiceData{$ID};
}
# output row block
$LayoutObject->Block(
Name => 'AllocateItemRow',
Data => {
ActionNeHome => 'Admin' . $NeType,
Name => $Data{$ID},
ID => $ID,
Checked => $Checked,
SubactionRow => $Subaction{$NeType},
IDRowStrg => $IDStrg{$NeType},
},
);
}
# generate output
return $LayoutObject->Output(
TemplateFile => 'AdminCustomerUserService',
Data => \%Param,
);
}
sub _Overview {
my ( $Self, %Param ) = @_;
my $CustomerUserCount = $Param{CustomerUserCount};
my @CustomerUserKeyList = @{ $Param{CustomerUserKeyList} };
my $SearchLimit = $Param{SearchLimit};
my %CustomerUserData = %{ $Param{CustomerUserData} };
my %ServiceData = %{ $Param{ServiceData} };
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
# overview
$LayoutObject->Block(
Name => 'Overview',
Data => {
%Param,
OverviewLink => $Self->{Action},
},
);
$LayoutObject->Block( Name => 'ActionList' );
# output search block
$LayoutObject->Block(
Name => 'Search',
Data => {
%Param,
CustomerUserSearch => $Param{CustomerUserSearch},
},
);
$LayoutObject->Block(
Name => 'Default',
);
# output filter and default block
$LayoutObject->Block(
Name => 'Filter',
);
# output result block
$LayoutObject->Block(
Name => 'Result',
Data => {
%Param,
CustomerUserCount => $CustomerUserCount,
},
);
# output customer user count block
if ( !@CustomerUserKeyList ) {
$LayoutObject->Block(
Name => 'ResultCustomerUserCountLimit',
Data => { CustomerUserCount => 0 },
);
$LayoutObject->Block(
Name => 'NoDataFoundMsg',
);
}
elsif ( @CustomerUserKeyList > $SearchLimit ) {
$LayoutObject->Block(
Name => 'ResultCustomerUserCountLimit',
Data => { CustomerUserCount => ">" . $SearchLimit },
);
}
else {
$LayoutObject->Block(
Name => 'ResultCustomerUserCount',
Data => { CustomerUserCount => scalar @CustomerUserKeyList },
);
}
for my $ID (
sort { uc( $CustomerUserData{$a} ) cmp uc( $CustomerUserData{$b} ) }
keys %CustomerUserData
)
{
# output user row block
$LayoutObject->Block(
Name => 'ResultUserRow',
Data => {
%Param,
ID => $ID,
Name => $CustomerUserData{$ID},
},
);
}
my %ServiceDataSort = %ServiceData;
# add suffix for correct sorting
for my $ServiceDataKey ( sort keys %ServiceDataSort ) {
$ServiceDataSort{$ServiceDataKey} .= '::';
}
# get service data
if (%ServiceDataSort) {
for my $ID (
sort { uc( $ServiceDataSort{$a} ) cmp uc( $ServiceDataSort{$b} ) }
keys %ServiceDataSort
)
{
# output service row block
$LayoutObject->Block(
Name => 'ResultServiceRow',
Data => {
%Param,
ID => $ID,
Name => $ServiceData{$ID},
},
);
}
}
# otherwise a no data message is displayed
else {
$LayoutObject->Block(
Name => 'NoServiceFoundMsg',
Data => {},
);
}
# generate output
return $LayoutObject->Output(
TemplateFile => 'AdminCustomerUserService',
Data => \%Param,
);
}
1;