From beb4c90e57b8063677a556a1a0bf10395ca49d4e Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Fri, 23 Oct 2015 16:27:29 -0700 Subject: fix totals of credited amounts on tax report, #37088 --- FS/FS/Report/Tax.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FS/FS/Report/Tax.pm b/FS/FS/Report/Tax.pm index a892a6b87..93fc64435 100644 --- a/FS/FS/Report/Tax.pm +++ b/FS/FS/Report/Tax.pm @@ -237,7 +237,7 @@ sub report_internal { LEFT JOIN ($sales_credit) AS sales_credit USING (billpkgnum) LEFT JOIN ($exempt_credit) AS exempt_credit USING (billpkgnum, taxnum) $join_cust_pkg $where AND $nottax - $group + $group_all "; # also include the exempt-sales credit amount, for the credit report @@ -256,7 +256,7 @@ sub report_internal { LEFT JOIN ($exempt_credit) AS exempt_credit USING (taxnum) JOIN cust_bill_pkg USING (billpkgnum) $join_cust_pkg $where AND $nottax - $group + $group_all "; # taxable sales -- cgit v1.2.1 From acfdb8bec93849e35ae5c4abc276d6ca8006f717 Mon Sep 17 00:00:00 2001 From: Jonathan Prykop Date: Fri, 23 Oct 2015 20:24:40 -0500 Subject: RT#38432: OFM - Send refund receipt --- FS/FS/Conf.pm | 7 +++++ FS/FS/cust_refund.pm | 53 +++++++++++++++++++++++++++++++++ FS/FS/msg_template.pm | 12 ++++++++ httemplate/edit/msg_template/email.html | 10 ++++++- httemplate/view/cust_pay.html | 15 ++++++---- httemplate/view/cust_refund.html | 36 ++++++++++++++++++---- 6 files changed, 122 insertions(+), 11 deletions(-) diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 647ae0bdf..4a39fb9c6 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -1674,6 +1674,13 @@ and customer address. Include units.', 'per_agent' => 1, }, + { + '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', diff --git a/FS/FS/cust_refund.pm b/FS/FS/cust_refund.pm index e3fc910ec..efbdceeb0 100644 --- a/FS/FS/cust_refund.pm +++ b/FS/FS/cust_refund.pm @@ -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 diff --git a/FS/FS/msg_template.pm b/FS/FS/msg_template.pm index 1d357b1a3..01a656366 100644 --- a/FS/FS/msg_template.pm +++ b/FS/FS/msg_template.pm @@ -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 diff --git a/httemplate/edit/msg_template/email.html b/httemplate/edit/msg_template/email.html index b0c1aa31a..12a4a6f56 100644 --- a/httemplate/edit/msg_template/email.html +++ b/httemplate/edit/msg_template/email.html @@ -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', diff --git a/httemplate/view/cust_pay.html b/httemplate/view/cust_pay.html index 76a24884a..b34a90818 100644 --- a/httemplate/view/cust_pay.html +++ b/httemplate/view/cust_pay.html @@ -3,8 +3,10 @@ <& /elements/header-popup.html, mt("$thing Receipt") &>
- <% mt('Print') |h %> | - <% mt('Re-email') |h %> + <% mt('Print') |h %> +% if ( $cust_main->invoicing_list_emailonly ) { + | <% mt('Re-email') |h %> +% }

% } 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; diff --git a/httemplate/view/cust_refund.html b/httemplate/view/cust_refund.html index 319761506..d5f5eb232 100644 --- a/httemplate/view/cust_refund.html +++ b/httemplate/view/cust_refund.html @@ -2,7 +2,12 @@ <& /elements/header-popup.html, mt('Refund Receipt') &> -
<% mt('Print') |h %>

+
+ <% mt('Print') |h %> +% if ( $cust_main->invoicing_list_emailonly ) { + | <% mt('Email') |h %> +% } +
% } elsif ( $link eq 'print' ) { @@ -16,6 +21,12 @@ %>

+% } 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')), @@ -91,9 +102,14 @@ window.print(); -% } +% } elsif ( $link eq 'email' ) { -% if ( $link =~ /^(popup|print)$/ ) { + + +% } +% if ( $link =~ /^(popup|print|email)$/ ) { % } 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; +} + -- cgit v1.2.1 From 50b038e338455c5d20f48f99767767b70c515c31 Mon Sep 17 00:00:00 2001 From: Jonathan Prykop Date: Fri, 23 Oct 2015 20:46:01 -0500 Subject: RT#38533: One click re-send refund,payment receipt, invoice --- httemplate/elements/popup_link_onclick.html | 14 ++++++++------ httemplate/misc/send-invoice.cgi | 10 +++++++++- httemplate/view/cust_main.cgi | 8 ++++++++ httemplate/view/cust_main/payment_history.html | 3 ++- httemplate/view/cust_main/payment_history/invoice.html | 11 ++++++++++- httemplate/view/cust_main/payment_history/payment.html | 9 ++++++++- httemplate/view/cust_main/payment_history/refund.html | 9 ++++++++- 7 files changed, 53 insertions(+), 11 deletions(-) diff --git a/httemplate/elements/popup_link_onclick.html b/httemplate/elements/popup_link_onclick.html index 612de7520..8faa27f7f 100644 --- a/httemplate/elements/popup_link_onclick.html +++ b/httemplate/elements/popup_link_onclick.html @@ -9,12 +9,13 @@ Example: #required 'action' => 'content.html', # uri for content of popup - #alternately, use instead of action - 'js_action' => 'url', # javascript variable or expression - #strongly recommended 'actionlabel => 'You clicked', # popup title + #alternately, use instead of action, values will be passed unquoted to overlib + 'js_action' => 'url', # javascript variable or expression + 'js_actionlabel' => 'actionlabel', # javascript variable or expression + #opt 'width' => 540, 'height' => 336, @@ -50,9 +51,10 @@ if (ref($_[0]) eq 'HASH') { $params = { @_ }; } -$action = q(') . $params->{'action'} . q(') if exists $params->{'action'}; +$action = q(') . $params->{'action'} . q('); $action = $params->{'js_action'} if exists $params->{'js_action'}; -$actionlabel = $params->{'actionlabel'} if exists $params->{'actionlabel'}; +$actionlabel = q(') . $params->{'actionlabel'} . q('); +$actionlabel = $params->{'js_actionlabel'} if exists $params->{'js_actionlabel'}; $width = $params->{'width'} if exists $params->{'width'}; $height = $params->{'height'} if exists $params->{'height'}; $color = $params->{'color'} if exists $params->{'color'}; @@ -66,7 +68,7 @@ my $popup_name = 'popup-'.random_id(); my $onclick = "overlib( OLiframeContent($action, $width, $height, '$popup_name', 0, '$scrolling' ), ". - "CAPTION, '$actionlabel', STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, ". + "CAPTION, $actionlabel, STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, ". "DRAGGABLE, CLOSECLICK, ". "BGCOLOR, '$color', CGCOLOR, '$color', FGCOLOR, '#f8f8f8', ". "CLOSETEXT, '$closetext'". diff --git a/httemplate/misc/send-invoice.cgi b/httemplate/misc/send-invoice.cgi index dd9c3ade2..435875348 100644 --- a/httemplate/misc/send-invoice.cgi +++ b/httemplate/misc/send-invoice.cgi @@ -1,4 +1,12 @@ -% if ( $error ) { +% if ($cgi->param('popup')) { +% my $title = $error ? 'Error sending invoice email' : 'Invoice email sent'; +<% include('/elements/header-popup.html', $title ) %> +
+<% $error %>
+ +
+<% include('/elements/footer.html') %> +% } elsif ( $error ) { % errorpage($error); % } else { <% $cgi->redirect("${p}view/cust_main.cgi?$custnum") %> diff --git a/httemplate/view/cust_main.cgi b/httemplate/view/cust_main.cgi index 95cb5da7c..af611bbbd 100755 --- a/httemplate/view/cust_main.cgi +++ b/httemplate/view/cust_main.cgi @@ -35,6 +35,14 @@ function areyousure(href, message) { if (confirm(message) == true) window.location.href = href; } +function areyousure_popup(message, action, actionlabel) { + if (confirm(message) == true) { +<% include('/elements/popup_link_onclick.html', + 'js_action' => 'action', + 'js_actionlabel' => 'actionlabel', + ) %> + } +}
diff --git a/httemplate/view/cust_main/payment_history.html b/httemplate/view/cust_main/payment_history.html index d81fe9935..481251478 100644 --- a/httemplate/view/cust_main/payment_history.html +++ b/httemplate/view/cust_main/payment_history.html @@ -226,7 +226,7 @@ my %opt = ( #rights ( map { $_ => $curuser->access_right($_) } ( - 'View invoices', 'Void invoices', 'Unvoid invoices', + 'View invoices', 'Void invoices', 'Unvoid invoices', 'Resend invoices', 'Apply payment', 'Refund credit card payment', 'Refund Echeck payment', 'Post refund', 'Post check refund', 'Post cash refund ', 'Refund payment', 'Credit card void', 'Echeck void', 'Void payments', 'Unvoid payments', @@ -240,6 +240,7 @@ my %opt = ( #customer information 'total_owed' => $cust_main->total_owed, 'total_unapplied_refunds' => $cust_main->total_unapplied_refunds, + 'has_email_address' => scalar($cust_main->invoicing_list_emailonly), ); $opt{'date_format'} ||= '%m/%d/%Y'; diff --git a/httemplate/view/cust_main/payment_history/invoice.html b/httemplate/view/cust_main/payment_history/invoice.html index be4e93e31..058da5463 100644 --- a/httemplate/view/cust_main/payment_history/invoice.html +++ b/httemplate/view/cust_main/payment_history/invoice.html @@ -1,4 +1,4 @@ -<% $link %><% $invoice %><% $link ? '' : '' %><% "$void$under" %> +<% $link %><% $invoice %><% $link ? '' : '' %><% "$email$void$under" %> <%init> my( $cust_bill, %opt ) = @_; @@ -34,6 +34,15 @@ if ( $cust_bill->closed !~ /^Y/i && $opt{'Void invoices'} ) { ')'; } +my $email = ($opt{'has_email_address'} && $opt{'Resend invoices'}) ? + q! (invnum. + q!','Email Invoice Receipt')" TITLE="Send email receipt">email receipt)! + : ''; + my $events = ''; if ( $cust_bill->num_cust_event && ($opt{'Billing event reports'} || $opt{'View customer billing events'}) diff --git a/httemplate/view/cust_main/payment_history/payment.html b/httemplate/view/cust_main/payment_history/payment.html index fd336b86c..d72e34b38 100644 --- a/httemplate/view/cust_main/payment_history/payment.html +++ b/httemplate/view/cust_main/payment_history/payment.html @@ -1,5 +1,5 @@ <% $payment. ' '. $info. $desc. - $view. $change_pkg. $apply. $refund. $void. $unapply + $view. $email. $change_pkg. $apply. $refund. $void. $unapply %> <%init> @@ -139,6 +139,13 @@ my $view = ). ')'; +my $email = $opt{'has_email_address'} ? + q! (paynum. + q!','Email Payment Receipt')" TITLE="Send email receipt">email receipt)! + : ''; + my $change_pkg = ''; if ( $apply && $opt{'pkg-balances'} && $cust_pay->pkgnum ) { $change_pkg = diff --git a/httemplate/view/cust_main/payment_history/refund.html b/httemplate/view/cust_main/payment_history/refund.html index fc2a5ccf0..e82df90dc 100644 --- a/httemplate/view/cust_main/payment_history/refund.html +++ b/httemplate/view/cust_main/payment_history/refund.html @@ -1,6 +1,6 @@ <% $refund %> (<% "$payby$payinfo" %>) -<% "$view$delete" %> +<% "$view$email$delete" %> <%init> my( $cust_refund, %opt ) = @_; @@ -26,6 +26,13 @@ my $view = ). ')'; +my $email = $opt{'has_email_address'} ? + q! (refundnum. + q!','Email Refund Receipt')" TITLE="Send email receipt">email receipt)! + : ''; + my $delete = ''; $delete = areyousure_link("${p}misc/delete-cust_refund.cgi?".$cust_refund->refundnum, emt('Are you sure you want to delete this refund?'), -- cgit v1.2.1