Author: hansbak Date: Mon Feb 25 08:25:07 2013 New Revision: 1449615 URL: http://svn.apache.org/r1449615 Log: currently tax is calculated before promotion, added am option in the productstore to be able to set the tax calculation after promotion. This in order to remain backward compatible. Also added a junit test for this. Contribution from Tom, employee from Antwebsystems
Added: ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/test/TaxAuthorityTests.xml (with props) ofbiz/trunk/applications/accounting/testdef/taxauthoritytests.xml (with props) Modified: ofbiz/trunk/applications/accounting/ofbiz-component.xml ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java ofbiz/trunk/applications/product/entitydef/entitymodel.xml ofbiz/trunk/applications/product/widget/catalog/ProductStoreForms.xml Modified: ofbiz/trunk/applications/accounting/ofbiz-component.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/ofbiz-component.xml?rev=1449615&r1=1449614&r2=1449615&view=diff ============================================================================== --- ofbiz/trunk/applications/accounting/ofbiz-component.xml (original) +++ ofbiz/trunk/applications/accounting/ofbiz-component.xml Mon Feb 25 08:25:07 2013 @@ -101,6 +101,7 @@ under the License. <test-suite loader="main" location="testdef/paymentappltests.xml"/> <test-suite loader="main" location="testdef/invoicetests.xml"/> <test-suite loader="main" location="testdef/fixedassettests.xml"/> + <test-suite loader="main" location="testdef/taxauthoritytests.xml"/> <webapp name="accounting" title="Accounting" Added: ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/test/TaxAuthorityTests.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/test/TaxAuthorityTests.xml?rev=1449615&view=auto ============================================================================== --- ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/test/TaxAuthorityTests.xml (added) +++ ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/test/TaxAuthorityTests.xml Mon Feb 25 08:25:07 2013 @@ -0,0 +1,227 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/simple-methods-v2.xsd"> + + <simple-method method-name="calculateTaxBeforePromotion" short-description="Calculate Tax Before Promotion" login-required="false"> + <!-- Test calculate tax before promotion + Step 1) Set calcTaxAfterPromotion to N. + Step 2) Create an order. + Step 3) Check tax was created. + Step 4) Set calcTaxAfterPromotion to Y. + Step 5) Create an order. + Step 6) Check tax was not created. + --> + <!-- Step 1 --> + <now-timestamp field="nowTimestamp"/> + <entity-one value-field="systemUserLogin" entity-name="UserLogin"> + <field-map field-name="userLoginId" value="system"/> + </entity-one> + <set field="updateProductPromoActionMap.userLogin" from-field="systemUserLogin"/> + <set field="updateProductPromoActionMap.productPromoId" value="9016"/> + <set field="updateProductPromoActionMap.productPromoRuleId" value="01"/> + <set field="updateProductPromoActionMap.productPromoActionSeqId" value="01"/> + <set field="updateProductPromoActionMap.amount" value="5" type="BigDecimal"/> + <call-service service-name="updateProductPromoAction" in-map-name="updateProductPromoActionMap"/> + <set field="updateTaxAuthorityRateProductMap.userLogin" from-field="systemUserLogin"/> + <set field="updateTaxAuthorityRateProductMap.taxAuthorityRateSeqId" value="9004"/> + <set field="updateTaxAuthorityRateProductMap.minItemPrice" value="25" type="BigDecimal"/> + <call-service service-name="updateTaxAuthorityRateProduct" in-map-name="updateTaxAuthorityRateProductMap"/> + <set field="updateProductStoreMap.userLogin" from-field="systemUserLogin"/> + <set field="updateProductStoreMap.productStoreId" value="9000"/> + <set field="updateProductStoreMap.calcTaxAfterPromotion" value="N"/> + <call-service service-name="updateProductStore" in-map-name="updateProductStoreMap"/> + <!-- Step 2 --> + <field-to-session field="nullField" session-name="orderMode"/> + <set field="request" from-field="parameters.request"/> + <set field="response" from-field="parameters.response"/> + <call-class-method method-name="routeOrderEntry" class-name="org.ofbiz.order.shoppingcart.ShoppingCartEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : routeOrderEntry, Response : ${result}"/> + <entity-one value-field="userLogin" entity-name="UserLogin"> + <field-map field-name="userLoginId" value="admin"/> + </entity-one> + <call-bsh><![CDATA[ + request.setParameter("orderMode", "SALES_ORDER"); + request.setParameter("productStoreId", "9000"); + request.setParameter("partyId", "DemoCustomer"); + request.setParameter("currencyUom", "USD"); + session = request.getSession(); + session.setAttribute("userLogin", userLogin); + ]]></call-bsh> + <call-class-method method-name="initializeOrderEntry" class-name="org.ofbiz.order.shoppingcart.ShoppingCartEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : initializeOrderEntry, Response : ${result}"/> + <call-class-method method-name="setOrderCurrencyAgreementShipDates" class-name="org.ofbiz.order.shoppingcart.ShoppingCartEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : setOrderCurrencyAgreementShipDates, Response : ${result}"/> + <call-bsh><![CDATA[ + request.setParameter("add_product_id", "GZ-1001"); + ]]></call-bsh> + <call-class-method method-name="addToCart" class-name="org.ofbiz.order.shoppingcart.ShoppingCartEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : addToCart, Response : ${result}"/> + <call-bsh><![CDATA[ + request.setParameter("checkoutpage", "quick"); + request.setParameter("shipping_contact_mech_id", "9015"); + request.setParameter("shipping_method", "GROUND@UPS"); + request.setParameter("checkOutPaymentId", "EXT_COD"); + request.setParameter("is_gift", "false"); + request.setParameter("may_split", "false"); + ]]></call-bsh> + <field-to-request field="nullField" request-name="shoppingCart"/> + <call-class-method method-name="setQuickCheckOutOptions" class-name="org.ofbiz.order.shoppingcart.CheckOutEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : setQuickCheckOutOptions, Response : ${result}"/> + <call-class-method method-name="createOrder" class-name="org.ofbiz.order.shoppingcart.CheckOutEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : createOrder, Response : ${result}"/> + <call-class-method method-name="processPayment" class-name="org.ofbiz.order.shoppingcart.CheckOutEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : processPayment, Response : ${result}"/> + <call-service-asynch service-name="sendOrderConfirmation"/> + <call-class-method method-name="destroyCart" class-name="org.ofbiz.order.shoppingcart.ShoppingCartEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : destroyCart, Response = ${result}"/> + <!-- Step 3 --> + <entity-condition list="orderHeaders" entity-name="OrderHeader"> + <condition-expr field-name="orderTypeId" value="SALES_ORDER"/> + <order-by field-name="-entryDate"/> + </entity-condition> + <first-from-list entry="orderHeader" list="orderHeaders"/> + <set field="orderId" from-field="orderHeader.orderId"/> + <entity-and entity-name="OrderAdjustment" list="orderAdjustments1"> + <field-map field-name="orderAdjustmentTypeId" value="SALES_TAX"/> + <field-map field-name="orderId" from-field="orderId"/> + <field-map field-name="orderItemSeqId" value="00001"/> + <field-map field-name="taxAuthorityRateSeqId" value="9004"/> + </entity-and> + <assert> + <not><if-empty field="orderAdjustments1"></if-empty></not> + </assert> + <!-- Step 4 --> + <set field="updateProductStoreMap.userLogin" from-field="systemUserLogin"/> + <set field="updateProductStoreMap.productStoreId" value="9000"/> + <set field="updateProductStoreMap.calcTaxAfterPromotion" value="Y"/> + <call-service service-name="updateProductStore" in-map-name="updateProductStoreMap"/> + <!-- Step 5 --> + <field-to-session field="nullField" session-name="orderMode"/> + <set field="request" from-field="parameters.request"/> + <set field="response" from-field="parameters.response"/> + <call-class-method method-name="routeOrderEntry" class-name="org.ofbiz.order.shoppingcart.ShoppingCartEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : routeOrderEntry, Response : ${result}"/> + <entity-one value-field="userLogin" entity-name="UserLogin"> + <field-map field-name="userLoginId" value="admin"/> + </entity-one> + <call-bsh><![CDATA[ + request.setParameter("orderMode", "SALES_ORDER"); + request.setParameter("productStoreId", "9000"); + request.setParameter("partyId", "DemoCustomer"); + request.setParameter("currencyUom", "USD"); + session = request.getSession(); + session.setAttribute("userLogin", userLogin); + ]]></call-bsh> + <call-class-method method-name="initializeOrderEntry" class-name="org.ofbiz.order.shoppingcart.ShoppingCartEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : initializeOrderEntry, Response : ${result}"/> + <call-class-method method-name="setOrderCurrencyAgreementShipDates" class-name="org.ofbiz.order.shoppingcart.ShoppingCartEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : setOrderCurrencyAgreementShipDates, Response : ${result}"/> + <call-bsh><![CDATA[ + request.setParameter("add_product_id", "GZ-1001"); + ]]></call-bsh> + <call-class-method method-name="addToCart" class-name="org.ofbiz.order.shoppingcart.ShoppingCartEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : addToCart, Response : ${result}"/> + <call-bsh><![CDATA[ + request.setParameter("checkoutpage", "quick"); + request.setParameter("shipping_contact_mech_id", "9015"); + request.setParameter("shipping_method", "GROUND@UPS"); + request.setParameter("checkOutPaymentId", "EXT_COD"); + request.setParameter("is_gift", "false"); + request.setParameter("may_split", "false"); + ]]></call-bsh> + <field-to-request field="nullField" request-name="shoppingCart"/> + <call-class-method method-name="setQuickCheckOutOptions" class-name="org.ofbiz.order.shoppingcart.CheckOutEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : setQuickCheckOutOptions, Response : ${result}"/> + <call-class-method method-name="createOrder" class-name="org.ofbiz.order.shoppingcart.CheckOutEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : createOrder, Response : ${result}"/> + <call-class-method method-name="processPayment" class-name="org.ofbiz.order.shoppingcart.CheckOutEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : processPayment, Response : ${result}"/> + <call-service-asynch service-name="sendOrderConfirmation"/> + <call-class-method method-name="destroyCart" class-name="org.ofbiz.order.shoppingcart.ShoppingCartEvents" ret-field="result"> + <field field="request" type="javax.servlet.http.HttpServletRequest"/> + <field field="response" type="javax.servlet.http.HttpServletResponse"/> + </call-class-method> + <log level="info" message="===== >>> Event : destroyCart, Response = ${result}"/> + <!-- Step 6 --> + <entity-condition list="orderHeaders" entity-name="OrderHeader"> + <condition-expr field-name="orderTypeId" value="SALES_ORDER"/> + <order-by field-name="-entryDate"/> + </entity-condition> + <first-from-list entry="orderHeader" list="orderHeaders"/> + <set field="orderId" from-field="orderHeader.orderId"/> + <entity-and entity-name="OrderAdjustment" list="orderAdjustments2"> + <field-map field-name="orderAdjustmentTypeId" value="SALES_TAX"/> + <field-map field-name="orderId" from-field="orderId"/> + <field-map field-name="orderItemSeqId" value="00001"/> + <field-map field-name="taxAuthorityRateSeqId" value="9004"/> + </entity-and> + <assert> + <if-empty field="orderAdjustments2"></if-empty> + </assert> + <check-errors/> + </simple-method> +</simple-methods> Propchange: ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/test/TaxAuthorityTests.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/test/TaxAuthorityTests.xml ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/test/TaxAuthorityTests.xml ------------------------------------------------------------------------------ svn:mime-type = text/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=1449615&r1=1449614&r2=1449615&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 Feb 25 08:25:07 2013 @@ -212,6 +212,11 @@ public class TaxAuthorityServices { BigDecimal shippingAmount = itemShippingList.get(i); List<GenericValue> taxList = null; if (shippingAddress != null) { + if ("Y".equals(productStore.getString("calcTaxAfterPromotion")) && itemAmount.compareTo(BigDecimal.ZERO) != 0) { + if (itemQuantity.compareTo(new BigDecimal("1.00")) == 0) { + itemPrice = itemAmount; + } + } taxList = getTaxAdjustments(delegator, product, productStore, payToPartyId, billToPartyId, taxAuthoritySet, itemPrice, itemQuantity, 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 Added: ofbiz/trunk/applications/accounting/testdef/taxauthoritytests.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/testdef/taxauthoritytests.xml?rev=1449615&view=auto ============================================================================== --- ofbiz/trunk/applications/accounting/testdef/taxauthoritytests.xml (added) +++ ofbiz/trunk/applications/accounting/testdef/taxauthoritytests.xml Mon Feb 25 08:25:07 2013 @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +<test-suite suite-name="taxauthoritytests" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/test-suite.xsd"> + + <test-case case-name="tax-promotion-tests"> + <simple-method-test location="component://accounting/script/org/ofbiz/accounting/test/TaxAuthorityTests.xml" name="calculateTaxBeforePromotion"/> + </test-case> +</test-suite> Propchange: ofbiz/trunk/applications/accounting/testdef/taxauthoritytests.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/applications/accounting/testdef/taxauthoritytests.xml ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/applications/accounting/testdef/taxauthoritytests.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml Modified: ofbiz/trunk/applications/product/entitydef/entitymodel.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/entitydef/entitymodel.xml?rev=1449615&r1=1449614&r2=1449615&view=diff ============================================================================== --- ofbiz/trunk/applications/product/entitydef/entitymodel.xml (original) +++ ofbiz/trunk/applications/product/entitydef/entitymodel.xml Mon Feb 25 08:25:07 2013 @@ -3758,6 +3758,7 @@ under the License. <field name="showTaxIsExempt" type="indicator"><description>default Y; if set to N do not show isExempt checkbox for PartyTaxAuthInfo, always force to N</description></field> <field name="vatTaxAuthGeoId" type="id"></field> <field name="vatTaxAuthPartyId" type="id"></field> + <field name="calcTaxAfterPromotion" type="indicator"><description>For execute promotions and price rules before running taxation rules</description></field> <field name="enableAutoSuggestionList" type="indicator"><description>The auto-suggestion list is a special ShoppingList that the addSuggestionsToShoppingList service will maintain for cross-sells of ordered items.</description></field> <field name="enableDigProdUpload" type="indicator"></field> <field name="prodSearchExcludeVariants" type="indicator"><description>default Y; if set to Y an additional constraint will of isVariant!=Y will be added to all product searches for the store</description></field> Modified: ofbiz/trunk/applications/product/widget/catalog/ProductStoreForms.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/widget/catalog/ProductStoreForms.xml?rev=1449615&r1=1449614&r2=1449615&view=diff ============================================================================== --- ofbiz/trunk/applications/product/widget/catalog/ProductStoreForms.xml (original) +++ ofbiz/trunk/applications/product/widget/catalog/ProductStoreForms.xml Mon Feb 25 08:25:07 2013 @@ -276,6 +276,9 @@ </field> <field name="vatTaxAuthGeoId"><lookup target-form-name="LookupGeo"/></field> <field name="vatTaxAuthPartyId"><lookup target-form-name="LookupPartyName"/></field> + <field name="calcTaxAfterPromotion"> + <drop-down allow-empty="false" no-current-selected-key="N"><option key="Y" description="${uiLabelMap.CommonY}"/><option key="N" description="${uiLabelMap.CommonN}"/></drop-down> + </field> <field name="prodSearchExcludeVariants"> <drop-down allow-empty="false" no-current-selected-key="Y"><option key="Y" description="${uiLabelMap.CommonY}"/><option key="N" description="${uiLabelMap.CommonN}"/></drop-down> </field> @@ -402,6 +405,7 @@ <sort-field name="showTaxIsExempt"/> <sort-field name="vatTaxAuthGeoId"/> <sort-field name="vatTaxAuthPartyId"/> + <sort-field name="calcTaxAfterPromotion"/> </field-group> <field-group title="${uiLabelMap.CommonVisitors}" collapsible="true" initially-collapsed="true"> <sort-field name="autoApproveReviews"/>