diff --git a/lib/customer.rb b/lib/customer.rb index 8b7361c648af5ddc7f52dbbea62ea8353e26392a..b29f74dbde0bcf0486cb50aff246f64860681d81 100644 --- a/lib/customer.rb +++ b/lib/customer.rb @@ -21,6 +21,7 @@ class Customer extend Forwardable attr_reader :customer_id, :balance, :jid, :tndetails + alias billing_customer_id customer_id def_delegators :@plan, :active?, :activate_plan_starting_now, :bill_plan, :currency, :merchant_account, :plan_name, :minute_limit, @@ -34,7 +35,7 @@ class Customer :transactions def self.extract(customer_id, jid, **kwargs) - Customer.new( + (kwargs[:parent_customer_id] ? ChildCustomer : Customer).new( customer_id, jid, plan: CustomerPlan.extract(customer_id, kwargs), **kwargs.slice(:balance, :sgx, :tndetails) @@ -75,6 +76,10 @@ class Customer ) end + def billing_customer(*) + EMPromise.resolve(self) + end + def unused_invites InvitesRepo.new(DB).unused_invites(customer_id) end @@ -128,4 +133,19 @@ class Customer end protected def_delegator :@plan, :expires_at + + class ChildCustomer < Customer + def initialize(*args, parent_customer_id:, **kwargs) + super(*args, **kwargs) + @parent_customer_id = parent_customer_id + end + + def billing_customer_id + @parent_customer_id + end + + def billing_customer(repo=CustomerRepo.new) + repo.find(billing_customer_id) + end + end end diff --git a/lib/customer_repo.rb b/lib/customer_repo.rb index 56e243b6c417fc9464f5b7deb0c896b788fccc86..e9a4a228ca5a257b7650def6ff18c9f485d05fea 100644 --- a/lib/customer_repo.rb +++ b/lib/customer_repo.rb @@ -173,7 +173,7 @@ protected end SQL = <<~SQL - SELECT COALESCE(balance,0) AS balance, plan_name, expires_at + SELECT COALESCE(balance,0) AS balance, plan_name, expires_at, parent_customer_id FROM customer_plans LEFT JOIN balances USING (customer_id) WHERE customer_id=$1 LIMIT 1 SQL diff --git a/lib/low_balance.rb b/lib/low_balance.rb index 41bbdd8639cc50fa894cde4811ea7882c1163b48..a02445975e951fdbcea9f24f6be2565de58247ef 100644 --- a/lib/low_balance.rb +++ b/lib/low_balance.rb @@ -8,10 +8,10 @@ class LowBalance return Locked.new unless customer.registered? ExpiringLock.new( - "jmp_customer_low_balance-#{customer.customer_id}", + "jmp_customer_low_balance-#{customer.billing_customer_id}", expiry: 60 * 60 * 24 * 7 ).with(-> { Locked.new }) do - for_no_lock(customer) + customer.billing_customer.then(&method(:for_no_lock)) end end diff --git a/lib/trust_level_repo.rb b/lib/trust_level_repo.rb index 6c52e27bc6e8c01a8296b2bf5d058b1073046265..4cad9ba90cfa4648a71412e748e6056509c2366f 100644 --- a/lib/trust_level_repo.rb +++ b/lib/trust_level_repo.rb @@ -14,7 +14,7 @@ class TrustLevelRepo def find(customer) EMPromise.all([ find_manual(customer.customer_id), - fetch_settled_amount(customer.customer_id) + fetch_settled_amount(customer.billing_customer_id) ]).then do |(manual, row)| TrustLevel.for( manual: manual, diff --git a/schemas b/schemas index 69c1efe09190872e00b0522b3e0d9d5ad5ac5235..2aef72250750b85e344d3d87d789f002db0a7579 160000 --- a/schemas +++ b/schemas @@ -1 +1 @@ -Subproject commit 69c1efe09190872e00b0522b3e0d9d5ad5ac5235 +Subproject commit 2aef72250750b85e344d3d87d789f002db0a7579 diff --git a/test/test_trust_level_repo.rb b/test/test_trust_level_repo.rb index 0f7c7f795d566723ae05b8c1456120c76fb677ae..b8e7b86063e8118274fcee96f01df3f02d2dc478 100644 --- a/test/test_trust_level_repo.rb +++ b/test/test_trust_level_repo.rb @@ -9,7 +9,7 @@ class TrustLevelRepoTest < Minitest::Test redis: FakeRedis.new( "jmp_customer_trust_level-test" => "Tomb" ) - ).find(OpenStruct.new(customer_id: "test", plan_name: "usd")).sync + ).find(customer(plan_name: "test_usd")).sync assert_equal "Manual(Tomb)", trust_level.to_s end em :test_manual_tomb @@ -20,7 +20,7 @@ class TrustLevelRepoTest < Minitest::Test redis: FakeRedis.new( "jmp_customer_trust_level-test" => "Basement" ) - ).find(OpenStruct.new(customer_id: "test", plan_name: "usd")).sync + ).find(customer(plan_name: "test_usd")).sync assert_equal "Manual(Basement)", trust_level.to_s end em :test_manual_basement @@ -31,7 +31,7 @@ class TrustLevelRepoTest < Minitest::Test redis: FakeRedis.new( "jmp_customer_trust_level-test" => "Customer" ) - ).find(OpenStruct.new(customer_id: "test", plan_name: "usd")).sync + ).find(customer(plan_name: "test_usd")).sync assert_equal "Manual(Customer)", trust_level.to_s end em :test_manual_customer @@ -42,7 +42,7 @@ class TrustLevelRepoTest < Minitest::Test redis: FakeRedis.new( "jmp_customer_trust_level-test" => "Paragon" ) - ).find(OpenStruct.new(customer_id: "test", plan_name: "usd")).sync + ).find(customer(plan_name: "test_usd")).sync assert_equal "Manual(Paragon)", trust_level.to_s end em :test_manual_paragon @@ -53,7 +53,7 @@ class TrustLevelRepoTest < Minitest::Test redis: FakeRedis.new( "jmp_customer_trust_level-test" => "UNKNOWN" ) - ).find(OpenStruct.new(customer_id: "test", plan_name: "usd")).sync + ).find(customer(plan_name: "test_usd")).sync assert_equal "Manual(Customer)", trust_level.to_s end em :test_manual_unknown @@ -62,7 +62,7 @@ class TrustLevelRepoTest < Minitest::Test trust_level = TrustLevelRepo.new( db: FakeDB.new, redis: FakeRedis.new - ).find(OpenStruct.new(customer_id: "test", plan_name: "usd")).sync + ).find(customer(plan_name: "test_usd")).sync assert_kind_of TrustLevel::Basement, trust_level end em :test_new_customer @@ -71,7 +71,7 @@ class TrustLevelRepoTest < Minitest::Test trust_level = TrustLevelRepo.new( db: FakeDB.new(["test"] => [{ "settled_amount" => 15 }]), redis: FakeRedis.new - ).find(OpenStruct.new(customer_id: "test", plan_name: "usd")).sync + ).find(customer(plan_name: "test_usd")).sync assert_kind_of TrustLevel::Customer, trust_level end em :test_regular_customer @@ -80,7 +80,7 @@ class TrustLevelRepoTest < Minitest::Test trust_level = TrustLevelRepo.new( db: FakeDB.new(["test"] => [{ "settled_amount" => 61 }]), redis: FakeRedis.new - ).find(OpenStruct.new(customer_id: "test", plan_name: "usd")).sync + ).find(customer(plan_name: "test_usd")).sync assert_kind_of TrustLevel::Paragon, trust_level end em :test_settled_customer