#!/usr/bin/ruby # frozen_string_literal: true # This is meant to be a one-time script that takes any "extra" # months an account is activated for and rolls them back into balance instead # Mostly as a fix for all the time that web activation spent not setting balance require "pg" DB = PG.connect(dbname: "jmp") DB.type_map_for_results = PG::BasicTypeMapForResults.new(DB) DB.type_map_for_queries = PG::BasicTypeMapForQueries.new(DB) rows = DB.query(<<~SQL) SELECT customer_id, expires_at, ((((DATE_PART('year', expires_at) - DATE_PART('year', LOCALTIMESTAMP)) * 12 + (DATE_PART('month', expires_at) - DATE_PART('month', LOCALTIMESTAMP))) - 1) * case plan_name when 'usd_beta_unlimited-v20210223' then 2.99 when 'cad_beta_unlimited-v20210223' then 3.59 end)::NUMERIC(12,4) AS amount FROM customer_plans WHERE expires_at > (DATE_TRUNC('month', LOCALTIMESTAMP) + '2 months') ORDER BY expires_at; SQL rows.each do |r| cid = r["customer_id"] DB.transaction do DB.exec(<<~SQL, [cid, "#{cid}-months_to_balance", r["amount"]]) INSERT INTO transactions (customer_id, transaction_id, amount, note) VALUES ($1, $2, $3, 'months_to_balance') SQL DB.exec(<<~SQL, [cid, r["expires_at"]]) UPDATE plan_log SET date_range = date_range - tsrange(LOCALTIMESTAMP + '1 month', UPPER(date_range)) WHERE customer_id=$1 AND UPPER(date_range)=$2 SQL end end