Commit 0020e11e3128f96926d85d5981cbbb8e76e5167a
1 parent
5a91ab5c
Exists in
master
Suporte para OTRS 6
Showing
17 changed files
with
793 additions
and
683 deletions
Show diff stats
| @@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
| 1 | +dist/* |
CreateOpm.sh
Kernel/Config/Files/QueueService.xml
| @@ -1,27 +0,0 @@ | @@ -1,27 +0,0 @@ | ||
| 1 | -<?xml version="1.0" encoding="UTF-8" ?> | ||
| 2 | -<otrs_config init="Application" version="1.0"> | ||
| 3 | - <ConfigItem Name="Frontend::Module###QueueService" Required="0" Valid="1"> | ||
| 4 | - <Description Lang="en">Frontend module registration for the service per queue</Description> | ||
| 5 | - <Description Lang="pt_BR">Registro do módulo de serviços por fila</Description> | ||
| 6 | - <Group>Ticket</Group> | ||
| 7 | - <SubGroup>Frontend::Admin::ModuleRegistration</SubGroup> | ||
| 8 | - <Setting> | ||
| 9 | - <FrontendModuleReg> | ||
| 10 | - <Group>admin</Group> | ||
| 11 | - <Description>Admin</Description> | ||
| 12 | - <Title Lang="en">Services per queue</Title> | ||
| 13 | - <Title Lang="pt_BR">Serviços por fila</Title> | ||
| 14 | - <NavBarName>Admin</NavBarName> | ||
| 15 | - <NavBarModule> | ||
| 16 | - <Module>Kernel::Output::HTML::NavBar::ModuleAdmin</Module> | ||
| 17 | - <Name Lang="en">Services per queue</Name> | ||
| 18 | - <Name Lang="pt_BR">Serviços por fila</Name> | ||
| 19 | - <Description Lang="en">Create and manages services per queue</Description> | ||
| 20 | - <Description Lang="pt_BR">Cria e gerencia serviços por fila</Description> | ||
| 21 | - <Block>Ticket</Block> | ||
| 22 | - <Prio>900</Prio> | ||
| 23 | - </NavBarModule> | ||
| 24 | - </FrontendModuleReg> | ||
| 25 | - </Setting> | ||
| 26 | - </ConfigItem> | ||
| 27 | -</otrs_config> |
Kernel/Language/pt_BR_QueueService.pm
| @@ -1,26 +0,0 @@ | @@ -1,26 +0,0 @@ | ||
| 1 | -# -- | ||
| 2 | -# Kernel/Modules/pt_BR_QueueService.pm - module to associate services per queue | ||
| 3 | -# | ||
| 4 | -# Copyright (C) 2014 - SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 5 | -# Version 01/06/2015 - Adjusts for OTRS 4 | ||
| 6 | -# | ||
| 7 | -# -- | ||
| 8 | -# This software comes with ABSOLUTELY NO WARRANTY. For details, see | ||
| 9 | -# the enclosed file COPYING for license information (AGPL). If you | ||
| 10 | -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. | ||
| 11 | -# -- | ||
| 12 | -package Kernel::Language::pt_BR_QueueService; | ||
| 13 | - | ||
| 14 | -use strict; | ||
| 15 | -use warnings; | ||
| 16 | -use utf8; | ||
| 17 | - | ||
| 18 | -sub Data { | ||
| 19 | - my $Self = shift; | ||
| 20 | - $Self->{Translation}->{'Services per queue'} = 'Serviços por fila'; | ||
| 21 | - $Self->{Translation}->{'Create and manages services per queue'} = 'Cria e gerencia serviços por fila'; | ||
| 22 | - | ||
| 23 | - return 1; | ||
| 24 | -} | ||
| 25 | - | ||
| 26 | -1; | ||
| 27 | \ No newline at end of file | 0 | \ No newline at end of file |
Kernel/Modules/QueueService.pm
| @@ -1,208 +0,0 @@ | @@ -1,208 +0,0 @@ | ||
| 1 | -# -- | ||
| 2 | -# Kernel/Modules/QueueService.pm - frontend module | ||
| 3 | -# | ||
| 4 | -# Copyright (C) 2014 - SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 5 | -# Version 01/06/2015 - Adjusts for OTRS 4 | ||
| 6 | -# | ||
| 7 | -# Autor: Carlos Rebelato, Rodrigo Gonçalves | ||
| 8 | -# Data.: 19/02/2014 - Versão inicial | ||
| 9 | -# | ||
| 10 | -package Kernel::Modules::QueueService; | ||
| 11 | - | ||
| 12 | -use strict; | ||
| 13 | -use warnings; | ||
| 14 | -use Data::Dumper; | ||
| 15 | -require Kernel::System::QueueService; | ||
| 16 | -require Kernel::System::Service; | ||
| 17 | -require Kernel::System::Queue; | ||
| 18 | - | ||
| 19 | -our @ObjectDependencies = ( | ||
| 20 | - "Kernel::System::Web::Request", # Old ParamObject | ||
| 21 | - "Kernel::System::DB", | ||
| 22 | - "Kernel::System::Ticket", | ||
| 23 | - "Kernel::Output::HTML::Layout", # Old LayoutObject | ||
| 24 | - "Kernel::System::Log", | ||
| 25 | - "Kernel::System::Queue", | ||
| 26 | - "Kernel::Config", | ||
| 27 | - "Kernel::System::Encode", | ||
| 28 | - "Kernel::System::Main", | ||
| 29 | - "Kernel::System::QueueService", # Ask direct to manager | ||
| 30 | - "Kernel::System::Service" # Ask direct to manager | ||
| 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 | - | ||
| 46 | - my $ParamObject = $Kernel::OM->Get("Kernel::System::Web::Request"); | ||
| 47 | - | ||
| 48 | - my $SubAction = $ParamObject->GetParam( Param => "Subaction" ); | ||
| 49 | - | ||
| 50 | - if ( $SubAction eq "ServiceEdit" ) { | ||
| 51 | - return $Self->ShowChangeService( ID => $ParamObject->GetParam( Param => "ID" ) ); | ||
| 52 | - } | ||
| 53 | - elsif ( $SubAction eq "QueueEdit" ) { | ||
| 54 | - return $Self->ShowChangeQueue( ID => $ParamObject->GetParam( Param => "ID" ) ); | ||
| 55 | - } | ||
| 56 | - elsif ( $SubAction eq "ChangeService" ) { | ||
| 57 | - $Self->ChangeService(); | ||
| 58 | - return $Self->ShowOverview(); | ||
| 59 | - } | ||
| 60 | - elsif ( $SubAction eq "ChangeQueue" ) { | ||
| 61 | - $Self->ChangeQueue(); | ||
| 62 | - return $Self->ShowOverview(); | ||
| 63 | - } | ||
| 64 | - else { | ||
| 65 | - return $Self->ShowOverview(); | ||
| 66 | - } | ||
| 67 | -} | ||
| 68 | - | ||
| 69 | -sub ShowOverview() { | ||
| 70 | - my ( $Self, %Param ) = @_; | ||
| 71 | - my %Data = (); | ||
| 72 | - | ||
| 73 | - my %Queues = $Kernel::OM->Get("Kernel::System::Queue")->QueueList( Valid => 1 ); | ||
| 74 | - my %Services = $Kernel::OM->Get("Kernel::System::Service")->ServiceList( UserID => 1 ); | ||
| 75 | - my $LayoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout"); | ||
| 76 | - | ||
| 77 | - foreach my $service ( sort { uc( $Services{$a} ) cmp uc( $Services{$b} ) } keys %Services ) { | ||
| 78 | - $LayoutObject->Block( | ||
| 79 | - Name => 'ListService', | ||
| 80 | - Data => { | ||
| 81 | - ServiceID => $service, | ||
| 82 | - ServiceName => $Services{$service}, | ||
| 83 | - } | ||
| 84 | - ); | ||
| 85 | - } | ||
| 86 | - | ||
| 87 | - foreach my $queue ( sort { uc( $Queues{$a} ) cmp uc( $Queues{$b} ) } keys %Queues ) { | ||
| 88 | - $LayoutObject->Block( | ||
| 89 | - Name => 'ListQueue', | ||
| 90 | - Data => { | ||
| 91 | - QueueID => $queue, | ||
| 92 | - QueueName => $Queues{$queue}, | ||
| 93 | - } | ||
| 94 | - ); | ||
| 95 | - } | ||
| 96 | - | ||
| 97 | - my $Output = $LayoutObject->Header( Title => $LayoutObject->{LanguageObject}->Get("Services per queue") ); | ||
| 98 | - $Output .= $LayoutObject->NavigationBar(); | ||
| 99 | - $Output .= $LayoutObject->Output( | ||
| 100 | - Data => \%Data, | ||
| 101 | - TemplateFile => 'QueueService' | ||
| 102 | - ); | ||
| 103 | - | ||
| 104 | - $Output .= $LayoutObject->Footer(); | ||
| 105 | - return $Output; | ||
| 106 | -} | ||
| 107 | - | ||
| 108 | -sub ShowChangeService() { | ||
| 109 | - my ( $Self, %Param ) = @_; | ||
| 110 | - my %Data = (); | ||
| 111 | - my %Service = $Kernel::OM->Get("Kernel::System::Service")->ServiceGet( ServiceID => $Param{ID}, UserID => 1 ); | ||
| 112 | - my %QueuesService = $Kernel::OM->Get("Kernel::System::QueueService")->GetQueueList( ServiceID => $Param{ID} ); | ||
| 113 | - my %Queues = $Kernel::OM->Get("Kernel::System::Queue")->QueueList( Valid => 1 ); | ||
| 114 | - my $LayoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout"); | ||
| 115 | - | ||
| 116 | - $Data{Type} = "Queue"; | ||
| 117 | - $Data{Filter} = "Service"; | ||
| 118 | - $Data{VisibleNeType} = "Service"; | ||
| 119 | - $Data{Name} = $Service{Name}; | ||
| 120 | - $Data{ID} = $Service{ServiceID}; | ||
| 121 | - | ||
| 122 | - $LayoutObject->Block( | ||
| 123 | - Name => 'ChangeHeader', | ||
| 124 | - Data => \%Data | ||
| 125 | - ); | ||
| 126 | - | ||
| 127 | - foreach my $queue ( sort { uc( $Queues{$a} ) cmp uc( $Queues{$b} ) } keys %Queues ) { | ||
| 128 | - $LayoutObject->Block( | ||
| 129 | - Name => 'ChangeRow', | ||
| 130 | - Data => { | ||
| 131 | - Type => "Queue", | ||
| 132 | - ID => $queue, | ||
| 133 | - Name => $Queues{$queue}, | ||
| 134 | - Selected => ( $QueuesService{$queue} ? 'checked="checked"' : '' ) | ||
| 135 | - } | ||
| 136 | - ); | ||
| 137 | - } | ||
| 138 | - | ||
| 139 | - my $Output = | ||
| 140 | - $LayoutObject->Header( Title => $LayoutObject->{LanguageObject}->Get("Services per queue") ); | ||
| 141 | - $Output .= $LayoutObject->NavigationBar(); | ||
| 142 | - $Output .= $LayoutObject->Output( | ||
| 143 | - Data => \%Data, | ||
| 144 | - TemplateFile => 'QueueServiceChange' | ||
| 145 | - ); | ||
| 146 | - | ||
| 147 | - $Output .= $LayoutObject->Footer(); | ||
| 148 | - return $Output; | ||
| 149 | -} | ||
| 150 | - | ||
| 151 | -sub ShowChangeQueue() { | ||
| 152 | - my ( $Self, %Param ) = @_; | ||
| 153 | - my %Data = (); | ||
| 154 | - my %Queue = $Kernel::OM->Get("Kernel::System::Queue")->QueueGet( ID => $Param{ID} ); | ||
| 155 | - my %ServicesQueue = $Kernel::OM->Get("Kernel::System::QueueService")->GetServiceList( QueueID => $Param{ID} ); | ||
| 156 | - my %Services = $Kernel::OM->Get("Kernel::System::Service")->ServiceList( UserID => 1 ); | ||
| 157 | - my $LayoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout"); | ||
| 158 | - | ||
| 159 | - $Data{Type} = "Service"; | ||
| 160 | - $Data{Filter} = "Queue"; | ||
| 161 | - $Data{VisibleNeType} = "Queue"; | ||
| 162 | - $Data{Name} = $Queue{Name}; | ||
| 163 | - $Data{ID} = $Queue{QueueID}; | ||
| 164 | - | ||
| 165 | - $LayoutObject->Block( | ||
| 166 | - Name => 'ChangeHeader', | ||
| 167 | - Data => \%Data | ||
| 168 | - ); | ||
| 169 | - | ||
| 170 | - foreach my $service ( sort { uc( $Services{$a} ) cmp uc( $Services{$b} ) } keys %Services ) { | ||
| 171 | - $LayoutObject->Block( | ||
| 172 | - Name => 'ChangeRow', | ||
| 173 | - Data => { | ||
| 174 | - Type => "Service", | ||
| 175 | - ID => $service, | ||
| 176 | - Name => $Services{$service}, | ||
| 177 | - Selected => ( $ServicesQueue{$service} ? 'checked="checked"' : '' ) | ||
| 178 | - } | ||
| 179 | - ); | ||
| 180 | - } | ||
| 181 | - | ||
| 182 | - my $Output = | ||
| 183 | - $LayoutObject->Header( Title => $LayoutObject->{LanguageObject}->Get("Services per queue") ); | ||
| 184 | - $Output .= $LayoutObject->NavigationBar(); | ||
| 185 | - $Output .= $LayoutObject->Output( | ||
| 186 | - Data => \%Data, | ||
| 187 | - TemplateFile => 'QueueServiceChange' | ||
| 188 | - ); | ||
| 189 | - | ||
| 190 | - $Output .= $LayoutObject->Footer(); | ||
| 191 | - return $Output; | ||
| 192 | - | ||
| 193 | -} | ||
| 194 | - | ||
| 195 | -sub ChangeService() { | ||
| 196 | - my ( $Self, %Param ) = @_; | ||
| 197 | - my @queueIDs = $Kernel::OM->Get("Kernel::System::Web::Request")->GetArray( Param => 'Queue' ); | ||
| 198 | - my $id = $Kernel::OM->Get("Kernel::System::Web::Request")->GetParam( Param => 'ID' ); | ||
| 199 | - $Kernel::OM->Get("Kernel::System::QueueService")->SetServiceQueues(ServiceID => $id, Queues => \@queueIDs); | ||
| 200 | -} | ||
| 201 | - | ||
| 202 | -sub ChangeQueue() { | ||
| 203 | - my ( $Self, %Param ) = @_; | ||
| 204 | - my @serviceIDs = $Kernel::OM->Get("Kernel::System::Web::Request")->GetArray( Param => 'Service' ); | ||
| 205 | - my $id = $Kernel::OM->Get("Kernel::System::Web::Request")->GetParam( Param => 'ID' ); | ||
| 206 | - $Kernel::OM->Get("Kernel::System::QueueService")->SetQueueServices(QueueID => $id, Services => \@serviceIDs); | ||
| 207 | - | ||
| 208 | -} | ||
| 209 | \ No newline at end of file | 0 | \ No newline at end of file |
Kernel/Output/HTML/Templates/Standard/QueueService.tt
| @@ -1,86 +0,0 @@ | @@ -1,86 +0,0 @@ | ||
| 1 | -# -- | ||
| 2 | -# Kernel/Output/HTML/Standard/QueueService.tt - overview | ||
| 3 | -# Copyright (C) (2014) SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 4 | -# Version 06/01/2015 - Adjusts for OTRS 4 | ||
| 5 | -# | ||
| 6 | -# This software comes with ABSOLUTELY NO WARRANTY. For details, see | ||
| 7 | -# the enclosed file COPYING for license information (AGPL). If you | ||
| 8 | -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. | ||
| 9 | -# -- | ||
| 10 | -<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst"> | ||
| 11 | - <h1>[% Translate("Services per queue") | html %]</h1> | ||
| 12 | - | ||
| 13 | - <div class="SidebarColumn"> | ||
| 14 | - | ||
| 15 | - <div class="WidgetSimple"> | ||
| 16 | - <div class="Header"> | ||
| 17 | - <h2>[% Translate("Actions") | html %]</h2> | ||
| 18 | - </div> | ||
| 19 | - <div class="Content"> | ||
| 20 | - <ul class="ActionList"> | ||
| 21 | - <li> | ||
| 22 | - <a href="[% Env("Baselink") %]Action=[% Env("Action") %]" class="CallForAction"><span>[% Translate("Go to overview") | html %]</span></a> | ||
| 23 | - </li> | ||
| 24 | - </ul> | ||
| 25 | - </div> | ||
| 26 | - </div> | ||
| 27 | - | ||
| 28 | -[% RenderBlockStart("serviceFilter") %] | ||
| 29 | - <div class="WidgetSimple"> | ||
| 30 | - <div class="Header"> | ||
| 31 | - <h2><label for="FilterServices">[% Translate("Services") | html %]</label></h2> | ||
| 32 | - </div> | ||
| 33 | - <div class="Content"> | ||
| 34 | - <input type="text" id="FilterUsers" class="W50pc" name="FilterUser" value="" title="[% Translate("Service") | html %]" /> | ||
| 35 | - </div> | ||
| 36 | - </div> | ||
| 37 | -[% RenderBlockEnd("serviceFilter") %] | ||
| 38 | -[% RenderBlockStart("queueFilter") %] | ||
| 39 | - <div class="WidgetSimple"> | ||
| 40 | - <div class="Header"> | ||
| 41 | - <h2><label for="FilterQueues">[% Translate("Queues") | html %]</label></h2> | ||
| 42 | - </div> | ||
| 43 | - <div class="Content"> | ||
| 44 | - <input type="text" id="FilterGroups" class="W50pc" name="FilterGroups" value="" title="[% Translate("Queue") | html %]"/> | ||
| 45 | - </div> | ||
| 46 | - </div> | ||
| 47 | -[% RenderBlockEnd("queueFilter") %] | ||
| 48 | - </div> | ||
| 49 | - | ||
| 50 | - <div class="ContentColumn"> | ||
| 51 | - <div class="WidgetSimple"> | ||
| 52 | - | ||
| 53 | - <div class="Header"> | ||
| 54 | - <h2>[% Translate("Overview") | html %]</h2> | ||
| 55 | - </div> | ||
| 56 | - <div class="Content LayoutGrid ColumnsWithSpacing"> | ||
| 57 | - <div class="Size1of2"> | ||
| 58 | - <ul class="Tablelike" id="Services"> | ||
| 59 | - <li class="Header">[% Translate("Services") | html %]</li> | ||
| 60 | - <li class="FilterMessage Hidden">[% Translate("No matches found.") | html %]</li> | ||
| 61 | -[% RenderBlockStart("ListService") %] | ||
| 62 | - <li><a href="[% Env("Baselink") %]Action=[% Env("Action") %];Subaction=ServiceEdit;ID=[% Data.ServiceID | uri %]" class="AsBlock">[% Data.ServiceName | html %]</a></li> | ||
| 63 | -[% RenderBlockEnd("ListService") %] | ||
| 64 | - </ul> | ||
| 65 | - </div> | ||
| 66 | - <div class="Size1of2"> | ||
| 67 | - <ul class="Tablelike" id="Queues"> | ||
| 68 | - <li class="Header">[% Translate("Queues") | html %]</li> | ||
| 69 | - <li class="FilterMessage Hidden">[% Translate("No matches found.") | html %]</li> | ||
| 70 | -[% RenderBlockStart("ListQueue") %] | ||
| 71 | - <li><a href="[% Env("Baselink") %]Action=[% Env("Action") %];Subaction=QueueEdit;ID=[% Data.QueueID | uri %]" class="AsBlock">[% Data.QueueName | html %]</a></li> | ||
| 72 | -[% RenderBlockEnd("ListQueue") %] | ||
| 73 | - </ul> | ||
| 74 | - </div> | ||
| 75 | - <div class="Clear"></div> | ||
| 76 | - </div> | ||
| 77 | - | ||
| 78 | - | ||
| 79 | -[% WRAPPER JSOnDocumentComplete %] | ||
| 80 | -<script type="text/javascript">//<![CDATA[ | ||
| 81 | - Core.UI.Table.InitTableFilter($('#FilterServices'), $('#Services')); | ||
| 82 | - Core.UI.Table.InitTableFilter($('#FilterQueues'), $('#Queues')); | ||
| 83 | -//]]></script> | ||
| 84 | -[% END %] | ||
| 85 | - | ||
| 86 | - | ||
| 87 | \ No newline at end of file | 0 | \ No newline at end of file |
Kernel/Output/HTML/Templates/Standard/QueueServiceChange.tt
| @@ -1,103 +0,0 @@ | @@ -1,103 +0,0 @@ | ||
| 1 | -# -- | ||
| 2 | -# Kernel/Output/HTML/Standard/QueueServiceChange.tt - edit | ||
| 3 | -# Copyright (C) (2014) SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 4 | -# Version 06/01/2015 - Adjusts for OTRS 4 | ||
| 5 | -# | ||
| 6 | -# This software comes with ABSOLUTELY NO WARRANTY. For details, see | ||
| 7 | -# the enclosed file COPYING for license information (AGPL). If you | ||
| 8 | -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. | ||
| 9 | -# -- | ||
| 10 | -<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst"> | ||
| 11 | - <h1>[% Translate("Services and queues") | html %]</h1> | ||
| 12 | - <div class="SidebarColumn"> | ||
| 13 | - <div class="WidgetSimple"> | ||
| 14 | - <div class="Header"> | ||
| 15 | - <h2>[% Translate("Actions") | html %]</h2> | ||
| 16 | - </div> | ||
| 17 | - <div class="Content"> | ||
| 18 | - <ul class="ActionList"> | ||
| 19 | - <li> | ||
| 20 | - <a href="[% Env("Baselink") %]Action=[% Env("Action") %]" class="CallForAction"><span>[% Translate("Go to overview") | html %]</span></a> | ||
| 21 | - </li> | ||
| 22 | - </ul> | ||
| 23 | - </div> | ||
| 24 | - </div> | ||
| 25 | - <div class="WidgetSimple"> | ||
| 26 | - <div class="Header"> | ||
| 27 | - <h2> | ||
| 28 | - <label for="Filter">[% Translate("Filter") | html %]</label> | ||
| 29 | - </h2> | ||
| 30 | - </div> | ||
| 31 | - <div class="Content"> | ||
| 32 | - <input type="text" id="Filter" class="W50pc" name="Filter" value="" title="[% Translate("Filter") | html %]" /> | ||
| 33 | - </div> | ||
| 34 | - </div> | ||
| 35 | - </div> | ||
| 36 | - | ||
| 37 | - <div class="ContentColumn"> | ||
| 38 | - <div class="WidgetSimple"> | ||
| 39 | - <div class="Header"> | ||
| 40 | - <h2> | ||
| 41 | -[% RenderBlockStart("ChangeHeaderService") %] | ||
| 42 | - [% Translate("Select queues for the service") | html %] | ||
| 43 | -[% RenderBlockEnd("ChangeHeaderService") %] | ||
| 44 | -[% RenderBlockStart("ChangeHeaderQueue") %] | ||
| 45 | - [% Translate("Select services for the queue") | html %] | ||
| 46 | -[% RenderBlockEnd("ChangeHeaderQueue") %] | ||
| 47 | - [% Data.Name | html %] | ||
| 48 | - </h2> | ||
| 49 | - </div> | ||
| 50 | - <div class="Content "> | ||
| 51 | - <form action="[% Env("CGIHandle") %]" method="post" name="matrix"> | ||
| 52 | - <input type="hidden" name="Action" value="[% Env("Action") %]"/> | ||
| 53 | - <input type="hidden" name="Subaction" value="Change[% Data.VisibleNeType | html %]"/> | ||
| 54 | - <input type="hidden" name="ID" value="[% Data.ID | html %]"/> | ||
| 55 | - <table class="DataTable VariableWidth" id="ServicesQueues"> | ||
| 56 | - <thead> | ||
| 57 | - <tr> | ||
| 58 | - <th>[% Translate(Data.VisibleNeType) | html %]</th> | ||
| 59 | -[% RenderBlockStart("ChangeHeader") %] | ||
| 60 | - <th class="Center [% Data.Mark | html %]"> | ||
| 61 | - <input type="checkbox" name="[% Data.Type | html %]" id="SelectAll[% Data.Type | html %]" title="[% Translate("Toggle active state for all") | html %]" value="" /> | ||
| 62 | - [% Translate("Active") | html %] | ||
| 63 | - </th> | ||
| 64 | -[% WRAPPER JSOnDocumentComplete %] | ||
| 65 | -<script type="text/javascript">//<![CDATA[ | ||
| 66 | - Core.Form.InitSelectAllCheckboxes($('table td input:checkbox[name=[% Data.Type | html %]]'), $('#SelectAll[% Data.Type | html %]')); | ||
| 67 | - $('input:checkbox[name=[% Data.Type | html %]]').bind('click', function () { | ||
| 68 | - Core.Form.SelectAllCheckboxes($(this), $('#SelectAll[% Data.Type | html %]')); | ||
| 69 | - }); | ||
| 70 | -//]]></script> | ||
| 71 | -[% END %] | ||
| 72 | -[% RenderBlockEnd("ChangeHeader") %] | ||
| 73 | - </tr> | ||
| 74 | - </thead> | ||
| 75 | - <tbody> | ||
| 76 | -[% RenderBlockStart("ChangeRow") %] | ||
| 77 | - <tr> | ||
| 78 | - <td>[% Data.Name | html %]</td> | ||
| 79 | - <td class="[% Data.Mark | html %]"> | ||
| 80 | - <input type="checkbox" name="[% Data.Type | html %]" title="[% Translate("Toggle active state for %s", Data.Name) | html %]" value="[% Data.ID | html %]" [% Data.Selected %]/> | ||
| 81 | - </td> | ||
| 82 | - </tr> | ||
| 83 | -[% RenderBlockEnd("ChangeRow") %] | ||
| 84 | - </tbody> | ||
| 85 | - </table> | ||
| 86 | - <div class="Field SpacingTop"> | ||
| 87 | - <button class="Primary" type="submit" value="[% Translate("Submit") | html %]">[% Translate("Submit") | html %]</button> | ||
| 88 | - [% Translate("or") | html %] | ||
| 89 | - <a href="[% Env("Baselink") %]Action=[% Env("Action") %]">[% Translate("Cancel") | html %]</a> | ||
| 90 | - </div> | ||
| 91 | - <div class="Clear"></div> | ||
| 92 | - </form> | ||
| 93 | - </div> | ||
| 94 | - </div> | ||
| 95 | - </div> | ||
| 96 | - <div class="Clear"></div> | ||
| 97 | -</div> | ||
| 98 | - | ||
| 99 | -[% WRAPPER JSOnDocumentComplete %] | ||
| 100 | -<script type="text/javascript">//<![CDATA[ | ||
| 101 | - Core.UI.Table.InitTableFilter($('#Filter'), $('#ServicesQueues')); | ||
| 102 | -//]]></script> | ||
| 103 | -[% END %] |
Kernel/System/QueueService.pm
| @@ -1,188 +0,0 @@ | @@ -1,188 +0,0 @@ | ||
| 1 | -# -- | ||
| 2 | -# Kernel/System/QueueService.pm - core module | ||
| 3 | -# Manages Queue Services | ||
| 4 | -# | ||
| 5 | -# Copyright (C) (2014) - SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 6 | -# Version 06/01/2015 - Adjusts for OTRS 4 | ||
| 7 | -# | ||
| 8 | -# This software comes with ABSOLUTELY NO WARRANTY. For details, see | ||
| 9 | -# the enclosed file COPYING for license information (AGPL). If you | ||
| 10 | -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. | ||
| 11 | -# -- | ||
| 12 | -# | ||
| 13 | -package Kernel::System::QueueService; | ||
| 14 | - | ||
| 15 | -use strict; | ||
| 16 | -use warnings; | ||
| 17 | -use Data::Dumper; | ||
| 18 | - | ||
| 19 | -our @ObjectDependencies = ( | ||
| 20 | - "Kernel::Output::HTML::Layout", # Old LayoutObject | ||
| 21 | - "Kernel::System::DB" | ||
| 22 | -); | ||
| 23 | - | ||
| 24 | -sub new { | ||
| 25 | - my ( $Type, %Param ) = @_; | ||
| 26 | - | ||
| 27 | - # allocate new hash for object | ||
| 28 | - my $Self = {%Param}; | ||
| 29 | - bless( $Self, $Type ); | ||
| 30 | - | ||
| 31 | - return $Self; | ||
| 32 | -} | ||
| 33 | - | ||
| 34 | -=item GetServiceList() | ||
| 35 | - | ||
| 36 | -Get list of services for a queue | ||
| 37 | - | ||
| 38 | - my %{service_id}{QueueName} = $QueueServiceObject->GetServiceList( | ||
| 39 | - QueueID => 123, | ||
| 40 | - ); | ||
| 41 | - | ||
| 42 | -=cut | ||
| 43 | -sub GetServiceList { | ||
| 44 | - my ( $Self, %Param ) = @_; | ||
| 45 | - my %result = (); | ||
| 46 | - | ||
| 47 | - for (qw(QueueID)) { | ||
| 48 | - if ( !$Param{$_} ) { | ||
| 49 | - $Kernel::OM->Get("Kernel::Output::HTML::Layout")->FatalError( Message => Dumper( \%Param ) . "got no $_!" ); | ||
| 50 | - } | ||
| 51 | - } | ||
| 52 | - | ||
| 53 | - $Kernel::OM->Get("Kernel::System::DB")->Prepare( | ||
| 54 | - SQL => " | ||
| 55 | - select | ||
| 56 | - a.service_id id, | ||
| 57 | - b.name Name | ||
| 58 | - from | ||
| 59 | - queue_service a | ||
| 60 | - inner join service b on(b.id = a.service_id) | ||
| 61 | - where | ||
| 62 | - a.queue_id = ?", | ||
| 63 | - Bind => [ \$Param{QueueID} ] | ||
| 64 | - ); | ||
| 65 | - | ||
| 66 | - while ( my @row = $Kernel::OM->Get("Kernel::System::DB")->FetchrowArray() ) { | ||
| 67 | - $result{ $row[0] } = $row[1]; | ||
| 68 | - } | ||
| 69 | - | ||
| 70 | - return %result; | ||
| 71 | -} | ||
| 72 | - | ||
| 73 | -=item GetQueueList() | ||
| 74 | - | ||
| 75 | -Get list of queues for a service | ||
| 76 | - | ||
| 77 | - my %{queue_id}{QueueName} = $QueueServiceObject->GetQueueList( | ||
| 78 | - ServiceID => 123, | ||
| 79 | - ); | ||
| 80 | - | ||
| 81 | -=cut | ||
| 82 | -sub GetQueueList { | ||
| 83 | - my ( $Self, %Param ) = @_; | ||
| 84 | - my %result = (); | ||
| 85 | - | ||
| 86 | - for (qw(ServiceID)) { | ||
| 87 | - if ( !$Param{$_} ) { | ||
| 88 | - $Kernel::OM->Get("Kernel::Output::HTML::Layout")->FatalError( Message => Dumper( \%Param ) . "got no $_!" ); | ||
| 89 | - } | ||
| 90 | - } | ||
| 91 | - | ||
| 92 | - $Kernel::OM->Get("Kernel::System::DB")->Prepare( | ||
| 93 | - SQL => " | ||
| 94 | - select | ||
| 95 | - a.queue_id id, | ||
| 96 | - b.name Name | ||
| 97 | - from | ||
| 98 | - queue_service a | ||
| 99 | - inner join queue b on(b.id = a.queue_id) | ||
| 100 | - where | ||
| 101 | - a.service_id = ?", | ||
| 102 | - Bind => [ \$Param{ServiceID} ] | ||
| 103 | - ); | ||
| 104 | - | ||
| 105 | - while ( my @row = $Kernel::OM->Get("Kernel::System::DB")->FetchrowArray() ) { | ||
| 106 | - $result{ $row[0] } = $row[1]; | ||
| 107 | - } | ||
| 108 | - | ||
| 109 | - return %result; | ||
| 110 | -} | ||
| 111 | - | ||
| 112 | - | ||
| 113 | -=item SetQueueServices() | ||
| 114 | - | ||
| 115 | -Defines the list of services for a queue | ||
| 116 | - | ||
| 117 | - $QueueServiceObject->SetQueueServices( | ||
| 118 | - QueueID => 123, | ||
| 119 | - Services => @ServiceIDs | ||
| 120 | - ); | ||
| 121 | - | ||
| 122 | -=cut | ||
| 123 | -sub SetQueueServices { | ||
| 124 | - my ( $Self, %Param ) = @_; | ||
| 125 | - my %result = (); | ||
| 126 | - | ||
| 127 | - for (qw(QueueID Services)) { | ||
| 128 | - if ( !$Param{$_} ) { | ||
| 129 | - $Kernel::OM->Get("Kernel::Output::HTML::Layout")->FatalError( Message => Dumper( \%Param ) . "got no $_!" ); | ||
| 130 | - } | ||
| 131 | - } | ||
| 132 | - | ||
| 133 | - my $QueueID = $Param{"QueueID"}; | ||
| 134 | - my @Services = @{$Param{"Services"}}; | ||
| 135 | - | ||
| 136 | - $Kernel::OM->Get("Kernel::System::DB")->Do( | ||
| 137 | - SQL => "delete from queue_service where queue_id = ?", | ||
| 138 | - Bind => [ \$Param{QueueID} ] | ||
| 139 | - ); | ||
| 140 | - | ||
| 141 | - for my $service (@Services) { | ||
| 142 | - $Kernel::OM->Get("Kernel::System::DB")->Do( | ||
| 143 | - SQL => "insert into queue_service(queue_id,service_id) values (?,?)", | ||
| 144 | - Bind => [\$Param{QueueID}, \$service] | ||
| 145 | - ); | ||
| 146 | - | ||
| 147 | - } | ||
| 148 | -} | ||
| 149 | - | ||
| 150 | -=item SetServiceQueues() | ||
| 151 | - | ||
| 152 | -Defines the list of services for a queue | ||
| 153 | - | ||
| 154 | - $QueueServiceObject->SetServiceQueues( | ||
| 155 | - ServiceID => 123, | ||
| 156 | - Queues => @ServiceIDs | ||
| 157 | - ); | ||
| 158 | - | ||
| 159 | -=cut | ||
| 160 | -sub SetServiceQueues { | ||
| 161 | - my ( $Self, %Param ) = @_; | ||
| 162 | - my %result = (); | ||
| 163 | - | ||
| 164 | - for (qw(ServiceID Queues)) { | ||
| 165 | - if ( !$Param{$_} ) { | ||
| 166 | - $Kernel::OM->Get("Kernel::Output::HTML::Layout")->FatalError( Message => Dumper( \%Param ) . "got no $_!" ); | ||
| 167 | - } | ||
| 168 | - } | ||
| 169 | - | ||
| 170 | - my $ServiceID = $Param{"ServiceID"}; | ||
| 171 | - my @Queues = @{$Param{"Queues"}}; | ||
| 172 | - | ||
| 173 | - $Kernel::OM->Get("Kernel::System::DB")->Do( | ||
| 174 | - SQL => "delete from queue_service where service_id = ?", | ||
| 175 | - Bind => [ \$Param{ServiceID} ] | ||
| 176 | - ); | ||
| 177 | - | ||
| 178 | - for my $queue (@Queues) { | ||
| 179 | - $Kernel::OM->Get("Kernel::System::DB")->Do( | ||
| 180 | - SQL => "insert into queue_service(queue_id,service_id) values (?,?)", | ||
| 181 | - Bind => [\$queue, \$Param{ServiceID}] | ||
| 182 | - ); | ||
| 183 | - | ||
| 184 | - } | ||
| 185 | -} | ||
| 186 | - | ||
| 187 | - | ||
| 188 | -1; |
QueueService.sopm
| @@ -1,44 +0,0 @@ | @@ -1,44 +0,0 @@ | ||
| 1 | -<?xml version="1.0" encoding="utf-8" ?> | ||
| 2 | -<otrs_package version="1.0"> | ||
| 3 | - <Name>QueueService</Name> | ||
| 4 | - <Version>1.2.0</Version> | ||
| 5 | - <Framework>5.0.x</Framework> | ||
| 6 | - <Vendor>SeTIC</Vendor> | ||
| 7 | - <URL>http://setic.ufsc.br</URL> | ||
| 8 | - <License>GPLv2</License> | ||
| 9 | - | ||
| 10 | - <ChangeLog Version="1.0.0" Date="2014-06-01">First Version</ChangeLog> | ||
| 11 | - <ChangeLog Version="1.1.0" Date="2014-01-06">Support for OTRS 4</ChangeLog> | ||
| 12 | - <ChangeLog Version="1.2.0" Date="2014-01-06">Support for OTRS 5.0.x</ChangeLog> | ||
| 13 | - | ||
| 14 | - <Description>Services per queue association</Description> | ||
| 15 | - | ||
| 16 | - <BuildDate>?</BuildDate> | ||
| 17 | - <BuildHost>?</BuildHost> | ||
| 18 | - | ||
| 19 | - <IntroInstall Type="post" Title="Thank you"><![CDATA[ | ||
| 20 | - Module installed successfully!<BR/><BR/> | ||
| 21 | - ]]></IntroInstall> | ||
| 22 | - | ||
| 23 | - <Filelist> | ||
| 24 | - <File Permission="644" Location="Kernel/Config/Files/QueueService.xml"></File> | ||
| 25 | - <File Permission="644" Location="Kernel/Language/pt_BR_QueueService.pm"></File> | ||
| 26 | - <File Permission="644" Location="Kernel/Modules/QueueService.pm"></File> | ||
| 27 | - <File Permission="644" Location="Kernel/Output/HTML/Templates/Standard/QueueService.tt"></File> | ||
| 28 | - <File Permission="644" Location="Kernel/Output/HTML/Templates/Standard/QueueServiceChange.tt"></File> | ||
| 29 | - <File Permission="644" Location="Kernel/System/QueueService.pm"></File> | ||
| 30 | - </Filelist> | ||
| 31 | - <DatabaseInstall> | ||
| 32 | - <TableCreate Name="queue_service"> | ||
| 33 | - <Column Name="id" Required="true" PrimaryKey="true" AutoIncrement="true" Type="int"/> | ||
| 34 | - <Column Name="service_id" Required="true" Type="int"/> | ||
| 35 | - <Column Name="queue_id" Required="true" Type="int"/> | ||
| 36 | - <ForeignKey ForeignTable="service"> | ||
| 37 | - <Reference Local="service_id" Foreign="id"/> | ||
| 38 | - </ForeignKey> | ||
| 39 | - <ForeignKey ForeignTable="queue"> | ||
| 40 | - <Reference Local="queue_id" Foreign="id"/> | ||
| 41 | - </ForeignKey> | ||
| 42 | - </TableCreate> | ||
| 43 | - </DatabaseInstall> | ||
| 44 | -</otrs_package> |
| @@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
| 1 | +<?xml version="1.0" encoding="UTF-8" ?> | ||
| 2 | +<otrs_config init="Application" version="2.0"> | ||
| 3 | + <Setting Name="Frontend::Module###QueueService" Required="0" Valid="1"> | ||
| 4 | + <Description Lang="en">Frontend module registration for the service per queue. Support module used by other modules. Allows associating services and queues.</Description> | ||
| 5 | + <Description Lang="pt_BR">Registro do módulo de frontend de serviços por fila. Módulo de suporte usado por outros módulos. Permite associar serviços e filas.</Description> | ||
| 6 | + <Navigation>Frontend::Admin::ModuleRegistration</Navigation> | ||
| 7 | + <Value> | ||
| 8 | + <Item ValueType="FrontendRegistration"> | ||
| 9 | + <Hash> | ||
| 10 | + <Item Key="GroupRo"> | ||
| 11 | + <Array> | ||
| 12 | + </Array> | ||
| 13 | + </Item> | ||
| 14 | + <Item Key="Group"> | ||
| 15 | + <Array> | ||
| 16 | + <Item>admin</Item> | ||
| 17 | + </Array> | ||
| 18 | + </Item> | ||
| 19 | + <Item Key="Description">Admin</Item> | ||
| 20 | + <Item Key="Title" Lang="en">Services per queue</Item> | ||
| 21 | + <Item Key="Title" Lang="pt_BR">Serviços por fila</Item> | ||
| 22 | + <Item Key="NavBarName">Admin</Item> | ||
| 23 | + </Hash> | ||
| 24 | + </Item> | ||
| 25 | + </Value> | ||
| 26 | + </Setting> | ||
| 27 | + <Setting Name="Frontend::Navigation###QueueService###002-QueueService" Required="0" Valid="0"> | ||
| 28 | + <Description Lang="en">Main menu item registration.</Description> | ||
| 29 | + <Description Lang="pt_BR">Registro do item do menu principal.</Description> | ||
| 30 | + <Navigation>Frontend::Admin::ModuleRegistration::MainMenu</Navigation> | ||
| 31 | + <Value> | ||
| 32 | + <Array> | ||
| 33 | + <DefaultItem ValueType="FrontendNavigation"> | ||
| 34 | + <Hash> | ||
| 35 | + </Hash> | ||
| 36 | + </DefaultItem> | ||
| 37 | + </Array> | ||
| 38 | + </Value> | ||
| 39 | + </Setting> | ||
| 40 | + <Setting Name="Frontend::NavigationModule###QueueService" Required="0" Valid="1"> | ||
| 41 | + <Description Lang="en">Admin area navigation for the agent interface.</Description> | ||
| 42 | + <Description Lang="pt_BR">Área administrativa para a interface de agente.</Description> | ||
| 43 | + <Navigation>Frontend::Admin::ModuleRegistration::AdminOverview</Navigation> | ||
| 44 | + <Value> | ||
| 45 | + <Hash> | ||
| 46 | + <Item Key="Group"> | ||
| 47 | + <Array> | ||
| 48 | + <Item>admin</Item> | ||
| 49 | + </Array> | ||
| 50 | + </Item> | ||
| 51 | + <Item Key="GroupRo"> | ||
| 52 | + <Array> | ||
| 53 | + </Array> | ||
| 54 | + </Item> | ||
| 55 | + <Item Key="Module">Kernel::Output::HTML::NavBar::ModuleAdmin</Item> | ||
| 56 | + <Item Key="Name" Lang="en">Services per queue</Item> | ||
| 57 | + <Item Key="Name" Lang="pt_BR">Serviços por fila</Item> | ||
| 58 | + <Item Key="Block">Ticket</Item> | ||
| 59 | + <Item Key="Description" Lang="en">Create and manages services per queue</Item> | ||
| 60 | + <Description Lang="pt_BR">Cria e gerencia serviços por fila</Description> | ||
| 61 | + <Item Key="IconBig"></Item> | ||
| 62 | + <Item Key="IconSmall"></Item> | ||
| 63 | + </Hash> | ||
| 64 | + </Value> | ||
| 65 | + </Setting> | ||
| 66 | + | ||
| 67 | +</otrs_config> |
| @@ -0,0 +1,28 @@ | @@ -0,0 +1,28 @@ | ||
| 1 | +# -- | ||
| 2 | +# Kernel/Modules/pt_BR_QueueService.pm - module to associate services per queue | ||
| 3 | +# | ||
| 4 | +# Copyright (C) 2014-2018 - SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 5 | +# | ||
| 6 | +# Version 2015-06-01 - Adjustments for OTRS 4 | ||
| 7 | +# Version 2018-01-03 - 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 | +package Kernel::Language::pt_BR_QueueService; | ||
| 15 | + | ||
| 16 | +use strict; | ||
| 17 | +use warnings; | ||
| 18 | +use utf8; | ||
| 19 | + | ||
| 20 | +sub Data { | ||
| 21 | + my $Self = shift; | ||
| 22 | + $Self->{Translation}->{'Services per queue'} = 'Serviços por fila'; | ||
| 23 | + $Self->{Translation}->{'Create and manages services per queue'} = 'Cria e gerencia serviços por fila'; | ||
| 24 | + | ||
| 25 | + return 1; | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +1; | ||
| 0 | \ No newline at end of file | 29 | \ No newline at end of file |
| @@ -0,0 +1,219 @@ | @@ -0,0 +1,219 @@ | ||
| 1 | +# -- | ||
| 2 | +# Kernel/Modules/QueueService.pm - frontend module | ||
| 3 | +# | ||
| 4 | +# Copyright (C) 2014-2018 - SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 5 | +# | ||
| 6 | +# Version 2016-06-01 - Adjustments for OTRS 4 | ||
| 7 | +# Version 2018-01-03 - Adjustments for OTRS 6 | ||
| 8 | +# | ||
| 9 | +package Kernel::Modules::QueueService; | ||
| 10 | + | ||
| 11 | +use strict; | ||
| 12 | +use warnings; | ||
| 13 | +use Data::Dumper; | ||
| 14 | + | ||
| 15 | +our @ObjectDependencies = ( | ||
| 16 | + "Kernel::System::Web::Request", | ||
| 17 | + "Kernel::System::DB", | ||
| 18 | + "Kernel::System::Ticket", | ||
| 19 | + "Kernel::Output::HTML::Layout", | ||
| 20 | + "Kernel::System::Log", | ||
| 21 | + "Kernel::System::Queue", | ||
| 22 | + "Kernel::Config", | ||
| 23 | + "Kernel::System::Encode", | ||
| 24 | + "Kernel::System::Main", | ||
| 25 | + "Kernel::System::QueueService", | ||
| 26 | + "Kernel::System::Service" | ||
| 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 | + | ||
| 42 | + my $ParamObject = $Kernel::OM->Get("Kernel::System::Web::Request"); | ||
| 43 | + | ||
| 44 | + my $SubAction = $ParamObject->GetParam( Param => "Subaction" ); | ||
| 45 | + | ||
| 46 | + if ( $SubAction eq "ServiceEdit" ) { | ||
| 47 | + return $Self->ShowChangeService( ID => $ParamObject->GetParam( Param => "ID" ) ); | ||
| 48 | + } | ||
| 49 | + elsif ( $SubAction eq "QueueEdit" ) { | ||
| 50 | + return $Self->ShowChangeQueue( ID => $ParamObject->GetParam( Param => "ID" ) ); | ||
| 51 | + } | ||
| 52 | + elsif ( $SubAction eq "ChangeService" ) { | ||
| 53 | + $Self->ChangeService(); | ||
| 54 | + return $Self->ShowOverview(); | ||
| 55 | + } | ||
| 56 | + elsif ( $SubAction eq "ChangeQueue" ) { | ||
| 57 | + $Self->ChangeQueue(); | ||
| 58 | + return $Self->ShowOverview(); | ||
| 59 | + } | ||
| 60 | + else { | ||
| 61 | + return $Self->ShowOverview(); | ||
| 62 | + } | ||
| 63 | +} | ||
| 64 | + | ||
| 65 | +sub ShowOverview() { | ||
| 66 | + my ( $Self, %Param ) = @_; | ||
| 67 | + my %Data = (); | ||
| 68 | + | ||
| 69 | + my %Queues = $Kernel::OM->Get("Kernel::System::Queue")->QueueList( Valid => 1 ); | ||
| 70 | + my %Services = $Kernel::OM->Get("Kernel::System::Service")->ServiceList( UserID => 1 ); | ||
| 71 | + my $LayoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout"); | ||
| 72 | + my $LanguageObject = $Kernel::OM->Get("Kernel::Language"); | ||
| 73 | + | ||
| 74 | + foreach my $service ( sort { uc( $Services{$a} ) cmp uc( $Services{$b} ) } keys %Services ) { | ||
| 75 | + $LayoutObject->Block( | ||
| 76 | + Name => 'ListService', | ||
| 77 | + Data => { | ||
| 78 | + ServiceID => $service, | ||
| 79 | + ServiceName => $Services{$service}, | ||
| 80 | + } | ||
| 81 | + ); | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + foreach my $queue ( sort { uc( $Queues{$a} ) cmp uc( $Queues{$b} ) } keys %Queues ) { | ||
| 85 | + $LayoutObject->Block( | ||
| 86 | + Name => 'ListQueue', | ||
| 87 | + Data => { | ||
| 88 | + QueueID => $queue, | ||
| 89 | + QueueName => $Queues{$queue}, | ||
| 90 | + } | ||
| 91 | + ); | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + my $Output = $LayoutObject->Header( Title => $LanguageObject->Translate("Services per queue") ); | ||
| 95 | + $Output .= $LayoutObject->NavigationBar(); | ||
| 96 | + $Output .= $LayoutObject->Output( | ||
| 97 | + Data => \%Data, | ||
| 98 | + TemplateFile => 'QueueService' | ||
| 99 | + ); | ||
| 100 | + | ||
| 101 | + $Output .= $LayoutObject->Footer(); | ||
| 102 | + return $Output; | ||
| 103 | +} | ||
| 104 | + | ||
| 105 | +=item ShowChangeService() | ||
| 106 | + | ||
| 107 | +Show view to change queues associated to a service | ||
| 108 | + | ||
| 109 | +=cut | ||
| 110 | +sub ShowChangeService() { | ||
| 111 | + my ( $Self, %Param ) = @_; | ||
| 112 | + my %Data = (); | ||
| 113 | + my %Service = $Kernel::OM->Get("Kernel::System::Service")->ServiceGet( ServiceID => $Param{ID}, UserID => 1 ); | ||
| 114 | + my %QueuesService = $Kernel::OM->Get("Kernel::System::QueueService")->GetQueueList( ServiceID => $Param{ID} ); | ||
| 115 | + my %Queues = $Kernel::OM->Get("Kernel::System::Queue")->QueueList( Valid => 1 ); | ||
| 116 | + my $LayoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout"); | ||
| 117 | + my $LanguageObject = $Kernel::OM->Get("Kernel::Language"); | ||
| 118 | + | ||
| 119 | + $Data{Type} = "Queue"; | ||
| 120 | + $Data{Filter} = "Service"; | ||
| 121 | + $Data{VisibleNeType} = "Service"; | ||
| 122 | + $Data{Name} = $Service{Name}; | ||
| 123 | + $Data{ID} = $Service{ServiceID}; | ||
| 124 | + | ||
| 125 | + $LayoutObject->Block( | ||
| 126 | + Name => 'ChangeHeader', | ||
| 127 | + Data => \%Data | ||
| 128 | + ); | ||
| 129 | + | ||
| 130 | + foreach my $queue ( sort { uc( $Queues{$a} ) cmp uc( $Queues{$b} ) } keys %Queues ) { | ||
| 131 | + $LayoutObject->Block( | ||
| 132 | + Name => 'ChangeRow', | ||
| 133 | + Data => { | ||
| 134 | + Type => "Queue", | ||
| 135 | + ID => $queue, | ||
| 136 | + Name => $Queues{$queue}, | ||
| 137 | + Selected => ( $QueuesService{$queue} ? 'checked="checked"' : '' ) | ||
| 138 | + } | ||
| 139 | + ); | ||
| 140 | + } | ||
| 141 | + | ||
| 142 | + my $Output = | ||
| 143 | + $LayoutObject->Header( Title => $LanguageObject->Translate("Services per queue") ); | ||
| 144 | + $Output .= $LayoutObject->NavigationBar(); | ||
| 145 | + $Output .= $LayoutObject->Output( | ||
| 146 | + Data => \%Data, | ||
| 147 | + TemplateFile => 'QueueServiceChange' | ||
| 148 | + ); | ||
| 149 | + | ||
| 150 | + $Output .= $LayoutObject->Footer(); | ||
| 151 | + return $Output; | ||
| 152 | +} | ||
| 153 | + | ||
| 154 | +=item ShowChangeQueue() | ||
| 155 | + | ||
| 156 | +Show view to change services associated to a queue | ||
| 157 | + | ||
| 158 | +=cut | ||
| 159 | +sub ShowChangeQueue() { | ||
| 160 | + my ( $Self, %Param ) = @_; | ||
| 161 | + my %Data = (); | ||
| 162 | + my %Queue = $Kernel::OM->Get("Kernel::System::Queue")->QueueGet( ID => $Param{ID} ); | ||
| 163 | + my %ServicesQueue = $Kernel::OM->Get("Kernel::System::QueueService")->GetServiceList( QueueID => $Param{ID} ); | ||
| 164 | + my %Services = $Kernel::OM->Get("Kernel::System::Service")->ServiceList( UserID => 1 ); | ||
| 165 | + my $LayoutObject = $Kernel::OM->Get("Kernel::Output::HTML::Layout"); | ||
| 166 | + my $LanguageObject = $Kernel::OM->Get("Kernel::Language"); | ||
| 167 | + | ||
| 168 | + $Data{Type} = "Service"; | ||
| 169 | + $Data{Filter} = "Queue"; | ||
| 170 | + $Data{VisibleNeType} = "Queue"; | ||
| 171 | + $Data{Name} = $Queue{Name}; | ||
| 172 | + $Data{ID} = $Queue{QueueID}; | ||
| 173 | + | ||
| 174 | + $LayoutObject->Block( | ||
| 175 | + Name => 'ChangeHeader', | ||
| 176 | + Data => \%Data | ||
| 177 | + ); | ||
| 178 | + | ||
| 179 | + foreach my $service ( sort { uc( $Services{$a} ) cmp uc( $Services{$b} ) } keys %Services ) { | ||
| 180 | + $LayoutObject->Block( | ||
| 181 | + Name => 'ChangeRow', | ||
| 182 | + Data => { | ||
| 183 | + Type => "Service", | ||
| 184 | + ID => $service, | ||
| 185 | + Name => $Services{$service}, | ||
| 186 | + Selected => ( $ServicesQueue{$service} ? 'checked="checked"' : '' ) | ||
| 187 | + } | ||
| 188 | + ); | ||
| 189 | + } | ||
| 190 | + | ||
| 191 | + my $Output = | ||
| 192 | + $LayoutObject->Header( Title => $LanguageObject->Translate("Services per queue") ); | ||
| 193 | + $Output .= $LayoutObject->NavigationBar(); | ||
| 194 | + $Output .= $LayoutObject->Output( | ||
| 195 | + Data => \%Data, | ||
| 196 | + TemplateFile => 'QueueServiceChange' | ||
| 197 | + ); | ||
| 198 | + | ||
| 199 | + $Output .= $LayoutObject->Footer(); | ||
| 200 | + return $Output; | ||
| 201 | + | ||
| 202 | +} | ||
| 203 | + | ||
| 204 | +sub ChangeService() { | ||
| 205 | + my ( $Self, %Param ) = @_; | ||
| 206 | + my @queueIDs = $Kernel::OM->Get("Kernel::System::Web::Request")->GetArray( Param => 'Queue' ); | ||
| 207 | + my $id = $Kernel::OM->Get("Kernel::System::Web::Request")->GetParam( Param => 'ID' ); | ||
| 208 | + $Kernel::OM->Get("Kernel::System::QueueService")->SetServiceQueues(ServiceID => $id, Queues => \@queueIDs); | ||
| 209 | +} | ||
| 210 | + | ||
| 211 | +sub ChangeQueue() { | ||
| 212 | + my ( $Self, %Param ) = @_; | ||
| 213 | + my @serviceIDs = $Kernel::OM->Get("Kernel::System::Web::Request")->GetArray( Param => 'Service' ); | ||
| 214 | + my $id = $Kernel::OM->Get("Kernel::System::Web::Request")->GetParam( Param => 'ID' ); | ||
| 215 | + $Kernel::OM->Get("Kernel::System::QueueService")->SetQueueServices(QueueID => $id, Services => \@serviceIDs); | ||
| 216 | + | ||
| 217 | +} | ||
| 218 | + | ||
| 219 | +1; | ||
| 0 | \ No newline at end of file | 220 | \ No newline at end of file |
src/Kernel/Output/HTML/Templates/Standard/QueueService.tt
0 → 100644
| @@ -0,0 +1,88 @@ | @@ -0,0 +1,88 @@ | ||
| 1 | +# -- | ||
| 2 | +# Kernel/Output/HTML/Standard/QueueService.tt - overview | ||
| 3 | +# | ||
| 4 | +# Copyright (C) (2014-2018) - SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 5 | +# | ||
| 6 | +# Version 2016-06-01 - Adjusts for OTRS 4 | ||
| 7 | +# Version 2018-01-03 - Adjusts for OTRS 6 | ||
| 8 | +# | ||
| 9 | +# This software comes with ABSOLUTELY NO WARRANTY. For details, see | ||
| 10 | +# the enclosed file COPYING for license information (AGPL). If you | ||
| 11 | +# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. | ||
| 12 | +# -- | ||
| 13 | +<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst"> | ||
| 14 | + <h1>[% Translate("Services per queue") | html %]</h1> | ||
| 15 | + | ||
| 16 | + [% BreadcrumbPath = [ | ||
| 17 | + { | ||
| 18 | + Name => Translate('Services per queue'), | ||
| 19 | + Link => Env("Action"), | ||
| 20 | + }, | ||
| 21 | + ] | ||
| 22 | + %] | ||
| 23 | + [% INCLUDE "Breadcrumb.tt" Path = BreadcrumbPath %] | ||
| 24 | + | ||
| 25 | + <div class="SidebarColumn"> | ||
| 26 | + | ||
| 27 | + <div class="WidgetSimple"> | ||
| 28 | + <div class="Header"> | ||
| 29 | + <h2>[% Translate("Actions") | html %]</h2> | ||
| 30 | + </div> | ||
| 31 | + <div class="Content"> | ||
| 32 | + <ul class="ActionList"> | ||
| 33 | + <li> | ||
| 34 | + <a href="[% Env("Baselink") %]Action=[% Env("Action") %]" class="CallForAction"><span>[% Translate("Go to overview") | html %]</span></a> | ||
| 35 | + </li> | ||
| 36 | + </ul> | ||
| 37 | + </div> | ||
| 38 | + </div> | ||
| 39 | + | ||
| 40 | +[% RenderBlockStart("serviceFilter") %] | ||
| 41 | + <div class="WidgetSimple"> | ||
| 42 | + <div class="Header"> | ||
| 43 | + <h2><label for="FilterServices">[% Translate("Services") | html %]</label></h2> | ||
| 44 | + </div> | ||
| 45 | + <div class="Content"> | ||
| 46 | + <input type="text" id="FilterUsers" class="W50pc" name="FilterUser" value="" title="[% Translate("Service") | html %]" /> | ||
| 47 | + </div> | ||
| 48 | + </div> | ||
| 49 | +[% RenderBlockEnd("serviceFilter") %] | ||
| 50 | +[% RenderBlockStart("queueFilter") %] | ||
| 51 | + <div class="WidgetSimple"> | ||
| 52 | + <div class="Header"> | ||
| 53 | + <h2><label for="FilterQueues">[% Translate("Queues") | html %]</label></h2> | ||
| 54 | + </div> | ||
| 55 | + <div class="Content"> | ||
| 56 | + <input type="text" id="FilterGroups" class="W50pc" name="FilterGroups" value="" title="[% Translate("Queue") | html %]"/> | ||
| 57 | + </div> | ||
| 58 | + </div> | ||
| 59 | +[% RenderBlockEnd("queueFilter") %] | ||
| 60 | + </div> | ||
| 61 | + | ||
| 62 | + <div class="ContentColumn"> | ||
| 63 | + <div class="WidgetSimple"> | ||
| 64 | + | ||
| 65 | + <div class="Header"> | ||
| 66 | + <h2>[% Translate("Overview") | html %]</h2> | ||
| 67 | + </div> | ||
| 68 | + <div class="Content LayoutGrid ColumnsWithSpacing"> | ||
| 69 | + <div class="Size1of2"> | ||
| 70 | + <ul class="Tablelike" id="Services"> | ||
| 71 | + <li class="Header">[% Translate("Services") | html %]</li> | ||
| 72 | + <li class="FilterMessage Hidden">[% Translate("No matches found.") | html %]</li> | ||
| 73 | +[% RenderBlockStart("ListService") %] | ||
| 74 | + <li><a href="[% Env("Baselink") %]Action=[% Env("Action") %];Subaction=ServiceEdit;ID=[% Data.ServiceID | uri %]" class="AsBlock">[% Data.ServiceName | html %]</a></li> | ||
| 75 | +[% RenderBlockEnd("ListService") %] | ||
| 76 | + </ul> | ||
| 77 | + </div> | ||
| 78 | + <div class="Size1of2"> | ||
| 79 | + <ul class="Tablelike" id="Queues"> | ||
| 80 | + <li class="Header">[% Translate("Queues") | html %]</li> | ||
| 81 | + <li class="FilterMessage Hidden">[% Translate("No matches found.") | html %]</li> | ||
| 82 | +[% RenderBlockStart("ListQueue") %] | ||
| 83 | + <li><a href="[% Env("Baselink") %]Action=[% Env("Action") %];Subaction=QueueEdit;ID=[% Data.QueueID | uri %]" class="AsBlock">[% Data.QueueName | html %]</a></li> | ||
| 84 | +[% RenderBlockEnd("ListQueue") %] | ||
| 85 | + </ul> | ||
| 86 | + </div> | ||
| 87 | + <div class="Clear"></div> | ||
| 88 | + </div> | ||
| 0 | \ No newline at end of file | 89 | \ No newline at end of file |
src/Kernel/Output/HTML/Templates/Standard/QueueServiceChange.tt
0 → 100644
| @@ -0,0 +1,123 @@ | @@ -0,0 +1,123 @@ | ||
| 1 | +# -- | ||
| 2 | +# Kernel/Output/HTML/Standard/QueueServiceChange.tt - edit | ||
| 3 | +# Copyright (C) (2014) SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 4 | +# Version 06/01/2015 - Adjusts for OTRS 4 | ||
| 5 | +# | ||
| 6 | +# This software comes with ABSOLUTELY NO WARRANTY. For details, see | ||
| 7 | +# the enclosed file COPYING for license information (AGPL). If you | ||
| 8 | +# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. | ||
| 9 | +# -- | ||
| 10 | +<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst"> | ||
| 11 | + <h1>[% Translate("Services and queues") | html %]</h1> | ||
| 12 | + | ||
| 13 | + [% BreadcrumbPath = [ | ||
| 14 | + { | ||
| 15 | + Name => Translate('Services per queue'), | ||
| 16 | + Link => Env("Action"), | ||
| 17 | + }, | ||
| 18 | + ] | ||
| 19 | + %] | ||
| 20 | + | ||
| 21 | + [% IF Data.Type == "Service" %] | ||
| 22 | + [% USE EditTitle = String(Translate("Customizing services for queue")) %] | ||
| 23 | + [% BreadcrumbPath.push({ Name => EditTitle.append( ' ', Data.Name ) }) %] | ||
| 24 | + [% END %] | ||
| 25 | + [% IF Data.Type == "Queue" %] | ||
| 26 | + [% USE EditTitle = String(Translate("Customizing queues for service")) %] | ||
| 27 | + [% BreadcrumbPath.push({ Name => EditTitle.append( ' ', Data.Name ) }) %] | ||
| 28 | + [% END %] | ||
| 29 | + | ||
| 30 | + [% INCLUDE "Breadcrumb.tt" Path = BreadcrumbPath %] | ||
| 31 | + | ||
| 32 | + <div class="SidebarColumn"> | ||
| 33 | + <div class="WidgetSimple"> | ||
| 34 | + <div class="Header"> | ||
| 35 | + <h2>[% Translate("Actions") | html %]</h2> | ||
| 36 | + </div> | ||
| 37 | + <div class="Content"> | ||
| 38 | + <ul class="ActionList"> | ||
| 39 | + <li> | ||
| 40 | + <a href="[% Env("Baselink") %]Action=[% Env("Action") %]" class="CallForAction"><span>[% Translate("Go to overview") | html %]</span></a> | ||
| 41 | + </li> | ||
| 42 | + </ul> | ||
| 43 | + </div> | ||
| 44 | + </div> | ||
| 45 | + <div class="WidgetSimple"> | ||
| 46 | + <div class="Header"> | ||
| 47 | + <h2> | ||
| 48 | + <label for="Filter">[% Translate("Filter") | html %]</label> | ||
| 49 | + </h2> | ||
| 50 | + </div> | ||
| 51 | + <div class="Content"> | ||
| 52 | + <input type="text" id="Filter" class="W50pc" name="Filter" value="" title="[% Translate("Filter") | html %]" /> | ||
| 53 | + </div> | ||
| 54 | + </div> | ||
| 55 | + </div> | ||
| 56 | + | ||
| 57 | + <div class="ContentColumn"> | ||
| 58 | + <div class="WidgetSimple"> | ||
| 59 | + <div class="Header"> | ||
| 60 | + <h2> | ||
| 61 | +[% RenderBlockStart("ChangeHeaderService") %] | ||
| 62 | + [% Translate("Select queues for the service") | html %] | ||
| 63 | +[% RenderBlockEnd("ChangeHeaderService") %] | ||
| 64 | +[% RenderBlockStart("ChangeHeaderQueue") %] | ||
| 65 | + [% Translate("Select services for the queue") | html %] | ||
| 66 | +[% RenderBlockEnd("ChangeHeaderQueue") %] | ||
| 67 | + [% Data.Name | html %] | ||
| 68 | + </h2> | ||
| 69 | + </div> | ||
| 70 | + <div class="Content "> | ||
| 71 | + <form action="[% Env("CGIHandle") %]" method="post" name="matrix"> | ||
| 72 | + <input type="hidden" name="Action" value="[% Env("Action") %]"/> | ||
| 73 | + <input type="hidden" name="Subaction" value="Change[% Data.VisibleNeType | html %]"/> | ||
| 74 | + <input type="hidden" name="ID" value="[% Data.ID | html %]"/> | ||
| 75 | + <table class="DataTable VariableWidth" id="ServicesQueues"> | ||
| 76 | + <thead> | ||
| 77 | + <tr> | ||
| 78 | + <th>[% Translate(Data.VisibleNeType) | html %]</th> | ||
| 79 | +[% RenderBlockStart("ChangeHeader") %] | ||
| 80 | + <th class="Center [% Data.Mark | html %]"> | ||
| 81 | + <input type="checkbox" name="[% Data.Type | html %]" id="SelectAll[% Data.Type | html %]" title="[% Translate("Toggle active state for all") | html %]" value="" /> | ||
| 82 | + [% Translate("Active") | html %] | ||
| 83 | + </th> | ||
| 84 | +[% WRAPPER JSOnDocumentComplete %] | ||
| 85 | +<script type="text/javascript">//<![CDATA[ | ||
| 86 | + Core.Form.InitSelectAllCheckboxes($('table td input:checkbox[name=[% Data.Type | html %]]'), $('#SelectAll[% Data.Type | html %]')); | ||
| 87 | + $('input:checkbox[name=[% Data.Type | html %]]').bind('click', function () { | ||
| 88 | + Core.Form.SelectAllCheckboxes($(this), $('#SelectAll[% Data.Type | html %]')); | ||
| 89 | + }); | ||
| 90 | +//]]></script> | ||
| 91 | +[% END %] | ||
| 92 | +[% RenderBlockEnd("ChangeHeader") %] | ||
| 93 | + </tr> | ||
| 94 | + </thead> | ||
| 95 | + <tbody> | ||
| 96 | +[% RenderBlockStart("ChangeRow") %] | ||
| 97 | + <tr> | ||
| 98 | + <td>[% Data.Name | html %]</td> | ||
| 99 | + <td class="[% Data.Mark | html %]"> | ||
| 100 | + <input type="checkbox" name="[% Data.Type | html %]" title="[% Translate("Toggle active state for %s", Data.Name) | html %]" value="[% Data.ID | html %]" [% Data.Selected %]/> | ||
| 101 | + </td> | ||
| 102 | + </tr> | ||
| 103 | +[% RenderBlockEnd("ChangeRow") %] | ||
| 104 | + </tbody> | ||
| 105 | + </table> | ||
| 106 | + <div class="Field SpacingTop"> | ||
| 107 | + <button class="Primary" type="submit" value="[% Translate("Submit") | html %]">[% Translate("Submit") | html %]</button> | ||
| 108 | + [% Translate("or") | html %] | ||
| 109 | + <a href="[% Env("Baselink") %]Action=[% Env("Action") %]">[% Translate("Cancel") | html %]</a> | ||
| 110 | + </div> | ||
| 111 | + <div class="Clear"></div> | ||
| 112 | + </form> | ||
| 113 | + </div> | ||
| 114 | + </div> | ||
| 115 | + </div> | ||
| 116 | + <div class="Clear"></div> | ||
| 117 | +</div> | ||
| 118 | + | ||
| 119 | +[% WRAPPER JSOnDocumentComplete %] | ||
| 120 | +<script type="text/javascript">//<![CDATA[ | ||
| 121 | + Core.UI.Table.InitTableFilter($('#Filter'), $('#ServicesQueues')); | ||
| 122 | +//]]></script> | ||
| 123 | +[% END %] |
| @@ -0,0 +1,190 @@ | @@ -0,0 +1,190 @@ | ||
| 1 | +# -- | ||
| 2 | +# Kernel/System/QueueService.pm - core module | ||
| 3 | +# Manages Services association to queues | ||
| 4 | +# | ||
| 5 | +# Copyright (C) 2014-2018 - SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 6 | +# | ||
| 7 | +# Version 2016-06-01 - Adjustments for OTRS 4 | ||
| 8 | +# Version 2018-01-03 - Adjustments for OTRS 6 | ||
| 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::System::QueueService; | ||
| 16 | + | ||
| 17 | +use strict; | ||
| 18 | +use warnings; | ||
| 19 | +use Data::Dumper; | ||
| 20 | + | ||
| 21 | +our @ObjectDependencies = ( | ||
| 22 | + "Kernel::Output::HTML::Layout", | ||
| 23 | + "Kernel::System::DB" | ||
| 24 | +); | ||
| 25 | + | ||
| 26 | +sub new { | ||
| 27 | + my ( $Type, %Param ) = @_; | ||
| 28 | + | ||
| 29 | + # allocate new hash for object | ||
| 30 | + my $Self = {%Param}; | ||
| 31 | + bless( $Self, $Type ); | ||
| 32 | + | ||
| 33 | + return $Self; | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +=item GetServiceList() | ||
| 37 | + | ||
| 38 | +Get list of services for a queue | ||
| 39 | + | ||
| 40 | + my %{service_id}{QueueName} = $QueueServiceObject->GetServiceList( | ||
| 41 | + QueueID => 123, | ||
| 42 | + ); | ||
| 43 | + | ||
| 44 | +=cut | ||
| 45 | +sub GetServiceList { | ||
| 46 | + my ( $Self, %Param ) = @_; | ||
| 47 | + my %result = (); | ||
| 48 | + | ||
| 49 | + for (qw(QueueID)) { | ||
| 50 | + if ( !$Param{$_} ) { | ||
| 51 | + $Kernel::OM->Get("Kernel::Output::HTML::Layout")->FatalError( Message => Dumper( \%Param ) . "got no $_!" ); | ||
| 52 | + } | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + $Kernel::OM->Get("Kernel::System::DB")->Prepare( | ||
| 56 | + SQL => " | ||
| 57 | + select | ||
| 58 | + a.service_id id, | ||
| 59 | + b.name Name | ||
| 60 | + from | ||
| 61 | + queue_service a | ||
| 62 | + inner join service b on(b.id = a.service_id) | ||
| 63 | + where | ||
| 64 | + a.queue_id = ?", | ||
| 65 | + Bind => [ \$Param{QueueID} ] | ||
| 66 | + ); | ||
| 67 | + | ||
| 68 | + while ( my @row = $Kernel::OM->Get("Kernel::System::DB")->FetchrowArray() ) { | ||
| 69 | + $result{ $row[0] } = $row[1]; | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + return %result; | ||
| 73 | +} | ||
| 74 | + | ||
| 75 | +=item GetQueueList() | ||
| 76 | + | ||
| 77 | +Get list of queues for a service | ||
| 78 | + | ||
| 79 | + my %{queue_id}{QueueName} = $QueueServiceObject->GetQueueList( | ||
| 80 | + ServiceID => 123, | ||
| 81 | + ); | ||
| 82 | + | ||
| 83 | +=cut | ||
| 84 | +sub GetQueueList { | ||
| 85 | + my ( $Self, %Param ) = @_; | ||
| 86 | + my %result = (); | ||
| 87 | + | ||
| 88 | + for (qw(ServiceID)) { | ||
| 89 | + if ( !$Param{$_} ) { | ||
| 90 | + $Kernel::OM->Get("Kernel::Output::HTML::Layout")->FatalError( Message => Dumper( \%Param ) . "got no $_!" ); | ||
| 91 | + } | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + $Kernel::OM->Get("Kernel::System::DB")->Prepare( | ||
| 95 | + SQL => " | ||
| 96 | + select | ||
| 97 | + a.queue_id id, | ||
| 98 | + b.name Name | ||
| 99 | + from | ||
| 100 | + queue_service a | ||
| 101 | + inner join queue b on(b.id = a.queue_id) | ||
| 102 | + where | ||
| 103 | + a.service_id = ?", | ||
| 104 | + Bind => [ \$Param{ServiceID} ] | ||
| 105 | + ); | ||
| 106 | + | ||
| 107 | + while ( my @row = $Kernel::OM->Get("Kernel::System::DB")->FetchrowArray() ) { | ||
| 108 | + $result{ $row[0] } = $row[1]; | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + return %result; | ||
| 112 | +} | ||
| 113 | + | ||
| 114 | + | ||
| 115 | +=item SetQueueServices() | ||
| 116 | + | ||
| 117 | +Defines the list of services for a queue | ||
| 118 | + | ||
| 119 | + $QueueServiceObject->SetQueueServices( | ||
| 120 | + QueueID => 123, | ||
| 121 | + Services => @ServiceIDs | ||
| 122 | + ); | ||
| 123 | + | ||
| 124 | +=cut | ||
| 125 | +sub SetQueueServices { | ||
| 126 | + my ( $Self, %Param ) = @_; | ||
| 127 | + my %result = (); | ||
| 128 | + | ||
| 129 | + for (qw(QueueID Services)) { | ||
| 130 | + if ( !$Param{$_} ) { | ||
| 131 | + $Kernel::OM->Get("Kernel::Output::HTML::Layout")->FatalError( Message => Dumper( \%Param ) . "got no $_!" ); | ||
| 132 | + } | ||
| 133 | + } | ||
| 134 | + | ||
| 135 | + my $QueueID = $Param{"QueueID"}; | ||
| 136 | + my @Services = @{$Param{"Services"}}; | ||
| 137 | + | ||
| 138 | + $Kernel::OM->Get("Kernel::System::DB")->Do( | ||
| 139 | + SQL => "delete from queue_service where queue_id = ?", | ||
| 140 | + Bind => [ \$Param{QueueID} ] | ||
| 141 | + ); | ||
| 142 | + | ||
| 143 | + for my $service (@Services) { | ||
| 144 | + $Kernel::OM->Get("Kernel::System::DB")->Do( | ||
| 145 | + SQL => "insert into queue_service(queue_id,service_id) values (?,?)", | ||
| 146 | + Bind => [\$Param{QueueID}, \$service] | ||
| 147 | + ); | ||
| 148 | + | ||
| 149 | + } | ||
| 150 | +} | ||
| 151 | + | ||
| 152 | +=item SetServiceQueues() | ||
| 153 | + | ||
| 154 | +Defines the list of services for a queue | ||
| 155 | + | ||
| 156 | + $QueueServiceObject->SetServiceQueues( | ||
| 157 | + ServiceID => 123, | ||
| 158 | + Queues => @ServiceIDs | ||
| 159 | + ); | ||
| 160 | + | ||
| 161 | +=cut | ||
| 162 | +sub SetServiceQueues { | ||
| 163 | + my ( $Self, %Param ) = @_; | ||
| 164 | + my %result = (); | ||
| 165 | + | ||
| 166 | + for (qw(ServiceID Queues)) { | ||
| 167 | + if ( !$Param{$_} ) { | ||
| 168 | + $Kernel::OM->Get("Kernel::Output::HTML::Layout")->FatalError( Message => Dumper( \%Param ) . "got no $_!" ); | ||
| 169 | + } | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + my $ServiceID = $Param{"ServiceID"}; | ||
| 173 | + my @Queues = @{$Param{"Queues"}}; | ||
| 174 | + | ||
| 175 | + $Kernel::OM->Get("Kernel::System::DB")->Do( | ||
| 176 | + SQL => "delete from queue_service where service_id = ?", | ||
| 177 | + Bind => [ \$Param{ServiceID} ] | ||
| 178 | + ); | ||
| 179 | + | ||
| 180 | + for my $queue (@Queues) { | ||
| 181 | + $Kernel::OM->Get("Kernel::System::DB")->Do( | ||
| 182 | + SQL => "insert into queue_service(queue_id,service_id) values (?,?)", | ||
| 183 | + Bind => [\$queue, \$Param{ServiceID}] | ||
| 184 | + ); | ||
| 185 | + | ||
| 186 | + } | ||
| 187 | +} | ||
| 188 | + | ||
| 189 | + | ||
| 190 | +1; |
| @@ -0,0 +1,52 @@ | @@ -0,0 +1,52 @@ | ||
| 1 | +<?xml version="1.0" encoding="utf-8" ?> | ||
| 2 | +<otrs_package version="1.0"> | ||
| 3 | + <Name>QueueService</Name> | ||
| 4 | + <Version>1.3.0</Version> | ||
| 5 | + <Framework>6.0.x</Framework> | ||
| 6 | + <Vendor>SeTIC</Vendor> | ||
| 7 | + <URL>http://setic.ufsc.br</URL> | ||
| 8 | + <License>AGPL</License> | ||
| 9 | + | ||
| 10 | + <ChangeLog Version="1.0.0" Date="2014-06-01">First Version</ChangeLog> | ||
| 11 | + <ChangeLog Version="1.1.0" Date="2015-01-06">Support for OTRS 4</ChangeLog> | ||
| 12 | + <ChangeLog Version="1.2.0" Date="2016-01-06">Support for OTRS 5.0.x</ChangeLog> | ||
| 13 | + <ChangeLog Version="1.3.0" Date="2017-01-03">Support for OTRS 6.0.x</ChangeLog> | ||
| 14 | + | ||
| 15 | + <Description>Services per queue association. Support module used by other modules.</Description> | ||
| 16 | + <Description Lang="pt_BR">Associação entre serviços e filas. Módulo de suporte utilizado por outros módulos.</Description> | ||
| 17 | + | ||
| 18 | + | ||
| 19 | + <BuildDate>?</BuildDate> | ||
| 20 | + <BuildHost>?</BuildHost> | ||
| 21 | + | ||
| 22 | + <IntroInstall Type="post" Title="Thank you"><![CDATA[ | ||
| 23 | + Module installed successfully!<BR/><BR/> | ||
| 24 | + ]]></IntroInstall> | ||
| 25 | + | ||
| 26 | + <IntroInstall Type="post" Lang="pt_BR" Title="Obrigado"><![CDATA[ | ||
| 27 | + Módulo instalado com sucesso!<BR/><BR/> | ||
| 28 | + ]]></IntroInstall> | ||
| 29 | + | ||
| 30 | + <Filelist> | ||
| 31 | + <File Permission="644" Location="Kernel/Config/Files/XML/QueueService.xml"></File> | ||
| 32 | + <File Permission="644" Location="Kernel/Language/pt_BR_QueueService.pm"></File> | ||
| 33 | + <File Permission="644" Location="Kernel/Modules/QueueService.pm"></File> | ||
| 34 | + <File Permission="644" Location="Kernel/Output/HTML/Templates/Standard/QueueService.tt"></File> | ||
| 35 | + <File Permission="644" Location="Kernel/Output/HTML/Templates/Standard/QueueServiceChange.tt"></File> | ||
| 36 | + <File Permission="644" Location="Kernel/System/QueueService.pm"></File> | ||
| 37 | + <File Permission="644" Location="var/httpd/htdocs/js/QueueService.js"></File> | ||
| 38 | + </Filelist> | ||
| 39 | + <DatabaseInstall> | ||
| 40 | + <TableCreate Name="queue_service"> | ||
| 41 | + <Column Name="id" Required="true" PrimaryKey="true" AutoIncrement="true" Type="int"/> | ||
| 42 | + <Column Name="service_id" Required="true" Type="int"/> | ||
| 43 | + <Column Name="queue_id" Required="true" Type="int"/> | ||
| 44 | + <ForeignKey ForeignTable="service"> | ||
| 45 | + <Reference Local="service_id" Foreign="id"/> | ||
| 46 | + </ForeignKey> | ||
| 47 | + <ForeignKey ForeignTable="queue"> | ||
| 48 | + <Reference Local="queue_id" Foreign="id"/> | ||
| 49 | + </ForeignKey> | ||
| 50 | + </TableCreate> | ||
| 51 | + </DatabaseInstall> | ||
| 52 | +</otrs_package> |
| @@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
| 1 | +/** | ||
| 2 | + * QueueService module | ||
| 3 | + * | ||
| 4 | + * Copyright (C) 2014-2018 - SeTIC - UFSC - http://setic.ufsc.br/ | ||
| 5 | + * | ||
| 6 | + * Version 2018-01-03 - Conversion to JS Module, to support OTRS 6 | ||
| 7 | + * | ||
| 8 | + */ | ||
| 9 | +var Core = Core || {}; | ||
| 10 | +Core.Agent = Core.Agent || {}; | ||
| 11 | +Core.Agent.Admin = Core.Agent.Admin || {}; | ||
| 12 | + | ||
| 13 | +Core.Agent.Admin.QueueService = (function (TargetNS) { | ||
| 14 | + | ||
| 15 | + TargetNS.Init = function() { | ||
| 16 | + Core.UI.Table.InitTableFilter($('#FilterServices'), $('#Services')); | ||
| 17 | + Core.UI.Table.InitTableFilter($('#FilterQueues'), $('#Queues')); | ||
| 18 | + } | ||
| 19 | + | ||
| 20 | + Core.Init.RegisterNamespace(TargetNS, 'APP_MODULE'); | ||
| 21 | + | ||
| 22 | + return TargetNS; | ||
| 23 | + | ||
| 24 | +}(Core.Agent.Admin.QueueService || {})); | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |