1# --
2# Copyright (C) 2001-2020 OTRS AG, https://otrs.com/
3# --
4# This software comes with ABSOLUTELY NO WARRANTY. For details, see
5# the enclosed file COPYING for license information (GPL). If you
6# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
7# --
8
9package Kernel::Output::HTML::ToolBar::TicketWatcher;
10
11use parent 'Kernel::Output::HTML::Base';
12
13use strict;
14use warnings;
15
16use Kernel::Language qw(Translatable);
17
18our @ObjectDependencies = (
19    'Kernel::Config',
20    'Kernel::Output::HTML::Layout',
21    'Kernel::System::Group',
22    'Kernel::System::Log',
23    'Kernel::System::Ticket',
24);
25
26sub Run {
27    my ( $Self, %Param ) = @_;
28
29    # get config object
30    my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
31
32    # check if feature is active
33    return if !$ConfigObject->Get('Ticket::Watcher');
34
35    # check needed stuff
36    for (qw(Config)) {
37        if ( !$Param{$_} ) {
38            $Kernel::OM->Get('Kernel::System::Log')->Log(
39                Priority => 'error',
40                Message  => "Need $_!"
41            );
42            return;
43        }
44    }
45
46    return if !$ConfigObject->Get('Frontend::Module')->{AgentTicketWatchView};
47
48    # get layout object
49    my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
50
51    # check access
52    my @Groups;
53    if ( $ConfigObject->Get('Ticket::WatcherGroup') ) {
54        @Groups = @{ $ConfigObject->Get('Ticket::WatcherGroup') };
55    }
56    if (@Groups) {
57        my $Access      = 0;
58        my $GroupObject = $Kernel::OM->Get('Kernel::System::Group');
59        GROUP:
60        for my $Group (@Groups) {
61            my $HasPermission = $GroupObject->PermissionCheck(
62                UserID    => $Self->{UserID},
63                GroupName => $Group,
64                Type      => 'rw',
65            );
66            if ($HasPermission) {
67                $Access = 1;
68                last GROUP;
69            }
70        }
71
72        # return on no access
73        return if !$Access;
74    }
75
76    # get ticket object
77    my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
78
79    # find watched tickets
80    my $Count = $TicketObject->TicketSearch(
81        Result       => 'COUNT',
82        WatchUserIDs => [ $Self->{UserID} ],
83        UserID       => 1,
84        Permission   => 'ro',
85    ) || 0;
86    my $CountNew = $TicketObject->TicketSearch(
87        Result       => 'COUNT',
88        WatchUserIDs => [ $Self->{UserID} ],
89        TicketFlag   => {
90            Seen => 1,
91        },
92        TicketFlagUserID => $Self->{UserID},
93        UserID           => 1,
94        Permission       => 'ro',
95    ) || 0;
96    $CountNew = $Count - $CountNew;
97
98    my $CountReached = $TicketObject->TicketSearch(
99        Result                        => 'COUNT',
100        StateType                     => ['pending reminder'],
101        WatchUserIDs                  => [ $Self->{UserID} ],
102        TicketPendingTimeOlderMinutes => 1,
103        UserID                        => 1,
104        Permission                    => 'ro',
105    ) || 0;
106
107    my $Class        = $Param{Config}->{CssClass};
108    my $ClassNew     = $Param{Config}->{CssClassNew};
109    my $ClassReached = $Param{Config}->{CssClassReached};
110
111    my $Icon        = $Param{Config}->{Icon};
112    my $IconNew     = $Param{Config}->{IconNew};
113    my $IconReached = $Param{Config}->{IconReached};
114
115    my $URL = $LayoutObject->{Baselink};
116    my %Return;
117    my $Priority = $Param{Config}->{Priority};
118    if ($CountNew) {
119        $Return{ $Priority++ } = {
120            Block       => 'ToolBarItem',
121            Description => Translatable('Watched Tickets New'),
122            Count       => $CountNew,
123            Class       => $ClassNew,
124            Icon        => $IconNew,
125            Link        => $URL . 'Action=AgentTicketWatchView;Filter=New',
126            AccessKey   => $Param{Config}->{AccessKeyNew} || '',
127        };
128    }
129    if ($CountReached) {
130        $Return{ $Priority++ } = {
131            Block       => 'ToolBarItem',
132            Description => Translatable('Watched Tickets Reminder Reached'),
133            Count       => $CountReached,
134            Class       => $ClassReached,
135            Icon        => $IconReached,
136            Link        => $URL . 'Action=AgentTicketWatchView;Filter=ReminderReached',
137            AccessKey   => $Param{Config}->{AccessKeyReached} || '',
138        };
139    }
140    if ($Count) {
141        $Return{ $Priority++ } = {
142            Block       => 'ToolBarItem',
143            Description => Translatable('Watched Tickets Total'),
144            Count       => $Count,
145            Class       => $Class,
146            Icon        => $Icon,
147            Link        => $URL . 'Action=AgentTicketWatchView',
148            AccessKey   => $Param{Config}->{AccessKey} || '',
149        };
150    }
151    return %Return;
152}
153
1541;
155