Aplikasi catat jual-beli saham: Odoo 17 + Postgres 16 + addon saat_invest

- docker-compose.yml: odoo:17.0 (port 8069) + postgres:16 (internal, no publish)
- Addon saat_invest: model saat.saham / saat.transaksi / saat.portofolio
  - P/L computed (realized FIFO, unrealized dari harga_sekarang)
  - action_recalculate() endpoint untuk Flutter
  - seed 5 saham IDX (BBRI, TLKM, BBCA, ASII, PTBA)
- JSON-RPC end-to-end terverifikasi: create beli/jual -> recalculate -> portfolio
  (avg_cost 4525, realized 65000, unrealized 220000, nilai 3840000)
- PLAN.md: rancangan disetujui Bozz
- Login Odoo admin/admin (ganti password master di .env, jangan commit)
This commit is contained in:
2026-09-02 11:23:39 +07:00
commit d657a0a8f0
19 changed files with 608 additions and 0 deletions

79
README.md Normal file
View File

@@ -0,0 +1,79 @@
# Aplikasi Catat Jual-Beli Saham — Odoo 17 + Flutter
Backend Odoo ERP (Community 17) untuk mencatat pembelian & penjualan saham,
diakses dari aplikasi **Flutter** (Android).
## Arsitektur
```
Flutter app (Android) ──JSON-RPC──► Odoo 17 (Python)
│ custom addon: saat_invest
▼
PostgreSQL 16
```
## Stack
| Layer | Teknologi | Port |
|---|---|---|
| Backend | Odoo 17 Community (`odoo:17.0`) | `8069` (host) |
| Database | PostgreSQL 16 (`postgres:16`) | internal (5432, tdk di-publish) |
| Mobile | Flutter (Android) | — |
## Struktur proyek
```
saat-app/
├── docker-compose.yml # Odoo 17 + PostgreSQL 16
├── .env # RAHASIA: password (jangan commit)
├── addons/ # custom addon buatan sendiri (saat_invest)
└── README.md
```
## Cara menjalankan
```bash
cd /home/ardhi/Application/saat-app
docker compose config # validasi
docker compose up -d # start
```
Akses UI: http://localhost:8069 — login `admin` / `admin`
(`ADMIN_PASSWORD` untuk Database Management di `.env`).
## Status
- ✅ Odoo 17 container jalan (port 8069), 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
- ⏳ Aplikasi Flutter (login, catat jual/beli, portfolio, P/L)
## Install / upgrade addon saat_invest
```bash
cd /home/ardhi/Application/saat-app
set -a && source .env && set +a
# install pertama kali
docker exec -e PASSWORD="$POSTGRES_PASSWORD" saat-odoo odoo \
-d "$POSTGRES_DB" --db_host=db --db_user="$POSTGRES_USER" \
--db_password="$POSTGRES_PASSWORD" --no-http --stop-after-init -i saat_invest
# upgrade setelah ubah kode
docker exec -e PASSWORD="$POSTGRES_PASSWORD" saat-odoo odoo \
-d "$POSTGRES_DB" --db_host=db --db_user="$POSTGRES_USER" \
--db_password="$POSTGRES_PASSWORD" --no-http --stop-after-init -u saat_invest
docker restart saat-odoo
```
> Catatan Odoo: `<list>` view di Odoo 17 kadang bermasalah, pakai `<tree>`
> (kompatibel lintas versi) seperti yang sudah dilakukan.
## API untuk Flutter (via JSON-RPC `execute_kw`)
Semua melalui `POST /jsonrpc` dengan `{service:'object', method:'execute_kw'}`.
Login: `common.authenticate(db, user, pass)` → `uid`.
- List saham: `saat.saham search_read [domain] {fields}`
- Catat transaksi: `saat.transaksi create [{vals}]`
- List transaksi: `saat.transaksi search_read [domain] {fields}`
- **Rekalkulasi portofolio**: `saat.portofolio action_recalculate [[]]`
- Baca portofolio: `saat.portofolio search_read [domain] {fields}`
(sisa_lembar, avg_cost, total_beli_biaya, realized_pl, unrealized_pl, nilai_sekarang)
## Catatan keamanan
- `.env` berisi rahasia → **tidak boleh di-commit** (sudah di `.gitignore`)
- PostgreSQL tidak di-publish ke host, hanya akses antar-container
- Ganti `ADMIN_PASSWD` segera setelah setup awal