/*
 * 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.util.EntityUtil;
import org.ofbiz.order.order.OrderReadHelper;

shipmentId = parameters.shipmentId;
shipment = from("Shipment").where("shipmentId", shipmentId).queryOne();

context.shipmentIdPar = shipment.shipmentId;

if (shipment) {
    shipmentPackages = from("ShipmentPackage").where("shipmentId", shipmentId).queryList();
    records = [];
    orderReaders = [:];
    shipmentPackages.each { shipmentPackage ->
        shipmentPackageComponents = from("ShipmentPackageContent").where("shipmentId", shipmentId, "shipmentPackageSeqId", shipmentPackage.shipmentPackageSeqId).queryList();;
        shipmentPackageComponents.each { shipmentPackageComponent ->
            shipmentItem = shipmentPackageComponent.getRelatedOne("ShipmentItem", false);
            orderShipments = shipmentItem.getRelated("OrderShipment", null, null, false);
            orderShipment = EntityUtil.getFirst(orderShipments);

            String orderId = null;
            String orderItemSeqId = null;
            if (orderShipment) {
                orderId = orderShipment.orderId;
                orderItemSeqId = orderShipment.orderItemSeqId;
            }

            record = [:];
            if (shipmentPackageComponent.subProductId) {
                record.productId = shipmentPackageComponent.subProductId;
                record.quantity = shipmentPackageComponent.subQuantity;
            } else {
                record.productId = shipmentItem.productId;
                record.quantity = shipmentPackageComponent.quantity;
            }
            record.shipmentPackageSeqId = shipmentPackageComponent.shipmentPackageSeqId;
            record.orderId = orderId;
            record.orderItemSeqId = orderItemSeqId;
            product = from("Product").where("productId", record.productId).queryOne();
            record.productName = product.internalName;
            record.shipDate = shipment.estimatedShipDate;
            // ---
            orderReadHelper = null;
            if (orderReaders.containsKey(orderId)) {
                orderReadHelper = (OrderReadHelper)orderReaders.get(orderId);
            } else {
                orderHeader = from("OrderHeader").where("orderId", orderId).queryOne();
                orderReadHelper = new OrderReadHelper(orderHeader);
                orderReaders.put(orderId, orderReadHelper);
            }
            displayParty = orderReadHelper.getPlacingParty();
            shippingAddress = orderReadHelper.getShippingAddress();
            record.shippingAddressName = shippingAddress.toName;
            record.shippingAddressAddress = shippingAddress.address1;
            record.shippingAddressCity = shippingAddress.city;
            record.shippingAddressPostalCode = shippingAddress.postalCode;
            record.shippingAddressCountry = shippingAddress.countryGeoId;
            records.add(record);
        }
    }
    context.records = records;

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

return "success";
