fix quotations w/ packages w/ add-on packages in v3, RT#74045
[freeside.git] / FS / FS / quotation_pkg.pm
index f3356b5..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'};
+
+    $unitrecur += $part_pkg->base_recur
+      unless $self->{'_NO_RECUR_KLUDGE'};
 
-  $self->set('unitsetup', $unitsetup);
-  $self->set('unitrecur', $unitrecur);
+  }
+
+  $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>).