public async Task <int> Update(int id, InputAvalTransformationViewModel viewModel)
        {
            int result  = 0;
            var dbModel = await _repository.ReadByIdAsync(id);

            var model = new DyeingPrintingAreaInputModel(viewModel.Date, viewModel.Area, viewModel.Shift, viewModel.BonNo, viewModel.Group, viewModel.AvalType, viewModel.IsTransformedAval,
                                                         viewModel.TotalQuantity, viewModel.TotalWeight,
                                                         viewModel.AvalTransformationProductionOrders.Select(d => new DyeingPrintingAreaInputProductionOrderModel(viewModel.Area, d.BonNo, d.ProductionOrder.Id, d.ProductionOrder.No,
                                                                                                                                                                  d.ProductionOrder.Type, d.ProductionOrder.OrderQuantity, d.CartNo, d.Construction, d.Unit, d.Buyer, d.BuyerId, d.Color, d.Motif, d.AvalType, d.UomUnit, d.InputQuantity,
                                                                                                                                                                  d.HasOutputDocument, d.DyeingPrintingAreaInputProductionOrderId, d.Material.Id, d.Material.Name, d.MaterialConstruction.Id, d.MaterialConstruction.Name, d.MaterialWidth,
                                                                                                                                                                  d.Machine, d.ProcessType.Id, d.ProcessType.Name, d.YarnMaterial.Id, d.YarnMaterial.Name, d.ProductSKUId, d.FabricSKUId, d.ProductSKUCode, d.HasPrintingProductSKU, d.ProductPackingId, d.FabricPackingId, d.ProductPackingCode, d.HasPrintingProductPacking, d.InputQuantity, d.FinishWidth)
            {
                Id = d.Id
            }).ToList());

            result = await _repository.UpdateAvalTransformationArea(id, model, dbModel);

            var diffAvalQuantity = dbModel.TotalAvalQuantity - model.TotalAvalQuantity;
            var diffAvalWeight   = dbModel.TotalAvalWeight - model.TotalAvalWeight;
            var movementModel    = new DyeingPrintingAreaMovementModel(viewModel.Date, viewModel.Area, DyeingPrintingArea.TRANSFORM, model.Id, model.BonNo, diffAvalQuantity * -1, diffAvalWeight * -1, model.AvalType);

            result += await _movementRepository.InsertAsync(movementModel);

            return(result);
        }
        public async Task <int> Create(InputAvalTransformationViewModel viewModel)
        {
            int result = 0;

            var model = _repository.GetDbSet().AsNoTracking()
                        .FirstOrDefault(s => s.Area == DyeingPrintingArea.GUDANGAVAL && s.Date.Date == viewModel.Date.Date & s.Shift == viewModel.Shift && s.AvalType == viewModel.AvalType && s.IsTransformedAval);

            viewModel.AvalTransformationProductionOrders = viewModel.AvalTransformationProductionOrders.Where(s => s.IsSave).ToList();
            if (model == null)
            {
                int    totalCurrentYearData = _repository.ReadAllIgnoreQueryFilter().Count(s => s.IsTransformedAval && s.Area == DyeingPrintingArea.GUDANGAVAL && s.CreatedUtc.Year == viewModel.Date.Year);
                string bonNo = GenerateBonNo(totalCurrentYearData + 1, viewModel.Date);
                model = new DyeingPrintingAreaInputModel(viewModel.Date, viewModel.Area, viewModel.Shift, bonNo, viewModel.Group, viewModel.AvalType, true,
                                                         viewModel.TotalQuantity, viewModel.TotalWeight,
                                                         viewModel.AvalTransformationProductionOrders.Select(d => new DyeingPrintingAreaInputProductionOrderModel(viewModel.Area, d.BonNo, d.ProductionOrder.Id, d.ProductionOrder.No,
                                                                                                                                                                  d.ProductionOrder.Type, d.ProductionOrder.OrderQuantity, d.CartNo, d.Construction, d.Unit, d.Buyer, d.BuyerId, d.Color, d.Motif, d.AvalType, d.UomUnit, d.InputQuantity,
                                                                                                                                                                  false, d.Id, d.Material.Id, d.Material.Name, d.MaterialConstruction.Id, d.MaterialConstruction.Name, d.MaterialWidth, d.Machine, d.ProcessType.Id, d.ProcessType.Name,
                                                                                                                                                                  d.YarnMaterial.Id, d.YarnMaterial.Name, d.ProductSKUId, d.FabricSKUId, d.ProductSKUCode, d.HasPrintingProductSKU, d.ProductPackingId, d.FabricPackingId, d.ProductPackingCode, d.HasPrintingProductPacking, d.InputQuantity, d.FinishWidth)).ToList());

                result = await _repository.InsertAsync(model);

                var movementModel = new DyeingPrintingAreaMovementModel(viewModel.Date, viewModel.Area, DyeingPrintingArea.TRANSFORM, model.Id, model.BonNo, model.TotalAvalQuantity, model.TotalAvalWeight, model.AvalType);

                result += await _movementRepository.InsertAsync(movementModel);

                foreach (var item in model.DyeingPrintingAreaInputProductionOrders)
                {
                    var itemVM = viewModel.AvalTransformationProductionOrders.FirstOrDefault(s => s.Id == item.DyeingPrintingAreaOutputProductionOrderId);
                    result += await _inputProductionOrderRepository.UpdateFromOutputAsync(item.DyeingPrintingAreaOutputProductionOrderId, true);
                }
            }
            else
            {
                foreach (var item in viewModel.AvalTransformationProductionOrders)
                {
                    var modelItem = new DyeingPrintingAreaInputProductionOrderModel(viewModel.Area, item.BonNo, item.ProductionOrder.Id, item.ProductionOrder.No, item.ProductionOrder.Type,
                                                                                    item.ProductionOrder.OrderQuantity, item.CartNo, item.Construction, item.Unit, item.Buyer, item.BuyerId, item.Color, item.Motif, item.AvalType, item.UomUnit,
                                                                                    item.InputQuantity, false, item.Id, item.Material.Id, item.Material.Name, item.MaterialConstruction.Id, item.MaterialConstruction.Name,
                                                                                    item.MaterialWidth, item.Machine, item.ProcessType.Id, item.ProcessType.Name, item.YarnMaterial.Id, item.YarnMaterial.Name, item.ProductSKUId, item.FabricSKUId, item.ProductSKUCode, item.HasPrintingProductSKU, item.ProductPackingId, item.FabricPackingId, item.ProductPackingCode, item.HasPrintingProductPacking, item.InputQuantity, item.FinishWidth);

                    modelItem.DyeingPrintingAreaInputId = model.Id;

                    result += await _inputProductionOrderRepository.InsertAsync(modelItem);

                    result += await _inputProductionOrderRepository.UpdateFromOutputAsync(item.Id, true);
                }
                var movementModel = new DyeingPrintingAreaMovementModel(viewModel.Date, viewModel.Area, DyeingPrintingArea.TRANSFORM, model.Id, model.BonNo, viewModel.TotalQuantity, viewModel.TotalWeight, viewModel.AvalType);

                result += await _movementRepository.InsertAsync(movementModel);

                result += await _repository.UpdateHeaderAvalTransform(model, viewModel.TotalQuantity, viewModel.TotalWeight);
            }



            return(result);
        }
        private InputAvalTransformationViewModel MapToViewModel(DyeingPrintingAreaInputModel model)
        {
            var vm = new InputAvalTransformationViewModel()
            {
                Active            = model.Active,
                TotalWeight       = model.TotalAvalWeight,
                TotalQuantity     = model.TotalAvalQuantity,
                AvalType          = model.AvalType,
                Area              = model.Area,
                BonNo             = model.BonNo,
                CreatedAgent      = model.CreatedAgent,
                CreatedBy         = model.CreatedBy,
                CreatedUtc        = model.CreatedUtc,
                Date              = model.Date,
                DeletedAgent      = model.DeletedAgent,
                DeletedBy         = model.DeletedBy,
                DeletedUtc        = model.DeletedUtc,
                Group             = model.Group,
                Id                = model.Id,
                IsDeleted         = model.IsDeleted,
                LastModifiedAgent = model.LastModifiedAgent,
                LastModifiedBy    = model.LastModifiedBy,
                LastModifiedUtc   = model.LastModifiedUtc,
                IsTransformedAval = model.IsTransformedAval,
                Shift             = model.Shift,
                AvalTransformationProductionOrders = model.DyeingPrintingAreaInputProductionOrders.Select(d => new InputAvalTransformationProductionOrderViewModel()
                {
                    Active       = d.Active,
                    AvalType     = d.AvalType,
                    BonNo        = d.InputAvalBonNo,
                    Machine      = d.Machine,
                    Buyer        = d.Buyer,
                    BuyerId      = d.BuyerId,
                    CartNo       = d.CartNo,
                    Color        = d.Color,
                    Construction = d.Construction,
                    CreatedAgent = d.CreatedAgent,
                    CreatedBy    = d.CreatedBy,
                    CreatedUtc   = d.CreatedUtc,
                    DeletedAgent = d.DeletedAgent,
                    DeletedBy    = d.DeletedBy,
                    DeletedUtc   = d.DeletedUtc,
                    DyeingPrintingAreaInputProductionOrderId = d.DyeingPrintingAreaOutputProductionOrderId,
                    Id                = d.Id,
                    IsDeleted         = d.IsDeleted,
                    LastModifiedAgent = d.LastModifiedAgent,
                    LastModifiedBy    = d.LastModifiedBy,
                    LastModifiedUtc   = d.LastModifiedUtc,
                    Motif             = d.Motif,
                    MaterialWidth     = d.MaterialWidth,
                    FinishWidth       = d.FinishWidth,
                    Material          = new Material()
                    {
                        Id   = d.MaterialId,
                        Name = d.MaterialName
                    },
                    MaterialConstruction = new MaterialConstruction()
                    {
                        Name = d.MaterialConstructionName,
                        Id   = d.MaterialConstructionId
                    },
                    ProcessType = new CommonViewModelObjectProperties.ProcessType()
                    {
                        Id   = d.ProcessTypeId,
                        Name = d.ProcessTypeName
                    },
                    YarnMaterial = new CommonViewModelObjectProperties.YarnMaterial()
                    {
                        Id   = d.YarnMaterialId,
                        Name = d.YarnMaterialName
                    },
                    ProductionOrder = new ProductionOrder()
                    {
                        Id            = d.ProductionOrderId,
                        No            = d.ProductionOrderNo,
                        OrderQuantity = d.ProductionOrderOrderQuantity,
                        Type          = d.ProductionOrderType
                    },
                    Quantity                  = d.Balance,
                    InputQuantity             = d.InputQuantity,
                    Unit                      = d.Unit,
                    UomUnit                   = d.UomUnit,
                    HasOutputDocument         = d.HasOutputDocument,
                    ProductSKUId              = d.ProductSKUId,
                    FabricSKUId               = d.FabricSKUId,
                    ProductSKUCode            = d.ProductSKUCode,
                    HasPrintingProductSKU     = d.HasPrintingProductSKU,
                    ProductPackingId          = d.ProductPackingId,
                    FabricPackingId           = d.FabricPackingId,
                    ProductPackingCode        = d.ProductPackingCode,
                    HasPrintingProductPacking = d.HasPrintingProductPacking
                }).ToList()
            };

            return(vm);
        }