using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Transactions; namespace bnhtrade.Core.Data.Database.Account { internal class CreateJournal : Connection { /// /// Old code needs sorting /// public int AccountJournalInsert(int journalTypeId, DateTime entryDate, string currencyCode, decimal amount, int debitAccountId = 0, int creditAccountId = 0, bool lockEntry = false) { int defaultDebit = 0; int defaultCredit = 0; // ensure date is UTC entryDate = DateTime.SpecifyKind(entryDate, DateTimeKind.Utc); // debit and credit locks are checked in journal post method using (TransactionScope scope = new TransactionScope()) using (SqlConnection conn = new SqlConnection(SqlConnectionString)) { conn.Open(); // insert the journal entry int journalId; using (SqlCommand cmd = new SqlCommand(@" INSERT INTO tblAccountJournal (AccountJournalTypeID, EntryDate, IsLocked) OUTPUT INSERTED.AccountJournalID VALUES (@journalTypeId, @entryDate, @lockEntry) ", conn)) { // add parameters cmd.Parameters.AddWithValue("@journalTypeId", journalTypeId); cmd.Parameters.AddWithValue("@entryDate", entryDate.ToUniversalTime()); cmd.Parameters.AddWithValue("@lockEntry", lockEntry); //execute journalId = (int)cmd.ExecuteScalar(); } // insert journal entries //bool postResult = AccountJournalPostInsert(sqlConnectionString, journalId, entryDate, currencyCode, amount, debitAccountId, creditAccountId); bool postResult = AccountJournalPostInsert(journalId, entryDate, currencyCode, amount, debitAccountId, creditAccountId); scope.Complete(); return journalId; } } /// /// Old code needs sorting /// internal bool AccountJournalPostInsert(int journalId, DateTime entryDate, string currencyCode, decimal amount, int debitAccountId = 0, int creditAccountId = 0) { int defaultDebit; int defaultCredit; entryDate = DateTime.SpecifyKind(entryDate, DateTimeKind.Utc); using (TransactionScope scope = new TransactionScope()) using (SqlConnection conn = new SqlConnection(SqlConnectionString)) { conn.Open(); // ensure their are no other entries using (SqlCommand cmd = new SqlCommand(@" SELECT Count(tblAccountJournalPost.AccountJournalPostID) AS CountOfAccountJournalPostID FROM tblAccountJournalPost WHERE (((tblAccountJournalPost.AccountJournalID)=@AccountJournalID)); ", conn)) { cmd.Parameters.AddWithValue("@AccountJournalID", journalId); int count = (int)cmd.ExecuteScalar(); if (count > 0) { throw new Exception("Unable the insert journal posts, post already present AccountJournalID=" + journalId); } } //checks using (SqlCommand cmd = new SqlCommand(@" SELECT tblAccountJournalType.ChartOfAccountID_Debit, tblAccountJournalType.ChartOfAccountID_Credit FROM tblAccountJournal INNER JOIN tblAccountJournalType ON tblAccountJournal.AccountJournalTypeID = tblAccountJournalType.AccountJournalTypeID WHERE (((tblAccountJournal.AccountJournalID)=@journalId)); ", conn)) { cmd.Parameters.AddWithValue("@journalId", journalId); using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { // debit check if (reader.IsDBNull(0)) { if (debitAccountId == 0) { throw new Exception("Debit Account ID required, default not set for journal type"); } } else { defaultDebit = reader.GetInt32(0); if (debitAccountId == 0) { debitAccountId = defaultDebit; } else if (debitAccountId != defaultDebit) { throw new Exception("Debit Account ID supplied does not match default set for journal type"); } } // credit check if (reader.IsDBNull(1)) { if (creditAccountId == 0) { throw new Exception("Credit Account ID required, default not set for journal type"); } } else { defaultCredit = reader.GetInt32(1); if (creditAccountId == 0) { creditAccountId = defaultCredit; } else if (creditAccountId != defaultCredit) { throw new Exception("Credit Account ID supplied does not match default set for journal type"); } } } else { throw new Exception("AccountJournalID '" + journalId + "' does not exist."); } } } // currency conversion if (currencyCode != "GBP") { amount = new Data.Database.Account.Currency().CurrencyConvertToGbp(currencyCode, amount, entryDate); } // ensure decimal is rounded amount = Math.Round(amount, 2); // insert debit post using (SqlCommand cmd = new SqlCommand(@" INSERT INTO tblAccountJournalPost (AccountJournalID, AccountChartOfID, AmountGbp) VALUES (@AccountJournalId, @AccountChartOfId, @AmountGbp) ", conn)) { // add parameters cmd.Parameters.AddWithValue("@AccountJournalId", journalId); cmd.Parameters.AddWithValue("@AccountChartOfId", debitAccountId); cmd.Parameters.AddWithValue("@AmountGbp", amount); cmd.ExecuteNonQuery(); } // insert credit post using (SqlCommand cmd = new SqlCommand(@" INSERT INTO tblAccountJournalPost (AccountJournalID, AccountChartOfID, AmountGbp) VALUES (@AccountJournalId, @AccountChartOfId, @AmountGbp) ", conn)) { // add parameters cmd.Parameters.AddWithValue("@AccountJournalId", journalId); cmd.Parameters.AddWithValue("@AccountChartOfId", creditAccountId); cmd.Parameters.AddWithValue("@AmountGbp", (amount * -1)); cmd.ExecuteNonQuery(); } scope.Complete(); return true; } } } }