diff --git a/src/bnhtrade.Core/Data/Database/Repository/Implementation/StockJournalRepository.cs b/src/bnhtrade.Core/Data/Database/Repository/Implementation/StockJournalRepository.cs index 1998cad..065ab10 100644 --- a/src/bnhtrade.Core/Data/Database/Repository/Implementation/StockJournalRepository.cs +++ b/src/bnhtrade.Core/Data/Database/Repository/Implementation/StockJournalRepository.cs @@ -21,6 +21,24 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation { } + private List ConvertStockNumbers(List stockNumbers) + { + if (stockNumbers == null || stockNumbers.Count == 0) + { + return new List(); + } + return stockNumbers.Select(sn => "STK#" + sn.ToString("D6")).ToList(); + } + + private List ConvertStockNumbers(List stockNumbers) + { + if (stockNumbers == null || stockNumbers.Count == 0) + { + return new List(); + } + return stockNumbers.Select(sn => int.Parse(sn.Substring(4))).ToList(); + } + // // Create // @@ -77,14 +95,20 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation // Read // - public Dictionary ReadStockJournal( + public Dictionary ReadStockJournal(bool lockRecords = false, List stockJournalIds = null, List stockIds = null, List stockNumbers = null , DateTime? minEntryDate = null, DateTime? maxEntryDate = null, List stockStatusIds = null) { var returnDict = new Dictionary(); var sqlWhere = new SqlWhereBuilder(); - string sql = @" + string lockClause = ""; + if (lockRecords) + { + lockClause = " WITH (UPDLOCK, HOLDLOCK)"; + } + + string sql = $@" SELECT tblStockJournal.StockJournalID, tblStockJournal.StockJournalTypeID, tblStockJournal.StockID, @@ -97,9 +121,9 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation tblStockJournalPost.StockJournalPostID, tblStockJournalPost.StockStatusID, tblStockJournalPost.Quantity, - FROM tblStockJournal - LEFT OUTER JOIN tblStock ON tblStockJournal.StockID = tblStock.StockID - LEFT OUTER JOIN tblStockJournalPost ON tblStockJournal.StockJournalID = tblStockJournalPost.StockJournalID + FROM tblStockJournal{lockClause} + LEFT OUTER JOIN tblStock{lockClause} ON tblStockJournal.StockID = tblStock.StockID + LEFT OUTER JOIN tblStockJournalPost{lockClause} ON tblStockJournal.StockJournalID = tblStockJournalPost.StockJournalID WHERE 1=1 "; // build where clause based on provided filters @@ -116,7 +140,8 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation } if (stockNumbers != null && stockNumbers.Any()) { - sql += sqlWhere.InClause("tblStock.StockNumber", stockNumbers, "AND"); + List stockNumbersInt = ConvertStockNumbers(stockNumbers); + sql += sqlWhere.InClause("tblStock.StockNumber", stockNumbersInt, "AND"); noFilter = false; } if (minEntryDate.HasValue) @@ -192,60 +217,6 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation } } - public List ReadStockJournalIdByStatus(int stockId, List stockStatusIds = null) - { - if (stockId <= 0) - { - throw new ArgumentException("Stock ID must be greater than zero.", nameof(stockId)); - } - if (stockStatusIds != null && stockStatusIds.Any() && stockStatusIds.Any(id => id <= 0)) - { - throw new ArgumentException("Stock status IDs must be greater than zero.", nameof(stockStatusIds)); - } - - var returnDict = new Dictionary(); - var sqlWhere = new SqlWhereBuilder(); - - string sql = @" - SELECT tblStockJournal.StockJournalID, - FROM tblStockJournal - LEFT OUTER JOIN - tblStockJournalPost - ON tblStockJournal.StockJournalID = tblStockJournalPost.StockJournalID - WHERE 1=1 "; - - sqlWhere.IsEqualTo("tblStockJournal.StockID", stockId, "AND"); - - if (stockStatusIds != null && stockStatusIds.Any()) - { - sqlWhere.In("StockStatusID", stockStatusIds, "AND"); - } - - sql += sqlWhere.SqlWhereString + ";"; - - var idList = new List(); - using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand) - { - cmd.Transaction = _transaction as SqlTransaction; - cmd.CommandText = sql; - - if (sqlWhere.ParameterListIsSet) - { - sqlWhere.AddParametersToSqlCommand(cmd); - } - - using (var reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - idList.Add(reader.GetInt32(0)); - } - } - } - - return idList; - } - public Dictionary ReadStockJournalType(List stockJournalTypeIdList) { var returnDict = new Dictionary(); @@ -258,10 +229,10 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation if (stockJournalTypeIdList != null && stockJournalTypeIdList.Any()) { - sqlWhere.In("StockJournalTypeID", stockJournalTypeIdList, "AND"); + sql += sqlWhere.InClause("StockJournalTypeID", stockJournalTypeIdList, "AND"); } - sql += sqlWhere.SqlWhereString + ";"; + sql += ";"; using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand) { @@ -507,9 +478,7 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation tblStockJournal.StockID=@stockId AND tblStockJournalPost.Quantity>0 "; - sqlWhere.In("tblStockJournalPost.StockStatusID", stockStatusIdList, "AND"); - - stringSql = stringSql + sqlWhere.SqlWhereString; + stringSql += sqlWhere.InClause("tblStockJournalPost.StockStatusID", stockStatusIdList, "AND") + ";"; using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand) { diff --git a/src/bnhtrade.Core/Data/Database/Repository/Interface/IStockJournalRepository.cs b/src/bnhtrade.Core/Data/Database/Repository/Interface/IStockJournalRepository.cs index 02b26e0..ede5a27 100644 --- a/src/bnhtrade.Core/Data/Database/Repository/Interface/IStockJournalRepository.cs +++ b/src/bnhtrade.Core/Data/Database/Repository/Interface/IStockJournalRepository.cs @@ -10,8 +10,9 @@ namespace bnhtrade.Core.Data.Database.Repository.Interface { int InsertStockJournalHeader(int stockId, int journalTypeId, DateTime entryDate, bool isLocked); int InsertStockJournalPost(int stockJournalId, int stockStatusId, int quantity); - Dictionary ReadStockJournal(List stockJournalIds = null, List stockIds = null, List stockNumbers = null, DateTime? minEntryDate = null, DateTime? maxEntryDate = null); - List ReadStockJournalIdByStatus(int stockId, List stockStatusIds = null); + Dictionary ReadStockJournal(bool lockRecords = false, + List stockJournalIds = null, List stockIds = null, List stockNumbers = null + , DateTime? minEntryDate = null, DateTime? maxEntryDate = null, List stockStatusIds = null); Dictionary ReadStockJournalType(List stockJournalTypeIdList); (int, DateTime) ReadJournalStockIdAndEntryDate(int stockJournalId); int ReadJournalTypeIdByStockId(int stockId); diff --git a/src/bnhtrade.Core/Logic/Inventory/StockJournalService.cs b/src/bnhtrade.Core/Logic/Inventory/StockJournalService.cs index ef45802..2b16a1e 100644 --- a/src/bnhtrade.Core/Logic/Inventory/StockJournalService.cs +++ b/src/bnhtrade.Core/Logic/Inventory/StockJournalService.cs @@ -19,52 +19,57 @@ namespace bnhtrade.Core.Logic.Inventory public Dictionary ReadStockJournal(List stockJournalIds) { - if (stockJournalIds == null || stockJournalIds.Count == 0) - { - throw new ArgumentException("Stock journal IDs cannot be null or empty.", nameof(stockJournalIds)); - } - return WithUnitOfWork(uow => { - // get the stock journal entries from the repository - var builderList = uow.StockJournalRepository.ReadStockJournal(stockJournalIds); - - // get the stock status for the journal posts - var statusIds = new List(); - foreach (var journal in builderList.Values) - { - foreach (var post in journal.StockJournalBuilderPosts) - { - if (!statusIds.Contains(post.StatusId)) - { - statusIds.Add(post.StatusId); - } - } - } - var statusDict = new StockStatusService(uow).GetStatus(statusIds); - - // get the stock journal types for the journal entries - var journalTypeIds = new List(); - foreach (var journal in builderList.Values) - { - if (!journalTypeIds.Contains(journal.StockJournalTypeId)) - { - journalTypeIds.Add(journal.StockJournalTypeId); - } - } - var journalTypeDict = ReadStockJournalType(uow, journalTypeIds); - - // build the stock journal objects and return them in a dictionary - var returnDict = new Dictionary(); - foreach (var journal in builderList.Values) - { - returnDict.Add(journal.StockJournalId, journal.Build(journalTypeDict, statusDict)); - } - - return returnDict; + return ReadStockJournal(uow, false, stockJournalIds); }); } + internal Dictionary ReadStockJournal(IUnitOfWork uow, bool lockJournalEntries, List stockJournalIds) + { + if (stockJournalIds == null || stockJournalIds.Count == 0) + { + throw new ArgumentException("Stock journal IDs cannot be null or empty.", nameof(stockJournalIds)); + } + + // get the stock journal entries from the repository + var builderList = uow.StockJournalRepository.ReadStockJournal(lockJournalEntries, stockJournalIds); + + // get the stock status for the journal posts + var statusIds = new List(); + foreach (var journal in builderList.Values) + { + foreach (var post in journal.StockJournalBuilderPosts) + { + if (!statusIds.Contains(post.StatusId)) + { + statusIds.Add(post.StatusId); + } + } + } + var statusDict = new StockStatusService(uow).GetStatus(statusIds); + + // get the stock journal types for the journal entries + var journalTypeIds = new List(); + foreach (var journal in builderList.Values) + { + if (!journalTypeIds.Contains(journal.StockJournalTypeId)) + { + journalTypeIds.Add(journal.StockJournalTypeId); + } + } + var journalTypeDict = ReadStockJournalType(uow, journalTypeIds); + + // build the stock journal objects and return them in a dictionary + var returnDict = new Dictionary(); + foreach (var journal in builderList.Values) + { + returnDict.Add(journal.StockJournalId, journal.Build(journalTypeDict, statusDict)); + } + + return returnDict; + } + public Dictionary ReadStockJournalType(List stockJournalTypeIds = null) { return WithUnitOfWork(uow => @@ -324,7 +329,7 @@ namespace bnhtrade.Core.Logic.Inventory private bool StockJournalDelete(IUnitOfWork uow, int stockJournalId) { // get journal entry - var stockJournalDict = uow.StockJournalRepository.ReadStockJournal(new List { stockJournalId }); + var stockJournalDict = uow.StockJournalRepository.ReadStockJournal(true, new List { stockJournalId }); if (stockJournalDict.Count == 0) { throw new Exception("StockJournalID=" + stockJournalId + " does not exist!"); @@ -343,10 +348,7 @@ namespace bnhtrade.Core.Logic.Inventory // get all journal entries for stockId and debit status combination where entryDate >= stockJournal.EntryDate var journalList = uow.StockJournalRepository.ReadStockJournal( - uow.StockJournalRepository.ReadStockJournalIdByStatus(stockJournal.StockId, debitStatusIds) - , new List { stockJournal.StockId } - , null - , stockJournal.EntryDate + true, null, new List { stockJournal.StockId }, null, stockJournal.EntryDate, null, debitStatusIds ); // check no credits for stockId & debit status combination have been made since delete entry @@ -386,7 +388,7 @@ namespace bnhtrade.Core.Logic.Inventory // can be used before commiting an sql insert, update or delete to the stock journal to ensure a status does not fall below 0 // (unless the status is enabled to do so) // set empty list or statusIdEffected to null to check entier stock entries for consistency - public bool WIP_StockJournalConsistencyCheck(IUnitOfWork uow, int stockId, List statusIdsEffected = null) + internal bool WIP_StockJournalConsistencyCheck(int stockId, List statusIdsEffected = null) { if (statusIdsEffected == null) {