X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_pay.pm;h=08699acd1717480073ddf27714c78fa06f4461fa;hb=8ab105cd64ac310f567d0ef6d4f662069a6adb65;hp=2b2e9442a08fc089d23ce80851edcf68586d7af4;hpb=0b4247f88f8a290a7bbbdebe93404baef2d1e29d;p=freeside.git diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm index 2b2e9442a..08699acd1 100644 --- a/FS/FS/cust_pay.pm +++ b/FS/FS/cust_pay.pm @@ -1,22 +1,29 @@ package FS::cust_pay; use strict; -use vars qw( @ISA $conf $unsuspendauto $ignore_noapply @encrypted_fields ); +use vars qw( @ISA $DEBUG $me $conf @encrypted_fields + $unsuspendauto $ignore_noapply + ); use Date::Format; use Business::CreditCard; use Text::Template; -use FS::Misc qw(send_email); +use FS::UID qw( getotaker ); +use FS::Misc qw( send_email ); use FS::Record qw( dbh qsearch qsearchs ); use FS::payby; use FS::cust_main_Mixin; -use FS::payinfo_Mixin; +use FS::payinfo_transaction_Mixin; use FS::cust_bill; use FS::cust_bill_pay; use FS::cust_pay_refund; use FS::cust_main; use FS::cust_pay_void; -@ISA = qw(FS::Record FS::cust_main_Mixin FS::payinfo_Mixin ); +@ISA = qw( FS::payinfo_transaction_Mixin FS::cust_main_Mixin FS::Record ); + +$DEBUG = 1; + +$me = '[FS::cust_pay]'; $ignore_noapply = 0; @@ -59,11 +66,13 @@ currently supported: =item custnum - customer (see L) -=item paid - Amount of this payment - =item _date - specified as a UNIX timestamp; see L. Also see L and L for conversion functions. +=item paid - Amount of this payment + +=item otaker - order taker (assigned automatically, see L) + =item payby - Payment Type (See L for valid payby values) =item payinfo - Payment Information (See L for data format) @@ -389,11 +398,14 @@ returns the error, otherwise returns false. Called by the insert method. sub check { my $self = shift; + $self->otaker(getotaker) unless ($self->otaker); + my $error = $self->ut_numbern('paynum') || $self->ut_numbern('custnum') - || $self->ut_money('paid') || $self->ut_numbern('_date') + || $self->ut_money('paid') + || $self->ut_alpha('otaker') || $self->ut_textn('paybatch') || $self->ut_textn('payunique') || $self->ut_enum('closed', [ '', 'Y' ]) @@ -538,84 +550,15 @@ sub unrefunded { sprintf("%.2f", $amount ); } +=item amount -=item cust_main - -Returns the parent customer object (see L). - -=cut - -sub cust_main { - my $self = shift; - qsearchs( 'cust_main', { 'custnum' => $self->custnum } ); -} - -=item payby_name - -Returns a name for the payby field. +Returns the "paid" field. =cut -sub payby_name { +sub amount { my $self = shift; - FS::payby->shortname( $self->payby ); -} - -=item gatewaynum - -Returns a gatewaynum for the processing gateway. - -=item processor - -Returns a name for the processing gateway. - -=item authorization - -Returns a name for the processing gateway. - -=item order_number - -Returns a name for the processing gateway. - -=cut - -sub gatewaynum { shift->_parse_paybatch->{'gatewaynum'}; } -sub processor { shift->_parse_paybatch->{'processor'}; } -sub authorization { shift->_parse_paybatch->{'authorization'}; } -sub order_number { shift->_parse_paybatch->{'order_number'}; } - -#sucks that this stuff is in paybatch like this in the first place, -#but at least other code can start to use new field names -#(code nicked from FS::cust_main::realtime_refund_bop) -sub _parse_paybatch { - my $self = shift; - - $self->paybatch =~ /^((\d+)\-)?(\w+):\s*([\w\-\/ ]*)(:([\w\-]+))?$/ - or return {}; - #"Can't parse paybatch for paynum $options{'paynum'}: ". - # $cust_pay->paybatch; - - my( $gatewaynum, $processor, $auth, $order_number ) = ( $2, $3, $4, $6 ); - - if ( $gatewaynum ) { #gateway for the payment to be refunded - - my $payment_gateway = - qsearchs('payment_gateway', { 'gatewaynum' => $gatewaynum } ); - - die "payment gateway $gatewaynum not found" #? - unless $payment_gateway; - - $processor = $payment_gateway->gateway_module; - - } - - { - 'gatewaynum' => $gatewaynum, - 'processor' => $processor, - 'authorization' => $auth, - 'order_number' => $order_number, - }; - + $self->paid(); } =back @@ -648,6 +591,73 @@ sub unapplied_sql { } +# _upgrade_data +# +# Used by FS::Upgrade to migrate to a new database. + +use FS::h_cust_pay; + +sub _upgrade_data { #class method + my ($class, %opts) = @_; + + warn "$me upgrading $class\n" if $DEBUG; + + #not the most efficient, but hey, it only has to run once + + my $where = "WHERE ( otaker IS NULL OR otaker = '' OR otaker = 'ivan' ) ". + " AND 0 < ( SELECT COUNT(*) FROM cust_main ". + " WHERE cust_main.custnum = cust_pay.custnum ) "; + + my $count_sql = "SELECT COUNT(*) FROM cust_pay $where"; + + my $sth = dbh->prepare($count_sql) or die dbh->errstr; + $sth->execute or die $sth->errstr; + my $total = $sth->fetchrow_arrayref->[0]; + #warn "$total cust_pay records to update\n" + # if $DEBUG; + local($DEBUG) = 2 if $total > 1000; #could be a while, force progress info + + my $count = 0; + my $lastprog = 0; + + my @cust_pay = qsearch( { + 'table' => 'cust_pay', + 'hashref' => {}, + 'extra_sql' => $where, + 'order_by' => 'ORDER BY paynum', + } ); + + foreach my $cust_pay (@cust_pay) { + + my $h_cust_pay = $cust_pay->h_search('insert'); + if ( $h_cust_pay ) { + next if $cust_pay->otaker eq $h_cust_pay->history_user; + $cust_pay->otaker($h_cust_pay->history_user); + } else { + $cust_pay->otaker('legacy'); + } + + delete $FS::payby::hash{'COMP'}->{cust_pay}; #quelle kludge + my $error = $cust_pay->replace; + + if ( $error ) { + warn " *** WARNING: Error updating order taker for payment paynum ". + $cust_pay->paynun. ": $error\n"; + next; + } + + $FS::payby::hash{'COMP'}->{cust_pay} = ''; #restore it + + $count++; + if ( $DEBUG > 1 && $lastprog + 30 < time ) { + warn "$me $count/$total (". sprintf('%.2f',100*$count/$total). '%)'. "\n"; + $lastprog = time; + } + + } + +} + =back =head1 SUBROUTINES