use base qw( FS::TemplateItem_Mixin FS::reason_Mixin FS::Record );
use strict;
+use vars qw( $me $DEBUG );
use FS::Record qw( qsearch qsearchs dbh fields );
use FS::cust_bill_void;
use FS::cust_bill_pkg_detail;
use FS::cust_bill_pkg_tax_location;
use FS::cust_bill_pkg_tax_rate_location;
use FS::cust_tax_exempt_pkg;
+use FS::Cursor;
+
+$me = '[ FS::cust_bill_pkg_void ]';
+$DEBUG = 0;
=head1 NAME
=item reasonnum
-reason for voiding the payment (see L<FS::reson>)
+reason for voiding the payment (see L<FS::reason>)
=back
qsearch( 'cust_bill_pkg_fee_void', { 'billpkgnum' => $self->billpkgnum } );
}
+# _upgrade_data
+#
+# Used by FS::Upgrade to migrate to a new database.
+sub _upgrade_data { # class method
+ my ($class, %opts) = @_;
+
+ warn "$me upgrading $class\n" if $DEBUG;
+
+ $class->_upgrade_reasonnum(%opts);
+ my $error;
+ # fix voids with tax from before July 2013, when the taxable_billpkgnum
+ # field was added to the void table
+ local $FS::Record::nowarn_classload = 1;
+ my $search = FS::Cursor->new({
+ 'table' => 'cust_bill_pkg_tax_location_void',
+ 'hashref' => { 'taxable_billpkgnum' => '' }
+ });
+ while (my $void = $search->fetch) {
+ # the history for the unvoided record should have the correct
+ # taxable_billpkgnum
+ my $num = $void->billpkgtaxlocationnum;
+ my $unvoid = qsearchs({
+ 'table' => 'h_cust_bill_pkg_tax_location',
+ 'hashref' => { 'billpkgtaxlocationnum' => $num },
+ 'extra_sql' => ' AND taxable_billpkgnum IS NOT NULL',
+ 'order_by' => ' ORDER BY history_date DESC LIMIT 1'
+ });
+ if (!$unvoid) {
+ # should never happen
+ # but should this be fatal? or wait until someone actually tries to
+ # use the record?
+ warn "billpkgtaxlocationnum $num: could not find pre-void history record to restore taxable_billpkgnum.";
+ }
+ if ($unvoid) {
+ $void->set('taxable_billpkgnum', $unvoid->taxable_billpkgnum);
+ $error = $void->replace;
+ die "billpkgtaxlocationnum $num: $error\n" if $error;
+ }
+ }
+
+}
+
=back
=head1 BUGS