fix creation of custom discounts on quotations, and ordering of discounted quoted...
authorMark Wells <mark@freeside.biz>
Fri, 6 Feb 2015 00:17:55 +0000 (16:17 -0800)
committerMark Wells <mark@freeside.biz>
Fri, 6 Feb 2015 00:18:03 +0000 (16:18 -0800)
FS/FS/cust_pkg_discount.pm
FS/FS/pkg_discount_Mixin.pm [new file with mode: 0644]
FS/FS/quotation.pm
FS/FS/quotation_pkg.pm
FS/FS/quotation_pkg_discount.pm
FS/MANIFEST
FS/t/pkg_discount_Mixin.t [new file with mode: 0644]

index b74a231..5d0f85b 100644 (file)
@@ -1,5 +1,8 @@
 package FS::cust_pkg_discount;
 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 );
 
 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.
 
 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.
 =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 (file)
index 0000000..c6fe008
--- /dev/null
@@ -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;
index 38e7318..9cef3c1 100644 (file)
@@ -341,15 +341,23 @@ If there is an error, returns an error message, otherwise returns false.
 sub order {
   my $self = shift;
 
 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 );
 
 }
 
 
 }
 
index 3813fb2..ea8f4e0 100644 (file)
@@ -103,8 +103,11 @@ otherwise returns false.
 
 =cut
 
 
 =cut
 
+use Data::Dumper; #XXX DEBUG
 sub insert {
   my ($self, %options) = @_;
 sub insert {
   my ($self, %options) = @_;
+  warn Dumper($self);
+  warn Dumper(\%options);
 
   my $dbh = dbh;
   my $oldAutoCommit = $FS::UID::AutoCommit;
 
   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.
 
   # 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;
   foreach my $pkg_discount ($self->quotation_pkg_discount) {
 
     my $discount = $pkg_discount->discount;
index 633308c..9fdae3e 100644 (file)
@@ -1,5 +1,6 @@
 package FS::quotation_pkg_discount;
 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;
 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.
 
 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.
 
 =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.
 
 =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.
 =item check
 
 Checks all fields to make sure this is a valid quotation package discount.
index e5e29b4..b7d347b 100644 (file)
@@ -838,3 +838,5 @@ FS/prospect_contact.pm
 t/prospect_contact.t
 FS/cust_contact.pm
 t/cust_contact.t
 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 (file)
index 0000000..d811a92
--- /dev/null
@@ -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";