summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2017-02-24 10:22:27 -0800
committerIvan Kohler <ivan@freeside.biz>2017-02-24 10:22:27 -0800
commit9f845218894ad8cf48c5cfe8fb4fb492e174c0f2 (patch)
tree865e11dbb19b1a56e5c0c9f5130859c5a76861cd
parentdc852f26b535edeab92beeca5af3aad69fdf5243 (diff)
fix upgrades when cust_pkg.change_to_pkgnum points to a package that was removed, RT#74825
-rw-r--r--FS/FS/Upgrade.pm2
-rw-r--r--FS/FS/cust_pkg.pm17
2 files changed, 19 insertions, 0 deletions
diff --git a/FS/FS/Upgrade.pm b/FS/FS/Upgrade.pm
index a59dc1fc9..628b6f2bb 100644
--- a/FS/FS/Upgrade.pm
+++ b/FS/FS/Upgrade.pm
@@ -567,6 +567,8 @@ sub upgrade_schema_data {
#remove records referencing removed things with their FKs
'pkg_referral' => [],
'cust_bill_pkg_discount' => [],
+ #update records referencing removed things with their FKs
+ 'cust_pkg' => [],
;
\%hash;
diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index 1d0cc4fbc..039943e52 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -5560,6 +5560,23 @@ sub forward_emails {
}
# Used by FS::Upgrade to migrate to a new database.
+sub _upgrade_schema { # class method
+ my ($class, %opts) = @_;
+
+ my $sql = '
+ UPDATE cust_pkg SET change_to_pkgnum = NULL
+ WHERE change_to_pkgnum IS NOT NULL
+ AND NOT EXISTS ( SELECT 1 FROM cust_pkg AS ctcp
+ WHERE ctcp.pkgnum = cust_pkg.change_to_pkgnum
+ )
+ ';
+
+ my $sth = dbh->prepare($sql) or die dbh->errstr;
+ $sth->execute or die $sth->errstr;
+ '';
+}
+
+# Used by FS::Upgrade to migrate to a new database.
sub _upgrade_data { # class method
my ($class, %opts) = @_;
$class->_upgrade_otaker(%opts);