option to credit unused time on suspension as part of suspend reason, #31702
[freeside.git] / FS / FS / reason.pm
index a9a7d74..f28989a 100644 (file)
@@ -56,6 +56,10 @@ suspensions but not others.
 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).
+If enabled, the customer will be credited for their remaining time on 
+suspension.
+
 =back
 
 =head1 METHODS
@@ -109,7 +113,6 @@ sub check {
     || $self->ut_number('reason_type')
     || $self->ut_foreign_key('reason_type', 'reason_type', 'typenum')
     || $self->ut_text('reason')
-    || $self->ut_flag('disabled')
   ;
   return $error if $error;
 
@@ -117,11 +120,13 @@ sub check {
     $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')
     ;
     return $error if $error;
   } else {
-    $self->set('unsuspend_pkgpart' => '');
-    $self->set('unsuspend_hold'    => '');
+    foreach (qw(unsuspend_pkgpart unsuspend_hold unused_credit)) {
+      $self->set($_ => '');
+    }
   }
 
   $self->SUPER::check;
@@ -139,9 +144,44 @@ sub reasontype {
 
 =back
 
-=head1 BUGS
+=head1 CLASS METHODS
+
+=over 4
+
+=item new_or_existing reason => REASON, type => TYPE, class => CLASS
+
+Fetches the reason matching these parameters if there is one.  If not,
+inserts one.  Will also insert the reason type if necessary.  CLASS must
+be one of 'C' (cancel reasons), 'R' (credit reasons), or 'S' (suspend reasons).
+
+This will die if anything fails.
+
+=cut
 
-Here by termintes.  Don't use on wooden computers.
+sub new_or_existing {
+  my $class = shift;
+  my %opt = @_;
+
+  my $error = '';
+  my %hash = ('class' => $opt{'class'}, 'type' => $opt{'type'});
+  my $reason_type = qsearchs('reason_type', \%hash)
+                    || FS::reason_type->new(\%hash);
+
+  $error = $reason_type->insert unless $reason_type->typenum;
+  die "error inserting reason type: $error\n" if $error;
+
+  %hash = ('reason_type' => $reason_type->typenum, 'reason' => $opt{'reason'});
+  my $reason = qsearchs('reason', \%hash)
+               || FS::reason->new(\%hash);
+
+  $error = $reason->insert unless $reason->reasonnum;
+  die "error inserting reason: $error\n" if $error;
+
+  $reason;
+}
+
+
+=head1 BUGS
 
 =head1 SEE ALSO