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

1006 lines
37 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::AgentCustomerUserAddressBook;
use strict;
use warnings;
use List::Util qw(first);
use Kernel::Language qw(Translatable);
use Kernel::System::VariableCheck qw(:all);
our $ObjectManagerDisabled = 1;
sub new {
my ( $Type, %Param ) = @_;
my $Self = {%Param};
bless( $Self, $Type );
# Define some customer company values, to use the values later for the output.
$Self->{CustomerCompanySearchFieldPrefix} = 'CustomerCompany_';
$Self->{CustomerCompanyLabelIdentifier} = Translatable('Customer');
return $Self;
}
sub Run {
my ( $Self, %Param ) = @_;
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request');
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
$Self->{RecipientType} = $ParamObject->GetParam( Param => 'RecipientType' ) || 'Email';
$Self->{Config} = $ConfigObject->Get("CustomerUser::Frontend::$Self->{Action}");
# Check if the config settings exsists for the given recipient type.
for my $ConfigKey (qw(SearchParameters DefaultFields ShowColumns)) {
if ( !grep { $_ eq $Self->{RecipientType} } sort keys %{ $Self->{Config}->{$ConfigKey} } ) {
return $LayoutObject->ErrorScreen(
Message => Translatable("No config setting '$ConfigKey' for the given RecipientType!"),
Comment => Translatable('Please contact the administrator.'),
);
}
}
# Get the diffrent values from the params or the config to set the default values.
$Self->{StartHit} = int( $ParamObject->GetParam( Param => 'StartHit' ) || 1 );
$Self->{SearchLimit} = $Self->{Config}->{SearchParameters}->{ $Self->{RecipientType} }->{SearchLimit} || 500;
$Self->{SortBy} = $ParamObject->GetParam( Param => 'SortBy' )
|| $Self->{Config}->{SearchParameters}->{ $Self->{RecipientType} }->{'SortBy::Default'}
|| 'UserLogin';
$Self->{OrderBy} = $ParamObject->GetParam( Param => 'OrderBy' )
|| $Self->{Config}->{SearchParameters}->{ $Self->{RecipientType} }->{'Order::Default'}
|| 'Up';
$Self->{Profile} = $ParamObject->GetParam( Param => 'Profile' ) || '';
$Self->{SaveProfile} = $ParamObject->GetParam( Param => 'SaveProfile' ) || '';
$Self->{TakeLastSearch} = $ParamObject->GetParam( Param => 'TakeLastSearch' ) || '';
$Self->{SelectTemplate} = $ParamObject->GetParam( Param => 'SelectTemplate' ) || '';
$Self->{EraseTemplate} = $ParamObject->GetParam( Param => 'EraseTemplate' ) || '';
$Self->{RecipientField} = $ParamObject->GetParam( Param => 'RecipientField' );
$Self->{RecipientFieldLabel} = $ParamObject->GetParam( Param => 'RecipientFieldLabel' ) || $Self->{RecipientField};
if ( !$Self->{RecipientField} ) {
return $LayoutObject->ErrorScreen(
Message => Translatable('No RecipientField is given!'),
Comment => Translatable('Please contact the administrator.'),
);
}
if ( $ParamObject->GetParam( Param => 'SearchTemplate' ) && $Self->{Profile} ) {
return $LayoutObject->Redirect(
OP =>
"Action=AgentCustomerUserAddressBook;Subaction=Search;TakeLastSearch=1;SaveProfile=1;Profile=$Self->{Profile}"
);
}
my %GetParam;
# Get the dynamic fields from the customer user and company search fields.
my @CustomerUserDynamicFields = $Self->_GetCustomerUserSearchFields(
Types => ['DynamicField'],
);
my @CustomerCompanyDynamicFields = $Self->_GetCustomerCompanySearchFields(
Types => ['DynamicField'],
WithoutPrefix => 1,
);
my %LookupCustomerUserDynamicFields = map { $_->{DatabaseField} => 1 } @CustomerUserDynamicFields;
my %LookupCustomerCompanyDynamicFields = map { $_->{DatabaseField} => 1 } @CustomerCompanyDynamicFields;
# Get the dynamic fields for this screen.
$Self->{DynamicFieldCustomerUser} = $Kernel::OM->Get('Kernel::System::DynamicField')->DynamicFieldListGet(
Valid => 1,
ObjectType => [ 'CustomerUser', ],
FieldFilter => \%LookupCustomerUserDynamicFields,
);
$Self->{DynamicFieldCustomerCompany} = $Kernel::OM->Get('Kernel::System::DynamicField')->DynamicFieldListGet(
Valid => 1,
ObjectType => [ 'CustomerCompany', ],
FieldFilter => \%LookupCustomerCompanyDynamicFields,
);
my $DynamicFieldBackendObject = $Kernel::OM->Get('Kernel::System::DynamicField::Backend');
my $SearchProfileObject = $Kernel::OM->Get('Kernel::System::SearchProfile');
# Get the diffrent search fields for the customer user search.
my @CustomerUserInputSearchFields = $Self->_GetCustomerUserSearchFields(
Types => ['Input'],
);
my @CustomerUserSelectionSearchFields = $Self->_GetCustomerUserSearchFields(
Types => ['Selection'],
);
# Get the diffrent search fields for the customer company search.
my @CustomerCompanyInputSearchFields = $Self->_GetCustomerCompanySearchFields(
Types => ['Input'],
);
my @CustomerCompanySelectionSearchFields = $Self->_GetCustomerCompanySearchFields(
Types => ['Selection'],
);
# Load parameters from search profile,
# this happens when the next result page should be shown, or when the results are reordered.
if ( ( $Self->{Subaction} eq 'LoadProfile' && $Self->{Profile} ) || $Self->{TakeLastSearch} ) {
%GetParam = $SearchProfileObject->SearchProfileGet(
Base => 'CustomerUserAddressBook',
Name => $Self->{Profile},
UserLogin => $Self->{UserLogin},
);
if ( $GetParam{ShownAttributes} && ref $GetParam{ShownAttributes} eq 'ARRAY' ) {
$GetParam{ShownAttributes} = join ';', @{ $GetParam{ShownAttributes} };
}
# Use param ExcludeUserLogins only for the last-search profile (otherwise ignore the parameter).
if ( $Self->{Profile} ne 'last-search' ) {
delete $GetParam{ExcludeUserLogins};
}
}
elsif ( $Self->{Subaction} eq 'DeleteProfile' ) {
$SearchProfileObject->SearchProfileDelete(
Base => 'CustomerUserAddressBook',
Name => $Self->{Profile},
UserLogin => $Self->{UserLogin},
);
$Self->{Profile} = '';
}
else {
# Get some general search params.
for my $ParamName (qw(ShownAttributes)) {
$GetParam{$ParamName} = $ParamObject->GetParam( Param => $ParamName );
}
# Get the scalar search params for the customer user and customer company fields.
for my $Field ( @CustomerUserInputSearchFields, @CustomerCompanyInputSearchFields ) {
$GetParam{ $Field->{Name} } = $ParamObject->GetParam( Param => $Field->{Name} );
# Remove the whitespace on the start and end of the given string.
if ( $GetParam{ $Field->{Name} } ) {
$GetParam{ $Field->{Name} } =~ s{ \A \s+ }{}xms;
$GetParam{ $Field->{Name} } =~ s{ \s+ \z }{}xms;
}
}
# Get the array search params for the customer user and customer company fields.
for my $Field ( @CustomerUserSelectionSearchFields, @CustomerCompanySelectionSearchFields ) {
my @Array = $ParamObject->GetArray( Param => $Field->{Name} );
if (@Array) {
$GetParam{ $Field->{Name} } = \@Array;
}
}
# Get the excluded user logins, which were already selected in a recipient field.
my $ExcludeUserLoginsJSONString = $ParamObject->GetParam( Param => 'ExcludeUserLoginsJSON' ) || '';
if ($ExcludeUserLoginsJSONString) {
$GetParam{ExcludeUserLogins} = $Kernel::OM->Get('Kernel::System::JSON')->Decode(
Data => $ExcludeUserLoginsJSONString,
);
}
# Get Dynamic fields from param object and cycle trough the activated Dynamic Fields for this screen.
DYNAMICFIELD:
for my $DynamicFieldConfig ( @{ $Self->{DynamicFieldCustomerUser} }, @{ $Self->{DynamicFieldCustomerCompany} } )
{
next DYNAMICFIELD if !IsHashRefWithData($DynamicFieldConfig);
my $SearchFieldPreferences = $DynamicFieldBackendObject->SearchFieldPreferences(
DynamicFieldConfig => $DynamicFieldConfig,
);
next DYNAMICFIELD if !IsArrayRefWithData($SearchFieldPreferences);
PREFERENCE:
for my $Preference ( @{$SearchFieldPreferences} ) {
# Extract the dynamic field value from the web request.
my $DynamicFieldValue = $DynamicFieldBackendObject->SearchFieldValueGet(
DynamicFieldConfig => $DynamicFieldConfig,
ParamObject => $ParamObject,
ReturnProfileStructure => 1,
LayoutObject => $LayoutObject,
Type => $Preference->{Type},
);
# Set the complete value structure in GetParam to store it later in the search profile.
if ( IsHashRefWithData($DynamicFieldValue) ) {
%GetParam = ( %GetParam, %{$DynamicFieldValue} );
}
}
}
}
# Show result site or perform other actions.
if ( $Self->{Subaction} eq 'Search' && !$Self->{EraseTemplate} ) {
# Generate a lookup hash for the exluce user logins and delete the entry from the 'GetParam', because
# we disable the entries in the result.
my %LookupExcludeUserLogins;
if ( IsArrayRefWithData( $GetParam{ExcludeUserLogins} ) ) {
%LookupExcludeUserLogins = map { $_ => 1 } @{ $GetParam{ExcludeUserLogins} };
delete $GetParam{ExcludeUserLogins};
}
# Fill up profile name (e.g. with last-search).
if ( !$Self->{Profile} || !$Self->{SaveProfile} ) {
$Self->{Profile} = 'last-search';
}
# Save search profile (under last-search or real profile name).
$Self->{SaveProfile} = 1;
# Remember the last search values, e.g. for sorting.
if ( $Self->{SaveProfile} && $Self->{Profile} ) {
# Remove old profile stuff, before the new stuff will be saved.
$SearchProfileObject->SearchProfileDelete(
Base => 'CustomerUserAddressBook',
Name => $Self->{Profile},
UserLogin => $Self->{UserLogin},
);
if ( $GetParam{ShownAttributes} && ref $GetParam{ShownAttributes} eq '' ) {
$GetParam{ShownAttributes} = [ split /;/, $GetParam{ShownAttributes} ];
}
KEY:
for my $Key ( sort keys %GetParam ) {
next KEY if !defined $GetParam{$Key};
$SearchProfileObject->SearchProfileAdd(
Base => 'CustomerUserAddressBook',
Name => $Self->{Profile},
Key => $Key,
Value => $GetParam{$Key},
UserLogin => $Self->{UserLogin},
);
}
}
my %AttributeLookup;
for my $Attribute ( @{ $GetParam{ShownAttributes} || [] } ) {
$AttributeLookup{$Attribute} = 1;
}
my %DynamicFieldSearchParameters;
DYNAMICFIELD:
for my $DynamicFieldConfig ( @{ $Self->{DynamicFieldCustomerUser} }, @{ $Self->{DynamicFieldCustomerCompany} } )
{
next DYNAMICFIELD if !IsHashRefWithData($DynamicFieldConfig);
my $SearchFieldPreferences = $DynamicFieldBackendObject->SearchFieldPreferences(
DynamicFieldConfig => $DynamicFieldConfig,
);
next DYNAMICFIELD if !IsArrayRefWithData($SearchFieldPreferences);
PREFERENCE:
for my $Preference ( @{$SearchFieldPreferences} ) {
if (
!$AttributeLookup{ 'LabelSearch_DynamicField_' . $DynamicFieldConfig->{Name} . $Preference->{Type} }
)
{
next PREFERENCE;
}
# Extract the dynamic field value from the profile.
my $SearchParameter = $DynamicFieldBackendObject->SearchFieldParameterBuild(
DynamicFieldConfig => $DynamicFieldConfig,
Profile => \%GetParam,
LayoutObject => $LayoutObject,
Type => $Preference->{Type},
);
if ( defined $SearchParameter ) {
$DynamicFieldSearchParameters{ 'DynamicField_' . $DynamicFieldConfig->{Name} }
= $SearchParameter->{Parameter};
}
}
}
# Get only the customer company search params.
my %CustomerCompanyGetParam;
CUSTOMERCOMPANYFIELD:
for my $CustomerCompanyField ( @CustomerCompanySelectionSearchFields, @CustomerCompanyInputSearchFields ) {
next CUSTOMERCOMPANYFIELD if !$GetParam{ $CustomerCompanyField->{Name} };
# Get the real field name.
my $RealFieldName = $CustomerCompanyField->{Name};
$RealFieldName =~ s{ \A $Self->{CustomerCompanySearchFieldPrefix} }{}xms;
$CustomerCompanyGetParam{$RealFieldName} = $GetParam{ $CustomerCompanyField->{Name} };
}
# Check if a dynamic field search param exists.
my $CustomerCompanyDynamicFieldExists;
CUSTOMERCOMPANYDYNAMICFIELD:
for my $CustomerCompanyDynamicField (@CustomerCompanyDynamicFields) {
next CUSTOMERCOMPANYDYNAMICFIELD if !$DynamicFieldSearchParameters{ $CustomerCompanyDynamicField->{Name} };
$CustomerCompanyDynamicFieldExists = 1;
last CUSTOMERCOMPANYDYNAMICFIELD;
}
my $CustomerCompanyIDs;
# Search first for customer companies, if some customer company search params exists.
if ( %CustomerCompanyGetParam || $CustomerCompanyDynamicFieldExists ) {
$CustomerCompanyIDs = $Kernel::OM->Get('Kernel::System::CustomerCompany')->CustomerCompanySearchDetail(
Result => 'ARRAY',
%CustomerCompanyGetParam,
%DynamicFieldSearchParameters,
) || [];
}
my $CustomerUserObject = $Kernel::OM->Get('Kernel::System::CustomerUser');
my $ViewableCustomerUserLogins = [];
# Do the search only if no customer company get params are given or some customer company ids for the given
# customer company search params were found.
if (
( !%CustomerCompanyGetParam && !$CustomerCompanyDynamicFieldExists )
|| IsArrayRefWithData($CustomerCompanyIDs)
)
{
$ViewableCustomerUserLogins = $CustomerUserObject->CustomerSearchDetail(
Result => 'ARRAY',
OrderBy => [ $Self->{SortBy} ],
OrderByDirection => [ $Self->{OrderBy} ],
Limit => $Self->{SearchLimit},
CustomerCompanySearchCustomerIDs => $CustomerCompanyIDs,
%GetParam,
%DynamicFieldSearchParameters,
) || [];
}
if ( $Self->{RecipientSelectionAJAX} ) {
my @CustomerUserLoginList;
if ( IsArrayRefWithData($ViewableCustomerUserLogins) ) {
CUSTOMERUSERLOGIN:
for my $CustomerUserLogin ( @{$ViewableCustomerUserLogins} ) {
my %CustomerUser = $CustomerUserObject->CustomerUserDataGet(
User => $CustomerUserLogin,
);
push @CustomerUserLoginList, {
UserLogin => $CustomerUser{UserLogin},
UserMailString => $CustomerUser{UserMailString},
};
}
}
my $Output = $LayoutObject->JSONEncode(
Data => \@CustomerUserLoginList,
);
return $LayoutObject->Attachment(
NoCache => 1,
ContentType => 'text/html',
Content => $Output,
Type => 'inline'
);
}
else {
my $Output = $LayoutObject->Header(
Type => 'Small',
);
$LayoutObject->Print( Output => \$Output );
$Output = '';
$Self->{Filter} = $ParamObject->GetParam( Param => 'Filter' ) || '';
$Self->{View} = $ParamObject->GetParam( Param => 'View' ) || '';
my $LinkPage = 'RecipientField=' . $Self->{RecipientField}
. ';RecipientFieldLabel=' . $Self->{RecipientFieldLabel}
. ';RecipientType=' . $Self->{RecipientType}
. ';Filter=' . $LayoutObject->Ascii2Html( Text => $Self->{Filter} )
. ';View=' . $LayoutObject->Ascii2Html( Text => $Self->{View} )
. ';SortBy=' . $LayoutObject->Ascii2Html( Text => $Self->{SortBy} )
. ';OrderBy=' . $LayoutObject->Ascii2Html( Text => $Self->{OrderBy} )
. ';Profile=' . $Self->{Profile}
. ';TakeLastSearch=1;Subaction=Search'
. ';';
my $LinkSort = 'RecipientField=' . $Self->{RecipientField}
. ';RecipientFieldLabel=' . $Self->{RecipientFieldLabel}
. ';RecipientType=' . $Self->{RecipientType}
. ';Filter=' . $LayoutObject->Ascii2Html( Text => $Self->{Filter} )
. ';View=' . $LayoutObject->Ascii2Html( Text => $Self->{View} )
. ';Profile=' . $Self->{Profile}
. ';TakeLastSearch=1;Subaction=Search'
. ';';
my $LinkFilter = 'RecipientField=' . $Self->{RecipientField}
. ';RecipientFieldLabel=' . $Self->{RecipientFieldLabel}
. ';RecipientType=' . $Self->{RecipientType}
. ';Profile=' . $LayoutObject->Ascii2Html( Text => $Self->{Profile} )
. ';TakeLastSearch=1;Subaction=Search'
. ';';
my $LinkBack = 'RecipientField=' . $Self->{RecipientField}
. ';RecipientFieldLabel=' . $Self->{RecipientFieldLabel}
. ';RecipientType=' . $Self->{RecipientType}
. ';Profile=' . $LayoutObject->Ascii2Html( Text => $Self->{Profile} )
. ';TakeLastSearch=1;Subaction=LoadProfile'
. ';';
# Find out which columns should be shown.
my @ShowColumns;
if ( IsArrayRefWithData( $Self->{Config}->{ShowColumns}->{ $Self->{RecipientType} } ) ) {
@ShowColumns = @{ $Self->{Config}->{ShowColumns}->{ $Self->{RecipientType} } };
}
# Get the already selected recipients, to remember the selected recipients for the diffrent pages.
my $RecipientsJSONString = $ParamObject->GetParam( Param => 'RecipientsJSON' ) || '';
my $Recipients;
if ($RecipientsJSONString) {
$Recipients = $Kernel::OM->Get('Kernel::System::JSON')->Decode(
Data => $RecipientsJSONString,
);
}
$Output .= $LayoutObject->CustomerUserAddressBookListShow(
CustomerUserIDs => $ViewableCustomerUserLogins,
Total => scalar @{$ViewableCustomerUserLogins},
View => $Self->{View},
Env => $Self,
LinkPage => $LinkPage,
LinkSort => $LinkSort,
LinkFilter => $LinkFilter,
LinkBack => $LinkBack,
Profile => $Self->{Profile},
TitleName => Translatable('Customer User Address Book'),
ShowColumns => \@ShowColumns,
SortBy => $LayoutObject->Ascii2Html( Text => $Self->{SortBy} ),
OrderBy => $LayoutObject->Ascii2Html( Text => $Self->{OrderBy} ),
RequestedURL => 'Action=' . $Self->{Action} . ';' . $LinkPage,
Recipients => $Recipients || {},
RecipientType => $Self->{RecipientType},
RecipientField => $Self->{RecipientField},
RecipientFieldLabel => $Self->{RecipientFieldLabel},
CustomerTicketTextField =>
$Self->{Config}->{SearchParameters}->{ $Self->{RecipientType} }->{CustomerTicketTextField}
|| 'UserMailString',
LookupExcludeUserLogins => \%LookupExcludeUserLogins,
);
$Output .= $LayoutObject->Footer(
Type => 'Small',
);
return $Output;
}
}
# There was no 'SubAction', or there were validation errors, or an user or customer was searched
# generate search mask.
my $Output = $LayoutObject->Header(
Type => 'Small',
);
$Output .= $Self->_MaskForm(
RecipientType => $Self->{RecipientType},
RecipientField => $Self->{RecipientField},
RecipientFieldLabel => $Self->{RecipientFieldLabel},
%GetParam,
);
$Output .= $LayoutObject->Footer(
Type => 'Small',
);
return $Output;
}
sub _MaskForm {
my ( $Self, %Param ) = @_;
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request');
my $EmptySearch = $ParamObject->GetParam( Param => 'EmptySearch' );
if ( !$Self->{Profile} ) {
$EmptySearch = 1;
}
my $SearchProfileObject = $Kernel::OM->Get('Kernel::System::SearchProfile');
my %GetParam = $SearchProfileObject->SearchProfileGet(
Base => 'CustomerUserAddressBook',
Name => $Self->{Profile},
UserLogin => $Self->{UserLogin},
);
# Allow profile overwrite the contents of %Param.
%Param = (
%Param,
%GetParam,
);
# Get the search fields for the customer user search.
my @CustomerUserSearchFields = $Self->_GetCustomerUserSearchFields(
Types => [ 'Input', 'Selection' ],
);
# Get the search fields for the customer user search.
my @CustomerCompanySearchFields = $Self->_GetCustomerCompanySearchFields(
Types => [ 'Input', 'Selection' ],
);
# Translate the customer company label identifier to add this to the labels.
my $TranslatedCustomerCompanyLabelIdentifier
= $LayoutObject->{LanguageObject}->Translate( $Self->{CustomerCompanyLabelIdentifier} );
my @Attributes;
for my $Field (@CustomerUserSearchFields) {
push @Attributes, {
Key => $Field->{Name},
Value => $Field->{Label},
};
}
my $DynamicFieldBackendObject = $Kernel::OM->Get('Kernel::System::DynamicField::Backend');
if ( IsArrayRefWithData( $Self->{DynamicFieldCustomerUser} ) ) {
# Create dynamic fields search options for attribute select
# cycle trough the activated Dynamic Fields for this screen.
DYNAMICFIELD:
for my $DynamicFieldConfig ( @{ $Self->{DynamicFieldCustomerUser} } ) {
next DYNAMICFIELD if !IsHashRefWithData($DynamicFieldConfig);
next DYNAMICFIELD if !$DynamicFieldConfig->{Name};
next DYNAMICFIELD if $DynamicFieldConfig->{Name} eq '';
my $SearchFieldPreferences = $DynamicFieldBackendObject->SearchFieldPreferences(
DynamicFieldConfig => $DynamicFieldConfig,
);
next DYNAMICFIELD if !IsArrayRefWithData($SearchFieldPreferences);
my $TranslatedDynamicFieldLabel = $LayoutObject->{LanguageObject}->Translate(
$DynamicFieldConfig->{Label},
);
PREFERENCE:
for my $Preference ( @{$SearchFieldPreferences} ) {
my $TranslatedSuffix = $LayoutObject->{LanguageObject}->Translate(
$Preference->{LabelSuffix},
) || '';
if ($TranslatedSuffix) {
$TranslatedSuffix = ' (' . $TranslatedSuffix . ')';
}
push @Attributes, (
{
Key => 'Search_DynamicField_' . $DynamicFieldConfig->{Name} . $Preference->{Type},
Value => $TranslatedDynamicFieldLabel . $TranslatedSuffix,
},
);
}
}
}
if (@CustomerCompanySearchFields) {
push @Attributes, {
Key => '',
Value => '-',
Disabled => 1,
};
for my $Field (@CustomerCompanySearchFields) {
my $TranslatedFieldLabel = $LayoutObject->{LanguageObject}->Translate(
$Field->{Label},
);
if (
$TranslatedCustomerCompanyLabelIdentifier
&& $TranslatedFieldLabel ne $TranslatedCustomerCompanyLabelIdentifier
)
{
$TranslatedFieldLabel .= " ($TranslatedCustomerCompanyLabelIdentifier)";
}
push @Attributes, {
Key => $Field->{Name},
Value => $TranslatedFieldLabel,
};
}
}
if ( IsArrayRefWithData( $Self->{DynamicFieldCustomerCompany} ) ) {
# Create dynamic fields search options for attribute select
# cycle trough the activated Dynamic Fields for this screen.
DYNAMICFIELD:
for my $DynamicFieldConfig ( @{ $Self->{DynamicFieldCustomerCompany} } ) {
next DYNAMICFIELD if !IsHashRefWithData($DynamicFieldConfig);
next DYNAMICFIELD if !$DynamicFieldConfig->{Name};
next DYNAMICFIELD if $DynamicFieldConfig->{Name} eq '';
my $SearchFieldPreferences = $DynamicFieldBackendObject->SearchFieldPreferences(
DynamicFieldConfig => $DynamicFieldConfig,
);
next DYNAMICFIELD if !IsArrayRefWithData($SearchFieldPreferences);
my $TranslatedDynamicFieldLabel = $LayoutObject->{LanguageObject}->Translate(
$DynamicFieldConfig->{Label},
);
PREFERENCE:
for my $Preference ( @{$SearchFieldPreferences} ) {
my $TranslatedSuffix = $LayoutObject->{LanguageObject}->Translate(
$Preference->{LabelSuffix},
) || '';
if ($TranslatedSuffix) {
$TranslatedSuffix = ' (' . $TranslatedSuffix . ')';
}
my $DynamicFieldLabel = $TranslatedDynamicFieldLabel . $TranslatedSuffix;
if (
$TranslatedCustomerCompanyLabelIdentifier
&& $TranslatedDynamicFieldLabel ne $TranslatedCustomerCompanyLabelIdentifier
)
{
$DynamicFieldLabel
.= ( $TranslatedSuffix ? " - " : " " ) . "($TranslatedCustomerCompanyLabelIdentifier)";
}
push @Attributes, (
{
Key => 'Search_DynamicField_' . $DynamicFieldConfig->{Name} . $Preference->{Type},
Value => $DynamicFieldLabel,
},
);
}
}
}
# Create HTML strings for all dynamic fields.
my %DynamicFieldHTML;
# Cycle trough the activated Dynamic Fields for this screen.
DYNAMICFIELD:
for my $DynamicFieldConfig ( @{ $Self->{DynamicFieldCustomerUser} }, @{ $Self->{DynamicFieldCustomerCompany} } ) {
next DYNAMICFIELD if !IsHashRefWithData($DynamicFieldConfig);
my $SearchFieldPreferences = $DynamicFieldBackendObject->SearchFieldPreferences(
DynamicFieldConfig => $DynamicFieldConfig,
);
next DYNAMICFIELD if !IsArrayRefWithData($SearchFieldPreferences);
my $PossibleValues = $DynamicFieldBackendObject->PossibleValuesGet(
DynamicFieldConfig => $DynamicFieldConfig,
OverridePossibleNone => 0,
);
PREFERENCE:
for my $Preference ( @{$SearchFieldPreferences} ) {
$DynamicFieldHTML{ $DynamicFieldConfig->{Name} . $Preference->{Type} }
= $DynamicFieldBackendObject->SearchFieldRender(
DynamicFieldConfig => $DynamicFieldConfig,
Profile => \%GetParam,
PossibleValuesFilter => $PossibleValues,
LayoutObject => $LayoutObject,
Type => $Preference->{Type},
);
}
}
$Param{AttributesStrg} = $LayoutObject->BuildSelection(
PossibleNone => 1,
Data => \@Attributes,
Name => 'Attribute',
Multiple => 0,
Class => 'Modernize',
);
$Param{AttributesOrigStrg} = $LayoutObject->BuildSelection(
PossibleNone => 1,
Data => \@Attributes,
Name => 'AttributeOrig',
Multiple => 0,
Class => 'Modernize',
);
my @OutputSearchFields;
# Build the output for the input search fields.
for my $Field (@CustomerUserSearchFields) {
my %FieldData = (
CustomerUserField => 1,
Name => $Field->{Name},
Label => $Field->{Label},
);
if ( $Field->{Type} eq 'Selection' ) {
my $SelectionString = $LayoutObject->BuildSelection(
Data => $Field->{SelectionsData},
Name => $Field->{Name},
Translation => 1,
Multiple => 1,
Size => 5,
SelectedID => $Param{ $Field->{Name} },
Class => 'Modernize',
);
$FieldData{SelectionString} = $SelectionString;
}
else {
$FieldData{Value} = $Param{ $Field->{Name} };
}
push @OutputSearchFields, \%FieldData;
}
# Build the output for the input search fields.
for my $Field (@CustomerCompanySearchFields) {
my $TranslatedFieldLabel = $LayoutObject->{LanguageObject}->Translate(
$Field->{Label},
);
if (
$TranslatedCustomerCompanyLabelIdentifier
&& $TranslatedFieldLabel ne $TranslatedCustomerCompanyLabelIdentifier
)
{
$TranslatedFieldLabel .= " ($TranslatedCustomerCompanyLabelIdentifier)";
}
my %FieldData = (
CustomerCompanyField => 1,
Name => $Field->{Name},
Label => $TranslatedFieldLabel,
);
if ( $Field->{Type} eq 'Selection' ) {
my $SelectionString = $LayoutObject->BuildSelection(
Data => $Field->{SelectionsData},
Name => $Field->{Name},
Translation => 1,
Multiple => 1,
Size => 5,
SelectedID => $Param{ $Field->{Name} },
Class => 'Modernize',
);
$FieldData{SelectionString} = $SelectionString;
}
else {
$FieldData{Value} = $Param{ $Field->{Name} };
}
push @OutputSearchFields, \%FieldData;
}
$Param{OutputSearchFields} = \@OutputSearchFields;
my %Profiles = $SearchProfileObject->SearchProfileList(
Base => 'CustomerUserAddressBook',
UserLogin => $Self->{UserLogin},
);
delete $Profiles{''};
delete $Profiles{'last-search'};
if ($EmptySearch) {
$Profiles{''} = '-';
}
else {
$Profiles{'last-search'} = '-';
}
$Param{ProfilesStrg} = $LayoutObject->BuildSelection(
Data => \%Profiles,
Name => 'Profile',
ID => 'SearchProfile',
SelectedID => $Self->{Profile},
Class => 'Modernize',
# Do not modernize this field as this causes problems with the automatic focussing of the first element.
);
# Output the dynamic fields blocks, cycle trough the activated Dynamic Fields for this screen.
DYNAMICFIELD:
for my $DynamicFieldConfig ( @{ $Self->{DynamicFieldCustomerUser} }, @{ $Self->{DynamicFieldCustomerCompany} } ) {
next DYNAMICFIELD if !IsHashRefWithData($DynamicFieldConfig);
my $SearchFieldPreferences = $DynamicFieldBackendObject->SearchFieldPreferences(
DynamicFieldConfig => $DynamicFieldConfig,
);
next DYNAMICFIELD if !IsArrayRefWithData($SearchFieldPreferences);
PREFERENCE:
for my $Preference ( @{$SearchFieldPreferences} ) {
# Skip fields that HTML could not be retrieved.
next PREFERENCE if !IsHashRefWithData(
$DynamicFieldHTML{ $DynamicFieldConfig->{Name} . $Preference->{Type} }
);
my $DynamicFieldLabel = $DynamicFieldHTML{ $DynamicFieldConfig->{Name} . $Preference->{Type} }->{Label};
# Add a identifier for the object type 'CustomerCompany' and if a identifier exists.
if ( $DynamicFieldConfig->{ObjectType} eq 'CustomerCompany' && $TranslatedCustomerCompanyLabelIdentifier ) {
my $LabelCustomerCompanyLabelIdentifier
= ( $Preference->{LabelSuffix} ? " - " : " " ) . "($TranslatedCustomerCompanyLabelIdentifier)";
$DynamicFieldLabel =~ s{(<label.*>)(.*)(</label>)}{$1$2$LabelCustomerCompanyLabelIdentifier$3}xmsg;
}
$LayoutObject->Block(
Name => 'DynamicField',
Data => {
Label => $DynamicFieldLabel,
Field => $DynamicFieldHTML{ $DynamicFieldConfig->{Name} . $Preference->{Type} }->{Field},
},
);
}
}
my @SearchAttributes;
if ( $Self->{Profile} ) {
my %AlreadyShown;
ITEM:
for my $Item (@Attributes) {
my $Key = $Item->{Key};
next ITEM if !$Key;
next ITEM if !defined $Param{$Key};
next ITEM if $AlreadyShown{$Key};
if ( ref $Param{$Key} eq 'ARRAY' && !@{ $Param{$Key} } ) {
next ITEM;
}
$AlreadyShown{$Key} = 1;
push @SearchAttributes, $Key;
}
}
# No profile, then show default screen.
else {
my %LookupDefaultFields = map { $_ => 1 } @{ $Self->{Config}->{DefaultFields}->{ $Self->{RecipientType} } };
ITEM:
for my $Item (@Attributes) {
my $Key = $Item->{Key};
next ITEM if !$LookupDefaultFields{$Key};
push @SearchAttributes, $Key;
}
}
$LayoutObject->AddJSData(
Key => 'ShowSearchDialog',
Value => 1,
);
$LayoutObject->AddJSData(
Key => 'SearchAttributes',
Value => \@SearchAttributes,
);
# build output
my $Output = $LayoutObject->Output(
TemplateFile => 'AgentCustomerUserAddressBook',
Data => {
%Param,
ShowSearchDialog => 1,
},
);
return $Output;
}
=head2 _GetCustomerUserSearchFields()
Get the search fields from the customer user map config for the given types (otherwise all search fields).
my @SearchFields = $AgentCustomerUserAddressBookObject->_GetCustomerUserSearchFields(
Types => ['Input', 'Selection', 'DynamicField'], # optional
);
=cut
sub _GetCustomerUserSearchFields {
my ( $Self, %Param ) = @_;
my @AllSearchFields = $Kernel::OM->Get('Kernel::System::CustomerUser')->CustomerUserSearchFields();
return @AllSearchFields if !IsArrayRefWithData( $Param{Types} ) || !@AllSearchFields;
my @SearchFields;
TYPE:
for my $Type ( @{ $Param{Types} } ) {
my @TypeSearchFields = grep { $Type eq $_->{Type} } @AllSearchFields;
next TYPE if !@TypeSearchFields;
@SearchFields = ( @SearchFields, @TypeSearchFields );
}
return @SearchFields;
}
=head2 _GetCustomerCompanySearchFields()
Get the search fields from the customer user map config for the given type (otherwise all search fields)
with a special prefix.
my @SearchFields = $AgentCustomerUserAddressBookObject->_GetCustomerCompanySearchFields(
Types => ['Input', 'Selection', 'DynamicField'], # optional
WithoutPrefix => 1, # optional
);
=cut
sub _GetCustomerCompanySearchFields {
my ( $Self, %Param ) = @_;
my @AllSearchFields = $Kernel::OM->Get('Kernel::System::CustomerCompany')->CustomerCompanySearchFields();
# add a prefix for the customer company fields
if ( !$Param{WithoutPrefix} ) {
for my $Field (@AllSearchFields) {
$Field->{Name} = $Self->{CustomerCompanySearchFieldPrefix} . $Field->{Name};
}
}
return @AllSearchFields if !IsArrayRefWithData( $Param{Types} ) || !@AllSearchFields;
my @SearchFields;
TYPE:
for my $Type ( @{ $Param{Types} } ) {
my @TypeSearchFields = grep { $Type eq $_->{Type} } @AllSearchFields;
next TYPE if !@TypeSearchFields;
@SearchFields = ( @SearchFields, @TypeSearchFields );
}
return @SearchFields;
}
1;