Various bug fixs and improvements to stock SKU reconciliation

This commit is contained in:
Bobbie Hodgetts
2020-10-05 22:40:55 +01:00
parent cc2534a3e1
commit ddd2b62743
25 changed files with 1026 additions and 467 deletions

View File

@@ -10,7 +10,8 @@ namespace bnhtrade.Core.Data.Database.Stock
{
public class ReadSkuTransaction : Connection
{
private Data.Database.WhereBuilder whereBuilder = new WhereBuilder();
private Data.Database.SqlWhereBuilder whereBuilder = new SqlWhereBuilder();
private List<int> transactionIdList = new List<int>();
public ReadSkuTransaction(string sqlConnectionString) : base(sqlConnectionString)
{
@@ -22,7 +23,7 @@ namespace bnhtrade.Core.Data.Database.Stock
/// </summary>
public void Init()
{
whereBuilder = new WhereBuilder();
whereBuilder = new SqlWhereBuilder();
IsReconciled = null;
StockTransactionTypeName = null;
StockTransactionTypeCode = null;
@@ -107,34 +108,44 @@ namespace bnhtrade.Core.Data.Database.Stock
INNER JOIN tblSku ON tblStockSkuTransaction.SkuID = tblSku.skuSkuID
WHERE 1=1 ";
if (IsReconciled != null)
if (transactionIdList.Any())
{
parameters.Add("@transactionIdList", this.transactionIdList);
sql += @"
AND tblStockSkuTransaction.StockSkuTransactionID IN @transactionIdList ";
}
else
{
if (IsReconciled != null)
{
sql += @"
AND tblStockSkuTransaction.IsProcessed =";
if (IsReconciled.GetValueOrDefault())
{
sql += " 1 ";
if (IsReconciled.GetValueOrDefault())
{
sql += " 1 ";
}
else
{
sql += " 0 ";
}
}
else
{
sql += " 0 ";
}
}
if (StockTransactionTypeName != null && StockTransactionTypeName.Any())
{
parameters.Add("@stockTransactionTypeName", StockTransactionTypeName);
if (StockTransactionTypeName != null && StockTransactionTypeName.Any())
{
parameters.Add("@stockTransactionTypeName", StockTransactionTypeName);
sql += @"
sql += @"
AND tblStockSkuTransactionType.TypeName IN @stockTransactionTypeName ";
}
}
if (StockTransactionTypeCode != null && StockTransactionTypeCode.Any())
{
parameters.Add("@stockTransactionTypeCode", StockTransactionTypeCode);
if (StockTransactionTypeCode != null && StockTransactionTypeCode.Any())
{
parameters.Add("@stockTransactionTypeCode", StockTransactionTypeCode);
sql += @"
sql += @"
AND tblStockSkuTransactionType.TypeCode IN @stockTransactionTypeCode ";
}
}
sql += @"
@@ -158,5 +169,23 @@ namespace bnhtrade.Core.Data.Database.Stock
return resultList;
}
/// <summary>
/// Get Stock SKU Transaction by ID
/// </summary>
/// <param name="transactionIdList"></param>
/// <returns>List of SkuTransaction</returns>
public List<Model.Stock.SkuTransaction> Read(List<int> transactionIdList)
{
var returnList = new List<Model.Stock.SkuTransaction>();
if (!transactionIdList.Any())
{
return returnList;
}
this.transactionIdList = transactionIdList;
returnList = Read();
this.transactionIdList = new List<int>();
return returnList;
}
}
}

View File

@@ -0,0 +1,123 @@
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace bnhtrade.Core.Data.Database.Stock
{
public class ReadStatusBalance : Connection
{
public ReadStatusBalance(string sqlConnectionString) : base(sqlConnectionString)
{
}
public int BySku(string sku, int statusId)
{
int statusBalance = new int();
using (SqlConnection conn = new SqlConnection(sqlConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(@"
SELECT SUM(tblStockJournalPost.Quantity) AS Balance
FROM tblStockJournal INNER JOIN
tblStockJournalPost ON tblStockJournal.StockJournalID = tblStockJournalPost.StockJournalID INNER JOIN
tblStock ON tblStockJournal.StockID = tblStock.StockID INNER JOIN
tblSku ON tblStock.SkuID = tblSku.skuSkuID
WHERE (tblStockJournalPost.StockStatusID = @statusId) AND (tblSku.skuSkuNumber = @sku)
", conn))
{
// add parameters
cmd.Parameters.AddWithValue("@sku", sku);
cmd.Parameters.AddWithValue("@statusId", statusId);
// execute
object obj = cmd.ExecuteScalar();
if (obj == null || obj == DBNull.Value)
{
statusBalance = 0;
}
else
{
statusBalance = (int)obj;
}
}
}
return statusBalance;
}
public int ByStockNumber(int stockNumber, int statusId)
{
int statusBalance = new int();
using (SqlConnection conn = new SqlConnection(sqlConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(@"
SELECT SUM(tblStockJournalPost.Quantity) AS Balance
FROM tblStockJournal INNER JOIN
tblStockJournalPost ON tblStockJournal.StockJournalID = tblStockJournalPost.StockJournalID INNER JOIN
tblStock ON tblStockJournal.StockID = tblStock.StockID
WHERE (tblStockJournalPost.StockStatusID = @statusId) AND (tblStock.StockNumber = @stockNumber)
", conn))
{
// add parameters
cmd.Parameters.AddWithValue("@stockNumber", stockNumber);
cmd.Parameters.AddWithValue("@statusId", statusId);
// execute
object obj = cmd.ExecuteScalar();
if (obj == null || obj == DBNull.Value)
{
statusBalance = 0;
}
else
{
statusBalance = (int)obj;
}
}
}
return statusBalance;
}
public int ByStockId(int stockId, int statusId)
{
int statusBalance = new int();
using (SqlConnection conn = new SqlConnection(sqlConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(@"
SELECT
SUM(tblStockJournalPost.Quantity) AS Balance
FROM
tblStockJournal
INNER JOIN tblStockJournalPost
ON tblStockJournal.StockJournalID = tblStockJournalPost.StockJournalID
WHERE
(tblStockJournal.StockID = @stockId )
AND (tblStockJournalPost.StockStatusID = @statusId )
", conn))
{
// add parameters
cmd.Parameters.AddWithValue("@stockId", stockId);
cmd.Parameters.AddWithValue("@statusId", statusId);
// execute
object obj = cmd.ExecuteScalar();
if (obj == null || obj == DBNull.Value)
{
statusBalance = 0;
}
else
{
statusBalance = (int)obj;
}
}
}
return statusBalance;
}
}
}

View File

@@ -0,0 +1,193 @@
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
namespace bnhtrade.Core.Data.Database.Stock
{
public class ReadStatusTransaction : Connection
{
public ReadStatusTransaction(string sqlConnectionString) : base(sqlConnectionString)
{
}
/// <summary>
/// Returns a list with balance of stock avaiable by individual StockId
/// </summary>
/// <param name="skuNumber">SKU Number</param>
/// <param name="stockStatusId">Stock Status Database PK</param>
/// <returns></returns>
public List<(string SkuNumber, int StockNumber, int Balance)> BySkuNumber(string skuNumber, int stockStatusId)
{
var returnList = new List<(string SkuNumber, int StockNumber, int Balance)>();
if (string.IsNullOrWhiteSpace(skuNumber))
{
return returnList;
}
string strSQL = @"
SELECT tblSku.skuSkuNumber
,tblStock.StockNumber
,SUM(tblStockJournalPost.Quantity) AS Balance
FROM tblStockJournal
INNER JOIN tblStock ON tblStockJournal.StockID = tblStock.StockID
INNER JOIN tblStockJournalPost ON tblStockJournal.StockJournalID = tblStockJournalPost.StockJournalID
INNER JOIN tblSku ON tblStock.SkuID = tblSku.skuSkuID
WHERE (tblStockJournalPost.StockStatusID = @stockStatusId)
AND (tblSku.skuSkuNumber = @skuNumber)
GROUP BY tblSku.skuSkuNumber
,tblStock.StockNumber
";
using (SqlConnection conn = new SqlConnection(sqlConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(strSQL, conn))
{
// add parameters
cmd.Parameters.AddWithValue("@skuNumber", skuNumber);
cmd.Parameters.AddWithValue("@stockStatusId", stockStatusId);
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
returnList.Add((
SkuNumber: reader.GetString(0),
StockNumber: reader.GetInt32(1),
Balance: reader.GetInt32(2)));
}
}
}
}
}
return returnList;
}
/// <summary>
/// Gets list of stock status debits and credits. Includes stock numbers with balance greater than or less than zero.
/// </summary>
/// <param name="stockStatusId">Required, filters results</param>
/// <param name="stockNumber">Required, filters results</param>
/// <returns>Tuple list is assending order</returns>
public Model.Stock.StatusTransaction ByStockNumber(int stockStatusId, int stockNumber)
{
var result = new Model.Stock.StatusTransaction();
result.StockStatusId = stockStatusId;
string strSQL = @"
SELECT a.StockNumber a.skuSkuNumber AS SkuNumber
FROM
(
SELECT tblSku.skuSkuNumber, tblStock.StockNumber, SUM(tblStockJournalPost.Quantity) AS Balance
FROM tblStockJournal INNER JOIN
tblStock ON tblStockJournal.StockID = tblStock.StockID INNER JOIN
tblStockJournalPost ON tblStockJournal.StockJournalID = tblStockJournalPost.StockJournalID INNER JOIN
tblSku ON tblStock.SkuID = tblSku.skuSkuID
WHERE (tblStockJournalPost.StockStatusID = @stockStatusId) AND (tblSku.skuSkuNumber IN @stockNumberList)
GROUP BY tblSku.skuSkuNumber, tblStock.StockNumber
) a
WHERE a.Balance <> 0
";
using (SqlConnection conn = new SqlConnection(sqlConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(strSQL, conn))
{
var param = new Dapper.DynamicParameters();
param.Add("@stockStatusId", stockStatusId);
param.Add("@stockNumberList", stockNumber);
var dbresults = conn.Query(strSQL, param);
foreach (var item in dbresults)
{
result.Sku = item.SkuNumber;
result.AddBalanceTransaction(item.EntryDate, item.StockNumber, item.Quantity);
}
}
}
return result;
}
/// <summary>
/// Gets list of stock status debits and credits. Includes stock numbers with balance greater than or less than zero.
/// </summary>
/// <param name="stockStatusId">Required, filters results by stock status Id</param>
/// <param name="sku">Required, filters results by sku number</param>
/// <returns>Tuple list is assending order</returns>
public Model.Stock.StatusTransaction BySku(int stockStatusId, string sku)
{
var result = new Model.Stock.StatusTransaction();
result.Sku = sku;
result.StockStatusId = stockStatusId;
if (string.IsNullOrWhiteSpace(sku))
{
return result;
}
string strSQL = @"
SELECT tblStockJournal.EntryDate
,tblStockJournalPost.StockStatusID
,tblStock.StockNumber
,tblStockJournalPost.Quantity
FROM tblStockJournalPost
INNER JOIN tblStockJournal ON tblStockJournalPost.StockJournalID = tblStockJournal.StockJournalID
INNER JOIN tblStock ON tblStockJournal.StockID = tblStock.StockID
WHERE (tblStockJournalPost.StockStatusID = @stockStatusId)
AND (
tblStock.StockNumber IN (
SELECT a.StockNumber
FROM (
SELECT tblStock.StockNumber
,SUM(tblStockJournalPost.Quantity) AS Balance
FROM tblStockJournal
INNER JOIN tblStock ON tblStockJournal.StockID = tblStock.StockID
INNER JOIN tblStockJournalPost ON tblStockJournal.StockJournalID = tblStockJournalPost.StockJournalID
INNER JOIN tblSku ON tblStock.SkuID = tblSku.skuSkuID
WHERE (tblStockJournalPost.StockStatusID = @stockStatusId)
AND (tblSku.skuSkuNumber = @sku)
GROUP BY tblSku.skuSkuNumber
,tblStock.StockNumber
) a
WHERE a.Balance <> 0
)
)
ORDER BY tblStockJournal.EntryDate
";
using (SqlConnection conn = new SqlConnection(sqlConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(strSQL, conn))
{
var param = new Dapper.DynamicParameters();
param.Add("@stockStatusId", stockStatusId);
param.Add("@sku", sku);
var dbList = conn.Query(strSQL, param);
foreach (var item in dbList)
{
result.AddBalanceTransaction(item.EntryDate, item.StockNumber, item.Quantity);
}
}
}
return result;
}
}
}

View File

@@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using bnhtrade.Core.Data.Database;
namespace bnhtrade.Core.Data.Database.Stock
{
public class ReadStockId : Connection
{
public ReadStockId(string sqlConnectionString) : base(sqlConnectionString)
{
}
/// <summary>
/// Tempory function to retrive the database stock ID/PK from a stock number. Reliance on a stock ID will
/// eventually be desgined out of the application
/// </summary>
/// <param name="stockNumberList">List of Stock Numbers to retrive from database</param>
/// <returns>Dictiony with Stock Number as Key and Stock ID as value</returns>
public Dictionary<int, int> ByStockNumber(List<int> stockNumberList)
{
var result = new Dictionary<int, int>();
string strSQL = @"
SELECT StockNumber, StockID
FROM tblStock
WHERE ";
var whereBuilder = new Database.SqlWhereBuilder();
whereBuilder.In("StockNumber", stockNumberList, strSQL);
using (SqlConnection conn = new SqlConnection(sqlConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(whereBuilder.SqlWhereString, conn))
{
// add parameters
whereBuilder.AddParametersToSqlCommand(cmd);
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
result.Add(reader.GetInt32(0), reader.GetInt32(1));
}
}
return result;
}
}
}
}
}