Index: grails-app/services/com/lemans/ds/studioorder/StudioOrderPartManagerService.groovy =================================================================== diff -u -r1e0afb9896fe5073880077bcb734eed4407951a7 -rfc8d9891ce2214ee2e25a1cb47dfe71c7276559f --- grails-app/services/com/lemans/ds/studioorder/StudioOrderPartManagerService.groovy (.../StudioOrderPartManagerService.groovy) (revision 1e0afb9896fe5073880077bcb734eed4407951a7) +++ grails-app/services/com/lemans/ds/studioorder/StudioOrderPartManagerService.groovy (.../StudioOrderPartManagerService.groovy) (revision fc8d9891ce2214ee2e25a1cb47dfe71c7276559f) @@ -67,15 +67,52 @@ Map addParts(Map values, String username) { Timestamp now = new Timestamp(new Date().time) - List partNumbers = findStudioOrderParts(values.studioOrderId, values.parts)*.partNumber - sql().withBatch(50, STUDIO_ORDER_PART_INSERT_SQL) { stmt -> - values.parts.each { String partNumber -> - if (!(partNumber in partNumbers)) { - stmt.addBatch([studioOrderId: values.studioOrderId, partNumber: partNumber, now: now, username: username]) - } + List parts = values.parts.unique() + List existingStudioOrderParts = findStudioOrderPartsInOpenAndSubmitted(parts) + List partNumbers = existingStudioOrderParts*.partNumber + List newPartNumbers = parts - partNumbers + def updateCounts = sql().withBatch(50, STUDIO_ORDER_PART_INSERT_SQL) { stmt -> + newPartNumbers.each { String partNumber -> + stmt.addBatch([studioOrderId: values.studioOrderId, partNumber: partNumber, now: now, username: username]) } } - [results: [:]] + Map result = [:] + List success = [] + List failures = [] + existingStudioOrderParts.each {studioOrderPart-> + if(failures.find{it.partNumber == studioOrderPart.partNumber}) { + return; + } + Map error = [ + partNumber: studioOrderPart.partNumber, + status: "failed" + ] + if(studioOrderPart.studioOrderId == values.studioOrderId) { + error.message = "Part is already in the current order" + } else if(studioOrderPart.statusId == 14200) { + error.message = "Part is in existing open orders" + } else if(studioOrderPart.statusId == 14201) { + error.message = "Part is in existing submitted orders" + } + failures.push(error) + } + newPartNumbers.eachWithIndex{String partNumber, Integer index-> + if(updateCounts[index] != 1) { + failures.push([ + partNumber: partNumber, + status: "failed", + message: "Error in inserting" + ]) + } else { + success.push([ + partNumber: partNumber, + status: "success" + ]) + } + } + result.failures = failures + result.success = success + [results: result] } Map updateParts(Map values, String username) { @@ -161,6 +198,10 @@ StudioOrderPart.findAllByStudioOrderIdAndPartNumberInListAndDateDeletedIsNull(studioOrderId, partNumbers) } + private List findStudioOrderPartsInOpenAndSubmitted(List partNumbers) { + StudioOrderPart.findAllByPartNumberInListAndStatusIdInListAndDateDeletedIsNull(partNumbers, [14200, 14201]) + } + private Flag findFlag(String flagName) { Flag.findByFlagNameAndDateDeletedIsNull(flagName) }