Instruction file imported from yendyr/olshoperp-docs (
.cursor/rules/19-database-data-verification.mdc). Copyright stays with the author.
Database Data Verification (QA — olshoperp-docs)
Pakai rule ini saat user / tugas menyebut cek db, query db, db staging, db tyas, db merdian, audit trail db, verifikasi data di database, atau saat FAIL E2E perlu bukti baris DB.
Sumber kebenaran
| Layer | Lokasi | Isi |
|---|---|---|
| Kontrol QA (workspace ini) | tests/DATA-VERIFICATION.md |
Level L1/L2/L3, kapan boleh, matriks env, gate company_id |
| Katalog Skema (agent) | agent-db/schema-catalog.yaml + agent-db/cache.md |
Skema tabel, kolom kunci, kolom index, tenant owned_by |
| SoT teknis runner | ../olshoperp/.cursor/rules/19-database-debugger.mdc |
Read-only, forensik 4 langkah, larangan secret |
| Mekanisme Eksekusi | Direct HTTP POST (Webhook n8n) | Eksekusi via HTTP Request; kredensial dari .env |
Jangan menduplikasi prosedur panjang di sini — baca agent-db/schema-catalog.yaml dulu untuk skema presisi.
0. Zero-Exploration Sequence (One-Shot Query)
Agent DILARANG SPAM QUERY (SHOW TABLES / DESCRIBE). Seluruh skema tabel, kolom, relasi, dan indeks sudah tersedia lokal di agent-db/schema-catalog.yaml.
S0 CEK KONTEKS & LOKAL: Jika skema sudah ada di ingatanmu, JANGAN baca file berulang. Jika belum, cek `agent-db/cache.md`. Hanya baca `agent-db/schema-catalog.yaml` jika butuh detail index/struktur.
S1 TENANT SCOPE: Gunakan `owned_by = <company_id>` (BUKAN `company_id`).
Semua tabel SCM, Omni, Accounting, Gate memiliki composite index (owned_by, is_all_company, deleted_at).
S2 INDEX-AWARE: Susun filter WHERE HANYA menggunakan kolom ber-indeks (mis. order_no, code, created_at range).
S3 ONE-SHOT QUERY: Langsung kirim 1x SELECT spesifik dengan LIMIT. Dilarang SELECT * pada tabel besar.
S4 FALLBACK: Hanya jika tabel sama sekali belum ada di catalog, boleh 1x DESCRIBE lalu catat ke schema-catalog.yaml.
Aturan Kolom & Nilai Kunci:
- Tenant Company =
owned_by(Bukancompany_id). status= flag aktif 1/0; status dokumen =transaction_status(lowercase:draft,open,approved,void, dll).- DILARANG
LIKE '%keyword%'(Leading Wildcard) — selalu gunakan exact match (=) atau prefix match (LIKE 'OT-%'). Leading%mematikan index dan memaksa Full Table Scan (>15 detik). audits= WAJIBauditable_type = 'App\\\\Models\\\\...' AND auditable_id = <id>. Dilarang query audits tanpaauditable_type.- Backslash JSON = Format 4 backslash di body JSON:
"SELECT 'App\\\\Models\\\\X' AS t".
Routing env & HTTP Request
DILARANG MEMBUAT FILE SCRIPT (.ps1, .mjs, .sh, .py) di dalam direktori workspace (_local/, root, atau folder repo manapun) yang berpotensi menjadi file sampah dan membocorkan API key.
Eksekusi wajib langsung via HTTP POST Request inline (curl) atau temporary scratch artifact (brain/<conversation-id>/scratch/). Kredensial dibaca dinamis dari .env (Dilarang hardcode API key).
- Tyas (
tyas_olshoperp) + Staging (staging_olshoperp) → webhook shared:- URL:
https://n8n.olshoperp.com/webhook/agent-db-tyas - Header:
Content-Type: application/json,X-API-Key: <DB_DEBUG_API_KEY>
- URL:
- Merdian (
merdian_olshoperp) → webhook terpisah (server beda):- URL:
https://n9n.olshoperp.com/webhook/agent-db-merdian - Header:
Content-Type: application/json,X-API-Key: <DB_DEBUG_API_KEY_MERDIAN>
- URL:
Contoh eksekusi via HTTP Request (curl):
# Query Staging
curl -s -X POST "https://n8n.olshoperp.com/webhook/agent-db-tyas" \
-H "Content-Type: application/json" \
-H "X-API-Key: $DB_DEBUG_API_KEY" \
-d '{"db":"staging_olshoperp","query":"SELECT id, sku, name FROM scm_products WHERE owned_by = 153 AND deleted_at IS NULL LIMIT 5"}'
# Query Tyas
curl -s -X POST "https://n8n.olshoperp.com/webhook/agent-db-tyas" \
-H "Content-Type: application/json" \
-H "X-API-Key: $DB_DEBUG_API_KEY" \
-d '{"db":"tyas_olshoperp","query":"SELECT id, order_no, transaction_status FROM omni_sales_orders WHERE owned_by = 153 AND deleted_at IS NULL LIMIT 5"}'
# Query Merdian
curl -s -X POST "https://n9n.olshoperp.com/webhook/agent-db-merdian" \
-H "Content-Type: application/json" \
-H "X-API-Key: $DB_DEBUG_API_KEY_MERDIAN" \
-d '{"db":"merdian_olshoperp","query":"SELECT id, username, first_name FROM gate_users WHERE owned_by = 1 LIMIT 5"}'
Larangan QA (mutlak)
- Hasil DB bukan bukti
last_execution.status: passeduntuk TC UI-crawling. - Jangan expose
DB_DEBUG_API_KEY*/ URL override di chat, TC, atau commit. - Dilarang menggunakan runner script
.mjs— wajib HTTP POST Request langsung ke Webhook. - Selalu filter scope company (
owned_by) yang sedang diuji; SoftDeletes awareness (deleted_at IS NULL). - Read-only saja — hanya
SELECT,EXPLAIN,DESCRIBE,SHOW,WITH. Dilarang mutasi SQL (INSERT/UPDATE/DELETE/DROP). - Jangan buat folder
qa-docs/{menu}khusus “cek DB” — tooling ops, bukan fitur menu.
Triage cepat: Kapan DB vs Kapan LOG
| Permintaan User / Intent | Jalur Eksekusi | Tool & Rule |
|---|---|---|
| Assert TC / flow UI lulus | Playwright CLI (L1) | Rule 14 (npm test) |
| Cek status data / kolom aktual | Direct HTTP POST (DB Webhook) | Rule 19 |
| Audit trail (siapa ubah data / void) | Direct HTTP POST (DB audits) |
Rule 19 |
| Hitung data kuantitatif / anomali | Direct HTTP POST (DB Agregasi COUNT(*)) |
Rule 19 |
| Error 500 / Exception / Crash Server | Direct HTTP POST (Log Webhook) | Rule 21 |
| Investigasi Error 2 Arah | Log ➡️ DB Cross-check | HTTP Fetch Log dulu ➡️ HTTP Query DB record ID terkait |
