public CostCalculationRetail MapToModel(CostCalculationRetailViewModel viewModel)
        {
            CostCalculationRetail model = new CostCalculationRetail();

            PropertyCopier <CostCalculationRetailViewModel, CostCalculationRetail> .Copy(viewModel, model);

            model.StyleId              = viewModel.Style._id;
            model.StyleName            = viewModel.Style.name;
            model.SeasonId             = viewModel.Season._id;
            model.SeasonCode           = viewModel.Season.code;
            model.SeasonName           = viewModel.Season.name;
            model.CounterId            = viewModel.Counter._id;
            model.CounterName          = viewModel.Counter.name;
            model.BuyerId              = viewModel.Buyer.Id;
            model.BuyerName            = viewModel.Buyer.Name;
            model.SizeRangeId          = viewModel.SizeRange.Id;
            model.SizeRangeName        = viewModel.SizeRange.Name;
            model.FabricAllowance      = Percentage.ToFraction(viewModel.FabricAllowance);
            model.AccessoriesAllowance = Percentage.ToFraction(viewModel.AccessoriesAllowance);
            model.EfficiencyId         = viewModel.Efficiency.Id;
            model.EfficiencyValue      = viewModel.Efficiency.Value != null ? (double)viewModel.Efficiency.Value : 0;
            model.Risk = Percentage.ToFraction(viewModel.Risk);

            model.OLId               = viewModel.OL.Id;
            model.OLRate             = viewModel.OL.Value != null ? (double)viewModel.OL.Value : 0;
            model.OLCalculatedRate   = viewModel.OL.CalculatedValue != null ? (double)viewModel.OL.CalculatedValue : 0;
            model.OTL1Id             = viewModel.OTL1.Id;
            model.OTL1Rate           = viewModel.OTL1.Value != null ? (double)viewModel.OTL1.Value : 0;
            model.OTL1CalculatedRate = viewModel.OTL1.CalculatedValue != null ? (double)viewModel.OTL1.CalculatedValue : 0;
            model.OTL2Id             = viewModel.OTL2.Id;
            model.OTL2Rate           = viewModel.OTL2.Value != null ? (double)viewModel.OTL2.Value : 0;
            model.OTL2CalculatedRate = viewModel.OTL2.CalculatedValue != null ? (double)viewModel.OTL2.CalculatedValue : 0;
            model.OTL3Id             = viewModel.OTL3.Id;
            model.OTL3Rate           = viewModel.OTL3.Value != null ? (double)viewModel.OTL3.Value : 0;
            model.OTL3CalculatedRate = viewModel.OTL3.CalculatedValue != null ? (double)viewModel.OTL3.CalculatedValue : 0;

            model.CostCalculationRetail_Materials = new List <CostCalculationRetail_Material>();

            foreach (CostCalculationRetail_MaterialViewModel costCalculationRetail_MaterialVM in viewModel.CostCalculationRetail_Materials)
            {
                CostCalculationRetail_Material costCalculationRetail_Material = new CostCalculationRetail_Material();
                PropertyCopier <CostCalculationRetail_MaterialViewModel, CostCalculationRetail_Material> .Copy(costCalculationRetail_MaterialVM, costCalculationRetail_Material);

                costCalculationRetail_Material.CategoryId      = costCalculationRetail_MaterialVM.Category.Id;
                costCalculationRetail_Material.CategoryName    = costCalculationRetail_MaterialVM.Category.SubCategory != null ? costCalculationRetail_MaterialVM.Category.Name + " - " + costCalculationRetail_MaterialVM.Category.SubCategory : costCalculationRetail_MaterialVM.Category.Name;
                costCalculationRetail_Material.MaterialId      = costCalculationRetail_MaterialVM.Material.Id;
                costCalculationRetail_Material.MaterialName    = costCalculationRetail_MaterialVM.Material.Name;
                costCalculationRetail_Material.UOMQuantityId   = costCalculationRetail_MaterialVM.UOMQuantity.Id;
                costCalculationRetail_Material.UOMQuantityName = costCalculationRetail_MaterialVM.UOMQuantity.Name;
                costCalculationRetail_Material.UOMPriceId      = costCalculationRetail_MaterialVM.UOMPrice.Id;
                costCalculationRetail_Material.UOMPriceName    = costCalculationRetail_MaterialVM.UOMPrice.Name;

                model.CostCalculationRetail_Materials.Add(costCalculationRetail_Material);
            }

            return(model);
        }
        public async Task GeneratePO(int Id)
        {
            HashSet <int> CostCalculationRetail_Materials = new HashSet <int>(this.CostCalculationRetail_MaterialService.DbSet
                                                                              .Where(p => p.CostCalculationRetailId.Equals(Id))
                                                                              .Select(p => p.Id));

            foreach (int id in CostCalculationRetail_Materials)
            {
                CostCalculationRetail_Material model = await CostCalculationRetail_MaterialService.ReadModelById(id);

                if (model.PO_SerialNumber == null || model.PO_SerialNumber == 0)
                {
                    await CostCalculationRetail_MaterialService.GeneratePO(model);
                }
            }
        }
        public override async Task <int> UpdateModel(int Id, CostCalculationRetail Model)
        {
            Model.ImagePath = await this.AzureImageService.UploadImage(Model.GetType().Name, Model.Id, Model._CreatedUtc, Model.ImageFile);

            int updated = await this.UpdateAsync(Id, Model);

            if (Model.CostCalculationRetail_Materials != null)
            {
                HashSet <int> costCalculationRetail_Materials = new HashSet <int>(this.CostCalculationRetail_MaterialService.DbSet
                                                                                  .Where(p => p.CostCalculationRetailId.Equals(Id))
                                                                                  .Select(p => p.Id));

                foreach (int costCalculationRetail_Material in costCalculationRetail_Materials)
                {
                    CostCalculationRetail_Material model = Model.CostCalculationRetail_Materials.FirstOrDefault(prop => prop.Id.Equals(costCalculationRetail_Material));

                    if (model == null)
                    {
                        await this.CostCalculationRetail_MaterialService.DeleteModel(costCalculationRetail_Material);
                    }
                    else
                    {
                        await this.CostCalculationRetail_MaterialService.UpdateModel(costCalculationRetail_Material, model);
                    }
                }

                foreach (CostCalculationRetail_Material costCalculationRetail_Material in Model.CostCalculationRetail_Materials)
                {
                    if (costCalculationRetail_Material.Id.Equals(0))
                    {
                        await this.CostCalculationRetail_MaterialService.CreateModel(costCalculationRetail_Material);
                    }
                }
            }

            return(updated);
        }