diff --git a/OnlineSales.sln b/OnlineSales.sln index 959657af..7a34e43e 100644 --- a/OnlineSales.sln +++ b/OnlineSales.sln @@ -126,6 +126,6 @@ Global $0.DotNetNamingPolicy = $1 $1.DirectoryNamespaceAssociation = PrefixedHierarchical $0.TextStylePolicy = $3 - version = 1.2.22-pre + version = 1.2.23-pre EndGlobalSection EndGlobal diff --git a/plugins/OnlineSales.Plugin.EmailSync/DTOs/ImapAccountDtos.cs b/plugins/OnlineSales.Plugin.EmailSync/DTOs/ImapAccountDtos.cs index 143979eb..af04ba1a 100644 --- a/plugins/OnlineSales.Plugin.EmailSync/DTOs/ImapAccountDtos.cs +++ b/plugins/OnlineSales.Plugin.EmailSync/DTOs/ImapAccountDtos.cs @@ -29,11 +29,11 @@ public class ImapAccountCreateDto : ImapAccountBaseDto public class ImapAccountUpdateDto { - public string? Host { get; set; } = string.Empty; + public string? Host { get; set; } - public string? UserName { get; set; } = string.Empty; + public string? UserName { get; set; } - public string? Password { get; set; } = string.Empty; + public string? Password { get; set; } public int? Port { get; set; } diff --git a/plugins/OnlineSales.Plugin.EmailSync/Migrations/20240229073050_CreatedById.Designer.cs b/plugins/OnlineSales.Plugin.EmailSync/Migrations/20240229073050_CreatedById.Designer.cs new file mode 100644 index 00000000..e704b1d3 --- /dev/null +++ b/plugins/OnlineSales.Plugin.EmailSync/Migrations/20240229073050_CreatedById.Designer.cs @@ -0,0 +1,2952 @@ +// +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using OnlineSales.Entities; +using OnlineSales.Plugin.EmailSync.Data; + +#nullable disable + +namespace OnlineSales.Plugin.EmailSync.Migrations +{ + [DbContext(typeof(EmailSyncDbContext))] + [Migration("20240229073050_CreatedById")] + partial class CreatedById + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("ContactDeal", b => + { + b.Property("ContactsId") + .HasColumnType("integer") + .HasColumnName("contacts_id"); + + b.Property("DealsId") + .HasColumnType("integer") + .HasColumnName("deals_id"); + + b.HasKey("ContactsId", "DealsId") + .HasName("pk_contact_deal"); + + b.HasIndex("DealsId") + .HasDatabaseName("ix_contact_deal_deals_id"); + + b.ToTable("contact_deal", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("text") + .HasColumnName("id"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text") + .HasColumnName("concurrency_stamp"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("name"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_name"); + + b.HasKey("Id") + .HasName("pk_roles"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("roles", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text") + .HasColumnName("claim_type"); + + b.Property("ClaimValue") + .HasColumnType("text") + .HasColumnName("claim_value"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("role_id"); + + b.HasKey("Id") + .HasName("pk_role_claims"); + + b.HasIndex("RoleId") + .HasDatabaseName("ix_role_claims_role_id"); + + b.ToTable("role_claims", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text") + .HasColumnName("claim_type"); + + b.Property("ClaimValue") + .HasColumnType("text") + .HasColumnName("claim_value"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_user_claims"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_user_claims_user_id"); + + b.ToTable("user_claims", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text") + .HasColumnName("login_provider"); + + b.Property("ProviderKey") + .HasColumnType("text") + .HasColumnName("provider_key"); + + b.Property("ProviderDisplayName") + .HasColumnType("text") + .HasColumnName("provider_display_name"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("LoginProvider", "ProviderKey") + .HasName("pk_user_logins"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_user_logins_user_id"); + + b.ToTable("user_logins", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("text") + .HasColumnName("user_id"); + + b.Property("RoleId") + .HasColumnType("text") + .HasColumnName("role_id"); + + b.HasKey("UserId", "RoleId") + .HasName("pk_user_roles"); + + b.HasIndex("RoleId") + .HasDatabaseName("ix_user_roles_role_id"); + + b.ToTable("user_roles", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("text") + .HasColumnName("user_id"); + + b.Property("LoginProvider") + .HasColumnType("text") + .HasColumnName("login_provider"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Value") + .HasColumnType("text") + .HasColumnName("value"); + + b.HasKey("UserId", "LoginProvider", "Name") + .HasName("pk_user_tokens"); + + b.ToTable("user_tokens", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Account", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CityName") + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("EmployeesRange") + .HasColumnType("text") + .HasColumnName("employees_range"); + + b.Property("LogoUrl") + .HasColumnType("text") + .HasColumnName("logo_url"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Revenue") + .HasColumnType("double precision") + .HasColumnName("revenue"); + + b.Property("SiteUrl") + .HasColumnType("text") + .HasColumnName("site_url"); + + b.Property>("SocialMedia") + .HasColumnType("jsonb") + .HasColumnName("social_media"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("State") + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("Tags") + .HasColumnType("jsonb") + .HasColumnName("tags"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_account"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_account_name"); + + b.ToTable("account", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.ChangeLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Data") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("EntityState") + .HasColumnType("integer") + .HasColumnName("entity_state"); + + b.Property("ObjectId") + .HasColumnType("integer") + .HasColumnName("object_id"); + + b.Property("ObjectType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("object_type"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_change_log"); + + b.ToTable("change_log", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.ChangeLogTaskLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChangeLogIdMax") + .HasColumnType("integer") + .HasColumnName("change_log_id_max"); + + b.Property("ChangeLogIdMin") + .HasColumnType("integer") + .HasColumnName("change_log_id_min"); + + b.Property("ChangesProcessed") + .HasColumnType("integer") + .HasColumnName("changes_processed"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Start") + .HasColumnType("timestamp with time zone") + .HasColumnName("start"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("state"); + + b.Property("TaskName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("task_name"); + + b.HasKey("Id") + .HasName("pk_change_log_task_log"); + + b.ToTable("change_log_task_log", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AuthorEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author_email"); + + b.Property("AuthorName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author_name"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body"); + + b.Property("CommentableId") + .HasColumnType("integer") + .HasColumnName("commentable_id"); + + b.Property("CommentableType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("commentable_type"); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text") + .HasColumnName("key"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("ParentId") + .HasColumnType("integer") + .HasColumnName("parent_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_comment"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_comment_contact_id"); + + b.HasIndex("ParentId") + .HasDatabaseName("ix_comment_parent_id"); + + b.ToTable("comment", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("Address1") + .HasColumnType("text") + .HasColumnName("address1"); + + b.Property("Address2") + .HasColumnType("text") + .HasColumnName("address2"); + + b.Property("Birthday") + .HasColumnType("timestamp with time zone") + .HasColumnName("birthday"); + + b.Property("CityName") + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("CompanyName") + .HasColumnType("text") + .HasColumnName("company_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Department") + .HasColumnType("text") + .HasColumnName("department"); + + b.Property("DomainId") + .HasColumnType("integer") + .HasColumnName("domain_id"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text") + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnType("text") + .HasColumnName("first_name"); + + b.Property("JobTitle") + .HasColumnType("text") + .HasColumnName("job_title"); + + b.Property("Language") + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("LastName") + .HasColumnType("text") + .HasColumnName("last_name"); + + b.Property("MiddleName") + .HasColumnType("text") + .HasColumnName("middle_name"); + + b.Property("Phone") + .HasColumnType("text") + .HasColumnName("phone"); + + b.Property("Prefix") + .HasColumnType("text") + .HasColumnName("prefix"); + + b.Property>("SocialMedia") + .HasColumnType("jsonb") + .HasColumnName("social_media"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("State") + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("Timezone") + .HasColumnType("integer") + .HasColumnName("timezone"); + + b.Property("UnsubscribeId") + .HasColumnType("integer") + .HasColumnName("unsubscribe_id"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("Zip") + .HasColumnType("text") + .HasColumnName("zip"); + + b.HasKey("Id") + .HasName("pk_contact"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_contact_account_id"); + + b.HasIndex("DomainId") + .HasDatabaseName("ix_contact_domain_id"); + + b.HasIndex("Email") + .IsUnique() + .HasDatabaseName("ix_contact_email"); + + b.HasIndex("UnsubscribeId") + .HasDatabaseName("ix_contact_unsubscribe_id"); + + b.ToTable("contact", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.ContactEmailSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("ScheduleId") + .HasColumnType("integer") + .HasColumnName("schedule_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_contact_email_schedule"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_contact_email_schedule_contact_id"); + + b.HasIndex("ScheduleId") + .HasDatabaseName("ix_contact_email_schedule_schedule_id"); + + b.ToTable("contact_email_schedule", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Content", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AllowComments") + .HasColumnType("boolean") + .HasColumnName("allow_comments"); + + b.Property("Author") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body"); + + b.Property("Category") + .IsRequired() + .HasColumnType("text") + .HasColumnName("category"); + + b.Property("CoverImageAlt") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cover_image_alt"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cover_image_url"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("PublishedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("published_at"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Tags") + .IsRequired() + .HasColumnType("text[]") + .HasColumnName("tags"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("Type") + .IsRequired() + .HasColumnType("text") + .HasColumnName("type"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_content"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_content_slug"); + + b.ToTable("content", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Deal", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("ActualCloseDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("actual_close_date"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("DealCurrency") + .HasColumnType("text") + .HasColumnName("deal_currency"); + + b.Property("DealPipelineId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_id"); + + b.Property("DealPipelineStageId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_stage_id"); + + b.Property("DealValue") + .HasColumnType("numeric") + .HasColumnName("deal_value"); + + b.Property("ExpectedCloseDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("expected_close_date"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_deal"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_deal_account_id"); + + b.HasIndex("DealPipelineId") + .HasDatabaseName("ix_deal_deal_pipeline_id"); + + b.HasIndex("DealPipelineStageId") + .HasDatabaseName("ix_deal_deal_pipeline_stage_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_deal_user_id"); + + b.ToTable("deal", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipeline", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_deal_pipeline"); + + b.ToTable("deal_pipeline", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipelineStage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("DealPipelineId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Order") + .HasColumnType("integer") + .HasColumnName("order"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_deal_pipeline_stage"); + + b.HasIndex("DealPipelineId") + .HasDatabaseName("ix_deal_pipeline_stage_deal_pipeline_id"); + + b.ToTable("deal_pipeline_stage", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Discount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("OrderId") + .HasColumnType("integer") + .HasColumnName("order_id"); + + b.Property("OrderItemId") + .HasColumnType("integer") + .HasColumnName("order_item_id"); + + b.Property("PromotionId") + .HasColumnType("integer") + .HasColumnName("promotion_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("Value") + .HasColumnType("numeric") + .HasColumnName("value"); + + b.HasKey("Id") + .HasName("pk_discount"); + + b.HasIndex("OrderId") + .HasDatabaseName("ix_discount_order_id"); + + b.HasIndex("OrderItemId") + .IsUnique() + .HasDatabaseName("ix_discount_order_item_id"); + + b.HasIndex("PromotionId") + .HasDatabaseName("ix_discount_promotion_id"); + + b.ToTable("discount", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("AccountStatus") + .HasColumnType("integer") + .HasColumnName("account_status"); + + b.Property("CatchAll") + .HasColumnType("boolean") + .HasColumnName("catch_all"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("Disposable") + .HasColumnType("boolean") + .HasColumnName("disposable"); + + b.Property("DnsCheck") + .HasColumnType("boolean") + .HasColumnName("dns_check"); + + b.Property>("DnsRecords") + .HasColumnType("jsonb") + .HasColumnName("dns_records"); + + b.Property("FaviconUrl") + .HasColumnType("text") + .HasColumnName("favicon_url"); + + b.Property("Free") + .HasColumnType("boolean") + .HasColumnName("free"); + + b.Property("HttpCheck") + .HasColumnType("boolean") + .HasColumnName("http_check"); + + b.Property("MxCheck") + .HasColumnType("boolean") + .HasColumnName("mx_check"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("Url") + .HasColumnType("text") + .HasColumnName("url"); + + b.HasKey("Id") + .HasName("pk_domain"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_domain_account_id"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_domain_name"); + + b.ToTable("domain", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_group"); + + b.ToTable("email_group", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Body") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body"); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("FromEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_email"); + + b.Property("MessageId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_id"); + + b.Property("Recipient") + .IsRequired() + .HasColumnType("text") + .HasColumnName("recipient"); + + b.Property("ScheduleId") + .HasColumnType("integer") + .HasColumnName("schedule_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text") + .HasColumnName("subject"); + + b.Property("TemplateId") + .HasColumnType("integer") + .HasColumnName("template_id"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_log"); + + b.ToTable("email_log", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("GroupId") + .HasColumnType("integer") + .HasColumnName("group_id"); + + b.Property("Schedule") + .IsRequired() + .HasColumnType("text") + .HasColumnName("schedule"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_schedule"); + + b.HasIndex("GroupId") + .HasDatabaseName("ix_email_schedule_group_id"); + + b.ToTable("email_schedule", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BodyTemplate") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body_template"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("EmailGroupId") + .HasColumnType("integer") + .HasColumnName("email_group_id"); + + b.Property("FromEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_email"); + + b.Property("FromName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_name"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("RetryCount") + .HasColumnType("integer") + .HasColumnName("retry_count"); + + b.Property("RetryInterval") + .HasColumnType("integer") + .HasColumnName("retry_interval"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text") + .HasColumnName("subject"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_template"); + + b.HasIndex("EmailGroupId") + .HasDatabaseName("ix_email_template_email_group_id"); + + b.ToTable("email_template", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.File", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Extension") + .IsRequired() + .HasColumnType("text") + .HasColumnName("extension"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("mime_type"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ScopeUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("scope_uid"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("size"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_file"); + + b.ToTable("file", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.IpDetails", b => + { + b.Property("Ip") + .HasColumnType("text") + .HasColumnName("ip"); + + b.Property("CityName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Ip") + .HasName("pk_ip_details"); + + b.HasIndex("Ip") + .IsUnique() + .HasDatabaseName("ix_ip_details_ip"); + + b.ToTable("ip_details", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Link", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Destination") + .IsRequired() + .HasColumnType("text") + .HasColumnName("destination"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("uid"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_link"); + + b.HasIndex("Uid") + .IsUnique() + .HasDatabaseName("ix_link_uid"); + + b.ToTable("link", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.LinkLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Destination") + .IsRequired() + .HasColumnType("text") + .HasColumnName("destination"); + + b.Property("LinkId") + .HasColumnType("integer") + .HasColumnName("link_id"); + + b.Property("Referrer") + .HasColumnType("text") + .HasColumnName("referrer"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_link_log"); + + b.HasIndex("LinkId") + .HasDatabaseName("ix_link_log_link_id"); + + b.ToTable("link_log", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Media", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Extension") + .IsRequired() + .HasColumnType("text") + .HasColumnName("extension"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("mime_type"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ScopeUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("scope_uid"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("size"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_media"); + + b.ToTable("media", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AffiliateName") + .HasColumnType("text") + .HasColumnName("affiliate_name"); + + b.Property("Commission") + .HasColumnType("numeric") + .HasColumnName("commission"); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("ContactIp") + .HasColumnType("text") + .HasColumnName("contact_ip"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("text") + .HasColumnName("currency"); + + b.Property("CurrencyTotal") + .HasColumnType("numeric") + .HasColumnName("currency_total"); + + b.Property("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("ExchangeRate") + .HasColumnType("numeric") + .HasColumnName("exchange_rate"); + + b.Property("OrderNumber") + .HasColumnType("text") + .HasColumnName("order_number"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("quantity"); + + b.Property("RefNo") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ref_no"); + + b.Property("Refund") + .HasColumnType("numeric") + .HasColumnName("refund"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("TestOrder") + .HasColumnType("boolean") + .HasColumnName("test_order"); + + b.Property("Total") + .HasColumnType("numeric") + .HasColumnName("total"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_order"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_order_contact_id"); + + b.HasIndex("RefNo") + .IsUnique() + .HasDatabaseName("ix_order_ref_no"); + + b.ToTable("order", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("text") + .HasColumnName("currency"); + + b.Property("CurrencyTotal") + .HasColumnType("numeric") + .HasColumnName("currency_total"); + + b.Property("OrderId") + .HasColumnType("integer") + .HasColumnName("order_id"); + + b.Property("ProductName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("product_name"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("quantity"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Total") + .HasColumnType("numeric") + .HasColumnName("total"); + + b.Property("UnitPrice") + .HasColumnType("numeric") + .HasColumnName("unit_price"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_order_item"); + + b.HasIndex("OrderId") + .HasDatabaseName("ix_order_item_order_id"); + + b.ToTable("order_item", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Promotion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text") + .HasColumnName("code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("end_date"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("start_date"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_promotion"); + + b.HasIndex("Code") + .IsUnique() + .HasDatabaseName("ix_promotion_code"); + + b.ToTable("promotion", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.TaskExecutionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualExecutionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("actual_execution_time"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment"); + + b.Property("RetryCount") + .HasColumnType("integer") + .HasColumnName("retry_count"); + + b.Property("ScheduledExecutionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("scheduled_execution_time"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("TaskName") + .HasColumnType("text") + .HasColumnName("task_name"); + + b.HasKey("Id") + .HasName("pk_task_execution_log"); + + b.ToTable("task_execution_log", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Unsubscribe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_unsubscribe"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_unsubscribe_contact_id"); + + b.ToTable("unsubscribe", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.User", b => + { + b.Property("Id") + .HasColumnType("text") + .HasColumnName("id"); + + b.Property("AccessFailedCount") + .HasColumnType("integer") + .HasColumnName("access_failed_count"); + + b.Property("AvatarUrl") + .IsRequired() + .HasColumnType("text") + .HasColumnName("avatar_url"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text") + .HasColumnName("concurrency_stamp"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property>("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("display_name"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("email"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean") + .HasColumnName("email_confirmed"); + + b.Property("LastTimeLoggedIn") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_time_logged_in"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean") + .HasColumnName("lockout_enabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("lockout_end"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_email"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_user_name"); + + b.Property("PasswordHash") + .HasColumnType("text") + .HasColumnName("password_hash"); + + b.Property("PhoneNumber") + .HasColumnType("text") + .HasColumnName("phone_number"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean") + .HasColumnName("phone_number_confirmed"); + + b.Property("SecurityStamp") + .HasColumnType("text") + .HasColumnName("security_stamp"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean") + .HasColumnName("two_factor_enabled"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("users", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Plugin.EmailSync.Entities.ImapAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Host") + .IsRequired() + .HasColumnType("text") + .HasColumnName("host"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text") + .HasColumnName("password"); + + b.Property("Port") + .HasColumnType("integer") + .HasColumnName("port"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("UseSsl") + .HasColumnType("boolean") + .HasColumnName("use_ssl"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("pk_imap_account"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_imap_account_user_id"); + + b.HasIndex("Host", "UserName") + .IsUnique() + .HasDatabaseName("ix_imap_account_host_user_name"); + + b.ToTable("imap_account", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Plugin.EmailSync.Entities.ImapAccountFolder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("FullName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("full_name"); + + b.Property("ImapAccountId") + .HasColumnType("integer") + .HasColumnName("imap_account_id"); + + b.Property("LastUid") + .HasColumnType("integer") + .HasColumnName("last_uid"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_imap_account_folder"); + + b.HasIndex("ImapAccountId") + .HasDatabaseName("ix_imap_account_folder_imap_account_id"); + + b.ToTable("imap_account_folder", (string)null); + }); + + modelBuilder.Entity("ContactDeal", b => + { + b.HasOne("OnlineSales.Entities.Contact", null) + .WithMany() + .HasForeignKey("ContactsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_deal_contact_contacts_id"); + + b.HasOne("OnlineSales.Entities.Deal", null) + .WithMany() + .HasForeignKey("DealsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_deal_deal_deals_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_role_claims_roles_role_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_claims_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_logins_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_roles_roles_role_id"); + + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_roles_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_tokens_users_user_id"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Comment", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_comment_contact_contact_id"); + + b.HasOne("OnlineSales.Entities.Comment", "Parent") + .WithMany() + .HasForeignKey("ParentId") + .HasConstraintName("fk_comment_comment_parent_id"); + + b.Navigation("Contact"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Contacts") + .HasForeignKey("AccountId") + .OnDelete(DeleteBehavior.Restrict) + .HasConstraintName("fk_contact_account_account_id"); + + b.HasOne("OnlineSales.Entities.Domain", "Domain") + .WithMany("Contacts") + .HasForeignKey("DomainId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired() + .HasConstraintName("fk_contact_domain_domain_id"); + + b.HasOne("OnlineSales.Entities.Unsubscribe", "Unsubscribe") + .WithMany() + .HasForeignKey("UnsubscribeId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("fk_contact_unsubscribe_unsubscribe_id"); + + b.Navigation("Account"); + + b.Navigation("Domain"); + + b.Navigation("Unsubscribe"); + }); + + modelBuilder.Entity("OnlineSales.Entities.ContactEmailSchedule", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_email_schedule_contact_contact_id"); + + b.HasOne("OnlineSales.Entities.EmailSchedule", "Schedule") + .WithMany() + .HasForeignKey("ScheduleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_email_schedule_email_schedule_schedule_id"); + + b.Navigation("Contact"); + + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Deal", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Deals") + .HasForeignKey("AccountId") + .HasConstraintName("fk_deal_account_account_id"); + + b.HasOne("OnlineSales.Entities.DealPipeline", "DealPipeline") + .WithMany() + .HasForeignKey("DealPipelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_deal_pipeline_deal_pipeline_id"); + + b.HasOne("OnlineSales.Entities.DealPipelineStage", "DealPipelineStage") + .WithMany() + .HasForeignKey("DealPipelineStageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_deal_pipeline_stage_deal_pipeline_stage_id"); + + b.HasOne("OnlineSales.Entities.User", "CreatedBy") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_users_user_id"); + + b.Navigation("Account"); + + b.Navigation("CreatedBy"); + + b.Navigation("DealPipeline"); + + b.Navigation("DealPipelineStage"); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipelineStage", b => + { + b.HasOne("OnlineSales.Entities.DealPipeline", "DealPipeline") + .WithMany("PipelineStages") + .HasForeignKey("DealPipelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_pipeline_stage_deal_pipeline_deal_pipeline_id"); + + b.Navigation("DealPipeline"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Discount", b => + { + b.HasOne("OnlineSales.Entities.Order", "Order") + .WithMany("Discounts") + .HasForeignKey("OrderId") + .HasConstraintName("fk_discount_order_order_id"); + + b.HasOne("OnlineSales.Entities.OrderItem", "OrderItem") + .WithOne("Discount") + .HasForeignKey("OnlineSales.Entities.Discount", "OrderItemId") + .HasConstraintName("fk_discount_order_item_order_item_id"); + + b.HasOne("OnlineSales.Entities.Promotion", "Promotion") + .WithMany() + .HasForeignKey("PromotionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_discount_promotion_promotion_id"); + + b.Navigation("Order"); + + b.Navigation("OrderItem"); + + b.Navigation("Promotion"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Domains") + .HasForeignKey("AccountId") + .OnDelete(DeleteBehavior.Restrict) + .HasConstraintName("fk_domain_account_account_id"); + + b.Navigation("Account"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailSchedule", b => + { + b.HasOne("OnlineSales.Entities.EmailGroup", "Group") + .WithMany() + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_email_schedule_email_group_group_id"); + + b.Navigation("Group"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailTemplate", b => + { + b.HasOne("OnlineSales.Entities.EmailGroup", "EmailGroup") + .WithMany("EmailTemplates") + .HasForeignKey("EmailGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_email_template_email_group_email_group_id"); + + b.Navigation("EmailGroup"); + }); + + modelBuilder.Entity("OnlineSales.Entities.LinkLog", b => + { + b.HasOne("OnlineSales.Entities.Link", "Link") + .WithMany() + .HasForeignKey("LinkId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_link_log_link_link_id"); + + b.Navigation("Link"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany("Orders") + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_order_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.HasOne("OnlineSales.Entities.Order", "Order") + .WithMany("OrderItems") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_order_item_order_order_id"); + + b.Navigation("Order"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Unsubscribe", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .HasConstraintName("fk_unsubscribe_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Plugin.EmailSync.Entities.ImapAccount", b => + { + b.HasOne("OnlineSales.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_imap_account_users_user_id"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OnlineSales.Plugin.EmailSync.Entities.ImapAccountFolder", b => + { + b.HasOne("OnlineSales.Plugin.EmailSync.Entities.ImapAccount", "ImapAccount") + .WithMany() + .HasForeignKey("ImapAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_imap_account_folder_imap_account_imap_account_id"); + + b.Navigation("ImapAccount"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Account", b => + { + b.Navigation("Contacts"); + + b.Navigation("Deals"); + + b.Navigation("Domains"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipeline", b => + { + b.Navigation("PipelineStages"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.Navigation("Contacts"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailGroup", b => + { + b.Navigation("EmailTemplates"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.Navigation("Discounts"); + + b.Navigation("OrderItems"); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.Navigation("Discount"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/plugins/OnlineSales.Plugin.EmailSync/Migrations/20240229073050_CreatedById.cs b/plugins/OnlineSales.Plugin.EmailSync/Migrations/20240229073050_CreatedById.cs new file mode 100644 index 00000000..a532f78c --- /dev/null +++ b/plugins/OnlineSales.Plugin.EmailSync/Migrations/20240229073050_CreatedById.cs @@ -0,0 +1,58 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace OnlineSales.Plugin.EmailSync.Migrations +{ + /// + public partial class CreatedById : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "created_by_id", + table: "imap_account_folder", + type: "text", + nullable: true); + + migrationBuilder.AddColumn( + name: "updated_by_id", + table: "imap_account_folder", + type: "text", + nullable: true); + + migrationBuilder.AddColumn( + name: "created_by_id", + table: "imap_account", + type: "text", + nullable: true); + + migrationBuilder.AddColumn( + name: "updated_by_id", + table: "imap_account", + type: "text", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "created_by_id", + table: "imap_account_folder"); + + migrationBuilder.DropColumn( + name: "updated_by_id", + table: "imap_account_folder"); + + migrationBuilder.DropColumn( + name: "created_by_id", + table: "imap_account"); + + migrationBuilder.DropColumn( + name: "updated_by_id", + table: "imap_account"); + } + } +} diff --git a/plugins/OnlineSales.Plugin.EmailSync/Migrations/EmailSyncDbContextModelSnapshot.cs b/plugins/OnlineSales.Plugin.EmailSync/Migrations/EmailSyncDbContextModelSnapshot.cs index 6e341492..36e6c5ce 100644 --- a/plugins/OnlineSales.Plugin.EmailSync/Migrations/EmailSyncDbContextModelSnapshot.cs +++ b/plugins/OnlineSales.Plugin.EmailSync/Migrations/EmailSyncDbContextModelSnapshot.cs @@ -19,11 +19,30 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("ProductVersion", "7.0.9") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + modelBuilder.Entity("ContactDeal", b => + { + b.Property("ContactsId") + .HasColumnType("integer") + .HasColumnName("contacts_id"); + + b.Property("DealsId") + .HasColumnType("integer") + .HasColumnName("deals_id"); + + b.HasKey("ContactsId", "DealsId") + .HasName("pk_contact_deal"); + + b.HasIndex("DealsId") + .HasDatabaseName("ix_contact_deal_deals_id"); + + b.ToTable("contact_deal", (string)null); + }); + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => { b.Property("Id") @@ -231,6 +250,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -284,6 +307,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -424,18 +451,27 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("text") .HasColumnName("body"); - b.Property("ContactId") + b.Property("CommentableId") .HasColumnType("integer") - .HasColumnName("contact_id"); + .HasColumnName("commentable_id"); + + b.Property("CommentableType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("commentable_type"); - b.Property("ContentId") + b.Property("ContactId") .HasColumnType("integer") - .HasColumnName("content_id"); + .HasColumnName("contact_id"); b.Property("CreatedAt") .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -470,6 +506,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -484,9 +524,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ContactId") .HasDatabaseName("ix_comment_contact_id"); - b.HasIndex("ContentId") - .HasDatabaseName("ix_comment_content_id"); - b.HasIndex("ParentId") .HasDatabaseName("ix_comment_parent_id"); @@ -541,6 +578,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -614,6 +655,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -665,6 +710,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -689,6 +738,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -754,6 +807,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -772,6 +829,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("text") .HasColumnName("language"); + b.Property("PublishedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("published_at"); + b.Property("Slug") .IsRequired() .HasColumnType("text") @@ -800,6 +861,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -815,7 +880,315 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsUnique() .HasDatabaseName("ix_content_slug"); - b.ToTable("content", null, t => + b.ToTable("content", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Deal", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("ActualCloseDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("actual_close_date"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("DealCurrency") + .HasColumnType("text") + .HasColumnName("deal_currency"); + + b.Property("DealPipelineId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_id"); + + b.Property("DealPipelineStageId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_stage_id"); + + b.Property("DealValue") + .HasColumnType("numeric") + .HasColumnName("deal_value"); + + b.Property("ExpectedCloseDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("expected_close_date"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_deal"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_deal_account_id"); + + b.HasIndex("DealPipelineId") + .HasDatabaseName("ix_deal_deal_pipeline_id"); + + b.HasIndex("DealPipelineStageId") + .HasDatabaseName("ix_deal_deal_pipeline_stage_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_deal_user_id"); + + b.ToTable("deal", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipeline", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_deal_pipeline"); + + b.ToTable("deal_pipeline", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipelineStage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("DealPipelineId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Order") + .HasColumnType("integer") + .HasColumnName("order"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_deal_pipeline_stage"); + + b.HasIndex("DealPipelineId") + .HasDatabaseName("ix_deal_pipeline_stage_deal_pipeline_id"); + + b.ToTable("deal_pipeline_stage", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + + modelBuilder.Entity("OnlineSales.Entities.Discount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("OrderId") + .HasColumnType("integer") + .HasColumnName("order_id"); + + b.Property("OrderItemId") + .HasColumnType("integer") + .HasColumnName("order_item_id"); + + b.Property("PromotionId") + .HasColumnType("integer") + .HasColumnName("promotion_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("Value") + .HasColumnType("numeric") + .HasColumnName("value"); + + b.HasKey("Id") + .HasName("pk_discount"); + + b.HasIndex("OrderId") + .HasDatabaseName("ix_discount_order_id"); + + b.HasIndex("OrderItemId") + .IsUnique() + .HasDatabaseName("ix_discount_order_item_id"); + + b.HasIndex("PromotionId") + .HasDatabaseName("ix_discount_promotion_id"); + + b.ToTable("discount", null, t => { t.ExcludeFromMigrations(); }); @@ -928,6 +1301,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -954,6 +1331,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -993,6 +1374,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1041,6 +1426,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -1071,6 +1460,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1096,6 +1489,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -1134,6 +1531,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1187,6 +1588,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -1207,6 +1612,89 @@ protected override void BuildModel(ModelBuilder modelBuilder) }); }); + modelBuilder.Entity("OnlineSales.Entities.File", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Extension") + .IsRequired() + .HasColumnType("text") + .HasColumnName("extension"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("mime_type"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ScopeUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("scope_uid"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("size"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_file"); + + b.ToTable("file", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + modelBuilder.Entity("OnlineSales.Entities.IpDetails", b => { b.Property("Ip") @@ -1260,6 +1748,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1291,6 +1783,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -1325,6 +1821,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1375,6 +1875,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1420,6 +1924,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -1450,6 +1958,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("text") .HasColumnName("affiliate_name"); + b.Property("Commission") + .HasColumnType("numeric") + .HasColumnName("commission"); + b.Property("ContactId") .HasColumnType("integer") .HasColumnName("contact_id"); @@ -1462,6 +1974,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1500,6 +2016,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("text") .HasColumnName("ref_no"); + b.Property("Refund") + .HasColumnType("numeric") + .HasColumnName("refund"); + b.Property("Source") .HasColumnType("text") .HasColumnName("source"); @@ -1516,6 +2036,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -1553,6 +2077,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1570,11 +2098,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("numeric") .HasColumnName("currency_total"); - b.Property("LicenseCode") - .IsRequired() - .HasColumnType("text") - .HasColumnName("license_code"); - b.Property("OrderId") .HasColumnType("integer") .HasColumnName("order_id"); @@ -1604,6 +2127,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -1624,6 +2151,82 @@ protected override void BuildModel(ModelBuilder modelBuilder) }); }); + modelBuilder.Entity("OnlineSales.Entities.Promotion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text") + .HasColumnName("code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("end_date"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("start_date"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_promotion"); + + b.HasIndex("Code") + .IsUnique() + .HasDatabaseName("ix_promotion_code"); + + b.ToTable("promotion", null, t => + { + t.ExcludeFromMigrations(); + }); + }); + modelBuilder.Entity("OnlineSales.Entities.TaskExecutionLog", b => { b.Property("Id") @@ -1687,6 +2290,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1740,6 +2347,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property>("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + b.Property("DisplayName") .IsRequired() .HasColumnType("text") @@ -1830,6 +2441,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1860,6 +2475,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -1908,6 +2527,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + b.Property("CreatedByIp") .HasColumnType("text") .HasColumnName("created_by_ip"); @@ -1937,6 +2560,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + b.Property("UpdatedByIp") .HasColumnType("text") .HasColumnName("updated_by_ip"); @@ -1954,6 +2581,23 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("imap_account_folder", (string)null); }); + modelBuilder.Entity("ContactDeal", b => + { + b.HasOne("OnlineSales.Entities.Contact", null) + .WithMany() + .HasForeignKey("ContactsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_deal_contact_contacts_id"); + + b.HasOne("OnlineSales.Entities.Deal", null) + .WithMany() + .HasForeignKey("DealsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_deal_deal_deals_id"); + }); + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) @@ -2020,13 +2664,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasConstraintName("fk_comment_contact_contact_id"); - b.HasOne("OnlineSales.Entities.Content", "Content") - .WithMany("Comments") - .HasForeignKey("ContentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_comment_content_content_id"); - b.HasOne("OnlineSales.Entities.Comment", "Parent") .WithMany() .HasForeignKey("ParentId") @@ -2034,8 +2671,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Contact"); - b.Navigation("Content"); - b.Navigation("Parent"); }); @@ -2088,6 +2723,81 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Schedule"); }); + modelBuilder.Entity("OnlineSales.Entities.Deal", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Deals") + .HasForeignKey("AccountId") + .HasConstraintName("fk_deal_account_account_id"); + + b.HasOne("OnlineSales.Entities.DealPipeline", "DealPipeline") + .WithMany() + .HasForeignKey("DealPipelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_deal_pipeline_deal_pipeline_id"); + + b.HasOne("OnlineSales.Entities.DealPipelineStage", "DealPipelineStage") + .WithMany() + .HasForeignKey("DealPipelineStageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_deal_pipeline_stage_deal_pipeline_stage_id"); + + b.HasOne("OnlineSales.Entities.User", "CreatedBy") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_users_user_id"); + + b.Navigation("Account"); + + b.Navigation("CreatedBy"); + + b.Navigation("DealPipeline"); + + b.Navigation("DealPipelineStage"); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipelineStage", b => + { + b.HasOne("OnlineSales.Entities.DealPipeline", "DealPipeline") + .WithMany("PipelineStages") + .HasForeignKey("DealPipelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_pipeline_stage_deal_pipeline_deal_pipeline_id"); + + b.Navigation("DealPipeline"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Discount", b => + { + b.HasOne("OnlineSales.Entities.Order", "Order") + .WithMany("Discounts") + .HasForeignKey("OrderId") + .HasConstraintName("fk_discount_order_order_id"); + + b.HasOne("OnlineSales.Entities.OrderItem", "OrderItem") + .WithOne("Discount") + .HasForeignKey("OnlineSales.Entities.Discount", "OrderItemId") + .HasConstraintName("fk_discount_order_item_order_item_id"); + + b.HasOne("OnlineSales.Entities.Promotion", "Promotion") + .WithMany() + .HasForeignKey("PromotionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_discount_promotion_promotion_id"); + + b.Navigation("Order"); + + b.Navigation("OrderItem"); + + b.Navigation("Promotion"); + }); + modelBuilder.Entity("OnlineSales.Entities.Domain", b => { b.HasOne("OnlineSales.Entities.Account", "Account") @@ -2197,6 +2907,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Navigation("Contacts"); + b.Navigation("Deals"); + b.Navigation("Domains"); }); @@ -2205,9 +2917,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Orders"); }); - modelBuilder.Entity("OnlineSales.Entities.Content", b => + modelBuilder.Entity("OnlineSales.Entities.DealPipeline", b => { - b.Navigation("Comments"); + b.Navigation("PipelineStages"); }); modelBuilder.Entity("OnlineSales.Entities.Domain", b => @@ -2222,8 +2934,15 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("OnlineSales.Entities.Order", b => { + b.Navigation("Discounts"); + b.Navigation("OrderItems"); }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.Navigation("Discount"); + }); #pragma warning restore 612, 618 } } diff --git a/plugins/OnlineSales.Plugin.EmailSync/OnlineSales.Plugin.EmailSync.csproj b/plugins/OnlineSales.Plugin.EmailSync/OnlineSales.Plugin.EmailSync.csproj index c0b4700a..992c2059 100644 --- a/plugins/OnlineSales.Plugin.EmailSync/OnlineSales.Plugin.EmailSync.csproj +++ b/plugins/OnlineSales.Plugin.EmailSync/OnlineSales.Plugin.EmailSync.csproj @@ -5,7 +5,7 @@ true enable enable - 1.2.22-pre + 1.2.23-pre true Debug;Release;Migration diff --git a/plugins/OnlineSales.Plugin.EmailSync/Tasks/EmailSyncTask.cs b/plugins/OnlineSales.Plugin.EmailSync/Tasks/EmailSyncTask.cs index 3c026050..bf087752 100644 --- a/plugins/OnlineSales.Plugin.EmailSync/Tasks/EmailSyncTask.cs +++ b/plugins/OnlineSales.Plugin.EmailSync/Tasks/EmailSyncTask.cs @@ -5,6 +5,7 @@ using MailKit; using MailKit.Net.Imap; using MailKit.Search; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using MimeKit; using OnlineSales.Configuration; @@ -30,12 +31,14 @@ public class EmailSyncTask : BaseTask private readonly string[] ignoredEmails; private readonly IDomainService domainService; + private readonly IContactService contactsService; - public EmailSyncTask(IConfiguration configuration, EmailSyncDbContext dbContext, TaskStatusService taskStatusService, IDomainService domainService) + public EmailSyncTask(IConfiguration configuration, EmailSyncDbContext dbContext, TaskStatusService taskStatusService, IDomainService domainService, IContactService contactsService) : base("Tasks:EmailSyncTask", configuration, taskStatusService) { this.dbContext = dbContext; this.domainService = domainService; + this.contactsService = contactsService; var config = configuration.GetSection(configKey)!.Get(); if (config is not null) @@ -56,7 +59,7 @@ public EmailSyncTask(IConfiguration configuration, EmailSyncDbContext dbContext, public override async Task Execute(TaskExecutionLog currentJob) { - var accounts = dbContext.ImapAccounts!.ToList(); + var accounts = dbContext.ImapAccounts!.OrderBy(ia => ia.Id).ToList(); foreach (var imapAccount in accounts) { @@ -165,22 +168,21 @@ private async Task GetEmailLogs(string userName, ImapAccountFolder dbFolder, IMa if (!IsInternalEmails(fromEmail, recipients)) { - var emailLog = new EmailLog() + var from = message.From.Mailboxes.Single().Address; + var status = IsInternalDomain(from) ? EmailStatus.Sent : EmailStatus.Received; + + var emailLog = new EmailLog { Subject = message.Subject == null ? string.Empty : message.Subject, - Recipient = string.Join(";", recipients), - FromEmail = message.From.Mailboxes.Single().Address, - Body = message.HtmlBody, + Recipients = string.Join(";", recipients), + FromEmail = from, + HtmlBody = message.HtmlBody, + TextBody = message.TextBody, MessageId = message.MessageId, Source = userName + " - " + folder.FullName, - Status = EmailStatus.Sent, + Status = status, }; - if (string.IsNullOrEmpty(emailLog.Body)) - { - emailLog.Body = message.TextBody; - } - emailLogs.Add(emailLog); } } @@ -189,6 +191,8 @@ private async Task GetEmailLogs(string userName, ImapAccountFolder dbFolder, IMa if (emailLogs.Count > 0) { + await EnrichWithContactIdAsync(emailLogs); + await dbContext.EmailLogs!.AddRangeAsync(emailLogs); } @@ -197,6 +201,52 @@ private async Task GetEmailLogs(string userName, ImapAccountFolder dbFolder, IMa await dbContext.SaveChangesAsync(); } + private async Task EnrichWithContactIdAsync(List emailLogs) + { + var emails = emailLogs + .SelectMany(emailLog => new[] { emailLog.FromEmail } + .Concat(emailLog.Recipients.Split(';'))) + .Distinct() + .Where(email => !IsInternalDomain(email) && !ignoredEmails.Contains(email)) + .ToList(); + + var existingContacts = await dbContext.Contacts! + .Where(contact => emails.Contains(contact.Email)) + .ToDictionaryAsync(contact => contact.Email, contact => contact); + + var newContacts = new List(); + + foreach (var emailLog in emailLogs) + { + if (emailLog.ContactId > 0) + { + continue; + } + + var participants = new List { emailLog.FromEmail }; + participants.AddRange(emailLog.Recipients.Split(';')); + var contactEmail = participants.FirstOrDefault(email => !IsInternalDomain(email) && !ignoredEmails.Contains(email)); + + if (string.IsNullOrEmpty(contactEmail)) + { + continue; + } + + Contact? contact; + + if (!existingContacts.TryGetValue(contactEmail, out contact)) + { + contact = new Contact { Email = contactEmail }; + newContacts.Add(contact); + existingContacts[contact.Email] = contact; + } + + emailLog.Contact = contact; + } + + await contactsService.SaveRangeAsync(newContacts); + } + private bool IsInternalDomain(string email) { return internalDomains.Contains(domainService.GetDomainNameByEmail(email)); diff --git a/plugins/OnlineSales.Plugin.EmailSync/pluginsettings.json b/plugins/OnlineSales.Plugin.EmailSync/pluginsettings.json index b23aebf1..d851cac1 100644 --- a/plugins/OnlineSales.Plugin.EmailSync/pluginsettings.json +++ b/plugins/OnlineSales.Plugin.EmailSync/pluginsettings.json @@ -10,7 +10,7 @@ "CronSchedule": "0/30 * * * * ?", "RetryCount": "2", "RetryInterval": "1", - "BatchSize": "5000" + "BatchSize": "20" } } } \ No newline at end of file diff --git a/plugins/OnlineSales.Plugin.ReverseProxy/OnlineSales.Plugin.ReverseProxy.csproj b/plugins/OnlineSales.Plugin.ReverseProxy/OnlineSales.Plugin.ReverseProxy.csproj index 138def1b..dedb4a64 100644 --- a/plugins/OnlineSales.Plugin.ReverseProxy/OnlineSales.Plugin.ReverseProxy.csproj +++ b/plugins/OnlineSales.Plugin.ReverseProxy/OnlineSales.Plugin.ReverseProxy.csproj @@ -5,7 +5,7 @@ enable true enable - 1.2.22-pre + 1.2.23-pre Release;Debug diff --git a/plugins/OnlineSales.Plugin.SendGrid/OnlineSales.Plugin.SendGrid.csproj b/plugins/OnlineSales.Plugin.SendGrid/OnlineSales.Plugin.SendGrid.csproj index 3e4187e9..407ce0e7 100644 --- a/plugins/OnlineSales.Plugin.SendGrid/OnlineSales.Plugin.SendGrid.csproj +++ b/plugins/OnlineSales.Plugin.SendGrid/OnlineSales.Plugin.SendGrid.csproj @@ -5,7 +5,7 @@ true enable enable - 1.2.22-pre + 1.2.23-pre true Debug;Release;Migration diff --git a/plugins/OnlineSales.Plugin.SendGrid/Tasks/SyncSuppressionsTask.cs b/plugins/OnlineSales.Plugin.SendGrid/Tasks/SyncSuppressionsTask.cs index c652cbb7..6cbe6088 100644 --- a/plugins/OnlineSales.Plugin.SendGrid/Tasks/SyncSuppressionsTask.cs +++ b/plugins/OnlineSales.Plugin.SendGrid/Tasks/SyncSuppressionsTask.cs @@ -45,9 +45,12 @@ private string CreateSourceString(string keyName, string suppressionType) private async Task Unsubscribe(string suppressionType) where T : SuppressionDto { - var sourceAndKeyDictionary = new Dictionary(); - - sourceAndKeyDictionary.Add(CreateSourceString(primaryApiKeyName, suppressionType), SendGridPlugin.Configuration.SendGridApi.PrimaryApiKey); + var sourceAndKeyDictionary = new Dictionary + { + { + CreateSourceString(primaryApiKeyName, suppressionType), SendGridPlugin.Configuration.SendGridApi.PrimaryApiKey + }, + }; for (var i = 0; i < SendGridPlugin.Configuration.SendGridApi.SecondaryApiKeys.Count; ++i) { @@ -78,6 +81,11 @@ orderby u.CreatedAt descending var lastSuppression = new SuppressionDto { CreatedAt = lastCreateAt }; + if (lastSuppression.Created < 0) + { + lastSuppression.Created = 0; + } + var sendGridClient = new SendGridClient(apiKeyValue); var response = await sendGridClient.RequestAsync( diff --git a/plugins/OnlineSales.Plugin.Sms/OnlineSales.Plugin.Sms.csproj b/plugins/OnlineSales.Plugin.Sms/OnlineSales.Plugin.Sms.csproj index 857c12c8..169b9da6 100644 --- a/plugins/OnlineSales.Plugin.Sms/OnlineSales.Plugin.Sms.csproj +++ b/plugins/OnlineSales.Plugin.Sms/OnlineSales.Plugin.Sms.csproj @@ -5,7 +5,7 @@ true enable enable - 1.2.22-pre + 1.2.23-pre true Debug;Release;Migration diff --git a/plugins/OnlineSales.Plugin.TestPlugin/OnlineSales.Plugin.TestPlugin.csproj b/plugins/OnlineSales.Plugin.TestPlugin/OnlineSales.Plugin.TestPlugin.csproj index 252939f5..a7156d89 100644 --- a/plugins/OnlineSales.Plugin.TestPlugin/OnlineSales.Plugin.TestPlugin.csproj +++ b/plugins/OnlineSales.Plugin.TestPlugin/OnlineSales.Plugin.TestPlugin.csproj @@ -5,7 +5,7 @@ true enable enable - 1.2.22-pre + 1.2.23-pre true Debug;Release;Migration diff --git a/plugins/OnlineSales.Plugin.Vsto/Configuration/PluginSettings.cs b/plugins/OnlineSales.Plugin.Vsto/Configuration/PluginSettings.cs index 45989f6e..7aeb15e9 100644 --- a/plugins/OnlineSales.Plugin.Vsto/Configuration/PluginSettings.cs +++ b/plugins/OnlineSales.Plugin.Vsto/Configuration/PluginSettings.cs @@ -14,4 +14,6 @@ public class VstoConfig public string RequestPath { get; set; } = string.Empty; public string LocalPath { get; set; } = string.Empty; + + public string SubPathPrefix { get; set; } = string.Empty; } \ No newline at end of file diff --git a/plugins/OnlineSales.Plugin.Vsto/OnlineSales.Plugin.Vsto.csproj b/plugins/OnlineSales.Plugin.Vsto/OnlineSales.Plugin.Vsto.csproj index dcf5aa0e..c50bf764 100644 --- a/plugins/OnlineSales.Plugin.Vsto/OnlineSales.Plugin.Vsto.csproj +++ b/plugins/OnlineSales.Plugin.Vsto/OnlineSales.Plugin.Vsto.csproj @@ -5,7 +5,7 @@ true enable enable - 1.2.22-pre + 1.2.23-pre true Debug;Release;Migration diff --git a/plugins/OnlineSales.Plugin.Vsto/VstoFileProvider.cs b/plugins/OnlineSales.Plugin.Vsto/VstoFileProvider.cs index b5da016c..f328d4ef 100644 --- a/plugins/OnlineSales.Plugin.Vsto/VstoFileProvider.cs +++ b/plugins/OnlineSales.Plugin.Vsto/VstoFileProvider.cs @@ -37,6 +37,11 @@ public IDirectoryContents GetDirectoryContents(string subpath) public IFileInfo GetFileInfo(string subpath) { + if (!subpath.ToLower().StartsWith("/" + VstoPlugin.Configuration.Vsto.SubPathPrefix)) + { + subpath = "/" + VstoPlugin.Configuration.Vsto.SubPathPrefix + subpath; + } + // Fix Unix CaseSensetive mode --------------------------- var validFilesByExtension = Directory.GetFiles(Path.Combine(vstoRootPath, Path.GetDirectoryName(subpath)![1..]), $"*{Path.GetExtension(subpath)}", SearchOption.TopDirectoryOnly).ToArray(); diff --git a/plugins/OnlineSales.Plugin.Vsto/pluginsettings.json b/plugins/OnlineSales.Plugin.Vsto/pluginsettings.json index ad40af63..7986840c 100644 --- a/plugins/OnlineSales.Plugin.Vsto/pluginsettings.json +++ b/plugins/OnlineSales.Plugin.Vsto/pluginsettings.json @@ -1,6 +1,7 @@ { "Vsto": { "RequestPath": "/vsto", - "LocalPath": "vsto" + "LocalPath": "vsto", + "SubPathPrefix": "pro" } } \ No newline at end of file diff --git a/src/OnlineSales/Entities/Contact.cs b/src/OnlineSales/Entities/Contact.cs index 33fe0c25..a2a95707 100644 --- a/src/OnlineSales/Entities/Contact.cs +++ b/src/OnlineSales/Entities/Contact.cs @@ -6,7 +6,6 @@ using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json.Serialization; using Microsoft.EntityFrameworkCore; -using Nest; using OnlineSales.DataAnnotations; using OnlineSales.Geography; diff --git a/src/OnlineSales/Entities/EmailLog.cs b/src/OnlineSales/Entities/EmailLog.cs index ef8148a7..4f1d06be 100644 --- a/src/OnlineSales/Entities/EmailLog.cs +++ b/src/OnlineSales/Entities/EmailLog.cs @@ -4,6 +4,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Text.Json.Serialization; using OnlineSales.DataAnnotations; namespace OnlineSales.Entities @@ -12,6 +13,7 @@ public enum EmailStatus { NotSent = 0, Sent = 1, + Received = 2, } [SupportsElastic] @@ -19,6 +21,9 @@ public enum EmailStatus [Table("email_log")] public class EmailLog : BaseEntity { + private string fromEmail = string.Empty; + private string recipients = string.Empty; + /// /// Gets or sets reference to the ContactEmailSchedule table. /// @@ -29,6 +34,10 @@ public class EmailLog : BaseEntity /// public int? ContactId { get; set; } + [JsonIgnore] + [ForeignKey("ContactId")] + public virtual Contact? Contact { get; set; } + /// /// Gets or sets reference to the EmailTemplate table. /// @@ -43,18 +52,45 @@ public class EmailLog : BaseEntity /// [Searchable] [Required] - public string Recipient { get; set; } = string.Empty; + public string Recipients + { + get + { + return recipients; + } + + set + { + recipients = value.ToLower(); + } + } - [Searchable] [Required] - public string FromEmail { get; set; } = string.Empty; + [Searchable] + public string FromEmail + { + get + { + return fromEmail; + } + + set + { + fromEmail = value.ToLower(); + } + } /// /// Gets or sets the email body. /// - [Searchable] - [Required] - public string Body { get; set; } = string.Empty; + [Searchable] + public string? HtmlBody { get; set; } = string.Empty; + + /// + /// Gets or sets the email body. + /// + [Searchable] + public string? TextBody { get; set; } public string MessageId { get; set; } = string.Empty; diff --git a/src/OnlineSales/Helpers/UserHelper.cs b/src/OnlineSales/Helpers/UserHelper.cs index 72760476..efe330e5 100644 --- a/src/OnlineSales/Helpers/UserHelper.cs +++ b/src/OnlineSales/Helpers/UserHelper.cs @@ -19,7 +19,7 @@ public static class UserHelper var userId = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value; - if (!string.IsNullOrEmpty(userId)) + if (!string.IsNullOrEmpty(userId) && Guid.TryParse(userId, out Guid guid)) { return userId; } diff --git a/src/OnlineSales/Migrations/20240229133338_EmailHtmlAndTextBody.Designer.cs b/src/OnlineSales/Migrations/20240229133338_EmailHtmlAndTextBody.Designer.cs new file mode 100644 index 00000000..91a8c55d --- /dev/null +++ b/src/OnlineSales/Migrations/20240229133338_EmailHtmlAndTextBody.Designer.cs @@ -0,0 +1,2693 @@ +// +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using OnlineSales.Data; +using OnlineSales.Entities; + +#nullable disable + +namespace OnlineSales.Migrations +{ + [DbContext(typeof(PgDbContext))] + [Migration("20240229133338_EmailHtmlAndTextBody")] + partial class EmailHtmlAndTextBody + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("ContactDeal", b => + { + b.Property("ContactsId") + .HasColumnType("integer") + .HasColumnName("contacts_id"); + + b.Property("DealsId") + .HasColumnType("integer") + .HasColumnName("deals_id"); + + b.HasKey("ContactsId", "DealsId") + .HasName("pk_contact_deal"); + + b.HasIndex("DealsId") + .HasDatabaseName("ix_contact_deal_deals_id"); + + b.ToTable("contact_deal", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("text") + .HasColumnName("id"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text") + .HasColumnName("concurrency_stamp"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("name"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_name"); + + b.HasKey("Id") + .HasName("pk_roles"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("roles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text") + .HasColumnName("claim_type"); + + b.Property("ClaimValue") + .HasColumnType("text") + .HasColumnName("claim_value"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("role_id"); + + b.HasKey("Id") + .HasName("pk_role_claims"); + + b.HasIndex("RoleId") + .HasDatabaseName("ix_role_claims_role_id"); + + b.ToTable("role_claims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text") + .HasColumnName("claim_type"); + + b.Property("ClaimValue") + .HasColumnType("text") + .HasColumnName("claim_value"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_user_claims"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_user_claims_user_id"); + + b.ToTable("user_claims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text") + .HasColumnName("login_provider"); + + b.Property("ProviderKey") + .HasColumnType("text") + .HasColumnName("provider_key"); + + b.Property("ProviderDisplayName") + .HasColumnType("text") + .HasColumnName("provider_display_name"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("LoginProvider", "ProviderKey") + .HasName("pk_user_logins"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_user_logins_user_id"); + + b.ToTable("user_logins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("text") + .HasColumnName("user_id"); + + b.Property("RoleId") + .HasColumnType("text") + .HasColumnName("role_id"); + + b.HasKey("UserId", "RoleId") + .HasName("pk_user_roles"); + + b.HasIndex("RoleId") + .HasDatabaseName("ix_user_roles_role_id"); + + b.ToTable("user_roles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("text") + .HasColumnName("user_id"); + + b.Property("LoginProvider") + .HasColumnType("text") + .HasColumnName("login_provider"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Value") + .HasColumnType("text") + .HasColumnName("value"); + + b.HasKey("UserId", "LoginProvider", "Name") + .HasName("pk_user_tokens"); + + b.ToTable("user_tokens", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Account", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CityName") + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("EmployeesRange") + .HasColumnType("text") + .HasColumnName("employees_range"); + + b.Property("LogoUrl") + .HasColumnType("text") + .HasColumnName("logo_url"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Revenue") + .HasColumnType("double precision") + .HasColumnName("revenue"); + + b.Property("SiteUrl") + .HasColumnType("text") + .HasColumnName("site_url"); + + b.Property>("SocialMedia") + .HasColumnType("jsonb") + .HasColumnName("social_media"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("State") + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("Tags") + .HasColumnType("jsonb") + .HasColumnName("tags"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_account"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_account_name"); + + b.ToTable("account", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.ChangeLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Data") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("EntityState") + .HasColumnType("integer") + .HasColumnName("entity_state"); + + b.Property("ObjectId") + .HasColumnType("integer") + .HasColumnName("object_id"); + + b.Property("ObjectType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("object_type"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_change_log"); + + b.ToTable("change_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.ChangeLogTaskLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChangeLogIdMax") + .HasColumnType("integer") + .HasColumnName("change_log_id_max"); + + b.Property("ChangeLogIdMin") + .HasColumnType("integer") + .HasColumnName("change_log_id_min"); + + b.Property("ChangesProcessed") + .HasColumnType("integer") + .HasColumnName("changes_processed"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Start") + .HasColumnType("timestamp with time zone") + .HasColumnName("start"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("state"); + + b.Property("TaskName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("task_name"); + + b.HasKey("Id") + .HasName("pk_change_log_task_log"); + + b.ToTable("change_log_task_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AuthorEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author_email"); + + b.Property("AuthorName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author_name"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body"); + + b.Property("CommentableId") + .HasColumnType("integer") + .HasColumnName("commentable_id"); + + b.Property("CommentableType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("commentable_type"); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text") + .HasColumnName("key"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("ParentId") + .HasColumnType("integer") + .HasColumnName("parent_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_comment"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_comment_contact_id"); + + b.HasIndex("ParentId") + .HasDatabaseName("ix_comment_parent_id"); + + b.ToTable("comment", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("Address1") + .HasColumnType("text") + .HasColumnName("address1"); + + b.Property("Address2") + .HasColumnType("text") + .HasColumnName("address2"); + + b.Property("Birthday") + .HasColumnType("timestamp with time zone") + .HasColumnName("birthday"); + + b.Property("CityName") + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("CompanyName") + .HasColumnType("text") + .HasColumnName("company_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Department") + .HasColumnType("text") + .HasColumnName("department"); + + b.Property("DomainId") + .HasColumnType("integer") + .HasColumnName("domain_id"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text") + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnType("text") + .HasColumnName("first_name"); + + b.Property("JobTitle") + .HasColumnType("text") + .HasColumnName("job_title"); + + b.Property("Language") + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("LastName") + .HasColumnType("text") + .HasColumnName("last_name"); + + b.Property("MiddleName") + .HasColumnType("text") + .HasColumnName("middle_name"); + + b.Property("Phone") + .HasColumnType("text") + .HasColumnName("phone"); + + b.Property("Prefix") + .HasColumnType("text") + .HasColumnName("prefix"); + + b.Property>("SocialMedia") + .HasColumnType("jsonb") + .HasColumnName("social_media"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("State") + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("Timezone") + .HasColumnType("integer") + .HasColumnName("timezone"); + + b.Property("UnsubscribeId") + .HasColumnType("integer") + .HasColumnName("unsubscribe_id"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("Zip") + .HasColumnType("text") + .HasColumnName("zip"); + + b.HasKey("Id") + .HasName("pk_contact"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_contact_account_id"); + + b.HasIndex("DomainId") + .HasDatabaseName("ix_contact_domain_id"); + + b.HasIndex("Email") + .IsUnique() + .HasDatabaseName("ix_contact_email"); + + b.HasIndex("UnsubscribeId") + .HasDatabaseName("ix_contact_unsubscribe_id"); + + b.ToTable("contact", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.ContactEmailSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("ScheduleId") + .HasColumnType("integer") + .HasColumnName("schedule_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_contact_email_schedule"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_contact_email_schedule_contact_id"); + + b.HasIndex("ScheduleId") + .HasDatabaseName("ix_contact_email_schedule_schedule_id"); + + b.ToTable("contact_email_schedule", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Content", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AllowComments") + .HasColumnType("boolean") + .HasColumnName("allow_comments"); + + b.Property("Author") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body"); + + b.Property("Category") + .IsRequired() + .HasColumnType("text") + .HasColumnName("category"); + + b.Property("CoverImageAlt") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cover_image_alt"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cover_image_url"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("PublishedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("published_at"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Tags") + .IsRequired() + .HasColumnType("text[]") + .HasColumnName("tags"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("Type") + .IsRequired() + .HasColumnType("text") + .HasColumnName("type"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_content"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_content_slug"); + + b.ToTable("content", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Deal", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("ActualCloseDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("actual_close_date"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("DealCurrency") + .HasColumnType("text") + .HasColumnName("deal_currency"); + + b.Property("DealPipelineId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_id"); + + b.Property("DealPipelineStageId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_stage_id"); + + b.Property("DealValue") + .HasColumnType("numeric") + .HasColumnName("deal_value"); + + b.Property("ExpectedCloseDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("expected_close_date"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_deal"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_deal_account_id"); + + b.HasIndex("DealPipelineId") + .HasDatabaseName("ix_deal_deal_pipeline_id"); + + b.HasIndex("DealPipelineStageId") + .HasDatabaseName("ix_deal_deal_pipeline_stage_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_deal_user_id"); + + b.ToTable("deal", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipeline", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_deal_pipeline"); + + b.ToTable("deal_pipeline", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipelineStage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("DealPipelineId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Order") + .HasColumnType("integer") + .HasColumnName("order"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_deal_pipeline_stage"); + + b.HasIndex("DealPipelineId") + .HasDatabaseName("ix_deal_pipeline_stage_deal_pipeline_id"); + + b.ToTable("deal_pipeline_stage", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Discount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("OrderId") + .HasColumnType("integer") + .HasColumnName("order_id"); + + b.Property("OrderItemId") + .HasColumnType("integer") + .HasColumnName("order_item_id"); + + b.Property("PromotionId") + .HasColumnType("integer") + .HasColumnName("promotion_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("Value") + .HasColumnType("numeric") + .HasColumnName("value"); + + b.HasKey("Id") + .HasName("pk_discount"); + + b.HasIndex("OrderId") + .HasDatabaseName("ix_discount_order_id"); + + b.HasIndex("OrderItemId") + .IsUnique() + .HasDatabaseName("ix_discount_order_item_id"); + + b.HasIndex("PromotionId") + .HasDatabaseName("ix_discount_promotion_id"); + + b.ToTable("discount", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("AccountStatus") + .HasColumnType("integer") + .HasColumnName("account_status"); + + b.Property("CatchAll") + .HasColumnType("boolean") + .HasColumnName("catch_all"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("Disposable") + .HasColumnType("boolean") + .HasColumnName("disposable"); + + b.Property("DnsCheck") + .HasColumnType("boolean") + .HasColumnName("dns_check"); + + b.Property>("DnsRecords") + .HasColumnType("jsonb") + .HasColumnName("dns_records"); + + b.Property("FaviconUrl") + .HasColumnType("text") + .HasColumnName("favicon_url"); + + b.Property("Free") + .HasColumnType("boolean") + .HasColumnName("free"); + + b.Property("HttpCheck") + .HasColumnType("boolean") + .HasColumnName("http_check"); + + b.Property("MxCheck") + .HasColumnType("boolean") + .HasColumnName("mx_check"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("Url") + .HasColumnType("text") + .HasColumnName("url"); + + b.HasKey("Id") + .HasName("pk_domain"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_domain_account_id"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_domain_name"); + + b.ToTable("domain", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_group"); + + b.ToTable("email_group", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("FromEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_email"); + + b.Property("HtmlBody") + .IsRequired() + .HasColumnType("text") + .HasColumnName("html_body"); + + b.Property("MessageId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_id"); + + b.Property("Recipient") + .IsRequired() + .HasColumnType("text") + .HasColumnName("recipient"); + + b.Property("ScheduleId") + .HasColumnType("integer") + .HasColumnName("schedule_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text") + .HasColumnName("subject"); + + b.Property("TemplateId") + .HasColumnType("integer") + .HasColumnName("template_id"); + + b.Property("TextBody") + .HasColumnType("text") + .HasColumnName("text_body"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_log"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_email_log_contact_id"); + + b.ToTable("email_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("GroupId") + .HasColumnType("integer") + .HasColumnName("group_id"); + + b.Property("Schedule") + .IsRequired() + .HasColumnType("text") + .HasColumnName("schedule"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_schedule"); + + b.HasIndex("GroupId") + .HasDatabaseName("ix_email_schedule_group_id"); + + b.ToTable("email_schedule", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BodyTemplate") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body_template"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("EmailGroupId") + .HasColumnType("integer") + .HasColumnName("email_group_id"); + + b.Property("FromEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_email"); + + b.Property("FromName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_name"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("RetryCount") + .HasColumnType("integer") + .HasColumnName("retry_count"); + + b.Property("RetryInterval") + .HasColumnType("integer") + .HasColumnName("retry_interval"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text") + .HasColumnName("subject"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_template"); + + b.HasIndex("EmailGroupId") + .HasDatabaseName("ix_email_template_email_group_id"); + + b.ToTable("email_template", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.File", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Extension") + .IsRequired() + .HasColumnType("text") + .HasColumnName("extension"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("mime_type"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ScopeUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("scope_uid"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("size"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_file"); + + b.ToTable("file", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.IpDetails", b => + { + b.Property("Ip") + .HasColumnType("text") + .HasColumnName("ip"); + + b.Property("CityName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Ip") + .HasName("pk_ip_details"); + + b.HasIndex("Ip") + .IsUnique() + .HasDatabaseName("ix_ip_details_ip"); + + b.ToTable("ip_details", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Link", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Destination") + .IsRequired() + .HasColumnType("text") + .HasColumnName("destination"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("uid"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_link"); + + b.HasIndex("Uid") + .IsUnique() + .HasDatabaseName("ix_link_uid"); + + b.ToTable("link", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.LinkLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Destination") + .IsRequired() + .HasColumnType("text") + .HasColumnName("destination"); + + b.Property("LinkId") + .HasColumnType("integer") + .HasColumnName("link_id"); + + b.Property("Referrer") + .HasColumnType("text") + .HasColumnName("referrer"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_link_log"); + + b.HasIndex("LinkId") + .HasDatabaseName("ix_link_log_link_id"); + + b.ToTable("link_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Media", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Extension") + .IsRequired() + .HasColumnType("text") + .HasColumnName("extension"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("mime_type"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ScopeUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("scope_uid"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("size"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_media"); + + b.ToTable("media", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AffiliateName") + .HasColumnType("text") + .HasColumnName("affiliate_name"); + + b.Property("Commission") + .HasColumnType("numeric") + .HasColumnName("commission"); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("ContactIp") + .HasColumnType("text") + .HasColumnName("contact_ip"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("text") + .HasColumnName("currency"); + + b.Property("CurrencyTotal") + .HasColumnType("numeric") + .HasColumnName("currency_total"); + + b.Property("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("ExchangeRate") + .HasColumnType("numeric") + .HasColumnName("exchange_rate"); + + b.Property("OrderNumber") + .HasColumnType("text") + .HasColumnName("order_number"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("quantity"); + + b.Property("RefNo") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ref_no"); + + b.Property("Refund") + .HasColumnType("numeric") + .HasColumnName("refund"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("TestOrder") + .HasColumnType("boolean") + .HasColumnName("test_order"); + + b.Property("Total") + .HasColumnType("numeric") + .HasColumnName("total"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_order"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_order_contact_id"); + + b.HasIndex("RefNo") + .IsUnique() + .HasDatabaseName("ix_order_ref_no"); + + b.ToTable("order", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("text") + .HasColumnName("currency"); + + b.Property("CurrencyTotal") + .HasColumnType("numeric") + .HasColumnName("currency_total"); + + b.Property("OrderId") + .HasColumnType("integer") + .HasColumnName("order_id"); + + b.Property("ProductName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("product_name"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("quantity"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Total") + .HasColumnType("numeric") + .HasColumnName("total"); + + b.Property("UnitPrice") + .HasColumnType("numeric") + .HasColumnName("unit_price"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_order_item"); + + b.HasIndex("OrderId") + .HasDatabaseName("ix_order_item_order_id"); + + b.ToTable("order_item", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Promotion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text") + .HasColumnName("code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("end_date"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("start_date"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_promotion"); + + b.HasIndex("Code") + .IsUnique() + .HasDatabaseName("ix_promotion_code"); + + b.ToTable("promotion", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.TaskExecutionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualExecutionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("actual_execution_time"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment"); + + b.Property("RetryCount") + .HasColumnType("integer") + .HasColumnName("retry_count"); + + b.Property("ScheduledExecutionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("scheduled_execution_time"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("TaskName") + .HasColumnType("text") + .HasColumnName("task_name"); + + b.HasKey("Id") + .HasName("pk_task_execution_log"); + + b.ToTable("task_execution_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Unsubscribe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_unsubscribe"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_unsubscribe_contact_id"); + + b.ToTable("unsubscribe", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.User", b => + { + b.Property("Id") + .HasColumnType("text") + .HasColumnName("id"); + + b.Property("AccessFailedCount") + .HasColumnType("integer") + .HasColumnName("access_failed_count"); + + b.Property("AvatarUrl") + .IsRequired() + .HasColumnType("text") + .HasColumnName("avatar_url"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text") + .HasColumnName("concurrency_stamp"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property>("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("display_name"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("email"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean") + .HasColumnName("email_confirmed"); + + b.Property("LastTimeLoggedIn") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_time_logged_in"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean") + .HasColumnName("lockout_enabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("lockout_end"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_email"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_user_name"); + + b.Property("PasswordHash") + .HasColumnType("text") + .HasColumnName("password_hash"); + + b.Property("PhoneNumber") + .HasColumnType("text") + .HasColumnName("phone_number"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean") + .HasColumnName("phone_number_confirmed"); + + b.Property("SecurityStamp") + .HasColumnType("text") + .HasColumnName("security_stamp"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean") + .HasColumnName("two_factor_enabled"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("users", (string)null); + }); + + modelBuilder.Entity("ContactDeal", b => + { + b.HasOne("OnlineSales.Entities.Contact", null) + .WithMany() + .HasForeignKey("ContactsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_deal_contact_contacts_id"); + + b.HasOne("OnlineSales.Entities.Deal", null) + .WithMany() + .HasForeignKey("DealsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_deal_deal_deals_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_role_claims_roles_role_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_claims_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_logins_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_roles_roles_role_id"); + + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_roles_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_tokens_users_user_id"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Comment", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_comment_contact_contact_id"); + + b.HasOne("OnlineSales.Entities.Comment", "Parent") + .WithMany() + .HasForeignKey("ParentId") + .HasConstraintName("fk_comment_comment_parent_id"); + + b.Navigation("Contact"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Contacts") + .HasForeignKey("AccountId") + .OnDelete(DeleteBehavior.Restrict) + .HasConstraintName("fk_contact_account_account_id"); + + b.HasOne("OnlineSales.Entities.Domain", "Domain") + .WithMany("Contacts") + .HasForeignKey("DomainId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired() + .HasConstraintName("fk_contact_domain_domain_id"); + + b.HasOne("OnlineSales.Entities.Unsubscribe", "Unsubscribe") + .WithMany() + .HasForeignKey("UnsubscribeId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("fk_contact_unsubscribe_unsubscribe_id"); + + b.Navigation("Account"); + + b.Navigation("Domain"); + + b.Navigation("Unsubscribe"); + }); + + modelBuilder.Entity("OnlineSales.Entities.ContactEmailSchedule", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_email_schedule_contact_contact_id"); + + b.HasOne("OnlineSales.Entities.EmailSchedule", "Schedule") + .WithMany() + .HasForeignKey("ScheduleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_email_schedule_email_schedule_schedule_id"); + + b.Navigation("Contact"); + + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Deal", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Deals") + .HasForeignKey("AccountId") + .HasConstraintName("fk_deal_account_account_id"); + + b.HasOne("OnlineSales.Entities.DealPipeline", "DealPipeline") + .WithMany() + .HasForeignKey("DealPipelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_deal_pipeline_deal_pipeline_id"); + + b.HasOne("OnlineSales.Entities.DealPipelineStage", "DealPipelineStage") + .WithMany() + .HasForeignKey("DealPipelineStageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_deal_pipeline_stage_deal_pipeline_stage_id"); + + b.HasOne("OnlineSales.Entities.User", "CreatedBy") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_users_user_id"); + + b.Navigation("Account"); + + b.Navigation("CreatedBy"); + + b.Navigation("DealPipeline"); + + b.Navigation("DealPipelineStage"); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipelineStage", b => + { + b.HasOne("OnlineSales.Entities.DealPipeline", "DealPipeline") + .WithMany("PipelineStages") + .HasForeignKey("DealPipelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_pipeline_stage_deal_pipeline_deal_pipeline_id"); + + b.Navigation("DealPipeline"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Discount", b => + { + b.HasOne("OnlineSales.Entities.Order", "Order") + .WithMany("Discounts") + .HasForeignKey("OrderId") + .HasConstraintName("fk_discount_order_order_id"); + + b.HasOne("OnlineSales.Entities.OrderItem", "OrderItem") + .WithOne("Discount") + .HasForeignKey("OnlineSales.Entities.Discount", "OrderItemId") + .HasConstraintName("fk_discount_order_item_order_item_id"); + + b.HasOne("OnlineSales.Entities.Promotion", "Promotion") + .WithMany() + .HasForeignKey("PromotionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_discount_promotion_promotion_id"); + + b.Navigation("Order"); + + b.Navigation("OrderItem"); + + b.Navigation("Promotion"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Domains") + .HasForeignKey("AccountId") + .OnDelete(DeleteBehavior.Restrict) + .HasConstraintName("fk_domain_account_account_id"); + + b.Navigation("Account"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailLog", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .HasConstraintName("fk_email_log_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailSchedule", b => + { + b.HasOne("OnlineSales.Entities.EmailGroup", "Group") + .WithMany() + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_email_schedule_email_group_group_id"); + + b.Navigation("Group"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailTemplate", b => + { + b.HasOne("OnlineSales.Entities.EmailGroup", "EmailGroup") + .WithMany("EmailTemplates") + .HasForeignKey("EmailGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_email_template_email_group_email_group_id"); + + b.Navigation("EmailGroup"); + }); + + modelBuilder.Entity("OnlineSales.Entities.LinkLog", b => + { + b.HasOne("OnlineSales.Entities.Link", "Link") + .WithMany() + .HasForeignKey("LinkId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_link_log_link_link_id"); + + b.Navigation("Link"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany("Orders") + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_order_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.HasOne("OnlineSales.Entities.Order", "Order") + .WithMany("OrderItems") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_order_item_order_order_id"); + + b.Navigation("Order"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Unsubscribe", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .HasConstraintName("fk_unsubscribe_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Account", b => + { + b.Navigation("Contacts"); + + b.Navigation("Deals"); + + b.Navigation("Domains"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipeline", b => + { + b.Navigation("PipelineStages"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.Navigation("Contacts"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailGroup", b => + { + b.Navigation("EmailTemplates"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.Navigation("Discounts"); + + b.Navigation("OrderItems"); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.Navigation("Discount"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/OnlineSales/Migrations/20240229133338_EmailHtmlAndTextBody.cs b/src/OnlineSales/Migrations/20240229133338_EmailHtmlAndTextBody.cs new file mode 100644 index 00000000..e49a7af3 --- /dev/null +++ b/src/OnlineSales/Migrations/20240229133338_EmailHtmlAndTextBody.cs @@ -0,0 +1,58 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace OnlineSales.Migrations +{ + /// + public partial class EmailHtmlAndTextBody : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "body", + table: "email_log", + newName: "html_body"); + + migrationBuilder.AddColumn( + name: "text_body", + table: "email_log", + type: "text", + nullable: true); + + migrationBuilder.CreateIndex( + name: "ix_email_log_contact_id", + table: "email_log", + column: "contact_id"); + + migrationBuilder.AddForeignKey( + name: "fk_email_log_contact_contact_id", + table: "email_log", + column: "contact_id", + principalTable: "contact", + principalColumn: "id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "fk_email_log_contact_contact_id", + table: "email_log"); + + migrationBuilder.DropIndex( + name: "ix_email_log_contact_id", + table: "email_log"); + + migrationBuilder.DropColumn( + name: "text_body", + table: "email_log"); + + migrationBuilder.RenameColumn( + name: "html_body", + table: "email_log", + newName: "body"); + } + } +} diff --git a/src/OnlineSales/Migrations/20240229135527_Recipients.Designer.cs b/src/OnlineSales/Migrations/20240229135527_Recipients.Designer.cs new file mode 100644 index 00000000..bb21e116 --- /dev/null +++ b/src/OnlineSales/Migrations/20240229135527_Recipients.Designer.cs @@ -0,0 +1,2693 @@ +// +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using OnlineSales.Data; +using OnlineSales.Entities; + +#nullable disable + +namespace OnlineSales.Migrations +{ + [DbContext(typeof(PgDbContext))] + [Migration("20240229135527_Recipients")] + partial class Recipients + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("ContactDeal", b => + { + b.Property("ContactsId") + .HasColumnType("integer") + .HasColumnName("contacts_id"); + + b.Property("DealsId") + .HasColumnType("integer") + .HasColumnName("deals_id"); + + b.HasKey("ContactsId", "DealsId") + .HasName("pk_contact_deal"); + + b.HasIndex("DealsId") + .HasDatabaseName("ix_contact_deal_deals_id"); + + b.ToTable("contact_deal", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("text") + .HasColumnName("id"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text") + .HasColumnName("concurrency_stamp"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("name"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_name"); + + b.HasKey("Id") + .HasName("pk_roles"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("roles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text") + .HasColumnName("claim_type"); + + b.Property("ClaimValue") + .HasColumnType("text") + .HasColumnName("claim_value"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("role_id"); + + b.HasKey("Id") + .HasName("pk_role_claims"); + + b.HasIndex("RoleId") + .HasDatabaseName("ix_role_claims_role_id"); + + b.ToTable("role_claims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text") + .HasColumnName("claim_type"); + + b.Property("ClaimValue") + .HasColumnType("text") + .HasColumnName("claim_value"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_user_claims"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_user_claims_user_id"); + + b.ToTable("user_claims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text") + .HasColumnName("login_provider"); + + b.Property("ProviderKey") + .HasColumnType("text") + .HasColumnName("provider_key"); + + b.Property("ProviderDisplayName") + .HasColumnType("text") + .HasColumnName("provider_display_name"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("LoginProvider", "ProviderKey") + .HasName("pk_user_logins"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_user_logins_user_id"); + + b.ToTable("user_logins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("text") + .HasColumnName("user_id"); + + b.Property("RoleId") + .HasColumnType("text") + .HasColumnName("role_id"); + + b.HasKey("UserId", "RoleId") + .HasName("pk_user_roles"); + + b.HasIndex("RoleId") + .HasDatabaseName("ix_user_roles_role_id"); + + b.ToTable("user_roles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("text") + .HasColumnName("user_id"); + + b.Property("LoginProvider") + .HasColumnType("text") + .HasColumnName("login_provider"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Value") + .HasColumnType("text") + .HasColumnName("value"); + + b.HasKey("UserId", "LoginProvider", "Name") + .HasName("pk_user_tokens"); + + b.ToTable("user_tokens", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Account", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CityName") + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("EmployeesRange") + .HasColumnType("text") + .HasColumnName("employees_range"); + + b.Property("LogoUrl") + .HasColumnType("text") + .HasColumnName("logo_url"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Revenue") + .HasColumnType("double precision") + .HasColumnName("revenue"); + + b.Property("SiteUrl") + .HasColumnType("text") + .HasColumnName("site_url"); + + b.Property>("SocialMedia") + .HasColumnType("jsonb") + .HasColumnName("social_media"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("State") + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("Tags") + .HasColumnType("jsonb") + .HasColumnName("tags"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_account"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_account_name"); + + b.ToTable("account", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.ChangeLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Data") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("EntityState") + .HasColumnType("integer") + .HasColumnName("entity_state"); + + b.Property("ObjectId") + .HasColumnType("integer") + .HasColumnName("object_id"); + + b.Property("ObjectType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("object_type"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_change_log"); + + b.ToTable("change_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.ChangeLogTaskLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChangeLogIdMax") + .HasColumnType("integer") + .HasColumnName("change_log_id_max"); + + b.Property("ChangeLogIdMin") + .HasColumnType("integer") + .HasColumnName("change_log_id_min"); + + b.Property("ChangesProcessed") + .HasColumnType("integer") + .HasColumnName("changes_processed"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Start") + .HasColumnType("timestamp with time zone") + .HasColumnName("start"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("state"); + + b.Property("TaskName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("task_name"); + + b.HasKey("Id") + .HasName("pk_change_log_task_log"); + + b.ToTable("change_log_task_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AuthorEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author_email"); + + b.Property("AuthorName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author_name"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body"); + + b.Property("CommentableId") + .HasColumnType("integer") + .HasColumnName("commentable_id"); + + b.Property("CommentableType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("commentable_type"); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text") + .HasColumnName("key"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("ParentId") + .HasColumnType("integer") + .HasColumnName("parent_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_comment"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_comment_contact_id"); + + b.HasIndex("ParentId") + .HasDatabaseName("ix_comment_parent_id"); + + b.ToTable("comment", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("Address1") + .HasColumnType("text") + .HasColumnName("address1"); + + b.Property("Address2") + .HasColumnType("text") + .HasColumnName("address2"); + + b.Property("Birthday") + .HasColumnType("timestamp with time zone") + .HasColumnName("birthday"); + + b.Property("CityName") + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("CompanyName") + .HasColumnType("text") + .HasColumnName("company_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Department") + .HasColumnType("text") + .HasColumnName("department"); + + b.Property("DomainId") + .HasColumnType("integer") + .HasColumnName("domain_id"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text") + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnType("text") + .HasColumnName("first_name"); + + b.Property("JobTitle") + .HasColumnType("text") + .HasColumnName("job_title"); + + b.Property("Language") + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("LastName") + .HasColumnType("text") + .HasColumnName("last_name"); + + b.Property("MiddleName") + .HasColumnType("text") + .HasColumnName("middle_name"); + + b.Property("Phone") + .HasColumnType("text") + .HasColumnName("phone"); + + b.Property("Prefix") + .HasColumnType("text") + .HasColumnName("prefix"); + + b.Property>("SocialMedia") + .HasColumnType("jsonb") + .HasColumnName("social_media"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("State") + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("Timezone") + .HasColumnType("integer") + .HasColumnName("timezone"); + + b.Property("UnsubscribeId") + .HasColumnType("integer") + .HasColumnName("unsubscribe_id"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("Zip") + .HasColumnType("text") + .HasColumnName("zip"); + + b.HasKey("Id") + .HasName("pk_contact"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_contact_account_id"); + + b.HasIndex("DomainId") + .HasDatabaseName("ix_contact_domain_id"); + + b.HasIndex("Email") + .IsUnique() + .HasDatabaseName("ix_contact_email"); + + b.HasIndex("UnsubscribeId") + .HasDatabaseName("ix_contact_unsubscribe_id"); + + b.ToTable("contact", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.ContactEmailSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("ScheduleId") + .HasColumnType("integer") + .HasColumnName("schedule_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_contact_email_schedule"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_contact_email_schedule_contact_id"); + + b.HasIndex("ScheduleId") + .HasDatabaseName("ix_contact_email_schedule_schedule_id"); + + b.ToTable("contact_email_schedule", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Content", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AllowComments") + .HasColumnType("boolean") + .HasColumnName("allow_comments"); + + b.Property("Author") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body"); + + b.Property("Category") + .IsRequired() + .HasColumnType("text") + .HasColumnName("category"); + + b.Property("CoverImageAlt") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cover_image_alt"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cover_image_url"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("PublishedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("published_at"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Tags") + .IsRequired() + .HasColumnType("text[]") + .HasColumnName("tags"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("Type") + .IsRequired() + .HasColumnType("text") + .HasColumnName("type"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_content"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_content_slug"); + + b.ToTable("content", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Deal", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("ActualCloseDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("actual_close_date"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("DealCurrency") + .HasColumnType("text") + .HasColumnName("deal_currency"); + + b.Property("DealPipelineId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_id"); + + b.Property("DealPipelineStageId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_stage_id"); + + b.Property("DealValue") + .HasColumnType("numeric") + .HasColumnName("deal_value"); + + b.Property("ExpectedCloseDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("expected_close_date"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_deal"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_deal_account_id"); + + b.HasIndex("DealPipelineId") + .HasDatabaseName("ix_deal_deal_pipeline_id"); + + b.HasIndex("DealPipelineStageId") + .HasDatabaseName("ix_deal_deal_pipeline_stage_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_deal_user_id"); + + b.ToTable("deal", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipeline", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_deal_pipeline"); + + b.ToTable("deal_pipeline", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipelineStage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("DealPipelineId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Order") + .HasColumnType("integer") + .HasColumnName("order"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_deal_pipeline_stage"); + + b.HasIndex("DealPipelineId") + .HasDatabaseName("ix_deal_pipeline_stage_deal_pipeline_id"); + + b.ToTable("deal_pipeline_stage", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Discount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("OrderId") + .HasColumnType("integer") + .HasColumnName("order_id"); + + b.Property("OrderItemId") + .HasColumnType("integer") + .HasColumnName("order_item_id"); + + b.Property("PromotionId") + .HasColumnType("integer") + .HasColumnName("promotion_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("Value") + .HasColumnType("numeric") + .HasColumnName("value"); + + b.HasKey("Id") + .HasName("pk_discount"); + + b.HasIndex("OrderId") + .HasDatabaseName("ix_discount_order_id"); + + b.HasIndex("OrderItemId") + .IsUnique() + .HasDatabaseName("ix_discount_order_item_id"); + + b.HasIndex("PromotionId") + .HasDatabaseName("ix_discount_promotion_id"); + + b.ToTable("discount", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("AccountStatus") + .HasColumnType("integer") + .HasColumnName("account_status"); + + b.Property("CatchAll") + .HasColumnType("boolean") + .HasColumnName("catch_all"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("Disposable") + .HasColumnType("boolean") + .HasColumnName("disposable"); + + b.Property("DnsCheck") + .HasColumnType("boolean") + .HasColumnName("dns_check"); + + b.Property>("DnsRecords") + .HasColumnType("jsonb") + .HasColumnName("dns_records"); + + b.Property("FaviconUrl") + .HasColumnType("text") + .HasColumnName("favicon_url"); + + b.Property("Free") + .HasColumnType("boolean") + .HasColumnName("free"); + + b.Property("HttpCheck") + .HasColumnType("boolean") + .HasColumnName("http_check"); + + b.Property("MxCheck") + .HasColumnType("boolean") + .HasColumnName("mx_check"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("Url") + .HasColumnType("text") + .HasColumnName("url"); + + b.HasKey("Id") + .HasName("pk_domain"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_domain_account_id"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_domain_name"); + + b.ToTable("domain", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_group"); + + b.ToTable("email_group", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("FromEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_email"); + + b.Property("HtmlBody") + .IsRequired() + .HasColumnType("text") + .HasColumnName("html_body"); + + b.Property("MessageId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_id"); + + b.Property("Recipients") + .IsRequired() + .HasColumnType("text") + .HasColumnName("recipients"); + + b.Property("ScheduleId") + .HasColumnType("integer") + .HasColumnName("schedule_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text") + .HasColumnName("subject"); + + b.Property("TemplateId") + .HasColumnType("integer") + .HasColumnName("template_id"); + + b.Property("TextBody") + .HasColumnType("text") + .HasColumnName("text_body"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_log"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_email_log_contact_id"); + + b.ToTable("email_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("GroupId") + .HasColumnType("integer") + .HasColumnName("group_id"); + + b.Property("Schedule") + .IsRequired() + .HasColumnType("text") + .HasColumnName("schedule"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_schedule"); + + b.HasIndex("GroupId") + .HasDatabaseName("ix_email_schedule_group_id"); + + b.ToTable("email_schedule", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BodyTemplate") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body_template"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("EmailGroupId") + .HasColumnType("integer") + .HasColumnName("email_group_id"); + + b.Property("FromEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_email"); + + b.Property("FromName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_name"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("RetryCount") + .HasColumnType("integer") + .HasColumnName("retry_count"); + + b.Property("RetryInterval") + .HasColumnType("integer") + .HasColumnName("retry_interval"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text") + .HasColumnName("subject"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_template"); + + b.HasIndex("EmailGroupId") + .HasDatabaseName("ix_email_template_email_group_id"); + + b.ToTable("email_template", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.File", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Extension") + .IsRequired() + .HasColumnType("text") + .HasColumnName("extension"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("mime_type"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ScopeUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("scope_uid"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("size"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_file"); + + b.ToTable("file", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.IpDetails", b => + { + b.Property("Ip") + .HasColumnType("text") + .HasColumnName("ip"); + + b.Property("CityName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Ip") + .HasName("pk_ip_details"); + + b.HasIndex("Ip") + .IsUnique() + .HasDatabaseName("ix_ip_details_ip"); + + b.ToTable("ip_details", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Link", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Destination") + .IsRequired() + .HasColumnType("text") + .HasColumnName("destination"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("uid"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_link"); + + b.HasIndex("Uid") + .IsUnique() + .HasDatabaseName("ix_link_uid"); + + b.ToTable("link", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.LinkLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Destination") + .IsRequired() + .HasColumnType("text") + .HasColumnName("destination"); + + b.Property("LinkId") + .HasColumnType("integer") + .HasColumnName("link_id"); + + b.Property("Referrer") + .HasColumnType("text") + .HasColumnName("referrer"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_link_log"); + + b.HasIndex("LinkId") + .HasDatabaseName("ix_link_log_link_id"); + + b.ToTable("link_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Media", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Extension") + .IsRequired() + .HasColumnType("text") + .HasColumnName("extension"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("mime_type"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ScopeUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("scope_uid"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("size"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_media"); + + b.ToTable("media", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AffiliateName") + .HasColumnType("text") + .HasColumnName("affiliate_name"); + + b.Property("Commission") + .HasColumnType("numeric") + .HasColumnName("commission"); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("ContactIp") + .HasColumnType("text") + .HasColumnName("contact_ip"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("text") + .HasColumnName("currency"); + + b.Property("CurrencyTotal") + .HasColumnType("numeric") + .HasColumnName("currency_total"); + + b.Property("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("ExchangeRate") + .HasColumnType("numeric") + .HasColumnName("exchange_rate"); + + b.Property("OrderNumber") + .HasColumnType("text") + .HasColumnName("order_number"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("quantity"); + + b.Property("RefNo") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ref_no"); + + b.Property("Refund") + .HasColumnType("numeric") + .HasColumnName("refund"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("TestOrder") + .HasColumnType("boolean") + .HasColumnName("test_order"); + + b.Property("Total") + .HasColumnType("numeric") + .HasColumnName("total"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_order"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_order_contact_id"); + + b.HasIndex("RefNo") + .IsUnique() + .HasDatabaseName("ix_order_ref_no"); + + b.ToTable("order", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("text") + .HasColumnName("currency"); + + b.Property("CurrencyTotal") + .HasColumnType("numeric") + .HasColumnName("currency_total"); + + b.Property("OrderId") + .HasColumnType("integer") + .HasColumnName("order_id"); + + b.Property("ProductName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("product_name"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("quantity"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Total") + .HasColumnType("numeric") + .HasColumnName("total"); + + b.Property("UnitPrice") + .HasColumnType("numeric") + .HasColumnName("unit_price"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_order_item"); + + b.HasIndex("OrderId") + .HasDatabaseName("ix_order_item_order_id"); + + b.ToTable("order_item", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Promotion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text") + .HasColumnName("code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("end_date"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("start_date"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_promotion"); + + b.HasIndex("Code") + .IsUnique() + .HasDatabaseName("ix_promotion_code"); + + b.ToTable("promotion", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.TaskExecutionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualExecutionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("actual_execution_time"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment"); + + b.Property("RetryCount") + .HasColumnType("integer") + .HasColumnName("retry_count"); + + b.Property("ScheduledExecutionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("scheduled_execution_time"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("TaskName") + .HasColumnType("text") + .HasColumnName("task_name"); + + b.HasKey("Id") + .HasName("pk_task_execution_log"); + + b.ToTable("task_execution_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Unsubscribe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_unsubscribe"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_unsubscribe_contact_id"); + + b.ToTable("unsubscribe", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.User", b => + { + b.Property("Id") + .HasColumnType("text") + .HasColumnName("id"); + + b.Property("AccessFailedCount") + .HasColumnType("integer") + .HasColumnName("access_failed_count"); + + b.Property("AvatarUrl") + .IsRequired() + .HasColumnType("text") + .HasColumnName("avatar_url"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text") + .HasColumnName("concurrency_stamp"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property>("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("display_name"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("email"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean") + .HasColumnName("email_confirmed"); + + b.Property("LastTimeLoggedIn") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_time_logged_in"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean") + .HasColumnName("lockout_enabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("lockout_end"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_email"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_user_name"); + + b.Property("PasswordHash") + .HasColumnType("text") + .HasColumnName("password_hash"); + + b.Property("PhoneNumber") + .HasColumnType("text") + .HasColumnName("phone_number"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean") + .HasColumnName("phone_number_confirmed"); + + b.Property("SecurityStamp") + .HasColumnType("text") + .HasColumnName("security_stamp"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean") + .HasColumnName("two_factor_enabled"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("users", (string)null); + }); + + modelBuilder.Entity("ContactDeal", b => + { + b.HasOne("OnlineSales.Entities.Contact", null) + .WithMany() + .HasForeignKey("ContactsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_deal_contact_contacts_id"); + + b.HasOne("OnlineSales.Entities.Deal", null) + .WithMany() + .HasForeignKey("DealsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_deal_deal_deals_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_role_claims_roles_role_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_claims_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_logins_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_roles_roles_role_id"); + + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_roles_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_tokens_users_user_id"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Comment", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_comment_contact_contact_id"); + + b.HasOne("OnlineSales.Entities.Comment", "Parent") + .WithMany() + .HasForeignKey("ParentId") + .HasConstraintName("fk_comment_comment_parent_id"); + + b.Navigation("Contact"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Contacts") + .HasForeignKey("AccountId") + .OnDelete(DeleteBehavior.Restrict) + .HasConstraintName("fk_contact_account_account_id"); + + b.HasOne("OnlineSales.Entities.Domain", "Domain") + .WithMany("Contacts") + .HasForeignKey("DomainId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired() + .HasConstraintName("fk_contact_domain_domain_id"); + + b.HasOne("OnlineSales.Entities.Unsubscribe", "Unsubscribe") + .WithMany() + .HasForeignKey("UnsubscribeId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("fk_contact_unsubscribe_unsubscribe_id"); + + b.Navigation("Account"); + + b.Navigation("Domain"); + + b.Navigation("Unsubscribe"); + }); + + modelBuilder.Entity("OnlineSales.Entities.ContactEmailSchedule", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_email_schedule_contact_contact_id"); + + b.HasOne("OnlineSales.Entities.EmailSchedule", "Schedule") + .WithMany() + .HasForeignKey("ScheduleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_email_schedule_email_schedule_schedule_id"); + + b.Navigation("Contact"); + + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Deal", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Deals") + .HasForeignKey("AccountId") + .HasConstraintName("fk_deal_account_account_id"); + + b.HasOne("OnlineSales.Entities.DealPipeline", "DealPipeline") + .WithMany() + .HasForeignKey("DealPipelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_deal_pipeline_deal_pipeline_id"); + + b.HasOne("OnlineSales.Entities.DealPipelineStage", "DealPipelineStage") + .WithMany() + .HasForeignKey("DealPipelineStageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_deal_pipeline_stage_deal_pipeline_stage_id"); + + b.HasOne("OnlineSales.Entities.User", "CreatedBy") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_users_user_id"); + + b.Navigation("Account"); + + b.Navigation("CreatedBy"); + + b.Navigation("DealPipeline"); + + b.Navigation("DealPipelineStage"); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipelineStage", b => + { + b.HasOne("OnlineSales.Entities.DealPipeline", "DealPipeline") + .WithMany("PipelineStages") + .HasForeignKey("DealPipelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_pipeline_stage_deal_pipeline_deal_pipeline_id"); + + b.Navigation("DealPipeline"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Discount", b => + { + b.HasOne("OnlineSales.Entities.Order", "Order") + .WithMany("Discounts") + .HasForeignKey("OrderId") + .HasConstraintName("fk_discount_order_order_id"); + + b.HasOne("OnlineSales.Entities.OrderItem", "OrderItem") + .WithOne("Discount") + .HasForeignKey("OnlineSales.Entities.Discount", "OrderItemId") + .HasConstraintName("fk_discount_order_item_order_item_id"); + + b.HasOne("OnlineSales.Entities.Promotion", "Promotion") + .WithMany() + .HasForeignKey("PromotionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_discount_promotion_promotion_id"); + + b.Navigation("Order"); + + b.Navigation("OrderItem"); + + b.Navigation("Promotion"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Domains") + .HasForeignKey("AccountId") + .OnDelete(DeleteBehavior.Restrict) + .HasConstraintName("fk_domain_account_account_id"); + + b.Navigation("Account"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailLog", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .HasConstraintName("fk_email_log_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailSchedule", b => + { + b.HasOne("OnlineSales.Entities.EmailGroup", "Group") + .WithMany() + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_email_schedule_email_group_group_id"); + + b.Navigation("Group"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailTemplate", b => + { + b.HasOne("OnlineSales.Entities.EmailGroup", "EmailGroup") + .WithMany("EmailTemplates") + .HasForeignKey("EmailGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_email_template_email_group_email_group_id"); + + b.Navigation("EmailGroup"); + }); + + modelBuilder.Entity("OnlineSales.Entities.LinkLog", b => + { + b.HasOne("OnlineSales.Entities.Link", "Link") + .WithMany() + .HasForeignKey("LinkId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_link_log_link_link_id"); + + b.Navigation("Link"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany("Orders") + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_order_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.HasOne("OnlineSales.Entities.Order", "Order") + .WithMany("OrderItems") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_order_item_order_order_id"); + + b.Navigation("Order"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Unsubscribe", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .HasConstraintName("fk_unsubscribe_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Account", b => + { + b.Navigation("Contacts"); + + b.Navigation("Deals"); + + b.Navigation("Domains"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipeline", b => + { + b.Navigation("PipelineStages"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.Navigation("Contacts"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailGroup", b => + { + b.Navigation("EmailTemplates"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.Navigation("Discounts"); + + b.Navigation("OrderItems"); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.Navigation("Discount"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/OnlineSales/Migrations/20240229135527_Recipients.cs b/src/OnlineSales/Migrations/20240229135527_Recipients.cs new file mode 100644 index 00000000..59e95824 --- /dev/null +++ b/src/OnlineSales/Migrations/20240229135527_Recipients.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace OnlineSales.Migrations +{ + /// + public partial class Recipients : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "recipient", + table: "email_log", + newName: "recipients"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "recipients", + table: "email_log", + newName: "recipient"); + } + } +} diff --git a/src/OnlineSales/Migrations/20240308170224_MakeHtmlBodyNullable.Designer.cs b/src/OnlineSales/Migrations/20240308170224_MakeHtmlBodyNullable.Designer.cs new file mode 100644 index 00000000..302ae338 --- /dev/null +++ b/src/OnlineSales/Migrations/20240308170224_MakeHtmlBodyNullable.Designer.cs @@ -0,0 +1,2692 @@ +// +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using OnlineSales.Data; +using OnlineSales.Entities; + +#nullable disable + +namespace OnlineSales.Migrations +{ + [DbContext(typeof(PgDbContext))] + [Migration("20240308170224_MakeHtmlBodyNullable")] + partial class MakeHtmlBodyNullable + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("ContactDeal", b => + { + b.Property("ContactsId") + .HasColumnType("integer") + .HasColumnName("contacts_id"); + + b.Property("DealsId") + .HasColumnType("integer") + .HasColumnName("deals_id"); + + b.HasKey("ContactsId", "DealsId") + .HasName("pk_contact_deal"); + + b.HasIndex("DealsId") + .HasDatabaseName("ix_contact_deal_deals_id"); + + b.ToTable("contact_deal", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("text") + .HasColumnName("id"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text") + .HasColumnName("concurrency_stamp"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("name"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_name"); + + b.HasKey("Id") + .HasName("pk_roles"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("roles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text") + .HasColumnName("claim_type"); + + b.Property("ClaimValue") + .HasColumnType("text") + .HasColumnName("claim_value"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("role_id"); + + b.HasKey("Id") + .HasName("pk_role_claims"); + + b.HasIndex("RoleId") + .HasDatabaseName("ix_role_claims_role_id"); + + b.ToTable("role_claims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text") + .HasColumnName("claim_type"); + + b.Property("ClaimValue") + .HasColumnType("text") + .HasColumnName("claim_value"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_user_claims"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_user_claims_user_id"); + + b.ToTable("user_claims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text") + .HasColumnName("login_provider"); + + b.Property("ProviderKey") + .HasColumnType("text") + .HasColumnName("provider_key"); + + b.Property("ProviderDisplayName") + .HasColumnType("text") + .HasColumnName("provider_display_name"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("LoginProvider", "ProviderKey") + .HasName("pk_user_logins"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_user_logins_user_id"); + + b.ToTable("user_logins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("text") + .HasColumnName("user_id"); + + b.Property("RoleId") + .HasColumnType("text") + .HasColumnName("role_id"); + + b.HasKey("UserId", "RoleId") + .HasName("pk_user_roles"); + + b.HasIndex("RoleId") + .HasDatabaseName("ix_user_roles_role_id"); + + b.ToTable("user_roles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("text") + .HasColumnName("user_id"); + + b.Property("LoginProvider") + .HasColumnType("text") + .HasColumnName("login_provider"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Value") + .HasColumnType("text") + .HasColumnName("value"); + + b.HasKey("UserId", "LoginProvider", "Name") + .HasName("pk_user_tokens"); + + b.ToTable("user_tokens", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Account", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CityName") + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("EmployeesRange") + .HasColumnType("text") + .HasColumnName("employees_range"); + + b.Property("LogoUrl") + .HasColumnType("text") + .HasColumnName("logo_url"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Revenue") + .HasColumnType("double precision") + .HasColumnName("revenue"); + + b.Property("SiteUrl") + .HasColumnType("text") + .HasColumnName("site_url"); + + b.Property>("SocialMedia") + .HasColumnType("jsonb") + .HasColumnName("social_media"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("State") + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("Tags") + .HasColumnType("jsonb") + .HasColumnName("tags"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_account"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_account_name"); + + b.ToTable("account", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.ChangeLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Data") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("EntityState") + .HasColumnType("integer") + .HasColumnName("entity_state"); + + b.Property("ObjectId") + .HasColumnType("integer") + .HasColumnName("object_id"); + + b.Property("ObjectType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("object_type"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_change_log"); + + b.ToTable("change_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.ChangeLogTaskLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChangeLogIdMax") + .HasColumnType("integer") + .HasColumnName("change_log_id_max"); + + b.Property("ChangeLogIdMin") + .HasColumnType("integer") + .HasColumnName("change_log_id_min"); + + b.Property("ChangesProcessed") + .HasColumnType("integer") + .HasColumnName("changes_processed"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Start") + .HasColumnType("timestamp with time zone") + .HasColumnName("start"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("state"); + + b.Property("TaskName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("task_name"); + + b.HasKey("Id") + .HasName("pk_change_log_task_log"); + + b.ToTable("change_log_task_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AuthorEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author_email"); + + b.Property("AuthorName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author_name"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body"); + + b.Property("CommentableId") + .HasColumnType("integer") + .HasColumnName("commentable_id"); + + b.Property("CommentableType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("commentable_type"); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text") + .HasColumnName("key"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("ParentId") + .HasColumnType("integer") + .HasColumnName("parent_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_comment"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_comment_contact_id"); + + b.HasIndex("ParentId") + .HasDatabaseName("ix_comment_parent_id"); + + b.ToTable("comment", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("Address1") + .HasColumnType("text") + .HasColumnName("address1"); + + b.Property("Address2") + .HasColumnType("text") + .HasColumnName("address2"); + + b.Property("Birthday") + .HasColumnType("timestamp with time zone") + .HasColumnName("birthday"); + + b.Property("CityName") + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("CompanyName") + .HasColumnType("text") + .HasColumnName("company_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Department") + .HasColumnType("text") + .HasColumnName("department"); + + b.Property("DomainId") + .HasColumnType("integer") + .HasColumnName("domain_id"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text") + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnType("text") + .HasColumnName("first_name"); + + b.Property("JobTitle") + .HasColumnType("text") + .HasColumnName("job_title"); + + b.Property("Language") + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("LastName") + .HasColumnType("text") + .HasColumnName("last_name"); + + b.Property("MiddleName") + .HasColumnType("text") + .HasColumnName("middle_name"); + + b.Property("Phone") + .HasColumnType("text") + .HasColumnName("phone"); + + b.Property("Prefix") + .HasColumnType("text") + .HasColumnName("prefix"); + + b.Property>("SocialMedia") + .HasColumnType("jsonb") + .HasColumnName("social_media"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("State") + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("Timezone") + .HasColumnType("integer") + .HasColumnName("timezone"); + + b.Property("UnsubscribeId") + .HasColumnType("integer") + .HasColumnName("unsubscribe_id"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("Zip") + .HasColumnType("text") + .HasColumnName("zip"); + + b.HasKey("Id") + .HasName("pk_contact"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_contact_account_id"); + + b.HasIndex("DomainId") + .HasDatabaseName("ix_contact_domain_id"); + + b.HasIndex("Email") + .IsUnique() + .HasDatabaseName("ix_contact_email"); + + b.HasIndex("UnsubscribeId") + .HasDatabaseName("ix_contact_unsubscribe_id"); + + b.ToTable("contact", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.ContactEmailSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("ScheduleId") + .HasColumnType("integer") + .HasColumnName("schedule_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_contact_email_schedule"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_contact_email_schedule_contact_id"); + + b.HasIndex("ScheduleId") + .HasDatabaseName("ix_contact_email_schedule_schedule_id"); + + b.ToTable("contact_email_schedule", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Content", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AllowComments") + .HasColumnType("boolean") + .HasColumnName("allow_comments"); + + b.Property("Author") + .IsRequired() + .HasColumnType("text") + .HasColumnName("author"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body"); + + b.Property("Category") + .IsRequired() + .HasColumnType("text") + .HasColumnName("category"); + + b.Property("CoverImageAlt") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cover_image_alt"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text") + .HasColumnName("cover_image_url"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("PublishedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("published_at"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Tags") + .IsRequired() + .HasColumnType("text[]") + .HasColumnName("tags"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("Type") + .IsRequired() + .HasColumnType("text") + .HasColumnName("type"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_content"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_content_slug"); + + b.ToTable("content", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Deal", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("ActualCloseDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("actual_close_date"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("DealCurrency") + .HasColumnType("text") + .HasColumnName("deal_currency"); + + b.Property("DealPipelineId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_id"); + + b.Property("DealPipelineStageId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_stage_id"); + + b.Property("DealValue") + .HasColumnType("numeric") + .HasColumnName("deal_value"); + + b.Property("ExpectedCloseDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("expected_close_date"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_deal"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_deal_account_id"); + + b.HasIndex("DealPipelineId") + .HasDatabaseName("ix_deal_deal_pipeline_id"); + + b.HasIndex("DealPipelineStageId") + .HasDatabaseName("ix_deal_deal_pipeline_stage_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_deal_user_id"); + + b.ToTable("deal", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipeline", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_deal_pipeline"); + + b.ToTable("deal_pipeline", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipelineStage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("DealPipelineId") + .HasColumnType("integer") + .HasColumnName("deal_pipeline_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Order") + .HasColumnType("integer") + .HasColumnName("order"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_deal_pipeline_stage"); + + b.HasIndex("DealPipelineId") + .HasDatabaseName("ix_deal_pipeline_stage_deal_pipeline_id"); + + b.ToTable("deal_pipeline_stage", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Discount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("OrderId") + .HasColumnType("integer") + .HasColumnName("order_id"); + + b.Property("OrderItemId") + .HasColumnType("integer") + .HasColumnName("order_item_id"); + + b.Property("PromotionId") + .HasColumnType("integer") + .HasColumnName("promotion_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.Property("Value") + .HasColumnType("numeric") + .HasColumnName("value"); + + b.HasKey("Id") + .HasName("pk_discount"); + + b.HasIndex("OrderId") + .HasDatabaseName("ix_discount_order_id"); + + b.HasIndex("OrderItemId") + .IsUnique() + .HasDatabaseName("ix_discount_order_item_id"); + + b.HasIndex("PromotionId") + .HasDatabaseName("ix_discount_promotion_id"); + + b.ToTable("discount", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("integer") + .HasColumnName("account_id"); + + b.Property("AccountStatus") + .HasColumnType("integer") + .HasColumnName("account_status"); + + b.Property("CatchAll") + .HasColumnType("boolean") + .HasColumnName("catch_all"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("Disposable") + .HasColumnType("boolean") + .HasColumnName("disposable"); + + b.Property("DnsCheck") + .HasColumnType("boolean") + .HasColumnName("dns_check"); + + b.Property>("DnsRecords") + .HasColumnType("jsonb") + .HasColumnName("dns_records"); + + b.Property("FaviconUrl") + .HasColumnType("text") + .HasColumnName("favicon_url"); + + b.Property("Free") + .HasColumnType("boolean") + .HasColumnName("free"); + + b.Property("HttpCheck") + .HasColumnType("boolean") + .HasColumnName("http_check"); + + b.Property("MxCheck") + .HasColumnType("boolean") + .HasColumnName("mx_check"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("Url") + .HasColumnType("text") + .HasColumnName("url"); + + b.HasKey("Id") + .HasName("pk_domain"); + + b.HasIndex("AccountId") + .HasDatabaseName("ix_domain_account_id"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_domain_name"); + + b.ToTable("domain", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_group"); + + b.ToTable("email_group", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("FromEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_email"); + + b.Property("HtmlBody") + .HasColumnType("text") + .HasColumnName("html_body"); + + b.Property("MessageId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_id"); + + b.Property("Recipients") + .IsRequired() + .HasColumnType("text") + .HasColumnName("recipients"); + + b.Property("ScheduleId") + .HasColumnType("integer") + .HasColumnName("schedule_id"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text") + .HasColumnName("subject"); + + b.Property("TemplateId") + .HasColumnType("integer") + .HasColumnName("template_id"); + + b.Property("TextBody") + .HasColumnType("text") + .HasColumnName("text_body"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_log"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_email_log_contact_id"); + + b.ToTable("email_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("GroupId") + .HasColumnType("integer") + .HasColumnName("group_id"); + + b.Property("Schedule") + .IsRequired() + .HasColumnType("text") + .HasColumnName("schedule"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_schedule"); + + b.HasIndex("GroupId") + .HasDatabaseName("ix_email_schedule_group_id"); + + b.ToTable("email_schedule", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BodyTemplate") + .IsRequired() + .HasColumnType("text") + .HasColumnName("body_template"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("EmailGroupId") + .HasColumnType("integer") + .HasColumnName("email_group_id"); + + b.Property("FromEmail") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_email"); + + b.Property("FromName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("from_name"); + + b.Property("Language") + .IsRequired() + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("RetryCount") + .HasColumnType("integer") + .HasColumnName("retry_count"); + + b.Property("RetryInterval") + .HasColumnType("integer") + .HasColumnName("retry_interval"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("text") + .HasColumnName("subject"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_email_template"); + + b.HasIndex("EmailGroupId") + .HasDatabaseName("ix_email_template_email_group_id"); + + b.ToTable("email_template", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.File", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Extension") + .IsRequired() + .HasColumnType("text") + .HasColumnName("extension"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("mime_type"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ScopeUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("scope_uid"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("size"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_file"); + + b.ToTable("file", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.IpDetails", b => + { + b.Property("Ip") + .HasColumnType("text") + .HasColumnName("ip"); + + b.Property("CityName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("city_name"); + + b.Property("ContinentCode") + .HasColumnType("integer") + .HasColumnName("continent_code"); + + b.Property("CountryCode") + .HasColumnType("integer") + .HasColumnName("country_code"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Ip") + .HasName("pk_ip_details"); + + b.HasIndex("Ip") + .IsUnique() + .HasDatabaseName("ix_ip_details_ip"); + + b.ToTable("ip_details", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Link", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Destination") + .IsRequired() + .HasColumnType("text") + .HasColumnName("destination"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("uid"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_link"); + + b.HasIndex("Uid") + .IsUnique() + .HasDatabaseName("ix_link_uid"); + + b.ToTable("link", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.LinkLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Destination") + .IsRequired() + .HasColumnType("text") + .HasColumnName("destination"); + + b.Property("LinkId") + .HasColumnType("integer") + .HasColumnName("link_id"); + + b.Property("Referrer") + .HasColumnType("text") + .HasColumnName("referrer"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_link_log"); + + b.HasIndex("LinkId") + .HasDatabaseName("ix_link_log_link_id"); + + b.ToTable("link_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Media", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Extension") + .IsRequired() + .HasColumnType("text") + .HasColumnName("extension"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("text") + .HasColumnName("mime_type"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ScopeUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("scope_uid"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("size"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_media"); + + b.ToTable("media", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AffiliateName") + .HasColumnType("text") + .HasColumnName("affiliate_name"); + + b.Property("Commission") + .HasColumnType("numeric") + .HasColumnName("commission"); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("ContactIp") + .HasColumnType("text") + .HasColumnName("contact_ip"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("text") + .HasColumnName("currency"); + + b.Property("CurrencyTotal") + .HasColumnType("numeric") + .HasColumnName("currency_total"); + + b.Property("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("ExchangeRate") + .HasColumnType("numeric") + .HasColumnName("exchange_rate"); + + b.Property("OrderNumber") + .HasColumnType("text") + .HasColumnName("order_number"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("quantity"); + + b.Property("RefNo") + .IsRequired() + .HasColumnType("text") + .HasColumnName("ref_no"); + + b.Property("Refund") + .HasColumnType("numeric") + .HasColumnName("refund"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("TestOrder") + .HasColumnType("boolean") + .HasColumnName("test_order"); + + b.Property("Total") + .HasColumnType("numeric") + .HasColumnName("total"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_order"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_order_contact_id"); + + b.HasIndex("RefNo") + .IsUnique() + .HasDatabaseName("ix_order_ref_no"); + + b.ToTable("order", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("text") + .HasColumnName("currency"); + + b.Property("CurrencyTotal") + .HasColumnType("numeric") + .HasColumnName("currency_total"); + + b.Property("OrderId") + .HasColumnType("integer") + .HasColumnName("order_id"); + + b.Property("ProductName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("product_name"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("quantity"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Total") + .HasColumnType("numeric") + .HasColumnName("total"); + + b.Property("UnitPrice") + .HasColumnType("numeric") + .HasColumnName("unit_price"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_order_item"); + + b.HasIndex("OrderId") + .HasDatabaseName("ix_order_item_order_id"); + + b.ToTable("order_item", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Promotion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text") + .HasColumnName("code"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("EndDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("end_date"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("start_date"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_at"); + + b.Property("UpdatedById") + .HasColumnType("text") + .HasColumnName("updated_by_id"); + + b.Property("UpdatedByIp") + .HasColumnType("text") + .HasColumnName("updated_by_ip"); + + b.Property("UpdatedByUserAgent") + .HasColumnType("text") + .HasColumnName("updated_by_user_agent"); + + b.HasKey("Id") + .HasName("pk_promotion"); + + b.HasIndex("Code") + .IsUnique() + .HasDatabaseName("ix_promotion_code"); + + b.ToTable("promotion", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.TaskExecutionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ActualExecutionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("actual_execution_time"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment"); + + b.Property("RetryCount") + .HasColumnType("integer") + .HasColumnName("retry_count"); + + b.Property("ScheduledExecutionTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("scheduled_execution_time"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("TaskName") + .HasColumnType("text") + .HasColumnName("task_name"); + + b.HasKey("Id") + .HasName("pk_task_execution_log"); + + b.ToTable("task_execution_log", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.Unsubscribe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ContactId") + .HasColumnType("integer") + .HasColumnName("contact_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("text") + .HasColumnName("created_by_id"); + + b.Property("CreatedByIp") + .HasColumnType("text") + .HasColumnName("created_by_ip"); + + b.Property("CreatedByUserAgent") + .HasColumnType("text") + .HasColumnName("created_by_user_agent"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("Source") + .HasColumnType("text") + .HasColumnName("source"); + + b.HasKey("Id") + .HasName("pk_unsubscribe"); + + b.HasIndex("ContactId") + .HasDatabaseName("ix_unsubscribe_contact_id"); + + b.ToTable("unsubscribe", (string)null); + }); + + modelBuilder.Entity("OnlineSales.Entities.User", b => + { + b.Property("Id") + .HasColumnType("text") + .HasColumnName("id"); + + b.Property("AccessFailedCount") + .HasColumnType("integer") + .HasColumnName("access_failed_count"); + + b.Property("AvatarUrl") + .IsRequired() + .HasColumnType("text") + .HasColumnName("avatar_url"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text") + .HasColumnName("concurrency_stamp"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property>("Data") + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("display_name"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("email"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean") + .HasColumnName("email_confirmed"); + + b.Property("LastTimeLoggedIn") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_time_logged_in"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean") + .HasColumnName("lockout_enabled"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("lockout_end"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_email"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("normalized_user_name"); + + b.Property("PasswordHash") + .HasColumnType("text") + .HasColumnName("password_hash"); + + b.Property("PhoneNumber") + .HasColumnType("text") + .HasColumnName("phone_number"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean") + .HasColumnName("phone_number_confirmed"); + + b.Property("SecurityStamp") + .HasColumnType("text") + .HasColumnName("security_stamp"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean") + .HasColumnName("two_factor_enabled"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("users", (string)null); + }); + + modelBuilder.Entity("ContactDeal", b => + { + b.HasOne("OnlineSales.Entities.Contact", null) + .WithMany() + .HasForeignKey("ContactsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_deal_contact_contacts_id"); + + b.HasOne("OnlineSales.Entities.Deal", null) + .WithMany() + .HasForeignKey("DealsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_deal_deal_deals_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_role_claims_roles_role_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_claims_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_logins_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_roles_roles_role_id"); + + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_roles_users_user_id"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("OnlineSales.Entities.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_user_tokens_users_user_id"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Comment", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_comment_contact_contact_id"); + + b.HasOne("OnlineSales.Entities.Comment", "Parent") + .WithMany() + .HasForeignKey("ParentId") + .HasConstraintName("fk_comment_comment_parent_id"); + + b.Navigation("Contact"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Contacts") + .HasForeignKey("AccountId") + .OnDelete(DeleteBehavior.Restrict) + .HasConstraintName("fk_contact_account_account_id"); + + b.HasOne("OnlineSales.Entities.Domain", "Domain") + .WithMany("Contacts") + .HasForeignKey("DomainId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired() + .HasConstraintName("fk_contact_domain_domain_id"); + + b.HasOne("OnlineSales.Entities.Unsubscribe", "Unsubscribe") + .WithMany() + .HasForeignKey("UnsubscribeId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("fk_contact_unsubscribe_unsubscribe_id"); + + b.Navigation("Account"); + + b.Navigation("Domain"); + + b.Navigation("Unsubscribe"); + }); + + modelBuilder.Entity("OnlineSales.Entities.ContactEmailSchedule", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_email_schedule_contact_contact_id"); + + b.HasOne("OnlineSales.Entities.EmailSchedule", "Schedule") + .WithMany() + .HasForeignKey("ScheduleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_contact_email_schedule_email_schedule_schedule_id"); + + b.Navigation("Contact"); + + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Deal", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Deals") + .HasForeignKey("AccountId") + .HasConstraintName("fk_deal_account_account_id"); + + b.HasOne("OnlineSales.Entities.DealPipeline", "DealPipeline") + .WithMany() + .HasForeignKey("DealPipelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_deal_pipeline_deal_pipeline_id"); + + b.HasOne("OnlineSales.Entities.DealPipelineStage", "DealPipelineStage") + .WithMany() + .HasForeignKey("DealPipelineStageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_deal_pipeline_stage_deal_pipeline_stage_id"); + + b.HasOne("OnlineSales.Entities.User", "CreatedBy") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_users_user_id"); + + b.Navigation("Account"); + + b.Navigation("CreatedBy"); + + b.Navigation("DealPipeline"); + + b.Navigation("DealPipelineStage"); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipelineStage", b => + { + b.HasOne("OnlineSales.Entities.DealPipeline", "DealPipeline") + .WithMany("PipelineStages") + .HasForeignKey("DealPipelineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_deal_pipeline_stage_deal_pipeline_deal_pipeline_id"); + + b.Navigation("DealPipeline"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Discount", b => + { + b.HasOne("OnlineSales.Entities.Order", "Order") + .WithMany("Discounts") + .HasForeignKey("OrderId") + .HasConstraintName("fk_discount_order_order_id"); + + b.HasOne("OnlineSales.Entities.OrderItem", "OrderItem") + .WithOne("Discount") + .HasForeignKey("OnlineSales.Entities.Discount", "OrderItemId") + .HasConstraintName("fk_discount_order_item_order_item_id"); + + b.HasOne("OnlineSales.Entities.Promotion", "Promotion") + .WithMany() + .HasForeignKey("PromotionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_discount_promotion_promotion_id"); + + b.Navigation("Order"); + + b.Navigation("OrderItem"); + + b.Navigation("Promotion"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.HasOne("OnlineSales.Entities.Account", "Account") + .WithMany("Domains") + .HasForeignKey("AccountId") + .OnDelete(DeleteBehavior.Restrict) + .HasConstraintName("fk_domain_account_account_id"); + + b.Navigation("Account"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailLog", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .HasConstraintName("fk_email_log_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailSchedule", b => + { + b.HasOne("OnlineSales.Entities.EmailGroup", "Group") + .WithMany() + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_email_schedule_email_group_group_id"); + + b.Navigation("Group"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailTemplate", b => + { + b.HasOne("OnlineSales.Entities.EmailGroup", "EmailGroup") + .WithMany("EmailTemplates") + .HasForeignKey("EmailGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_email_template_email_group_email_group_id"); + + b.Navigation("EmailGroup"); + }); + + modelBuilder.Entity("OnlineSales.Entities.LinkLog", b => + { + b.HasOne("OnlineSales.Entities.Link", "Link") + .WithMany() + .HasForeignKey("LinkId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_link_log_link_link_id"); + + b.Navigation("Link"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany("Orders") + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_order_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.HasOne("OnlineSales.Entities.Order", "Order") + .WithMany("OrderItems") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_order_item_order_order_id"); + + b.Navigation("Order"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Unsubscribe", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .HasConstraintName("fk_unsubscribe_contact_contact_id"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Account", b => + { + b.Navigation("Contacts"); + + b.Navigation("Deals"); + + b.Navigation("Domains"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Contact", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("OnlineSales.Entities.DealPipeline", b => + { + b.Navigation("PipelineStages"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Domain", b => + { + b.Navigation("Contacts"); + }); + + modelBuilder.Entity("OnlineSales.Entities.EmailGroup", b => + { + b.Navigation("EmailTemplates"); + }); + + modelBuilder.Entity("OnlineSales.Entities.Order", b => + { + b.Navigation("Discounts"); + + b.Navigation("OrderItems"); + }); + + modelBuilder.Entity("OnlineSales.Entities.OrderItem", b => + { + b.Navigation("Discount"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/OnlineSales/Migrations/20240308170224_MakeHtmlBodyNullable.cs b/src/OnlineSales/Migrations/20240308170224_MakeHtmlBodyNullable.cs new file mode 100644 index 00000000..9b09c6b7 --- /dev/null +++ b/src/OnlineSales/Migrations/20240308170224_MakeHtmlBodyNullable.cs @@ -0,0 +1,36 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace OnlineSales.Migrations +{ + /// + public partial class MakeHtmlBodyNullable : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "html_body", + table: "email_log", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "html_body", + table: "email_log", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + } + } +} diff --git a/src/OnlineSales/Migrations/PgDbContextModelSnapshot.cs b/src/OnlineSales/Migrations/PgDbContextModelSnapshot.cs index db0556a5..845ac2d6 100644 --- a/src/OnlineSales/Migrations/PgDbContextModelSnapshot.cs +++ b/src/OnlineSales/Migrations/PgDbContextModelSnapshot.cs @@ -1304,11 +1304,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Body") - .IsRequired() - .HasColumnType("text") - .HasColumnName("body"); - b.Property("ContactId") .HasColumnType("integer") .HasColumnName("contact_id"); @@ -1334,15 +1329,19 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("text") .HasColumnName("from_email"); + b.Property("HtmlBody") + .HasColumnType("text") + .HasColumnName("html_body"); + b.Property("MessageId") .IsRequired() .HasColumnType("text") .HasColumnName("message_id"); - b.Property("Recipient") + b.Property("Recipients") .IsRequired() .HasColumnType("text") - .HasColumnName("recipient"); + .HasColumnName("recipients"); b.Property("ScheduleId") .HasColumnType("integer") @@ -1365,6 +1364,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("integer") .HasColumnName("template_id"); + b.Property("TextBody") + .HasColumnType("text") + .HasColumnName("text_body"); + b.Property("UpdatedAt") .HasColumnType("timestamp with time zone") .HasColumnName("updated_at"); @@ -1384,6 +1387,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id") .HasName("pk_email_log"); + b.HasIndex("ContactId") + .HasDatabaseName("ix_email_log_contact_id"); + b.ToTable("email_log", (string)null); }); @@ -2557,6 +2563,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Account"); }); + modelBuilder.Entity("OnlineSales.Entities.EmailLog", b => + { + b.HasOne("OnlineSales.Entities.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .HasConstraintName("fk_email_log_contact_contact_id"); + + b.Navigation("Contact"); + }); + modelBuilder.Entity("OnlineSales.Entities.EmailSchedule", b => { b.HasOne("OnlineSales.Entities.EmailGroup", "Group") diff --git a/src/OnlineSales/OnlineSales.csproj b/src/OnlineSales/OnlineSales.csproj index 14a2033f..b2c1ba5e 100644 --- a/src/OnlineSales/OnlineSales.csproj +++ b/src/OnlineSales/OnlineSales.csproj @@ -7,7 +7,7 @@ OnlineSales true 98270385-43f2-4d3c-98d5-02d0d77fc2d9 - 1.2.22-pre + 1.2.23-pre OnlineSales True OnlineSales @@ -33,7 +33,7 @@ - + obj\Release\net7.0\OnlineSales.xml true obj\Release\net7.0\OnlineSales.xml diff --git a/src/OnlineSales/Services/EmailWithLogService.cs b/src/OnlineSales/Services/EmailWithLogService.cs index 14d80f0a..955e7fbf 100644 --- a/src/OnlineSales/Services/EmailWithLogService.cs +++ b/src/OnlineSales/Services/EmailWithLogService.cs @@ -99,8 +99,8 @@ private async Task AddEmailLogEntry(string subject, string fromEmail, string bod log.Subject = subject; log.FromEmail = fromEmail; - log.Body = body; - log.Recipient = recipient; + log.HtmlBody = body; + log.Recipients = recipient; log.Status = status ? EmailStatus.Sent : EmailStatus.NotSent; log.CreatedAt = DateTime.UtcNow; log.MessageId = messageId; diff --git a/src/OnlineSales/Tasks/SyncEmailLogTask.cs b/src/OnlineSales/Tasks/SyncEmailLogTask.cs index 633fdb26..686cd646 100644 --- a/src/OnlineSales/Tasks/SyncEmailLogTask.cs +++ b/src/OnlineSales/Tasks/SyncEmailLogTask.cs @@ -48,18 +48,18 @@ public async override Task Execute(TaskExecutionLog currentJob) var maxId = await logService.GetMaxId(SourceName); var batch = await dbContext.EmailLogs!.Where(e => e.Id > maxId).OrderBy(e => e.Id).Take(batchSize).ToListAsync(); - var batchContacts = batch.Select(b => b.Recipient).ToArray(); + var batchContacts = batch.Select(b => b.Recipients).ToArray(); var existingContacts = await dbContext.Contacts!.Where(contact => batchContacts.Contains(contact.Email)).ToDictionaryAsync(k => k.Email); var converted = batch.Select(log => { Contact? contact; - if (!existingContacts.TryGetValue(log.Recipient, out contact)) + if (!existingContacts.TryGetValue(log.Recipients, out contact)) { contact = new Contact { - Email = log.Recipient, + Email = log.Recipients, }; contactService.SaveAsync(contact).Wait(); @@ -72,7 +72,7 @@ public async override Task Execute(TaskExecutionLog currentJob) Type = "Message", ContactId = contact.Id, CreatedAt = log.CreatedAt, - Data = JsonHelper.Serialize(new { Id = log.Id, Status = log.Status, Sender = log.FromEmail, Recipient = log.Recipient, Subject = log.Subject }), + Data = JsonHelper.Serialize(new { Id = log.Id, Status = log.Status, Sender = log.FromEmail, Recipient = log.Recipients, Subject = log.Subject }), }; }).ToList(); diff --git a/tests/OnlineSales.Tests/OnlineSales.Tests.csproj b/tests/OnlineSales.Tests/OnlineSales.Tests.csproj index 037efda9..a97f6ff4 100644 --- a/tests/OnlineSales.Tests/OnlineSales.Tests.csproj +++ b/tests/OnlineSales.Tests/OnlineSales.Tests.csproj @@ -6,7 +6,7 @@ enable false - 1.2.22-pre + 1.2.23-pre Debug;Release;Migration