#!/usr/bin/ruby
# frozen_string_literal: true
require "bigdecimal"
require "dhall"
require "pg"
PLANS =
Dhall::Coder
.new(safe: Dhall::Coder::JSON_LIKE + [Symbol])
.load(<<-DHALL, transform_keys: ->(k) { k&.to_sym })
let Quota = < unlimited | limited: { included: Natural, price: Natural } >
let Currency = < CAD | USD >
in
(#{ARGV[0]}) : List {
name: Text,
currency: Currency,
monthly_price: Natural,
minutes: Quota,
messages: Quota
}
DHALL
db = PG.connect(dbname: "jmp")
db.type_map_for_results = PG::BasicTypeMapForResults.new(db)
db.type_map_for_queries = PG::BasicTypeMapForQueries.new(db)
QUERY = <<~SQL
SELECT code::TEXT, creator_id, plan_name
FROM
invites
INNER JOIN transactions ON used_by_id = transactions.customer_id
INNER JOIN customer_plans ON creator_id = customer_plans.customer_id
WHERE rewarded_at IS NULL AND used_by_id IS NOT NULL AND amount > 0
GROUP BY used_by_id, code, creator_id, plan_name
HAVING
MIN(transactions.created_at) < LOCALTIMESTAMP - '90 days'::interval
AND
SUM(transactions.amount) >= 15
SQL
db.transaction do
db.exec(QUERY).each do |row|
puts row["code"]
plan = PLANS.find { |p| p[:name] == row["plan_name"] }
price = BigDecimal(plan[:monthly_price]) / 10000
db.exec(<<~SQL, [row["creator_id"], row["code"], price])
INSERT INTO transactions
(customer_id, transaction_id, amount, note)
VALUES
($1, 'reward_' || $1 || '_for_' || $2, $3, 'Reward for referral ' || $2)
SQL
db.exec(<<~SQL, [row["creator_id"]])
INSERT INTO invites (creator_id) VALUES ($1)
SQL
db.exec(<<~SQL, [row["code"]])
UPDATE invites
SET rewarded_at=LOCALTIMESTAMP
WHERE code=$1
SQL
end
end