/*
 * 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.GenericValue;

shipmentId = parameters.shipmentId;
shipment = delegator.findOne("Shipment", [shipmentId : shipmentId], false);

context.shipmentIdPar = shipment.shipmentId;
context.date = new Date();
Double fixedAssetTime = new Double(0);
records = [];
if (shipment) {
    shipmentPlans = delegator.findByAnd("OrderShipment", [shipmentId : shipmentId], null, false);
    shipmentPlans.each { shipmentPlan ->
        productionRuns = delegator.findByAnd("WorkOrderItemFulfillment", [orderId : shipmentPlan.orderId, orderItemSeqId : shipmentPlan.orderItemSeqId] , ["workEffortId"], false); // TODO: add shipmentId
        if (productionRuns) {
            productionRuns.each { productionRun ->
                productionRunProduct = [:];
                productionRunProducts = delegator.findByAnd("WorkEffortGoodStandard", [workEffortId : productionRun.workEffortId , workEffortGoodStdTypeId : "PRUN_PROD_DELIV", statusId : "WEGS_CREATED"], null, false);
                if (productionRunProducts) {
                    productionRunProduct = ((GenericValue)productionRunProducts.get(0)).getRelatedOne("Product", false);
                }
                tasks = delegator.findByAnd("WorkEffort", [workEffortParentId : productionRun.workEffortId, workEffortTypeId : "PROD_ORDER_TASK"], null, false);
                tasks.each { task ->
                    record = [:];
                    record.productId = productionRunProduct.productId;
                    record.productName = productionRunProduct.internalName;
                    record.fixedAssetId = task.fixedAssetId;
                    record.priority = task.getLong("priority");
                    record.workEffortId = productionRun.workEffortId;
                    record.taskId = task.workEffortId;
                    record.taskName = task.workEffortName;
                    record.taskDescription = task.description;
                    record.taskEstimatedTime = task.getDouble("estimatedMilliSeconds");
                    record.taskEstimatedSetup = task.getDouble("estimatedSetupMillis");
                    records.add(record);
                    if(task.getDouble("estimatedMilliSeconds") != null){
                        fixedAssetTime = fixedAssetTime + task.getDouble("estimatedMilliSeconds");
                    }
                }
            }
        }
    }
    context.fixedAssetTime = fixedAssetTime;
    context.records = records;

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

return "success";
