#!/usr/bin/perl # Copyright © 2018, Bradley M. Kuhn # License: AGPL-3.0-or-later use strict; use warnings; use autodie qw(:all); use Getopt::Long; use File::Spec; use Date::Manip qw(ParseDate UnixDate); my($VERBOSE, $INTERACTIVE, $RT_CMD, $SVN_CMD); ############################################################################### sub TicketIDsReadyForPayment () { my @ticketSpecs; open(my $rtLsFH, "-|", "$RT_CMD", "ls", "-i", "Status = 'ready-for-payment'"); while (my $lsLine = <$rtLsFH>) { chomp $lsLine; push(@ticketSpecs, $lsLine); } close $rtLsFH; return @ticketSpecs; } ############################################################################### sub FindMostRecentPaymentMethodForTicket ($) { my($ticketSpec) = @_; my $paymentMethod; $ticketSpec =~ s%^\s*ticket\s*/\s*%%; open(my $rtShowFH, "-|", "$RT_CMD", "show", $ticketSpec); while (my $showLine = <$rtShowFH>) { print STDERR "rt show line for $ticketSpec: $showLine" if ($VERBOSE >= 10); $paymentMethod = lc($1) if ($showLine =~ /^\s*PAYMENT\s+METHOD\s*:\s*(.*?)\s*$/); # don't 'last' when found as we want the last one. } close $rtShowFH; return $paymentMethod; } ############################################################################### GetOptions("verbose=i" => \$VERBOSE, "interactive" => \$INTERACTIVE, "rtCommand=s" => \$RT_CMD, "svnCommand=s" => \$SVN_CMD); $RT_CMD = '/usr/bin/rt' unless defined $RT_CMD; $SVN_CMD = '/usr/bin/svn' unless defined $SVN_CMD; $INTERACTIVE = 0 if not defined $INTERACTIVE; my @ticketSpecs = TicketIDsReadyForPayment(); my %payments; foreach my $ticketSpec (@ticketSpecs) { my $paymentMethod = FindMostRecentPaymentMethodForTicket($ticketSpec); die "Cannot find payment method for ticket, $ticketSpec" unless defined $paymentMethod; push(@{$payments{$paymentMethod}}, $ticketSpec); } foreach my $paymentMethod (sort { $a cmp $b } keys %payments) { print "$paymentMethod: Count: ", scalar(@{$payments{$paymentMethod}}), "\n"; print " Tickets: ", join(", ", map { s%^\s*ticket\s*/\s*%%; $_; } @{$payments{$paymentMethod}}), "\n"; } ############################################################################### # # Local variables: # compile-command: "perl -c rt-bulk-prep-pay.plx" # perl-indent-level: 2 # End: