~singpolyma/sgx-jmp

ref: 75919c9c8ac359737a695eda82c26fafb8cedd4e sgx-jmp/lib/customer.rb -rw-r--r-- 3.8 KiB
75919c9cStephen Paul Weber Allow parent plan to apply subaccount discount 3 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# frozen_string_literal: true

require "forwardable"

require_relative "./blather_ext"
require_relative "./customer_usage"
require_relative "./customer_plan"
require_relative "./customer_ogm"
require_relative "./customer_financials"
require_relative "./backend_sgx"
require_relative "./invites_repo"
require_relative "./payment_methods"
require_relative "./plan"
require_relative "./proxied_jid"
require_relative "./sip_account"
require_relative "./trivial_backend_sgx_repo"

class Customer
	extend Forwardable

	attr_reader :customer_id, :balance, :jid, :tndetails, :feature_flags
	alias billing_customer_id customer_id

	def_delegators :@plan, :active?, :activate_plan_starting_now, :bill_plan,
	               :currency, :merchant_account, :plan_name, :minute_limit,
	               :message_limit, :monthly_overage_limit, :activation_date,
	               :expires_at, :monthly_price, :save_plan!, :auto_top_up_amount,
	               :extend_plan, :status
	def_delegators :@sgx, :deregister!, :register!, :registered?, :set_ogm_url,
	               :fwd, :transcription_enabled
	def_delegators :@usage, :usage_report, :message_usage, :incr_message_usage,
	               :calling_charges_this_month
	def_delegators :@financials, :payment_methods, :btc_addresses,
	               :add_btc_address, :declines, :mark_decline,
	               :transactions

	def self.extract(customer_id, jid, **kwargs)
		(kwargs[:parent_customer_id] ? ChildCustomer : Customer).new(
			customer_id, jid,
			plan: CustomerPlan.extract(customer_id: customer_id, **kwargs),
			**kwargs.slice(:balance, :sgx, :tndetails, :feature_flags)
		)
	end

	def self.created(customer_id, jid, repo:, **kwargs)
		jid = Blather::JID.new(jid)
		plan = CustomerPlan.default(customer_id, jid)
		if plan.parent_customer_id
			# Parent may have a balance, so look it up
			plan.save_plan!.then { repo.find(customer_id) }
		else
			new(customer_id, jid, plan: plan, **kwargs)
		end
	end

	def initialize(
		customer_id,
		jid,
		plan: CustomerPlan.new(customer_id),
		balance: BigDecimal(0),
		tndetails: {},
		feature_flags: [],
		sgx: TrivialBackendSgxRepo.new.get(customer_id)
	)
		@plan = plan
		@usage = CustomerUsage.new(customer_id)
		@financials = CustomerFinancials.new(customer_id)
		@customer_id = customer_id
		@jid = jid
		@balance = balance
		@tndetails = tndetails
		@feature_flags = feature_flags
		@sgx = sgx
	end

	def with_balance(balance)
		self.class.new(
			@customer_id, @jid,
			plan: @plan, balance: balance,
			tndetails: @tndetails, sgx: @sgx
		)
	end

	def with_plan(plan_name, **kwargs)
		self.class.new(
			@customer_id, @jid,
			plan: @plan.with(plan_name: plan_name, **kwargs),
			balance: @balance, tndetails: @tndetails, sgx: @sgx
		)
	end

	def billing_customer(*)
		EMPromise.resolve(self)
	end

	def stanza_to(stanza)
		stanza = stanza.dup
		stanza.to = jid.with(resource: stanza.to&.resource)
		stanza.from ||= Blather::JID.new("")
		stanza.from = stanza.from.with(domain: CONFIG[:component][:jid])
		block_given? ? yield(stanza) : (BLATHER << stanza)
	end

	def stanza_from(stanza)
		BLATHER << @sgx.stanza(stanza)
	end

	def fetch_pep(node, from_tel=nil)
		iq = Blather::Stanza::PubSub::Items.new(:get)
		iq.node = node
		iq.from = Blather::JID.new(from_tel, CONFIG[:component][:jid])
		stanza_to(iq, &IQ_MANAGER.method(:write))
	end

	def ogm(from_tel=nil)
		fetch_vcard = -> { fetch_pep("urn:xmpp:vcard4", from_tel) }
		CustomerOGM.for(@sgx.ogm_url, @sgx.registered?.phone, fetch_vcard)
	end

	def sip_account
		SipAccount.find(customer_id)
	end

	def reset_sip_account
		sip_account.with_random_password.put
	end

	def admin?
		CONFIG[:admins].include?(jid.to_s)
	end

	class ChildCustomer < Customer
		def billing_customer_id
			@plan.parent_customer_id
		end

		def billing_customer(repo=CustomerRepo.new)
			repo.find(billing_customer_id)
		end
	end
end