From 9cb57fe77660b1e97ab6b1814c0dc80cac5b4ad6 Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" Date: Sun, 22 Jul 2018 18:49:06 -0700 Subject: [PATCH] Complete script, improving error messages. --- scripts/rt-outreachy-payment-next.plx | 95 +++++++++++++++++++++++++-- 1 file changed, 90 insertions(+), 5 deletions(-) diff --git a/scripts/rt-outreachy-payment-next.plx b/scripts/rt-outreachy-payment-next.plx index 8bb6ef8..6864c7f 100755 --- a/scripts/rt-outreachy-payment-next.plx +++ b/scripts/rt-outreachy-payment-next.plx @@ -12,7 +12,7 @@ use File::Spec; use Date::Manip qw(ParseDate UnixDate); my($PAYMENT_DIR, $VERBOSE, $INTERACTIVE, $PAYMENT_NUMBER, $RT_CMD, $INVOICE_LINE, $INTERN_SUCCESS_FILE, - $INTERN_FAIL_FILE); + $INTERN_FAIL_FILE, $LEDGER_ENTRY_DATE, $SVN_CMD); ############################################################################### sub FindUniqueTicket(@) { @@ -66,6 +66,22 @@ sub LedgerTagFromTicket($$) { return $tagValue; } ############################################################################### +sub AllFormattedLedgerTagFromTicket($) { + my($ticketSpec) = @_; + my @tags; + open(my $rtLedgerTagsFH, "-|", "$RT_CMD", "show", "-f", 'CF.{ledger-tags}', $ticketSpec); + my $tagValue; + my $start = 0; + while (my $tagsLine = <$rtLedgerTagsFH>) { + $start = 1 if $tagsLine =~ s/^\s*CF.{ledger-tags}\s*:\s+//; + next unless $start; + $tagsLine =~ s/^\s*//; + push(@tags, " $tagsLine"); + } + close $rtLedgerTagsFH; + return @tags; +} +############################################################################### sub GetLinksForTicket($) { my($ticketSpec) = @_; my @linked; @@ -150,12 +166,18 @@ sub GetCustomFieldForTicket($$) { GetOptions("paymentDir=s" => \$PAYMENT_DIR, "verbose=i" => \$VERBOSE, "interactive" => \$INTERACTIVE, "paymentNumber=i" => \$PAYMENT_NUMBER, "rtCommand=s" => \$RT_CMD, "invoiceLine=s" => \$INVOICE_LINE, "internSuccessFile=s", \$INTERN_SUCCESS_FILE, - "internFailFile=s", \$INTERN_FAIL_FILE); + "internFailFile=s", \$INTERN_FAIL_FILE, 'ledgerEntryDate=s' => \$LEDGER_ENTRY_DATE, + "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; +unless (defined $LEDGER_ENTRY_DATE and $LEDGER_ENTRY_DATE =~ /^[\d\-]+$/) { + print STDERR "usage: $0 --ledgerEntryDate= option is required and must be in ISO 8601 format\n"; + exit 1; +} unless (defined $INVOICE_LINE and $INVOICE_LINE =~ /^rt.*/) { print STDERR "usage: $0 --invoiceLine= option is required and must match an RT spec\n"; exit 1; @@ -228,7 +250,7 @@ while (my $file = readdir $dh) { } if (not defined $ticket) { if (not $INTERACTIVE) { - print STDERR "\"$file\": Skipped: unable to to find a matching ticket.\n"; + print STDERR "\"$file\": TICKET-NOT-FOUND: Skipped: unable to to find a matching ticket.\n"; next; } else { # FIXME: prompt for ticket @@ -237,7 +259,7 @@ while (my $file = readdir $dh) { } my $completedInternshipField = GetCustomFieldForTicket($ticket, "completed-internship"); if (not defined $completedInternshipField) { - print STDERR "\"$file\": \"$ticket\": Skipping: cannot determine Entity from ticket.\n" ; + print STDERR "\"$file\": \"$ticket\": FIELD-NOT-FOUND: Skipping: cannot determine Entity from ticket.\n" ; next; } elsif ($completedInternshipField eq 'successful') { # Don't print to STDERR here, just keep a count since these are "old interns" @@ -246,7 +268,7 @@ while (my $file = readdir $dh) { } my $entity = LedgerTagFromTicket($ticket, 'Entity'); if (not defined $entity) { - print STDERR "\"$file\": \"$ticket\": Skipping: cannot determine Entity from ticket.\n" ; + print STDERR "\"$file\": \"$ticket\": ENTITY-NOT-FOUND: Skipping: cannot determine Entity from ticket.\n" ; next; } @@ -319,6 +341,69 @@ while (my $file = readdir $dh) { "ticket is in status \"$mainTicketStatus\" instead of \"needs-project-ok\"\n"; next; } + print STDERR "\"$file\": \"$ticket\": processing to payment $PAYMENT_NUMBER state... "; + my $successString = ($pass) ? "success" : "failed"; + my $repositoryFile = File::Spec->catfile($PAYMENT_DIR, $mentorDate . "_" . $entity . '_' . $successString . '-report.mbox'); + my $approvalTag = $repositoryFile; + $approvalTag =~ s%^.*(Projects/Outreachy/.*)$%$1%; + $approvalTag = " ;Approval: $approvalTag"; + + rename(File::Spec->catfile($PAYMENT_DIR, $file), $repositoryFile); + system($SVN_CMD, "add", $repositoryFile); + open(my $rtCorrespondFH, "|-", $RT_CMD, 'correspond', $ticket, '-m', '-'); + my @dd; + foreach my $line (@{$internCorrespond{$successString}}) { + $line =~ s/FIXME_PAYMENT_NUMBER/$PAYMENT_NUMBER/g; + $line =~ s/FIXME_MENTOR_DATE/$mentorDate/g; + push(@dd, $line); + } + print $rtCorrespondFH @dd; + close $rtCorrespondFH; + + my $invoiceTicket = $INVOICE_LINE; + $invoiceTicket =~ s%^.*ticket/(\d+).*$%$1%; + my $num = $ticket; $num =~ s%^.*ticket/(\d+).*$%$1%; + system($RT_CMD, 'link', $invoiceTicket, 'refersto', $num); + + if ($pass) { + open(my $rtCommentFH, "|-", $RT_CMD, 'comment', $ticket, '-m', '-'); + print $rtCommentFH " ;Invoice: $INVOICE_LINE\n"; + close $rtCommentFH; + system($RT_CMD, "edit", $ticket, 'set', 'CF.{completed-internship}=payment-' . $PAYMENT_NUMBER . '-approved', + 'Status=open'); + my($leftA, $rightA); + if ($PAYMENT_NUMBER == 1) { + $leftA = ' $-500.00'; $rightA = ' $500.00'; + } elsif ($PAYMENT_NUMBER == 2) { + $leftA = '$-2,250.00'; $rightA = '$2,250.00'; + } elsif ($PAYMENT_NUMBER == 3) { + $leftA = '$-2,750.00'; $rightA = '$2,750.00'; + } + my(@tags) = AllFormattedLedgerTagFromTicket($ticket); + open(my $ledgerEntryFH, ">>", File::Spec->catfile($PAYMENT_DIR, "entry.ledger")); + print $ledgerEntryFH <; } print STDERR "Old Interns, who were marked as successful (likely from previous interns) ignored: $oldInterns\n"; ###############################################################################