use FS::queue;
use FS::upgrade_journal;
use FS::Setup qw( enable_banned_pay_pad );
+use FS::DBI;
use FS::svc_domain;
$FS::svc_domain::whois_hack = 1;
my $conf = new FS::Conf;
+ # to simplify tokenization upgrades
+ die "Conf selfservice-payment_gateway no longer supported"
+ if $conf->config('selfservice-payment_gateway');
+
$conf->touch('payment_receipt')
if $conf->exists('payment_receipt_email')
|| $conf->config('payment_receipt_msgnum');
# 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) {
+ if ( defined $total_new_charges && length($total_new_charges) > 0 ) {
$conf->set('previous_balance-text-total_new_charges', $total_new_charges);
$conf->set('previous_balance-exclude_from_total', '');
}
$conf->delete('voip-cust_email_csv_cdr') ;
}
- if ( !$conf->config('password-generated-characters') ) {
- my $pw_set =
- 'abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ23456789()#.,' ;
- $conf->set('password-generated-characters', $pw_set);
+ if ($conf->exists('unsuspendauto') && !$conf->config('unsuspend_balance')) {
+ $conf->set('unsuspend_balance','Zero');
+ $conf->delete('unsuspendauto');
+ }
+
+ my $cust_fields = $conf->config('cust-fields');
+ if ( defined $cust_fields && $cust_fields =~ / \| Payment Type/ ) {
+ # so we can potentially use 'Payment Types' or somesuch in the future
+ $cust_fields =~ s/ \| Payment Type( \|)/$1/;
+ $cust_fields =~ s/ \| Payment Type$//;
+ $conf->set('cust-fields',$cust_fields);
}
enable_banned_pay_pad() unless length($conf->config('banned_pay-pad'));
+ # if translate-auto-insert is enabled for a locale, ensure that invoice
+ # terms are in the msgcat (is there a better place for this?)
+ if (my $auto_locale = $conf->config('translate-auto-insert')) {
+ my $lh = FS::L10N->get_handle($auto_locale);
+ foreach (@FS::Conf::invoice_terms) {
+ $lh->maketext($_) if length($_);
+ }
+ }
+
+ unless ( FS::upgrade_journal->is_done('deprecate_unmask_ss') ) {
+ if ( $conf->config_bool( 'unmask_ss' )) {
+ warn "'unmask_ssn' deprecated from global configuration\n";
+ for my $access_group ( qsearch( access_group => {} )) {
+ $access_group->grant_access_right( 'Unmask customer SSN' );
+ warn " - 'Unmask customer SSN' access right granted to '" .
+ $access_group->groupname . "' employee group\n";
+ }
+ }
+ FS::upgrade_journal->set_done('deprecate_unmask_ss');
+ }
+
+ # Rename agent-disable_counts as config-disable_counts, flag now
+ # affects several configuration pages
+ for my $row ( qsearch( conf => { name => 'agent-disable_counts' } )) {
+ $row->name('config-disable_counts');
+ $row->replace;
+ }
+
}
sub upgrade_overlimit_groups {
sub upgrade_invoice_from {
my ($conf, $agentnum, $agentonly) = @_;
if (
- (!$conf->exists('invoice_from_name',$agentnum,$agentonly)) &&
- ($conf->config('invoice_from',$agentnum,$agentonly) =~ /\<(.*)\>/)
+ ! $conf->exists('invoice_from_name',$agentnum,$agentonly)
+ && $conf->exists('invoice_from',$agentnum,$agentonly)
+ && $conf->config('invoice_from',$agentnum,$agentonly) =~ /\<(.*)\>/
) {
my $realemail = $1;
$realemail =~ s/^\s*//; # remove leading spaces
});
foreach my $object ( @objects ) {
my $payinfo = $object->decrypt($object->payinfo);
- die "error decrypting payinfo" if $payinfo eq $object->payinfo;
+ if ( $payinfo eq $object->payinfo ) {
+ warn "error decrypting payinfo for $table: $payinfo\n";
+ next;
+ }
$object->payinfo($payinfo);
my $error = $object->replace;
die $error if $error;
tie my %hash, 'Tie::IxHash',
- #cust_main (remove paycvv from history, locations, cust_payby, etc)
+ #remap log levels
+ 'log' => [],
+
+ #fix whitespace - before cust_main
+ 'cust_location' => [],
+
+ # need before cust_main tokenization upgrade,
+ # blocks tokenization upgrade if deprecated features still in use
+ 'agent_payment_gateway' => [],
+
+ #remove bad source_paynum before cust_main
+ 'cust_refund' => [],
+
+ #cust_main (tokenizes cards, remove paycvv from history, locations, cust_payby, etc)
+ # (handles payinfo encryption/tokenization across all relevant tables)
'cust_main' => [],
#contact -> cust_contact / prospect_contact
# reason / void_reason migration to reasonnum / void_reasonnum
'cust_credit_void' => [],
'cust_bill_void' => [],
+ # also fix some tax allocation records
'cust_bill_pkg_void' => [],
#duplicate history records
'cust_pkg' => [],
#'cust_pkg_reason' => [],
'cust_pkg_discount' => [],
- 'cust_refund' => [],
+ #'cust_refund' => [],
'banned_pay' => [],
+ #paycardtype
+ 'cust_payby' => [],
+
#default namespace
'payment_gateway' => [],
#populate tax statuses
'tax_status' => [],
- #mark certain taxes as system-maintained
+ #mark certain taxes as system-maintained,
+ # and fix whitespace
'cust_main_county' => [],
+
+ #'compliance solutions' -> 'compliance_solutions'
+ 'tax_rate' => [],
+ 'tax_rate_location' => [],
+
+ #upgrade part_event_condition_option agentnum to a multiple hash value
+ 'part_event_condition_option' =>[],
+
+ #fix ip format
+ 'svc_circuit' => [],
+
+ #fix ip format
+ 'svc_hardware' => [],
+
+ #fix ip format
+ 'svc_pbx' => [],
+
+ #fix ip format
+ 'tower_sector' => [],
+
+
;
\%hash;
sub upgrade_schema_data {
my %opt = @_;
+ #auto-find tables/classes with an _update_schema method?
+
tie my %hash, 'Tie::IxHash',
#fix classnum character(1)
'cust_bill_pkg_detail' => [],
#add necessary columns to RT schema
'TicketSystem' => [],
-
+ #remove h_access_user_log if it exists (since our regular auto schema
+ # upgrade doesn't have the drop tables flag turned on)
+ 'access_user_log' => [],
+ #remove possible dangling records
+ 'password_history' => [],
+ 'cust_pay_pending' => [],
+ #remove records referencing removed things with their FKs
+ 'pkg_referral' => [],
+ 'cust_bill_pkg_discount' => [],
+ 'cust_msg' => [],
+ 'cust_bill_pay_batch' => [],
+ 'cust_event_fee' => [],
+ 'radius_attr' => [],
+ 'queue_depend' => [],
+ 'cust_main_invoice' => [],
+ #update records referencing removed things with their FKs
+ 'cust_pkg' => [],
;
\%hash;
my $errmsg = 'Error adding FreesideStatus to '.
$part_export->option('datasrc'). ': ';
- my $dbh = DBI->connect(
+ my $dbh = FS::DBI->connect(
( map $part_export->option($_), qw ( datasrc username password ) ),
{ PrintError => 0, PrintWarn => 0 }
) or do {
- warn $errmsg.$DBI::errstr;
+ warn $errmsg.$FS::DBI::errstr;
next;
};
=cut
1;
-