blob: 433263aaa8c164fa97cb542a7f4e9861522f0bd8 [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.
*/
// The only required parameter is "productionRunId".
// The "actionForm" parameter triggers actions (see "ProductionRunSimpleEvents.xml").
import org.apache.ofbiz.entity.util.EntityUtil
import org.apache.ofbiz.entity.GenericValue
import org.apache.ofbiz.manufacturing.jobshopmgt.ProductionRun
productionRunId = parameters.productionRunId ?: parameters.workEffortId
if (productionRunId) {
ProductionRun productionRun = new ProductionRun(productionRunId, delegator, dispatcher)
if (productionRun.exist()) {
productionRunId = productionRun.getGenericValue().workEffortId
context.productionRunId = productionRunId
context.productionRun = productionRun.getGenericValue()
// Find all the order items to which this production run is linked.
orderItems = from("WorkOrderItemFulfillment").where("workEffortId", productionRunId).queryList()
if (orderItems) {
context.orderItems = orderItems
}
quantityToProduce = productionRun.getGenericValue().get("quantityToProduce") ?: 0.0
// Find the inventory items produced
inventoryItems = from("WorkEffortInventoryProduced").where("workEffortId", productionRunId).queryList()
context.inventoryItems = inventoryItems
if (inventoryItems) {
lastWorkEffortInventoryProduced = (GenericValue)inventoryItems.get(inventoryItems.size() - 1)
lastInventoryItem = lastWorkEffortInventoryProduced.getRelatedOne("InventoryItem", false)
context.lastLotId = lastInventoryItem.lotId
}
// Find if the production run can produce inventory.
quantityProduced = productionRun.getGenericValue().quantityProduced ?: 0.0
quantityRejected = productionRun.getGenericValue().quantityRejected ?: 0.0
lastTask = productionRun.getLastProductionRunRoutingTask()
quantityDeclared = lastTask ? (lastTask.quantityProduced ?: 0.0) : 0.0
context.canDeclareAndProduce = "N"
if (lastTask && ("PRUN_RUNNING".equals(lastTask.currentStatusId) || "PRUN_COMPLETED".equals(lastTask.currentStatusId))) {
context.canDeclareAndProduce = "Y"
}
maxQuantity = quantityDeclared - quantityProduced
productionRunData = [:]
productionRunData.workEffortId = productionRunId
productionRunData.productId = productionRun.getProductProduced().productId
productionRunData.product = productionRun.getProductProduced()
if (maxQuantity > 0 && !"WIP".equals(productionRun.getProductProduced().productTypeId)) {
productionRunData.quantity = maxQuantity
context.canProduce = "Y"
}
productionRunData.quantityToProduce = quantityToProduce
productionRunData.quantityProduced = quantityProduced
productionRunData.quantityRejected = quantityRejected
productionRunData.quantityRemaining = quantityToProduce - quantityProduced
productionRunData.estimatedCompletionDate = productionRun.getEstimatedCompletionDate()
productionRunData.productionRunName = productionRun.getProductionRunName()
productionRunData.description = productionRun.getDescription()
productionRunData.estimatedStartDate = productionRun.getEstimatedStartDate()
productionRunData.actualStartDate = productionRun.getGenericValue().getTimestamp("actualStartDate")
productionRunData.actualCompletionDate = productionRun.getGenericValue().getTimestamp("actualCompletionDate")
productionRunData.currentStatusId = productionRun.getGenericValue().currentStatusId
productionRunData.facilityId = productionRun.getGenericValue().facilityId
manufacturer = from("WorkEffortPartyAssignment").where("workEffortId", productionRunId, "roleTypeId", "MANUFACTURER").filterByDate().queryFirst()
if (manufacturer){
productionRunData.manufacturerId = manufacturer.partyId
}
context.productionRunData = productionRunData
actionForm = parameters.actionForm ?: "beforeActionProductionRun"
context.actionForm = actionForm
//---------------
// Routing tasks
//---------------
// routingTask update sub-screen
routingTaskId = parameters.routingTaskId
if (routingTaskId && (actionForm.equals("UpdateRoutingTask") || actionForm.equals("EditRoutingTask"))) {
routingTask = from("WorkEffort").where("workEffortId", routingTaskId).queryOne()
Map routingTaskData = routingTask.getAllFields()
routingTaskData.estimatedSetupMillis = routingTask.getDouble("estimatedSetupMillis")
routingTaskData.estimatedMilliSeconds = routingTask.getDouble("estimatedMilliSeconds")
context.routingTaskData = routingTaskData
routingTaskData.partyId = userLogin.partyId
context.routingTaskId = routingTaskId
// Get the list of deliverable products, i.e. the WorkEffortGoodStandard entries
// with workEffortGoodStdTypeId = "PRUNT_PROD_DELIV":
// first of all we get the template task (the routing task)
templateTaskAssoc = from("WorkEffortAssoc").where("workEffortIdTo", routingTask.workEffortId, "workEffortAssocTypeId", "WORK_EFF_TEMPLATE").filterByDate().queryFirst()
templateTask = [:]
if (templateTaskAssoc) {
templateTask = templateTaskAssoc.getRelatedOne("FromWorkEffort", false)
}
delivProducts = []
if (templateTask) {
delivProducts = EntityUtil.filterByDate(templateTask.getRelated("WorkEffortGoodStandard", [workEffortGoodStdTypeId : "PRUNT_PROD_DELIV"], null, false))
}
context.delivProducts = delivProducts
// Get the list of delivered products, i.e. inventory items
prunInventoryProduced = from("WorkEffortAndInventoryProduced").where("workEffortId", routingTaskId).queryList()
context.prunInventoryProduced = prunInventoryProduced
}
// RoutingTasks list
List productionRunRoutingTasks = productionRun.getProductionRunRoutingTasks()
String startTaskId = null // which production run task is ready to start and has the [Start] buton next to it
String issueTaskId = null // which production run task is ready to have products issued with [Issue Components] button
String completeTaskId = null // which task has the [Complete] button next to it
productionRunRoutingTasks.each { task ->
// only PRUN_RUNNING tasks can have items issued or production run completed
if ("PRUN_RUNNING".equals(task.currentStatusId)) {
// Use WorkEffortGoodStandard to figure out if there are products which are needed for this task (PRUNT_PRODNEEDED) and which have not been issued (ie, WEGS_CREATED).
// If so this task should have products issued
components = from("WorkEffortGoodStandard").where("workEffortId", task.workEffortId, "workEffortGoodStdTypeId", "PRUNT_PROD_NEEDED", "statusId", "WEGS_CREATED").queryList()
if (components) {
issueTaskId = task.workEffortId
}
if (!issueTaskId) {
completeTaskId = task.workEffortId
}
}
// the first CREATED and SCHEDULED task will be the startTaskId. As the issue and complete tasks are filled out this condition will no longer be true
if (!startTaskId &&
!issueTaskId &&
!completeTaskId &&
("PRUN_CREATED".equals(task.currentStatusId) ||
"PRUN_SCHEDULED".equals(task.currentStatusId) ||
"PRUN_DOC_PRINTED".equals(task.currentStatusId))) {
startTaskId = task.workEffortId
}
}
context.productionRunRoutingTasks = productionRunRoutingTasks
context.startTaskId = (startTaskId ? startTaskId: "null")
context.issueTaskId = (issueTaskId? issueTaskId: "null")
context.completeTaskId = (completeTaskId != null? completeTaskId: "null")
// Product components list
productionRunComponents = productionRun.getProductionRunComponents()
productionRunComponentsData = []
productionRunComponentsDataReadyForIssuance = []
productionRunComponentsAlreadyIssued = []
if (productionRunComponents) {
productionRunComponents.each { component ->
product = component.getRelatedOne("Product", false)
componentName = product.getString("internalName")
productionRunTask = component.getRelatedOne("WorkEffort", false)
workEffortName = productionRunTask.getString("workEffortName")
Map componentData = component.getAllFields()
componentData.internalName = componentName
componentData.workEffortName = workEffortName
componentData.facilityId = productionRunTask.facilityId
issuances = from("WorkEffortAndInventoryAssign").where("workEffortId", component.workEffortId, "productId", product.productId).queryList()
totalIssued = 0.0
issuances.each { issuance ->
issued = issuance.quantity
if (issued) {
totalIssued += issued
}
}
returns = from("WorkEffortAndInventoryProduced").where("workEffortId", component.workEffortId , "productId", product.productId).queryList()
totalReturned = 0.0
returns.each { returned ->
returnDetail = from("InventoryItemDetail").where("inventoryItemId", returned.inventoryItemId).orderBy("inventoryItemDetailSeqId").queryFirst()
if (returnDetail) {
qtyReturned = returnDetail.quantityOnHandDiff
if (qtyReturned) {
totalReturned += qtyReturned
}
}
}
componentData.issuedQuantity = totalIssued
componentData.returnedQuantity = totalReturned
componentData.currentStatusId = productionRunTask.currentStatusId
if ("PRUN_RUNNING".equals(productionRunTask.currentStatusId)) {
componentData.isRunning = "Y"
} else {
componentData.isRunning = "null"
}
productionRunComponentsData.add(componentData)
if ("PRUN_RUNNING".equals(productionRunTask.currentStatusId) && "WEGS_CREATED".equals(component.getString("statusId"))) {
productionRunComponentsDataReadyForIssuance.add(componentData)
} else if (totalIssued > 0.0) {
productionRunComponentsAlreadyIssued.add(componentData)
}
}
}
// Content
productionRunContents = from("WorkEffortContentAndInfo").where("workEffortId", productionRunId).orderBy("-fromDate").filterByDate().queryList()
context.productionRunContents = productionRunContents
context.productionRunComponents = productionRunComponents
context.productionRunComponentsData = productionRunComponentsData
context.productionRunComponentsDataReadyForIssuance = productionRunComponentsDataReadyForIssuance
context.productionRunComponentsAlreadyIssued = productionRunComponentsAlreadyIssued
}
}