using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.ComponentModel.Design.ObjectSelectorEditor; namespace bnhtrade.Core.Data.Database.Account { internal class PurchaseInvoice : Connection { private bnhtrade.Core.Data.Database.SqlWhereBuilder sqlBuilder; public List PurchaseInvoiceIdList { get; set; } public PurchaseInvoice() { Init(); } public void Init() { sqlBuilder = new SqlWhereBuilder(); PurchaseInvoiceIdList = new List(); } public Dictionary Read() { var returnList = new Dictionary(); sqlBuilder.Init(); //build sql query string sql = @" SELECT tblPurchase.PurchaseID ,tblPurchase.PurchaseNumber ,tblPurchase.RecordID ,tblPurchase.PurchaseDate ,tblPurchase.ContactID ,tblPurchase.SupplierRef ,tblPurchase.PurchaseTotalAmount ,tblPurchase.VatInclusiveAmounts ,tblPurchase.RecordCreated ,tblPurchase.RecordModified ,tblPurchase.IsActive ,tblAccountCurrency.CurrencyCode ,tblPurchaseChannel.PurchaseChannelName ,tblPurchaseStatus.PurchaseStatus FROM tblPurchase LEFT OUTER JOIN tblAccountCurrency ON tblPurchase.AccountCurrencyID = tblAccountCurrency.AccountCurrencyID LEFT OUTER JOIN tblPurchaseStatus ON tblPurchase.PurchaseStatusID = tblPurchaseStatus.PurchaseStatusID LEFT OUTER JOIN tblPurchaseChannel ON tblPurchase.PurchaseChannelID = tblPurchaseChannel.PurchaseChannelID WHERE 1 = 1 "; // build the where statments if (PurchaseInvoiceIdList.Any()) { sqlBuilder.In("[PurchaseID]", PurchaseInvoiceIdList, "AND"); } // append where string to the sql if (sqlBuilder.IsSetSqlWhereString) { sql = sql + sqlBuilder.SqlWhereString; } // dictionary so we can fill in details afterwards var invoiceContactDict = new Dictionary(); var purchaseIdList = new List(); using (SqlConnection conn = new SqlConnection(SqlConnectionString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand(sql, conn)) { sqlBuilder.AddParametersToSqlCommand(cmd); using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.HasRows) { while (reader.Read()) { int purchaseID = reader.GetInt32(0); int purchaseNumber = reader.GetInt32(1); int? recordID = null; if (!reader.IsDBNull(2)) { recordID = reader.GetInt32(2); } DateTime purchaseDate = DateTime.SpecifyKind(reader.GetDateTime(3), DateTimeKind.Utc); int? contactID = null; if (!reader.IsDBNull(4)) { contactID = reader.GetInt32(4);} string supplierRef = null; if (!reader.IsDBNull(5)) { supplierRef = reader.GetString(5);} decimal? purchaseTotalAmount = null; if (!reader.IsDBNull(6)) { purchaseTotalAmount = reader.GetDecimal(6);} bool vatInclusiveAmounts = reader.GetBoolean(7); DateTime recordCreated = DateTime.SpecifyKind(reader.GetDateTime(8), DateTimeKind.Utc); DateTime recordModified = DateTime.SpecifyKind(reader.GetDateTime(9), DateTimeKind.Utc); bool isActive = reader.GetBoolean(10); string currencyCode = reader.GetString(11); string purchaseChannelName = reader.GetString(12); string purchaseStatus = null; if (!reader.IsDBNull(13)) { purchaseStatus = reader.GetString(13);} var invoice = new Model.Account.PurchaseInvoice(); invoice.PurchaseID = purchaseID; invoice.PurchaseNumber = purchaseNumber; invoice.RecordID = recordID; invoice.PurchaseDate = purchaseDate; invoice.SupplierRef = supplierRef; //invoice.PurchaseTotalAmount = purchaseTotalAmount; invoice.VatInclusiveAmounts = vatInclusiveAmounts; invoice.RecordCreated = recordCreated; invoice.RecordModified = recordModified; invoice.IsActive = isActive; invoice.CurrencyCode = currencyCode; invoice.PurchaseChannel = purchaseChannelName; // is there contact info that needs to be added? if (contactID != null) { invoiceContactDict.Add(purchaseID, (int)contactID); } purchaseIdList.Add(purchaseID); returnList.Add(purchaseID, invoice); } } } } } // add contact info if (invoiceContactDict.Any()) { var readContact = new Data.Database.Account.Contact(); readContact.ContactIdList = invoiceContactDict.Values.ToList(); var contactDict = readContact.Read(); if (contactDict.Any()) { foreach ( var invoice in returnList) { if (invoiceContactDict.ContainsKey(invoice.Value.PurchaseID)) { int contactId = invoiceContactDict[invoice.Value.PurchaseID]; invoice.Value.Contact = contactDict[contactId]; } } } } // add invoice lines var readLines = new Data.Database.Account.PurchaseInvoiceLine(); readLines.InvoiceIdList = purchaseIdList; var lines = readLines.Read(); foreach(var invoice in returnList.Values) { foreach(var line in lines.Values) { if (line.PurchaseId == invoice.PurchaseID) { if (invoice.InvoiceLines == null) { invoice.InvoiceLines = new List(); } invoice.InvoiceLines.Add(line); } } } return returnList; } } }