[freeside-commits] branch master updated. 7bc49d6e6a03b181ca2392d69e5f717e54d2f907

Mark Wells mark at 420.am
Thu Feb 5 16:23:25 PST 2015


The branch, master has been updated
       via  7bc49d6e6a03b181ca2392d69e5f717e54d2f907 (commit)
      from  795a733714d398d4a3d427de1448b7daaf92399d (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 7bc49d6e6a03b181ca2392d69e5f717e54d2f907
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Feb 5 16:17:55 2015 -0800

    fix creation of custom discounts on quotations, and ordering of discounted quoted packages, #33099

diff --git a/FS/FS/cust_pkg_discount.pm b/FS/FS/cust_pkg_discount.pm
index b74a231..5d0f85b 100644
--- a/FS/FS/cust_pkg_discount.pm
+++ b/FS/FS/cust_pkg_discount.pm
@@ -1,5 +1,8 @@
 package FS::cust_pkg_discount;
-use base qw( FS::otaker_Mixin FS::cust_main_Mixin FS::Record );
+use base qw( FS::otaker_Mixin
+             FS::cust_main_Mixin
+             FS::pkg_discount_Mixin
+             FS::Record );
 
 use strict;
 use FS::Record qw( dbh ); # qsearch qsearchs dbh );
@@ -82,52 +85,6 @@ sub table { 'cust_pkg_discount'; }
 Adds this record to the database.  If there is an error, returns the error,
 otherwise returns false.
 
-=cut
-
-sub insert {
-  #my( $self, %options ) = @_;
-  my $self = shift;
-
-  local $SIG{HUP} = 'IGNORE';
-  local $SIG{INT} = 'IGNORE';
-  local $SIG{QUIT} = 'IGNORE';
-  local $SIG{TERM} = 'IGNORE';
-  local $SIG{TSTP} = 'IGNORE';
-  local $SIG{PIPE} = 'IGNORE';
-
-  my $oldAutoCommit = $FS::UID::AutoCommit;
-  local $FS::UID::AutoCommit = 0;
-  my $dbh = dbh;
-
-  if ( $self->discountnum == -1 ) {
-    my $discount = new FS::discount {
-      '_type'    => $self->_type,
-      'amount'   => $self->amount,
-      'percent'  => $self->percent,
-      'months'   => $self->months,
-      'setup'    => $self->setup,
-      #'linked'   => $self->linked,
-      'disabled' => 'Y',
-    };
-    my $error = $discount->insert;
-    if ( $error ) {
-      $dbh->rollback if $oldAutoCommit;
-      return $error;
-    }
-    $self->discountnum($discount->discountnum);
-  }
-
-  my $error = $self->SUPER::insert; #(@_); #(%options);
-  if ( $error ) {
-    $dbh->rollback if $oldAutoCommit;
-    return $error;
-  }
-
-  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-  '';
-
-}
-
 =item delete
 
 Delete this record from the database.
diff --git a/FS/FS/pkg_discount_Mixin.pm b/FS/FS/pkg_discount_Mixin.pm
new file mode 100644
index 0000000..c6fe008
--- /dev/null
+++ b/FS/FS/pkg_discount_Mixin.pm
@@ -0,0 +1,69 @@
+package FS::pkg_discount_Mixin;
+
+use strict;
+use NEXT;
+use FS::Record qw(dbh);
+
+=head1 NAME
+
+FS::pkg_discount_Mixin - mixin class for package-discount link objects.
+
+=head1 DESCRIPTION
+
+Implements some behavior that's common to cust_pkg_discount and 
+quotation_pkg_discount objects. The only required field is "discountnum",
+a foreign key to L<FS::discount>.
+
+=head1 METHODS
+
+=over 4
+
+=item insert
+
+Inserts the record. If the 'discountnum' field is -1, this will first create
+a discount using the contents of the '_type', 'amount', 'percent', 'months',
+and 'setup' field. The new discount will be disabled, since it's a one-off
+discount.
+
+=cut
+
+sub insert {
+  my $self = shift;
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+  
+  if ( $self->discountnum == -1 ) {
+    my $discount = new FS::discount {
+      '_type'    => $self->_type,
+      'amount'   => $self->amount,
+      'percent'  => $self->percent,
+      'months'   => $self->months,
+      'setup'    => $self->setup,
+      #'linked'   => $self->linked,
+      'disabled' => 'Y',
+    };
+    my $error = $discount->insert;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error; 
+    } 
+    $self->set('discountnum', $discount->discountnum);
+  }
+
+  my $error = $self->NEXT::insert;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+  '';
+  
+} 
+
+=back
+
+=cut
+
+1;
diff --git a/FS/FS/quotation.pm b/FS/FS/quotation.pm
index 38e7318..9cef3c1 100644
--- a/FS/FS/quotation.pm
+++ b/FS/FS/quotation.pm
@@ -341,15 +341,23 @@ If there is an error, returns an error message, otherwise returns false.
 sub order {
   my $self = shift;
 
-  tie my %cust_pkg, 'Tie::RefHash',
-    map { FS::cust_pkg->new({ pkgpart  => $_->pkgpart,
-                              quantity => $_->quantity,
-                           })
-            => [] #services
-        }
-      $self->quotation_pkg ;
-
-  $self->cust_main->order_pkgs( \%cust_pkg );
+  tie my %all_cust_pkg, 'Tie::RefHash';
+  foreach my $quotation_pkg ($self->quotation_pkg) {
+    my $cust_pkg = FS::cust_pkg->new;
+    foreach (qw(pkgpart locationnum start_date contract_end quantity waive_setup)) {
+      $cust_pkg->set( $_, $quotation_pkg->get($_) );
+    }
+
+    # currently only one discount each
+    my ($pkg_discount) = $quotation_pkg->quotation_pkg_discount;
+    if ( $pkg_discount ) {
+      $cust_pkg->set('discountnum', $pkg_discount->discountnum);
+    }
+
+    $all_cust_pkg{$cust_pkg} = []; # no services
+  }
+
+  $self->cust_main->order_pkgs( \%all_cust_pkg );
 
 }
 
diff --git a/FS/FS/quotation_pkg.pm b/FS/FS/quotation_pkg.pm
index 3813fb2..ea8f4e0 100644
--- a/FS/FS/quotation_pkg.pm
+++ b/FS/FS/quotation_pkg.pm
@@ -103,8 +103,11 @@ otherwise returns false.
 
 =cut
 
+use Data::Dumper; #XXX DEBUG
 sub insert {
   my ($self, %options) = @_;
+  warn Dumper($self);
+  warn Dumper(\%options);
 
   my $dbh = dbh;
   my $oldAutoCommit = $FS::UID::AutoCommit;
@@ -251,6 +254,9 @@ sub estimate {
 
   # XXX the order of applying discounts is ill-defined, which matters
   # if there are percentage and amount discounts on the same package.
+  #
+  # but right now there can only be one discount on any package, so 
+  # it doesn't matter
   foreach my $pkg_discount ($self->quotation_pkg_discount) {
 
     my $discount = $pkg_discount->discount;
diff --git a/FS/FS/quotation_pkg_discount.pm b/FS/FS/quotation_pkg_discount.pm
index 633308c..9fdae3e 100644
--- a/FS/FS/quotation_pkg_discount.pm
+++ b/FS/FS/quotation_pkg_discount.pm
@@ -1,5 +1,6 @@
 package FS::quotation_pkg_discount;
-use base qw( FS::Record );
+
+use base qw( FS::pkg_discount_Mixin FS::Record );
 use FS::Maketext 'mt'; # XXX not really correct
 
 use strict;
@@ -78,27 +79,15 @@ sub table { 'quotation_pkg_discount'; }
 Adds this record to the database.  If there is an error, returns the error,
 otherwise returns false.
 
-=cut
-
-# the insert method can be inherited from FS::Record
-
 =item delete
 
 Delete this record from the database.
 
-=cut
-
-# the delete method can be inherited from FS::Record
-
 =item replace OLD_RECORD
 
 Replaces the OLD_RECORD with this one in the database.  If there is an error,
 returns the error, otherwise returns false.
 
-=cut
-
-# the replace method can be inherited from FS::Record
-
 =item check
 
 Checks all fields to make sure this is a valid quotation package discount.
diff --git a/FS/MANIFEST b/FS/MANIFEST
index e5e29b4..b7d347b 100644
--- a/FS/MANIFEST
+++ b/FS/MANIFEST
@@ -838,3 +838,5 @@ FS/prospect_contact.pm
 t/prospect_contact.t
 FS/cust_contact.pm
 t/cust_contact.t
+FS/pkg_discount_Mixin.pm
+t/pkg_discount_Mixin.t
diff --git a/FS/t/pkg_discount_Mixin.t b/FS/t/pkg_discount_Mixin.t
new file mode 100644
index 0000000..d811a92
--- /dev/null
+++ b/FS/t/pkg_discount_Mixin.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::pkg_discount_Mixin;
+$loaded=1;
+print "ok 1\n";

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

Summary of changes:
 FS/FS/cust_pkg_discount.pm                   |   51 ++-----------------
 FS/FS/pkg_discount_Mixin.pm                  |   69 ++++++++++++++++++++++++++
 FS/FS/quotation.pm                           |   26 ++++++----
 FS/FS/quotation_pkg.pm                       |    6 +++
 FS/FS/quotation_pkg_discount.pm              |   15 +-----
 FS/MANIFEST                                  |    2 +
 FS/t/{AccessRight.t => pkg_discount_Mixin.t} |    2 +-
 7 files changed, 101 insertions(+), 70 deletions(-)
 create mode 100644 FS/FS/pkg_discount_Mixin.pm
 copy FS/t/{AccessRight.t => pkg_discount_Mixin.t} (78%)




More information about the freeside-commits mailing list