Add initial EF Core migration
Creates all database tables: users, accounts, transactions, categories, payees, budgets, scheduled_transactions, loans, investments, reconciliations, plugins, and import batches. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,800 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Purrse.Data.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class InitialCreate : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "plugin_registrations",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
PluginId = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
|
||||||
|
Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
|
||||||
|
Version = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
|
||||||
|
EntryAssembly = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: false),
|
||||||
|
EntryType = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: false),
|
||||||
|
IsEnabled = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
|
InstalledAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_plugin_registrations", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "securities",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Symbol = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
|
||||||
|
Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
|
||||||
|
SecurityType = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_securities", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "users",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Username = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: false),
|
||||||
|
Email = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
|
||||||
|
PasswordHash = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
|
||||||
|
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
LastLoginAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
|
||||||
|
RefreshToken = table.Column<string>(type: "text", nullable: true),
|
||||||
|
RefreshTokenExpiresAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_users", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "plugin_configurations",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
PluginRegistrationId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Key = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
|
||||||
|
Value = table.Column<string>(type: "character varying(2000)", maxLength: 2000, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_plugin_configurations", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_plugin_configurations_plugin_registrations_PluginRegistrati~",
|
||||||
|
column: x => x.PluginRegistrationId,
|
||||||
|
principalTable: "plugin_registrations",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "security_prices",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
SecurityId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
Price = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_security_prices", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_security_prices_securities_SecurityId",
|
||||||
|
column: x => x.SecurityId,
|
||||||
|
principalTable: "securities",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "accounts",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
UserId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
|
||||||
|
Type = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
Institution = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: true),
|
||||||
|
AccountNumber = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true),
|
||||||
|
Balance = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
CreditLimit = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true),
|
||||||
|
InterestRate = table.Column<decimal>(type: "numeric(8,4)", precision: 8, scale: 4, nullable: true),
|
||||||
|
IsActive = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
|
IsClosed = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
|
Notes = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: true),
|
||||||
|
SortOrder = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_accounts", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_accounts_users_UserId",
|
||||||
|
column: x => x.UserId,
|
||||||
|
principalTable: "users",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "budgets",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
UserId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Year = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
Month = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
Notes = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
|
||||||
|
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_budgets", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_budgets_users_UserId",
|
||||||
|
column: x => x.UserId,
|
||||||
|
principalTable: "users",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "categories",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
UserId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
|
||||||
|
Type = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
ParentId = table.Column<Guid>(type: "uuid", nullable: true),
|
||||||
|
SortOrder = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
IsSystem = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
|
IsActive = table.Column<bool>(type: "boolean", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_categories", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_categories_categories_ParentId",
|
||||||
|
column: x => x.ParentId,
|
||||||
|
principalTable: "categories",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Restrict);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_categories_users_UserId",
|
||||||
|
column: x => x.UserId,
|
||||||
|
principalTable: "users",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "import_batches",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
UserId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
AccountId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
FileName = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: false),
|
||||||
|
FileType = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
|
||||||
|
TotalCount = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
ImportedCount = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
DuplicateCount = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
SkippedCount = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
Status = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
ImportedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_import_batches", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_import_batches_accounts_AccountId",
|
||||||
|
column: x => x.AccountId,
|
||||||
|
principalTable: "accounts",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_import_batches_users_UserId",
|
||||||
|
column: x => x.UserId,
|
||||||
|
principalTable: "users",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "investment_holdings",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
AccountId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
SecurityId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Shares = table.Column<decimal>(type: "numeric(18,6)", precision: 18, scale: 6, nullable: false),
|
||||||
|
CostBasis = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
AsOfDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_investment_holdings", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_investment_holdings_accounts_AccountId",
|
||||||
|
column: x => x.AccountId,
|
||||||
|
principalTable: "accounts",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_investment_holdings_securities_SecurityId",
|
||||||
|
column: x => x.SecurityId,
|
||||||
|
principalTable: "securities",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "loan_details",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
AccountId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
OriginalBalance = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
InterestRate = table.Column<decimal>(type: "numeric(8,4)", precision: 8, scale: 4, nullable: false),
|
||||||
|
TermMonths = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
MonthlyPayment = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
OriginationDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
MaturityDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
EscrowAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true),
|
||||||
|
ExtraPayment = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_loan_details", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_loan_details_accounts_AccountId",
|
||||||
|
column: x => x.AccountId,
|
||||||
|
principalTable: "accounts",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "reconciliations",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
AccountId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
StatementDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
StatementBalance = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
IsCompleted = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
|
CompletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
|
||||||
|
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_reconciliations", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_reconciliations_accounts_AccountId",
|
||||||
|
column: x => x.AccountId,
|
||||||
|
principalTable: "accounts",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "budget_items",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
BudgetId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
CategoryId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
BudgetedAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_budget_items", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_budget_items_budgets_BudgetId",
|
||||||
|
column: x => x.BudgetId,
|
||||||
|
principalTable: "budgets",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_budget_items_categories_CategoryId",
|
||||||
|
column: x => x.CategoryId,
|
||||||
|
principalTable: "categories",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "payees",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
UserId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Name = table.Column<string>(type: "character varying(300)", maxLength: 300, nullable: false),
|
||||||
|
DefaultCategoryId = table.Column<Guid>(type: "uuid", nullable: true),
|
||||||
|
IsActive = table.Column<bool>(type: "boolean", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_payees", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_payees_categories_DefaultCategoryId",
|
||||||
|
column: x => x.DefaultCategoryId,
|
||||||
|
principalTable: "categories",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.SetNull);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_payees_users_UserId",
|
||||||
|
column: x => x.UserId,
|
||||||
|
principalTable: "users",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "amortization_entries",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
LoanDetailId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
PaymentNumber = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
PaymentDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
PaymentAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
PrincipalAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
InterestAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
EscrowAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true),
|
||||||
|
RemainingBalance = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_amortization_entries", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_amortization_entries_loan_details_LoanDetailId",
|
||||||
|
column: x => x.LoanDetailId,
|
||||||
|
principalTable: "loan_details",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "payee_aliases",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
PayeeId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Alias = table.Column<string>(type: "character varying(300)", maxLength: 300, nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_payee_aliases", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_payee_aliases_payees_PayeeId",
|
||||||
|
column: x => x.PayeeId,
|
||||||
|
principalTable: "payees",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "scheduled_transactions",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
UserId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
AccountId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Amount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
PayeeName = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
|
||||||
|
PayeeId = table.Column<Guid>(type: "uuid", nullable: true),
|
||||||
|
CategoryId = table.Column<Guid>(type: "uuid", nullable: true),
|
||||||
|
Memo = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: true),
|
||||||
|
Type = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
Frequency = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
NextDueDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
EndDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
|
||||||
|
AutoPost = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
|
ReminderDaysBefore = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
IsActive = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
|
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_scheduled_transactions", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_scheduled_transactions_accounts_AccountId",
|
||||||
|
column: x => x.AccountId,
|
||||||
|
principalTable: "accounts",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_scheduled_transactions_categories_CategoryId",
|
||||||
|
column: x => x.CategoryId,
|
||||||
|
principalTable: "categories",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.SetNull);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_scheduled_transactions_payees_PayeeId",
|
||||||
|
column: x => x.PayeeId,
|
||||||
|
principalTable: "payees",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.SetNull);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_scheduled_transactions_users_UserId",
|
||||||
|
column: x => x.UserId,
|
||||||
|
principalTable: "users",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "transactions",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
AccountId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
Amount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
PayeeId = table.Column<Guid>(type: "uuid", nullable: true),
|
||||||
|
PayeeName = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
|
||||||
|
CategoryId = table.Column<Guid>(type: "uuid", nullable: true),
|
||||||
|
Memo = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: true),
|
||||||
|
ReferenceNumber = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: true),
|
||||||
|
CheckNumber = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: true),
|
||||||
|
Type = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
Status = table.Column<int>(type: "integer", nullable: false),
|
||||||
|
FitId = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true),
|
||||||
|
Fingerprint = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true),
|
||||||
|
TransferTransactionId = table.Column<Guid>(type: "uuid", nullable: true),
|
||||||
|
ImportBatchId = table.Column<Guid>(type: "uuid", nullable: true),
|
||||||
|
ReconciliationId = table.Column<Guid>(type: "uuid", nullable: true),
|
||||||
|
IsVoid = table.Column<bool>(type: "boolean", nullable: false),
|
||||||
|
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||||
|
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_transactions", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_transactions_accounts_AccountId",
|
||||||
|
column: x => x.AccountId,
|
||||||
|
principalTable: "accounts",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_transactions_categories_CategoryId",
|
||||||
|
column: x => x.CategoryId,
|
||||||
|
principalTable: "categories",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.SetNull);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_transactions_import_batches_ImportBatchId",
|
||||||
|
column: x => x.ImportBatchId,
|
||||||
|
principalTable: "import_batches",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.SetNull);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_transactions_payees_PayeeId",
|
||||||
|
column: x => x.PayeeId,
|
||||||
|
principalTable: "payees",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.SetNull);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_transactions_reconciliations_ReconciliationId",
|
||||||
|
column: x => x.ReconciliationId,
|
||||||
|
principalTable: "reconciliations",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.SetNull);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_transactions_transactions_TransferTransactionId",
|
||||||
|
column: x => x.TransferTransactionId,
|
||||||
|
principalTable: "transactions",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.SetNull);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "transaction_splits",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
TransactionId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||||
|
CategoryId = table.Column<Guid>(type: "uuid", nullable: true),
|
||||||
|
Amount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
|
||||||
|
Memo = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_transaction_splits", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_transaction_splits_categories_CategoryId",
|
||||||
|
column: x => x.CategoryId,
|
||||||
|
principalTable: "categories",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.SetNull);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_transaction_splits_transactions_TransactionId",
|
||||||
|
column: x => x.TransactionId,
|
||||||
|
principalTable: "transactions",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_accounts_UserId",
|
||||||
|
table: "accounts",
|
||||||
|
column: "UserId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_amortization_entries_LoanDetailId",
|
||||||
|
table: "amortization_entries",
|
||||||
|
column: "LoanDetailId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_budget_items_BudgetId",
|
||||||
|
table: "budget_items",
|
||||||
|
column: "BudgetId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_budget_items_CategoryId",
|
||||||
|
table: "budget_items",
|
||||||
|
column: "CategoryId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_budgets_UserId_Year_Month",
|
||||||
|
table: "budgets",
|
||||||
|
columns: new[] { "UserId", "Year", "Month" },
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_categories_ParentId",
|
||||||
|
table: "categories",
|
||||||
|
column: "ParentId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_categories_UserId_Name_ParentId",
|
||||||
|
table: "categories",
|
||||||
|
columns: new[] { "UserId", "Name", "ParentId" },
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_import_batches_AccountId",
|
||||||
|
table: "import_batches",
|
||||||
|
column: "AccountId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_import_batches_UserId",
|
||||||
|
table: "import_batches",
|
||||||
|
column: "UserId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_investment_holdings_AccountId",
|
||||||
|
table: "investment_holdings",
|
||||||
|
column: "AccountId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_investment_holdings_SecurityId",
|
||||||
|
table: "investment_holdings",
|
||||||
|
column: "SecurityId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_loan_details_AccountId",
|
||||||
|
table: "loan_details",
|
||||||
|
column: "AccountId",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_payee_aliases_Alias",
|
||||||
|
table: "payee_aliases",
|
||||||
|
column: "Alias");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_payee_aliases_PayeeId",
|
||||||
|
table: "payee_aliases",
|
||||||
|
column: "PayeeId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_payees_DefaultCategoryId",
|
||||||
|
table: "payees",
|
||||||
|
column: "DefaultCategoryId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_payees_UserId_Name",
|
||||||
|
table: "payees",
|
||||||
|
columns: new[] { "UserId", "Name" },
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_plugin_configurations_PluginRegistrationId_Key",
|
||||||
|
table: "plugin_configurations",
|
||||||
|
columns: new[] { "PluginRegistrationId", "Key" },
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_plugin_registrations_PluginId",
|
||||||
|
table: "plugin_registrations",
|
||||||
|
column: "PluginId",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_reconciliations_AccountId",
|
||||||
|
table: "reconciliations",
|
||||||
|
column: "AccountId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_scheduled_transactions_AccountId",
|
||||||
|
table: "scheduled_transactions",
|
||||||
|
column: "AccountId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_scheduled_transactions_CategoryId",
|
||||||
|
table: "scheduled_transactions",
|
||||||
|
column: "CategoryId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_scheduled_transactions_PayeeId",
|
||||||
|
table: "scheduled_transactions",
|
||||||
|
column: "PayeeId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_scheduled_transactions_UserId",
|
||||||
|
table: "scheduled_transactions",
|
||||||
|
column: "UserId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_securities_Symbol",
|
||||||
|
table: "securities",
|
||||||
|
column: "Symbol",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_security_prices_SecurityId_Date",
|
||||||
|
table: "security_prices",
|
||||||
|
columns: new[] { "SecurityId", "Date" },
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transaction_splits_CategoryId",
|
||||||
|
table: "transaction_splits",
|
||||||
|
column: "CategoryId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transaction_splits_TransactionId",
|
||||||
|
table: "transaction_splits",
|
||||||
|
column: "TransactionId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transactions_AccountId",
|
||||||
|
table: "transactions",
|
||||||
|
column: "AccountId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transactions_CategoryId",
|
||||||
|
table: "transactions",
|
||||||
|
column: "CategoryId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transactions_Date",
|
||||||
|
table: "transactions",
|
||||||
|
column: "Date");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transactions_Fingerprint",
|
||||||
|
table: "transactions",
|
||||||
|
column: "Fingerprint");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transactions_FitId",
|
||||||
|
table: "transactions",
|
||||||
|
column: "FitId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transactions_ImportBatchId",
|
||||||
|
table: "transactions",
|
||||||
|
column: "ImportBatchId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transactions_PayeeId",
|
||||||
|
table: "transactions",
|
||||||
|
column: "PayeeId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transactions_ReconciliationId",
|
||||||
|
table: "transactions",
|
||||||
|
column: "ReconciliationId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_transactions_TransferTransactionId",
|
||||||
|
table: "transactions",
|
||||||
|
column: "TransferTransactionId",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_users_Email",
|
||||||
|
table: "users",
|
||||||
|
column: "Email",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_users_Username",
|
||||||
|
table: "users",
|
||||||
|
column: "Username",
|
||||||
|
unique: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "amortization_entries");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "budget_items");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "investment_holdings");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "payee_aliases");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "plugin_configurations");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "scheduled_transactions");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "security_prices");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "transaction_splits");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "loan_details");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "budgets");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "plugin_registrations");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "securities");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "transactions");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "import_batches");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "payees");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "reconciliations");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "categories");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "accounts");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "users");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user