X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg.pm;h=1e16f29e7faac71dc1cd86ea7f31b6048a030079;hb=6626dc2a13c809092aa539c5a72bc72a0c56afdc;hp=3bd559aac107b765517da3e22a0dfc58b8f5c551;hpb=9509e5bfb7f9331303153cac24d7bfecbe2ea9f1;p=freeside.git diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 3bd559aac..1e16f29e7 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -13,6 +13,9 @@ use FS::agent_type; use FS::type_pkgs; use FS::part_pkg_option; use FS::pkg_class; +use FS::agent; +use FS::part_pkg_taxoverride; +use FS::part_pkg_taxproduct; @ISA = qw( FS::m2m_Common FS::Record ); # FS::option_Common ); # this can use option_Common # when all the plandata bs is @@ -85,6 +88,8 @@ inherits from FS::Record. The following fields are currently supported: =item credit_weight - Weight (relative to other package definitions) that controls credit application to specific line items. +=item agentnum - Optional agentnum (see L) + =back =head1 METHODS @@ -449,6 +454,7 @@ sub check { || $self->ut_enum('disabled', [ '', 'Y' ] ) || $self->ut_floatn('pay_weight') || $self->ut_floatn('credit_weight') + || $self->ut_agentnum_acl('agentnum', 'Edit global package definitions') || $self->SUPER::check ; return $error if $error; @@ -501,6 +507,17 @@ sub classname { : ''; } +=item agent + +Returns the associated agent for this event, if any, as an FS::agent object. + +=cut + +sub agent { + my $self = shift; + qsearchs('agent', { 'agentnum' => $self->agentnum } ); +} + =item pkg_svc Returns all FS::pkg_svc objects (see L) for this package @@ -588,24 +605,27 @@ sub freqs_href { #method, class method or sub? #my $self = shift; tie my %freq, 'Tie::IxHash', - '0' => '(no recurring fee)', - '1h' => 'hourly', - '1d' => 'daily', - '2d' => 'every two days', - '1w' => 'weekly', - '2w' => 'biweekly (every 2 weeks)', - '1' => 'monthly', - '45d' => 'every 45 days', - '2' => 'bimonthly (every 2 months)', - '3' => 'quarterly (every 3 months)', - '6' => 'semiannually (every 6 months)', - '12' => 'annually', - '13' => 'every 13 months (annually +1 month)', - '24' => 'biannually (every 2 years)', - '36' => 'triannually (every 3 years)', - '48' => '(every 4 years)', - '60' => '(every 5 years)', - '120' => '(every 10 years)', + '0' => '(no recurring fee)', + '1h' => 'hourly', + '1d' => 'daily', + '2d' => 'every two days', + '3d' => 'every three days', + '1w' => 'weekly', + '2w' => 'biweekly (every 2 weeks)', + '1' => 'monthly', + '45d' => 'every 45 days', + '2' => 'bimonthly (every 2 months)', + '3' => 'quarterly (every 3 months)', + '4' => 'every 4 months', + '137d' => 'every 4 1/2 months (137 days)', + '6' => 'semiannually (every 6 months)', + '12' => 'annually', + '13' => 'every 13 months (annually +1 month)', + '24' => 'biannually (every 2 years)', + '36' => 'triannually (every 3 years)', + '48' => '(every 4 years)', + '60' => '(every 5 years)', + '120' => '(every 10 years)', ; \%freq; @@ -708,6 +728,65 @@ sub option { ''; } +=item part_pkg_taxoverride + +Returns all options as FS::part_pkg_taxoverride objects (see +L). + +=cut + +sub part_pkg_taxoverride { + my $self = shift; + qsearch('part_pkg_taxoverride', { 'pkgpart' => $self->pkgpart } ); +} + +=item taxproduct_description + +Returns the description of the associated tax product for this package +definition (see L). + +=cut + +sub taxproduct_description { + my $self = shift; + my $part_pkg_taxproduct = + qsearchs( 'part_pkg_taxproduct', + { 'taxproductnum' => $self->taxproductnum } + ); + $part_pkg_taxproduct ? $part_pkg_taxproduct->description : ''; +} + +=item part_pkg_taxrate DATA_PROVIDER, GEOCODE + +Returns the package to taxrate m2m records for this package in the location +specified by GEOCODE (see L and ). + +=cut + +sub part_pkg_taxrate { + my $self = shift; + my ($data_provider, $geocode) = @_; + + my $dbh = dbh; + # CCH oddness in m2m + my $extra_sql = 'AND ('. + join(' OR ', map{ 'geocode = '. $dbh->quote(substr($geocode, 0, $_)) } + qw(10 5 2) + ). + ')'; + my $order_by = 'ORDER BY taxclassnum, length(geocode) desc'; + my $select = 'DISTINCT ON(taxclassnum) *'; + + qsearch( { 'table' => 'part_pkg_taxrate', + 'select' => 'distinct on(taxclassnum) *', + 'hashref' => { 'data_provider' => $data_provider, + 'taxproductnum' => $self->taxproductnum, + }, + 'extra_sql' => $extra_sql, + 'order_by' => $order_by, + } ); +} + =item _rebless Reblesses the object into the FS::part_pkg::PLAN class (if available), where