Beispiel #1
0
 public ProductStockModel UpdateProductStock(ProductStockModel _productStockModel)
 {
     try
     {
         using (_context = new HSSNInventoryEntities())
         {
             var data =
                 _context.ProductStocks.FirstOrDefault(a => a.ProductId == _productStockModel.ProductId &&
                                                       a.OrganisationId == _productStockModel.OrganisationId &&
                                                       a.WareHouseId == _productStockModel.WareHouseId);
             if (_productStockModel.InOutMode == "IN")
             {
                 if (data != null)
                 {
                     data.CurrentStock += _productStockModel.CurrentStock;
                 }
             }
             else
             {
                 if (data != null)
                 {
                     data.CurrentStock -= _productStockModel.CurrentStock;
                 }
             }
             _context.Entry(data).State = EntityState.Modified;
             _context.SaveChanges();
             return(_productStockModel);
         }
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
         throw;
     }
 }
Beispiel #2
0
        /// <summary>
        /// Validates the product stock model.
        /// </summary>
        /// <param name="model">The model.</param>
        /// <exception cref="Exception">User Not Found</exception>
        private async Task ValidateProductStockModel(ProductStockModel model)
        {
            if (!await IsUserExists(model.UserId))
            {
                throw new Exception("User Not Found");
            }

            if (!await IsProductExists(model.ProductId))
            {
                throw new Exception("Product Not Found");
            }

            if (!await IsPeriodTypeExists(model.PeriodTypeId))
            {
                throw new Exception("Period Type Not Found");
            }

            if (!await IsUnitTypeExists(model.UnitTypeId))
            {
                throw new Exception("Unit Type Not Found");
            }

            if (await IsProductAlreadyExists(model))
            {
                throw new Exception("The product already exists");
            }
        }
Beispiel #3
0
        /// <summary>
        /// Creates stock for the selected product, and removes from stock the ingredient quantities used
        /// </summary>
        private void CreateProductStockButton_Click(object sender, EventArgs e)
        {
            int quantityToCreate = int.Parse(QuantityToCreateTextBox.Text);

            if (ValidateIngredientsAvailability(SelectedProduct_RecipeIngredients, quantityToCreate))
            {
                ProductModel      selectedProduct      = (ProductModel)ProductListBox.SelectedItem;
                ProductStockModel selectedProductStock = new ProductStockModel
                {
                    ProductId = selectedProduct.Id,
                    Quantity  = quantityToCreate
                };

                RMS_Logic.PurchasingLogic.AddProductToStock(selectedProductStock);

                List <OrderProductModel> productsToRemoveFromStock = new List <OrderProductModel>();
                foreach (RecipeAndContentModel ingredient in SelectedProduct_RecipeIngredients)
                {
                    productsToRemoveFromStock.Add(new OrderProductModel
                    {
                        OrderedQuantity = ingredient.ProductQuantity * quantityToCreate,
                        ProductId       = ingredient.ProductId
                    });
                }

                RMS_Logic.SalesLogic.UnBookProducts(productsToRemoveFromStock);
                RMS_Logic.SalesLogic.RemoveProductsFromStock(productsToRemoveFromStock);

                Clear();
                //TODO - Record Journal transation for exceptional stoc creation/deletion
            }
        }
Beispiel #4
0
        /// <summary>
        /// Saves the product stock.
        /// </summary>
        /// <param name="model">The model.</param>
        private async Task SaveProductStock(ProductStockModel model)
        {
            await ValidateProductStockModel(model);

            ProductStock productStock;

            if (model.Id.HasValue)
            {
                productStock = await GetProductStockById(model.Id.Value);

                productStock.ProductId          = model.ProductId;
                productStock.UserId             = model.UserId;
                productStock.PeriodId           = model.PeriodTypeId;
                productStock.UnitId             = model.UnitTypeId;
                productStock.UnitAmount         = model.UnitAmount;
                productStock.ProductAmountExist = model.ProductAmountExist.HasValue ? model.ProductAmountExist.Value : productStock.ProductAmountExist; // TODO: check!!
            }
            else
            {
                productStock = new ProductStock
                {
                    UserId             = model.UserId,
                    ProductId          = model.ProductId,
                    PeriodId           = model.PeriodTypeId,
                    UnitId             = model.UnitTypeId,
                    UnitAmount         = model.UnitAmount,
                    ProductAmountExist = model.ProductAmountExist
                };

                await _context.ProductsStock.AddAsync(productStock);
            }

            await _context.SaveChangesAsync();
        }
Beispiel #5
0
        public async Task SetProductStocksAsync(ProductStockModel stock)
        {
            var expire = GetNextDay() - DateTime.Now;
            var setKey = AddKeyPrefix <ProductStockModel>("Set");
            await Database.SetAddAsync(setKey, stock.ProductId);

            await Database.KeyExpireAsync(setKey, expire);

            var entityKey = AddKeyPrefix <ProductStockModel>(stock.ProductId.ToString());
            await Database.StringSetAsync(entityKey, stock.ToJson(), expire);
        }
Beispiel #6
0
 public async Task <IActionResult> updateData([FromBody] ProductStockModel objData)
 {
     try
     {
         return(Ok(_objModule.UpdateAsync(objData)));
     }
     catch (Exception e)
     {
         return(BadRequest(e.Message.ConvertExceptionToErrorInfo()));
     }
 }
Beispiel #7
0
        /// <summary>
        ///     UpdateAsync Product to database
        /// </summary>
        /// <param name="id">The id of Product</param>
        /// <param name="Product">The object of Product</param>
        /// <returns>null</returns>
        public async Task <ProductStockModel> UpdateAsync(ProductStockModel Product)
        {
            var ent = UnitOfWork.Context.Entry <ProductStockModel>(Product);

            ent.State = EntityState.Modified;
            int re = await UnitOfWork.Context.SaveChangesAsync();

            //await UnitOfWork.ProductRepository.UpdateAsync(Product);
            //await SaveAsync();

            return(Product);
        }
Beispiel #8
0
        public async Task <IActionResult> AddNewProductStock([FromBody] ProductStockModel model)
        {
            try
            {
                await _productStockRepository.CreateProductStock(model);

                return(Ok());
            }
            catch (Exception ex)
            {
                return(Ok(ex));
            }
        }
Beispiel #9
0
        public async Task <IActionResult> GatProductStock(int productStockId)
        {
            try
            {
                ProductStockModel productStock = await _productStockRepository.GetProductStock(productStockId);

                return(Ok(productStock));
            }
            catch (Exception ex)
            {
                return(Ok(ex));
            }
        }
        /// <summary>
        /// Removes / frees booked products
        /// </summary>
        /// <param name="productsToUnbook"> Products to be removed from the booked section abd be made available to be sold</param>
        public void UnBookProducts(List <OrderProductModel> productsToUnbook)
        {
            foreach (OrderProductModel product in productsToUnbook)
            {
                ProductStockModel selectedProductStock = GlobalConfig.Connection.GetProductStock_Single(product.ProductId);

                if (CanUnBookProduct(product, selectedProductStock))
                {
                    selectedProductStock.BookedQuantity    -= product.OrderedQuantity;
                    selectedProductStock.AvailableQuantity += product.OrderedQuantity;
                    GlobalConfig.Connection.UpdateProductStockModel(selectedProductStock);
                }
            }
        }
Beispiel #11
0
        public async Task <IActionResult> UpdateProductStock(int productStockId, [FromBody] ProductStockModel model)
        {
            try
            {
                model.Id = productStockId;
                await _productStockRepository.UpdateProductStock(model);

                return(Ok());
            }
            catch (Exception ex)
            {
                return(Ok(ex));
            }
        }
        /// <summary>
        /// Adds a product to stock as a new entry or updating an existing one
        /// </summary>
        public void AddProductToStock(ProductStockModel product)
        {
            ProductStockModel existingProductStock = GlobalConfig.Connection.GetProductStock_Single(product.ProductId);

            if (existingProductStock != null)
            {
                existingProductStock.Quantity          += product.Quantity;
                existingProductStock.AvailableQuantity += product.AvailableQuantity;
                GlobalConfig.Connection.UpdateProductStockModel(existingProductStock);
            }
            else
            {
                GlobalConfig.Connection.CreateProductStock(product);
            }
        }
        /// <summary>
        /// Removes / frees booked products
        /// </summary>
        /// <param name="productsToRemove"> Products to be removed from the booked section abd be made available to be sold</param>
        public void RemoveProductsFromStock(List <OrderProductModel> productsToRemove)
        {
            foreach (OrderProductModel product in productsToRemove)
            {
                ProductStockModel selectedProductStock = GlobalConfig.Connection.GetProductStock_Single(product.ProductId);

                if (selectedProductStock != null)
                {
                    selectedProductStock.Quantity          -= product.OrderedQuantity;
                    selectedProductStock.AvailableQuantity -= product.OrderedQuantity;

                    GlobalConfig.Connection.UpdateProductStockModel(selectedProductStock);
                }
            }
        }
        /// <summary>
        /// Add the product quantities on the purchase invoice in stock making them available to be sold
        /// </summary>
        public void AddInvoicedProductsToStock(List <PurchaseOrderDetails_Join> PurchaseOrderContentList)
        {
            foreach (var row in PurchaseOrderContentList)
            {
                if (row.ProductId != 0 && row.ProductName != "" && row.Quantity != 0)
                {
                    ProductStockModel productStock = new ProductStockModel()
                    {
                        ProductId         = row.ProductId,
                        Quantity          = row.Quantity,
                        AvailableQuantity = row.Quantity,
                    };

                    AddProductToStock(productStock);
                }
            }
        }
Beispiel #15
0
        //Post([FromBody] ClassType classType)
        public async Task <IActionResult> insertData([FromBody] ProductStockModel objData)
        {
            try
            {
                //ProductStockModel objData = new ProductStockModel();
                //objData.product_id = id;
                //objData.item_amt = amt;

                return(Ok(_objModule.InsertAsync(objData)));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message.ConvertExceptionToErrorInfo()));

                throw;
            }
        }
Beispiel #16
0
        public void Test()
        {
            var        pub = new Publisher();
            Subscriber sb  = new Subscriber(1, pub);
            Subscriber sb2 = new Subscriber(2, pub);
            // Subscriber sb3 = new Subscriber(3, pub);
            //   Subscriber sb4 = new Subscriber(4, pub);

            var product = new ProductStockModel(1, 2, "Product A"); // get from Catalog context

            pub.RemoveStock(product, 2);
            //pub.AddToStock(product, 10);

            var product2 = new ProductStockModel(1, 2, "Product B"); // get from Catalog context

            pub.RemoveStock(product2, 4);
            //  pub.AddToStock(product, 10);
        }
Beispiel #17
0
        /// <summary>
        /// Initializes fields in the "Product Stock " groupBox asociated with the selected product
        /// </summary>
        private void InitializeProductStockDetails_GroupBox(int productId)
        {
            if (productId > 0)
            {
                ProductStockModel selectedProductStock = GlobalConfig.Connection.GetProductStock_Single(productId);

                if (selectedProductStock != null)
                {
                    ProductTotalStockQuantityLabel.Text = selectedProductStock.Quantity == 0 ? "0" : selectedProductStock.Quantity.ToString();
                    ProductBookedQuantityLabel.Text     = selectedProductStock.BookedQuantity == 0 ? "0" : selectedProductStock.BookedQuantity.ToString();
                    ProductAvailableQuantityLabel.Text  = (selectedProductStock.Quantity - selectedProductStock.BookedQuantity).ToString();
                }
                else
                {
                    ProductTotalStockQuantityLabel.Text = "0";
                    ProductBookedQuantityLabel.Text     = "0";
                    ProductAvailableQuantityLabel.Text  = "0";
                }
            }
        }
Beispiel #18
0
        private List <ProductStockModel> datafunc()
        {
            var listdata = new List <ProductStockModel>();

            foreach (var row in grdOpeningstock.Rows)
            {
                var tempdata = new ProductStockModel()
                {
                    ProductId      = Convert.ToInt32(row.Cells["ProductId"].Value),
                    OrganisationId = 1,
                    WareHouseId    = Convert.ToInt32(cmbWarehouse.SelectedValue),
                    OpeningStock   = Convert.ToInt32(row.Cells["OpeningStock"].Value),
                    CurrentStock   = Convert.ToInt32(row.Cells["OpeningStock"].Value),
                    InOutMode      = "IN",
                };
                listdata.Add(tempdata);
            }
            _commonservice.SaveProductStock(listdata);


            return(listdata);
        }
Beispiel #19
0
        public async Task <IActionResult> Create(int productId, [FromBody] ProductStockModel model)
        {
            if (!ModelState.IsValid)
            {
                _logger.LogInformation($"Invalid data submitted for product ID {model.ProductId}");
                return(BadRequest(ModelState));
            }

            var product = await _productService.GetProduct(model.ProductId);

            if (product == null)
            {
                _logger.LogInformation($"Product ID {model.ProductId} not found");
                return(NotFound());
            }

            try
            {
                var stock = new ProductStock
                {
                    Product          = product,
                    PurchaseDate     = model.PurchaseDate,
                    PurchaseQuantity = model.PurchaseQuantity,
                    PurchasePrice    = model.PurchasePrice,
                    UserId           = GetUserId()
                };

                await _productService.RestockProduct(stock);

                return(Ok(model)); // Not sure if this is what _should_ be returned here or not...
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"Error re-stocking product ID {model.ProductId}");
                return(StatusCode(500, "Error re-stocking product"));
            }
        }
Beispiel #20
0
        /// <summary>
        ///     Insert new Product to database
        /// </summary>
        /// <param name="blackList">The object of Product</param>
        /// <returns>The Product object</returns>
        public async Task <ProductStockModel> InsertAsync(ProductStockModel objData)
        {
            //if (UnitOfWork.ProductStockRepository.Get(p => p.stock_trn_id == Product.stock_trn_id /*&& p.Status == StatusOfProduct.Enabled*/).Count() > 0)
            //    throw new Exception(new ErrorInfo
            //    {
            //        Message = $"Can not insert Product code : {Product.stock_trn_id} duplicate data",
            //        MessageLocal = $"ไม่สามารถเพิ่มข้อมูลนี้ได้ เนื่องจาก : {Product.stock_trn_id} มีในระบบแล้ว",
            //        Data = Product.stock_trn_id
            //    }.ConvertErrorInfoToException());

            //return await UnitOfWork.ProductStockRepository.InsertAsync(Product);



            using (var cmd = UnitOfWork.Context.Database.GetDbConnection().CreateCommand())
            {
                cmd.CommandText = "stk_trn_insert";
                cmd.CommandType = CommandType.StoredProcedure;

                // InPut param
                cmd.Parameters.Add(new SqlParameter("@product_id", SqlDbType.BigInt)
                {
                    Value = objData.product_id
                });
                cmd.Parameters.Add(new SqlParameter("@item_amt", SqlDbType.BigInt)
                {
                    Value = objData.item_amt
                });
                cmd.Parameters.Add(new SqlParameter("@from_action", SqlDbType.NChar)
                {
                    Value = objData.from_action
                });
                cmd.Parameters.Add(new SqlParameter("@UserId", SqlDbType.BigInt)
                {
                    Value = objData.CreateByUserId
                });
                cmd.Parameters.Add(new SqlParameter("@relate_doc_id", SqlDbType.BigInt)
                {
                    Value = objData.relate_doc_id
                });
                // OutPut return
                cmd.Parameters.Add(new SqlParameter("@retrunID", SqlDbType.BigInt)
                {
                    Direction = ParameterDirection.Output
                });
                cmd.Parameters.Add(new SqlParameter("@returnRemainAmt", SqlDbType.BigInt)
                {
                    Direction = ParameterDirection.Output
                });



                //cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.BigInt) { Direction = ParameterDirection.Output });

                if (UnitOfWork.Context.Database.GetDbConnection().State == ConnectionState.Closed)
                {
                    UnitOfWork.Context.Database.OpenConnection();
                }

                if (cmd.ExecuteNonQuery() == 0)
                {
                    throw new Exception(new ErrorInfo
                    {
                        Message      = $"Can not insert Product code : {objData.product_id} duplicate data",
                        MessageLocal = $"ไม่สามารถเพิ่มข้อมูลนี้ได้ เนื่องจาก : {objData.product_id} มีในระบบแล้ว",
                        Data         = objData.product_id
                    }.ConvertErrorInfoToException());
                }

                //return await Task.Factory.StartNew(() =>
                //{
                objData.stock_trn_id = Convert.ToInt32(cmd.Parameters["@retrunID"].Value.ToString());;
                objData.remain_amt   = Convert.ToInt32(cmd.Parameters["@returnRemainAmt"].Value.ToString());
                int i = Convert.ToInt32(objData.remain_amt);
                return(objData);
                //});
            }
        }
Beispiel #21
0
        /// <summary>
        ///     Insert new Product to database
        /// </summary>
        /// <param name="blackList">The object of Product</param>
        /// <returns>The Product object</returns>
        public async Task <ReturnRequisitionDataModel> SaveReturnRequisitionData(ReturnRequisitionDataModel objData)
        {
            try
            {
                //ReturnRequisitionModel objMast = new ReturnRequisitionModel();

                //List<ProductModel> lstProRemain = new List<ProductModel>();
                //if (objData._master.description == "APR")
                //{
                //    foreach (var item in objData._lstProducts)
                //    {
                //        var objChk = UnitOfWork.Context.Set<ProductModel>().Where(w => w.product_id.Equals(item.product_id) && w.remain_amt < item.quantity).FirstOrDefault();
                //        if (objChk != null)
                //            lstProRemain.Add(objChk);
                //    }

                //    if (lstProRemain.Count > 0)
                //    {
                //        var lstMsg = lstProRemain.Select(s => string.Format("รายการสินค้า {0} ยอดคงเหลือ {1} น้อยกว่า ยอดเบิกจ่าย", s.product_name, s.remain_amt));
                //        throw new Exception(new ErrorInfo
                //        {
                //            Message = string.Join("\n", lstMsg),
                //            MessageLocal = string.Join("\n", lstMsg),
                //            Data = -1
                //        }.ConvertErrorInfoToException());
                //    }
                //}

                objData._master.ModifyDate     = DateTime.Today;
                objData._master.ModifyByUserId = 1;

                if (objData._master.retrun_requisition_id <= 0)
                {
                    //objData._master.document_no = "abc";

                    objData._master.CreateDate     = DateTime.Today;
                    objData._master.CreateByUserId = 1;
                    UnitOfWork.Context.Set <ReturnRequisitionModel>().Add(objData._master);
                }
                else
                {
                    UnitOfWork.Context.Set <ReturnRequisitionModel>().Update(objData._master);
                }

                int i = UnitOfWork.Context.SaveChanges();
                foreach (var item in objData._lstProducts)
                {
                    item.ModifyDate     = DateTime.Today;
                    item.ModifyByUserId = 1;
                    if (item.return_product_id <= 0)
                    {
                        item.retrun_requisition_id = objData._master.retrun_requisition_id;
                        //item.document_no = objData._master.document_no;
                        item.status         = "Y";
                        item.CreateDate     = DateTime.Today;
                        item.CreateByUserId = 1;
                        UnitOfWork.Context.Set <ReturnRequisitionProductModel>().Add(item);
                    }
                    else
                    {
                        UnitOfWork.Context.Set <ReturnRequisitionProductModel>().Update(item);
                    }

                    UnitOfWork.Context.SaveChanges();

                    if (item.return_quantity > 0)
                    {
                        ProductStockModel objStock = new ProductStockModel();
                        objStock.CreateByUserId = 1;
                        objStock.CreateDate     = DateTime.Today;
                        objStock.ModifyByUserId = item.ModifyByUserId;
                        objStock.ModifyDate     = item.ModifyDate;
                        objStock.product_id     = item.product_id;
                        objStock.relate_doc_id  = item.return_product_id;
                        objStock.item_amt       = item.return_quantity ?? 0;
                        objStock.from_action    = "RTN";

                        ProductStockModule processStock = new ProductStockModule(UnitOfWork);
                        await processStock.InsertAsync(objStock);
                    }
                }

                foreach (var item in objData._lstPackages)
                {
                    //item.ModifyDate = DateTime.Today;
                    //item.ModifyByUserId = 1;
                    if (item.return_requisition_package_id <= 0)
                    {
                        item.retrun_requisition_id = objData._master.retrun_requisition_id;
                        //item.document_no = objData._master.document_no;
                        item.status = "Y";
                        //item.CreateDate = DateTime.Today;
                        //item.CreateByUserId = 1;
                        UnitOfWork.Context.Set <ReturnRequisitionPackageModel>().Add(item);
                    }
                    else
                    {
                        UnitOfWork.Context.Set <ReturnRequisitionPackageModel>().Update(item);
                    }

                    UnitOfWork.Context.SaveChanges();
                }

                foreach (var item in objData._lstItems)
                {
                    //item.ModifyDate = DateTime.Today;
                    //item.ModifyByUserId = 1;
                    if (item.return_requisition_item_id <= 0)
                    {
                        item.retrun_requisition_id = objData._master.retrun_requisition_id;
                        //item.document_no = objData._master.document_no;
                        item.status = "Y";
                        //item.CreateDate = DateTime.Today;
                        //item.CreateByUserId = 1;
                        UnitOfWork.Context.Set <ReturnRequisitionItemModel>().Add(item);
                    }
                    else
                    {
                        UnitOfWork.Context.Set <ReturnRequisitionItemModel>().Update(item);
                    }

                    UnitOfWork.Context.SaveChanges();
                }

                return(objData);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
Beispiel #22
0
 private Task <bool> IsProductAlreadyExists(ProductStockModel model)
 {
     return(_context.ProductsStock.AsNoTracking()
            .AnyAsync(product => product.ProductId == model.ProductId && product.UserId == model.UserId));
 }
Beispiel #23
0
 /// <summary>
 /// Creates the product stock.
 /// </summary>
 /// <param name="model">The model.</param>
 public async Task CreateProductStock(ProductStockModel model)
 {
     await SaveProductStock(model);
 }
Beispiel #24
0
        /// <summary>
        ///     Insert new Product to database
        /// </summary>
        /// <param name="blackList">The object of Product</param>
        /// <returns>The Product object</returns>
        public async Task <RequisitionDataModel> SaveRequisitionData(RequisitionDataModel objData)
        {
            try
            {
                //RequisitionModel objMast = new RequisitionModel();

                List <ProductModel> lstProRemain = new List <ProductModel>();
                if ("APR,POS,DLV".Contains(objData._master.requisition_type))
                {
                    foreach (var item in objData._lstProducts)
                    {
                        var objChk = UnitOfWork.Context.Set <ProductModel>()
                                     .Where(w => w.product_id.Equals(item.product_id) && w.remain_amt < item.quantity)
                                     .FirstOrDefault();
                        if (objChk != null)
                        {
                            lstProRemain.Add(objChk);
                        }
                    }

                    if (lstProRemain.Count > 0)
                    {
                        var lstMsg = lstProRemain.Select(s =>
                                                         string.Format("รายการสินค้า {0} ยอดคงเหลือ {1} น้อยกว่า ยอดเบิกจ่าย", s.product_name,
                                                                       s.remain_amt));
                        throw new Exception(new ErrorInfo
                        {
                            Message      = string.Join("\n", lstMsg),
                            MessageLocal = string.Join("\n", lstMsg),
                            Data         = -1
                        }.ConvertErrorInfoToException());
                    }
                }

                objData._master.ModifyDate     = DateTime.Now;
                objData._master.ModifyByUserId = 1;

                if (objData._master.requisition_id <= 0)
                {
                    objData._master.document_no = "abc";

                    objData._master.CreateDate     = DateTime.Now;
                    objData._master.CreateByUserId = 1;
                    UnitOfWork.Context.Set <RequisitionModel>().Add(objData._master);
                }
                else
                {
                    UnitOfWork.Context.Set <RequisitionModel>().Update(objData._master);
                }

                int i = UnitOfWork.Context.SaveChanges();

                foreach (var item in objData._lstProducts)
                {
                    item.ModifyDate     = DateTime.Now;
                    item.ModifyByUserId = 1;
                    if (item.id <= 0)
                    {
                        item.requisition_id = objData._master.requisition_id;
                        item.document_no    = objData._master.document_no;
                        item.status         = "Y";
                        item.CreateDate     = DateTime.Now;
                        item.CreateByUserId = 1;
                        UnitOfWork.Context.Set <RequisitionProductModel>().Add(item);
                    }
                    else
                    {
                        UnitOfWork.Context.Set <RequisitionProductModel>().Update(item);
                    }

                    await UnitOfWork.Context.SaveChangesAsync();

                    if ("APR,POS,DLV".Contains(objData._master.requisition_type))
                    {
                        ProductStockModel objStock = new ProductStockModel();
                        objStock.CreateByUserId = 1;
                        objStock.CreateDate     = DateTime.Now;
                        objStock.ModifyByUserId = item.ModifyByUserId;
                        objStock.ModifyDate     = item.ModifyDate;
                        objStock.product_id     = item.product_id;
                        objStock.relate_doc_id  = item.requisition_id;
                        objStock.item_amt       = item.quantity;
                        objStock.from_action    = objData._master.requisition_type;

                        ProductStockModule processStock = new ProductStockModule(UnitOfWork);
                        await processStock.InsertAsync(objStock);
                    }
                }

                if (objData._lstPackages != null)
                {
                    foreach (var item in objData._lstPackages)
                    {
                        item.ModifyDate     = DateTime.Now;
                        item.ModifyByUserId = 1;
                        if (item.id <= 0)
                        {
                            item.requisition_id = objData._master.requisition_id;
                            item.document_no    = objData._master.document_no;
                            item.status         = "Y";
                            item.CreateDate     = DateTime.Now;
                            item.CreateByUserId = 1;
                            UnitOfWork.Context.Set <RequisitionPackageModel>().Add(item);
                        }
                        else
                        {
                            UnitOfWork.Context.Set <RequisitionPackageModel>().Update(item);
                        }

                        await UnitOfWork.Context.SaveChangesAsync();
                    }
                }

                return(objData);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
 /// <summary>
 /// Checks if the product stock model is not null, and there is enough booked quantity that we can also
 /// un-book the requested quantity from the sales order
 /// </summary>
 public static bool CanUnBookProduct(OrderProductModel product, ProductStockModel selectedProductStock)
 {
     return(selectedProductStock != null &&
            selectedProductStock.BookedQuantity >= product.OrderedQuantity &&
            selectedProductStock.Quantity >= product.OrderedQuantity);
 }
 /// <summary>
 /// Validates if the selected product is not null and has a quantity >= than the quantity we want to sell
 /// </summary>
 public bool CheckProductToSellAvailability(ProductStockModel selectedProductStock, int productQtyToAdd)
 {
     return(selectedProductStock != null && selectedProductStock.AvailableQuantity >= productQtyToAdd);
 }
        /// <summary>
        /// Adds the selected product to the selected sales order in the selected quantities and
        /// updates the product stock available quantity
        /// </summary>
        public void AddProductToSalesOrder(SalesOrderModel selectedOrder, ProductModel selectedProduct, ProductStockModel selectedProductStock, TaxModel taxToUse, int productQtyToAdd)
        {
            OrderProductModel productToSell = CheckIfProductExistsInSalesOrder(selectedProduct, selectedOrder);

            if (productToSell == null)
            {
                AddNewProductToSalesOrderContent(selectedOrder, selectedProduct, taxToUse, productQtyToAdd);
            }
            else
            {
                IncrementExistingProductInSalesOrderContent(productToSell, productQtyToAdd);
            }

            UpdateProductStock_OnAddToSalesOrder(selectedProductStock, productQtyToAdd);
        }
 /// <summary>
 /// Increment booked quantity/decrement available quantity, according to the quantity added to the sales order
 /// Update the ProductStockModel in the database
 /// </summary>
 public void UpdateProductStock_OnAddToSalesOrder(ProductStockModel selectedProductStock, int productQtyToAdd)
 {
     selectedProductStock.BookedQuantity    += productQtyToAdd;
     selectedProductStock.AvailableQuantity -= productQtyToAdd;
     GlobalConfig.Connection.UpdateProductStockModel(selectedProductStock);
 }
 /// <summary>
 /// Decrement booked quantity/inccrement available quantity for the selected ProductStockModel item
 /// </summary>
 public void UnBookSalesOrderProduct(ProductStockModel selectedProductStock)
 {
     selectedProductStock.BookedQuantity--;
     selectedProductStock.AvailableQuantity++;
     GlobalConfig.Connection.UpdateProductStockModel(selectedProductStock);
 }