Merge branch 'only-bill-if-expired'

Stephen Paul Weber created

* only-bill-if-expired:
  Only bill customer if they for sure have balance and are expired
  Allow an in-transaction condition for billing
  Change multiline chain style

Change summary

.rubocop.yml                |  3 +++
lib/bill_plan_command.rb    | 25 ++++++++++++++++++++++---
lib/customer_plan.rb        |  5 ++++-
sgx_jmp.rb                  |  3 +--
test/test_electrum.rb       | 12 ++++--------
test/test_tel_selections.rb |  6 ++----
6 files changed, 36 insertions(+), 18 deletions(-)

Detailed changes

.rubocop.yml 🔗

@@ -67,6 +67,9 @@ Layout/AccessModifierIndentation:
 Layout/FirstParameterIndentation:
   EnforcedStyle: consistent
 
+Layout/MultilineMethodCallIndentation:
+  EnforcedStyle: indented
+
 Style/AccessModifierDeclarations:
   Enabled: false
 

lib/bill_plan_command.rb 🔗

@@ -3,6 +3,7 @@
 class BillPlanCommand
 	def self.for(customer)
 		return ForUnregistered.new(customer) unless customer.registered?
+		return ForNotExpired.new(customer) unless customer.expires_at <= Time.now
 
 		unless customer.balance > customer.monthly_price
 			return ForLowBalance.new(customer)
@@ -16,10 +17,15 @@ class BillPlanCommand
 	end
 
 	def call
-		@customer.bill_plan(note: "Renew account plan")
+		billed = @customer.bill_plan(note: "Renew account plan") { |db|
+			@customer = Command.execution.customer_repo.with(db: db)
+				.find(@customer.customer_id).sync
+			@customer.balance > @customer.monthly_price &&
+				@customer.expires_at <= Time.now
+		}
 		Command.reply do |reply|
-			reply.note_type = :info
-			reply.note_text = "#{@customer.customer_id} billed"
+			reply.note_type = billed ? :info : :error
+			reply.note_text = "#{@customer.customer_id}#{billed ? '' : ' not'} billed"
 		end
 	end
 
@@ -70,4 +76,17 @@ class BillPlanCommand
 			end
 		end
 	end
+
+	class ForNotExpired
+		def initialize(customer)
+			@customer = customer
+		end
+
+		def call
+			Command.reply do |reply|
+				reply.note_type = :error
+				reply.note_text = "#{@customer.customer_id} is not expired"
+			end
+		end
+	end
 end

lib/customer_plan.rb 🔗

@@ -71,9 +71,12 @@ class CustomerPlan
 
 	def bill_plan(note: nil)
 		EM.promise_fiber do
-			DB.transaction do
+			DB.transaction do |db|
+				next false unless !block_given? || yield(db)
+
 				charge_for_plan(note)
 				add_one_month_to_current_plan unless activate_plan_starting_now
+				true
 			end
 		end
 	end

sgx_jmp.rb 🔗

@@ -46,8 +46,7 @@ module SentryOugai
 end
 LOG.extend SentryOugai
 
-CONFIG =
-	Dhall::Coder
+CONFIG = Dhall::Coder
 	.new(safe: Dhall::Coder::JSON_LIKE + [Symbol, Proc])
 	.load(
 		"(#{ARGV[0]}) : #{__dir__}/config-schema.dhall",

test/test_electrum.rb 🔗

@@ -28,8 +28,7 @@ class ElectrumTest < Minitest::Test
 	property(:getaddresshistory) { string(:alnum) }
 	em :test_getaddresshistory
 	def getaddresshistory(address)
-		req =
-			stub_rpc("getaddresshistory", address: address)
+		req = stub_rpc("getaddresshistory", address: address)
 			.to_return(body: { result: "result" }.to_json)
 		assert_equal "result", @electrum.getaddresshistory(address).sync
 		assert_requested(req)
@@ -38,8 +37,7 @@ class ElectrumTest < Minitest::Test
 	property(:get_tx_status) { string(:alnum) }
 	em :test_get_tx_status
 	def get_tx_status(tx_hash)
-		req =
-			stub_rpc("get_tx_status", txid: tx_hash)
+		req = stub_rpc("get_tx_status", txid: tx_hash)
 			.to_return(body: { result: "result" }.to_json)
 		assert_equal "result", @electrum.get_tx_status(tx_hash).sync
 		assert_requested(req)
@@ -48,11 +46,9 @@ class ElectrumTest < Minitest::Test
 	property(:gettransaction) { [string(:alnum), string(:xdigit)] }
 	em :test_gettransaction
 	def gettransaction(tx_hash, dummy_tx)
-		req1 =
-			stub_rpc("gettransaction", txid: tx_hash)
+		req1 = stub_rpc("gettransaction", txid: tx_hash)
 			.to_return(body: { result: dummy_tx }.to_json)
-		req2 =
-			stub_rpc("deserialize", [dummy_tx])
+		req2 = stub_rpc("deserialize", [dummy_tx])
 			.to_return(body: { result: { outputs: [] } }.to_json)
 		assert_kind_of Electrum::Transaction, @electrum.gettransaction(tx_hash).sync
 		assert_requested(req1)

test/test_tel_selections.rb 🔗

@@ -26,8 +26,7 @@ class TelSelectionsTest < Minitest::Test
 		def test_for_no_rsm
 			form = Blather::Stanza::X.new
 			form.fields = [{ var: "q", value: "226" }]
-			iris_query =
-				TelSelections::ChooseTel::AvailableNumber
+			iris_query = TelSelections::ChooseTel::AvailableNumber
 				.for(form)
 				.instance_variable_get(:@iris_query)
 			assert_equal(
@@ -44,8 +43,7 @@ class TelSelectionsTest < Minitest::Test
 					max 500
 				end
 			end
-			iris_query =
-				TelSelections::ChooseTel::AvailableNumber
+			iris_query = TelSelections::ChooseTel::AvailableNumber
 				.for(form)
 				.instance_variable_get(:@iris_query)
 			assert_equal(