From: Mark Wells Date: Fri, 6 Feb 2015 00:17:55 +0000 (-0800) Subject: fix creation of custom discounts on quotations, and ordering of discounted quoted... X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=7bc49d6e6a03b181ca2392d69e5f717e54d2f907 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 b74a23111..5d0f85b5e 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 000000000..c6fe00845 --- /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. + +=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 38e731889..9cef3c191 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 3813fb22c..ea8f4e0c8 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 633308cff..9fdae3efb 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 e5e29b4c9..b7d347b98 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 000000000..d811a9253 --- /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";