diff --git a/COA.EnterpriseServices.Creditor/CreditorController.cs b/COA.EnterpriseServices.Creditor/CreditorController.cs index f5f6669..c8e283d 100644 --- a/COA.EnterpriseServices.Creditor/CreditorController.cs +++ b/COA.EnterpriseServices.Creditor/CreditorController.cs @@ -23,5 +23,12 @@ namespace COA.EnterpriseServices.Creditor { return creditorHelper.SetCreditorStatus(creditorId, status); } + + public void AddOfferResponse() + { + // just a stub until we add actual DataObjects + + creditorHelper.SetOriginalCreditorAsPrimary(1); + } } } diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs index f7dbf16..c4ac027 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/EntityDataAccess.cs @@ -34,20 +34,6 @@ namespace COA.EnterpriseServices.DataAccess.EntityFramework return true; } - public bool Update(int id, Action update) - { - using (var context = new QuickBaseContext()) - { - var item = context.Set().FirstOrDefault(e => e.Id == id); - - update(item); - - context.SaveChanges(); - } - - return true; - } - public ICollection Get(Expression> query) { using (var context = new QuickBaseContext()) diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015115918_add-creditor-profile-properties.Designer.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015115918_add-creditor-profile-properties.Designer.cs new file mode 100644 index 0000000..4adf58b --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015115918_add-creditor-profile-properties.Designer.cs @@ -0,0 +1,119 @@ +// +using System; +using COA.EnterpriseServices.DataAccess.EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + [DbContext(typeof(QuickBaseContext))] + [Migration("20201015115918_add-creditor-profile-properties")] + partial class addcreditorprofileproperties + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Address") + .HasColumnType("nvarchar(max)"); + + b.Property("City") + .HasColumnType("nvarchar(max)"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Email") + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.Property("Phone") + .HasColumnType("bigint"); + + b.Property("State") + .HasColumnType("nvarchar(max)"); + + b.Property("Zip") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.Creditor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClientFirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientLastName") + .HasColumnType("nvarchar(max)"); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("CurrentCreditorProfileId") + .HasColumnType("int"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.Property("OriginalCreditorProfileId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Creditors"); + }); + + modelBuilder.Entity("COA.EnterpriseServices.DataAccess.Entities.SettlementAttempt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Created") + .HasColumnType("datetime2"); + + b.Property("Modified") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("SettlementAttempts"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015115918_add-creditor-profile-properties.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015115918_add-creditor-profile-properties.cs new file mode 100644 index 0000000..ce15316 --- /dev/null +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/20201015115918_add-creditor-profile-properties.cs @@ -0,0 +1,33 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations +{ + public partial class addcreditorprofileproperties : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CurrentCreditorProfileId", + table: "Creditors", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "OriginalCreditorProfileId", + table: "Creditors", + nullable: false, + defaultValue: 0); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "CurrentCreditorProfileId", + table: "Creditors"); + + migrationBuilder.DropColumn( + name: "OriginalCreditorProfileId", + table: "Creditors"); + } + } +} diff --git a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs index df583ee..44734ed 100644 --- a/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs +++ b/COA.EnterpriseServices.DataAccess.EntityFramework/Migrations/QuickBaseContextModelSnapshot.cs @@ -77,9 +77,15 @@ namespace COA.EnterpriseServices.DataAccess.EntityFramework.Migrations b.Property("Created") .HasColumnType("datetime2"); + b.Property("CurrentCreditorProfileId") + .HasColumnType("int"); + b.Property("Modified") .HasColumnType("datetime2"); + b.Property("OriginalCreditorProfileId") + .HasColumnType("int"); + b.Property("Status") .HasColumnType("nvarchar(max)"); diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs index 10552e6..77b197b 100644 --- a/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs +++ b/COA.EnterpriseServices.DataAccess.QuickBase/FieldMapRegistry.cs @@ -21,6 +21,8 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase AddFieldMap(c => c.Status, 10); AddFieldMap(c => c.ClientFirstName, 20); AddFieldMap(c => c.ClientLastName, 21); + AddFieldMap(c => c.CurrentCreditorProfileId, 90); + AddFieldMap(c => c.OriginalCreditorProfileId, 91); AddFieldMap(c => c.Id, 1); AddFieldMap(c => c.Created, 2); diff --git a/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs b/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs index 091bd60..0c8bc7e 100644 --- a/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs +++ b/COA.EnterpriseServices.DataAccess.QuickBase/QuickBaseDataAccess.cs @@ -17,11 +17,8 @@ namespace COA.EnterpriseServices.DataAccess.QuickBase public bool Update(T item) { - return true; - } + var fieldData = GetFieldData(item); - public bool Update(int id, Action update) - { return true; } diff --git a/COA.EnterpriseServices.DataAccess/DataAccessManager.cs b/COA.EnterpriseServices.DataAccess/DataAccessManager.cs index d6ba219..22bfdfe 100644 --- a/COA.EnterpriseServices.DataAccess/DataAccessManager.cs +++ b/COA.EnterpriseServices.DataAccess/DataAccessManager.cs @@ -1,9 +1,14 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; namespace COA.EnterpriseServices.DataAccess { + /// + /// Provides a wrapper around as well as additional convenience CRUD methods + /// + /// public class DataAccessManager where T : class, IRecord { private static readonly IDictionary enabledDataAccess = new Dictionary @@ -29,7 +34,47 @@ namespace COA.EnterpriseServices.DataAccess #endregion }; - public TResult Invoke(Func, TResult> func) + public bool Add(T item) + { + return Invoke(d => d.Add(item)); + } + + public bool Update(T item) + { + item.Modified = DateTime.Now; + + return Invoke(d => d.Update(item)); + } + + public bool Update(int id, Action update) + { + var item = Get(id); + + update(item); + + return Update(item); + } + + public T Get(int id) + { + var item = Invoke(d => d.Get(i => i.Id == id)); + + if (item != null && item.Any()) + { + return item.FirstOrDefault(); + } + + return default; + } + + public ICollection Get(Expression> query) + { + return Invoke(d => d.Get(query)); + } + + #region Private Methods + + private TResult Invoke(Func, TResult> func) { var results = new List(); var dataAccessInstances = GetEnabledDataAccess(); @@ -59,6 +104,8 @@ namespace COA.EnterpriseServices.DataAccess .OrderBy(i => i.Type.Name.StartsWith("QuickBase", StringComparison.OrdinalIgnoreCase)) .Select(i => i.Instance) .ToList(); - } + } + + #endregion } } diff --git a/COA.EnterpriseServices.DataAccess/Entities/Creditor.cs b/COA.EnterpriseServices.DataAccess/Entities/Creditor.cs index 8640257..161780b 100644 --- a/COA.EnterpriseServices.DataAccess/Entities/Creditor.cs +++ b/COA.EnterpriseServices.DataAccess/Entities/Creditor.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Text; namespace COA.EnterpriseServices.DataAccess.Entities { @@ -12,5 +10,7 @@ namespace COA.EnterpriseServices.DataAccess.Entities public string Status { get; set; } public string ClientFirstName { get; set; } public string ClientLastName { get; set; } + public int CurrentCreditorProfileId { get; set; } + public int OriginalCreditorProfileId { get; set; } } } diff --git a/COA.EnterpriseServices.DataAccess/Helpers/BaseHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/BaseHelper.cs deleted file mode 100644 index d828da5..0000000 --- a/COA.EnterpriseServices.DataAccess/Helpers/BaseHelper.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Linq; - -namespace COA.EnterpriseServices.DataAccess.Helpers -{ - public class BaseHelper where T : class, IRecord - { - protected DataAccessManager DataAccessManager { get; } = Dependencies.Container.GetInstance>(); - - public virtual T Get(int id) => DataAccessManager.Invoke(d => d.Get(i => i.Id == id).FirstOrDefault()); - - public virtual bool Add(T item) => DataAccessManager.Invoke(d => d.Add(item)); - } -} diff --git a/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs index d6fc136..2d325fe 100644 --- a/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs +++ b/COA.EnterpriseServices.DataAccess/Helpers/ClientHelper.cs @@ -3,11 +3,18 @@ using System.Collections.Generic; namespace COA.EnterpriseServices.DataAccess.Helpers { - public class ClientHelper : BaseHelper + public class ClientHelper { + private readonly DataAccessManager clientDataAccess; + + public ClientHelper(DataAccessManager clientDataAccess) + { + this.clientDataAccess = clientDataAccess; + } + public ICollection FindByEmail(string email) { - return DataAccessManager.Invoke(d => d.Get(c => c.Email.Equals(email))); + return clientDataAccess.Get(c => c.Email.Equals(email)); } } } diff --git a/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs b/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs index f15c742..f4ffe4d 100644 --- a/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs +++ b/COA.EnterpriseServices.DataAccess/Helpers/CreditorHelper.cs @@ -1,11 +1,8 @@ using COA.EnterpriseServices.DataAccess.Entities; using System.Collections.Generic; -using System.Linq; namespace COA.EnterpriseServices.DataAccess.Helpers { - // NOTE: This example does NOT use BaseHelper<> if you wish to manage it yourself - // It allows for multiple DataAccessManagers to be used however needed by the helper public class CreditorHelper { private readonly DataAccessManager creditorDataAccess; @@ -19,32 +16,41 @@ namespace COA.EnterpriseServices.DataAccess.Helpers public Creditor GetCreditor(int id) { - return creditorDataAccess.Invoke(d => d.Get(d => d.Id == id)?.FirstOrDefault()); + return creditorDataAccess.Get(id); } public SettlementAttempt GetSettlementAttempt(int id) { - return settlementAttemptDataAccess.Invoke(d => d.Get(d => d.Id == id)?.FirstOrDefault()); + return settlementAttemptDataAccess.Get(id); } public ICollection FindByName(string name) { - return creditorDataAccess.Invoke(d => d.Get(c => c.ClientFirstName.Contains(name) || c.ClientLastName.Contains(name))); + return creditorDataAccess.Get(c => c.ClientFirstName.Contains(name) || c.ClientLastName.Contains(name)); } public ICollection FindByStatus(string status) { - return creditorDataAccess.Invoke(d => d.Get(c => c.Status == status)); + return creditorDataAccess.Get(c => c.Status == status); } public bool AddCreditor(Creditor creditor) { - return creditorDataAccess.Invoke(d => d.Add(creditor)); + return creditorDataAccess.Add(creditor); } public bool SetCreditorStatus(int creditorId, string status) { - return creditorDataAccess.Invoke(d => d.Update(creditorId, c => c.Status = status)); + return creditorDataAccess.Update(creditorId, c => c.Status = status); + } + + public void SetOriginalCreditorAsPrimary(int creditorId) + { + var creditor = creditorDataAccess.Get(creditorId); + + creditor.CurrentCreditorProfileId = creditor.OriginalCreditorProfileId; + + creditorDataAccess.Update(creditor); } } } diff --git a/COA.EnterpriseServices.DataAccess/IDataAccess.cs b/COA.EnterpriseServices.DataAccess/IDataAccess.cs index 3766af6..6c0f11a 100644 --- a/COA.EnterpriseServices.DataAccess/IDataAccess.cs +++ b/COA.EnterpriseServices.DataAccess/IDataAccess.cs @@ -10,8 +10,6 @@ namespace COA.EnterpriseServices.DataAccess bool Update(T item); - bool Update(int id, Action update); - ICollection Get(Expression> query); } } diff --git a/COA.EnterpriseServices.Sandbox/Program.cs b/COA.EnterpriseServices.Sandbox/Program.cs index 8d3c8af..57a2def 100644 --- a/COA.EnterpriseServices.Sandbox/Program.cs +++ b/COA.EnterpriseServices.Sandbox/Program.cs @@ -11,10 +11,10 @@ namespace COA.EnterpriseServices.Sandbox { var creditorController = Dependencies.Container.GetInstance(); - Console.WriteLine(creditorController.GetCreditorStatus(1)); - - Console.WriteLine(creditorController.SetCreditorStatus(1, "Active")); + //Console.WriteLine(creditorController.GetCreditorStatus(1)); + //Console.WriteLine(creditorController.SetCreditorStatus(1, "Active")); + creditorController.AddOfferResponse(); Console.ReadLine(); }