-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbackfill-payment-challenge-markup-fees.sql
More file actions
133 lines (125 loc) · 4 KB
/
Copy pathbackfill-payment-challenge-markup-fees.sql
File metadata and controls
133 lines (125 loc) · 4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
-- Backfill finance payment challenge markup and fee values from challenge billing.
--
-- Scope:
-- - Finance winnings whose external_id matches a challenge id.
-- - Existing payment rows associated to those winnings.
-- - Existing challenge billing records with a markup value.
-- - Rows where payment.challenge_markup or payment.challenge_fee differs
-- from the value derived from challenge billing and payment total_amount.
--
-- Calculation:
-- - payment.challenge_markup = challenges.ChallengeBilling.markup,
-- rounded to the challenge-markup column scale.
-- - payment.challenge_fee = payment.challenge_markup * payment.total_amount
--
-- Run this against the PostgreSQL database that contains these schemas:
-- - "finance"
-- - "challenges"
BEGIN;
DO $$
BEGIN
IF to_regclass('finance.winnings') IS NULL THEN
RAISE EXCEPTION 'Required table finance.winnings was not found';
END IF;
IF to_regclass('finance.payment') IS NULL THEN
RAISE EXCEPTION 'Required table finance.payment was not found';
END IF;
IF to_regclass('challenges."ChallengeBilling"') IS NULL THEN
RAISE EXCEPTION 'Required table challenges."ChallengeBilling" was not found';
END IF;
END;
$$;
WITH calculated AS (
SELECT
p.payment_id,
p.winnings_id,
w.external_id AS "challengeId",
ROUND(cb."markup"::numeric, 4) AS "challengeMarkup",
CASE
WHEN p.total_amount IS NULL THEN NULL
ELSE ROUND(p.total_amount * ROUND(cb."markup"::numeric, 4), 2)
END AS "challengeFee",
p.challenge_markup AS "currentChallengeMarkup",
p.challenge_fee AS "currentChallengeFee"
FROM "finance"."payment" p
INNER JOIN "finance"."winnings" w
ON w.winning_id = p.winnings_id
INNER JOIN "challenges"."ChallengeBilling" cb
ON cb."challengeId" = w.external_id
WHERE w.external_id IS NOT NULL
AND cb."markup" IS NOT NULL
),
candidates AS (
SELECT *
FROM calculated
WHERE "currentChallengeMarkup" IS DISTINCT FROM "challengeMarkup"
OR "currentChallengeFee" IS DISTINCT FROM "challengeFee"
)
SELECT
COUNT(*) AS "rowsToUpdate",
COUNT(DISTINCT winnings_id) AS "winningsAffected",
COUNT(DISTINCT "challengeId") AS "challengesAffected"
FROM candidates;
WITH calculated AS (
SELECT
p.payment_id,
ROUND(cb."markup"::numeric, 4) AS "challengeMarkup",
CASE
WHEN p.total_amount IS NULL THEN NULL
ELSE ROUND(p.total_amount * ROUND(cb."markup"::numeric, 4), 2)
END AS "challengeFee"
FROM "finance"."payment" p
INNER JOIN "finance"."winnings" w
ON w.winning_id = p.winnings_id
INNER JOIN "challenges"."ChallengeBilling" cb
ON cb."challengeId" = w.external_id
WHERE w.external_id IS NOT NULL
AND cb."markup" IS NOT NULL
),
candidates AS (
SELECT
calculated.payment_id,
calculated."challengeMarkup",
calculated."challengeFee"
FROM calculated
INNER JOIN "finance"."payment" p
ON p.payment_id = calculated.payment_id
WHERE p.challenge_markup IS DISTINCT FROM calculated."challengeMarkup"
OR p.challenge_fee IS DISTINCT FROM calculated."challengeFee"
),
updated AS (
UPDATE "finance"."payment" p
SET
challenge_markup = candidates."challengeMarkup",
challenge_fee = candidates."challengeFee",
updated_at = CURRENT_TIMESTAMP,
updated_by = 'challenge-markup-fee-backfill'
FROM candidates
WHERE p.payment_id = candidates.payment_id
RETURNING
p.payment_id,
p.winnings_id,
p.challenge_markup,
p.challenge_fee
)
SELECT
COUNT(*) AS "rowsUpdated",
COUNT(DISTINCT winnings_id) AS "winningsAffected"
FROM updated;
-- Spot-check for the challenge from the incident:
SELECT
w.winning_id,
w.external_id AS "challengeId",
p.payment_id,
p.total_amount,
p.challenge_markup,
p.challenge_fee,
cb."markup" AS "challengeBillingMarkup"
FROM "finance"."winnings" w
INNER JOIN "finance"."payment" p
ON p.winnings_id = w.winning_id
INNER JOIN "challenges"."ChallengeBilling" cb
ON cb."challengeId" = w.external_id
WHERE w.external_id = '57a1d424-1931-49a8-a180-d0b0f6cdf293'
ORDER BY p.created_at, p.payment_id;
COMMIT;