blob: 28e0921836ec44e0d7b07ef1d5b4099985763924 [file] [log] [blame]
/*
* 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.condition.EntityCondition
shipmentId = request.getParameter("shipmentId")
orderId = request.getParameter("orderId")
shipGroupSeqId = request.getParameter("shipGroupSeqId")
if (!shipmentId) {
shipmentId = context.shipmentId
}
action = request.getParameter("action")
shipment = null
if (shipmentId) {
shipment = from("Shipment").where("shipmentId", shipmentId).queryOne()
}
// **************************************
// Order Items are searched also by shipGroupSeqId and put in orderItemShipGroupAssocs
// **************************************
orderItemShipGroupAssocs = null
// **************************************
// Search method: search by productId
// **************************************
if (action && orderId) {
if (shipGroupSeqId) {
orderItemShipGroupAssocs = from("OrderItemShipGroupAssoc").where("orderId", orderId, "shipGroupSeqId", shipGroupSeqId).queryList()
} else {
orderItemShipGroupAssocs = from("OrderItemShipGroupAssoc").where("orderId", orderId).queryList()
}
}
// **************************************
// ShipmentPlan list form
// **************************************
totWeight = 0
totVolume = 0
shipmentPlans = null
shipmentPlansIt = null
rows = [] as ArrayList
if (shipment) {
shipmentPlans = from("OrderShipment").where("shipmentId", shipment.shipmentId).queryList()
}
if (shipmentPlans) {
shipmentPlans.each { shipmentPlan ->
oneRow = new HashMap(shipmentPlan)
orderItem = shipmentPlan.getRelatedOne("OrderItem", false)
oneRow.productId = orderItem.productId
orderedQuantity = orderItem.getDouble("quantity")
canceledQuantity = orderItem.getDouble("cancelQuantity")
if (canceledQuantity) {
orderedQuantity = Double.valueOf(orderedQuantity.doubleValue() - canceledQuantity.doubleValue())
}
oneRow.totOrderedQuantity = orderedQuantity.intValue()
// Total quantity issued
issuedQuantity = 0.0
qtyIssuedInShipment = [:]
issuances = orderItem.getRelated("ItemIssuance", null, null, false)
issuances.each { issuance ->
if (issuance.quantity) {
issuedQuantity += issuance.getDouble("quantity")
if (issuance.cancelQuantity) {
issuedQuantity -= issuance.getDouble("cancelQuantity")
}
if (qtyIssuedInShipment.containsKey(issuance.shipmentId)) {
qtyInShipment = ((Double)qtyIssuedInShipment.get(issuance.shipmentId)).doubleValue()
qtyInShipment += issuance.getDouble("quantity")
if (issuance.cancelQuantity) {
qtyInShipment -= issuance.getDouble("cancelQuantity")
}
qtyIssuedInShipment.put(issuance.shipmentId, qtyInShipment)
} else {
qtyInShipment = issuance.getDouble("quantity")
if (issuance.cancelQuantity) {
qtyInShipment -= issuance.getDouble("cancelQuantity")
}
qtyIssuedInShipment.put(issuance.shipmentId, qtyInShipment)
}
}
}
oneRow.totIssuedQuantity = issuedQuantity
// Total quantity planned not issued
plannedQuantity = 0.0
qtyPlannedInShipment = [:]
plans = from("OrderShipment").where("orderId", orderItem.orderId, "orderItemSeqId", orderItem.orderItemSeqId).queryList()
plans.each { plan ->
if (plan.quantity) {
netPlanQty = plan.getDouble("quantity")
if (qtyIssuedInShipment.containsKey(plan.shipmentId)) {
qtyInShipment = ((Double)qtyIssuedInShipment.get(plan.shipmentId)).doubleValue()
if (netPlanQty > qtyInShipment) {
netPlanQty -= qtyInShipment
} else {
netPlanQty = 0
}
}
plannedQuantity += netPlanQty
if (qtyPlannedInShipment.containsKey(plan.shipmentId)) {
qtyInShipment = ((Double)qtyPlannedInShipment.get(plan.shipmentId)).doubleValue()
qtyInShipment += netPlanQty
qtyPlannedInShipment.put(plan.shipmentId, qtyInShipment)
} else {
qtyPlannedInShipment.put(plan.shipmentId, netPlanQty)
}
}
}
oneRow.totPlannedQuantity = plannedQuantity
if (qtyIssuedInShipment.containsKey(shipmentId)) {
oneRow.issuedQuantity = qtyIssuedInShipment.get(shipmentId)
} else {
oneRow.issuedQuantity = ""
}
// Reserved and Not Available quantity
reservedQuantity = 0.0
reservedNotAvailable = 0.0
reservations = orderItem.getRelated("OrderItemShipGrpInvRes", null, null, false)
reservations.each { reservation ->
if (reservation.quantity) {
reservedQuantity += reservation.getDouble("quantity")
}
if (reservation.quantityNotAvailable) {
reservedNotAvailable += reservation.getDouble("quantityNotAvailable")
}
}
oneRow.notAvailableQuantity = reservedNotAvailable
// Planned Weight and Volume
product = orderItem.getRelatedOne("Product", false)
weight = 0.0
quantity = 0.0
if (shipmentPlan.getDouble("quantity")) {
quantity = shipmentPlan.getDouble("quantity")
}
if (product.getDouble("productWeight")) {
weight = product.getDouble("productWeight") * quantity
}
oneRow.weight = weight
if (product.weightUomId) {
weightUom = from("Uom").where("uomId", product.weightUomId).queryOne()
oneRow.weightUom = weightUom.abbreviation
}
volume = 0.0
if (product.getDouble("productHeight") &&
product.getDouble("productWidth") &&
product.getDouble("productDepth")) {
// TODO: check if uom conversion is needed
volume = product.getDouble("productHeight") *
product.getDouble("productWidth") *
product.getDouble("productDepth") *
quantity
}
oneRow.volume = volume
if (product.heightUomId && product.widthUomId && product.depthUomId) {
heightUom = from("Uom").where("uomId", product.heightUomId).cache(true).queryOne()
widthUom = from("Uom").where("uomId", product.widthUomId).cache(true).queryOne()
depthUom = from("Uom").where("uomId", product.depthUomId).cache(true).queryOne()
oneRow.volumeUom = heightUom.abbreviation + "x" + widthUom.abbreviation + "x" + depthUom.abbreviation
}
totWeight += weight
totVolume += volume
rows.add(oneRow)
}
}
// **************************************
// ShipmentPlan add form
// **************************************
addRows = [] as ArrayList
if (orderItemShipGroupAssocs) {
orderItemShipGroupAssocs.each { orderItemShipGroupAssoc ->
orderItem = orderItemShipGroupAssoc.getRelatedOne("OrderItem", false)
oneRow = [:]
oneRow.shipmentId = shipmentId
oneRow.orderId = orderItemShipGroupAssoc.orderId
oneRow.orderItemSeqId = orderItemShipGroupAssoc.orderItemSeqId
oneRow.shipGroupSeqId = orderItemShipGroupAssoc.shipGroupSeqId
oneRow.productId = orderItem.productId
orderedQuantity = orderItemShipGroupAssoc.getDouble("quantity")
canceledQuantity = orderItemShipGroupAssoc.getDouble("cancelQuantity")
if (canceledQuantity) {
orderedQuantity = Double.valueOf(orderedQuantity.doubleValue() - canceledQuantity.doubleValue())
}
oneRow.orderedQuantity = orderedQuantity
// Total quantity issued
issuedQuantity = 0.0
qtyIssuedInShipment = [:]
issuances = orderItem.getRelated("ItemIssuance", null, null, false)
issuances.each { issuance ->
if (issuance.quantity) {
issuedQuantity += issuance.getDouble("quantity")
if (issuance.cancelQuantity) {
issuedQuantity -= issuance.getDouble("cancelQuantity")
}
if (qtyIssuedInShipment.containsKey(issuance.shipmentId)) {
qtyInShipment = ((Double)qtyIssuedInShipment.get(issuance.shipmentId)).doubleValue()
qtyInShipment += issuance.getDouble("quantity")
qtyIssuedInShipment.put(issuance.shipmentId, qtyInShipment)
} else {
qtyInShipment = issuance.getDouble("quantity")
if (issuance.cancelQuantity) {
qtyInShipment -= issuance.getDouble("cancelQuantity")
}
qtyIssuedInShipment.put(issuance.shipmentId, qtyInShipment)
}
}
}
oneRow.issuedQuantity = issuedQuantity
// Total quantity planned not issued
plannedQuantity = 0.0
EntityCondition orderShipmentCondition = null
if (shipGroupSeqId) {
orderShipmentCondition = EntityCondition.makeCondition([orderId : orderItemShipGroupAssoc.orderId, orderItemSeqId : orderItemShipGroupAssoc.orderItemSeqId, shipGroupSeqId : orderItemShipGroupAssoc.shipGroupSeqId])
} else {
orderShipmentCondition = EntityCondition.makeCondition([orderId : orderItemShipGroupAssoc.orderId, orderItemSeqId : orderItemShipGroupAssoc.orderItemSeqId])
}
plans = from("OrderShipment").where(orderShipmentCondition).queryList()
plans.each { plan ->
if (plan.quantity) {
netPlanQty = plan.getDouble("quantity")
plannedQuantity += netPlanQty
}
}
oneRow.plannedQuantity = plannedQuantity
// (default) quantity for plan
planQuantity = (orderedQuantity - plannedQuantity - issuedQuantity > 0? orderedQuantity - plannedQuantity - issuedQuantity: 0)
oneRow.quantity = planQuantity
// Planned (unitary) Weight and Volume
weight = new Double(0)
product = orderItem.getRelatedOne("Product", false)
if (product.getDouble("productWeight")) {
weight = product.getDouble("productWeight")
}
oneRow.weight = weight
if (product.weightUomId) {
weightUom = from("Uom").where("uomId", product.weightUomId).cache(true).queryOne()
oneRow.weightUom = weightUom.abbreviation
}
volume = 0.0
if (product.getDouble("productHeight") && product.getDouble("productWidth") && product.getDouble("productDepth")) {
// TODO: check if uom conversion is needed
volume = product.getDouble("productHeight") *
product.getDouble("productWidth") *
product.getDouble("productDepth")
}
oneRow.volume = volume
if (product.heightUomId && product.widthUomId && product.depthUomId) {
heightUom = from("Uom").where("uomId", product.heightUomId).cache(true).queryOne()
widthUom = from("Uom").where("uomId", product.widthUomId).cache(true).queryOne()
depthUom = from("Uom").where("uomId", product.depthUomId).cache(true).queryOne()
oneRow.volumeUom = heightUom.abbreviation + "x" + widthUom.abbreviation + "x" + depthUom.abbreviation
}
addRows.add(oneRow)
}
}
context.listShipmentPlanRows = rows
context.addToShipmentPlanRows = addRows
context.rowCount = addRows.size()
context.shipmentId = shipmentId
context.shipment = shipment
context.totWeight = totWeight
context.totVolume = totVolume