private Boolean updateReserveStockOnHand(Location location, Product product, string lotNo, double reservedQuantity)
 {
     var blnResult = false;
     var queryStock = (from stock in StockOnHands
                       where stock.Location.Id == location.Id && stock.Product.Id == product.Id && stock.LotNo == lotNo
                       select stock).FirstOrDefault();
     if (queryStock != null)
     {
         queryStock.ReservedQuantity = queryStock.ReservedQuantity - reservedQuantity;
         blnResult = true;
     }
    
     return blnResult;
 }
 private Boolean updateStockOnHand(Location stkLocation,Product stkProduct,string LotNo,double Qty,decimal TotalCost)
 {   var blnResult = false;
     var queryStock = (from stock in StockOnHands
                       where stock.Location.Id == stkLocation.Id && stock.Product.Id == stkProduct.Id && stock.LotNo == LotNo
                      select stock).FirstOrDefault();
     if(queryStock != null){
         queryStock.QuantityOnHand = queryStock.QuantityOnHand + Qty;
         queryStock.CostPrice = queryStock.CostPrice + TotalCost;
         queryStock.IsAvailableForSale = false;
         blnResult = true;
     }
     else{
         StockOnHand newStock = new StockOnHand();
         newStock.Location = stkLocation;
         newStock.Product = stkProduct;
         newStock.LotNo = LotNo;
         newStock.CostPrice = TotalCost;
         newStock.IsAvailableForSale = false;
         newStock.QuantityOnHand = Qty;
         newStock.SellingPrice = 0;
         blnResult = true;
     }
     return blnResult;
 }
        private string getNewLotFromStockOnhand(string ReceiveType,DateTime LotDate,Product ReceiveProduct,string OldRawmatLotNo) {
            string newLot = "";
            //string insertLot = (Int32.Parse(String.Format("{0:yy}", LotDate))%10).ToString() + String.Format("{0:MMdd}", LotDate);
            // YMMDD
            string insertLot = (Int32.Parse(String.Format("{0:yy}", LotDate.Year.ToString())) % 10).ToString() + String.Format("{0:MMdd}", LotDate);

            string[] ReceiveNewLotPrefix = { "PO","BF","RT" };
            if (ReceiveNewLotPrefix.Contains(ReceiveType.Substring(0, 2)))
            {
                var queryStockOnHand = from stock in StockOnHands
                                       where stock.Product.Id == (ReceiveProduct.Id) && stock.LotNo.Contains(insertLot)
                                       orderby stock.LotNo descending
                                       select stock.LotNo;
                if (queryStockOnHand.Count() > 0)
                {
                    string LastLot = queryStockOnHand.First();
                    newLot = insertLot + (Int32.Parse(LastLot.Substring(5, 1)) + 1).ToString();
                }
                else
                {
                    newLot = insertLot + '1';
                }
            }

            string[] ReceiveOldLotPrefix = { "GIRM","AJQT","AJCT","TRFS" };
            if (ReceiveOldLotPrefix.Contains(ReceiveType))
            {
                newLot = OldRawmatLotNo;
            }

            string[] ReceiveCheckLotPrefix = { "GIFG", "GIWS" };
            if (ReceiveCheckLotPrefix.Contains(ReceiveType))
            {
                var SelectProduct = from Item in Products where Item.Id == ReceiveProduct.Id select Item.LotType;
                if (SelectProduct.Count() > 0) {
                    string ItemCategory = SelectProduct.FirstOrDefault();
                    if (ItemCategory == "Fix")
                    {
                        newLot = OldRawmatLotNo;
                    }else
                    {
                        var queryStockOnHand = from stock in StockOnHands
                                               where stock.Product.Id == (ReceiveProduct.Id) && stock.LotNo.Contains(insertLot)
                                               orderby stock.LotNo descending
                                               select stock.LotNo;
                        if (queryStockOnHand.Count() > 0)
                        {
                            string LastLot = queryStockOnHand.First();
                            newLot = insertLot + (Int32.Parse(LastLot.Substring(5, 1)) + 1).ToString();
                        }
                        else
                        {
                            newLot = insertLot + '1';
                        }
                    }
                }

            }
            return newLot;
        }
 private string getPOTransactionType(Product ReceiveProduct) {
     string receiveType = "";
     switch (ReceiveProduct.ProductCategory.ProductCategoryName)
     {
         case "วัตถุดิบ": receiveType = "PORM";
             break;
         case "สินค้า": receiveType = "POFG";
             break;
         case "ของเสีย": receiveType = "POWS";
             break;
         default: receiveType = "PONA";
             break;
     }
     return receiveType;
 }
        private void OnProductStatusAffected(Product product)
        {
            //var unitsReceived = 0;
            //var unitsShipped = 0;
            //var unitsLost = 0;
            //var unitsOnHand = 0;
            //var unitsOnOrder = 0;

            //var purchaseOrderDetails = product.PurchaseOrderDetails;
            //foreach (var purchaseOrderDetail in purchaseOrderDetails)
            //{
            //    unitsReceived += purchaseOrderDetail.UnitsReceived.Value;
            //    unitsOnOrder += purchaseOrderDetail.UnitsOrdered - purchaseOrderDetail.UnitsReceived.Value;
            //}

            //var orderDetails = product.OrderDetails;
            //foreach (var orderDetail in orderDetails)
            //{
            //    unitsShipped += orderDetail.UnitsShipped.Value;
            //}

            //var stockCheckDetails = product.StockCheckDetails;
            //foreach (var stockCheckDetail in stockCheckDetails)
            //{
            //    unitsLost += stockCheckDetail.UnitsExpected - stockCheckDetail.UnitsFound;
            //}

            //unitsOnHand = unitsReceived - (unitsShipped + unitsLost);

            //if (unitsOnHand <= product.ReorderLevel)
            //{
            //    string subject = string.Format("{0} at or below reorder levels", product.ProductName);

            //    foreach (var subscriber in product.ProductSubscribers)
            //    {
            //        List<string> mailTos = new List<string>();

            //        string message = string.Format("<html><body>Dear {0} {1}.<br></br><p>The product '{2}' is at or below the reorder level:<br></br>The reorder level is {3} but you currently only have {4} on hand.<br></br>For info, the number of units on order is {5}.</p></body></html>", subscriber.Employee.FirstName, subscriber.Employee.LastName, product.ProductName, product.ReorderLevel, unitsOnHand, unitsOnOrder);

            //        mailTos.Add(subscriber.Employee.Email);

            //        SendEmail(mailTos, subject, message);
            //    }
            //}
        }
 partial void Products_Updated(Product entity)
 {
     OnProductStatusAffected(entity);
 }