X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fquotation_pkg.pm;h=f3356b51260baadd38aa402b00fdf01faed76f9a;hb=fd90d3cf458acc4d70e6c20a092e1f2422e907a1;hp=342e9bb9cd2bd1acbe252dfa898dcdb6e7090f04;hpb=4d81504d903cc11cc3637ecc3e6f4af44c59addd;p=freeside.git diff --git a/FS/FS/quotation_pkg.pm b/FS/FS/quotation_pkg.pm index 342e9bb9c..f3356b512 100644 --- a/FS/FS/quotation_pkg.pm +++ b/FS/FS/quotation_pkg.pm @@ -7,6 +7,7 @@ use FS::part_pkg; use FS::cust_location; use FS::quotation; use FS::quotation_pkg_discount; #so its loaded when TemplateItem_Mixin needs it +use FS::quotation_pkg_detail; use List::Util qw(sum); =head1 NAME @@ -97,6 +98,7 @@ sub display_table { 'quotation_pkg'; } # # (for invoice display order) sub discount_table { 'quotation_pkg_discount'; } +sub detail_table { 'quotation_pkg_detail'; } =item insert @@ -147,15 +149,21 @@ sub delete { my $oldAutoCommit = $FS::UID::AutoCommit; local $FS::UID::AutoCommit = 0; + my $error = $self->delete_details; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + foreach ($self->quotation_pkg_discount, $self->quotation_pkg_tax) { - my $error = $_->delete; + $error = $_->delete; if ( $error ) { $dbh->rollback if $oldAutoCommit; return $error . ' (deleting discount)'; } } - my $error = $self->SUPER::delete; + $error = $self->SUPER::delete; if ( $error ) { $dbh->rollback if $oldAutoCommit; return $error; @@ -201,7 +209,11 @@ sub check { if ($quotation->custnum) { $self->set('locationnum', $quotation->cust_main->ship_locationnum); } elsif ($quotation->prospectnum) { - $self->set('locationnum', $quotation->prospect_main->locationnum); + # 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 } @@ -378,6 +390,86 @@ sub recur { * ($self->quantity || 1); } +=item delete_details + +Deletes all quotation_pkgs_details associated with this pkg (see L). + +=cut + +sub delete_details { + my $self = shift; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + foreach my $detail ( qsearch('quotation_pkg_detail',{ 'quotationpkgnum' => $self->quotationpkgnum }) ) { + my $error = $detail->delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "error removing old detail: $error"; + } + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + ''; + +} + +=item set_details PARAM + +Sets new quotation details for this package (see L), +removing existing details. + +Recognizes the following parameters: + +details - arrayref of strings, one for each new detail + +copy_on_order - if true, sets copy_on_order flag on new details + +If there is an error, returns the error, otherwise returns false. + +=cut + +sub set_details { + my $self = shift; + my %opt = @_; + + $opt{'details'} ||= []; + my @details = @{$opt{'details'}}; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $error = $self->delete_details; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + foreach my $detail ( @details ) { + my $quotation_pkg_detail = new FS::quotation_pkg_detail { + 'quotationpkgnum' => $self->quotationpkgnum, + 'detail' => $detail, + 'copy_on_order' => $opt{'copy_on_order'} ? 'Y' : '', + }; + $error = $quotation_pkg_detail->insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "error adding new detail: $error"; + } + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + ''; + +} + +sub details_header { + return (); +} + =item cust_bill_pkg_display [ type => TYPE ] =cut @@ -439,6 +531,12 @@ sub quotation { FS::quotation->by_key($self->quotationnum); } +sub quotation_pkg_detail { + my $self = shift; + sort { $a->detailnum <=> $b->detailnum } + qsearch('quotation_pkg_detail', { quotationpkgnum => $self->quotationpkgnum }); +} + sub quotation_pkg_discount { my $self = shift; qsearch('quotation_pkg_discount', { quotationpkgnum => $self->quotationpkgnum });