You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by mb...@apache.org on 2020/03/13 16:45:16 UTC
[ofbiz-plugins] branch trunk updated: Improved: Convert
FactServices.xml minilang to groovy.
This is an automated email from the ASF dual-hosted git repository.
mbrohl pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-plugins.git
The following commit(s) were added to refs/heads/trunk by this push:
new b50d949 Improved: Convert FactServices.xml minilang to groovy.
b50d949 is described below
commit b50d949376e7d04195dda1be5f72d68f8249a770
Author: Michael Brohl <mi...@ecomify.de>
AuthorDate: Fri Mar 13 17:44:51 2020 +0100
Improved: Convert FactServices.xml minilang to groovy.
(OFBIZ-11030)
Thanks Pierre Smits for reporting and Sebastian Berg for providing the
patch.
---
bi/groovyScripts/FactServices.groovy | 664 ++++++++++++++++++++++++++++++
bi/minilang/FactServices.xml | 761 -----------------------------------
bi/servicedef/services.xml | 32 +-
3 files changed, 680 insertions(+), 777 deletions(-)
diff --git a/bi/groovyScripts/FactServices.groovy b/bi/groovyScripts/FactServices.groovy
new file mode 100644
index 0000000..80816b7
--- /dev/null
+++ b/bi/groovyScripts/FactServices.groovy
@@ -0,0 +1,664 @@
+/*
+ * 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.sql.Timestamp
+import java.text.SimpleDateFormat
+import java.sql.Date
+
+import org.apache.ofbiz.base.util.UtilDateTime
+import org.apache.ofbiz.base.util.UtilProperties
+import org.apache.ofbiz.base.util.UtilValidate
+import org.apache.ofbiz.entity.GenericValue
+import org.apache.ofbiz.entity.condition.EntityCondition
+import org.apache.ofbiz.entity.condition.EntityOperator
+import org.apache.ofbiz.order.order.OrderReadHelper
+import org.apache.ofbiz.service.ServiceUtil
+
+
+def loadSalesInvoiceFact() {
+ GenericValue invoice = from("Invoice").where(parameters).queryOne()
+ if (!invoice) {
+ String errorMessage = UtilProperties.getMessage("AccountingUiLabels", "AccountingInvoiceDoesNotExists", parameters.locale)
+ logError(errorMessage)
+ return error(errorMessage)
+ }
+ if ("SALES_INVOICE".equals(invoice.invoiceTypeId)) {
+ Map andConditions = ["invoiceItemTypeId": "INV_FPROD_ITEM"]
+ List invoiceItems = delegator.getRelated("InvoiceItem", null, null, invoice, false)
+ for (GenericValue invoiceItem : invoiceItems) {
+ Map inMap = [invoice: invoice, invoiceItem: invoiceItem]
+ run service: "loadSalesInvoiceItemFact", with: inMap
+ }
+ }
+ return success()
+}
+
+def loadSalesInvoiceItemFact() {
+ GenericValue invoice = parameters.invoice
+ GenericValue invoiceItem = parameters.invoiceItem
+ if (!invoice) {
+ invoice = from("Invoice").where(parameters).queryOne()
+ }
+ if (UtilValidate.isEmpty(invoiceItem)) {
+ invoiceItem = from("InvoiceItem").where(parameters).queryOne()
+ }
+ if (!invoice) {
+ String errorMessage = UtilProperties.getMessage("AccountingUiLabels", "AccountingInvoiceDoesNotExists", parameters.locale)
+ logError(errorMessage)
+ return error(errorMessage)
+ }
+ if (!invoiceItem) {
+ String errorMessage = UtilProperties.getMessage("AccountingUiLabels", "AccountingInvoiceItemDoesNotExists", parameters.locale)
+ logError(errorMessage)
+ return error(errorMessage)
+ }
+
+ if ("SALES_INVOICE".equals(invoice.invoiceTypeId)) {
+ GenericValue fact = from("SalesInvoiceItemFact").where(invoiceId: invoiceItem.invoiceId, invoiceItemSeqId: invoiceItem.invoiceItemSeqId).queryOne()
+ // key handling
+ if (!fact) {
+ Map inMap
+ Map naturalKeyFields
+ Map serviceResult
+ String dimensionId
+ fact = makeValue("SalesInvoiceItemFact")
+ fact.invoiceId = invoice.invoiceId
+ fact.invoiceItemSeqId = invoiceItem.invoiceItemSeqId
+ // conversion of the invoice date
+ if (invoice.invoiceDate) {
+ inMap = [:]
+ naturalKeyFields = [:]
+ inMap.dimensionEntityName = "DateDimension"
+ Date invoiceDate = new Date(invoice.invoiceDate.getTime())
+ naturalKeyFields.dateValue = invoiceDate
+ inMap.naturalKeyFields = naturalKeyFields
+ serviceResult = run service: "getDimensionIdFromNaturalKey", with: inMap
+ fact.invoiceDateDimId = serviceResult.dimensionId
+ if (!fact.invoiceDateDimId) {
+ fact.invoiceDateDimId = "_NF_"
+ }
+ } else {
+ fact.invoiceDateDimId = "_NA_"
+ }
+
+ // conversion of the product id
+ if (invoiceItem.productId) {
+ inMap = [:]
+ naturalKeyFields = [:]
+ inMap.dimensionEntityName = "ProductDimension"
+ naturalKeyFields.productId = invoiceItem.productId
+ inMap.naturalKeyFields = naturalKeyFields
+ serviceResult = run service: "getDimensionIdFromNaturalKey", with: inMap
+ fact.productDimId = serviceResult.dimensionId
+ if (!act.productDimId) {
+ fact.productDimId = "_NF_"
+ }
+ } else {
+ fact.productDimId = "_NA_"
+ }
+
+ // conversion of the invoice currency
+ if (invoice.currencyUomId) {
+ inMap = [:]
+ naturalKeyFields = [:]
+ inMap.dimensionEntityName = "CurrencyDimension"
+ naturalKeyFields.currencyId = invoice.currencyUomId
+ inMap.naturalKeyFields = naturalKeyFields
+ serviceResult = run service: "getDimensionIdFromNaturalKey", with: inMap
+ fact.origCurrencyDimId = serviceResult.dimensionId
+ if (!fact.origCurrencyDimId) {
+ fact.origCurrencyDimId = "_NF_"
+ }
+ } else {
+ fact.origCurrencyDimId = "_NA_"
+ }
+
+ // TODO
+ fact.orderId = "_NA_"
+ fact.billToCustomerDimId = "_NA_"
+ fact.create()
+ }
+ /*
+ * facts handling
+ */
+ fact.quantity = (BigDecimal) invoiceItem.quantity
+ fact.extGrossAmount = (BigDecimal) 0
+ fact.extDiscountAmount = (BigDecimal) 0
+ fact.extTaxAmount = (BigDecimal) 0
+ fact.extNetAmount = (BigDecimal) 0
+
+ if (invoiceItem.quantity && invoiceItem.amount) {
+ fact.extGrossAmount = invoiceItem.quantity * invoiceItem.amount
+ }
+
+ Map andConditions
+ // taxes
+ andConditions = [invoiceItemTypeId: "ITM_SALES_TAX"]
+ List taxes = delegator.getRelated("ChildrenInvoiceItem", null, null, invoiceItem, false)
+ for (GenericValue tax : taxes) {
+ if (tax.amount) {
+ fact.extTaxAmount = fact.extTaxAmount + tax.amount
+ }
+ }
+ // discounts
+ andConditions = [invoiceItemTypeId: "ITM_PROMOTION_ADJ"]
+ List discounts = delegator.getRelated("ChildrenInvoiceItem", null, null, invoiceItem, false)
+ for (GenericValue discount : discounts) {
+ if (discount.amount) {
+ fact.extDiscountAmount = fact.extDiscountAmount - discount.amount
+ }
+ }
+ fact.extNetAmount = fact.extGrossAmount - fact.extDiscountAmount
+ // TODO: prorate invoice header discounts and shipping charges
+ // TODO: costs
+ fact.extManFixedCost = (BigDecimal) 0
+ fact.extManVarCost = (BigDecimal) 0
+ fact.extStorageCost = (BigDecimal) 0
+ fact.extDistributionCost = (BigDecimal) 0
+
+ BigDecimal costs = fact.extManFixedCost + fact.extManVarCost + fact.extStorageCost + fact.extDistributionCost
+ fact.contributionAmount = fact.extNetAmount - costs
+
+ fact.store()
+ }
+ return success()
+}
+
+
+def loadSalesOrderFact() {
+ GenericValue orderHeader = from("OrderHeader").where(parameters).queryOne()
+ if (!orderHeader) {
+ String errorMessage = UtilProperties.getMessage("OrderErrorUiLabels", "OrderOrderIdDoesNotExists", parameters.locale)
+ logError(errorMessage)
+ return error(errorMessage)
+ }
+ if ("SALES_ORDER".equals(orderHeader.orderTypeId)) {
+ if ("ORDER_APPROVED".equals(orderHeader.statusId)) {
+ List orderItems = from("OrderItem")
+ .where("orderId", orderHeader.orderId, "orderItemTypeId", "PRODUCT_ORDER_ITEM")
+ .queryList()
+
+ for (GenericValue orderItem : orderItems) {
+ Map inMap = [:]
+ inMap.orderHeader = orderHeader
+ inMap.orderItem = orderItem
+ inMap.orderAdjustment = null
+ run service: "loadSalesOrderItemFact", with: inMap
+ }
+ }
+ }
+ return success()
+}
+
+def loadSalesOrderItemFact() {
+ Map inMap
+ Map naturalKeyFields
+ Map serviceResult
+ GenericValue orderHeader = parameters.orderHeader
+ GenericValue orderItem = parameters.orderItem
+ GenericValue orderAdjustment = parameters.orderAdjustment
+
+ List orderAdjustments
+ GenericValue orderStatus
+
+
+ if (!orderHeader) {
+ orderHeader = from("OrderHeader").where(parameters).queryOne()
+ }
+ if (!orderItem) {
+ orderItem = from("OrderItem").where(parameters).queryOne()
+ }
+ if (!orderAdjustment) {
+ orderAdjustments = from("OrderAdjustment").where("orderId": orderItem.orderId).queryList()
+ }
+ if (!orderHeader) {
+ String errorMessage = UtilProperties.getMessage("OrderErrorUiLabels", "OrderOrderIdDoesNotExists", parameters.locale)
+ logError(errorMessage)
+ return error(errorMessage)
+ }
+ if (!orderItem) {
+ String errorMessage = UtilProperties.getMessage("OrderErrorUiLabels", "OrderOrderItemIdDoesNotExists", parameters.locale)
+ logError(errorMessage)
+ return error(errorMessage)
+ }
+
+ if ("ORDER_APPROVED".equals(orderHeader.statusId)) {
+ GenericValue fact = from("SalesOrderItemFact").where(orderId: orderItem.orderId, orderItemSeqId: orderItem.orderItemSeqId).queryOne()
+ // key handling
+ if (!fact) {
+ fact = makeValue("SalesOrderItemFact")
+ fact.orderId = orderHeader.orderId
+ fact.orderItemSeqId = orderItem.orderItemSeqId
+ fact.productStoreId = orderHeader.productStoreId
+ fact.salesChannelEnumId = orderHeader.salesChannelEnumId
+ fact.statusId = orderItem.statusId
+
+ // account
+ if (orderHeader.productStoreId) {
+ GenericValue account = from("ProductStore").where(productStoreId: orderHeader.productStoreId).queryOne()
+ fact.account = account.storeName
+ }
+
+ // pod
+ if ("EUR".equals(orderHeader.currencyUom)) {
+ fact.pod = "Latin"
+ } else {
+ fact.pod = "Engish"
+ }
+
+ // brand
+ if (orderHeader.salesChannelEnumId) {
+ GenericValue brand = from("Enumeration").where(enumId: orderHeader.salesChannelEnumId).queryOne()
+ fact.brand = brand.description
+ }
+
+ // conversion of the order date
+ orderStatus = from("OrderStatus")
+ .where(orderId: orderHeader.orderId, statusId: "ORDER_APPROVED")
+ .orderBy("-statusDatetime")
+ .queryFirst()
+ if (orderStatus.statusDatetime) {
+ inMap = [:]
+ naturalKeyFields = [:]
+ inMap.dimensionEntityName = "DateDimension"
+ Date statusDatetime = new Date(orderStatus.statusDatetime.getTime())
+ naturalKeyFields.dateValue = statusDatetime
+ inMap.naturalKeyFields = naturalKeyFields
+ serviceResult = run service: "getDimensionIdFromNaturalKey", with: inMap
+ fact.orderDateDimId = serviceResult.dimensionId
+ if (!fact.orderDateDimId) {
+ fact.orderDateDimId = "_NF_"
+ }
+ } else {
+ fact.orderDateDimId = "_NA_"
+ }
+
+ // conversion of the product id
+ if (UtilValidate.isNotEmpty(orderItem.productId)) {
+ inMap = [:]
+ naturalKeyFields = [:]
+ inMap.dimensionEntityName = "ProductDimension"
+ naturalKeyFields.productId = orderItem.productId
+ inMap.naturalKeyFields = naturalKeyFields
+ serviceResult = run service: "getDimensionIdFromNaturalKey", with: inMap
+ fact.productDimId = serviceResult.dimensionId
+ if (!fact.productDimId) {
+ fact.productDimId = "_NF_"
+ }
+ } else {
+ fact.productDimId = "_NA_"
+ }
+
+ // conversion of the order currency
+ if (orderHeader.currencyUom) {
+ inMap = [:]
+ naturalKeyFields = [:]
+ inMap.dimensionEntityName = "CurrencyDimension"
+ naturalKeyFields.currencyId = orderHeader.currencyUom
+ inMap.naturalKeyFields = naturalKeyFields
+ serviceResult = run service: "getDimensionIdFromNaturalKey", with: inMap
+ fact.origCurrencyDimId = serviceResult.dimensionId
+ if (!fact.origCurrencyDimId) {
+ fact.origCurrencyDimId = "_NF_"
+ }
+ } else {
+ fact.origCurrencyDimId = "_NA_"
+ }
+
+ // productCategoryId
+ GenericValue productCategoryMember = from("ProductCategoryMember").where(productId: orderItem.productId, thruDate: null).queryFirst()
+ if (productCategoryMember) {
+ fact.productCategoryId = productCategoryMember.productCategoryId
+ }
+
+ // TODO
+ fact.billToCustomerDimId = "_NA_"
+
+ fact.create()
+ }
+ /*
+ * facts handling
+ */
+ Map partyAccountingPreferencesCallMap = [:]
+
+ OrderReadHelper orderReadHelper = new OrderReadHelper(orderHeader)
+ Map billFromParty = orderReadHelper.getBillFromParty()
+ partyAccountingPreferencesCallMap.organizationPartyId = billFromParty.partyId
+ Map accountResult = run service:"getPartyAccountingPreferences", with: partyAccountingPreferencesCallMap
+ GenericValue accPref = accountResult.partyAccountingPreference
+
+ fact.quantity = (BigDecimal) orderItem.quantity
+ fact.extGrossAmount = (BigDecimal) 0
+ fact.extGrossCost = (BigDecimal) 0
+ fact.extDiscountAmount = (BigDecimal) 0
+ fact.extNetAmount = (BigDecimal) 0
+ fact.extShippingAmount = (BigDecimal) 0
+ fact.extTaxAmount = (BigDecimal) 0
+
+ fact.GS = (BigDecimal) 0
+ fact.GMS = (BigDecimal) 0
+ fact.GMP = (BigDecimal) 0
+ fact.GSS = (BigDecimal) 0
+ fact.GSC = (BigDecimal) 0
+ fact.GSP = (BigDecimal) 0
+ fact.GP = (BigDecimal) 0
+
+ fact.countOrder = (BigDecimal) 0
+
+ // extGrossAmount
+ Map convertUomCurrencyMap = [:]
+ convertUomCurrencyMap.uomId = orderHeader.currencyUom
+ convertUomCurrencyMap.uomIdTo = accPref.baseCurrencyUomId
+ if (UtilValidate.isNotEmpty(orderStatus)) {
+ convertUomCurrencyMap.nowDate = orderStatus.statusDatetime
+ }
+ Map convertResult = run service: "convertUomCurrency", with: convertUomCurrencyMap
+ BigDecimal exchangeRate = convertResult.conversionFactor
+
+ if (exchangeRate) {
+ BigDecimal unitPrice = orderItem.unitPrice * exchangeRate
+
+ fact.extGrossAmount = fact.quantity * unitPrice
+ }
+
+ // extGrossCost
+ GenericValue cost = from("SupplierProduct")
+ .where(productId: orderItem.productId, availableThruDate: null, minimumOrderQuantity: (BigDecimal) 0)
+ .queryFirst()
+ if (cost) {
+ convertUomCurrencyMap.uomId = cost.currencyUomId
+ convertUomCurrencyMap.uomIdTo = accPref.baseCurrencyUomId
+ if (orderStatus) {
+ convertUomCurrencyMap.nowDate = orderStatus.statusDatetime
+ }
+ Map grossCostResult = run service: "convertUomCurrency", with: convertUomCurrencyMap
+ exchangeRate = grossCostResult.conversionFactor
+
+ if (exchangeRate) {
+ BigDecimal costPrice = cost.lastPrice * exchangeRate
+ fact.extGrossCost = fact.quantity * costPrice
+ }
+ }
+
+ // extShippingAmount
+ for (GenericValue shipping : orderAdjustments) {
+ if ("SHIPPING_CHARGES".equals(shipping.orderAdjustmentTypeId)) {
+ fact.extShippingAmount = fact.extShippingAmount + shipping.amount
+ }
+ }
+
+ // extTaxAmount
+ for (GenericValue tax : orderAdjustments) {
+ if ("SALES_TAX".equals(tax.orderAdjustmentTypeId)) {
+ fact.extTaxAmount = fact.extTaxAmount + tax.amount
+ }
+ }
+
+ // extDiscountAmount
+ for (GenericValue discount : orderAdjustments) {
+ if ("PROMOTION_ADJUSTMENT".equals(discount.orderAdjustmentTypeId)) {
+ fact.extDiscountAmount = fact.extDiscountAmount + discount.amount
+ // product promo code
+ GenericValue productPromoCode = from("ProductPromoCode").where(productPromoId: discount.productPromoId).queryFirst()
+ if (productPromoCode) {
+ fact.productPromoCode = productPromoCode.productPromoCodeId
+ } else {
+ fact.productPromoCode = "Not require code"
+ }
+ }
+ }
+
+ // extNetAmount
+ fact.extNetAmount = fact.extGrossAmount - fact.extDiscountAmount
+
+ // GS
+ BigDecimal countGS = (BigDecimal) 0
+ List checkGSList = from("SalesOrderItemFact").where(orderId: orderHeader.orderId).queryList()
+ for (GenericValue checkGS : checkGSList) {
+ if (checkGS.GS) {
+ if (0 != checkGS.GS) {
+ countGS = 1
+ }
+ }
+ }
+ if (countGS == 0) {
+ convertUomCurrencyMap.uomId = orderHeader.currencyUom
+ convertUomCurrencyMap.uomIdTo = accPref.baseCurrencyUomId
+ if (orderStatus) {
+ convertUomCurrencyMap.nowDate = orderStatus.statusDatetime
+ }
+ Map GSResult = run service: "convertUomCurrency", with: convertUomCurrencyMap
+ exchangeRate = GSResult.conversionFactor
+
+ if (exchangeRate) {
+ fact.GS = orderHeader.grandTotal * exchangeRate
+ }
+ }
+
+ // GMS
+ fact.GMS = fact.GMS + fact.extGrossAmount
+
+ // GMP
+ fact.GMP = fact.GMS - fact.extGrossCost
+
+ // GSP
+ BigDecimal countGSP = (BigDecimal) 0
+ List checkGSPList = from("SalesOrderItemFact").where(orderId: orderHeader.orderId).queryList()
+ for (GenericValue checkGSP : checkGSPList) {
+ if (checkGSP.GSP) {
+ if (checkGSP.GSP != 0) {
+ countGSP = 1
+ }
+ }
+ }
+ if (countGSP == 0) {
+ List orderItemList = from("OrderItem").where(orderId: orderHeader.orderId).queryList()
+
+ BigDecimal warrantyPrice = (BigDecimal) 0
+ for (GenericValue warranty : orderAdjustments) {
+ if ("WARRANTY_ADJUSTMENT".equals(warranty.orderAdjustmentTypeId)) {
+ warrantyPrice = warrantyPrice + warranty.amount
+ }
+ }
+ BigDecimal GSS = fact.extShippingAmount + warrantyPrice
+
+ convertUomCurrencyMap.uomId = orderHeader.currencyUom
+ convertUomCurrencyMap.uomIdTo = accPref.baseCurrencyUomId
+ if (orderStatus) {
+ convertUomCurrencyMap.nowDate = orderStatus.statusDatetime
+ }
+ Map GSPResult = run service: "convertUomCurrency", with: convertUomCurrencyMap
+ exchangeRate = GSPResult.conversionFactor
+
+ if (exchangeRate) {
+ GSS = GSS * exchangeRate
+ }
+ fact.GSS = GSS
+ fact.GSP = (BigDecimal) GSS
+ }
+
+ // GP
+ fact.GP = fact.GMP + fact.GSP
+
+ // countOrder
+ BigDecimal countOrder = (BigDecimal) 0
+ List checkCountOrderList = from("SalesOrderItemFact").where(orderId: orderHeader.orderId).queryList()
+ for (GenericValue checkCountOrder : checkCountOrderList) {
+ if (checkCountOrder.countOrder) {
+ if (checkCountOrder.countOrder != 0) {
+ countOrder = 1
+ }
+ }
+ }
+ if (countOrder == 0) {
+ fact.countOrder = (BigDecimal) 1
+ }
+ fact.store()
+ }
+ return success()
+}
+
+/**
+ * Load Sales Order Data Daily
+ */
+def loadSalesOrderDataDaily() {
+ Timestamp nowTimestamp = UtilDateTime.nowTimestamp()
+ Date nowDate = new Date(nowTimestamp.getTime())
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 07:00:00.000")
+ def today = sdf.format(nowDate)
+ Date yesterdayDate = new Date(nowTimestamp.getTime()-86400000)
+ def yesterday = sdf.format(yesterdayDate)
+
+ Map inMap = [:]
+ inMap.fromDate = yesterday
+ inMap.thruDate = today
+
+ run service: "importSalesOrderData", with: inMap
+ return success()
+}
+
+
+/**
+ * Import Sales Order Data
+ */
+def importSalesOrderData() {
+ Map inMap = [fromDate: parameters.fromDate, thruDate: parameters.thruDate]
+
+ Map res = run service:"loadDateDimension", with: inMap
+ if (!ServiceUtil.isSuccess(res)) {
+ return res
+ }
+ EntityCondition condition = EntityCondition.makeCondition(
+ EntityCondition.makeCondition("statusId", "ORDER_APPROVED"),
+ EntityCondition.makeCondition("statusDatetime", EntityOperator.GREATER_THAN_EQUAL_TO, parameters.fromDate),
+ EntityCondition.makeCondition("statusDatetime", EntityOperator.LESS_THAN, parameters.thruDate)
+ )
+ List orderStatusList = from("OrderStatus").where(condition).queryList()
+ for (GenericValue orderHeader : orderStatusList) {
+ inMap =[:]
+ inMap.orderId = orderHeader.orderId
+ res = run service:"loadSalesOrderFact", with: inMap
+ if (!ServiceUtil.isSuccess(res)) {
+ return res
+ }
+ }
+ return success()
+}
+
+/**
+ * Convert Uom Currency from UomConversionDated entity
+ */
+def convertUomCurrency() {
+ if (!parameters.nowDate) {
+ Timestamp now = UtilDateTime.nowTimestamp()
+ parameters.nowDate = now
+ }
+ Map result = success()
+ EntityCondition condition = EntityCondition.makeCondition(
+ EntityCondition.makeCondition("uomId", parameters.uomId),
+ EntityCondition.makeCondition("uomIdTo", parameters.uomIdTo),
+ EntityCondition.makeCondition("fromDate", EntityOperator.LESS_THAN_EQUAL_TO, parameters.nowDate),
+ EntityCondition.makeCondition("thruDate", EntityOperator.GREATER_THAN, parameters.nowDate)
+ )
+ GenericValue UomConversion = from("UomConversionDated").where(condition).orderBy("-fromDate").queryFirst()
+ if (UomConversion) {
+ result.conversionFactor = UomConversion.conversionFactor
+ } else {
+ GenericValue UomConversionLastest = from("UomConversionDated")
+ .where(uomId: parameters.uomId, uomIdTo: parameters.uomIdTo, thruDate: null)
+ .queryFirst()
+ if (UomConversionLastest) {
+ result.conversionFactor = UomConversionLastest.conversionFactor
+ }
+ }
+ return result
+}
+
+
+def loadInventoryFact() {
+ GenericValue inventory = from("InventoryItem").where(inventoryItemId: parameters.inventoryItemId).queryOne()
+ GenericValue fact = from("InventoryItemFact").where(inventoryItemId: parameters.inventoryItemId).queryOne()
+
+ Map inMap = [:]
+ Map naturalKeyFields = [:]
+ Map serviceResult
+ if (!fact) {
+ fact = makeValue("InventoryItemFact")
+ fact.inventoryItemId = inventory.inventoryItemId
+ // conversion of the inventory date
+ if (inventory?.createdStamp) {
+ inMap = [:]
+ naturalKeyFields = [:]
+ inMap.dimensionEntityName = "DateDimension"
+ Date createdStampDatetime = new Date(inventory.createdStamp.getTime())
+ naturalKeyFields.dateValue = createdStampDatetime
+ inMap.naturalKeyFields = naturalKeyFields
+ serviceResult = run service:"getDimensionIdFromNaturalKey", with: inMap
+ fact.inventoryDateDimId = serviceResult.dimensionId
+ if (!fact.inventoryDateDimId) {
+ fact.inventoryDateDimId = "_NF_"
+ }
+ } else {
+ fact.inventoryDateDimId = "_NA_"
+ }
+ // conversion of the productId
+ if (inventory?.productId) {
+ inMap = [:]
+ naturalKeyFields = [:]
+ inMap.dimensionEntityName = "ProductDimension"
+ naturalKeyFields.productId = inventory.productId
+ inMap.naturalKeyFields = naturalKeyFields
+ serviceResult = run service:"getDimensionIdFromNaturalKey", with: inMap
+ fact.productDimId = serviceResult.dimensionId
+ if (!fact.productDimId) {
+ fact.productDimId = "_NF_"
+ }
+ } else {
+ fact.productDimId = "_NA_"
+ }
+ // conversion of the order currency
+ if (inventory?.currencyUomId) {
+ inMap =[:]
+ naturalKeyFields = [:]
+ inMap.dimensionEntityName = "CurrencyDimension"
+ naturalKeyFields.currencyId = inventory.currencyUomId
+ inMap.naturalKeyFields = naturalKeyFields
+ serviceResult = run service:"getDimensionIdFromNaturalKey", with: inMap
+ fact.origCurrencyDimId = serviceResult.dimensionId
+ if (!fact.origCurrencyDimId) {
+ fact.origCurrencyDimId = "_NF_"
+ }
+ } else {
+ fact.origCurrencyDimId = "_NA_"
+ }
+ fact.create()
+ }
+
+ fact.facilityId = inventory.facilityId
+ fact.inventoryItemId = inventory.inventoryItemId
+ fact.quantityOnHandTotal = inventory.quantityOnHandTotal
+ fact.availableToPromiseTotal = inventory.availableToPromiseTotal
+ fact.unitCost = inventory.unitCost
+
+ // calculate sold out amount
+ fact.soldoutAmount = inventory.quantityOnHandTotal - inventory.availableToPromiseTotal
+
+ fact.store()
+ return success()
+}
diff --git a/bi/minilang/FactServices.xml b/bi/minilang/FactServices.xml
deleted file mode 100644
index 13a72be..0000000
--- a/bi/minilang/FactServices.xml
+++ /dev/null
@@ -1,761 +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="loadSalesInvoiceFact" short-description="">
- <entity-one entity-name="Invoice" value-field="invoice"/>
- <if-empty field="invoice">
- <add-error>
- <fail-property resource="AccountingUiLabels" property="AccountingInvoiceDoesNotExists"/>
- </add-error>
- </if-empty>
- <check-errors/>
- <if-compare field="invoice.invoiceTypeId" operator="equals" value="SALES_INVOICE">
- <set field="andConditions.invoiceItemTypeId" value="INV_FPROD_ITEM"/>
- <get-related relation-name="InvoiceItem" value-field="invoice" list="invoiceItems" map="andConditions"/>
- <iterate list="invoiceItems" entry="invoiceItem">
- <clear-field field="inMap"/>
- <set field="inMap.invoice" from-field="invoice"/>
- <set field="inMap.invoiceItem" from-field="invoiceItem"/>
- <call-service service-name="loadSalesInvoiceItemFact" in-map-name="inMap"/>
- </iterate>
- </if-compare>
- </simple-method>
- <simple-method method-name="loadSalesInvoiceItemFact" short-description="">
- <set field="invoice" from-field="parameters.invoice"/>
- <set field="invoiceItem" from-field="parameters.invoiceItem"/>
- <if-empty field="invoice">
- <entity-one entity-name="Invoice" value-field="invoice"/>
- </if-empty>
- <if-empty field="invoiceItem">
- <entity-one entity-name="InvoiceItem" value-field="invoiceItem"/>
- </if-empty>
- <if-empty field="invoice">
- <add-error>
- <fail-property resource="AccountingUiLabels" property="AccountingInvoiceDoesNotExists"/>
- </add-error>
- </if-empty>
- <if-empty field="invoiceItem">
- <add-error>
- <fail-property resource="AccountingUiLabels" property="AccountingInvoiceItemDoesNotExists"/>
- </add-error>
- </if-empty>
- <check-errors/>
-
- <if-compare field="invoice.invoiceTypeId" operator="equals" value="SALES_INVOICE">
- <entity-one entity-name="SalesInvoiceItemFact" value-field="fact" auto-field-map="false">
- <field-map field-name="invoiceId" from-field="invoiceItem.invoiceId"/>
- <field-map field-name="invoiceItemSeqId" from-field="invoiceItem.invoiceItemSeqId"/>
- </entity-one>
- <!-- key handling -->
- <if-empty field="fact">
- <make-value entity-name="SalesInvoiceItemFact" value-field="fact"/>
- <set field="fact.invoiceId" from-field="invoice.invoiceId"/>
- <set field="fact.invoiceItemSeqId" from-field="invoiceItem.invoiceItemSeqId"/>
- <!-- conversion of the invoice date -->
- <if-not-empty field="invoice.invoiceDate">
- <clear-field field="inMap"/>
- <set field="inMap.dimensionEntityName" value="DateDimension"/>
- <set field="inMap.naturalKeyFields.dateValue" from-field="invoice.invoiceDate" type="Date"/>
- <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
- <result-to-field result-name="dimensionId" field="fact.invoiceDateDimId"/>
- </call-service>
- <if-empty field="fact.invoiceDateDimId">
- <set field="fact.invoiceDateDimId" value="_NF_"/>
- </if-empty>
- <else>
- <set field="fact.invoiceDateDimId" value="_NA_"/>
- </else>
- </if-not-empty>
- <!-- conversion of the product id -->
- <if-not-empty field="invoiceItem.productId">
- <clear-field field="inMap"/>
- <set field="inMap.dimensionEntityName" value="ProductDimension"/>
- <set field="inMap.naturalKeyFields.productId" from-field="invoiceItem.productId"/>
- <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
- <result-to-field result-name="dimensionId" field="fact.productDimId"/>
- </call-service>
- <if-empty field="fact.productDimId">
- <set field="fact.productDimId" value="_NF_"/>
- </if-empty>
- <else>
- <set field="fact.productDimId" value="_NA_"/>
- </else>
- </if-not-empty>
- <!-- conversion of the invoice currency -->
- <if-not-empty field="invoice.currencyUomId">
- <clear-field field="inMap"/>
- <set field="inMap.dimensionEntityName" value="CurrencyDimension"/>
- <set field="inMap.naturalKeyFields.currencyId" from-field="invoice.currencyUomId"/>
- <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
- <result-to-field result-name="dimensionId" field="fact.origCurrencyDimId"/>
- </call-service>
- <if-empty field="fact.origCurrencyDimId">
- <set field="fact.origCurrencyDimId" value="_NF_"/>
- </if-empty>
- <else>
- <set field="fact.origCurrencyDimId" value="_NA_"/>
- </else>
- </if-not-empty>
- <!-- TODO -->
- <set field="fact.orderId" value="_NA_"/>
- <set field="fact.billToCustomerDimId" value="_NA_"/>
- <create-value value-field="fact"/>
- </if-empty>
- <!-- =============== -->
- <!-- facts handling -->
- <!-- =============== -->
- <set field="fact.quantity" from-field="invoiceItem.quantity" type="BigDecimal"/>
- <set field="fact.extGrossAmount" value="0.0" type="BigDecimal"/>
- <set field="fact.extDiscountAmount" value="0.0" type="BigDecimal"/>
- <set field="fact.extTaxAmount" value="0.0" type="BigDecimal"/>
- <set field="fact.extNetAmount" value="0.0" type="BigDecimal"/>
- <calculate field="fact.extGrossAmount">
- <calcop field="invoiceItem.quantity" operator="multiply">
- <calcop field="invoiceItem.amount" operator="get"/>
- </calcop>
- </calculate>
- <!-- taxes -->
- <clear-field field="andConditions"/>
- <set field="andConditions.invoiceItemTypeId" value="ITM_SALES_TAX"/>
- <get-related relation-name="ChildrenInvoiceItem" value-field="invoiceItem" list="taxes" map="andConditions"/>
- <iterate list="taxes" entry="tax">
- <calculate field="fact.extTaxAmount">
- <calcop field="fact.extTaxAmount" operator="add">
- <calcop field="tax.amount" operator="get"/>
- </calcop>
- </calculate>
- </iterate>
- <!-- discounts -->
- <clear-field field="andConditions"/>
- <set field="andConditions.invoiceItemTypeId" value="ITM_PROMOTION_ADJ"/>
- <get-related relation-name="ChildrenInvoiceItem" value-field="invoiceItem" list="discounts" map="andConditions"/>
- <iterate list="discounts" entry="discount">
- <calculate field="fact.extDiscountAmount" type="BigDecimal">
- <calcop field="fact.extDiscountAmount" operator="add">
- <calcop field="discount.amount" operator="negative"/>
- </calcop>
- </calculate>
- </iterate>
-
- <calculate field="fact.extNetAmount">
- <calcop field="fact.extGrossAmount" operator="subtract">
- <calcop field="fact.extDiscountAmount" operator="get"/>
- </calcop>
- </calculate>
- <!-- TODO: prorate invoice header discounts and shipping charges -->
- <!-- TODO: costs -->
- <set field="fact.extManFixedCost" value="0.0" type="BigDecimal"/>
- <set field="fact.extManVarCost" value="0.0" type="BigDecimal"/>
- <set field="fact.extStorageCost" value="0.0" type="BigDecimal"/>
- <set field="fact.extDistributionCost" value="0.0" type="BigDecimal"/>
-
- <calculate field="fact.contributionAmount">
- <calcop field="fact.extNetAmount" operator="subtract">
- <calcop field="fact.extManFixedCost" operator="get"/>
- <calcop field="fact.extManVarCost" operator="get"/>
- <calcop field="fact.extStorageCost" operator="get"/>
- <calcop field="fact.extDistributionCost" operator="get"/>
- </calcop>
- </calculate>
-
- <store-value value-field="fact"/>
- </if-compare>
- </simple-method>
-
- <simple-method method-name="loadSalesOrderFact" short-description="">
- <entity-one entity-name="OrderHeader" value-field="orderHeader"/>
- <if-empty field="orderHeader">
- <add-error>
- <fail-property resource="OrderErrorUiLabels" property="OrderOrderIdDoesNotExists"/>
- </add-error>
- </if-empty>
- <check-errors/>
- <if-compare field="orderHeader.orderTypeId" operator="equals" value="SALES_ORDER">
- <if-compare field="orderHeader.statusId" operator="equals" value="ORDER_APPROVED">
- <entity-condition entity-name="OrderItem" list="orderItems">
- <condition-list combine="and">
- <condition-expr field-name="orderId" operator="equals" from-field="orderHeader.orderId"/>
- <!--<condition-expr field-name="productId" operator="not-like" value="M00%"/>-->
- <condition-expr field-name="orderItemTypeId" operator="equals" value="PRODUCT_ORDER_ITEM"/>
- <!--<condition-expr field-name="statusId" operator="equals" value="ITEM_APPROVED"/>-->
- </condition-list>
- </entity-condition>
-
- <!--<set field="andConditions.orderItemTypeId" value="PRODUCT_ORDER_ITEM"/>
- <get-related relation-name="OrderItem" value-field="orderHeader" list="orderItems" map="andConditions"/>-->
-
- <iterate list="orderItems" entry="orderItem">
- <clear-field field="inMap"/>
- <set field="inMap.orderHeader" from-field="orderHeader"/>
- <set field="inMap.orderItem" from-field="orderItem"/>
- <set field="inMap.orderAdjustment" from-field="orderAdjustment"/>
- <call-service service-name="loadSalesOrderItemFact" in-map-name="inMap"/>
- </iterate>
- </if-compare>
- </if-compare>
- </simple-method>
-
- <simple-method method-name="loadSalesOrderItemFact" short-description="">
- <set field="orderHeader" from-field="parameters.orderHeader"/>
- <set field="orderItem" from-field="parameters.orderItem"/>
- <set field="orderAdjustment" from-field="parameters.orderAdjustment"/>
- <if-empty field="orderHeader">
- <entity-one entity-name="OrderHeader" value-field="orderHeader"/>
- </if-empty>
- <if-empty field="orderItem">
- <entity-one entity-name="OrderItem" value-field="orderItem"/>
- </if-empty>
- <if-empty field="orderAdjustment">
- <entity-and entity-name="OrderAdjustment" list="orderAdjustments">
- <field-map field-name="orderId" from-field="orderItem.orderId"/>
- </entity-and>
- </if-empty>
- <if-empty field="orderHeader">
- <add-error>
- <fail-property resource="OrderErrorUiLabels" property="OrderOrderIdDoesNotExists"/>
- </add-error>
- </if-empty>
- <if-empty field="orderItem">
- <add-error>
- <fail-property resource="OrderErrorUiLabels" property="OrderOrderItemIdDoesNotExists"/>
- </add-error>
- </if-empty>
- <check-errors/>
-
- <if-compare field="orderHeader.statusId" operator="equals" value="ORDER_APPROVED">
- <entity-one entity-name="SalesOrderItemFact" value-field="fact" auto-field-map="false">
- <field-map field-name="orderId" from-field="orderItem.orderId"/>
- <field-map field-name="orderItemSeqId" from-field="orderItem.orderItemSeqId"/>
- </entity-one>
- <!-- key handling -->
- <if-empty field="fact">
- <make-value entity-name="SalesOrderItemFact" value-field="fact"/>
- <set field="fact.orderId" from-field="orderHeader.orderId"/>
- <set field="fact.orderItemSeqId" from-field="orderItem.orderItemSeqId"/>
- <set field="fact.productStoreId" from-field="orderHeader.productStoreId"/>
- <set field="fact.salesChannelEnumId" from-field="orderHeader.salesChannelEnumId"/>
- <set field="fact.statusId" from-field="orderItem.statusId"/>
-
- <!-- account -->
- <if-not-empty field="orderHeader.productStoreId">
- <entity-one entity-name="ProductStore" value-field="account">
- <field-map field-name="productStoreId" from-field="orderHeader.productStoreId"/>
- </entity-one>
- <set field="fact.account" from-field="account.storeName"/>
- </if-not-empty>
-
- <!-- pod -->
- <if-compare field="orderHeader.currencyUom" operator="equals" value="EUR">
- <set field="fact.pod" value="Latin"/>
- <else>
- <set field="fact.pod" value="English"/>
- </else>
- </if-compare>
-
- <!-- brand -->
- <if-not-empty field="orderHeader.salesChannelEnumId">
- <entity-one entity-name="Enumeration" value-field="brand">
- <field-map field-name="enumId" from-field="orderHeader.salesChannelEnumId"/>
- </entity-one>
- <set field="fact.brand" from-field="brand.description"/>
- </if-not-empty>
-
- <!-- conversion of the order date -->
- <entity-condition entity-name="OrderStatus" list="orderStatusList">
- <condition-list combine="and">
- <condition-expr field-name="orderId" from-field="orderHeader.orderId"/>
- <condition-expr field-name="statusId" value="ORDER_APPROVED"/>
- </condition-list>
- <order-by field-name="-statusDatetime"/>
- </entity-condition>
- <first-from-list list="orderStatusList" entry="orderStatus"/>
- <if-not-empty field="orderStatus.statusDatetime">
- <clear-field field="inMap"/>
- <set field="inMap.dimensionEntityName" value="DateDimension"/>
- <set field="inMap.naturalKeyFields.dateValue" from-field="orderStatus.statusDatetime" type="Date"/>
- <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
- <result-to-field result-name="dimensionId" field="fact.orderDateDimId"/>
- </call-service>
- <if-empty field="fact.orderDateDimId">
- <set field="fact.orderDateDimId" value="_NF_"/>
- </if-empty>
- <else>
- <set field="fact.orderDateDimId" value="_NA_"/>
- </else>
- </if-not-empty>
-
- <!-- conversion of the product id -->
- <if-not-empty field="orderItem.productId">
- <clear-field field="inMap"/>
- <set field="inMap.dimensionEntityName" value="ProductDimension"/>
- <set field="inMap.naturalKeyFields.productId" from-field="orderItem.productId"/>
- <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
- <result-to-field result-name="dimensionId" field="fact.productDimId"/>
- </call-service>
- <if-empty field="fact.productDimId">
- <set field="fact.productDimId" value="_NF_"/>
- </if-empty>
- <else>
- <set field="fact.productDimId" value="_NA_"/>
- </else>
- </if-not-empty>
-
- <!-- conversion of the order currency -->
- <if-not-empty field="orderHeader.currencyUom">
- <clear-field field="inMap"/>
- <set field="inMap.dimensionEntityName" value="CurrencyDimension"/>
- <set field="inMap.naturalKeyFields.currencyId" from-field="orderHeader.currencyUom"/>
- <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
- <result-to-field result-name="dimensionId" field="fact.origCurrencyDimId"/>
- </call-service>
- <if-empty field="fact.origCurrencyDimId">
- <set field="fact.origCurrencyDimId" value="_NF_"/>
- </if-empty>
- <else>
- <set field="fact.origCurrencyDimId" value="_NA_"/>
- </else>
- </if-not-empty>
-
- <!-- productCategoryId -->
- <entity-and entity-name="ProductCategoryMember" list="productCategoryMembers">
- <field-map field-name="productId" from-field="orderItem.productId"/>
- <field-map field-name="thruDate" from-field="nullField"/>
- </entity-and>
- <if-not-empty field="productCategoryMembers">
- <first-from-list list="productCategoryMembers" entry="productCategoryMember"/>
- <set field="fact.productCategoryId" from-field="productCategoryMember.productCategoryId"/>
- </if-not-empty>
-
- <!-- TODO -->
- <set field="fact.billToCustomerDimId" value="_NA_"/>
-
- <create-value value-field="fact"/>
- </if-empty>
- <!-- =============== -->
- <!-- facts handling -->
- <!-- =============== -->
- <script>groovy:
- import org.apache.ofbiz.order.order.OrderReadHelper
-
- orderReadHelper = new OrderReadHelper(orderHeader)
- context.billFromParty = orderReadHelper.getBillFromParty()
- </script>
- <set field="partyAccountingPreferencesCallMap.organizationPartyId" from-field="billFromParty.partyId"/>
- <call-service service-name="getPartyAccountingPreferences" in-map-name="partyAccountingPreferencesCallMap">
- <result-to-field result-name="partyAccountingPreference" field="accPref"/>
- </call-service>
- <set field="fact.quantity" from-field="orderItem.quantity" type="BigDecimal"/>
- <set field="fact.extGrossAmount" value="0" type="BigDecimal"/>
- <set field="fact.extGrossCost" value="0" type="BigDecimal"/>
- <set field="fact.extDiscountAmount" value="0" type="BigDecimal"/>
- <set field="fact.extNetAmount" value="0" type="BigDecimal"/>
- <set field="fact.extShippingAmount" value="0" type="BigDecimal"/>
- <set field="fact.extTaxAmount" value="0" type="BigDecimal"/>
-
- <set field="fact.GS" value="0" type="BigDecimal"/>
- <set field="fact.GMS" value="0" type="BigDecimal"/>
- <set field="fact.GMP" value="0" type="BigDecimal"/>
- <set field="fact.GSS" value="0" type="BigDecimal"/>
- <set field="fact.GSC" value="0" type="BigDecimal"/>
- <set field="fact.GSP" value="0" type="BigDecimal"/>
- <set field="fact.GP" value="0" type="BigDecimal"/>
-
- <set field="fact.countOrder" value="0" type="BigDecimal"/>
-
- <!-- extGrossAmount -->
- <set field="convertUomCurrencyMap.uomId" from-field="orderHeader.currencyUom"/>
- <set field="convertUomCurrencyMap.uomIdTo" from-field="accPref.baseCurrencyUomId"/>
- <set field="convertUomCurrencyMap.nowDate" from-field="orderStatus.statusDatetime"/>
- <call-service service-name="convertUomCurrency" in-map-name="convertUomCurrencyMap">
- <result-to-field result-name="conversionFactor" field="exchangeRate"/>
- </call-service>
-
- <if-not-empty field="exchangeRate">
- <calculate field="unitPrice">
- <calcop field="orderItem.unitPrice" operator="multiply">
- <calcop field="exchangeRate" operator="get"/>
- </calcop>
- </calculate>
-
- <calculate field="fact.extGrossAmount">
- <calcop field="fact.quantity" operator="multiply">
- <calcop field="unitPrice" operator="get"/>
- </calcop>
- </calculate>
- </if-not-empty>
-
- <!-- extGrossCost -->
- <entity-condition entity-name="SupplierProduct" list="costs">
- <condition-list combine="and">
- <condition-expr field-name="productId" operator="equals" from-field="orderItem.productId"/>
- <condition-expr field-name="availableThruDate" operator="equals" from-field="nullField"/>
- <condition-expr field-name="minimumOrderQuantity" operator="equals" value="0"/>
- </condition-list>
- </entity-condition>
- <if-not-empty field="costs">
- <first-from-list list="costs" entry="cost"/>
-
- <set field="convertUomCurrencyMap.uomId" from-field="cost.currencyUomId"/>
- <set field="convertUomCurrencyMap.uomIdTo" from-field="accPref.baseCurrencyUomId"/>
- <set field="convertUomCurrencyMap.nowDate" from-field="orderStatus.statusDatetime"/>
- <call-service service-name="convertUomCurrency" in-map-name="convertUomCurrencyMap">
- <result-to-field result-name="conversionFactor" field="exchangeRate"/>
- </call-service>
-
- <if-not-empty field="exchangeRate">
- <calculate field="costPrice">
- <calcop field="cost.lastPrice" operator="multiply">
- <calcop field="exchangeRate" operator="get"/>
- </calcop>
- </calculate>
-
- <calculate field="fact.extGrossCost">
- <calcop field="fact.quantity" operator="multiply">
- <calcop field="costPrice" operator="get"/>
- </calcop>
- </calculate>
- </if-not-empty>
- </if-not-empty>
-
- <!-- extShippingAmount -->
- <iterate list="orderAdjustments" entry="shipping">
- <if-compare field="shipping.orderAdjustmentTypeId" operator="equals" value="SHIPPING_CHARGES">
- <calculate field="fact.extShippingAmount">
- <calcop field="fact.extShippingAmount" operator="add">
- <calcop field="shipping.amount" operator="get"/>
- </calcop>
- </calculate>
- </if-compare>
- </iterate>
-
- <!-- extTaxAmount -->
- <iterate list="orderAdjustments" entry="tax">
- <if-compare field="tax.orderAdjustmentTypeId" operator="equals" value="SALES_TAX">
- <calculate field="fact.extTaxAmount">
- <calcop field="fact.extTaxAmount" operator="add">
- <calcop field="tax.amount" operator="get"/>
- </calcop>
- </calculate>
- </if-compare>
- </iterate>
-
- <!-- extDiscountAmount -->
- <iterate list="orderAdjustments" entry="discount">
- <if-compare field="discount.orderAdjustmentTypeId" operator="equals" value="PROMOTION_ADJUSTMENT">
- <calculate field="fact.extDiscountAmount">
- <calcop field="fact.extDiscountAmount" operator="add">
- <calcop field="discount.amount" operator="get"/>
- </calcop>
- </calculate>
- <!-- product promo code -->
- <entity-and entity-name="ProductPromoCode" list="productPromo">
- <field-map field-name="productPromoId" from-field="discount.productPromoId"/>
- </entity-and>
- <first-from-list list="productPromo" entry="productPromoCode"/>
- <if-not-empty field="productPromoCode">
- <set field="fact.productPromoCode" from-field="productPromoCode.productPromoCodeId"/>
- <else>
- <set field="fact.productPromoCode" value="Not require code"/>
- </else>
- </if-not-empty>
- </if-compare>
- </iterate>
-
- <!-- extNetAmount -->
- <calculate field="fact.extNetAmount">
- <calcop field="fact.extGrossAmount" operator="subtract">
- <calcop field="fact.extDiscountAmount" operator="get"/>
- </calcop>
- </calculate>
-
- <!-- GS -->
- <set field="countGS" value="0"/>
- <entity-and entity-name="SalesOrderItemFact" list="checkGSList">
- <field-map field-name="orderId" from-field="orderHeader.orderId"/>
- </entity-and>
- <iterate list="checkGSList" entry="checkGS">
- <if-not-empty field="checkGS.GS">
- <if-compare field="checkGS.GS" operator="not-equals" value="0">
- <set field="countGS" value="1"/>
- </if-compare>
- </if-not-empty>
- </iterate>
- <if-compare field="countGS" operator="equals" value="0">
- <set field="convertUomCurrencyMap.uomId" from-field="orderHeader.currencyUom"/>
- <set field="convertUomCurrencyMap.uomIdTo" from-field="accPref.baseCurrencyUomId"/>
- <set field="convertUomCurrencyMap.nowDate" from-field="orderStatus.statusDatetime"/>
- <call-service service-name="convertUomCurrency" in-map-name="convertUomCurrencyMap">
- <result-to-field result-name="conversionFactor" field="exchangeRate"/>
- </call-service>
-
- <if-not-empty field="exchangeRate">
- <calculate field="fact.GS">
- <calcop field="orderHeader.grandTotal" operator="multiply">
- <calcop field="exchangeRate" operator="get"/>
- </calcop>
- </calculate>
- </if-not-empty>
- </if-compare>
-
- <!-- GMS -->
- <calculate field="fact.GMS">
- <calcop field="fact.GMS" operator="add">
- <calcop field="fact.extGrossAmount" operator="get"/>
- </calcop>
- </calculate>
-
- <!-- GMP -->
- <calculate field="fact.GMP">
- <calcop field="fact.GMS" operator="subtract">
- <calcop field="fact.extGrossCost" operator="get"/>
- </calcop>
- </calculate>
-
- <!-- GSP -->
- <set field="countGSP" value="0"/>
- <entity-and entity-name="SalesOrderItemFact" list="checkGSPList">
- <field-map field-name="orderId" from-field="orderHeader.orderId"/>
- </entity-and>
- <iterate list="checkGSPList" entry="checkGSP">
- <if-not-empty field="checkGSP.GSP">
- <if-compare field="checkGSP.GSP" operator="not-equals" value="0">
- <set field="countGSP" value="1"/>
- </if-compare>
- </if-not-empty>
- </iterate>
- <if-compare field="countGSP" operator="equals" value="0">
- <entity-and entity-name="OrderItem" list="orderItemList">
- <field-map field-name="orderId" from-field="orderHeader.orderId"/>
- </entity-and>
-
- <set field="warrantyPrice" value="0" type="BigDecimal"/>
- <iterate list="orderAdjustments" entry="warranty">
- <if-compare field="warranty.orderAdjustmentTypeId" operator="equals" value="WARRANTY_ADJUSTMENT">
- <calculate field="warrantyPrice">
- <calcop field="warrantyPrice" operator="add">
- <calcop field="warranty.amount" operator="get"/>
- </calcop>
- </calculate>
- </if-compare>
- </iterate>
- <calculate field="GSS">
- <calcop field="fact.extShippingAmount" operator="add">
- <calcop field="warrantyPrice" operator="get"/>
- </calcop>
- </calculate>
-
- <set field="convertUomCurrencyMap.uomId" from-field="orderHeader.currencyUom"/>
- <set field="convertUomCurrencyMap.uomIdTo" from-field="accPref.baseCurrencyUomId"/>
- <set field="convertUomCurrencyMap.nowDate" from-field="orderStatus.statusDatetime"/>
- <call-service service-name="convertUomCurrency" in-map-name="convertUomCurrencyMap">
- <result-to-field result-name="conversionFactor" field="exchangeRate"/>
- </call-service>
-
- <if-not-empty field="exchangeRate">
- <calculate field="GSS">
- <calcop field="GSS" operator="multiply">
- <calcop field="exchangeRate" operator="get"/>
- </calcop>
- </calculate>
- </if-not-empty>
- <set field="fact.GSS" from-field="GSS"/>
-
- <set field="fact.GSP" from-field="GSS" type="BigDecimal"/>
- </if-compare>
-
- <!-- GP -->
- <calculate field="fact.GP">
- <calcop field="fact.GMP" operator="add">
- <calcop field="fact.GSP" operator="get"/>
- </calcop>
- </calculate>
-
- <!-- countOrder -->
- <set field="countOrder" value="0"/>
- <entity-and entity-name="SalesOrderItemFact" list="checkCountOrderList">
- <field-map field-name="orderId" from-field="orderHeader.orderId"/>
- </entity-and>
- <iterate list="checkCountOrderList" entry="checkCountOrder">
- <if-not-empty field="checkCountOrder.countOrder">
- <if-compare field="checkCountOrder.countOrder" operator="not-equals" value="0">
- <set field="countOrder" value="1"/>
- </if-compare>
- </if-not-empty>
- </iterate>
- <if-compare field="countOrder" operator="equals" value="0">
- <set field="fact.countOrder" value="1" type="BigDecimal"/>
- </if-compare>
-
- <store-value value-field="fact"/>
- </if-compare>
- </simple-method>
-
- <simple-method method-name="loadSalesOrderDataDaily" short-description="Load Sales Order Data Daily">
- <now-date-to-env field="nowDate"/>
- <set field="yesterday" value="${groovy:
- import java.text.SimpleDateFormat;
- def sdf = new SimpleDateFormat("yyyy-MM-dd 07:00:00.000");
- def yesterday = sdf.format(nowDate-1);
- return yesterday;
- }" type="Timestamp"/>
- <set field="today" value="${groovy:
- import java.text.SimpleDateFormat;
- def sdf = new SimpleDateFormat("yyyy-MM-dd 07:00:00.000");
- def today = sdf.format(nowDate);
- return today;
- }" type="Timestamp"/>
-
- <set field="inMap.fromDate" from-field="yesterday"/>
- <set field="inMap.thruDate" from-field="today"/>
- <call-service service-name="importSalesOrderData" in-map-name="inMap"></call-service>
- </simple-method>
-
- <simple-method method-name="importSalesOrderData" short-description="Import Sales Order Data">
- <set-service-fields service-name="loadDateDimension" map="parameters" to-map="inMap"/>
- <set field="inMap.fromDate" from-field="parameters.fromDate"/>
- <set field="inMap.thruDate" from-field="parameters.thruDate"/>
- <call-service service-name="loadDateDimension" in-map-name="inMap"/>
- <check-errors/>
-
- <entity-condition entity-name="OrderStatus" list="orderStatusList">
- <condition-list combine="and">
- <condition-expr field-name="statusId" value="ORDER_APPROVED"/>
- <condition-expr field-name="statusDatetime" operator="greater-equals" from-field="parameters.fromDate"/>
- <condition-expr field-name="statusDatetime" operator="less" from-field="parameters.thruDate"/>
- </condition-list>
- </entity-condition>
- <iterate list="orderStatusList" entry="orderHeader">
- <clear-field field="inMap"/>
- <set field="inMap.orderId" from-field="orderHeader.orderId"/>
- <call-service service-name="loadSalesOrderFact" in-map-name="inMap"></call-service>
- <check-errors/>
- </iterate>
- </simple-method>
-
- <simple-method method-name="convertUomCurrency" short-description="Convert Uom Currency from UomConversionDated entity">
- <if-empty field="parameters.nowDate">
- <now field="now"/>
- <set field="parameters.nowDate" from-field="now"/>
- </if-empty>
- <entity-condition entity-name="UomConversionDated" list="UomConversionDatedList">
- <condition-list combine="and">
- <condition-expr field-name="uomId" operator="equals" from-field="parameters.uomId"/>
- <condition-expr field-name="uomIdTo" operator="equals" from-field="parameters.uomIdTo"/>
- <condition-expr field-name="fromDate" operator="less-equals" from-field="parameters.nowDate"/>
- <condition-expr field-name="thruDate" operator="greater" from-field="parameters.nowDate"/>
- </condition-list>
- <order-by field-name="-fromDate"/>
- </entity-condition>
- <if-not-empty field="UomConversionDatedList">
- <first-from-list list="UomConversionDatedList" entry="UomConversion"/>
- <field-to-result field="UomConversion.conversionFactor" result-name="conversionFactor"/>
- <else>
- <entity-condition entity-name="UomConversionDated" list="UomConversionDatedLastestList">
- <condition-list combine="and">
- <condition-expr field-name="uomId" operator="equals" from-field="parameters.uomId"/>
- <condition-expr field-name="uomIdTo" operator="equals" from-field="parameters.uomIdTo"/>
- <condition-expr field-name="thruDate" operator="equals" from-field="nullField"/>
- </condition-list>
- </entity-condition>
- <if-not-empty field="UomConversionDatedLastestList">
- <first-from-list list="UomConversionDatedLastestList" entry="UomConversionLastest"/>
- <field-to-result field="UomConversionLastest.conversionFactor" result-name="conversionFactor"/>
- </if-not-empty>
- </else>
- </if-not-empty>
- </simple-method>
-
- <simple-method method-name="loadInventoryFact" short-description="">
- <entity-one entity-name="InventoryItem" value-field="inventory">
- <field-map field-name="inventoryItemId" from-field="parameters.inventoryItemId"/>
- </entity-one>
- <entity-one entity-name="InventoryItemFact" value-field="fact">
- <field-map field-name="inventoryItemId" from-field="parameters.inventoryItemId"/>
- </entity-one>
- <if-empty field="fact">
- <make-value entity-name="InventoryItemFact" value-field="fact"/>
- <set field="fact.inventoryItemId" from-field="inventory.inventoryItemId"/>
- <!-- conversion of the inventory date -->
- <if-not-empty field="inventory.createdStamp">
- <clear-field field="inMap"/>
- <set field="inMap.dimensionEntityName" value="DateDimension"/>
- <set field="inMap.naturalKeyFields.dateValue" from-field="inventory.createdStamp" type="Date"/>
- <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
- <result-to-field result-name="dimensionId" field="fact.inventoryDateDimId"/>
- </call-service>
- <if-empty field="fact.inventoryDateDimId">
- <set field="fact.inventoryDateDimId" value="_NF_"/>
- </if-empty>
- <else>
- <set field="fact.inventoryDateDimId" value="_NA_"/>
- </else>
- </if-not-empty>
- <!-- conversion of the product id -->
- <if-not-empty field="inventory.productId">
- <clear-field field="inMap"/>
- <set field="inMap.dimensionEntityName" value="ProductDimension"/>
- <set field="inMap.naturalKeyFields.productId" from-field="inventory.productId"/>
- <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
- <result-to-field result-name="dimensionId" field="fact.productDimId"/>
- </call-service>
- <if-empty field="fact.productDimId">
- <set field="fact.productDimId" value="_NF_"/>
- </if-empty>
- <else>
- <set field="fact.productDimId" value="_NA_"/>
- </else>
- </if-not-empty>
- <!-- conversion of the order currency -->
- <if-not-empty field="inventory.currencyUomId">
- <clear-field field="inMap"/>
- <set field="inMap.dimensionEntityName" value="CurrencyDimension"/>
- <set field="inMap.naturalKeyFields.currencyId" from-field="inventory.currencyUomId"/>
- <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
- <result-to-field result-name="dimensionId" field="fact.origCurrencyDimId"/>
- </call-service>
- <if-empty field="fact.origCurrencyDimId">
- <set field="fact.origCurrencyDimId" value="_NF_"/>
- </if-empty>
- <else>
- <set field="fact.origCurrencyDimId" value="_NA_"/>
- </else>
- </if-not-empty>
- <create-value value-field="fact"/>
- </if-empty>
-
- <set field="fact.facilityId" from-field="inventory.facilityId"/>
- <set field="fact.inventoryItemId" from-field="inventory.inventoryItemId"/>
- <set field="fact.quantityOnHandTotal" from-field="inventory.quantityOnHandTotal"/>
- <set field="fact.availableToPromiseTotal" from-field="inventory.availableToPromiseTotal"/>
- <set field="fact.unitCost" from-field="inventory.unitCost"/>
-
- <!-- calculate sold out amount -->
- <calculate field="fact.soldoutAmount">
- <calcop operator="get" field="inventory.quantityOnHandTotal">
- <calcop operator="negative" field="inventory.availableToPromiseTotal"/>
- </calcop>
- </calculate>
- <store-value value-field="fact"/>
- </simple-method>
-
-</simple-methods>
diff --git a/bi/servicedef/services.xml b/bi/servicedef/services.xml
index 163a1e6..17c4dc8 100644
--- a/bi/servicedef/services.xml
+++ b/bi/servicedef/services.xml
@@ -85,8 +85,8 @@ under the License.
</service>
<!-- Accounting Facts -->
- <service name="loadSalesInvoiceItemFact" auth="true" engine="simple"
- location="component://bi/minilang/FactServices.xml" invoke="loadSalesInvoiceItemFact">
+ <service name="loadSalesInvoiceItemFact" auth="true" engine="groovy"
+ location="component://bi/groovyScripts/FactServices.groovy" invoke="loadSalesInvoiceItemFact">
<description>
Pulls information from the Invoice* entities and stores them in the SalesInvoiceItem entity (olap entity).
One of invoiceId/invoiceItemSeqId or invoice/invoiceItem must be passed or an error is returned.
@@ -96,15 +96,15 @@ under the License.
<attribute name="invoice" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"/>
<attribute name="invoiceItem" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"/>
</service>
- <service name="loadSalesInvoiceFact" auth="true" engine="simple"
- location="component://bi/minilang/FactServices.xml" invoke="loadSalesInvoiceFact">
+ <service name="loadSalesInvoiceFact" auth="true" engine="groovy"
+ location="component://bi/groovyScripts/FactServices.groovy" invoke="loadSalesInvoiceFact">
<description>Calls the loadSalesInvoiceItemFact service for all the invoice items.</description>
<attribute name="invoiceId" type="String" mode="IN" optional="false"/>
</service>
<!-- Order Facts -->
- <service name="loadSalesOrderItemFact" auth="true" engine="simple"
- location="component://bi/minilang/FactServices.xml" invoke="loadSalesOrderItemFact">
+ <service name="loadSalesOrderItemFact" auth="true" engine="groovy"
+ location="component://bi/groovyScripts/FactServices.groovy" invoke="loadSalesOrderItemFact">
<description>
Pulls information from the OrderItem* entities and stores them in the SalesOrderItem entity (olap entity).
One of orderId/orderItemSeqId or order/orderItem must be passed or an error is returned.
@@ -115,23 +115,23 @@ under the License.
<attribute name="orderItem" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"/>
<attribute name="orderAdjustment " type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"/>
</service>
- <service name="loadSalesOrderFact" auth="true" engine="simple"
- location="component://bi/minilang/FactServices.xml" invoke="loadSalesOrderFact">
+ <service name="loadSalesOrderFact" auth="true" engine="groovy"
+ location="component://bi/groovyScripts/FactServices.groovy" invoke="loadSalesOrderFact">
<description>Calls the loadSalesOrderItemFact service for all the order items.</description>
<attribute name="orderId" type="String" mode="IN" optional="false"/>
</service>
- <service name="loadSalesOrderDataDaily" auth="true" engine="simple"
- location="component://bi/minilang/FactServices.xml" invoke="loadSalesOrderDataDaily" transaction-timeout="10000000">
+ <service name="loadSalesOrderDataDaily" auth="true" engine="groovy"
+ location="component://bi/groovyScripts/FactServices.groovy" invoke="loadSalesOrderDataDaily" transaction-timeout="10000000">
<description>Load Sales Order Data Daily.</description>
</service>
- <service name="importSalesOrderData" auth="true" engine="simple"
- location="component://bi/minilang/FactServices.xml" invoke="importSalesOrderData" transaction-timeout="10000000">
+ <service name="importSalesOrderData" auth="true" engine="groovy"
+ location="component://bi/groovyScripts/FactServices.groovy" invoke="importSalesOrderData" transaction-timeout="10000000">
<description>Import Sales Order Data.</description>
<attribute name="fromDate" type="Timestamp" mode="IN" optional="false"/>
<attribute name="thruDate" type="Timestamp" mode="IN" optional="false"/>
</service>
- <service name="convertUomCurrency" auth="true" engine="simple"
- location="component://bi/minilang/FactServices.xml" invoke="convertUomCurrency">
+ <service name="convertUomCurrency" auth="true" engine="groovy"
+ location="component://bi/groovyScripts/FactServices.groovy" invoke="convertUomCurrency">
<description>Import Sales Order Data.</description>
<attribute name="uomId" type="String" mode="IN"/>
<attribute name="uomIdTo" type="String" mode="IN"/>
@@ -140,8 +140,8 @@ under the License.
</service>
<!-- Inventory Facts -->
- <service name="loadInventoryFact" auth="true" engine="simple"
- location="component://bi/minilang/FactServices.xml" invoke="loadInventoryFact">
+ <service name="loadInventoryFact" auth="true" engine="groovy"
+ location="component://bi/groovyScripts/FactServices.groovy" invoke="loadInventoryFact">
<attribute name="inventoryItemId" type="String" mode="IN" optional="true"/>
</service>