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); } }
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")); } }
/// <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); }
public RetrievalViewModel ViewRetrievalGood(string itemNo, DateTime DueDate) { RetrievalViewModel myModel = RequestDAO.ViewRetrievalGood(itemNo, DueDate); return(myModel); }