public OrderDetailsPayload(OrderSupplierDetail orderSupplierDetail, IStockManagementService stockManagementService) { this.stockManagementService = stockManagementService; ItemID = orderSupplierDetail.ItemID; CategoryName = orderSupplierDetail.Item.Category.CategoryName; ItemName = orderSupplierDetail.Item.ItemName; UnitOfMeasure = orderSupplierDetail.Item.UnitOfMeasure; QtyInStock = stockManagementService.getStockCountOfItem(ItemID); OrderedQty = orderSupplierDetail.Quantity; OrderSupplierDetailId = orderSupplierDetail.OrderSupplierDetailsID; }
public OrderSupplierDetail createOrderSupplierDetail( int orderSupplierId, SupplierItem si, int qty) { OrderSupplierDetail osd = new OrderSupplierDetail(); osd.OrderSupplierID = orderSupplierId; osd.ItemID = si.ItemID; osd.Quantity = qty; osd.UnitCost = (decimal)si.Cost; return(osd); }
// Update public void updateQtyRecievedOfOrderSupplierDetail(int orderSupplierDetailId, int qty, string empId) { OrderSupplierDetail orderSupplierDetail = getOrderSupplierDetail(orderSupplierDetailId); orderSupplierDetail.ActualQuantityReceived = Math.Min(qty, orderSupplierDetail.Quantity); // excess rejected stockManagementService.addStockTransaction(orderSupplierDetail.ItemID, "restock", empId, qty); if (context.OrderSupplierDetails .Count(o => o.OrderSupplierID == orderSupplierDetail.OrderSupplierID && o.ActualQuantityReceived == null) == 0) { confirmDeliveryOfOrderSupplier(orderSupplierDetail.OrderSupplierID); } context.SaveChanges(); }
public void allocateQtyToSuppliers(Order order, Dictionary <int, int> supplierItemAndQty, int qty) { List <OrderSupplierDetail> details = new List <OrderSupplierDetail>(); List <SupplierItem> supplierItems = context.SupplierItems .Where(si => supplierItemAndQty.Keys.Contains(si.SupplierItemID)) .OrderBy(si => si.Rank) .ToList(); int totalAvailableQuantity = supplierItemAndQty.Values.Sum(); foreach (SupplierItem si in supplierItems) { if (qty > 0 && totalAvailableQuantity > 0) { if (supplierItemAndQty[si.SupplierItemID] > 0) { int availableQty = supplierItemAndQty[si.SupplierItemID]; OrderSupplier os; if (order.OrderSuppliers.Count(o => o.Supplier == si.Supplier) == 0) { os = createOrderSupplier(order.OrderID, si.Supplier.SupplierID); order.OrderSuppliers.Add(os); context.SaveChanges(); } else { os = order.OrderSuppliers.First(o => o.Supplier == si.Supplier); } OrderSupplierDetail osd = new OrderSupplierDetail(); int orderQty = Math.Min(qty, availableQty); osd = createOrderSupplierDetail(os.OrderSupplierID, si, orderQty); os.OrderSupplierDetails.Add(osd); qty -= orderQty; } } else { break; } } context.SaveChanges(); }
static void Main(string[] args) { IOrderService OrderService = new OrderService(); StationeryStoreEntities context = StationeryStoreEntities.Instance; // Test 1 Console.WriteLine("Test createOrderAndGetOrderID() and allocateQtyToSupplier() and create methods"); //test received orders Console.WriteLine("Scenarioreceived orders"); List <Order> orderList = OrderService.getReceivedOrders(); foreach (Order o in orderList) { Console.WriteLine(o.OrderID); } // Prepare Required Quantity Data List <string> itemIds = new List <string>() { "C001" }; Dictionary <string, int> itemAndQty = new Dictionary <string, int>(); itemIds.ForEach(i => itemAndQty.Add(i, 10)); // Prepare Stock Available at Supplier List <int> supplierItemIds = new List <int>() { 1, 15, 29 }; Dictionary <int, int> supplierItemsAndQty = new Dictionary <int, int>(); Console.WriteLine("Scenario 1: First supplier has sufficient stock"); supplierItemIds.ForEach(si => supplierItemsAndQty.Add(si, 15)); int orderId = OrderService.createOrderAndGetOrderId(itemAndQty, supplierItemsAndQty); Order order = context.Orders.First(o => o.OrderID == orderId); Console.WriteLine("Number of order suppliers should be 1 : {0}", order.OrderSuppliers.Count()); OrderSupplierDetail orderSupplierDetail = order.OrderSuppliers.First().OrderSupplierDetails.First(); Console.WriteLine("Qty ordered should be 10 : {0}", orderSupplierDetail.Quantity); Console.WriteLine(); Console.WriteLine("Scenario 2: First supplier and second supplier combined have enough stock"); supplierItemsAndQty = new Dictionary <int, int>(); supplierItemIds.ForEach(si => supplierItemsAndQty.Add(si, 6)); orderId = OrderService.createOrderAndGetOrderId(itemAndQty, supplierItemsAndQty); int test2OrderId = orderId; order = context.Orders.First(o => o.OrderID == orderId); Console.WriteLine("Number of order suppliers should be 2 : {0}", order.OrderSuppliers.Count()); List <int> orderedQuantities = context.OrderSupplierDetails.Where(osd => osd.OrderSupplier.OrderID == orderId).OrderBy(osd => osd.OrderSupplierDetailsID).Select(osd => osd.Quantity).ToList(); Console.WriteLine("Qty ordered should be [6, 4] : [{0}]", String.Join(", ", orderedQuantities)); Console.WriteLine(); Console.WriteLine("Scenario 3: First, second and third supplier combined have enough stock"); supplierItemsAndQty = new Dictionary <int, int>(); supplierItemIds.ForEach(si => supplierItemsAndQty.Add(si, 4)); orderId = OrderService.createOrderAndGetOrderId(itemAndQty, supplierItemsAndQty); order = context.Orders.First(o => o.OrderID == orderId); Console.WriteLine("Number of order suppliers should be 3 : {0}", order.OrderSuppliers.Count()); orderedQuantities = context.OrderSupplierDetails.Where(osd => osd.OrderSupplier.OrderID == orderId).OrderBy(osd => osd.OrderSupplierDetailsID).Select(osd => osd.Quantity).ToList(); Console.WriteLine("Qty ordered should be [4, 4, 2] : [{0}]", String.Join(", ", orderedQuantities)); Console.WriteLine(); Console.WriteLine("Scenario 4: First, second and third supplier combined do not have enough stock"); supplierItemsAndQty = new Dictionary <int, int>(); supplierItemIds.ForEach(si => supplierItemsAndQty.Add(si, 3)); orderId = OrderService.createOrderAndGetOrderId(itemAndQty, supplierItemsAndQty); order = context.Orders.First(o => o.OrderID == orderId); Console.WriteLine("Number of order suppliers should be 3 : {0}", order.OrderSuppliers.Count()); orderedQuantities = context.OrderSupplierDetails.Where(osd => osd.OrderSupplier.OrderID == orderId).OrderBy(osd => osd.OrderSupplierDetailsID).Select(osd => osd.Quantity).ToList(); Console.WriteLine("Qty ordered should be [3, 3, 3] : [{0}]", String.Join(", ", orderedQuantities)); Console.WriteLine(); Console.WriteLine("Scenario 5: First no stock, second and third supplier combined do not have enough stock"); supplierItemsAndQty = new Dictionary <int, int>(); int count = 0; supplierItemIds.ForEach(si => supplierItemsAndQty.Add(si, count++)); orderId = OrderService.createOrderAndGetOrderId(itemAndQty, supplierItemsAndQty); order = context.Orders.First(o => o.OrderID == orderId); Console.WriteLine("Number of order suppliers should be 2 : {0}", order.OrderSuppliers.Count()); orderedQuantities = context.OrderSupplierDetails.Where(osd => osd.OrderSupplier.OrderID == orderId).OrderBy(osd => osd.OrderSupplierDetailsID).Select(osd => osd.Quantity).ToList(); Console.WriteLine("Qty ordered should be [1, 2] : [{0}]", String.Join(", ", orderedQuantities)); Console.WriteLine(); Console.WriteLine("Scenario 6: Provided qty <= 0"); itemAndQty = new Dictionary <string, int>(); itemIds.ForEach(i => itemAndQty.Add(i, 0)); supplierItemsAndQty = new Dictionary <int, int>(); supplierItemIds.ForEach(si => supplierItemsAndQty.Add(si, count++)); orderId = OrderService.createOrderAndGetOrderId(itemAndQty, supplierItemsAndQty); order = context.Orders.First(o => o.OrderID == orderId); Console.WriteLine("Number of order suppliers should be 0 : {0}", order.OrderSuppliers.Count()); orderedQuantities = context.OrderSupplierDetails.Where(osd => osd.OrderSupplier.OrderID == orderId).OrderBy(osd => osd.OrderSupplierDetailsID).Select(osd => osd.Quantity).ToList(); Console.WriteLine("Qty ordered should be : [{0}]", String.Join(", ", orderedQuantities)); Console.WriteLine(); // Test 2 Console.WriteLine("Test Retrieve methods"); Console.WriteLine("Test getOrder"); order = OrderService.getOrder(test2OrderId); Console.WriteLine("OrderId should be {0} : {1}", test2OrderId, order.OrderID); Console.WriteLine("Test getOrderSupplier"); int orderSupplierId = order.OrderSuppliers.First().OrderSupplierID; OrderSupplier orderSupplier = OrderService.getOrderSupplier(orderSupplierId); Console.WriteLine("OrderSupplierId should be {0} : {1}", orderSupplierId, orderSupplier.OrderSupplierID); Console.WriteLine("Test getOrderSupplierDetails"); int orderSupplierDetailId = orderSupplier.OrderSupplierDetails.First().OrderSupplierDetailsID; orderSupplierDetail = OrderService.getOrderSupplierDetail(orderSupplierDetailId); Console.WriteLine("OrderSupplierDetailId should be {0} : {1}", orderSupplierDetailId, orderSupplierDetail.OrderSupplierDetailsID); Console.WriteLine("Test getReorderDetails"); foreach (ReorderDetail rd in OrderService.getReorderDetails()) { Console.WriteLine("{0} \t {1} \t {2}", rd.ItemID, rd.ItemName, rd.ReorderLevel); } Console.WriteLine(); Console.WriteLine("test getSupplierItemsOfItemId"); foreach (SupplierItem si in OrderService.getSupplierItemsOfItemIds(new List <string>() { "C001", "C002" })) { Console.WriteLine("{0} \t {1} \t {2} \t {3}", si.SupplierItemID, si.Supplier.SupplierName, si.ItemID, si.Cost); } Console.WriteLine(); // Test 3 Console.WriteLine("Test update methods"); Console.WriteLine("Test updateQtyReeivedOfOrderSupplierDetail"); Console.WriteLine("Scenario 1: When received qty > ordered"); OrderService.updateQtyRecievedOfOrderSupplierDetail(orderSupplierDetailId, 8, "E001"); orderSupplierDetail = OrderService.getOrderSupplierDetail(orderSupplierDetail.OrderSupplierDetailsID); Console.WriteLine("OrderSupplierDetail {0}'s qty recieved should be 6 : {1}", orderSupplierDetailId, orderSupplierDetail.ActualQuantityReceived); Console.WriteLine(); Console.WriteLine("Scenario 2: When received qty < ordered"); OrderService.updateQtyRecievedOfOrderSupplierDetail(orderSupplierDetailId, 4, "E001"); Console.WriteLine("OrderSupplierDetail {0}'s qty recieved should be 4 : {1}", orderSupplierDetailId, orderSupplierDetail.ActualQuantityReceived); Console.WriteLine(); Console.WriteLine("Test confirmDeliveryOfOrderSupplier"); Console.WriteLine("OrderSupplierDetail {0}'s delivery status recieved should be 2 : {1}", orderSupplierId, orderSupplier.DeliveryStatusID); OrderService.confirmDeliveryOfOrderSupplier(orderSupplierId); Console.WriteLine("OrderSupplierDetail {0}'s delivery status recieved should be 1 : {1}", orderSupplierId, orderSupplier.DeliveryStatusID); Console.WriteLine(); Console.WriteLine("Test confirmInvoiceUploadStatus"); Console.WriteLine("OrderSupplierDetail {0}'s invoice upload status recieved should be 2 : {1}", orderSupplierId, orderSupplier.InvoiceUploadStatusID); OrderService.confirmInvoiceUploadStatus(orderSupplierId); Console.WriteLine("OrderSupplierDetail {0}'s invoice upload status recieved should be 1 : {1}", orderSupplierId, orderSupplier.InvoiceUploadStatusID); Console.WriteLine(); }