Author: jleroux
Date: Tue Dec 25 02:02:06 2007
New Revision: 606777

URL: http://svn.apache.org/viewvc?rev=606777&view=rev
Log:
A patch from Amit Shinde "Discussion about the interaction between order total 
promotions and sales taxes" (https://issues.apache.org/jira/browse/OFBIZ-225) - 
OFBIZ-225
It's now possible to include promotions in sales tax calculations. In order for 
that to happen, make sure to set the 'taxPromotions' flag in the 
TaxAuthorityRateProduct table to 'Y'.

Modified:
    ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml
    ofbiz/trunk/applications/accounting/servicedef/services_tax.xml
    
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java
    ofbiz/trunk/applications/ecommerce/data/DemoTaxAuthority.xml
    
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java
    ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java
    
ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/CheckOutHelper.java

Modified: ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml?rev=606777&r1=606776&r2=606777&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml (original)
+++ ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml Tue Dec 25 
02:02:06 2007
@@ -3044,6 +3044,7 @@
         <field name="minPurchase" type="currency-amount"></field>
         <field name="taxShipping" type="indicator"></field>
         <field name="taxPercentage" type="floating-point"></field>
+        <field name="taxPromotions" type="indicator"></field>
         <field name="fromDate" type="date-time"></field>
         <field name="thruDate" type="date-time"></field>
         <field name="description" type="description"></field>

Modified: ofbiz/trunk/applications/accounting/servicedef/services_tax.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/servicedef/services_tax.xml?rev=606777&r1=606776&r2=606777&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/servicedef/services_tax.xml (original)
+++ ofbiz/trunk/applications/accounting/servicedef/services_tax.xml Tue Dec 25 
02:02:06 2007
@@ -35,6 +35,7 @@
         <attribute name="itemPriceList" type="java.util.List" mode="IN" 
optional="false"><!-- List of BigDecimals --></attribute>
         <attribute name="itemShippingList" type="java.util.List" mode="IN" 
optional="true"><!-- List of BigDecimals --></attribute>
         <attribute name="orderShippingAmount" type="BigDecimal" mode="IN" 
optional="true"/>
+        <attribute name="orderPromotionsAmount" type="BigDecimal" mode="IN" 
optional="true"/>
         <attribute name="shippingAddress" type="org.ofbiz.entity.GenericValue" 
mode="IN" optional="true"/>
         <attribute name="orderAdjustments" type="java.util.List" mode="OUT" 
optional="false"><!-- List of GenericValues (OrderAdjustment) --></attribute>
         <attribute name="itemAdjustments" type="java.util.List" mode="OUT" 
optional="false"><!-- List of Lists of GenericValues (OrderAdjustment), one 
List of Adjustments per item --></attribute>

Modified: 
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java?rev=606777&r1=606776&r2=606777&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java
 (original)
+++ 
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java
 Tue Dec 25 02:02:06 2007
@@ -99,7 +99,7 @@
                     throw new IllegalArgumentException("Could not find any Tax 
Authories for store with ID [" + productStoreId + "] for tax calculation; the 
store settings may need to be corrected.");
                 }
                 
-                List taxAdustmentList = getTaxAdjustments(delegator, product, 
productStore, null, billToPartyId, taxAuthoritySet, basePrice, amount, 
shippingPrice);
+                List taxAdustmentList = getTaxAdjustments(delegator, product, 
productStore, null, billToPartyId, taxAuthoritySet, basePrice, amount, 
shippingPrice, ZERO_BASE);
                 if (taxAdustmentList.size() == 0) {
                     // this is something that happens every so often for 
different products and such, so don't blow up on it...
                     Debug.logWarning("Could not find any Tax Authories Rate 
Rules for store with ID [" + productStoreId + "], productId [" + productId + 
"], basePrice [" + basePrice + "], amount [" + amount + "], for tax 
calculation; the store settings may need to be corrected.", module);
@@ -143,6 +143,7 @@
         List itemPriceList = (List) context.get("itemPriceList");
         List itemShippingList = (List) context.get("itemShippingList");
         BigDecimal orderShippingAmount = (BigDecimal) 
context.get("orderShippingAmount");
+        BigDecimal orderPromotionsAmount = (BigDecimal) 
context.get("orderPromotionsAmount");
         GenericValue shippingAddress = (GenericValue) 
context.get("shippingAddress");
 
         if (shippingAddress == null || (shippingAddress.get("countryGeoId") == 
null && shippingAddress.get("stateProvinceGeoId") == null && 
shippingAddress.get("postalCodeGeoId") == null)) {
@@ -178,13 +179,17 @@
             BigDecimal shippingAmount = (BigDecimal) itemShippingList.get(i);
             List taxList = null;
             if (shippingAddress != null) {
-                taxList = getTaxAdjustments(delegator, product, productStore, 
payToPartyId, billToPartyId, taxAuthoritySet, itemPrice, itemAmount, 
shippingAmount);
+                taxList = getTaxAdjustments(delegator, product, productStore, 
payToPartyId, billToPartyId, taxAuthoritySet, itemPrice, itemAmount, 
shippingAmount, ZERO_BASE);
             }
             // this is an add and not an addAll because we want a List of 
Lists of GenericValues, one List of Adjustments per item
             itemAdjustments.add(taxList);
         }
         if (orderShippingAmount.doubleValue() > 0) {
-            List taxList = getTaxAdjustments(delegator, null, productStore, 
payToPartyId, billToPartyId, taxAuthoritySet, ZERO_BASE, ZERO_BASE, 
orderShippingAmount);
+            List taxList = getTaxAdjustments(delegator, null, productStore, 
payToPartyId, billToPartyId, taxAuthoritySet, ZERO_BASE, ZERO_BASE, 
orderShippingAmount, ZERO_BASE);
+            orderAdjustments.addAll(taxList);
+        }
+        if(orderPromotionsAmount!=null && orderPromotionsAmount.doubleValue() 
!= 0){
+            List taxList = getTaxAdjustments(delegator, null, productStore, 
payToPartyId, billToPartyId, taxAuthoritySet, ZERO_BASE, ZERO_BASE, ZERO_BASE, 
orderPromotionsAmount);
             orderAdjustments.addAll(taxList);
         }
 
@@ -225,7 +230,7 @@
         //Debug.logInfo("Tax calc taxAuthoritySet after expand:" + 
taxAuthoritySet, module);
     }
 
-    private static List getTaxAdjustments(GenericDelegator delegator, 
GenericValue product, GenericValue productStore, String payToPartyId, String 
billToPartyId, Set taxAuthoritySet, BigDecimal itemPrice, BigDecimal 
itemAmount, BigDecimal shippingAmount) {
+    private static List getTaxAdjustments(GenericDelegator delegator, 
GenericValue product, GenericValue productStore, String payToPartyId, String 
billToPartyId, Set taxAuthoritySet, BigDecimal itemPrice, BigDecimal 
itemAmount, BigDecimal shippingAmount, BigDecimal orderPromotionsAmount) {
         Timestamp nowTimestamp = UtilDateTime.nowTimestamp();
         List adjustments = FastList.newInstance();
 
@@ -322,6 +327,9 @@
                 }
                 if (shippingAmount != null && taxAuthorityRateProduct != null 
&& (taxAuthorityRateProduct.get("taxShipping") == null || 
(taxAuthorityRateProduct.get("taxShipping") != null && 
taxAuthorityRateProduct.getBoolean("taxShipping").booleanValue()))) {
                     taxable = taxable.add(shippingAmount);
+                }
+                if (orderPromotionsAmount != null && taxAuthorityRateProduct 
!= null && (taxAuthorityRateProduct.get("taxPromotions") == null || 
(taxAuthorityRateProduct.get("taxPromotions") != null && 
taxAuthorityRateProduct.getBoolean("taxPromotions").booleanValue()))) {
+                    taxable = taxable.add(orderPromotionsAmount);
                 }
                 
                 if (taxable.doubleValue() == 0) {

Modified: ofbiz/trunk/applications/ecommerce/data/DemoTaxAuthority.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/ecommerce/data/DemoTaxAuthority.xml?rev=606777&r1=606776&r2=606777&view=diff
==============================================================================
--- ofbiz/trunk/applications/ecommerce/data/DemoTaxAuthority.xml (original)
+++ ofbiz/trunk/applications/ecommerce/data/DemoTaxAuthority.xml Tue Dec 25 
02:02:06 2007
@@ -65,7 +65,7 @@
     <TaxAuthorityCategory taxAuthGeoId="_NA_" taxAuthPartyId="_NA_" 
productCategoryId="20111"/> <!-- Micro Widgets, a category to be used to test 
categorized rates -->
     <!-- taxAuthorityRateSeqId left blank to be auto-sequenced during the EE 
XML import -->
     <TaxAuthorityRateProduct taxAuthorityRateSeqId="9000" taxAuthGeoId="_NA_" 
taxAuthPartyId="_NA_" taxAuthorityRateTypeId="SALES_TAX" productStoreId="9000"
-        productCategoryId="" titleTransferEnumId="" minItemPrice="25.00" 
minPurchase="0.00" taxShipping="N" taxPercentage="1" 
+        productCategoryId="" titleTransferEnumId="" minItemPrice="25.00" 
minPurchase="0.00" taxShipping="N" taxPercentage="1" taxPromotions="N"
         fromDate="2001-05-13 00:00:00.001" thruDate="" description="1% OFB 
_NA_ Tax"/>
         
     <!-- USA TaxAuthority defs -->
@@ -76,28 +76,28 @@
     <TaxAuthorityGlAccount taxAuthGeoId="CA" taxAuthPartyId="CA_BOE" 
organizationPartyId="Company" glAccountId="224106"/>
     <TaxAuthorityAssoc taxAuthGeoId="USA" taxAuthPartyId="USA_IRS" 
toTaxAuthGeoId="CA" toTaxAuthPartyId="CA_BOE" 
taxAuthorityAssocTypeId="EXEMPT_INHER" fromDate="2001-05-13 00:00:00.001" 
thruDate=""/>
     <TaxAuthorityRateProduct taxAuthorityRateSeqId="9001" taxAuthGeoId="CA" 
taxAuthPartyId="CA_BOE" taxAuthorityRateTypeId="SALES_TAX" productStoreId="9000"
-        productCategoryId="" titleTransferEnumId="" minItemPrice="0.00" 
minPurchase="0.00" taxShipping="N" taxPercentage="6.25" 
+        productCategoryId="" titleTransferEnumId="" minItemPrice="0.00" 
minPurchase="0.00" taxShipping="N" taxPercentage="6.25" taxPromotions="N"
         fromDate="2001-05-13 00:00:00.001" thruDate="" description="California 
State Sales Tax"/>
     
     <TaxAuthority taxAuthGeoId="NY" taxAuthPartyId="NY_DTF" 
includeTaxInPrice="N"/>
     <TaxAuthorityGlAccount taxAuthGeoId="NY" taxAuthPartyId="NY_DTF" 
organizationPartyId="Company" glAccountId="224140"/>
     <TaxAuthorityAssoc taxAuthGeoId="USA" taxAuthPartyId="USA_IRS" 
toTaxAuthGeoId="NY" toTaxAuthPartyId="NY_DTF" 
taxAuthorityAssocTypeId="EXEMPT_INHER" fromDate="2001-05-13 00:00:00.001" 
thruDate=""/>
     <TaxAuthorityRateProduct taxAuthorityRateSeqId="9002" taxAuthGeoId="NY" 
taxAuthPartyId="NY_DTF" taxAuthorityRateTypeId="SALES_TAX" productStoreId="9000"
-        productCategoryId="" titleTransferEnumId="" minItemPrice="0.00" 
minPurchase="0.00" taxShipping="N" taxPercentage="4.25" 
+        productCategoryId="" titleTransferEnumId="" minItemPrice="0.00" 
minPurchase="0.00" taxShipping="N" taxPercentage="4.25" taxPromotions="N" 
         fromDate="2001-05-13 00:00:00.001" thruDate="" description="New York 
State Sales Tax"/>
     
     <TaxAuthority taxAuthGeoId="TX" taxAuthPartyId="TX_TAXMAN" 
includeTaxInPrice="N"/>
     <TaxAuthorityGlAccount taxAuthGeoId="TX" taxAuthPartyId="TX_TAXMAN" 
organizationPartyId="Company" glAccountId="224151"/>
     <TaxAuthorityAssoc taxAuthGeoId="USA" taxAuthPartyId="USA_IRS" 
toTaxAuthGeoId="TX" toTaxAuthPartyId="TX_TAXMAN" 
taxAuthorityAssocTypeId="EXEMPT_INHER" fromDate="2001-05-13 00:00:00.001" 
thruDate=""/>
     <TaxAuthorityRateProduct taxAuthorityRateSeqId="9003" taxAuthGeoId="TX" 
taxAuthPartyId="TX_TAXMAN" taxAuthorityRateTypeId="SALES_TAX" 
productStoreId="9000"
-        productCategoryId="" titleTransferEnumId="" minItemPrice="0.00" 
minPurchase="0.00" taxShipping="N" taxPercentage="6.25" 
+        productCategoryId="" titleTransferEnumId="" minItemPrice="0.00" 
minPurchase="0.00" taxShipping="N" taxPercentage="6.25" taxPromotions="N" 
         fromDate="2001-05-13 00:00:00.001" thruDate="" description="Texas 
State Sales Tax"/>
     
     <TaxAuthority taxAuthGeoId="UT" taxAuthPartyId="UT_TAXMAN" 
includeTaxInPrice="N"/>
     <TaxAuthorityGlAccount taxAuthGeoId="UT" taxAuthPartyId="UT_TAXMAN" 
organizationPartyId="Company" glAccountId="224153"/>
     <TaxAuthorityAssoc taxAuthGeoId="USA" taxAuthPartyId="USA_IRS" 
toTaxAuthGeoId="UT" toTaxAuthPartyId="UT_TAXMAN" 
taxAuthorityAssocTypeId="EXEMPT_INHER" fromDate="2001-05-13 00:00:00.001" 
thruDate=""/>
     <TaxAuthorityRateProduct taxAuthorityRateSeqId="9004" taxAuthGeoId="UT" 
taxAuthPartyId="UT_TAXMAN" taxAuthorityRateTypeId="SALES_TAX" 
productStoreId="9000"
-        productCategoryId="" titleTransferEnumId="" minItemPrice="0.00" 
minPurchase="0.00" taxShipping="N" taxPercentage="4.75" 
+        productCategoryId="" titleTransferEnumId="" minItemPrice="0.00" 
minPurchase="0.00" taxShipping="N" taxPercentage="4.75" taxPromotions="N" 
         fromDate="2001-05-13 00:00:00.001" thruDate="" description="Utah State 
Sales Tax"/>
     <!-- An example county; there is some zip code data for testing this; note 
this is ONLY test data, there isn't really extra sales tax for this county -->
     <TaxAuthority taxAuthGeoId="UT-UTAH" taxAuthPartyId="UT_UTAH_TAXMAN" 
includeTaxInPrice="N"/>

Modified: 
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java?rev=606777&r1=606776&r2=606777&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java 
(original)
+++ 
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java 
Tue Dec 25 02:02:06 2007
@@ -2467,6 +2467,26 @@
         // add tax and shipping to subtotal
         return getOrderItemSubTotal(orderItem, 
adjustments).add(getOrderItemAdjustmentsTotal(orderItem, adjustments, false, 
true, true));
     }
+    
+    public static BigDecimal calcOrderPromoAdjustmentsBd(List 
allOrderAdjustments) {
+        BigDecimal promoAdjTotal = ZERO;
+        
+        List promoAdjustments = EntityUtil.filterByAnd(allOrderAdjustments, 
UtilMisc.toMap("orderAdjustmentTypeId", "PROMOTION_ADJUSTMENT"));
+        
+        if(!promoAdjustments.isEmpty()){
+            
+            Iterator promoAdjIter = promoAdjustments.iterator();
+            while(promoAdjIter.hasNext()){
+                GenericValue promoAdjustment = (GenericValue) 
promoAdjIter.next();
+                
+                if (promoAdjustment != null) {
+                    BigDecimal amount = 
promoAdjustment.getBigDecimal("amount").setScale(taxCalcScale, taxRounding); 
+                    promoAdjTotal = promoAdjTotal.add(amount);
+                }
+            }
+        }
+        return promoAdjTotal.setScale(scale, rounding);
+    }
 
     public static Double getWorkEffortRentalLenght(GenericValue workEffort){
         Double length = null;

Modified: 
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java?rev=606777&r1=606776&r2=606777&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java 
(original)
+++ ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java 
Tue Dec 25 02:02:06 2007
@@ -1380,6 +1380,9 @@
 
                     // shipping amount
                     BigDecimal orderShipping = 
OrderReadHelper.calcOrderAdjustments(orderHeaderAdjustments, orderSubTotal, 
false, false, true);
+                    
+                    //promotions amount
+                    BigDecimal orderPromotions = 
OrderReadHelper.calcOrderPromoAdjustmentsBd(allAdjustments);
 
                     // build up the list of tax calc service parameters
                     for (int i = 0; i < validOrderItems.size(); i++) {
@@ -1441,6 +1444,7 @@
                     Map serviceContext = UtilMisc.toMap("productStoreId", 
orh.getProductStoreId(), "itemProductList", products, "itemAmountList", amounts,
                         "itemShippingList", shipAmts, "itemPriceList", 
itPrices, "orderShippingAmount", orderShipping);
                     serviceContext.put("shippingAddress", shippingAddress);
+                    serviceContext.put("orderPromotionsAmount", 
orderPromotions);
                     if (orh.getBillToParty() != null) 
serviceContext.put("billToPartyId", orh.getBillToParty().getString("partyId"));
 
                     // invoke the calcTax service

Modified: 
ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/CheckOutHelper.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/CheckOutHelper.java?rev=606777&r1=606776&r2=606777&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/CheckOutHelper.java
 (original)
+++ 
ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/CheckOutHelper.java
 Tue Dec 25 02:02:06 2007
@@ -43,6 +43,7 @@
 import org.ofbiz.order.finaccount.FinAccountHelper;
 import org.ofbiz.order.order.OrderChangeHelper;
 import org.ofbiz.order.shoppingcart.shipping.ShippingEvents;
+import org.ofbiz.order.order.OrderReadHelper;
 import org.ofbiz.party.contact.ContactHelper;
 import org.ofbiz.product.store.ProductStoreWorker;
 import org.ofbiz.service.GenericServiceException;
@@ -798,6 +799,10 @@
             price.add(i, new BigDecimal(cartItem.getBasePrice()));
             shipAmt.add(i, BigDecimal.ZERO); // no per item shipping yet
         }
+        
+        //add promotion adjustments
+        List allAdjustments = cart.getAdjustments();
+        BigDecimal orderPromoAmt = 
OrderReadHelper.calcOrderPromoAdjustmentsBd(allAdjustments);
 
         BigDecimal shipAmount = new BigDecimal(csi.shipEstimate);
         if (shipAddress == null) {
@@ -826,6 +831,7 @@
         serviceContext.put("itemShippingList", shipAmt);
         serviceContext.put("orderShippingAmount", shipAmount);
         serviceContext.put("shippingAddress", shipAddress);
+        serviceContext.put("orderPromotionsAmount", orderPromoAmt);
 
         return serviceContext;
     }


Reply via email to