This is an automated email from the ASF dual-hosted git repository.

nmalin pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git

commit 4ebdcdd9d03b6682f9f00397ef5d61d2f0bee08b
Author: Sebastian Berg <sebastian.b...@ecomify.de>
AuthorDate: Tue Apr 14 13:24:51 2020 +0200

    Improved: Convert PriceServices.xml mini lang to groovy
    
    (OFBIZ-11578)
---
 .../product/price/PriceServices.groovy             | 306 +++++++++++++++++++
 .../minilang/product/price/PriceServices.xml       | 327 ---------------------
 applications/product/servicedef/services.xml       |  22 +-
 .../product/servicedef/services_pricepromo.xml     |  12 +-
 4 files changed, 326 insertions(+), 341 deletions(-)

diff --git 
a/applications/product/groovyScripts/product/price/PriceServices.groovy 
b/applications/product/groovyScripts/product/price/PriceServices.groovy
new file mode 100644
index 0000000..a9eb056
--- /dev/null
+++ b/applications/product/groovyScripts/product/price/PriceServices.groovy
@@ -0,0 +1,306 @@
+/*
+ * 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.
+ */
+
+
+import java.math.RoundingMode
+import java.sql.Timestamp
+
+import org.apache.ofbiz.base.util.UtilDateTime
+import org.apache.ofbiz.base.util.UtilProperties
+import org.apache.ofbiz.entity.GenericValue
+import org.apache.ofbiz.entity.condition.EntityCondition
+import org.apache.ofbiz.entity.condition.EntityOperator
+import org.apache.ofbiz.product.product.ProductServices
+import org.apache.ofbiz.service.ServiceUtil
+
+
+
+
+/**
+ * Create a Product Price
+ * @return
+ */
+def createProductPrice() {
+    Map result = success()
+    if (!security.hasPermission("CATALOG_PRICE_MAINT", userLogin)) {
+        return error(UtilProperties.getMessage("ProductUiLabels", 
"ProductPriceMaintPermissionError", locale))
+    }
+    inlineHandlePriceWithTaxIncluded()
+
+    GenericValue newEntity = makeValue("ProductPrice", parameters)
+
+    Timestamp nowTimestamp = UtilDateTime.nowTimestamp()
+    if (!newEntity.fromDate) {
+        newEntity.fromDate = nowTimestamp
+    }
+    result.fromDate = newEntity.fromDate
+    newEntity.lastModifiedDate = nowTimestamp
+    newEntity.createdDate = nowTimestamp
+    newEntity.lastModifiedByUserLogin = userLogin.userLoginId
+    newEntity.createdByUserLogin = userLogin.userLoginId
+    newEntity.create()
+
+    return result
+}
+
+/**
+ * Update an ProductPrice
+ * @return
+ */
+def updateProductPrice() {
+    Map result = success()
+    if (!security.hasPermission("CATALOG_PRICE_MAINT", userLogin)) {
+        return error(UtilProperties.getMessage("ProductUiLabels", 
"ProductPriceMaintPermissionError", locale))
+    }
+    inlineHandlePriceWithTaxIncluded()
+
+    GenericValue lookedUpValue = 
from("ProductPrice").where(parameters).queryOne()
+    // grab the old price value before setting nonpk parameter fields
+    result.oldPrice = lookedUpValue.price
+    lookedUpValue.setNonPKFields(parameters)
+    lookedUpValue.lastModifiedDate = UtilDateTime.nowTimestamp()
+    lookedUpValue.lastModifiedByUserLogin = userLogin.userLoginId
+    lookedUpValue.store()
+
+    return result
+}
+
+/**
+ * Delete an ProductPrice
+ * @return
+ */
+def deleteProductPrice() {
+    Map result = success()
+    if (!security.hasPermission("CATALOG_PRICE_MAINT", userLogin)) {
+        return error(UtilProperties.getMessage("ProductUiLabels", 
"ProductPriceMaintPermissionError", locale))
+    }
+    GenericValue lookedUpValue = 
from("ProductPrice").where(parameters).queryOne()
+    // grab the old price value before setting nonpk parameter fields
+    result.oldPrice = lookedUpValue.price
+    lookedUpValue.remove()
+    return result
+}
+
+/**
+ * Inline Handle Price with Tax Included
+ * @return
+ */
+def inlineHandlePriceWithTaxIncluded() {
+    // handle price with tax included related fields (priceWithTax, taxAmount, 
taxPercentage, taxAuthPartyId, taxAuthGeoId)
+    if (parameters.taxAuthPartyId && parameters.taxAuthGeoId) {
+        parameters.priceWithTax = parameters.price
+
+        // if taxPercentage not passed in look it up based on taxAuthGeoId and 
taxAuthPartyId
+        if (!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
+            EntityCondition condition = EntityCondition.makeCondition([
+                EntityCondition.makeCondition("taxAuthGeoId", 
parameters.taxAuthGeoId),
+                EntityCondition.makeCondition("taxAuthPartyId", 
parameters.taxAuthPartyId),
+                EntityCondition.makeCondition([
+                    EntityCondition.makeCondition("taxAuthorityRateTypeId", 
"SALES_TAX"),
+                    EntityCondition.makeCondition("taxAuthorityRateTypeId", 
"VAT_TAX")
+                ], EntityOperator.OR)
+            ])
+            GenericValue taxAuthorityRateProduct = 
from("TaxAuthorityRateProduct").where(condition).filterByDate().queryFirst()
+            parameters.taxPercentage = taxAuthorityRateProduct?.taxPercentage
+        }
+        if (!parameters.taxPercentage) {
+            String errorMessage = UtilProperties.getMessage("ProductUiLabels", 
"ProductPriceTaxPercentageNotFound", locale)
+            logError(errorMessage)
+            return error(errorMessage)
+        }
+        // in short the formula is: taxAmount = priceWithTax - 
(priceWithTax/(1+taxPercentage/100))
+        BigDecimal taxAmount = parameters.priceWithTax - 
(parameters.priceWithTax/(1 + parameters.taxPercentage/100))
+        parameters.taxAmount = taxAmount.setScale(3, RoundingMode.HALF_UP)
+
+        BigDecimal priceWithoutTax = parameters.priceWithTax - 
parameters.taxAmount
+        parameters.priceWithoutTax = priceWithoutTax.setScale(3, 
RoundingMode.HALF_UP)
+
+        if (parameters.taxInPrice == "Y") {
+            // the price passed in has tax included, and we want to store it 
with tax included
+            parameters.price = parameters.priceWithTax
+        } else {
+            // the price passed in has tax included, but we want to store it 
without tax included
+            parameters.price = parameters.priceWithoutTax
+        }
+
+    }
+    return success()
+}
+
+// TODO NMA convert to entity auto when changed fileds are managed
+
+/**
+ * Save History of ProductPrice Change
+ * @return
+ */
+def saveProductPriceChange() {
+    // Note that this is kept pretty simple: if a price is specific but no 
oldPrice, then it is generally a create,
+    // if both are specified it is generally an update, if only the oldPrice 
is specified it is generally a delete
+    GenericValue newEntity = makeValue("ProductPriceChange")
+    newEntity.setNonPKFields(parameters)
+    newEntity.productPriceChangeId = 
delegator.getNextSeqId("ProductPriceChange")
+    newEntity.changedDate = UtilDateTime.nowTimestamp()
+    newEntity.changedByUserLogin = userLogin.userLoginId
+    newEntity.create()
+    return success()
+}
+
+// ProductPriceCond methods
+
+/**
+ * Create an ProductPriceCond
+ * @return
+ */
+def createProductPriceCond() {
+    Map result = success()
+    if (!security.hasEntityPermission("CATALOG", "_CREATE", userLogin)) {
+        return error(UtilProperties.getMessage("ProductUiLabels", 
"ProductCatalogCreatePermissionError", locale))
+    }
+    if (!security.hasPermission("CATALOG_PRICE_MAINT", userLogin)) {
+        return error(UtilProperties.getMessage("ProductUiLabels", 
"ProductPriceMaintPermissionError", locale))
+    }
+    if (parameters.condValueInput) {
+        parameters.condValue = parameters.condValueInput
+    }
+    GenericValue newEntity = makeValue("ProductPriceCond", parameters)
+    delegator.setNextSubSeqId(newEntity, "productPriceCondSeqId", 2, 1)
+    result.productPriceCondSeqId = newEntity.productPriceCondSeqId
+    newEntity.create()
+    return result
+}
+
+/**
+ * Update an ProductPriceCond
+ * @return
+ */
+def updateProductPriceCond() {
+    if (!security.hasEntityPermission("CATALOG", "_UPDATE", userLogin)) {
+        return error(UtilProperties.getMessage("ProductUiLabels", 
"ProductCatalogUpdatePermissionError", locale))
+    }
+    if (!security.hasPermission("CATALOG_PRICE_MAINT", userLogin)) {
+        return error(UtilProperties.getMessage("ProductUiLabels", 
"ProductPriceMaintPermissionError", locale))
+    }
+    if (parameters.inputParamEnumId == "PRIP_QUANTITY") {
+        parameters.condValue = parameters.condValueInput
+    }
+    if (parameters.inputParamEnumId == "PRIP_LIST_PRICE") {
+        parameters.condValue = parameters.condValueInput
+    }
+    GenericValue lookedUpValue = 
from("ProductPriceCond").where(parameters).queryOne()
+    lookedUpValue.setNonPKFields(parameters)
+    lookedUpValue.store()
+    return success()
+}
+
+/**
+ * Set the Value options for selected Price Rule Condition Input
+ * @return
+ */
+def getAssociatedPriceRulesConds() {
+    Map result = success()
+    List productPriceRulesCondValues = []
+    if ((parameters.inputParamEnumId == "PRIP_QUANTITY") || 
(parameters.inputParamEnumId == "PRIP_LIST_PRICE")) {
+        return success()
+    }
+    if (parameters.inputParamEnumId == "PRIP_PRODUCT_ID") {
+        List condValues = from("Product").queryList()
+        // May prove more useful rather than an entity-and in custom cases
+        for (GenericValue condValue : condValues) {
+            String option = (condValue.internalName ? 
"${condValue.internalName}: " : ": ") + (condValue.productId ? 
"${condValue.productId}" : "")
+            productPriceRulesCondValues << option
+        }
+    }
+    if (parameters.inputParamEnumId == "PRIP_PROD_CAT_ID") {
+        List condValues = from("ProductCategory").queryList()
+        // May prove more useful rather than an entity-and in custom cases
+        for (GenericValue condValue : condValues) {
+            String option = (condValue.categoryName ? 
"${condValue.categoryName} " : " ") + (condValue.description ? 
"${condValue.description} " : " ") +
+                    (condValue.longDescription ? 
condValue.longDescription.substring(0,10) : "") + (condValue.productCategoryId 
? " [${condValue.productCategoryId}]: " : " []: ") +
+                    (condValue.productCategoryId ? 
"${condValue.productCategoryId}" : "")
+            productPriceRulesCondValues << option
+        }
+    }
+    if (parameters.inputParamEnumId == "PRIP_PROD_FEAT_ID") {
+        List condValues = from("ProductFeatureType").queryList()
+        // May prove more useful rather than an entity-and in custom cases
+        for (GenericValue condValue : condValues) {
+            String option = (condValue.description ? "${condValue.description} 
" : " ") + (condValue.productFeatureTypeId ? " 
${condValue.productFeatureTypeId}" : "")
+            productPriceRulesCondValues << option
+        }
+    }
+    if ((parameters.inputParamEnumId == "PRIP_PARTY_ID") || 
(parameters.inputParamEnumId == "PRIP_PARTY_GRP_MEM")) {
+        List condValues = from("PartyNameView").queryList()
+        for (GenericValue condValue : condValues) {
+            String option = (condValue.firstName ? "${condValue.firstName} " : 
" ") + (condValue.lastName ? "${condValue.lastName}" : "") +
+                    (condValue.groupName ? "${condValue.groupName}: " : ": ") 
+ (condValue.partyId ? "${condValue.partyId}" : "")
+            productPriceRulesCondValues << option
+        }
+    }
+    if (parameters.inputParamEnumId == "PRIP_PARTY_CLASS") {
+        List condValues = from("PartyClassificationGroup").queryList()
+        // May prove more useful rather than an entity-and in custom cases
+        for (GenericValue condValue : condValues) {
+            String option = (condValue.description ? 
"${condValue.description}: " : ": ") + (condValue.partyClassificationGroupId ? 
"${condValue.partyClassificationGroupId}" : "")
+            productPriceRulesCondValues << option
+        }
+    }
+    if (parameters.inputParamEnumId == "PRIP_ROLE_TYPE") {
+        List condValues = from("RoleType").queryList()
+        // May prove more useful rather than an entity-and in custom cases
+        for (GenericValue condValue : condValues) {
+            String option = (condValue.description ? 
"${condValue.description}: " : ": ") + (condValue.roleTypeId ? 
"${condValue.roleTypeId}" : "")
+            productPriceRulesCondValues << option
+        }
+    }
+    if (parameters.inputParamEnumId == "PRIP_WEBSITE_ID") {
+        List condValues = from("WebSite").queryList()
+        for (GenericValue condValue : condValues) {
+            String option = (condValue.siteName ? "${condValue.siteName}: " : 
": ") + (condValue.webSiteId ? "${condValue.webSiteId}" : "")
+            productPriceRulesCondValues << option
+        }
+    }
+    if (parameters.inputParamEnumId == "PRIP_PROD_SGRP_ID") {
+        List condValues = from("ProductStoreGroup").queryList()
+        for (GenericValue condValue : condValues) {
+            String option = (condValue.productStoreGroupName ? 
"${condValue.productStoreGroupName} " : " ") + (condValue.description ? 
"(${condValue.description}): " : "(): ") + (condValue.productStoreGroupId ? 
"${condValue.productStoreGroupId}" : "")
+            productPriceRulesCondValues << option
+        }
+    }
+    if (parameters.inputParamEnumId == "PRIP_PROD_CLG_ID") {
+        List condValues = from("ProdCatalog").queryList()
+        for (GenericValue condValue : condValues) {
+            String option = (condValue.catalogName ? 
"${condValue.catalogName}: " : ": ") + (condValue.prodCatalogId ? 
"${condValue.prodCatalogId}" : "")
+            productPriceRulesCondValues << option
+        }
+    }
+    if (parameters.inputParamEnumId == "PRIP_CURRENCY_UOMID") {
+        List condValues = from("Uom").where(uomTypeId: 
"CURRENCY_MEASURE").queryList()
+        for (GenericValue condValue : condValues) {
+            String option = (condValue.description ? 
"${condValue.description}: " : ": ") + (condValue.uomId ? "${condValue.uomId}" 
: "")
+            productPriceRulesCondValues << option
+        }
+    }
+    if (!productPriceRulesCondValues) {
+        String noOptions = UtilProperties.getMessage("CommonUiLabels", 
"CommonNoOptions", locale)
+        productPriceRulesCondValues << noOptions
+    }
+    result.productPriceRulesCondValues = productPriceRulesCondValues
+    return result
+}
diff --git a/applications/product/minilang/product/price/PriceServices.xml 
b/applications/product/minilang/product/price/PriceServices.xml
deleted file mode 100644
index cf67c4a..0000000
--- a/applications/product/minilang/product/price/PriceServices.xml
+++ /dev/null
@@ -1,327 +0,0 @@
-<?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";
-        xmlns="http://ofbiz.apache.org/Simple-Method"; 
xsi:schemaLocation="http://ofbiz.apache.org/Simple-Method 
http://ofbiz.apache.org/dtds/simple-methods.xsd";>
-    <!-- ProductPrice methods -->
-    <simple-method method-name="createProductPrice" short-description="Create 
a Product Price">
-        <check-permission permission="CATALOG_PRICE_MAINT">
-            <fail-property resource="ProductUiLabels" 
property="ProductPriceMaintPermissionError"/>
-        </check-permission>
-        <check-errors/>
-
-        <call-simple-method method-name="inlineHandlePriceWithTaxIncluded"/>
-
-        <make-value entity-name="ProductPrice" value-field="newEntity"/>
-        <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"/>
-        <set field="newEntity.createdByUserLogin" 
from-field="userLogin.userLoginId"/>
-
-        <create-value value-field="newEntity"/>
-    </simple-method>
-    <simple-method method-name="updateProductPrice" short-description="Update 
an ProductPrice">
-        <check-permission permission="CATALOG_PRICE_MAINT">
-            <fail-property resource="ProductUiLabels" 
property="ProductPriceMaintPermissionError"/>
-        </check-permission>
-        <check-errors/>
-
-        <call-simple-method method-name="inlineHandlePriceWithTaxIncluded"/>
-
-        <entity-one entity-name="ProductPrice" value-field="lookedUpValue"/>
-
-        <!-- grab the old price value before setting nonpk parameter fields -->
-        <field-to-result field="lookedUpValue.price" result-name="oldPrice"/>
-
-        <set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
-
-        <now-timestamp field="nowTimestamp"/>
-        <set field="lookedUpValue.lastModifiedDate" from-field="nowTimestamp"/>
-        <set field="lookedUpValue.lastModifiedByUserLogin" 
from-field="userLogin.userLoginId"/>
-
-        <store-value value-field="lookedUpValue"/>
-    </simple-method>
-    <simple-method method-name="deleteProductPrice" short-description="Delete 
an ProductPrice">
-        <check-permission permission="CATALOG_PRICE_MAINT">
-            <fail-property resource="ProductUiLabels" 
property="ProductPriceMaintPermissionError"/>
-        </check-permission>
-        <check-errors/>
-
-        <make-value entity-name="ProductPrice" value-field="lookupPKMap"/>
-        <set-pk-fields map="parameters" value-field="lookupPKMap"/>
-        <find-by-primary-key entity-name="ProductPrice" map="lookupPKMap" 
value-field="lookedUpValue"/>
-
-        <!-- grab the old price value before setting nonpk parameter fields -->
-        <field-to-result field="lookedUpValue.price" result-name="oldPrice"/>
-
-        <remove-value value-field="lookedUpValue"/>
-    </simple-method>
-    <simple-method method-name="inlineHandlePriceWithTaxIncluded" 
short-description="Inline Handle Price with Tax Included">
-        <!-- 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-property resource="ProductUiLabels" 
property="ProductPriceTaxPercentageNotFound"/>
-                    </add-error>
-                    <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"/>
-                        <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.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>
-
-    <!-- TODO NMA convert to entity auto when changed fileds are managed -->
-    <simple-method method-name="saveProductPriceChange" 
short-description="Save History of ProductPrice Change">
-        <!-- Note that this is kept pretty simple: if a price is specific but 
no oldPrice, then it is generally a create, if both are specified it is 
generally an update, if only the oldPrice is specified it is generally a delete 
-->
-        <make-value entity-name="ProductPriceChange" value-field="newEntity"/>
-        <set-nonpk-fields map="parameters" value-field="newEntity"/>
-
-        <sequenced-id sequence-name="ProductPriceChange" 
field="productPriceChangeId"/>
-        <set field="newEntity.productPriceChangeId" 
from-field="productPriceChangeId"/>
-        <now-timestamp field="nowTimestamp"/>
-        <set field="newEntity.changedDate" from-field="nowTimestamp"/>
-        <set field="newEntity.changedByUserLogin" 
from-field="userLogin.userLoginId"/>
-
-        <create-value value-field="newEntity"/>
-    </simple-method>
-
-    <!-- ProductPriceCond methods -->
-    <simple-method method-name="createProductPriceCond" 
short-description="Create an ProductPriceCond">
-        <check-permission permission="CATALOG" action="_CREATE">
-            <fail-property resource="ProductUiLabels" 
property="ProductCatalogCreatePermissionError"/>
-        </check-permission>
-        <check-permission permission="CATALOG_PRICE_MAINT">
-            <fail-property resource="ProductUiLabels" 
property="ProductPriceMaintPermissionError"/>
-        </check-permission>
-        <check-errors/>
-
-        <if-not-empty field="parameters.condValueInput">
-            <set field="parameters.condValue" 
from-field="parameters.condValueInput"/>
-        </if-not-empty>
-        <make-value entity-name="ProductPriceCond" value-field="newEntity"/>
-        <set-nonpk-fields map="parameters" value-field="newEntity"/>
-        <set-pk-fields map="parameters" value-field="newEntity"/>
-        <make-next-seq-id value-field="newEntity" 
seq-field-name="productPriceCondSeqId" numeric-padding="2"/>
-        <field-to-result field="newEntity.productPriceCondSeqId" 
result-name="productPriceCondSeqId"/>
-
-        <create-value value-field="newEntity"/>
-    </simple-method>
-    <simple-method method-name="updateProductPriceCond" 
short-description="Update an ProductPriceCond">
-        <check-permission permission="CATALOG" action="_UPDATE">
-            <fail-property resource="ProductUiLabels" 
property="ProductCatalogUpdatePermissionError"/>
-        </check-permission>
-        <check-permission permission="CATALOG_PRICE_MAINT">
-            <fail-property resource="ProductUiLabels" 
property="ProductPriceMaintPermissionError"/>
-        </check-permission>
-        <check-errors/>
-
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_QUANTITY">
-            <set field="parameters.condValue" 
from-field="parameters.condValueInput"/>
-        </if-compare>
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_LIST_PRICE">
-            <set field="parameters.condValue" 
from-field="parameters.condValueInput"/>
-        </if-compare>
-        <make-value entity-name="ProductPriceCond" value-field="lookupPKMap"/>
-        <set-pk-fields map="parameters" value-field="lookupPKMap"/>
-        <find-by-primary-key entity-name="ProductPriceCond" map="lookupPKMap" 
value-field="lookedUpValue"/>
-        <set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
-        <store-value value-field="lookedUpValue"/>
-    </simple-method>
-
-    <simple-method method-name="getAssociatedPriceRulesConds" 
short-description="Set the Value options for selected Price Rule Condition 
Input" login-required="false">
-        <if>
-            <condition>
-                <or>
-                    <if-compare field="parameters.inputParamEnumId" 
operator="equals" value="PRIP_QUANTITY"/>
-                    <if-compare field="parameters.inputParamEnumId" 
operator="equals" value="PRIP_LIST_PRICE"/>
-                </or>
-            </condition>
-            <then>
-                <return/>
-            </then>
-        </if>
-
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_PRODUCT_ID">
-            <entity-condition entity-name="Product" list="condValues">
-                <!-- May prove more useful rather than an entity-and in custom 
cases-->
-            </entity-condition>
-            <iterate list="condValues" entry="condValue">
-                <set field="option" value="${condValue.internalName}: 
${condValue.productId}"/>
-                <field-to-list list="productPriceRulesCondValues" 
field="option"/>
-            </iterate>
-        </if-compare>
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_PROD_CAT_ID">
-            <entity-condition entity-name="ProductCategory" list="condValues">
-                <!-- May prove more useful rather than an entity-and in custom 
cases-->
-            </entity-condition>
-            <iterate list="condValues" entry="condValue">
-                <set field="option" value="${condValue.categoryName} 
${condValue.description} ${groovy: condValue?.longDescription?.substring(0,10)} 
[${condValue.productCategoryId}]: ${condValue.productCategoryId}"/>
-                <field-to-list list="productPriceRulesCondValues" 
field="option"/>
-            </iterate>
-        </if-compare>
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_PROD_FEAT_ID">
-            <entity-condition entity-name="ProductFeatureType" 
list="condValues">
-                <!-- May prove more useful rather than an entity-and in custom 
cases-->
-            </entity-condition>
-            <iterate list="condValues" entry="condValue">
-                <set field="option" value="${condValue.description}: 
${condValue.productFeatureTypeId}"/>
-                <field-to-list list="productPriceRulesCondValues" 
field="option"/>
-            </iterate>
-        </if-compare>
-        <if>
-            <condition>
-                <or>
-                    <if-compare field="parameters.inputParamEnumId" 
operator="equals" value="PRIP_PARTY_ID"/>
-                    <if-compare field="parameters.inputParamEnumId" 
operator="equals" value="PRIP_PARTY_GRP_MEM"/>
-                </or>
-            </condition>
-            <then>
-                <entity-condition entity-name="PartyNameView" 
list="condValues"/>
-                <iterate list="condValues" entry="condValue">
-                    <set field="option" value="${condValue.firstName} 
${condValue.lastName}${condValue.groupName}: ${condValue.partyId}"/>
-                    <field-to-list list="productPriceRulesCondValues" 
field="option"/>
-                </iterate>
-            </then>
-        </if>
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_PARTY_CLASS">
-            <entity-condition entity-name="PartyClassificationGroup" 
list="condValues">
-                <!-- May prove more useful rather than an entity-and in custom 
cases-->
-            </entity-condition>
-            <iterate list="condValues" entry="condValue">
-                <set field="option" value="${condValue.description}: 
${condValue.partyClassificationGroupId}"/>
-                <field-to-list list="productPriceRulesCondValues" 
field="option"/>
-            </iterate>
-        </if-compare>
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_ROLE_TYPE">
-            <entity-condition entity-name="RoleType" list="condValues">
-                <!-- May prove more useful rather than an entity-and in custom 
cases-->
-            </entity-condition>
-            <iterate list="condValues" entry="condValue">
-                <set field="option" value="${condValue.description}: 
${condValue.roleTypeId}"/>
-                <field-to-list list="productPriceRulesCondValues" 
field="option"/>
-            </iterate>
-        </if-compare>
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_WEBSITE_ID">
-            <entity-condition entity-name="WebSite" list="condValues"/>
-            <iterate list="condValues" entry="condValue">
-                <set field="option" value="${condValue.siteName}: 
${condValue.webSiteId}"/>
-                <field-to-list list="productPriceRulesCondValues" 
field="option"/>
-            </iterate>
-        </if-compare>
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_PROD_SGRP_ID">
-            <entity-condition entity-name="ProductStoreGroup" 
list="condValues"/>
-            <iterate list="condValues" entry="condValue">
-                <set field="option" value="${condValue.productStoreGroupName} 
(${condValue.description}): ${condValue.productStoreGroupId}"/>
-                <field-to-list list="productPriceRulesCondValues" 
field="option"/>
-            </iterate>
-        </if-compare>
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_PROD_CLG_ID">
-            <entity-condition entity-name="ProdCatalog" list="condValues"/>
-            <iterate list="condValues" entry="condValue">
-                <set field="option" value="${condValue.catalogName}: 
${condValue.prodCatalogId}"/>
-                <field-to-list list="productPriceRulesCondValues" 
field="option"/>
-            </iterate>
-        </if-compare>
-        <if-compare field="parameters.inputParamEnumId" operator="equals" 
value="PRIP_CURRENCY_UOMID">
-            <entity-condition entity-name="Uom" list="condValues">
-                <condition-expr field-name="uomTypeId" 
value="CURRENCY_MEASURE"/>
-            </entity-condition>
-            <iterate list="condValues" entry="condValue">
-                <set field="option" value="${condValue.description}: 
${condValue.uomId}"/>
-                <field-to-list list="productPriceRulesCondValues" 
field="option"/>
-            </iterate>
-        </if-compare>
-
-        <if-empty field="productPriceRulesCondValues">
-            <property-to-field resource="CommonUiLabels" 
property="CommonNoOptions" field="noOptions"/>
-            <field-to-list list="productPriceRulesCondValues" 
field="noOptions"/>
-        </if-empty>
-        <field-to-result field="productPriceRulesCondValues"/>
-    </simple-method>
-
-</simple-methods>
diff --git a/applications/product/servicedef/services.xml 
b/applications/product/servicedef/services.xml
index 46a8f7c..b30195c 100644
--- a/applications/product/servicedef/services.xml
+++ b/applications/product/servicedef/services.xml
@@ -242,8 +242,8 @@ under the License.
     </service>
 
     <!-- Product Price Services -->
-    <service name="createProductPrice" default-entity-name="ProductPrice" 
engine="simple"
-                
location="component://product/minilang/product/price/PriceServices.xml" 
invoke="createProductPrice" auth="true">
+    <service name="createProductPrice" default-entity-name="ProductPrice" 
engine="groovy"
+                
location="component://product/groovyScripts/product/price/PriceServices.groovy" 
invoke="createProductPrice" auth="true">
         <description>
             Create a Product Price.
 
@@ -269,8 +269,8 @@ under the License.
         <override name="fromDate" mode="INOUT" optional="true"/>
         <override name="price" optional="false"/>
     </service>
-    <service name="updateProductPrice" default-entity-name="ProductPrice" 
engine="simple"
-                
location="component://product/minilang/product/price/PriceServices.xml" 
invoke="updateProductPrice" auth="true">
+    <service name="updateProductPrice" default-entity-name="ProductPrice" 
engine="groovy"
+                
location="component://product/groovyScripts/product/price/PriceServices.groovy" 
invoke="updateProductPrice" auth="true">
         <description>Update an ProductPrice</description>
         <permission-service service-name="checkProductRelatedPermission" 
main-action="UPDATE"/>
         <auto-attributes include="pk" mode="IN" optional="false"/>
@@ -286,8 +286,8 @@ under the License.
         <attribute name="oldPrice" type="BigDecimal" mode="OUT" 
optional="false"/>
         <override name="price" optional="false"/>
     </service>
-    <service name="deleteProductPrice" default-entity-name="ProductPrice" 
engine="simple"
-                
location="component://product/minilang/product/price/PriceServices.xml" 
invoke="deleteProductPrice" auth="true">
+    <service name="deleteProductPrice" default-entity-name="ProductPrice" 
engine="groovy"
+                
location="component://product/groovyScripts/product/price/PriceServices.groovy" 
invoke="deleteProductPrice" auth="true">
         <description>Delete an ProductPrice</description>
         <permission-service service-name="checkProductRelatedPermission" 
main-action="DELETE"/>
         <auto-attributes include="pk" mode="IN" optional="false"/>
@@ -295,8 +295,8 @@ under the License.
     </service>
 
     <!-- called by ECAs on ProductPrice service call events -->
-    <service name="saveProductPriceChange" default-entity-name="ProductPrice" 
engine="simple"
-            
location="component://product/minilang/product/price/PriceServices.xml" 
invoke="saveProductPriceChange" auth="true">
+    <service name="saveProductPriceChange" default-entity-name="ProductPrice" 
engine="groovy"
+            
location="component://product/groovyScripts/product/price/PriceServices.groovy" 
invoke="saveProductPriceChange" auth="true">
         <description>Save History of a ProductPrice Change</description>
         <permission-service service-name="productPriceGenericPermission" 
main-action="CREATE"/>
         <auto-attributes include="pk" mode="IN" optional="false"/>
@@ -1246,6 +1246,12 @@ under the License.
         <implements service="permissionInterface"/>
         <attribute type="String" mode="IN" name="productCategoryId" 
optional="true"/>
     </service>
+    <service name="checkProductRelatedPermission" engine="groovy"
+        
location="component://product/groovyScripts/product/product/ProductServices.groovy"
 invoke="checkProductRelatedPermissionCall">
+        <attribute name="callingMethodName" mode="IN" type="String"/>
+        <attribute name="checkAction" mode="IN" type="String"/>
+        <attribute name="productId" mode="IN" type="String"/>
+    </service>
     <!-- Product Attribute Services -->
     <service name="createProductAttribute" 
default-entity-name="ProductAttribute" engine="entity-auto" invoke="create" 
auth="true">
         <description>Create a ProductAttribute</description>
diff --git a/applications/product/servicedef/services_pricepromo.xml 
b/applications/product/servicedef/services_pricepromo.xml
index df0ee3d..3233f3f 100644
--- a/applications/product/servicedef/services_pricepromo.xml
+++ b/applications/product/servicedef/services_pricepromo.xml
@@ -86,8 +86,8 @@ under the License.
         <auto-attributes include="pk" mode="IN" optional="false"/>
     </service>
 
-    <service name="createProductPriceCond" 
default-entity-name="ProductPriceCond" engine="simple"
-                
location="component://product/minilang/product/price/PriceServices.xml" 
invoke="createProductPriceCond" auth="true">
+    <service name="createProductPriceCond" 
default-entity-name="ProductPriceCond" engine="groovy"
+                
location="component://product/groovyScripts/product/price/PriceServices.groovy" 
invoke="createProductPriceCond" auth="true">
         <description>Create a ProductPriceCond</description>
         <permission-service service-name="productPriceGenericPermission" 
main-action="CREATE"/>
         <auto-attributes include="pk" mode="IN" optional="false"/>
@@ -95,8 +95,8 @@ under the License.
         <attribute name="condValueInput" type="String" mode="IN" 
optional="true"></attribute>
         <override name="productPriceCondSeqId" mode="OUT"/>
     </service>
-    <service name="updateProductPriceCond" 
default-entity-name="ProductPriceCond" engine="simple"
-                
location="component://product/minilang/product/price/PriceServices.xml" 
invoke="updateProductPriceCond" auth="true">
+    <service name="updateProductPriceCond" 
default-entity-name="ProductPriceCond" engine="groovy"
+                
location="component://product/groovyScripts/product/price/PriceServices.groovy" 
invoke="updateProductPriceCond" auth="true">
         <description>Update a ProductPriceCond</description>
         <permission-service service-name="productPriceGenericPermission" 
main-action="UPDATE"/>
         <auto-attributes include="pk" mode="IN" optional="false"/>
@@ -330,8 +330,8 @@ under the License.
         <attribute name="orderItemPriceInfos" type="java.util.List" mode="OUT" 
optional="false"/>
     </service>
 
-    <service name="getAssociatedPriceRulesConds" engine="simple" auth="false"
-        
location="component://product/minilang/product/price/PriceServices.xml" 
invoke="getAssociatedPriceRulesConds">
+    <service name="getAssociatedPriceRulesConds" engine="groovy" auth="false"
+        
location="component://product/groovyScripts/product/price/PriceServices.groovy" 
invoke="getAssociatedPriceRulesConds">
         <description>Set the Value options for selected Price Rule Condition 
Input</description>
         <attribute name="inputParamEnumId" mode="IN" type="String"/>
         <attribute name="productPriceRulesCondValues" mode="OUT" 
type="java.util.List" optional="true"/><!-- optional="true" because of quantity 
or other kind of fiels needing an input -->

Reply via email to