[freeside-commits] branch master updated. e28aac72a20271f60b8f628e29e4908dcfe2b05c

Mark Wells mark at 420.am
Tue Dec 9 16:46:08 PST 2014


The branch, master has been updated
       via  e28aac72a20271f60b8f628e29e4908dcfe2b05c (commit)
      from  180e28e1bc437246c6892655bc6c241cf686830b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit e28aac72a20271f60b8f628e29e4908dcfe2b05c
Author: Mark Wells <mark at freeside.biz>
Date:   Tue Dec 9 18:44:15 2014 -0600

    tax report: deduct credits from taxable amount, #27698

diff --git a/FS/FS/Report/Tax.pm b/FS/FS/Report/Tax.pm
index 713be02..43337a6 100644
--- a/FS/FS/Report/Tax.pm
+++ b/FS/FS/Report/Tax.pm
@@ -95,6 +95,10 @@ sub report_internal {
   my $pkg_tax_exempt = "SELECT SUM(amount) AS exempt_charged, billpkgnum, taxnum ".
     "FROM cust_tax_exempt_pkg EXEMPT_WHERE GROUP BY billpkgnum, taxnum";
 
+  # This just calculates the sum of credit applications to a line item.
+  my $pkg_credited = "SELECT SUM(amount) AS credited, billpkgnum ".
+    "FROM cust_credit_bill_pkg GROUP BY billpkgnum";
+
   my $where = "WHERE cust_bill._date >= $beginning AND cust_bill._date <= $ending ".
               "AND COALESCE(cust_main_county.taxname,'Tax') = '$taxname' ".
               "AND cust_main_county.country = '$country'";
@@ -176,25 +180,40 @@ sub report_internal {
   $all_sql{exempt_monthly} =~ s/EXEMPT_WHERE/WHERE exempt_monthly = 'Y'/;
 
   # taxable sales
+  # (sale - exemptions - credits, except not negative)
   $sql{taxable} = "$select
-    SUM(cust_bill_pkg.setup + cust_bill_pkg.recur - COALESCE(exempt_charged, 0))
-    FROM cust_main_county
-    JOIN ($pkg_tax) AS pkg_tax USING (taxnum)
-    JOIN cust_bill_pkg USING (billpkgnum)
+    SUM(
+      cust_bill_pkg.setup + cust_bill_pkg.recur
+        - COALESCE(exempt_charged, 0)
+        - COALESCE(credited, 0)
+      )
+    FROM cust_bill_pkg
+    LEFT JOIN ($pkg_tax) AS pkg_tax
+      ON (cust_bill_pkg.billpkgnum = pkg_tax.billpkgnum)
     LEFT JOIN ($pkg_tax_exempt) AS pkg_tax_exempt
-      ON (pkg_tax_exempt.billpkgnum = cust_bill_pkg.billpkgnum 
-          AND pkg_tax_exempt.taxnum = cust_main_county.taxnum)
+      ON (cust_bill_pkg.billpkgnum = pkg_tax_exempt.billpkgnum)
+    LEFT JOIN ($pkg_credited) AS pkg_credited
+      ON (cust_bill_pkg.billpkgnum = pkg_credited.billpkgnum)
+    LEFT JOIN cust_main_county
+      ON (COALESCE(pkg_tax.taxnum, pkg_tax_exempt.taxnum) = cust_main_county.taxnum)
     $join_cust_pkg $where AND $nottax 
     $group";
 
   $all_sql{taxable} = "$select_all
-    SUM(cust_bill_pkg.setup + cust_bill_pkg.recur - COALESCE(exempt_charged, 0))
-    FROM cust_main_county
-    JOIN ($pkg_tax) AS pkg_tax USING (taxnum)
-    JOIN cust_bill_pkg USING (billpkgnum)
+    SUM(
+      cust_bill_pkg.setup + cust_bill_pkg.recur
+        - COALESCE(exempt_charged, 0)
+        - COALESCE(credited, 0)
+      )
+    FROM cust_bill_pkg
+    LEFT JOIN ($pkg_tax) AS pkg_tax
+      ON (cust_bill_pkg.billpkgnum = pkg_tax.billpkgnum)
     LEFT JOIN ($pkg_tax_exempt) AS pkg_tax_exempt
-      ON (pkg_tax_exempt.billpkgnum = cust_bill_pkg.billpkgnum 
-          AND pkg_tax_exempt.taxnum = cust_main_county.taxnum)
+      ON (cust_bill_pkg.billpkgnum = pkg_tax_exempt.billpkgnum)
+    LEFT JOIN ($pkg_credited) AS pkg_credited
+      ON (cust_bill_pkg.billpkgnum = pkg_credited.billpkgnum)
+    LEFT JOIN cust_main_county
+      ON (COALESCE(pkg_tax.taxnum, pkg_tax_exempt.taxnum) = cust_main_county.taxnum)
     $join_cust_pkg $where AND $nottax 
     $group_all";
 
@@ -204,27 +223,39 @@ sub report_internal {
   # estimated tax (taxable * rate)
   $sql{estimated} = "$select
     SUM(cust_main_county.tax / 100 * 
-      (cust_bill_pkg.setup + cust_bill_pkg.recur - COALESCE(exempt_charged, 0))
+      ( cust_bill_pkg.setup + cust_bill_pkg.recur
+        - COALESCE(exempt_charged, 0)
+        - COALESCE(credited, 0)
+      )
     )
-    FROM cust_main_county
-    JOIN ($pkg_tax) AS pkg_tax USING (taxnum)
-    JOIN cust_bill_pkg USING (billpkgnum)
+    FROM cust_bill_pkg
+    LEFT JOIN ($pkg_tax) AS pkg_tax
+      ON (cust_bill_pkg.billpkgnum = pkg_tax.billpkgnum)
     LEFT JOIN ($pkg_tax_exempt) AS pkg_tax_exempt
-      ON (pkg_tax_exempt.billpkgnum = cust_bill_pkg.billpkgnum 
-          AND pkg_tax_exempt.taxnum = cust_main_county.taxnum)
+      ON (cust_bill_pkg.billpkgnum = pkg_tax_exempt.billpkgnum)
+    LEFT JOIN ($pkg_credited) AS pkg_credited
+      ON (cust_bill_pkg.billpkgnum = pkg_credited.billpkgnum)
+    LEFT JOIN cust_main_county
+      ON (COALESCE(pkg_tax.taxnum, pkg_tax_exempt.taxnum) = cust_main_county.taxnum)
     $join_cust_pkg $where AND $nottax 
     $group";
 
   $all_sql{estimated} = "$select_all
     SUM(cust_main_county.tax / 100 * 
-      (cust_bill_pkg.setup + cust_bill_pkg.recur - COALESCE(exempt_charged, 0))
+      ( cust_bill_pkg.setup + cust_bill_pkg.recur
+        - COALESCE(exempt_charged, 0)
+        - COALESCE(credited, 0)
+      )
     )
-    FROM cust_main_county
-    JOIN ($pkg_tax) AS pkg_tax USING (taxnum)
-    JOIN cust_bill_pkg USING (billpkgnum)
+    FROM cust_bill_pkg
+    LEFT JOIN ($pkg_tax) AS pkg_tax
+      ON (cust_bill_pkg.billpkgnum = pkg_tax.billpkgnum)
     LEFT JOIN ($pkg_tax_exempt) AS pkg_tax_exempt
-      ON (pkg_tax_exempt.billpkgnum = cust_bill_pkg.billpkgnum 
-          AND pkg_tax_exempt.taxnum = cust_main_county.taxnum)
+      ON (cust_bill_pkg.billpkgnum = pkg_tax_exempt.billpkgnum)
+    LEFT JOIN ($pkg_credited) AS pkg_credited
+      ON (cust_bill_pkg.billpkgnum = pkg_credited.billpkgnum)
+    LEFT JOIN cust_main_county
+      ON (COALESCE(pkg_tax.taxnum, pkg_tax_exempt.taxnum) = cust_main_county.taxnum)
     $join_cust_pkg $where AND $nottax 
     $group_all";
 
diff --git a/httemplate/search/cust_bill_pkg.cgi b/httemplate/search/cust_bill_pkg.cgi
index 67f618c..2d64466 100644
--- a/httemplate/search/cust_bill_pkg.cgi
+++ b/httemplate/search/cust_bill_pkg.cgi
@@ -338,7 +338,7 @@ if ( $cgi->param('nottax') ) {
   # 0: empty class
   # N: classnum
   if ( grep { $_ eq 'classnum' } $cgi->param ) {
-    my @classnums = grep /^\d*$/, $cgi->param('classnum');
+    my @classnums = grep /^\d+$/, $cgi->param('classnum');
     push @where, "COALESCE(part_fee.classnum, $part_pkg.classnum, 0) IN ( ".
                      join(',', @classnums ).
                  ' )'
@@ -422,7 +422,6 @@ if ( $cgi->param('nottax') ) {
   # If we're showing 'out' (items that aren't region/class taxable),
   # then we need the set of all items minus the union of those.
 
- 
   if ( $cgi->param('out') ) {
     # separate from the rest, in that we're not going to join cust_main_county
     # in the outer query
@@ -448,31 +447,39 @@ if ( $cgi->param('nottax') ) {
     # everything that returns things joined to a tax definition
 
     my $exempt_sub;
-    if ( @exempt_where or @tax_where or $cgi->param('taxable') ) {
 
-      # process exemption restrictions, including @tax_where
-      my $exempt_sub = 'SELECT SUM(amount) as exempt_amount, billpkgnum 
-      FROM cust_tax_exempt_pkg JOIN cust_main_county USING (taxnum)';
+    # process exemption restrictions, including @tax_where
+    my $exempt_sub = 'SELECT SUM(amount) as exempt_amount, billpkgnum 
+    FROM cust_tax_exempt_pkg JOIN cust_main_county USING (taxnum)';
 
-      $exempt_sub .= ' WHERE '.join(' AND ', @tax_where, @exempt_where)
-        if (@tax_where or @exempt_where);
+    $exempt_sub .= ' WHERE '.join(' AND ', @tax_where, @exempt_where)
+      if (@tax_where or @exempt_where);
 
-      $exempt_sub .= ' GROUP BY billpkgnum';
+    $exempt_sub .= ' GROUP BY billpkgnum';
 
-      $join_pkg .= " LEFT JOIN ($exempt_sub) AS item_exempt
-      USING (billpkgnum)";
+    $join_pkg .= " LEFT JOIN ($exempt_sub) AS item_exempt
+    ON (cust_bill_pkg.billpkgnum = item_exempt.billpkgnum)";
+
+    my $credit_sub = 'SELECT SUM(amount) AS credit_amount, billpkgnum
+    FROM cust_credit_bill_pkg GROUP BY billpkgnum';
+
+    $join_pkg .= " LEFT JOIN ($credit_sub) AS item_credit
+    ON (cust_bill_pkg.billpkgnum = item_credit.billpkgnum)";
    
+    if ( @tax_where or $cgi->param('taxable') ) {
       # process tax restrictions
       unshift @tax_where,
-        'cust_bill_pkg_tax_location.taxable_billpkgnum = cust_bill_pkg.billpkgnum',
         'cust_main_county.tax > 0';
-    }
 
-    my $tax_sub = "SELECT 1
+      my $tax_sub = "SELECT taxable_billpkgnum AS billpkgnum
       FROM cust_bill_pkg_tax_location
-      JOIN cust_bill_pkg AS tax_item USING (billpkgnum)
       JOIN cust_main_county USING (taxnum)
-      WHERE ". join(' AND ', @tax_where);
+      WHERE ". join(' AND ', @tax_where).
+      " GROUP BY taxable_billpkgnum";
+
+      $join_pkg .= " LEFT JOIN ($tax_sub) AS item_tax
+      ON (cust_bill_pkg.billpkgnum = item_tax.billpkgnum)"
+    }
 
     # now do something with that
     if ( @exempt_where ) {
@@ -484,23 +491,28 @@ if ( $cgi->param('nottax') ) {
       push @total,    'SUM(exempt_amount)';
       push @total_desc, "$money_char%.2f tax-exempt";
 
-    } elsif ( $cgi->param('taxable') ) {
+    } elsif ( @tax_where or $cgi->param('taxable') ) {
 
       my $taxable = 'cust_bill_pkg.setup + cust_bill_pkg.recur '.
-                    '- COALESCE(item_exempt.exempt_amount, 0)';
+                    '- COALESCE(item_exempt.exempt_amount, 0) '.
+                    '- COALESCE(item_credit.credit_amount, 0)';
 
+      push @where,    "(item_tax.billpkgnum IS NOT NULL OR item_exempt.billpkgnum IS NOT NULL)";
       push @select,   "($taxable) AS taxable_amount";
-      push @where,    "EXISTS($tax_sub)";
       push @peritem,  'taxable_amount';
       push @peritem_desc, 'Taxable';
-      push @total,    "SUM($taxable)";
-      push @total_desc, "$money_char%.2f taxable";
-
-    } elsif ( @tax_where ) {
 
-      # union of taxable + all exempt_ cases
-      push @where, "(EXISTS($tax_sub) OR item_exempt.billpkgnum IS NOT NULL)";
+      if ( $cgi->param('taxable') ) {
+        push @where, "($taxable) > 0";
+      } else {
+        push @total, 'SUM('.
+                        'cust_bill_pkg.setup + cust_bill_pkg.recur '.
+                        '- COALESCE(item_credit.credit_amount, 0) )';
+        push @total_desc, "$money_char%.2f net sales";
+      }
 
+      push @total,    "SUM($taxable)";
+      push @total_desc, "$money_char%.2f taxable";
     }
 
   } # handle all joins to cust_main_county

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/Report/Tax.pm                 |   79 ++++++++++++++++++++++++-----------
 httemplate/search/cust_bill_pkg.cgi |   62 ++++++++++++++++-----------
 2 files changed, 92 insertions(+), 49 deletions(-)




More information about the freeside-commits mailing list