Implement phase 1 completion and phase 2 dynamic QR

This commit is contained in:
2026-05-26 08:06:48 +07:00
parent a152c99cce
commit 5624b92872
36 changed files with 3104 additions and 71 deletions

View File

@ -20,7 +20,35 @@ async function main() {
try {
await client.query("BEGIN");
const txResult = await client.query("DELETE FROM transactions WHERE partner_reference LIKE 'PR-%' RETURNING id");
const auditTable = await client.query("SELECT to_regclass('public.audit_logs') AS name");
const idsResult = await client.query(`
SELECT id FROM transactions WHERE partner_reference LIKE 'PR-%' OR partner_reference LIKE 'DYN-%'
UNION
SELECT id FROM devices WHERE device_code LIKE 'DEV-%'
UNION
SELECT id FROM merchants WHERE legal_name LIKE 'Smoke Merchant %'
UNION
SELECT outlets.id
FROM outlets
JOIN merchants ON merchants.id = outlets.merchant_id
WHERE merchants.legal_name LIKE 'Smoke Merchant %'
UNION
SELECT terminals.id
FROM terminals
JOIN outlets ON outlets.id = terminals.outlet_id
JOIN merchants ON merchants.id = outlets.merchant_id
WHERE merchants.legal_name LIKE 'Smoke Merchant %'
UNION
SELECT device_bindings.id
FROM device_bindings
JOIN devices ON devices.id = device_bindings.device_id
WHERE devices.device_code LIKE 'DEV-%'
`);
const auditIds = idsResult.rows.map((row) => row.id);
const auditResult = auditTable.rows[0]?.name && auditIds.length
? await client.query("DELETE FROM audit_logs WHERE entity_id = ANY($1::text[])", [auditIds])
: { rowCount: 0 };
const txResult = await client.query("DELETE FROM transactions WHERE partner_reference LIKE 'PR-%' OR partner_reference LIKE 'DYN-%' RETURNING id");
const devResult = await client.query("DELETE FROM devices WHERE device_code LIKE 'DEV-%' RETURNING id");
const merchantResult = await client.query("DELETE FROM merchants WHERE legal_name LIKE 'Smoke Merchant %' RETURNING id");
@ -30,6 +58,7 @@ async function main() {
transactions_deleted: txResult.rowCount,
devices_deleted: devResult.rowCount,
merchants_deleted: merchantResult.rowCount,
audit_logs_deleted: auditResult.rowCount,
note: "outlets/terminals are removed via merchant cascade"
}));
} catch (error) {