public async Task <ActionResult> UpdateDetail(string receiptId, string id, [FromBody] GoodsReceiptNoteDetailMeta goodsReceiptNoteDeatilMeta) { var result = await _goodsReceiptNoteDetailService.Update(CurrentUser.TenantId, receiptId, id, goodsReceiptNoteDeatilMeta); if (result.Code <= 0) { return(BadRequest(result)); } return(Ok(result)); }
public async Task <ActionResultResponse <dynamic> > Insert(string tenantId, string userId, string receiptId, GoodsReceiptNoteDetailMeta goodsReceiptNoteDetailMeta) { var goodsReceiptNote = await _goodsReceiptNoteRepository.GetInfo(tenantId, receiptId); if (goodsReceiptNote == null) { return(new ActionResultResponse <dynamic>(-1, _sharedResourceService.GetString(ErrorMessage.NotExists, _resourceService.GetString("Goods receipt note")))); } // Kiểm tra lô sản phẩm. var isManagementByLot = await _productRepository.CheckIsManageByLot(tenantId, goodsReceiptNoteDetailMeta.ProductId); if (isManagementByLot && string.IsNullOrEmpty(goodsReceiptNoteDetailMeta.LotId)) { return(new ActionResultResponse <dynamic>(-2, _sharedResourceService.GetString(ValidatorMessage.PleaseEnter, _resourceService.GetString("Lot number")))); } // Kiểm tra sản phẩm có tồn tại không. var isProductExists = await _productRepository.CheckExists(goodsReceiptNoteDetailMeta.ProductId, tenantId); if (!isProductExists) { return(new ActionResultResponse <dynamic>(-3, _resourceService.GetString("Product does not exists. Please try again."))); } // Kiểm tra đơn vị tính có tồn tại không. var isUnitExists = await _productUnitRepository.CheckExists(tenantId, goodsReceiptNoteDetailMeta.ProductId, goodsReceiptNoteDetailMeta.UnitId); if (!isUnitExists) { return(new ActionResultResponse <dynamic>(-4, _resourceService.GetString("Invalid unit. Please check again."))); } var defaultUnit = await _productUnitRepository.GetDefaultUnit(goodsReceiptNote.TenantId, goodsReceiptNoteDetailMeta.ProductId); if (defaultUnit == null) { return(new ActionResultResponse <dynamic>(-5, _sharedResourceService.GetString(ErrorMessage.NotExists, _resourceService.GetString("product unit")))); } decimal conversionValue = 1; if (defaultUnit.UnitId != goodsReceiptNoteDetailMeta.UnitId) { // Lấy về đơn vị chuyển đổi. var productConversionUnit = await _productConversionUnitRepository.GetConversion(goodsReceiptNote.TenantId, goodsReceiptNoteDetailMeta.ProductId, goodsReceiptNoteDetailMeta.UnitId, defaultUnit.UnitId); if (productConversionUnit == null) { return(new ActionResultResponse <dynamic>(-6, _sharedResourceService.GetString(ErrorMessage.NotExists, _resourceService.GetString("Product conversion unit")))); } conversionValue = productConversionUnit.Value; } var goodsReceiptNoteDetail = new GoodsReceiptNoteDetail { Code = await GetCode(tenantId, goodsReceiptNote.Id, goodsReceiptNoteDetailMeta.ProductId, goodsReceiptNoteDetailMeta.LotId), ChargeableWeight = goodsReceiptNoteDetailMeta.ChargeableWeight, BrandId = goodsReceiptNoteDetailMeta.BrandId, ExpiryDate = goodsReceiptNoteDetailMeta.ExpiryDate, GoodsReceiptNoteId = receiptId, Height = goodsReceiptNoteDetailMeta.Height, InvoiceQuantity = goodsReceiptNoteDetailMeta.InvoiceQuantity ?? goodsReceiptNoteDetailMeta.Quantity, Quantity = goodsReceiptNoteDetailMeta.Quantity, Length = goodsReceiptNoteDetailMeta.Length, LotId = await GetLotId(tenantId, goodsReceiptNoteDetailMeta.LotId), ManufactureDate = goodsReceiptNoteDetailMeta.ManufacturingDate, Price = goodsReceiptNoteDetailMeta.Price, ProductId = goodsReceiptNoteDetailMeta.ProductId, SKU = goodsReceiptNoteDetailMeta.SKU, UPC = goodsReceiptNoteDetailMeta.UPC, VAT = goodsReceiptNoteDetailMeta.VAT, UnitId = goodsReceiptNoteDetailMeta.UnitId, VolumnWidth = goodsReceiptNoteDetailMeta.VolumnWidth, WarehouseId = goodsReceiptNote.WarehouseId, Weight = goodsReceiptNoteDetailMeta.Weight, Width = goodsReceiptNoteDetailMeta.Width, TotalBeforeTaxes = goodsReceiptNoteDetailMeta.Quantity * goodsReceiptNoteDetailMeta.Price, TenantId = tenantId, ConversionUnitGroupId = await _productConversionUnitRepository.GetCurrentConversionUnitGroupId(tenantId, goodsReceiptNoteDetailMeta.ProductId, goodsReceiptNote.EntryDate), ConversionValue = conversionValue }; if (goodsReceiptNoteDetailMeta.Tax.HasValue) { goodsReceiptNoteDetail.Tax = goodsReceiptNoteDetailMeta.Tax; goodsReceiptNoteDetail.Taxes = goodsReceiptNoteDetail.Tax.Value * goodsReceiptNoteDetail.TotalBeforeTaxes / 100; goodsReceiptNoteDetail.TotalAmounts = goodsReceiptNoteDetail.TotalBeforeTaxes + (goodsReceiptNoteDetail.Taxes ?? 0); } else { goodsReceiptNoteDetail.TotalAmounts = goodsReceiptNoteDetail.TotalBeforeTaxes; } var result = await _goodsReceiptNoteDetailRepository.Insert(goodsReceiptNoteDetail); if (result <= 0) { return(new ActionResultResponse <dynamic>(-5, _sharedResourceService.GetString(ErrorMessage.SomethingWentWrong))); } // Cập nhật lại giá trị đơn nhập await UpdateGoodsReceiptNoteTotalAmount(goodsReceiptNoteDetail.GoodsReceiptNoteId); // Cập nhật lại tổng số item trong phiếu nhập. await UpdateGoodsReceiptNoteTotalItem(goodsReceiptNoteDetail.GoodsReceiptNoteId); // Cập nhật báo cáo tồn kho. await UpdateInventoryReport(); return(new ActionResultResponse <dynamic>(result, _resourceService.GetString("Add product successful."), "", new { goodsReceiptNoteDetail.Id, goodsReceiptNoteDetail.ConcurrencyStamp })); async Task UpdateInventoryReport() { await _mediator.Publish(new CreateReceiptNoteDetailCommand { TenantId = goodsReceiptNoteDetail.TenantId, ReceiptId = receiptId, Date = goodsReceiptNote.EntryDate, IsReceived = true, ProductId = goodsReceiptNoteDetail.ProductId, WarehouseId = goodsReceiptNoteDetail.WarehouseId, Note = goodsReceiptNoteDetail.Note, ReceiptDetailId = goodsReceiptNoteDetail.Id, LotId = goodsReceiptNoteDetail.LotId, GoodsReceiptNoteDetailCode = goodsReceiptNoteDetail.Code, ProductUnitId = defaultUnit.Id, ReceiptNo = goodsReceiptNote.ReceiptNo, }); } }
public async Task <ActionResultResponse <string> > Update(string tenantId, string receiptId, string id, GoodsReceiptNoteDetailMeta goodsReceiptNoteDetailMeta) { var goodsReceiptNote = await _goodsReceiptNoteRepository.GetInfo(tenantId, receiptId, true); if (goodsReceiptNote == null) { return(new ActionResultResponse <string>(-1, _resourceService.GetString("Goods receipt note does not exists. Please check again."))); } var goodsReceiptNoteDetail = await _goodsReceiptNoteDetailRepository.GetInfo(receiptId, id); if (goodsReceiptNoteDetail == null) { return(new ActionResultResponse <string>(-2, _resourceService.GetString("Product does not exists."))); } if (goodsReceiptNoteDetail.ConcurrencyStamp != goodsReceiptNoteDetailMeta.ConcurrencyStamp) { return(new ActionResultResponse <string>(-3, _sharedResourceService.GetString(ErrorMessage.AlreadyUpdatedByAnother))); } var oldProductId = goodsReceiptNoteDetail.ProductId; var oldLotId = goodsReceiptNoteDetail.LotId; var oldUnitId = goodsReceiptNoteDetail.UnitId; var oldQuantity = goodsReceiptNoteDetail.Quantity; var oldPrice = goodsReceiptNoteDetail.Price; var oldTax = goodsReceiptNoteDetail.Tax; decimal conversionValue = 1; var defaultUnit = await _productUnitRepository.GetDefaultUnit(goodsReceiptNote.TenantId, goodsReceiptNoteDetail.ProductId); if (defaultUnit == null) { return(new ActionResultResponse <string>(-8, _resourceService.GetString("Default product unit does not exits. please contact with administrator."))); } if (oldProductId != goodsReceiptNoteDetailMeta.ProductId) { // Lấy kiểm tra sản phẩm thay đôi có tồn tại không. var isProductExists = await _productRepository.CheckExists(goodsReceiptNoteDetailMeta.ProductId, goodsReceiptNote.TenantId); if (!isProductExists) { return(new ActionResultResponse <string>(-4, _sharedResourceService.GetString(ErrorMessage.NotExists, _resourceService.GetString("Product")))); } // Kiểm tra đơn vị gán cho sản phẩm có tồn tại không. var isProductUnitExists = await _productUnitRepository.CheckExists(goodsReceiptNote.TenantId, goodsReceiptNoteDetailMeta.ProductId, goodsReceiptNoteDetailMeta.UnitId); if (!isProductUnitExists) { return(new ActionResultResponse <string>(-5, _sharedResourceService.GetString(ValidatorMessage.InValid, _resourceService.GetString("Product unit")))); } // Check unit exists. var isUnitExists = await _productUnitRepository.CheckExists(tenantId, goodsReceiptNoteDetailMeta.ProductId, goodsReceiptNoteDetailMeta.UnitId); if (!isUnitExists) { return(new ActionResultResponse <string>(-7, _resourceService.GetString("Invalid unit. Please check again."))); } var productConversionUnit = await _productConversionUnitRepository.GetConversion(goodsReceiptNote.TenantId, goodsReceiptNoteDetail.ProductId, goodsReceiptNoteDetailMeta.UnitId, defaultUnit.UnitId); if (productConversionUnit.HasValue && goodsReceiptNoteDetailMeta.UnitId != defaultUnit.UnitId) { conversionValue = productConversionUnit.Value; } goodsReceiptNoteDetail.ProductId = goodsReceiptNoteDetailMeta.ProductId; goodsReceiptNoteDetail.ConversionValue = conversionValue; //goodsReceiptNoteDetail.Code = await GetCode(tenantId, goodsReceiptNote.Id, goodsReceiptNoteDetailMeta.ProductId, // goodsReceiptNoteDetailMeta.LotId); } if (oldLotId != goodsReceiptNoteDetailMeta.LotId) { goodsReceiptNoteDetail.LotId = await GetLotId(tenantId, goodsReceiptNoteDetailMeta.LotId); } if (oldUnitId != goodsReceiptNoteDetailMeta.UnitId) { // Check unit exists. var isUnitExists = await _productUnitRepository.CheckExists(tenantId, goodsReceiptNoteDetailMeta.ProductId, goodsReceiptNoteDetailMeta.UnitId); if (!isUnitExists) { return(new ActionResultResponse <string>(-9, _resourceService.GetString("Invalid unit. Please check again."))); } var productConversionUnit = await _productConversionUnitRepository.GetConversion(goodsReceiptNote.TenantId, goodsReceiptNoteDetail.ProductId, goodsReceiptNoteDetailMeta.UnitId, defaultUnit.UnitId); if (productConversionUnit.HasValue && goodsReceiptNoteDetailMeta.UnitId != defaultUnit.UnitId) { conversionValue = productConversionUnit.Value; } goodsReceiptNoteDetail.UnitId = goodsReceiptNoteDetailMeta.UnitId; goodsReceiptNoteDetail.ConversionValue = conversionValue; } if (oldQuantity != goodsReceiptNoteDetailMeta.Quantity) { var productConversionUnit = await _productConversionUnitRepository.GetConversion(goodsReceiptNote.TenantId, goodsReceiptNoteDetail.ProductId, goodsReceiptNoteDetailMeta.UnitId, defaultUnit.UnitId); if (productConversionUnit.HasValue && goodsReceiptNoteDetailMeta.UnitId != defaultUnit.UnitId) { conversionValue = productConversionUnit.Value; } goodsReceiptNoteDetail.ConversionValue = conversionValue; goodsReceiptNoteDetail.Quantity = goodsReceiptNoteDetailMeta.Quantity; CalculateAmounts(); } if (oldTax != goodsReceiptNoteDetailMeta.Tax) { goodsReceiptNoteDetail.Tax = goodsReceiptNoteDetailMeta.Tax; CalculateAmounts(); } if (oldPrice != goodsReceiptNoteDetailMeta.Price) { goodsReceiptNoteDetail.Price = goodsReceiptNoteDetailMeta.Price; CalculateAmounts(); //await UpdateGoodsReceiptNoteTotalAmount(goodsReceiptNoteDetail.GoodsReceiptNoteId); } goodsReceiptNoteDetail.ExpiryDate = goodsReceiptNoteDetailMeta.ExpiryDate; goodsReceiptNoteDetail.InvoiceQuantity = goodsReceiptNoteDetailMeta.InvoiceQuantity; goodsReceiptNoteDetail.ConcurrencyStamp = Guid.NewGuid().ToString(); var result = await _goodsReceiptNoteDetailRepository.Update(goodsReceiptNoteDetail); if (result <= 0) { return(new ActionResultResponse <string>(-4, _sharedResourceService.GetString(ErrorMessage.SomethingWentWrong))); } // Cập nhật lại giá trị của phiếu nhập. await UpdateGoodsReceiptNoteTotalAmount(goodsReceiptNoteDetail.GoodsReceiptNoteId); // Đồng bộ lại giá trị tồn kho. await UpdateInventoryReport(); return(new ActionResultResponse <string>(result, "Update goods receipt note detail successful.", "", goodsReceiptNoteDetail.ConcurrencyStamp)); void CalculateAmounts() { goodsReceiptNoteDetail.TotalBeforeTaxes = goodsReceiptNoteDetail.Quantity * goodsReceiptNoteDetail.Price; goodsReceiptNoteDetail.Taxes = goodsReceiptNoteDetail.Tax.HasValue ? (goodsReceiptNoteDetail.Tax.Value * goodsReceiptNoteDetail.TotalBeforeTaxes) / 100 : 0; goodsReceiptNoteDetail.TotalAmounts = goodsReceiptNoteDetail.TotalBeforeTaxes + goodsReceiptNoteDetail.Taxes ?? 0; } async Task UpdateInventoryReport() { if (oldPrice != goodsReceiptNoteDetail.Price || oldQuantity != goodsReceiptNoteDetail.Quantity || oldProductId != goodsReceiptNoteDetail.ProductId || oldUnitId != goodsReceiptNoteDetail.UnitId || oldLotId != goodsReceiptNoteDetail.LotId) { await _mediator.Publish(new UpdateReceiptNoteDetailCommand { TenantId = goodsReceiptNoteDetail.TenantId, ReceiptId = receiptId, //OldPrice = oldPrice, //Price = decimal.Round(goodsReceiptNoteDetailMeta.Price, 2), //Quantity = goodsReceiptNoteDetail.Quantity, ReceiptDate = goodsReceiptNote.EntryDate, IsReceived = true, ProductId = goodsReceiptNoteDetail.ProductId, WarehouseId = goodsReceiptNoteDetail.WarehouseId, Note = goodsReceiptNoteDetail.Note, ReceiptDetailId = goodsReceiptNoteDetail.Id, LotId = oldLotId, ReceiptDetailCode = goodsReceiptNoteDetail.Code, NewLotId = goodsReceiptNoteDetail.LotId, ProductUnitId = defaultUnit.Id, ReceiptNo = goodsReceiptNote.ReceiptNo }); } } }