Merge branch 'master' of https://github.com/jgoodman/Freeside
authorIvan Kohler <ivan@freeside.biz>
Thu, 6 Mar 2014 23:19:53 +0000 (15:19 -0800)
committerIvan Kohler <ivan@freeside.biz>
Thu, 6 Mar 2014 23:19:53 +0000 (15:19 -0800)
(github pull request #24 -- change refunds to proper refunds)

1  2 
FS/FS/Schema.pm
FS/FS/cust_credit.pm

diff --combined FS/FS/Schema.pm
@@@ -943,7 -943,6 +943,7 @@@ sub tables_hashref 
          'eventnum',       'int', '', '', '', '',
          'billpkgnum',     'int', 'NULL', '', '', '',
          'feepart',        'int', '', '', '', '',
 +        'nextbill',      'char', 'NULL',  1, '', '',
        ],
        'primary_key'  => 'eventfeenum', # I'd rather just use eventnum
        'unique' => [ [ 'billpkgnum' ], [ 'eventnum' ] ], # one-to-one link
          'gatewaynum',   'int',     'NULL',  '', '', '',
          #'cust_balance', @money_type,            '', '',
          'paynum',       'int',     'NULL',  '', '', '',
 +        'void_paynum',  'int',     'NULL',  '', '', '',
          'jobnum',    'bigint',     'NULL',  '', '', '', 
          'invnum',       'int',     'NULL',  '', '', '',
          'manual',       'char',    'NULL',   1, '', '',
                            { columns    => [ 'paynum' ],
                              table      => 'cust_pay',
                            },
 +                          { columns    => [ 'void_paynum' ],
 +                            table      => 'cust_pay_void',
 +                            references => [ 'paynum' ],
 +                          },
                            { columns    => [ 'jobnum' ],
                              table      => 'queue',
                            },
          'currency',       'char', 'NULL',       3, '', '',
          'otaker',       'varchar',   'NULL',   32, '', '', 
          'usernum',   'int', 'NULL', '', '', '',
-         'reason',       'varchar',   '',   $char_d, '', '', 
+         'reason',       'varchar',   'NULL',   $char_d, '', '', 
+         'reasonnum',   'int', 'NULL', '', '', '',
          'payby',        'char',   '',     4, '', '', # CARD/BILL/COMP, should
                                                       # be index into payby
                                                       # table eventually
                            { columns    => [ 'usernum' ],
                              table      => 'access_user',
                            },
+                           { columns    => [ 'reasonnum' ],
+                             table      => 'reason',
+                           },
                            { columns    => [ 'gatewaynum' ],
                              table      => 'payment_gateway',
                            },
                          ],
      },
  
 +    'part_fee_usage' => {
 +      'columns' => [
 +        'feepartusagenum','serial',     '',        '', '', '',
 +        'feepart',           'int',     '',        '', '', '',
 +        'classnum',          'int',     '',        '', '', '',
 +        'amount',   @money_type,                '', '',
 +        'percent',     'decimal',    '', '7,4', '', '',
 +      ],
 +      'primary_key'  => 'feepartusagenum',
 +      'unique'       => [ [ 'feepart', 'classnum' ] ],
 +      'index'        => [],
 +      'foreign_keys' => [
 +                          { columns    => [ 'feepart' ],
 +                            table      => 'part_fee',
 +                          },
 +                          { columns    => [ 'classnum' ],
 +                            table      => 'usage_class',
 +                          },
 +                        ],
 +    },
  
      'part_pkg_link' => {
        'columns' => [
        'unique'       => [ [ 'blocknum', 'routernum' ] ],
        'index'        => [],
        'foreign_keys' => [
 -                          { columns    => [ 'routernum' ],
 -                            table      => 'router',
 -                          },
 +                          #{ columns    => [ 'routernum' ],
 +                            table      => 'router',
 +                          #},
                            { columns    => [ 'agentnum' ],
                              table      => 'agent',
                            },
      'cust_msg' => {
        'columns' => [
          'custmsgnum', 'serial',     '',     '', '', '',
 -        'custnum',       'int',     '',     '', '', '',
 +        'custnum',       'int', 'NULL',     '', '', '',
          'msgnum',        'int', 'NULL',     '', '', '',
          '_date',    @date_type,                 '', '',
          'env_from',  'varchar', 'NULL',    255, '', '',
          'body',         'blob', 'NULL',     '', '', '',
          'error',     'varchar', 'NULL',    255, '', '',
          'status',    'varchar',     '',$char_d, '', '',
 +        'msgtype',   'varchar', 'NULL',     16, '', '',
        ],
        'primary_key'  => 'custmsgnum',
        'unique'       => [ ],
diff --combined FS/FS/cust_credit.pm
@@@ -1,5 -1,6 +1,6 @@@
  package FS::cust_credit;
- use base qw( FS::otaker_Mixin FS::cust_main_Mixin FS::Record );
+ use base qw( FS::otaker_Mixin FS::cust_main_Mixin FS::reason_Mixin
+              FS::Record );
  
  use strict;
  use vars qw( $conf $unsuspendauto $me $DEBUG
@@@ -447,57 -448,8 +448,8 @@@ sub credited 
  
  Returns the customer (see L<FS::cust_main>) for this credit.
  
- =item reason
- Returns the text of the associated reason (see L<FS::reason>) for this credit.
  =cut
  
- sub reason {
-   my ($self, $value, %options) = @_;
-   my $dbh = dbh;
-   my $reason;
-   my $typenum = $options{'reason_type'};
-   my $oldAutoCommit = $FS::UID::AutoCommit;  # this should already be in
-   local $FS::UID::AutoCommit = 0;            # a transaction if it matters
-   if ( defined( $value ) ) {
-     my $hashref = { 'reason' => $value };
-     $hashref->{'reason_type'} = $typenum if $typenum;
-     my $addl_from = "LEFT JOIN reason_type ON ( reason_type = typenum ) ";
-     my $extra_sql = " AND reason_type.class='R'"; 
-     $reason = qsearchs( { 'table'     => 'reason',
-                           'hashref'   => $hashref,
-                           'addl_from' => $addl_from,
-                           'extra_sql' => $extra_sql,
-                        } );
-     if (!$reason && $typenum) {
-       $reason = new FS::reason( { 'reason_type' => $typenum,
-                                   'reason' => $value,
-                                   'disabled' => 'Y', 
-                               } );
-       my $error = $reason->insert;
-       if ( $error ) {
-         warn "error inserting reason: $error\n";
-         $reason = undef;
-       }
-     }
-     $self->reasonnum($reason ? $reason->reasonnum : '') ;
-     warn "$me reason used in set mode with non-existant reason -- clearing"
-       unless $reason;
-   }
-   $reason = qsearchs( 'reason', { 'reasonnum' => $self->reasonnum } );
-   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-   ( $reason ? $reason->reason : '' ).
-   ( $self->addlinfo ? ' '.$self->addlinfo : '' );
- }
  # _upgrade_data
  #
  # Used by FS::Upgrade to migrate to a new database.
@@@ -507,56 -459,9 +459,9 @@@ sub _upgrade_data {  # class metho
  
    warn "$me upgrading $class\n" if $DEBUG;
  
-   if (defined dbdef->table($class->table)->column('reason')) {
+   $class->_upgrade_reasonnum(%opts);
  
-     warn "$me Checking for unmigrated reasons\n" if $DEBUG;
-     my @cust_credits = qsearch({ 'table'     => $class->table,
-                                  'hashref'   => {},
-                                  'extra_sql' => 'WHERE reason IS NOT NULL',
-                               });
-     if (scalar(grep { $_->getfield('reason') =~ /\S/ } @cust_credits)) {
-       warn "$me Found unmigrated reasons\n" if $DEBUG;
-       my $hashref = { 'class' => 'R', 'type' => 'Legacy' };
-       my $reason_type = qsearchs( 'reason_type', $hashref );
-       unless ($reason_type) {
-         $reason_type  = new FS::reason_type( $hashref );
-         my $error   = $reason_type->insert();
-         die "$class had error inserting FS::reason_type into database: $error\n"
-           if $error;
-       }
-       $hashref = { 'reason_type' => $reason_type->typenum,
-                    'reason' => '(none)'
-                  };
-       my $noreason = qsearchs( 'reason', $hashref );
-       unless ($noreason) {
-         $hashref->{'disabled'} = 'Y';
-         $noreason = new FS::reason( $hashref );
-         my $error  = $noreason->insert();
-         die "can't insert legacy reason '(none)' into database: $error\n"
-           if $error;
-       }
-       foreach my $cust_credit ( @cust_credits ) {
-         my $reason = $cust_credit->getfield('reason');
-         warn "Contemplating reason $reason\n" if $DEBUG > 1;
-         if ($reason =~ /\S/) {
-           $cust_credit->reason($reason, 'reason_type' => $reason_type->typenum)
-             or die "can't insert legacy reason $reason into database\n";
-         }else{
-           $cust_credit->reasonnum($noreason->reasonnum);
-         }
-         $cust_credit->setfield('reason', '');
-         my $error = $cust_credit->replace;
-         warn "*** WARNING: error replacing reason in $class ".
-              $cust_credit->crednum. ": $error ***\n"
-           if $error;
-       }
-     }
+   if (defined dbdef->table($class->table)->column('reason')) {
  
      warn "$me Ensuring existance of auto reasons\n" if $DEBUG;
  
@@@ -910,9 -815,14 +815,9 @@@ sub credit_lineitems 
  
      # recalculate taxes with new amounts
      $taxlisthash{$invnum} ||= {};
 -    my $part_pkg = $cust_bill_pkg->part_pkg;
 -    $cust_main->_handle_taxes( $part_pkg,
 -                               $taxlisthash{$invnum},
 -                               $cust_bill_pkg,
 -                               $cust_bill_pkg->cust_pkg,
 -                               $cust_bill_pkg->cust_bill->_date, #invoice time
 -                               $cust_bill_pkg->cust_pkg->pkgpart,
 -                             );
 +    my $part_pkg = $cust_bill_pkg->part_pkg
 +      if $cust_bill_pkg->pkgpart_override;
 +    $cust_main->_handle_taxes( $taxlisthash{$invnum}, $cust_bill_pkg );
    }
  
    ###
  
        # we still have to deal with the possibility that the tax links don't
        # cover the whole amount of tax because of an incomplete upgrade...
 -      if ($amount > 0) {
 +      if ($amount > 0.005) {
          $cust_credit_bill{$invnum} += $amount;
          push @{ $cust_credit_bill_pkg{$invnum} },
            new FS::cust_credit_bill_pkg {
              'billpkgnum' => $tax_item->billpkgnum,
 -            'amount'     => $amount,
 +            'amount'     => sprintf('%.2f', $amount),
              'setuprecur' => 'setup',
            };