mirror of
https://github.com/stokebob/bnhtrade.git
synced 2026-03-21 15:27:15 +00:00
wip
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
using bnhtrade.Core.Data.Database._BoilerPlate;
|
using bnhtrade.Core.Data.Database._BoilerPlate;
|
||||||
using bnhtrade.Core.Data.Database.Repository.Interface;
|
using bnhtrade.Core.Data.Database.Repository.Interface;
|
||||||
using bnhtrade.Core.Model.Account;
|
using bnhtrade.Core.Model.Account;
|
||||||
|
using bnhtrade.Core.Model.Stock;
|
||||||
using Microsoft.Data.SqlClient;
|
using Microsoft.Data.SqlClient;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -76,6 +77,139 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation
|
|||||||
// Read
|
// Read
|
||||||
//
|
//
|
||||||
|
|
||||||
|
public Dictionary<int, Model.Stock.StockJournalBuilder> ReadStockJournal(List<int> stockJournalIdList)
|
||||||
|
{
|
||||||
|
if (stockJournalIdList == null || !stockJournalIdList.Any())
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Stock journal ID list cannot be null or empty.", nameof(stockJournalIdList));
|
||||||
|
}
|
||||||
|
|
||||||
|
var returnDict = new Dictionary<int, Model.Stock.StockJournalBuilder>();
|
||||||
|
var sqlWhere = new SqlWhereBuilder();
|
||||||
|
|
||||||
|
string sql = @"
|
||||||
|
SELECT tblStockJournal.StockJournalID,
|
||||||
|
tblStockJournal.StockJournalTypeID,
|
||||||
|
tblStockJournal.StockID,
|
||||||
|
tblStock.StockNumber
|
||||||
|
tblStockJournal.EntryDate,
|
||||||
|
tblStockJournal.PostDate,
|
||||||
|
tblStockJournal.LastModified,
|
||||||
|
tblStockJournal.IsLocked,
|
||||||
|
tblStockJournal.AccountIsProcessed,
|
||||||
|
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
|
||||||
|
WHERE 1=1 ";
|
||||||
|
|
||||||
|
if (stockJournalIdList != null && stockJournalIdList.Any())
|
||||||
|
{
|
||||||
|
sqlWhere.In("tblStockJournal.StockJournalID", stockJournalIdList, "AND");
|
||||||
|
}
|
||||||
|
|
||||||
|
sql += sqlWhere.SqlWhereString + " ORDER BY tblStockJournal.EntryDate, tblStockJournal.StockJournalID, tblStockJournalPost.StockJournalPostID;";
|
||||||
|
|
||||||
|
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())
|
||||||
|
{
|
||||||
|
int stockJournalId = reader.GetInt32(0);
|
||||||
|
|
||||||
|
// add header information, if not already in dictionary
|
||||||
|
if (returnDict.ContainsKey(stockJournalId) == false)
|
||||||
|
{
|
||||||
|
// create new StockJournalBuilder
|
||||||
|
var stockJournalBuilder = new Model.Stock.StockJournalBuilder
|
||||||
|
{
|
||||||
|
StockJournalId = stockJournalId,
|
||||||
|
StockJournalTypeId = reader.GetInt32(1),
|
||||||
|
StockId = reader.GetInt32(2),
|
||||||
|
StockNumber = "STK#" + reader.GetInt32(3).ToString("D6"),
|
||||||
|
EntryDate = DateTime.SpecifyKind(reader.GetDateTime(4), DateTimeKind.Utc),
|
||||||
|
PostDate = DateTime.SpecifyKind(reader.GetDateTime(5), DateTimeKind.Utc),
|
||||||
|
LastModified = DateTime.SpecifyKind(reader.GetDateTime(6), DateTimeKind.Utc),
|
||||||
|
IsLocked = reader.GetBoolean(7),
|
||||||
|
AccountIsProcessed = reader.GetBoolean(8),
|
||||||
|
StockJournalBuilderPosts = new List<Model.Stock.StockJournalBuilder.StockJournalBuilderPost>()
|
||||||
|
};
|
||||||
|
returnDict.Add(stockJournalId, stockJournalBuilder);
|
||||||
|
}
|
||||||
|
|
||||||
|
var stockJournalBuilderPost = new Model.Stock.StockJournalBuilder.StockJournalBuilderPost
|
||||||
|
{
|
||||||
|
StockJournalPostId = reader.GetInt32(9),
|
||||||
|
StatusId = reader.GetInt32(10),
|
||||||
|
Quantity = reader.GetInt32(11)
|
||||||
|
};
|
||||||
|
|
||||||
|
returnDict[stockJournalId].StockJournalBuilderPosts.Add(stockJournalBuilderPost);
|
||||||
|
}
|
||||||
|
return returnDict;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dictionary<int, (int id, string title, int? stockStatusIdDebit, int? stockStatusIdCredit)> ReadStockJournalType(List<int> stockJournalTypeIdList)
|
||||||
|
{
|
||||||
|
var returnDict = new Dictionary<int, (int id, string title, int? stockStatusIdDebit, int? stockStatusIdCredit)>();
|
||||||
|
var sqlWhere = new SqlWhereBuilder();
|
||||||
|
|
||||||
|
string sql = @"
|
||||||
|
SELECT StockJournalTypeID, TypeTitle, StockStatusID_Debit, StockStatusID_Credit
|
||||||
|
FROM tblStockJournalType
|
||||||
|
WHERE 1=1 ";
|
||||||
|
|
||||||
|
if (stockJournalTypeIdList != null && stockJournalTypeIdList.Any())
|
||||||
|
{
|
||||||
|
sqlWhere.In("StockJournalTypeID", stockJournalTypeIdList, "AND");
|
||||||
|
}
|
||||||
|
|
||||||
|
sql += sqlWhere.SqlWhereString + ";";
|
||||||
|
|
||||||
|
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())
|
||||||
|
{
|
||||||
|
int stockJournalTypeId = reader.GetInt32(0);
|
||||||
|
returnDict.Add(stockJournalTypeId, (
|
||||||
|
id: stockJournalTypeId,
|
||||||
|
title: reader.GetString(1),
|
||||||
|
stockStatusIdDebit: reader.IsDBNull(2) ? (int?)null : reader.GetInt32(2),
|
||||||
|
stockStatusIdCredit: reader.IsDBNull(3) ? (int?)null : reader.GetInt32(3)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return returnDict;
|
||||||
|
}
|
||||||
|
|
||||||
public (int, DateTime) ReadJournalStockIdAndEntryDate(int stockJournalId)
|
public (int, DateTime) ReadJournalStockIdAndEntryDate(int stockJournalId)
|
||||||
{
|
{
|
||||||
using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand)
|
using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using bnhtrade.Core.Data.Database._BoilerPlate;
|
using Amazon.Runtime.Internal.Transform;
|
||||||
|
using bnhtrade.Core.Data.Database._BoilerPlate;
|
||||||
using bnhtrade.Core.Data.Database.Repository.Interface;
|
using bnhtrade.Core.Data.Database.Repository.Interface;
|
||||||
using Microsoft.Data.SqlClient;
|
using Microsoft.Data.SqlClient;
|
||||||
using System;
|
using System;
|
||||||
@@ -16,10 +17,10 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public Dictionary<int, Model.Stock.Status> ReadStatus(List<int> statusIds = null, List<int> statusTypeIds = null)
|
public Dictionary<int, Model.Stock.StatusBuilder> ReadStatus(List<int> statusIds = null, List<int> statusTypeIds = null)
|
||||||
{
|
{
|
||||||
var sqlBuilder = new SqlWhereBuilder();
|
var sqlBuilder = new SqlWhereBuilder();
|
||||||
var returnList = new Dictionary<int, Model.Stock.Status>();
|
var returnList = new Dictionary<int, Model.Stock.StatusBuilder>();
|
||||||
|
|
||||||
//build sql query
|
//build sql query
|
||||||
string sql = @"
|
string sql = @"
|
||||||
@@ -63,75 +64,64 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation
|
|||||||
|
|
||||||
using (SqlDataReader reader = cmd.ExecuteReader())
|
using (SqlDataReader reader = cmd.ExecuteReader())
|
||||||
{
|
{
|
||||||
var typeDict = new StockStatusRepository(_connection, _transaction).ReadStatusType();
|
|
||||||
|
|
||||||
while (reader.Read())
|
while (reader.Read())
|
||||||
{
|
{
|
||||||
int statusId = reader.GetInt32(0);
|
var statusBuilder = new Model.Stock.StatusBuilder
|
||||||
int? statusCode = null;
|
{
|
||||||
if (!reader.IsDBNull(1)) { statusCode = reader.GetInt32(1); }
|
StatusId = reader.GetInt32(0),
|
||||||
string stockStatus = reader.GetString(2);
|
StatusCode = reader.IsDBNull(1) ? (int?)null : reader.GetInt32(1),
|
||||||
int typeId = reader.GetInt32(3);
|
StatusTitle = reader.GetString(2),
|
||||||
string reference = null;
|
StatusTypeId = reader.GetInt32(3),
|
||||||
if (!reader.IsDBNull(4)) { reference = reader.GetString(4); }
|
Reference = reader.IsDBNull(4) ? null : reader.GetString(4),
|
||||||
int? foreignKeyId = null;
|
ForeignKeyID = reader.IsDBNull(5) ? (int?)null : reader.GetInt32(5),
|
||||||
if (!reader.IsDBNull(5)) { foreignKeyId = reader.GetInt32(5); }
|
IsCreditOnly = reader.GetBoolean(6),
|
||||||
bool isCreditOnly = reader.GetBoolean(6);
|
IsClosed = reader.GetBoolean(7),
|
||||||
bool isClosed = reader.GetBoolean(7);
|
RecordCreated = DateTime.SpecifyKind(reader.GetDateTime(8), DateTimeKind.Utc)
|
||||||
DateTime recordCreated = DateTime.SpecifyKind(reader.GetDateTime(8), DateTimeKind.Utc);
|
};
|
||||||
|
|
||||||
var newItem = new Model.Stock.Status(statusId
|
returnList.Add(statusBuilder.StatusId, statusBuilder);
|
||||||
, statusCode
|
|
||||||
, stockStatus
|
|
||||||
, typeDict[typeId]
|
|
||||||
, reference
|
|
||||||
, foreignKeyId
|
|
||||||
, isCreditOnly
|
|
||||||
, isClosed
|
|
||||||
, recordCreated
|
|
||||||
);
|
|
||||||
|
|
||||||
returnList.Add(statusId, newItem);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return returnList;
|
return returnList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Dictionary<int, Model.Stock.StatusType> ReadStatusType()
|
public Dictionary<int, Model.Stock.StatusTypeBuilder> ReadStatusType(List<int> stockStatusTypeIds = null)
|
||||||
{
|
{
|
||||||
var returnDict = new Dictionary<int, Model.Stock.StatusType>();
|
var returnDict = new Dictionary<int, Model.Stock.StatusTypeBuilder>();
|
||||||
|
var sqlWhere = new SqlWhereBuilder();
|
||||||
|
|
||||||
// get all account info before we start
|
string sql = @"
|
||||||
var accountDict = new AccountCodeRepository(_connection, _transaction).ReadAccountCode();
|
SELECT [StockStatusTypeID]
|
||||||
|
,[StatusTypeName]
|
||||||
|
,[ForeignKeyType]
|
||||||
|
,[ReferenceType]
|
||||||
|
,[AccountChartOfID]
|
||||||
|
FROM [e2A].[dbo].[tblStockStatusType]
|
||||||
|
WHERE 1=1 ";
|
||||||
|
|
||||||
using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand)
|
using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand)
|
||||||
{
|
{
|
||||||
cmd.CommandText = @"
|
cmd.CommandText = sql;
|
||||||
SELECT [StockStatusTypeID]
|
|
||||||
,[StatusTypeName]
|
|
||||||
,[ForeignKeyType]
|
|
||||||
,[ReferenceType]
|
|
||||||
,[AccountChartOfID]
|
|
||||||
FROM [e2A].[dbo].[tblStockStatusType]";
|
|
||||||
cmd.Transaction = _transaction as SqlTransaction;
|
cmd.Transaction = _transaction as SqlTransaction;
|
||||||
|
if (sqlWhere.ParameterListIsSet)
|
||||||
|
{
|
||||||
|
sqlWhere.AddParametersToSqlCommand(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
using (SqlDataReader reader = cmd.ExecuteReader())
|
using (SqlDataReader reader = cmd.ExecuteReader())
|
||||||
{
|
{
|
||||||
var accountIdDict = new Dictionary<int, int>();
|
|
||||||
|
|
||||||
while (reader.Read())
|
while (reader.Read())
|
||||||
{
|
{
|
||||||
int statusTypeId = reader.GetInt32(0);
|
var statusTypeBuilder = new Model.Stock.StatusTypeBuilder
|
||||||
string name = reader.GetString(1);
|
{
|
||||||
string foreignKey = null;
|
StockStatusTypeID = reader.GetInt32(0),
|
||||||
if (!reader.IsDBNull(2)) { foreignKey = reader.GetString(2); }
|
StatusTypeName = reader.GetString(1),
|
||||||
string reference = null;
|
ForeignKeyType = reader.IsDBNull(2) ? null : reader.GetString(2),
|
||||||
if (!reader.IsDBNull(3)) { reference = reader.GetString(3); }
|
ReferenceType = reader.IsDBNull(3) ? null : reader.GetString(3),
|
||||||
uint accountId = (uint)reader.GetInt32(4);
|
AccountId = reader.GetInt32(4)
|
||||||
|
};
|
||||||
var statusType = new Model.Stock.StatusType(statusTypeId, name, foreignKey, reference, accountDict[(int)accountId]);
|
returnDict.Add(statusTypeBuilder.StockStatusTypeID, statusTypeBuilder);
|
||||||
returnDict.Add(statusTypeId, statusType);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ namespace bnhtrade.Core.Data.Database.Repository.Interface
|
|||||||
{
|
{
|
||||||
int InsertStockJournalHeader(int stockId, int journalTypeId, DateTime entryDate, bool isLocked);
|
int InsertStockJournalHeader(int stockId, int journalTypeId, DateTime entryDate, bool isLocked);
|
||||||
int InsertStockJournalPost(int stockJournalId, int stockStatusId, int quantity);
|
int InsertStockJournalPost(int stockJournalId, int stockStatusId, int quantity);
|
||||||
|
Dictionary<int, Model.Stock.StockJournalBuilder> ReadStockJournal(List<int> stockJournalIdList);
|
||||||
|
Dictionary<int, (int id, string title, int? stockStatusIdDebit, int? stockStatusIdCredit)> ReadStockJournalType(List<int> stockJournalTypeIdList);
|
||||||
(int, DateTime) ReadJournalStockIdAndEntryDate(int stockJournalId);
|
(int, DateTime) ReadJournalStockIdAndEntryDate(int stockJournalId);
|
||||||
int ReadJournalTypeIdByStockId(int stockId);
|
int ReadJournalTypeIdByStockId(int stockId);
|
||||||
int ReadStatusBalanceBySku(string sku, int statusId);
|
int ReadStatusBalanceBySku(string sku, int statusId);
|
||||||
@@ -17,7 +19,6 @@ namespace bnhtrade.Core.Data.Database.Repository.Interface
|
|||||||
int ReadStatusBalanceByStockId(int stockId, int statusId);
|
int ReadStatusBalanceByStockId(int stockId, int statusId);
|
||||||
int ReadJournalEntryCountByStockId(int stockId);
|
int ReadJournalEntryCountByStockId(int stockId);
|
||||||
int? ReadTypeIdStatusCreditId(int stockJournalTypeId);
|
int? ReadTypeIdStatusCreditId(int stockJournalTypeId);
|
||||||
Dictionary<string, int> ReadStatusBalanceByStatusId(int statusId);
|
|
||||||
DateTime? ReadMostRecentEntryDateForStatusDebit(int stockId, List<int> stockStatusIdList);
|
DateTime? ReadMostRecentEntryDateForStatusDebit(int stockId, List<int> stockStatusIdList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace bnhtrade.Core.Data.Database.Repository.Interface
|
|||||||
{
|
{
|
||||||
internal interface IStockStatusRepository
|
internal interface IStockStatusRepository
|
||||||
{
|
{
|
||||||
Dictionary<int, Model.Stock.Status> ReadStatus(List<int> statusIds = null, List<int> statusTypeIds = null);
|
Dictionary<int, Model.Stock.StatusBuilder> ReadStatus(List<int> statusIds = null, List<int> statusTypeIds = null);
|
||||||
Dictionary<int, Model.Stock.StatusType> ReadStatusType();
|
Dictionary<int, Model.Stock.StatusTypeBuilder> ReadStatusType(List<int> stockStatusTypeIds = null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using bnhtrade.Core.Data.Database.UnitOfWork;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -12,52 +13,16 @@ namespace bnhtrade.Core.Logic.Account
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public Dictionary<int, Model.Account.Account> GetAll()
|
internal AccountCodeService(IUnitOfWork unitOfWork) : base(unitOfWork)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dictionary<int, Model.Account.Account> GetAccountCode(List<int> accountIdList = null, List<int> accountCodeList = null)
|
||||||
{
|
{
|
||||||
return WithUnitOfWork(uow =>
|
return WithUnitOfWork(uow =>
|
||||||
{
|
{
|
||||||
return uow.AccountCodeRepository.ReadAccountCode();
|
return uow.AccountCodeRepository.ReadAccountCode(accountIdList, accountCodeList);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public Model.Account.Account ByAccountCode(int accountCode)
|
|
||||||
{
|
|
||||||
var list = ByAccountCode(new List<int> { accountCode });
|
|
||||||
if (list.Any())
|
|
||||||
{
|
|
||||||
return list[0];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Model.Account.Account> ByAccountCode(List<int> accountCodeList)
|
|
||||||
{
|
|
||||||
return WithUnitOfWork(uow =>
|
|
||||||
{
|
|
||||||
return uow.AccountCodeRepository.ReadAccountCode(null, accountCodeList).Values.ToList();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dictionary<int, Model.Account.Account> ConvertToDictionary(List<Model.Account.Account> accountCodeList)
|
|
||||||
{
|
|
||||||
var returnDict = new Dictionary<int, Model.Account.Account>();
|
|
||||||
|
|
||||||
if (accountCodeList == null)
|
|
||||||
{
|
|
||||||
return returnDict;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var accountCode in accountCodeList)
|
|
||||||
{
|
|
||||||
if (!returnDict.ContainsKey((int)accountCode.AccountCode))
|
|
||||||
{
|
|
||||||
returnDict.Add((int)accountCode.AccountCode, accountCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return returnDict;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using Amazon.Runtime.Internal.Transform;
|
using Amazon.Runtime.Internal.Transform;
|
||||||
using bnhtrade.Core.Data.Database.UnitOfWork;
|
using bnhtrade.Core.Data.Database.UnitOfWork;
|
||||||
|
using bnhtrade.Core.Logic.Account;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -15,6 +16,106 @@ namespace bnhtrade.Core.Logic.Inventory
|
|||||||
|
|
||||||
internal StockJournalService(IUnitOfWork unitOfWork) : base(unitOfWork) { }
|
internal StockJournalService(IUnitOfWork unitOfWork) : base(unitOfWork) { }
|
||||||
|
|
||||||
|
public Dictionary<int, Model.Stock.StockJournal> ReadStockJournal(List<int> 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<int>();
|
||||||
|
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<int>();
|
||||||
|
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<int, Model.Stock.StockJournal>();
|
||||||
|
foreach (var journal in builderList.Values)
|
||||||
|
{
|
||||||
|
returnDict.Add(journal.StockJournalId, journal.Build(journalTypeDict, statusDict));
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnDict;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dictionary<int, Model.Stock.StockJournalType> ReadStockJournalType(List<int> stockJournalTypeIds = null)
|
||||||
|
{
|
||||||
|
return WithUnitOfWork(uow =>
|
||||||
|
{
|
||||||
|
return ReadStockJournalType(uow, stockJournalTypeIds);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<int, Model.Stock.StockJournalType> ReadStockJournalType(IUnitOfWork uow, List<int> stockJournalTypeIds = null)
|
||||||
|
{
|
||||||
|
return WithUnitOfWork(uow =>
|
||||||
|
{
|
||||||
|
// get the stock journal types from the repository
|
||||||
|
var tupleList = uow.StockJournalRepository.ReadStockJournalType(stockJournalTypeIds);
|
||||||
|
|
||||||
|
// get the accounts for the stock journal types
|
||||||
|
var statusIds = new List<int>();
|
||||||
|
foreach (var type in tupleList.Values)
|
||||||
|
{
|
||||||
|
if (type.stockStatusIdDebit.HasValue)
|
||||||
|
{
|
||||||
|
statusIds.Add(type.stockStatusIdDebit.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type.stockStatusIdCredit.HasValue)
|
||||||
|
{
|
||||||
|
statusIds.Add(type.stockStatusIdCredit.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
statusIds = statusIds.Distinct().ToList();
|
||||||
|
var statusDict = new StockStatusService(uow).GetStatus(statusIds);
|
||||||
|
|
||||||
|
// build the stock journal type objects and return them in a dictionary
|
||||||
|
var returnDict = new Dictionary<int, Model.Stock.StockJournalType>();
|
||||||
|
foreach (var type in tupleList.Values)
|
||||||
|
{
|
||||||
|
var debitStatus = type.stockStatusIdDebit.HasValue ? statusDict[type.stockStatusIdDebit.Value] : null;
|
||||||
|
var creditStatus = type.stockStatusIdCredit.HasValue ? statusDict[type.stockStatusIdCredit.Value] : null;
|
||||||
|
|
||||||
|
var stockJournalType = new Model.Stock.StockJournalType(
|
||||||
|
type.id,
|
||||||
|
type.title,
|
||||||
|
debitStatus,
|
||||||
|
creditStatus
|
||||||
|
);
|
||||||
|
|
||||||
|
returnDict.Add(stockJournalType.StockJournalTypeID, stockJournalType);
|
||||||
|
}
|
||||||
|
return returnDict;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public int StockJournalInsert(int journalTypeId, int stockId, List<(int statusId, int quantity)> journalPosts,
|
public int StockJournalInsert(int journalTypeId, int stockId, List<(int statusId, int quantity)> journalPosts,
|
||||||
DateTime entryDate, bool isNewStock = false)
|
DateTime entryDate, bool isNewStock = false)
|
||||||
{
|
{
|
||||||
@@ -134,9 +235,9 @@ namespace bnhtrade.Core.Logic.Inventory
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// get isCreditOnly for each status
|
// get isCreditOnly for each status
|
||||||
var statusList = new StockStatusService(uow).GetStatus(dicStatusQty.Keys.ToList());
|
var statusDict = new StockStatusService(uow).GetStatus(dicStatusQty.Keys.ToList());
|
||||||
var dicStatusIsCreditOnly = new Dictionary<int, bool>();
|
var dicStatusIsCreditOnly = new Dictionary<int, bool>();
|
||||||
foreach (var status in statusList.Values.ToList())
|
foreach (var status in statusDict.Values.ToList())
|
||||||
{
|
{
|
||||||
dicStatusIsCreditOnly.Add(status.StatusId, status.IsCreditOnly);
|
dicStatusIsCreditOnly.Add(status.StatusId, status.IsCreditOnly);
|
||||||
}
|
}
|
||||||
@@ -189,7 +290,7 @@ namespace bnhtrade.Core.Logic.Inventory
|
|||||||
|
|
||||||
// get this far...
|
// get this far...
|
||||||
// insert journal posts into database
|
// insert journal posts into database
|
||||||
var postIdList = new List<int>()
|
var postIdList = new List<int>();
|
||||||
foreach (var post in journalPosts)
|
foreach (var post in journalPosts)
|
||||||
{
|
{
|
||||||
postIdList.Add(uow.StockJournalRepository.InsertStockJournalPost(stockJournalId, post.statusId, post.quantity));
|
postIdList.Add(uow.StockJournalRepository.InsertStockJournalPost(stockJournalId, post.statusId, post.quantity));
|
||||||
|
|||||||
@@ -17,7 +17,53 @@ namespace bnhtrade.Core.Logic.Inventory
|
|||||||
{
|
{
|
||||||
return WithUnitOfWork(uow =>
|
return WithUnitOfWork(uow =>
|
||||||
{
|
{
|
||||||
return uow.StockStatusRepository.ReadStatus(statusIds, statusTypeIds);
|
var builderList = uow.StockStatusRepository.ReadStatus(statusIds, statusTypeIds).Values.ToList();
|
||||||
|
|
||||||
|
var satusTypeIdList = new List<int>();
|
||||||
|
foreach (var status in builderList)
|
||||||
|
{
|
||||||
|
satusTypeIdList.Add(status.StatusTypeId);
|
||||||
|
}
|
||||||
|
satusTypeIdList = satusTypeIdList.Distinct().ToList();
|
||||||
|
var statusTypeDict = GetStatusType(uow, satusTypeIdList);
|
||||||
|
|
||||||
|
var retrunDict = new Dictionary<int, Model.Stock.Status>();
|
||||||
|
foreach (var status in builderList)
|
||||||
|
{
|
||||||
|
retrunDict.Add(status.StatusId, status.Build(statusTypeDict));
|
||||||
|
}
|
||||||
|
return retrunDict;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<int, Model.Stock.StatusType> GetStatusType(IUnitOfWork uow, List<int> statusTypeIds = null)
|
||||||
|
{
|
||||||
|
// get the status types from the repository
|
||||||
|
var typeBuilderList = uow.StockStatusRepository.ReadStatusType(statusTypeIds);
|
||||||
|
|
||||||
|
// get the accounts for the status types
|
||||||
|
var accountIds = new List<int>();
|
||||||
|
foreach (var type in typeBuilderList.Values)
|
||||||
|
{
|
||||||
|
accountIds.Add(type.AccountId);
|
||||||
|
}
|
||||||
|
accountIds = accountIds.Distinct().ToList();
|
||||||
|
var accountDict = uow.AccountCodeRepository.ReadAccountCode(accountIds);
|
||||||
|
|
||||||
|
// build the status type objects and return them in a dictionary
|
||||||
|
var returnDict = new Dictionary<int, Model.Stock.StatusType>();
|
||||||
|
foreach (var type in typeBuilderList.Values)
|
||||||
|
{
|
||||||
|
returnDict.Add(type.StockStatusTypeID, type.Build(accountDict));
|
||||||
|
}
|
||||||
|
return returnDict;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dictionary<int, Model.Stock.StatusType> GetStatusType(List<int> statusTypeIds = null)
|
||||||
|
{
|
||||||
|
return WithUnitOfWork(uow =>
|
||||||
|
{
|
||||||
|
return GetStatusType(uow, statusTypeIds);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +87,5 @@ namespace bnhtrade.Core.Logic.Inventory
|
|||||||
return uow.StockJournalRepository.ReadStatusBalanceBySku(sku, statusId);
|
return uow.StockJournalRepository.ReadStatusBalanceBySku(sku, statusId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ namespace bnhtrade.Core.Model.Account
|
|||||||
{
|
{
|
||||||
public Account(int id, int accountCode, string accountName, string description, string type, string basicType, int multiplier)
|
public Account(int id, int accountCode, string accountName, string description, string type, string basicType, int multiplier)
|
||||||
{
|
{
|
||||||
Id = id;
|
AccountId = id;
|
||||||
AccountCode = accountCode;
|
AccountCode = accountCode;
|
||||||
AccountName = accountName;
|
AccountName = accountName;
|
||||||
Description = description;
|
Description = description;
|
||||||
@@ -23,18 +23,18 @@ namespace bnhtrade.Core.Model.Account
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Database record id
|
/// Database record id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int Id { get; private set; }
|
public int AccountId { get; }
|
||||||
|
|
||||||
public int AccountCode { get; private set; }
|
public int AccountCode { get; }
|
||||||
|
|
||||||
public string AccountName { get; private set; }
|
public string AccountName { get; }
|
||||||
|
|
||||||
public string Description { get; private set; }
|
public string Description { get; }
|
||||||
|
|
||||||
public string Type { get; private set; }
|
public string Type { get; }
|
||||||
|
|
||||||
public string BasicType { get; private set; }
|
public string BasicType { get; }
|
||||||
|
|
||||||
public int Multiplier { get; private set; }
|
public int Multiplier { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace bnhtrade.Core.Model.Stock
|
|
||||||
{
|
|
||||||
public class JournalEntry : IValidatableObject
|
|
||||||
{
|
|
||||||
public string TypeTitle { get; set; }
|
|
||||||
|
|
||||||
public int StockNumber { get; set; }
|
|
||||||
|
|
||||||
public DateTime EntryDate { get; set; }
|
|
||||||
|
|
||||||
public DateTime PostDate { get; set; }
|
|
||||||
|
|
||||||
public DateTime LastModified { get; set; }
|
|
||||||
|
|
||||||
public bool IsLocked { get; set; }
|
|
||||||
|
|
||||||
public List<JournalEntryPost> JournalPosts { get; set; } = new List<JournalEntryPost>();
|
|
||||||
|
|
||||||
public class JournalEntryPost
|
|
||||||
{
|
|
||||||
public int JournalPostId { get; set; }
|
|
||||||
|
|
||||||
public int StockStatusId { get; set; }
|
|
||||||
|
|
||||||
[Required()]
|
|
||||||
public string StockStatus { get; set; }
|
|
||||||
|
|
||||||
[Required()]
|
|
||||||
public int Quantity { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -21,22 +21,32 @@ namespace bnhtrade.Core.Model.Stock
|
|||||||
RecordCreated = recordCreated;
|
RecordCreated = recordCreated;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int StatusId { get; private set; }
|
public int StatusId { get; }
|
||||||
|
|
||||||
public int? StatusCode { get; private set; }
|
public int? StatusCode { get; }
|
||||||
|
|
||||||
public string StatusTitle { get; private set; }
|
public bool StatusCodeIsSet
|
||||||
|
{
|
||||||
|
get { return StatusCode.HasValue; }
|
||||||
|
}
|
||||||
|
|
||||||
public Model.Stock.StatusType StatusType { get; private set; }
|
public string StatusTitle { get; }
|
||||||
|
|
||||||
public string Reference { get; private set; }
|
public Model.Stock.StatusType StatusType { get; }
|
||||||
|
|
||||||
public int? ForeignKeyID { get; private set; }
|
public string Reference { get; }
|
||||||
|
|
||||||
public bool IsCreditOnly { get; private set; }
|
public int? ForeignKeyID { get; }
|
||||||
|
|
||||||
public bool IsClosed { get; private set; }
|
public bool ForeignKeyIDIsSet
|
||||||
|
{
|
||||||
|
get { return ForeignKeyID.HasValue; }
|
||||||
|
}
|
||||||
|
|
||||||
public DateTime RecordCreated { get; private set; }
|
public bool IsCreditOnly { get; }
|
||||||
|
|
||||||
|
public bool IsClosed { get; }
|
||||||
|
|
||||||
|
public DateTime RecordCreated { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
48
src/bnhtrade.Core/Model/Stock/StatusBuilder.cs
Normal file
48
src/bnhtrade.Core/Model/Stock/StatusBuilder.cs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace bnhtrade.Core.Model.Stock
|
||||||
|
{
|
||||||
|
internal class StatusBuilder
|
||||||
|
{
|
||||||
|
public int StatusId { get; set; }
|
||||||
|
|
||||||
|
public int? StatusCode { get; set; }
|
||||||
|
|
||||||
|
public string StatusTitle { get; set; }
|
||||||
|
|
||||||
|
public int StatusTypeId { get; set; }
|
||||||
|
|
||||||
|
public string Reference { get; set; }
|
||||||
|
|
||||||
|
public int? ForeignKeyID { get; set; }
|
||||||
|
|
||||||
|
public bool IsCreditOnly { get; set; }
|
||||||
|
|
||||||
|
public bool IsClosed { get; set; }
|
||||||
|
|
||||||
|
public DateTime RecordCreated { get; set; }
|
||||||
|
|
||||||
|
public Status Build(Dictionary<int, StatusType> statusTypeDict)
|
||||||
|
{
|
||||||
|
if (!statusTypeDict.ContainsKey(StatusTypeId))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Status type with ID {StatusTypeId} does not exist.");
|
||||||
|
}
|
||||||
|
return new Status(
|
||||||
|
StatusId,
|
||||||
|
StatusCode,
|
||||||
|
StatusTitle,
|
||||||
|
statusTypeDict[StatusTypeId],
|
||||||
|
Reference,
|
||||||
|
ForeignKeyID,
|
||||||
|
IsCreditOnly,
|
||||||
|
IsClosed,
|
||||||
|
RecordCreated
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,10 +17,10 @@ namespace bnhtrade.Core.Model.Stock
|
|||||||
ReferenceType = referenceType;
|
ReferenceType = referenceType;
|
||||||
Account = account;
|
Account = account;
|
||||||
}
|
}
|
||||||
public int StockStatusTypeID { get; private set; }
|
public int StockStatusTypeID { get; }
|
||||||
public string StatusTypeName { get; private set; }
|
public string StatusTypeName { get; }
|
||||||
public string ForeignKeyType { get; private set; }
|
public string ForeignKeyType { get; }
|
||||||
public string ReferenceType { get; private set; }
|
public string ReferenceType { get; }
|
||||||
public Model.Account.Account Account { get; private set; }
|
public Model.Account.Account Account { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
32
src/bnhtrade.Core/Model/Stock/StatusTypeBuilder.cs
Normal file
32
src/bnhtrade.Core/Model/Stock/StatusTypeBuilder.cs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace bnhtrade.Core.Model.Stock
|
||||||
|
{
|
||||||
|
internal class StatusTypeBuilder
|
||||||
|
{
|
||||||
|
public int StockStatusTypeID { get; set; }
|
||||||
|
public string StatusTypeName { get; set; }
|
||||||
|
public string ForeignKeyType { get; set; }
|
||||||
|
public string ReferenceType { get; set; }
|
||||||
|
public int AccountId { get; set; }
|
||||||
|
|
||||||
|
public StatusType Build(Dictionary<int, Model.Account.Account> accountDict)
|
||||||
|
{
|
||||||
|
if (!accountDict.ContainsKey(AccountId))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Account with ID {AccountId} does not exist.");
|
||||||
|
}
|
||||||
|
return new StatusType(
|
||||||
|
StockStatusTypeID,
|
||||||
|
StatusTypeName,
|
||||||
|
ForeignKeyType,
|
||||||
|
ReferenceType,
|
||||||
|
accountDict[AccountId]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
74
src/bnhtrade.Core/Model/Stock/StockJournalBuilder.cs
Normal file
74
src/bnhtrade.Core/Model/Stock/StockJournalBuilder.cs
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using static bnhtrade.Core.Data.Database.Constants;
|
||||||
|
using static bnhtrade.Core.Model.Stock.StockJournal;
|
||||||
|
|
||||||
|
namespace bnhtrade.Core.Model.Stock
|
||||||
|
{
|
||||||
|
internal class StockJournalBuilder
|
||||||
|
{
|
||||||
|
public int StockJournalId { get; set; }
|
||||||
|
|
||||||
|
public int StockJournalTypeId { get; set; }
|
||||||
|
|
||||||
|
public int StockId { get; set; }
|
||||||
|
|
||||||
|
public string StockNumber { get; set; }
|
||||||
|
|
||||||
|
public DateTime EntryDate { get; set; }
|
||||||
|
|
||||||
|
public DateTime PostDate { get; set; }
|
||||||
|
|
||||||
|
public DateTime LastModified { get; set; }
|
||||||
|
|
||||||
|
public bool IsLocked { get; set; }
|
||||||
|
|
||||||
|
public bool AccountIsProcessed { get; set; }
|
||||||
|
|
||||||
|
public List<StockJournalBuilderPost> StockJournalBuilderPosts { get; set; }
|
||||||
|
|
||||||
|
public class StockJournalBuilderPost
|
||||||
|
{
|
||||||
|
public int StockJournalPostId { get; set; }
|
||||||
|
|
||||||
|
public int StatusId { get; set; }
|
||||||
|
|
||||||
|
public int Quantity { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public StockJournal Build(Dictionary<int, StockJournalType> stockJournalTypeDict, Dictionary<int, Status> stockStatusDict)
|
||||||
|
{
|
||||||
|
if (StockJournalBuilderPosts == null || !StockJournalBuilderPosts.Any())
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("At least one journal post is required.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var posts = new List<StockJournalPost>();
|
||||||
|
foreach (var builderPost in StockJournalBuilderPosts)
|
||||||
|
{
|
||||||
|
var post = new StockJournalPost(
|
||||||
|
builderPost.StockJournalPostId,
|
||||||
|
stockStatusDict[builderPost.StockJournalPostId],
|
||||||
|
builderPost.Quantity
|
||||||
|
);
|
||||||
|
posts.Add(post);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new StockJournal(
|
||||||
|
StockJournalId,
|
||||||
|
stockJournalTypeDict[StockJournalTypeId],
|
||||||
|
StockId,
|
||||||
|
StockNumber,
|
||||||
|
EntryDate,
|
||||||
|
PostDate,
|
||||||
|
LastModified,
|
||||||
|
IsLocked,
|
||||||
|
posts
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,5 +8,30 @@ namespace bnhtrade.Core.Model.Stock
|
|||||||
{
|
{
|
||||||
public class StockJournalType
|
public class StockJournalType
|
||||||
{
|
{
|
||||||
|
public StockJournalType(int stockJournalTypeId, string stockJournalTypeTitle, Status defaultDebitStatus, Status defaultCreditStatus)
|
||||||
|
{
|
||||||
|
StockJournalTypeID = stockJournalTypeId;
|
||||||
|
StockJournalTypeTitle = stockJournalTypeTitle ?? throw new ArgumentNullException(nameof(stockJournalTypeTitle), "Stock journal type title cannot be null.");
|
||||||
|
DefaultDebitStatus = defaultDebitStatus;
|
||||||
|
DefaultCreditStatus = defaultCreditStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int StockJournalTypeID { get; }
|
||||||
|
|
||||||
|
public string StockJournalTypeTitle { get; }
|
||||||
|
|
||||||
|
public Status DefaultDebitStatus { get; }
|
||||||
|
|
||||||
|
public bool DefaultDebitStatusIsSet
|
||||||
|
{
|
||||||
|
get { return DefaultDebitStatus != null; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public Status DefaultCreditStatus { get; }
|
||||||
|
|
||||||
|
public bool DefaultCreditStatusIsSet
|
||||||
|
{
|
||||||
|
get { return DefaultCreditStatus != null; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user