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