public async Task <GarmentLeftoverWarehouseReceiptAval> GetTestData()
        {
            GarmentLeftoverWarehouseReceiptAval data = GetNewData();

            await Service.CreateAsync(data);

            return(data);
        }
        public async Task <GarmentLeftoverWarehouseReceiptAval> GetTestDataBP()
        {
            GarmentLeftoverWarehouseReceiptAval data = GetNewData();

            data.AvalType = "AVAL BAHAN PENOLONG";
            await Service.CreateAsync(data);

            return(data);
        }
        public async Task <GarmentLeftoverWarehouseReceiptAval> GetTestDataComponent()
        {
            GarmentLeftoverWarehouseReceiptAval data = GetNewData();

            data.AvalType = "AVAL KOMPONEN";
            await Service.CreateAsync(data);

            return(data);
        }
        public async Task <GarmentLeftoverWarehouseReceiptAval> GetTestDataACC()
        {
            GarmentLeftoverWarehouseReceiptAval data = GetNewData();

            data.AvalType = "AVAL ACCESSORIES";
            await Service.CreateAsync(data);

            return(data);
        }
        private string GenerateNo(GarmentLeftoverWarehouseReceiptAval model)
        {
            //string code = model.AvalType == "AVAL FABRIC" ? "BMAF" : "BMAC";
            string code   = getCode(model.AvalType);
            string prefix = code + model.UnitFromCode.Trim() + model._CreatedUtc.ToString("yy") + model._CreatedUtc.ToString("MM");

            var lastNo = DbSet.Where(w => w.AvalReceiptNo.StartsWith(prefix))
                         .OrderByDescending(o => o.AvalReceiptNo)
                         .Select(s => int.Parse(s.AvalReceiptNo.Replace(prefix, "")))
                         .FirstOrDefault();

            var curNo = $"{prefix}{(lastNo + 1).ToString("D4")}";

            return(curNo);
        }
        public GarmentLeftoverWarehouseReceiptAval CopyData(GarmentLeftoverWarehouseReceiptAval oldData)
        {
            GarmentLeftoverWarehouseReceiptAval newData = new GarmentLeftoverWarehouseReceiptAval();

            PropertyCopier <GarmentLeftoverWarehouseReceiptAval, GarmentLeftoverWarehouseReceiptAval> .Copy(oldData, newData);

            newData.Items = new List <GarmentLeftoverWarehouseReceiptAvalItem>();
            foreach (var oldItem in oldData.Items)
            {
                GarmentLeftoverWarehouseReceiptAvalItem newItem = new GarmentLeftoverWarehouseReceiptAvalItem();

                PropertyCopier <GarmentLeftoverWarehouseReceiptAvalItem, GarmentLeftoverWarehouseReceiptAvalItem> .Copy(oldItem, newItem);

                newData.Items.Add(newItem);
            }

            return(newData);
        }
        public GarmentLeftoverWarehouseReceiptAvalViewModel MapToViewModel(GarmentLeftoverWarehouseReceiptAval model)
        {
            GarmentLeftoverWarehouseReceiptAvalViewModel viewModel = new GarmentLeftoverWarehouseReceiptAvalViewModel();

            PropertyCopier <GarmentLeftoverWarehouseReceiptAval, GarmentLeftoverWarehouseReceiptAvalViewModel> .Copy(model, viewModel);

            viewModel.UnitFrom = new UnitViewModel
            {
                Id   = model.UnitFromId.ToString(),
                Code = model.UnitFromCode,
                Name = model.UnitFromName
            };


            if (model.Items != null)
            {
                viewModel.Items = new List <GarmentLeftoverWarehouseReceiptAvalItemViewModel>();
                foreach (var modelItem in model.Items)
                {
                    GarmentLeftoverWarehouseReceiptAvalItemViewModel viewModelItem = new GarmentLeftoverWarehouseReceiptAvalItemViewModel();
                    PropertyCopier <GarmentLeftoverWarehouseReceiptAvalItem, GarmentLeftoverWarehouseReceiptAvalItemViewModel> .Copy(modelItem, viewModelItem);

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

                    viewModelItem.Uom = new UomViewModel
                    {
                        Id   = modelItem.UomId.ToString(),
                        Unit = modelItem.UomUnit
                    };
                    viewModel.Items.Add(viewModelItem);
                }
            }

            return(viewModel);
        }
        public GarmentLeftoverWarehouseReceiptAval MapToModel(GarmentLeftoverWarehouseReceiptAvalViewModel viewModel)
        {
            GarmentLeftoverWarehouseReceiptAval model = new GarmentLeftoverWarehouseReceiptAval();

            PropertyCopier <GarmentLeftoverWarehouseReceiptAvalViewModel, GarmentLeftoverWarehouseReceiptAval> .Copy(viewModel, model);

            if (viewModel.UnitFrom != null)
            {
                model.UnitFromId   = long.Parse(viewModel.UnitFrom.Id);
                model.UnitFromCode = viewModel.UnitFrom.Code;
                model.UnitFromName = viewModel.UnitFrom.Name;
            }

            model.Items = new List <GarmentLeftoverWarehouseReceiptAvalItem>();
            foreach (var viewModelItem in viewModel.Items)
            {
                GarmentLeftoverWarehouseReceiptAvalItem modelItem = new GarmentLeftoverWarehouseReceiptAvalItem();
                PropertyCopier <GarmentLeftoverWarehouseReceiptAvalItemViewModel, GarmentLeftoverWarehouseReceiptAvalItem> .Copy(viewModelItem, modelItem);

                if (viewModelItem.Product != null)
                {
                    modelItem.ProductId   = long.Parse(viewModelItem.Product.Id);
                    modelItem.ProductCode = viewModelItem.Product.Code;
                    modelItem.ProductName = viewModelItem.Product.Name;
                }

                if (viewModelItem.Uom != null)
                {
                    modelItem.UomId   = long.Parse(viewModelItem.Uom.Id);
                    modelItem.UomUnit = viewModelItem.Uom.Unit;
                }

                model.Items.Add(modelItem);
            }

            return(model);
        }
        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);
        }
        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);
        }