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
The following commit(s) were added to refs/heads/trunk by this push:
new a19807e136 Improved: Convert RequirementServices.xml mini lang to
groovy (OFBIZ-12745)
a19807e136 is described below
commit a19807e13609cc6f2e0724dbe4ce8c30bad325a1
Author: Nicolas Malin <[email protected]>
AuthorDate: Mon Jan 23 18:39:24 2023 +0100
Improved: Convert RequirementServices.xml mini lang to groovy (OFBIZ-12745)
This conversion convert three services :
* deleteRequirementAndRelated
* autoAssignRequirementToSupplier
* createTransferFromRequirement
---
.../requirement/RequirementServices.groovy | 102 +++++++++++++++++++++
.../minilang/requirement/RequirementServices.xml | 88 ------------------
.../order/servicedef/services_requirement.xml | 15 +--
3 files changed, 111 insertions(+), 94 deletions(-)
diff --git
a/applications/order/groovyScripts/requirement/RequirementServices.groovy
b/applications/order/groovyScripts/requirement/RequirementServices.groovy
new file mode 100644
index 0000000000..9d7b273536
--- /dev/null
+++ b/applications/order/groovyScripts/requirement/RequirementServices.groovy
@@ -0,0 +1,102 @@
+/*
+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.
+*/
+package org.apache.ofbiz.order.requirement
+
+import org.apache.ofbiz.base.util.UtilDateTime
+import org.apache.ofbiz.entity.GenericValue
+import org.apache.ofbiz.entity.condition.EntityCondition
+import org.apache.ofbiz.entity.condition.EntityConditionBuilder
+import org.apache.ofbiz.entity.util.EntityQuery
+
+import java.sql.Timestamp
+
+/**
+ * Delete a requirement after deleting related entity records
+ */
+def deleteRequirementAndRelated() {
+ GenericValue requirement = from("Requirement").where(parameters).queryOne()
+ if (requirement) {
+ requirement.removeRelated("RequirementAttribute")
+ requirement.removeRelated("RequirementRole")
+ requirement.removeRelated("RequirementStatus")
+ requirement.removeRelated("RequirementCustRequest")
+ requirement.remove()
+ return success()
+ }
+ return error("Entity value not found with name: requirement Method =
deleteRequirementAndRelated")
+}
+
+/**
+ * If the requirement is a product requirement (purchasing) try to assign it
to the primary supplier
+ */
+def autoAssignRequirementToSupplier() {
+ GenericValue requirement = from("Requirement").where(parameters).queryOne()
+ if (requirement) {
+ if (requirement.requirementTypeId == "PRODUCT_REQUIREMENT"
+ && requirement.productId
+ && requirement.quantity) {
+ EntityCondition condition = new EntityConditionBuilder().AND() {
+ EQUALS(productId: requirement.productId)
+ LESS_THAN_EQUAL_TO(minimumOrderQuantity: requirement.quantity)
+ }
+ EntityQuery supplierProductsQuery =
from("SupplierProduct").where(condition).orderBy("lastPrice",
"supplierPrefOrderId")
+ if (requirement.requiredByDate) {
+ supplierProductsQuery.filterByDate((Timestamp)
requirement.requiredByDate, "availableFromDate", "availableThruDate")
+ }
+ GenericValue supplierProduct = supplierProductsQuery.queryFirst()
+ if (supplierProduct?.partyId) {
+ delegator.createOrStore("RequirementRole", [requirementId:
requirement.requirementId,
+ partyId :
supplierProduct.partyId,
+ roleTypeId :
"SUPPLIER",
+ fromDate :
UtilDateTime.nowTimestamp()])
+ }
+ }
+ return success()
+ }
+ return error("Entity value not found with name: requirement Method =
autoAssignRequirementToSupplier")
+}
+
+/**
+ * Create the inventory transfers required to fulfill the requirement
+ */
+def createTransferFromRequirement() {
+ GenericValue requirement = from("Requirement").where(parameters).queryOne()
+ if (!requirement) {
+ return error("Entity value not found with name: requirement Method =
createTransferFromRequirement")
+ }
+ try {
+ Map serviceResult = run service: "createInventoryTransfersForProduct",
+ with: [productId : requirement.productId,
+ facilityId : parameters.fromFacilityId,
+ facilityIdTo: requirement.facilityId,
+ quantity : requirement.quantity,
+ sendDate : requirement.requiredByDate]
+ BigDecimal quantityNotTransferred =
serviceResult.quantityNotTransferred
+ if (quantityNotTransferred > 0) {
+ // we create a new requirement for the quantity not transferred
(because not available)
+ run service: "createRequirement", with: [* :
requirement.getAllFields(),
+ quantity:
quantityNotTransferred]
+ }
+ run service: "updateRequirement", with: [requirementId:
requirement.requirementId,
+ statusId : "REQ_ORDERED"]
+ } catch (Exception e) {
+ return error("Failed to create the requirement with " + e.toString())
+ }
+}
+
diff --git a/applications/order/minilang/requirement/RequirementServices.xml
b/applications/order/minilang/requirement/RequirementServices.xml
deleted file mode 100644
index ec650b5a9e..0000000000
--- a/applications/order/minilang/requirement/RequirementServices.xml
+++ /dev/null
@@ -1,88 +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">
- <simple-method method-name="deleteRequirementAndRelated"
short-description="Delete a requirement after deleting related entity records">
- <entity-one entity-name="Requirement" value-field="requirement"
auto-field-map="true"/>
- <check-errors/>
- <remove-related value-field="requirement"
relation-name="RequirementRole"/>
- <remove-related value-field="requirement"
relation-name="RequirementCustRequest"/>
- <remove-value value-field="requirement"/>
- </simple-method>
- <simple-method method-name="autoAssignRequirementToSupplier"
short-description="If the requirement is a product requirement (purchasing) try
to assign it to the primary supplier">
- <entity-one entity-name="Requirement" value-field="requirement"
auto-field-map="true"/>
- <check-errors/>
- <if-compare field="requirement.requirementTypeId" operator="equals"
value="PRODUCT_REQUIREMENT">
- <if-not-empty field="requirement.productId">
- <if-not-empty field="requirement.quantity">
- <entity-condition entity-name="SupplierProduct"
list="supplierProducts">
- <condition-list>
- <condition-expr field-name="productId"
from-field="requirement.productId"/>
- <condition-expr field-name="minimumOrderQuantity"
operator="less-equals" from-field="requirement.quantity"/>
- </condition-list>
- <order-by field-name="lastPrice"/>
- <order-by field-name="supplierPrefOrderId"/>
- </entity-condition>
- <filter-list-by-date list="supplierProducts"
valid-date="requirement.requiredByDate" from-field-name="availableFromDate"
thru-field-name="availableThruDate"/>
- <first-from-list list="supplierProducts"
entry="supplierProduct"/>
- <if-not-empty field="supplierProduct.partyId">
- <make-value entity-name="RequirementRole"
value-field="requirementSupplier"/>
- <set field="requirementSupplier.requirementId"
from-field="requirement.requirementId"/>
- <set field="requirementSupplier.partyId"
from-field="supplierProduct.partyId"/>
- <set field="requirementSupplier.roleTypeId"
value="SUPPLIER"/>
- <now-timestamp field="requirementSupplier.fromDate"/>
- <create-value value-field="requirementSupplier"/>
- </if-not-empty>
- </if-not-empty>
- </if-not-empty>
- </if-compare>
- </simple-method>
- <simple-method method-name="createTransferFromRequirement"
short-description="Create the inventory transfers required to fulfill the
requirement.">
- <check-permission permission="ORDERMGR" action="_CREATE">
- <fail-property resource="OrderErrorUiLabels"
property="OrderErrorCreatePermissionError"/>
- </check-permission>
- <check-errors/>
- <entity-one entity-name="Requirement" value-field="requirement"
auto-field-map="true"/>
- <check-errors/>
- <set field="inputMap.productId" from-field="requirement.productId"/>
- <set field="inputMap.facilityId"
from-field="parameters.fromFacilityId"/>
- <set field="inputMap.facilityIdTo"
from-field="requirement.facilityId"/>
- <set field="inputMap.quantity" from-field="requirement.quantity"/>
- <set field="inputMap.sendDate"
from-field="requirement.requiredByDate"/>
- <call-service service-name="createInventoryTransfersForProduct"
in-map-name="inputMap">
- <result-to-field result-name="quantityNotTransferred"
field="quantityNotTransferred"/>
- </call-service>
- <check-errors/>
- <if-compare field="quantityNotTransferred" value="0.0"
operator="greater" type="BigDecimal">
- <!-- we create a new requirement for the quantity not trasferred
(because not available) -->
- <clear-field field="inputMap"/>
- <set-service-fields service-name="createRequirement"
map="requirement" to-map="inputMap"/>
- <set field="inputMap.quantity"
from-field="quantityNotTransferred"/>
- <call-service service-name="createRequirement"
in-map-name="inputMap"/>
- <check-errors/>
- </if-compare>
- <check-errors/>
- <clear-field field="inputMap"/>
- <set field="inputMap.requirementId"
from-field="requirement.requirementId"/>
- <set field="inputMap.statusId" value="REQ_ORDERED"/>
- <call-service service-name="updateRequirement" in-map-name="inputMap"/>
- </simple-method>
-</simple-methods>
diff --git a/applications/order/servicedef/services_requirement.xml
b/applications/order/servicedef/services_requirement.xml
index af64bd4f8d..ceb47a1f24 100644
--- a/applications/order/servicedef/services_requirement.xml
+++ b/applications/order/servicedef/services_requirement.xml
@@ -42,8 +42,8 @@ under the License.
<description>Delete a requirement</description>
<auto-attributes mode="IN" include="pk" optional="false"/>
</service>
- <service name="deleteRequirementAndRelated" engine="simple"
-
location="component://order/minilang/requirement/RequirementServices.xml"
invoke="deleteRequirementAndRelated">
+ <service name="deleteRequirementAndRelated" engine="groovy"
+
location="component://order/groovyScripts/requirement/RequirementServices.groovy"
invoke="deleteRequirementAndRelated">
<description>Delete a requirement after deleting related entity
records.</description>
<attribute name="requirementId" type="String" mode="IN"
optional="false"/>
</service>
@@ -157,15 +157,18 @@ under the License.
<attribute mode="IN" name="quantity" optional="true"
type="BigDecimal"/>
</service>
- <service name="autoAssignRequirementToSupplier" engine="simple" auth="true"
-
location="component://order/minilang/requirement/RequirementServices.xml"
invoke="autoAssignRequirementToSupplier">
+ <service name="autoAssignRequirementToSupplier" engine="groovy" auth="true"
+
location="component://order/groovyScripts/requirement/RequirementServices.groovy"
invoke="autoAssignRequirementToSupplier">
<description>If the requirement is a product requirement (purchasing)
try to assign it to the primary supplier</description>
<attribute name="requirementId" type="String" mode="IN"
optional="false"/>
</service>
- <service name="createTransferFromRequirement" engine="simple" auth="true"
-
location="component://order/minilang/requirement/RequirementServices.xml"
invoke="createTransferFromRequirement">
+ <service name="createTransferFromRequirement" engine="groovy" auth="true"
+
location="component://order/groovyScripts/requirement/RequirementServices.groovy"
invoke="createTransferFromRequirement">
<description>Create the inventory transfers required to fulfill the
requirement.</description>
+ <required-permissions join-type="AND">
+ <check-permission permission="ORDERMGR" action="_CREATE"/>
+ </required-permissions>
<attribute mode="IN" name="requirementId" optional="false"
type="String"/>
<attribute mode="IN" name="fromFacilityId" optional="false"
type="String"/>
<attribute mode="IN" name="quantity" optional="true"
type="BigDecimal"/>