+
+ # boolean invoice_sections_by_location option is now
+ # invoice_sections_method = 'location'
+ my @invoice_sections_confs =
+ qsearch('conf', { 'name' => { op=>'LIKE', value=>'%sections_by_location' } });
+ foreach my $c (@invoice_sections_confs) {
+ $c->name =~ /^(\w+)sections_by_location$/;
+ $conf->delete($c->name);
+ my $newname = $1.'sections_method';
+ $conf->set($newname, 'location');
+ }
+
+ # boolean enable_taxproducts is now tax_data_vendor = 'cch'
+ if ( $conf->exists('enable_taxproducts') ) {
+
+ $conf->delete('enable_taxproducts');
+ $conf->set('tax_data_vendor', 'cch');
+
+ }
+
+ # boolean tax-cust_exempt-groups-require_individual_nums is now -num_req all
+ if ( $conf->exists('tax-cust_exempt-groups-require_individual_nums') ) {
+ $conf->set('tax-cust_exempt-groups-num_req', 'all');
+ $conf->delete('tax-cust_exempt-groups-require_individual_nums');
+ }
+
+ # boolean+text previous_balance-exclude_from_total is now two separate options
+ my $total_new_charges = $conf->config('previous_balance-exclude_from_total');
+ if (length($total_new_charges) > 0) {
+ $conf->set('previous_balance-text-total_new_charges', $total_new_charges);
+ $conf->set('previous_balance-exclude_from_total', '');
+ }
+
+ # switch from specifying an email address to boolean check
+ if ( $conf->exists('batch-errors_to') ) {
+ $conf->touch('batch-errors_not_fatal');
+ $conf->delete('batch-errors_to');
+ }
+
+ enable_banned_pay_pad() unless length($conf->config('banned_pay-pad'));
+