mirror of
https://github.com/stokebob/bnhtrade.git
synced 2026-03-19 06:27:15 +00:00
Various bug fixs and improvements to stock SKU reconciliation
This commit is contained in:
@@ -9,7 +9,7 @@ namespace bnhtrade.Core.Data.Database.Account
|
||||
{
|
||||
public class ReadAccountCode : Connection
|
||||
{
|
||||
private Data.Database.WhereBuilder sqlWhere = new WhereBuilder();
|
||||
private Data.Database.SqlWhereBuilder sqlWhere = new SqlWhereBuilder();
|
||||
private List<Model.Account.AccountCode> resultList;
|
||||
|
||||
public ReadAccountCode(string sqlConnectionString) : base(sqlConnectionString)
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace bnhtrade.Core.Data.Database.Account
|
||||
LEFT OUTER JOIN tblAccountChartOf ON tblAccountInvoiceLineItem.AccountChartOfID_Default = tblAccountChartOf.AccountChartOfID
|
||||
WHERE ";
|
||||
|
||||
var whereBuilder = new WhereBuilder();
|
||||
var whereBuilder = new SqlWhereBuilder();
|
||||
whereBuilder.In("tblAccountInvoiceLineItem.ItemCode", itemCodeList);
|
||||
sql += whereBuilder.SqlWhereString;
|
||||
|
||||
|
||||
@@ -9,11 +9,11 @@ namespace bnhtrade.Core.Data.Database.Account
|
||||
{
|
||||
public class ReadTaxCode : Connection
|
||||
{
|
||||
private Data.Database.WhereBuilder whereBuilder;
|
||||
private Data.Database.SqlWhereBuilder whereBuilder;
|
||||
|
||||
public ReadTaxCode(string sqlConnectionString) : base(sqlConnectionString)
|
||||
{
|
||||
whereBuilder = new WhereBuilder();
|
||||
whereBuilder = new SqlWhereBuilder();
|
||||
}
|
||||
|
||||
private List<Model.Account.TaxCodeInfo> Execute(string sqlWhere, Dictionary<string, object> parameters)
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
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
|
||||
{
|
||||
public class WhereBuilder
|
||||
public class SqlWhereBuilder
|
||||
{
|
||||
private int parameterCount;
|
||||
|
||||
public WhereBuilder()
|
||||
public SqlWhereBuilder()
|
||||
{
|
||||
Innit();
|
||||
}
|
||||
@@ -26,6 +27,14 @@ namespace bnhtrade.Core.Data.Database
|
||||
parameterCount = 0;
|
||||
}
|
||||
|
||||
public void AddParametersToSqlCommand(SqlCommand cmd)
|
||||
{
|
||||
foreach (var item in ParameterList)
|
||||
{
|
||||
cmd.Parameters.AddWithValue(item.Key, item.Value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used to create a string for an SQL where condition 'In' statement
|
||||
/// </summary>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
123
src/bnhtrade.Core/Data/Database/Stock/ReadStatusBalance.cs
Normal file
123
src/bnhtrade.Core/Data/Database/Stock/ReadStatusBalance.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
193
src/bnhtrade.Core/Data/Database/Stock/ReadStatusTransaction.cs
Normal file
193
src/bnhtrade.Core/Data/Database/Stock/ReadStatusTransaction.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
58
src/bnhtrade.Core/Data/Database/Stock/ReadStockId.cs
Normal file
58
src/bnhtrade.Core/Data/Database/Stock/ReadStockId.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user