Esempio n. 1
0
 public DTO.SaleOrder UploadClientPOFile(int saleOrderID, string newFile, string oldPointer, string tempFolder, out Library.DTO.Notification notification)
 {
     Module.Framework.DAL.DataFactory framework_factory = new Module.Framework.DAL.DataFactory();
     DTO.SaleOrder dtoSaleOrder = new DTO.SaleOrder();
     notification = new Library.DTO.Notification {
         Type = Library.DTO.NotificationType.Success, Message = "Upload success"
     };
     try
     {
         using (SaleOrderMngEntities context = CreateContext())
         {
             string newPointer = framework_factory.CreateNoneImageFilePointer(tempFolder, newFile, oldPointer);
             if (saleOrderID > 0)
             {
                 var saleOrder = context.SaleOrder.Where(o => o.SaleOrderID == saleOrderID).FirstOrDefault();
                 saleOrder.ClientPOFile = newPointer;
                 context.SaveChanges();
                 //get return data
                 dtoSaleOrder = GetBackData(saleOrderID, out notification);
             }
         }
         return(dtoSaleOrder);
     }
     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(dtoSaleOrder);
     }
 }
Esempio n. 2
0
        public bool Revise(int saleOrderID, ref object dtoItem, int setStatusBy, out Library.DTO.Notification notification)
        {
            notification = new Library.DTO.Notification()
            {
                Type = Library.DTO.NotificationType.Success, Message = "PI has been revised 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())
                {
                    SaleOrderStatus dbSaleOrderStatus = context.SaleOrderStatus.Where(o => o.SaleOrderID == saleOrderID && o.IsCurrentStatus == true).FirstOrDefault();
                    if (dbSaleOrderStatus.TrackingStatusID != Library.Helper.CONFIRMED && dbSaleOrderStatus.TrackingStatusID != Library.Helper.REVISION_CONFIRMED)
                    {
                        notification = new Library.DTO.Notification()
                        {
                            Message = "PI must be in CONFIRMED status before revise", Type = Library.DTO.NotificationType.Warning
                        };
                        return(false);
                    }

                    SetPIStatus(saleOrderID, Library.Helper.REVISED, setStatusBy);
                    dtoItems.TrackingStatusNM = Library.Helper.TEXT_STATUS_REVISED;
                    dtoItems.TrackingStatusID = Library.Helper.REVISED;

                    // 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);
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        public DTO.SaleOrder DB2DTO_SaleOrder(SaleOrderMng_SaleOrder_View dbItem)
        {
            DTO.SaleOrder dtoItem = AutoMapper.Mapper.Map <SaleOrderMng_SaleOrder_View, DTO.SaleOrder>(dbItem);

            /*
             *  FORMAT FIELDS DATETIME
             */
            if (dbItem.ConcurrencyFlag != null)
            {
                dtoItem.ConcurrencyFlag_String = Convert.ToBase64String(dbItem.ConcurrencyFlag);
            }

            if (dbItem.InvoiceDate.HasValue)
            {
                dtoItem.InvoiceDateFormated = dbItem.InvoiceDate.Value.ToString("dd/MM/yyyy");
            }

            if (dbItem.PIReceivedDate.HasValue)
            {
                dtoItem.PIReceivedDateFormated = dbItem.PIReceivedDate.Value.ToString("dd/MM/yyyy");
            }

            if (dbItem.DeliveryDate.HasValue)
            {
                dtoItem.DeliveryDateFormated = dbItem.DeliveryDate.Value.ToString("dd/MM/yyyy");
            }

            if (dbItem.DeliveryDateInternal.HasValue)
            {
                dtoItem.DeliveryDateInternalFormated = dbItem.DeliveryDateInternal.Value.ToString("dd/MM/yyyy");
            }

            if (dbItem.LDS.HasValue)
            {
                dtoItem.LDSFormated = dbItem.LDS.Value.ToString("dd/MM/yyyy");
            }

            if (dbItem.CreatedDate.HasValue)
            {
                dtoItem.CreatedDateFormated = dbItem.CreatedDate.Value.ToString("dd/MM/yyyy");
            }

            if (dbItem.UpdatedDate.HasValue)
            {
                dtoItem.UpdatedDateFormated = dbItem.UpdatedDate.Value.ToString("dd/MM/yyyy");
            }

            if (dbItem.PaymentDate.HasValue)
            {
                dtoItem.paymentDateFormated = dbItem.PaymentDate.Value.ToString("dd/MM/yyyy");
            }

            if (dbItem.IsDPReceived == true)
            {
                dbItem.IsDPReceived = dbItem.IsDPReceived.Value == true;
            }
            else
            {
                dbItem.IsDPReceived = dbItem.IsDPReceived.Value == false;
            }
            return(dtoItem);
        }
Esempio n. 5
0
        public DTO.DataContainer GetDataContainer(int id, int offerID, string orderType, out Library.DTO.Notification notification)
        {
            notification = new Library.DTO.Notification()
            {
                Type = Library.DTO.NotificationType.Success
            };
            Support.DAL.DataFactory support_factory = new Support.DAL.DataFactory();
            try
            {
                using (SaleOrderMngEntities context = CreateContext())
                {
                    DTO.DataContainer dtoItem = new DTO.DataContainer();

                    if (id > 0)
                    {
                        SaleOrderMng_SaleOrder_View dbItem;
                        dbItem = context.SaleOrderMng_SaleOrder_View
                                 .Include("SaleOrderMng_SaleOrderDetail_View.SaleOrderMng_SaleOrderDetailExtend_View")
                                 .Include("SaleOrderMng_SaleOrderExtend_View")
                                 .Include("SaleOrderMng_SaleOrderDetailSparepart_View")
                                 .Include("SaleOrderMng_SaleOrderProductReturn_View")
                                 .Include("SaleOrderMng_SaleOrderSparepartReturn_View")
                                 .Include("SaleOrderMng_WarehouseImport_View")
                                 .FirstOrDefault(o => o.SaleOrderID == id);
                        DTO.SaleOrder SaleOrderDTOItem = converter.DB2DTO_SaleOrder(dbItem);
                        dtoItem.SaleOrderData = SaleOrderDTOItem;
                    }
                    else
                    {
                        SaleOrderMng_Offer_View dbOffer = context.SaleOrderMng_Offer_View
                                                          //.Include("SaleOrderMng_OfferLine_View")
                                                          //.Include("SaleOrderMng_OfferLineSparepart_View")
                                                          .FirstOrDefault(o => o.OfferID == offerID);

                        // remove in-approrpiated items
                        if (!String.IsNullOrEmpty(orderType) && (orderType == "WAREHOUSE" || orderType == "FACTORY"))
                        {
                            if (orderType == "WAREHOUSE")
                            {
                                // remove factory item
                                dbOffer.SaleOrderMng_OTC_View.Where(o => o.OfferSeasonTypeID == 2 || o.OfferSeasonTypeID == 3).ToList().ForEach(o => dbOffer.SaleOrderMng_OTC_View.Remove(o));
                                //dbOffer.SaleOrderMng_OTCSparepart_View.Where(o => o.OfferSeasonTypeID == 4 || o.OfferSeasonTypeID == 5).ToList().ForEach(o => dbOffer.SaleOrderMng_OTCSparepart_View.Remove(o));
                            }
                            else
                            {
                                //remove warehouse item
                                dbOffer.SaleOrderMng_OTC_View.Where(o => o.OfferSeasonTypeID == 1 || o.OfferSeasonTypeID == null).ToList().ForEach(o => dbOffer.SaleOrderMng_OTC_View.Remove(o));
                                dbOffer.SaleOrderMng_OTCSparepart_View.Where(o => o.OfferSeasonTypeID == 1 || o.OfferSeasonTypeID == null).ToList().ForEach(o => dbOffer.SaleOrderMng_OTCSparepart_View.Remove(o));
                            }
                        }
                        else
                        {
                            dbOffer.SaleOrderMng_OTC_View.Clear();
                            dbOffer.SaleOrderMng_OTCSparepart_View.Clear();
                            orderType = null;
                        }
                        dbOffer.SaleOrderMng_OTC_View.Where(o => !o.Quantity.HasValue || o.Quantity == 0).ToList().ForEach(o => dbOffer.SaleOrderMng_OTC_View.Remove(o));
                        dbOffer.SaleOrderMng_OTCSparepart_View.Where(o => !o.Quantity.HasValue || o.Quantity == 0).ToList().ForEach(o => dbOffer.SaleOrderMng_OTCSparepart_View.Remove(o));

                        dtoItem.SaleOrderData = new DTO.SaleOrder();
                        dtoItem.SaleOrderData.SaleOrderExtends          = new List <DTO.SaleOrderExtend>();
                        dtoItem.SaleOrderData.SaleOrderDetails          = new List <DTO.SaleOrderDetail>();
                        dtoItem.SaleOrderData.SaleOrderDetailSpareparts = new List <DTO.SaleOrderDetailSparepart>();
                        dtoItem.SaleOrderData.SaleOrderProductReturns   = new List <DTO.SaleOrderProductReturn>();
                        dtoItem.SaleOrderData.SaleOrderSparepartReturns = new List <DTO.SaleOrderSparepartReturn>();

                        //SET INIT VALUE
                        dtoItem.SaleOrderData.OfferID          = offerID;
                        dtoItem.SaleOrderData.OfferUD          = dbOffer.OfferUD;
                        dtoItem.SaleOrderData.Season           = dbOffer.Season;
                        dtoItem.SaleOrderData.TrackingStatusNM = Library.Helper.TEXT_STATUS_CREATED;
                        dtoItem.SaleOrderData.PaymentTermID    = dbOffer.PaymentTermID;
                        dtoItem.SaleOrderData.DeliveryTermID   = dbOffer.DeliveryTermID;
                        dtoItem.SaleOrderData.PaymentTypeNM    = dbOffer.PaymentTypeNM;
                        dtoItem.SaleOrderData.DeliveryTypeNM   = dbOffer.DeliveryTypeNM;
                        //dtoItem.SaleOrderData.Season = Library.Helper.GetCurrentSeason();
                        dtoItem.SaleOrderData.Conditions = "ALL PRICES INCLUDE 2% DAMAGE RISK";
                        dtoItem.SaleOrderData.Currency   = dbOffer.Currency;
                        dtoItem.SaleOrderData.VATPercent = dbOffer.VAT;
                        dtoItem.SaleOrderData.IsViewDeliveryDateOnPrintout = true;
                        dtoItem.SaleOrderData.IsViewLDSOnPrintout          = true;
                        dtoItem.SaleOrderData.IsViewQuantityContOnPrintout = true;
                        dtoItem.SaleOrderData.OrderType = orderType;
                        int i = -1;
                        foreach (SaleOrderMng_OTC_View lineItem in dbOffer.SaleOrderMng_OTC_View.OrderBy(o => o.RowIndex))
                        {
                            DTO.SaleOrderDetail dtoDetail = new DTO.SaleOrderDetail();

                            dtoDetail.SaleOrderDetailID = i;
                            dtoDetail.OfferLineID       = lineItem.OfferLineID;
                            dtoDetail.ArticleCode       = lineItem.ArticleCode;
                            dtoDetail.Description       = lineItem.Description;
                            //dtoDetail.OrderQnt = lineItem.Quantity;
                            dtoDetail.UnitPrice = lineItem.FinalPrice;
                            dtoDetail.ProductID = lineItem.ProductID;
                            dtoDetail.Quantity  = lineItem.Quantity; //offer quantity

                            dtoDetail.PhysicalQnt     = lineItem.PhysicalQnt;
                            dtoDetail.OnSeaQnt        = lineItem.OnSeaQnt;
                            dtoDetail.TobeShippedQnt  = lineItem.TobeShippedQnt;
                            dtoDetail.ReservationQnt  = lineItem.ReservationQnt;
                            dtoDetail.FTSQnt          = lineItem.FTSQnt;
                            dtoDetail.ProductStatusID = 1;

                            dtoDetail.ClientArticleCode = lineItem.ClientArticleCode;
                            dtoDetail.ClientArticleName = lineItem.ClientArticleName;
                            dtoDetail.ClientOrderNumber = lineItem.ClientOrderNumber;
                            dtoDetail.ClientEANCode     = lineItem.ClientEANCode;


                            // themy
                            dtoDetail.OfferItemTypeID                    = lineItem.OfferItemTypeID;
                            dtoDetail.OfferItemTypeNM                    = lineItem.OfferItemTypeNM;
                            dtoDetail.ApproverName                       = lineItem.ApproverName;
                            dtoDetail.ApprovedDate                       = lineItem.ApprovedDate.HasValue ? lineItem.ApprovedDate.Value.ToString("dd/MM/yyyy HH:mm") : null;
                            dtoDetail.PlaningPurchasingPrice             = lineItem.PlaningPurchasingPrice;
                            dtoDetail.PlaningPurchasingPriceFactoryID    = lineItem.PlaningPurchasingPriceFactoryID;
                            dtoDetail.PlaningPurchasingPriceSourceID     = lineItem.PlaningPurchasingPriceSourceID;
                            dtoDetail.IsPlaningPurchasingPriceSelected   = lineItem.IsPlaningPurchasingPriceSelected;
                            dtoDetail.PlaningPurchasingPriceSelectedBy   = lineItem.PlaningPurchasingPriceSelectedBy;
                            dtoDetail.PlaningPurchasingPriceSelectedDate = lineItem.PlaningPurchasingPriceSelectedDate.HasValue ? lineItem.PlaningPurchasingPriceSelectedDate.Value.ToString("dd/MM/yyyy HH:mm") : null;
                            dtoDetail.PlaningPurchasingPriceSourceNM     = lineItem.PlaningPurchasingPriceSourceNM;
                            dtoDetail.PlanningPriceSelectorName          = lineItem.PlanningPriceSelectorName;
                            dtoDetail.UnitPrice = lineItem.OfferSalePrice;

                            dtoDetail.SaleOrderDetailExtends = new List <DTO.SaleOrderDetailExtend>();

                            dtoItem.SaleOrderData.SaleOrderDetails.Add(dtoDetail);
                            i = i - 1;
                        }

                        i = -1;
                        foreach (var item in dbOffer.SaleOrderMng_OTCSparepart_View.OrderBy(o => o.RowIndex))
                        {
                            DTO.SaleOrderDetailSparepart dtoSparepart = new DTO.SaleOrderDetailSparepart();
                            dtoSparepart.SaleOrderDetailSparepartID = i;
                            dtoSparepart.OfferLineSparepartID       = item.OfferLineSparepartID;
                            dtoSparepart.ArticleCode = item.ArticleCode;
                            dtoSparepart.Description = item.Description;
                            //dtoSparepart.OrderQnt = item.Quantity;
                            dtoSparepart.UnitPrice         = item.UnitPrice;
                            dtoSparepart.ProductStatusID   = 1;
                            dtoSparepart.ClientArticleCode = item.ClientArticleCode;
                            dtoSparepart.ClientArticleName = item.ClientArticleName;
                            dtoSparepart.ClientEANCode     = item.ClientEANCode;

                            dtoItem.SaleOrderData.SaleOrderDetailSpareparts.Add(dtoSparepart);

                            i = i - 1;
                        }
                    }
                    //get support data
                    dtoItem.DeliveryTerms   = support_factory.GetDeliveryTerm().ToList();
                    dtoItem.PaymentTerms    = support_factory.GetPaymentTerm().ToList();
                    dtoItem.Seasons         = support_factory.GetSeason().ToList();
                    dtoItem.OrderTypes      = GetOrderType().ToList();
                    dtoItem.ProductStatuses = GetProductStatus().ToList();
                    dtoItem.CostTypes       = GetCostTypes().ToList();
                    dtoItem.PaymentStatuses = GetPaymentStatus().ToList();
                    dtoItem.VATPercents     = GetVATPercent().ToList();
                    dtoItem.ReportTemplates = support_factory.GetReportTemplate().ToList();

                    // Get defautl report template
                    if (dtoItem.SaleOrderData.DefaultPiReport == null)
                    {
                        var defaultRpt = dtoItem.ReportTemplates.FirstOrDefault(x => x.ReportType == "PI" && x.IsDefault == true).ReportTemplateNM;
                        dtoItem.SaleOrderData.DefaultPiReport = defaultRpt;
                    }

                    return(dtoItem);
                }
            }
            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(new DTO.DataContainer());
            }
        }
Esempio n. 6
0
        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);
            }
        }
Esempio n. 7
0
        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);
            }
        }
        /// <summary>
        /// Hien thoi khong su dung ham nay (entities dang bi loi, sau nay se bo)
        /// </summary>
        /// <param name="dtoItem"></param>
        /// <param name="notification"></param>
        /// <returns></returns>
        public bool CreateReturnData(object dtoItems, out Library.DTO.Notification notification)
        {
            DTO.SaleOrder dtoItem = ((Newtonsoft.Json.Linq.JObject)dtoItems).ToObject <DTO.SaleOrder>();
            notification = new Library.DTO.Notification()
            {
                Type = Library.DTO.NotificationType.Success, Message = "You have been returned goods success"
            };

            if (dtoItem.SaleOrderID <= 0)
            {
                throw new Exception("You need save PI before return data");
            }

            try
            {
                using (SaleOrderReturnEntities context = CreateContext())
                {
                    //check quantity return that user entered
                    foreach (var item in dtoItem.SaleOrderProductReturns.Where(o => o.SaleOrderProductReturnID < 0))
                    {
                        var dbRemain = context.SaleOrderMng_LoadingPlanDetail_View.Where(o => o.LoadingPlanDetailID == item.LoadingPlanDetailID).FirstOrDefault();
                        if (dbRemain != null && item.OrderQnt > dbRemain.RemaingReturnQnt)
                        {
                            throw new Exception("Quantity of product: " + item.ArticleCode + "(" + item.Description + ") must be less than quantity of return remaining");
                        }
                    }

                    foreach (var item in dtoItem.SaleOrderSparepartReturns.Where(o => o.SaleOrderSparepartReturnID < 0))
                    {
                        var dbRemain = context.SaleOrderMng_LoadingPlanSparepartDetail_View.Where(o => o.LoadingPlanSparepartDetailID == item.LoadingPlanSparepartDetailID).FirstOrDefault();
                        if (dbRemain != null && item.OrderQnt > dbRemain.RemaingReturnQnt)
                        {
                            throw new Exception("Quantity of product: " + item.ArticleCode + "(" + item.Description + ") must be less than quantity of return remaining");
                        }
                    }

                    //get reuturn index
                    int?returnIdex          = 1;
                    int?returnIdexSparepart = 1;

                    if (dtoItem.SaleOrderProductReturns.Where(o => o.SaleOrderProductReturnID > 0).Count() > 0)
                    {
                        returnIdex = dtoItem.SaleOrderProductReturns.OrderByDescending(o => o.ReturnIndex).FirstOrDefault().ReturnIndex + 1;
                    }
                    if (dtoItem.SaleOrderSparepartReturns.Where(o => o.SaleOrderSparepartReturnID > 0).Count() > 0)
                    {
                        returnIdexSparepart = dtoItem.SaleOrderSparepartReturns.OrderByDescending(o => o.ReturnIndex).FirstOrDefault().ReturnIndex + 1;
                    }

                    //create offer and fobwarehouse saleorder to prepare to import data to warehouse
                    Offer_Return dbOffer = new Offer_Return();
                    dbOffer.ClientID     = 70560; //EUROFAR
                    dbOffer.SaleID       = 23;    //IRON
                    dbOffer.Season       = dtoItem.Season;
                    dbOffer.OfferVersion = 1;
                    dbOffer.Currency     = dtoItem.Currency;
                    dbOffer.OfferUD      = context.OfferMng_function_GenerateOfferCode(null, dbOffer.Season, dbOffer.SaleID, dbOffer.ClientID).FirstOrDefault();

                    OfferStatus_Return dbOfferStatus = new OfferStatus_Return();
                    dbOfferStatus.TrackingStatusID = Library.Helper.CREATED;
                    dbOfferStatus.StatusDate       = DateTime.Now;
                    dbOfferStatus.UpdatedBy        = dtoItem.UpdatedBy;
                    dbOfferStatus.IsCurrentStatus  = true;
                    dbOffer.OfferStatus.Add(dbOfferStatus);

                    SaleOrder_Return dbSaleOrder = new SaleOrder_Return();
                    dbSaleOrder.Season            = dtoItem.Season;
                    dbSaleOrder.InvoiceDate       = DateTime.Now;
                    dbSaleOrder.OrderType         = "FOB_WAREHOUSE";
                    dbSaleOrder.ProformaInvoiceNo = context.SaleOrderMng_function_GeneratePINo(371, dtoItem.UpdatedBy).FirstOrDefault();
                    dbSaleOrder.CreatedBy         = dtoItem.UpdatedBy;
                    dbSaleOrder.CreatedDate       = DateTime.Now;
                    dbSaleOrder.OriginSaleOrderID = dtoItem.SaleOrderID;
                    dbOffer.SaleOrder.Add(dbSaleOrder);

                    SaleOrderStatus_Return dbSaleOrderStatus = new SaleOrderStatus_Return();
                    dbSaleOrderStatus.TrackingStatusID = Library.Helper.CREATED;
                    dbSaleOrderStatus.StatusDate       = DateTime.Now;
                    dbSaleOrderStatus.UpdatedBy        = dtoItem.UpdatedBy;
                    dbSaleOrderStatus.IsCurrentStatus  = true;
                    dbSaleOrder.SaleOrderStatus.Add(dbSaleOrderStatus);

                    WarehouseImport dbWarehouseImport = new WarehouseImport();
                    dbWarehouseImport.ReceiptNo     = context.SaleOrderMng_funtions_GenerateWarehouseImportReceiptNo(dtoItem.Season).FirstOrDefault();
                    dbWarehouseImport.ImportedDate  = DateTime.Now;
                    dbWarehouseImport.IsConfirmed   = true;
                    dbWarehouseImport.UpdatedBy     = dtoItem.UpdatedBy;
                    dbWarehouseImport.UpdatedDate   = DateTime.Now;
                    dbWarehouseImport.ConfirmedBy   = dtoItem.UpdatedBy;
                    dbWarehouseImport.ConfirmedDate = DateTime.Now;
                    dbWarehouseImport.ImportTypeID  = 2;
                    dbWarehouseImport.Season        = dtoItem.Season;

                    //create offerline
                    var selected_products = from p in dtoItem.SaleOrderProductReturns.Where(o => o.SaleOrderProductReturnID < 0)
                                            group p by new
                    {
                        p.ProductID,
                        p.ArticleCode,
                        p.ModelID,
                        p.MaterialID,
                        p.MaterialTypeID,
                        p.MaterialColorID,
                        p.FrameMaterialID,
                        p.FrameMaterialColorID,
                        p.SubMaterialID,
                        p.SubMaterialColorID,
                        p.SeatCushionID,
                        p.BackCushionID,
                        p.CushionColorID,
                        p.FSCTypeID,
                        p.FSCPercentID
                    } into g
                        select new
                    {
                        g.Key.ProductID,
                        g.Key.ArticleCode,
                        g.Key.ModelID,
                        g.Key.MaterialID,
                        g.Key.MaterialTypeID,
                        g.Key.MaterialColorID,
                        g.Key.FrameMaterialID,
                        g.Key.FrameMaterialColorID,
                        g.Key.SubMaterialID,
                        g.Key.SubMaterialColorID,
                        g.Key.SeatCushionID,
                        g.Key.BackCushionID,
                        g.Key.CushionColorID,
                        g.Key.FSCTypeID,
                        g.Key.FSCPercentID,
                        TotalQnt = g.Sum(x => x.OrderQnt)
                    };
                    OfferLine_Return             dbOfferLine              = new OfferLine_Return();
                    SaleOrderDetail_Return       dbSaleOrderDetail        = new SaleOrderDetail_Return();
                    SaleOrderProductReturn       dbProductReturn          = new SaleOrderProductReturn();
                    WarehouseImportProductDetail dbWarehouseImportProduct = new WarehouseImportProductDetail();
                    foreach (var item in selected_products)
                    {
                        dbOfferLine                      = new OfferLine_Return();
                        dbOfferLine.ArticleCode          = item.ArticleCode;
                        dbOfferLine.Description          = dtoItem.SaleOrderProductReturns.Where(o => o.ProductID == item.ProductID).FirstOrDefault().Description;
                        dbOfferLine.ModelID              = item.ModelID;
                        dbOfferLine.MaterialID           = item.MaterialID;
                        dbOfferLine.MaterialTypeID       = item.MaterialTypeID;
                        dbOfferLine.MaterialColorID      = item.MaterialColorID;
                        dbOfferLine.FrameMaterialID      = item.FrameMaterialID;
                        dbOfferLine.FrameMaterialColorID = item.FrameMaterialColorID;
                        dbOfferLine.SubMaterialID        = item.SubMaterialID;
                        dbOfferLine.SubMaterialColorID   = item.SubMaterialColorID;
                        dbOfferLine.SeatCushionID        = item.SeatCushionID;
                        dbOfferLine.BackCushionID        = item.BackCushionID;
                        dbOfferLine.CushionColorID       = item.CushionColorID;
                        dbOfferLine.FSCTypeID            = item.FSCTypeID;
                        dbOfferLine.FSCPercentID         = item.FSCPercentID;
                        dbOfferLine.Quantity             = item.TotalQnt;
                        dbOffer.OfferLine.Add(dbOfferLine);

                        //create saleOrderDetail
                        dbSaleOrderDetail                 = new SaleOrderDetail_Return();
                        dbSaleOrderDetail.OrderQnt        = item.TotalQnt;
                        dbSaleOrderDetail.ProductStatusID = 1;
                        dbOfferLine.SaleOrderDetail.Add(dbSaleOrderDetail);
                        dbSaleOrder.SaleOrderDetail.Add(dbSaleOrderDetail);

                        //create saleorder product return
                        foreach (var item_return in dtoItem.SaleOrderProductReturns.Where(o => o.SaleOrderProductReturnID < 0 && o.ProductID == item.ProductID))
                        {
                            dbProductReturn = new SaleOrderProductReturn();
                            dbProductReturn.LoadingPlanDetailID = item_return.LoadingPlanDetailID;
                            dbProductReturn.OrderQnt            = item_return.OrderQnt;
                            dbProductReturn.ReturnIndex         = returnIdex;
                            dbProductReturn.CreatedDate         = DateTime.Now;
                            dbSaleOrderDetail.SaleOrderProductReturn.Add(dbProductReturn);
                        }

                        //create fob warehouse import
                        var loadingplans = from p in dtoItem.SaleOrderProductReturns.Where(o => o.SaleOrderProductReturnID < 0 && o.ProductID == item.ProductID)
                                           group p by new { p.ProductID, p.LoadingPlanID } into g
                            select new { g.Key.ProductID, g.Key.LoadingPlanID, TotalQnt = g.Sum(x => x.OrderQnt) };

                        foreach (var item_loadingplan in loadingplans)
                        {
                            dbWarehouseImportProduct                 = new WarehouseImportProductDetail();
                            dbWarehouseImportProduct.ProductID       = item_loadingplan.ProductID;
                            dbWarehouseImportProduct.Quantity        = item_loadingplan.TotalQnt;
                            dbWarehouseImportProduct.ProductStatusID = 1;
                            //dbWarehouseImportProduct.LoadingPlanID = item_loadingplan.LoadingPlanID;

                            dbWarehouseImportProduct.WarehouseImport = dbWarehouseImport;
                            //dbSaleOrderDetail.WarehouseImportProductDetail.Add(dbWarehouseImportProduct);
                        }
                    }

                    //create offerlinesparepart
                    var selected_spareparts = from s in dtoItem.SaleOrderSparepartReturns.Where(o => o.SaleOrderSparepartReturnID < 0)
                                              group s by new { s.SparepartID, s.ArticleCode, s.ModelID, s.PartID } into g
                        select new { g.Key.SparepartID, g.Key.ArticleCode, g.Key.ModelID, g.Key.PartID, TotalQnt = g.Sum(o => o.OrderQnt) };

                    OfferLineSparepart_Return       dbOfferLineSparepart       = new OfferLineSparepart_Return();
                    SaleOrderDetailSparepart_Return dbSaleOrderDetailSparepart = new SaleOrderDetailSparepart_Return();
                    SaleOrderSparepartReturn        dbSparepartReturn          = new SaleOrderSparepartReturn();
                    WarehouseImportSparepartDetail  dbWarehouseImportSparepart = new WarehouseImportSparepartDetail();

                    foreach (var item in selected_spareparts)
                    {
                        dbOfferLineSparepart             = new OfferLineSparepart_Return();
                        dbOfferLineSparepart.ArticleCode = item.ArticleCode;
                        dbOfferLineSparepart.Description = dtoItem.SaleOrderSparepartReturns.Where(o => o.SparepartID == item.SparepartID).FirstOrDefault().Description;
                        dbOfferLineSparepart.ModelID     = item.ModelID;
                        dbOfferLineSparepart.PartID      = item.PartID;
                        dbOfferLine.Quantity             = item.TotalQnt;
                        dbOffer.OfferLineSparepart.Add(dbOfferLineSparepart);

                        //create SaleOrderDetailSparepart
                        dbSaleOrderDetailSparepart                 = new SaleOrderDetailSparepart_Return();
                        dbSaleOrderDetailSparepart.OrderQnt        = item.TotalQnt;
                        dbSaleOrderDetailSparepart.ProductStatusID = 1;

                        dbSaleOrderDetailSparepart.SaleOrder = dbSaleOrder;
                        dbOfferLineSparepart.SaleOrderDetailSparepart.Add(dbSaleOrderDetailSparepart);

                        //create sparepart return
                        foreach (var item_return in dtoItem.SaleOrderSparepartReturns.Where(o => o.SaleOrderSparepartReturnID < 0 && o.SparepartID == item.SparepartID))
                        {
                            dbSparepartReturn = new SaleOrderSparepartReturn();
                            dbSparepartReturn.LoadingPlanSparepartDetailID = item_return.LoadingPlanSparepartDetailID;
                            dbSparepartReturn.OrderQnt    = item_return.OrderQnt;
                            dbSparepartReturn.ReturnIndex = returnIdexSparepart;
                            dbSparepartReturn.CreatedDate = DateTime.Now;
                            dbSaleOrderDetailSparepart.SaleOrderSparepartReturn.Add(dbSparepartReturn);
                        }

                        //create fob warehouse import sparepart
                        var loadingplans = from p in dtoItem.SaleOrderSparepartReturns.Where(o => o.SaleOrderSparepartReturnID < 0 && o.SparepartID == item.SparepartID)
                                           group p by new { p.SparepartID, p.LoadingPlanID } into g
                            select new { g.Key.SparepartID, g.Key.LoadingPlanID, TotalQnt = g.Sum(x => x.OrderQnt) };

                        foreach (var item_loadingplan in loadingplans)
                        {
                            dbWarehouseImportSparepart                 = new WarehouseImportSparepartDetail();
                            dbWarehouseImportSparepart.SparepartID     = item_loadingplan.SparepartID;
                            dbWarehouseImportSparepart.Quantity        = item_loadingplan.TotalQnt;
                            dbWarehouseImportSparepart.ProductStatusID = 1;
                            //dbWarehouseImportSparepart.LoadingPlanID = item_loadingplan.LoadingPlanID;

                            dbWarehouseImportSparepart.WarehouseImport = dbWarehouseImport;
                            //dbSaleOrderDetailSparepart.WarehouseImportSparepartDetail.Add(dbWarehouseImportSparepart);
                        }
                    }
                    //save data
                    context.Offer.Add(dbOffer);
                    context.SaveChanges();
                }
                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);
            }
        }