X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fquotation_pkg.pm;h=1674d2bc90360622216a76ab6a990874613eff2e;hb=b37cafd2acd4ab2c38b44bc4d8ebde76936ef6bb;hp=3813fb22c3d5647faa1d3941dc10ef5f7ec506ea;hpb=899cf5029429c1183024cd4bf838573a951d0ede;p=freeside.git diff --git a/FS/FS/quotation_pkg.pm b/FS/FS/quotation_pkg.pm index 3813fb22c..1674d2bc9 100644 --- a/FS/FS/quotation_pkg.pm +++ b/FS/FS/quotation_pkg.pm @@ -2,7 +2,7 @@ package FS::quotation_pkg; use base qw( FS::TemplateItem_Mixin FS::Record ); use strict; -use FS::Record qw( qsearchs dbh ); #qsearch +use FS::Record qw( qsearchs qsearch dbh ); use FS::part_pkg; use FS::quotation_pkg_discount; #so its loaded when TemplateItem_Mixin needs it use List::Util qw(sum); @@ -70,6 +70,11 @@ The amount per package that will be charged in setup/one-time fees. The amount per package that will be charged per billing cycle. +=item freq + +The length of the billing cycle. If zero it's a one-time charge; if any +other number it's that many months; other values are in L. + =back =head1 METHODS @@ -145,7 +150,7 @@ sub delete { my $oldAutoCommit = $FS::UID::AutoCommit; local $FS::UID::AutoCommit = 0; - foreach ($self->quotation_pkg_discount) { + foreach ($self->quotation_pkg_discount, $self->quotation_pkg_tax) { my $error = $_->delete; if ( $error ) { $dbh->rollback if $oldAutoCommit; @@ -180,6 +185,8 @@ and replace methods. sub check { my $self = shift; + my @freqs = ('', keys (%{ FS::Misc->pkg_freqs })); + my $error = $self->ut_numbern('quotationpkgnum') || $self->ut_foreign_key( 'quotationnum', 'quotation', 'quotationnum' ) @@ -190,9 +197,24 @@ sub check { || $self->ut_numbern('quantity') || $self->ut_moneyn('unitsetup') || $self->ut_moneyn('unitrecur') + || $self->ut_enum('freq', \@freqs) || $self->ut_enum('waive_setup', [ '', 'Y'] ) ; + if ($self->locationnum eq '') { + # use the customer default + my $quotation = $self->quotation; + if ($quotation->custnum) { + $self->set('locationnum', $quotation->cust_main->ship_locationnum); + } elsif ($quotation->prospectnum) { + # use the first non-disabled location for that prospect + my $cust_location = qsearchs('cust_location', + { prospectnum => $quotation->prospectnum, + disabled => '' }); + $self->set('locationnum', $cust_location->locationnum) if $cust_location; + } # else the quotation is invalid + } + return $error if $error; $self->SUPER::check; @@ -251,6 +273,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; @@ -312,7 +337,7 @@ sub insert_discount { #my ($self, %options) = @_; my $self = shift; - my $cust_pkg_discount = FS::quotation_pkg_discount->new( { + my $quotation_pkg_discount = FS::quotation_pkg_discount->new( { 'quotationpkgnum' => $self->quotationpkgnum, 'discountnum' => $self->discountnum, #for the create a new discount case @@ -323,7 +348,7 @@ sub insert_discount { 'setup' => $self->discountnum_setup, } ); - $cust_pkg_discount->insert; + $quotation_pkg_discount->insert; } sub _item_discount { @@ -345,7 +370,7 @@ sub _item_discount { push @ext, $pkg_discount->description; $d->{setup_amount} -= $pkg_discount->setup_amount; $d->{recur_amount} -= $pkg_discount->recur_amount; - } + } $d->{setup_amount} *= $self->quantity || 1; $d->{recur_amount} *= $self->quantity || 1; $d->{amount} = $d->{setup_amount} + $d->{recur_amount}; @@ -355,13 +380,13 @@ sub _item_discount { sub setup { my $self = shift; - ($self->unitsetup - sum(map { $_->setup_amount } $self->pkg_discount)) + ($self->unitsetup - sum(0, map { $_->setup_amount } $self->pkg_discount)) * ($self->quantity || 1); } sub recur { my $self = shift; - ($self->unitrecur - sum(map { $_->recur_amount } $self->pkg_discount)) + ($self->unitrecur - sum(0, map { $_->recur_amount } $self->pkg_discount)) * ($self->quantity || 1); } @@ -434,7 +459,7 @@ Returns the customer (L object). sub cust_main { my $self = shift; - my $quotation = FS::quotation->by_key($self->quotationnum) or return ''; + my $quotation = $self->quotation or return ''; $quotation->cust_main; } @@ -446,15 +471,38 @@ Returns the prospect (L object). sub prospect_main { my $self = shift; - my $quotation = FS::quotation->by_key($self->quotationnum) or return ''; + my $quotation = $self->quotation or return ''; $quotation->prospect_main; } +sub tax_locationnum { + my $self = shift; + $self->locationnum; +} + + +sub _upgrade_data { + my $class = shift; + my @quotation_pkg_without_location = + qsearch( 'quotation_pkg', { locationnum => '' } ); + if (@quotation_pkg_without_location) { + warn "setting default location on quotation_pkg records\n"; + foreach my $quotation_pkg (@quotation_pkg_without_location) { + # check() will fix this + my $error = $quotation_pkg->replace; + if ($error) { + die "quotation #".$quotation_pkg->quotationnum.": $error\n"; + } + } + } + ''; +} + =back =head1 BUGS -Doesn't support taxes, fees, or add-on packages. +Doesn't support fees, or add-on packages. =head1 SEE ALSO