Do not activate directly in cronjob

Stephen Paul Weber created

Instead, just insert and notify. sgx-jmp will handle billing and activation now
when it sees the balance is sufficient.

Change summary

bin/process_pending_btc_transactions | 52 ++++++-----------------------
1 file changed, 12 insertions(+), 40 deletions(-)

Detailed changes

bin/process_pending_btc_transactions 🔗

@@ -67,17 +67,15 @@ btc_sell_price[:USD] = btc_sell_price[:CAD] * cad_to_usd
 class Plan
 	def self.for_customer(customer)
 		row = DB.exec_params(<<-SQL, [customer.id]).first
-			SELECT plan_name FROM customer_plans WHERE customer_id=$1 LIMIT 1
+			SELECT customer_plans.plan_name, UPPER(date_range) - LOWER(date_range) < '2 seconds' AS pd
+			FROM customer_plans LEFT JOIN plan_log
+				ON customer_plans.customer_id = plan_log.customer_id
+				AND plan_log.date_range -|- tsrange(expires_at, expires_at, '[]')
+			WHERE customer_plans.customer_id=$1 LIMIT 1
 		SQL
-		from_name(customer, row&.[]("plan_name"))
-	end
+		return nil unless row
 
-	def self.pending_for_customer(customer)
-		from_name(
-			customer,
-			REDIS.get("pending_plan_for-#{customer.id}"),
-			klass: Pending
-		)
+		from_name(customer, row["plan_name"], klass: row["pd"] ? Pending : Plan)
 	end
 
 	def self.from_name(customer, plan_name, klass: Plan)
@@ -117,17 +115,7 @@ class Plan
 		BigDecimal(@plan[:monthly_price].to_i) * 0.0001
 	end
 
-	def insert(start:, expire:)
-		params = [@customer.id, name, start, expire]
-		DB.exec_params(<<-SQL, params)
-			INSERT INTO plan_log
-				(customer_id, plan_name, date_range)
-			VALUES
-				($1, $2, tsrange($3, $4))
-		SQL
-	end
-
-	def activate_any_pending_plan!; end
+	def notify_any_pending_plan!; end
 
 	class Pending < Plan
 		def initialize(customer, plan)
@@ -140,7 +128,7 @@ class Plan
 			[camnt, price].max
 		end
 
-		def activate_any_pending_plan!
+		def notify_any_pending_plan!
 			if @customer.balance < activation_amount
 				@customer.notify(
 					"Your account could not be activated because your " \
@@ -149,24 +137,12 @@ class Plan
 					"Please buy more credit to have your account activated."
 				)
 			else
-				charge_insert_notify
+				notify_approved
 			end
 		end
 
 	protected
 
-		def charge_insert_notify
-			return unless @customer.add_transaction(
-				"activate_#{@customer.id}_#{name}_until_#{@go_until}",
-				-price,
-				"Activate pending plan"
-			)
-
-			insert(start: Date.today, expire: @go_until)
-			REDIS.del("pending_plan_for-#{@customer.id}")
-			notify_approved
-		end
-
 		def notify_approved
 			@customer.notify(
 				"Your JMP account has been approved. To complete " \
@@ -197,11 +173,7 @@ class Customer
 	end
 
 	def plan
-		Plan.for_customer(self) || pending_plan
-	end
-
-	def pending_plan
-		Plan.pending_for_customer(self)
+		Plan.for_customer(self)
 	end
 
 	def balance
@@ -258,7 +230,7 @@ done = REDIS.hgetall("pending_btc_transactions").map { |(txid, customer_id)|
 		if (plan = customer.plan)
 			amount = btc * btc_sell_price.fetch(plan.currency).round(4, :floor)
 			customer.add_btc_credit(txid, btc, amount)
-			customer.plan.activate_any_pending_plan!
+			plan.notify_any_pending_plan!
 			REDIS.hdel("pending_btc_transactions", txid)
 			txid
 		else