Files
saat-app/flutter/lib/services/stock_service.dart
Alex Ardhian 1fc095c63c Flutter: fitur Tambah Saham (tab Saham + form kode/perusahaan/sektor)
- Tab baru 'Saham' di NavigationBar (daftar master saham dari saat.saham)
- FAB konteks: di tab Saham buka form Tambah Saham, di tab lain catat transaksi
- EditSahamScreen: form tambah saham baru (kode ticker, perusahaan, sektor)
- StockService: method addSaham(), updateSaham(), hapusSaham() ke Odoo
2026-09-06 19:52:07 +07:00

88 lines
2.9 KiB
Dart

import '../api/odoo_client.dart';
import '../models/portfolio.dart';
import '../models/saham_transaksi.dart';
/// Layanan domain utk model Odoo saat_invest.
class StockService {
StockService(this.client);
final OdooClient client;
// ---- Saham ----
Future<List<Saham>> listSaham() async {
final fields = ['name', 'perusahaan', 'sector'];
final res = await client.executeSearchReadPayload("saat.saham", fields);
return (res as List).map((e) => Saham.fromOdoo(e as Map<String, dynamic>)).toList();
}
// Tambah saham baru ke Odoo saat.saham.create
Future<int> addSaham({
required String kode,
String? perusahaan,
String? sektor,
}) async {
final vals = <String, dynamic>{
'name': kode,
if (perusahaan != null && perusahaan.isNotEmpty) 'perusahaan': perusahaan,
if (sektor != null && sektor.isNotEmpty) 'sector': sektor,
};
final res = await client.executeKwd('saat.saham', 'create', args: [vals]);
return (res as num).toInt();
}
// Update data saham (perusahaan, sektor)
Future<void> updateSaham(int id, {String? perusahaan, String? sektor}) async {
final vals = <String, dynamic>{
if (perusahaan != null) 'perusahaan': perusahaan,
if (sektor != null) 'sector': sektor,
};
await client.executeKwd('saat.saham', 'write', args: [[id], vals]);
}
// --- Hapus saham (optional) ---
Future<void> hapusSaham(int id) async {
await client.executeKwd('saat.saham', 'unlink', args: [[id]]);
}
// ---- Portofolio ----
Future<List<Portfolio>> listPortofolio() async {
final fields = [
'saham_id', 'sisa_lembar', 'avg_cost', 'harga_sekarang',
'nilai_sekarang', 'realized_pl', 'unrealized_pl',
];
final res = await client.executeSearchReadPayload("saat.portofolio", fields);
return (res as List).map((e) => Portfolio.fromOdoo(e as Map<String, dynamic>)).toList();
}
// ---- Transaksi ----
Future<List<Transaksi>> listTransaksi() async {
final fields = ['tanggal', 'tipe', 'saham_id', 'volume', 'harga', 'fee', 'total'];
final res = await client.executeSearchReadPayload("saat.transaksi", fields);
return (res as List).map((e) => Transaksi.fromOdoo(e as Map<String, dynamic>)).toList();
}
Future<int> addTransaksi({
required int sahamId,
required String tipe, // buy | sell
required int volume,
required double harga,
required double fee,
String? tanggal, // 'YYYY-MM-DD'
}) async {
final vals = <String, dynamic>{
'saham_id': sahamId,
'tipe': tipe,
'volume': volume,
'harga': harga,
'fee': fee,
if (tanggal != null) 'tanggal': tanggal,
};
final res = await client.executeKwd('saat.transaksi', 'create', args: [vals]);
return (res as num).toInt();
}
Future<void> hapusTransaksi(List<int> ids) async {
await client.executeKwd('saat.transaksi', 'unlink', args: [ids]);
}
}