summaryrefslogtreecommitdiff
path: root/FS/FS
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2015-02-05 16:17:55 -0800
committerMark Wells <mark@freeside.biz>2015-02-05 16:18:03 -0800
commit7bc49d6e6a03b181ca2392d69e5f717e54d2f907 (patch)
tree19982fce80130d44aad8d17f99e94b4922093836 /FS/FS
parent795a733714d398d4a3d427de1448b7daaf92399d (diff)
fix creation of custom discounts on quotations, and ordering of discounted quoted packages, #33099
Diffstat (limited to 'FS/FS')
-rw-r--r--FS/FS/cust_pkg_discount.pm51
-rw-r--r--FS/FS/pkg_discount_Mixin.pm69
-rw-r--r--FS/FS/quotation.pm26
-rw-r--r--FS/FS/quotation_pkg.pm6
-rw-r--r--FS/FS/quotation_pkg_discount.pm15
5 files changed, 98 insertions, 69 deletions
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.