A deploy/cdr_with_charge_ignoring_failed_noanswer.sql => deploy/cdr_with_charge_ignoring_failed_noanswer.sql +26 -0
@@ 0,0 1,26 @@
+-- Deploy jmp:cdr_with_charge_ignoring_failed_noanswer to pg
+-- requires: cdr_with_charge_rate_when_no_plan
+
+BEGIN;
+
+DROP VIEW cdr_with_charge;
+
+CREATE VIEW cdr_with_charge AS
+ SELECT DISTINCT ON (cdr_id, customer_id)
+ cdr.*,
+ rate,
+ (CASE WHEN cdr.disposition IN ('VOICEMAIL', 'NO ANSWER', 'FAILED') THEN 0
+ ELSE rate * ceiling(billsec / 60.0) END) AS charge
+ FROM
+ cdr
+ LEFT JOIN customer_plans USING (customer_id)
+ LEFT JOIN call_rates ON
+ cdr.direction = call_rates.direction AND
+ (
+ customer_plans.plan_name IS NULL OR
+ customer_plans.plan_name = call_rates.plan_name
+ ) AND
+ cdr.tel LIKE call_rates.prefix || '%'
+ ORDER BY cdr_id, customer_id, prefix DESC, rate DESC;
+
+COMMIT;
A revert/cdr_with_charge_ignoring_failed_noanswer.sql => revert/cdr_with_charge_ignoring_failed_noanswer.sql +25 -0
@@ 0,0 1,25 @@
+-- Revert jmp:cdr_with_charge_ignoring_failed_noanswer from pg
+
+BEGIN;
+
+DROP VIEW cdr_with_charge;
+
+CREATE VIEW cdr_with_charge AS
+ SELECT DISTINCT ON (cdr_id, customer_id)
+ cdr.*,
+ rate,
+ (CASE WHEN cdr.disposition = 'VOICEMAIL' THEN 0
+ ELSE rate * ceiling(billsec / 60.0) END) AS charge
+ FROM
+ cdr
+ LEFT JOIN customer_plans USING (customer_id)
+ LEFT JOIN call_rates ON
+ cdr.direction = call_rates.direction AND
+ (
+ customer_plans.plan_name IS NULL OR
+ customer_plans.plan_name = call_rates.plan_name
+ ) AND
+ cdr.tel LIKE call_rates.prefix || '%'
+ ORDER BY cdr_id, customer_id, prefix DESC, rate DESC;
+
+COMMIT;
M sqitch.plan => sqitch.plan +2 -0
@@ 54,3 54,5 @@ sim_nicks 2023-02-01T19:02:47Z Nico <nico@pop-os> # Add column for SIM nickname.
snikket_instances 2023-03-28T18:47:40Z Stephen Paul Weber,,, <singpolyma@singpolyma-beefy> # Store association between billing account and snikket instance
@2023087 2023-03-28T20:00:44Z Stephen Paul Weber,,, <singpolyma@singpolyma-beefy> # Deploy snikket_instances table
+
+cdr_with_charge_ignoring_failed_noanswer [cdr_with_charge] 2023-03-28T21:35:43Z Nico <nico@pop-os> # Added dispositions NO ANSWER and FAILED to cdr_with_charge ignore list
A verify/cdr_with_charge_ignoring_failed_noanswer.sql => verify/cdr_with_charge_ignoring_failed_noanswer.sql +47 -0
@@ 0,0 1,47 @@
+-- Verify jmp:cdr_with_charge_ignoring_failed_noanswer on pg
+
+BEGIN;
+
+SELECT rate, charge FROM cdr_with_charge;
+
+INSERT INTO plan_log
+ (customer_id, plan_name, date_range)
+ VALUES
+ ('test', 'test_plan', tsrange(LOCALTIMESTAMP, LOCALTIMESTAMP + '10 seconds'));
+
+INSERT INTO cdr
+ (cdr_id, customer_id, start, billsec, disposition, tel)
+ VALUES
+ ('test1', 'test', LOCALTIMESTAMP, 10000, 'VOICEMAIL', '+15551234567');
+
+INSERT INTO cdr
+ (cdr_id, customer_id, start, billsec, disposition, tel)
+ VALUES
+ ('test2', 'test', LOCALTIMESTAMP, 10000, 'NO ANSWER', '+15551234567');
+
+INSERT INTO cdr
+ (cdr_id, customer_id, start, billsec, disposition, tel)
+ VALUES
+ ('test3', 'test', LOCALTIMESTAMP, 10000, 'FAILED', '+15551234567');
+
+DO $$
+DECLARE
+ c numeric;
+BEGIN
+ SELECT charge INTO c FROM cdr_with_charge WHERE cdr_id='test1';
+ IF c IS NULL or c <> 0 THEN
+ RAISE EXCEPTION 'Expected VOICEMAIL to charge 0, but got: %', c;
+ END IF;
+
+ SELECT charge INTO c FROM cdr_with_charge WHERE cdr_id='test2';
+ IF c IS NULL or c <> 0 THEN
+ RAISE EXCEPTION 'Expected NO ANSWER to charge 0, but got: %', c;
+ END IF;
+
+ SELECT charge INTO c FROM cdr_with_charge WHERE cdr_id='test3';
+ IF c IS NULL or c <> 0 THEN
+ RAISE EXCEPTION 'Expected FAILED to charge 0, but got: %', c;
+ END IF;
+END $$;
+
+ROLLBACK;