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;
}