diff options
author | jeff <jeff> | 2007-08-16 13:40:46 +0000 |
---|---|---|
committer | jeff <jeff> | 2007-08-16 13:40:46 +0000 |
commit | 1293d137b061f097190eda53e4e78214e18832e6 (patch) | |
tree | ba1a26cd005b31a4e5cdf12ba1264d6cd06e736e /FS/FS | |
parent | f20b5533fdb8f1f3510b5cf4efd1f4465f359420 (diff) |
support hours 'usage' tracking for our own internal use (#1733)
Diffstat (limited to 'FS/FS')
-rw-r--r-- | FS/FS/AccessRight.pm | 1 | ||||
-rw-r--r-- | FS/FS/ClientAPI/MyAccount.pm | 14 | ||||
-rw-r--r-- | FS/FS/Conf.pm | 7 | ||||
-rw-r--r-- | FS/FS/Schema.pm | 13 | ||||
-rw-r--r-- | FS/FS/cust_main.pm | 46 | ||||
-rw-r--r-- | FS/FS/svc_acct_rt_transaction.pm | 260 |
6 files changed, 341 insertions, 0 deletions
diff --git a/FS/FS/AccessRight.pm b/FS/FS/AccessRight.pm index fb7e538c2..4071e9730 100644 --- a/FS/FS/AccessRight.pm +++ b/FS/FS/AccessRight.pm @@ -203,6 +203,7 @@ tie my %rights, 'Tie::IxHash', ### 'Miscellaneous rights' => [ { rightname=>'Job queue', global=>1 }, + { rightname=>'Time queue', global=>1 }, { rightname=>'Process batches', global=>1 }, { rightname=>'Reprocess batches', global=>1 }, { rightname=>'Import', global=>1 }, #some of these are ag-virt'ed now? give em their own ACLs diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index 459558d61..32c37e9d4 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -120,6 +120,12 @@ sub customer_info { $return{balance} = $cust_main->balance; + $return{tickets} = [ ($cust_main->tickets) ]; + use Data::Dumper; + open(MYFILE, ">>/tmp/debugger"); + print MYFILE Dumper($return{tickets}); + close MYFILE; + my @open = map { { invnum => $_->invnum, @@ -149,6 +155,14 @@ sub customer_info { $return{'postal_invoicing'} = 0 < ( grep { $_ eq 'POST' } $cust_main->invoicing_list ); + if (scalar($conf->config('support_packages'))) { + my $support = 0; + foreach ($cust_main->support_services) { + $support += $_->svc_x->seconds; + } + $return{support_time} = (($support < 0) ? '-' : '' ). int(abs($support)/3600)."h".sprintf("%02d",(abs($support)%3600)/60)."m"; + } + } elsif ( $session->{'svcnum'} ) { #no customer record my $svc_acct = qsearchs('svc_acct', { 'svcnum' => $session->{'svcnum'} } ) diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 7f64058b8..e1fa0517a 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -2047,6 +2047,13 @@ httemplate/docs/config.html 'type' => 'checkbox', }, + { + 'key' => 'support_packages', + 'section' => '', + 'description' => 'A list of packages eligible for RT ticket time transfer', + 'type' => 'textarea', + }, + ); 1; diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index b7e754573..da264fa05 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -988,6 +988,19 @@ sub tables_hashref { 'index' => [ ['username'], ['domsvc'] ], }, + 'svc_acct_rt_transaction' => { + 'columns' => [ + 'svcrtid', 'int', '', '', '', '', + 'svcnum', 'int', '', '', '', '', + 'transaction_id', 'int', '', '', '', '', + '_date', @date_type, '', '', + 'seconds', 'int', '', '', '', '', #uhhhh + ], + 'primary_key' => 'svcrtid', + 'unique' => [], + 'index' => [ ['svcnum', 'transaction_id'] ], + }, + #'svc_charge' => { # 'columns' => [ # 'svcnum', 'int', '', '', diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index f437abe41..afcba0874 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -4620,6 +4620,52 @@ sub cust_statuscolor { $statuscolor{$self->cust_status}; } +=item tickets + +Returns an array of hashes representing the customer's RT tickets. + +=cut + +sub tickets { + my $self = shift; + + my $num = $conf->config('cust_main-max_tickets') || 10; + my @tickets = (); + + unless ( $conf->config('ticket_system-custom_priority_field') ) { + + @tickets = @{ FS::TicketSystem->customer_tickets($self->custnum, $num) }; + + } else { + + foreach my $priority ( + $conf->config('ticket_system-custom_priority_field-values'), '' + ) { + last if scalar(@tickets) >= $num; + push @tickets, + @{ FS::TicketSystem->customer_tickets( $self->custnum, + $num - scalar(@tickets), + $priority, + ) + }; + } + } + (@tickets); +} + +# Return services representing svc_accts in customer support packages +sub support_services { + my $self = shift; + my %packages = map { $_ => 1 } $conf->config('support_packages'); + + grep { $_->pkg_svc && $_->pkg_svc->primary_svc eq 'Y' } + grep { $_->part_svc->svcdb eq 'svc_acct' } + map { $_->cust_svc } + grep { exists $packages{ $_->pkgpart } } + $self->ncancelled_pkgs; + +} + =back =head1 CLASS METHODS diff --git a/FS/FS/svc_acct_rt_transaction.pm b/FS/FS/svc_acct_rt_transaction.pm new file mode 100644 index 000000000..0fb64456b --- /dev/null +++ b/FS/FS/svc_acct_rt_transaction.pm @@ -0,0 +1,260 @@ +package FS::svc_acct_rt_transaction; + +use strict; +use vars qw( @ISA ); +use FS::Record qw( qsearch qsearchs dbh ); + +@ISA = qw(FS::Record); + +=head1 NAME + +FS::svc_acct_rt_transaction - Object methods for svc_acct_rt_transaction records + +=head1 SYNOPSIS + + use FS::svc_acct_rt_transaction; + + $record = new FS::svc_acct_rt_transaction \%hash; + $record = new FS::svc_acct_rt_transaction { 'column' => 'value' }; + + $error = $record->insert; + + $error = $new_record->replace($old_record); + + $error = $record->delete; + + $error = $record->check; + +=head1 DESCRIPTION + +An FS::svc_acct_rt_transaction object represents an application of time +from a rt transaction to a svc_acct. FS::svc_acct_rt_transaction inherits from +FS::Record. The following fields are currently supported: + +=over 4 + +=item svcrtid - primary key + +=item svcnum - the svcnum of the svc_acct to which the time applies + +=item transaction_id - the id of the rt transtaction from which the time applies + +=item seconds - the amount of time which applies + + +=back + +=head1 METHODS + +=over 4 + +=item new HASHREF + +Creates a new svc_acct_rt_transaction. To add the example to the database, see L<"insert">. + +Note that this stores the hash reference, not a distinct copy of the hash it +points to. You can ask the object for a copy with the I<hash> method. + +=cut + +sub table { 'svc_acct_rt_transaction'; } + +=item insert + +Adds this record to the database. If there is an error, returns the error, +otherwise returns false. + +=cut + +sub insert { + my( $self, %options ) = @_; + + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $error = $self->SUPER::insert($options{options} ? %{$options{options}} : ()); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + my $svc_acct = qsearchs('svc_acct', {'svcnum' => $self->svcnum}); + unless ($svc_acct) { + $dbh->rollback if $oldAutoCommit; + return "Can't find svc_acct " . $self->svcnum; + } + + my $error = $svc_acct->decrement_seconds($self->seconds); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "Error incrementing service seconds: $error"; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + ''; + +} + + +=item delete + +Delete this record from the database. + +=cut + +sub delete { + my $self = shift; + + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $error = $self->SUPER::delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + my $svc_acct = qsearchs('svc_acct', {'svcnum' => $self->svcnum}); + unless ($svc_acct) { + $dbh->rollback if $oldAutoCommit; + return "Can't find svc_acct " . $self->svcnum; + } + + my $error = $svc_acct->increment_seconds($self->seconds); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "Error incrementing service seconds: $error"; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + ''; + +} + +=item replace OLD_RECORD + +Replaces the OLD_RECORD with this one in the database. If there is an error, +returns the error, otherwise returns false. + +=cut + +=item check + +Checks all fields to make sure this is a valid svc_acct_rt_transaction. If there is +an error, returns the error, otherwise returns false. Called by the insert +and replace methods. + +=cut + +sub check { + my $self = shift; + + my ($selfref) = $self->hashref; + + my $error = + $self->ut_numbern('svcrtid') + || $self->ut_numbern('svcnum') + || $self->ut_number('transaction_id') + || $self->ut_numbern('_date') + || $self->ut_snumber('seconds') + ; + return $error if $error; + + $self->_date(time) unless $self->_date; + + if ($selfref->{custnum}) { + my $conf = new FS::Conf; + my %packages = map { $_ => 1 } $conf->config('support_packages'); + my $cust_main = qsearchs('cust_main',{ 'custnum' => $selfref->{custnum} } ); + return "Invalid custnum: " . $selfref->{custnum} unless $cust_main; + + my (@svcs) = map { $_->svcnum } $cust_main->support_services; + return "svcnum ". $self->svcnum. " invalid for custnum ".$selfref->{custnum} + unless (!$self->svcnum || scalar(grep { $_ == $self->svcnum } @svcs)); + + $self->svcnum($svcs[0]) unless $self->svcnum; + return "Can't find support service for custnum ".$selfref->{custnum} + unless $self->svcnum; + } + + $self->SUPER::check; +} + +=item batch_insert SVC_ACCT_RT_TRANSACTION_OBJECT, ... + +Class method which inserts multiple time applications. Takes a list of +FS::svc_acct_rt_transaction objects. If there is an error inserting any +application, the entire transaction is rolled back, i.e. all time is applied +or none is. + +For example: + + my $errors = FS::svc_acct_rt_transaction->batch_insert(@transactions); + if ( $error ) { + #success; all payments were inserted + } else { + #failure; no payments were inserted. + } + +=cut + +sub batch_insert { + my $self = shift; #class method + + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $error; + foreach (@_) { + $error = $_->insert; + last if $error; + } + + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + } else { + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + } + + $error; + +} + +=back + +=head1 BUGS + +Possibly the delete method or others. + +=head1 SEE ALSO + +L<FS::Record>, schema.html from the base documentation. + +=cut + +1; + |