# frozen_string_literal: true
require "bigdecimal"
# Largely copied from sgx-jmp to support web activation more properly
# Goes away when web activation goes away
class Transaction
def self.sale(gateway, **kwargs)
response = gateway.transaction.sale(**kwargs)
response.success? ? new(response.transaction) : nil
end
attr_reader :amount
def initialize(braintree_transaction)
@customer_id = braintree_transaction.customer_details.id
@transaction_id = braintree_transaction.id
@created_at = braintree_transaction.created_at
@amount = BigDecimal(braintree_transaction.amount, 4)
end
def insert
DB.transaction do
insert_tx
insert_bonus
end
true
end
def bonus
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 to_s
plus = " + #{'%.4f' % bonus} bonus"
"$#{'%.2f' % amount}#{plus if bonus.positive?}"
end
protected
def insert_tx
params = [@customer_id, @transaction_id, @created_at, @amount]
DB.exec(<<~SQL, params)
INSERT INTO transactions
(customer_id, transaction_id, created_at, amount, note)
VALUES
($1, $2, $3, $4, 'Credit card payment')
SQL
end
def insert_bonus
return if bonus <= 0
params = [@customer_id, "bonus_for_#{@transaction_id}", @created_at, bonus]
DB.exec(<<~SQL, params)
INSERT INTO transactions
(customer_id, transaction_id, created_at, amount, note)
VALUES
($1, $2, $3, $4, 'Credit card payment bonus')
SQL
end
end