public ActionResult UpdateOrdersBulkSingle(Order Order, OrderRecipientInfo shipmentAndRecipientInfo)
        {
            // get properties of tenant
            try
            {
                if (ModelState.IsValid)
                {
                    var orderDetailsList = GaneOrderDetailsSessionHelper.GetOrderDetailSession(shipmentAndRecipientInfo.PageSessionToken);
                    var orderNotesList   = GaneOrderNotesSessionHelper.GetOrderNotesSession(shipmentAndRecipientInfo.PageSessionToken);
                    OrderService.UpdateWorksOrderBulkSingle(Order, shipmentAndRecipientInfo, CurrentTenantId, CurrentWarehouseId, CurrentUserId, Mapper.Map(orderDetailsList, new List <OrderDetail>()), orderNotesList);
                    GaneOrderDetailsSessionHelper.ClearSessionTokenData(shipmentAndRecipientInfo.PageSessionToken);
                    GaneOrderNotesSessionHelper.ClearSessionTokenData(shipmentAndRecipientInfo.PageSessionToken);
                    return(Json(new { success = true, message = "Saved" }, JsonRequestBehavior.AllowGet));
                }

                SetViewBagItems();
                ViewBag.OrderDetails   = Order.OrderDetails;
                ViewBag.OrderProcesses = Order.OrderProcess;

                ViewBag.SupplierID = new SelectList(AccountServices.GetAllValidAccounts(CurrentTenantId, EnumAccountType.Supplier), "AccountID", "CompanyName", Order.AccountID);
                return(Json(new { success = false, message = "Model state not valid, failed to save!" }, JsonRequestBehavior.AllowGet));
            }
            catch (Exception Exp)
            {
                SetViewBagItems();
                ViewBag.OrderDetails   = Order.OrderDetails;
                ViewBag.OrderProcesses = Order.OrderProcess;
                ViewBag.SupplierID     = new SelectList(AccountServices.GetAllValidAccounts(CurrentTenantId, EnumAccountType.Supplier), "AccountID", "CompanyName", Order.AccountID);
                ModelState.AddModelError("", Exp.Message);
                return(Json(new { success = false, message = Exp.Message }, JsonRequestBehavior.AllowGet));
            }
        }
        public async Task <ActionResult> Create(Order Order, OrderRecipientInfo shipmentAndRecipientInfo)
        {
            // get properties of tenant
            try
            {
                if (ModelState.IsValid)
                {
                    var tempList       = GaneOrderDetailsSessionHelper.GetOrderDetailSession(shipmentAndRecipientInfo.PageSessionToken);
                    var orderNotesList = GaneOrderNotesSessionHelper.GetOrderNotesSession(shipmentAndRecipientInfo.PageSessionToken);

                    OrderService.CreateWorksOrder(Order, shipmentAndRecipientInfo, CurrentTenantId, CurrentWarehouseId, CurrentUserId, Mapper.Map(tempList, new List <OrderDetail>()), orderNotesList);

                    var result = await _ganeConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Works order logged", Mapper.Map(Order, new OrderViewModel()),
                                                                                                    sendImmediately : true, shipmentAndRecipientInfo : shipmentAndRecipientInfo, worksOrderNotificationType : WorksOrderNotificationTypeEnum.WorksOrderLogTemplate);

                    if (result != "Success")
                    {
                        TempData["Error"] = result;
                    }

                    return(AnchoredOrderIndex("WorksOrders", "Index", ViewBag.Fragment as string));
                }
                SetViewBagItems();
                ViewBag.OrderDetails              = Order.OrderDetails;
                ViewBag.OrderProcesses            = Order.OrderProcess;
                ViewBag.ForceRegeneratePageToken  = "True";
                ViewBag.ForceRegeneratedPageToken = shipmentAndRecipientInfo.PageSessionToken ?? Guid.NewGuid().ToString();
                ViewBag.SupplierID = new SelectList(AccountServices.GetAllValidAccounts(CurrentTenantId, EnumAccountType.Supplier), "AccountID", "CompanyName", Order.AccountID);
                return(View(Order));
            }
            catch (Exception Exp)
            {
                if (Exp.InnerException != null && Exp.InnerException.Message == "Duplicate Order Number")
                {
                    ModelState.AddModelError("OrderNumber", Exp.Message);
                }
                else if (Exp.InnerException != null && Exp.InnerException.Message.Contains("Template"))
                {
                    ModelState.AddModelError("PropertyTenantIds", Exp.Message);
                }
                else
                {
                    ModelState.AddModelError(string.Empty, Exp.Message);
                }

                SetViewBagItems();
                ViewBag.ForceRegeneratePageToken  = "True";
                ViewBag.ForceRegeneratedPageToken = shipmentAndRecipientInfo.PageSessionToken ?? Guid.NewGuid().ToString();
                ViewBag.OrderDetails   = Order.OrderDetails;
                ViewBag.OrderProcesses = Order.OrderProcess;
                ViewBag.SupplierID     = new SelectList(AccountServices.GetAllValidAccounts(CurrentTenantId, EnumAccountType.Supplier), "AccountID", "CompanyName", Order.AccountID);
                return(View(Order));
            }
        }
        public async Task <JsonResult> SaveCustomEmails(OrderRecipientInfo shipmentAndRecipientInfo)

        {
            if (string.IsNullOrEmpty(shipmentAndRecipientInfo.CustomRecipients) && shipmentAndRecipientInfo.AccountEmailContacts == null)
            {
                return(Json(false, JsonRequestBehavior.AllowGet));
            }
            else
            {
                var Order = OrderService.GetOrderById(shipmentAndRecipientInfo.orderId ?? 0);
                if (shipmentAndRecipientInfo.InventoryTransactionType == 8)
                {
                    var orderprocess = OrderService.GetOrderProcessByOrderProcessId(shipmentAndRecipientInfo.orderId ?? 0);
                    Order = orderprocess.Order;
                }
                AccountServices.UpdateOrderPTenantEmailRecipients(shipmentAndRecipientInfo.AccountEmailContacts, Order.OrderID, CurrentUserId);

                if (shipmentAndRecipientInfo.InventoryTransactionType == 8)
                {
                    var report = CreateDeliveryNotePrint(shipmentAndRecipientInfo.orderId ?? 0, null);
                    PrepareDirectory("~/UploadedFiles/reports/dn/");
                    var reportPath = "~/UploadedFiles/reports/dn/" + Order.OrderNumber + ".pdf";
                    report.ExportToPdf(Server.MapPath(reportPath));
                    var result = await GaneConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Sales Order Confirmation", Mapper.Map(Order, new OrderViewModel()), reportPath, shipmentAndRecipientInfo : shipmentAndRecipientInfo,
                                                                                                   worksOrderNotificationType : WorksOrderNotificationTypeEnum.SalesOrderUpdateTemplate);

                    return(Json(result, JsonRequestBehavior.AllowGet));
                }
                else if (Order.InventoryTransactionTypeId == (int)InventoryTransactionTypeEnum.SalesOrder)
                {
                    var report = CreateSalesOrderPrint(Order.OrderID);
                    PrepareDirectory("~/UploadedFiles/reports/so/");
                    var reportPath = "~/UploadedFiles/reports/so/" + Order.OrderNumber + ".pdf";
                    report.ExportToPdf(Server.MapPath(reportPath));
                    var result = await GaneConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Sales order", Mapper.Map(Order, new OrderViewModel()), reportPath, shipmentAndRecipientInfo : shipmentAndRecipientInfo,
                                                                                                   worksOrderNotificationType : WorksOrderNotificationTypeEnum.SalesOrderTemplate);

                    return(Json(result, JsonRequestBehavior.AllowGet));
                }
                else
                {
                    var report = CreatePurchaseOrderPrint(Order.OrderID);
                    PrepareDirectory("~/UploadedFiles/reports/po/");
                    var reportPath = "~/UploadedFiles/reports/po/" + Order.OrderNumber + ".pdf";
                    report.ExportToPdf(Server.MapPath(reportPath));
                    var result = await GaneConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Purchase Order", Mapper.Map(Order, new OrderViewModel()), reportPath, shipmentAndRecipientInfo : shipmentAndRecipientInfo,
                                                                                                   worksOrderNotificationType : WorksOrderNotificationTypeEnum.PurchaseOrderTemplate);

                    return(Json(result, JsonRequestBehavior.AllowGet));
                }
            }
        }
        public async Task <ActionResult> Edit(Order Order, OrderRecipientInfo shipmentAndRecipientInfo, string orderSaveAndComplete, string orderSaveAndProcess)
        {
            var orderCompleted = false;

            if (orderSaveAndComplete == "1")
            {
                Order.OrderStatusID = (int)OrderStatusEnum.Complete;
                orderCompleted      = true;
            }

            if (ModelState.IsValid)
            {
                var tempList       = GaneOrderDetailsSessionHelper.GetOrderDetailSession(shipmentAndRecipientInfo.PageSessionToken);
                var orderNotesList = GaneOrderNotesSessionHelper.GetOrderNotesSession(shipmentAndRecipientInfo.PageSessionToken);
                OrderService.SaveWorksOrder(Order, shipmentAndRecipientInfo, CurrentTenantId, CurrentWarehouseId, CurrentUserId, orderCompleted, Mapper.Map(tempList, new List <OrderDetail>()), orderNotesList);
                if (orderCompleted)
                {
                    try
                    {
                        if (shipmentAndRecipientInfo.SendEmailWithAttachment)
                        {
                            var result = await _ganeConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Works order completed", Mapper.Map(Order, new OrderViewModel()),
                                                                                                            sendImmediately : true, shipmentAndRecipientInfo : shipmentAndRecipientInfo, worksOrderNotificationType : WorksOrderNotificationTypeEnum.WorksOrderCompletedTemplate);

                            if (result != "Success")
                            {
                                TempData["Error"] = result;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new Exception("Exception while creating tenant email notification queue - " + ex.Message.ToString(), ex.InnerException);
                    }
                }
                ViewBag.Fragment = Request.Form["fragment"];
                if (orderSaveAndProcess == "1")
                {
                    return(Redirect(Url.RouteUrl(new { controller = "WorksOrders", action = "ProcessOrder", id = Order.OrderID }) + "?fragment=" + ViewBag.Fragment as string));
                }

                return(AnchoredOrderIndex("WorksOrders", "Index", ViewBag.Fragment as string));
            }

            ViewBag.ForceRegeneratePageToken  = "True";
            ViewBag.ForceRegeneratedPageToken = shipmentAndRecipientInfo.PageSessionToken ?? Guid.NewGuid().ToString();
            SetViewBagItems(Order);
            ViewBag.POStatusID = new SelectList(LookupServices.GetAllOrderStatuses(), "OrderStatusID", "Status", Order.OrderStatusID);
            ViewBag.SupplierID = new SelectList(AccountServices.GetAllValidAccounts(CurrentTenantId, EnumAccountType.Supplier), "SupplierID", "CompanyName", Order.AccountID);
            return(View(Order));
        }
 public Order SaveSalesOrder(Order order, OrderRecipientInfo shipmentAndRecipientInfo, int tenantId, int warehouseId,
                             int userId, List <OrderDetail> orderDetails = null, List <OrderNotes> orderNotes = null)
 {
     return(SalesOrderService.SaveSalesOrder(order, shipmentAndRecipientInfo, tenantId, warehouseId, userId, orderDetails, orderNotes));
 }
 public Order SaveWorksOrderBulkSingle(Order order, OrderRecipientInfo shipmentAndRecipientInfo, int tenantId, int warehouseId, int userId, List <OrderDetail> orderDetails = null, IEnumerable <OrderNotes> orderNotes = null)
 {
     return(WorksOrderService.SaveWorksOrderBulkSingle(order, shipmentAndRecipientInfo, tenantId, warehouseId, userId, orderDetails, orderNotes));
 }
Exemple #7
0
        public Order CreateSalesOrder(Order order, OrderRecipientInfo shipmentAndRecipientInfo, int tenantId, int warehouseId,
                                      int userId, List <OrderDetail> orderDetails = null, List <OrderNotes> orderNotes = null)
        {
            order.OrderNumber = order.OrderNumber.Trim();
            var duplicateOrder = _currentDbContext.Order.FirstOrDefault(m => m.OrderNumber.Equals(order.OrderNumber, StringComparison.CurrentCultureIgnoreCase));

            if (duplicateOrder != null)
            {
                throw new Exception($"Order Number {order.OrderNumber} already associated with another Order. Please regenerate order number.", new Exception("Duplicate Order Number"));
            }

            order.IssueDate     = DateTime.UtcNow;
            order.OrderStatusID = (int)OrderStatusEnum.Active;
            order.DateCreated   = DateTime.UtcNow;
            order.DateUpdated   = DateTime.UtcNow;
            order.TenentId      = tenantId;
            order.CreatedBy     = userId;
            order.UpdatedBy     = userId;
            order.WarehouseId   = warehouseId;
            if (order.AccountID > 0)
            {
                var account = _currentDbContext.Account.Find(order.AccountID);
                if (account != null)
                {
                    order.AccountCurrencyID = account.CurrencyID;
                }
            }
            if (!caCurrent.CurrentWarehouse().AutoAllowProcess)
            {
                order.OrderStatusID = _currentDbContext.OrderStatus.First(a => a.OrderStatusID == (int)OrderStatusEnum.Hold).OrderStatusID;
            }
            else
            {
                order.OrderStatusID = _currentDbContext.OrderStatus.First(a => a.OrderStatusID == (int)OrderStatusEnum.Active).OrderStatusID;
            }
            _currentDbContext.Order.Add(order);


            if (orderDetails != null)
            {
                if (orderDetails.Any(m => m.OrderDetailStatusId == (int)OrderStatusEnum.AwaitingAuthorisation))
                {
                    order.OrderStatusID = (int)OrderStatusEnum.AwaitingAuthorisation;
                }

                decimal?ordTotal = 0;
                foreach (var item in orderDetails)
                {
                    item.DateCreated   = DateTime.UtcNow;
                    item.CreatedBy     = userId;
                    item.OrderID       = order.OrderID;
                    item.TenentId      = tenantId;
                    item.SortOrder     = item.ProductMaster?.ProductGroup?.SortOrder ?? 0;
                    item.ProductMaster = null;
                    item.TaxName       = null;
                    item.Warranty      = null;
                    item.WarehouseId   = warehouseId;
                    order.OrderDetails.Add(item);
                    ordTotal = ordTotal + ((item.Price * item.Qty) + item.TaxAmount);
                }

                order.OrderTotal = (decimal)ordTotal;
            }
            if (orderNotes != null)
            {
                foreach (var item in orderNotes)
                {
                    item.DateCreated = DateTime.UtcNow;
                    item.CreatedBy   = userId;
                    item.OrderID     = order.OrderID;
                    item.TenantId    = tenantId;
                    order.OrderNotes.Add(item);
                }
            }
            if (shipmentAndRecipientInfo.AddAddressToAccount == true && order.AccountID > 0 && (!order.ShipmentAccountAddressId.HasValue || order.ShipmentAccountAddressId < 1))
            {
                var account        = _accountServices.GetAccountsById(order.AccountID.Value);
                var accountAddress = new AccountAddresses()
                {
                    AccountID       = order.AccountID.Value,
                    AddressLine1    = shipmentAndRecipientInfo.ShipmentAddressLine1,
                    AddressLine2    = shipmentAndRecipientInfo.ShipmentAddressLine2,
                    AddressLine3    = shipmentAndRecipientInfo.ShipmentAddressLine3,
                    Town            = shipmentAndRecipientInfo.ShipmentAddressLine4,
                    PostCode        = shipmentAndRecipientInfo.ShipmentAddressPostcode,
                    AddTypeShipping = true,
                    CountryID       = account.CountryID,
                    CreatedBy       = userId,
                    DateCreated     = DateTime.UtcNow,
                    IsActive        = true,
                    Name            = account.CompanyName
                };
                _currentDbContext.AccountAddresses.Add(accountAddress);
            }
            if (order.ShipmentAccountAddressId < 1)
            {
                order.ShipmentAccountAddressId = (int?)null;
            }

            if (order.ConsignmentTypeId == 4)
            {
                order.ShipmentAddressLine1     = _currentDbContext.ConsignmentTypes.FirstOrDefault(u => u.ConsignmentTypeId == 4)?.ConsignmentType;
                order.ShipmentAddressLine2     = null;
                order.ShipmentAddressLine3     = null;
                order.ShipmentAddressLine4     = null;
                order.ShipmentAddressPostcode  = null;
                order.ShipmentAccountAddressId = (int?)null;
            }


            #region SendEmailWithAttachment
            if (shipmentAndRecipientInfo.SendEmailWithAttachment)
            {
                if (shipmentAndRecipientInfo.AccountEmailContacts != null && shipmentAndRecipientInfo.AccountEmailContacts.Length > 0)
                {
                    foreach (var item in shipmentAndRecipientInfo.AccountEmailContacts)
                    {
                        string email = "";

                        var secondryAddress = _currentDbContext.AccountContacts.Where(u => u.AccountContactId == item).AsNoTracking().FirstOrDefault();
                        if (secondryAddress != null)
                        {
                            email = secondryAddress.ContactEmail;
                        }

                        var recipient = new OrderPTenantEmailRecipient()
                        {
                            OrderId          = order.OrderID,
                            EmailAddress     = email,
                            AccountContactId = item,
                            UpdatedBy        = userId,
                            DateUpdated      = DateTime.UtcNow,
                        };

                        _currentDbContext.OrderPTenantEmailRecipients.Add(recipient);
                    }
                }
            }
            #endregion

            _currentDbContext.SaveChanges();
            Inventory.StockRecalculateByOrderId(order.OrderID, warehouseId, tenantId, caCurrent.CurrentUser().UserId);

            return(order);
        }
Exemple #8
0
        public Order SaveSalesOrder(Order order, OrderRecipientInfo shipmentAndRecipientInfo, int tenantId, int warehouseId,
                                    int userId, List <OrderDetail> orderDetails = null, List <OrderNotes> orderNotes = null)
        {
            decimal total = 0;

            if (orderDetails != null)
            {
                var toAdd  = orderDetails.Where(a => a.OrderDetailID < 0).ToList();
                var cItems = orderDetails.Where(a => a.OrderDetailID > 0).ToList();

                var toDelete = _currentDbContext.OrderDetail.Where(a => a.OrderID == order.OrderID && a.IsDeleted != true).Select(a => a.OrderDetailID).Except(cItems.Select(a => a.OrderDetailID).ToList());
                foreach (var item in toDelete)
                {
                    var dItem = _currentDbContext.OrderDetail.FirstOrDefault(a => a.OrderDetailID == item);
                    dItem.IsDeleted = true;
                }

                foreach (var item in toAdd)
                {
                    int?taxId      = item.TaxID;
                    int?warrantyId = item.WarrantyID;
                    int productId  = item.ProductId;
                    item.DateCreated = DateTime.UtcNow;
                    item.CreatedBy   = userId;
                    item.TenentId    = tenantId;
                    item.OrderID     = order.OrderID;
                    total            = total + item.TotalAmount;
                    item.TenentId    = tenantId;
                    item.WarehouseId = warehouseId;
                    item.IsDeleted   = null;

                    if (item.WarrantyID > 0)
                    {
                        bool warrantyTypePercent = false;
                        var  warranty            = _currentDbContext.TenantWarranty.AsNoTracking().FirstOrDefault(x => x.WarrantyID == item.WarrantyID);
                        if (warranty != null)
                        {
                            warrantyTypePercent = warranty.IsPercent;
                        }
                        if (warrantyTypePercent)
                        {
                            item.WarrantyAmount = (item.TotalAmount / 100) * item.Warranty.PercentageOfPrice;
                        }
                        else
                        {
                            item.WarrantyAmount = item.Warranty.FixedPrice;
                        }
                    }

                    // fix navigation issue
                    item.ProductMaster = null;
                    item.TaxName       = null;
                    item.Warranty      = null;

                    item.ProductId  = productId;
                    item.TaxID      = taxId;
                    item.WarrantyID = warrantyId;

                    if (item.OrderDetailID > 0)
                    {
                        _currentDbContext.Entry(item).State = EntityState.Modified;
                    }
                    else
                    {
                        _currentDbContext.OrderDetail.Add(item);
                    }

                    _currentDbContext.SaveChanges();
                }

                foreach (var item in cItems)
                {
                    var orderDetail = _currentDbContext.OrderDetail.Find(item.OrderDetailID);

                    orderDetail.ProductId      = item.ProductId;
                    orderDetail.ExpectedDate   = item.ExpectedDate;
                    orderDetail.Qty            = item.Qty;
                    orderDetail.Price          = item.Price;
                    orderDetail.WarrantyID     = item.WarrantyID;
                    orderDetail.TaxID          = item.TaxID;
                    orderDetail.Notes          = item.Notes;
                    orderDetail.TaxAmount      = item.TaxAmount;
                    orderDetail.TotalAmount    = item.TotalAmount;
                    orderDetail.WarrantyAmount = item.WarrantyAmount;

                    _currentDbContext.Entry(orderDetail).State = EntityState.Modified;
                    total = total + item.TotalAmount;
                }

                _currentDbContext.SaveChanges();
            }

            else
            {
                foreach (var item in _currentDbContext.OrderDetail.Where(a => a.OrderID == order.OrderID && a.IsDeleted != true))
                {
                    item.IsDeleted = true;
                }
            }
            if (orderNotes != null)
            {
                if (orderNotes.Count == 0)
                {
                    var cItems = _currentDbContext.OrderNotes.Where(a => a.OrderID == order.OrderID && a.IsDeleted != true && a.TenantId == tenantId).ToList();
                    cItems.ForEach(m =>
                    {
                        m.DateUpdated = DateTime.UtcNow;
                        m.UpdatedBy   = userId;
                        m.IsDeleted   = true;
                    });
                }
                else
                {
                    orderNotes.Where(a => a.OrderNoteId < 0).ToList().ForEach(m =>
                    {
                        m.DateCreated = DateTime.UtcNow;
                        m.CreatedBy   = userId;
                        m.TenantId    = tenantId;
                        m.OrderID     = order.OrderID;
                        _currentDbContext.OrderNotes.Add(m);
                        _currentDbContext.SaveChanges();
                    });
                }
            }
            order.OrderTotal = total;

            if (shipmentAndRecipientInfo.AddAddressToAccount == true && shipmentAndRecipientInfo.ShipmentAddressLine1 != null && order.AccountID > 0 && (!order.ShipmentAccountAddressId.HasValue || order.ShipmentAccountAddressId < 1))
            {
                var account        = _accountServices.GetAccountsById(order.AccountID.Value);
                var accountAddress = new AccountAddresses()
                {
                    AccountID       = order.AccountID.Value,
                    AddressLine1    = shipmentAndRecipientInfo.ShipmentAddressLine1,
                    AddressLine2    = shipmentAndRecipientInfo.ShipmentAddressLine2,
                    AddressLine3    = shipmentAndRecipientInfo.ShipmentAddressLine3,
                    Town            = shipmentAndRecipientInfo.ShipmentAddressLine4,
                    PostCode        = shipmentAndRecipientInfo.ShipmentAddressPostcode,
                    AddTypeShipping = true,
                    CountryID       = account.CountryID,
                    CreatedBy       = userId,
                    DateCreated     = DateTime.UtcNow,
                    IsActive        = true,
                    Name            = account.CompanyName
                };
                _currentDbContext.AccountAddresses.Add(accountAddress);
            }

            var obj = _currentDbContext.Order.Find(order.OrderID);

            if (obj != null)
            {
                _currentDbContext.Entry(obj).State = System.Data.Entity.EntityState.Detached;
                order.CreatedBy   = obj.CreatedBy;
                order.DateCreated = obj.DateCreated;
                //order.OrderStatusID = obj.OrderStatusID;
                order.TenentId    = obj.TenentId;
                order.WarehouseId = obj.WarehouseId;
                if (order.ShipmentAccountAddressId < 1)
                {
                    order.ShipmentAccountAddressId = (int?)null;
                }
                order.InventoryTransactionTypeId = obj.InventoryTransactionTypeId;
                obj.OrderNumber = order.OrderNumber.Trim();
                obj.DateUpdated = DateTime.UtcNow;
                obj.UpdatedBy   = userId;
                obj.WarehouseId = warehouseId;
                if (order.ConsignmentTypeId == 4)
                {
                    order.ShipmentAddressLine1     = _currentDbContext.ConsignmentTypes.FirstOrDefault(u => u.ConsignmentTypeId == 4)?.ConsignmentType;
                    order.ShipmentAddressLine2     = null;
                    order.ShipmentAddressLine3     = null;
                    order.ShipmentAddressLine4     = null;
                    order.ShipmentAddressPostcode  = null;
                    order.ShipmentAccountAddressId = (int?)null;
                }

                #region SendEmailWithAttachment
                if (shipmentAndRecipientInfo.SendEmailWithAttachment)
                {
                    List <OrderPTenantEmailRecipient> accountids = _currentDbContext.OrderPTenantEmailRecipients.Where(a => a.OrderId == order.OrderID && a.IsDeleted != false).ToList();

                    if (accountids.Count > 0)
                    {
                        accountids.ForEach(u => u.IsDeleted = true);
                    }

                    if (shipmentAndRecipientInfo.AccountEmailContacts != null && shipmentAndRecipientInfo.AccountEmailContacts.Length > 0)
                    {
                        foreach (var item in shipmentAndRecipientInfo.AccountEmailContacts)
                        {
                            string email           = "";
                            var    secondryAddress = _currentDbContext.AccountContacts.Where(u => u.AccountContactId == item).AsNoTracking().FirstOrDefault();
                            if (secondryAddress != null)
                            {
                                email = secondryAddress.ContactEmail;
                            }

                            var recipient = new OrderPTenantEmailRecipient()
                            {
                                OrderId          = order.OrderID,
                                EmailAddress     = email,
                                AccountContactId = item,
                                UpdatedBy        = userId,
                                DateUpdated      = DateTime.UtcNow,
                            };
                            _currentDbContext.OrderPTenantEmailRecipients.Add(recipient);
                        }
                    }
                }
                else
                {
                    List <OrderPTenantEmailRecipient> accountids = _currentDbContext.OrderPTenantEmailRecipients.Where(a => a.OrderId == order.OrderID && a.IsDeleted != false).ToList();

                    if (accountids.Count > 0)
                    {
                        accountids.ForEach(u => u.IsDeleted = true);
                    }
                }

                #endregion

                _currentDbContext.Order.Attach(order);
                _currentDbContext.Entry(order).State = EntityState.Modified;
            }

            _currentDbContext.SaveChanges();
            Inventory.StockRecalculateByOrderId(order.OrderID, warehouseId, tenantId, caCurrent.CurrentUser().UserId);
            return(obj);
        }
        public async Task <ActionResult> Edit(Order Order, FormCollection formCollection, OrderRecipientInfo shipmentAndRecipientInfo, string orderSaveAndProcess, int EmailTemplate)
        {
            if (ModelState.IsValid)
            {
                Order.OrderNumber = Order.OrderNumber.Trim();

                // get properties of user
                caUser user = caCurrent.CurrentUser();
                Order.DateUpdated = DateTime.UtcNow;
                Order.UpdatedBy   = user.UserId;

                Order.WarehouseId = CurrentWarehouseId;

                var items = GaneOrderDetailsSessionHelper.GetOrderDetailSession(shipmentAndRecipientInfo.PageSessionToken);

                var nItems = GaneOrderNotesSessionHelper.GetOrderNotesSession(shipmentAndRecipientInfo.PageSessionToken);

                Order = OrderService.SaveSalesOrder(Order, shipmentAndRecipientInfo, CurrentTenantId, CurrentWarehouseId, CurrentUserId, Mapper.Map(items, new List <OrderDetail>()), nItems);


                if (shipmentAndRecipientInfo.SendEmailWithAttachment)
                {
                    var report = CreateSalesOrderPrint(Order.OrderID);
                    PrepareDirectory("~/UploadedFiles/reports/so/");
                    var reportPath = "~/UploadedFiles/reports/so/" + Order.OrderNumber + ".pdf";
                    report.ExportToPdf(Server.MapPath(reportPath));
                    var result = await GaneConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Sales order has been updated", Mapper.Map(Order, new OrderViewModel()), reportPath, shipmentAndRecipientInfo : shipmentAndRecipientInfo,
                                                                                                   worksOrderNotificationType : (WorksOrderNotificationTypeEnum)EmailTemplate);

                    if (result != "Success")
                    {
                        TempData["Error"] = result;
                    }
                }

                if (Order.OrderStatusID == (int)OrderStatusEnum.AwaitingAuthorisation)
                {
                    var result = await GaneConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Order Requires Authorisation", Mapper.Map(Order, new OrderViewModel()), null, shipmentAndRecipientInfo : shipmentAndRecipientInfo,
                                                                                                   worksOrderNotificationType : WorksOrderNotificationTypeEnum.AwaitingOrderTemplate);

                    if (result != "Success")
                    {
                        TempData["Error"] = result;
                    }
                }

                GaneOrderDetailsSessionHelper.ClearSessionTokenData(shipmentAndRecipientInfo.PageSessionToken);
                GaneOrderNotesSessionHelper.ClearSessionTokenData(shipmentAndRecipientInfo.PageSessionToken);

                ViewBag.Fragment = Request.Form["fragment"];

                if (orderSaveAndProcess == "1")
                {
                    return(Redirect(Url.RouteUrl(new { controller = "SalesOrders", action = "ProcessOrder", id = Order.OrderID }) + "?fragment=" + ViewBag.Fragment as string));
                }

                return(AnchoredOrderIndex("SalesOrders", "Index", ViewBag.Fragment as string));
            }

            ViewBag.ForceRegeneratePageToken  = "True";
            ViewBag.ForceRegeneratedPageToken = shipmentAndRecipientInfo.PageSessionToken ?? Guid.NewGuid().ToString();
            SetViewBagItems(CurrentTenant, EnumAccountType.Customer);
            ViewBag.SupplierID = new SelectList(AccountServices.GetAllValidAccounts(CurrentTenantId, EnumAccountType.Supplier), "SupplierID", "CompanyName", Order.AccountID);

            ViewBag.AccountAddresses = new List <SelectListItem>();
            if (Order.AccountID > 0)
            {
                var account = AccountServices.GetAccountsById(Order.AccountID.Value);
                ViewBag.AccountAddresses = new SelectList(account.AccountAddresses, "AddressID", "FullAddressValue", Order.ShipmentAccountAddressId);
                if (Order.ConsignmentTypeId.HasValue && Order.ConsignmentTypeId.Value != (int)ConsignmentTypeEnum.Collection && Order.ShipmentAccountAddressId > 0)
                {
                    ViewBag.ShipmentAccountAddressId   = Order.ShipmentAccountAddressId;
                    ViewBag.IsShipmentToAccountAddress = true;
                    ViewBag.IsShipmentToCustomAddress  = false;
                }
                else
                {
                    ViewBag.ShipmentAccountAddressId   = 0;
                    ViewBag.IsShipmentToAccountAddress = false;
                    ViewBag.IsShipmentToCustomAddress  = true;
                }
            }

            ViewBag.ConsignmentTypes = new SelectList(OrderService.GetAllValidConsignmentTypes(CurrentTenantId), "ConsignmentTypeId", "ConsignmentType", Order.ConsignmentTypeId);

            return(View(Order));
        }
        public async Task <ActionResult> Create(Order Order, OrderRecipientInfo shipmentAndRecipientInfo, int EmailTemplate)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var tempNotesList = GaneOrderNotesSessionHelper.GetOrderNotesSession(shipmentAndRecipientInfo.PageSessionToken);
                    var tempList      = GaneOrderDetailsSessionHelper.GetOrderDetailSession(shipmentAndRecipientInfo.PageSessionToken);
                    Order = OrderService.CreateSalesOrder(Order, shipmentAndRecipientInfo, CurrentTenantId, CurrentWarehouseId, CurrentUserId, Mapper.Map(tempList, new List <OrderDetail>()), tempNotesList);

                    if (shipmentAndRecipientInfo.SendEmailWithAttachment)
                    {
                        var report = CreateSalesOrderPrint(Order.OrderID);
                        PrepareDirectory("~/UploadedFiles/reports/so/");
                        var reportPath = "~/UploadedFiles/reports/so/" + Order.OrderNumber + ".pdf";
                        report.ExportToPdf(Server.MapPath(reportPath));
                        var result = await GaneConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Sales order", Mapper.Map(Order, new OrderViewModel()), reportPath, shipmentAndRecipientInfo : shipmentAndRecipientInfo,
                                                                                                       worksOrderNotificationType : (WorksOrderNotificationTypeEnum)EmailTemplate);

                        if (result != "Success")
                        {
                            TempData["Error"] = result;
                        }
                    }

                    if (Order.OrderStatusID == (int)OrderStatusEnum.AwaitingAuthorisation)
                    {
                        var result = await GaneConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Order Requires Authorisation", Mapper.Map(Order, new OrderViewModel()), null, shipmentAndRecipientInfo : shipmentAndRecipientInfo,
                                                                                                       worksOrderNotificationType : WorksOrderNotificationTypeEnum.AwaitingOrderTemplate);

                        if (result != "Success")
                        {
                            TempData["Error"] = result;
                        }
                    }

                    //send ingredients email for certain categories
                    var productCategoryTc = _tenantServices.GetTenantConfigById(Order.TenentId)?.ProductCatagories;

                    if (Order.InventoryTransactionTypeId == (int)InventoryTransactionTypeEnum.SalesOrder && !string.IsNullOrEmpty(productCategoryTc))
                    {
                        var productcategoryList = productCategoryTc.Split(',').Select(int.Parse).ToList();
                        if (Order.OrderDetails.Any(x => productcategoryList.Contains((int?)x.ProductMaster?.ProductGroupId ?? 0)))
                        {
                            var result = await GaneConfigurationsHelper.SendStandardMailProductGroup(Order.TenentId, Order.OrderNumber, Order.AccountID ?? 0);

                            if (result != "Success")
                            {
                                TempData["Error"] = result;
                            }
                        }
                    }

                    GaneOrderDetailsSessionHelper.ClearSessionTokenData(shipmentAndRecipientInfo.PageSessionToken);
                    GaneOrderNotesSessionHelper.ClearSessionTokenData(shipmentAndRecipientInfo.PageSessionToken);
                    return(AnchoredOrderIndex("SalesOrders", "Index", "SOA"));
                }

                int id             = 0;
                var accountaddress = _accountServices.GetAllValidAccountContactsByAccountId(id, CurrentTenantId);
                ViewBag.AccountContactes          = new SelectList(accountaddress, "AccountContactId", "ContactEmail", accountaddress.Select(x => x.AccountID).FirstOrDefault());
                ViewBag.ForceRegeneratePageToken  = "True";
                ViewBag.ForceRegeneratedPageToken = shipmentAndRecipientInfo.PageSessionToken ?? Guid.NewGuid().ToString();

                SetViewBagItems(CurrentTenant, EnumAccountType.Customer);
                ViewBag.OrderDetails   = Order.OrderDetails;
                ViewBag.OrderProcesses = Order.OrderProcess;

                ViewBag.IsShipmentToAccountAddress = true;
                ViewBag.AccountAddresses           = new List <SelectListItem>()
                {
                    new SelectListItem()
                    {
                        Text = "Select", Value = "0"
                    }
                };
                ViewBag.ShipmentAccountAddressId  = 0;
                ViewBag.IsShipmentToCustomAddress = false;

                ViewBag.ConsignmentTypes = new SelectList(OrderService.GetAllValidConsignmentTypes(CurrentTenantId), "ConsignmentTypeId", "ConsignmentType");
                ViewBag.SupplierID       = new SelectList(AccountServices.GetAllValidAccounts(CurrentTenantId, EnumAccountType.Supplier), "AccountID", "CompanyName", Order.AccountID);
                return(View(Order));
            }
            catch (Exception Exp)
            {
                int ids            = 0;
                var accountaddress = _accountServices.GetAllValidAccountContactsByAccountId(ids, CurrentTenantId);
                ViewBag.AccountContactes           = new SelectList(accountaddress, "AccountContactId", "ContactEmail", accountaddress.Select(x => x.AccountID).FirstOrDefault());
                ViewBag.IsShipmentToAccountAddress = true;
                ViewBag.AccountAddresses           = new List <SelectListItem>()
                {
                    new SelectListItem()
                    {
                        Text = "Select", Value = "0"
                    }
                };
                ViewBag.ShipmentAccountAddressId  = 0;
                ViewBag.IsShipmentToCustomAddress = false;

                if (Exp.InnerException != null && Exp.InnerException.Message == "Duplicate Order Number")
                {
                    ModelState.AddModelError("OrderNumber", Exp.Message);
                }
                else
                {
                    ModelState.AddModelError("", Exp.Message);
                }
                var tenent = caCurrent.CurrentTenant();
                SetViewBagItems(tenent, EnumAccountType.Customer);
                ViewBag.OrderDetails   = Order.OrderDetails;
                ViewBag.OrderProcesses = Order.OrderProcess;

                ViewBag.ForceRegeneratePageToken  = "True";
                ViewBag.ForceRegeneratedPageToken = shipmentAndRecipientInfo.PageSessionToken ?? Guid.NewGuid().ToString();
                ViewBag.ConsignmentTypes          = new SelectList(OrderService.GetAllValidConsignmentTypes(CurrentTenantId), "ConsignmentTypeId", "ConsignmentType");
                ViewBag.SupplierID = new SelectList(AccountServices.GetAllValidAccounts(CurrentTenantId, EnumAccountType.Supplier), "AccountID", "CompanyName", Order.AccountID);
                return(View(Order));
            }
        }
        public async Task <ActionResult> SaveOrdersBulk(Order Order, FormCollection formCollection, OrderRecipientInfo shipmentAndRecipientInfo)
        {
            try
            {
                if (Order.OrderGroupToken.HasValue && shipmentAndRecipientInfo.SendEmailWithAttachment)
                {
                    var orders = OrderService.GetAllOrdersByGroupToken(Order.OrderGroupToken.Value, CurrentTenantId).ToList();

                    foreach (var order in orders)
                    {
                        try
                        {
                            var result = await _ganeConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{order.OrderNumber} - Works order logged", Mapper.Map(order, new OrderViewModel()),
                                                                                                            sendImmediately : true, shipmentAndRecipientInfo : shipmentAndRecipientInfo);

                            if (result != "Success")
                            {
                                TempData["Error"] = result;
                            }
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                    }
                }
                if (!string.IsNullOrEmpty(Request.Form["Viewreturn"]))
                {
                    bool?returnView = Convert.ToBoolean(Request.Form["Viewreturn"]);
                    if (returnView == true)
                    {
                        return(AnchoredOrderIndex("PProperties", "Index", "AO"));
                    }
                }
                return(AnchoredOrderIndex("WorksOrders", "Index", ViewBag.Fragment as string));
            }
            catch (Exception Exp)
            {
                SetViewBagItems();
                ViewBag.OrderDetails   = Order.OrderDetails;
                ViewBag.OrderProcesses = Order.OrderProcess;
                ViewBag.SupplierID     = new SelectList(AccountServices.GetAllValidAccounts(CurrentTenantId, EnumAccountType.Supplier), "AccountID", "CompanyName", Order.AccountID);
                ModelState.AddModelError("", Exp.Message);
                return(View("CreateBulkSingle"));
            }
        }
Exemple #12
0
        public async Task <ActionResult> Create(Order Order, OrderRecipientInfo shipmentAndRecipientInfo, int EmailTemplate)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    if (shipmentAndRecipientInfo.ShipmentDestination == null ||
                        shipmentAndRecipientInfo.TenantAddressID == null)
                    {
                        ViewBag.Error = "Please choose a delivery address";
                    }
                    else
                    {
                        var orderDetails = GaneOrderDetailsSessionHelper.GetOrderDetailSession(shipmentAndRecipientInfo.PageSessionToken);
                        var orderNotes   = GaneOrderNotesSessionHelper.GetOrderNotesSession(shipmentAndRecipientInfo.PageSessionToken);



                        OrderService.CreatePurchaseOrder(Order, shipmentAndRecipientInfo, CurrentTenantId, CurrentWarehouseId, CurrentUserId, Mapper.Map(orderDetails, new List <OrderDetail>()), orderNotes);

                        if (shipmentAndRecipientInfo.SendEmailWithAttachment)
                        {
                            var report = CreatePurchaseOrderPrint(Order.OrderID);
                            PrepareDirectory("~/UploadedFiles/reports/po/");
                            var reportPath = "~/UploadedFiles/reports/po/" + Order.OrderNumber + ".pdf";
                            report.ExportToPdf(Server.MapPath(reportPath));
                            var result = await GaneConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Purchase order", Mapper.Map(Order, new OrderViewModel()), reportPath, shipmentAndRecipientInfo : shipmentAndRecipientInfo,
                                                                                                           worksOrderNotificationType : (WorksOrderNotificationTypeEnum)EmailTemplate);

                            if (result != "Success")
                            {
                                TempData["Error"] = result;
                            }
                        }

                        GaneOrderDetailsSessionHelper.ClearSessionTokenData(shipmentAndRecipientInfo.PageSessionToken);
                        GaneOrderNotesSessionHelper.ClearSessionTokenData(shipmentAndRecipientInfo.PageSessionToken);
                        return(AnchoredOrderIndex("PurchaseOrders", "Index", "PO"));
                    }
                }

                SetViewBagItems(Order, EnumAccountType.Supplier);
                int id = 0;
                ViewBag.AllowAccountAddress = caCurrent.CurrentWarehouse().AllowShipToAccountAddress;
                var accountaddress = _accountServices.GetAllValidAccountContactsByAccountId(id, CurrentTenantId);
                ViewBag.AccountContactes = new SelectList(accountaddress, "AccountContactId", "ContactEmail", accountaddress.Select(x => x.AccountID).FirstOrDefault());
                var directsales = _salesServices.GetDirectSaleOrders(null);
                ViewBag.DirectOrderList = new SelectList(directsales, "OrderID", "OrderNumber");

                if (string.IsNullOrEmpty(shipmentAndRecipientInfo.PageSessionToken))
                {
                    ViewBag.ForceRegeneratePageToken  = "True";
                    ViewBag.ForceRegeneratedPageToken = Guid.NewGuid().ToString();
                }
                return(View(Order));
            }
            catch (Exception Exp)
            {
                if (Exp.InnerException != null && Exp.InnerException.Message == "Duplicate Order Number")
                {
                    ModelState.AddModelError("OrderNumber", Exp.Message);
                }
                else
                {
                    ModelState.AddModelError("", Exp.Message);
                }
                SetViewBagItems(Order);
                int id             = 0;
                var accountaddress = _accountServices.GetAllValidAccountContactsByAccountId(id, CurrentTenantId);
                ViewBag.AccountContactes          = new SelectList(accountaddress, "AccountContactId", "ContactEmail", accountaddress.Select(x => x.AccountID).FirstOrDefault());
                ViewBag.ForceRegeneratePageToken  = "True";
                ViewBag.ForceRegeneratedPageToken = shipmentAndRecipientInfo.PageSessionToken ?? Guid.NewGuid().ToString();
                var directsales = _salesServices.GetDirectSaleOrders(null);
                ViewBag.DirectOrderList = new SelectList(directsales, "OrderID", "OrderNumber");
                return(View(Order));
            }
        }
Exemple #13
0
        public async Task <ActionResult> Edit([Bind(Include = "OrderID,OrderNumber,DirectShip,ExpectedDate,Note,AccountID,OrderTypeID,LoanID,OrderStatusID,AccountContactId,Posted,PPropertyId,DepartmentId,InvoiceNo,InvoiceDetails,OrderCost,IsCollectionFromCustomerSide")] Order Order, OrderRecipientInfo shipmentAndRecipientInfo, string orderSaveAndProcess, int EmailTemplate)
        {
            if (ModelState.IsValid)
            {
                var items      = GaneOrderDetailsSessionHelper.GetOrderDetailSession(shipmentAndRecipientInfo.PageSessionToken);
                var orderNotes = GaneOrderNotesSessionHelper.GetOrderNotesSession(shipmentAndRecipientInfo.PageSessionToken);
                OrderService.SavePurchaseOrder(Order, shipmentAndRecipientInfo, CurrentTenantId, CurrentWarehouseId, CurrentUserId, Mapper.Map(items, new List <OrderDetail>()), orderNotes);

                if (shipmentAndRecipientInfo.SendEmailWithAttachment)
                {
                    var report = CreatePurchaseOrderPrint(Order.OrderID);
                    PrepareDirectory("~/UploadedFiles/reports/po/");
                    var reportPath = "~/UploadedFiles/reports/po/" + Order.OrderNumber + ".pdf";
                    report.ExportToPdf(Server.MapPath(reportPath));
                    var result = await GaneConfigurationsHelper.CreateTenantEmailNotificationQueue($"#{Order.OrderNumber} - Purchase order has been updated", Mapper.Map(Order, new OrderViewModel()), reportPath, shipmentAndRecipientInfo : shipmentAndRecipientInfo,
                                                                                                   worksOrderNotificationType : (WorksOrderNotificationTypeEnum)EmailTemplate);

                    if (result != "Success")
                    {
                        TempData["Error"] = result;
                    }
                }

                GaneOrderDetailsSessionHelper.ClearSessionTokenData(shipmentAndRecipientInfo.PageSessionToken);
                GaneOrderNotesSessionHelper.ClearSessionTokenData(shipmentAndRecipientInfo.PageSessionToken);
                ViewBag.Fragment = Request.Form["fragment"];
                if (orderSaveAndProcess == "1")
                {
                    return(Redirect(Url.RouteUrl(new { controller = "PurchaseOrders", action = "ReceivePO", id = Order.OrderID }) + "?fragment=" + ViewBag.Fragment as string));
                }

                return(AnchoredOrderIndex("PurchaseOrders", "Index", ViewBag.Fragment as string));
            }
            ViewBag.AllowAccountAddress       = caCurrent.CurrentWarehouse()?.AllowShipToAccountAddress;
            ViewBag.ForceRegeneratePageToken  = "True";
            ViewBag.ForceRegeneratedPageToken = shipmentAndRecipientInfo.PageSessionToken ?? Guid.NewGuid().ToString();

            SetViewBagItems(null, EnumAccountType.Supplier);
            ViewBag.SupplierID = new SelectList(AccountServices.GetAllValidAccounts(CurrentTenantId, EnumAccountType.Supplier), "SupplierID", "CompanyName", Order.AccountID);
            return(View(Order));
        }
        public Order SaveWorksOrder(Order order, OrderRecipientInfo shipmentAndRecipientInfo, int tenantId, int warehouseId, int userId, bool isOrderComplete, List <OrderDetail> orderDetails = null, IEnumerable <OrderNotes> orderNotes = null)
        {
            order.OrderNumber = order.OrderNumber.Trim();
            order.DateUpdated = DateTime.UtcNow;
            order.UpdatedBy   = userId;
            order.WarehouseId = warehouseId;

            decimal total = 0;

            if (orderDetails != null)
            {
                var toAdd  = orderDetails.Where(a => a.OrderDetailID < 0).ToList();
                var cItems = orderDetails.Where(a => a.OrderDetailID > 0).ToList();

                var recentlyUpdatedIds = new List <int>();
                foreach (var item in toAdd)
                {
                    int?taxId      = item.TaxID;
                    int?warrantyId = item.WarrantyID;
                    int productId  = item.ProductId;
                    item.DateCreated = DateTime.UtcNow;
                    item.CreatedBy   = userId;
                    item.TenentId    = tenantId;
                    item.OrderID     = order.OrderID;
                    total            = total + item.TotalAmount;
                    item.TenentId    = tenantId;
                    item.WarehouseId = warehouseId;
                    total            = total + item.TotalAmount;

                    if (item.WarrantyID > 0)
                    {
                        var warranty = _currentDbContext.TenantWarranty.Find(item.WarrantyID);
                        if (warranty.IsPercent)
                        {
                            item.WarrantyAmount = (item.TotalAmount / 100) * item.Warranty.PercentageOfPrice;
                        }
                        else
                        {
                            item.WarrantyAmount = item.Warranty.FixedPrice;
                        }
                    }

                    // fix navigation issue
                    item.ProductMaster = null;
                    item.TaxName       = null;
                    item.Warranty      = null;

                    item.ProductId  = productId;
                    item.TaxID      = taxId;
                    item.WarrantyID = warrantyId;

                    if (item.OrderDetailID > 0)
                    {
                        _currentDbContext.Entry(item).State = EntityState.Modified;
                    }
                    else
                    {
                        _currentDbContext.OrderDetail.Add(item);
                    }
                    _currentDbContext.SaveChanges();
                    recentlyUpdatedIds.Add(item.OrderDetailID);
                }

                var toDelete = _currentDbContext.OrderDetail.Where(a => a.OrderID == order.OrderID && a.IsDeleted != true)
                               .Select(a => a.OrderDetailID)
                               .Except(cItems.Select(a => a.OrderDetailID).ToList().Union(recentlyUpdatedIds));

                foreach (var item in toDelete)
                {
                    var dItem = _currentDbContext.OrderDetail.FirstOrDefault(a => a.OrderDetailID == item);
                    dItem.IsDeleted = true;
                }

                foreach (var item in cItems)
                {
                    var orderDetail = _currentDbContext.OrderDetail.Find(item.OrderDetailID);
                    orderDetail.ProductId      = item.ProductId;
                    orderDetail.ExpectedDate   = item.ExpectedDate;
                    orderDetail.Qty            = item.Qty;
                    orderDetail.Price          = item.Price;
                    orderDetail.WarrantyID     = item.WarrantyID;
                    orderDetail.TaxID          = item.TaxID;
                    orderDetail.Notes          = item.Notes;
                    orderDetail.TaxAmount      = item.TaxAmount;
                    orderDetail.TotalAmount    = item.TotalAmount;
                    orderDetail.WarrantyAmount = item.WarrantyAmount;

                    _currentDbContext.Entry(orderDetail).State = EntityState.Modified;
                    total = total + item.TotalAmount;
                }
            }
            else
            {
                foreach (var item in _currentDbContext.OrderDetail.Where(a => a.OrderID == order.OrderID && a.IsDeleted != true))
                {
                    item.IsDeleted = true;
                }
            }
            if (orderNotes != null)
            {
                if (orderNotes.Count() == 0)
                {
                    var cItems = _currentDbContext.OrderNotes
                                 .Where(
                        a => a.OrderID == order.OrderID && a.IsDeleted != true && a.TenantId == tenantId)
                                 .ToList();
                    cItems.ForEach(m =>
                    {
                        m.DateUpdated = DateTime.UtcNow;
                        m.UpdatedBy   = userId;
                        m.IsDeleted   = true;
                    });
                }
                else
                {
                    orderNotes.Where(a => a.OrderNoteId < 0)
                    .ToList()
                    .ForEach(m =>
                    {
                        m.DateCreated =
                            DateTime.UtcNow;
                        m.CreatedBy = userId;
                        m.TenantId  = tenantId;
                        m.OrderID   = order.OrderID;
                        _currentDbContext.OrderNotes.Add(m);
                    });
                }
            }

            order.OrderTotal = total;
            var obj = _currentDbContext.Order.Find(order.OrderID);

            if (obj != null)
            {
                _currentDbContext.Entry(obj).State = EntityState.Detached;
                order.CreatedBy   = obj.CreatedBy;
                order.DateCreated = obj.DateCreated;
                if (order.OrderStatusID == 0)
                {
                    order.OrderStatusID = obj.OrderStatusID;
                }
                order.TenentId    = obj.TenentId;
                order.WarehouseId = obj.WarehouseId;
                order.InventoryTransactionTypeId = obj.InventoryTransactionTypeId;

                obj.OrderNumber = order.OrderNumber.Trim();
                obj.DateUpdated = DateTime.UtcNow;
                obj.UpdatedBy   = userId;
                obj.WarehouseId = warehouseId;
                _currentDbContext.Order.Attach(order);
                var entry = _currentDbContext.Entry(order);
                entry.State = EntityState.Modified;
            }

            if (!isOrderComplete && shipmentAndRecipientInfo.PropertyTenantIds != null)
            {
                foreach (var item in shipmentAndRecipientInfo.PropertyTenantIds)
                {
                    var ptenantId = item.AsInt();
                    if (!_currentDbContext.OrderPTenantEmailRecipients.Any(m => m.PTenantId == ptenantId && m.OrderId == order.OrderID))
                    {
                        var recipient = new OrderPTenantEmailRecipient()
                        {
                            OrderId     = order.OrderID,
                            DateUpdated = DateTime.UtcNow,
                            PPropertyId = order.ShipmentPropertyId,
                            PTenantId   = item.AsInt()
                        };
                        _currentDbContext.Entry(recipient).State = EntityState.Added;
                        _currentDbContext.SaveChanges();
                    }
                }
            }

            _currentDbContext.SaveChanges();
            Inventory.StockRecalculateByOrderId(order.OrderID, warehouseId, tenantId, caCurrent.CurrentUser().UserId);
            return(order);
        }
        public Order UpdateWorksOrderBulkSingle(Order Order, OrderRecipientInfo shipmentAndRecipientInfo, int tenantId,
                                                int warehouseId, int userId, List <OrderDetail> orderDetails = null, List <OrderNotes> orderNotes = null)
        {
            Order.OrderNumber = Order.OrderNumber.Trim();
            Order.IssueDate   = DateTime.UtcNow;
            Order.DateCreated = DateTime.UtcNow;
            Order.DateUpdated = DateTime.UtcNow;
            Order.TenentId    = tenantId;
            Order.WarehouseId = warehouseId;
            Order.CreatedBy   = userId;
            Order.UpdatedBy   = userId;
            Order.InventoryTransactionTypeId = (int)InventoryTransactionTypeEnum.WorksOrder;
            Order.OrderStatusID      = (int)OrderStatusEnum.NotScheduled;
            Order.ShipmentPropertyId = shipmentAndRecipientInfo.PPropertyID;

            _currentDbContext.Order.Attach(Order);

            _currentDbContext.Entry(Order).State = EntityState.Modified;

            decimal total = 0;

            if (orderDetails != null)
            {
                var toAdd  = orderDetails.Where(a => a.OrderDetailID < 0).ToList();
                var cItems = orderDetails.Where(a => a.OrderDetailID > 0).ToList();
                foreach (var item in toAdd)
                {
                    item.ProductMaster = null;
                    item.TaxName       = null;
                    item.Warranty      = null;
                    item.DateCreated   = DateTime.UtcNow;
                    item.CreatedBy     = userId;
                    item.TenentId      = tenantId;
                    item.OrderID       = Order.OrderID;
                    total            = total + item.TotalAmount;
                    item.TenentId    = tenantId;
                    item.WarehouseId = warehouseId;
                    _currentDbContext.OrderDetail.Add(item);
                }

                var toDelete = _currentDbContext.OrderDetail.Where(a => a.OrderID == Order.OrderID && a.IsDeleted != true).Select(a => a.OrderDetailID).Except(cItems.Select(a => a.OrderDetailID).ToList());
                foreach (var item in toDelete)
                {
                    var dItem = _currentDbContext.OrderDetail.FirstOrDefault(a => a.OrderDetailID == item);
                    dItem.IsDeleted = true;
                }
                foreach (var item in cItems)
                {
                    total = total + item.TotalAmount;
                    var dItem = _currentDbContext.OrderDetail.FirstOrDefault(a => a.OrderDetailID == item.OrderDetailID);
                    if (dItem != null)
                    {
                        dItem.Qty            = item.Qty;
                        dItem.Notes          = item.Notes;
                        dItem.Price          = item.Price;
                        dItem.TaxID          = item.TaxID;
                        dItem.TaxAmount      = item.TaxAmount;
                        dItem.WarrantyID     = item.WarrantyID;
                        dItem.WarrantyAmount = item.WarrantyAmount;
                        dItem.TotalAmount    = item.TotalAmount;
                        dItem.DateUpdated    = DateTime.UtcNow;
                        dItem.UpdatedBy      = userId;
                        _currentDbContext.Entry(dItem).State = EntityState.Modified;
                    }
                }
            }
            else
            {
                foreach (var item in _currentDbContext.OrderDetail.Where(a => a.OrderID == Order.OrderID && a.IsDeleted != true))
                {
                    item.IsDeleted = true;
                }
            }
            if (orderNotes != null)
            {
                if (orderNotes.Count() == 0)
                {
                    var cItems = _currentDbContext.OrderNotes.Where(a => a.OrderID == Order.OrderID && a.IsDeleted != true && a.TenantId == tenantId).ToList();
                    cItems.ForEach(m =>
                    {
                        m.DateUpdated = DateTime.UtcNow;
                        m.UpdatedBy   = userId;
                        m.IsDeleted   = true;
                        _currentDbContext.Entry(m).State = EntityState.Modified;
                    });
                }
                else
                {
                    orderNotes.Where(a => a.OrderNoteId < 0).ToList().ForEach(m =>
                    {
                        m.DateCreated = DateTime.UtcNow;
                        m.CreatedBy   = userId;
                        m.TenantId    = tenantId;
                        m.OrderID     = Order.OrderID;
                        _currentDbContext.OrderNotes.Add(m);
                    });
                }
            }

            _currentDbContext.SaveChanges();
            Inventory.StockRecalculateByOrderId(Order.OrderID, warehouseId, tenantId, caCurrent.CurrentUser().UserId);
            return(Order);
        }
        public Order SaveWorksOrderBulkSingle(Order order, OrderRecipientInfo shipmentAndRecipientInfo, int tenantId, int warehouseId, int userId, List <OrderDetail> orderDetails = null, IEnumerable <OrderNotes> orderNotes = null)
        {
            order.OrderNumber = order.OrderNumber.Trim();
            var duplicateOrder = _currentDbContext.Order.FirstOrDefault(m => m.OrderNumber.Equals(order.OrderNumber, StringComparison.CurrentCultureIgnoreCase));

            if (duplicateOrder != null)
            {
                throw new Exception($"Order Number {order.OrderNumber} already associated with another Order. Please regenerate order number.", new Exception("Duplicate Order Number"));
            }

            order.IssueDate   = DateTime.UtcNow;
            order.DateCreated = DateTime.UtcNow;
            order.DateUpdated = DateTime.UtcNow;
            order.TenentId    = tenantId;
            order.WarehouseId = warehouseId;
            order.CreatedBy   = userId;
            order.UpdatedBy   = userId;

            order.InventoryTransactionTypeId = (int)InventoryTransactionTypeEnum.WorksOrder;
            order.OrderStatusID      = (int)OrderStatusEnum.NotScheduled;
            order.ShipmentPropertyId = shipmentAndRecipientInfo.PPropertyID;

            _currentDbContext.Order.Add(order);


            if (orderDetails != null)
            {
                decimal?ordTotal = 0;
                foreach (var item in orderDetails)
                {
                    item.DateCreated   = DateTime.UtcNow;
                    item.CreatedBy     = userId;
                    item.OrderID       = order.OrderID;
                    item.TenentId      = tenantId;
                    item.SortOrder     = item.ProductMaster?.ProductGroup?.SortOrder ?? 0;
                    item.ProductMaster = null;
                    item.TaxName       = null;
                    item.Warranty      = null;
                    item.WarehouseId   = warehouseId;
                    order.OrderDetails.Add(item);
                    ordTotal = ordTotal + ((item.Price * item.Qty) + item.TaxAmount);
                }

                order.OrderTotal = (decimal)ordTotal;
            }

            if (orderNotes != null)
            {
                foreach (var item in orderNotes)
                {
                    item.DateCreated = DateTime.UtcNow;
                    item.CreatedBy   = userId;
                    item.OrderID     = order.OrderID;
                    item.TenantId    = tenantId;
                    order.OrderNotes.Add(item);
                }
            }
            _currentDbContext.SaveChanges();
            Inventory.StockRecalculateByOrderId(order.OrderID, warehouseId, tenantId, caCurrent.CurrentUser().UserId);
            return(order);
        }