Pertimbangan khusus apa yang diperlukan ketika merancang basis data untuk menyimpan catatan keuangan?

15

Saya harap pertanyaan ini tidak terlalu luas. Di masa depan saya mungkin perlu menambahkan beberapa sistem akuntansi dan pelacakan keuangan ke beberapa aplikasi (kebanyakan aplikasi berbasis web, tetapi pertanyaan saya juga berkaitan dengan aplikasi desktop).

Sekarang, membuat catatan sederhana transaksi keuangan secara teori mudah. Satu tabel database dengan beberapa kolom bisa melakukan pekerjaan itu. Bahkan MS Access, Excel, atau bahkan hanya file teks ASCII biasa dapat digunakan untuk menyimpan tanggal transaksi, ID akun, dan jumlah dolar. Namun, saya merasa bahwa bahkan tabel SQL yang sering didukung dengan integritas transaksional mungkin tidak cukup kuat untuk pelacakan keuangan yang serius.

Saya mendengar istilah seperti "akuntansi entri ganda", dan saya merasa sebagian besar aplikasi pelacakan keuangan (misalnya, Mint.com, atau GnuCash) memiliki struktur atau proses data yang jauh lebih rumit untuk memastikan bahwa semuanya bertambah sempurna, persis sebagaimana mestinya, dan tidak ada data yang hilang atau rusak.

Pertanyaan saya adalah: Ketika merancang aplikasi untuk melacak transaksi keuangan, pertimbangan desain khusus apa yang harus dibuat? Sepertinya mungkin ada begitu banyak masalah potensial ... masalah dengan pembulatan presisi, pemeriksaan paritas, semacam proses audit, cadangan khusus, keamanan / enkripsi, cara-cara ekstra untuk melindungi data jika terjadi gangguan saat entri data sedang. ... Saya tidak benar-benar tahu apa yang seharusnya saya tanyakan secara spesifik, tetapi saya merasa bahwa industri pemrograman memiliki serangkaian praktik terbaik yang tidak saya ketahui. Apakah mereka?

Edit:

Sepertinya saya membuka kaleng cacing yang lebih besar dari yang saya harapkan. Untuk memperjelas, saya sedang memikirkan dua jenis aplikasi:

  1. "Periksa registri" -jenis aplikasi seperti GnuCash atau Quicken yang menyimpan catatan transaksi individu untuk digunakan sendiri.
  2. Aplikasi yang melacak faktur / kredit / atau "poin" untuk vendor dan pelanggan yang berhubungan dengan perusahaan.

Saya mungkin tidak akan melakukan perbankan langsung atau (AFAIK) apa pun yang memiliki banyak peraturan pemerintah terkait keuangan yang melekat padanya.

Joshua Carmody
sumber
4
Setiap kali saya melihat pertanyaan ini, saya mendapatkan semburan "Biarkan saya memberikan pengalaman saya pada Anda!" dan kemudian hilang karena volume data yang sangat besar sehingga saya tidak tahu harus mulai dari mana. Saya akan mengatakan bahwa itu tergantung pada jenis bisnis, volume bisnis, dan jumlah nol Anda akan berurusan dengan. Dalam dua kasus terakhir, jika Anda berurusan dengan banyak hal, dapatkan seorang akuntan.
Satanicpuppy
3
Untuk sedikit mengurangi kekhawatiran Anda, "akuntansi entri ganda" tidak ada hubungannya dengan seberapa kuat aplikasi tersebut. Istilah itu hanyalah sebuah praktik akuntansi yang mengatakan setiap kali Anda melakukan transaksi debit terhadap satu akun (katakanlah, tunai), itu harus sesuai dengan transaksi kredit terhadap akun lain (katakanlah, Inventaris).
Mike Clark
@Satanicpuppy - Ya, misalkan saya ingin membuat GnuCash baru? Saya sedang memikirkan transaksi dasar atau pendaftaran faktur. Tidak ada yang seperti aplikasi penagihan CC atau aplikasi perdagangan saham.
Joshua Carmody
@ Joshua: tolong edit ini ke dalam pertanyaan Anda: "Saya sedang memikirkan transaksi dasar atau pendaftaran faktur. Tidak seperti aplikasi penagihan CC atau aplikasi perdagangan saham." (Anda menyebut "jasa keuangan" di dekat akhir pertanyaan Anda. Akuntansi dan jasa keuangan tidak persis sama.)
rwong
2
@ Yosua: jasa keuangan tunduk pada lebih banyak peraturan pemerintah, sehingga akan ada banyak "pertimbangan khusus" untuk misalnya perangkat lunak perdagangan saham daripada untuk sistem akuntansi. Perangkat lunak pajak juga tunduk pada peraturan pajak.
rwong

Jawaban:

10

Anda akan mendapatkan banyak jawaban untuk ini. Saya yakin, banyak jawaban idealis juga, saya hanya bisa menjawab dari pengalaman saya dengan keuangan dan apa yang sebenarnya terjadi.

Anda telah membahas sebagian besar masalah.

Presisi pembulatan cenderung tidak menjadi masalah dalam pengalaman saya. Mayoritas organisasi keuangan besar yang belum tumbuh dalam semalam (yaitu semuanya kecuali hedge fund) memiliki sejumlah besar aplikasi warisan yang terpecah karena berbagai bahan bakar. Mereka cenderung tidak melakukan presisi pembulatan secara konsisten; umumnya kesalahan tertentu untung dan rugi hanya diterima untuk pembulatan. Memang banyak jam kerja dihabiskan di tempat saya bekerja di mana manusia sebagai penyeleksi 'ya yang cukup dekat' ketika datang untuk mencocokkan jumlah yang tepat / diharapkan. Ingat, ini adalah jawaban berdasarkan kenyataan, bukan apa yang harus terjadi.

Enkripsi - jangan terus terang padanya. Menyimpan data pengidentifikasian dalam sistem yang terpisah secara fisik dan logis dari data yang tidak diidentifikasi (yaitu kode akun di mana-mana, data pribadi terpisah).

Umumnya saat cadangan diperlukan, cadangan offline jarang dipanggil - ada yang salah pada saat itu. Salinan produksi hangat umumnya diperlukan - namun ini akan tergantung pada kebutuhan spesifik Anda sendiri. Dalam praktik umum, kami memiliki salinan produksi hangat di semua sistem DAN situs pemulihan bencana dengan produksinya sendiri dan salinan hangat. Salinan hangat cenderung ketinggalan beberapa menit dalam replikasi dll.

Audit adalah kunci untuk setiap sistem keuangan yang pernah saya kerjakan. Anda memiliki 2 persyaratan mendasar A) Dapatkah Anda melacak setiap perubahan yang dilakukan pada data, oleh siapa, kapan dan mengapa? B) Bisakah Anda membuktikan status historis data Anda? Bahwa itu belum dirusak?

A) diperlukan untuk tim operasi - sistem Anda akan digunakan dalam 100 cara yang tidak pernah Anda harapkan, dan informasi ini sangat penting untuk perluasan, pelaporan ad-hoc, alasan hukum dan debugging.

B) Lihat kasus AMEX vs. Vee Vinhnee - di mana AMEX tidak dapat mengumpulkan 40k yang terhutang kepada mereka karena mereka tidak dapat membuktikan bahwa catatan mereka tidak dibuat-buat. Solusi yang umumnya digunakan untuk ini adalah cap waktu tepercaya. Keuangan besar memiliki bank penjamin yang menjamin transaksi dan karenanya secara inheren memberikan cap waktu tepercaya. Ada penyedia komersial untuk ini untuk jalan-jalan / skenario lainnya.

Jonno
sumber
6

Sebagian besar pertimbangannya legal . Jika Anda hanya melihatnya dari sudut pandang keselamatan / keandalan, lembar excel mungkin tidak secara inheren kurang aman daripada selembar kertas di beberapa laci. Integritas transaksional Access mungkin lebih baik daripada petugas yang terganggu oleh panggilan.

Tetapi, agar pelanggan Anda diizinkan untuk menggunakannya, Anda harus mematuhi hukum setempat Anda. Beberapa hal yang saya temui (di jerman)

  • Format dokumen untuk masalah penyimpanan , karena ada undang-undang yang harus disimpan oleh bisnis selama 10 tahun. Dalam 10 Tahun, mungkin program Anda tidak tersedia lagi. Oleh karena itu, Anda harus menyimpan dokumen dengan cara DIN / ISO-bersertifikat (.pdf tampaknya cukup di Jerman)
  • Audit Trails seringkali diperlukan, misalnya Anda mungkin harus menyajikan versi berbeda dari dokumen yang sama, dengan tanggal modifikasi.
  • Lokasi Penyimpanan penting , karena 'Datenschutz' (privasi), yang mungkin berbeda di negara penyimpanan. Ini membuat layanan berbasis cloud sedikit rumit.
  • Beberapa dokumen harus disimpan dengan cara yang tidak bisa diubah . bagaimana tepatnya hal ini dicapai tampaknya sebagian besar bergantung pada nitpicking legalistik (kertas tidak dapat diubah, cd tidak bisa diubah, cd yang ditandatangani oleh pekerja tidak)

Anda harus secara pasti menghubungi seorang pengacara, untuk spesifik, atau setidaknya bekerja dalam kemitraan yang erat dengan pelanggan.

keppla
sumber
3

Faktor keandalan menjadi luar biasa penting ketika Anda berurusan dengan uang orang. Jika Twitter kehilangan tweet, itu bukan masalah besar; jika Anda menagih kartu kredit seseorang tetapi kehilangan pesanan, seseorang di organisasi Anda akan mendapatkan banyak uang dari pelanggan yang marah. Jadi dua hal: 1. Anda tidak ingin hal itu terjadi sejak awal, tetapi 2. itu akan terjadi pada akhirnya tidak peduli seberapa hati Anda Anda, jadi Anda ingin memasukkan BANYAK energi ke dalam jenis mekanisme logging dan tracing yang akan membantu Anda kembali dan menemukan urutan "hilang" dan memperbaiki situasi.

Hal terburuk yang mutlak adalah memiliki, misalnya, tagihan kartu kredit, tetapi TIDAK ada catatan sama sekali untuk apa itu, atau untuk siapa, dll.

Untuk hal-hal finansial, Anda benar-benar perlu memikirkan bahkan skenario yang tampaknya sangat mustahil dan merencanakan cara menanganinya: "Kami menagih kartu kredit, tetapi server basis data turun sebelum kami dapat memperbarui catatan yang sesuai." OK, bagaimana sekarang? Membatalkan tagihan? Log transaksi ke file sehingga manusia dapat memperbaikinya nanti? Ok, bagaimana jika disk sudah penuh dan Anda tidak dapat menulis ke file? Dll, dll.

mindcrime
sumber
3

[1] Gunakan tabel keamanan (jangan bingung dengan pengguna DB internal) untuk pengguna dan aplikasi Anda. modul, formulir, halaman web:

User = {userID, username, pwd, email1, email2}
Modules = {moduleID, moduleTitle, moduledescription}
ModulesPerUser = {modulesperuser, userID, moduleID}

[2] Jangan hapus rekaman di aplikasi Anda., Gunakan bidang status, mungkin bilangan bulat, mungkin boolean atau sedikit, yang menunjukkan bahwa catatan itu dianggap "dihapus". Membuat Anda aplikasi menunjukkan catatan yang tidak dihapus (ditandai sebagai terhapus, oleh bidang itu), dan membuat beberapa formulir kasus khusus, di mana aplikasi. tidak menunjukkan catatan yang ditandai sebagai dihapus.

anytable = {anytableID, anytablefield1, anytablefield2, ..., bool anytableisdeleted }

Fitur ini disebut "penghapusan virtual". Penghapusan yang sebenarnya sering disebut "penghapusan fisik".

[3] Gunakan bidang di semua tabel yang berhubungan dengan akses, simpan pengguna (tunggal) yang membuat catatan, dan pengguna (terakhir) yang mengubah catatan, dan waktu, jika mungkin tambahkan modul atau opsi tempat setiap catatan diubah:

AnyTable = {anytableID, anytablecreateuserID, anytablecreatedatetime,
anytableupdateuserID, anytableupdatedatetime,
moduleID, anytablefield1, anytablefield2, ..., anytableisdeleted }

[4] Dalam beberapa kasus, nilai mata uang atau uang dapat memengaruhi hasil, bila digunakan beberapa catatan secara terperinci, dan, ditambahkan ke dalam nilai tunggal, catatan kepala.

Sebagian besar merek basis data mendukung, hari ini, bidang data mata uang atau data. Gunakan.

Dalam beberapa keadaan khusus, beberapa orang menyimpannya dalam nilai float tetap yang mendukung beberapa angka desimal, ("desimal") atau bahkan sebagai nilai string.

Teknik ini merupakan pedang bermata dua. Jika aplikasi Anda memerlukan semacam presicion, cari di web, untuk tutorial tentang cara menerapkannya, dengan benar.

Bersulang. [Jangan lupa memberikan kaleng tuna terbuka ke kucing, atau lepaskan dukungan]

umlcat
sumber
2

Anda telah menandai pertanyaan Anda dengan securitytetapi Anda sebagian besar berbicara tentang konsistensi dan keandalan, jadi saya akan mencoba menjawab bagian dari persamaan tersebut:

  • Gunakan transaksi basis data untuk memastikan integritas operasi batch. Contoh paling mendasar adalah transfer antara dua akun - satu akun dikurangkan jumlahnya dan yang lainnya dikreditkan. Gunakan transaksi untuk memastikan transfer parsial tidak pernah terjadi (hanya satu sisi yang berubah).
  • Untuk presisi, gunakan DECIMALtipe bukan mengapung. Perhitungannya jauh lebih lambat tetapi Anda tidak boleh merasakannya karena sebagian besar perhitungan keuangan sangat mendasar
  • Gunakan replikasi untuk waktu aktif dan hotcopies untuk cadangan. Anda juga harus melihat snapshot LVM untuk pemulihan
Eran Galperin
sumber
2

Beberapa pertimbangan yang saya lihat adalah bahwa Anda harus memperhitungkan kontrol internal. Ini berarti semua akses untuk tindakan terhadap tabel (Sisipkan / hapus / perbarui) harus melalui procs yang disimpan (dan tidak ada SQl dinamis) sehingga tidak ada tabel yang mengizinkan hak menulis atau menghapus langsung di atas tabel kepada siapa pun kecuali admin sistem. Anda juga harus memperhitungkan kontrol internal yang tidak memungkinkan seseorang membuat perusahaan baru dan kemudian membebankan biaya pada perusahaan tersebut (rute untuk penipuan). Tindakan seperti itu akan selalu mengharuskan orang dalam dua peran berbeda untuk menyetujui. Cek juga tidak boleh dipotong kecuali satu orang memasukkan data dan orang lain menyetujui biaya.

Semua tabel harus memiliki pemicu yang membuat catatan audit. Anda mencari untuk mencegah penipuan dan jika itu terjadi untuk menentukan dengan tepat siapa yang mengambil tindakan kapan.

Dalam aplikasi keuangan, Anda jauh lebih mementingkan banyak proses back-end yang tidak pernah dilihat oleh User Interface. Kekhawatiran pertama Anda adalah mencegah penipuan dan dengan demikian banyak pemeriksaan yang tidak diketahui oleh orang lain dilakukan di backend.

Saya tidak akan menangani aplikasi keuangan apa pun tanpa membaca GAAP (di AS, negara lain memiliki standar akuntansi sendiri) secara menyeluruh dan memiliki CPA sebagai konsultan karena praktik akuntansi yang salah dapat menyebabkan waktu penjara. Ini adalah bidang yang sangat teknis dan seseorang tanpa pengetahuan yang diperlukan tidak memiliki bisnis yang mencoba membuat perangkat lunak di bidang ini.

HLGEM
sumber
1

Akuntansi sering tentang verifikasi. Selama Anda mengingat ini dan memahami hubungan antara masing-masing entitas, cukup sulit untuk membuatnya salah.

Saya akan mencoba mencantumkan sebanyak mungkin cek tetapi akan selalu melewatkan beberapa cek, semoga cukup bagi Anda untuk memulai penggalian Anda sendiri.

Total Debit == Total Kredit, ini benar apakah Anda berbicara tentang SELURUH set akun atau hanya satu transaksi secara terpisah. Jika tidak sesuai, Anda melewatkan setidaknya satu posting di suatu tempat. Ini adalah bagaimana Buku Besar menyeimbangkan dirinya sendiri.

Piutang Akun (debet bersih ke akun pengendali) == Total tagihan (jumlah total semua jumlah yang dapat ditagih) - Total yang diterima (jumlah total semua pembayaran yang diterima). Ini adalah contoh bagaimana total transaksi dalam FISIK aktual dan ketentuan dokumen nyata harus seimbang dengan Buku Besar (entri ganda).

Saldo Bank (sesuai dengan pernyataan bank Anda) == Total Buku Besar Umum Anda untuk akun itu + apa pun cek yang diterima yang tidak disetor - cek apa pun yang diterbitkan yang tidak ditagih. Ini adalah contoh bagaimana rekening bank / kas dikaitkan dengan Jenderal Buku besar.

Seperti yang Anda lihat, setiap transaksi, sub buku besar, bahkan saham, terkait langsung dengan Buku Besar.

Jika Anda melakukan pengujian unit, cukup mudah untuk menjalankan tes yang memastikan saldo ini ada setiap kali Anda memasukkan / memperbarui transaksi selama Anda tahu apa yang harus diperiksa.

Tentu saja ada lebih banyak saldo untuk diperiksa tetapi Anda harus mendapatkan intisari dari pekerjaan yang dibutuhkan. Pada dasarnya, semuanya menyeimbangkan segalanya, apakah itu dokumen fisik, item General Ledger, laporan bank. Itu seharusnya menjadi keseimbangan sempurna, atau dalam kasus di mana Anda malas untuk berurusan dengan pembulatan, hampir sempurna.

Semakin banyak pemeriksaan yang dapat Anda lakukan saat mengembangkannya, semakin kecil peluang Anda untuk melakukan kesalahan.

BTW, ketika Anda berurusan dengan pembulatan, cobalah untuk menggunakan desimal alih-alih mengapung, itu akan menyelamatkan Anda dari banyak sakit kepala di jalan. : P

Permas
sumber