unused_credit flag for cancellation reasons, #27911
authorMark Wells <mark@freeside.biz>
Mon, 1 Feb 2016 05:07:08 +0000 (21:07 -0800)
committerMark Wells <mark@freeside.biz>
Mon, 1 Feb 2016 05:07:31 +0000 (21:07 -0800)
FS/FS/cust_pkg.pm
FS/FS/reason.pm
httemplate/elements/tr-select-reason.html

index 6a5580a..daa3353 100644 (file)
@@ -919,13 +919,28 @@ sub cancel {
     }
   }
 
     }
   }
 
+  # if a reasonnum was passed, get the actual reason object so we can check
+  # unused_credit
+
+  my $reason;
+  if ($options{'reason'} =~ /^\d+$/) {
+    $reason = FS::reason->by_key($options{'reason'});
+  }
+
   unless ($date) {
   unless ($date) {
-    # credit remaining time if appropriate
+    # credit remaining time if any of these are true:
+    # - unused_credit => 1 was passed (this happens when canceling a package
+    #   for a package change when unused_credit_change is set)
+    # - no unused_credit option, and there is a cancel reason, and the cancel
+    #   reason says to credit the package
+    # - no unused_credit option, and the package definition says to credit the
+    #   package on cancellation
     my $do_credit;
     if ( exists($options{'unused_credit'}) ) {
       $do_credit = $options{'unused_credit'};
     my $do_credit;
     if ( exists($options{'unused_credit'}) ) {
       $do_credit = $options{'unused_credit'};
-    }
-    else {
+    } elsif ( defined($reason) && $reason->unused_credit ) {
+      $do_credit = 1;
+    } else {
       $do_credit = $self->part_pkg->option('unused_credit_cancel', 1);
     }
     if ( $do_credit ) {
       $do_credit = $self->part_pkg->option('unused_credit_cancel', 1);
     }
     if ( $do_credit ) {
index f50af7a..95297d9 100644 (file)
@@ -56,7 +56,7 @@ suspensions but not others. DEPRECATED.
 whether to bill the unsuspend package immediately ('') or to wait until 
 the customer's next invoice ('Y').
 
 whether to bill the unsuspend package immediately ('') or to wait until 
 the customer's next invoice ('Y').
 
-=item unused_credit - 'Y' or ''. For suspension reasons only (for now).
+=item unused_credit - 'Y' or ''. For suspension or cancellation reasons.
 If enabled, the customer will be credited for their remaining time on 
 suspension.
 
 If enabled, the customer will be credited for their remaining time on 
 suspension.
 
@@ -125,23 +125,30 @@ sub check {
   ;
   return $error if $error;
 
   ;
   return $error if $error;
 
-  if ( $self->reasontype->class eq 'S' ) {
+  my $class = $self->reasontype->class;
+
+  if ( $class eq 'S' ) {
     $error = $self->ut_numbern('unsuspend_pkgpart')
           || $self->ut_foreign_keyn('unsuspend_pkgpart', 'part_pkg', 'pkgpart')
           || $self->ut_flag('unsuspend_hold')
     $error = $self->ut_numbern('unsuspend_pkgpart')
           || $self->ut_foreign_keyn('unsuspend_pkgpart', 'part_pkg', 'pkgpart')
           || $self->ut_flag('unsuspend_hold')
-          || $self->ut_flag('unused_credit')
           || $self->ut_foreign_keyn('feepart', 'part_fee', 'feepart')
           || $self->ut_flag('fee_on_unsuspend')
           || $self->ut_flag('fee_hold')
     ;
     return $error if $error;
   } else {
           || $self->ut_foreign_keyn('feepart', 'part_fee', 'feepart')
           || $self->ut_flag('fee_on_unsuspend')
           || $self->ut_flag('fee_hold')
     ;
     return $error if $error;
   } else {
-    foreach (qw(unsuspend_pkgpart unsuspend_hold unused_credit feepart
+    foreach (qw(unsuspend_pkgpart unsuspend_hold feepart
                 fee_on_unsuspend fee_hold)) {
       $self->set($_ => '');
     }
   }
 
                 fee_on_unsuspend fee_hold)) {
       $self->set($_ => '');
     }
   }
 
+  if ( $class eq 'S' or $class eq 'C' ) {
+    $error = $self->ut_flag('unused_credit');
+  } else {
+    $self->set('unused_credit', '');
+  }
+
   $self->SUPER::check;
 }
 
   $self->SUPER::check;
 }
 
index 47acd85..3b9bb22 100755 (executable)
@@ -120,6 +120,13 @@ Example:
       &>
 %   } # scalar(@types)
 
       &>
 %   } # scalar(@types)
 
+%   if ( $class eq 'C' ) {
+      <& tr-checkbox.html,
+        label => 'Credit the unused portion of service when canceling',
+        field => $id.'_new_unused_credit',
+        value => 'Y'
+      &>
+%   }
 %   if ( $class eq 'S' ) {
       <& tr-checkbox.html,
         label => 'Credit the unused portion of service when suspending',
 %   if ( $class eq 'S' ) {
       <& tr-checkbox.html,
         label => 'Credit the unused portion of service when suspending',