Lewati ke isi

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 itu target / 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.