blob: a519fc5bceec2f7485b021e91161ba016c0ae01b [file] [log] [blame]
/*
* 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 (!fact.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 = invoiceItem.quantity as BigDecimal
fact.extGrossAmount = 0 as BigDecimal
fact.extDiscountAmount = 0 as BigDecimal
fact.extTaxAmount = 0 as BigDecimal
fact.extNetAmount = 0 as BigDecimal
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 = 0 as BigDecimal
fact.extManVarCost = 0 as BigDecimal
fact.extStorageCost = 0 as BigDecimal
fact.extDistributionCost = 0 as BigDecimal
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 = orderItem.quantity as BigDecimal
fact.extGrossAmount = 0 as BigDecimal
fact.extGrossCost = 0 as BigDecimal
fact.extDiscountAmount = 0 as BigDecimal
fact.extNetAmount = 0 as BigDecimal
fact.extShippingAmount = 0 as BigDecimal
fact.extTaxAmount = 0 as BigDecimal
fact.GS = 0 as BigDecimal
fact.GMS = 0 as BigDecimal
fact.GMP = 0 as BigDecimal
fact.GSS = 0 as BigDecimal
fact.GSC = 0 as BigDecimal
fact.GSP = 0 as BigDecimal
fact.GP = 0 as BigDecimal
fact.countOrder = 0 as BigDecimal
// 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: 0 as BigDecimal)
.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 = 0 as BigDecimal
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 = 0 as BigDecimal
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 = 0 as BigDecimal
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 = GSS as BigDecimal
}
// GP
fact.GP = fact.GMP + fact.GSP
// countOrder
BigDecimal countOrder = 0 as BigDecimal
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 = 1 as BigDecimal
}
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()
}