using System;
using System.Collections.Generic;
using Microsoft.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
namespace bnhtrade.Core.Data.Database.Stock
{
public class UpdateSkuTransaction : Connection
{
// Any update method below to the quanity, isprocessed or journalId, implements a consistancy check.
private string err = "Database UpdateSkuTransaction: ";
private ReadSkuTransaction dbRead = new ReadSkuTransaction();
public UpdateSkuTransaction()
{
}
public void Update(Model.Stock.SkuTransaction skuTransaction)
{
// Consistancy check: is the target marked as is processed?
dbRead.Init();
if (dbRead.GetIsProcessed(skuTransaction.SkuTransactionId))
throw new InvalidOperationException("Update restricted, sku transaction isProcessed=true");
using (var conn = new SqlConnection(SqlConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(@"
UPDATE tblStockSkuTransaction
SET TransactionDate = @transactionDate
,StockSkuTransactionTypeID = (
SELECT StockSkuTransactionTypeID
FROM tblStockSkuTransactionType
WHERE TypeCode = @skuTransactionTypeCode
)
,ForeignKey = @foreignKey
,Reference = @reference
,Detail = @Detail
,SkuID = (
SELECT skuSkuID
FROM tblSku
WHERE skuSkuNumber = @skuNumber
)
,Quantity = @quantity
,IsProcessed = @isProcessed
,StockJournalID = @stockJournalID
WHERE StockSkuTransactionID = @transactionId
", conn))
{
cmd.Parameters.AddWithValue("@transactionDate", skuTransaction.TransactionDate.ToUniversalTime());
cmd.Parameters.AddWithValue("@skuTransactionTypeCode", skuTransaction.SkuTransactionTypeCode);
if (skuTransaction.ForeignKey == null) { cmd.Parameters.AddWithValue("@foreignKey", DBNull.Value); }
else { cmd.Parameters.AddWithValue("@foreignKey", skuTransaction.ForeignKey); }
if (skuTransaction.Reference == null) { cmd.Parameters.AddWithValue("@reference", DBNull.Value); }
else { cmd.Parameters.AddWithValue("@reference", skuTransaction.Reference); }
if (skuTransaction.Detail == null) { cmd.Parameters.AddWithValue("@detail", DBNull.Value); }
else { cmd.Parameters.AddWithValue("@detail", skuTransaction.Detail); }
cmd.Parameters.AddWithValue("@skuNumber", skuTransaction.SkuNumber);
cmd.Parameters.AddWithValue("@quantity", skuTransaction.Quantity);
cmd.Parameters.AddWithValue("@isProcessed", skuTransaction.IsProcessed);
if (skuTransaction.StockJournalId == null) { cmd.Parameters.AddWithValue("@stockJournalID", DBNull.Value); }
else { cmd.Parameters.AddWithValue("@stockJournalID", skuTransaction.StockJournalId); }
cmd.Parameters.AddWithValue("@transactionId", skuTransaction.SkuTransactionId);
int effected = cmd.ExecuteNonQuery();
if (effected < 1)
{
throw new Exception(err += "stockSkuTransaction IsProcessed update failed");
}
}
}
}
///
/// Update the isProcessed and StockJournalId field, with journal consistancy check.
///
/// Sku Transaction Id
///
///
/// Invalid journalId, isProcessed combination
/// DB update sql fail
public void UpdateIsProcessed(int skuTransactionId, bool isProcessed, int? stockJournalId, bool enableJournalDelete = false)
{
// IMPORTANT!!!!
// For consistancy reasons: need to make sure that if a journal entry exists, it is deteled before it is
// edited, or removed from the transaction table
// Best to implement this here, at only point where the isprocessed/journalId can be updated
// intial checks
if (isProcessed == false && stockJournalId != null)
throw new InvalidOperationException("If stock journal id is set, isProcessed must be true");
using (var scope = new TransactionScope())
{
try
{
// check for existing journal Id in transactin table
var existingJournalId = new Data.Database.Stock.ReadSkuTransaction().GetJournalId(skuTransactionId);
bool journalDeleteRequired = false;
if (existingJournalId != null)
{
if (stockJournalId == null || stockJournalId != existingJournalId)
{
journalDeleteRequired = true;
}
}
// make the journal delete, if required and enabled
if (journalDeleteRequired && enableJournalDelete)
{
new Data.Database.Stock.JournalCrud().StockJournalDelete((int)existingJournalId);
}
else
{
throw new InvalidOperationException("Removal of stock journal to update sku transaction table not allowed");
}
// update the transaction table
string sql = @"
UPDATE tblStockSkuTransaction
SET IsProcessed = @isProcessed
,StockJournalID = @stockJournalID
WHERE StockSkuTransactionID = @transactionId;";
using (var conn = new SqlConnection(SqlConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@isProcessed", isProcessed);
if (stockJournalId == null) { cmd.Parameters.AddWithValue("@stockJournalID", DBNull.Value); }
else { cmd.Parameters.AddWithValue("@stockJournalID", (int)stockJournalId); }
cmd.Parameters.AddWithValue("@transactionId", skuTransactionId);
int effected = cmd.ExecuteNonQuery();
if (effected != 1)
{
throw new Exception(err += "Sku Transaction StockJournalID update failed");
}
}
}
scope.Complete();
}
catch (Exception ex)
{
scope.Dispose();
throw ex;
}
}
}
///
/// Update the quantity field, with journal consistancy check.
///
/// stock sku transaction id
/// quantity
/// Update restricted, sku transaction isProcessed=true
/// Database write failed
public void UpdateQuanitity(int skuTransactionId, int quantity)
{
// Consistancy check: is the target marked as is processed?
dbRead.Init();
if (dbRead.GetIsProcessed(skuTransactionId))
throw new InvalidOperationException("Update restricted, sku transaction isProcessed=true");
using (var conn = new SqlConnection(SqlConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(@"
UPDATE tblStockSkuTransaction
SET Quantity = @quantity
WHERE StockSkuTransactionID = @transactionId
", conn))
{
cmd.Parameters.AddWithValue("@quantity", quantity);
int effected = cmd.ExecuteNonQuery();
if (effected != 1)
{
throw new Exception(err += "stockSkuTransaction Quantity update failed");
}
}
}
}
}
}