add skip_dcontext_suffix to skip CDRs with dcontext ending in a definable string...
[freeside.git] / FS / FS / part_pkg / agent.pm
index 0e89f42..1a5b615 100644 (file)
@@ -14,8 +14,8 @@ $DEBUG = 0;
 $me = '[FS::part_pkg::agent]';
 
 %info = (
-  'name'      => 'Wholesale bulk billing, for master customers of an agent.',
-  'shortname' => 'Wholesale bulk billing for agent.',
+  'name'      => 'Wholesale billing based on package prices, for master customers of an agent.',
+  'shortname' => 'Wholesale billing for agent (package prices)',
   'inherit_fields' => [qw( prorate global_Mixin)],
   'fields' => {
     #'recur_method'  => { 'name' => 'Recurring fee method',
@@ -36,9 +36,17 @@ $me = '[FS::part_pkg::agent]';
                             'type' => 'checkbox',
                           },
 
+    'display_separate_cust'=> { 'name' => 'Separate customer from package display on invoices',
+                                'type' => 'checkbox',
+                              },
+
+    'cost_only' => { 'name' => 'Bill wholesale on cost only, disabling the price fallback',
+                     'type' => 'checkbox' 
+                   },
+
   },
 
-  'fieldorder' => [qw( cutoff_day add_full_period no_pkg_prorate ) ],
+  'fieldorder' => [qw( cutoff_day add_full_period no_pkg_prorate display_separate_cust cost_only) ],
 
   'weight' => 52,
 
@@ -86,23 +94,26 @@ sub calc_recur {
         if $DEBUG;
 
       #make sure setup dates are filled in
-      my $error = $cust_main->bill; #options don't propogate from freeside-daily
+      my $error = $cust_main->bill( time => $$sdate );
       die "Error pre-billing agent customer: $error" if $error;
 
       my @cust_pkg = grep { my $setup  = $_->get('setup');
                             my $cancel = $_->get('cancel');
 
+                            #$setup <= $$sdate  # ?
                             $setup < $$sdate  # END
                             && ( ! $cancel || $cancel > $last_bill ) #START
                           }
                      $cust_main->all_pkgs;
 
+      my $cust_details = 0;
+
       foreach my $cust_pkg ( @cust_pkg ) {
 
         warn "$me billing agent charges for pkgnum ". $cust_pkg->pkgnum. "\n"
           if $DEBUG;
 
-        my $pkg_details = $cust_main->name_short. ': '; #name?
+        my $pkg_details = '';
 
         my $cust_location = $cust_pkg->cust_location;
         $pkg_details .= $cust_location->locationname. ': '
@@ -118,11 +129,15 @@ sub calc_recur {
 
         my $quantity = $cust_pkg->quantity || 1;
 
-        #option to not fallback? via options above
-        my $pkg_setup_fee  =
-          $part_pkg->setup_cost || $part_pkg->option('setup_fee');
-        my $pkg_base_recur =
-          $part_pkg->recur_cost || $part_pkg->base_recur_permonth($cust_pkg);
+        my $pkg_setup_fee  = $part_pkg->setup_cost;
+        $pkg_setup_fee ||= $part_pkg->option('setup_fee')
+          unless $self->option('cost_only');
+        $pkg_setup_fee ||= 0;
+
+        my $pkg_base_recur = $part_pkg->recur_cost;
+        $pkg_base_recur ||= $part_pkg->base_recur_permonth($cust_pkg)
+          unless $self->option('cost_only');
+        $pkg_base_recur ||= 0;
 
         my $pkg_start = $cust_pkg->get('setup');
         if ( $pkg_start < $last_bill ) {
@@ -159,12 +174,21 @@ sub calc_recur {
 
         $pkg_charge += $quantity * $recur_charge;
 
-        push @$details, $pkg_details
-          if $pkg_charge;
+        if ( $pkg_charge ) {
+          if ( $self->option('display_separate_cust') ) {
+            push @$details, $cust_main->name.':' unless $cust_details++;
+            push @$details, '    '.$pkg_details;
+          } else {
+            push @$details, $cust_main->name_short.': '. $pkg_details;
+          }
+        };
+
         $total_agent_charge += $pkg_charge;
 
       } #foreach $cust_pkg
 
+      push @$details, ' ' if $cust_details;
+
     } #foreach $cust_main
 
   } #foreach $agent;