def loadSalesInvoiceItemFact()

in bi/src/main/groovy/org/apache/ofbiz/bi/FactServices.groovy [52:181]


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()
}