my $oldAutoCommit = $FS::UID::AutoCommit;
local $FS::UID::AutoCommit = 0;
+ #false laziness w/cust_main::Packages::order_pkg
+ if ( $options{'locationnum'} and $options{'locationnum'} != -1 ) {
+
+ $self->locationnum($options{'locationnum'});
+
+ } elsif ( $options{'cust_location'} ) {
+
+ my $error = $options{'cust_location'}->find_or_insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "inserting cust_location (transaction rolled back): $error";
+ }
+ $self->locationnum($options{'cust_location'}->locationnum);
+
+ }
+
my $error = $self->SUPER::insert;
if ( !$error and $self->discountnum ) {
sub estimate {
my $self = shift;
- my $part_pkg = $self->part_pkg;
- my $quantity = $self->quantity || 1;
- my ($unitsetup, $unitrecur);
- # calculate base fees
- if ( $self->waive_setup eq 'Y' || $self->{'_NO_SETUP_KLUDGE'} ) {
- $unitsetup = '0.00';
- } else {
- $unitsetup = $part_pkg->option('setup_fee',1) || '0.00'; # XXX 3.x only
- }
- if ( $self->{'_NO_RECUR_KLUDGE'} ) {
- $unitrecur = '0.00';
- } else {
- $unitrecur = $part_pkg->base_recur;
- }
- #XXX add-on packages
+ my( $unitsetup, $unitrecur ) = (0, 0);
+ foreach my $part_pkg ( $self->part_pkg->self_and_bill_linked ) {
+
+ $unitsetup += $part_pkg->option('setup_fee',1) || '0' # 3.x only
+ unless $self->waive_setup eq 'Y' || $self->{'_NO_SETUP_KLUDGE'};
- $self->set('unitsetup', $unitsetup);
- $self->set('unitrecur', $unitrecur);
+ $unitrecur += $part_pkg->base_recur
+ unless $self->{'_NO_RECUR_KLUDGE'};
+
+ }
+
+ $self->set('unitsetup', sprintf('%.2f', $unitsetup) );
+ $self->set('unitrecur', sprintf('%.2f', $unitrecur) );
my $error = $self->replace;
return $error if $error;
* ($self->quantity || 1);
}
+sub setup_show_zero {
+ my $self = shift;
+ return $self->part_pkg->setup_show_zero;
+}
+
sub recur {
my $self = shift;
($self->unitrecur - sum(0, map { $_->recur_amount } $self->pkg_discount))
* ($self->quantity || 1);
}
+sub recur_show_zero {
+ my $self = shift;
+ return $self->part_pkg->recur_show_zero;
+}
+
=item delete_details
Deletes all quotation_pkgs_details associated with this pkg (see L<FS::quotation_pkg_detail>).
}
-=item set_details [ DETAIL, DETAIL, ... ]
+=item set_details PARAM
+
+Sets new quotation details for this package (see L<FS::quotation_pkg_detail>),
+removing existing details.
-Sets quotation details for this package (see L<FS::quotation_pkg_detail>).
+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, @details ) = @_;
+ my $self = shift;
+ my %opt = @_;
+
+ $opt{'details'} ||= [];
+ my @details = @{$opt{'details'}};
my $oldAutoCommit = $FS::UID::AutoCommit;
local $FS::UID::AutoCommit = 0;
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 ) {
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 });