/*
 * 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.ofbiz.entity.*;
import org.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";
