in bi/src/main/groovy/org/apache/ofbiz/bi/FactServices.groovy [51:170]
Map loadSalesInvoiceItemFact() {
GenericValue invoice = parameters.invoice
GenericValue invoiceItem = parameters.invoiceItem
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 (invoice.invoiceTypeId == 'SALES_INVOICE') {
GenericValue fact = from('SalesInvoiceItemFact')
.where(invoiceId: invoiceItem.invoiceId, invoiceItemSeqId: invoiceItem.invoiceItemSeqId)
.queryOne()
// key handling
if (!fact) {
Map inMap
Map naturalKeyFields
Map serviceResult
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
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
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
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
}
// taxes
List taxes = delegator.getRelated('ChildrenInvoiceItem', null, null, invoiceItem, false)
for (GenericValue tax : taxes) {
if (tax.amount) {
fact.extTaxAmount = fact.extTaxAmount + tax.amount
}
}
// discounts
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()
}