ETS PPB C 2026

 Nama Kelompok : Moch Septian Ezra M - 5025231120

                                Muhammad Shafa Narariya - 5025231016

Kelas : PPB (C)

Link Source Code: https://github.com/arzeee/MyMoney-Notes-Smart-Expense-Tracker

Link Video: https://drive.google.com/file/d/1weyYAgraqq5foiuruDrk8J2owasL7lHj/view?usp=sharing


MyMoney Smart Expenses Tracker adalah aplikasi manajemen keuangan pribadi yang dirancang untuk memberikan kontrol penuh atas finansial pengguna. Dengan antarmuka yang modern dan bersih, aplikasi ini memungkinkan pengguna untuk mencatat setiap pemasukan dan pengeluaran secara detail, lengkap dengan kategori dan waktu transaksi. Fitur unggulannya adalah Ringkasan Visual dalam bentuk grafik lingkaran (Pie Chart) yang memberikan gambaran instan mengenai perbandingan arus kas, serta perhitungan saldo total yang diperbarui secara otomatis setiap kali ada transaksi baru.

1. Logika Saldo Otomatis (ViewModel)

fun getTotalBalance(): Double {
    return _transactions.value.sumOf {
        if (it.type == TransactionType.PEMASUKAN) it.amount else -it.amount
    }
}

Penjelasan: Fungsi ini menggunakan sumOf. Ia akan mengecek setiap transaksi: jika tipenya PEMASUKAN maka nilainya positif, jika PENGELUARAN maka nilainya negatif. Hasil akhirnya adalah saldo bersih yang tampil di bagian atas layar kamu.


2. Pengambilan Data Reaktif (StateFlow)

private val _transactions = MutableStateFlow<List<Transaction>>(emptyList())
val transactions: StateFlow<List<Transaction>> = _transactions.asStateFlow()

Penjelasan: StateFlow bertindak seperti aliran air. Begitu fungsi addTransaction dipanggil, "aliran" ini mengirimkan daftar terbaru ke UI (HomeScreen). UI akan mendeteksi perubahan tersebut dan menggambar ulang daftar transaksi secara otomatis (Recomposition).


3. Visualisasi Ringkasan (Pie Chart Canvas)

Canvas(modifier = Modifier.size(100.dp)) {
    drawArc(
        color = Color(0xFF4CAF50), // Hijau
        startAngle = -90f,
        sweepAngle = incomeRatio * 360f,
        useCenter = true
    )
    // ... drawArc untuk warna merah
}

Penjelasan: incomeRatio menghitung berapa persen pemasukan dari total uang, lalu dikalikan 360 untuk menentukan seberapa lebar warna hijau di lingkaran tersebut.


4. Daftar yang Efisien (LazyColumn)

LazyColumn(

    modifier = Modifier.fillMaxSize(),
    verticalArrangement = Arrangement.spacedBy(8.dp)
) {
    items(transactions) { transaction ->
        TransactionItem(transaction = transaction)
    }
}

Penjelasan: LazyColumn sangat penting untuk performa. Jika kamu punya 1000 transaksi, ia hanya akan memproses transaksi yang terlihat di layar saja. Ini membuat aplikasi tetap ringan dan tidak lag saat di-scroll.


5. Keamanan Input (toDoubleOrNull)

val amountDouble = amount.toDoubleOrNull() ?: 0.0

if (title.isNotBlank() && amountDouble > 0) {
    // Simpan data
}

Penjelasan: Karena input dari user berupa teks (String), kita harus mengubahnya ke angka (Double). toDoubleOrNull() memastikan jika user salah ketik (misal mengetik huruf), aplikasi akan memberikan nilai 0.0 alih-alih menutup paksa (force close).


Komentar

Postingan populer dari blog ini

Pertemuan 1

Pertemuan 2

Pertemuan 3