コード例 #1
0
        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));
        }
コード例 #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,
                });
            }
        }
コード例 #3
0
        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
                    });
                }
            }
        }