Tom Phoenix wrote:
> On 7/1/07, Mathew Snyder <[EMAIL PROTECTED]> wrote:
> 
>> The problem didn't surface until I went from using the %tikSubj hash
>> seen near
>> the top of the code snippet to a multi-level hash.  But then, using
>> %tikSubj
>> presents its own bug for some reason.
> 
> One tricky bit about using formats is that the variables you're
> interpolating into a format have to be in scope when the format is
> compiled. If there's no lexical ("my") variable of the given name, the
> format uses the global of the same name.
> 
> That doesn't seem especially likely with the given source code,
> though. Have you tried using the debugger? And you are using both
> "strict" and "warnings"?
> 
> Good luck with it!
> 
> --Tom Phoenix
> Stonehenge Perl Training
> 

Yeah, I started to use the debugger but the test system I'm using to
test this is so dang slow that I lost my interest and moved on to simply
trying to tool around with the code.  Probably not the best debugging
approach.  I've attached the actual script for perusal.

You'll see another hash called %tikSubj.  Initially, I used this instead
of the longer %tickets hash and had %tickets store the summed up time
under the {$id}.  This posed it's own problems in that only a few of the
ticket subjects would subsequently be printed out.  That part I've
driven myself insane trying to figure out.

The problem with the format didn't arise until I switched from the
%tikSubj hash to the longer %tickets hash.

Mathew
Keep up with my goings on at http://theillien.blogspot.com
#!/usr/bin/perl

#######################################################
#  Name:     ticket_list.pl
#  version:  1.4.1
#  Date:     May 29, 2007
#  Author:   Mathew Snyder
#  Comments: A script which gathers the tickets
#                        worked on by each person in Ops and
#                        Engineering during the prior week.
#                        It places them in individual files for
#                        each user.  It then emails them to each
#                        person that has requested it.
#######################################################

use warnings;
use strict;
use lib '/usr/local/rt-3.6.3/lib';
use lib '/usr/local/rt-3.6.3/local/lib';
use lib '/usr/local/lib';
use RT;
use RT::Tickets;
use RT::Users;
use Reports::Dates;
use MIME::Lite;

RT::LoadConfig();
RT::Init();

# Declare our global variables
#my @users = qw/sveirs rbates msnyder mhanson mclemson koporto jgoode jcurran 
dsd datreides cwhite/;
my @users = qw/msnyder/;
my (%tickets, %tikSubj);

# These are dates which will be either searched against or inserted into the 
email
my $startDate   = startDate;
my $endDate     = endDate;
my $searchStart = searchStart;
my $searchEnd   = searchEnd;
my @searchDate  = Reports::Dates::searchDate;

my $tix = new RT::Tickets(RT::SystemUser);
$tix->FromSQL('LastUpdated >= "' . $searchStart. '" AND LastUpdated <= "' . 
$searchEnd . '"');

# gather up all of the tickets, transactions, and time for each user and 
successively place 
# all data into a HoHoH working down from user to environment to ticket
# we go through each date in the range individually so we can make sure we only 
get the transactions that
# have been added during the date range
foreach my $date (@searchDate) {
        while (my $ticket = $tix->Next) {
                $tikSubj{$ticket->id} = $ticket->Subject;
                my $subject = $ticket->Subject;
                my $id = $ticket->id;
                my $env = $ticket->FirstCustomFieldValue('Environment');
                my $transactions = $ticket->Transactions;
                while (my $transaction  = $transactions->Next) {
                        my $creator     = $transaction->CreatorObj;
                        my $user = $creator->Name;
                        # we need to make sure the transaction is in the date 
range requested
                        # it's set up like this so we can chop the timestamp 
off of the Created string  
                        (my $checkDate  = $transaction->Created) =~ s/\s.*$//;

                        # we only want transactions that are within the date 
range, have TimeWorked
                        # set, and the creator of which is one of the actual 
users and not someone 
                        # that was created upon ticket submission or Cc addition
                        next unless (($checkDate eq $date) && 
($creator->Privileged) && ($transaction->TimeTaken));

                        # if all of the above stipulations are met add the time 
worked to the hash
                #       $tickets{$user}{$env}{$id} += $transaction->TimeTaken;
                        $tickets{$user}{$env}{$id}{$subject} += 
$transaction->TimeTaken;
                }
        }
}

# Format the time spent on each ticket as hh:mm
foreach my $user (keys %tickets) {
        foreach my $env (keys %{ $tickets{$user} }) {
                foreach my $tikID (keys %{ $tickets{$user}{$env} }) {
                        foreach my $subject (keys %{ 
$tickets{$user}{$env}{$tikID} }) {
                                my @endTime;
#                               my $temp          = 
$tickets{$user}{$env}{$tikID};
                                my $temp          = 
$tickets{$user}{$env}{$tikID}{$subject};
                                my $temp2         = $temp / 60;
                                my @temp          = split /\./, $temp2;
                                $endTime[0]       = $temp[0];
                                $endTime[1]       = $temp % 60;
#                               $tickets{$user}{$env}{$tikID} = sprintf 
'%d:%02d', @endTime[0,1];
                                $tickets{$user}{$env}{$tikID}{$subject} = 
sprintf '%d:%02d', @endTime[0,1];
                        }
                }
        }
}

mkdir "/work_reports/ticketlists/ticketlists_$endDate", 0777;

foreach my $user (keys %tickets) {
        open TIMESHEET, 
">/work_reports/ticketlists/ticketlists_$endDate/ticketlist_$user" . "_" . 
"$endDate.txt" or die "Can't open file: $!";
        print TIMESHEET "List of tickets worked on by $user during week ending 
$endDate", "\n\n";

        # Print the header for our data using preset formats.  They are offset 
the way they are due to the
        # requirement that the closing "." be in the first column of the 
script.  All lines have subsequently
        # been aligned similarly so as not to confuse anyone regarding the 
association.  I would have
        # declared them earlier in the script but due to the use of scoped 
variables the compilation
        # will fail if I do.
        foreach my $env (sort keys %{ $tickets{$user} }){

format TIMESHEET_TOP =
@<<<<<<<<<<<<<<<<<<<<
$env
 Ticket ID                      Subject                      hh:mm
------------------------------------------------------------------
.

                write TIMESHEET_TOP;

                foreach my $id (sort keys %{ $tickets{$user}{$env} }) {
                        foreach my $subject (keys %{ $tickets{$user}{$env}{$id} 
}) {
format TIMESHEET =
@#########  ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  @>>>>
           $id, $tickets{$user}{$env}{$id},                      
$tickets{$user}{$env}{$id}{$subject}
~~          ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            $tickets{$user}{$env}{$id}
.

                                write TIMESHEET;
                        }
                        print TIMESHEET "\n";
                }
                #print TIMESHEET "\n";
        }
}

close TIMESHEET;

# build and send the ticket lists for everyone in the "mailing list"
foreach my $user (@users) {
        my $emailTo      = "[EMAIL PROTECTED]";
        my $emailFrom    = "RT-Devel";
        my $emailSubj    = "RT Ticket List for The Week Ending $endDate";
        my $emailMsg     = "Attached is a file containing a list of tickets 
worked on by you during the last week.  If you made a comment on a ticket but 
did not add any time it will not show up.  Only tickets on which you've 
actually marked down time worked will appear in this list.\n\nFor some reason, 
some ticket subjects are not being inserted into the report.  I have yet to 
figure out why.  Rest assured, thought, that I am working on sorting that out.  
In the meantime, please enjoy the alterations that were requested.  :)";

        my $fullEmail    = new MIME::Lite(From    => $emailFrom,
                                          To      => $emailTo,
                                          Subject => $emailSubj,
                                          Type    => "multipart/mixed");

        $fullEmail->attach(Type        => "TEXT",
                           Data        => $emailMsg);

        $fullEmail->attach(Type        => "text/plain",
                           Path        => 
"/work_reports/ticketlists/ticketlists_$endDate/ticketlist_$user" . "_" . 
"$endDate.txt",
                           Disposition => "attachment");

        $fullEmail->send("sendmail", "/usr/sbin/sendmail -t");
}

exit;

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/

Reply via email to