Adapter Sumber Data¶
Tabel SPECS di models/adapters.py memetakan tiap sumber ke model, domain dasar, field pelaku,
field yang dijumlahkan, apakah bercakupan company, dan nama field tanggal periode
(None = potret sesaat).
| Sumber | Model | Sifat | Satuan wajib |
|---|---|---|---|
manual |
— | Aktual dikirim manusia + bukti | bebas |
task_open |
project.task |
Potret | task |
crm_pipeline |
crm.lead |
Potret, Σ expected_revenue |
mata uang company |
crm_stage_moves |
crm.lead |
Periode, per date_last_stage_update |
opportunity |
ar_overdue |
account.move |
Potret, Σ amount_residual_signed |
mata uang company |
revenue_invoiced |
account.move |
Periode, Σ amount_untaxed_signed |
mata uang company |
cash_in |
account.payment |
Periode, Σ amount_company_currency_signed |
mata uang company |
pr_pending |
purchase.request |
Potret | PR |
po_pending |
purchase.order |
Potret | PO |
calendar_hours |
calendar.event |
Periode, Σ duration |
hour |
calendar_task_hours |
calendar.event |
idem + res_model='project.task' |
hour |
Jendela periode¶
_period_window(field) membedakan Datetime (jendela UTC dari zona waktu pengguna) dan Date
(dibanding sebagai tanggal). Keduanya tidak pernah melewati hari ini — dokumen bertanggal masa
depan adalah rencana, bukan hasil.
Pelajaran yang sudah dibayar¶
Mata uang: filter dan jumlah harus field yang sama
ar_overdue dulu menyaring amount_residual (mata uang faktur) tapi menjumlahkan
amount_residual_signed (mata uang perusahaan). Faktur USD yang sudah lunas dalam rupiah
ikut terhitung dengan kontribusi nol.
calendar.event tidak punya company_id
Satu entri 6 jam dulu terhitung 6 jam di dua company sekaligus. Sekarang KPI kalender menolak terbit bila cakupannya company atau pemiliknya berada di lebih dari satu company.
Odoo menyaring arsip diam-diam
crm_stage_moves memakai ('active', 'in', [True, False]) secara eksplisit, karena menandai
peluang kalah akan mengarsipkannya — dan itu tetap pergerakan yang ingin dihitung.
Task tanpa project tidak punya company
project.task._compute_company_id melewatkan task tanpa project dan tanpa induk. Task
seperti itu tidak pernah ikut terhitung KPI company — ia bersembunyi, bukan menggelembungkan.
Kelompok invisible sengaja melepas syarat company untuk menampilkannya.
Kelompok "perlu dibereskan"¶
Tabel ATTENTION mendefinisikan segmen per sumber. Hasilnya disimpan di
snapshot.attention sebagai {kunci: jumlah} — hanya kuncinya, supaya labelnya terbaca dalam
bahasa pembacanya nanti. Segmen tidak pernah mengurangi nilai KPI.
Pembacaan terjadwal¶
ir.cron harian memanggil _cron_refresh_actuals() sebagai superuser. Tiap KPI dibungkus
savepoint sendiri: satu KPI gagal tidak menghentikan sisanya, dan kegagalannya tercatat sebagai
snapshot unavailable.
Tiap KPI dibaca dalam zona waktu pemiliknya — OdooBot tidak punya zona waktu, sehingga cron 05.00 WIB (22.00 UTC hari sebelumnya) dulu menstempel snapshot dengan tanggal kemarin.