RT#38432: OFM - Send refund receipt [v3 message prepare]
[freeside.git] / FS / FS / cust_refund.pm
index 6d08c86..166e537 100644 (file)
@@ -7,12 +7,14 @@ use vars qw( @encrypted_fields );
 use Business::CreditCard;
 use FS::UID qw(getotaker);
 use FS::Record qw( qsearch qsearchs dbh );
+use FS::CurrentUser;
 use FS::cust_credit;
 use FS::cust_credit_refund;
 use FS::cust_pay_refund;
 use FS::cust_main;
 
 @encrypted_fields = ('payinfo');
+sub nohistory_fields { ('payinfo'); }
 
 =head1 NAME
 
@@ -86,6 +88,11 @@ order taker (see L<FS::access_user>
 
 books closed flag, empty or `Y'
 
+=item gatewaynum, processor, auth, order_number
+
+Same as for L<FS::cust_pay>, but specifically the result of realtime 
+authorization of the refund.
+
 =back
 
 =head1 METHODS
@@ -237,12 +244,17 @@ sub delete {
 
 =item replace OLD_RECORD
 
-Modifying a refund?  Well, don't say I didn't warn you.
+You can, but probably shouldn't modify refunds... 
+
+Replaces the OLD_RECORD with this one in the database, or, if OLD_RECORD is not
+supplied, replaces this record.  If there is an error, returns the error,
+otherwise returns false.
 
 =cut
 
 sub replace {
   my $self = shift;
+  return "Can't modify closed refund" if $self->closed =~ /^Y/i;
   $self->SUPER::replace(@_);
 }
 
@@ -256,7 +268,7 @@ returns the error, otherwise returns false.  Called by the insert method.
 sub check {
   my $self = shift;
 
-  $self->otaker(getotaker) unless $self->otaker;
+  $self->usernum($FS::CurrentUser::CurrentUser->usernum) unless $self->usernum;
 
   my $error =
     $self->ut_numbern('refundnum')
@@ -330,6 +342,56 @@ sub unapplied {
   sprintf("%.2f", $amount );
 }
 
+=item send_receipt HASHREF | OPTION => VALUE ...
+
+Sends a payment receipt for this payment.
+
+refund_receipt_msgnum must be configured.
+
+Available options:
+
+=over 4
+
+=item cust_main
+
+Customer (FS::cust_main) object (for efficiency).
+
+=cut
+
+=back
+
+=cut
+
+sub send_receipt {
+  my $self = shift;
+  my $opt = ref($_[0]) ? shift : { @_ };
+
+  my $cust_main = $opt->{'cust_main'} || $self->cust_main;
+
+  my $conf = new FS::Conf;
+  
+  my $msgnum = $conf->config('refund_receipt_msgnum', $cust_main->agentnum);
+  return "No refund_receipt_msgnum configured" unless $msgnum;
+
+  my $msg_template = qsearchs('msg_template',{ msgnum => $msgnum});
+  return "Could not load template"
+    unless $msg_template;
+
+  my $queue = new FS::queue {
+    'job'     => 'FS::Misc::process_send_email',
+    'custnum' => $cust_main->custnum,
+  };
+  my $error = $queue->insert(
+    FS::msg_template->by_key($msgnum)->prepare(
+      'cust_main'     => $cust_main,
+      'object'        => $self,
+    ),
+    'msgtype' => 'receipt', # override msg_template's default
+  );
+
+  return $error;
+}
+
 =back
 
 =head1 CLASS METHODS
@@ -343,7 +405,7 @@ Returns an SQL fragment to retreive the unapplied amount.
 =cut 
 
 sub unapplied_sql {
-  my ($class, $start, $end) = shift;
+  my ($class, $start, $end) = @_;
   my $credit_start = $start ? "AND cust_credit_refund._date <= $start" : '';
   my $credit_end   = $end   ? "AND cust_credit_refund._date > $end"   : '';
   my $pay_start    = $start ? "AND cust_pay_refund._date <= $start"    : '';