Map loadSalesInvoiceItemFact()

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