X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg_taxclass.pm;h=824fd177a968190e4c8cbd8887dbdf4046f75968;hb=3c54c844c665ed108c7892a154fd3972fab1f3e5;hp=341be0ebd90677ee46ac993aeb4be90c2b743398;hpb=3a7497433b36b3aa882d30d2d0b6b519a7e1a675;p=freeside.git diff --git a/FS/FS/part_pkg_taxclass.pm b/FS/FS/part_pkg_taxclass.pm index 341be0ebd..824fd177a 100644 --- a/FS/FS/part_pkg_taxclass.pm +++ b/FS/FS/part_pkg_taxclass.pm @@ -2,7 +2,10 @@ package FS::part_pkg_taxclass; use strict; use vars qw( @ISA ); -use FS::Record qw( qsearch qsearchs ); +use Scalar::Util qw( blessed ); +use FS::UID qw( dbh ); +use FS::Record; # qw( qsearch qsearchs ); +use FS::cust_main_county; @ISA = qw(FS::Record); @@ -40,6 +43,10 @@ Primary key Tax class +=item disabled + +Disabled flag, empty or 'Y' + =back =head1 METHODS @@ -66,7 +73,57 @@ otherwise returns false. =cut -# the insert method can be inherited from FS::Record +sub insert { + my $self = shift; + + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $error = $self->SUPER::insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + my $sth = dbh->prepare(" + SELECT country, state, county FROM cust_main_county + WHERE taxclass IS NOT NULL AND taxclass != '' + GROUP BY country, state, county + ") or die dbh->errstr; + $sth->execute or die $sth->errstr; + + while ( my $row = $sth->fetchrow_hashref ) { + #warn "inserting for $row"; + my $cust_main_county = new FS::cust_main_county { + 'country' => $row->{country}, + 'state' => $row->{state}, + 'county' => $row->{county}, + 'tax' => 0, + 'taxclass' => $self->taxclass, + #exempt_amount + #taxname + #setuptax + #recurtax + }; + $error = $cust_main_county->insert; + #last if $error; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + ''; +} =item delete @@ -83,7 +140,18 @@ returns the error, otherwise returns false. =cut -# the replace method can be inherited from FS::Record +sub replace { + my $new = shift; + + my $old = ( blessed($_[0]) && $_[0]->isa('FS::Record') ) + ? shift + : $new->replace_old; + + return "Can't change tax class name (disable and create anew)" + if $old->taxclass ne $new->taxclass; + + $new->SUPER::replace(@_); +} =item check @@ -100,9 +168,9 @@ sub check { my $self = shift; my $error = - $self->ut_numbern('serial') - || $self->ut_number('taxclassnum') + $self->ut_numbern('taxclassnum') || $self->ut_text('taxclass') + || $self->ut_enum('disabled', [ '', 'Y' ] ) ; return $error if $error; @@ -111,6 +179,38 @@ sub check { =back +=cut + +# _upgrade_data +# +# Used by FS::Upgrade to migrate to a new database. + +sub _upgrade_data { # class method + my ($class, %opts) = @_; + + my $sth = dbh->prepare(' + SELECT DISTINCT taxclass + FROM cust_main_county + LEFT JOIN part_pkg_taxclass USING ( taxclass ) + WHERE taxclassnum IS NULL + AND taxclass IS NOT NULL + ') or die dbh->errstr; + $sth->execute or die $sth->errstr; + my %taxclass = map { $_->[0] => 1 } @{$sth->fetchall_arrayref}; + my @taxclass = grep $_, keys %taxclass; + + foreach my $taxclass ( @taxclass ) { + + my $part_pkg_taxclass = new FS::part_pkg_taxclass ( { + 'taxclass' => $taxclass, + } ); + my $error = $part_pkg_taxclass->insert; + die $error if $error; + + } + +} + =head1 BUGS Other tables (cust_main_county, part_pkg, agent_payment_gateway) have a text