Skip to content

Commit 5a5cd12

Browse files
Begin creating RawPendingColumnTransaction and switch Column HCB codes to having the Column ID (#10704)
Context behind this implementation is available at #9659. --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent ded32b4 commit 5a5cd12

File tree

8 files changed

+129
-2
lines changed

8 files changed

+129
-2
lines changed

app/controllers/column/webhooks_controller.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ def webhook
1111
type = params[:type]
1212
if type == "ach.incoming_transfer.scheduled"
1313
handle_ach_incoming_transfer_scheduled
14+
elsif type == "ach.incoming_transfer.settled"
15+
handle_as_raw_pending_column_transaction
16+
elsif type == "wire.incoming_transfer.completed"
17+
handle_as_raw_pending_column_transaction
18+
elsif type == "swift.incoming_transfer.completed"
19+
handle_as_raw_pending_column_transaction
1420
elsif type == "ach.outgoing_transfer.returned"
1521
handle_ach_outgoing_transfer_returned
1622
elsif type == "check.outgoing_debit.settled"
@@ -50,6 +56,20 @@ def handle_ach_incoming_transfer_scheduled
5056
# at this point, the ACH is approved!
5157
end
5258

59+
def handle_as_raw_pending_column_transaction(column_event_type:)
60+
account_number = AccountNumber.find_by(column_id: @object[:account_number_id])
61+
# we only create RawPendingColumnTransaction for transactions to
62+
# event-specific account numbers.
63+
return if account_number.nil?
64+
65+
RawPendingColumnTransaction.create!(
66+
amount_cents: @object["available_amount"],
67+
date_posted: @object["effective_at_utc"],
68+
column_transaction: @object,
69+
column_event_type:
70+
)
71+
end
72+
5373
def handle_ach_outgoing_transfer_returned
5474
AchTransfer.find_by(column_id: @object[:id])&.mark_failed!(reason: @object[:return_details].pick(:description)&.gsub(/\(trace #: \d+\)\Z/, "")&.strip)
5575
end

app/models/canonical_pending_transaction.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
# increase_check_id :bigint
1919
# paypal_transfer_id :bigint
2020
# raw_pending_bank_fee_transaction_id :bigint
21+
# raw_pending_column_transaction_id :bigint
2122
# raw_pending_donation_transaction_id :bigint
2223
# raw_pending_incoming_disbursement_transaction_id :bigint
2324
# raw_pending_invoice_transaction_id :bigint
@@ -31,6 +32,7 @@
3132
#
3233
# Indexes
3334
#
35+
# idx_on_raw_pending_column_transaction_id_ceea9a99e1 (raw_pending_column_transaction_id) UNIQUE
3436
# index_canonical_pending_transactions_on_check_deposit_id (check_deposit_id)
3537
# index_canonical_pending_transactions_on_hcb_code (hcb_code)
3638
# index_canonical_pending_transactions_on_increase_check_id (increase_check_id)
@@ -44,6 +46,7 @@
4446
# index_canonical_pending_txs_on_raw_pending_stripe_tx_id (raw_pending_stripe_transaction_id)
4547
# index_canonical_pending_txs_on_reimbursement_expense_payout_id (reimbursement_expense_payout_id)
4648
# index_canonical_pending_txs_on_reimbursement_payout_holding_id (reimbursement_payout_holding_id)
49+
# index_canonical_pending_txs_on_rpct_id (raw_pending_column_transaction_id)
4750
# index_cpts_on_raw_pending_incoming_disbursement_transaction_id (raw_pending_incoming_disbursement_transaction_id)
4851
# index_cpts_on_raw_pending_outgoing_disbursement_transaction_id (raw_pending_outgoing_disbursement_transaction_id)
4952
#
@@ -66,6 +69,7 @@ class CanonicalPendingTransaction < ApplicationRecord
6669
belongs_to :raw_pending_donation_transaction, optional: true
6770
belongs_to :raw_pending_invoice_transaction, optional: true
6871
belongs_to :raw_pending_bank_fee_transaction, optional: true
72+
belongs_to :raw_pending_column_transaction, optional: true
6973
belongs_to :raw_pending_incoming_disbursement_transaction, optional: true
7074
belongs_to :raw_pending_outgoing_disbursement_transaction, optional: true
7175
belongs_to :increase_check, optional: true
@@ -363,6 +367,10 @@ def stripe_card
363367
end
364368
end
365369

370+
def column_transaction_id
371+
raw_pending_column_transaction&.column_id
372+
end
373+
366374
private
367375

368376
def write_hcb_code

app/models/raw_column_transaction.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,20 @@ class RawColumnTransaction < ApplicationRecord
2020
after_create :canonize, if: -> { canonical_transaction.nil? }
2121

2222
def canonize
23-
create_canonical_transaction!(
23+
ct = create_canonical_transaction!(
2424
amount_cents:,
2525
memo:,
2626
date: date_posted,
2727
)
28+
29+
raw_pending_column_transaction = RawPendingColumnTransaction.find_by(column_id: column_transaction["transaction_id"])
30+
31+
if raw_pending_column_transaction&.canonical_pending_transaction
32+
CanonicalPendingTransactionService::Settle.new(
33+
canonical_transaction: ct,
34+
canonical_pending_transaction: raw_pending_column_transaction.canonical_pending_transaction
35+
).run!
36+
end
2837
end
2938

3039
def memo
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# frozen_string_literal: true
2+
3+
# == Schema Information
4+
#
5+
# Table name: raw_pending_column_transactions
6+
#
7+
# id :bigint not null, primary key
8+
# amount_cents :integer not null
9+
# column_event_type :integer not null
10+
# column_transaction :jsonb not null
11+
# date_posted :date not null
12+
# description :text not null
13+
# created_at :datetime not null
14+
# updated_at :datetime not null
15+
# column_id :string not null
16+
#
17+
# Indexes
18+
#
19+
# index_raw_pending_column_transactions_on_column_id (column_id) UNIQUE
20+
#
21+
class RawPendingColumnTransaction < ApplicationRecord
22+
has_one :canonical_pending_transaction
23+
24+
after_create :create_canonical_pending_transaction, if: -> { canonical_pending_transaction.nil? }
25+
26+
enum :column_event_type, {
27+
"swift.incoming_transfer.completed": 0,
28+
"wire.incoming_transfer.completed": 1,
29+
"ach.incoming_transfer.settled": 2
30+
}
31+
32+
def create_canonical_pending_transaction
33+
column_account_number = Column::AccountNumber.find_by(column_id: column_transaction["account_number_id"])
34+
return unless column_account_number
35+
36+
# create_canonical_pending_transaction!(
37+
# amount_cents:,
38+
# memo:,
39+
# date: date_posted,
40+
# event: column_account_number.event,
41+
# fronted: true
42+
# )
43+
end
44+
45+
def memo
46+
if column_id.start_with? "acht"
47+
return "#{column_transaction.fetch("company_name")} #{column_transaction["company_entry_description"]}"
48+
elsif column_id.start_with?("wire") || column_id.start_with?("swft_")
49+
return column_transaction.fetch("originator_name")
50+
end
51+
end
52+
53+
end

app/services/transaction_grouping_engine/calculate/hcb_code.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ def unknown_hcb_code
265265
[
266266
HCB_CODE,
267267
UNKNOWN_CODE,
268-
@ct_or_cp.id
268+
@ct_or_cp.column_transaction_id || @ct_or_cp.id
269269
].join(SEPARATOR)
270270
end
271271

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class CreateRawPendingColumnTransactions < ActiveRecord::Migration[7.2]
2+
def change
3+
create_table :raw_pending_column_transactions do |t|
4+
t.string :column_id, null: false
5+
t.integer :column_event_type, null: false
6+
t.jsonb :column_transaction, null: false
7+
t.text :description, null: false
8+
t.date :date_posted, null: false
9+
t.integer :amount_cents, null: false
10+
t.timestamps
11+
end
12+
add_index :raw_pending_column_transactions, :column_id, unique: true
13+
end
14+
end
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class AddRawPendingColumnTransactionIdToCanonicalPendingTransaction < ActiveRecord::Migration[7.2]
2+
disable_ddl_transaction!
3+
4+
def change
5+
add_reference :canonical_pending_transactions, :raw_pending_column_transaction, index: { algorithm: :concurrently, name: "index_canonical_pending_txs_on_rpct_id" }
6+
add_index :canonical_pending_transactions, :raw_pending_column_transaction_id, unique: true, algorithm: :concurrently
7+
end
8+
end

db/schema.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,11 +398,14 @@
398398
t.bigint "paypal_transfer_id"
399399
t.bigint "reimbursement_payout_holding_id"
400400
t.bigint "wire_id"
401+
t.bigint "raw_pending_column_transaction_id"
401402
t.index ["check_deposit_id"], name: "index_canonical_pending_transactions_on_check_deposit_id"
402403
t.index ["hcb_code"], name: "index_canonical_pending_transactions_on_hcb_code"
403404
t.index ["increase_check_id"], name: "index_canonical_pending_transactions_on_increase_check_id"
404405
t.index ["paypal_transfer_id"], name: "index_canonical_pending_transactions_on_paypal_transfer_id"
405406
t.index ["raw_pending_bank_fee_transaction_id"], name: "index_canonical_pending_txs_on_raw_pending_bank_fee_tx_id"
407+
t.index ["raw_pending_column_transaction_id"], name: "idx_on_raw_pending_column_transaction_id_ceea9a99e1", unique: true
408+
t.index ["raw_pending_column_transaction_id"], name: "index_canonical_pending_txs_on_rpct_id"
406409
t.index ["raw_pending_donation_transaction_id"], name: "index_canonical_pending_txs_on_raw_pending_donation_tx_id"
407410
t.index ["raw_pending_incoming_disbursement_transaction_id"], name: "index_cpts_on_raw_pending_incoming_disbursement_transaction_id"
408411
t.index ["raw_pending_invoice_transaction_id"], name: "index_canonical_pending_txs_on_raw_pending_invoice_tx_id"
@@ -1632,6 +1635,18 @@
16321635
t.datetime "updated_at", null: false
16331636
end
16341637

1638+
create_table "raw_pending_column_transactions", force: :cascade do |t|
1639+
t.string "column_id", null: false
1640+
t.integer "column_event_type", null: false
1641+
t.jsonb "column_transaction", null: false
1642+
t.text "description", null: false
1643+
t.date "date_posted", null: false
1644+
t.integer "amount_cents", null: false
1645+
t.datetime "created_at", null: false
1646+
t.datetime "updated_at", null: false
1647+
t.index ["column_id"], name: "index_raw_pending_column_transactions_on_column_id", unique: true
1648+
end
1649+
16351650
create_table "raw_pending_donation_transactions", force: :cascade do |t|
16361651
t.integer "amount_cents"
16371652
t.date "date_posted"

0 commit comments

Comments
 (0)