Ejemplo n.º 1
0
        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
                                });
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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,
                });
            }
        }