Arsitektur & Model¶
Model¶
| Model | Peran | Catatan |
|---|---|---|
strategy.period |
Rentang penilaian | Tidak bisa ganti tanggal bila sudah memuat KPI |
strategy.objective |
Sasaran strategis / Objective OKR | Jenis run atau change |
strategy.measure |
KPI + target, berversi | series_key + version; terkunci setelah terbit |
strategy.measure.snapshot |
Satu pembacaan aktual | Immutable; memuat coverage, attention |
strategy.observation |
Aktual manual + bukti | Alur draf → submit → verifikasi CEO |
strategy.checkin |
Check-in mingguan | Satu per KPI per minggu |
strategy.audit |
Jejak audit | Immutable, hanya dibuat alur internal |
strategy.dashboard |
AbstractModel | Sumber data dashboard OWL |
Versi dan revisi¶
Sebuah KPI bukan satu record, melainkan deret versi yang berbagi series_key. Menerbitkan
mengunci target dan seluruh field definisi. action_revise membuat versi berikutnya sebagai
draf dengan revision_of_id menunjuk ke pendahulunya; revision_reason wajib sebelum terbit.
_is_current() menentukan versi mana yang aktif hari ini: berstatus terbit, effective_date
sudah lewat, periode belum berakhir, dan tidak ada versi lebih baru yang sudah berlaku.
Jebakan yang sudah pernah terjadi
action_revise menyalin seluruh field EDITABLE dari versi lama. Field Many2one harus
disalin sebagai id, bukan recordset — psycopg tidak bisa mengadaptasi recordset.
Penambahan objective_id ke EDITABLE sempat membuat semua revisi gagal di SQL.
Skor¶
models/scoring.py murni fungsi, tanpa ORM:
- Naik:
nilai / target × 100, dibatasi 0–100 - Turun: 100 bila
nilai ≤ target, selain itutarget / nilai × 100 - Rentang: biner 100 atau 0
Skor None selalu berarti belum ada pengukuran terverifikasi — bukan nol.
Ambang kesegaran¶
Mengikuti frekuensi evaluasi KPI: 7 hari (mingguan), 31 (bulanan), 92 (kuartalan). Snapshot yang lebih tua dari itu menahan skornya dan ditandai stale di dashboard.