RT#38432: OFM - Send refund receipt
authorJonathan Prykop <jonathan@freeside.biz>
Sat, 24 Oct 2015 01:24:40 +0000 (20:24 -0500)
committerJonathan Prykop <jonathan@freeside.biz>
Sat, 24 Oct 2015 01:24:40 +0000 (20:24 -0500)
FS/FS/Conf.pm
FS/FS/cust_refund.pm
FS/FS/msg_template.pm
httemplate/edit/msg_template/email.html
httemplate/view/cust_pay.html
httemplate/view/cust_refund.html

index 647ae0b..4a39fb9 100644 (file)
@@ -1675,6 +1675,13 @@ and customer address. Include units.',
   },
 
   {
+    'key'         => 'refund_receipt_msgnum',
+    'section'     => 'notification',
+    'description' => 'Template to use for manual refund receipts.',
+    %msg_template_options,
+  },
+  
+  {
     'key'         => 'trigger_export_insert_on_payment',
     'section'     => 'billing',
     'description' => 'Enable exports on payment application.',
index e3fc910..efbdcee 100644 (file)
@@ -370,6 +370,59 @@ 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 $cust_msg = $msg_template->prepare(
+    'cust_main'     => $cust_main,
+    'object'        => $self,
+    'msgtype'       => 'receipt',
+  );
+  return 'Error preparing message' unless $cust_msg;
+  my $error = $cust_msg->insert;
+  return $error if $error;
+
+  my $queue = new FS::queue {
+    'job'     => 'FS::cust_msg::process_send',
+    'custnum' => $cust_main->custnum,
+  };
+  $error = $queue->insert( $cust_msg->custmsgnum );
+
+  return $error;
+}
+
 =back
 
 =head1 CLASS METHODS
index 1d357b1..01a6563 100644 (file)
@@ -614,6 +614,18 @@ sub substitutions {
             $cust_pay->paymask : $cust_pay->decrypt($cust_pay->payinfo)
         } ],
     ],
+    # for refund receipts
+    'cust_refund' => [
+      'refundnum',
+      [ refund            => sub { sprintf("%.2f", shift->refund) } ],
+      [ payby             => sub { FS::payby->shortname(shift->payby) } ],
+      [ date              => sub { time2str("%a %B %o, %Y", shift->_date) } ],
+      [ payinfo           => sub { 
+          my $cust_refund = shift;
+          ($cust_refund->payby eq 'CARD' || $cust_refund->payby eq 'CHEK') ?
+            $cust_refund->paymask : $cust_refund->decrypt($cust_refund->payinfo)
+        } ],
+    ],
     # for payment decline messages
     # try to support all cust_pay fields
     # 'error' is a special case, it contains the raw error from the gateway
index b0c1aa3..12a4a6f 100644 (file)
@@ -4,7 +4,7 @@
      'body_etc'         => $body_etc,
      'name_singular'    => 'template',
      'table'            => 'msg_template',
-     'viewall_dir'      => 'browse',
+     'viewall_url'      => $fsurl.'browse/msg_template/email.html',
      'agent_virt'       => 1,
      'agent_null'       => 1,
      'agent_null_right' => [ 'View global templates', 'Edit global templates' ],
@@ -302,6 +302,13 @@ my %substitutions = (
     '$payinfo'        => 'Card/account# (masked)',
     '$error'          => 'Decline reason',
   ],
+  'cust_refund'  => [
+    '$refundnum'      => 'Refund#',
+    '$refund'         => 'Refund Amount',
+    '$payby'          => 'Refund method',
+    '$date'           => 'Refund date',
+    '$payinfo'        => 'Card/account# (masked)',
+  ],
   'system_log' => [
     '$logmessage'     => 'Log entry message',
     '$loglevel'       => 'Log entry level',
@@ -314,6 +321,7 @@ tie my %sections, 'Tie::IxHash', (
 'service'   => 'Service address',
 'cust_main' => 'Customer status and payment info',
 'cust_pkg'  => 'Package fields',
+'cust_refund' => 'Refund fields',
 'cust_bill' => 'Invoice fields',
 'cust_pay'  => 'Payment fields',
 'svc_acct'  => 'Login service fields',
index 76a2488..b34a908 100644 (file)
@@ -3,8 +3,10 @@
   <& /elements/header-popup.html, mt("$thing Receipt") &>
 
   <div align="center">
-    <A HREF="javascript:self.parent.location = '<% $pr_link %>'"><% mt('Print') |h %></A> | 
-    <A HREF="javascript:self.location = '<% $email_link %>'"><% mt('Re-email') |h %></A>
+    <A HREF="javascript:self.parent.location = '<% $pr_link %>'"><% mt('Print') |h %></A>
+%   if ( $cust_main->invoicing_list_emailonly ) {
+    | <A HREF="javascript:self.location = '<% $email_link %>'"><% mt('Re-email') |h %></A>
+%   }
   </div><BR>
 
 % } elsif ( $link eq 'print' ) { 
@@ -180,11 +182,13 @@ my $cust_pay = qsearchs({
 });
 die "$thing #$paynum not found!" unless $cust_pay;
 
+my $cust_main = $cust_pay->cust_main;
+
 my $pr_link = "${p}view/cust_pay.html?link=print;paynum=$paynum;void=$void";
 my $email_link = "${p}view/cust_pay.html?link=email;paynum=$paynum;void=$void";
 
 my $custnum = $cust_pay->custnum;
-my $display_custnum = $cust_pay->cust_main->display_custnum;
+my $display_custnum = $cust_main->display_custnum;
 
 my $conf = new FS::Conf;
 
@@ -195,8 +199,9 @@ tie my %payby, 'Tie::IxHash', FS::payby->payby2longname;
 my $email_error;
 
 if ( $link eq 'email' ) {
-    my $email_error = $cust_pay->send_receipt(
-       'manual' => 1,
+    $email_error = $cust_pay->send_receipt(
+      'manual' => 1,
+      'cust_main' => $cust_main,
     );
 
     warn "can't send payment receipt/statement: $email_error" if $email_error;
index 3197615..d5f5eb2 100644 (file)
@@ -2,7 +2,12 @@
 
   <& /elements/header-popup.html, mt('Refund Receipt') &>
 
-  <CENTER><A HREF="javascript:self.parent.location = '<% $pr_link %>'"><% mt('Print') |h %></A></CENTER><BR>
+  <DIV ALIGN="center">
+    <A HREF="javascript:self.parent.location = '<% $pr_link %>'"><% mt('Print') |h %></A>
+%   if ( $cust_main->invoicing_list_emailonly ) {
+    | <A HREF="javascript:self.location = '<% $email_link %>'"><% mt('Email') |h %></A>
+%   }
+  </DIV>
 
 % } elsif ( $link eq 'print' ) { 
 
   %>
   <BR><BR>
 
+% } elsif ( $link eq 'email' ) {
+%  if ( $email_error ) {
+      <& /elements/header-popup.html, mt("Error re-emailing receipt: [_1]", $email_error) &>
+%  } else {
+      <& /elements/header-popup.html, mt("Re-emailed receipt") &>
+%  }
 % } else { 
 
   <& /elements/header.html, mt('Refund Receipt'), menubar(
@@ -26,7 +37,7 @@
 
 % }
 
-% unless ($link eq 'popup' ) {
+% unless ($link =~ /^(popup|email)$/ ) {
   <& /elements/small_custview.html,
                $custnum,
                scalar($conf->config('countrydefault')),
     window.print();
   </SCRIPT>
 
-% }
+% } elsif ( $link eq 'email' ) {
 
-% if ( $link =~ /^(popup|print)$/ ) { 
+    <SCRIPT TYPE="text/javascript">
+      window.top.location.reload();
+    </SCRIPT>
+
+% }
+% if ( $link =~ /^(popup|print|email)$/ ) { 
     </BODY>
   </HTML>
 % } else {
@@ -125,10 +141,13 @@ my $cust_refund = qsearchs({
 });
 die "Refund #$refundnum not found!" unless $cust_refund;
 
+my $cust_main = $cust_refund->cust_main;
+
 my $pr_link = "${p}view/cust_refund.html?link=print;refundnum=$refundnum";
+my $email_link = "${p}view/cust_refund.html?link=email;refundnum=$refundnum";
 
 my $custnum = $cust_refund->custnum;
-my $display_custnum = $cust_refund->cust_main->display_custnum;
+my $display_custnum = $cust_main->display_custnum;
 
 my $conf = new FS::Conf;
 
@@ -136,4 +155,11 @@ my $money_char = $conf->config('money_char') || '$';
 
 tie my %payby, 'Tie::IxHash', FS::payby->payby2longname;
 
+my $email_error;
+
+if ( $link eq 'email' ) {
+    $email_error = $cust_refund->send_receipt( 'cust_main' => $cust_main );
+    warn "can't send refund receipt: $email_error" if $email_error;
+}
+
 </%init>