diff options
| author | ivan <ivan> | 2008-02-14 03:54:13 +0000 | 
|---|---|---|
| committer | ivan <ivan> | 2008-02-14 03:54:13 +0000 | 
| commit | 4aa65d22b908c96e495e93a1ab52be663c9fb916 (patch) | |
| tree | a4185c8d0a9c14d9087867a2892b008284f017a9 /FS | |
| parent | 9cf275815391b80b4e7a317fee9cb665aa77e16f (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 94fd66ac0..d256a6148 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -614,8 +614,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 | 
