Beispiel #1
0
        public async Task AdjustStock(StockAdjustmentType stockAdjustmentType, long warehouseId, long productId, decimal unitCost, decimal quantity, DateTime?expiredDate,
                                      string note)
        {
            if (quantity <= 0)
            {
                return;
            }

            var wareHouse = await _wareHouseService.GetWareHouseById(warehouseId);

            if (!_wareHouseService.IsActiveWareHouse(wareHouse))
            {
                throw new ServiceException(new ErrorMessage[]
                {
                    new()
                    {
                        Message = "Warehouse is not active"
                    }
                });
        public async Task <InventoryReport> GetInventoryReport(long?wareHouseId, long?supplierId)
        {
            string supplierName      = null;
            string supplierCode      = null;
            string wareHouseName     = null;
            string wareHouseCode     = null;
            string wareHouseAddress1 = null;
            string wareHouseAddress2 = null;

            if (supplierId.HasValue)
            {
                var supplier = await _supplierService.GetSupplierById(supplierId.Value);

                supplierName = supplier.SupplierName;
                supplierCode = supplier.Code;
            }

            if (wareHouseId.HasValue)
            {
                var wareHouse = await _wareHouseService.GetWareHouseById(wareHouseId.Value);

                wareHouseName     = wareHouse.Name;
                wareHouseAddress1 = wareHouse.Address.AddressLine1;
                wareHouseAddress2 = wareHouse.Address.AddressLine2;
                wareHouseCode     = wareHouse.Code;
            }

            var query = _unitOfWork.ProductRepository.GetAll()
                        .Where(p => p.Active && p.Supplier.Active)
                        .Include(p => p.Stocks)
                        .AsQueryable();

            if (supplierId.HasValue)
            {
                query = query.Where(p => p.SupplierId == supplierId.Value);
            }

            if (wareHouseId.HasValue)
            {
                query = query.Where(p => p.Stocks.Any(s => s.WareHouseId == wareHouseId.Value));
            }

            return(new InventoryReport()
            {
                SupplierName = supplierName,
                WareHouseCode = wareHouseCode,
                WareHouseName = wareHouseName,
                SupplierCode = supplierCode,
                Date = System.DateTime.Now,
                WareHouseAddressLine1 = wareHouseAddress1,
                WareHouseAddressLine2 = wareHouseAddress2,
                InventoryReportItems = await query.Select(p => new InventoryReportItem()
                {
                    Code = p.Code,
                    UnitPrice = p.UnitPrice,
                    Quantity = p.Stocks.Where(s => wareHouseId.HasValue && s.WareHouseId == wareHouseId.Value || !wareHouseId.HasValue)
                               .Sum(s => s.Quantity),
                    Description = p.Description,
                    UnitOfMeasure = p.MassUnit.ToString(),
                    Value = p.StockAdjustments
                            .Where(a => wareHouseId.HasValue && a.WareHouseId == wareHouseId.Value || !wareHouseId.HasValue)
                            .Where(a => a.Type == StockAdjustmentType.In || a.Type == StockAdjustmentType.Out)
                            .Sum(a => a.Type == StockAdjustmentType.In? a.Quantity *a.UnitCost: -(a.Quantity * a.UnitCost))
                }).ToListAsync()
            });
        }
Beispiel #3
0
        public async Task <StockTransfer> AddStockTransfer(StockTransfer stockTransfer)
        {
            Guard.Argument(stockTransfer, nameof(stockTransfer)).NotNull();

            stockTransfer.Created = stockTransfer.Updated = DateTimeOffset.UtcNow;

            await ValidateStockTransfer(stockTransfer);

            await using var transaction = await _unitOfWork.GetTransaction();

            try
            {
                var fromWareHouse = await _wareHouseService.GetWareHouseById(stockTransfer.FromWareHouseId);

                if (!_wareHouseService.IsActiveWareHouse(fromWareHouse))
                {
                    throw new ServiceException(new ErrorMessage[]
                    {
                        new ErrorMessage()
                        {
                            Message = "From warehouse is not a active one"
                        }
                    });
                }

                var toWareHouse = await _wareHouseService.GetWareHouseById(stockTransfer.ToWareHouseId);

                if (!_wareHouseService.IsActiveWareHouse(toWareHouse))
                {
                    throw new ServiceException(new ErrorMessage[]
                    {
                        new ErrorMessage()
                        {
                            Message = "To warehouse is not a active one"
                        }
                    });
                }

                if (stockTransfer.ToWareHouseId == stockTransfer.FromWareHouseId)
                {
                    throw new ServiceException(new ErrorMessage[]
                    {
                        new ErrorMessage()
                        {
                            Message = "From and To Warehouses should not be same"
                        }
                    });
                }

                _unitOfWork.StockTransferRepository.Insert(stockTransfer);
                await _unitOfWork.SaveChanges();

                foreach (var stockTransferStockTransferItem in stockTransfer.StockTransferItems)
                {
                    await _stockService.AdjustStock(StockAdjustmentType.Out, stockTransfer.FromWareHouseId, stockTransferStockTransferItem.ProductId,
                                                    stockTransferStockTransferItem.UnitCost, stockTransferStockTransferItem.Quantity,
                                                    stockTransferStockTransferItem.ExpiredDate, $"Stock Transfer - {stockTransfer.StockTransferNumber}");

                    await _stockService.AdjustStock(StockAdjustmentType.In, stockTransfer.ToWareHouseId, stockTransferStockTransferItem.ProductId,
                                                    stockTransferStockTransferItem.UnitCost, stockTransferStockTransferItem.Quantity,
                                                    stockTransferStockTransferItem.ExpiredDate, $"Stock Transfer - {stockTransfer.StockTransferNumber}");
                }

                await transaction.CommitAsync();

                return(stockTransfer);
            }
            catch
            {
                await transaction.RollbackAsync();

                throw;
            }
        }
        public async Task <IActionResult> Get(long id)
        {
            var warehouse = await _warehouseService.GetWareHouseById(id);

            return(Ok(_mapper.Map <WareHouseBindingModel>(warehouse)));
        }