X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=FS%2FFS%2Fpart_pkg.pm;h=d8b5e9c69bc9be346c2e222d90abd06b9ac40b21;hb=e2d78a94d7806862da7fcea0025cd380d49d5a75;hp=0b2c53d1b2e7ed95505a1ecca853a967937fcaf3;hpb=13a2fbbfbff2e8cc3cfa26a51e8bdbd39d4b0c2e;p=freeside.git diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 0b2c53d1b..d8b5e9c69 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -144,6 +144,10 @@ record itself), the object will be updated to point to this package definition. In conjunction with I, if I is set to a scalar reference, the scalar will be updated with the custnum value from the cust_pkg record. +If I is set to a hashref with usage classes as keys and comma +separated tax class numbers as values, appropriate FS::part_pkg_taxoverride +records will be inserted. + If I is set to a hashref of options, appropriate FS::part_pkg_option records will be inserted. @@ -191,6 +195,22 @@ sub insert { } } + warn " inserting part_pkg_taxoverride records" if $DEBUG; + my %overrides = %{ $options{'tax_overrides'} || {} }; + foreach my $usage_class ( keys %overrides ) { + my @overrides = (grep "$_", split (',', $overrides{$usage_class}) ); + my $error = $self->process_m2m ( + 'link_table' => 'part_pkg_taxoverride', + 'target_table' => 'tax_class', + 'hashref' => { 'usage_class' => $usage_class }, + 'params' => \@overrides, + ); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + warn " inserting pkg_svc records" if $DEBUG; my $pkg_svc = $options{'pkg_svc'} || {}; foreach my $part_svc ( qsearch('part_svc', {} ) ) { @@ -762,7 +782,7 @@ sub option { =item bill_part_pkg_link -Returns the associated part_pkg_link records (see L). =cut @@ -772,6 +792,8 @@ sub bill_part_pkg_link { =item svc_part_pkg_link +Returns the associated part_pkg_link records (see L). + =cut sub svc_part_pkg_link { @@ -799,19 +821,84 @@ sub _self_and_linked { ); } -=item part_pkg_taxoverride +=item part_pkg_taxoverride [ CLASS ] Returns all associated FS::part_pkg_taxoverride objects (see -L). +L). Limits the returned set to those +of class CLASS if defined. Class may be one of 'setup', 'recur', +the empty string (default), or a usage class number (see L). +When a class is specified, the empty string class (default) is returned +if no more specific values exist. =cut sub part_pkg_taxoverride { my $self = shift; - qsearch('part_pkg_taxoverride', { 'pkgpart' => $self->pkgpart } ); + my $class = shift; + + my $hashref = { 'pkgpart' => $self->pkgpart }; + $hashref->{'usage_class'} = $class if defined($class); + my @overrides = qsearch('part_pkg_taxoverride', $hashref ); + + unless ( scalar(@overrides) || !defined($class) || !$class ){ + $hashref->{'usage_class'} = ''; + @overrides = qsearch('part_pkg_taxoverride', $hashref ); + } + + @overrides; } -=item taxproduct_description +=item has_taxproduct + +Returns true if this package has any taxproduct associated with it. + +=cut + +sub has_taxproduct { + my $self = shift; + + $self->taxproductnum || + scalar(grep { $_ =~/^usage_taxproductnum_/ } keys %{ {$self->options} } ) + +} + + +=item taxproduct [ CLASS ] + +Returns the associated tax product for this package definition (see +L). CLASS may be one of 'setup', 'recur' or +the usage classnum (see L). Returns the default +tax product for this record if the more specific CLASS value does +not exist. + +=cut + +sub taxproduct { + my $self = shift; + my $class = shift; + + my $part_pkg_taxproduct; + + my $taxproductnum = $self->taxproductnum; + if ($class) { + my $class_taxproductnum = $self->option("usage_taxproductnum_$class", 1); + $taxproductnum = $class_taxproductnum + if $class_taxproductnum + } + + $part_pkg_taxproduct = + qsearchs( 'part_pkg_taxproduct', { 'taxproductnum' => $taxproductnum } ); + + unless ($part_pkg_taxproduct || $taxproductnum eq $self->taxproductnum ) { + $taxproductnum = $self->taxproductnum; + $part_pkg_taxproduct = + qsearchs( 'part_pkg_taxproduct', { 'taxproductnum' => $taxproductnum } ); + } + + $part_pkg_taxproduct; +} + +=item taxproduct_description [ CLASS ] Returns the description of the associated tax product for this package definition (see L). @@ -820,30 +907,29 @@ definition (see L). sub taxproduct_description { my $self = shift; - my $part_pkg_taxproduct = - qsearchs( 'part_pkg_taxproduct', - { 'taxproductnum' => $self->taxproductnum } - ); + my $part_pkg_taxproduct = $self->taxproduct(@_); $part_pkg_taxproduct ? $part_pkg_taxproduct->description : ''; } -=item part_pkg_taxrate DATA_PROVIDER, GEOCODE +=item part_pkg_taxrate DATA_PROVIDER, GEOCODE, [ CLASS ] Returns the package to taxrate m2m records for this package in the location -specified by GEOCODE (see L and ). +specified by GEOCODE (see L) and usage class CLASS. +CLASS may be one of 'setup', 'recur', or one of the usage classes numbers +(see L). =cut sub _expand_cch_taxproductnum { my $self = shift; - my $part_pkg_taxproduct = - qsearchs( 'part_pkg_taxproduct', - { 'taxproductnum' => $self->taxproductnum } - ); + my $class = shift; + my $part_pkg_taxproduct = $self->taxproduct($class); + my ($a,$b,$c,$d) = ( $part_pkg_taxproduct ? ( split ':', $part_pkg_taxproduct->taxproduct ) : () ); + $a = '' unless $a; $b = '' unless $b; $c = '' unless $c; $d = '' unless $d; my $extra_sql = "AND ( taxproduct = '$a:$b:$c:$d' OR taxproduct = '$a:$b:$c:' OR taxproduct = '$a:$b:".":$d' @@ -857,7 +943,7 @@ sub _expand_cch_taxproductnum { sub part_pkg_taxrate { my $self = shift; - my ($data_vendor, $geocode) = @_; + my ($data_vendor, $geocode, $class) = @_; my $dbh = dbh; my $extra_sql = 'WHERE part_pkg_taxproduct.data_vendor = '. @@ -870,9 +956,11 @@ sub part_pkg_taxrate { ). ')'; # much more CCH oddness in m2m -- this is kludgy + my @tpnums = $self->_expand_cch_taxproductnum($class); $extra_sql .= ' AND ('. - join(' OR ', map{ "taxproductnum = $_" } $self->_expand_cch_taxproductnum). - ')'; + join(' OR ', map{ "taxproductnum = $_" } @tpnums ). + ')' + if @tpnums; my $addl_from = 'LEFT JOIN part_pkg_taxproduct USING ( taxproductnum )'; my $order_by = 'ORDER BY taxclassnum, length(geocode) desc, length(taxproduct) desc'; @@ -1029,6 +1117,7 @@ sub _upgrade_data { # class method =cut +#false laziness w/part_export & cdr my %info; foreach my $INC ( @INC ) { warn "globbing $INC/FS/part_pkg/*.pm\n" if $DEBUG; @@ -1046,8 +1135,7 @@ foreach my $INC ( @INC ) { next; } unless ( keys %$info ) { - warn "no %info hash found in FS::part_pkg::$mod, skipping\n" - unless $mod =~ /^(passwdfile|null)$/; #hack but what the heck + warn "no %info hash found in FS::part_pkg::$mod, skipping\n"; next; } warn "got plan info from FS::part_pkg::$mod: $info\n" if $DEBUG; @@ -1060,7 +1148,7 @@ foreach my $INC ( @INC ) { } tie %plans, 'Tie::IxHash', - map { $_ => $info{$_} } + map { $_ => $info{$_} } sort { $info{$a}->{'weight'} <=> $info{$b}->{'weight'} } keys %info;