43
41
# check all needed objects
44
42
foreach (qw(TicketObject ParamObject DBObject QueueObject LayoutObject
45
ConfigObject LogObject)) {
43
ConfigObject LogObject)
46
45
die "Got no $_" if (!$Self->{$_});
49
48
$Self->{CustomerUserObject} = Kernel::System::CustomerUser->new(%Param);
50
49
$Self->{CheckItemObject} = Kernel::System::CheckItem->new(%Param);
51
$Self->{StdAttachmentObject} = Kernel::System::StdAttachment->new(%Param);
52
50
$Self->{StateObject} = Kernel::System::State->new(%Param);
53
51
$Self->{SystemAddress} = Kernel::System::SystemAddress->new(%Param);
54
52
$Self->{UploadCachObject} = Kernel::System::Web::UploadCache->new(%Param);
56
54
foreach (qw(From To Cc Bcc Subject Body InReplyTo ComposeStateID ArticleTypeID
57
ArticleID TimeUnits Year Month Day Hour Minute AttachmentUpload
58
AttachmentDelete1 AttachmentDelete2 AttachmentDelete3 AttachmentDelete4
59
AttachmentDelete5 AttachmentDelete6 AttachmentDelete7 AttachmentDelete8
60
AttachmentDelete9 AttachmentDelete10 FormID)) {
55
ArticleID TimeUnits Year Month Day Hour Minute AttachmentUpload
56
AttachmentDelete1 AttachmentDelete2 AttachmentDelete3 AttachmentDelete4
57
AttachmentDelete5 AttachmentDelete6 AttachmentDelete7 AttachmentDelete8
58
AttachmentDelete9 AttachmentDelete10 AttachmentDelete11 AttachmentDelete12
59
AttachmentDelete13 AttachmentDelete14 AttachmentDelete15 AttachmentDelete16
61
62
my $Value = $Self->{ParamObject}->GetParam(Param => $_);
62
63
# $Self->{GetParam}->{$_} = defined $Value ? $Value : '';
63
if (defined($Value)) {
64
$Self->{GetParam}->{$_} = $Value;
64
if (defined($Value)) {
65
$Self->{GetParam}->{$_} = $Value;
68
69
if (!$Self->{GetParam}->{FormID}) {
69
70
$Self->{GetParam}->{FormID} = $Self->{UploadCachObject}->FormIDCreate();
73
$Self->{Config} = $Self->{ConfigObject}->Get("Ticket::Frontend::$Self->{Action}");
95
98
# check needed stuff
96
99
if (!$Self->{TicketID}) {
97
100
return $Self->{LayoutObject}->ErrorScreen(
98
Message => "Got no TicketID!",
99
Comment => 'System Error!',
101
Message => "Got no TicketID!",
102
Comment => 'System Error!',
102
105
# get ticket data
103
106
my %Ticket = $Self->{TicketObject}->TicketGet(TicketID => $Self->{TicketID});
104
108
# check permissions
105
109
if (!$Self->{TicketObject}->Permission(
110
Type => $Self->{Config}->{Permission},
107
111
TicketID => $Self->{TicketID},
108
112
UserID => $Self->{UserID})) {
109
113
# error screen, don't show ticket
110
114
return $Self->{LayoutObject}->NoPermission(WithHeader => 'yes');
112
# get lock state && write (lock) permissions
113
if (!$Self->{TicketObject}->LockIsTicketLocked(TicketID => $Self->{TicketID})) {
115
$Self->{TicketObject}->OwnerSet(
116
TicketID => $Self->{TicketID},
117
UserID => $Self->{UserID},
118
NewUserID => $Self->{UserID},
121
if ($Self->{TicketObject}->LockSet(
122
TicketID => $Self->{TicketID},
124
UserID => $Self->{UserID}
127
$Self->{LayoutObject}->Block(
128
Name => 'TicketLocked',
131
TicketID => $Self->{TicketID},
137
my ($OwnerID, $OwnerLogin) = $Self->{TicketObject}->OwnerCheck(
138
TicketID => $Self->{TicketID},
140
if ($OwnerID != $Self->{UserID}) {
141
$Output = $Self->{LayoutObject}->Header(Title => 'Error');
142
$Output .= $Self->{LayoutObject}->Warning(
143
Message => "Sorry, the current owner is $OwnerLogin!",
144
Comment => 'Please change the owner first.',
146
$Output .= $Self->{LayoutObject}->Footer();
117
if ($Self->{Config}->{RequiredLock}) {
118
if (!$Self->{TicketObject}->LockIsTicketLocked(TicketID => $Self->{TicketID})) {
120
$Self->{TicketObject}->OwnerSet(
121
TicketID => $Self->{TicketID},
122
UserID => $Self->{UserID},
123
NewUserID => $Self->{UserID},
126
if ($Self->{TicketObject}->LockSet(
127
TicketID => $Self->{TicketID},
129
UserID => $Self->{UserID}
132
$Self->{LayoutObject}->Block(
133
Name => 'TicketLocked',
136
TicketID => $Self->{TicketID},
150
$Self->{LayoutObject}->Block(
151
Name => 'TicketBack',
154
TicketID => $Self->{TicketID},
142
my $AccessOk = $Self->{TicketObject}->OwnerCheck(
143
TicketID => $Self->{TicketID},
144
OwnerID => $Self->{UserID},
147
my $Output = $Self->{LayoutObject}->Header();
148
$Output .= $Self->{LayoutObject}->Warning(
149
Message => "Sorry, you need to be the owner to do this action!",
150
Comment => 'Please change the owner first.',
152
$Output .= $Self->{LayoutObject}->Footer();
156
$Self->{LayoutObject}->Block(
157
Name => 'TicketBack',
160
TicketID => $Self->{TicketID},
159
166
# get last customer article or selecte article ...
217
224
$Data{$_} =~ s/<OTRS_CUSTOMER_REALNAME>/$From/g;
227
my %User = $Self->{UserObject}->GetUserData(
228
UserID => $Self->{UserID},
231
foreach my $UserKey (keys %User) {
232
if ($User{$UserKey}) {
233
$Data{$_} =~ s/<OTRS_Agent_$UserKey>/$User{$UserKey}/gi;
236
# cleanup all not needed <OTRS_TICKET_ tags
237
$Data{$_} =~ s/<OTRS_Agent_.+?>/-/gi;
219
238
# replace other needed stuff
220
239
$Data{$_} =~ s/<OTRS_FIRST_NAME>/$Self->{UserFirstname}/g;
221
240
$Data{$_} =~ s/<OTRS_LAST_NAME>/$Self->{UserLastname}/g;
222
$Data{$_} =~ s/<OTRS_USER_ID>/$Self->{UserID}/g;
223
$Data{$_} =~ s/<OTRS_USER_LOGIN>/$Self->{UserLogin}/g;
224
241
# replace ticket data
225
242
foreach my $TicketKey (keys %Ticket) {
226
243
if ($Ticket{$TicketKey}) {
290
314
if (ref($Self->{ConfigObject}->Get('Ticket::Frontend::ArticleComposeModule')) eq 'HASH') {
291
315
my %Jobs = %{$Self->{ConfigObject}->Get('Ticket::Frontend::ArticleComposeModule')};
292
316
foreach my $Job (sort keys %Jobs) {
294
if ($Self->{MainObject}->Require($Jobs{$Job}->{Module})) {
295
my $Object = $Jobs{$Job}->{Module}->new(
297
Debug => $Self->{Debug},
300
foreach ($Object->Option(%Data, %GetParam, Config => $Jobs{$Job})) {
301
$GetParam{$_} = $Self->{ParamObject}->GetParam(Param => $_);
304
$Object->Run(%Data, %GetParam, Config => $Jobs{$Job});
306
%Error = (%Error, $Object->Error(%GetParam, Config => $Jobs{$Job}));
309
return $Self->{LayoutObject}->FatalError();
318
if ($Self->{MainObject}->Require($Jobs{$Job}->{Module})) {
319
my $Object = $Jobs{$Job}->{Module}->new(
321
Debug => $Self->{Debug},
324
foreach ($Object->Option(%Data, %GetParam, Config => $Jobs{$Job})) {
325
$GetParam{$_} = $Self->{ParamObject}->GetParam(Param => $_);
328
$Object->Run(%Data, %GetParam, Config => $Jobs{$Job});
330
%Error = (%Error, $Object->Error(%GetParam, Config => $Jobs{$Job}));
333
return $Self->{LayoutObject}->FatalError();
313
337
# get free text config options
314
338
my %TicketFreeText = ();
316
340
$TicketFreeText{"TicketFreeKey$_"} = $Self->{TicketObject}->TicketFreeTextGet(
317
341
TicketID => $Self->{TicketID},
318
342
Type => "TicketFreeKey$_",
330
354
Ticket => \%Ticket,
331
355
Config => \%TicketFreeText,
357
# get ticket free text params
359
foreach my $Type (qw(Year Month Day Hour Minute)) {
360
$GetParam{"TicketFreeTime".$_.$Type} = $Self->{ParamObject}->GetParam(Param => "TicketFreeTime".$_.$Type);
363
# get free text params
364
my %TicketFreeTime = ();
366
if ($Ticket{"TicketFreeTime".$_}) {
367
($TicketFreeTime{"TicketFreeTime".$_.'Secunde'}, $TicketFreeTime{"TicketFreeTime".$_.'Minute'}, $TicketFreeTime{"TicketFreeTime".$_.'Hour'}, $TicketFreeTime{"TicketFreeTime".$_.'Day'}, $TicketFreeTime{"TicketFreeTime".$_.'Month'}, $TicketFreeTime{"TicketFreeTime".$_.'Year'}) = $Self->{TimeObject}->SystemTime2Date(
368
SystemTime => $Self->{TimeObject}->TimeStamp2SystemTime(
369
String => $Ticket{"TicketFreeTime".$_},
375
my %TicketFreeTimeHTML = $Self->{LayoutObject}->AgentFreeDate(
376
Ticket => \%TicketFreeTime,
334
379
# start with page ...
335
380
$Output .= $Self->{LayoutObject}->Header(Value => $Ticket{TicketNumber});
463
513
my %ArticleParam = ();
464
# run compose modules
465
if (ref($Self->{ConfigObject}->Get('Ticket::Frontend::ArticleComposeModule')) eq 'HASH') {
466
my %Jobs = %{$Self->{ConfigObject}->Get('Ticket::Frontend::ArticleComposeModule')};
467
foreach my $Job (sort keys %Jobs) {
469
if ($Self->{MainObject}->Require($Jobs{$Job}->{Module})) {
470
my $Object = $Jobs{$Job}->{Module}->new(
472
Debug => $Self->{Debug},
475
foreach ($Object->Option(%GetParam, Config => $Jobs{$Job})) {
476
$GetParam{$_} = $Self->{ParamObject}->GetParam(Param => $_);
479
$Object->Run(%GetParam, Config => $Jobs{$Job});
481
%ArticleParam = (%ArticleParam, $Object->ArticleOption(%GetParam, Config => $Jobs{$Job}));
483
%Error = (%Error, $Object->Error(%GetParam, Config => $Jobs{$Job}));
486
return $Self->{LayoutObject}->FatalError();
514
# run compose modules
515
if (ref($Self->{ConfigObject}->Get('Ticket::Frontend::ArticleComposeModule')) eq 'HASH') {
516
my %Jobs = %{$Self->{ConfigObject}->Get('Ticket::Frontend::ArticleComposeModule')};
517
foreach my $Job (sort keys %Jobs) {
519
if ($Self->{MainObject}->Require($Jobs{$Job}->{Module})) {
520
my $Object = $Jobs{$Job}->{Module}->new(
522
Debug => $Self->{Debug},
525
foreach ($Object->Option(%GetParam, Config => $Jobs{$Job})) {
526
$GetParam{$_} = $Self->{ParamObject}->GetParam(Param => $_);
529
$Object->Run(%GetParam, Config => $Jobs{$Job});
531
%ArticleParam = (%ArticleParam, $Object->ArticleOption(%GetParam, Config => $Jobs{$Job}));
533
%Error = (%Error, $Object->Error(%GetParam, Config => $Jobs{$Job}));
536
return $Self->{LayoutObject}->FatalError();
491
541
# check if there is an error
619
# set ticket free time
621
if (defined($GetParam{"TicketFreeTime".$_."Year"}) &&
622
defined($GetParam{"TicketFreeTime".$_."Month"}) &&
623
defined($GetParam{"TicketFreeTime".$_."Day"}) &&
624
defined($GetParam{"TicketFreeTime".$_."Hour"}) &&
625
defined($GetParam{"TicketFreeTime".$_."Minute"})) {
626
my %Time = $Self->{LayoutObject}->TransfromDateSelection(
628
Prefix => "TicketFreeTime".$_,
630
$Self->{TicketObject}->TicketFreeTimeSet(
632
Prefix => "TicketFreeTime",
633
TicketID => $Self->{TicketID},
635
UserID => $Self->{UserID},
571
640
$Self->{TicketObject}->StateSet(
572
641
TicketID => $Self->{TicketID},
609
return $Self->{LayoutObject}->ErrorScreen(
610
Comment => 'Please contact the admin.',
678
return $Self->{LayoutObject}->ErrorScreen(
679
Comment => 'Please contact the admin.',
615
684
sub _GetNextStates {
616
685
my $Self = shift;
618
687
# get next states
619
688
my %NextStates = $Self->{TicketObject}->StateList(
620
Type => 'DefaultNextForward',
621
689
Action => $Self->{Action},
622
690
TicketID => $Self->{TicketID},
623
691
UserID => $Self->{UserID},
625
693
return \%NextStates;
629
697
my $Self = shift;
631
699
# build next states string
701
if (!$Param{ComposeStateID}) {
702
$State{Selected} = $Self->{Config}->{StateDefault};
705
$State{SelectedID} = $Param{ComposeStateID};
632
708
$Param{'NextStatesStrg'} = $Self->{LayoutObject}->OptionStrgHashRef(
633
709
Data => $Param{NextStates},
634
710
Name => 'ComposeStateID',
635
Selected => $Param{NextState}
637
713
my %ArticleTypes = ();
638
my @ArticleTypesPossible = @{$Self->{ConfigObject}->Get('Ticket::Frontend::ForwardArticleTypes')};
714
my @ArticleTypesPossible = @{$Self->{Config}->{ArticleTypes}};
639
715
foreach (@ArticleTypesPossible) {
640
716
$ArticleTypes{$Self->{TicketObject}->ArticleTypeLookup(ArticleType => $_)} = $_;
666
742
Format => 'DateInputFormatLong',
667
743
DiffTime => $Self->{ConfigObject}->Get('Ticket::Frontend::PendingDiffTime') || 0,
749
if ($Self->{Config}->{'TicketFreeText'}->{$Count}) {
750
$Self->{LayoutObject}->Block(
753
TicketFreeKeyField => $Param{'TicketFreeKeyField'.$Count},
754
TicketFreeTextField => $Param{'TicketFreeTextField'.$Count},
762
if ($Self->{Config}->{'TicketFreeTime'}->{$Count}) {
763
$Self->{LayoutObject}->Block(
766
TicketFreeTimeKey => $Self->{ConfigObject}->Get('TicketFreeTimeKey'.$Count),
767
TicketFreeTime => $Param{'TicketFreeTime'.$Count},
669
773
# show time accounting box
670
774
if ($Self->{ConfigObject}->Get('Ticket::Frontend::AccountTime')) {
671
775
$Self->{LayoutObject}->Block(