Issue #24224:normalize margin calculations
authorgaryhgohoos <gary@xtuple.com>
Tue, 29 Jul 2014 20:30:06 +0000 (16:30 -0400)
committergaryhgohoos <gary@xtuple.com>
Tue, 29 Jul 2014 20:30:06 +0000 (16:30 -0400)
foundation-database/public/functions/calcinvoiceamt.sql
foundation-database/public/functions/calcsalesorderamt.sql
foundation-database/public/tables/metasql/bookings-detail.mql
foundation-database/public/tables/metasql/briefSalesHistory-detail.mql
foundation-database/public/tables/metasql/invoices-detail.mql
foundation-database/public/tables/metasql/opensalesorders-detail.mql
foundation-database/public/tables/metasql/salesHistory-detail.mql
foundation-database/public/views/saleshistory.sql

index fb79c3f..a60452d 100644 (file)
@@ -37,7 +37,7 @@ BEGIN
   WHERE (invcitem_invchead_id=pInvcheadid);
 
   IF (pType IN ('T', 'X')) THEN
-    SELECT SUM(tax) INTO _tax
+    SELECT COALESCE(SUM(tax), 0.0) INTO _tax
     FROM (SELECT COALESCE(ROUND(SUM(taxdetail_tax), 2), 0.0) AS tax
           FROM tax
                JOIN calculateTaxDetailSummary('I', pInvcheadid, 'T')ON (taxdetail_tax_id=tax_id)
index 0f4def9..cf11cab 100644 (file)
@@ -41,7 +41,7 @@ BEGIN
     AND (coitem_status != 'X');
 
   IF (pType IN ('T', 'B', 'X')) THEN
-    SELECT SUM(tax) INTO _tax
+    SELECT COALESCE(SUM(tax), 0.0) INTO _tax
     FROM (SELECT COALESCE(ROUND(SUM(taxdetail_tax), 2), 0.0) AS tax
           FROM tax
                JOIN calculateTaxDetailSummary('S', pCoheadid, 'T')ON (taxdetail_tax_id=tax_id)
index 6214403..28a6f08 100644 (file)
@@ -29,6 +29,21 @@ SELECT   coitem_id AS id, coitem_cohead_id AS altId,
                      (coitem_price / coitem_price_invuomratio), 2) AS extpricebalance,
          round((noNeg(coitem_qtyord - coitem_qtyshipped + coitem_qtyreturned) * coitem_qty_invuomratio) *
                      (currtobase(cohead_curr_id, coitem_price, cohead_orderdate) / coitem_price_invuomratio), 2) AS baseextpricebalance,
+         round((coitem_qtyord * coitem_qty_invuomratio) *
+                     (coitem_unitcost / coitem_price_invuomratio), 2) AS extcost,
+         (round((coitem_qtyord * coitem_qty_invuomratio) *
+                     (currtobase(cohead_curr_id, coitem_price, cohead_orderdate) / coitem_price_invuomratio), 2) -
+          round((coitem_qtyord * coitem_qty_invuomratio) *
+                     (coitem_unitcost / coitem_price_invuomratio), 2)) AS margin,
+         CASE WHEN (coitem_price > 0.0) THEN
+           (round((coitem_qtyord * coitem_qty_invuomratio) *
+                       (currtobase(cohead_curr_id, coitem_price, cohead_orderdate) / coitem_price_invuomratio), 2) -
+            round((coitem_qtyord * coitem_qty_invuomratio) *
+                       (coitem_unitcost / coitem_price_invuomratio), 2)) /
+            round((coitem_qtyord * coitem_qty_invuomratio) *
+                       (currtobase(cohead_curr_id, coitem_price, cohead_orderdate) / coitem_price_invuomratio), 2)
+              ELSE 0.0
+         END AS marginpercent,
          curr_abbr AS currAbbr,
 -- TODO - not needed, remove? (very slow)
 --         CASE WHEN (qtyAvailable(itemsite_id, coitem_scheddate) < 0.0) THEN 'error'
@@ -43,7 +58,11 @@ SELECT   coitem_id AS id, coitem_cohead_id AS altId,
        'qty' AS qtyavailable_xtnumericrole,
        'salesprice' AS coitem_price_xtnumericrole,
        'salesprice' AS baseunitprice_xtnumericrole,
+       'cost' AS coitem_unitcost_xtnumericrole,
        'curr' AS extprice_xtnumericrole,
+       'curr' AS extcost_xtnumericrole,
+       'curr' AS margin_xtnumericrole,
+       'percent' AS marginpercent_xtnumericrole,
        'curr' AS baseextprice_xtnumericrole,
        'curr' AS extpricebalance_xtnumericrole,
        'curr' AS baseextpricebalance_xtnumericrole,
index 8dc7a25..b79e353 100644 (file)
@@ -7,15 +7,28 @@
 SELECT
        COALESCE(cohead_id,-1) AS cohead_id, cust_id, cohist_ponumber,
        cust_custtype_id, custtype_code,
-       cohist_cust_id, SUM(extcost) AS extcost,
+       cohist_cust_id, cohist_ordernumber,
+       cust_number, cust_name, currAbbr,
+       CASE WHEN (cohist_invcnumber='-1') THEN  <? value("credit") ?>
+            ELSE cohist_invcnumber
+       END AS invoicenumber,
+       cohist_orderdate, cohist_invcdate,
+       SUM(extprice) AS extprice,
+       SUM(baseextprice) AS baseextprice,
+       SUM(extcost) AS extcost,
+       SUM(margin) AS margin,
+       CASE WHEN (SUM(baseextprice) > 0.0) THEN
+            ROUND(SUM(margin) / SUM(baseextprice), 4)
+            ELSE 0.0
+       END AS marginpercent,
+       'curr' AS extprice_xtnumericrole,
+       'curr' AS baseextprice_xtnumericrole,
        'curr' AS extcost_xtnumericrole,
+       'curr' AS margin_xtnumericrole,
+       'percent' AS marginpercent_xtnumericrole,
+       0 AS baseextprice_xttotalrole,
        0 AS extcost_xttotalrole,
-       cohist_ordernumber,
-       cust_number, cust_name, invoicenumber,
-       cohist_orderdate, cohist_invcdate,
-       SUM(baseextprice) AS extended,
-       'curr' AS extended_xtnumericrole,
-       0 AS extended_xttotalrole
+       0 AS margin_xttotalrole
 FROM saleshistory
   LEFT OUTER JOIN cohead ON (cohead_number=cohist_ordernumber)
 WHERE ((cohist_invcdate BETWEEN <? value("startDate") ?> AND  <? value("endDate") ?>)
@@ -60,7 +73,8 @@ WHERE ((cohist_invcdate BETWEEN <? value("startDate") ?> AND  <? value("endDate"
    AND (cohist_salesrep_id=<? value("salesrep_id") ?>)
 <? endif ?>
       )
-GROUP BY cohead_id, cust_id,cust_number,cust_custtype_id,cohist_cust_id,custtype_code,
-         cust_name,cohist_ordernumber, cohist_ponumber,
-         invoicenumber,cohist_orderdate, cohist_invcdate
+GROUP BY cohead_id, cust_id, cust_number, cust_custtype_id,
+         cohist_cust_id, custtype_code, currAbbr,
+         cust_name, cohist_ordernumber, cohist_ponumber,
+         cohist_invcnumber, cohist_orderdate, cohist_invcdate
 ORDER BY cohist_invcdate, cohist_orderdate;
index 67ee698..20b3648 100644 (file)
@@ -29,11 +29,16 @@ SELECT invchead_id, cust_id,
          invchead_invcnumber AS docnumber,
          findCustomerForm(cust_id, 'I') AS reportname,
        <? endif ?>
+       CASE WHEN (calcInvoiceAmt(invchead_id,'S') != 0.0)
+              THEN calcInvoiceAmt(invchead_id,'M')
+            ELSE 0.0
+       END AS margin,
        CASE WHEN (calcInvoiceAmt(invchead_id,'S') != 0.0)
               THEN (calcInvoiceAmt(invchead_id,'M') / calcInvoiceAmt(invchead_id,'S'))
             ELSE 1.0
        END AS marginpercent,
        'percent' AS marginpercent_xtnumericrole,
+       'curr' AS margin_xtnumericrole,
        'curr' AS extprice_xtnumericrole,
        'curr' AS balance_xtnumericrole,
        CASE WHEN (aropen_id IS NULL) THEN 'Unposted' END AS balance_qtdisplayrole
index 81385aa..bb58084 100644 (file)
@@ -20,12 +20,17 @@ SELECT DISTINCT
 <? endforeach ?>
        firstline(cohead_ordercomments) AS notes,
        calcSalesOrderAmt(cohead_id) AS ordertotal,
+       CASE WHEN (calcSalesOrderAmt(cohead_id,'S') != 0.0)
+              THEN calcSalesOrderAmt(cohead_id,'M')
+            ELSE 0.0
+       END AS ordermargin,
        CASE WHEN (calcSalesOrderAmt(cohead_id,'S') != 0.0)
               THEN (calcSalesOrderAmt(cohead_id,'M') / calcSalesOrderAmt(cohead_id,'S'))
             ELSE 1.0
        END AS ordermarginpercent,
        'percent' AS ordermarginpercent_xtnumericrole,
-       'extprice' AS ordertotal_xtnumericrole
+       'extprice' AS ordertotal_xtnumericrole,
+       'extprice' AS ordermargin_xtnumericrole
 FROM cohead 
      JOIN custinfo ON (cohead_cust_id=cust_id) 
      JOIN custtype ON (cust_custtype_id=custtype_id)
index 50da06f..c427dea 100644 (file)
@@ -4,58 +4,29 @@
 --        Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple.
 --        See www.xtuple.com/CPAL for the full text of the software license.
 
-SELECT cohist.*,
+SELECT *,
        CASE WHEN (cohist_invcnumber='-1') THEN  <? value("credit") ?>
             ELSE cohist_invcnumber
        END AS invoicenumber,
-       cust_number, cust_name, salesrep_name,
-       saletype_code, shipzone_name,
-       item_id, COALESCE(item_number, cohist_misc_descrip) AS item_number,
-       item_descrip1, (item_descrip1 || ' ' || item_descrip2) AS itemdescription,
-       warehous_code,
-       currtobase(cohist_curr_id, cohist_unitprice, cohist_invcdate) AS baseunitprice,
-       round((cohist_qtyshipped * cohist_unitprice), 2) AS extprice,
-       round((cohist_qtyshipped * currtobase(cohist_curr_id, cohist_unitprice, cohist_invcdate)), 2) AS baseextprice,
-       round((cohist_qtyshipped * cohist_unitcost), 4) AS extcost,
-       currtobase(cohist_curr_id, cohist_commission, cohist_invcdate) AS basecommission,
 <? if exists("isReport") ?>
        formatDate(cohist_invcdate) AS f_invcdate,
        formatQty(cohist_qtyshipped) AS f_qtyshipped,
        formatBoolYN(cohist_commissionpaid) AS f_commissionpaid,
-       formatSalesPrice(currtobase(cohist_curr_id, cohist_unitprice, cohist_invcdate)) AS f_baseunitprice,
-       formatMoney(round((cohist_qtyshipped * cohist_unitprice), 2)) AS f_extprice,
-       formatMoney(round((cohist_qtyshipped * currtobase(cohist_curr_id, cohist_unitprice, cohist_invcdate)), 2)) AS f_baseextprice,
-       formatMoney(round((cohist_qtyshipped * cohist_unitcost), 4)) AS f_extcost,
-       formatMoney(currtobase(cohist_curr_id, cohist_commission, cohist_invcdate)) AS f_basecommission,
+       formatSalesPrice(baseunitprice) AS f_baseunitprice,
+       formatMoney(extprice) AS f_extprice,
+       formatMoney(baseextprice) AS f_baseextprice,
+       formatMoney(extcost) AS f_extcost,
+       formatMoney(margin) AS f_margin,
+       formatPercent(marginpercent) AS f_marginpercent,
+       formatMoney(basecommission) AS f_basecommission,
 <? endif ?>
-       currConcat(cohist_curr_id) AS currAbbr,
        <? value("return") ?> AS cohist_invcdate_xtnullrole,
-       'qty' AS cohist_qtyshipped_xtnumericrole,
-       'salesprice' AS cohist_unitprice_xtnumericrole,
-       'salesprice' AS baseunitprice_xtnumericrole,
-       'curr' AS extprice_xtnumericrole,
-       'curr' AS baseextprice_xtnumericrole,
-       'cost' AS cohist_unitcost_xtnumericrole,
-       'curr' AS extcost_xtnumericrole,
-       'curr' AS cohist_commission_xtnumericrole,
-       'curr' AS basecommission_xtnumericrole,
        0 AS cohist_qtyshipped_xttotalrole,
        0 AS baseextprice_xttotalrole,
        0 AS extcost_xttotalrole,
+       0 AS margin_xttotalrole,
        0 AS basecommission_xttotalrole
-  FROM cohist JOIN custinfo ON (cust_id=cohist_cust_id)
-              JOIN salesrep ON (salesrep_id=cohist_salesrep_id)
-              LEFT OUTER JOIN saletype ON (saletype_id=cohist_saletype_id)
-              LEFT OUTER JOIN shipzone ON (shipzone_id=cohist_shipzone_id)
-<? if exists("includeMisc") ?>
-              LEFT OUTER JOIN itemsite ON (itemsite_id=cohist_itemsite_id)
-              LEFT OUTER JOIN site() ON (warehous_id=itemsite_warehous_id)
-              LEFT OUTER JOIN item ON (item_id=itemsite_item_id)
-<? else ?>
-              JOIN itemsite ON (itemsite_id=cohist_itemsite_id)
-              JOIN site() ON (warehous_id=itemsite_warehous_id)
-              JOIN item ON (item_id=itemsite_item_id)
-<? endif ?>
+  FROM saleshistory
 <? if exists("cohead_id") ?>
               JOIN cohead ON (cohead_number=cohist_ordernumber)
 <? endif ?>
@@ -63,6 +34,8 @@ WHERE ( (true)
 <? if exists("includeMisc") ?>
   AND  (COALESCE(cohist_misc_type, '') <> 'F')
   AND  (COALESCE(cohist_misc_type, '') <> 'T')
+<? else ?>
+  AND  (warehous_id IS NOT NULL)
 <? endif ?>
 <? if exists("startDate") ?>
   AND  (cohist_invcdate >= <? value("startDate") ?>)
index 7db4ed2..d648700 100644 (file)
@@ -1,21 +1,18 @@
 SELECT dropIfExists('view', 'saleshistory');
 CREATE VIEW saleshistory AS
-SELECT cohist.*,
-       CASE WHEN (cohist_invcnumber='-1') THEN 'Credit'
-            ELSE cohist_invcnumber
-       END AS invoicenumber,
-       cust_id, cust_number, cust_name, cust_curr_id, cust_custtype_id, custtype_code, custtype_descrip,
-       salesrep_number, salesrep_name, shipzone_id, shipzone_name, shipzone_descrip,
-       itemsite_warehous_id, itemsite_item_id,
-       item_id, item_number, item_descrip1, (item_descrip1 || ' ' || item_descrip2) AS itemdescription,
-       item_prodcat_id, warehous_code, warehous_descrip, prodcat_code,
-       currtobase(cohist_curr_id, cohist_commission, cohist_invcdate) AS basecommission,
-       currtobase(cohist_curr_id, cohist_unitprice, cohist_invcdate) AS baseunitprice,
-       currtocurr(cohist_curr_id, cust_curr_id, cohist_unitprice, cohist_invcdate) AS custunitprice,
+SELECT *,
+       COALESCE(item_number, cohist_misc_descrip) AS itemnumber,
+       (item_descrip1 || ' ' || item_descrip2) AS itemdescription,
        round((cohist_qtyshipped * cohist_unitprice), 2) AS extprice,
-       round((cohist_qtyshipped * currtobase(cohist_curr_id, cohist_unitprice, cohist_invcdate)), 2) AS baseextprice,
-       round((cohist_qtyshipped * currtocurr(cohist_curr_id, cust_curr_id, cohist_unitprice, cohist_invcdate)), 2) AS custextprice,
+       round((cohist_qtyshipped * baseunitprice), 2) AS baseextprice,
+       round((cohist_qtyshipped * custunitprice), 2) AS custextprice,
        round((cohist_qtyshipped * cohist_unitcost), 4) AS extcost,
+       round((cohist_qtyshipped * baseunitprice) - (cohist_qtyshipped * cohist_unitcost), 2) AS margin,
+       CASE WHEN (cohist_qtyshipped * baseunitprice > 0.0) THEN
+            (round((cohist_qtyshipped * baseunitprice) - (cohist_qtyshipped * cohist_unitcost), 2) /
+             round((cohist_qtyshipped * baseunitprice), 2))
+            ELSE 0.0
+       END AS marginpercent,
        currConcat(cohist_curr_id) AS currAbbr,
        'Return'::TEXT AS cohist_invcdate_xtnullrole,
        'qty'::TEXT AS cohist_qtyshipped_xtnumericrole,
@@ -27,22 +24,26 @@ SELECT cohist.*,
        'curr'::TEXT AS baseextprice_xtnumericrole,
        'cost'::TEXT AS cohist_unitcost_xtnumericrole,
        'curr'::TEXT AS extcost_xtnumericrole,
+       'curr'::TEXT AS margin_xtnumericrole,
+       'percent'::TEXT AS marginpercent_xtnumericrole,
        'curr'::TEXT AS cohist_commission_xtnumericrole,
-       'curr'::TEXT AS basecommission_xtnumericrole,
-       0 AS cohist_qtyshipped_xttotalrole,
-       0 AS custextprice_xttotalrole,
-       0 AS baseextprice_xttotalrole,
-       0 AS extcost_xttotalrole,
-       0 AS basecommission_xttotalrole
+       'curr'::TEXT AS basecommission_xtnumericrole
+FROM (
+SELECT *,
+       currtobase(cohist_curr_id, cohist_commission, cohist_invcdate) AS basecommission,
+       currtobase(cohist_curr_id, cohist_unitprice, cohist_invcdate) AS baseunitprice,
+       currtocurr(cohist_curr_id, cust_curr_id, cohist_unitprice, cohist_invcdate) AS custunitprice
 FROM cohist JOIN custinfo ON (cust_id=cohist_cust_id)
             JOIN custtype ON (custtype_id=cust_custtype_id)
             JOIN salesrep ON (salesrep_id=cohist_salesrep_id)
-            JOIN itemsite ON (itemsite_id=cohist_itemsite_id)
-            JOIN site() ON (warehous_id=itemsite_warehous_id)
-            JOIN item ON (item_id=itemsite_item_id)
-            JOIN prodcat ON (prodcat_id=item_prodcat_id)
+            LEFT OUTER JOIN itemsite ON (itemsite_id=cohist_itemsite_id)
+            LEFT OUTER JOIN site() ON (warehous_id=itemsite_warehous_id)
+            LEFT OUTER JOIN item ON (item_id=itemsite_item_id)
+            LEFT OUTER JOIN prodcat ON (prodcat_id=item_prodcat_id)
             LEFT OUTER JOIN shiptoinfo ON (shipto_id=cohist_shipto_id)
-            LEFT OUTER JOIN shipzone ON (shipzone_id=shipto_shipzone_id);
+            LEFT OUTER JOIN shipzone ON (shipzone_id=shipto_shipzone_id)
+            LEFT OUTER JOIN saletype ON (saletype_id=cohist_saletype_id)
+     ) AS data;
 
 REVOKE ALL ON TABLE saleshistory FROM PUBLIC;
 GRANT  ALL ON TABLE saleshistory TO GROUP xtrole;