public bool Confirm(int saleOrderID, ref object dtoItem, int setStatusBy, bool isConfirmWithoutSigned, out Library.DTO.Notification notification) { notification = new Library.DTO.Notification() { Type = Library.DTO.NotificationType.Success, Message = "PI has been confirmed success" }; DTO.SaleOrder dtoItems = ((Newtonsoft.Json.Linq.JObject)dtoItem).ToObject <DTO.SaleOrder>(); try { //SAVE DATA Library.DTO.Notification save_nofication = new Library.DTO.Notification { Type = Library.DTO.NotificationType.Success }; if (!UpdateData(setStatusBy, saleOrderID, ref dtoItem, out save_nofication)) { notification = save_nofication; return(false); } //VALIDATE && CONFIRM using (SaleOrderMngEntities context = CreateContext()) { SaleOrder dbSaleOrder = context.SaleOrder.Where(o => o.SaleOrderID == saleOrderID).FirstOrDefault(); OfferStatus dbOfferStatus = context.OfferStatus.Where(o => o.OfferID == dbSaleOrder.OfferID && o.IsCurrentStatus == true).FirstOrDefault(); if (dbOfferStatus.TrackingStatusID != Library.Helper.CONFIRMED && dbOfferStatus.TrackingStatusID != Library.Helper.REVISION_CONFIRMED) { notification = new Library.DTO.Notification() { Message = "Offer must be in CONFIRMED status before confirm PI", Type = Library.DTO.NotificationType.Warning }; return(false); } else if (isConfirmWithoutSigned) { if (string.IsNullOrEmpty(dbSaleOrder.PIReceivedRemark)) { notification = new Library.DTO.Notification() { Message = "PI must be filled-in [Signed PI Remark] before confirm", Type = Library.DTO.NotificationType.Warning }; return(false); } } else { if (dbSaleOrder.IsPIReceived == null || dbSaleOrder.IsPIReceived == false) { notification = new Library.DTO.Notification() { Message = "PI must be check [Signed PI Received] before confirm", Type = Library.DTO.NotificationType.Warning }; return(false); } } SaleOrderStatus dbSaleOrderStatus = context.SaleOrderStatus.Where(o => o.SaleOrderID == saleOrderID && o.IsCurrentStatus == true).FirstOrDefault(); if (dbSaleOrderStatus.TrackingStatusID != Library.Helper.REVISED && dbSaleOrderStatus.TrackingStatusID != Library.Helper.CREATED) { notification = new Library.DTO.Notification() { Message = "PI must be in REVISED/CREATED status before confirm", Type = Library.DTO.NotificationType.Warning }; return(false); } //set tracking status int TrackingStatusID = (dbSaleOrderStatus.TrackingStatusID == Library.Helper.CREATED ? Library.Helper.CONFIRMED : Library.Helper.REVISION_CONFIRMED); SetPIStatus(saleOrderID, TrackingStatusID, setStatusBy); //frozend PI printout data context.SaleOrderMng_function_FrozenSaleOrderPrintoutData(saleOrderID); //get back data dtoItems.TrackingStatusNM = (dbSaleOrderStatus.TrackingStatusID == Library.Helper.CREATED ? Library.Helper.TEXT_STATUS_CONFIRMED : Library.Helper.TEXT_STATUS_REVISION_CONFIRMED); dtoItems.TrackingStatusID = TrackingStatusID; //// add item to quotation if needed //context.FW_Quotation_function_AddFactoryOrderItem(null, saleOrderID, null); // table lockx and also check if item is available on sql server side return(true); } } catch (Exception ex) { notification.Type = Library.DTO.NotificationType.Error; notification.Message = ex.Message; if (ex.InnerException != null && !string.IsNullOrEmpty(ex.InnerException.Message)) { notification.DetailMessage.Add(ex.InnerException.Message); } return(false); } }
public void DTO2DB_SaleOrder(DTO.SaleOrder dtoItem, ref SaleOrder dbItem) { /* * MAP & CHECK SaleOrder */ List <SaleOrderDetail> itemNeedDelete_Details = new List <SaleOrderDetail>(); List <SaleOrderDetailExtend> itemNeedDelete_DetailExtends; if (dtoItem.SaleOrderDetails != null) { //CHECK foreach (SaleOrderDetail dbDetail in dbItem.SaleOrderDetail) { //DB NOT EXIST IN DTO if (!dtoItem.SaleOrderDetails.Select(s => s.SaleOrderDetailID).Contains(dbDetail.SaleOrderDetailID)) { itemNeedDelete_Details.Add(dbDetail); } else //DB IS EXIST IN DB { itemNeedDelete_DetailExtends = new List <SaleOrderDetailExtend>(); foreach (SaleOrderDetailExtend dbDetailExtend in dbDetail.SaleOrderDetailExtend) { if (!dtoItem.SaleOrderDetails.Where(o => o.SaleOrderDetailID == dbDetail.SaleOrderDetailID).FirstOrDefault().SaleOrderDetailExtends.Select(x => x.SaleOrderDetailExtendID).Contains(dbDetailExtend.SaleOrderDetailExtendID)) { itemNeedDelete_DetailExtends.Add(dbDetailExtend); } } foreach (SaleOrderDetailExtend dbDetailExtend in itemNeedDelete_DetailExtends) { dbDetail.SaleOrderDetailExtend.Remove(dbDetailExtend); } } } foreach (SaleOrderDetail dbDetail in itemNeedDelete_Details) { List <SaleOrderDetailExtend> item_deleteds = new List <SaleOrderDetailExtend>(); foreach (SaleOrderDetailExtend dbDetailExtend in dbDetail.SaleOrderDetailExtend) { item_deleteds.Add(dbDetailExtend); } foreach (SaleOrderDetailExtend item in item_deleteds) { dbItem.SaleOrderDetail.Where(o => o.SaleOrderDetailID == dbDetail.SaleOrderDetailID).FirstOrDefault().SaleOrderDetailExtend.Remove(item); } dbItem.SaleOrderDetail.Remove(dbDetail); } //MAP SaleOrderDetail _dbDetail; SaleOrderDetailExtend _dbDetailExtend; foreach (DTO.SaleOrderDetail dtoDetail in dtoItem.SaleOrderDetails) { if (dtoDetail.SaleOrderDetailID < 0) { _dbDetail = new SaleOrderDetail(); if (dtoDetail.SaleOrderDetailExtends != null) { foreach (DTO.SaleOrderDetailExtend dtoDetailExtend in dtoDetail.SaleOrderDetailExtends) { _dbDetailExtend = new SaleOrderDetailExtend(); _dbDetail.SaleOrderDetailExtend.Add(_dbDetailExtend); AutoMapper.Mapper.Map <DTO.SaleOrderDetailExtend, SaleOrderDetailExtend>(dtoDetailExtend, _dbDetailExtend); } } dbItem.SaleOrderDetail.Add(_dbDetail); } else { _dbDetail = dbItem.SaleOrderDetail.FirstOrDefault(o => o.SaleOrderDetailID == dtoDetail.SaleOrderDetailID); if (_dbDetail != null && dtoDetail.SaleOrderDetailExtends != null) { foreach (DTO.SaleOrderDetailExtend dtoDetailExtend in dtoDetail.SaleOrderDetailExtends) { if (dtoDetailExtend.SaleOrderDetailExtendID < 0) { _dbDetailExtend = new SaleOrderDetailExtend(); _dbDetail.SaleOrderDetailExtend.Add(_dbDetailExtend); } else { _dbDetailExtend = _dbDetail.SaleOrderDetailExtend.FirstOrDefault(o => o.SaleOrderDetailExtendID == dtoDetailExtend.SaleOrderDetailExtendID); } if (_dbDetailExtend != null) { AutoMapper.Mapper.Map <DTO.SaleOrderDetailExtend, SaleOrderDetailExtend>(dtoDetailExtend, _dbDetailExtend); } } } } if (_dbDetail != null) { AutoMapper.Mapper.Map <DTO.SaleOrderDetail, SaleOrderDetail>(dtoDetail, _dbDetail); } } } /* * MAP & CHECK SaleOrderExtend */ List <SaleOrderExtend> ItemNeedDelete_Extends = new List <SaleOrderExtend>(); if (dtoItem.SaleOrderExtends != null) { //CHECK foreach (SaleOrderExtend dbExtend in dbItem.SaleOrderExtend.Where(o => !dtoItem.SaleOrderExtends.Select(s => s.SaleOrderExtendID).Contains(o.SaleOrderExtendID))) { ItemNeedDelete_Extends.Add(dbExtend); } foreach (SaleOrderExtend dbExtend in ItemNeedDelete_Extends) { dbItem.SaleOrderExtend.Remove(dbExtend); } //MAP foreach (DTO.SaleOrderExtend dtoDescription in dtoItem.SaleOrderExtends) { SaleOrderExtend dbExtend; if (dtoDescription.SaleOrderExtendID < 0) { dbExtend = new SaleOrderExtend(); dbItem.SaleOrderExtend.Add(dbExtend); } else { dbExtend = dbItem.SaleOrderExtend.FirstOrDefault(o => o.SaleOrderExtendID == dtoDescription.SaleOrderExtendID); } if (dbExtend != null) { AutoMapper.Mapper.Map <DTO.SaleOrderExtend, SaleOrderExtend>(dtoDescription, dbExtend); } } } /* * MAP & CHECK SaleOrderDetailSparepart */ List <SaleOrderDetailSparepart> itemNeedDelete = new List <SaleOrderDetailSparepart>(); if (dtoItem.SaleOrderDetailSpareparts != null) { //CHECK foreach (SaleOrderDetailSparepart item in dbItem.SaleOrderDetailSparepart.Where(o => !dtoItem.SaleOrderDetailSpareparts.Select(s => s.SaleOrderDetailSparepartID).Contains(o.SaleOrderDetailSparepartID))) { itemNeedDelete.Add(item); } foreach (SaleOrderDetailSparepart item in itemNeedDelete) { dbItem.SaleOrderDetailSparepart.Remove(item); } //MAP foreach (DTO.SaleOrderDetailSparepart item in dtoItem.SaleOrderDetailSpareparts) { SaleOrderDetailSparepart dbSparepart; if (item.SaleOrderDetailSparepartID < 0) { dbSparepart = new SaleOrderDetailSparepart(); dbItem.SaleOrderDetailSparepart.Add(dbSparepart); } else { dbSparepart = dbItem.SaleOrderDetailSparepart.FirstOrDefault(o => o.SaleOrderDetailSparepartID == item.SaleOrderDetailSparepartID); } if (dbSparepart != null) { AutoMapper.Mapper.Map <DTO.SaleOrderDetailSparepart, SaleOrderDetailSparepart>(item, dbSparepart); } } } /* * MAP SaleOrder History */ SaleOrderHistory dbHistory = new SaleOrderHistory(); SaleOrderHistoryDetail dbHistoryDetail; foreach (DTO.SaleOrderDetail dtoDetail in dtoItem.SaleOrderDetails) { dbHistoryDetail = new SaleOrderHistoryDetail(); AutoMapper.Mapper.Map <DTO.SaleOrderDetail, SaleOrderHistoryDetail>(dtoDetail, dbHistoryDetail); dbHistory.SaleOrderHistoryDetail.Add(dbHistoryDetail); } AutoMapper.Mapper.Map <DTO.SaleOrder, SaleOrderHistory>(dtoItem, dbHistory); dbItem.SaleOrderHistory.Add(dbHistory); /* * SETUP FORMATED FIELD */ if (!string.IsNullOrEmpty(dtoItem.InvoiceDateFormated)) { dtoItem.InvoiceDate = DateTime.ParseExact(dtoItem.InvoiceDateFormated, "d", new System.Globalization.CultureInfo("vi-VN")); } else { dtoItem.InvoiceDate = null; } if (!string.IsNullOrEmpty(dtoItem.LDSFormated)) { dtoItem.LDS = DateTime.ParseExact(dtoItem.LDSFormated, "d", new System.Globalization.CultureInfo("vi-VN")); } else { dtoItem.LDS = null; } if (!string.IsNullOrEmpty(dtoItem.DeliveryDateFormated)) { dtoItem.DeliveryDate = DateTime.ParseExact(dtoItem.DeliveryDateFormated, "d", new System.Globalization.CultureInfo("vi-VN")); } else { dtoItem.DeliveryDate = null; } if (!string.IsNullOrEmpty(dtoItem.DeliveryDateInternalFormated)) { dtoItem.DeliveryDateInternal = DateTime.ParseExact(dtoItem.DeliveryDateInternalFormated, "d", new System.Globalization.CultureInfo("vi-VN")); } else { dtoItem.DeliveryDateInternal = null; } if (!string.IsNullOrEmpty(dtoItem.PIReceivedDateFormated)) { dtoItem.PIReceivedDate = DateTime.ParseExact(dtoItem.PIReceivedDateFormated, "d", new System.Globalization.CultureInfo("vi-VN")); } else { dtoItem.PIReceivedDate = null; } if (!string.IsNullOrEmpty(dtoItem.paymentDateFormated)) { dtoItem.PaymentDate = DateTime.ParseExact(dtoItem.paymentDateFormated, "d", new System.Globalization.CultureInfo("vi-VN")); } else { dtoItem.PaymentDate = null; } AutoMapper.Mapper.Map <DTO.SaleOrder, SaleOrder>(dtoItem, dbItem); }
public override bool UpdateData(int userId, int id, ref object dtoItem, out Notification notification) { notification = new Notification(); notification.Type = NotificationType.Success; DTO.SaleOrder dtoItems = ((Newtonsoft.Json.Linq.JObject)dtoItem).ToObject <DTO.SaleOrder>(); try { using (SaleOrderMngEntities context = CreateContext()) { SaleOrder dbItem = null; SaleOrderStatus dbStatus = null; if (id == 0) { if (!dtoItems.OfferID.HasValue) { throw new Exception("Invalid offer!"); } //else //{ // int offerID = dtoItem.OfferID.Value; // var dbOffer = context.SaleOrderMng_ApprovedOffer_View.FirstOrDefault(o => o.OfferID == offerID); // if (dbOffer == null) // { // throw new Exception("Offer has not been approved! Please contact your manager"); // } //} dbItem = new SaleOrder(); context.SaleOrder.Add(dbItem); //SET PI STATUS dbStatus = new SaleOrderStatus(); dbStatus.TrackingStatusID = Library.Helper.CREATED; dbStatus.StatusDate = DateTime.Now; dbStatus.UpdatedBy = userId; dbStatus.IsCurrentStatus = true; dbItem.SaleOrderStatus.Add(dbStatus); //SET PI No dtoItems.ProformaInvoiceNo = context.SaleOrderMng_function_GeneratePINo(dtoItems.UpdatedBy, dtoItems.OfferID).FirstOrDefault(); //SET TRACKING INFO dtoItems.CreatedBy = userId; dtoItems.CreatedDate = DateTime.Now; } else { dbItem = context.SaleOrder.FirstOrDefault(o => o.SaleOrderID == id); } if (dbItem == null) { notification.Message = "PI not found!"; return(false); } else { // check concurrency if (dbItem.ConcurrencyFlag != null && !dbItem.ConcurrencyFlag.SequenceEqual(Convert.FromBase64String(dtoItems.ConcurrencyFlag_String))) { throw new Exception(Library.Helper.TEXT_CONCURRENCY_CONFLICT); } if (id == 0) { int?offerTrackingStatusID = GetOfferTrackingStatus(dtoItems.OfferID, out notification); if (!(offerTrackingStatusID == 3 || offerTrackingStatusID == 5)) { throw new Exception("Offer should be confirmed before create new PI"); } } // check who update payment field string oldPaymentDate = (dbItem.PaymentDate == null ? "" : dbItem.PaymentDate.Value.ToString("dd/MM/yyyy")); string newPaymentDate = (dtoItems.paymentDateFormated == null ? "" : dtoItems.paymentDateFormated); if (dtoItems.PaymentStatusID != dbItem.PaymentStatusID || dtoItems.PaymentRemark != dbItem.PaymentRemark || newPaymentDate != oldPaymentDate) { dbItem.PaymentUpdatedBy = userId; dbItem.PaymentUpdatedDate = DateTime.Now; } //check invoice data in season 2015/2016 DateTime?startDate = new DateTime(Convert.ToInt32(dtoItems.Season.Substring(0, 4)), 10, 1); DateTime?endDate = new DateTime(Convert.ToInt32(dtoItems.Season.Substring(5, 4)), 9, 30); DateTime?invoiceDate = dtoItems.InvoiceDateFormated.ConvertStringToDateTime(); if (invoiceDate < startDate || invoiceDate > endDate) { throw new Exception("Invoice Date must be between " + startDate.Value.ToString("dd/MM/yyyy") + " and " + endDate.Value.ToString("dd/MM/yyyy") + " because the season is " + dtoItems.Season); } //read dto to db converter.DTO2DB_SaleOrder(dtoItems, ref dbItem); dbItem.UpdatedBy = userId; dbItem.UpdatedDate = DateTime.Now; //remove orphan item context.SaleOrderDetailExtend.Local.Where(o => o.SaleOrderDetail == null).ToList().ForEach(o => context.SaleOrderDetailExtend.Remove(o)); context.SaleOrderDetail.Local.Where(o => o.SaleOrder == null).ToList().ForEach(o => context.SaleOrderDetail.Remove(o)); context.SaleOrderExtend.Local.Where(o => o.SaleOrder == null).ToList().ForEach(o => context.SaleOrderExtend.Remove(o)); context.SaleOrderDetailSparepart.Local.Where(o => o.SaleOrder == null).ToList().ForEach(o => context.SaleOrderDetailSparepart.Remove(o)); //save data context.SaveChanges(); //// add item to quotation if needed //context.FW_Quotation_function_AddFactoryOrderItem(null, dbItem.SaleOrderID, null); // table lockx and also check if item is available on sql server side int OfferID = Convert.ToInt32(dbItem.OfferID); //reload data dtoItem = GetDataContainer(dbItem.SaleOrderID, OfferID, dbItem.OrderType, out notification); //if (id > 0) //{ // dtoItem = new DTO.SaleOrder { SaleOrderID = id }; //} //else //{ // dtoItem = new DTO.SaleOrder { SaleOrderID = dbItem.SaleOrderID }; //} //create reservation //if (dtoItem.OrderType == "WAREHOUSE") //{ // context.SaleOrderMng_function_CreateReservation(dtoItem.SaleOrderID, dtoItem.UpdatedBy); //} return(true); } } } catch (Exception ex) { notification.Type = Library.DTO.NotificationType.Error; notification.Message = Library.Helper.HandleExceptionSingleLine(ex); return(false); } }