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