public async Task Handle(DeletedReceiptNoteDetailCommand notification, CancellationToken cancellationToken) { // Xóa chi tiết báo cáo tồn. await _inventoryReportService.DeleteInventoryReportDetail(notification.TenantId, notification.WarehouseId, notification.ProductId, notification.Code, notification.LotId, notification.Date, notification.ReceiptId, notification.IsReceived); if (notification.IsReceived) { // Lấy về thông tin phiếu nhập theo code. var goodsReceiptNoteDetails = await _goodsReceiptNoteDetailRepository.GetByCode(notification.TenantId, notification.WarehouseId, notification.Code); if (goodsReceiptNoteDetails != null && goodsReceiptNoteDetails.Any()) { // Nhóm sản phẩm theo lô. var groupByLots = goodsReceiptNoteDetails.GroupBy(x => x.LotId); foreach (var groupByLot in groupByLots) { var totalAmount = groupByLot.Sum(x => x.Price * x.Quantity * x.ConversionValue); var totalConversionQuantity = groupByLot.Sum(x => x.Quantity * x.ConversionValue); var price = decimal.Round(totalAmount / totalConversionQuantity, 2); var goodsReceiptNoteDetail = groupByLot.FirstOrDefault(); if (goodsReceiptNoteDetail == null) { continue; } // Lấy về đơn vị mặc định var defaultUnit = await _productUnitRepository.GetDefaultUnit(goodsReceiptNoteDetail.TenantId, goodsReceiptNoteDetail.ProductId); if (defaultUnit == null) { continue; } await _inventoryReportService.InsertInventoryReportDetail(new InventoryReportDetail { ProductId = goodsReceiptNoteDetail.ProductId, LotId = goodsReceiptNoteDetail.LotId, TenantId = goodsReceiptNoteDetail.TenantId, Date = notification.Date, GoodsReceiptNoteDetailCode = goodsReceiptNoteDetail.Code, Quantity = totalConversionQuantity, Price = price, IsReceived = notification.IsReceived, WarehouseId = notification.WarehouseId, ReceiptId = notification.ReceiptId, ReceiptNo = notification.ReceiptNo, ProductUnitId = defaultUnit.Id }); } } } else { // Lấy về thông tin phiếu nhập theo code. var goodsDeliveryNoteDetails = await _goodsDeliveryNoteDetailsRepository.GetsByProductId(notification.TenantId, notification.WarehouseId, notification.ReceiptId, notification.ProductId, notification.LotId); if (goodsDeliveryNoteDetails != null && goodsDeliveryNoteDetails.Any()) { // Nhóm sản phẩm theo lô. var groupByLots = goodsDeliveryNoteDetails.GroupBy(x => x.LotId); foreach (var groupByLot in groupByLots) { var totalAmount = groupByLot.Sum(x => x.Price * x.ConversionValue * x.Quantity); var totalConversionQuantity = groupByLot.Sum(x => x.Quantity * x.ConversionValue); var price = decimal.Round(totalAmount / totalConversionQuantity, 2); // Nhóm sản phẩm theo mã phiếu nhập. var groupByGoodsReceiptNoteDetailCode = groupByLot.GroupBy(x => x.GoodsReceiptNoteCode).ToList(); if (groupByGoodsReceiptNoteDetailCode.Any()) { foreach (var groupGoodsDeliveryNoteDetails in groupByGoodsReceiptNoteDetailCode) { var goodsDeliveryNoteDetail = groupGoodsDeliveryNoteDetails.FirstOrDefault(); if (goodsDeliveryNoteDetail == null) { continue; } // Lấy về đơn vị mặc định var defaultUnit = await _productUnitRepository.GetDefaultUnit(goodsDeliveryNoteDetail.TenantId, goodsDeliveryNoteDetail.ProductId); if (defaultUnit == null) { continue; } await _inventoryReportService.InsertInventoryReportDetail(new InventoryReportDetail { ProductId = goodsDeliveryNoteDetail.ProductId, LotId = goodsDeliveryNoteDetail.LotId, TenantId = goodsDeliveryNoteDetail.TenantId, Date = notification.Date, GoodsReceiptNoteDetailCode = goodsDeliveryNoteDetail.GoodsReceiptNoteCode, Quantity = groupGoodsDeliveryNoteDetails.Sum(x => x.Quantity *x.ConversionValue), Price = price, IsReceived = notification.IsReceived, WarehouseId = notification.WarehouseId, ReceiptId = notification.ReceiptId, ReceiptNo = notification.ReceiptNo, ProductUnitId = defaultUnit.Id }); } } } } } }
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, }); } }