transaction.rb

 1# frozen_string_literal: true
 2
 3require "bigdecimal"
 4
 5# Largely copied from sgx-jmp to support web activation more properly
 6# Goes away when web activation goes away
 7class Transaction
 8	def self.sale(gateway, **kwargs)
 9		response = gateway.transaction.sale(**kwargs)
10		response.success? ? new(response.transaction) : nil
11	end
12
13	attr_reader :amount
14
15	def initialize(braintree_transaction)
16		@customer_id = braintree_transaction.customer_details.id
17		@transaction_id = braintree_transaction.id
18		@created_at = braintree_transaction.created_at
19		@amount = BigDecimal(braintree_transaction.amount, 4)
20	end
21
22	def insert
23		DB.transaction do
24			insert_tx
25			insert_bonus
26		end
27		true
28	end
29
30	def bonus
31		return BigDecimal(0) if amount <= 15
32		amount *
33			case amount
34			when (15..29.99)
35				0.01
36			when (30..139.99)
37				0.03
38			else
39				0.05
40			end
41	end
42
43	def to_s
44		plus = " + #{'%.4f' % bonus} bonus"
45		"$#{'%.2f' % amount}#{plus if bonus.positive?}"
46	end
47
48protected
49
50	def insert_tx
51		params = [@customer_id, @transaction_id, @created_at, @amount]
52		DB.exec(<<~SQL, params)
53			INSERT INTO transactions
54				(customer_id, transaction_id, created_at, amount, note)
55			VALUES
56				($1, $2, $3, $4, 'Credit card payment')
57		SQL
58	end
59
60	def insert_bonus
61		return if bonus <= 0
62		params = [@customer_id, "bonus_for_#{@transaction_id}", @created_at, bonus]
63		DB.exec(<<~SQL, params)
64			INSERT INTO transactions
65				(customer_id, transaction_id, created_at, amount, note)
66			VALUES
67				($1, $2, $3, $4, 'Credit card payment bonus')
68		SQL
69	end
70end