Membuat aplikasi akuntansi sederhana dengan Java (3) - Domain Model

Posted by Bustanil Arifin on March 26, 2014 · 5 mins read

Setelah memahami teori dasar akuntansi, kita bisa mulai merancang domain model. Domain model merupakan model konseptual atas objek-objek yang terlibat di dalam sebuah problem domain.

Banyak cara yang dapat digunakan untuk menentukan domain model, misalnya dengan menuliskan proses bisnis yang terjadi lalu mengidentifikasi subjek dan objek dari setiap kejadian bisnis. Dalam kasus ini, proses bisnis yang terjadi adalah sebagai berikut:

  • Satu jenis transaksi melibatkan dua akun
  • Akun-akun yang terlibat dan posisi debit kreditnya dikonfigurasikan berdasarkan jenis transaksinya
  • Setiap transaksi akan dicatat dalam sebuat jurnal
  • Pada setiap entri jurnal jumlah debit dan kredit haruslah seimbang
  • Selain akun-akun yang terlibat, jurnal juga mencatat tanggal posting

Berikut ini adalah domain modelnya:

Class Account merepresentasikan sebuah akun. Sebuah akun memiliki atribut kode, nama dan tipe. Misalnya akun Kas memiliki kode ‘ASSET01’ dengan nama ‘Kas’ dan tipe ‘Asset’.

package com.bustanil.easyaccounting.model;

public class Account {

    private String code;
    private String name;
    private AccountType type;

    // setter dan getter tidak ditampilkan

}

Class TransactionType merepresentasikan jenis transaksi yang mungkin terjadi di sistem, misalnya transaksi ‘Penjualan Tunai’. Setiap jenis transaksi melibatkan dua akun. Konfigurasi akun-akun yang terlibat didefinisikan pada field involvedAccounts.

package com.bustanil.easyaccounting.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class TransactionType {

    private List<AccountConfig> involvedAccounts;

    // setter dan getter tidak ditampilkan

}

Class Transaction merupakan kejadian bisnis yang memperngaruhi akun-akun tertentu.

package com.bustanil.easyaccounting.model;

import java.math.BigDecimal;
import java.util.Date;

public class Transaction {

    private Date transactionDate;
    private String description;
    private TransactionType transactionType;
    private BigDecimal amount;

   	// setter dan getter tidak ditampilkan

}

Class AccountConfig merupakan class yang digunakan untuk mendefinisikan posisi sebuah akun di dalam sebuah jenis transaksi.

package com.bustanil.easyaccounting.model;

public class AccountConfig {

    private Account account;
    private DebitCredit drCr;

    // setter dan getter tidak ditampilkan
}

Class Journal digunakan untuk merekam satu transaksi.

package com.bustanil.easyaccounting.model;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Journal {

    private Date postingDate;
    private Date transactionDate;
    private String referenceNo;
    private List<JournalEntry> journalEntries;

    // setter dan getter tidak ditampilkan
}

Class JournalEntry berisi detil entri dari sebuah jurnal.

package com.bustanil.easyaccounting.model;

import java.math.BigDecimal;

public class JournalEntry {

    private Account account;
    private DebitCredit drCr;
    private BigDecimal amount;

Enum DebitCredit mendefinisikan dua konstanta yang digunakan untuk menentukan bertambah/berkurangnya sebuah akun.

package com.bustanil.easyaccounting.model;

public enum DebitCredit {

    DR, CR

}

Enum AccountType mendefinisikan jenis-jenis akun yang merupakan komponen utama dalam persamaan akuntansi.

package com.bustanil.easyaccounting.model;

public enum AccountType {

    ASSET(DebitCredit.DR), EXPENSE(DebitCredit.DR),
    EQUITY(DebitCredit.CR), LIABILITY(DebitCredit.CR), REVENUE(DebitCredit.CR);

    private DebitCredit defaultDrCr;

    private AccountType(DebitCredit defaultDrCr){
        this.defaultDrCr = defaultDrCr;
    }

    public DebitCredit getDefaultDrCr(){
        return this.defaultDrCr;
    }

}