diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs index c4ac027..ae3c78d 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs @@ -44,5 +44,15 @@ namespace COA.EnterpriseServices.DataAccess.EntityFramework .ToList(); } } + + public ICollection Raw(string command, params object[] parameters) + { + using (var context = new QuickBaseContext()) + { + return context.Set() + .FromSqlRaw(command, parameters) + .ToList(); + } + } } } diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs b/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs index 9ac78f7..e2558ad 100644 --- a/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs +++ b/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs @@ -37,5 +37,11 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase // we'll never get data from QB return null; } + + public ICollection Raw(string command, params object[] parameters) + { + // not supported + return null; + } } } diff --git a/COA.EnterpriseServices.DataAccess/DataAccessManager.cs b/COA.EnterpriseServices.DataAccess/DataAccessManager.cs index 22bfdfe..c9f04c2 100644 --- a/COA.EnterpriseServices.DataAccess/DataAccessManager.cs +++ b/COA.EnterpriseServices.DataAccess/DataAccessManager.cs @@ -5,6 +5,102 @@ using System.Linq.Expressions; namespace COA.EnterpriseServices.DataAccess { + public class DataAccessManager2 + { + private static readonly IDictionary enabledDataAccess = new Dictionary + { + #region Creditor + + ["COA.EnterpriseServices.DataAccess.Entities.Creditor"] = new[] + { + "COA.EnterpriseServices.DataAccess.QuickBase.QuickBaseDataAccess", + "COA.EnterpriseServices.DataAccess.EntityFramework.EntityDataAccess" + }, + + #endregion + + #region Client + + ["COA.EnterpriseServices.DataAccess.Entities.Client"] = new[] + { + "COA.EnterpriseServices.DataAccess.QuickBase.QuickBaseDataAccess", + "COA.EnterpriseServices.DataAccess.EntityFramework.EntityDataAccess" + } + + #endregion + }; + + public ICollection Get(Expression> query) where T : class, IRecord + { + return Invoke>(d => d.Get(query)); + } + + public bool Add(T item) where T : class, IRecord + { + return Invoke(d => d.Add(item)); + } + + public bool Update(T item) where T : class, IRecord + { + item.Modified = DateTime.Now; + + return Invoke(d => d.Update(item)); + } + + public bool Update(int id, Action update) where T : class, IRecord + { + var item = Get(id); + + update(item); + + return Update(item); + } + + public T Get(int id) where T : class, IRecord + { + var item = Get(i => i.Id == id); + + if (item != null && item.Any()) + { + return item.FirstOrDefault(); + } + + return default; + } + + private TResult Invoke(Func, TResult> func) where T : class, IRecord + { + var results = new List(); + var dataAccessInstances = GetEnabledDataAccess(); + + foreach (var dataAccessInstance in dataAccessInstances) + { + results.Add(func(dataAccessInstance)); + } + + // if the "EF" version invokes first, return that value + return results.FirstOrDefault(r => r != null && !r.Equals(default(TResult))); + } + + private ICollection> GetEnabledDataAccess() where T : class, IRecord + { + var type = typeof(T); + + // load data access based on active configuration + return Dependencies.Container + .GetAllInstances>() + .Select(i => new + { + Instance = i, + Type = i.GetType() + }) + .Where(i => enabledDataAccess.ContainsKey(type.FullName) && enabledDataAccess[type.FullName].Any(a => i.Type.FullName.StartsWith(a))) + .OrderBy(i => i.Type.Name.StartsWith("QuickBase", StringComparison.OrdinalIgnoreCase)) + .Select(i => i.Instance) + .ToList(); + } + } + /// /// Provides a wrapper around as well as additional convenience CRUD methods /// diff --git a/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs index 9c4b4a7..26541ee 100644 --- a/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs +++ b/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs @@ -1,15 +1,17 @@ using AutoMapper; +using COA.EnterpriseServices.Creditors; using COA.EnterpriseServices.DataAccess.Entities; +using System.Collections.Generic; namespace COA.EnterpriseServices.DataAccess.Helpers { public class CreditorHelper { - private readonly DataAccessManager creditorDataAccess; - private readonly DataAccessManager settlementAttemptDataAccess; + private readonly DataAccessManager creditorDataAccess; + private readonly DataAccessManager settlementAttemptDataAccess; private readonly IMapper mapper; - public CreditorHelper(DataAccessManager creditorDataAccess, DataAccessManager settlementAttemptDataAccess, IMapper mapper) + public CreditorHelper(DataAccessManager creditorDataAccess, DataAccessManager settlementAttemptDataAccess, IMapper mapper) { this.creditorDataAccess = creditorDataAccess; this.settlementAttemptDataAccess = settlementAttemptDataAccess; @@ -24,9 +26,48 @@ namespace COA.EnterpriseServices.DataAccess.Helpers return mapper.Map(creditor); } - public SettlementAttempt GetSettlementAttempt(int id) + public Creditors.SettlementAttempt GetSettlementAttempt(int id) { - return settlementAttemptDataAccess.Get(id); + var attempt = settlementAttemptDataAccess.Get(id); + + return mapper.Map(attempt); + } + + public ICollection GetSettlements(SettlementAttemptFilter filter) + { + var dal2 = new DataAccessManager2(); + + dal2.Get(c => c.ClientLastName == "Peters"); + + return DBWrapper.ExecuteProcedure(QuickbaseConnectionString, "uspCreditorPortal_SettlementAttemptGet", cmd => + { + if (filter != null) + { + cmd.CommandTimeout = 0; + + cmd.Parameters.AddWithValue("@SettlementAttemptID", filter.SettlementAttemptId); + cmd.Parameters.AddWithValue("@CreditorProfileID", filter.CreditorProfileId); + cmd.Parameters.AddWithValue("@CreditorID", filter.CreditorId); + cmd.Parameters.AddWithValue("@CreditorContactID", filter.CreditorContactId); + cmd.Parameters.AddWithValue("@FirstPaymentDateStart", filter.FirstPaymentDateStart); + cmd.Parameters.AddWithValue("@FirstPaymentDateEnd", filter.FirstPaymentDateEnd); + cmd.Parameters.AddWithValue("@ResponseDateStart", filter.ResponseDateStart); + cmd.Parameters.AddWithValue("@ResponseDateEnd", filter.ResponseDateEnd); + cmd.Parameters.AddWithValue("@PortalSubmissionDateStart", filter.PortalSubmissionDateStart); + cmd.Parameters.AddWithValue("@PortalSubmissionDateEnd", filter.PortalSubmissionDateEnd); + + if (filter.SettlementAttemptIds.AnyAndNotNull()) + { + cmd.Parameters.Add("@SettlementAttemptIDs", SqlDbType.Structured).Value = CreateIdsTable(filter.SettlementAttemptIds); + } + else if (filter.CreditorIds.AnyAndNotNull()) + { + cmd.Parameters.Add("@CreditorIDs", SqlDbType.Structured).Value = CreateIdsTable(filter.CreditorIds); + } + } + + return cmd.ToList(); + }); } public bool AddCreditor(Creditors.Creditor creditor) diff --git a/COA.EnterpriseServices.DataAccess/IDataAccess.cs b/COA.EnterpriseServices.DataAccess/IDataAccess.cs index 6c0f11a..7867653 100644 --- a/COA.EnterpriseServices.DataAccess/IDataAccess.cs +++ b/COA.EnterpriseServices.DataAccess/IDataAccess.cs @@ -6,10 +6,33 @@ namespace COA.EnterpriseServices.DataAccess { public interface IDataAccess where T : class, IRecord { + /// + /// Adds an item of type to the context + /// + /// + /// bool Add(T item); + /// + /// Updates an item of type in the context + /// + /// + /// bool Update(T item); + /// + /// Gets an item collection of type from the context + /// + /// + /// ICollection Get(Expression> query); + + /// + /// Allows support for invoking a raw command if supported by the instance + /// + /// + /// + /// + ICollection Raw(string command, params object[] parameters); } }