public async Task <int> UpdateAvalTransformationArea(int id, DyeingPrintingAreaInputModel model, DyeingPrintingAreaInputModel dbModel)
        {
            int result = 0;

            dbModel.SetDate(model.Date, _identityProvider.Username, UserAgent);
            dbModel.SetShift(model.Shift, _identityProvider.Username, UserAgent);
            dbModel.SetGroup(model.Group, _identityProvider.Username, UserAgent);
            dbModel.SetIsTransformedAval(model.IsTransformedAval, _identityProvider.Username, UserAgent);
            dbModel.SetTotalAvalQuantity(model.TotalAvalQuantity, _identityProvider.Username, UserAgent);
            dbModel.SetTotalAvalWeight(model.TotalAvalWeight, _identityProvider.Username, UserAgent);

            foreach (var item in dbModel.DyeingPrintingAreaInputProductionOrders.Where(s => !s.HasOutputDocument))
            {
                var localItem = model.DyeingPrintingAreaInputProductionOrders.FirstOrDefault(s => s.Id == item.Id);

                if (localItem == null)
                {
                    item.FlagForDelete(_identityProvider.Username, UserAgent);
                    result += await _SPPRepository.UpdateFromOutputAsync(item.DyeingPrintingAreaOutputProductionOrderId, false);
                }
            }

            result += await _dbContext.SaveChangesAsync();

            return(result);
        }
        public async Task <int> UpdateTransitArea(int id, DyeingPrintingAreaInputModel model, DyeingPrintingAreaInputModel dbModel)
        {
            int result = 0;

            dbModel.SetDate(model.Date, _identityProvider.Username, UserAgent);
            dbModel.SetShift(model.Shift, _identityProvider.Username, UserAgent);
            dbModel.SetGroup(model.Group, _identityProvider.Username, UserAgent);

            foreach (var item in dbModel.DyeingPrintingAreaInputProductionOrders.Where(s => !s.HasOutputDocument))
            {
                var localItem = model.DyeingPrintingAreaInputProductionOrders.FirstOrDefault(s => s.Id == item.Id);

                if (localItem == null)
                {
                    item.FlagForDelete(_identityProvider.Username, UserAgent);
                    result += await _outputSPPRepository.UpdateFromInputNextAreaFlagAsync(item.DyeingPrintingAreaOutputProductionOrderId, false, null);

                    var previousOutputData = await _outputSPPRepository.ReadByIdAsync(item.DyeingPrintingAreaOutputProductionOrderId);

                    if (previousOutputData.Area == DyeingPrintingArea.PACKING)
                    {
                        //var outputData = await _outputProductionOrderRepository.ReadByIdAsync(item.Id);
                        var packingData = JsonConvert.DeserializeObject <List <PackingData> >(previousOutputData.PrevSppInJson);
                        foreach (var pack in packingData)
                        {
                            pack.Balance *= -1;
                        }
                        result += await _SPPRepository.UpdateFromNextAreaInputPackingAsync(packingData);
                    }
                    else
                    {
                        result += await _SPPRepository.UpdateFromNextAreaInputAsync(previousOutputData.DyeingPrintingAreaInputProductionOrderId, item.Balance * -1, item.PackagingQty * -1);
                    }
                    //result += await _SPPRepository.UpdateFromNextAreaInputAsync(previousOutputData.DyeingPrintingAreaInputProductionOrderId, item.Balance * -1, item.PackagingQty * -1);
                }
            }

            //foreach (var item in model.DyeingPrintingAreaInputProductionOrders.Where(s => s.Id == 0))
            //{
            //    item.FlagForCreate(_identityProvider.Username, UserAgent);
            //    dbModel.DyeingPrintingAreaInputProductionOrders.Add(item);
            //    result += await _outputSPPRepository.UpdateFromInputNextAreaFlagAsync(item.DyeingPrintingAreaOutputProductionOrderId, true);
            //    var previousOutputData = await _outputSPPRepository.ReadByIdAsync(item.DyeingPrintingAreaOutputProductionOrderId);
            //    result += await _SPPRepository.UpdateFromNextAreaInputAsync(previousOutputData.DyeingPrintingAreaInputProductionOrderId, item.Balance);
            //}

            result += await _dbContext.SaveChangesAsync();

            return(result);
        }
        public Task <int> UpdateIMArea(int id, DyeingPrintingAreaInputModel model, DyeingPrintingAreaInputModel modelToUpdate)
        {
            modelToUpdate.SetDate(model.Date, _identityProvider.Username, UserAgent);
            modelToUpdate.SetShift(model.Shift, _identityProvider.Username, UserAgent);
            modelToUpdate.SetGroup(model.Group, _identityProvider.Username, UserAgent);

            foreach (var item in modelToUpdate.DyeingPrintingAreaInputProductionOrders.Where(s => !s.HasOutputDocument))
            {
                var localItem = model.DyeingPrintingAreaInputProductionOrders.FirstOrDefault(s => s.Id == item.Id);

                if (localItem == null)
                {
                    item.FlagForDelete(_identityProvider.Username, UserAgent);
                }
                else
                {
                    item.SetCartNo(localItem.CartNo, _identityProvider.Username, UserAgent);
                    var diffBalance = localItem.InputQuantity - item.InputQuantity;

                    var newBalanceRemains = item.BalanceRemains + diffBalance;
                    var newBalance        = item.Balance + diffBalance;

                    if (newBalanceRemains <= 0)
                    {
                        item.SetHasOutputDocument(true, _identityProvider.Username, UserAgent);
                    }
                    else
                    {
                        item.SetHasOutputDocument(false, _identityProvider.Username, UserAgent);
                    }
                    item.SetBalanceRemains(newBalanceRemains, _identityProvider.Username, UserAgent);
                    item.SetBalance(newBalance, _identityProvider.Username, UserAgent);
                    item.SetInputQuantity(localItem.InputQuantity, _identityProvider.Username, UserAgent);
                }
            }

            foreach (var item in model.DyeingPrintingAreaInputProductionOrders.Where(s => s.Id == 0))
            {
                item.FlagForCreate(_identityProvider.Username, UserAgent);
                modelToUpdate.DyeingPrintingAreaInputProductionOrders.Add(item);
            }

            return(_dbContext.SaveChangesAsync());
        }
        public async Task <int> UpdateShippingArea(int id, DyeingPrintingAreaInputModel model, DyeingPrintingAreaInputModel dbModel)
        {
            int result = 0;

            dbModel.SetDate(model.Date, _identityProvider.Username, UserAgent);
            dbModel.SetShift(model.Shift, _identityProvider.Username, UserAgent);
            dbModel.SetGroup(model.Group, _identityProvider.Username, UserAgent);

            foreach (var item in dbModel.DyeingPrintingAreaInputProductionOrders.Where(s => !s.HasOutputDocument))
            {
                var localItem = model.DyeingPrintingAreaInputProductionOrders.FirstOrDefault(s => s.Id == item.Id);

                if (localItem == null)
                {
                    item.FlagForDelete(_identityProvider.Username, UserAgent);

                    if (model.ShippingType == DyeingPrintingArea.ZONAGUDANG)
                    {
                        result += await _outputSPPRepository.UpdateFromInputNextAreaFlagAsync(item.DyeingPrintingAreaOutputProductionOrderId, false, null);

                        var previousOutputData = await _outputSPPRepository.ReadByIdAsync(item.DyeingPrintingAreaOutputProductionOrderId);

                        result += await _SPPRepository.UpdateFromNextAreaInputAsync(previousOutputData.DyeingPrintingAreaInputProductionOrderId, item.Balance * -1, item.PackagingQty * -1);
                    }
                }
                else
                {
                    var diffBalance    = localItem.InputQuantity - item.InputQuantity;
                    var diffQtyPacking = localItem.InputPackagingQty - item.InputPackagingQty;

                    var newBalanceRemains = item.BalanceRemains + diffBalance;
                    var newBalance        = item.Balance + diffBalance;

                    var newPackagingQty = item.PackagingQty + diffQtyPacking;

                    item.SetGrade(localItem.Grade, _identityProvider.Username, UserAgent);
                    item.SetPackagingType(localItem.PackagingType, _identityProvider.Username, UserAgent);
                    item.SetPackagingQty(newPackagingQty, _identityProvider.Username, UserAgent);
                    item.SetPackagingUnit(localItem.PackagingUnit, _identityProvider.Username, UserAgent);
                    item.SetPackagingLength(localItem.PackagingLength, _identityProvider.Username, UserAgent);
                    item.SetInputPackagingQty(localItem.InputPackagingQty, _identityProvider.Username, UserAgent);
                    item.SetBalance(newBalance, _identityProvider.Username, UserAgent);
                    item.SetInputQuantity(localItem.InputQuantity, _identityProvider.Username, UserAgent);
                    item.SetBalanceRemains(newBalanceRemains, _identityProvider.Username, UserAgent);
                }
            }

            if (model.ShippingType == DyeingPrintingArea.RETURBARANG)
            {
                foreach (var item in model.DyeingPrintingAreaInputProductionOrders.Where(s => s.Id == 0))
                {
                    item.FlagForCreate(_identityProvider.Username, UserAgent);
                    dbModel.DyeingPrintingAreaInputProductionOrders.Add(item);
                }
            }


            //foreach (var item in model.DyeingPrintingAreaInputProductionOrders.Where(s => s.Id == 0))
            //{
            //    item.FlagForCreate(_identityProvider.Username, UserAgent);
            //    dbModel.DyeingPrintingAreaInputProductionOrders.Add(item);
            //    result += await _outputSPPRepository.UpdateFromInputNextAreaFlagAsync(item.DyeingPrintingAreaOutputProductionOrderId, true);
            //    var previousOutputData = await _outputSPPRepository.ReadByIdAsync(item.DyeingPrintingAreaOutputProductionOrderId);
            //    result += await _SPPRepository.UpdateFromNextAreaInputAsync(previousOutputData.DyeingPrintingAreaInputProductionOrderId, item.Balance);
            //}

            result += await _dbContext.SaveChangesAsync();

            return(result);
        }