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() }); }
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))); }