SurePhone ERD — Domain 8: Sys (ระบบ/สนับสนุน)
ตารางฐานที่ทุก domain อ้าง: ธนาคาร, ที่อยู่ (geo seed), ข้อตกลง (terms), R2 cleanup
sys.r2_file+ audit partials อยู่ใน00-shared.mdแล้ว (ไม่ซ้ำที่นี่) config/log อื่น (fee/rate/promotion/blacklist/banner/theme/SMS log/LINE log) → เติมตอนทำ domain ที่เกี่ยวข้อง
DBML
//// audit_c, audit_cu (partials) + sys.r2_file นิยามใน 00-shared.dbml
//// ───────── sys: ธนาคาร ─────────
Table sys.banks {
code varchar(10) [pk, note: 'รหัสย่อ เช่น SCB, KBANK, KTB']
name varchar(255) [not null, note: 'ชื่อเต็มธนาคาร']
Note: 'รายชื่อธนาคาร (seed) — ใช้กับบัญชีรับโอนของร้าน/บ้าน และบัญชีลูกค้าในสัญญา'
}
//// ───────── sys: ที่อยู่ (geo seed — มาตรฐานกรมการปกครอง) ─────────
Table sys.provinces {
id smallint [pk, note: 'รหัสจังหวัด']
name varchar(100) [not null, note: 'ชื่อจังหวัด']
Note: 'จังหวัด 77 จังหวัด — seed data ไม่เปลี่ยน runtime'
}
Table sys.districts {
id smallint [pk, note: 'รหัสอำเภอ/เขต']
province_id smallint [not null]
name varchar(100) [not null, note: 'ชื่ออำเภอ/เขต']
indexes {
province_id [name: 'idx_district_province']
}
Note: 'อำเภอ/เขต — seed · filter ตามจังหวัด'
}
Ref fk_district_province: sys.districts.province_id > sys.provinces.id [delete: restrict, update: no action]
Table sys.sub_districts {
id integer [pk, note: 'รหัสตำบล/แขวง']
district_id smallint [not null]
name varchar(100) [not null, note: 'ชื่อตำบล/แขวง']
postal_code char(5) [not null, note: 'รหัสไปรษณีย์ 5 หลัก (ระดับตำบล)']
indexes {
district_id [name: 'idx_sub_district_district']
postal_code [name: 'idx_sub_district_postal']
}
Note: 'ตำบล/แขวง — seed · เก็บ sub_district_id ที่ตารางอื่น แล้ว derive อำเภอ/จังหวัด/ไปรษณีย์ ผ่าน join'
}
Ref fk_sub_district_district: sys.sub_districts.district_id > sys.districts.id [delete: restrict, update: no action]
//// terms_and_conditions ย้ายไป org (ระดับกิจการ) → ดู 01-org-access.md
//// ───────── sys: ตั้งค่าระดับระบบ — Portal login (Super Admin) ─────────
Table sys.portal_settings {
id smallint [pk, default: 1, note: 'singleton — บังคับ 1 row (id=1)']
cover_file_id uuid [not null, note: 'FK → sys.r2_file · รูปหน้าปก Portal เข้าสู่ระบบ (1440×1024, public)']
logo_file_id uuid [not null, note: 'FK → sys.r2_file · โลโก้ Portal (720×720, public)']
~audit_cu
checks {
`id = 1`
}
Note: 'ตั้งค่ารูปภาพระดับระบบ (Super Admin) — Portal หลักก่อนเลือกบ้าน (node 2442:426800) · singleton 1 row'
}
Ref fk_portal_cover_file: sys.portal_settings.cover_file_id > sys.r2_file.id [delete: restrict, update: no action]
Ref fk_portal_logo_file: sys.portal_settings.logo_file_id > sys.r2_file.id [delete: restrict, update: no action]
//// ───────── sys: R2 file cleanup queue ─────────
Table sys.r2_file_cleanup_jobs {
id uuid [pk, default: `gen_random_uuid()`]
object_key varchar(1024) [not null, unique, note: 'key ที่ต้องลบบน R2 — unique กันสร้างงานซ้ำ']
status varchar(20) [not null, default: 'PENDING', note: 'PENDING/PROCESSING/FAILED — สำเร็จแล้วลบ row ทิ้ง']
attempt_count integer [not null, default: 0]
last_error text [note: 'error ล่าสุดถ้า FAILED']
created_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
updated_at timestamptz [not null, default: `CURRENT_TIMESTAMP`]
checks {
`status IN ('PENDING','PROCESSING','FAILED')`
}
indexes {
status [name: 'idx_r2_cleanup_status']
}
Note: 'Queue ลบไฟล์จริงบน R2 — สร้างเมื่อ r2_file ถูกเปลี่ยน/ลบ · worker เรียก R2 delete API · ไม่ FK ไป r2_file (row นั้นถูกลบไปแล้ว เหลือแค่ key)'
}Mermaid ER
erDiagram provinces ||--o{ districts : "มี" districts ||--o{ sub_districts : "มี" r2_file ||--o{ portal_settings : "ปก/โลโก้ Portal" portal_settings { smallint id PK uuid cover_file_id FK uuid logo_file_id FK varchar created_by timestamptz created_at } banks { varchar code PK varchar name } provinces { smallint id PK varchar name } districts { smallint id PK smallint province_id FK varchar name } sub_districts { integer id PK smallint district_id FK varchar name char postal_code } r2_file_cleanup_jobs { uuid id PK varchar object_key UK varchar status integer attempt_count text last_error timestamptz created_at timestamptz updated_at }
✅ ที่นิยามแล้ว
sys.banks(seed) ·sys.provinces/districts/sub_districts(geo seed) ·sys.portal_settings(singleton — ปก/โลโก้ Portal ระดับระบบ) ·sys.r2_file_cleanup_jobs
❓ ยังค้าง / เติมทีหลัง
terms_and_conditionsย้ายไปorg(ระดับกิจการ) → 01-org-access.md- เติมทีหลังตาม domain: fee/rate config, promotion, blacklist, banner/theme (AD11), SMS log, LINE message log
sys.r2_file+ audit partials → อยู่00-shared.md