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 ReadSkuTransaction : Connection { private Data.Database.WhereBuilder whereBuilder = new WhereBuilder(); public ReadSkuTransaction(string sqlConnectionString) : base(sqlConnectionString) { } /// /// Initialise result filters /// public void Init() { whereBuilder = new WhereBuilder(); IsReconciled = null; StockTransactionTypeName = null; StockTransactionTypeCode = null; } /// /// Read result filter /// public bool? IsReconciled { get; set; } /// /// Read result filter /// public List StockTransactionTypeName { get; set; } /// /// Read result filter /// public List StockTransactionTypeCode { get; set; } /// /// Retrive a 'Stock Journal ID' for a reconciled SKU transaction /// /// Stock SKU Transaction ID /// Stock Journal ID public int? GetJournalId(int skuTransactionId) { using (var conn = new SqlConnection(sqlConnectionString)) { conn.Open(); using (var cmd = new SqlCommand(@" SELECT StockJournalID FROM tblStockSkuTransaction WHERE StockSkuTransactionID=@transactionId ", conn)) { cmd.Parameters.AddWithValue("@transactionId", skuTransactionId); object obj = cmd.ExecuteScalar(); if (obj == null || obj == DBNull.Value) { return null; } else { return (int)obj; } } } } /// /// Populates model class from filtered database results /// /// List of SkuTransaction public List Read() { // order by stocktransId desc = Amazon reports are listed in datetime ASC order, some reports have date only, // however I have reason to believe these are in time order. // Adding this means they at least get processed in the correct order (maybe)! var resultList = new List(); var parameters = new DynamicParameters(); string sql = @" SELECT tblStockSkuTransaction.StockSkuTransactionID AS SkuTransactionId ,tblStockSkuTransaction.TransactionDate ,tblStockSkuTransaction.ForeignKey ,tblStockSkuTransaction.Reference ,tblStockSkuTransaction.Detail ,tblStockSkuTransaction.Quantity ,tblStockSkuTransaction.IsProcessed ,tblStockSkuTransaction.StockJournalID AS StockJournalId ,tblStockSkuTransactionType.TypeCode AS SkuTransactionTypeCode ,tblStockSkuTransactionType.TypeName AS SkuTransactionTypeName ,tblSku.skuSkuNumber AS SkuNumber ,tblStockSkuTransaction.SkuID FROM tblStockSkuTransaction INNER JOIN tblStockSkuTransactionType ON tblStockSkuTransaction.StockSkuTransactionTypeID = tblStockSkuTransactionType.StockSkuTransactionTypeID INNER JOIN tblSku ON tblStockSkuTransaction.SkuID = tblSku.skuSkuID WHERE 1=1 "; if (IsReconciled != null) { sql += @" AND tblStockSkuTransaction.IsProcessed ="; if (IsReconciled.GetValueOrDefault()) { sql += " 1 "; } else { sql += " 0 "; } } if (StockTransactionTypeName != null && StockTransactionTypeName.Any()) { parameters.Add("@stockTransactionTypeName", StockTransactionTypeName); sql += @" AND tblStockSkuTransactionType.TypeName IN @stockTransactionTypeName "; } if (StockTransactionTypeCode != null && StockTransactionTypeCode.Any()) { parameters.Add("@stockTransactionTypeCode", StockTransactionTypeCode); sql += @" AND tblStockSkuTransactionType.TypeCode IN @stockTransactionTypeCode "; } sql += @" ORDER BY tblStockSkuTransaction.TransactionDate ASC, tblStockSkuTransaction.StockSkuTransactionID DESC;"; using (SqlConnection conn = new SqlConnection(sqlConnectionString)) { conn.Open(); resultList = conn.Query(sql, parameters).ToList(); } // set datetime kind for (int i = 0; i < resultList.Count; i++) { if (resultList[i].IsSetTransactionDate) { resultList[i].TransactionDate = DateTime.SpecifyKind(resultList[i].TransactionDate, DateTimeKind.Utc); } } return resultList; } } }