diff options
author | ivan <ivan> | 2008-02-14 03:52:37 +0000 |
---|---|---|
committer | ivan <ivan> | 2008-02-14 03:52:37 +0000 |
commit | 3684dae04773904d5500ef93253c5f4c2f6d7f38 (patch) | |
tree | e8cd1976c2982f64e57cfefa90713a5425e6fd9c /FS | |
parent | 7e845b1ddaae5c89d50f5fdb7c2ed3ee0aab4b08 (diff) |
add cust_pay.otaker field; populate it based on history on upgrades, and show the order taker on all payments (on customer view and payment search) closes: #2953
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/Schema.pm | 3 | ||||
-rw-r--r-- | FS/FS/Upgrade.pm | 4 | ||||
-rw-r--r-- | FS/FS/cust_pay.pm | 74 |
3 files changed, 74 insertions, 7 deletions
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index eb18964d5..7f8e6dace 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -695,8 +695,9 @@ sub tables_hashref { 'columns' => [ 'paynum', 'serial', '', '', '', '', 'custnum', 'int', '', '', '', '', - 'paid', @money_type, '', '', '_date', @date_type, '', '', + 'paid', @money_type, '', '', + 'otaker', 'varchar', 'NULL', 32, '', '', #NULL for the upgrade so we can create & populate the field 'payby', 'char', '', 4, '', '', # CARD/BILL/COMP, should be # index into payby table # eventually diff --git a/FS/FS/Upgrade.pm b/FS/FS/Upgrade.pm index 2e4d2b42b..90e66d87d 100644 --- a/FS/FS/Upgrade.pm +++ b/FS/FS/Upgrade.pm @@ -84,8 +84,10 @@ sub upgrade_data { 'cust_credit' => [], #duplicate history records - 'h_cust_svc' => [], + 'h_cust_svc' => [], + #populate cust_pay.otaker + 'cust_pay' => [], ; \%hash; diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm index 2b2e9442a..67f34c387 100644 --- a/FS/FS/cust_pay.pm +++ b/FS/FS/cust_pay.pm @@ -1,11 +1,14 @@ 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; @@ -18,6 +21,10 @@ use FS::cust_pay_void; @ISA = qw(FS::Record FS::cust_main_Mixin FS::payinfo_Mixin ); +$DEBUG = 0; + +$me = '[FS::cust_pay]'; + $ignore_noapply = 0; #ask FS::UID to run this stuff for us later @@ -59,11 +66,13 @@ currently supported: =item custnum - customer (see L<FS::cust_main>) -=item paid - Amount of this payment - =item _date - specified as a UNIX timestamp; see L<perlfunc/"time">. Also see L<Time::Local> and L<Date::Parse> for conversion functions. +=item paid - Amount of this payment + +=item otaker - order taker (assigned automatically, see L<FS::UID>) + =item payby - Payment Type (See L<FS::payinfo_Mixin> for valid payby values) =item payinfo - Payment Information (See L<FS::payinfo_Mixin> 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' ]) @@ -420,6 +432,8 @@ sub check { # " already exists"; # } + $self->otaker(getotaker); + $self->SUPER::check; } @@ -648,6 +662,56 @@ 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 $count_sql = + "SELECT COUNT(*) FROM cust_pay WHERE otaker IS NULL OR otaker = ''"; + + my $sth = dbh->prepare($count_sql) or die dbh->errstr; + $sth->execute or die $sth->errstr; + my $total = $sth->fetchrow_arrayref->[0]; + + local($DEBUG) = 2 if $total > 1000; #could be a while, force progress info + + my $count = 0; + my $lastprog = 0; + while (1) { + + my $cust_pay = qsearchs( { + 'table' => 'cust_pay', + 'hashref' => {}, + 'extra_sql' => "WHERE otaker IS NULL OR otaker = ''", + 'order_by' => 'ORDER BY paynum LIMIT 1', + } ); + + return unless $cust_pay; + + my $h_cust_pay = $cust_pay->h_search('insert'); + $cust_pay->otaker($h_cust_pay->history_user); + my $error = $cust_pay->replace; + die $error if $error; + + $count++; + if ( $DEBUG > 1 && $lastprog + 30 < time ) { + warn "$me $count/$total (". sprintf('%.2f',100*$count/$total). '%)'. "\n"; + $lastprog = time; + } + + } + +} + =back =head1 SUBROUTINES |