From 12cbab035c20c4ea36cb38380064c216cb869d5d Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Mon, 16 Jun 2025 18:30:34 -0400 Subject: [PATCH] add kind to transaction model --- .gitignore | 1 + app/models/transaction.rb | 7 ++++ ...20250616183654_add_kind_to_transactions.rb | 33 +++++++++++++++++++ db/schema.rb | 2 +- 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20250616183654_add_kind_to_transactions.rb diff --git a/.gitignore b/.gitignore index a37966ee..3d5baf07 100644 --- a/.gitignore +++ b/.gitignore @@ -100,6 +100,7 @@ node_modules/ tasks.json .taskmaster/tasks/ .taskmaster/reports/ +.taskmaster/state.json *.mcp.json scripts/ .cursor/mcp.json diff --git a/app/models/transaction.rb b/app/models/transaction.rb index d2a8abdc..c2e20148 100644 --- a/app/models/transaction.rb +++ b/app/models/transaction.rb @@ -9,6 +9,13 @@ class Transaction < ApplicationRecord accepts_nested_attributes_for :taggings, allow_destroy: true + enum :kind, { + standard: "standard", + transfer: "transfer", + loan_payment: "loan_payment", + one_time: "one_time" + } + class << self def search(params) Search.new(params).build_query(all) diff --git a/db/migrate/20250616183654_add_kind_to_transactions.rb b/db/migrate/20250616183654_add_kind_to_transactions.rb new file mode 100644 index 00000000..fd6e3a8f --- /dev/null +++ b/db/migrate/20250616183654_add_kind_to_transactions.rb @@ -0,0 +1,33 @@ +class AddKindToTransactions < ActiveRecord::Migration[7.2] + def change + add_column :transactions, :kind, :string, null: false, default: "standard" + add_index :transactions, :kind + + reversible do |dir| + dir.up do + # Update transaction kinds based on transfer relationships + execute <<~SQL + UPDATE transactions + SET kind = CASE + WHEN loan_accounts.accountable_type = 'Loan' + AND entries.amount > 0 + THEN 'loan_payment' + ELSE 'transfer' + END + FROM transfers t + JOIN entries ON ( + entries.entryable_id = t.inflow_transaction_id OR + entries.entryable_id = t.outflow_transaction_id + ) + LEFT JOIN entries inflow_entries ON ( + inflow_entries.entryable_id = t.inflow_transaction_id + AND inflow_entries.entryable_type = 'Transaction' + ) + LEFT JOIN accounts loan_accounts ON loan_accounts.id = inflow_entries.account_id + WHERE transactions.id = entries.entryable_id + AND entries.entryable_type = 'Transaction' + SQL + end + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 33074c58..9c10112c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -30,7 +30,7 @@ ActiveRecord::Schema[7.2].define(version: 2025_06_10_181219) do t.decimal "balance", precision: 19, scale: 4 t.string "currency" t.boolean "is_active", default: true, null: false - t.virtual "classification", type: :string, as: "\nCASE\n WHEN ((accountable_type)::text = ANY (ARRAY[('Loan'::character varying)::text, ('CreditCard'::character varying)::text, ('OtherLiability'::character varying)::text])) THEN 'liability'::text\n ELSE 'asset'::text\nEND", stored: true + t.virtual "classification", type: :string, as: "\nCASE\n WHEN ((accountable_type)::text = ANY ((ARRAY['Loan'::character varying, 'CreditCard'::character varying, 'OtherLiability'::character varying])::text[])) THEN 'liability'::text\n ELSE 'asset'::text\nEND", stored: true t.uuid "import_id" t.uuid "plaid_account_id" t.boolean "scheduled_for_deletion", default: false