public void updateRequsitionRetrievalStatusBasedOnTotalDisbursed(int disDutyId) { DisbursementDuty disbursementDuty = getDisbursementDutyById(disDutyId); // update retrieval status of each requisition within disbursement duty foreach (Disbursement disbursement in disbursementDuty.Disbursements) { bool fullyRetrieved = true; foreach (RequisitionDetail reqDetail in disbursement.Requisition.RequisitionDetails.Where(r => r.Requisition.ApprovalStatusID == 3).ToList()) { int qtyDisbursed = getTotalCountOfItemDisbursedForReqDetailId(reqDetail.RequisitionDetailsID); if (qtyDisbursed < reqDetail.Quantity) { fullyRetrieved = false; break; } } int reqId = disbursement.Requisition.RequisitionID; if (fullyRetrieved) { context.Requisitions.First(r => r.RequisitionID == reqId).RetrievalStatusID = 4; } else { context.Requisitions.First(r => r.RequisitionID == reqId).RetrievalStatusID = 3; } } context.SaveChanges(); }
// Create public int addDisbursementDuty(string empId) { DisbursementDuty disbursementDuty = new DisbursementDuty(); disbursementDuty.DisbursementDate = DateTime.Now; disbursementDuty.isRetrieved = false; disbursementDuty.StoreClerkID = empId; context.DisbursementDuties.Add(disbursementDuty); context.SaveChanges(); return(disbursementDuty.DisbursementDutyID); }
// Retrieve public RetrievalFormPayload getRetrievalForm(string empId) { bool outstandingRetrievalForm = context.DisbursementDuties .Count(d => d.StoreClerkID == empId && d.isRetrieved == false) > 0; if (outstandingRetrievalForm) { DisbursementDuty disDuty = context.DisbursementDuties .First(d => d.StoreClerkID == empId && d.isRetrieved == false); return(generateRetrievalFormFromDisbursementDuty(disDuty.DisbursementDutyID)); } else { return(generateNewRetrievalForm(empId)); } }
// Update // Store clerk presses submit on the stationery retrieval form screen public void submitRetrievalForm(int disDutyId, Dictionary <string, int> itemsAndQtys) { DisbursementDuty disbursementDuty = getDisbursementDutyById(disDutyId); // Allocate the retrieved items into respective Disbursements. Priority is on a first-come-first-serve basis. foreach (KeyValuePair <string, int> item in itemsAndQtys) { int qty = Math.Min(item.Value, stockManagementService.getStockCountOfItem(item.Key)); stockManagementService.addStockTransaction(item.Key, "Retrieval", disbursementDuty.StoreClerkID, -qty); // Get all requisition details served by disbursement duty List <Disbursement> disbursements = disbursementDuty.Disbursements.ToList(); List <RequisitionDetail> requisitionDetails = new List <RequisitionDetail>(); disbursements.ForEach(d => requisitionDetails .AddRange(d.Requisition.RequisitionDetails.Where(rd => rd.ItemID == item.Key).ToList())); allocateRetrievalToDisbursementDetails(requisitionDetails, disbursementDuty, qty); } // update retrieval status of each requisition within disbursement duty to retrieved disbursementDuty.Disbursements.ToList().ForEach(d => d.Requisition.RetrievalStatusID = 4); disbursementDuty.isRetrieved = true; context.SaveChanges(); }
// Allocate retrieved quantities public void allocateRetrievalToDisbursementDetails(List <RequisitionDetail> requisitionDetails, DisbursementDuty disDuty, int qty) { List <int> requisitionDetailsId = requisitionDetails .Select(rd => rd.RequisitionDetailsID) .ToList(); List <DisbursementDetail> disbursementDetails = context.DisbursementDetails .Where(d => requisitionDetailsId.Contains(d.RequisitionDetailsID) && d.Disbursement.DisbursementDutyID == disDuty.DisbursementDutyID) .OrderBy(d => d.Disbursement.Requisition.RequestedDate) .ToList(); foreach (DisbursementDetail dd in disbursementDetails) { if (qty > dd.Quantity) { qty -= dd.Quantity; } else if (qty > 0) { dd.Quantity = qty; } else { context.DisbursementDetails.Remove(dd); } } context.SaveChanges(); }
static void Main(string[] args) { clearTables(); Console.WriteLine("-- Test Retrieval to disbursement process--"); Console.WriteLine("Scenario 1 : Shortage in store, 2 disbursements made to complete the whole requisition"); Console.WriteLine("Part 1: Newly approved requisition"); Requisition req = setupRequisition(10); checkStock(); RetrievalFormPayload retrievalPayload = disbursementService.getRetrievalForm("E015"); List <RetrievalItemPayload> retrievalItems = retrievalPayload.retrievalItemPayloads; Console.WriteLine("1.1 Retrieval item count should be 3 : {0}", retrievalItems.Count()); Console.WriteLine("1.2 Qty to retrieve for each item should be 10"); retrievalItems.ForEach(r => Console.WriteLine(r.ItemID + "\t" + r.QtyToRetrieve + "\t" + r.QtyInStock)); Console.WriteLine(); Console.WriteLine("Part 2: Partially disbursed requisition"); DisbursementDuty disDuty = disbursementService.getDisbursementDutyByStoreClerkEmpId("E015"); Dictionary <string, int> itemsAndQtys = generateItemAndQtys(5); disbursementService.submitRetrievalForm(disDuty.DisbursementDutyID, itemsAndQtys); List <Department> departments = disbursementService.getDepartmentsWithDisbursements(); Console.WriteLine("count of departments with disbursement should be 1 : {0}", departments.Count); //Console.WriteLine("Department should be CHEM : {0}", departments[0].DepartmentID); List <DisbursementDetailPayload> disbursementDetailPayloads = disbursementService.getUncollectedDisbursementDetailsByDep("chem"); disbursementDetailPayloads.ForEach(d => Console.WriteLine(d.ItemName + "\t" + d.DisbursedQuantity + "\t" + d.CollectedQuantity)); disbursementService.submitDisbursementOfDep("CHEM", disbursementDetailPayloads, "E015"); retrievalPayload = disbursementService.getRetrievalForm("E015"); retrievalItems = retrievalPayload.retrievalItemPayloads; Console.WriteLine("2.1 Retrieval item count should be 3 : {0}", retrievalItems.Count()); Console.WriteLine("2.2 Qty to retrieve for each item should be 5, and stock count should decrease by 5"); retrievalItems.ForEach(r => Console.WriteLine(r.ItemID + "\t" + r.QtyToRetrieve + "\t" + r.QtyInStock)); Console.WriteLine(); Console.WriteLine("Part 3: fully disbursed requisition"); disDuty = disbursementService.getDisbursementDutyByStoreClerkEmpId("E015"); disbursementService.submitRetrievalForm(disDuty.DisbursementDutyID, itemsAndQtys); disbursementDetailPayloads = disbursementService.getUncollectedDisbursementDetailsByDep("chem"); disbursementDetailPayloads.ForEach(d => Console.WriteLine(d.ItemName + "\t" + d.DisbursedQuantity + "\t" + d.CollectedQuantity)); disbursementService.submitDisbursementOfDep("CHEM", disbursementDetailPayloads, "E015"); retrievalPayload = disbursementService.getRetrievalForm("E015"); retrievalItems = retrievalPayload.retrievalItemPayloads; Console.WriteLine("3.1 Retrieval item count should be 0 : {0}", retrievalItems.Count()); Console.WriteLine("3.2 Stock count should decrease by 5"); retrievalItems.ForEach(r => Console.WriteLine(r.ItemID + "\t" + r.QtyToRetrieve + "\t" + r.QtyInStock)); checkStock(); Console.WriteLine(); clearTables(); Console.WriteLine("Scenario 2 : Dsbursement partially rejected at collection"); Console.WriteLine("Part 1: Goods retrieved from store"); req = setupRequisition(10); retrievalPayload = disbursementService.getRetrievalForm("E015"); retrievalItems = retrievalPayload.retrievalItemPayloads; Console.WriteLine("1.1 Retrieval item count should be 3 : {0}", retrievalItems.Count()); Console.WriteLine("1.2 Qty to retrieve for each item should be 10"); retrievalItems.ForEach(r => Console.WriteLine(r.ItemID + "\t" + r.QtyToRetrieve + "\t" + r.QtyInStock)); Console.WriteLine(); Console.WriteLine("Part 2: Goods rejected at collection"); disDuty = disbursementService.getDisbursementDutyByStoreClerkEmpId("E015"); disbursementService.submitRetrievalForm(disDuty.DisbursementDutyID, itemsAndQtys); checkStock(); disbursementDetailPayloads = disbursementService.getUncollectedDisbursementDetailsByDep("chem"); disbursementDetailPayloads.ForEach(d => Console.WriteLine(d.ItemName + "\t" + d.DisbursedQuantity + "\t" + d.CollectedQuantity)); disbursementService.submitDisbursementOfDep("CHEM", disbursementDetailPayloads, "E015"); Console.WriteLine("2.1 Retrieval item count should be 3 : {0}", retrievalItems.Count()); Console.WriteLine("2.2 Stock count should increase by 5"); retrievalPayload = disbursementService.getRetrievalForm("E015"); retrievalItems = retrievalPayload.retrievalItemPayloads; retrievalItems.ForEach(r => Console.WriteLine(r.ItemID + "\t" + r.QtyToRetrieve + "\t" + r.QtyInStock)); checkStock(); Console.WriteLine(); clearTables(); Console.WriteLine("Scenario 3 : shortage in store"); Console.WriteLine("Part 1: Goods retrieved from store"); req = setupRequisition(10000); retrievalPayload = disbursementService.getRetrievalForm("E015"); retrievalItems = retrievalPayload.retrievalItemPayloads; Console.WriteLine("1.1 Retrieval item count should be 3 : {0}", retrievalItems.Count()); Console.WriteLine("1.2 Qty to retrieve for each item should be 10000"); retrievalItems.ForEach(r => Console.WriteLine(r.ItemID + "\t" + r.QtyToRetrieve + "\t" + r.QtyInStock)); Console.WriteLine(); Console.WriteLine("Part 2: Goods at collection"); disDuty = disbursementService.getDisbursementDutyByStoreClerkEmpId("E015"); itemsAndQtys["C001"] = stockManagementService.getStockCountOfItem("C001"); itemsAndQtys["C002"] = stockManagementService.getStockCountOfItem("C002"); itemsAndQtys["C003"] = stockManagementService.getStockCountOfItem("C003"); disbursementService.submitRetrievalForm(disDuty.DisbursementDutyID, itemsAndQtys); checkStock(); disbursementDetailPayloads = disbursementService.getUncollectedDisbursementDetailsByDep("chem"); disbursementDetailPayloads.ForEach(d => Console.WriteLine(d.ItemName + "\t" + d.DisbursedQuantity + "\t" + d.CollectedQuantity)); disbursementService.submitDisbursementOfDep("CHEM", disbursementDetailPayloads, "E015"); Console.WriteLine("2.1 Retrieval item count should be 3 : {0}", retrievalItems.Count()); Console.WriteLine("2.2 Stock count should increase by 5"); retrievalPayload = disbursementService.getRetrievalForm("E015"); retrievalItems = retrievalPayload.retrievalItemPayloads; retrievalItems.ForEach(r => Console.WriteLine(r.ItemID + "\t" + r.QtyToRetrieve + "\t" + r.QtyInStock)); checkStock(); Console.WriteLine(); }