diff options
author | Ivan Kohler <ivan@freeside.biz> | 2014-02-16 15:18:40 -0800 |
---|---|---|
committer | Ivan Kohler <ivan@freeside.biz> | 2014-02-16 15:18:40 -0800 |
commit | c4e26585cdbd2cd086ed813a02b963ffccfebc55 (patch) | |
tree | 874a4fcfd1f917a2d3146e0e52a25c20307875b0 /FS/FS/cust_main/Import_Charges.pm | |
parent | af0778d5f900697e0a523c6f88b3b250d5a0d1c9 (diff) |
move cust_main::batch_charge to a file of its own
Diffstat (limited to 'FS/FS/cust_main/Import_Charges.pm')
-rw-r--r-- | FS/FS/cust_main/Import_Charges.pm | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/FS/FS/cust_main/Import_Charges.pm b/FS/FS/cust_main/Import_Charges.pm new file mode 100644 index 0000000..312a606 --- /dev/null +++ b/FS/FS/cust_main/Import_Charges.pm @@ -0,0 +1,149 @@ +package FS::cust_main::Import_Charges; +#actually no specific reason it lives under FS::cust_main:: othan than it calls +# a thing on cust_main objects. not part of the inheritence, just providess a +# subroutine for misc/process/cust_main-import_charges.cgi + +use strict; +use Text::CSV_XS; +use FS::UID qw( dbh ); +use FS::CurrentUser; +use FS::Record qw( qsearchs ); +use FS::cust_main; + +=head1 NAME + +FS::cust_main::Import_Charges - Batch charge importing + +=head1 SYNOPSIS + + use FS::cust_main::Import_Charges; + + my $error = + FS::cust_main::Import_charges::batch_charge( { + filehandle => $fh, + 'agentnum' => scalar($cgi->param('agentnum')), + 'format' => scalar($cgi->param('format')), + } ); + +=head1 DESCRIPTION + +Batch customer charging. + + +=head1 SUBROUTINES + +=over 4 + +=item batch_charge + +=cut + +sub batch_charge { + my $param = shift; + #warn join('-',keys %$param); + my $fh = $param->{filehandle}; + my $agentnum = $param->{agentnum}; + my $format = $param->{format}; + + my $extra_sql = ' AND '. $FS::CurrentUser::CurrentUser->agentnums_sql; + + my @fields; + if ( $format eq 'simple' ) { + @fields = qw( custnum agent_custid amount pkg ); + } else { + die "unknown format $format"; + } + + my $csv = new Text::CSV_XS; + #warn $csv; + #warn $fh; + + my $imported = 0; + #my $columns; + + 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; + + #while ( $columns = $csv->getline($fh) ) { + my $line; + while ( defined($line=<$fh>) ) { + + $csv->parse($line) or do { + $dbh->rollback if $oldAutoCommit; + return "can't parse: ". $csv->error_input(); + }; + + my @columns = $csv->fields(); + #warn join('-',@columns); + + my %row = (); + foreach my $field ( @fields ) { + $row{$field} = shift @columns; + } + + if ( $row{custnum} && $row{agent_custid} ) { + dbh->rollback if $oldAutoCommit; + return "can't specify custnum with agent_custid $row{agent_custid}"; + } + + my %hash = (); + if ( $row{agent_custid} && $agentnum ) { + %hash = ( 'agent_custid' => $row{agent_custid}, + 'agentnum' => $agentnum, + ); + } + + if ( $row{custnum} ) { + %hash = ( 'custnum' => $row{custnum} ); + } + + unless ( scalar(keys %hash) ) { + $dbh->rollback if $oldAutoCommit; + return "can't find customer without custnum or agent_custid and agentnum"; + } + + my $cust_main = qsearchs('cust_main', { %hash } ); + unless ( $cust_main ) { + $dbh->rollback if $oldAutoCommit; + my $custnum = $row{custnum} || $row{agent_custid}; + return "unknown custnum $custnum"; + } + + if ( $row{'amount'} > 0 ) { + my $error = $cust_main->charge($row{'amount'}, $row{'pkg'}); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + $imported++; + } elsif ( $row{'amount'} < 0 ) { + my $error = $cust_main->credit( sprintf( "%.2f", 0-$row{'amount'} ), + $row{'pkg'} ); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + $imported++; + } else { + #hmm? + } + + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + return "Empty file!" unless $imported; + + ''; #no error + +} + +1; |