diff --git a/README.md b/README.md index 4bb4cba..8b397d2 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,9 @@ Akses UI: http://localhost:18069 — login `admin` / `admin` - ✅ Odoo 17 container jalan (port 18069), DB PostgreSQL 16 healthy - ✅ JSON-RPC aktif (uid `admin` verified) — endpoint yang akan dipakai Flutter - ✅ **Addon `saat_invest` terinstal** (model saham, transaksi, portofolio + seed 5 saham IDX) -- ✅ End-to-end teruji: buat beli/jual → recalculate → hitung avg cost & realized/unrealized P/L +- ✅ **Portofolio auto-sync**: otomatis diperbarui tiap transaksi ditambah/ubah/hapus + (tidak perlu tombol manual; buka menu Portofolio selalu datanya segar) +- ✅ End-to-end teruji: buat beli/jual → portofolio ter-update → hitung avg cost & realized/unrealized P/L - ⏳ Aplikasi Flutter (login, catat jual/beli, portfolio, P/L) ## Install / upgrade addon saat_invest diff --git a/addons/saat_invest/models/portofolio.py b/addons/saat_invest/models/portofolio.py index 6ee4bdf..1fc56be 100644 --- a/addons/saat_invest/models/portofolio.py +++ b/addons/saat_invest/models/portofolio.py @@ -75,6 +75,19 @@ class SaatPortofolio(models.Model): 'count': len(portfolios), } + def action_recalc_click(self): + """Tombol 'Rekalkulasi' untuk UI web: hitung ulang lalu muat ulang view list.""" + result = self.env['saat.portofolio'].action_recalculate() + # kembalikan action window portofolio agar view ter-refresh + action = { + 'type': 'ir.actions.act_window', + 'name': 'Portofolio', + 'res_model': 'saat.portofolio', + 'view_mode': 'list,form', + 'target': 'current', + } + return action + # --- computed store fields --- @api.depends('total_beli_lembar', 'total_jual_lembar') def _compute_sisa(self): diff --git a/addons/saat_invest/models/transaksi.py b/addons/saat_invest/models/transaksi.py index 217b5ad..67cac6d 100644 --- a/addons/saat_invest/models/transaksi.py +++ b/addons/saat_invest/models/transaksi.py @@ -49,3 +49,24 @@ class SaatTransaksi(models.Model): raise models.ValidationError("Volume harus lebih dari 0.") if r.harga < 0: raise models.ValidationError("Harga tidak boleh negatif.") + + # --- auto-sync portofolio: setiap transaksi berubah, portofolio diperbarui --- + def _resync_portofolio(self): + """Rekalkulasi portofolio dari seluruh transaksi (idempoten).""" + self.env['saat.portofolio'].action_recalculate() + + @api.model_create_multi + def create(self, vals_list): + res = super().create(vals_list) + res._resync_portofolio() + return res + + def write(self, vals): + res = super().write(vals) + self._resync_portofolio() + return res + + def unlink(self): + res = super().unlink() + self._resync_portofolio() + return res diff --git a/addons/saat_invest/views/portofolio_views.xml b/addons/saat_invest/views/portofolio_views.xml index 40f519f..856c125 100644 --- a/addons/saat_invest/views/portofolio_views.xml +++ b/addons/saat_invest/views/portofolio_views.xml @@ -21,6 +21,10 @@ saat.portofolio
+
+
@@ -51,9 +55,9 @@ saat.portofolio list,form -

- Klik Rekalkulasi (menu Form) untuk memperbarui posisi dari transaksi. -

+

Portofolio dihitung dari seluruh transaksi. + Untuk memperbarui: klik salah satu baris portofolio, lalu tekan tombol + Rekalkulasi di atas form. (Belum ada baris? Tambah transaksi dulu di menu Transaksi.)