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();
        }
Exemple #5
0
        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();
        }