diff --git a/server/AyaNova/biz/PurchaseOrderBiz.cs b/server/AyaNova/biz/PurchaseOrderBiz.cs index c511342b..13991899 100644 --- a/server/AyaNova/biz/PurchaseOrderBiz.cs +++ b/server/AyaNova/biz/PurchaseOrderBiz.cs @@ -268,89 +268,110 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //BIZ ACTIONS + //A PO can now be edited in any way user wishes at any time so this method is to fix up + //any changes they make in affected objects and inventory // - private async Task BizActionsAsync(AyaEvent ayaEvent, PurchaseOrder proposedObj, PurchaseOrder currentObj, IDbContextTransaction transaction) { - //TODO: BIZ ACTIONS TO FIXUP INVENTORY ON CHANGES ETC - - //If received now less than before need to take out of inventory - //If received now more than before need to put into inventory - //MIGRATE_OUTSTANDING - woitempart request update //if received on woitempartrequest then need to update woitempartrequest (notification separate not a concern here) //if workorderitempartrequest item removed, need to fixup woitempartrequest + //BUT *only* if the woitempartrequest still exists and isn't completed already PartInventoryBiz pib = new PartInventoryBiz(ct, UserId, UserTranslationId, CurrentUserRoles); switch (ayaEvent) { case AyaEvent.Created: - //any received go into inventory - var inventoryAffectingItems = proposedObj.Items.Where(z => z.QuantityReceived > 0).ToList(); - foreach (var poItem in inventoryAffectingItems) { - //make inventory adjustment here - dtPOPartInventory i = new dtPOPartInventory(); - i.PartId = poItem.PartId; - i.PartWarehouseId = poItem.PartWarehouseId; - i.Quantity = poItem.QuantityReceived; - i.SourceType = AyaType.PurchaseOrder; - i.SourceId = proposedObj.Id; - await pib.CreateAsync(i); - - //MIGRATE_OUTSTANDING - update workorderitempart here if applicable - } - break; - case AyaEvent.Modified: - //any changes that will affect inventory get processed here - foreach (var propPOItem in proposedObj.Items) - { - //get the matching currentPoItem - var currentPOItem = currentObj.Items.FirstOrDefault(z => z.Id == propPOItem.Id); - //NEW ITEM? - if (currentPOItem == null && propPOItem.QuantityReceived > 0) + //any received go into inventory + var inventoryAffectingItems = proposedObj.Items.Where(z => z.QuantityReceived > 0).ToList(); + foreach (var poItem in inventoryAffectingItems) { - //It's a new receipt from before, add to inventory + //make inventory adjustment here dtPOPartInventory i = new dtPOPartInventory(); - i.PartId = propPOItem.PartId; - i.PartWarehouseId = propPOItem.PartWarehouseId; - i.Quantity = propPOItem.QuantityReceived; + i.PartId = poItem.PartId; + i.PartWarehouseId = poItem.PartWarehouseId; + i.Quantity = poItem.QuantityReceived; i.SourceType = AyaType.PurchaseOrder; i.SourceId = proposedObj.Id; await pib.CreateAsync(i); //MIGRATE_OUTSTANDING - update workorderitempart here if applicable } - //UPDATED ITEM WITH NEW RECEIVED AMOUNT? - else if (currentPOItem.QuantityReceived != propPOItem.QuantityReceived) + } + break; + case AyaEvent.Modified: + { + //any changes that will affect inventory get processed here + foreach (var newItem in proposedObj.Items) { - decimal netChange = 0; - - if (currentPOItem.QuantityReceived < propPOItem.QuantityReceived) + //get the matching currentPoItem + var oldItem = currentObj.Items.FirstOrDefault(z => z.Id == newItem.Id); + //NEW ITEM? + if (oldItem == null && newItem.QuantityReceived > 0) { - //More received - netChange = propPOItem.QuantityReceived - currentPOItem.QuantityReceived; - } - else - { - //less received - netChange = propPOItem.QuantityReceived - currentPOItem.QuantityReceived; - } + //It's a new receipt with received amounts - add to inventory + dtPOPartInventory i = new dtPOPartInventory(); + i.PartId = newItem.PartId; + i.PartWarehouseId = newItem.PartWarehouseId; + i.Quantity = newItem.QuantityReceived; + i.SourceType = AyaType.PurchaseOrder; + i.SourceId = proposedObj.Id; + await pib.CreateAsync(i); + //MIGRATE_OUTSTANDING - update workorderitempart here if applicable + } + //UPDATED ITEM WITH NEW RECEIVED AMOUNT? + else if (oldItem.QuantityReceived != newItem.QuantityReceived) + { + decimal netChange = 0; + if (oldItem.QuantityReceived < newItem.QuantityReceived) + { + //More received + netChange = newItem.QuantityReceived - oldItem.QuantityReceived; + } + else + { + //less received + netChange = newItem.QuantityReceived - oldItem.QuantityReceived; + } + + dtPOPartInventory i = new dtPOPartInventory(); + i.PartId = newItem.PartId; + i.PartWarehouseId = newItem.PartWarehouseId; + i.Quantity = netChange; + i.SourceType = AyaType.PurchaseOrder; + i.SourceId = proposedObj.Id; + await pib.CreateAsync(i); + + //MIGRATE_OUTSTANDING - update workorderitempart here if applicable + } } - - - } break; case AyaEvent.Deleted: + { + //REVERSE ENTIRE PO + //any received remove from inventory + var inventoryAffectingItems = currentObj.Items.Where(z => z.QuantityReceived > 0).ToList(); + foreach (var poItem in inventoryAffectingItems) + { + //make reversing inventory adjustment here + dtPOPartInventory i = new dtPOPartInventory(); + i.PartId = poItem.PartId; + i.PartWarehouseId = poItem.PartWarehouseId; + i.Quantity = poItem.QuantityReceived *= -1; + i.SourceType = AyaType.PurchaseOrder; + i.SourceId = proposedObj.Id; + await pib.CreateAsync(i); + + //MIGRATE_OUTSTANDING - update workorderitempart here if applicable + } + } break; } - - - }