summaryrefslogtreecommitdiff
path: root/rt/lib
diff options
context:
space:
mode:
Diffstat (limited to 'rt/lib')
-rw-r--r--rt/lib/RT/Search/UnrepliedTickets.pm69
-rw-r--r--rt/lib/RT/Ticket_Vendor.pm23
2 files changed, 92 insertions, 0 deletions
diff --git a/rt/lib/RT/Search/UnrepliedTickets.pm b/rt/lib/RT/Search/UnrepliedTickets.pm
new file mode 100644
index 000000000..032898391
--- /dev/null
+++ b/rt/lib/RT/Search/UnrepliedTickets.pm
@@ -0,0 +1,69 @@
+=head1 NAME
+
+ RT::Search::UnrepliedTickets
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+Find all unresolved tickets owned by the current user where the last
+correspondence from a requestor (or ticket creation) is more recent than the
+last correspondence from a non-requestor (if there is any).
+
+=head1 METHODS
+
+=cut
+
+package RT::Search::UnrepliedTickets;
+
+use strict;
+use warnings;
+use base qw(RT::Search);
+
+
+sub Describe {
+ my $self = shift;
+ return ($self->loc("Tickets awaiting a reply"));
+}
+
+sub Prepare {
+ my $self = shift;
+
+ my $TicketsObj = $self->TicketsObj;
+ # if SystemUser does this search (as in QueueSummaryByLifecycle), they
+ # should get all tickets regardless of ownership
+ if ($TicketsObj->CurrentUser->id != RT->SystemUser->id) {
+ $TicketsObj->Limit(
+ FIELD => 'Owner',
+ VALUE => $TicketsObj->CurrentUser->id
+ );
+ }
+ foreach my $status (qw(resolved rejected deleted)) {
+ $TicketsObj->Limit(
+ FIELD => 'Status',
+ OPERATOR => '!=',
+ ENTRYAGGREGATOR => 'AND',
+ VALUE => $status,
+ );
+ }
+ my $txn_alias = $TicketsObj->JoinTransactions;
+ $TicketsObj->Limit(
+ ALIAS => $txn_alias,
+ FIELD => 'Created',
+ OPERATOR => '>',
+ VALUE => 'COALESCE(main.Told,\'1970-01-01\')',
+ QUOTEVALUE => 0,
+ );
+ $TicketsObj->Limit(
+ ALIAS => $txn_alias,
+ FIELD => 'Type',
+ OPERATOR => 'IN',
+ VALUE => [ 'Correspond', 'Create' ],
+ );
+
+ return(1);
+}
+
+RT::Base->_ImportOverlays();
+
+1;
diff --git a/rt/lib/RT/Ticket_Vendor.pm b/rt/lib/RT/Ticket_Vendor.pm
index a55bb7b0d..4a7883888 100644
--- a/rt/lib/RT/Ticket_Vendor.pm
+++ b/rt/lib/RT/Ticket_Vendor.pm
@@ -92,5 +92,28 @@ sub WillResolveAsString {
return $self->WillResolveObj->AsString();
}
+=head2 IsUnreplied
+
+Returns true if there's a Correspond or Create transaction more recent than
+the Told date of this ticket (or the ticket has no Told date) and the ticket
+is not rejected or resolved.
+
+=cut
+
+sub IsUnreplied {
+ my $self = shift;
+ return 0 if $self->Status eq 'resolved'
+ or $self->Status eq 'rejected';
+
+ my $Told = $self->Told || '1970-01-01';
+ my $Txns = $self->Transactions;
+ $Txns->Limit(FIELD => 'Type',
+ OPERATOR => 'IN',
+ VALUE => [ 'Correspond', 'Create' ]);
+ $Txns->Limit(FIELD => 'Created',
+ OPERATOR => '>',
+ VALUE => $Told);
+ $Txns->Count ? 1 : 0;
+}
1;