316 lines
12 KiB
Perl
316 lines
12 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::AgentAppointmentList;
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Kernel::System::VariableCheck qw(:all);
|
|
|
|
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 $Output;
|
|
|
|
# get param object
|
|
my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request');
|
|
|
|
# get names of all parameters
|
|
my @ParamNames = $ParamObject->GetParamNames();
|
|
|
|
# get params
|
|
my %GetParam;
|
|
|
|
KEY:
|
|
for my $Key (@ParamNames) {
|
|
next KEY if $Key eq 'AppointmentIDs';
|
|
$GetParam{$Key} = $ParamObject->GetParam( Param => $Key );
|
|
}
|
|
|
|
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
|
|
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
|
|
my $CalendarObject = $Kernel::OM->Get('Kernel::System::Calendar');
|
|
my $AppointmentObject = $Kernel::OM->Get('Kernel::System::Calendar::Appointment');
|
|
my $PluginObject = $Kernel::OM->Get('Kernel::System::Calendar::Plugin');
|
|
|
|
my $JSON = $LayoutObject->JSONEncode( Data => [] );
|
|
|
|
$LayoutObject->ChallengeTokenCheck();
|
|
|
|
# check request
|
|
if ( $Self->{Subaction} eq 'ListAppointments' ) {
|
|
|
|
if ( $GetParam{CalendarID} ) {
|
|
|
|
# append midnight to the timestamps
|
|
for my $Timestamp (qw(StartTime EndTime)) {
|
|
if ( $GetParam{$Timestamp} && !( $GetParam{$Timestamp} =~ /\s\d{2}:\d{2}:\d{2}$/ ) ) {
|
|
$GetParam{$Timestamp} = $GetParam{$Timestamp} . ' 00:00:00';
|
|
}
|
|
}
|
|
|
|
my $StartTimeObject = $Kernel::OM->Create(
|
|
'Kernel::System::DateTime',
|
|
ObjectParams => {
|
|
String => $GetParam{StartTime},
|
|
TimeZone => $Self->{UserTimeZone} // undef,
|
|
},
|
|
);
|
|
my $EndTimeObject = $Kernel::OM->Create(
|
|
'Kernel::System::DateTime',
|
|
ObjectParams => {
|
|
String => $GetParam{EndTime},
|
|
TimeZone => $Self->{UserTimeZone} // undef,
|
|
},
|
|
);
|
|
|
|
if ( $Self->{UserTimeZone} ) {
|
|
$StartTimeObject->ToOTRSTimeZone();
|
|
$EndTimeObject->ToOTRSTimeZone();
|
|
}
|
|
|
|
$GetParam{StartTime} = $StartTimeObject->ToString();
|
|
$GetParam{EndTime} = $EndTimeObject->ToString();
|
|
|
|
# reset empty parameters
|
|
for my $Param ( sort keys %GetParam ) {
|
|
if ( !$GetParam{$Param} ) {
|
|
$GetParam{$Param} = undef;
|
|
}
|
|
}
|
|
|
|
my @Appointments = $AppointmentObject->AppointmentList(
|
|
%GetParam,
|
|
);
|
|
|
|
# go through all appointments
|
|
for my $Appointment (@Appointments) {
|
|
|
|
# check for notification date
|
|
if (
|
|
!$Appointment->{NotificationDate}
|
|
|| $Appointment->{NotificationDate} eq '0000-00-00 00:00:00'
|
|
)
|
|
{
|
|
$Appointment->{NotificationDate} = '';
|
|
}
|
|
|
|
my $StartTimeObject = $Kernel::OM->Create(
|
|
'Kernel::System::DateTime',
|
|
ObjectParams => {
|
|
String => $Appointment->{StartTime},
|
|
},
|
|
);
|
|
my $EndTimeObject = $Kernel::OM->Create(
|
|
'Kernel::System::DateTime',
|
|
ObjectParams => {
|
|
String => $Appointment->{EndTime},
|
|
},
|
|
);
|
|
|
|
# save time stamps for display before calculation
|
|
$Appointment->{StartDate} = $Appointment->{StartTime};
|
|
$Appointment->{EndDate} = $Appointment->{EndTime};
|
|
|
|
# End times for all day appointments are inclusive, subtract whole day.
|
|
if ( $Appointment->{AllDay} ) {
|
|
$EndTimeObject->Subtract(
|
|
Days => 1,
|
|
);
|
|
if ( $EndTimeObject < $StartTimeObject ) {
|
|
$EndTimeObject = $StartTimeObject->Clone();
|
|
}
|
|
$Appointment->{EndDate} = $EndTimeObject->ToString();
|
|
}
|
|
|
|
# calculate local times for control
|
|
else {
|
|
if ( $Self->{UserTimeZone} ) {
|
|
$StartTimeObject->ToTimeZone( TimeZone => $Self->{UserTimeZone} );
|
|
$EndTimeObject->ToTimeZone( TimeZone => $Self->{UserTimeZone} );
|
|
}
|
|
|
|
$Appointment->{StartTime} = $StartTimeObject->ToString();
|
|
$Appointment->{EndTime} = $EndTimeObject->ToString();
|
|
}
|
|
|
|
# formatted date/time strings used in display
|
|
$Appointment->{StartDate} = $LayoutObject->{LanguageObject}->FormatTimeString(
|
|
$Appointment->{StartDate},
|
|
'DateFormat' . ( $Appointment->{AllDay} ? 'Short' : '' )
|
|
);
|
|
$Appointment->{EndDate} = $LayoutObject->{LanguageObject}->FormatTimeString(
|
|
$Appointment->{EndDate},
|
|
'DateFormat' . ( $Appointment->{AllDay} ? 'Short' : '' )
|
|
);
|
|
if ( $Appointment->{NotificationDate} ) {
|
|
$Appointment->{NotificationDate} = $LayoutObject->{LanguageObject}->FormatTimeString(
|
|
$Appointment->{NotificationDate},
|
|
'DateFormat'
|
|
);
|
|
}
|
|
|
|
# include resource data
|
|
$Appointment->{TeamName} = '';
|
|
$Appointment->{ResourceNames} = '';
|
|
|
|
if (
|
|
$Kernel::OM->Get('Kernel::System::Main')->Require(
|
|
'Kernel::System::Calendar::Team',
|
|
Silent => 1,
|
|
)
|
|
)
|
|
{
|
|
if ( $Appointment->{TeamID} ) {
|
|
my $TeamObject = $Kernel::OM->Get('Kernel::System::Calendar::Team');
|
|
my @TeamNames;
|
|
TEAMID:
|
|
for my $TeamID ( @{ $Appointment->{TeamID} } ) {
|
|
next TEAMID if !$TeamID;
|
|
my %Team = $TeamObject->TeamGet(
|
|
TeamID => $TeamID,
|
|
UserID => $Self->{UserID},
|
|
);
|
|
push @TeamNames, $Team{Name} if %Team;
|
|
}
|
|
|
|
# truncate more than three elements
|
|
my $TeamCount = scalar @TeamNames;
|
|
if ( $TeamCount > 4 ) {
|
|
splice @TeamNames, 3;
|
|
push @TeamNames, $LayoutObject->{LanguageObject}->Translate( '+%s more', $TeamCount - 3 );
|
|
}
|
|
|
|
$Appointment->{TeamNames} = join( '\n', @TeamNames );
|
|
}
|
|
if ( $Appointment->{ResourceID} ) {
|
|
my $UserObject = $Kernel::OM->Get('Kernel::System::User');
|
|
my @ResourceNames;
|
|
RESOURCEID:
|
|
for my $ResourceID ( @{ $Appointment->{ResourceID} } ) {
|
|
next RESOURCEID if !$ResourceID;
|
|
my %User = $UserObject->GetUserData(
|
|
UserID => $ResourceID,
|
|
);
|
|
push @ResourceNames, $User{UserFullname};
|
|
}
|
|
|
|
# truncate more than three elements
|
|
my $ResourceCount = scalar @ResourceNames;
|
|
if ( $ResourceCount > 4 ) {
|
|
splice @ResourceNames, 3;
|
|
push @ResourceNames,
|
|
$LayoutObject->{LanguageObject}->Translate( '+%s more', $ResourceCount - 3 );
|
|
}
|
|
|
|
$Appointment->{ResourceNames} = join( '\n', @ResourceNames );
|
|
}
|
|
}
|
|
|
|
# include plugin (link) data
|
|
my $PluginList = $PluginObject->PluginList();
|
|
PLUGINKEY:
|
|
for my $PluginKey ( sort keys %{$PluginList} ) {
|
|
my $LinkList = $PluginObject->PluginLinkList(
|
|
AppointmentID => $Appointment->{AppointmentID},
|
|
PluginKey => $PluginKey,
|
|
UserID => $Self->{UserID},
|
|
);
|
|
my @LinkArray;
|
|
for my $LinkID ( sort keys %{$LinkList} ) {
|
|
push @LinkArray, $LinkList->{$LinkID}->{LinkName};
|
|
}
|
|
last PLUGINKEY if !@LinkArray;
|
|
|
|
# truncate more than three elements
|
|
my $LinkCount = scalar @LinkArray;
|
|
if ( $LinkCount > 4 ) {
|
|
splice @LinkArray, 3;
|
|
push @LinkArray, $LayoutObject->{LanguageObject}->Translate( '+%s more', $LinkCount - 3 );
|
|
}
|
|
|
|
$Appointment->{PluginData}->{$PluginKey} = join( '\n', @LinkArray );
|
|
}
|
|
|
|
# check if dealing with ticket appointment
|
|
if ( $Appointment->{TicketAppointmentRuleID} ) {
|
|
my $Rule = $CalendarObject->TicketAppointmentRuleGet(
|
|
CalendarID => $Appointment->{CalendarID},
|
|
RuleID => $Appointment->{TicketAppointmentRuleID},
|
|
);
|
|
|
|
# get types from the ticket appointment rule
|
|
if ( IsHashRefWithData($Rule) ) {
|
|
$Appointment->{TicketAppointmentStartDate} = $Rule->{StartDate};
|
|
$Appointment->{TicketAppointmentEndDate} = $Rule->{EndDate};
|
|
}
|
|
}
|
|
}
|
|
|
|
# build JSON output
|
|
$JSON = $LayoutObject->JSONEncode(
|
|
Data => (
|
|
\@Appointments,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
elsif ( $Self->{Subaction} eq 'AppointmentDays' ) {
|
|
|
|
# append midnight to the timestamps
|
|
for my $Timestamp (qw(StartTime EndTime)) {
|
|
if ( $GetParam{$Timestamp} && !( $GetParam{$Timestamp} =~ /\s\d{2}:\d{2}:\d{2}$/ ) ) {
|
|
$GetParam{$Timestamp} = $GetParam{$Timestamp} . ' 00:00:00';
|
|
}
|
|
}
|
|
|
|
# reset empty parameters
|
|
for my $Param ( sort keys %GetParam ) {
|
|
if ( !$GetParam{$Param} ) {
|
|
$GetParam{$Param} = undef;
|
|
}
|
|
}
|
|
|
|
my %AppointmentDays = $AppointmentObject->AppointmentDays(
|
|
%GetParam,
|
|
UserID => $Self->{UserID},
|
|
);
|
|
|
|
# build JSON output
|
|
$JSON = $LayoutObject->JSONEncode(
|
|
Data => (
|
|
\%AppointmentDays,
|
|
),
|
|
);
|
|
}
|
|
|
|
# send JSON response
|
|
return $LayoutObject->Attachment(
|
|
ContentType => 'application/json; charset=' . $LayoutObject->{Charset},
|
|
Content => $JSON,
|
|
Type => 'inline',
|
|
NoCache => 1,
|
|
);
|
|
}
|
|
|
|
1;
|