Author: jonesde
Date: Mon Dec 6 08:05:44 2010
New Revision: 1042542
URL: http://svn.apache.org/viewvc?rev=1042542&view=rev
Log:
Implemented alternative way of saving ProductPrices with tax included in the
price, and then calculating VAT tax as an exclusive instead of inclusive amount
that goes on a new field on OrderAdjustment; also added a method to
OrderReadHelper to get tax for display; there are various changes to service
descriptions and entity fields to describe these changes
Modified:
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java
ofbiz/trunk/applications/order/data/OrderTypeData.xml
ofbiz/trunk/applications/order/entitydef/entitymodel.xml
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java
ofbiz/trunk/applications/product/entitydef/entitymodel.xml
ofbiz/trunk/applications/product/script/org/ofbiz/product/price/PriceServices.xml
ofbiz/trunk/applications/product/servicedef/services.xml
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=1042542&r1=1042541&r2=1042542&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
Mon Dec 6 08:05:44 2010
@@ -391,11 +391,38 @@ public class TaxAuthorityServices {
// TODO: what to do if no TaxAuthorityGlAccount found? Use
some default, or is that done elsewhere later on?
}
+ GenericValue productPrice = null;
+ if (product != null && taxAuthPartyId != null && taxAuthGeoId
!= null) {
+ // find a ProductPrice for the productId and taxAuth*
valxues, and see if it has a priceWithTax value
+ Map<String, String> priceFindMap =
UtilMisc.toMap("productId", product.getString("productId"),
+ "taxAuthPartyId", taxAuthPartyId, "taxAuthGeoId",
taxAuthGeoId,
+ "productPriceTypeId", "DEFAULT_PRICE",
"productPricePurposeId", "PURCHASE");
+ List<GenericValue> productPriceList =
delegator.findByAnd("ProductPrice", priceFindMap, UtilMisc.toList("-fromDate"));
+ productPriceList =
EntityUtil.filterByDate(productPriceList, true);
+ productPrice = (productPriceList != null &&
productPriceList.size() > 0) ? productPriceList.get(0): null;
+ //Debug.logInfo("=================== productId=" +
product.getString("productId"), module);
+ //Debug.logInfo("=================== productPrice=" +
productPrice, module);
+
+ }
+
GenericValue taxAdjValue =
delegator.makeValue("OrderAdjustment");
- taxAdjValue.set("taxAuthorityRateSeqId",
taxAuthorityRateProduct.getString("taxAuthorityRateSeqId"));
- taxAdjValue.set("amount", taxAmount);
+
+ if ("Y".equals(productPrice.getString("taxInPrice"))) {
+ // tax is in the price already, so we want the adjustment
to be a VAT_TAX adjustment to be subtracted instead of a SALES_TAX adjustment
to be added
+ taxAdjValue.set("orderAdjustmentTypeId", "VAT_TAX");
+
+ // the amount will be different because we want to figure
out how much of the price was tax, and not how much tax needs to be added
+ // the formula is: taxAmount = priceWithTax -
(priceWithTax/(1+taxPercentage/100))
+ BigDecimal taxAmountIncluded =
itemAmount.subtract(itemAmount.divide(BigDecimal.ONE.add(taxRate.divide(PERCENT_SCALE,
4, BigDecimal.ROUND_HALF_UP)), 3, BigDecimal.ROUND_HALF_UP));
+ taxAdjValue.set("amountAlreadyIncluded",
taxAmountIncluded);
+ taxAdjValue.set("amount", BigDecimal.ZERO);
+ } else {
+ taxAdjValue.set("orderAdjustmentTypeId", "SALES_TAX");
+ taxAdjValue.set("amount", taxAmount);
+ }
+
taxAdjValue.set("sourcePercentage", taxRate);
- taxAdjValue.set("orderAdjustmentTypeId", "SALES_TAX");
+ taxAdjValue.set("taxAuthorityRateSeqId",
taxAuthorityRateProduct.getString("taxAuthorityRateSeqId"));
// the primary Geo should be the main jurisdiction that the
tax is for, and the secondary would just be to define a parent or wrapping
jurisdiction of the primary
taxAdjValue.set("primaryGeoId", taxAuthGeoId);
taxAdjValue.set("comments",
taxAuthorityRateProduct.getString("description"));
@@ -421,62 +448,50 @@ public class TaxAuthorityServices {
}
adjustments.add(taxAdjValue);
-
- // for VAT taxes if the calculated total item price plus
calculated taxes is different from what would be
- // expected based on the original entered price with taxes (if
the price was entered this way), then create
- // an adjustment that corrects for the difference, and this
correction will be effectively subtracted from the
- // price and not from the tax (the tax is meant to be
calculated based on Tax Authority rules and so should
- // not be shorted)
-
- // TODO get this to work with price rules changing the default
price (right now only works where itemPrice==defaultPrice
- // TODO (don't think this is needed, but just to keep it in
mind): get this to work with multiple VAT tax authorities instead of just one
(right now will get incorrect totals if there are multiple taxes included in
the price)
- // TODO add constraint to ProductPrice lookup by any
productStoreGroupId associated with the current productStore
-
- //Debug.logInfo("=================== itemQuantity=" +
itemQuantity, module);
- //Debug.logInfo("=================== taxAuthPartyId=" +
taxAuthPartyId, module);
- //Debug.logInfo("=================== taxAuthGeoId=" +
taxAuthGeoId, module);
- if (product != null && itemQuantity != null && taxAuthPartyId
!= null && taxAuthGeoId != null) {
- // find a ProductPrice for the productId and taxAuth*
valxues, and see if it has a priceWithTax value
- Map<String, String> priceFindMap =
UtilMisc.toMap("productId", product.getString("productId"),
- "taxAuthPartyId", taxAuthPartyId, "taxAuthGeoId",
taxAuthGeoId,
- "productPriceTypeId", "DEFAULT_PRICE",
"productPricePurposeId", "PURCHASE");
- List<GenericValue> productPriceList =
delegator.findByAnd("ProductPrice", priceFindMap, UtilMisc.toList("-fromDate"));
- productPriceList =
EntityUtil.filterByDate(productPriceList, true);
- GenericValue productPrice = (productPriceList != null &&
productPriceList.size() > 0) ? productPriceList.get(0): null;
- //Debug.logInfo("=================== productId=" +
product.getString("productId"), module);
- //Debug.logInfo("=================== productPrice=" +
productPrice, module);
+
+ if (productPrice != null && itemQuantity != null &&
+ productPrice.getBigDecimal("priceWithTax") != null &&
+ !"Y".equals(productPrice.getString("taxInPrice"))) {
+ BigDecimal priceWithTax =
productPrice.getBigDecimal("priceWithTax");
+ BigDecimal price = productPrice.getBigDecimal("price");
+ BigDecimal baseSubtotal = price.multiply(itemQuantity);
+ BigDecimal baseTaxAmount =
(baseSubtotal.multiply(taxRate)).divide(PERCENT_SCALE, salestaxCalcDecimals,
salestaxRounding);
+ //Debug.logInfo("=================== priceWithTax=" +
priceWithTax, module);
+ //Debug.logInfo("===================
enteredTotalPriceWithTax=" + enteredTotalPriceWithTax, module);
+ //Debug.logInfo("===================
calcedTotalPriceWithTax=" + calcedTotalPriceWithTax, module);
+
+ // tax is not already in price so we want to add it in,
but this is a VAT situation so adjust to make it as accurate as possible
+
+ // for VAT taxes if the calculated total item price plus
calculated taxes is different from what would be
+ // expected based on the original entered price with taxes
(if the price was entered this way), then create
+ // an adjustment that corrects for the difference, and
this correction will be effectively subtracted from the
+ // price and not from the tax (the tax is meant to be
calculated based on Tax Authority rules and so should
+ // not be shorted)
+
+ // TODO (don't think this is needed, but just to keep it
in mind): get this to work with multiple VAT tax authorities instead of just
one (right now will get incorrect totals if there are multiple taxes included
in the price)
+ // TODO add constraint to ProductPrice lookup by any
productStoreGroupId associated with the current productStore
- if (productPrice != null &&
productPrice.getBigDecimal("priceWithTax") != null) {
- BigDecimal priceWithTax =
productPrice.getBigDecimal("priceWithTax");
- BigDecimal price = productPrice.getBigDecimal("price");
- BigDecimal baseSubtotal = price.multiply(itemQuantity);
- BigDecimal baseTaxAmount =
(baseSubtotal.multiply(taxRate)).divide(PERCENT_SCALE, salestaxCalcDecimals,
salestaxRounding);
- BigDecimal enteredTotalPriceWithTax =
priceWithTax.multiply(itemQuantity);
- BigDecimal calcedTotalPriceWithTax =
(baseSubtotal).add(baseTaxAmount);
- //Debug.logInfo("=================== priceWithTax=" +
priceWithTax, module);
- //Debug.logInfo("===================
enteredTotalPriceWithTax=" + enteredTotalPriceWithTax, module);
- //Debug.logInfo("===================
calcedTotalPriceWithTax=" + calcedTotalPriceWithTax, module);
+ BigDecimal enteredTotalPriceWithTax =
priceWithTax.multiply(itemQuantity);
+ BigDecimal calcedTotalPriceWithTax =
(baseSubtotal).add(baseTaxAmount);
+ if
(!enteredTotalPriceWithTax.equals(calcedTotalPriceWithTax)) {
+ // if the calced amount is higher than the entered
amount we want the value to be negative
+ // to get it down to match the entered amount
+ // so, subtract the calced amount from the entered
amount (ie: correction = entered - calced)
+ BigDecimal correctionAmount =
enteredTotalPriceWithTax.subtract(calcedTotalPriceWithTax);
+ //Debug.logInfo("===================
correctionAmount=" + correctionAmount, module);
- if
(!enteredTotalPriceWithTax.equals(calcedTotalPriceWithTax)) {
- // if the calced amount is higher than the entered
amount we want the value to be negative
- // to get it down to match the entered amount
- // so, subtract the calced amount from the entered
amount (ie: correction = entered - calced)
- BigDecimal correctionAmount =
enteredTotalPriceWithTax.subtract(calcedTotalPriceWithTax);
- //Debug.logInfo("===================
correctionAmount=" + correctionAmount, module);
-
- GenericValue correctionAdjValue =
delegator.makeValue("OrderAdjustment");
- correctionAdjValue.set("taxAuthorityRateSeqId",
taxAuthorityRateProduct.getString("taxAuthorityRateSeqId"));
- correctionAdjValue.set("amount", correctionAmount);
- // don't set this, causes a doubling of the tax
rate because calling code adds up all tax rates:
correctionAdjValue.set("sourcePercentage", taxRate);
- correctionAdjValue.set("orderAdjustmentTypeId",
"VAT_PRICE_CORRECT");
- // the primary Geo should be the main jurisdiction
that the tax is for, and the secondary would just be to define a parent or
wrapping jurisdiction of the primary
- correctionAdjValue.set("primaryGeoId",
taxAuthGeoId);
- correctionAdjValue.set("comments",
taxAuthorityRateProduct.getString("description"));
- if (taxAuthPartyId != null)
correctionAdjValue.set("taxAuthPartyId", taxAuthPartyId);
- if (taxAuthGlAccountId != null)
correctionAdjValue.set("overrideGlAccountId", taxAuthGlAccountId);
- if (taxAuthGeoId != null)
correctionAdjValue.set("taxAuthGeoId", taxAuthGeoId);
- adjustments.add(correctionAdjValue);
- }
+ GenericValue correctionAdjValue =
delegator.makeValue("OrderAdjustment");
+ correctionAdjValue.set("taxAuthorityRateSeqId",
taxAuthorityRateProduct.getString("taxAuthorityRateSeqId"));
+ correctionAdjValue.set("amount", correctionAmount);
+ // don't set this, causes a doubling of the tax rate
because calling code adds up all tax rates:
correctionAdjValue.set("sourcePercentage", taxRate);
+ correctionAdjValue.set("orderAdjustmentTypeId",
"VAT_PRICE_CORRECT");
+ // the primary Geo should be the main jurisdiction
that the tax is for, and the secondary would just be to define a parent or
wrapping jurisdiction of the primary
+ correctionAdjValue.set("primaryGeoId", taxAuthGeoId);
+ correctionAdjValue.set("comments",
taxAuthorityRateProduct.getString("description"));
+ if (taxAuthPartyId != null)
correctionAdjValue.set("taxAuthPartyId", taxAuthPartyId);
+ if (taxAuthGlAccountId != null)
correctionAdjValue.set("overrideGlAccountId", taxAuthGlAccountId);
+ if (taxAuthGeoId != null)
correctionAdjValue.set("taxAuthGeoId", taxAuthGeoId);
+ adjustments.add(correctionAdjValue);
}
}
}
Modified: ofbiz/trunk/applications/order/data/OrderTypeData.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/data/OrderTypeData.xml?rev=1042542&r1=1042541&r2=1042542&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/data/OrderTypeData.xml (original)
+++ ofbiz/trunk/applications/order/data/OrderTypeData.xml Mon Dec 6 08:05:44
2010
@@ -42,6 +42,7 @@ under the License.
<OrderAdjustmentType description="Fee" hasTable="N"
orderAdjustmentTypeId="FEE" parentTypeId=""/>
<OrderAdjustmentType description="Miscellaneous Charges" hasTable="N"
orderAdjustmentTypeId="MISCELLANEOUS_CHARGE" parentTypeId=""/>
<OrderAdjustmentType description="Sales Tax" hasTable="N"
orderAdjustmentTypeId="SALES_TAX" parentTypeId=""/>
+ <OrderAdjustmentType description="VAT Tax (not added to totals)"
hasTable="N" orderAdjustmentTypeId="VAT_TAX" parentTypeId=""/>
<OrderAdjustmentType description="VAT Price Correction" hasTable="N"
orderAdjustmentTypeId="VAT_PRICE_CORRECT" parentTypeId=""/>
<OrderAdjustmentType description="Shipping and Handling" hasTable="N"
orderAdjustmentTypeId="SHIPPING_CHARGES" parentTypeId=""/>
<OrderAdjustmentType description="Surcharge" hasTable="N"
orderAdjustmentTypeId="SURCHARGE_ADJUSTMENT" parentTypeId=""/>
Modified: ofbiz/trunk/applications/order/entitydef/entitymodel.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/entitydef/entitymodel.xml?rev=1042542&r1=1042541&r2=1042542&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/entitydef/entitymodel.xml (original)
+++ ofbiz/trunk/applications/order/entitydef/entitymodel.xml Mon Dec 6
08:05:44 2010
@@ -59,6 +59,7 @@ under the License.
<field name="description" type="description"></field>
<field name="amount" type="currency-precise"></field>
<field name="recurringAmount" type="currency-precise"></field>
+ <field name="amountAlreadyIncluded"
type="currency-precise"><description>The amount here is already represented in
the price, such as VAT taxes.</description></field>
<field name="productPromoId" type="id"></field>
<field name="productPromoRuleId" type="id"></field>
<field name="productPromoActionSeqId" type="id"></field>
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=1042542&r1=1042541&r2=1042542&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
Mon Dec 6 08:05:44 2010
@@ -2920,4 +2920,62 @@ public class OrderReadHelper {
result.put("taxGrandTotal", taxGrandTotal);
return result;
}
+
+ public static Map<String, Object>
getOrderTaxByTaxAuthGeoAndPartyForDisplay(List<GenericValue>
orderAdjustmentsOriginal) {
+ BigDecimal taxGrandTotal = BigDecimal.ZERO;
+ List<Map<String, Object>> taxByTaxAuthGeoAndPartyList =
FastList.newInstance();
+ List<GenericValue> orderAdjustmentsToUse = FastList.newInstance();
+ if (UtilValidate.isNotEmpty(orderAdjustmentsOriginal)) {
+ // get orderAdjustment where orderAdjustmentTypeId is SALES_TAX.
+
orderAdjustmentsToUse.addAll(EntityUtil.filterByAnd(orderAdjustmentsOriginal,
UtilMisc.toMap("orderAdjustmentTypeId", "SALES_TAX")));
+
orderAdjustmentsToUse.addAll(EntityUtil.filterByAnd(orderAdjustmentsOriginal,
UtilMisc.toMap("orderAdjustmentTypeId", "VAT_TAX")));
+ orderAdjustmentsToUse = EntityUtil.orderBy(orderAdjustmentsToUse,
UtilMisc.toList("taxAuthGeoId","taxAuthPartyId"));
+
+ // get the list of all distinct taxAuthGeoId and taxAuthPartyId. It
is for getting the number of taxAuthGeo and taxAuthPartyId in adjustments.
+ List<String> distinctTaxAuthGeoIdList =
EntityUtil.getFieldListFromEntityList(orderAdjustmentsToUse, "taxAuthGeoId",
true);
+ List<String> distinctTaxAuthPartyIdList =
EntityUtil.getFieldListFromEntityList(orderAdjustmentsToUse, "taxAuthPartyId",
true);
+
+ // Keep a list of amount that have been added to make sure none are
missed (if taxAuth* information is missing)
+ List<GenericValue> processedAdjustments = FastList.newInstance();
+ // For each taxAuthGeoId get and add amount from orderAdjustment
+ for (String taxAuthGeoId : distinctTaxAuthGeoIdList) {
+ for (String taxAuthPartyId : distinctTaxAuthPartyIdList) {
+ //get all records for orderAdjustments filtered by
taxAuthGeoId and taxAurhPartyId
+ List<GenericValue> orderAdjByTaxAuthGeoAndPartyIds =
EntityUtil.filterByAnd(orderAdjustmentsToUse, UtilMisc.toMap("taxAuthGeoId",
taxAuthGeoId, "taxAuthPartyId", taxAuthPartyId));
+ if
(UtilValidate.isNotEmpty(orderAdjByTaxAuthGeoAndPartyIds)) {
+ BigDecimal totalAmount = BigDecimal.ZERO;
+ //Now for each orderAdjustment record get and add
amount.
+ for (GenericValue orderAdjustment :
orderAdjByTaxAuthGeoAndPartyIds) {
+ BigDecimal amount =
orderAdjustment.getBigDecimal("amount");
+ if (amount != null) {
+ totalAmount = totalAmount.add(amount);
+ }
+ if
("VAT_TAX".equals(orderAdjustment.getString("orderAdjustmentTypeId")) &&
+
orderAdjustment.get("amountAlreadyIncluded") != null) {
+ // this is the only case where the VAT_TAX
amountAlreadyIncluded should be added in, and should just be for display and
not to calculate the order grandTotal
+ totalAmount =
totalAmount.add(orderAdjustment.getBigDecimal("amountAlreadyIncluded"));
+ }
+ totalAmount = totalAmount.setScale(taxCalcScale,
taxRounding);
+ processedAdjustments.add(orderAdjustment);
+ }
+ totalAmount = totalAmount.setScale(taxFinalScale,
taxRounding);
+ taxByTaxAuthGeoAndPartyList.add(UtilMisc.<String,
Object>toMap("taxAuthPartyId", taxAuthPartyId, "taxAuthGeoId", taxAuthGeoId,
"totalAmount", totalAmount));
+ taxGrandTotal = taxGrandTotal.add(totalAmount);
+ }
+ }
+ }
+ // Process any adjustments that got missed
+ List<GenericValue> missedAdjustments = FastList.newInstance();
+ missedAdjustments.addAll(orderAdjustmentsToUse);
+ missedAdjustments.removeAll(processedAdjustments);
+ for (GenericValue orderAdjustment : missedAdjustments) {
+ taxGrandTotal =
taxGrandTotal.add(orderAdjustment.getBigDecimal("amount").setScale(taxCalcScale,
taxRounding));
+ }
+ taxGrandTotal = taxGrandTotal.setScale(taxFinalScale, taxRounding);
+ }
+ Map<String, Object> result = FastMap.newInstance();
+ result.put("taxByTaxAuthGeoAndPartyList", taxByTaxAuthGeoAndPartyList);
+ result.put("taxGrandTotal", taxGrandTotal);
+ return result;
+ }
}
Modified: ofbiz/trunk/applications/product/entitydef/entitymodel.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/entitydef/entitymodel.xml?rev=1042542&r1=1042541&r2=1042542&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/entitydef/entitymodel.xml (original)
+++ ofbiz/trunk/applications/product/entitydef/entitymodel.xml Mon Dec 6
08:05:44 2010
@@ -2375,11 +2375,13 @@ under the License.
<field name="price" type="currency-precise"></field>
<field name="termUomId" type="id"><description>Mainly used for recurring
and usage prices to specify a time/freq measure, or a usage unit measure (bits,
minutes, etc)</description></field>
<field name="customPriceCalcService" type="id"><description>Points to a
CustomMethod used to specify a service for the calculation of the unit price of
the product (NOTE: a better name for this field might be
priceCalcCustomMethodId)</description></field>
- <field name="priceWithTax" type="currency-precise"/>
+ <field name="priceWithoutTax"
type="currency-precise"><description>Always without tax if populated,
regardless of if price does or does not include tax.</description></field>
+ <field name="priceWithTax" type="currency-precise"><description>Always
with tax if populated, regardless of if price does or does not include
tax.</description></field>
<field name="taxAmount" type="currency-precise"/>
<field name="taxPercentage" type="fixed-point"/>
<field name="taxAuthPartyId" type="id-ne"/>
<field name="taxAuthGeoId" type="id-ne"/>
+ <field name="taxInPrice" type="indicator"><description>If Y the price
field has tax included for the given taxAuthPartyId/taxAuthGeoId at the
taxPercentage.</description></field>
<field name="createdDate" type="date-time"></field>
<field name="createdByUserLogin" type="id-vlong"></field>
<field name="lastModifiedDate" type="date-time"></field>
Modified:
ofbiz/trunk/applications/product/script/org/ofbiz/product/price/PriceServices.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/script/org/ofbiz/product/price/PriceServices.xml?rev=1042542&r1=1042541&r2=1042542&view=diff
==============================================================================
---
ofbiz/trunk/applications/product/script/org/ofbiz/product/price/PriceServices.xml
(original)
+++
ofbiz/trunk/applications/product/script/org/ofbiz/product/price/PriceServices.xml
Mon Dec 6 08:05:44 2010
@@ -106,6 +106,7 @@ under the License.
</condition>
<then>
<set field="parameters.priceWithTax"
from-field="parameters.price"/>
+
<!-- if taxPercentage not passed in look it up based on
taxAuthGeoId and taxAuthPartyId -->
<if-empty field="parameters.taxPercentage">
<!-- we only have basic data to constrain by here, so
assume that if it is a VAT tax setup it should be pretty simple -->
@@ -127,6 +128,7 @@ under the License.
<check-errors/>
</if-empty>
+ <!-- in short the formula is: taxAmount = priceWithTax -
(priceWithTax/(1+taxPercentage/100)) -->
<calculate field="parameters.taxAmount" type="BigDecimal"
decimal-scale="3" rounding-mode="HalfUp">
<calcop operator="subtract">
<calcop operator="get"
field="parameters.priceWithTax"/>
@@ -142,12 +144,23 @@ under the License.
</calcop>
</calcop>
</calculate>
- <calculate field="parameters.price" type="BigDecimal"
decimal-scale="3" rounding-mode="HalfUp">
+
+ <calculate field="parameters.priceWithoutTax"
type="BigDecimal" decimal-scale="3" rounding-mode="HalfUp">
<calcop operator="subtract">
<calcop operator="get"
field="parameters.priceWithTax"/>
<calcop operator="get"
field="parameters.taxAmount"></calcop>
</calcop>
</calculate>
+
+ <if-compare field="parameters.taxInPrice" operator="equals"
value="Y">
+ <!-- the price passed in has tax included, and we want to
store it with tax included -->
+ <set field="parameters.price"
from-field="parameters.priceWithTax"/>
+
+ <else>
+ <!-- the price passed in has tax included, but we want
to store it without tax included -->
+ <set field="parameters.price"
from-field="parameters.priceWithoutTax"/>
+ </else>
+ </if-compare>
</then>
</if>
</simple-method>
Modified: ofbiz/trunk/applications/product/servicedef/services.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/services.xml?rev=1042542&r1=1042541&r2=1042542&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/servicedef/services.xml (original)
+++ ofbiz/trunk/applications/product/servicedef/services.xml Mon Dec 6
08:05:44 2010
@@ -242,12 +242,15 @@ under the License.
<description>
Create an ProductPrice.
Price is always stored without tax.
- If a taxAuthGeoId and taxAuthPartyId are (or taxAuthCombinedId is)
passed in then the price will be considered a price
- with tax included and the tax will be removed before storing
to the database
- (the priceWithTax, taxAmount, and taxPercentage fields will
also be populated).
+ If taxAuthGeoId and taxAuthPartyId are (or taxAuthCombinedId is)
passed in then the price will be considered a price
+ with tax included (the priceWithoutTax, priceWithTax, taxAmount,
and taxPercentage fields will also be populated).
+ If the taxInPrice field is 'Y' then the price field will be left
with the price included (price will be equal to priceWithTax),
+ otherwise tax will be removed from the passed in price and the
price field will be equal to the priceWithoutTax field.
+ If taxAuthGeoId or taxAuthPartyId empty, and taxAuthCombinedId is
empty, then the taxInPrice field will be ignored.
</description>
<auto-attributes include="pk" mode="IN" optional="false"/>
<auto-attributes include="nonpk" mode="IN" optional="true">
+ <exclude field-name="priceWithoutTax"/>
<exclude field-name="priceWithTax"/>
<exclude field-name="taxAmount"/>
<exclude field-name="createdDate"/>
@@ -264,6 +267,7 @@ under the License.
<description>Update an ProductPrice</description>
<auto-attributes include="pk" mode="IN" optional="false"/>
<auto-attributes include="nonpk" mode="IN" optional="true">
+ <exclude field-name="priceWithoutTax"/>
<exclude field-name="priceWithTax"/>
<exclude field-name="taxAmount"/>
<exclude field-name="createdDate"/>