diff --git a/bin/process_pending_btc_transactions b/bin/process_pending_btc_transactions index 30a452543cbf1bbba91f52c1a40544e5c9d89550..2492cbc5d84a59dc3a1a310a3bb94a2534b2f834 100755 --- a/bin/process_pending_btc_transactions +++ b/bin/process_pending_btc_transactions @@ -25,6 +25,7 @@ require "redis" require_relative "../lib/blather_notify" require_relative "../lib/electrum" +require_relative "../lib/transaction" CONFIG = Dhall::Coder @@ -98,19 +99,6 @@ class Plan @plan[:currency] end - def bonus_for(fiat_amount) - return BigDecimal(0) if fiat_amount <= 15 - - fiat_amount * case fiat_amount - when (15..29.99) - 0.01 - when (30..139.99) - 0.03 - else - 0.05 - end - end - def price BigDecimal(@plan[:monthly_price].to_i) * 0.0001 end @@ -184,11 +172,10 @@ class Customer end def add_btc_credit(txid, btc_amount, fiat_amount) - return unless add_transaction(txid, fiat_amount, "Bitcoin payment") + tx = Transaction.new(txid, fiat_amount, "Bitcoin payment") + return unless tx.save - if (bonus = plan.bonus_for(fiat_amount)).positive? - add_transaction("bonus_for_#{txid}", bonus, "Bitcoin payment bonus") - end + tx.bonus&.save notify_btc_credit(txid, btc_amount, fiat_amount, bonus) end diff --git a/lib/transaction.rb b/lib/transaction.rb new file mode 100644 index 0000000000000000000000000000000000000000..4dc6c389222e4b26ca1236eb2bf1fdf3256d1e5e --- /dev/null +++ b/lib/transaction.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +class Transaction + def initialize(customer_id, id, amount, note) + @customer_id = customer_id + @id = id + @amount = amount + @note = note + end + + def bonus + return unless bonus_amount.positive? + + new(@customer_id, "bonus_for_#{@id}", bonus_amount, "#{@note} bonus") + end + + def bonus_amount + return BigDecimal(0) if @amount <= 15 + + @amount * case @amount + when (15..29.99) + 0.01 + when (30..139.99) + 0.03 + else + 0.05 + end + end + + def save + args = [@customer_id, @id, @amount, @note] + DB.exec_params(<<-SQL, args).cmd_tuples.positive? + INSERT INTO transactions + (customer_id, transaction_id, settled_after, amount, note) + VALUES + ($1, $2, LOCALTIMESTAMP, $3, $4) + ON CONFLICT (transaction_id) DO NOTHING + SQL + end +end