public async Task <int> DeleteAsync(int id)
        {
            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    int Deleted = 0;

                    GarmentLeftoverWarehouseExpenditureFabric model = await ReadByIdAsync(id);

                    model.FlagForDelete(IdentityService.Username, UserAgent);
                    foreach (var item in model.Items)
                    {
                        item.FlagForDelete(IdentityService.Username, UserAgent);
                    }

                    Deleted = await DbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        GarmentLeftoverWarehouseStock stock = GenerateStock(item);
                        await StockService.StockIn(stock, model.ExpenditureNo, model.Id, item.Id);
                    }

                    transaction.Commit();

                    return(Deleted);
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }
        }
コード例 #2
0
        public async Task ReadById_Success()
        {
            GarmentLeftoverWarehouseStockService service = new GarmentLeftoverWarehouseStockService(_dbContext(GetCurrentMethod()), GetServiceProvider().Object);

            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
            {
                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.FABRIC,
                UnitId        = 1,
                UnitCode      = "UnitFromCode",
                UnitName      = "UnitFromName",
                PONo          = "POSerialNumber",
                Quantity      = 1
            };

            await service.StockIn(stock, "StockReferenceNo", 1, 1);

            var result = service.Read(1, 1, "{}", new List <string>(), "", "{}");

            Assert.NotEmpty(result.Data);

            var id   = result.Data.Select(d => d.Id).First();
            var data = service.ReadById(id);

            Assert.NotNull(data);
        }
コード例 #3
0
        public async Task Should_Success_GetFabricExcelReport()
        {
            var serviceProvider = GetServiceProvider();

            var stockServiceMock = new Mock <IGarmentLeftoverWarehouseStockService>();

            stockServiceMock.Setup(s => s.StockOut(It.IsAny <GarmentLeftoverWarehouseStock>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <int>()))
            .ReturnsAsync(1);

            stockServiceMock.Setup(s => s.StockIn(It.IsAny <GarmentLeftoverWarehouseStock>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <int>()))
            .ReturnsAsync(1);

            serviceProvider
            .Setup(x => x.GetService(typeof(IGarmentLeftoverWarehouseStockService)))
            .Returns(stockServiceMock.Object);

            serviceProvider
            .Setup(x => x.GetService(typeof(IHttpService)))
            .Returns(new HttpTestService());

            GarmentLeftoverWarehouseStockReportService utilService = new GarmentLeftoverWarehouseStockReportService(_dbContext(GetCurrentMethod()), GetServiceProvider().Object);

            GarmentLeftoverWarehouseExpenditureFabricService service = new GarmentLeftoverWarehouseExpenditureFabricService(_dbContext(GetCurrentMethod()), serviceProvider.Object);

            GarmentLeftoverWarehouseBalanceStockService _balanceservice = new GarmentLeftoverWarehouseBalanceStockService(_dbContext(GetCurrentMethod()), serviceProvider.Object);

            GarmentLeftoverWarehouseReceiptFabricService receiptservice = new GarmentLeftoverWarehouseReceiptFabricService(_dbContext(GetCurrentMethod()), serviceProvider.Object);

            var data_Balance = _dataUtilbalanceStock(_balanceservice).GetTestData_FABRIC();

            var dataReceiptFabric = _dataUtilReceiptFabric(receiptservice).GetTestData();

            var dataFabric = await _dataUtilFabric(service).GetTestData();

            GarmentLeftoverWarehouseStockService serviceStock = new GarmentLeftoverWarehouseStockService(_dbContext(GetCurrentMethod()), GetServiceProvider().Object);

            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
            {
                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.FABRIC,
                UnitId        = 1,
                UnitCode      = "Unit",
                UnitName      = "UnitFromName",
                PONo          = "PONo",
                ProductCode   = "ProductCode",
                ProductName   = "ProductName",
                Quantity      = 1,
                UomId         = 1,
                UomUnit       = "Uom"
            };

            var resultStock = await serviceStock.StockIn(stock, "StockReferenceNo", 1, 1);

            await serviceStock.StockIn(stock, "StockReferenceNo", 1, 1);

            var result = utilService.GenerateExcelFabric(DateTime.Now, DateTime.Now, 1, 7);


            Assert.NotNull(result);
        }
コード例 #4
0
        private GarmentLeftoverWarehouseStock GenerateStock(string typeOfGoods, GarmentLeftoverWarehouseBalanceStockItem item)
        {
            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock();
            var referenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.FABRIC;

            if (typeOfGoods == "ACCESSORIES")
            {
                referenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.ACCESSORIES;
            }
            else if (typeOfGoods == "BARANG JADI")
            {
                referenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.FINISHED_GOOD;
            }

            if (typeOfGoods != "BARANG JADI")
            {
                stock = new GarmentLeftoverWarehouseStock
                {
                    ReferenceType        = referenceType,
                    UnitId               = item.UnitId,
                    UnitCode             = item.UnitCode,
                    UnitName             = item.UnitName,
                    PONo                 = item.PONo,
                    UomId                = item.UomId,
                    UomUnit              = item.UomUnit,
                    Quantity             = item.Quantity,
                    RONo                 = item.RONo,
                    LeftoverComodityCode = item.LeftoverComodityCode,
                    LeftoverComodityId   = item.LeftoverComodityId,
                    LeftoverComodityName = item.LeftoverComodityName,
                    ProductCode          = item.ProductCode,
                    ProductId            = item.ProductId,
                    ProductName          = item.ProductName,
                    BasicPrice           = item.BasicPrice
                };
            }
            else
            {
                stock = new GarmentLeftoverWarehouseStock
                {
                    ReferenceType        = referenceType,
                    UnitId               = item.UnitId,
                    UnitCode             = item.UnitCode,
                    UnitName             = item.UnitName,
                    PONo                 = item.PONo,
                    Quantity             = item.Quantity,
                    RONo                 = item.RONo,
                    LeftoverComodityCode = item.LeftoverComodityCode,
                    LeftoverComodityId   = item.LeftoverComodityId,
                    LeftoverComodityName = item.LeftoverComodityName,
                    BasicPrice           = item.BasicPrice
                };
            }

            return(stock);
        }
        public async Task <int> CreateAsync(GarmentLeftoverWarehouseReceiptFabric model)
        {
            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    int Created = 0;

                    model.FlagForCreate(IdentityService.Username, UserAgent);
                    model.FlagForUpdate(IdentityService.Username, UserAgent);

                    model.ReceiptNoteNo = GenerateNo(model);

                    foreach (var item in model.Items)
                    {
                        item.FlagForCreate(IdentityService.Username, UserAgent);
                        item.FlagForUpdate(IdentityService.Username, UserAgent);
                    }
                    DbSet.Add(model);
                    Created = await DbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                        {
                            ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.FABRIC,
                            UnitId        = model.UnitFromId,
                            UnitCode      = model.UnitFromCode,
                            UnitName      = model.UnitFromName,
                            PONo          = item.POSerialNumber,
                            UomId         = item.UomId,
                            UomUnit       = item.UomUnit,
                            Quantity      = item.Quantity,
                            ProductCode   = item.ProductCode,
                            ProductId     = item.ProductId,
                            ProductName   = item.ProductName,
                            BasicPrice    = item.BasicPrice
                        };
                        await StockService.StockIn(stock, model.ReceiptNoteNo, model.Id, item.Id);
                    }

                    await UpdateUnitExpenditureNoteIsReceived(model.UENId, true);

                    transaction.Commit();

                    return(Created);
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }
        }
コード例 #6
0
        public async Task <int> CreateAsync(GarmentLeftoverWarehouseReceiptFinishedGood model)
        {
            int Created = 0;

            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    model.FlagForCreate(IdentityService.Username, UserAgent);
                    model.FlagForUpdate(IdentityService.Username, UserAgent);

                    model.FinishedGoodReceiptNo = GenerateNo(model);

                    foreach (var item in model.Items)
                    {
                        item.FlagForCreate(IdentityService.Username, UserAgent);
                        item.FlagForUpdate(IdentityService.Username, UserAgent);
                    }
                    DbSet.Add(model);

                    Created = await DbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                        {
                            ReferenceType        = GarmentLeftoverWarehouseStockReferenceTypeEnum.FINISHED_GOOD,
                            UnitId               = model.UnitFromId,
                            UnitCode             = model.UnitFromCode,
                            UnitName             = model.UnitFromName,
                            RONo                 = item.RONo,
                            LeftoverComodityCode = item.LeftoverComodityCode,
                            LeftoverComodityId   = item.LeftoverComodityId,
                            LeftoverComodityName = item.LeftoverComodityName,
                            Quantity             = item.Quantity,
                            BasicPrice           = item.BasicPrice
                        };
                        await StockService.StockIn(stock, model.FinishedGoodReceiptNo, model.Id, item.Id);
                        await UpdateExpenditureGoodIsReceived(item.ExpenditureGoodId, "true");
                    }


                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }

            return(Created);
        }
        public async Task <int> DeleteAsync(int id)
        {
            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    int Deleted = 0;

                    GarmentLeftoverWarehouseReceiptAccessory model = await ReadByIdAsync(id);

                    model.FlagForDelete(IdentityService.Username, UserAgent);
                    foreach (var item in model.Items)
                    {
                        item.FlagForDelete(IdentityService.Username, UserAgent);
                    }

                    Deleted = await DbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                        {
                            ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.ACCESSORIES,
                            UnitId        = model.RequestUnitId,
                            UnitCode      = model.RequestUnitCode,
                            UnitName      = model.RequestUnitName,
                            PONo          = item.POSerialNumber,
                            UomId         = item.UomUnitId,
                            UomUnit       = item.UomUnit,
                            Quantity      = item.Quantity,
                            ProductCode   = item.ProductCode,
                            ProductId     = item.ProductId,
                            ProductName   = item.ProductName
                        };
                        await StockService.StockOut(stock, model.InvoiceNoReceive, model.Id, item.Id);
                    }

                    await UpdateUnitExpenditureNoteIsReceived(model.UENid, false);

                    transaction.Commit();

                    return(Deleted);
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }
        }
        public async Task <int> DeleteAsync(int id)
        {
            int Deleted = 0;

            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    GarmentLeftoverWarehouseExpenditureFinishedGood model = await ReadByIdAsync(id);

                    model.FlagForDelete(IdentityService.Username, UserAgent);
                    foreach (var item in model.Items)
                    {
                        item.FlagForDelete(IdentityService.Username, UserAgent);
                    }

                    Deleted = await DbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                        {
                            ReferenceType        = GarmentLeftoverWarehouseStockReferenceTypeEnum.FINISHED_GOOD,
                            UnitId               = item.UnitId,
                            UnitCode             = item.UnitCode,
                            UnitName             = item.UnitName,
                            RONo                 = item.RONo,
                            Quantity             = item.ExpenditureQuantity,
                            LeftoverComodityCode = item.LeftoverComodityCode,
                            LeftoverComodityId   = item.LeftoverComodityId,
                            LeftoverComodityName = item.LeftoverComodityName
                        };

                        await StockService.StockIn(stock, model.FinishedGoodExpenditureNo, model.Id, item.Id);
                    }


                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }

            return(Deleted);
        }
        private GarmentLeftoverWarehouseStock GenerateStock(GarmentLeftoverWarehouseExpenditureFabricItem item)
        {
            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
            {
                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.FABRIC,
                UnitId        = item.UnitId,
                UnitCode      = item.UnitCode,
                UnitName      = item.UnitName,
                PONo          = item.PONo,
                UomId         = item.UomId,
                UomUnit       = item.UomUnit,
                Quantity      = item.Quantity,
                BasicPrice    = item.BasicPrice
            };

            return(stock);
        }
        public GarmentLeftoverWarehouseStockViewModel MapToViewModel(GarmentLeftoverWarehouseStock model)
        {
            GarmentLeftoverWarehouseStockViewModel viewModel = new GarmentLeftoverWarehouseStockViewModel();

            PropertyCopier <GarmentLeftoverWarehouseStock, GarmentLeftoverWarehouseStockViewModel> .Copy(model, viewModel);

            viewModel.Unit = new UnitViewModel
            {
                Id   = model.UnitId.ToString(),
                Code = model.UnitCode,
                Name = model.UnitName
            };

            viewModel.Product = new ProductViewModel
            {
                Id   = model.ProductId.ToString(),
                Code = model.ProductCode,
                Name = model.ProductName
            };

            viewModel.Uom = new UomViewModel
            {
                Id   = model.UomId.ToString(),
                Unit = model.UomUnit
            };

            viewModel.LeftoverComodity = new LeftoverComodityViewModel
            {
                Id   = model.LeftoverComodityId.GetValueOrDefault(),
                Code = model.ProductCode,
                Name = model.ProductName
            };

            if (model.Histories != null)
            {
                viewModel.Histories = new List <GarmentLeftoverWarehouseStockHistoryViewModel>();
                foreach (var modelHistory in model.Histories)
                {
                    GarmentLeftoverWarehouseStockHistoryViewModel viewModelHistory = new GarmentLeftoverWarehouseStockHistoryViewModel();
                    PropertyCopier <GarmentLeftoverWarehouseStockHistory, GarmentLeftoverWarehouseStockHistoryViewModel> .Copy(modelHistory, viewModelHistory);
                }
            }

            return(viewModel);
        }
コード例 #11
0
        public async Task StockIn_KG_Success()
        {
            GarmentLeftoverWarehouseStockService service = new GarmentLeftoverWarehouseStockService(_dbContext(GetCurrentMethod()), GetServiceProvider().Object);

            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
            {
                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_FABRIC,
                UnitId = 1,
                UnitCode = "UnitFromCode",
                UnitName = "UnitFromName",
                Quantity = 1
            };

            var result = await service.StockIn(stock, "StockReferenceNo", 1, 1);
            await service.StockIn(stock, "StockReferenceNo", 1, 1);

            Assert.NotEqual(0, result);
        }
コード例 #12
0
        public async Task MapToViewModel()
        {
            GarmentLeftoverWarehouseStockService service = new GarmentLeftoverWarehouseStockService(_dbContext(GetCurrentMethod()), GetServiceProvider().Object);

            GarmentLeftoverWarehouseStock data = new GarmentLeftoverWarehouseStock
            {
                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.FABRIC,
                UnitId        = 1,
                UnitCode      = "UnitFromCode",
                UnitName      = "UnitFromName",
                PONo          = "POSerialNumber",
                Quantity      = 1
            };

            await service.StockIn(data, "StockReferenceNo", 1, 1);

            var result = service.MapToViewModel(data);

            Assert.NotNull(result);
        }
        private GarmentLeftoverWarehouseStock GenerateStock(GarmentLeftoverWarehouseExpenditureAccessoriesItem item)
        {
            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
            {
                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.ACCESSORIES,
                UnitId        = item.UnitId,
                UnitCode      = item.UnitCode,
                UnitName      = item.UnitName,
                PONo          = item.PONo,
                UomId         = item.UomId,
                UomUnit       = item.UomUnit,
                Quantity      = item.Quantity,
                ProductCode   = item.ProductCode,
                ProductId     = item.ProductId,
                ProductName   = item.ProductName,
                BasicPrice    = item.BasicPrice
            };

            return(stock);
        }
        public async Task <int> CreateAsync(GarmentLeftoverWarehouseExpenditureAccessories model)
        {
            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    int Created = 0;

                    model.FlagForCreate(IdentityService.Username, UserAgent);
                    model.FlagForUpdate(IdentityService.Username, UserAgent);

                    model.ExpenditureNo = GenerateNo(model);

                    foreach (var item in model.Items)
                    {
                        item.FlagForCreate(IdentityService.Username, UserAgent);
                        item.FlagForUpdate(IdentityService.Username, UserAgent);
                    }
                    DbSet.Add(model);
                    Created = await DbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        GarmentLeftoverWarehouseStock stock = GenerateStock(item);
                        await StockService.StockOut(stock, model.ExpenditureNo, model.Id, item.Id);
                    }

                    transaction.Commit();

                    return(Created);
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }
        }
        public async Task <int> UpdateAsync(int id, GarmentLeftoverWarehouseExpenditureFinishedGood model)
        {
            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    int Updated = 0;

                    GarmentLeftoverWarehouseExpenditureFinishedGood existingModel = await ReadByIdAsync(id);

                    if (existingModel.ExpenditureDate != model.ExpenditureDate)
                    {
                        existingModel.ExpenditureDate = model.ExpenditureDate;
                    }
                    if (existingModel.Consignment != model.Consignment)
                    {
                        existingModel.Consignment = model.Consignment;
                    }
                    if (existingModel.Description != model.Description)
                    {
                        existingModel.Description = model.Description;
                    }
                    existingModel.FlagForUpdate(IdentityService.Username, UserAgent);

                    foreach (var existingItem in existingModel.Items)
                    {
                        GarmentLeftoverWarehouseStock stockIn = new GarmentLeftoverWarehouseStock
                        {
                            ReferenceType        = GarmentLeftoverWarehouseStockReferenceTypeEnum.FINISHED_GOOD,
                            UnitId               = existingItem.UnitId,
                            UnitCode             = existingItem.UnitCode,
                            UnitName             = existingItem.UnitName,
                            RONo                 = existingItem.RONo,
                            Quantity             = existingItem.ExpenditureQuantity,
                            LeftoverComodityCode = existingItem.LeftoverComodityCode,
                            LeftoverComodityId   = existingItem.LeftoverComodityId,
                            LeftoverComodityName = existingItem.LeftoverComodityName
                        };

                        await StockService.StockIn(stockIn, model.FinishedGoodExpenditureNo, model.Id, existingItem.Id);
                    }

                    foreach (var existingItem in existingModel.Items)
                    {
                        var item = model.Items.FirstOrDefault(i => i.Id == existingItem.Id);
                        if (item == null)
                        {
                            existingItem.FlagForDelete(IdentityService.Username, UserAgent);
                        }
                        else
                        {
                            if (existingItem.ExpenditureQuantity != item.ExpenditureQuantity)
                            {
                                existingItem.ExpenditureQuantity = item.ExpenditureQuantity;
                            }
                            existingItem.FlagForUpdate(IdentityService.Username, UserAgent);
                        }
                    }

                    foreach (var item in model.Items.Where(i => i.Id == 0))
                    {
                        item.FlagForCreate(IdentityService.Username, UserAgent);
                        item.FlagForUpdate(IdentityService.Username, UserAgent);
                        existingModel.Items.Add(item);
                    }

                    Updated = await DbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                        {
                            ReferenceType        = GarmentLeftoverWarehouseStockReferenceTypeEnum.FINISHED_GOOD,
                            UnitId               = item.UnitId,
                            UnitCode             = item.UnitCode,
                            UnitName             = item.UnitName,
                            RONo                 = item.RONo,
                            Quantity             = item.ExpenditureQuantity,
                            LeftoverComodityCode = item.LeftoverComodityCode,
                            LeftoverComodityId   = item.LeftoverComodityId,
                            LeftoverComodityName = item.LeftoverComodityName
                        };

                        await StockService.StockOut(stock, model.FinishedGoodExpenditureNo, model.Id, item.Id);
                    }

                    transaction.Commit();

                    return(Updated);
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }
        }
        public async Task <int> UpdateAsync(int id, GarmentLeftoverWarehouseExpenditureFabric model)
        {
            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    int Updated = 0;

                    GarmentLeftoverWarehouseExpenditureFabric existingModel = await ReadByIdAsync(id);

                    if (existingModel.ExpenditureDate != model.ExpenditureDate)
                    {
                        existingModel.ExpenditureDate = model.ExpenditureDate;
                    }
                    if (existingModel.Remark != model.Remark)
                    {
                        existingModel.Remark = model.Remark;
                    }
                    if (existingModel.QtyKG != model.QtyKG)
                    {
                        existingModel.QtyKG = model.QtyKG;
                    }
                    existingModel.FlagForUpdate(IdentityService.Username, UserAgent);

                    foreach (var existingItem in existingModel.Items)
                    {
                        GarmentLeftoverWarehouseStock stockIn = GenerateStock(existingItem);
                        await StockService.StockIn(stockIn, model.ExpenditureNo, model.Id, existingItem.Id);
                    }

                    foreach (var existingItem in existingModel.Items)
                    {
                        var item = model.Items.FirstOrDefault(i => i.Id == existingItem.Id);
                        if (item == null)
                        {
                            existingItem.FlagForDelete(IdentityService.Username, UserAgent);
                        }
                        else
                        {
                            if (existingItem.Quantity != item.Quantity)
                            {
                                existingItem.Quantity = item.Quantity;
                            }
                            existingItem.FlagForUpdate(IdentityService.Username, UserAgent);
                        }
                    }

                    foreach (var item in model.Items.Where(i => i.Id == 0))
                    {
                        item.FlagForCreate(IdentityService.Username, UserAgent);
                        item.FlagForUpdate(IdentityService.Username, UserAgent);
                        existingModel.Items.Add(item);
                    }

                    Updated = await DbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        GarmentLeftoverWarehouseStock stock = GenerateStock(item);
                        await StockService.StockOut(stock, model.ExpenditureNo, model.Id, item.Id);
                    }

                    transaction.Commit();

                    return(Updated);
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }
        }
        public async Task <int> StockOut(GarmentLeftoverWarehouseStock stock, string StockReferenceNo, int StockReferenceId, int StockReferenceItemId)
        {
            try
            {
                int Affected = 0;

                var Query = DbSetStock.Where(w => w.ReferenceType == stock.ReferenceType && w.UnitId == stock.UnitId);

                switch (stock.ReferenceType)
                {
                case GarmentLeftoverWarehouseStockReferenceTypeEnum.FABRIC:
                    Query = Query.Where(w => w.PONo == stock.PONo && w.UomId == stock.UomId);
                    break;

                case GarmentLeftoverWarehouseStockReferenceTypeEnum.FINISHED_GOOD:
                    Query = Query.Where(w => w.RONo == stock.RONo && w.LeftoverComodityId == stock.LeftoverComodityId);
                    break;

                case GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_FABRIC:
                    break;

                case GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_BAHAN_PENOLONG:
                    Query = Query.Where(w => w.ProductId == stock.ProductId && w.UomId == stock.UomId);
                    break;

                case GarmentLeftoverWarehouseStockReferenceTypeEnum.COMPONENT:
                    break;

                case GarmentLeftoverWarehouseStockReferenceTypeEnum.ACCESSORIES:
                    Query = Query.Where(w => w.PONo == stock.PONo && w.UomId == stock.UomId && w.ProductId == stock.ProductId);
                    break;
                }

                var existingStock = Query.Single();
                existingStock.Quantity -= stock.Quantity;
                existingStock.FlagForUpdate(IdentityService.Username, UserAgent);

                var lastStockHistory = DbSetStockHistory.Where(w => w.StockId == existingStock.Id).OrderBy(o => o._CreatedUtc).Last();
                var beforeQuantity   = lastStockHistory.AfterQuantity;

                var stockHistory = new GarmentLeftoverWarehouseStockHistory
                {
                    StockId              = existingStock.Id,
                    StockReferenceNo     = StockReferenceNo,
                    StockReferenceId     = StockReferenceId,
                    StockReferenceItemId = StockReferenceItemId,
                    StockType            = GarmentLeftoverWarehouseStockTypeEnum.OUT,
                    BeforeQuantity       = beforeQuantity,
                    Quantity             = -stock.Quantity,
                    AfterQuantity        = beforeQuantity - stock.Quantity
                };
                stockHistory.FlagForCreate(IdentityService.Username, UserAgent);
                stockHistory.FlagForUpdate(IdentityService.Username, UserAgent);

                DbSetStockHistory.Add(stockHistory);

                Affected = await DbContext.SaveChangesAsync();

                return(Affected);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        public async Task <int> CreateAsync(GarmentLeftoverWarehouseExpenditureAval model)
        {
            int Created = 0;

            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    model.FlagForCreate(IdentityService.Username, UserAgent);
                    model.FlagForUpdate(IdentityService.Username, UserAgent);

                    model.AvalExpenditureNo = GenerateNo(model);

                    foreach (var item in model.Items)
                    {
                        if (model.AvalType == "AVAL FABRIC" || model.AvalType == "AVAL KOMPONEN")
                        {
                            var receiptAval = DbContext.GarmentLeftoverWarehouseReceiptAvals.Where(a => a.Id == item.AvalReceiptId).Single();
                            receiptAval.IsUsed = true;
                        }


                        item.FlagForCreate(IdentityService.Username, UserAgent);
                        item.FlagForUpdate(IdentityService.Username, UserAgent);
                    }
                    DbSet.Add(model);

                    Created = await DbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        if (model.AvalType == "AVAL FABRIC")
                        {
                            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_FABRIC,
                                UnitId        = item.UnitId,
                                UnitCode      = item.UnitCode,
                                UnitName      = item.UnitName,
                                Quantity      = item.Quantity
                            };
                            await StockService.StockOut(stock, model.AvalExpenditureNo, model.Id, item.Id);
                        }
                        else if (model.AvalType == "AVAL KOMPONEN")
                        {
                            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.COMPONENT,
                                UnitId        = item.UnitId,
                                UnitCode      = item.UnitCode,
                                UnitName      = item.UnitName,
                                Quantity      = item.Quantity
                            };
                            await StockService.StockOut(stock, model.AvalExpenditureNo, model.Id, item.Id);
                        }
                        else
                        {
                            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_BAHAN_PENOLONG,
                                UnitId        = item.UnitId,
                                UnitCode      = item.UnitCode,
                                UnitName      = item.UnitName,
                                Quantity      = item.Quantity,
                                ProductCode   = item.ProductCode,
                                ProductName   = item.ProductName,
                                ProductId     = item.ProductId,
                                UomId         = item.UomId,
                                UomUnit       = item.UomUnit,
                            };
                            await StockService.StockOut(stock, model.AvalExpenditureNo, model.Id, item.Id);
                        }
                    }

                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }

            return(Created);
        }
        public async Task <int> UpdateAsync(int id, GarmentLeftoverWarehouseExpenditureAval model)
        {
            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    int Updated = 0;

                    GarmentLeftoverWarehouseExpenditureAval existingModel = await ReadByIdAsync(id);

                    if (existingModel.ExpenditureDate != model.ExpenditureDate)
                    {
                        existingModel.ExpenditureDate = model.ExpenditureDate;
                    }
                    if (existingModel.Description != model.Description)
                    {
                        existingModel.Description = model.Description;
                    }

                    existingModel.FlagForUpdate(IdentityService.Username, UserAgent);

                    foreach (var existingItem in existingModel.Items)
                    {
                        if (existingModel.AvalType == "AVAL FABRIC")
                        {
                            GarmentLeftoverWarehouseStock stockIn = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_FABRIC,
                                UnitId        = existingItem.UnitId,
                                UnitCode      = existingItem.UnitCode,
                                UnitName      = existingItem.UnitName,
                                Quantity      = existingItem.Quantity
                            };
                            await StockService.StockIn(stockIn, model.AvalExpenditureNo, model.Id, existingItem.Id);
                        }
                        else if (existingModel.AvalType == "AVAL KOMPONEN")
                        {
                            GarmentLeftoverWarehouseStock stockIn = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.COMPONENT,
                                UnitId        = existingItem.UnitId,
                                UnitCode      = existingItem.UnitCode,
                                UnitName      = existingItem.UnitName,
                                Quantity      = existingItem.Quantity
                            };
                            await StockService.StockIn(stockIn, model.AvalExpenditureNo, model.Id, existingItem.Id);
                        }
                        else
                        {
                            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_BAHAN_PENOLONG,
                                UnitId        = existingItem.UnitId,
                                UnitCode      = existingItem.UnitCode,
                                UnitName      = existingItem.UnitName,
                                Quantity      = existingItem.Quantity,
                                ProductCode   = existingItem.ProductCode,
                                ProductName   = existingItem.ProductName,
                                ProductId     = existingItem.ProductId,
                                UomId         = existingItem.UomId,
                                UomUnit       = existingItem.UomUnit,
                            };
                            await StockService.StockIn(stock, model.AvalExpenditureNo, model.Id, existingItem.Id);
                        }
                    }

                    foreach (var existingItem in existingModel.Items)
                    {
                        var item = model.Items.FirstOrDefault(i => i.Id == existingItem.Id);
                        if (item == null)
                        {
                            if (model.AvalType == "AVAL FABRIC" || model.AvalType == "AVAL KOMPONEN")
                            {
                                var receiptAval = DbContext.GarmentLeftoverWarehouseReceiptAvals.Where(a => a.Id == existingItem.AvalReceiptId).Single();
                                receiptAval.IsUsed = false;
                            }

                            existingItem.FlagForDelete(IdentityService.Username, UserAgent);
                        }
                        else
                        {
                            if (existingItem.Quantity != item.Quantity)
                            {
                                existingItem.Quantity = item.Quantity;
                            }
                            if (existingItem.ActualQuantity != item.ActualQuantity)
                            {
                                existingItem.ActualQuantity = item.ActualQuantity;
                            }
                            existingItem.FlagForUpdate(IdentityService.Username, UserAgent);
                        }
                    }

                    foreach (var item in model.Items.Where(i => i.Id == 0))
                    {
                        if (model.AvalType == "AVAL FABRIC" || model.AvalType == "AVAL KOMPONEN")
                        {
                            var receiptAval = DbContext.GarmentLeftoverWarehouseReceiptAvals.Where(a => a.Id == item.AvalReceiptId).Single();
                            receiptAval.IsUsed = true;
                        }


                        item.FlagForCreate(IdentityService.Username, UserAgent);
                        item.FlagForUpdate(IdentityService.Username, UserAgent);
                        existingModel.Items.Add(item);
                    }

                    Updated = await DbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        if (model.AvalType == "AVAL FABRIC")
                        {
                            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_FABRIC,
                                UnitId        = item.UnitId,
                                UnitCode      = item.UnitCode,
                                UnitName      = item.UnitName,
                                Quantity      = item.Quantity
                            };

                            await StockService.StockOut(stock, model.AvalExpenditureNo, model.Id, item.Id);
                        }
                        else if (model.AvalType == "AVAL KOMPONEN")
                        {
                            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.COMPONENT,
                                UnitId        = item.UnitId,
                                UnitCode      = item.UnitCode,
                                UnitName      = item.UnitName,
                                Quantity      = item.Quantity
                            };

                            await StockService.StockOut(stock, model.AvalExpenditureNo, model.Id, item.Id);
                        }
                        else
                        {
                            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_BAHAN_PENOLONG,
                                UnitId        = item.UnitId,
                                UnitCode      = item.UnitCode,
                                UnitName      = item.UnitName,
                                Quantity      = item.Quantity,
                                ProductCode   = item.ProductCode,
                                ProductName   = item.ProductName,
                                ProductId     = item.ProductId,
                                UomId         = item.UomId,
                                UomUnit       = item.UomUnit,
                            };
                            await StockService.StockOut(stock, model.AvalExpenditureNo, model.Id, item.Id);
                        }
                    }

                    transaction.Commit();

                    return(Updated);
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }
        }
        public async Task <int> UpdateAsync(int id, GarmentLeftoverWarehouseReceiptAval model)
        {
            int Updated = 0;

            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    GarmentLeftoverWarehouseReceiptAval existingModel = await DbSet.Where(w => w.Id == id).FirstOrDefaultAsync();

                    if (existingModel.ReceiptDate != model.ReceiptDate)
                    {
                        existingModel.ReceiptDate = model.ReceiptDate;
                    }
                    if (existingModel.Remark != model.Remark)
                    {
                        existingModel.Remark = model.Remark;
                    }
                    if (existingModel.TotalAval != model.TotalAval)
                    {
                        existingModel.TotalAval = model.TotalAval;
                    }

                    if (model.AvalType == "AVAL FABRIC")
                    {
                        if (existingModel.TotalAval != model.TotalAval)
                        {
                            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_FABRIC,
                                UnitId        = model.UnitFromId,
                                UnitCode      = model.UnitFromCode,
                                UnitName      = model.UnitFromName,
                                Quantity      = existingModel.TotalAval
                            };
                            await StockService.StockOut(stock, existingModel.AvalReceiptNo, model.Id, 0);

                            GarmentLeftoverWarehouseStock stock1 = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_FABRIC,
                                UnitId        = model.UnitFromId,
                                UnitCode      = model.UnitFromCode,
                                UnitName      = model.UnitFromName,
                                Quantity      = model.TotalAval
                            };
                            await StockService.StockIn(stock1, model.AvalReceiptNo, model.Id, 0);

                            existingModel.TotalAval = model.TotalAval;
                        }
                    }
                    else if (model.AvalType == "AVAL KOMPONEN")
                    {
                        if (existingModel.TotalAval != model.TotalAval)
                        {
                            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.COMPONENT,
                                UnitId        = model.UnitFromId,
                                UnitCode      = model.UnitFromCode,
                                UnitName      = model.UnitFromName,
                                Quantity      = existingModel.TotalAval
                            };
                            await StockService.StockOut(stock, existingModel.AvalReceiptNo, model.Id, 0);

                            GarmentLeftoverWarehouseStock stock1 = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.COMPONENT,
                                UnitId        = model.UnitFromId,
                                UnitCode      = model.UnitFromCode,
                                UnitName      = model.UnitFromName,
                                Quantity      = model.TotalAval
                            };
                            await StockService.StockIn(stock1, model.AvalReceiptNo, model.Id, 0);

                            existingModel.TotalAval = model.TotalAval;
                        }
                    }


                    existingModel.FlagForUpdate(IdentityService.Username, UserAgent);

                    Updated = await DbContext.SaveChangesAsync();

                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }

            return(Updated);
        }
        public async Task <int> DeleteAsync(int id)
        {
            int Deleted = 0;

            using (var transaction = DbContext.Database.CurrentTransaction ?? DbContext.Database.BeginTransaction())
            {
                try
                {
                    GarmentLeftoverWarehouseReceiptAval model = await ReadByIdAsync(id);

                    model.FlagForDelete(IdentityService.Username, UserAgent);
                    List <string> avalItemIds = new List <string>();
                    foreach (var item in model.Items)
                    {
                        avalItemIds.Add(item.GarmentAvalProductItemId.ToString());
                        item.FlagForDelete(IdentityService.Username, UserAgent);
                    }
                    Deleted = await DbContext.SaveChangesAsync();

                    if (model.AvalType == "AVAL FABRIC")
                    {
                        GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                        {
                            ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_FABRIC,
                            UnitId        = model.UnitFromId,
                            UnitCode      = model.UnitFromCode,
                            UnitName      = model.UnitFromName,
                            Quantity      = model.TotalAval
                        };
                        await StockService.StockOut(stock, model.AvalReceiptNo, model.Id, 0);
                        await UpdateAvalProductIsReceived(avalItemIds, false);
                    }
                    else if (model.AvalType == "AVAL BAHAN PENOLONG")
                    {
                        foreach (var item in model.Items)
                        {
                            GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                            {
                                ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.AVAL_BAHAN_PENOLONG,
                                UnitId        = model.UnitFromId,
                                UnitCode      = model.UnitFromCode,
                                UnitName      = model.UnitFromName,
                                Quantity      = item.Quantity,
                                ProductCode   = item.ProductCode,
                                ProductName   = item.ProductName,
                                ProductId     = item.ProductId,
                                UomId         = item.UomId,
                                UomUnit       = item.UomUnit
                            };
                            await StockService.StockOut(stock, model.AvalReceiptNo, model.Id, item.Id);
                        }
                    }
                    else if (model.AvalType == "AVAL KOMPONEN")
                    {
                        GarmentLeftoverWarehouseStock stock = new GarmentLeftoverWarehouseStock
                        {
                            ReferenceType = GarmentLeftoverWarehouseStockReferenceTypeEnum.COMPONENT,
                            UnitId        = model.UnitFromId,
                            UnitCode      = model.UnitFromCode,
                            UnitName      = model.UnitFromName,
                            Quantity      = model.TotalAval
                        };

                        await StockService.StockOut(stock, model.AvalReceiptNo, model.Id, 0);

                        foreach (var item in model.Items)
                        {
                            await UpdateAvalComponentIsReceived(item.AvalComponentId.ToString(), false);
                        }
                    }

                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }

            return(Deleted);
        }