/*
 * 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 org.apache.ofbiz.entity.*
import org.apache.ofbiz.entity.condition.*
import org.apache.ofbiz.entity.transaction.*

action = request.getParameter("action")

inventoryItemTotals = []
qohGrandTotal = 0.0
atpGrandTotal = 0.0
costPriceGrandTotal = 0.0
retailPriceGrandTotal = 0.0
totalCostPriceGrandTotal = 0.0
totalRetailPriceGrandTotal = 0.0
boolean beganTransaction = false
searchParameterString = "action=Y&facilityId=" + facilityId
if (action) {
    conditions = [EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "INV_DELIVERED")]
    conditions.add(EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, null))
    conditionList = EntityCondition.makeCondition(conditions, EntityOperator.OR)
    try {
        beganTransaction = TransactionUtil.begin()
        invItemListItr = from("InventoryItem").where(conditionList).orderBy("productId").queryIterator()
        while ((inventoryItem = invItemListItr.next()) != null) {
            productId = inventoryItem.productId
            product = from("Product").where("productId", productId).queryOne()
            productFacility = from("ProductFacility").where("productId", productId, "facilityId", facilityId).queryOne()
            if (productFacility) {
                quantityOnHandTotal = inventoryItem.getDouble("quantityOnHandTotal")
                availableToPromiseTotal = inventoryItem.getDouble("availableToPromiseTotal")
                costPrice = inventoryItem.getDouble("unitCost")
                retailPrice = 0.0
                totalCostPrice = 0.0
                totalRetailPrice = 0.0
                productPrices = product.getRelated("ProductPrice", null, null, false)
                if (productPrices) {
                    productPrices.each { productPrice ->
                        if (("DEFAULT_PRICE").equals(productPrice.productPriceTypeId)) {
                            retailPrice = productPrice.getDouble("price")
                        }
                    }
                }
                if (costPrice && quantityOnHandTotal) {
                    totalCostPrice = costPrice * quantityOnHandTotal
                    totalCostPriceGrandTotal += totalCostPrice
                }
                if (retailPrice && quantityOnHandTotal) {
                    totalRetailPrice = retailPrice * quantityOnHandTotal
                    totalRetailPriceGrandTotal += totalRetailPrice
                }
                if (quantityOnHandTotal) {
                    qohGrandTotal += quantityOnHandTotal
                }
                if (availableToPromiseTotal) {
                    atpGrandTotal += availableToPromiseTotal
                }
                if (costPrice) {
                    costPriceGrandTotal += costPrice
                }
                if (retailPrice) {
                    retailPriceGrandTotal += retailPrice
                }

                resultMap = [productId : product.productId, quantityOnHand : quantityOnHandTotal, availableToPromise : availableToPromiseTotal,
                             costPrice : costPrice, retailPrice : retailPrice, totalCostPrice : totalCostPrice, totalRetailPrice : totalRetailPrice]
                inventoryItemTotals.add(resultMap)
            }
        }
        invItemListItr.close()
    } catch (GenericEntityException e) {
        errMsg = "Failure in operation, rolling back transaction"
        Debug.logError(e, errMsg, "findInventoryItemsByLabels")
        try {
            // only rollback the transaction if we started one...
            TransactionUtil.rollback(beganTransaction, errMsg, e)
        } catch (GenericEntityException e2) {
            Debug.logError(e2, "Could not rollback transaction: " + e2.toString(), "findInventoryItemsByLabels")
        }
        // after rolling back, rethrow the exception
        throw e
    } finally {
        // only commit the transaction if we started one... this will throw an exception if it fails
        TransactionUtil.commit(beganTransaction)
    }

}

inventoryItemGrandTotals = []
inventoryItemGrandTotals.add([qohGrandTotal : qohGrandTotal, atpGrandTotal : atpGrandTotal,
                              totalCostPriceGrandTotal : totalCostPriceGrandTotal, totalRetailPriceGrandTotal : totalRetailPriceGrandTotal])

context.searchParameterString = searchParameterString
context.inventoryItemTotals = inventoryItemTotals
context.inventoryItemGrandTotals = inventoryItemGrandTotals
