Menu
CoddyTech

Sistem Perbankan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 89 dari 91.

challenge icon

Tantangan

Mudah

Mari kita bangun Sistem Perbankan yang menangani rekening, transaksi, dan transfer antarrekening. Kamu akan membuat sistem dengan enkapsulasi yang tepat untuk melindungi data keuangan, pewarisan untuk berbagai jenis rekening, dan validasi untuk memastikan integritas data.

Kamu akan mengatur kodemu dalam enam file:

  • Transaction.php: Buat class Transaction untuk mencatat operasi keuangan. Gunakan promosi konstruktor untuk type (string: "deposit", "withdrawal", atau "transfer"), amount (float), dan timestamp (string). Semua property harus bersifat public readonly. Tambahkan method getDescription(): string yang mengembalikan "[type]: $[amount]" (format nilai amount hingga 2 angka desimal).
  • BankAccount.php: Sertakan file Transaction. Buat class abstrak BankAccount dengan:
    • Promosi konstruktor untuk accountNumber (string, public readonly) dan holderName (string, public readonly)
    • Property $balance protected yang diinisialisasi ke 0.0
    • Array private untuk menyimpan riwayat transaksi
    • getBalance(): float: mengembalikan saldo saat ini
    • deposit(float $amount): string: menambahkan ke saldo, mencatat transaksi, dan mengembalikan "Deposited: $[amount]"
    • abstract withdraw(float $amount): string: class anak menerapkan aturan penarikan
    • addTransaction(Transaction $t): void: method protected untuk menambahkan transaksi ke riwayat
    • getTransactionCount(): int: mengembalikan jumlah transaksi
  • SavingsAccount.php: Sertakan file BankAccount. Buat class SavingsAccount yang mewarisi BankAccount dengan:
    • Konstanta class INTEREST_RATE yang ditetapkan ke 0.02 (2%)
    • withdraw(float $amount): string: jika amount melebihi saldo, kembalikan "Insufficient funds"; jika tidak, kurangi saldo, catat transaksi, lalu kembalikan "Withdrew: $[amount]"
    • applyInterest(): string: menghitung bunga berdasarkan saldo saat ini, menambahkannya sebagai deposit, lalu mengembalikan "Interest applied: $[interest]"
  • CheckingAccount.php: Sertakan file BankAccount. Buat class CheckingAccount yang mewarisi BankAccount dengan:
    • Property $overdraftLimit private yang ditetapkan melalui konstruktor (tambahkan parameter ketiga dengan nilai default 100.0)
    • withdraw(float $amount): string: mengizinkan penarikan jika amount tidak melebihi saldo + batas overdraft; kembalikan "Insufficient funds (overdraft limit: $[limit])" jika gagal, atau "Withdrew: $[amount]" jika berhasil
    • getOverdraftLimit(): float: mengembalikan batas overdraft
  • Bank.php: Sertakan kedua file rekening. Buat class Bank yang mengelola rekening:
    • Array private untuk menyimpan rekening yang diindeks berdasarkan nomor rekening
    • addAccount(BankAccount $account): void: menambahkan rekening
    • findAccount(string $accountNumber): ?BankAccount: mengembalikan rekening atau null
    • transfer(string $fromAccount, string $toAccount, float $amount): string: mentransfer uang antar rekening. Kembalikan "Source account not found", "Destination account not found", atau hasil penarikan jika gagal. Jika berhasil, lakukan deposit ke rekening tujuan dan kembalikan "Transferred $[amount] from [from] to [to]"
  • main.php: Sertakan file Bank. Kamu akan menerima dua input: data rekening (JSON) dan operasi (JSON).

    Format JSON rekening:

    [{"type": "savings", "number": "SAV001", "holder": "Alice", "initial": 1000}, {"type": "checking", "number": "CHK001", "holder": "Bob", "initial": 500, "overdraft": 200}]

    Format JSON operasi:

    [{"op": "deposit", "account": "SAV001", "amount": 200}, {"op": "withdraw", "account": "CHK001", "amount": 600}, {"op": "transfer", "from": "SAV001", "to": "CHK001", "amount": 300}, {"op": "interest", "account": "SAV001"}, {"op": "balance", "account": "SAV001"}]

    Buat bank dan semua rekening (dengan menyetorkan saldo awal). Proses setiap operasi:

    • "deposit": Cetak hasil deposit()
    • "withdraw": Cetak hasil withdraw()
    • "transfer": Cetak hasil transfer()
    • "interest": Cetak hasil applyInterest() (hanya untuk rekening tabungan)
    • "balance": Cetak "[holder] balance: $[balance]" (2 angka desimal)

    Cetak setiap hasil pada baris baru. Format semua jumlah uang hingga 2 angka desimal.

Ingat bahwa transfer harus bersifat atomik. Jika penarikan gagal, deposit tidak boleh dilakukan. Property $balance yang protected memungkinkan class anak mengubahnya, sementara tetap menyembunyikannya dari kode luar. Ini menunjukkan enkapsulasi yang tepat dalam konteks keuangan.

Coba sendiri

<?php

require_once 'Bank.php';

// Baca input
$accountsJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));

// Uraikan input JSON
$accounts = (array)json_decode($accountsJson, true);
$operations = (array)json_decode($operationsJson, true);

// TODO: Buat instance Bank

// TODO: Buat akun dari data akun
// Untuk setiap akun dalam $accounts:
//   - Jika tipe adalah "savings", buat SavingsAccount
//   - Jika tipe adalah "checking", buat CheckingAccount (dengan overdraft jika tersedia)
//   - Tambahkan akun ke bank
//   - Setorkan jumlah awal

// TODO: Proses setiap operasi
// Untuk setiap operasi dalam $operations:
//   - "deposit": Cetak hasil deposit()
//   - "withdraw": Cetak hasil dari withdraw()
//   - "transfer": Cetak hasil dari transfer()
//   - "interest": Cetak hasil dari applyInterest() (hanya untuk rekening tabungan)
//   - "balance": Cetak "[holder] balance: $[balance]" (2 angka di belakang koma)

?>

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online