コード例 #1
0
        public bool AllocateGoods([FromBody] RetrievalViewModel model)
        {
            bool bRes = RequestDAO.AllocateGoods(
                model.itemNo,
                model.DueDate,
                model.quantityRetrieval,
                model.quantityInstoreDamaged,
                model.quantityInstoreMissing);

            if (bRes)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
コード例 #2
0
        public ActionResult Edit(RetrievalViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            bool bRes = RequestDAO.AllocateGoods(
                model.itemNo,
                model.DueDate,
                model.quantityRetrieval,
                model.quantityInstoreDamaged,
                model.quantityInstoreMissing);

            if (bRes)
            {
                return(RedirectToAction("Index"));
            }
            else
            {
                return(View("~/Views/Shared/Error.cshtml"));
            }
        }
コード例 #3
0
ファイル: RequestDAO.cs プロジェクト: adampngys/invsys
        /// <summary>
        /// Allocate the stationery to each department according to the alphabet after the clerk retrieve goods
        /// </summary>
        /// <param name="itemNo">item number</param>
        /// <param name="DueDate">due date to retrieval goods</param>
        /// <param name="qtyRetrieval">retrieval quantity</param>
        /// <param name="qtyDamaged">damaged quantity</param>
        /// <param name="qtyMissing">missing quantity</param>
        /// <returns></returns>
        public static bool AllocateGoods(string itemNo, DateTime DueDate, int qtyRetrieval, int qtyDamaged, int qtyMissing)
        {
            #region validation
            // Validation here (qty info)
            if (qtyRetrieval <= 0 || qtyDamaged < 0 || qtyMissing < 0)
            {
                return(false);
            }

            // Fetch the product info from database
            int?_balance = DbFactory.Instance.context.Inventories.AsNoTracking().Where(x => x.itemNo == itemNo).
                           Select(x => x.balance).First();
            int balance = _balance == null ? 0 : (int)_balance;

            RetrievalViewModel model = ViewRetrievalGood(itemNo, DueDate);

            // when the balance can and cannot cover the requirement
            if (balance < (model.quantityTotalNeed + qtyDamaged + qtyMissing))
            {
                // cannot cover
                int inputQ = qtyRetrieval + qtyDamaged + qtyMissing;
                if (inputQ != balance)
                {
                    return(false);
                }
            }
            else
            {
                // can cover
                if (model.quantityTotalNeed != qtyRetrieval)
                {
                    return(false);
                }
            }
            #endregion

            using (var dbContextTransaction = DbFactory.Instance.context.Database.BeginTransaction())
            {
                try
                {
                    // in here we deal with the problem goods
                    if (qtyDamaged != 0)
                    {
                        createAdjVoucher(itemNo, -qtyDamaged, DateTime.Now.Date, MyReasonCode.InstoreDamaged);
                    }
                    if (qtyMissing != 0)
                    {
                        createAdjVoucher(itemNo, -qtyMissing, DateTime.Now.Date, MyReasonCode.InstoreMissing);
                    }

                    #region Distribute goods here
                    var product = DbFactory.Instance.context.Inventories.Where(x => x.itemNo == itemNo).First();
                    product.balance = product.balance == null ? 0 : (int)product.balance;

                    // get department list
                    var deps = DbFactory.Instance.context.Departments.OrderBy(x => x.departmentId).ToList();

                    // go through each department
                    foreach (var dep in deps)
                    {
                        // get the requests of this department
                        List <Request> requests = DbFactory.Instance.context.Requests.Include("RequestDetails").Where(x => x.departmentId == dep.departmentId && x.status == "approved" && x.approvedDate <= DueDate).ToList();
                        if (requests == null || requests.Count == 0)
                        {
                            continue;
                        }

                        // record the original quantity of this item
                        int qtyOriginal = (int)product.balance;

                        // go through each request
                        foreach (var req in requests)
                        {
                            if (req.RequestDetails != null)
                            {
                                // go through each request detail
                                foreach (var rd in req.RequestDetails)
                                {
                                    if (rd.itemNo == itemNo && rd.status == "unfulfilled")
                                    {
                                        // allocate item here
                                        int qtyPack = rd.quantityNeed - rd.quantityReceive;
                                        if (product.balance >= qtyPack)
                                        {
                                            // update inventory table**
                                            product.balance -= qtyPack;

                                            // update request detail table**
                                            rd.quantityPacked = qtyPack;
                                            rd.status         = "preparing";
                                        }
                                        else if (product.balance > 0)
                                        {
                                            // not enough balance
                                            qtyPack          = (int)product.balance;
                                            product.balance -= qtyPack;

                                            // update request detail table**
                                            rd.quantityPacked = qtyPack;
                                            rd.status         = "preparing";

                                            break;
                                        }
                                        else
                                        {
                                            // when no balance for request
                                            break;
                                        }
                                    }
                                }
                            }
                        }

                        // insert stock card record here**
                        int qtyGap = (int)product.balance - qtyOriginal;

                        // when we have allocated the item to this department
                        if (qtyGap != 0)
                        {
                            var stkCard = new StockCard()
                            {
                                itemNo       = itemNo,
                                dateModified = DateTime.Now.Date,
                                remark       = dep.departmentId,
                                quantity     = qtyGap,
                                balance      = (int)product.balance
                            };
                            DbFactory.Instance.context.StockCards.Add(stkCard);

                            // update the database!
                            DbFactory.Instance.context.SaveChanges();

                            // send the email to notify the department
                            string sEmail = DbFactory.Instance.context.Staffs.AsNoTracking().Where(x => x.staffId == dep.staffIdDR).Select(x => x.staffEmail).FirstOrDefault();
                            if (sEmail != null)
                            {
                                string mailSubject = "Notification for Retrieval";
                                string mailContent = string.Format("{0} department({1}): please collect goods tomorrow", dep.departmentName, sEmail);

                                bool result = MyEmail.SendEmail("*****@*****.**", mailSubject, mailContent);
                            }
                        }
                    }
                    #endregion

                    // commit the transaction
                    dbContextTransaction.Commit();
                }
                catch (Exception e)
                {
                    dbContextTransaction.Rollback();
                    return(false);
                }
            }

            return(true);
        }
コード例 #4
0
        public RetrievalViewModel ViewRetrievalGood(string itemNo, DateTime DueDate)
        {
            RetrievalViewModel myModel = RequestDAO.ViewRetrievalGood(itemNo, DueDate);

            return(myModel);
        }