You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Jacopo Cappellato <ja...@hotwaxmedia.com> on 2010/11/03 15:29:55 UTC

Re: svn commit: r1030191 - in /ofbiz/trunk/applications/product: entitydef/entitymodel.xml script/org/ofbiz/product/price/PriceServices.xml servicedef/services.xml

This is great! Thank you David.

Jacopo

On Nov 2, 2010, at 8:34 PM, jonesde@apache.org wrote:

> Author: jonesde
> Date: Tue Nov  2 19:34:31 2010
> New Revision: 1030191
> 
> URL: http://svn.apache.org/viewvc?rev=1030191&view=rev
> Log:
> Added entity and service level support for entering prices with taxes included (handy for countries with VAT/etc)
> 
> Modified:
>    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/product/entitydef/entitymodel.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/entitydef/entitymodel.xml?rev=1030191&r1=1030190&r2=1030191&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/product/entitydef/entitymodel.xml (original)
> +++ ofbiz/trunk/applications/product/entitydef/entitymodel.xml Tue Nov  2 19:34:31 2010
> @@ -2375,6 +2375,11 @@ 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="taxAmount" type="currency-precise"/>
> +      <field name="taxPercentage" type="fixed-point"/>
> +      <field name="taxAuthPartyId" type="id-ne"/>
> +      <field name="taxAuthGeoId" type="id-ne"/>
>       <field name="createdDate" type="date-time"></field>
>       <field name="createdByUserLogin" type="id-vlong"></field>
>       <field name="lastModifiedDate" type="date-time"></field>
> @@ -2406,6 +2411,12 @@ under the License.
>       <relation type="one" fk-name="PROD_PRICE_CMET" rel-entity-name="CustomMethod">
>         <key-map field-name="customPriceCalcService" rel-field-name="customMethodId"/>
>       </relation>
> +      <relation type="one" fk-name="PROD_PRC_TAXPTY" title="TaxAuthority" rel-entity-name="Party">
> +        <key-map field-name="taxAuthPartyId" rel-field-name="partyId"/>
> +      </relation>
> +      <relation type="one" fk-name="PROD_PRC_TAXGEO" title="TaxAuthority" rel-entity-name="Geo">
> +        <key-map field-name="taxAuthGeoId" rel-field-name="geoId"/>
> +      </relation>
>       <relation type="one" fk-name="PROD_PRICE_CBUL" title="CreatedBy" rel-entity-name="UserLogin">
>         <key-map field-name="createdByUserLogin" rel-field-name="userLoginId"/>
>       </relation>
> 
> 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=1030191&r1=1030190&r2=1030191&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 Tue Nov  2 19:34:31 2010
> @@ -27,18 +27,20 @@ under the License.
>         <call-simple-method method-name="checkProductRelatedPermission" xml-resource="component://product/script/org/ofbiz/product/product/ProductServices.xml"/>
>         <check-permission permission="CATALOG_PRICE_MAINT"><fail-property resource="ProductUiLabels" property="ProductPriceMaintPermissionError"/></check-permission>
>         <check-errors/>
> +        
> +        <call-simple-method method-name="inlineHandlePriceWithTaxIncuded"/>
> 
>         <make-value value-field="newEntity" entity-name="ProductPrice"/>
>         <set-nonpk-fields map="parameters" value-field="newEntity"/>
>         <set-pk-fields map="parameters" value-field="newEntity"/>
> -
> +        
>         <now-timestamp field="nowTimestamp"/>
> -
> +        
>         <if-empty field="newEntity.fromDate">
>             <set field="newEntity.fromDate" from-field="nowTimestamp"/>
>         </if-empty>
>         <field-to-result field="newEntity.fromDate" result-name="fromDate"/>
> -
> +        
>         <set field="newEntity.lastModifiedDate" from-field="nowTimestamp"/>
>         <set field="newEntity.createdDate" from-field="nowTimestamp"/>
>         <set field="newEntity.lastModifiedByUserLogin" from-field="userLogin.userLoginId"/>
> @@ -53,6 +55,8 @@ under the License.
>         <check-permission permission="CATALOG_PRICE_MAINT"><fail-property resource="ProductUiLabels" property="ProductPriceMaintPermissionError"/></check-permission>
>         <check-errors/>
> 
> +        <call-simple-method method-name="inlineHandlePriceWithTaxIncuded"/>
> +        
>         <entity-one entity-name="ProductPrice" value-field="lookedUpValue"/>
> 
>         <!-- grab the old price value before setting nonpk parameter fields -->
> @@ -82,6 +86,71 @@ under the License.
> 
>         <remove-value value-field="lookedUpValue"/>
>     </simple-method>
> +    <simple-method method-name="inlineHandlePriceWithTaxIncuded" short-description="Inline Handle Price with Tax Included">
> +        <if-not-empty field="parameters.taxAuthCombinedId">
> +            <set field="taxAuthCombinedId" from-field="parameters.taxAuthCombinedId"/>
> +            <!-- if passed in value will be split based on: "${taxAuthGeoId}::${taxAuthPartyId}" -->
> +            <set field="parameters.taxAuthGeoId" 
> +                value="${groovy:taxAuthCombinedId.substring(0,taxAuthCombinedId.indexOf('::'))}"/>
> +            <set field="parameters.taxAuthPartyId" 
> +                value="${groovy:taxAuthCombinedId.substring(taxAuthCombinedId.indexOf('::')+2)}"/>
> +        </if-not-empty>
> +        
> +        <!-- handle price with tax included related fields (priceWithTax, taxAmount, taxPercentage, taxAuthPartyId, taxAuthGeoId) -->
> +        <if>
> +            <condition>
> +                <and>
> +                    <not><if-empty field="parameters.taxAuthPartyId"></if-empty></not>
> +                    <not><if-empty field="parameters.taxAuthGeoId"></if-empty></not>
> +                </and>
> +            </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 -->
> +                    <entity-condition entity-name="TaxAuthorityRateProduct" list="taxAuthorityRateProductList" filter-by-date="true">
> +                        <condition-list combine="and">
> +                            <condition-expr field-name="taxAuthGeoId" from-field="parameters.taxAuthGeoId"/>
> +                            <condition-expr field-name="taxAuthPartyId" from-field="parameters.taxAuthPartyId"/>
> +                            <condition-list combine="or">
> +                                <condition-expr field-name="taxAuthorityRateTypeId" value="SALES_TAX"/>
> +                                <condition-expr field-name="taxAuthorityRateTypeId" value="VAT_TAX"/>
> +                            </condition-list>
> +                        </condition-list>
> +                    </entity-condition>
> +                    <set field="parameters.taxPercentage" from-field="taxAuthorityRateProductList[0].taxPercentage" type="BigDecimal"/>
> +                </if-empty>
> +                
> +                <if-empty field="parameters.taxPercentage">
> +                    <add-error><fail-message message="Tax Authority was specified but no Tax Percentage passed in, and could not find one in the Tax Authority Rate Product settings, so cannot handle price with tax included."/></add-error>
> +                    <check-errors/>
> +                </if-empty>
> +                
> +                <calculate field="parameters.taxAmount" type="BigDecimal" decimal-scale="3" rounding-mode="HalfEven">
> +                    <calcop operator="subtract">
> +                        <calcop operator="get" field="parameters.priceWithTax"/>
> +                        <calcop operator="divide">
> +                            <calcop operator="get" field="parameters.priceWithTax"/>
> +                            <calcop operator="add">
> +                                <number value="1"/>
> +                                <calcop operator="divide">
> +                                    <calcop operator="get" field="parameters.taxPercentage"/>
> +                                    <number value="100"/>
> +                                </calcop>
> +                            </calcop>
> +                        </calcop>
> +                    </calcop>
> +                </calculate>
> +                <calculate field="parameters.price" type="BigDecimal" decimal-scale="3" rounding-mode="HalfEven">
> +                    <calcop operator="subtract">
> +                        <calcop operator="get" field="parameters.priceWithTax"/>
> +                        <calcop operator="get" field="parameters.taxAmount"></calcop>
> +                    </calcop>
> +                </calculate>
> +            </then>
> +        </if>
> +    </simple-method>
> 
>     <simple-method method-name="saveProductPriceChange" short-description="Save History of ProductPrice Change">
>         <check-permission permission="CATALOG" action="_UPDATE">
> 
> Modified: ofbiz/trunk/applications/product/servicedef/services.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/services.xml?rev=1030191&r1=1030190&r2=1030191&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/product/servicedef/services.xml (original)
> +++ ofbiz/trunk/applications/product/servicedef/services.xml Tue Nov  2 19:34:31 2010
> @@ -239,14 +239,23 @@ under the License.
>     <!-- Product Price Services -->
>     <service name="createProductPrice" default-entity-name="ProductPrice" engine="simple"
>                 location="component://product/script/org/ofbiz/product/price/PriceServices.xml" invoke="createProductPrice" auth="true">
> -        <description>Create an ProductPrice</description>
> +        <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).
> +        </description>
>         <auto-attributes include="pk" mode="IN" optional="false"/>
>         <auto-attributes include="nonpk" mode="IN" optional="true">
> +            <exclude field-name="priceWithTax"/>
> +            <exclude field-name="taxAmount"/>
>             <exclude field-name="createdDate"/>
>             <exclude field-name="createdByUserLogin"/>
>             <exclude field-name="lastModifiedDate"/>
>             <exclude field-name="lastModifiedByUserLogin"/>
>         </auto-attributes>
> +        <attribute name="taxAuthCombinedId" type="String" mode="IN" optional="true"><!-- if passed in value will be split based on: "${taxAuthGeoId}::${taxAuthPartyId}" --></attribute>
>         <override name="fromDate" mode="INOUT" optional="true"/>
>         <override name="price" optional="false"/>
>     </service>
> @@ -255,6 +264,8 @@ 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="priceWithTax"/>
> +            <exclude field-name="taxAmount"/>
>             <exclude field-name="createdDate"/>
>             <exclude field-name="createdByUserLogin"/>
>             <exclude field-name="lastModifiedDate"/>
> 
>