From 5d17da58e11b7440b833feb9474cb11ad420d7e4 Mon Sep 17 00:00:00 2001 From: Sam Poder <39828164+sampoder@users.noreply.github.com> Date: Tue, 24 Jun 2025 21:26:54 -0400 Subject: [PATCH 1/7] WIP: enable instant Column deposits using a `RawPendingColumnTransaction` --- app/controllers/column/webhooks_controller.rb | 33 +++++++++++++ app/models/canonical_pending_transaction.rb | 6 +++ app/models/raw_column_transaction.rb | 9 +++- app/models/raw_pending_column_transaction.rb | 49 +++++++++++++++++++ .../calculate/hcb_code.rb | 2 +- ..._create_raw_pending_column_transactions.rb | 13 +++++ ...ion_id_to_canonical_pending_transaction.rb | 7 +++ 7 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 app/models/raw_pending_column_transaction.rb create mode 100644 db/migrate/20250625003228_create_raw_pending_column_transactions.rb create mode 100644 db/migrate/20250625004725_add_raw_pending_column_transaction_id_to_canonical_pending_transaction.rb diff --git a/app/controllers/column/webhooks_controller.rb b/app/controllers/column/webhooks_controller.rb index 986b882ed1..84b4b92ec0 100644 --- a/app/controllers/column/webhooks_controller.rb +++ b/app/controllers/column/webhooks_controller.rb @@ -11,6 +11,12 @@ def webhook type = params[:type] if type == "ach.incoming_transfer.scheduled" handle_ach_incoming_transfer_scheduled + elsif type == "ach.incoming_transfer.settled" + handle_ach_incoming_transfer_settled + elsif type == "wire.incoming_transfer.completed" + handle_wire_incoming_transfer_completed + elsif type == "swift.incoming_transfer.completed" + handle_swift_incoming_transfer_completed elsif type == "ach.outgoing_transfer.returned" handle_ach_outgoing_transfer_returned elsif type == "check.outgoing_debit.settled" @@ -49,6 +55,33 @@ def handle_ach_incoming_transfer_scheduled # at this point, the ACH is approved! end + + def handle_ach_incoming_transfer_settled + RawPendingColumnTransaction.create!( + amount_cents: @object["available_amount"], + date_posted: @object["effective_at_utc"], + column_transaction: @object, + column_event_type: "ach.incoming_transfer.settled" + ) + end + + def handle_wire_incoming_transfer_completed + RawPendingColumnTransaction.create!( + amount_cents: @object["available_amount"], + date_posted: @object["effective_at_utc"], + column_transaction: @object, + column_event_type: "wire.incoming_transfer.completed" + ) + end + + def handle_swift_incoming_transfer_completed + RawPendingColumnTransaction.create!( + amount_cents: @object["available_amount"], + date_posted: @object["effective_at_utc"], + column_transaction: @object, + column_event_type: "swift.incoming_transfer.completed" + ) + end def handle_ach_outgoing_transfer_returned AchTransfer.find_by(column_id: @object[:id])&.mark_failed!(reason: @object[:return_details].pick(:description)&.gsub(/\(trace #: \d+\)\Z/, "")&.strip) diff --git a/app/models/canonical_pending_transaction.rb b/app/models/canonical_pending_transaction.rb index 53da13f795..248628237c 100644 --- a/app/models/canonical_pending_transaction.rb +++ b/app/models/canonical_pending_transaction.rb @@ -18,6 +18,7 @@ # increase_check_id :bigint # paypal_transfer_id :bigint # raw_pending_bank_fee_transaction_id :bigint +# raw_pending_column_transaction_id :bigint # raw_pending_donation_transaction_id :bigint # raw_pending_incoming_disbursement_transaction_id :bigint # raw_pending_invoice_transaction_id :bigint @@ -66,6 +67,7 @@ class CanonicalPendingTransaction < ApplicationRecord belongs_to :raw_pending_donation_transaction, optional: true belongs_to :raw_pending_invoice_transaction, optional: true belongs_to :raw_pending_bank_fee_transaction, optional: true + belongs_to :raw_pending_column_transaction, optional: true belongs_to :raw_pending_incoming_disbursement_transaction, optional: true belongs_to :raw_pending_outgoing_disbursement_transaction, optional: true belongs_to :increase_check, optional: true @@ -363,6 +365,10 @@ def stripe_card end end + def column_transaction_id + raw_pending_column_transaction&.column_id + end + private def write_hcb_code diff --git a/app/models/raw_column_transaction.rb b/app/models/raw_column_transaction.rb index dc84938949..f880732ca9 100644 --- a/app/models/raw_column_transaction.rb +++ b/app/models/raw_column_transaction.rb @@ -20,11 +20,18 @@ class RawColumnTransaction < ApplicationRecord after_create :canonize, if: -> { canonical_transaction.nil? } def canonize - create_canonical_transaction!( + ct = create_canonical_transaction!( amount_cents:, memo:, date: date_posted, ) + + raw_pending_column_transaction = RawPendingColumnTransaction.find_by(column_id: column_transaction["transaction_id"]) + + CanonicalPendingTransactionService::Settle.new( + canonical_transaction: ct, + canonical_pending_transaction: raw_pending_column_transaction.canonical_pending_transaction + ).run! end def memo diff --git a/app/models/raw_pending_column_transaction.rb b/app/models/raw_pending_column_transaction.rb new file mode 100644 index 0000000000..487d3e3044 --- /dev/null +++ b/app/models/raw_pending_column_transaction.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: raw_pending_column_transactions +# +# id :bigint not null, primary key +# amount_cents :integer +# column_event_type :integer +# column_transaction :jsonb +# date_posted :date +# description :text +# created_at :datetime not null +# updated_at :datetime not null +# column_id :string +# +class RawPendingColumnTransaction < ApplicationRecord + has_one :canonical_pending_transaction + + after_create :create_canonical_pending_transaction, if: -> { canonical_pending_transaction.nil? } + + enum :column_event_type, { + "swift.incoming_transfer.completed": 0, + "wire.incoming_transfer.completed": 1, + "ach.incoming_transfer.settled": 2 + } + + def create_canonical_pending_transaction + column_account_number = Column::AccountNumber.find_by(column_id: column_transaction["account_number_id"]) + return unless column_account_number + + create_canonical_pending_transaction!( + amount_cents:, + memo:, + date: date_posted, + event: column_account_number.event, + fronted: true + ) + end + + def memo + if column_id.start_with? "acht" + return "#{column_transaction["company_name"]} #{column_transaction["company_entry_description"]}" + elsif column_id.start_with?("wire") || column_id.start_with?("swft_") + return column_transaction["originator_name"] + end + end + +end diff --git a/app/services/transaction_grouping_engine/calculate/hcb_code.rb b/app/services/transaction_grouping_engine/calculate/hcb_code.rb index 446a9cfe23..f978a13626 100644 --- a/app/services/transaction_grouping_engine/calculate/hcb_code.rb +++ b/app/services/transaction_grouping_engine/calculate/hcb_code.rb @@ -265,7 +265,7 @@ def unknown_hcb_code [ HCB_CODE, UNKNOWN_CODE, - @ct_or_cp.id + @ct_or_cp.column_transaction_id || @ct_or_cp.id ].join(SEPARATOR) end diff --git a/db/migrate/20250625003228_create_raw_pending_column_transactions.rb b/db/migrate/20250625003228_create_raw_pending_column_transactions.rb new file mode 100644 index 0000000000..1dde9d6c81 --- /dev/null +++ b/db/migrate/20250625003228_create_raw_pending_column_transactions.rb @@ -0,0 +1,13 @@ +class CreateRawPendingColumnTransactions < ActiveRecord::Migration[7.2] + def change + create_table :raw_pending_column_transactions do |t| + t.string :column_id + t.integer :column_event_type + t.jsonb :column_transaction + t.text :description + t.date :date_posted + t.integer :amount_cents + t.timestamps + end + end +end diff --git a/db/migrate/20250625004725_add_raw_pending_column_transaction_id_to_canonical_pending_transaction.rb b/db/migrate/20250625004725_add_raw_pending_column_transaction_id_to_canonical_pending_transaction.rb new file mode 100644 index 0000000000..6c86587896 --- /dev/null +++ b/db/migrate/20250625004725_add_raw_pending_column_transaction_id_to_canonical_pending_transaction.rb @@ -0,0 +1,7 @@ +class AddRawPendingColumnTransactionIdToCanonicalPendingTransaction < ActiveRecord::Migration[7.2] + disable_ddl_transaction! + + def change + add_reference :canonical_pending_transactions, :raw_pending_column_transaction, index: { algorithm: :concurrently, name: "index_canonical_pending_txs_on_rpct_id" } + end +end From 578e00d57359bc10cb6990bbd203f09ea8297339 Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Wed, 25 Jun 2025 01:35:05 +0000 Subject: [PATCH 2/7] Migrate the DB! --- app/models/canonical_pending_transaction.rb | 1 + db/schema.rb | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/models/canonical_pending_transaction.rb b/app/models/canonical_pending_transaction.rb index 248628237c..c208638955 100644 --- a/app/models/canonical_pending_transaction.rb +++ b/app/models/canonical_pending_transaction.rb @@ -45,6 +45,7 @@ # index_canonical_pending_txs_on_raw_pending_stripe_tx_id (raw_pending_stripe_transaction_id) # index_canonical_pending_txs_on_reimbursement_expense_payout_id (reimbursement_expense_payout_id) # index_canonical_pending_txs_on_reimbursement_payout_holding_id (reimbursement_payout_holding_id) +# index_canonical_pending_txs_on_rpct_id (raw_pending_column_transaction_id) # index_cpts_on_raw_pending_incoming_disbursement_transaction_id (raw_pending_incoming_disbursement_transaction_id) # index_cpts_on_raw_pending_outgoing_disbursement_transaction_id (raw_pending_outgoing_disbursement_transaction_id) # diff --git a/db/schema.rb b/db/schema.rb index 460ab35d19..48e4e7dc13 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,5 +1,3 @@ -# frozen_string_literal: true - # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. @@ -12,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.2].define(version: 2025_06_19_045020) do +ActiveRecord::Schema[7.2].define(version: 2025_06_25_004725) do # These are extensions that must be enabled in order to support this database enable_extension "citext" enable_extension "pg_stat_statements" @@ -370,11 +368,13 @@ t.bigint "paypal_transfer_id" t.bigint "reimbursement_payout_holding_id" t.bigint "wire_id" + t.bigint "raw_pending_column_transaction_id" t.index ["check_deposit_id"], name: "index_canonical_pending_transactions_on_check_deposit_id" t.index ["hcb_code"], name: "index_canonical_pending_transactions_on_hcb_code" t.index ["increase_check_id"], name: "index_canonical_pending_transactions_on_increase_check_id" t.index ["paypal_transfer_id"], name: "index_canonical_pending_transactions_on_paypal_transfer_id" t.index ["raw_pending_bank_fee_transaction_id"], name: "index_canonical_pending_txs_on_raw_pending_bank_fee_tx_id" + t.index ["raw_pending_column_transaction_id"], name: "index_canonical_pending_txs_on_rpct_id" t.index ["raw_pending_donation_transaction_id"], name: "index_canonical_pending_txs_on_raw_pending_donation_tx_id" t.index ["raw_pending_incoming_disbursement_transaction_id"], name: "index_cpts_on_raw_pending_incoming_disbursement_transaction_id" t.index ["raw_pending_invoice_transaction_id"], name: "index_canonical_pending_txs_on_raw_pending_invoice_tx_id" @@ -1569,6 +1569,17 @@ t.datetime "updated_at", null: false end + create_table "raw_pending_column_transactions", force: :cascade do |t| + t.string "column_id" + t.integer "column_event_type" + t.jsonb "column_transaction" + t.text "description" + t.date "date_posted" + t.integer "amount_cents" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "raw_pending_donation_transactions", force: :cascade do |t| t.integer "amount_cents" t.date "date_posted" From a59d9bcdd7d809bae987e2eb83185b83519e7c5a Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Wed, 25 Jun 2025 01:36:41 +0000 Subject: [PATCH 3/7] Rubocop --- app/controllers/column/webhooks_controller.rb | 6 +++--- app/models/raw_pending_column_transaction.rb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/column/webhooks_controller.rb b/app/controllers/column/webhooks_controller.rb index 84b4b92ec0..b53c1ec6cc 100644 --- a/app/controllers/column/webhooks_controller.rb +++ b/app/controllers/column/webhooks_controller.rb @@ -55,7 +55,7 @@ def handle_ach_incoming_transfer_scheduled # at this point, the ACH is approved! end - + def handle_ach_incoming_transfer_settled RawPendingColumnTransaction.create!( amount_cents: @object["available_amount"], @@ -64,7 +64,7 @@ def handle_ach_incoming_transfer_settled column_event_type: "ach.incoming_transfer.settled" ) end - + def handle_wire_incoming_transfer_completed RawPendingColumnTransaction.create!( amount_cents: @object["available_amount"], @@ -73,7 +73,7 @@ def handle_wire_incoming_transfer_completed column_event_type: "wire.incoming_transfer.completed" ) end - + def handle_swift_incoming_transfer_completed RawPendingColumnTransaction.create!( amount_cents: @object["available_amount"], diff --git a/app/models/raw_pending_column_transaction.rb b/app/models/raw_pending_column_transaction.rb index 487d3e3044..f83d908090 100644 --- a/app/models/raw_pending_column_transaction.rb +++ b/app/models/raw_pending_column_transaction.rb @@ -18,7 +18,7 @@ class RawPendingColumnTransaction < ApplicationRecord has_one :canonical_pending_transaction after_create :create_canonical_pending_transaction, if: -> { canonical_pending_transaction.nil? } - + enum :column_event_type, { "swift.incoming_transfer.completed": 0, "wire.incoming_transfer.completed": 1, From e400a24f22c5aaa47f7b09a1f709f99141a7172a Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Sun, 6 Jul 2025 23:47:13 -0500 Subject: [PATCH 4/7] Update schema.rb --- db/schema.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/schema.rb b/db/schema.rb index 48e4e7dc13..d4dfdc4bc5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. From 66f9fe0dc620f9d1c8949b5f82d74903e369bcf1 Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Wed, 30 Jul 2025 22:05:37 +0000 Subject: [PATCH 5/7] Respond to review comments --- app/controllers/column/webhooks_controller.rb | 31 +++++------------ app/models/canonical_pending_transaction.rb | 1 + app/models/raw_column_transaction.rb | 10 +++--- app/models/raw_pending_column_transaction.rb | 34 +++++++++++-------- ..._create_raw_pending_column_transactions.rb | 13 +++---- ...ion_id_to_canonical_pending_transaction.rb | 1 + db/schema.rb | 14 ++++---- 7 files changed, 51 insertions(+), 53 deletions(-) diff --git a/app/controllers/column/webhooks_controller.rb b/app/controllers/column/webhooks_controller.rb index b53c1ec6cc..93c7e41324 100644 --- a/app/controllers/column/webhooks_controller.rb +++ b/app/controllers/column/webhooks_controller.rb @@ -12,11 +12,11 @@ def webhook if type == "ach.incoming_transfer.scheduled" handle_ach_incoming_transfer_scheduled elsif type == "ach.incoming_transfer.settled" - handle_ach_incoming_transfer_settled + handle_as_raw_pending_column_transaction elsif type == "wire.incoming_transfer.completed" - handle_wire_incoming_transfer_completed + handle_as_raw_pending_column_transaction elsif type == "swift.incoming_transfer.completed" - handle_swift_incoming_transfer_completed + handle_as_raw_pending_column_transaction elsif type == "ach.outgoing_transfer.returned" handle_ach_outgoing_transfer_returned elsif type == "check.outgoing_debit.settled" @@ -56,30 +56,17 @@ def handle_ach_incoming_transfer_scheduled # at this point, the ACH is approved! end - def handle_ach_incoming_transfer_settled - RawPendingColumnTransaction.create!( - amount_cents: @object["available_amount"], - date_posted: @object["effective_at_utc"], - column_transaction: @object, - column_event_type: "ach.incoming_transfer.settled" - ) - end - - def handle_wire_incoming_transfer_completed - RawPendingColumnTransaction.create!( - amount_cents: @object["available_amount"], - date_posted: @object["effective_at_utc"], - column_transaction: @object, - column_event_type: "wire.incoming_transfer.completed" - ) - end + def handle_as_raw_pending_column_transaction(column_event_type:) + account_number = AccountNumber.find_by(column_id: @object[:account_number_id]) + # we only create RawPendingColumnTransaction for transactions to + # event-specific account numbers. + return if account_number.nil? - def handle_swift_incoming_transfer_completed RawPendingColumnTransaction.create!( amount_cents: @object["available_amount"], date_posted: @object["effective_at_utc"], column_transaction: @object, - column_event_type: "swift.incoming_transfer.completed" + column_event_type: ) end diff --git a/app/models/canonical_pending_transaction.rb b/app/models/canonical_pending_transaction.rb index c208638955..6614814e93 100644 --- a/app/models/canonical_pending_transaction.rb +++ b/app/models/canonical_pending_transaction.rb @@ -32,6 +32,7 @@ # # Indexes # +# idx_on_raw_pending_column_transaction_id_ceea9a99e1 (raw_pending_column_transaction_id) UNIQUE # index_canonical_pending_transactions_on_check_deposit_id (check_deposit_id) # index_canonical_pending_transactions_on_hcb_code (hcb_code) # index_canonical_pending_transactions_on_increase_check_id (increase_check_id) diff --git a/app/models/raw_column_transaction.rb b/app/models/raw_column_transaction.rb index f880732ca9..87ee95b9c9 100644 --- a/app/models/raw_column_transaction.rb +++ b/app/models/raw_column_transaction.rb @@ -28,10 +28,12 @@ def canonize raw_pending_column_transaction = RawPendingColumnTransaction.find_by(column_id: column_transaction["transaction_id"]) - CanonicalPendingTransactionService::Settle.new( - canonical_transaction: ct, - canonical_pending_transaction: raw_pending_column_transaction.canonical_pending_transaction - ).run! + if raw_pending_column_transaction&.canonical_pending_transaction + CanonicalPendingTransactionService::Settle.new( + canonical_transaction: ct, + canonical_pending_transaction: raw_pending_column_transaction.canonical_pending_transaction + ).run! + end end def memo diff --git a/app/models/raw_pending_column_transaction.rb b/app/models/raw_pending_column_transaction.rb index f83d908090..7ccc0e67c7 100644 --- a/app/models/raw_pending_column_transaction.rb +++ b/app/models/raw_pending_column_transaction.rb @@ -5,14 +5,18 @@ # Table name: raw_pending_column_transactions # # id :bigint not null, primary key -# amount_cents :integer -# column_event_type :integer -# column_transaction :jsonb -# date_posted :date -# description :text +# amount_cents :integer not null +# column_event_type :integer not null +# column_transaction :jsonb not null +# date_posted :date not null +# description :text not null # created_at :datetime not null # updated_at :datetime not null -# column_id :string +# column_id :string not null +# +# Indexes +# +# index_raw_pending_column_transactions_on_column_id (column_id) UNIQUE # class RawPendingColumnTransaction < ApplicationRecord has_one :canonical_pending_transaction @@ -29,20 +33,20 @@ def create_canonical_pending_transaction column_account_number = Column::AccountNumber.find_by(column_id: column_transaction["account_number_id"]) return unless column_account_number - create_canonical_pending_transaction!( - amount_cents:, - memo:, - date: date_posted, - event: column_account_number.event, - fronted: true - ) + # create_canonical_pending_transaction!( + # amount_cents:, + # memo:, + # date: date_posted, + # event: column_account_number.event, + # fronted: true + # ) end def memo if column_id.start_with? "acht" - return "#{column_transaction["company_name"]} #{column_transaction["company_entry_description"]}" + return "#{column_transaction.fetch("company_name")} #{column_transaction["company_entry_description"]}" elsif column_id.start_with?("wire") || column_id.start_with?("swft_") - return column_transaction["originator_name"] + return column_transaction.fetch("originator_name") end end diff --git a/db/migrate/20250625003228_create_raw_pending_column_transactions.rb b/db/migrate/20250625003228_create_raw_pending_column_transactions.rb index 1dde9d6c81..96e9cbade7 100644 --- a/db/migrate/20250625003228_create_raw_pending_column_transactions.rb +++ b/db/migrate/20250625003228_create_raw_pending_column_transactions.rb @@ -1,13 +1,14 @@ class CreateRawPendingColumnTransactions < ActiveRecord::Migration[7.2] def change create_table :raw_pending_column_transactions do |t| - t.string :column_id - t.integer :column_event_type - t.jsonb :column_transaction - t.text :description - t.date :date_posted - t.integer :amount_cents + t.string :column_id, null: false + t.integer :column_event_type, null: false + t.jsonb :column_transaction, null: false + t.text :description, null: false + t.date :date_posted, null: false + t.integer :amount_cents, null: false t.timestamps end + add_index :raw_pending_column_transactions, :column_id, unique: true end end diff --git a/db/migrate/20250625004725_add_raw_pending_column_transaction_id_to_canonical_pending_transaction.rb b/db/migrate/20250625004725_add_raw_pending_column_transaction_id_to_canonical_pending_transaction.rb index 6c86587896..d8a034173d 100644 --- a/db/migrate/20250625004725_add_raw_pending_column_transaction_id_to_canonical_pending_transaction.rb +++ b/db/migrate/20250625004725_add_raw_pending_column_transaction_id_to_canonical_pending_transaction.rb @@ -3,5 +3,6 @@ class AddRawPendingColumnTransactionIdToCanonicalPendingTransaction < ActiveReco def change add_reference :canonical_pending_transactions, :raw_pending_column_transaction, index: { algorithm: :concurrently, name: "index_canonical_pending_txs_on_rpct_id" } + add_index :canonical_pending_transactions, :raw_pending_column_transaction_id, unique: true, algorithm: :concurrently end end diff --git a/db/schema.rb b/db/schema.rb index d4dfdc4bc5..7f1012983d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -376,6 +376,7 @@ t.index ["increase_check_id"], name: "index_canonical_pending_transactions_on_increase_check_id" t.index ["paypal_transfer_id"], name: "index_canonical_pending_transactions_on_paypal_transfer_id" t.index ["raw_pending_bank_fee_transaction_id"], name: "index_canonical_pending_txs_on_raw_pending_bank_fee_tx_id" + t.index ["raw_pending_column_transaction_id"], name: "idx_on_raw_pending_column_transaction_id_ceea9a99e1", unique: true t.index ["raw_pending_column_transaction_id"], name: "index_canonical_pending_txs_on_rpct_id" t.index ["raw_pending_donation_transaction_id"], name: "index_canonical_pending_txs_on_raw_pending_donation_tx_id" t.index ["raw_pending_incoming_disbursement_transaction_id"], name: "index_cpts_on_raw_pending_incoming_disbursement_transaction_id" @@ -1572,14 +1573,15 @@ end create_table "raw_pending_column_transactions", force: :cascade do |t| - t.string "column_id" - t.integer "column_event_type" - t.jsonb "column_transaction" - t.text "description" - t.date "date_posted" - t.integer "amount_cents" + t.string "column_id", null: false + t.integer "column_event_type", null: false + t.jsonb "column_transaction", null: false + t.text "description", null: false + t.date "date_posted", null: false + t.integer "amount_cents", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.index ["column_id"], name: "index_raw_pending_column_transactions_on_column_id", unique: true end create_table "raw_pending_donation_transactions", force: :cascade do |t| From 35cb6c19cbb5ef6f4ac3271d8f70bb8d8c0fc464 Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Wed, 30 Jul 2025 17:08:58 -0500 Subject: [PATCH 6/7] Update schema.rb --- db/schema.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/db/schema.rb b/db/schema.rb index 9a03029a15..12de7f9cec 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -14,6 +14,7 @@ ActiveRecord::Schema[7.2].define(version: 2025_07_28_132814) do create_schema "google_sheets" + # These are extensions that must be enabled in order to support this database enable_extension "citext" enable_extension "pg_stat_statements" From aa31a43c5b808819cdf546c4a3eba836d95070b2 Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Wed, 30 Jul 2025 17:11:10 -0500 Subject: [PATCH 7/7] Update app/controllers/column/webhooks_controller.rb Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- app/controllers/column/webhooks_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/column/webhooks_controller.rb b/app/controllers/column/webhooks_controller.rb index 93c7e41324..bf1539eaca 100644 --- a/app/controllers/column/webhooks_controller.rb +++ b/app/controllers/column/webhooks_controller.rb @@ -60,7 +60,7 @@ def handle_as_raw_pending_column_transaction(column_event_type:) account_number = AccountNumber.find_by(column_id: @object[:account_number_id]) # we only create RawPendingColumnTransaction for transactions to # event-specific account numbers. - return if account_number.nil? + return if account_number.nil? RawPendingColumnTransaction.create!( amount_cents: @object["available_amount"],