Lewati ke isi

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.