[freeside-commits] branch master updated. ffda3975d8eefa8d08ae9e468dba33448e207ae6

Mark Wells mark at 420.am
Sat Nov 29 16:36:58 PST 2014


The branch, master has been updated
       via  ffda3975d8eefa8d08ae9e468dba33448e207ae6 (commit)
       via  ea16cbe4a50fa79872a4f08225863f39b7d28c06 (commit)
      from  1af8ff7f48f7259fc99f090c301c84b9680fdb4d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit ffda3975d8eefa8d08ae9e468dba33448e207ae6
Author: Mark Wells <mark at freeside.biz>
Date:   Sat Nov 29 16:36:19 2014 -0800

    fix editing of events that have reasons, from #31702

diff --git a/httemplate/edit/process/part_event.html b/httemplate/edit/process/part_event.html
index 481439d..bac6924 100644
--- a/httemplate/edit/process/part_event.html
+++ b/httemplate/edit/process/part_event.html
@@ -62,12 +62,17 @@
             my $value = join(',', $cgi->param( "$prefix$option" ) );
 
             if ( $option eq 'reasonnum' && $value == -1 ) {
-              $value = {
-                'typenum' => scalar( $cgi->param( "new$prefix${option}T" ) ),
-                'reason'  => scalar( $cgi->param( "new$prefix${option}"  ) ),
-              };
+              my $reason_prefix = $object->action . '_' . $option .  '_new_';
+              my $new_reason = FS::reason->new;
+              foreach ( qw( reason_type reason unsuspend pkgpart 
+                            unsuspend_hold unused_credit ) ) {
+                $new_reason->set($_, $cgi->param("$reason_prefix$_"));
+              }
+              warn Dumper $new_reason;
+              my $error = $new_reason->insert;
+              die "error creating reason: $error" if $error;
+              $value = $new_reason->reasonnum;
             }
-
             ( $option => $value );
           }
           @{ $object->option_fields_listref };
diff --git a/httemplate/elements/tr-select-reason.html b/httemplate/elements/tr-select-reason.html
index c5b3d6f..0df7c05 100755
--- a/httemplate/elements/tr-select-reason.html
+++ b/httemplate/elements/tr-select-reason.html
@@ -159,6 +159,7 @@ if ( $opt{'cgi'} ) {
 }
 
 my $id = $opt{'id'} || $name;
+$id =~ s/\./_/g; # for edit/part_event
 
 my $add_access_right;
 if ($class eq 'C') {

commit ea16cbe4a50fa79872a4f08225863f39b7d28c06
Author: Mark Wells <mark at freeside.biz>
Date:   Sat Nov 29 16:36:15 2014 -0800

    sales commission events on invoices, #25847

diff --git a/FS/FS/part_event/Action/Mixin/credit_agent_pkg_class.pm b/FS/FS/part_event/Action/Mixin/credit_agent_pkg_class.pm
index cb61f1b..488132a 100644
--- a/FS/FS/part_event/Action/Mixin/credit_agent_pkg_class.pm
+++ b/FS/FS/part_event/Action/Mixin/credit_agent_pkg_class.pm
@@ -1,21 +1,16 @@
 package FS::part_event::Action::Mixin::credit_agent_pkg_class;
-use base qw( FS::part_event::Action::Mixin::credit_pkg );
+
+# calculates a credit percentage on a specific package for use with 
+# credit_pkg or credit_bill, based on an agent's commission table
 
 use strict;
 use FS::Record qw(qsearchs);
 
-sub option_fields {
-  my $class = shift;
-  my %option_fields = $class->SUPER::option_fields;
-  delete $option_fields{'percent'};
-  %option_fields;
-}
-
 sub _calc_credit_percent {
-  my( $self, $cust_pkg ) = @_;
+  my( $self, $cust_pkg, $agent ) = @_;
 
   my $agent_pkg_class = qsearchs( 'agent_pkg_class', {
-    'agentnum' => $self->cust_main($cust_pkg)->agentnum,
+    'agentnum' => $agent->agentnum,
     'classnum' => $cust_pkg->part_pkg->classnum,
   });
 
diff --git a/FS/FS/part_event/Action/Mixin/credit_bill.pm b/FS/FS/part_event/Action/Mixin/credit_bill.pm
new file mode 100644
index 0000000..4930e35
--- /dev/null
+++ b/FS/FS/part_event/Action/Mixin/credit_bill.pm
@@ -0,0 +1,95 @@
+package FS::part_event::Action::Mixin::credit_bill;
+
+use strict;
+
+# credit_bill: calculates a credit amount that is some percentage of each 
+# line item of an invoice
+
+sub eventtable_hashref {
+  { 'cust_bill' => 1 };
+}
+
+sub option_fields {
+  my $class = shift;
+  my @fields = (
+    'reasonnum' => { 'label'        => 'Credit reason',
+                     'type'         => 'select-reason',
+                     'reason_class' => 'R',
+                   },
+    'percent'   => { 'label'   => 'Percent',
+                     'type'    => 'input-percentage',
+                     'default' => '100',
+                   },
+    'what' => {
+      'label'   => 'Of',
+      'type'    => 'select',
+      #add additional ways to specify in the package def
+      'options' => [qw( setuprecur setup recur setuprecur_margin setup_margin recur_margin )],
+      'labels'  => {
+        'setuprecur'        => 'Amount charged',
+        'setup'             => 'Setup fee',
+        'recur'             => 'Recurring fee',
+        'setuprecur_margin' => 'Amount charged minus total cost',
+        'setup_margin'      => 'Setup fee minus setup cost',
+        'recur_margin'      => 'Recurring fee minus recurring cost',
+      },
+    },
+  );
+  if ($class->can('_calc_credit_percent')) {
+    splice @fields, 2, 2; #remove the percentage option
+  }
+  @fields;
+    
+}
+
+our %part_pkg_cache;
+
+# arguments:
+# 1. the line item
+# 2. the recipient of the commission; may be FS::sales, FS::agent, 
+# FS::access_user, etc. Here we don't use it, but it will be passed through
+# to _calc_credit_percent.
+
+sub _calc_credit {
+  my $self = shift;
+  my $cust_bill_pkg = shift;
+
+  my $what = $self->option('what');
+  my $margin = 1 if $what =~ s/_margin$//;
+
+  my $pkgnum = $cust_bill_pkg->pkgnum;
+  my $cust_pkg = $cust_bill_pkg->cust_pkg;
+
+  my $percent;
+  if ( $self->can('_calc_credit_percent') ) {
+    $percent = $self->_calc_credit_percent($cust_pkg, @_);
+  } else {
+    $percent = $self->option('percent') || 0;
+  }
+
+  my $charge = 0;
+  if ( $what eq 'setup' ) {
+    $charge = $cust_bill_pkg->get('setup');
+  } elsif ( $what eq 'recur' ) {
+    $charge = $cust_bill_pkg->get('recur');
+  } elsif ( $what eq 'setuprecur' ) {
+    $charge = $cust_bill_pkg->get('setup') + $cust_bill_pkg->get('recur');
+  }
+  if ( $margin ) {
+    my $pkgpart = $cust_bill_pkg->pkgpart_override || $cust_pkg->pkgpart;
+    my $part_pkg   = $part_pkg_cache{$pkgpart}
+                 ||= FS::part_pkg->by_key($pkgpart);
+    if ( $what eq 'setup' ) {
+      $charge -= $part_pkg->get('setup_cost');
+    } elsif ( $what eq 'recur' ) {
+      $charge -= $part_pkg->get('recur_cost');
+    } elsif ( $what eq 'setuprecur' ) {
+      $charge -= $part_pkg->get('setup_cost') + $part_pkg->get('recur_cost');
+    }
+  }
+
+  $charge = 0 if $charge < 0; # e.g. prorate
+  return ($percent * $charge / 100);
+}
+
+1;
diff --git a/FS/FS/part_event/Action/Mixin/credit_flat.pm b/FS/FS/part_event/Action/Mixin/credit_flat.pm
new file mode 100644
index 0000000..374cf5d
--- /dev/null
+++ b/FS/FS/part_event/Action/Mixin/credit_flat.pm
@@ -0,0 +1,25 @@
+package FS::part_event::Action::Mixin::credit_flat;
+
+# credit_flat: return a fixed amount for _calc_credit, specified in the 
+# options
+
+use strict;
+
+sub option_fields {
+  (
+    'reasonnum' => { 'label'        => 'Credit reason',
+                     'type'         => 'select-reason',
+                     'reason_class' => 'R',
+                   },
+    'amount'    => { 'label'        => 'Credit amount',
+                     'type'         => 'money',
+                   },
+  );
+}
+
+sub _calc_credit {
+  my $self = shift;
+  $self->option('amount');
+}
+
+1;
diff --git a/FS/FS/part_event/Action/Mixin/credit_pkg.pm b/FS/FS/part_event/Action/Mixin/credit_pkg.pm
index e586f85..400ece9 100644
--- a/FS/FS/part_event/Action/Mixin/credit_pkg.pm
+++ b/FS/FS/part_event/Action/Mixin/credit_pkg.pm
@@ -2,12 +2,19 @@ package FS::part_event::Action::Mixin::credit_pkg;
 
 use strict;
 
+# credit_pkg: calculates a credit amount that is some percentage of the 
+# package charge / cost / margin / some other amount of a package
+#
+# also provides an option field for the percentage, unless the action knows
+# how to calculate its own percentage somehow (has a _calc_credit_percent)
+
 sub eventtable_hashref {
   { 'cust_pkg' => 1 };
 }
 
 sub option_fields {
-  ( 
+  my $class = shift;
+  my @fields = (
     'reasonnum' => { 'label'        => 'Credit reason',
                      'type'         => 'select-reason',
                      'reason_class' => 'R',
@@ -36,12 +43,19 @@ sub option_fields {
       },
     },
   );
+  if ($class->can('_calc_credit_percent')) {
+    splice @fields, 2, 2; #remove the percentage option
+  }
+  @fields;
 }
 
-#my %no_cust_pkg = ( 'setup_cost' => 1 );
+# arguments:
+# 1. cust_pkg
+# 2. recipient of the credit (passed through to _calc_credit_percent)
 
 sub _calc_credit {
-  my( $self, $cust_pkg ) = @_;
+  my $self = shift;
+  my $cust_pkg = shift;
 
   my $cust_main = $self->cust_main($cust_pkg);
 
@@ -59,18 +73,17 @@ sub _calc_credit {
     }
   }
 
-  my $percent = $self->_calc_credit_percent($cust_pkg);
+  my $percent;
+  if ( $self->can('_calc_credit_percent') ) {
+    $percent = $self->_calc_credit_percent($cust_pkg, @_);
+  } else {
+    $percent = $self->option('percent') || 0;
+  }
 
-  #my @arg = $no_cust_pkg{$what} ? () : ($cust_pkg);
   my @arg = ($what eq 'setup_cost') ? () : ($cust_pkg);
 
   sprintf('%.2f', $part_pkg->$what(@arg) * $percent / 100 );
 
 }
 
-sub _calc_credit_percent {
-  my( $self, $cust_pkg ) = @_;
-  $self->option('percent');
-}
-
 1;
diff --git a/FS/FS/part_event/Action/Mixin/credit_sales_pkg_class.pm b/FS/FS/part_event/Action/Mixin/credit_sales_pkg_class.pm
index 5c090ef..61302aa 100644
--- a/FS/FS/part_event/Action/Mixin/credit_sales_pkg_class.pm
+++ b/FS/FS/part_event/Action/Mixin/credit_sales_pkg_class.pm
@@ -1,30 +1,16 @@
 package FS::part_event::Action::Mixin::credit_sales_pkg_class;
-use base qw( FS::part_event::Action::Mixin::credit_pkg );
 
 use strict;
 use FS::Record qw(qsearchs);
 use FS::sales_pkg_class;
 
-sub option_fields {
-  my $class = shift;
-  my %option_fields = $class->SUPER::option_fields;
-
-  delete $option_fields{'percent'};
-
-  %option_fields;
-}
-
 sub _calc_credit_percent {
-  my( $self, $cust_pkg ) = @_;
-
-  my $salesnum = $cust_pkg->salesnum;
-  $salesnum ||= $self->cust_main($cust_pkg)->salesnum
-    if $self->option('cust_main_sales');
+  my( $self, $cust_pkg, $sales ) = @_;
 
-  return 0 unless $salesnum;
+  die "sales record required" unless $sales;
 
   my $sales_pkg_class = qsearchs( 'sales_pkg_class', {
-    'salesnum' => $salesnum,
+    'salesnum' => $sales->salesnum,
     'classnum' => $cust_pkg->part_pkg->classnum,
   });
 
diff --git a/FS/FS/part_event/Action/bill_sales_credit.pm b/FS/FS/part_event/Action/bill_sales_credit.pm
new file mode 100644
index 0000000..3193a81
--- /dev/null
+++ b/FS/FS/part_event/Action/bill_sales_credit.pm
@@ -0,0 +1,91 @@
+package FS::part_event::Action::bill_sales_credit;
+
+# in this order:
+# - pkg_sales_credit invokes NEXT, then appends the 'cust_main_sales' param
+# - credit_bill contains the core _calc_credit logic, and also defines other
+# params
+
+use base qw( FS::part_event::Action::Mixin::pkg_sales_credit
+             FS::part_event::Action::Mixin::credit_bill
+             FS::part_event::Action );
+use FS::Record qw(qsearch qsearchs);
+use FS::Conf;
+use Date::Format qw(time2str);
+
+use strict;
+
+sub description { 'Credit the sales person based on the billed amount'; }
+
+sub eventtable_hashref {
+  { 'cust_bill' => 1 };
+}
+
+our $date_format;
+
+sub do_action {
+  my( $self, $cust_bill, $cust_event ) = @_;
+
+  $date_format ||= FS::Conf->new->config('date_format') || '%x';
+
+  my $cust_main = $self->cust_main($cust_bill);
+
+  my %salesnum_sales; # salesnum => FS::sales object
+  my %salesnum_amount; # salesnum => credit amount
+  my %pkgnum_pkg; # pkgnum => FS::cust_pkg
+  my %salesnum_pkgnums; # salesnum => [ pkgnum, ... ]
+
+  my @items = qsearch('cust_bill_pkg', { invnum => $cust_bill->invnum,
+                                         pkgnum => { op => '>', value => '0' }
+                                       });
+
+  foreach my $cust_bill_pkg (@items) {
+    my $pkgnum = $cust_bill_pkg->pkgnum;
+    my $cust_pkg = $pkgnum_pkg{$pkgnum} ||= $cust_bill_pkg->cust_pkg;
+
+    my $salesnum = $cust_pkg->salesnum;
+    $salesnum ||= $cust_main->salesnum
+      if $self->option('cust_main_sales');
+    my $sales = $salesnum_sales{$salesnum}
+            ||= FS::sales->by_key($salesnum);
+
+    next if !$sales; #no sales person, no credit
+
+    my $amount = $self->_calc_credit($cust_bill_pkg, $sales);
+
+    if ($amount > 0) {
+      $salesnum_amount{$salesnum} ||= 0;
+      $salesnum_amount{$salesnum} += $amount;
+      push @{ $salesnum_pkgnums{$salesnum} ||= [] }, $pkgnum;
+    }
+  }
+
+  foreach my $salesnum (keys %salesnum_amount) {
+    my $amount = sprintf('%.2f', $salesnum_amount{$salesnum});
+    next if $amount < 0.005;
+
+    my $sales = $salesnum_sales{$salesnum};
+
+    my $sales_cust_main = $sales->sales_cust_main;
+    die "No customer record for sales person ". $sales->salesperson
+      unless $sales->sales_custnum;
+
+    my $reasonnum = $self->option('reasonnum');
+
+    my $desc = 'from invoice #'. $cust_bill->display_invnum .
+               ' ('. time2str($date_format, $cust_bill->_date) . ')';
+               # could also show custnum and pkgnums here?
+    my $error = $sales_cust_main->credit(
+      $amount, 
+      \$reasonnum,
+      'eventnum'            => $cust_event->eventnum,
+      'addlinfo'            => $desc,
+      'commission_salesnum' => $sales->salesnum,
+    );
+    die "Error crediting customer ". $sales_cust_main->custnum.
+        " for sales commission: $error"
+      if $error;
+  } # foreach $salesnum
+
+}
+
+1;
diff --git a/FS/FS/part_event/Action/bill_sales_credit_pkg_class.pm b/FS/FS/part_event/Action/bill_sales_credit_pkg_class.pm
new file mode 100644
index 0000000..91442b9
--- /dev/null
+++ b/FS/FS/part_event/Action/bill_sales_credit_pkg_class.pm
@@ -0,0 +1,11 @@
+package FS::part_event::Action::bill_sales_credit_pkg_class;
+
+use base qw( FS::part_event::Action::Mixin::pkg_sales_credit
+             FS::part_event::Action::Mixin::credit_bill
+             FS::part_event::Action::Mixin::credit_sales_pkg_class
+             FS::part_event::Action::bill_sales_credit
+             );
+
+sub description { "Credit the sales person based on their commission percentage for the package's class"; }
+
+1;
diff --git a/FS/FS/part_event/Action/pkg_agent_credit.pm b/FS/FS/part_event/Action/pkg_agent_credit.pm
index 494c40e..65f8c27 100644
--- a/FS/FS/part_event/Action/pkg_agent_credit.pm
+++ b/FS/FS/part_event/Action/pkg_agent_credit.pm
@@ -1,7 +1,8 @@
 package FS::part_event::Action::pkg_agent_credit;
 
 use strict;
-use base qw( FS::part_event::Action::pkg_referral_credit );
+use base qw( FS::part_event::Action::Mixin::credit_flat
+             FS::part_event::Action );
 
 sub description { 'Credit the agent a specific amount'; }
 
@@ -18,7 +19,7 @@ sub do_action {
   my $agent_cust_main = $agent->agent_cust_main;
     #? or return "No customer record for agent ". $agent->agent;
 
-  my $amount = $self->_calc_credit($cust_pkg);
+  my $amount = $self->_calc_credit($cust_pkg, $agent);
   return '' unless $amount > 0;
 
   my $reasonnum = $self->option('reasonnum');
diff --git a/FS/FS/part_event/Action/pkg_agent_credit_pkg_class.pm b/FS/FS/part_event/Action/pkg_agent_credit_pkg_class.pm
index 3dcf668..92c1556 100644
--- a/FS/FS/part_event/Action/pkg_agent_credit_pkg_class.pm
+++ b/FS/FS/part_event/Action/pkg_agent_credit_pkg_class.pm
@@ -1,7 +1,8 @@
 package FS::part_event::Action::pkg_agent_credit_pkg_class;
 
 use strict;
-use base qw( FS::part_event::Action::Mixin::credit_agent_pkg_class
+use base qw( FS::part_event::Action::Mixin::credit_pkg
+             FS::part_event::Action::Mixin::credit_agent_pkg_class
              FS::part_event::Action::pkg_agent_credit );
 
 sub description { 'Credit the agent an amount based on their commission percentage for the referred package class'; }
diff --git a/FS/FS/part_event/Action/pkg_employee_credit.pm b/FS/FS/part_event/Action/pkg_employee_credit.pm
index 64dd8b2..6cbe9bc 100644
--- a/FS/FS/part_event/Action/pkg_employee_credit.pm
+++ b/FS/FS/part_event/Action/pkg_employee_credit.pm
@@ -1,7 +1,8 @@
 package FS::part_event::Action::pkg_employee_credit;
 
 use strict;
-use base qw( FS::part_event::Action::pkg_referral_credit );
+use base qw( FS::part_event::Action::Mixin::credit_flat
+             FS::part_event::Action );
 
 sub description { 'Credit the ordering employee a specific amount'; }
 
@@ -18,7 +19,7 @@ sub do_action {
   my $employee_cust_main = $employee->user_cust_main;
     #? or return "No customer record for employee ". $employee->username;
 
-  my $amount    = $self->_calc_credit($cust_pkg);
+  my $amount    = $self->_calc_credit($cust_pkg, $employee);
   return '' unless $amount > 0;
 
   my $reasonnum = $self->option('reasonnum');
diff --git a/FS/FS/part_event/Action/pkg_referral_credit.pm b/FS/FS/part_event/Action/pkg_referral_credit.pm
index e7c92d6..9d7bbf8 100644
--- a/FS/FS/part_event/Action/pkg_referral_credit.pm
+++ b/FS/FS/part_event/Action/pkg_referral_credit.pm
@@ -1,7 +1,8 @@
 package FS::part_event::Action::pkg_referral_credit;
 
 use strict;
-use base qw( FS::part_event::Action );
+use base qw( FS::part_event::Action::Mixin::credit_flat
+             FS::part_event::Action  );
 
 sub description { 'Credit the referring customer a specific amount'; }
 
@@ -9,19 +10,6 @@ sub eventtable_hashref {
   { 'cust_pkg' => 1 };
 }
 
-sub option_fields {
-  ( 
-    'reasonnum' => { 'label'        => 'Credit reason',
-                     'type'         => 'select-reason',
-                     'reason_class' => 'R',
-                   },
-    'amount'    => { 'label'        => 'Credit amount',
-                     'type'         => 'money',
-                   },
-  );
-
-}
-
 sub do_action {
   my( $self, $cust_pkg, $cust_event ) = @_;
 
@@ -35,7 +23,7 @@ sub do_action {
   return 'Referring customer is cancelled'
     if $referring_cust_main->status eq 'cancelled';
 
-  my $amount    = $self->_calc_credit($cust_pkg);
+  my $amount    = $self->_calc_credit($cust_pkg, $referring_cust_main);
   return '' unless $amount > 0;
 
   my $reasonnum = $self->option('reasonnum');
@@ -53,10 +41,4 @@ sub do_action {
 
 }
 
-sub _calc_credit {
-  my( $self, $cust_pkg ) = @_;
-
-  $self->option('amount');
-}
-
 1;
diff --git a/FS/FS/part_event/Action/pkg_sales_credit.pm b/FS/FS/part_event/Action/pkg_sales_credit.pm
index e7551cd..3c569ca 100644
--- a/FS/FS/part_event/Action/pkg_sales_credit.pm
+++ b/FS/FS/part_event/Action/pkg_sales_credit.pm
@@ -1,12 +1,15 @@
 package FS::part_event::Action::pkg_sales_credit;
-use base qw( FS::part_event::Action::Mixin::pkg_sales_credit
-             FS::part_event::Action::pkg_referral_credit );
+use base qw( FS::part_event::Action::Mixin::credit_flat
+             FS::part_event::Action );
 
 use strict;
 
 sub description { 'Credit the sales person a specific amount'; }
 
-#a little false laziness w/pkg_referral_credit
+sub eventtable_hashref {
+  { 'cust_pkg' => 1 };
+} 
+
 sub do_action {
   my( $self, $cust_pkg, $cust_event ) = @_;
 
@@ -24,7 +27,7 @@ sub do_action {
   my $sales_cust_main = $sales->sales_cust_main;
     #? or return "No customer record for sales person ". $sales->salesperson;
 
-  my $amount = $self->_calc_credit($cust_pkg);
+  my $amount = $self->_calc_credit($cust_pkg, $sales);
   return '' unless $amount > 0;
 
   my $reasonnum = $self->option('reasonnum');
diff --git a/FS/FS/part_event/Action/pkg_sales_credit_pkg.pm b/FS/FS/part_event/Action/pkg_sales_credit_pkg.pm
index 9b13cd8..bd165f1 100644
--- a/FS/FS/part_event/Action/pkg_sales_credit_pkg.pm
+++ b/FS/FS/part_event/Action/pkg_sales_credit_pkg.pm
@@ -1,4 +1,6 @@
 package FS::part_event::Action::pkg_sales_credit_pkg;
+
+# yes, they must be in this order
 use base qw( FS::part_event::Action::Mixin::pkg_sales_credit
              FS::part_event::Action::Mixin::credit_pkg
              FS::part_event::Action::pkg_sales_credit );
diff --git a/FS/FS/part_event/Action/pkg_sales_credit_pkg_class.pm b/FS/FS/part_event/Action/pkg_sales_credit_pkg_class.pm
index c69c004..53ffc6c 100644
--- a/FS/FS/part_event/Action/pkg_sales_credit_pkg_class.pm
+++ b/FS/FS/part_event/Action/pkg_sales_credit_pkg_class.pm
@@ -1,8 +1,10 @@
 package FS::part_event::Action::pkg_sales_credit_pkg_class;
 
 use base qw( FS::part_event::Action::Mixin::pkg_sales_credit
+             FS::part_event::Action::Mixin::credit_pkg
              FS::part_event::Action::Mixin::credit_sales_pkg_class
-             FS::part_event::Action::pkg_sales_credit );
+             FS::part_event::Action::pkg_sales_credit
+             );
 
 sub description { "Credit the package sales person an amount based on their commission percentage for the package's class"; }
 

-----------------------------------------------------------------------

Summary of changes:
 .../Action/Mixin/credit_agent_pkg_class.pm         |   15 ++--
 FS/FS/part_event/Action/Mixin/credit_bill.pm       |   95 ++++++++++++++++++++
 FS/FS/part_event/Action/Mixin/credit_flat.pm       |   25 ++++++
 FS/FS/part_event/Action/Mixin/credit_pkg.pm        |   33 ++++---
 .../Action/Mixin/credit_sales_pkg_class.pm         |   20 +----
 FS/FS/part_event/Action/bill_sales_credit.pm       |   91 +++++++++++++++++++
 .../Action/bill_sales_credit_pkg_class.pm          |   11 +++
 FS/FS/part_event/Action/pkg_agent_credit.pm        |    5 +-
 .../Action/pkg_agent_credit_pkg_class.pm           |    3 +-
 FS/FS/part_event/Action/pkg_employee_credit.pm     |    5 +-
 FS/FS/part_event/Action/pkg_referral_credit.pm     |   24 +----
 FS/FS/part_event/Action/pkg_sales_credit.pm        |   11 ++-
 FS/FS/part_event/Action/pkg_sales_credit_pkg.pm    |    2 +
 .../Action/pkg_sales_credit_pkg_class.pm           |    4 +-
 httemplate/edit/process/part_event.html            |   15 ++--
 httemplate/elements/tr-select-reason.html          |    1 +
 16 files changed, 287 insertions(+), 73 deletions(-)
 create mode 100644 FS/FS/part_event/Action/Mixin/credit_bill.pm
 create mode 100644 FS/FS/part_event/Action/Mixin/credit_flat.pm
 create mode 100644 FS/FS/part_event/Action/bill_sales_credit.pm
 create mode 100644 FS/FS/part_event/Action/bill_sales_credit_pkg_class.pm




More information about the freeside-commits mailing list