batch refactor continued
[freeside.git] / FS / FS / cust_main.pm
index 07b2c11..875db93 100644 (file)
@@ -42,7 +42,7 @@ use FS::cust_bill_pay;
 use FS::prepay_credit;
 use FS::queue;
 use FS::part_pkg;
-use FS::part_bill_event;
+use FS::part_bill_event qw(due_events);
 use FS::cust_bill_event;
 use FS::cust_tax_exempt;
 use FS::cust_tax_exempt_pkg;
@@ -512,7 +512,7 @@ sub _copy_skel {
 
     my $child_table;
     my $child_pkey = '';
-    if ( $child_table =~ /^(\w+)\.(\w+)$/ ) {
+    if ( $child_table_def =~ /^(\w+)\.(\w+)$/ ) {
       ( $child_table, $child_pkey ) = ( $1, $2 );
     } else {
       $child_table = $child_table_def;
@@ -523,7 +523,7 @@ sub _copy_skel {
     }
 
     my $sequence = '';
-    if ( keys %{ $child_tables{$child_table} } ) {
+    if ( keys %{ $child_tables{$child_table_def} } ) {
 
       return "$child_table has no primary key".
              " (run dbdef-create or try specifying it?)\n"
@@ -584,7 +584,7 @@ sub _copy_skel {
   
       # don't drink soap!  recurse!  recurse!  okay!
       my $error =
-        _copy_skel( $child_table,
+        _copy_skel( $child_table_def,
                     $row->{$child_pkey}, #sourceid
                     $insertid, #destid
                     %{ $child_tables{$child_table_def} },
@@ -2251,79 +2251,28 @@ sub collect {
     warn "  invnum ". $cust_bill->invnum. " (owed ". $cust_bill->owed. ")\n"
       if $DEBUG > 1;
 
-    foreach my $part_bill_event (
-      sort {    $a->seconds   <=> $b->seconds
-             || $a->weight    <=> $b->weight
-             || $a->eventpart <=> $b->eventpart }
-        grep { $_->seconds <= ( $invoice_time - $cust_bill->_date )
-               && ! qsearch( 'cust_bill_event', {
-                                'invnum'    => $cust_bill->invnum,
-                                'eventpart' => $_->eventpart,
-                                'status'    => 'done',
-                                                                   } )
-             }
-          qsearch( {
-            'table'     => 'part_bill_event',
-            'hashref'   => { 'payby'    => (exists($options{'payby'})
-                                            ? $options{'payby'}
-                                            : $self->payby
-                                          ),
-                             'disabled' => '',           },
-            'extra_sql' => $extra_sql,
-          } )
-    ) {
+    foreach my $part_bill_event ( due_events ( $cust_bill,
+                                               exists($options{'payby'}) 
+                                                ? $options{'payby'}
+                                                : $self->payby,
+                                              $invoice_time,
+                                              $extra_sql ) ) {
 
       last if $cust_bill->owed <= 0  # don't run subsequent events if owed<=0
            || $self->balance   <= 0; # or if balance<=0
 
-      warn "  calling invoice event (". $part_bill_event->eventcode. ")\n"
-        if $DEBUG > 1;
-      my $cust_main = $self; #for callback
-
-      my $error;
       {
         local $realtime_bop_decline_quiet = 1 if $options{'quiet'};
-        local $SIG{__DIE__}; # don't want Mason __DIE__ handler active
-        $error = eval $part_bill_event->eventcode;
-      }
-
-      my $status = '';
-      my $statustext = '';
-      if ( $@ ) {
-        $status = 'failed';
-        $statustext = $@;
-      } elsif ( $error ) {
-        $status = 'done';
-        $statustext = $error;
-      } else {
-        $status = 'done'
-      }
-
-      #add cust_bill_event
-      my $cust_bill_event = new FS::cust_bill_event {
-        'invnum'     => $cust_bill->invnum,
-        'eventpart'  => $part_bill_event->eventpart,
-        #'_date'      => $invoice_time,
-        '_date'      => time,
-        'status'     => $status,
-        'statustext' => $statustext,
-      };
-      $error = $cust_bill_event->insert;
-      if ( $error ) {
-        #$dbh->rollback if $oldAutoCommit;
-        #return "error: $error";
+        warn "  do_event " .  $cust_bill . " ". (%options) .  "\n"
+          if $DEBUG > 1;
 
-        # gah, even with transactions.
-        $dbh->commit if $oldAutoCommit; #well.
-        my $e = 'WARNING: Event run but database not updated - '.
-                'error inserting cust_bill_event, invnum #'. $cust_bill->invnum.
-                ', eventpart '. $part_bill_event->eventpart.
-                ": $error";
-        warn $e;
-        return $e;
+        if (my $error = $part_bill_event->do_event($cust_bill, %options)) {
+         # gah, even with transactions.
+         $dbh->commit if $oldAutoCommit; #well.
+         return $error;
+       }
       }
 
-
     }
 
   }
@@ -2335,9 +2284,10 @@ sub collect {
 
 =item retry_realtime
 
-Schedules realtime credit card / electronic check / LEC billing events for
-for retry.  Useful if card information has changed or manual retry is desired.
-The 'collect' method must be called to actually retry the transaction.
+Schedules realtime / batch  credit card / electronic check / LEC billing
+events for for retry.  Useful if card information has changed or manual
+retry is desired.  The 'collect' method must be called to actually retry
+the transaction.
 
 Implementation details: For each of this customer's open invoices, changes
 the status of the first "done" (with statustext error) realtime processing
@@ -2368,7 +2318,7 @@ sub retry_realtime {
         grep {
                #$_->part_bill_event->plan eq 'realtime-card'
                $_->part_bill_event->eventcode =~
-                   /\$cust_bill\->realtime_(card|ach|lec)/
+                   /\$cust_bill\->(batch|realtime)_(card|ach|lec)/
                  && $_->status eq 'done'
                  && $_->statustext
              }
@@ -4395,7 +4345,7 @@ sub batch_import {
                   cust_pkg.pkgpart
                   svc_acct.username svc_acct._password 
                 );
-    $payby = 'CARD';
+    $payby = 'BILL';
   } else {
     die "unknown format $format";
   }
@@ -4466,16 +4416,22 @@ sub batch_import {
         if ( $field eq 'refnum' && $columns[0] !~ /^\s*(\d+)\s*$/ ) {
 
           my $referral = $columns[0];
-          my $part_referral = new FS::part_referral {
-            'referral' => $referral,
-            'agentnum' => $agentnum,
-          };
-
-          my $error = $part_referral->insert;
-          if ( $error ) {
-            $dbh->rollback if $oldAutoCommit;
-            return "can't auto-insert advertising source: $referral: $error";
+          my %hash = ( 'referral' => $referral,
+                       'agentnum' => $agentnum,
+                       'disabled' => '',
+                     );
+
+          my $part_referral = qsearchs('part_referral', \%hash )
+                              || new FS::part_referral \%hash;
+
+          unless ( $part_referral->refnum ) {
+            my $error = $part_referral->insert;
+            if ( $error ) {
+              $dbh->rollback if $oldAutoCommit;
+              return "can't auto-insert advertising source: $referral: $error";
+            }
           }
+
           $columns[0] = $part_referral->refnum;
         }
 
@@ -4484,6 +4440,8 @@ sub batch_import {
       }
     }
 
+    $cust_main{'payby'} = 'CARD' if length($cust_main{'payinfo'});
+
     my $invoicing_list = $cust_main{'invoicing_list'}
                            ? [ delete $cust_main{'invoicing_list'} ]
                            : [];