Beispiel #1
0
        public async Task <CustomerSalesOrder> Create(CustomerSalesOrder CustomerSalesOrder)
        {
            if (!await CustomerSalesOrderValidator.Create(CustomerSalesOrder))
            {
                return(CustomerSalesOrder);
            }

            try
            {
                var SalesEmployee = await UOW.AppUserRepository.Get(CustomerSalesOrder.SalesEmployeeId);

                CustomerSalesOrder.CreatorId      = CurrentContext.UserId;
                CustomerSalesOrder.OrganizationId = SalesEmployee.OrganizationId;
                CustomerSalesOrder.RequestStateId = RequestStateEnum.NEW.Id;
                await Calculator(CustomerSalesOrder);

                await UOW.CustomerSalesOrderRepository.Create(CustomerSalesOrder);

                CustomerSalesOrder = await UOW.CustomerSalesOrderRepository.Get(CustomerSalesOrder.Id);

                await Logging.CreateAuditLog(CustomerSalesOrder, new { }, nameof(CustomerSalesOrderService));

                return(CustomerSalesOrder);
            }
            catch (Exception ex)
            {
                await Logging.CreateSystemLog(ex, nameof(CustomerSalesOrderService));
            }
            return(null);
        }
        private async Task <bool> ValidateItem(CustomerSalesOrder CustomerSalesOrder)
        {
            if (CustomerSalesOrder.CustomerSalesOrderPromotions != null)
            {
                var Ids        = CustomerSalesOrder.CustomerSalesOrderPromotions.Select(x => x.ItemId).ToList();
                var ItemFilter = new ItemFilter
                {
                    Skip = 0,
                    Take = int.MaxValue,
                    Id   = new IdFilter {
                        In = Ids
                    },
                    StatusId = new IdFilter {
                        Equal = Enums.StatusEnum.ACTIVE.Id
                    },
                    Selects = ItemSelect.Id
                };

                var listIdsInDB       = (await UOW.ItemRepository.List(ItemFilter)).Select(x => x.Id);
                var listIdsNotExisted = Ids.Except(listIdsInDB);
                foreach (var CustomerSalesOrderPromotion in CustomerSalesOrder.CustomerSalesOrderPromotions)
                {
                    if (listIdsNotExisted.Contains(CustomerSalesOrderPromotion.ItemId))
                    {
                        CustomerSalesOrderPromotion.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrderPromotion.Item), ErrorCode.ItemNotExisted);
                    }
                }
            }
            return(CustomerSalesOrder.IsValidated);
        }
 public async Task <bool> Delete(CustomerSalesOrder CustomerSalesOrder)
 {
     if (await ValidateId(CustomerSalesOrder))
     {
     }
     return(CustomerSalesOrder.IsValidated);
 }
        private async Task <bool> ValidateEmployee(CustomerSalesOrder CustomerSalesOrder)
        {
            if (CustomerSalesOrder.SalesEmployeeId == 0)
            {
                CustomerSalesOrder.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrder.SalesEmployee), ErrorCode.SalesEmployeeEmpty);
            }
            else
            {
                AppUserFilter AppUserFilter = new AppUserFilter
                {
                    Skip = 0,
                    Take = 10,
                    Id   = new IdFilter {
                        Equal = CustomerSalesOrder.SalesEmployeeId
                    },
                    StatusId = new IdFilter {
                        Equal = Enums.StatusEnum.ACTIVE.Id
                    },
                    Selects = AppUserSelect.Id | AppUserSelect.Organization
                };

                var count = await UOW.AppUserRepository.Count(AppUserFilter);

                if (count == 0)
                {
                    CustomerSalesOrder.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrder.SalesEmployee), ErrorCode.SalesEmployeeNotExisted);
                }
            }

            return(CustomerSalesOrder.IsValidated);
        }
 private async Task <bool> ValidateOrderDate(CustomerSalesOrder CustomerSalesOrder)
 {
     if (CustomerSalesOrder.OrderDate == default(DateTime))
     {
         CustomerSalesOrder.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrder.OrderDate), ErrorCode.OrderDateEmpty);
     }
     return(CustomerSalesOrder.IsValidated);
 }
 private async Task <bool> ValidateEditedPrice(CustomerSalesOrder CustomerSalesOrder)
 {
     if (EditedPriceStatusEnum.ACTIVE.Id != CustomerSalesOrder.EditedPriceStatusId && EditedPriceStatusEnum.INACTIVE.Id != CustomerSalesOrder.EditedPriceStatusId)
     {
         CustomerSalesOrder.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrder.EditedPriceStatus), ErrorCode.EditedPriceStatusNotExisted);
     }
     return(CustomerSalesOrder.IsValidated);
 }
        private async Task <bool> ValidateCustomerType(CustomerSalesOrder CustomerSalesOrder)
        {
            if (CustomerSalesOrder.CustomerTypeId == 0)
            {
                CustomerSalesOrder.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrder.CustomerType), ErrorCode.CustomerTypeEmpty);
            }

            return(CustomerSalesOrder.IsValidated);
        }
 private async Task <bool> ValidateDeliveryDate(CustomerSalesOrder CustomerSalesOrder)
 {
     if (CustomerSalesOrder.DeliveryDate.HasValue)
     {
         if (CustomerSalesOrder.DeliveryDate.Value < CustomerSalesOrder.OrderDate)
         {
             CustomerSalesOrder.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrder.DeliveryDate), ErrorCode.DeliveryDateInvalid);
         }
     }
     return(CustomerSalesOrder.IsValidated);
 }
        public async Task <bool> Create(CustomerSalesOrder CustomerSalesOrder)
        {
            await ValidateCustomerType(CustomerSalesOrder);
            await ValidateCustomer(CustomerSalesOrder);
            await ValidateEmployee(CustomerSalesOrder);
            await ValidateOrderDate(CustomerSalesOrder);
            await ValidateDeliveryDate(CustomerSalesOrder);
            await ValidateContent(CustomerSalesOrder);
            await ValidatePromotion(CustomerSalesOrder);
            await ValidateItem(CustomerSalesOrder);
            await ValidateEditedPrice(CustomerSalesOrder);

            return(CustomerSalesOrder.IsValidated);
        }
Beispiel #10
0
        public async Task <ActionResult <Contact_CustomerSalesOrderDTO> > GetCustomerSalesOrder([FromBody] Contact_CustomerSalesOrderDTO Contact_CustomerSalesOrderDTO)
        {
            if (UnAuthorization)
            {
                return(Forbid());
            }
            if (!ModelState.IsValid)
            {
                throw new BindException(ModelState);
            }

            CustomerSalesOrder CustomerSalesOrder = await CustomerSalesOrderService.Get(Contact_CustomerSalesOrderDTO.Id);

            return(new Contact_CustomerSalesOrderDTO(CustomerSalesOrder));
        }
        public async Task <bool> ValidateId(CustomerSalesOrder CustomerSalesOrder)
        {
            CustomerSalesOrderFilter CustomerSalesOrderFilter = new CustomerSalesOrderFilter
            {
                Skip = 0,
                Take = 10,
                Id   = new IdFilter {
                    Equal = CustomerSalesOrder.Id
                },
                Selects = CustomerSalesOrderSelect.Id
            };

            int count = await UOW.CustomerSalesOrderRepository.Count(CustomerSalesOrderFilter);

            if (count == 0)
            {
                CustomerSalesOrder.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrder.Id), ErrorCode.IdNotExisted);
            }
            return(count == 1);
        }
Beispiel #12
0
 public RepairTicket_CustomerSalesOrderDTO(CustomerSalesOrder CustomerSalesOrder)
 {
     this.Id                        = CustomerSalesOrder.Id;
     this.Code                      = CustomerSalesOrder.Code;
     this.CustomerTypeId            = CustomerSalesOrder.CustomerTypeId;
     this.CustomerId                = CustomerSalesOrder.CustomerId;
     this.OpportunityId             = CustomerSalesOrder.OpportunityId;
     this.ContractId                = CustomerSalesOrder.ContractId;
     this.OrderPaymentStatusId      = CustomerSalesOrder.OrderPaymentStatusId;
     this.RequestStateId            = CustomerSalesOrder.RequestStateId;
     this.EditedPriceStatusId       = CustomerSalesOrder.EditedPriceStatusId;
     this.ShippingName              = CustomerSalesOrder.ShippingName;
     this.OrderDate                 = CustomerSalesOrder.OrderDate;
     this.DeliveryDate              = CustomerSalesOrder.DeliveryDate;
     this.SalesEmployeeId           = CustomerSalesOrder.SalesEmployeeId;
     this.Note                      = CustomerSalesOrder.Note;
     this.InvoiceAddress            = CustomerSalesOrder.InvoiceAddress;
     this.InvoiceNationId           = CustomerSalesOrder.InvoiceNationId;
     this.InvoiceProvinceId         = CustomerSalesOrder.InvoiceProvinceId;
     this.InvoiceDistrictId         = CustomerSalesOrder.InvoiceDistrictId;
     this.InvoiceWardId             = CustomerSalesOrder.InvoiceWardId;
     this.InvoiceZIPCode            = CustomerSalesOrder.InvoiceZIPCode;
     this.DeliveryAddress           = CustomerSalesOrder.DeliveryAddress;
     this.DeliveryNationId          = CustomerSalesOrder.DeliveryNationId;
     this.DeliveryProvinceId        = CustomerSalesOrder.DeliveryProvinceId;
     this.DeliveryDistrictId        = CustomerSalesOrder.DeliveryDistrictId;
     this.DeliveryWardId            = CustomerSalesOrder.DeliveryWardId;
     this.DeliveryZIPCode           = CustomerSalesOrder.DeliveryZIPCode;
     this.SubTotal                  = CustomerSalesOrder.SubTotal;
     this.GeneralDiscountPercentage = CustomerSalesOrder.GeneralDiscountPercentage;
     this.GeneralDiscountAmount     = CustomerSalesOrder.GeneralDiscountAmount;
     this.TotalTaxOther             = CustomerSalesOrder.TotalTaxOther;
     this.TotalTax                  = CustomerSalesOrder.TotalTax;
     this.Total                     = CustomerSalesOrder.Total;
     this.CreatorId                 = CustomerSalesOrder.CreatorId;
     this.OrganizationId            = CustomerSalesOrder.OrganizationId;
     this.RowId                     = CustomerSalesOrder.RowId;
     this.CreatedAt                 = CustomerSalesOrder.CreatedAt;
     this.UpdatedAt                 = CustomerSalesOrder.UpdatedAt;
     this.Errors                    = CustomerSalesOrder.Errors;
 }
Beispiel #13
0
        public async Task <CustomerSalesOrder> Delete(CustomerSalesOrder CustomerSalesOrder)
        {
            if (!await CustomerSalesOrderValidator.Delete(CustomerSalesOrder))
            {
                return(CustomerSalesOrder);
            }

            try
            {
                await UOW.CustomerSalesOrderRepository.Delete(CustomerSalesOrder);

                await Logging.CreateAuditLog(new { }, CustomerSalesOrder, nameof(CustomerSalesOrderService));

                return(CustomerSalesOrder);
            }
            catch (Exception ex)
            {
                await Logging.CreateSystemLog(ex, nameof(CustomerSalesOrderService));
            }
            return(null);
        }
        private async Task <bool> ValidatePromotion(CustomerSalesOrder CustomerSalesOrder)
        {
            if (CustomerSalesOrder.CustomerSalesOrderPromotions != null)
            {
                await ValidateItem(CustomerSalesOrder);

                //validate đơn vị tính sản phẩm khuyến mãi
                var Ids = CustomerSalesOrder.CustomerSalesOrderPromotions.Select(x => x.UnitOfMeasureId).ToList();
                var UnitOfMeasureFilter = new UnitOfMeasureFilter
                {
                    Skip = 0,
                    Take = int.MaxValue,
                    Id   = new IdFilter {
                        In = Ids
                    },
                    StatusId = new IdFilter {
                        Equal = Enums.StatusEnum.ACTIVE.Id
                    },
                    Selects = UnitOfMeasureSelect.Id
                };

                var listIdsInDB       = (await UOW.UnitOfMeasureRepository.List(UnitOfMeasureFilter)).Select(x => x.Id);
                var listIdsNotExisted = Ids.Except(listIdsInDB);

                foreach (var CustomerSalesOrderPromotion in CustomerSalesOrder.CustomerSalesOrderPromotions)
                {
                    if (listIdsNotExisted.Contains(CustomerSalesOrderPromotion.UnitOfMeasureId))
                    {
                        CustomerSalesOrderPromotion.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrderPromotion.UnitOfMeasure), ErrorCode.UnitOfMeasureEmpty);
                    }
                    //validate số lượng
                    if (CustomerSalesOrderPromotion.Quantity <= 0)
                    {
                        CustomerSalesOrderPromotion.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrderPromotion.Quantity), ErrorCode.QuantityEmpty);
                    }
                }
            }
            return(CustomerSalesOrder.IsValidated);
        }
Beispiel #15
0
        public async Task <CustomerSalesOrder> Get(long Id)
        {
            CustomerSalesOrder CustomerSalesOrder = await UOW.CustomerSalesOrderRepository.Get(Id);

            if (CustomerSalesOrder == null)
            {
                return(null);
            }
            if (CustomerSalesOrder.CustomerTypeId == CustomerTypeEnum.COMPANY.Id)
            {
                var CustomerPhones = await UOW.CustomerPhoneRepository.List(new CustomerPhoneFilter
                {
                    Skip       = 0,
                    Take       = int.MaxValue,
                    Selects    = CustomerPhoneSelect.ALL,
                    OrderBy    = CustomerPhoneOrder.Id,
                    OrderType  = OrderType.ASC,
                    CustomerId = new IdFilter {
                        Equal = CustomerSalesOrder.CustomerId
                    }
                });

                var CustomerEmails = await UOW.CustomerEmailRepository.List(new CustomerEmailFilter
                {
                    Skip       = 0,
                    Take       = int.MaxValue,
                    Selects    = CustomerEmailSelect.ALL,
                    OrderBy    = CustomerEmailOrder.Id,
                    OrderType  = OrderType.ASC,
                    CustomerId = new IdFilter {
                        Equal = CustomerSalesOrder.CustomerId
                    }
                });

                CustomerSalesOrder.Customer.Phone = CustomerPhones.Select(x => x.Phone).FirstOrDefault();
                CustomerSalesOrder.Customer.Email = CustomerEmails.Select(x => x.Email).FirstOrDefault();
            }
            return(CustomerSalesOrder);
        }
Beispiel #16
0
        public async Task <CustomerSalesOrder> Update(CustomerSalesOrder CustomerSalesOrder)
        {
            if (!await CustomerSalesOrderValidator.Update(CustomerSalesOrder))
            {
                return(CustomerSalesOrder);
            }
            try
            {
                var oldData = await UOW.CustomerSalesOrderRepository.Get(CustomerSalesOrder.Id);

                await UOW.CustomerSalesOrderRepository.Update(CustomerSalesOrder);

                CustomerSalesOrder = await UOW.CustomerSalesOrderRepository.Get(CustomerSalesOrder.Id);

                await Logging.CreateAuditLog(CustomerSalesOrder, oldData, nameof(CustomerSalesOrderService));

                return(CustomerSalesOrder);
            }
            catch (Exception ex)
            {
                await Logging.CreateSystemLog(ex, nameof(CustomerSalesOrderService));
            }
            return(null);
        }
        private async Task <bool> ValidateCustomer(CustomerSalesOrder CustomerSalesOrder)
        {
            if (CustomerSalesOrder.CustomerId == 0)
            {
                CustomerSalesOrder.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrder.Customer), ErrorCode.CustomerEmpty);
            }
            else
            {
                CustomerFilter CustomerFilter = new CustomerFilter
                {
                    Skip = 0,
                    Take = 10,
                    Id   = new IdFilter {
                        In = new List <long> {
                            CustomerSalesOrder.CustomerId
                        }
                    },
                    CustomerTypeId = new IdFilter {
                        Equal = CustomerSalesOrder.CustomerTypeId
                    },
                    StatusId = new IdFilter {
                        Equal = Enums.StatusEnum.ACTIVE.Id
                    },
                    Selects = CustomerSelect.Id
                };

                int count = await UOW.CustomerRepository.Count(CustomerFilter);

                if (count == 0)
                {
                    CustomerSalesOrder.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrder.Customer), ErrorCode.CustomerNotExisted);
                }
            }

            return(CustomerSalesOrder.IsValidated);
        }
Beispiel #18
0
        private async Task <CustomerSalesOrder> Calculator(CustomerSalesOrder CustomerSalesOrder)
        {
            var ProductIds = new List <long>();
            var ItemIds    = new List <long>();

            if (CustomerSalesOrder.CustomerSalesOrderContents != null)
            {
                ProductIds.AddRange(CustomerSalesOrder.CustomerSalesOrderContents.Select(x => x.Item.ProductId).ToList());
                ItemIds.AddRange(CustomerSalesOrder.CustomerSalesOrderContents.Select(x => x.ItemId).ToList());
            }
            if (CustomerSalesOrder.CustomerSalesOrderPromotions != null)
            {
                ProductIds.AddRange(CustomerSalesOrder.CustomerSalesOrderPromotions.Select(x => x.Item.ProductId).ToList());
                ItemIds.AddRange(CustomerSalesOrder.CustomerSalesOrderPromotions.Select(x => x.ItemId).ToList());
            }
            ProductIds = ProductIds.Distinct().ToList();
            ItemIds    = ItemIds.Distinct().ToList();

            ItemFilter ItemFilter = new ItemFilter
            {
                Skip = 0,
                Take = ItemIds.Count,
                Id   = new IdFilter {
                    In = ItemIds
                },
                Selects = ItemSelect.ALL,
            };
            var Items = await UOW.ItemRepository.List(ItemFilter);

            var Products = await UOW.ProductRepository.List(new ProductFilter
            {
                Id = new IdFilter {
                    In = ProductIds
                },
                Skip    = 0,
                Take    = int.MaxValue,
                Selects = ProductSelect.UnitOfMeasure | ProductSelect.UnitOfMeasureGrouping | ProductSelect.Id | ProductSelect.TaxType
            });

            var UOMGs = await UOW.UnitOfMeasureGroupingRepository.List(new UnitOfMeasureGroupingFilter
            {
                Skip    = 0,
                Take    = int.MaxValue,
                Selects = UnitOfMeasureGroupingSelect.Id | UnitOfMeasureGroupingSelect.UnitOfMeasure | UnitOfMeasureGroupingSelect.UnitOfMeasureGroupingContents
            });

            //sản phẩm bán
            if (CustomerSalesOrder.CustomerSalesOrderContents != null)
            {
                foreach (var CustomerSalesOrderContent in CustomerSalesOrder.CustomerSalesOrderContents)
                {
                    var Item    = Items.Where(x => x.Id == CustomerSalesOrderContent.ItemId).FirstOrDefault();
                    var Product = Products.Where(x => CustomerSalesOrderContent.Item.ProductId == x.Id).FirstOrDefault();
                    CustomerSalesOrderContent.PrimaryUnitOfMeasureId = Product.UnitOfMeasureId;

                    List <UnitOfMeasure> UnitOfMeasures = new List <UnitOfMeasure>();
                    if (Product.UnitOfMeasureGroupingId.HasValue)
                    {
                        var UOMG = UOMGs.Where(x => x.Id == Product.UnitOfMeasureGroupingId).FirstOrDefault();
                        UnitOfMeasures = UOMG.UnitOfMeasureGroupingContents.Select(x => new UnitOfMeasure
                        {
                            Id          = x.UnitOfMeasure.Id,
                            Code        = x.UnitOfMeasure.Code,
                            Name        = x.UnitOfMeasure.Name,
                            Description = x.UnitOfMeasure.Description,
                            StatusId    = x.UnitOfMeasure.StatusId,
                            Factor      = x.Factor
                        }).ToList();
                    }

                    UnitOfMeasures.Add(new UnitOfMeasure
                    {
                        Id          = Product.UnitOfMeasure.Id,
                        Code        = Product.UnitOfMeasure.Code,
                        Name        = Product.UnitOfMeasure.Name,
                        Description = Product.UnitOfMeasure.Description,
                        StatusId    = Product.UnitOfMeasure.StatusId,
                        Factor      = 1
                    });
                    var UOM = UnitOfMeasures.Where(x => CustomerSalesOrderContent.UnitOfMeasureId == x.Id).FirstOrDefault();
                    //CustomerSalesOrderContent.TaxPercentage = Product.TaxType.Percentage;
                    CustomerSalesOrderContent.RequestedQuantity = CustomerSalesOrderContent.Quantity * UOM.Factor.Value;

                    //Trường hợp không sửa giá, giá bán = giá bán cơ sở của sản phẩm * hệ số quy đổi của đơn vị tính
                    if (CustomerSalesOrder.EditedPriceStatusId == EditedPriceStatusEnum.INACTIVE.Id)
                    {
                        CustomerSalesOrderContent.PrimaryPrice        = Item.SalePrice.GetValueOrDefault(0);
                        CustomerSalesOrderContent.SalePrice           = CustomerSalesOrderContent.PrimaryPrice * UOM.Factor.Value;
                        CustomerSalesOrderContent.EditedPriceStatusId = EditedPriceStatusEnum.INACTIVE.Id;
                    }

                    if (CustomerSalesOrder.EditedPriceStatusId == EditedPriceStatusEnum.ACTIVE.Id)
                    {
                        CustomerSalesOrderContent.SalePrice = CustomerSalesOrderContent.PrimaryPrice * UOM.Factor.Value;
                        if (Item.SalePrice == CustomerSalesOrderContent.PrimaryPrice)
                        {
                            CustomerSalesOrderContent.EditedPriceStatusId = EditedPriceStatusEnum.INACTIVE.Id;
                        }
                        else
                        {
                            CustomerSalesOrderContent.EditedPriceStatusId = EditedPriceStatusEnum.ACTIVE.Id;
                        }
                    }

                    //giá tiền từng line trước chiết khấu
                    var SubAmount = CustomerSalesOrderContent.Quantity * CustomerSalesOrderContent.SalePrice;
                    if (CustomerSalesOrderContent.DiscountPercentage.HasValue)
                    {
                        CustomerSalesOrderContent.DiscountAmount = SubAmount * CustomerSalesOrderContent.DiscountPercentage.Value / 100;
                        CustomerSalesOrderContent.DiscountAmount = Math.Round(CustomerSalesOrderContent.DiscountAmount ?? 0, 0);
                        CustomerSalesOrderContent.Amount         = SubAmount - CustomerSalesOrderContent.DiscountAmount.Value;
                    }
                    else
                    {
                        CustomerSalesOrderContent.Amount = SubAmount;
                    }
                }

                //tổng trước chiết khấu
                CustomerSalesOrder.SubTotal = CustomerSalesOrder.CustomerSalesOrderContents.Sum(x => x.Amount);

                //tính tổng chiết khấu theo % chiết khấu chung
                if (CustomerSalesOrder.GeneralDiscountPercentage.HasValue && CustomerSalesOrder.GeneralDiscountPercentage > 0)
                {
                    CustomerSalesOrder.GeneralDiscountAmount = CustomerSalesOrder.SubTotal * (CustomerSalesOrder.GeneralDiscountPercentage / 100);
                    CustomerSalesOrder.GeneralDiscountAmount = Math.Round(CustomerSalesOrder.GeneralDiscountAmount.Value, 0);
                }
                foreach (var CustomerSalesOrderContent in CustomerSalesOrder.CustomerSalesOrderContents)
                {
                    //phân bổ chiết khấu chung = tổng chiết khấu chung * (tổng từng line/tổng trc chiết khấu)
                    CustomerSalesOrderContent.GeneralDiscountPercentage = CustomerSalesOrderContent.Amount / CustomerSalesOrder.SubTotal * 100;
                    CustomerSalesOrderContent.GeneralDiscountAmount     = CustomerSalesOrder.GeneralDiscountAmount * CustomerSalesOrderContent.GeneralDiscountPercentage / 100;
                    CustomerSalesOrderContent.GeneralDiscountAmount     = Math.Round(CustomerSalesOrderContent.GeneralDiscountAmount ?? 0, 0);
                    //thuê từng line = (tổng từng line - chiết khấu phân bổ) * % thuế
                    CustomerSalesOrderContent.TaxAmount = (CustomerSalesOrderContent.Amount - (CustomerSalesOrderContent.GeneralDiscountAmount.HasValue ? CustomerSalesOrderContent.GeneralDiscountAmount.Value : 0)) * CustomerSalesOrderContent.TaxPercentage / 100;
                    CustomerSalesOrderContent.TaxAmount = Math.Round(CustomerSalesOrderContent.TaxAmount ?? 0, 0);
                }

                CustomerSalesOrder.TotalTax = CustomerSalesOrder.CustomerSalesOrderContents.Where(x => x.TaxAmount.HasValue).Sum(x => x.TaxAmount.Value);
                CustomerSalesOrder.TotalTax = Math.Round(CustomerSalesOrder.TotalTax, 0);
                CustomerSalesOrder.Total    = CustomerSalesOrder.SubTotal - (CustomerSalesOrder.GeneralDiscountAmount.HasValue ? CustomerSalesOrder.GeneralDiscountAmount.Value : 0) + CustomerSalesOrder.TotalTax;
            }
            else
            {
                CustomerSalesOrder.SubTotal = 0;
                CustomerSalesOrder.GeneralDiscountPercentage = null;
                CustomerSalesOrder.GeneralDiscountAmount     = null;
                CustomerSalesOrder.TotalTax = 0;
                CustomerSalesOrder.Total    = 0;
            }

            //sản phẩm khuyến mãi
            if (CustomerSalesOrder.CustomerSalesOrderPromotions != null)
            {
                foreach (var CustomerSalesOrderPromotion in CustomerSalesOrder.CustomerSalesOrderPromotions)
                {
                    var Product = Products.Where(x => CustomerSalesOrderPromotion.Item.ProductId == x.Id).FirstOrDefault();
                    CustomerSalesOrderPromotion.PrimaryUnitOfMeasureId = Product.UnitOfMeasureId;

                    List <UnitOfMeasure> UnitOfMeasures = new List <UnitOfMeasure>();
                    if (Product.UnitOfMeasureGroupingId.HasValue)
                    {
                        var UOMG = UOMGs.Where(x => x.Id == Product.UnitOfMeasureGroupingId).FirstOrDefault();
                        UnitOfMeasures = UOMG.UnitOfMeasureGroupingContents.Select(x => new UnitOfMeasure
                        {
                            Id          = x.UnitOfMeasure.Id,
                            Code        = x.UnitOfMeasure.Code,
                            Name        = x.UnitOfMeasure.Name,
                            Description = x.UnitOfMeasure.Description,
                            StatusId    = x.UnitOfMeasure.StatusId,
                            Factor      = x.Factor
                        }).ToList();
                    }

                    UnitOfMeasures.Add(new UnitOfMeasure
                    {
                        Id          = Product.UnitOfMeasure.Id,
                        Code        = Product.UnitOfMeasure.Code,
                        Name        = Product.UnitOfMeasure.Name,
                        Description = Product.UnitOfMeasure.Description,
                        StatusId    = Product.UnitOfMeasure.StatusId,
                        Factor      = 1
                    });
                    var UOM = UnitOfMeasures.Where(x => CustomerSalesOrderPromotion.UnitOfMeasureId == x.Id).FirstOrDefault();
                    CustomerSalesOrderPromotion.RequestedQuantity = CustomerSalesOrderPromotion.Quantity * UOM.Factor.Value;
                }
            }

            return(CustomerSalesOrder);
        }
 public Company_CustomerSalesOrderDTO(CustomerSalesOrder CustomerSalesOrder)
 {
     this.Id                           = CustomerSalesOrder.Id;
     this.Code                         = CustomerSalesOrder.Code;
     this.CustomerTypeId               = CustomerSalesOrder.CustomerTypeId;
     this.CustomerId                   = CustomerSalesOrder.CustomerId;
     this.OpportunityId                = CustomerSalesOrder.OpportunityId;
     this.ContractId                   = CustomerSalesOrder.ContractId;
     this.OrderPaymentStatusId         = CustomerSalesOrder.OrderPaymentStatusId;
     this.RequestStateId               = CustomerSalesOrder.RequestStateId;
     this.EditedPriceStatusId          = CustomerSalesOrder.EditedPriceStatusId;
     this.ShippingName                 = CustomerSalesOrder.ShippingName;
     this.OrderDate                    = CustomerSalesOrder.OrderDate;
     this.DeliveryDate                 = CustomerSalesOrder.DeliveryDate;
     this.SalesEmployeeId              = CustomerSalesOrder.SalesEmployeeId;
     this.Note                         = CustomerSalesOrder.Note;
     this.InvoiceAddress               = CustomerSalesOrder.InvoiceAddress;
     this.InvoiceNationId              = CustomerSalesOrder.InvoiceNationId;
     this.InvoiceProvinceId            = CustomerSalesOrder.InvoiceProvinceId;
     this.InvoiceDistrictId            = CustomerSalesOrder.InvoiceDistrictId;
     this.InvoiceWardId                = CustomerSalesOrder.InvoiceWardId;
     this.InvoiceZIPCode               = CustomerSalesOrder.InvoiceZIPCode;
     this.DeliveryAddress              = CustomerSalesOrder.DeliveryAddress;
     this.DeliveryNationId             = CustomerSalesOrder.DeliveryNationId;
     this.DeliveryProvinceId           = CustomerSalesOrder.DeliveryProvinceId;
     this.DeliveryDistrictId           = CustomerSalesOrder.DeliveryDistrictId;
     this.DeliveryWardId               = CustomerSalesOrder.DeliveryWardId;
     this.DeliveryZIPCode              = CustomerSalesOrder.DeliveryZIPCode;
     this.SubTotal                     = CustomerSalesOrder.SubTotal;
     this.GeneralDiscountPercentage    = CustomerSalesOrder.GeneralDiscountPercentage;
     this.GeneralDiscountAmount        = CustomerSalesOrder.GeneralDiscountAmount;
     this.TotalTaxOther                = CustomerSalesOrder.TotalTaxOther;
     this.TotalTax                     = CustomerSalesOrder.TotalTax;
     this.Total                        = CustomerSalesOrder.Total;
     this.CreatorId                    = CustomerSalesOrder.CreatorId;
     this.OrganizationId               = CustomerSalesOrder.OrganizationId;
     this.RowId                        = CustomerSalesOrder.RowId;
     this.Contract                     = CustomerSalesOrder.Contract == null ? null : new Company_ContractDTO(CustomerSalesOrder.Contract);
     this.Creator                      = CustomerSalesOrder.Creator == null ? null : new Company_AppUserDTO(CustomerSalesOrder.Creator);
     this.Customer                     = CustomerSalesOrder.Customer == null ? null : new Company_CustomerDTO(CustomerSalesOrder.Customer);
     this.CustomerType                 = CustomerSalesOrder.CustomerType == null ? null : new Company_CustomerTypeDTO(CustomerSalesOrder.CustomerType);
     this.DeliveryDistrict             = CustomerSalesOrder.DeliveryDistrict == null ? null : new Company_DistrictDTO(CustomerSalesOrder.DeliveryDistrict);
     this.DeliveryNation               = CustomerSalesOrder.DeliveryNation == null ? null : new Company_NationDTO(CustomerSalesOrder.DeliveryNation);
     this.DeliveryProvince             = CustomerSalesOrder.DeliveryProvince == null ? null : new Company_ProvinceDTO(CustomerSalesOrder.DeliveryProvince);
     this.DeliveryWard                 = CustomerSalesOrder.DeliveryWard == null ? null : new Company_WardDTO(CustomerSalesOrder.DeliveryWard);
     this.EditedPriceStatus            = CustomerSalesOrder.EditedPriceStatus == null ? null : new Company_EditedPriceStatusDTO(CustomerSalesOrder.EditedPriceStatus);
     this.InvoiceDistrict              = CustomerSalesOrder.InvoiceDistrict == null ? null : new Company_DistrictDTO(CustomerSalesOrder.InvoiceDistrict);
     this.InvoiceNation                = CustomerSalesOrder.InvoiceNation == null ? null : new Company_NationDTO(CustomerSalesOrder.InvoiceNation);
     this.InvoiceProvince              = CustomerSalesOrder.InvoiceProvince == null ? null : new Company_ProvinceDTO(CustomerSalesOrder.InvoiceProvince);
     this.InvoiceWard                  = CustomerSalesOrder.InvoiceWard == null ? null : new Company_WardDTO(CustomerSalesOrder.InvoiceWard);
     this.Opportunity                  = CustomerSalesOrder.Opportunity == null ? null : new Company_OpportunityDTO(CustomerSalesOrder.Opportunity);
     this.OrderPaymentStatus           = CustomerSalesOrder.OrderPaymentStatus == null ? null : new Company_OrderPaymentStatusDTO(CustomerSalesOrder.OrderPaymentStatus);
     this.Organization                 = CustomerSalesOrder.Organization == null ? null : new Company_OrganizationDTO(CustomerSalesOrder.Organization);
     this.RequestState                 = CustomerSalesOrder.RequestState == null ? null : new Company_RequestStateDTO(CustomerSalesOrder.RequestState);
     this.SalesEmployee                = CustomerSalesOrder.SalesEmployee == null ? null : new Company_AppUserDTO(CustomerSalesOrder.SalesEmployee);
     this.CustomerSalesOrderContents   = CustomerSalesOrder.CustomerSalesOrderContents?.Select(x => new Company_CustomerSalesOrderContentDTO(x)).ToList();
     this.CustomerSalesOrderPromotions = CustomerSalesOrder.CustomerSalesOrderPromotions?.Select(x => new Company_CustomerSalesOrderPromotionDTO(x)).ToList();
     this.CreatedAt                    = CustomerSalesOrder.CreatedAt;
     this.UpdatedAt                    = CustomerSalesOrder.UpdatedAt;
     this.Errors                       = CustomerSalesOrder.Errors;
 }
        private async Task <bool> ValidateContent(CustomerSalesOrder CustomerSalesOrder)
        {
            if (CustomerSalesOrder.CustomerSalesOrderContents != null && CustomerSalesOrder.CustomerSalesOrderContents.Any())
            {
                var         ItemIds    = CustomerSalesOrder.CustomerSalesOrderContents.Select(x => x.ItemId).ToList();
                var         ProductIds = CustomerSalesOrder.CustomerSalesOrderContents.Select(x => x.Item.ProductId).ToList();
                List <Item> Items      = await UOW.ItemRepository.List(new ItemFilter
                {
                    Skip = 0,
                    Take = int.MaxValue,
                    Id   = new IdFilter {
                        In = ItemIds
                    },
                    Selects = ItemSelect.Id | ItemSelect.SalePrice | ItemSelect.ProductId
                });

                var Products = await UOW.ProductRepository.List(new ProductFilter
                {
                    Id = new IdFilter {
                        In = ProductIds
                    },
                    Skip    = 0,
                    Take    = int.MaxValue,
                    Selects = ProductSelect.UnitOfMeasure | ProductSelect.UnitOfMeasureGrouping | ProductSelect.Id | ProductSelect.TaxType
                });

                var UOMGs = await UOW.UnitOfMeasureGroupingRepository.List(new UnitOfMeasureGroupingFilter
                {
                    Skip    = 0,
                    Take    = int.MaxValue,
                    Selects = UnitOfMeasureGroupingSelect.Id | UnitOfMeasureGroupingSelect.UnitOfMeasure | UnitOfMeasureGroupingSelect.UnitOfMeasureGroupingContents
                });

                foreach (var CustomerSalesOrderContent in CustomerSalesOrder.CustomerSalesOrderContents)
                {
                    if (CustomerSalesOrderContent.UnitOfMeasureId == 0)
                    {
                        CustomerSalesOrderContent.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrderContent.UnitOfMeasure), ErrorCode.UnitOfMeasureEmpty);
                    }
                    else
                    {
                        var Item = Items.Where(x => x.Id == CustomerSalesOrderContent.ItemId).FirstOrDefault();
                        if (Item == null)
                        {
                            CustomerSalesOrderContent.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrderContent.Item), ErrorCode.ItemNotExisted);
                        }
                        else
                        {
                            var Product = Products.Where(x => Item.ProductId == x.Id).FirstOrDefault();
                            List <UnitOfMeasure> UnitOfMeasures = new List <UnitOfMeasure>();
                            if (Product.UnitOfMeasureGroupingId.HasValue)
                            {
                                var UOMG = UOMGs.Where(x => x.Id == Product.UnitOfMeasureGroupingId).FirstOrDefault();
                                UnitOfMeasures = UOMG.UnitOfMeasureGroupingContents.Select(x => new UnitOfMeasure
                                {
                                    Id          = x.UnitOfMeasure.Id,
                                    Code        = x.UnitOfMeasure.Code,
                                    Name        = x.UnitOfMeasure.Name,
                                    Description = x.UnitOfMeasure.Description,
                                    StatusId    = x.UnitOfMeasure.StatusId,
                                    Factor      = x.Factor
                                }).ToList();
                            }

                            UnitOfMeasures.Add(new UnitOfMeasure
                            {
                                Id          = Product.UnitOfMeasure.Id,
                                Code        = Product.UnitOfMeasure.Code,
                                Name        = Product.UnitOfMeasure.Name,
                                Description = Product.UnitOfMeasure.Description,
                                StatusId    = Product.UnitOfMeasure.StatusId,
                                Factor      = 1
                            });

                            var UOM = UnitOfMeasures.Where(x => CustomerSalesOrderContent.UnitOfMeasureId == x.Id).FirstOrDefault();
                            if (UOM == null)
                            {
                                CustomerSalesOrderContent.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrderContent.UnitOfMeasure), ErrorCode.UnitOfMeasureNotExisted);
                            }
                            //else
                            //{
                            //    if(CustomerSalesOrder.EditedPriceStatusId == EditedPriceStatusEnum.ACTIVE.Id)
                            //    {
                            //        if(CustomerSalesOrderContent.SalePrice < (Item.SalePrice * UOM.Factor.Value) * 0.9m
                            //            || CustomerSalesOrderContent.SalePrice > (Item.SalePrice * UOM.Factor.Value) * 1.1m)
                            //            CustomerSalesOrderContent.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrderContent.SalePrice), ErrorCode.PriceOutOfRange);
                            //    }
                            //}
                        }

                        if (CustomerSalesOrderContent.Quantity <= 0)
                        {
                            CustomerSalesOrderContent.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrderContent.Quantity), ErrorCode.QuantityEmpty);
                        }
                    }
                }
            }
            else
            {
                if (CustomerSalesOrder.CustomerSalesOrderPromotions == null || !CustomerSalesOrder.CustomerSalesOrderPromotions.Any())
                {
                    CustomerSalesOrder.AddError(nameof(CustomerSalesOrderValidator), nameof(CustomerSalesOrder.Id), ErrorCode.ContentEmpty);
                }
            }

            return(CustomerSalesOrder.IsValidated);
        }