X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fquotation_pkg.pm;h=79cce80fa959ed7112c7a60667722259aaa99f9e;hb=0692ff47a2eac65616bf24104a51e558506f1b8f;hp=48d59065e4e9323ce6aac5dd7ca1b3697a426be1;hpb=4b65016d2e366d5a8f0956ec99ecb6d7d85351d7;p=freeside.git diff --git a/FS/FS/quotation_pkg.pm b/FS/FS/quotation_pkg.pm index 48d59065e..79cce80fa 100644 --- a/FS/FS/quotation_pkg.pm +++ b/FS/FS/quotation_pkg.pm @@ -1,10 +1,10 @@ package FS::quotation_pkg; +use base qw( FS::TemplateItem_Mixin FS::Record ); use strict; -use base qw( FS::Record ); -use FS::Record; # qw( qsearch qsearchs ); +use FS::Record qw( qsearchs ); #qsearch use FS::part_pkg; -use FS::cust_location; +use FS::quotation_pkg_discount; #so its loaded when TemplateItem_Mixin needs it =head1 NAME @@ -80,6 +80,14 @@ points to. You can ask the object for a copy with the I method. sub table { 'quotation_pkg'; } +sub display_table { 'quotation_pkg'; } + +#forget it, just overriding cust_bill_pkg_display entirely +#sub display_table_orderby { 'quotationpkgnum'; } # something else? +# # (for invoice display order) + +sub discount_table { 'quotation_pkg_discount'; } + =item insert Adds this record to the database. If there is an error, returns the error, @@ -107,8 +115,9 @@ sub check { my $error = $self->ut_numbern('quotationpkgnum') - || $self->ut_foreign_key('pkgpart', 'part_pkg', 'pkgpart' ) - || $self->ut_foreign_keyn('locationnum', 'cust_location', 'locationnum' ) + || $self->ut_foreign_key( 'quotationnum', 'quotation', 'quotationnum' ) + || $self->ut_foreign_key( 'pkgpart', 'part_pkg', 'pkgpart' ) + || $self->ut_foreign_keyn( 'locationnum', 'cust_location', 'locationnum' ) || $self->ut_numbern('start_date') || $self->ut_numbern('contract_end') || $self->ut_numbern('quantity') @@ -119,6 +128,127 @@ sub check { $self->SUPER::check; } +#it looks redundant with a v4.x+ auto-generated method, but need to override +# FS::TemplateItem_Mixin's version +sub part_pkg { + my $self = shift; + qsearchs('part_pkg', { 'pkgpart' => $self->pkgpart } ); +} + +sub desc { + my $self = shift; + $self->part_pkg->pkg; +} + +sub setup { + my $self = shift; + return '0.00' if $self->waive_setup eq 'Y' || $self->{'_NO_SETUP_KLUDGE'}; + my $part_pkg = $self->part_pkg; + #my $setup = $part_pkg->can('base_setup') ? $part_pkg->base_setup + # : $part_pkg->option('setup_fee'); + my $setup = $part_pkg->option('setup_fee'); + #XXX discounts + $setup *= $self->quantity if $self->quantity; + sprintf('%.2f', $setup); + +} + +sub recur { + my $self = shift; + return '0.00' if $self->{'_NO_RECUR_KLUDGE'}; + my $part_pkg = $self->part_pkg; + my $recur = $part_pkg->can('base_recur') ? $part_pkg->base_recur($self) + : $part_pkg->option('recur_fee'); + #XXX discounts + $recur *= $self->quantity if $self->quantity; + sprintf('%.2f', $recur); +} + +=item part_pkg_currency_option OPTIONNAME + +Returns a two item list consisting of the currency of this quotation's customer +or prospect, if any, and a value for the provided option. If the customer or +prospect has a currency, the value is the option value the given name and the +currency (see L). Otherwise, if the customer or +prospect has no currency, is the regular option value for the given name (see +L). + +=cut + +#false laziness w/cust_pkg->part_pkg_currency_option +sub part_pkg_currency_option { + my( $self, $optionname ) = @_; + my $part_pkg = $self->part_pkg; + my $prospect_or_customer = $self->cust_main || $self->prospect_main; + if ( my $currency = $prospect_or_customer->currency ) { + ($currency, $part_pkg->part_pkg_currency_option($currency, $optionname) ); + } else { + ('', $part_pkg->option($optionname) ); + } +} + + +=item cust_bill_pkg_display [ type => TYPE ] + +=cut + +sub cust_bill_pkg_display { + my ( $self, %opt ) = @_; + + my $type = $opt{type} if exists $opt{type}; + return () if $type eq 'U'; #quotations don't have usage + + if ( $self->get('display') ) { + return ( grep { defined($type) ? ($type eq $_->type) : 1 } + @{ $self->get('display') } + ); + } else { + + #?? + my $setup = $self->new($self->hashref); + $setup->{'_NO_RECUR_KLUDGE'} = 1; + $setup->{'type'} = 'S'; + my $recur = $self->new($self->hashref); + $recur->{'_NO_SETUP_KLUDGE'} = 1; + $recur->{'type'} = 'R'; + + if ( $type eq 'S' ) { + return ($setup); + } elsif ( $type eq 'R' ) { + return ($recur); + } else { + #return ($setup, $recur); + return ($self); + } + + } + +} + +=item cust_main + +Returns the customer (L object). + +=cut + +sub cust_main { + my $self = shift; + my $quotation = FS::quotation->by_key($self->quotationnum) or return ''; + $quotation->cust_main; +} + +=item prospect_main + +Returns the prospect (L object). + +=cut + +sub prospect_main { + my $self = shift; + my $quotation = FS::quotation->by_key($self->quotationnum) or return ''; + $quotation->prospect_main; +} + =back =head1 BUGS