/*
 * 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.condition.*

shipmentId = parameters.shipmentId;
if (!shipmentId) {
    shipmentId = request.getAttribute("shipmentId");
}
shipment = delegator.findOne("Shipment", [shipmentId : shipmentId], false);

context.shipmentId = shipmentId;
context.shipment = shipment;

if (shipment) {
    context.shipmentType = shipment.getRelatedOne("ShipmentType", false);
    context.statusItem = shipment.getRelatedOne("StatusItem", false);
    context.primaryOrderHeader = shipment.getRelatedOne("PrimaryOrderHeader", false);
    context.toPerson = shipment.getRelatedOne("ToPerson", false);
    context.toPartyGroup = shipment.getRelatedOne("ToPartyGroup", false);
    context.fromPerson = shipment.getRelatedOne("FromPerson", false);
    context.fromPartyGroup = shipment.getRelatedOne("FromPartyGroup", false);
    context.originFacility = shipment.getRelatedOne("OriginFacility", false);
    context.destinationFacility = shipment.getRelatedOne("DestinationFacility", false);
    context.originPostalAddress = shipment.getRelatedOne("OriginPostalAddress", false);
    context.destinationPostalAddress = shipment.getRelatedOne("DestinationPostalAddress", false);
}

// check permission
hasPermission = false;
if (security.hasEntityPermission("FACILITY", "_VIEW", userLogin)) {
    hasPermission = true;
} else {
    if (shipment) {
        if (shipment.primaryOrderId) {
            // allow if userLogin is associated with the primaryOrderId with the SUPPLIER_AGENT roleTypeId
            orderRoleCheckMap = [orderId : shipment.primaryOrderId, partyId : userLogin.partyId, roleTypeId : 'SUPPLIER_AGENT'];
            orderRole = delegator.findOne("OrderRole", orderRoleCheckMap, false);
            if (orderRole) {
                hasPermission = true;
            }
        }
    }
}
context.hasPermission = hasPermission;
