[freeside-commits] freeside/FS/FS cust_pkg.pm, 1.73.2.26, 1.73.2.27 cust_pkg_reason.pm, 1.1.2.3, 1.1.2.4
Jeff Finucane,420,,
jeff at wavetail.420.am
Wed Mar 11 18:15:00 PDT 2009
Update of /home/cvs/cvsroot/freeside/FS/FS
In directory wavetail.420.am:/tmp/cvs-serv875
Modified Files:
Tag: FREESIDE_1_7_BRANCH
cust_pkg.pm cust_pkg_reason.pm
Log Message:
backport reason recovery and patches to where it is required
Index: cust_pkg.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cust_pkg.pm,v
retrieving revision 1.73.2.26
retrieving revision 1.73.2.27
diff -u -d -r1.73.2.26 -r1.73.2.27
--- cust_pkg.pm 29 Jan 2009 19:25:46 -0000 1.73.2.26
+++ cust_pkg.pm 12 Mar 2009 01:14:57 -0000 1.73.2.27
@@ -483,10 +483,12 @@
my $date = $options{date} if $options{date}; # expire/cancel later
$date = '' if ($date && $date <= time); # complain instead?
+ my $cancel_time = $options{'time'} || time;
+
if ($options{'reason'}) {
$error = $self->insert_reason( 'reason' => $options{'reason'},
'action' => $date ? 'expire' : 'cancel',
- 'date' => $date,
+ 'date' => $date ? $date : $cancel_time,
'reason_otaker' => $options{'reason_otaker'},
);
if ( $error ) {
@@ -531,7 +533,7 @@
}
my %hash = $self->hash;
- $date ? ($hash{'expire'} = $date) : ($hash{'cancel'} = time);
+ $date ? ($hash{'expire'} = $date) : ($hash{'cancel'} = $cancel_time);
my $new = new FS::cust_pkg ( \%hash );
$error = $new->replace( $self, options => { $self->options } );
if ( $error ) {
@@ -661,10 +663,12 @@
return "Package $pkgnum expires before it would be suspended.";
}
+ my $suspend_time = $options{'time'} || time;
+
if ($options{'reason'}) {
$error = $self->insert_reason( 'reason' => $options{'reason'},
'action' => $date ? 'adjourn' : 'suspend',
- 'date' => $date,
+ 'date' => $date ? $date : $suspend_time,
'reason_otaker' => $options{'reason_otaker'},
);
if ( $error ) {
@@ -731,7 +735,7 @@
if ( $date ) {
$hash{'adjourn'} = $date;
} else {
- $hash{'susp'} = time;
+ $hash{'susp'} = $suspend_time;
}
my $new = new FS::cust_pkg ( \%hash );
$error = $new->replace( $self, options => { $self->options } );
Index: cust_pkg_reason.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cust_pkg_reason.pm,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -d -r1.1.2.3 -r1.1.2.4
--- cust_pkg_reason.pm 3 Sep 2008 19:02:47 -0000 1.1.2.3
+++ cust_pkg_reason.pm 12 Mar 2009 01:14:57 -0000 1.1.2.4
@@ -166,9 +166,11 @@
order_by => 'ORDER BY history_action',
});
- if (@history < 2) {
- $hashref->{history_date}++; # more fuzz?
+ my $fuzz = 0;
+ while (scalar(@history) < 2 && $fuzz < 3) {
+ $hashref->{history_date}++;
$hashref->{history_action} = { %action_value }; # qsearch distorts this!
+ $fuzz++;
push @history, qsearch({ table => 'h_cust_pkg',
hashref => $hashref,
order_by => 'ORDER BY history_action',
@@ -190,10 +192,12 @@
(!$old[0]->expire || !$old[0]->expire != $new[0]->expire )
){
$_->action('E');
+ $_->date($new[0]->expire);
}elsif( $new[0]->adjourn &&
(!$old[0]->adjourn || $old[0]->adjourn != $new[0]->adjourn )
){
$_->action('A');
+ $_->date($new[0]->adjourn);
}
my $error = $_->replace
@@ -206,6 +210,111 @@
#remove nullability if scalar(@migrated) - $count == 0 && ->column('action');
+ #seek expirations/adjourns without reason
+ foreach my $field qw( expire adjourn cancel susp ) {
+ my $addl_from =
+ "LEFT JOIN h_cust_pkg ON ".
+ "(cust_pkg_reason.pkgnum = h_cust_pkg.pkgnum AND".
+ " cust_pkg_reason.date = h_cust_pkg.$field AND".
+ " history_action = 'replace_new')";
+
+ my $extra_sql = 'AND h_cust_pkg.pkgnum IS NULL';
+
+ my @unmigrated = qsearch({ table => 'cust_pkg_reason',
+ hashref => { action => uc(substr($field,0,1)) },
+ addl_from => $addl_from,
+ select => 'cust_pkg_reason.*',
+ extra_sql => $extra_sql,
+ });
+ foreach ( @unmigrated ) {
+ # we could create h_cust_pkg_reason and h_cust_pkg_reason packages
+ @FS::h_cust_pkg::ISA = qw( FS::h_Common FS::cust_pkg );
+ sub FS::h_cust_pkg::table { 'h_cust_pkg' };
+
+ my %action_value = ( op => 'LIKE',
+ value => 'replace_%',
+ );
+ my $hashref = { pkgnum => $_->pkgnum,
+ history_date => $_->date,
+ history_action => { %action_value },
+ };
+
+ my @history = qsearch({ table => 'h_cust_pkg',
+ hashref => $hashref,
+ order_by => 'ORDER BY history_action',
+ });
+
+ my $fuzz = 0;
+ while (scalar(@history) < 2 && $fuzz < 3) {
+ $hashref->{history_date}++;
+ $hashref->{history_action} = { %action_value }; # qsearch distorts this!
+ $fuzz++;
+ push @history, qsearch({ table => 'h_cust_pkg',
+ hashref => $hashref,
+ order_by => 'ORDER BY history_action',
+ });
+ }
+
+ next unless scalar(@history) == 2;
+
+ my @new = grep { $_->history_action eq 'replace_new' } @history;
+ my @old = grep { $_->history_action eq 'replace_old' } @history;
+
+ next if (scalar(@new) == 2 || scalar(@old) == 2);
+
+ $_->date($new[0]->get($field))
+ if ( $new[0]->get($field) &&
+ ( !$old[0]->get($field) ||
+ $old[0]->get($field) != $new[0]->get($field)
+ )
+ );
+
+ my $error = $_->replace
+ if $_->modified;
+
+ die $error if $error;
+ }
+ }
+
+ #seek cancels/suspends without reason, but with expire/adjourn reason
+ foreach my $field qw( cancel susp ) {
+
+ my %precursor_map = ( 'cancel' => 'expire', 'susp' => 'adjourn' );
+ my $precursor = $precursor_map{$field};
+ my $preaction = uc(substr($precursor,0,1));
+ my $action = uc(substr($field,0,1));
+ my $addl_from =
+ "LEFT JOIN cust_pkg_reason ON ".
+ "(cust_pkg.pkgnum = cust_pkg_reason.pkgnum AND".
+ " cust_pkg.$precursor = cust_pkg_reason.date AND".
+ " cust_pkg_reason.action = '$preaction') ".
+ "LEFT JOIN cust_pkg_reason AS target ON ".
+ "(cust_pkg.pkgnum = target.pkgnum AND".
+ " cust_pkg.$field = target.date AND".
+ " target.action = '$action')"
+ ;
+
+ my $extra_sql = "WHERE target.pkgnum IS NULL AND ".
+ "cust_pkg.$field IS NOT NULL AND ".
+ "cust_pkg.$field < cust_pkg.$precursor + 86400 AND ".
+ "cust_pkg_reason.action = '$preaction'";
+
+ my @unmigrated = qsearch({ table => 'cust_pkg',
+ hashref => { },
+ select => 'cust_pkg.*',
+ addl_from => $addl_from,
+ extra_sql => $extra_sql,
+ });
+ foreach ( @unmigrated ) {
+ my $cpr = new FS::cust_pkg_reason { $_->last_cust_pkg_reason($precursor)->hash, 'num' => '' };
+ $cpr->date($_->get($field));
+ $cpr->action($action);
+
+ my $error = $cpr->insert;
+ die $error if $error;
+ }
+ }
+
'';
}
More information about the freeside-commits
mailing list