Commit c30775c9bacf04e46e59585ba17d6195c6bc3cc5

Authored by Rodrigo Goncalves
1 parent 2de8949e
Exists in master

Ajustes para OTRS 6

CreateOpm.sh 0 → 100755
@@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
  1 +#!/bin/bash
  2 +LOCAL="$PWD"
  3 +cd /opt/otrs
  4 +bin/otrs.Console.pl Dev::Package::Build "$LOCAL"/InPersonTicket.sopm "$LOCAL"/
GenerateOPM.sh
@@ -1,4 +0,0 @@ @@ -1,4 +0,0 @@
1 -#!/bin/bash  
2 -LOCAL="$PWD"  
3 -cd /opt/otrs  
4 -bin/otrs.Console.pl Dev::Package::Build "$LOCAL"/InPersonTicket.sopm "$LOCAL"/  
InPersonTicket.sopm
@@ -1,26 +0,0 @@ @@ -1,26 +0,0 @@
1 -<?xml version="1.0" encoding="utf-8" ?>  
2 -<otrs_package version="1.0">  
3 - <Name>InPersonTicket</Name>  
4 - <Version>1.3.0</Version>  
5 - <ChangeLog Version="1.0.1" Date="22/05/2015">First version</ChangeLog>  
6 - <ChangeLog Version="1.1.0" Date="2016-01-26">Fixes for OTRS 5.0.x</ChangeLog>  
7 - <ChangeLog Version="1.2.0" Date="2016-06-10">Support for dynamic fields</ChangeLog>  
8 - <ChangeLog Version="1.3.0" Date="2016-06-10">Support for custom queues</ChangeLog>  
9 - <Framework>5.0.x</Framework>  
10 - <Vendor>SeTIC-UFSC</Vendor>  
11 - <URL>setic.ufsc.br</URL>  
12 - <License>Free</License>  
13 - <Description>In person ticket</Description>  
14 - <IntroInstall Type="post" Title="Thank you">Module installed successfully.</IntroInstall>  
15 - <BuildDate>?</BuildDate>  
16 - <BuildHost>?</BuildHost>  
17 - <PackageRequired Version="1.1">Lib_setic</PackageRequired>  
18 - <Filelist>  
19 - <File Permission="644" Location="Kernel/Config/Files/InPersonTicket.xml"></File>  
20 - <File Permission="644" Location="Kernel/Modules/InPersonTicket.pm"></File>  
21 - <File Permission="644" Location="Kernel/Language/pt_BR_InPersonTicket.pm"></File>  
22 -  
23 - <File Permission="644" Location="Kernel/Output/HTML/Templates/Standard/InPersonTicket.tt"></File>  
24 - <File Permission="644" Location="Kernel/Output/HTML/Templates/Standard/InPersonTicketCreated.tt"></File>  
25 - </Filelist>  
26 -</otrs_package>  
Kernel/Config/Files/InPersonTicket.xml
@@ -1,116 +0,0 @@ @@ -1,116 +0,0 @@
1 -<?xml version="1.0" encoding="UTF-8" ?>  
2 -<otrs_config init="Application" version="1.0">  
3 - <ConfigItem Name="Frontend::Module###InPersonTicket" Required="0" Valid="1">  
4 - <Description>Frontend module registration for the agent interface.</Description>  
5 - <Group>Ticket</Group>  
6 - <SubGroup>Frontend::Agent::ModuleRegistration</SubGroup>  
7 - <Setting>  
8 - <FrontendModuleReg>  
9 - <Description>Module for creating new ticket for in-person reception</Description>  
10 - <NavBarName>Ticket</NavBarName>  
11 - <Title>In person ticket</Title>  
12 - <NavBar>  
13 - <Description>In person ticket</Description>  
14 - <Name>In person ticket</Name>  
15 - <Link>Action=InPersonTicket</Link>  
16 - <NavBar>Ticket</NavBar>  
17 - <Type></Type>  
18 - <Prio>8400</Prio>  
19 - </NavBar>  
20 - </FrontendModuleReg>  
21 - </Setting>  
22 - </ConfigItem>  
23 -  
24 -  
25 - <ConfigItem Name="Ticket::Frontend::InPersonTicket###DynamicFields"  
26 - Required="1" Valid="1">  
27 - <Description>Dynamic Fields IDs to Include (comma separated) - place * before fields that should use the last value for new tickets</Description>  
28 - <Group>Ticket</Group>  
29 - <SubGroup>Frontend::Agent::InPersonTicket</SubGroup>  
30 - <Setting>  
31 - <String Regex=""></String>  
32 - </Setting>  
33 - </ConfigItem>  
34 -  
35 -  
36 - <ConfigItem Name="Ticket::Frontend::InPersonTicket###TypeID"  
37 - Required="1" Valid="1">  
38 - <Description>Default type ID for tickets</Description>  
39 - <Group>Ticket</Group>  
40 - <SubGroup>Frontend::Agent::InPersonTicket</SubGroup>  
41 - <Setting>  
42 - <String Regex="">6</String>  
43 - </Setting>  
44 - </ConfigItem>  
45 -  
46 - <ConfigItem Name="Ticket::Frontend::InPersonTicket###DefaultCustomerID"  
47 - Required="1" Valid="1">  
48 - <Description>Default customer ID for tickets</Description>  
49 - <Group>Ticket</Group>  
50 - <SubGroup>Frontend::Agent::InPersonTicket</SubGroup>  
51 - <Setting>  
52 - <String Regex="">paginas@sistemas.ufsc.br</String>  
53 - </Setting>  
54 - </ConfigItem>  
55 -  
56 - <ConfigItem Name="Ticket::Frontend::InPersonTicket###DefaultOwnerID"  
57 - Required="1" Valid="1">  
58 - <Description>Default Owner ID for tickets</Description>  
59 - <Group>Ticket</Group>  
60 - <SubGroup>Frontend::Agent::InPersonTicket</SubGroup>  
61 - <Setting>  
62 - <String Regex="">1</String>  
63 - </Setting>  
64 - </ConfigItem>  
65 -  
66 - <ConfigItem Name="Ticket::Frontend::InPersonTicket###DefaultUserDomain"  
67 - Required="1" Valid="1">  
68 - <Description>Default domain for user e-mails.</Description>  
69 - <Group>Ticket</Group>  
70 - <SubGroup>Frontend::Agent::InPersonTicket</SubGroup>  
71 - <Setting>  
72 - <String Regex="">ufsc.br,grad.ufsc.br,posgrad.ufsc.br</String>  
73 - </Setting>  
74 - </ConfigItem>  
75 -  
76 - <ConfigItem Name="Ticket::Frontend::InPersonTicket###ReplyModelID"  
77 - Required="1" Valid="1">  
78 - <Description>Model to use for reply to users.</Description>  
79 - <Group>Ticket</Group>  
80 - <SubGroup>Frontend::Agent::InPersonTicket</SubGroup>  
81 - <Setting>  
82 - <String Regex="">22</String>  
83 - </Setting>  
84 - </ConfigItem>  
85 -  
86 - <ConfigItem Name="Ticket::Frontend::InPersonTicket###ReplyModelIDClosed"  
87 - Required="1" Valid="1">  
88 - <Description>Model to use for reply to users when ticket is closed.</Description>  
89 - <Group>Ticket</Group>  
90 - <SubGroup>Frontend::Agent::InPersonTicket</SubGroup>  
91 - <Setting>  
92 - <String Regex="">5</String>  
93 - </Setting>  
94 - </ConfigItem>  
95 -  
96 -<ConfigItem Name="Ticket::Frontend::InPersonTicket###QueuePrefix"  
97 - Required="0" Valid="1">  
98 - <Description>When the queue comes from a field in the form, a prefix can be attached to the value while searching for the queue. A space is added between this and the queue name.</Description>  
99 - <Group>Ticket</Group>  
100 - <SubGroup>Frontend::Agent::InPersonTicket</SubGroup>  
101 - <Setting>  
102 - <String Regex="">Primeiro nível -</String>  
103 - </Setting>  
104 - </ConfigItem>  
105 -  
106 - <ConfigItem Name="Ticket::Frontend::InPersonTicket###QueueField"  
107 - Required="0" Valid="1">  
108 - <Description>Name of the field in the form which indicates the queue to send the ticket.</Description>  
109 - <Group>Ticket</Group>  
110 - <SubGroup>Frontend::Agent::InPersonTicket</SubGroup>  
111 - <Setting>  
112 - <String Regex="">DF_unidade</String>  
113 - </Setting>  
114 - </ConfigItem>  
115 -  
116 -</otrs_config>  
117 \ No newline at end of file 0 \ No newline at end of file
Kernel/Language/pt_BR_InPersonTicket.pm
@@ -1,28 +0,0 @@ @@ -1,28 +0,0 @@
1 -# --  
2 -# Kernel/Modules/pt_BR_StatisticsGraphs.pm - translations for StatisticsGraphs Module  
3 -# Translations  
4 -#  
5 -# Copyright (C) 2015 (Rodrigo Goncalves) (rodrigo.g@ufsc.br)  
6 -# --  
7 -# This software comes with ABSOLUTELY NO WARRANTY. For details, see  
8 -# the enclosed file COPYING for license information (AGPL). If you  
9 -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.  
10 -# --  
11 -package Kernel::Language::pt_BR_InPersonTicket;  
12 -  
13 -use strict;  
14 -use warnings;  
15 -use utf8;  
16 -  
17 -sub Data {  
18 - my $Self = shift;  
19 -  
20 - $Self->{Translation}->{'Concluded'} = 'Concluído';  
21 - $Self->{Translation}->{'In person ticket'} = 'Atendimento presencial';  
22 - $Self->{Translation}->{'The ticket has been created with number:'} = 'Chamado criado com número: ';  
23 - $Self->{Translation}->{'Dynamic Fields IDs to Include (comma separated)'} = 'IDs dos campos dinâmicos, separados por vírgula - coloque * antes de campos que não devem usar o último valor para novos tickets';  
24 -  
25 -  
26 - return 1;  
27 -}  
28 -1;  
29 \ No newline at end of file 0 \ No newline at end of file
Kernel/Modules/InPersonTicket.pm
@@ -1,428 +0,0 @@ @@ -1,428 +0,0 @@
1 -# --  
2 -# Kernel/Modules/OcurrenceControl.pm - frontend module  
3 -# Copyright (C) (2013) (Carlos Rebelato) (carlos.rebelato@grad.ufsc.br)  
4 -# --  
5 -# $Id: writing-otrs-application.xml,v 1.1 2010/08/13 08:59:28 mg Exp $  
6 -# --  
7 -# This software comes with ABSOLUTELY NO WARRANTY. For details, see  
8 -# the enclosed file COPYING for license information (AGPL). If you  
9 -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.  
10 -# --  
11 -# Autor: Rodrigo Gonçalves  
12 -# Data.: 18/05/2015 - Versão inicial  
13 -#  
14 -package Kernel::Modules::InPersonTicket;  
15 -  
16 -use strict;  
17 -use warnings;  
18 -use Data::Dumper;  
19 -  
20 -our @ObjectDependencies = (  
21 - "Kernel::Output::HTML::Layout",  
22 - "Kernel::System::Log",  
23 - "Kernel::System::Web::Request", # OLD ParamObject  
24 - "Kernel::System::DB",  
25 - "Kernel::Config",  
26 - "Kernel::System::CustomerUser",  
27 - "Kernel::System::Service",  
28 - "Kernel::System::DynamicField::Backend",  
29 - "Kernel::System::DynamicField",  
30 - "Kernel::System::User"  
31 -);  
32 -  
33 -sub new {  
34 - my ( $Type, %Param ) = @_;  
35 -  
36 - # allocate new hash for object  
37 - my $Self = {%Param};  
38 - bless( $Self, $Type );  
39 -  
40 - return $Self;  
41 -}  
42 -  
43 -sub Run {  
44 - my ( $Self, %Param ) = @_;  
45 - my %Data = ();  
46 -  
47 - my $layoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout");  
48 - my $paramObject = $Kernel::OM->Get("Kernel::System::Web::Request");  
49 - my $dbObject = $Kernel::OM->Get("Kernel::System::DB");  
50 - my $serviceObject = $Kernel::OM->Get("Kernel::System::Service");  
51 -  
52 - $Self->BuildServiceBlock();  
53 - $Self->BuildDynamicFieldsFields();  
54 -  
55 -  
56 - if ( $paramObject->GetParam( Param => "Subaction" ) && ($paramObject->GetParam( Param => "Subaction" ) eq "GetUserName") ) {  
57 - my $content = $Self->GetUserName(UserID => $paramObject->GetParam( Param => "UserID" ));  
58 -  
59 - return $layoutObject->Attachment(  
60 - ContentType => 'application/text; charset=' . $layoutObject->{Charset},  
61 - Content => $content,  
62 - Type => 'inline',  
63 - NoCache => 1,  
64 - );  
65 - } elsif ( $paramObject->GetParam( Param => "Subaction" ) && ($paramObject->GetParam( Param => "Subaction" ) eq "Add") ) {  
66 - return $Self->CreateTicket();  
67 - }  
68 -  
69 -  
70 - my $Output = $layoutObject->Header( Title => "In person ticket" );  
71 - $Output .= $layoutObject->NavigationBar();  
72 - $Output .= $layoutObject->Output(  
73 - TemplateFile => 'InPersonTicket'  
74 - );  
75 -  
76 - $Output .= $layoutObject->Footer();  
77 - return $Output;  
78 -  
79 - return $Output;  
80 -  
81 -}  
82 -  
83 -sub GetUserName {  
84 - my ( $Self, %Param ) = @_;  
85 -  
86 - my $userObject = $Kernel::OM->Get("Kernel::System::CustomerUser");  
87 - my %dados = $userObject->CustomerUserDataGet(User => $Param{"UserID"});  
88 -  
89 - if (%dados) {  
90 - return $dados{UserFirstname};  
91 - } else {  
92 - return "";  
93 - }  
94 -  
95 -}  
96 -  
97 -sub BuildDynamicFieldsFields {  
98 - my ( $Self, %Param ) = @_;  
99 -  
100 - my $DynamicFieldBackendObject = $Kernel::OM->Get('Kernel::System::DynamicField::Backend');  
101 - my $DynamicFieldObject = $Kernel::OM->Get("Kernel::System::DynamicField");  
102 - my $ConfigObject = $Kernel::OM->Get("Kernel::Config");  
103 - my $config = $ConfigObject->Get("Ticket::Frontend::InPersonTicket");  
104 - my $layoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout");  
105 - my $paramObject = $Kernel::OM->Get("Kernel::System::Web::Request");  
106 - my $userObject = $Kernel::OM->Get("Kernel::System::User");  
107 - my @dfieldList = @{ $DynamicFieldObject->DynamicFieldListGet( Valid => 1 ) };  
108 - my @dynamicFieldsInuse = split(",", $config->{DynamicFields} || "unidade");  
109 - my %prefs = $userObject->GetPreferences(UserID => $Self->{UserID});  
110 -  
111 - foreach (@dfieldList) {  
112 - my $field = $_;  
113 - if ($field->{Name} ~~ @dynamicFieldsInuse || '*' . $field->{Name} ~~ @dynamicFieldsInuse) {  
114 -  
115 - my $defValue = "";  
116 -  
117 - if ($field->{Name} ~~ @dynamicFieldsInuse) {  
118 - $defValue = $prefs{"IPT_DF_" . $field->{Name}};  
119 - }  
120 -  
121 - my $DynamicFieldHTML = $DynamicFieldBackendObject->EditFieldRender(  
122 - DynamicFieldConfig => $field,  
123 - LayoutObject => $layoutObject,  
124 - ParamObject => $paramObject,  
125 - Value => $defValue,  
126 - );  
127 -  
128 - $layoutObject->Block(  
129 - Name => 'DynamicField',  
130 - Data => {  
131 - Name => $field->{Name},  
132 - Label => $DynamicFieldHTML->{Label},  
133 - Field => $DynamicFieldHTML->{Field},  
134 - },  
135 - );  
136 - }  
137 - }  
138 -  
139 -}  
140 -  
141 -sub BuildServiceBlock {  
142 - my ( $Self, %Param ) = @_;  
143 -  
144 - my $layoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout");  
145 - my $paramObject = $Kernel::OM->Get("Kernel::System::Web::Request");  
146 - my $dbObject = $Kernel::OM->Get("Kernel::System::DB");  
147 - my $ocurrenceObject = $Kernel::OM->Get("Kernel::System::Ocurrence");  
148 - my $serviceObject = $Kernel::OM->Get("Kernel::System::Service");  
149 - my $serviceResponsibility = $Kernel::OM->Get("Kernel::System::ServiceResponsibility");  
150 -  
151 - my $services = $serviceObject->ServiceListGet( Valid => 1, UserID => 1);  
152 - my @services = @$services;  
153 - @services = sort {$a->{Name} cmp $b->{Name}} @services;  
154 -  
155 - foreach my $service (@services) {  
156 - $layoutObject->Block(  
157 - Name => 'selectService',  
158 - Data => {  
159 - ServiceID => $service->{ServiceID},  
160 - ServiceName => $Self->GetServiceName(Services => \@services, ServiceID => $service->{ServiceID}, ServiceName => $service->{Name}),  
161 - Disabled => $Self->LeafService(Services => \@services, ServiceID => $service->{ServiceID}) ? "" : "disabled"  
162 - }  
163 - );  
164 - }  
165 -}  
166 -  
167 -sub GetServiceName {  
168 - my ( $Self, %Param ) = @_;  
169 -  
170 - if ($Self->LeafService(%Param)) {  
171 - my @tokens = split("::", $Param{ServiceName});  
172 - return "&nbsp;&nbsp;" x (@tokens - 1) . @tokens[@tokens - 1];  
173 - } else {  
174 - return $Param{ServiceName};  
175 - }  
176 -}  
177 -  
178 -sub LeafService {  
179 - my ( $Self, %Param ) = @_;  
180 -  
181 - my $services = $Param{Services};  
182 - my @services = @$services;  
183 - my $serviceID = $Param{ServiceID};  
184 -  
185 - foreach my $service (@services) {  
186 - if ((exists $service->{ParentID}) && ($service->{ParentID} == $serviceID)) {  
187 - return 0;  
188 - }  
189 - }  
190 -  
191 - return 1;  
192 -}  
193 -  
194 -sub GetQueueID() {  
195 - my ( $Self, %Param ) = @_;  
196 -  
197 - my $ParamObject = $Kernel::OM->Get("Kernel::System::Web::Request");  
198 - my $QueueObject = $Kernel::OM->Get("Kernel::System::Queue");  
199 - my $DynamicFieldObject = $Kernel::OM->Get("Kernel::System::DynamicField");  
200 - my $ConfigObject = $Kernel::OM->Get("Kernel::Config");  
201 - my $LayoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout");  
202 - my $DynamicFieldBackendObject = $Kernel::OM->Get('Kernel::System::DynamicField::Backend');  
203 -  
204 - # Gets default Queue  
205 - my $ConfigTicket = $ConfigObject->Get("Ticket::Frontend::CustomerTicketMessage");  
206 -  
207 - my $QueueDefault = $ConfigTicket->{"QueueDefault"};  
208 -  
209 - my %QueueListID = $QueueObject->QueueList( Valid => 1 );  
210 - my %QueueList = reverse $QueueObject->QueueList( Valid => 1 );  
211 - my $QueueID = $QueueList{$QueueDefault};  
212 - my $Queue = $QueueListID{$QueueID};  
213 -  
214 - $Self->{ConfigModule} = $ConfigObject->Get("Ticket::Frontend::InPersonTicket");  
215 -  
216 - # Checks if there is a field for the queue  
217 - my $QueuePrefix = $Self->{ConfigModule}->{"QueuePrefix"};  
218 - my $QueueField = $Self->{ConfigModule}->{"QueueField"};  
219 -  
220 - if ( $QueuePrefix && $QueueField ) {  
221 - my $dynFieldQueue = $DynamicFieldObject->DynamicFieldGet( Name => $QueueField );  
222 - my $QueueSelected = $DynamicFieldBackendObject->EditFieldValueGet(  
223 - DynamicFieldConfig => $dynFieldQueue,  
224 - ParamObject => $ParamObject,  
225 - LayoutObject => $LayoutObject,  
226 - );  
227 -  
228 - my $QueueName = "$QueuePrefix $QueueSelected";  
229 -  
230 - if ( $QueueList{$QueueName} ) {  
231 - $QueueID = $QueueList{$QueueName};  
232 - $Queue = $QueueName;  
233 - }  
234 - }  
235 -  
236 - return ( $Queue, $QueueID );  
237 -}  
238 -  
239 -sub CreateTicket {  
240 - my ( $Self, %Param ) = @_;  
241 - my %Data = ();  
242 -  
243 - my $TicketObject = $Kernel::OM->Get("Kernel::System::Ticket");  
244 - my $ConfigObject = $Kernel::OM->Get("Kernel::Config");  
245 - my $ParamObject = $Kernel::OM->Get("Kernel::System::Web::Request");  
246 - my $BackendObject = $Kernel::OM->Get("Kernel::System::DynamicField::Backend");  
247 - my $DynamicFieldObject = $Kernel::OM->Get("Kernel::System::DynamicField");  
248 - my $CustomerUserObject = $Kernel::OM->Get("Kernel::System::CustomerUser");  
249 - my $LayoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout");  
250 - my $userObject = $Kernel::OM->Get("Kernel::System::User");  
251 - my $DynamicFieldBackendObject = $Kernel::OM->Get('Kernel::System::DynamicField::Backend');  
252 -  
253 -  
254 - # Queue  
255 - my ( $Queue, $QueueID ) = $Self->GetQueueID(%Param);  
256 - $Data{QueueID} = $QueueID;  
257 - my $email = $ParamObject->GetParam( Param => "userID" );  
258 -  
259 - $Self->{Config} = $ConfigObject->Get("Ticket::Frontend::CustomerTicketMessage");  
260 -  
261 - $Self->{ConfigModule} = $ConfigObject->Get("Ticket::Frontend::InPersonTicket");  
262 -  
263 - my $TicketID = $TicketObject->TicketCreate(  
264 - Title => "Atendimento presencial",  
265 - QueueID => $QueueID,  
266 - Priority => $Self->{Config}->{PriorityDefault},  
267 - Lock => 'unlock',  
268 - State => ($ParamObject->GetParam(Param => "concluded") ? 'closed successful' : 'new'),  
269 - ServiceID => $ParamObject->GetParam( Param => "ServiceID" ),  
270 - TypeID => $Self->{ConfigModule}->{TypeID},  
271 - CustomerID => $Self->GetUserIDFromEmail( EMail => $email, DefaultUserDomain => $Self->{ConfigModule}->{DefaultUserDomain}, DefaultCustomerID => $Self->{ConfigModule}->{DefaultCustomerID}),  
272 - CustomerUser => $Self->GetUserIDFromEmail( EMail => $email, DefaultUserDomain => $Self->{ConfigModule}->{DefaultUserDomain}, DefaultCustomerID => $Self->{ConfigModule}->{DefaultCustomerID}),  
273 - OwnerID => $Self->{ConfigModule}->{DefaultOwnerID},  
274 - UserID => $Self->{ConfigModule}->{DefaultOwnerID},  
275 - );  
276 -  
277 - my @dfieldList = @{ $DynamicFieldObject->DynamicFieldListGet( Valid => 1 ) };  
278 - my @dynamicFieldsInuse = split(",", $Self->{ConfigModule}->{DynamicFields} || "unidade");  
279 -  
280 - foreach (@dfieldList) {  
281 - my $field = $_;  
282 -  
283 - if ($field->{Name} ~~ @dynamicFieldsInuse || '*' . $field->{Name} ~~ @dynamicFieldsInuse) {  
284 - my $value = $DynamicFieldBackendObject->EditFieldValueGet(  
285 - DynamicFieldConfig => $field,  
286 - ParamObject => $ParamObject,  
287 - LayoutObject => $LayoutObject,  
288 - );  
289 -  
290 - if ($field->{Name} ~~ @dynamicFieldsInuse) {  
291 - $userObject->SetPreferences(  
292 - UserID => $Self->{UserID},  
293 - Key => "IPT_DF_" . $field->{Name},  
294 - Value => $value,  
295 - );  
296 - }  
297 -  
298 - if ($value) {  
299 - $DynamicFieldBackendObject->ValueSet(  
300 - DynamicFieldConfig => $field,  
301 - ObjectID => $TicketID,  
302 - Value => $value,  
303 - UserID => $Self->{UserID},  
304 - );  
305 - }  
306 - }  
307 - }  
308 -  
309 - my $MimeType = 'text/plain';  
310 -  
311 - # Create article  
312 - my $FullName = $ParamObject->GetParam( Param => "UserName" );  
313 -  
314 - my $From = "\"$FullName\" <$email>";  
315 - my $ArticleID = $TicketObject->ArticleCreate(  
316 - TicketID => $TicketID,  
317 - ArticleType => 'phone',  
318 - SenderType => 'customer',  
319 - From => $email,  
320 - To => $Queue,  
321 - Subject => "Registro de atendimento",  
322 - Body => $ParamObject->GetParam( Param => "Description" ),  
323 - MimeType => $MimeType,  
324 - Charset => $LayoutObject->{UserCharset},  
325 - UserID => $Self->{ConfigModule}->{DefaultOwnerID},  
326 - HistoryType => $Self->{Config}->{HistoryType},  
327 - HistoryComment => $Self->{Config}->{HistoryComment} || '%%',  
328 - AutoResponseType => '',  
329 - OrigHeader => {  
330 - From => $From,  
331 - To => $Queue,  
332 - Subject => "Registro de atendimento",  
333 - Body => $ParamObject->GetParam( Param => "Description" ),  
334 - },  
335 - Queue => $Queue,  
336 - );  
337 -  
338 - my $ReplyUser = $Kernel::OM->Get('Kernel::System::TemplateGenerator')->Template(  
339 - TemplateID => ($ParamObject->GetParam(Param => "concluded") ? $Self->{ConfigModule}->{ReplyModelIDClosed} : $Self->{ConfigModule}->{ReplyModelID}),  
340 - TicketID => $TicketID,  
341 - UserID => $Self->{ConfigModule}->{DefaultOwnerID},  
342 - );  
343 -  
344 - my $corpo = $ParamObject->GetParam( Param => "Description" );  
345 - $ReplyUser =~ s/CONTEUDO/$corpo/g;  
346 -  
347 - my %sysAddr = $Kernel::OM->Get('Kernel::System::SystemAddress')->SystemAddressGet(ID => 1);  
348 -  
349 - my $FromSystem = $sysAddr{Name};  
350 -  
351 - $MimeType = 'text/html';  
352 -  
353 - $ArticleID = $TicketObject->ArticleSend(  
354 - TicketID => $TicketID,  
355 - ArticleType => 'note-internal', # email-external|email-internal|phone|fax|...  
356 - SenderType => 'agent', # agent|system|customer  
357 - From => $FromSystem,  
358 - To => $email, # not required but useful  
359 - Subject => 'Registro de atendimento', # required  
360 - Body => $ReplyUser, # required  
361 - Charset => $LayoutObject->{UserCharset},  
362 - MimeType => $MimeType,  
363 - Loop => 0, # 1|0 used for bulk emails  
364 - HistoryType => 'AddNote', # Move|AddNote|PriorityUpdate|WebRequestCustomer|...  
365 - HistoryComment => 'Auto-reply ao usuário',  
366 - NoAgentNotify => 0, # if you don't want to send agent notifications  
367 - UserID => $Self->{ConfigModule}->{DefaultOwnerID},  
368 - );  
369 -  
370 - $Data{TicketNumber} = $TicketObject->TicketNumberLookup( TicketID => $TicketID );  
371 -  
372 - # build output  
373 - my $Output = $LayoutObject->Header( Title => "In person ticket" );  
374 - my %BlockData = ();  
375 - $BlockData{TicketNumber} = '<a href="/otrs/index.pl?Action=AgentTicketZoom;TicketID=' . $TicketID . '">' . $Data{TicketNumber} . '</a>';  
376 - $LayoutObject->Block(  
377 - Name => 'NewTicketCreated',  
378 - Data => \%BlockData  
379 - );  
380 -  
381 - $Output .= $LayoutObject->NavigationBar();  
382 - $Output .= $LayoutObject->Output(  
383 - Data => \%Data,  
384 - TemplateFile => 'InPersonTicketCreated',  
385 - );  
386 - $Output .= $LayoutObject->Footer();  
387 - return $Output;  
388 -}  
389 -  
390 -  
391 -sub GetUserIDFromEmail {  
392 - my ( $Self, %Param ) = @_;  
393 -  
394 - my $email = $Param{EMail};  
395 - my $result = $Param{DefaultCustomerID};  
396 - my $domainList = $Param{DefaultUserDomain};  
397 -  
398 - if (index($email, '@') == -1) {  
399 - return $email;  
400 - }  
401 -  
402 - my $CustomerUserObject = $Kernel::OM->Get("Kernel::System::CustomerUser");  
403 -  
404 - if ($domainList) {  
405 - my @domains = split( ",", $domainList );  
406 -  
407 - for my $domain (@domains) {  
408 - my @parts = split( "@", $email );  
409 - if ( $parts[1] eq $domain ) {  
410 - my $id = $parts[0];  
411 - my %List = $CustomerUserObject->CustomerSearch(  
412 - UserLogin => $id,  
413 - Valid => 1, # not required, default 1  
414 - );  
415 - if ( keys %List ) {  
416 - $result = $id;  
417 - return $result;  
418 - }  
419 - }  
420 - }  
421 - }  
422 -  
423 - return $result;  
424 -}  
425 -  
426 -  
427 -  
428 -1;  
Kernel/Output/HTML/Templates/Standard/InPersonTicket.tt
@@ -1,141 +0,0 @@ @@ -1,141 +0,0 @@
1 -# --  
2 -# Kernel/Output/HTML/Standard/EditOcurrence.tt - overview  
3 -# Copyright (C) (2014) (Carlos Rebelatto) (carlos.rebelatto@grad.ufsc.br)  
4 -# --  
5 -# $Id: writing-otrs-application.xml,v 1.1 2010/08/13 08:59:28 mg Exp $  
6 -# --  
7 -# This software comes with ABSOLUTELY NO WARRANTY. For details, see  
8 -# the enclosed file COPYING for license information (AGPL). If you  
9 -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.  
10 -# --  
11 -<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst">  
12 -  
13 - <h1>[% Translate("In person ticket") | html %]</h1>  
14 -  
15 -  
16 - <div class="ContentColumn">  
17 - <div class="WidgetSimple">  
18 - <div class="Header">  
19 - <h2>[% Translate("New ticket") | html %]</h2>  
20 - </div>  
21 -  
22 - [% RenderBlockStart("NewTicketCreated") %]  
23 - <div class="Header">  
24 - <h2 style="text-align: right; font-weight: bolder; font-size: larger; color: red">[% Translate("The ticket has been created with number:") | html %][% Data.TicketNumber %]  
25 - </div>  
26 - [% RenderBlockEnd("NewTicketCreated") %]  
27 -  
28 -  
29 - <div class="Content SpacingBottom ">  
30 -  
31 - <form action="[% Env("CGIHandle") %]" method="post" enctype="multipart/form-data" name="compose" id="InPersonTicket" class="Validate PreventMultipleSubmits">  
32 -  
33 - <input type="hidden" name="Action" value="[% Env("Action") %]"/>  
34 - <input type="hidden" name="Subaction" value="Add"/>  
35 -  
36 - <fieldset class="TableLike">  
37 - <label for="userID" class="Mandatory"><span class="Marker">*</span> [% Translate("E-mail") | html %]:</label>  
38 - <input class="Validate_Required" type="text" name="userID" id="userID" style="margin-left: 10px; width: 400px" />  
39 - <div class="Clear"></div>  
40 -  
41 - <label for="UserName" class="Mandatory"><span class="Marker">*</span> [% Translate("Nome") | html %]:</label>  
42 - <input class="Validate_Required" type="text" name="UserName" id="UserName" style="margin-left: 10px; width: 400px" />  
43 - <div class="Clear"></div>  
44 -  
45 - <label for="SelectService" class="Mandatory"><span class="Marker">*</span> [% Translate("Serviço") | html %]:</label>  
46 - <select class="Validate_Required" style="margin-left: 10px" name="ServiceID" id="SelectService">  
47 - <option selected disabled value="0">[% Translate("Select a service") | html %]</option>  
48 - [% RenderBlockStart("selectService") %]  
49 - <option [% Data.Disabled %] value="[% Data.ServiceID | html %]">[% Data.ServiceName %]</option>  
50 - [% RenderBlockEnd("selectService") %]  
51 - </select>  
52 - <div class="Clear"></div>  
53 -  
54 -  
55 - [% RenderBlockStart("DynamicField") %]  
56 - [% Data.Label %]  
57 - <div class="Field">  
58 - [% Data.Field %]  
59 - </div>  
60 - <div class="Clear"></div>  
61 -  
62 -  
63 -  
64 - [% RenderBlockEnd("DynamicField") %]  
65 -  
66 -  
67 - <label class="OtherMandatory" for="RichTextDescription"><span class="Marker">*</span> [% Translate("Description") | html %]:</label>  
68 - <div id="RichTextField" class="RichTextField" >  
69 -  
70 - [% RenderBlockStart("RichText") %]  
71 - [% InsertTemplate("RichTextEditor.tt") %]  
72 - [% RenderBlockEnd("RichText") %]  
73 -  
74 - <textarea style="width: 800px; height: 200px" id="RichTextDescription" class="RichText Validate_Required [% Data.BodyInvalid | html %]" name="Description" title="Description">[% Data.Description %]</textarea>  
75 - <div id="RichTextError" class="TooltipErrorMessage"><p>[% Translate("This field is required.") | html %]</p></div>  
76 - <div id="RichTextServerError" class="TooltipErrorMessage"><p>[% Translate("This field is required.") | html %]</p></div>  
77 -  
78 - <div style="display: block; padding: 5px; border-style: solid; border-color: black; border-width: 1px">  
79 - Atalhos:  
80 - <button type="button" onclick="javascript:modeloServicoConfigurado()">Serviço configurado</button>  
81 - </div>  
82 - </div>  
83 - <div class="Clear"></div>  
84 -  
85 - <label for="UserId" class="Mandatory"><span class="Marker">*</span> [% Translate("Concluded") | html %]:</label>  
86 - <input type="checkbox" name="concluded" id="concluded" checked />  
87 - <div class="Clear"></div>  
88 -  
89 -  
90 - <input id='Cadastro' type='submit' value='Registrar chamado' style="margin-left: 40%; font-weight: bolder; font-size: x-larger"/>  
91 - </fieldset>  
92 - </div>  
93 - </form>  
94 - </div>  
95 - </div>  
96 - </div>  
97 -</div>  
98 -  
99 -<script type="text/javascript" >  
100 -  
101 -function modeloServicoConfigurado() {  
102 - $("#RichTextDescription").val("O serviço foi ativado e/ou configurado no equipamento do usuário. Foram efetuados testes com sucesso.");  
103 - return false;  
104 -}  
105 -  
106 -  
107 -  
108 -function dealEmail(email) {  
109 -  
110 - var arr = email.split("@");  
111 - if (arr[0]) {  
112 -  
113 - var url = "/otrs/index.pl?Action=InPersonTicket;Subaction=GetUserName;UserID=" + arr[0];  
114 -  
115 - $.get(url, function(data) {  
116 - $("#UserName").val(data);  
117 - if (data) {  
118 - $("#SelectService").focus();  
119 - }  
120 -  
121 -  
122 - }).fail(function(jqXHR, textStatus, errorThrown) {  
123 - alert(textStatus);  
124 - });  
125 - }  
126 -  
127 -  
128 -}  
129 -  
130 -</script>  
131 -  
132 -  
133 -[% WRAPPER JSOnDocumentComplete %]  
134 -$("#SelectService").val([% Data.ServiceID %]);  
135 -  
136 -$("#userID").blur(function() {  
137 - dealEmail($("#userID").val());  
138 -});  
139 -  
140 -[% END %]  
141 -  
Kernel/Output/HTML/Templates/Standard/InPersonTicketCreated.tt
@@ -1,31 +0,0 @@ @@ -1,31 +0,0 @@
1 -# --  
2 -# Kernel/Output/HTML/Standard/EditOcurrence.tt - overview  
3 -# Copyright (C) (2014) (Carlos Rebelatto) (carlos.rebelatto@grad.ufsc.br)  
4 -# --  
5 -# $Id: writing-otrs-application.xml,v 1.1 2010/08/13 08:59:28 mg Exp $  
6 -# --  
7 -# This software comes with ABSOLUTELY NO WARRANTY. For details, see  
8 -# the enclosed file COPYING for license information (AGPL). If you  
9 -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.  
10 -# --  
11 -<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst">  
12 -  
13 - <h1>[% Translate("In person ticket") | html %]</h1>  
14 -  
15 -  
16 - <div class="ContentColumn">  
17 - <div class="WidgetSimple">  
18 - <div class="Header">  
19 - <h2>[% Translate("New ticket") | html %]</h2>  
20 - </div>  
21 -  
22 - [% RenderBlockStart("NewTicketCreated") %]  
23 - <div class="Header">  
24 - <h2 style="text-align: center; font-weight: bolder; font-size: x-larger; color: red">[% Translate("The ticket has been created with number:") | html %][% Data.TicketNumber %]  
25 - </div>  
26 - [% RenderBlockEnd("NewTicketCreated") %]  
27 -  
28 - </div>  
29 - </div>  
30 -</div>  
31 -  
LICENSE 0 → 100644
@@ -0,0 +1,661 @@ @@ -0,0 +1,661 @@
  1 + GNU AFFERO GENERAL PUBLIC LICENSE
  2 + Version 3, 19 November 2007
  3 +
  4 + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
  5 + Everyone is permitted to copy and distribute verbatim copies
  6 + of this license document, but changing it is not allowed.
  7 +
  8 + Preamble
  9 +
  10 + The GNU Affero General Public License is a free, copyleft license for
  11 +software and other kinds of works, specifically designed to ensure
  12 +cooperation with the community in the case of network server software.
  13 +
  14 + The licenses for most software and other practical works are designed
  15 +to take away your freedom to share and change the works. By contrast,
  16 +our General Public Licenses are intended to guarantee your freedom to
  17 +share and change all versions of a program--to make sure it remains free
  18 +software for all its users.
  19 +
  20 + When we speak of free software, we are referring to freedom, not
  21 +price. Our General Public Licenses are designed to make sure that you
  22 +have the freedom to distribute copies of free software (and charge for
  23 +them if you wish), that you receive source code or can get it if you
  24 +want it, that you can change the software or use pieces of it in new
  25 +free programs, and that you know you can do these things.
  26 +
  27 + Developers that use our General Public Licenses protect your rights
  28 +with two steps: (1) assert copyright on the software, and (2) offer
  29 +you this License which gives you legal permission to copy, distribute
  30 +and/or modify the software.
  31 +
  32 + A secondary benefit of defending all users' freedom is that
  33 +improvements made in alternate versions of the program, if they
  34 +receive widespread use, become available for other developers to
  35 +incorporate. Many developers of free software are heartened and
  36 +encouraged by the resulting cooperation. However, in the case of
  37 +software used on network servers, this result may fail to come about.
  38 +The GNU General Public License permits making a modified version and
  39 +letting the public access it on a server without ever releasing its
  40 +source code to the public.
  41 +
  42 + The GNU Affero General Public License is designed specifically to
  43 +ensure that, in such cases, the modified source code becomes available
  44 +to the community. It requires the operator of a network server to
  45 +provide the source code of the modified version running there to the
  46 +users of that server. Therefore, public use of a modified version, on
  47 +a publicly accessible server, gives the public access to the source
  48 +code of the modified version.
  49 +
  50 + An older license, called the Affero General Public License and
  51 +published by Affero, was designed to accomplish similar goals. This is
  52 +a different license, not a version of the Affero GPL, but Affero has
  53 +released a new version of the Affero GPL which permits relicensing under
  54 +this license.
  55 +
  56 + The precise terms and conditions for copying, distribution and
  57 +modification follow.
  58 +
  59 + TERMS AND CONDITIONS
  60 +
  61 + 0. Definitions.
  62 +
  63 + "This License" refers to version 3 of the GNU Affero General Public License.
  64 +
  65 + "Copyright" also means copyright-like laws that apply to other kinds of
  66 +works, such as semiconductor masks.
  67 +
  68 + "The Program" refers to any copyrightable work licensed under this
  69 +License. Each licensee is addressed as "you". "Licensees" and
  70 +"recipients" may be individuals or organizations.
  71 +
  72 + To "modify" a work means to copy from or adapt all or part of the work
  73 +in a fashion requiring copyright permission, other than the making of an
  74 +exact copy. The resulting work is called a "modified version" of the
  75 +earlier work or a work "based on" the earlier work.
  76 +
  77 + A "covered work" means either the unmodified Program or a work based
  78 +on the Program.
  79 +
  80 + To "propagate" a work means to do anything with it that, without
  81 +permission, would make you directly or secondarily liable for
  82 +infringement under applicable copyright law, except executing it on a
  83 +computer or modifying a private copy. Propagation includes copying,
  84 +distribution (with or without modification), making available to the
  85 +public, and in some countries other activities as well.
  86 +
  87 + To "convey" a work means any kind of propagation that enables other
  88 +parties to make or receive copies. Mere interaction with a user through
  89 +a computer network, with no transfer of a copy, is not conveying.
  90 +
  91 + An interactive user interface displays "Appropriate Legal Notices"
  92 +to the extent that it includes a convenient and prominently visible
  93 +feature that (1) displays an appropriate copyright notice, and (2)
  94 +tells the user that there is no warranty for the work (except to the
  95 +extent that warranties are provided), that licensees may convey the
  96 +work under this License, and how to view a copy of this License. If
  97 +the interface presents a list of user commands or options, such as a
  98 +menu, a prominent item in the list meets this criterion.
  99 +
  100 + 1. Source Code.
  101 +
  102 + The "source code" for a work means the preferred form of the work
  103 +for making modifications to it. "Object code" means any non-source
  104 +form of a work.
  105 +
  106 + A "Standard Interface" means an interface that either is an official
  107 +standard defined by a recognized standards body, or, in the case of
  108 +interfaces specified for a particular programming language, one that
  109 +is widely used among developers working in that language.
  110 +
  111 + The "System Libraries" of an executable work include anything, other
  112 +than the work as a whole, that (a) is included in the normal form of
  113 +packaging a Major Component, but which is not part of that Major
  114 +Component, and (b) serves only to enable use of the work with that
  115 +Major Component, or to implement a Standard Interface for which an
  116 +implementation is available to the public in source code form. A
  117 +"Major Component", in this context, means a major essential component
  118 +(kernel, window system, and so on) of the specific operating system
  119 +(if any) on which the executable work runs, or a compiler used to
  120 +produce the work, or an object code interpreter used to run it.
  121 +
  122 + The "Corresponding Source" for a work in object code form means all
  123 +the source code needed to generate, install, and (for an executable
  124 +work) run the object code and to modify the work, including scripts to
  125 +control those activities. However, it does not include the work's
  126 +System Libraries, or general-purpose tools or generally available free
  127 +programs which are used unmodified in performing those activities but
  128 +which are not part of the work. For example, Corresponding Source
  129 +includes interface definition files associated with source files for
  130 +the work, and the source code for shared libraries and dynamically
  131 +linked subprograms that the work is specifically designed to require,
  132 +such as by intimate data communication or control flow between those
  133 +subprograms and other parts of the work.
  134 +
  135 + The Corresponding Source need not include anything that users
  136 +can regenerate automatically from other parts of the Corresponding
  137 +Source.
  138 +
  139 + The Corresponding Source for a work in source code form is that
  140 +same work.
  141 +
  142 + 2. Basic Permissions.
  143 +
  144 + All rights granted under this License are granted for the term of
  145 +copyright on the Program, and are irrevocable provided the stated
  146 +conditions are met. This License explicitly affirms your unlimited
  147 +permission to run the unmodified Program. The output from running a
  148 +covered work is covered by this License only if the output, given its
  149 +content, constitutes a covered work. This License acknowledges your
  150 +rights of fair use or other equivalent, as provided by copyright law.
  151 +
  152 + You may make, run and propagate covered works that you do not
  153 +convey, without conditions so long as your license otherwise remains
  154 +in force. You may convey covered works to others for the sole purpose
  155 +of having them make modifications exclusively for you, or provide you
  156 +with facilities for running those works, provided that you comply with
  157 +the terms of this License in conveying all material for which you do
  158 +not control copyright. Those thus making or running the covered works
  159 +for you must do so exclusively on your behalf, under your direction
  160 +and control, on terms that prohibit them from making any copies of
  161 +your copyrighted material outside their relationship with you.
  162 +
  163 + Conveying under any other circumstances is permitted solely under
  164 +the conditions stated below. Sublicensing is not allowed; section 10
  165 +makes it unnecessary.
  166 +
  167 + 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
  168 +
  169 + No covered work shall be deemed part of an effective technological
  170 +measure under any applicable law fulfilling obligations under article
  171 +11 of the WIPO copyright treaty adopted on 20 December 1996, or
  172 +similar laws prohibiting or restricting circumvention of such
  173 +measures.
  174 +
  175 + When you convey a covered work, you waive any legal power to forbid
  176 +circumvention of technological measures to the extent such circumvention
  177 +is effected by exercising rights under this License with respect to
  178 +the covered work, and you disclaim any intention to limit operation or
  179 +modification of the work as a means of enforcing, against the work's
  180 +users, your or third parties' legal rights to forbid circumvention of
  181 +technological measures.
  182 +
  183 + 4. Conveying Verbatim Copies.
  184 +
  185 + You may convey verbatim copies of the Program's source code as you
  186 +receive it, in any medium, provided that you conspicuously and
  187 +appropriately publish on each copy an appropriate copyright notice;
  188 +keep intact all notices stating that this License and any
  189 +non-permissive terms added in accord with section 7 apply to the code;
  190 +keep intact all notices of the absence of any warranty; and give all
  191 +recipients a copy of this License along with the Program.
  192 +
  193 + You may charge any price or no price for each copy that you convey,
  194 +and you may offer support or warranty protection for a fee.
  195 +
  196 + 5. Conveying Modified Source Versions.
  197 +
  198 + You may convey a work based on the Program, or the modifications to
  199 +produce it from the Program, in the form of source code under the
  200 +terms of section 4, provided that you also meet all of these conditions:
  201 +
  202 + a) The work must carry prominent notices stating that you modified
  203 + it, and giving a relevant date.
  204 +
  205 + b) The work must carry prominent notices stating that it is
  206 + released under this License and any conditions added under section
  207 + 7. This requirement modifies the requirement in section 4 to
  208 + "keep intact all notices".
  209 +
  210 + c) You must license the entire work, as a whole, under this
  211 + License to anyone who comes into possession of a copy. This
  212 + License will therefore apply, along with any applicable section 7
  213 + additional terms, to the whole of the work, and all its parts,
  214 + regardless of how they are packaged. This License gives no
  215 + permission to license the work in any other way, but it does not
  216 + invalidate such permission if you have separately received it.
  217 +
  218 + d) If the work has interactive user interfaces, each must display
  219 + Appropriate Legal Notices; however, if the Program has interactive
  220 + interfaces that do not display Appropriate Legal Notices, your
  221 + work need not make them do so.
  222 +
  223 + A compilation of a covered work with other separate and independent
  224 +works, which are not by their nature extensions of the covered work,
  225 +and which are not combined with it such as to form a larger program,
  226 +in or on a volume of a storage or distribution medium, is called an
  227 +"aggregate" if the compilation and its resulting copyright are not
  228 +used to limit the access or legal rights of the compilation's users
  229 +beyond what the individual works permit. Inclusion of a covered work
  230 +in an aggregate does not cause this License to apply to the other
  231 +parts of the aggregate.
  232 +
  233 + 6. Conveying Non-Source Forms.
  234 +
  235 + You may convey a covered work in object code form under the terms
  236 +of sections 4 and 5, provided that you also convey the
  237 +machine-readable Corresponding Source under the terms of this License,
  238 +in one of these ways:
  239 +
  240 + a) Convey the object code in, or embodied in, a physical product
  241 + (including a physical distribution medium), accompanied by the
  242 + Corresponding Source fixed on a durable physical medium
  243 + customarily used for software interchange.
  244 +
  245 + b) Convey the object code in, or embodied in, a physical product
  246 + (including a physical distribution medium), accompanied by a
  247 + written offer, valid for at least three years and valid for as
  248 + long as you offer spare parts or customer support for that product
  249 + model, to give anyone who possesses the object code either (1) a
  250 + copy of the Corresponding Source for all the software in the
  251 + product that is covered by this License, on a durable physical
  252 + medium customarily used for software interchange, for a price no
  253 + more than your reasonable cost of physically performing this
  254 + conveying of source, or (2) access to copy the
  255 + Corresponding Source from a network server at no charge.
  256 +
  257 + c) Convey individual copies of the object code with a copy of the
  258 + written offer to provide the Corresponding Source. This
  259 + alternative is allowed only occasionally and noncommercially, and
  260 + only if you received the object code with such an offer, in accord
  261 + with subsection 6b.
  262 +
  263 + d) Convey the object code by offering access from a designated
  264 + place (gratis or for a charge), and offer equivalent access to the
  265 + Corresponding Source in the same way through the same place at no
  266 + further charge. You need not require recipients to copy the
  267 + Corresponding Source along with the object code. If the place to
  268 + copy the object code is a network server, the Corresponding Source
  269 + may be on a different server (operated by you or a third party)
  270 + that supports equivalent copying facilities, provided you maintain
  271 + clear directions next to the object code saying where to find the
  272 + Corresponding Source. Regardless of what server hosts the
  273 + Corresponding Source, you remain obligated to ensure that it is
  274 + available for as long as needed to satisfy these requirements.
  275 +
  276 + e) Convey the object code using peer-to-peer transmission, provided
  277 + you inform other peers where the object code and Corresponding
  278 + Source of the work are being offered to the general public at no
  279 + charge under subsection 6d.
  280 +
  281 + A separable portion of the object code, whose source code is excluded
  282 +from the Corresponding Source as a System Library, need not be
  283 +included in conveying the object code work.
  284 +
  285 + A "User Product" is either (1) a "consumer product", which means any
  286 +tangible personal property which is normally used for personal, family,
  287 +or household purposes, or (2) anything designed or sold for incorporation
  288 +into a dwelling. In determining whether a product is a consumer product,
  289 +doubtful cases shall be resolved in favor of coverage. For a particular
  290 +product received by a particular user, "normally used" refers to a
  291 +typical or common use of that class of product, regardless of the status
  292 +of the particular user or of the way in which the particular user
  293 +actually uses, or expects or is expected to use, the product. A product
  294 +is a consumer product regardless of whether the product has substantial
  295 +commercial, industrial or non-consumer uses, unless such uses represent
  296 +the only significant mode of use of the product.
  297 +
  298 + "Installation Information" for a User Product means any methods,
  299 +procedures, authorization keys, or other information required to install
  300 +and execute modified versions of a covered work in that User Product from
  301 +a modified version of its Corresponding Source. The information must
  302 +suffice to ensure that the continued functioning of the modified object
  303 +code is in no case prevented or interfered with solely because
  304 +modification has been made.
  305 +
  306 + If you convey an object code work under this section in, or with, or
  307 +specifically for use in, a User Product, and the conveying occurs as
  308 +part of a transaction in which the right of possession and use of the
  309 +User Product is transferred to the recipient in perpetuity or for a
  310 +fixed term (regardless of how the transaction is characterized), the
  311 +Corresponding Source conveyed under this section must be accompanied
  312 +by the Installation Information. But this requirement does not apply
  313 +if neither you nor any third party retains the ability to install
  314 +modified object code on the User Product (for example, the work has
  315 +been installed in ROM).
  316 +
  317 + The requirement to provide Installation Information does not include a
  318 +requirement to continue to provide support service, warranty, or updates
  319 +for a work that has been modified or installed by the recipient, or for
  320 +the User Product in which it has been modified or installed. Access to a
  321 +network may be denied when the modification itself materially and
  322 +adversely affects the operation of the network or violates the rules and
  323 +protocols for communication across the network.
  324 +
  325 + Corresponding Source conveyed, and Installation Information provided,
  326 +in accord with this section must be in a format that is publicly
  327 +documented (and with an implementation available to the public in
  328 +source code form), and must require no special password or key for
  329 +unpacking, reading or copying.
  330 +
  331 + 7. Additional Terms.
  332 +
  333 + "Additional permissions" are terms that supplement the terms of this
  334 +License by making exceptions from one or more of its conditions.
  335 +Additional permissions that are applicable to the entire Program shall
  336 +be treated as though they were included in this License, to the extent
  337 +that they are valid under applicable law. If additional permissions
  338 +apply only to part of the Program, that part may be used separately
  339 +under those permissions, but the entire Program remains governed by
  340 +this License without regard to the additional permissions.
  341 +
  342 + When you convey a copy of a covered work, you may at your option
  343 +remove any additional permissions from that copy, or from any part of
  344 +it. (Additional permissions may be written to require their own
  345 +removal in certain cases when you modify the work.) You may place
  346 +additional permissions on material, added by you to a covered work,
  347 +for which you have or can give appropriate copyright permission.
  348 +
  349 + Notwithstanding any other provision of this License, for material you
  350 +add to a covered work, you may (if authorized by the copyright holders of
  351 +that material) supplement the terms of this License with terms:
  352 +
  353 + a) Disclaiming warranty or limiting liability differently from the
  354 + terms of sections 15 and 16 of this License; or
  355 +
  356 + b) Requiring preservation of specified reasonable legal notices or
  357 + author attributions in that material or in the Appropriate Legal
  358 + Notices displayed by works containing it; or
  359 +
  360 + c) Prohibiting misrepresentation of the origin of that material, or
  361 + requiring that modified versions of such material be marked in
  362 + reasonable ways as different from the original version; or
  363 +
  364 + d) Limiting the use for publicity purposes of names of licensors or
  365 + authors of the material; or
  366 +
  367 + e) Declining to grant rights under trademark law for use of some
  368 + trade names, trademarks, or service marks; or
  369 +
  370 + f) Requiring indemnification of licensors and authors of that
  371 + material by anyone who conveys the material (or modified versions of
  372 + it) with contractual assumptions of liability to the recipient, for
  373 + any liability that these contractual assumptions directly impose on
  374 + those licensors and authors.
  375 +
  376 + All other non-permissive additional terms are considered "further
  377 +restrictions" within the meaning of section 10. If the Program as you
  378 +received it, or any part of it, contains a notice stating that it is
  379 +governed by this License along with a term that is a further
  380 +restriction, you may remove that term. If a license document contains
  381 +a further restriction but permits relicensing or conveying under this
  382 +License, you may add to a covered work material governed by the terms
  383 +of that license document, provided that the further restriction does
  384 +not survive such relicensing or conveying.
  385 +
  386 + If you add terms to a covered work in accord with this section, you
  387 +must place, in the relevant source files, a statement of the
  388 +additional terms that apply to those files, or a notice indicating
  389 +where to find the applicable terms.
  390 +
  391 + Additional terms, permissive or non-permissive, may be stated in the
  392 +form of a separately written license, or stated as exceptions;
  393 +the above requirements apply either way.
  394 +
  395 + 8. Termination.
  396 +
  397 + You may not propagate or modify a covered work except as expressly
  398 +provided under this License. Any attempt otherwise to propagate or
  399 +modify it is void, and will automatically terminate your rights under
  400 +this License (including any patent licenses granted under the third
  401 +paragraph of section 11).
  402 +
  403 + However, if you cease all violation of this License, then your
  404 +license from a particular copyright holder is reinstated (a)
  405 +provisionally, unless and until the copyright holder explicitly and
  406 +finally terminates your license, and (b) permanently, if the copyright
  407 +holder fails to notify you of the violation by some reasonable means
  408 +prior to 60 days after the cessation.
  409 +
  410 + Moreover, your license from a particular copyright holder is
  411 +reinstated permanently if the copyright holder notifies you of the
  412 +violation by some reasonable means, this is the first time you have
  413 +received notice of violation of this License (for any work) from that
  414 +copyright holder, and you cure the violation prior to 30 days after
  415 +your receipt of the notice.
  416 +
  417 + Termination of your rights under this section does not terminate the
  418 +licenses of parties who have received copies or rights from you under
  419 +this License. If your rights have been terminated and not permanently
  420 +reinstated, you do not qualify to receive new licenses for the same
  421 +material under section 10.
  422 +
  423 + 9. Acceptance Not Required for Having Copies.
  424 +
  425 + You are not required to accept this License in order to receive or
  426 +run a copy of the Program. Ancillary propagation of a covered work
  427 +occurring solely as a consequence of using peer-to-peer transmission
  428 +to receive a copy likewise does not require acceptance. However,
  429 +nothing other than this License grants you permission to propagate or
  430 +modify any covered work. These actions infringe copyright if you do
  431 +not accept this License. Therefore, by modifying or propagating a
  432 +covered work, you indicate your acceptance of this License to do so.
  433 +
  434 + 10. Automatic Licensing of Downstream Recipients.
  435 +
  436 + Each time you convey a covered work, the recipient automatically
  437 +receives a license from the original licensors, to run, modify and
  438 +propagate that work, subject to this License. You are not responsible
  439 +for enforcing compliance by third parties with this License.
  440 +
  441 + An "entity transaction" is a transaction transferring control of an
  442 +organization, or substantially all assets of one, or subdividing an
  443 +organization, or merging organizations. If propagation of a covered
  444 +work results from an entity transaction, each party to that
  445 +transaction who receives a copy of the work also receives whatever
  446 +licenses to the work the party's predecessor in interest had or could
  447 +give under the previous paragraph, plus a right to possession of the
  448 +Corresponding Source of the work from the predecessor in interest, if
  449 +the predecessor has it or can get it with reasonable efforts.
  450 +
  451 + You may not impose any further restrictions on the exercise of the
  452 +rights granted or affirmed under this License. For example, you may
  453 +not impose a license fee, royalty, or other charge for exercise of
  454 +rights granted under this License, and you may not initiate litigation
  455 +(including a cross-claim or counterclaim in a lawsuit) alleging that
  456 +any patent claim is infringed by making, using, selling, offering for
  457 +sale, or importing the Program or any portion of it.
  458 +
  459 + 11. Patents.
  460 +
  461 + A "contributor" is a copyright holder who authorizes use under this
  462 +License of the Program or a work on which the Program is based. The
  463 +work thus licensed is called the contributor's "contributor version".
  464 +
  465 + A contributor's "essential patent claims" are all patent claims
  466 +owned or controlled by the contributor, whether already acquired or
  467 +hereafter acquired, that would be infringed by some manner, permitted
  468 +by this License, of making, using, or selling its contributor version,
  469 +but do not include claims that would be infringed only as a
  470 +consequence of further modification of the contributor version. For
  471 +purposes of this definition, "control" includes the right to grant
  472 +patent sublicenses in a manner consistent with the requirements of
  473 +this License.
  474 +
  475 + Each contributor grants you a non-exclusive, worldwide, royalty-free
  476 +patent license under the contributor's essential patent claims, to
  477 +make, use, sell, offer for sale, import and otherwise run, modify and
  478 +propagate the contents of its contributor version.
  479 +
  480 + In the following three paragraphs, a "patent license" is any express
  481 +agreement or commitment, however denominated, not to enforce a patent
  482 +(such as an express permission to practice a patent or covenant not to
  483 +sue for patent infringement). To "grant" such a patent license to a
  484 +party means to make such an agreement or commitment not to enforce a
  485 +patent against the party.
  486 +
  487 + If you convey a covered work, knowingly relying on a patent license,
  488 +and the Corresponding Source of the work is not available for anyone
  489 +to copy, free of charge and under the terms of this License, through a
  490 +publicly available network server or other readily accessible means,
  491 +then you must either (1) cause the Corresponding Source to be so
  492 +available, or (2) arrange to deprive yourself of the benefit of the
  493 +patent license for this particular work, or (3) arrange, in a manner
  494 +consistent with the requirements of this License, to extend the patent
  495 +license to downstream recipients. "Knowingly relying" means you have
  496 +actual knowledge that, but for the patent license, your conveying the
  497 +covered work in a country, or your recipient's use of the covered work
  498 +in a country, would infringe one or more identifiable patents in that
  499 +country that you have reason to believe are valid.
  500 +
  501 + If, pursuant to or in connection with a single transaction or
  502 +arrangement, you convey, or propagate by procuring conveyance of, a
  503 +covered work, and grant a patent license to some of the parties
  504 +receiving the covered work authorizing them to use, propagate, modify
  505 +or convey a specific copy of the covered work, then the patent license
  506 +you grant is automatically extended to all recipients of the covered
  507 +work and works based on it.
  508 +
  509 + A patent license is "discriminatory" if it does not include within
  510 +the scope of its coverage, prohibits the exercise of, or is
  511 +conditioned on the non-exercise of one or more of the rights that are
  512 +specifically granted under this License. You may not convey a covered
  513 +work if you are a party to an arrangement with a third party that is
  514 +in the business of distributing software, under which you make payment
  515 +to the third party based on the extent of your activity of conveying
  516 +the work, and under which the third party grants, to any of the
  517 +parties who would receive the covered work from you, a discriminatory
  518 +patent license (a) in connection with copies of the covered work
  519 +conveyed by you (or copies made from those copies), or (b) primarily
  520 +for and in connection with specific products or compilations that
  521 +contain the covered work, unless you entered into that arrangement,
  522 +or that patent license was granted, prior to 28 March 2007.
  523 +
  524 + Nothing in this License shall be construed as excluding or limiting
  525 +any implied license or other defenses to infringement that may
  526 +otherwise be available to you under applicable patent law.
  527 +
  528 + 12. No Surrender of Others' Freedom.
  529 +
  530 + If conditions are imposed on you (whether by court order, agreement or
  531 +otherwise) that contradict the conditions of this License, they do not
  532 +excuse you from the conditions of this License. If you cannot convey a
  533 +covered work so as to satisfy simultaneously your obligations under this
  534 +License and any other pertinent obligations, then as a consequence you may
  535 +not convey it at all. For example, if you agree to terms that obligate you
  536 +to collect a royalty for further conveying from those to whom you convey
  537 +the Program, the only way you could satisfy both those terms and this
  538 +License would be to refrain entirely from conveying the Program.
  539 +
  540 + 13. Remote Network Interaction; Use with the GNU General Public License.
  541 +
  542 + Notwithstanding any other provision of this License, if you modify the
  543 +Program, your modified version must prominently offer all users
  544 +interacting with it remotely through a computer network (if your version
  545 +supports such interaction) an opportunity to receive the Corresponding
  546 +Source of your version by providing access to the Corresponding Source
  547 +from a network server at no charge, through some standard or customary
  548 +means of facilitating copying of software. This Corresponding Source
  549 +shall include the Corresponding Source for any work covered by version 3
  550 +of the GNU General Public License that is incorporated pursuant to the
  551 +following paragraph.
  552 +
  553 + Notwithstanding any other provision of this License, you have
  554 +permission to link or combine any covered work with a work licensed
  555 +under version 3 of the GNU General Public License into a single
  556 +combined work, and to convey the resulting work. The terms of this
  557 +License will continue to apply to the part which is the covered work,
  558 +but the work with which it is combined will remain governed by version
  559 +3 of the GNU General Public License.
  560 +
  561 + 14. Revised Versions of this License.
  562 +
  563 + The Free Software Foundation may publish revised and/or new versions of
  564 +the GNU Affero General Public License from time to time. Such new versions
  565 +will be similar in spirit to the present version, but may differ in detail to
  566 +address new problems or concerns.
  567 +
  568 + Each version is given a distinguishing version number. If the
  569 +Program specifies that a certain numbered version of the GNU Affero General
  570 +Public License "or any later version" applies to it, you have the
  571 +option of following the terms and conditions either of that numbered
  572 +version or of any later version published by the Free Software
  573 +Foundation. If the Program does not specify a version number of the
  574 +GNU Affero General Public License, you may choose any version ever published
  575 +by the Free Software Foundation.
  576 +
  577 + If the Program specifies that a proxy can decide which future
  578 +versions of the GNU Affero General Public License can be used, that proxy's
  579 +public statement of acceptance of a version permanently authorizes you
  580 +to choose that version for the Program.
  581 +
  582 + Later license versions may give you additional or different
  583 +permissions. However, no additional obligations are imposed on any
  584 +author or copyright holder as a result of your choosing to follow a
  585 +later version.
  586 +
  587 + 15. Disclaimer of Warranty.
  588 +
  589 + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
  590 +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
  591 +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
  592 +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
  593 +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  594 +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
  595 +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
  596 +ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  597 +
  598 + 16. Limitation of Liability.
  599 +
  600 + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  601 +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
  602 +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
  603 +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
  604 +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
  605 +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
  606 +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
  607 +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
  608 +SUCH DAMAGES.
  609 +
  610 + 17. Interpretation of Sections 15 and 16.
  611 +
  612 + If the disclaimer of warranty and limitation of liability provided
  613 +above cannot be given local legal effect according to their terms,
  614 +reviewing courts shall apply local law that most closely approximates
  615 +an absolute waiver of all civil liability in connection with the
  616 +Program, unless a warranty or assumption of liability accompanies a
  617 +copy of the Program in return for a fee.
  618 +
  619 + END OF TERMS AND CONDITIONS
  620 +
  621 + How to Apply These Terms to Your New Programs
  622 +
  623 + If you develop a new program, and you want it to be of the greatest
  624 +possible use to the public, the best way to achieve this is to make it
  625 +free software which everyone can redistribute and change under these terms.
  626 +
  627 + To do so, attach the following notices to the program. It is safest
  628 +to attach them to the start of each source file to most effectively
  629 +state the exclusion of warranty; and each file should have at least
  630 +the "copyright" line and a pointer to where the full notice is found.
  631 +
  632 + <one line to give the program's name and a brief idea of what it does.>
  633 + Copyright (C) <year> <name of author>
  634 +
  635 + This program is free software: you can redistribute it and/or modify
  636 + it under the terms of the GNU Affero General Public License as published
  637 + by the Free Software Foundation, either version 3 of the License, or
  638 + (at your option) any later version.
  639 +
  640 + This program is distributed in the hope that it will be useful,
  641 + but WITHOUT ANY WARRANTY; without even the implied warranty of
  642 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  643 + GNU Affero General Public License for more details.
  644 +
  645 + You should have received a copy of the GNU Affero General Public License
  646 + along with this program. If not, see <http://www.gnu.org/licenses/>.
  647 +
  648 +Also add information on how to contact you by electronic and paper mail.
  649 +
  650 + If your software can interact with users remotely through a computer
  651 +network, you should also make sure that it provides a way for users to
  652 +get its source. For example, if your program is a web application, its
  653 +interface could display a "Source" link that leads users to an archive
  654 +of the code. There are many ways you could offer source, and different
  655 +solutions will be better for different programs; see section 13 for the
  656 +specific requirements.
  657 +
  658 + You should also get your employer (if you work as a programmer) or school,
  659 +if any, to sign a "copyright disclaimer" for the program, if necessary.
  660 +For more information on this, and how to apply and follow the GNU AGPL, see
  661 +<http://www.gnu.org/licenses/>.
README.md 0 → 100644
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
  1 +In Person Ticket
  2 +==================
  3 +
  4 +Simple interface to quickly register an in person customer service.
  5 +
  6 +
  7 +Required PERL Packages:
  8 +-----------------------
  9 +
  10 +
  11 +
  12 +Requires OTRS Packages:
  13 +-----------------------
  14 +
  15 +
  16 +
  17 +Config required:
  18 +----------------
  19 +
  20 +All settings with the keyword "InPersonTicket" in its name should be revised prior to utilization.
  21 +
  22 +
  23 +Package building:
  24 +-----------------
  25 +
  26 +To build the package, do the following:
  27 +
  28 + ./CreateOpm.sh
  29 +
  30 +The generated package will be on the `dist` directory
  31 +
  32 +
  33 +Issues:
  34 +-------
  35 +
  36 +This module was developed in-house and thus is provided without warranty or support. If you have a problem, please open an issue at https://softwarepublico.gov.br/gitlab/setic-ufsc/otrs-in-person-ticket/
0 \ No newline at end of file 37 \ No newline at end of file
src/InPersonTicket.sopm 0 → 100755
@@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
  1 +<?xml version="1.0" encoding="utf-8" ?>
  2 +<otrs_package version="1.0">
  3 + <Name>InPersonTicket</Name>
  4 + <Version>1.4.0</Version>
  5 + <ChangeLog Version="1.0.1" Date="22/05/2015">First version</ChangeLog>
  6 + <ChangeLog Version="1.1.0" Date="2016-01-26">Fixes for OTRS 5.0.x</ChangeLog>
  7 + <ChangeLog Version="1.2.0" Date="2016-06-10">Support for dynamic fields</ChangeLog>
  8 + <ChangeLog Version="1.3.0" Date="2016-06-10">Support for custom queues</ChangeLog>
  9 + <ChangeLog Version="1.4.0" Date="2018-02-02">Support for OTRS 6.0.x</ChangeLog>
  10 + <Framework>6.0.x</Framework>
  11 + <Vendor>SeTIC-UFSC</Vendor>
  12 + <URL>setic.ufsc.br</URL>
  13 + <License>AGPL</License>
  14 + <Description>In person ticket</Description>
  15 + <IntroInstall Type="post" Title="Thank you">Module installed successfully.</IntroInstall>
  16 + <BuildDate>?</BuildDate>
  17 + <BuildHost>?</BuildHost>
  18 + <Filelist>
  19 + <File Permission="644" Location="Kernel/Config/Files/XML/InPersonTicket.xml"></File>
  20 + <File Permission="644" Location="Kernel/Modules/InPersonTicket.pm"></File>
  21 + <File Permission="644" Location="Kernel/Language/pt_BR_InPersonTicket.pm"></File>
  22 +
  23 + <File Permission="644" Location="Kernel/Output/HTML/Templates/Standard/InPersonTicket.tt"></File>
  24 +
  25 + <File Permission="644" Location="var/httpd/htdocs/js/InPersonTicket.js"></File>
  26 + </Filelist>
  27 +</otrs_package>
src/Kernel/Config/Files/XML/InPersonTicket.xml 0 → 100644
@@ -0,0 +1,214 @@ @@ -0,0 +1,214 @@
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<otrs_config init="Application" version="2.0">
  3 + <Setting Name="Frontend::Module###InPersonTicket" Required="0"
  4 + Valid="1">
  5 + <Description>Frontend module registration for the agent interface.
  6 + </Description>
  7 + <Navigation>Frontend::Agent::ModuleRegistration</Navigation>
  8 + <Value>
  9 + <Item ValueType="FrontendRegistration">
  10 + <Hash>
  11 + <Item Key="Group">
  12 + <Array>
  13 + </Array>
  14 + </Item>
  15 + <Item Key="GroupRo">
  16 + <Array>
  17 + </Array>
  18 + </Item>
  19 +
  20 + <Item Key="Description">Module for creating new ticket for in-person
  21 + reception</Item>
  22 + <Item Key="Title">In person ticket</Item>
  23 + <Item Key="Description" Lang="pt_BR">Módulo para criar tickets para
  24 + atendimentos presenciais</Item>
  25 + <Item Key="Title" Lang="pt_BR">Atendimento presencial</Item>
  26 +
  27 + <Item Key="NavBarName">Ticket</Item>
  28 +
  29 + </Hash>
  30 + </Item>
  31 + </Value>
  32 + </Setting>
  33 + <Setting Name="Frontend::Navigation###InPersonTicket###002-InPersonTicket"
  34 + Required="0" Valid="1">
  35 + <Description Translatable="1">Main menu item registration.
  36 + </Description>
  37 + <Navigation>Frontend::Agent::ModuleRegistration::MainMenu</Navigation>
  38 + <Value>
  39 + <Array>
  40 + <DefaultItem ValueType="FrontendNavigation">
  41 + <Hash>
  42 + </Hash>
  43 + </DefaultItem>
  44 + <Item>
  45 + <Hash>
  46 + <Item Key="Group">
  47 + <Array>
  48 + </Array>
  49 + </Item>
  50 + <Item Key="GroupRo">
  51 + <Array>
  52 + </Array>
  53 + </Item>
  54 + <Item Key="Description">In person ticket</Item>
  55 + <Item Key="Name">In person ticket</Item>
  56 + <Item Key="Description" Lang="pt_BR">Atendimento presencial</Item>
  57 + <Item Key="Name" Lang="pt_BR">Atendimento presencial</Item>
  58 + <Item Key="Link">Action=InPersonTicket</Item>
  59 + <Item Key="LinkOption"></Item>
  60 + <Item Key="NavBar">Ticket</Item>
  61 + <Item Key="Type"></Item>
  62 + <Item Key="Block"></Item>
  63 + <Item Key="AccessKey"></Item>
  64 + <Item Key="Prio">8400</Item>
  65 + </Hash>
  66 + </Item>
  67 + </Array>
  68 + </Value>
  69 + </Setting>
  70 +
  71 +
  72 + <Setting Name="Loader::Module::InPersonTicket###002-InPersonTicket"
  73 + Required="0" Valid="1">
  74 + <Description Translatable="1">Front-end module loader for the
  75 + agent interface</Description>
  76 + <Navigation>Frontend::Agent::ModuleRegistration::Loader</Navigation>
  77 + <Value>
  78 + <Hash>
  79 + <Item Key="JavaScript">
  80 + <Array>
  81 + <Item>InPersonTicket.js</Item>
  82 + </Array>
  83 + </Item>
  84 + </Hash>
  85 + </Value>
  86 + </Setting>
  87 +
  88 +
  89 + <Setting Name="Ticket::Frontend::InPersonTicket###DynamicFields"
  90 + Required="1" Valid="1">
  91 + <Description>Dynamic Fields IDs to Include (comma separated) - place *
  92 + before fields that should use the last value for new tickets
  93 + </Description>
  94 + <Description Lang="pt_BR">Campos dinâmicos que devem ser incluídos
  95 + (IDs separados por vírgula) - coloque * (asterisco) antes dos campos
  96 + que devem manter o valor do último envio</Description>
  97 + <Navigation>Frontend::Agent::InPersonTicket</Navigation>
  98 + <Value>
  99 + <Item ValueType="String" ValueRegex=""></Item>
  100 + </Value>
  101 + </Setting>
  102 +
  103 +
  104 + <Setting Name="Ticket::Frontend::InPersonTicket###TypeID"
  105 + Required="1" Valid="1">
  106 + <Description>Default type ID for tickets</Description>
  107 + <Description Lang="pt_BR">ID do tipo padrão para os tickets
  108 + </Description>
  109 + <Navigation>Frontend::Agent::InPersonTicket</Navigation>
  110 + <Value>
  111 + <Item ValueType="String" ValueRegex="^\d+$">6</Item>
  112 + </Value>
  113 + </Setting>
  114 +
  115 + <Setting Name="Ticket::Frontend::InPersonTicket###DefaultCustomerID"
  116 + Required="1" Valid="1">
  117 + <Description>Default customer ID for tickets</Description>
  118 + <Description Lang="pt_BR">ID padrão do cliente para os tickets
  119 + </Description>
  120 + <Navigation>Frontend::Agent::InPersonTicket</Navigation>
  121 + <Value>
  122 + <Item ValueType="String" ValueRegex="">paginas@sistemas.ufsc.br
  123 + </Item>
  124 + </Value>
  125 + </Setting>
  126 +
  127 + <Setting Name="Ticket::Frontend::InPersonTicket###DefaultOwnerID"
  128 + Required="1" Valid="1">
  129 + <Description>Default Owner ID for tickets</Description>
  130 + <Description Lang="pt_BR">Proprietário padrão para os tickets
  131 + </Description>
  132 + <Navigation>Frontend::Agent::InPersonTicket</Navigation>
  133 + <Value>
  134 + <Item ValueType="String" ValueRegex="^\d+$">1</Item>
  135 + </Value>
  136 + </Setting>
  137 +
  138 + <Setting Name="Ticket::Frontend::InPersonTicket###DefaultUserDomain"
  139 + Required="1" Valid="1">
  140 + <Description>Default domain for user e-mails.</Description>
  141 + <Description Lang="pt_BR">Domínios padrões para e-mails de
  142 + usuários.</Description>
  143 + <Navigation>Frontend::Agent::InPersonTicket</Navigation>
  144 + <Value>
  145 + <Item ValueType="String" ValueRegex="">ufsc.br,grad.ufsc.br,posgrad.ufsc.br
  146 + </Item>
  147 + </Value>
  148 + </Setting>
  149 +
  150 + <Setting Name="Ticket::Frontend::InPersonTicket###ReplyModelID"
  151 + Required="1" Valid="1">
  152 + <Description>Model to use for reply to users.</Description>
  153 + <Description Lang="pt_BR">Modelo usado para responder aos usuários
  154 + na abertura do ticket.</Description>
  155 + <Navigation>Frontend::Agent::InPersonTicket</Navigation>
  156 + <Value>
  157 + <Item ValueType="String" ValueRegex="^\d+$">22</Item>
  158 + </Value>
  159 + </Setting>
  160 +
  161 + <Setting Name="Ticket::Frontend::InPersonTicket###ReplyModelIDClosed"
  162 + Required="1" Valid="1">
  163 + <Description>Model to use for reply to users when ticket is closed.
  164 + </Description>
  165 + <Description Lang="pt_BR">Modelo usado para responder aos usuários
  166 + quando o ticket é fechado.</Description>
  167 + <Navigation>Frontend::Agent::InPersonTicket</Navigation>
  168 + <Value>
  169 + <Item ValueType="String" ValueRegex="^\d+$">5</Item>
  170 + </Value>
  171 + </Setting>
  172 +
  173 + <Setting Name="Ticket::Frontend::InPersonTicket###QueuePrefix"
  174 + Required="0" Valid="1">
  175 + <Description>When the queue comes from a field in the form, a prefix
  176 + can be attached to the value while searching for the queue. A space
  177 + is added between this and the queue name.</Description>
  178 + <Description Lang="pt_BR">Se definido, permite localizar de forma
  179 + automática a fila para qual enviar o chamado, adicionado um prefixo
  180 + ao valor de outro campo dinâmico. Se não encontrar, usa a fila padrão
  181 + para novos tickets.</Description>
  182 + <Navigation>Frontend::Agent::InPersonTicket</Navigation>
  183 + <Value>
  184 + <Item ValueType="String" ValueRegex="">Primeiro nível -</Item>
  185 + </Value>
  186 + </Setting>
  187 +
  188 + <Setting Name="Ticket::Frontend::InPersonTicket###ServiceConfiguredMessage"
  189 + Required="0" Valid="1" Translatable="1">
  190 + <Description>Template describing that the service was configured,
  191 + i.e., the ticket can be closed. Sent to the customer.</Description>
  192 + <Description Lang="pt_BR">Mensagem descrevendo o serviço
  193 + configurado, i.e., o ticket pode ser fechado. Enviado ao usuário.
  194 + </Description>
  195 + <Navigation>Frontend::Agent::InPersonTicket</Navigation>
  196 + <Value>
  197 + <Item ValueType="String" ValueRegex="">The service was activated
  198 + and/or configure. Tests were made successfully.</Item>
  199 + </Value>
  200 + </Setting>
  201 +
  202 + <Setting Name="Ticket::Frontend::InPersonTicket###QueueField"
  203 + Required="0" Valid="1">
  204 + <Description>Name of the field in the form which indicates the queue
  205 + to send the ticket.</Description>
  206 + <Description Lang="pt_BR">Nome do campo no formulário que pode ser
  207 + usado para montar o nome da fila para enviar o chamado.</Description>
  208 + <Navigation>Frontend::Agent::InPersonTicket</Navigation>
  209 + <Value>
  210 + <Item ValueType="String" ValueRegex="">DF_unidade</Item>
  211 + </Value>
  212 + </Setting>
  213 +
  214 +</otrs_config>
src/Kernel/Language/pt_BR_InPersonTicket.pm 0 → 100755
@@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
  1 +# --
  2 +# Kernel/Modules/pt_BR_StatisticsGraphs.pm - translations for StatisticsGraphs Module
  3 +# Translations
  4 +#
  5 +# Copyright (C) 2015-2018 - SeTIC - UFSC - http://setic.ufsc.br/
  6 +# (Rodrigo Goncalves) (rodrigo.g@ufsc.br)
  7 +#
  8 +# Version 2018-01-31 - Adjustments for OTRS 6
  9 +#
  10 +# --
  11 +# This software comes with ABSOLUTELY NO WARRANTY. For details, see
  12 +# the enclosed file COPYING for license information (AGPL). If you
  13 +# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
  14 +# --
  15 +package Kernel::Language::pt_BR_InPersonTicket;
  16 +
  17 +use strict;
  18 +use warnings;
  19 +use utf8;
  20 +
  21 +sub Data {
  22 + my $Self = shift;
  23 +
  24 + $Self->{Translation}->{'Concluded'} = 'Concluído';
  25 + $Self->{Translation}->{'In person ticket'} = 'Atendimento presencial';
  26 + $Self->{Translation}->{'The ticket has been created with number:'} = 'Chamado criado com número: ';
  27 + $Self->{Translation}->{'Dynamic Fields IDs to Include (comma separated)'} = 'IDs dos campos dinâmicos, separados por vírgula - coloque * antes de campos que não devem usar o último valor para novos tickets';
  28 + $Self->{Translation}->{'Customer service'} = 'Registro de atendimento';
  29 +
  30 +
  31 + return 1;
  32 +}
  33 +1;
0 \ No newline at end of file 34 \ No newline at end of file
src/Kernel/Modules/InPersonTicket.pm 0 → 100755
@@ -0,0 +1,506 @@ @@ -0,0 +1,506 @@
  1 +# --
  2 +# Kernel/Modules/OcurrenceControl.pm - frontend module
  3 +#
  4 +# Copyright (C) 2015-2018 - SeTIC - UFSC - http://setic.ufsc.br/
  5 +# (Rodrigo Goncalves) (rodrigo.g@ufsc.br)
  6 +#
  7 +# Version 2018-01-31 - Adjustments for OTRS 6
  8 +#
  9 +# --
  10 +# This software comes with ABSOLUTELY NO WARRANTY. For details, see
  11 +# the enclosed file COPYING for license information (AGPL). If you
  12 +# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
  13 +# --
  14 +#
  15 +package Kernel::Modules::InPersonTicket;
  16 +
  17 +use strict;
  18 +use warnings;
  19 +use Data::Dumper;
  20 +
  21 +our @ObjectDependencies = (
  22 + "Kernel::Output::HTML::Layout", "Kernel::System::Log",
  23 + "Kernel::System::Web::Request", "Kernel::System::DB",
  24 + "Kernel::Config", "Kernel::System::CustomerUser",
  25 + "Kernel::System::Service", "Kernel::System::DynamicField::Backend",
  26 + "Kernel::System::DynamicField", "Kernel::System::User"
  27 +);
  28 +
  29 +sub new {
  30 + my ( $Type, %Param ) = @_;
  31 +
  32 + # allocate new hash for object
  33 + my $Self = {%Param};
  34 + bless( $Self, $Type );
  35 +
  36 + return $Self;
  37 +}
  38 +
  39 +sub Run {
  40 + my ( $Self, %Param ) = @_;
  41 + my %Data = ();
  42 +
  43 + my $ConfigObject = $Kernel::OM->Get("Kernel::Config");
  44 + my $languageObject = $Kernel::OM->Get("Kernel::Language");
  45 + my $layoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout");
  46 + my $paramObject = $Kernel::OM->Get("Kernel::System::Web::Request");
  47 + my $dbObject = $Kernel::OM->Get("Kernel::System::DB");
  48 + my $serviceObject = $Kernel::OM->Get("Kernel::System::Service");
  49 +
  50 + $Self->BuildServiceBlock();
  51 + $Self->BuildDynamicFieldsFields();
  52 +
  53 + my $config = $ConfigObject->Get("Ticket::Frontend::InPersonTicket");
  54 + $layoutObject->AddJSData(
  55 + Key => "InPersonTicket.ServiceRealized",
  56 + Value => $config->{ServiceConfiguredMessage}
  57 + );
  58 +
  59 + if ( $paramObject->GetParam( Param => "Subaction" )
  60 + && ( $paramObject->GetParam( Param => "Subaction" ) eq "GetUserName" ) )
  61 + {
  62 + my $content = $Self->GetUserName(
  63 + UserID => $paramObject->GetParam( Param => "UserID" ) );
  64 +
  65 + return $layoutObject->Attachment(
  66 + ContentType => 'application/text; charset='
  67 + . $layoutObject->{Charset},
  68 + Content => $content,
  69 + Type => 'inline',
  70 + NoCache => 1,
  71 + );
  72 + }
  73 + elsif ( $paramObject->GetParam( Param => "Subaction" )
  74 + && ( $paramObject->GetParam( Param => "Subaction" ) eq "Add" ) )
  75 + {
  76 + return $Self->CreateTicket();
  77 + }
  78 +
  79 + my $Output = $layoutObject->Header(
  80 + Title => $languageObject->Translate("In person ticket") );
  81 + $Output .= $layoutObject->NavigationBar();
  82 + $Output .= $layoutObject->Output( TemplateFile => 'InPersonTicket' );
  83 +
  84 + # set up rich text editor
  85 + my %ParamCK = ();
  86 + $layoutObject->SetRichTextParameters(
  87 + Data => \%ParamCK,
  88 + );
  89 +
  90 + $Output .= $layoutObject->Footer();
  91 + return $Output;
  92 +
  93 + return $Output;
  94 +
  95 +}
  96 +
  97 +sub GetUserName {
  98 + my ( $Self, %Param ) = @_;
  99 +
  100 + my $userObject = $Kernel::OM->Get("Kernel::System::CustomerUser");
  101 + my %dados = $userObject->CustomerUserDataGet( User => $Param{"UserID"} );
  102 +
  103 + if (%dados) {
  104 + return $dados{UserFirstname};
  105 + }
  106 + else {
  107 + return "";
  108 + }
  109 +
  110 +}
  111 +
  112 +sub BuildDynamicFieldsFields {
  113 + my ( $Self, %Param ) = @_;
  114 +
  115 + my $DynamicFieldBackendObject =
  116 + $Kernel::OM->Get('Kernel::System::DynamicField::Backend');
  117 + my $DynamicFieldObject = $Kernel::OM->Get("Kernel::System::DynamicField");
  118 + my $ConfigObject = $Kernel::OM->Get("Kernel::Config");
  119 + my $config = $ConfigObject->Get("Ticket::Frontend::InPersonTicket");
  120 + my $layoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout");
  121 + my $paramObject = $Kernel::OM->Get("Kernel::System::Web::Request");
  122 + my $userObject = $Kernel::OM->Get("Kernel::System::User");
  123 + my @dfieldList =
  124 + @{ $DynamicFieldObject->DynamicFieldListGet( Valid => 1 ) };
  125 + my @dynamicFieldsInuse =
  126 + split( ",", $config->{DynamicFields} || "unidade" );
  127 + my %prefs = $userObject->GetPreferences( UserID => $Self->{UserID} );
  128 +
  129 + foreach (@dfieldList) {
  130 + my $field = $_;
  131 + if ( $field->{Name} ~~ @dynamicFieldsInuse
  132 + || '*' . $field->{Name} ~~ @dynamicFieldsInuse )
  133 + {
  134 +
  135 + my $defValue = "";
  136 +
  137 + if ( $field->{Name} ~~ @dynamicFieldsInuse ) {
  138 + $defValue = $prefs{ "IPT_DF_" . $field->{Name} };
  139 + }
  140 +
  141 + my $DynamicFieldHTML = $DynamicFieldBackendObject->EditFieldRender(
  142 + DynamicFieldConfig => $field,
  143 + LayoutObject => $layoutObject,
  144 + ParamObject => $paramObject,
  145 + Value => $defValue,
  146 + Mandatory => 1,
  147 + OverridePossibleNone => 1,
  148 + UseDefaultValue => 0,
  149 + Value => ""
  150 + );
  151 +
  152 + $layoutObject->Block(
  153 + Name => 'DynamicField',
  154 + Data => {
  155 + Name => $field->{Name},
  156 + Label => $DynamicFieldHTML->{Label},
  157 + Field => $DynamicFieldHTML->{Field},
  158 + },
  159 + );
  160 + }
  161 + }
  162 +
  163 +}
  164 +
  165 +sub BuildServiceBlock {
  166 + my ( $Self, %Param ) = @_;
  167 +
  168 + my $layoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout");
  169 + my $paramObject = $Kernel::OM->Get("Kernel::System::Web::Request");
  170 + my $dbObject = $Kernel::OM->Get("Kernel::System::DB");
  171 + my $serviceObject = $Kernel::OM->Get("Kernel::System::Service");
  172 +
  173 + my $services = $serviceObject->ServiceListGet( Valid => 1, UserID => 1 );
  174 + my @services = @$services;
  175 + @services = sort { $a->{Name} cmp $b->{Name} } @services;
  176 +
  177 + foreach my $service (@services) {
  178 + $layoutObject->Block(
  179 + Name => 'selectService',
  180 + Data => {
  181 + ServiceID => $service->{ServiceID},
  182 + ServiceName => $Self->GetServiceName(
  183 + Services => \@services,
  184 + ServiceID => $service->{ServiceID},
  185 + ServiceName => $service->{Name}
  186 + ),
  187 + Disabled => $Self->LeafService(
  188 + Services => \@services,
  189 + ServiceID => $service->{ServiceID}
  190 + ) ? "" : "disabled"
  191 + }
  192 + );
  193 + }
  194 +}
  195 +
  196 +sub GetServiceName {
  197 + my ( $Self, %Param ) = @_;
  198 +
  199 + if ( $Self->LeafService(%Param) ) {
  200 + my @tokens = split( "::", $Param{ServiceName} );
  201 + return "&nbsp;&nbsp;" x ( @tokens - 1 ) . @tokens[ @tokens - 1 ];
  202 + }
  203 + else {
  204 + return $Param{ServiceName};
  205 + }
  206 +}
  207 +
  208 +sub LeafService {
  209 + my ( $Self, %Param ) = @_;
  210 +
  211 + my $services = $Param{Services};
  212 + my @services = @$services;
  213 + my $serviceID = $Param{ServiceID};
  214 +
  215 + foreach my $service (@services) {
  216 + if ( ( exists $service->{ParentID} )
  217 + && ( $service->{ParentID} == $serviceID ) )
  218 + {
  219 + return 0;
  220 + }
  221 + }
  222 +
  223 + return 1;
  224 +}
  225 +
  226 +sub GetQueueID() {
  227 + my ( $Self, %Param ) = @_;
  228 +
  229 + my $ParamObject = $Kernel::OM->Get("Kernel::System::Web::Request");
  230 + my $QueueObject = $Kernel::OM->Get("Kernel::System::Queue");
  231 + my $DynamicFieldObject = $Kernel::OM->Get("Kernel::System::DynamicField");
  232 + my $ConfigObject = $Kernel::OM->Get("Kernel::Config");
  233 + my $LayoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout");
  234 + my $DynamicFieldBackendObject =
  235 + $Kernel::OM->Get('Kernel::System::DynamicField::Backend');
  236 +
  237 + # Gets default Queue
  238 + my $ConfigTicket =
  239 + $ConfigObject->Get("Ticket::Frontend::CustomerTicketMessage");
  240 +
  241 + my $QueueDefault = $ConfigTicket->{"QueueDefault"};
  242 +
  243 + my %QueueListID = $QueueObject->QueueList( Valid => 1 );
  244 + my %QueueList = reverse $QueueObject->QueueList( Valid => 1 );
  245 + my $QueueID = $QueueList{$QueueDefault};
  246 + my $Queue = $QueueListID{$QueueID};
  247 +
  248 + $Self->{ConfigModule} =
  249 + $ConfigObject->Get("Ticket::Frontend::InPersonTicket");
  250 +
  251 + # Checks if there is a field for the queue
  252 + my $QueuePrefix = $Self->{ConfigModule}->{"QueuePrefix"};
  253 + my $QueueField = $Self->{ConfigModule}->{"QueueField"};
  254 +
  255 + if ( $QueuePrefix && $QueueField ) {
  256 + my $dynFieldQueue =
  257 + $DynamicFieldObject->DynamicFieldGet( Name => $QueueField );
  258 + my $QueueSelected = $DynamicFieldBackendObject->EditFieldValueGet(
  259 + DynamicFieldConfig => $dynFieldQueue,
  260 + ParamObject => $ParamObject,
  261 + LayoutObject => $LayoutObject,
  262 + );
  263 +
  264 + my $QueueName = "$QueuePrefix $QueueSelected";
  265 +
  266 + if ( $QueueList{$QueueName} ) {
  267 + $QueueID = $QueueList{$QueueName};
  268 + $Queue = $QueueName;
  269 + }
  270 + }
  271 +
  272 + return ( $Queue, $QueueID );
  273 +}
  274 +
  275 +sub CreateTicket {
  276 + my ( $Self, %Param ) = @_;
  277 + my %Data = ();
  278 +
  279 + my $languageObject = $Kernel::OM->Get("Kernel::Language");
  280 + my $TicketObject = $Kernel::OM->Get("Kernel::System::Ticket");
  281 + my $ConfigObject = $Kernel::OM->Get("Kernel::Config");
  282 + my $ParamObject = $Kernel::OM->Get("Kernel::System::Web::Request");
  283 + my $BackendObject =
  284 + $Kernel::OM->Get("Kernel::System::DynamicField::Backend");
  285 + my $DynamicFieldObject = $Kernel::OM->Get("Kernel::System::DynamicField");
  286 + my $CustomerUserObject = $Kernel::OM->Get("Kernel::System::CustomerUser");
  287 + my $LayoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout");
  288 + my $userObject = $Kernel::OM->Get("Kernel::System::User");
  289 + my $DynamicFieldBackendObject =
  290 + $Kernel::OM->Get('Kernel::System::DynamicField::Backend');
  291 +
  292 + # Queue
  293 + my ( $Queue, $QueueID ) = $Self->GetQueueID(%Param);
  294 + $Data{QueueID} = $QueueID;
  295 + my $email = $ParamObject->GetParam( Param => "userID" );
  296 +
  297 + $Self->{Config} =
  298 + $ConfigObject->Get("Ticket::Frontend::CustomerTicketMessage");
  299 +
  300 + $Self->{ConfigModule} =
  301 + $ConfigObject->Get("Ticket::Frontend::InPersonTicket");
  302 +
  303 + my $TicketID = $TicketObject->TicketCreate(
  304 + Title => $languageObject->Translate("In person ticket"),
  305 + QueueID => $QueueID,
  306 + Priority => $Self->{Config}->{PriorityDefault},
  307 + Lock => 'unlock',
  308 + State => (
  309 + $ParamObject->GetParam( Param => "concluded" )
  310 + ? 'closed successful'
  311 + : 'new'
  312 + ),
  313 + ServiceID => $ParamObject->GetParam( Param => "ServiceID" ),
  314 + TypeID => $Self->{ConfigModule}->{TypeID},
  315 + CustomerID => $Self->GetUserIDFromEmail(
  316 + EMail => $email,
  317 + DefaultUserDomain => $Self->{ConfigModule}->{DefaultUserDomain},
  318 + DefaultCustomerID => $Self->{ConfigModule}->{DefaultCustomerID}
  319 + ),
  320 + CustomerUser => $Self->GetUserIDFromEmail(
  321 + EMail => $email,
  322 + DefaultUserDomain => $Self->{ConfigModule}->{DefaultUserDomain},
  323 + DefaultCustomerID => $Self->{ConfigModule}->{DefaultCustomerID}
  324 + ),
  325 + OwnerID => $Self->{ConfigModule}->{DefaultOwnerID},
  326 + UserID => $Self->{ConfigModule}->{DefaultOwnerID},
  327 + );
  328 +
  329 + my @dfieldList =
  330 + @{ $DynamicFieldObject->DynamicFieldListGet( Valid => 1 ) };
  331 + my @dynamicFieldsInuse =
  332 + split( ",", $Self->{ConfigModule}->{DynamicFields} );
  333 +
  334 + foreach (@dfieldList) {
  335 + my $field = $_;
  336 +
  337 + if ( $field->{Name} ~~ @dynamicFieldsInuse
  338 + || '*' . $field->{Name} ~~ @dynamicFieldsInuse )
  339 + {
  340 + my $value = $DynamicFieldBackendObject->EditFieldValueGet(
  341 + DynamicFieldConfig => $field,
  342 + ParamObject => $ParamObject,
  343 + LayoutObject => $LayoutObject,
  344 + );
  345 +
  346 + if ( $field->{Name} ~~ @dynamicFieldsInuse ) {
  347 + $userObject->SetPreferences(
  348 + UserID => $Self->{UserID},
  349 + Key => "IPT_DF_" . $field->{Name},
  350 + Value => $value,
  351 + );
  352 + }
  353 +
  354 + if ($value) {
  355 + $DynamicFieldBackendObject->ValueSet(
  356 + DynamicFieldConfig => $field,
  357 + ObjectID => $TicketID,
  358 + Value => $value,
  359 + UserID => $Self->{UserID},
  360 + );
  361 + }
  362 + }
  363 + }
  364 +
  365 + my $MimeType = 'text/plain';
  366 +
  367 + # Create article
  368 + my $FullName = $ParamObject->GetParam( Param => "UserName" );
  369 +
  370 + my $From = "\"$FullName\" <$email>";
  371 +
  372 + my $ArticleBackendObject = $Kernel::OM->Get('Kernel::System::Ticket::Article')->BackendForChannel(ChannelName => 'Email');
  373 +
  374 + my $ArticleID = $ArticleBackendObject->ArticleCreate(
  375 + TicketID => $TicketID,
  376 + ArticleType => 'phone',
  377 + SenderType => 'customer',
  378 + From => $email,
  379 + To => $Queue,
  380 + Subject => $languageObject->Translate("Customer service"),
  381 + Body => $ParamObject->GetParam( Param => "Description" ),
  382 + MimeType => $MimeType,
  383 + Charset => $LayoutObject->{UserCharset},
  384 + UserID => $Self->{ConfigModule}->{DefaultOwnerID},
  385 + HistoryType => $Self->{Config}->{HistoryType},
  386 + HistoryComment => $Self->{Config}->{HistoryComment} || '%%',
  387 + AutoResponseType => '',
  388 + OrigHeader => {
  389 + From => $From,
  390 + To => $Queue,
  391 + Subject => $languageObject->Translate("Customer service"),
  392 + Body => $ParamObject->GetParam( Param => "Description" ),
  393 + },
  394 + Queue => $Queue,
  395 + IsVisibleForCustomer => 1
  396 + );
  397 +
  398 + my $ReplyUser =
  399 + $Kernel::OM->Get('Kernel::System::TemplateGenerator')->Template(
  400 + TemplateID => (
  401 + $ParamObject->GetParam( Param => "concluded" )
  402 + ? $Self->{ConfigModule}->{ReplyModelIDClosed}
  403 + : $Self->{ConfigModule}->{ReplyModelID}
  404 + ),
  405 + TicketID => $TicketID,
  406 + UserID => $Self->{ConfigModule}->{DefaultOwnerID},
  407 + );
  408 +
  409 + my $corpo = $ParamObject->GetParam( Param => "Description" );
  410 + $ReplyUser =~ s/CONTEUDO/$corpo/g;
  411 +
  412 + my %sysAddr = $Kernel::OM->Get('Kernel::System::SystemAddress')
  413 + ->SystemAddressGet( ID => 1 );
  414 +
  415 + my $FromSystem = $sysAddr{Name};
  416 +
  417 + $MimeType = 'text/html';
  418 +
  419 + $ArticleID = $ArticleBackendObject->ArticleSend(
  420 + TicketID => $TicketID,
  421 + ArticleType =>
  422 + 'note-internal', # email-external|email-internal|phone|fax|...
  423 + SenderType => 'agent', # agent|system|customer
  424 + From => $FromSystem,
  425 + To => $email, # not required but useful
  426 + Subject => $languageObject->Translate("Customer service"), # required
  427 + Body => $ReplyUser, # required
  428 + Charset => $LayoutObject->{UserCharset},
  429 + MimeType => $MimeType,
  430 + Loop => 0, # 1|0 used for bulk emails
  431 + HistoryType =>
  432 + 'AddNote', # Move|AddNote|PriorityUpdate|WebRequestCustomer|...
  433 + HistoryComment => 'Auto-reply',
  434 + NoAgentNotify => 0, # if you don't want to send agent notifications
  435 + UserID => $Self->{ConfigModule}->{DefaultOwnerID},
  436 + IsVisibleForCustomer => 1
  437 + );
  438 +
  439 + $Data{TicketNumber} =
  440 + $TicketObject->TicketNumberLookup( TicketID => $TicketID );
  441 +
  442 + # build output
  443 + my $Output = $LayoutObject->Header(
  444 + Title => $languageObject->Translate("In person ticket") );
  445 + my %BlockData = ();
  446 + $BlockData{TicketNumber} =
  447 + '<a href="/otrs/index.pl?Action=AgentTicketZoom;TicketID='
  448 + . $TicketID . '">'
  449 + . $Data{TicketNumber} . '</a>';
  450 + $LayoutObject->Block(
  451 + Name => 'NewTicketCreated',
  452 + Data => \%BlockData
  453 + );
  454 +
  455 + # set up rich text editor
  456 + my %ParamCK = ();
  457 + $LayoutObject->SetRichTextParameters(
  458 + Data => \%ParamCK,
  459 + );
  460 +
  461 +
  462 + $Output .= $LayoutObject->NavigationBar();
  463 + $Output .= $LayoutObject->Output(
  464 + Data => \%Data,
  465 + TemplateFile => 'InPersonTicket',
  466 + );
  467 + $Output .= $LayoutObject->Footer();
  468 + return $Output;
  469 +}
  470 +
  471 +sub GetUserIDFromEmail {
  472 + my ( $Self, %Param ) = @_;
  473 +
  474 + my $email = $Param{EMail};
  475 + my $result = $Param{DefaultCustomerID};
  476 + my $domainList = $Param{DefaultUserDomain};
  477 +
  478 + if ( index( $email, '@' ) == -1 ) {
  479 + return $email;
  480 + }
  481 +
  482 + my $CustomerUserObject = $Kernel::OM->Get("Kernel::System::CustomerUser");
  483 +
  484 + if ($domainList) {
  485 + my @domains = split( ",", $domainList );
  486 +
  487 + for my $domain (@domains) {
  488 + my @parts = split( "@", $email );
  489 + if ( $parts[1] eq $domain ) {
  490 + my $id = $parts[0];
  491 + my %List = $CustomerUserObject->CustomerSearch(
  492 + UserLogin => $id,
  493 + Valid => 1,
  494 + );
  495 + if ( keys %List ) {
  496 + $result = $id;
  497 + return $result;
  498 + }
  499 + }
  500 + }
  501 + }
  502 +
  503 + return $result;
  504 +}
  505 +
  506 +1;
src/Kernel/Output/HTML/Templates/Standard/InPersonTicket.tt 0 → 100755
@@ -0,0 +1,105 @@ @@ -0,0 +1,105 @@
  1 +# --
  2 +# Kernel/Output/HTML/Standard/EditOcurrence.tt - overview
  3 +#
  4 +# Copyright (C) 2015-2018 - SeTIC - UFSC - http://setic.ufsc.br/
  5 +# (Rodrigo Goncalves) (rodrigo.g@ufsc.br)
  6 +#
  7 +# Version 2018-01-31 - Adjustments for OTRS 6
  8 +# --
  9 +# $Id: writing-otrs-application.xml,v 1.1 2010/08/13 08:59:28 mg Exp $
  10 +# --
  11 +# This software comes with ABSOLUTELY NO WARRANTY. For details, see
  12 +# the enclosed file COPYING for license information (AGPL). If you
  13 +# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
  14 +# --
  15 +<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst">
  16 +
  17 + <h1>[% Translate("In person ticket") | html %]</h1>
  18 +
  19 + [% BreadcrumbPath = [
  20 + {
  21 + Name => Translate('In person ticket'),
  22 + Link => Env("Action"),
  23 + },
  24 + ]
  25 + %]
  26 +
  27 + [% INCLUDE "Breadcrumb.tt" Path = BreadcrumbPath %]
  28 +
  29 +
  30 + <div class="ContentColumn">
  31 + <div class="WidgetSimple">
  32 + <div class="Header">
  33 + <h2>[% Translate("New ticket") | html %]</h2>
  34 + </div>
  35 +
  36 + [% RenderBlockStart("NewTicketCreated") %]
  37 + <div class="Header">
  38 + <h2 style="text-align: right; font-weight: bolder; font-size: larger; color: red">[% Translate("The ticket has been created with number:") | html %][% Data.TicketNumber %]
  39 + </div>
  40 + [% RenderBlockEnd("NewTicketCreated") %]
  41 +
  42 +
  43 + <div class="Content SpacingBottom ">
  44 +
  45 + <form action="[% Env("CGIHandle") %]" method="post" enctype="multipart/form-data" name="compose" id="InPersonTicket" class="Validate PreventMultipleSubmits">
  46 +
  47 + <input type="hidden" name="Action" value="[% Env("Action") %]"/>
  48 + <input type="hidden" name="Subaction" value="Add"/>
  49 +
  50 + <fieldset class="TableLike">
  51 + <label for="userID" class="Mandatory"><span class="Marker">*</span> [% Translate("E-mail") | html %]:</label>
  52 + <input class="Validate_Required" type="text" name="userID" id="userID" style="margin-left: 10px; width: 400px" />
  53 + <div class="Clear"></div>
  54 +
  55 + <label for="UserName" class="Mandatory"><span class="Marker">*</span> [% Translate("Nome") | html %]:</label>
  56 + <input class="Validate_Required" type="text" name="UserName" id="UserName" style="margin-left: 10px; width: 400px" />
  57 + <div class="Clear"></div>
  58 +
  59 + <label for="SelectService" class="Mandatory"><span class="Marker">*</span> [% Translate("Serviço") | html %]:</label>
  60 + <select class="Validate_Required" style="margin-left: 10px" name="ServiceID" id="SelectService">
  61 + <option selected disabled value="0">[% Translate("Select a service") | html %]</option>
  62 + [% RenderBlockStart("selectService") %]
  63 + <option [% Data.Disabled %] value="[% Data.ServiceID | html %]">[% Data.ServiceName %]</option>
  64 + [% RenderBlockEnd("selectService") %]
  65 + </select>
  66 + <div class="Clear"></div>
  67 +
  68 +
  69 + [% RenderBlockStart("DynamicField") %]
  70 + [% Data.Label %]
  71 + <div class="Field">
  72 + [% Data.Field %]
  73 + </div>
  74 + <div class="Clear"></div>
  75 +
  76 +
  77 +
  78 + [% RenderBlockEnd("DynamicField") %]
  79 +
  80 +
  81 + <label class="OtherMandatory" for="RichTextDescription"><span class="Marker">*</span> [% Translate("Description") | html %]:</label>
  82 + <div id="RichTextField" class="RichTextField" >
  83 + <textarea style="width: 800px; height: 200px" id="RichTextDescription" class="RichText Validate_Required [% Data.BodyInvalid | html %]" name="Description" title="Description" cols="[% Config("Ticket::Frontend::TextAreaNote") %]">[% Data.Description %]</textarea>
  84 + <div id="RichTextError" class="TooltipErrorMessage"><p>[% Translate("This field is required.") | html %]</p></div>
  85 + <div id="RichTextServerError" class="TooltipErrorMessage"><p>[% Translate("This field is required.") | html %]</p></div>
  86 + <div style="display: block; padding: 5px; border-style: solid; border-color: black; border-width: 1px">
  87 + Atalhos:
  88 + <button type="button" onclick="javascript:Core.Agent.InPersonTicket.modeloServicoConfigurado()">Serviço configurado</button>
  89 + </div>
  90 + </div>
  91 + <div class="Clear"></div>
  92 +
  93 + <label for="UserId" class="Mandatory"><span class="Marker">*</span> [% Translate("Concluded") | html %]:</label>
  94 + <input type="checkbox" name="concluded" id="concluded" checked />
  95 + <div class="Clear"></div>
  96 +
  97 +
  98 + <input id='Cadastro' type='submit' value='Registrar chamado' style="margin-left: 40%; font-weight: bolder; font-size: x-larger"/>
  99 + </fieldset>
  100 + </div>
  101 + </form>
  102 + </div>
  103 + </div>
  104 + </div>
  105 +</div>
0 \ No newline at end of file 106 \ No newline at end of file
src/var/httpd/htdocs/js/InPersonTicket.js 0 → 100755
@@ -0,0 +1,55 @@ @@ -0,0 +1,55 @@
  1 +/**
  2 + * InPersonTicket module - SeTIC - UFSC - http://setic.ufsc.br/
  3 + * Rodrigo Gonçalves - rodrigo.g@ufsc.br
  4 + *
  5 + * Version 2018-01-31 - Conversion to JS Module, to support OTRS 6
  6 + *
  7 + *
  8 + */
  9 +
  10 +var Core = Core || {};
  11 +Core.Agent = Core.Agent || {};
  12 +
  13 +
  14 +Core.Agent.InPersonTicket = (function (TargetNS) {
  15 +
  16 + TargetNS.Init = function() {
  17 + $("#userID").blur(function() {
  18 + TargetNS.dealEmail($("#userID").val());
  19 + });
  20 + }
  21 +
  22 + TargetNS.modeloServicoConfigurado = function () {
  23 +
  24 + CKEDITOR.instances['RichTextDescription'].setData(Core.Config.Get('InPersonTicket.ServiceRealized'));
  25 + //$("#RichTextDescription").val();
  26 + return false;
  27 + }
  28 +
  29 + TargetNS.dealEmail = function(email) {
  30 + var arr = email.split("@");
  31 + if (arr[0]) {
  32 + var url = "/otrs/index.pl?Action=InPersonTicket;Subaction=GetUserName;UserID=" + arr[0];
  33 + $.get(url, function(data) {
  34 + $("#UserName").val(data);
  35 + if (data) {
  36 + $("#SelectService").focus();
  37 + }
  38 + }).fail(function(jqXHR, textStatus, errorThrown) {
  39 + alert(textStatus);
  40 + });
  41 +
  42 + }
  43 + }
  44 +
  45 + Core.Init.RegisterNamespace(TargetNS, 'APP_MODULE');
  46 +
  47 + return TargetNS;
  48 +
  49 +}(Core.Agent.InPersonTicket || {}));
  50 +
  51 +
  52 +
  53 +
  54 +
  55 +