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

398 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::AgentITSMSLAPrint;
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 ) = @_;
# get params
my $SLAID = $Kernel::OM->Get('Kernel::System::Web::Request')->GetParam( Param => "SLAID" );
# get layout object
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
# check needed stuff
if ( !$SLAID ) {
return $LayoutObject->ErrorScreen(
Message => Translatable('No SLAID is given!'),
Comment => Translatable('Please contact the administrator.'),
);
}
# get sla
my %SLA = $Kernel::OM->Get('Kernel::System::SLA')->SLAGet(
SLAID => $SLAID,
UserID => $Self->{UserID},
);
if ( !$SLA{SLAID} ) {
return $LayoutObject->ErrorScreen(
Message => $LayoutObject->{LanguageObject}->Translate( 'SLAID %s not found in database!', $SLAID ),
Comment => Translatable('Please contact the administrator.'),
);
}
# get config object
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
# get calendar name
if ( $SLA{Calendar} ) {
$SLA{CalendarName} = "Calendar $SLA{Calendar} - "
. $ConfigObject->Get( "TimeZone::Calendar" . $SLA{Calendar} . "Name" );
}
else {
$SLA{CalendarName} = Translatable('Calendar Default');
}
# get user object
my $UserObject = $Kernel::OM->Get('Kernel::System::User');
# get user data (create by)
$SLA{CreateByName} = $UserObject->UserName(
UserID => $SLA{CreateBy},
);
# get user data (change by)
$SLA{ChangeByName} = $UserObject->UserName(
UserID => $SLA{ChangeBy},
);
# get PDF object
my $PDFObject = $Kernel::OM->Get('Kernel::System::PDF');
# generate PDF output
my %Page;
# get maximum number of pages
$Page{MaxPages} = $ConfigObject->Get('PDF::MaxPages');
if ( !$Page{MaxPages} || $Page{MaxPages} < 1 || $Page{MaxPages} > 1000 ) {
$Page{MaxPages} = 100;
}
$Page{MarginTop} = 30;
$Page{MarginRight} = 40;
$Page{MarginBottom} = 40;
$Page{MarginLeft} = 40;
$Page{HeaderRight} = $LayoutObject->{LanguageObject}->Translate('SLA');
$Page{PageText} = $LayoutObject->{LanguageObject}->Translate('Page');
$Page{PageCount} = 1;
# create new PDF document
$PDFObject->DocumentNew(
Title => $ConfigObject->Get('Product') . ': ' . $SLA{Name},
Encode => $LayoutObject->{UserCharset},
);
# create first PDF page
$PDFObject->PageNew(
%Page,
FooterRight => $Page{PageText} . ' ' . $Page{PageCount},
);
$Page{PageCount}++;
$PDFObject->PositionSet(
Move => 'relativ',
Y => -6,
);
# output title
$PDFObject->Text(
Text => $SLA{Name},
FontSize => 13,
);
$PDFObject->PositionSet(
Move => 'relativ',
Y => -6,
);
# output "printed by"
$PDFObject->Text(
Text => $LayoutObject->{LanguageObject}->Translate('printed by') . ' '
. $Self->{UserFullname} . ' '
. $LayoutObject->{Time},
FontSize => 9,
);
$PDFObject->PositionSet(
Move => 'relativ',
Y => -14,
);
# output general infos
$Self->_PDFOutputGeneralInfos(
Page => \%Page,
SLA => \%SLA,
);
# output detailed infos
$Self->_PDFOutputDetailedInfos(
Page => \%Page,
SLA => \%SLA,
);
# create file name
my $Filename = $Kernel::OM->Get('Kernel::System::Main')->FilenameCleanUp(
Filename => $SLA{Name},
Type => 'Attachment',
);
# get datetime object
my $DateTimeObject = $Kernel::OM->Create('Kernel::System::DateTime');
# return the PDF document
return $LayoutObject->Attachment(
Filename => "sla_${Filename}_" . $DateTimeObject->Format( Format => "%Y-%m-%d_%H:%M" ) . '.pdf',
ContentType => 'application/pdf',
Content => $PDFObject->DocumentOutput(),
Type => 'inline',
);
}
sub _PDFOutputGeneralInfos {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Argument (qw(Page SLA)) {
if ( !defined $Param{$Argument} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $Argument!"
);
return;
}
}
# get layout object
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
# create left table
my $TableLeft = [
{
Key => $LayoutObject->{LanguageObject}->Translate('SLA') . ':',
Value => $Param{SLA}->{Name},
},
];
# create right table
my $TableRight = [
{
Key => $LayoutObject->{LanguageObject}->Translate('Created') . ':',
Value => $LayoutObject->Output(
Template => '[% Data.CreateTime | Localize("TimeLong") %]',
Data => \%{ $Param{SLA} },
),
},
{
Key => $LayoutObject->{LanguageObject}->Translate('Created by') . ':',
Value => $Param{SLA}->{ChangeByName},
},
{
Key => $LayoutObject->{LanguageObject}->Translate('Last changed') . ':',
Value => $LayoutObject->Output(
Template => '[% Data.ChangeTime | Localize("TimeLong") %]',
Data => \%{ $Param{SLA} },
),
},
{
Key => $LayoutObject->{LanguageObject}->Translate('Last changed by') . ':',
Value => $Param{SLA}->{ChangeByName},
},
];
my $Rows = @{$TableLeft};
if ( @{$TableRight} > $Rows ) {
$Rows = @{$TableRight};
}
my %TableParam;
for my $Row ( 1 .. $Rows ) {
$Row--;
$TableParam{CellData}[$Row][0]{Content} = $TableLeft->[$Row]->{Key};
$TableParam{CellData}[$Row][0]{Font} = 'ProportionalBold';
$TableParam{CellData}[$Row][1]{Content} = $TableLeft->[$Row]->{Value};
$TableParam{CellData}[$Row][2]{Content} = ' ';
$TableParam{CellData}[$Row][2]{BackgroundColor} = '#FFFFFF';
$TableParam{CellData}[$Row][3]{Content} = $TableRight->[$Row]->{Key};
$TableParam{CellData}[$Row][3]{Font} = 'ProportionalBold';
$TableParam{CellData}[$Row][4]{Content} = $TableRight->[$Row]->{Value};
}
$TableParam{ColumnData}[0]{Width} = 50;
$TableParam{ColumnData}[1]{Width} = 200.5;
$TableParam{ColumnData}[2]{Width} = 4;
$TableParam{ColumnData}[3]{Width} = 80;
$TableParam{ColumnData}[4]{Width} = 170.5;
$TableParam{Type} = 'Cut';
$TableParam{Border} = 0;
$TableParam{FontSize} = 6;
$TableParam{BackgroundColorEven} = '#DDDDDD';
$TableParam{Padding} = 1;
$TableParam{PaddingTop} = 3;
$TableParam{PaddingBottom} = 3;
# get PDF object
my $PDFObject = $Kernel::OM->Get('Kernel::System::PDF');
# output table
PAGE:
for ( $Param{Page}->{PageCount} .. $Param{Page}->{MaxPages} ) {
# output table (or a fragment of it)
%TableParam = $PDFObject->Table(%TableParam);
# stop output or output next page
last PAGE if $TableParam{State};
$PDFObject->PageNew(
%{ $Param{Page} },
FooterRight => $Param{Page}->{PageText} . ' ' . $Param{Page}->{PageCount}
);
$Param{Page}->{PageCount}++;
}
return 1;
}
sub _PDFOutputDetailedInfos {
my ( $Self, %Param ) = @_;
# check needed stuff
for my $Argument (qw(Page SLA)) {
if ( !defined $Param{$Argument} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $Argument!"
);
return;
}
}
# get PDF object
my $PDFObject = $Kernel::OM->Get('Kernel::System::PDF');
# set new position
$PDFObject->PositionSet(
Move => 'relativ',
Y => -15,
);
# get layout object
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
# output headline
$PDFObject->Text(
Text => $LayoutObject->{LanguageObject}->Translate('SLA'),
Height => 7,
Type => 'Cut',
Font => 'ProportionalBoldItalic',
FontSize => 7,
Color => '#666666',
);
# set new position
$PDFObject->PositionSet(
Move => 'relativ',
Y => -4,
);
# create table
my $Table = [
{
Key => $LayoutObject->{LanguageObject}->Translate('SLA') . ':',
Value => $Param{SLA}->{Name},
},
{
Key => $LayoutObject->{LanguageObject}->Translate('Type') . ':',
Value => $LayoutObject->{LanguageObject}->Translate( $Param{SLA}->{Type} ),
},
{
Key => $LayoutObject->{LanguageObject}->Translate('Calendar') . ':',
Value => $LayoutObject->{LanguageObject}->Translate( $Param{SLA}->{CalendarName} ),
},
{
Key => $LayoutObject->{LanguageObject}->Translate('First Response Time') . ':',
Value =>
$LayoutObject->{LanguageObject}->Translate( $Param{SLA}->{FirstResponseTime} )
. ' '
. $LayoutObject->{LanguageObject}->Translate('minutes'),
},
{
Key => $LayoutObject->{LanguageObject}->Translate('Update Time') . ':',
Value => $LayoutObject->{LanguageObject}->Translate( $Param{SLA}->{UpdateTime} ) . ' '
. $LayoutObject->{LanguageObject}->Translate('minutes'),
},
{
Key => $LayoutObject->{LanguageObject}->Translate('Solution Time') . ':',
Value => $LayoutObject->{LanguageObject}->Translate( $Param{SLA}->{SolutionTime} )
. ' '
. $LayoutObject->{LanguageObject}->Translate('minutes'),
},
{
Key => $LayoutObject->{LanguageObject}->Translate('Minimum Time Between Incidents')
. ':',
Value => $LayoutObject->{LanguageObject}->Translate(
$Param{SLA}->{MinTimeBetweenIncidents},
)
. ' '
. $LayoutObject->{LanguageObject}->Translate('minutes'),
},
];
my %TableParam;
my $Rows = @{$Table};
for my $Row ( 1 .. $Rows ) {
$Row--;
$TableParam{CellData}[$Row][0]{Content} = $Table->[$Row]->{Key};
$TableParam{CellData}[$Row][0]{Font} = 'ProportionalBold';
$TableParam{CellData}[$Row][1]{Content} = $Table->[$Row]->{Value};
}
$TableParam{ColumnData}[0]{Width} = 120;
$TableParam{ColumnData}[1]{Width} = 391;
$TableParam{Type} = 'Cut';
$TableParam{Border} = 0;
$TableParam{FontSize} = 6;
$TableParam{BackgroundColor} = '#DDDDDD';
$TableParam{Padding} = 1;
$TableParam{PaddingTop} = 3;
$TableParam{PaddingBottom} = 3;
# output table
PAGE:
for ( $Param{Page}->{PageCount} .. $Param{Page}->{MaxPages} ) {
# output table (or a fragment of it)
%TableParam = $PDFObject->Table(%TableParam);
# stop output or output next page
last PAGE if $TableParam{State};
$PDFObject->PageNew(
%{ $Param{Page} },
FooterRight => $Param{Page}->{PageText} . ' ' . $Param{Page}->{PageCount}
);
$Param{Page}->{PageCount}++;
}
return 1;
}
1;