RT# 76093 - added ability for processing fee to be used with batch processing. V3...
[freeside.git] / FS / FS / quotation_pkg.pm
index 1a2fadc..5607b9c 100644 (file)
@@ -114,6 +114,22 @@ sub insert {
   my $oldAutoCommit = $FS::UID::AutoCommit;
   local $FS::UID::AutoCommit = 0;
 
+  #false laziness w/cust_main::Packages::order_pkg
+  if ( $options{'locationnum'} and $options{'locationnum'} != -1 ) {
+
+    $self->locationnum($options{'locationnum'});
+
+  } elsif ( $options{'cust_location'} ) {
+
+    my $error = $options{'cust_location'}->find_or_insert;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return "inserting cust_location (transaction rolled back): $error";
+    }
+    $self->locationnum($options{'cust_location'}->locationnum);
+
+  }
+
   my $error = $self->SUPER::insert;
 
   if ( !$error and $self->discountnum ) {
@@ -242,25 +258,20 @@ on failure.
 
 sub estimate {
   my $self = shift;
-  my $part_pkg = $self->part_pkg;
-  my $quantity = $self->quantity || 1;
-  my ($unitsetup, $unitrecur);
-  # calculate base fees
-  if ( $self->waive_setup eq 'Y' || $self->{'_NO_SETUP_KLUDGE'} ) {
-    $unitsetup = '0.00';
-  } else {
-    $unitsetup = $part_pkg->option('setup_fee',1) || '0.00'; # XXX 3.x only
-  }
-  if ( $self->{'_NO_RECUR_KLUDGE'} ) {
-    $unitrecur = '0.00';
-  } else {
-    $unitrecur = $part_pkg->base_recur;
-  }
 
-  #XXX add-on packages
+  my( $unitsetup, $unitrecur ) = (0, 0);
+  foreach my $part_pkg ( $self->part_pkg->self_and_bill_linked ) {
+
+    $unitsetup += $part_pkg->option('setup_fee',1) || '0' # 3.x only
+      unless $self->waive_setup eq 'Y' || $self->{'_NO_SETUP_KLUDGE'};
 
-  $self->set('unitsetup', $unitsetup);
-  $self->set('unitrecur', $unitrecur);
+    $unitrecur += $part_pkg->base_recur
+      unless $self->{'_NO_RECUR_KLUDGE'};
+
+  }
+
+  $self->set('unitsetup', sprintf('%.2f', $unitsetup) );
+  $self->set('unitrecur', sprintf('%.2f', $unitrecur) );
   my $error = $self->replace;
   return $error if $error;
 
@@ -384,12 +395,22 @@ sub setup {
     * ($self->quantity || 1);
 }
 
+sub setup_show_zero {
+  my $self = shift;
+  return $self->part_pkg->setup_show_zero;
+}
+
 sub recur {
   my $self = shift;
   ($self->unitrecur - sum(0, map { $_->recur_amount } $self->pkg_discount))
     * ($self->quantity || 1);
 }
 
+sub recur_show_zero {
+  my $self = shift;
+  return $self->part_pkg->recur_show_zero;
+}
+
 =item delete_details
 
 Deletes all quotation_pkgs_details associated with this pkg (see L<FS::quotation_pkg_detail>).
@@ -416,16 +437,27 @@ sub delete_details {
 
 }
 
-=item set_details [ DETAIL, DETAIL, ... ]
+=item set_details PARAM
+
+Sets new quotation details for this package (see L<FS::quotation_pkg_detail>),
+removing existing details.
 
-Sets quotation details for this package (see L<FS::quotation_pkg_detail>).
+Recognizes the following parameters:
+
+details - arrayref of strings, one for each new detail
+
+copy_on_order - if true, sets copy_on_order flag on new details
 
 If there is an error, returns the error, otherwise returns false.
 
 =cut
 
 sub set_details {
-  my( $self, @details ) = @_;
+  my $self = shift;
+  my %opt = @_;
+
+  $opt{'details'} ||= [];
+  my @details = @{$opt{'details'}};
 
   my $oldAutoCommit = $FS::UID::AutoCommit;
   local $FS::UID::AutoCommit = 0;
@@ -441,6 +473,7 @@ sub set_details {
     my $quotation_pkg_detail = new FS::quotation_pkg_detail {
       'quotationpkgnum' => $self->quotationpkgnum,
       'detail' => $detail,
+      'copy_on_order' => $opt{'copy_on_order'} ? 'Y' : '',
     };
     $error = $quotation_pkg_detail->insert;
     if ( $error ) {
@@ -519,6 +552,12 @@ sub quotation {
   FS::quotation->by_key($self->quotationnum);
 }
 
+sub quotation_pkg_detail {
+  my $self = shift;
+  sort { $a->detailnum <=> $b->detailnum }
+    qsearch('quotation_pkg_detail', { quotationpkgnum => $self->quotationpkgnum });
+}
+
 sub quotation_pkg_discount {
   my $self = shift;
   qsearch('quotation_pkg_discount', { quotationpkgnum => $self->quotationpkgnum });