$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',
'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' => 51,
+ 'weight' => 52,
);
my $conf = new FS::Conf;
my $money_char = $conf->config('money_char') || '$';
+ my $date_format = $conf->config('date_format') || '%m/%d/%Y';
my $total_agent_charge = 0;
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. ': '
+ if $cust_location->locationname;
+
+ my $part_pkg = $cust_pkg->part_pkg;
+
# + something to identify package... primary service probably
+ # no... package def for now
+ $pkg_details .= $part_pkg->pkg. ': ';
my $pkg_charge = 0;
- my $part_pkg = $cust_pkg->part_pkg;
- #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 $quantity = $cust_pkg->quantity || 1;
+
+ 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 ) {
$pkg_start = $last_bill;
} elsif ( $pkg_setup_fee ) {
- $pkg_charge += $pkg_setup_fee;
- $pkg_details .= $money_char. sprintf('%.2f setup, ', $pkg_setup_fee );
+ $pkg_charge += $quantity * $pkg_setup_fee;
+ $pkg_details .= $money_char.
+ sprintf('%.2f setup', $quantity * $pkg_setup_fee );
+ $pkg_details .= sprintf(" ($quantity \@ $money_char". '%.2f)',
+ $pkg_setup_fee )
+ if $quantity > 1;
+ $pkg_details .= ', ';
}
my $pkg_end = $cust_pkg->get('cancel');
$pkg_end = ( !$pkg_end || $pkg_end > $$sdate ) ? $$sdate : $pkg_end;
-
my $pkg_recur_charge = $prorate_ratio * $pkg_base_recur;
$pkg_recur_charge *= ( $pkg_end - $pkg_start )
/ ( $$sdate - $last_bill )
my $recur_charge += $pkg_recur_charge;
- $pkg_details .= $money_char. sprintf('%.2f', $recur_charge ).
- ' ('. time2str('%x', $pkg_start).
- ' - '. time2str('%x', $pkg_end ). ')'
- if $recur_charge;
+ if ( $recur_charge ) {
+ $pkg_details .= $money_char.
+ sprintf('%.2f', $quantity * $recur_charge );
+ $pkg_details .= sprintf(" ($quantity \@ $money_char". '%.2f)',
+ $recur_charge )
+ if $quantity > 1;
+ $pkg_details .= ' ('. time2str($date_format, $pkg_start).
+ ' - '. time2str($date_format, $pkg_end ). ')';
+ }
+
+ $pkg_charge += $quantity * $recur_charge;
- $pkg_charge += $recur_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;
+ }
+ };
- push @$details, $pkg_details
- if $pkg_charge;
$total_agent_charge += $pkg_charge;
} #foreach $cust_pkg
+ push @$details, ' ' if $cust_details;
+
} #foreach $cust_main
} #foreach $agent;