/*
 * 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.base.util.*

inventoryStock = [:]
shipmentId = parameters.shipmentId
shipment = from("Shipment").where("shipmentId", shipmentId).queryOne()

context.shipmentIdPar = shipment.shipmentId
context.estimatedReadyDatePar = shipment.estimatedReadyDate
context.estimatedShipDatePar = shipment.estimatedShipDate
records = []
if (shipment) {
    shipmentPlans = from("OrderShipment").where("shipmentId", shipmentId).queryList()
    shipmentPlans.each { shipmentPlan ->
        orderLine = from("OrderItem").where("orderId", shipmentPlan.orderId , "orderItemSeqId", shipmentPlan.orderItemSeqId).queryOne()
        recordGroup = [:]
        recordGroup.ORDER_ID = shipmentPlan.orderId
        recordGroup.ORDER_ITEM_SEQ_ID = shipmentPlan.orderItemSeqId
        recordGroup.SHIPMENT_ID = shipmentPlan.shipmentId
        recordGroup.SHIPMENT_ITEM_SEQ_ID = shipmentPlan.shipmentItemSeqId

        recordGroup.PRODUCT_ID = orderLine.productId
        recordGroup.QUANTITY = shipmentPlan.quantity
        product = from("Product").where("productId", orderLine.productId).queryOne()
        recordGroup.PRODUCT_NAME = product.internalName

        inputPar = [productId : orderLine.productId,
                                     quantity : shipmentPlan.quantity,
                                     fromDate : "" + new Date(),
                                     userLogin: userLogin]

        result = [:]
        result = runService('getNotAssembledComponents',inputPar)
        if (result) {
            components = (List)result.get("notAssembledComponents")
        }
        components.each { oneComponent ->
            record = new HashMap(recordGroup)
            record.componentId = oneComponent.getProduct().productId
            record.componentName = oneComponent.getProduct().internalName
            record.componentQuantity = new Float(oneComponent.getQuantity())
            facilityId = shipment.originFacilityId
            float qty = 0
            if (facilityId) {
                if (!inventoryStock.containsKey(oneComponent.getProduct().productId)) {
                    serviceInput = [productId : oneComponent.getProduct().productId , facilityId : facilityId]
                    serviceOutput = runService('getInventoryAvailableByFacility',serviceInput)
                    qha = serviceOutput.quantityOnHandTotal ?: 0.0
                    inventoryStock.put(oneComponent.getProduct().productId, qha)
                }
                qty = inventoryStock[oneComponent.getProduct().productId]
                qty = qty - oneComponent.getQuantity()
                inventoryStock.put(oneComponent.getProduct().productId, qty)
            }
            record.componentOnHand = qty
            // Now we get the products qty already reserved by production runs
            serviceInput = [productId : oneComponent.getProduct().productId,
                                          userLogin : userLogin]
            serviceOutput = runService('getProductionRunTotResQty', serviceInput)
            resQty = serviceOutput.reservedQuantity
            record.reservedQuantity = resQty
            records.add(record)
        }
    }
    context.records = records

    // check permission
    hasPermission = false
    if (security.hasEntityPermission("MANUFACTURING", "_VIEW", session)) {
        hasPermission = true
    }
    context.hasPermission = hasPermission
}

return "success"
