31 BAB 3 PERANCANGAN PROGRAM
3.1 Metoda Pengumpulan Data
Data penduduk yang digunakan dalam proses perhitungan merupakan data simulasi. Initial data yang digunakan dalam program adalah data berdasarkan tabel mortalitas Indonesia tahun 1993.
3.2 Spesifikasi Rumusan Perancangan
Untuk merancang program aplikasi ini penulis menggunakan Borland Delphi 7.0, dan Microsoft Access 2000. Data-data yang digunakan terdiri dari data yang ada dalam database maupun data yang berupa input pengguna program. Data-data yanga ada dalam database ditampung ke variabel penampungan sementara untuk kemudian diproses dalam perhitungan bersama dengan data input dari pengguna..
3.3 Perancangan Stuktur Menu
Pada program digunakan tombol-tombol untuk berpindah dari satu layar ke layar yang lain. Adapun strukturnya dapat digambarkan sebagai berikut : Layar Welcome
Perhitungan Premi
Edit Datbase
About
Gambar 3.1 Struktur menu program
32 Menu perhitungan premi digunakan untuk melakukan perhitungan premi dan nilai tunai berdasarkan data penduduk yang ada dalam database serta data-data input dari penggunan program. Hasil dari modul ini adalah sebuah file dalam format notepad yang memuat ilustrasi besar manfaat, pembayaran premi per tahun, serta nilai tunai yang ada. Menu edit database digunakan untuk mengubah data penduduk yang ada. Menu ini disediakan untuk memfasilitasi adanya perubahah-perubahan pada data penduduk. Pada saat modul ini dijalankan maka database yang lama akan dihapus kemudian diganti dengan database baru hasil input dari user.
3.4 Perancangan Tampilan Layar
Adapun rancangan tampilan layar yang akan dibuat adalah sebagai berikut : •
Layar utama Layar ini berisi judul program dan sebuah button (button OK) untuk masuk ke layar perhitungan premi
Gambar 3.2 Layar Welcome
33 •
Layar perhitungan premi Layar ini merupakan tempat untuk memasukkan data-data yang dibutuhkan dalam proses perhitungan. Button reset data digunakan untuk me-reset semua data menjadi seperti semula, button edit database digunakan untuk masuk ke layar edit database, button cetak ilustrasi digunakan untuk melakukan semua perhitungan sekaligus menyimpan output di sebuah file teks yang diinginkan user. Button about digunakan untuk menampilkan layar about, dan button exit
digunakan untuk keluar dari program.
Gambar 3.3 Layar perhitungan premi Output dari hasil perhitungan premi akan disimpan dalam file text dengan format tampilan sebagai berikut : Perhitungan Premi Asuransi Pensiun
Usia
: .......................
Benefit tahunan
: ........................
34 Premi tahunan sebesar
: ........................
Pembayaran ke
Usia
Premi
Nilai tunai
.......
.......
.......
..........
.........
.......
........
...........
.........
........
........
............
Total pembayaran perusahaan Pembayaran ke
Total Premi
...........
...........
...........
...........
...........
...........
Catatan : jumlah ilustrasi per usia tergantung dari jumlah usia masuk yang diinginkan, ’premi tahunan sebesar : ...........’ berubah menjadi’ persentasi premi sebesar : .......... % dari gaji tahunan’ bila besar manfaat yand diambil tergantung dari persentasi terhadap gaji. •
Layar entry database Pada layar ini user dapat mengganti data dalam database penduduk yang akan digunakan dalam proses perhitungan. Tombol ok digunakan untuk memasukkan data ke variabel penampungan sekaligus memasukkan data ke memo. Tombol Simpan data digunakan untuk menghapus data sebelumnya yang ada pada database sekaligus menyimpan data baru sesuai dengan dengan nilai data yang
35 dimasukkan. Tombol kembali ke perhitungan premi digunakan untuk kembali ke layar perhitungan premi dan tombol exit digunakan untuk keluar dari program.
Gambar 3.4 Layar entry database •
Layar about Layar ini berisi informasi mengenai data-data pembuat program serta tujuan pembuatan program. Bila tombol OK diklik maka akan kembali ke layar perhitungan premi.
Gambar 3.5 Layar about
36 3.5 Alat Bantu Perancangan 3.5.1 Perancangan State Transition Diagram
State transition diagram (diagram transisi) merupakan sebuah diagram yang
menggambarkan peralihan dari satu state ke state yang lain dikarenakan adanya action dari pengguna program. Layar Welcome
Layar Perhitungan Premi
klik about
Layar About
klik OK
klik OK klik kembali klik edit database Layar Edit Database
klik exit
ke perhitungan premi Exit klik exit
Gambar 3.6 State Transition Diagram 3.5.2 Perancangan use case diagram
Use case diagram merupakan sebuah diagram yang secara terperinci menjelaskan setiap tindakan yang dilakukan user pada program serta hasil yang didapatkan dari tindakan tersebut. Adapun use case diagram dari program yang dirancang dapat diilustrasikan sebagai berikut :
37
klik OK di layar welcome
user
input semua data di layar perhitungan premi, klik cetak ilustrasi
masuk ke layar perhitungan premi
validasi input, inisialisasi data, hitung benefit, premi, nilai tunai, pembayaran
cetak output pada file
klik about di layar perhitungan premi
klik edit database di layar perhitungan premi
klik exit di layar perhitungan premi
masuk ke layar about
masuk ke layar edit database
exit program
Gambar 3.7 Use Case diagram layar welcome dan perhitungan premi
38
User
klik entry data di layar edit database
proses input data
klik simpan data di layar edit database
database lama dihapus, kemudian direwrite dengan data baru hasil input
Klik kembali ke perhitungan premi di layar edit database
Klik exit di layar edit database
Klik OK di layar about
Masuk ke layar perhitungan premi
Exit program
Masuk ke layar perhitungan premi
Gambar 3.8 Use case diagram layar edit database dan about
39 3.6 Spesifikasi Data
Program dirancang memiliki spesifikasi data sebagai berikut : 3.6.1 Perancangan data penduduk dari database
Nama database sumber
: db_penduduk
Nama tabel
: penduduk
Field
: umur (primary key), hidup, mati
Masing-masing field pada database jenis datanya adalah integer. Hubungan yang terdapat pada data adalah : jumlah yang hidup pada usia x+1 = jumlah yang hidup pada usia x – jumlah yang mati di usia x. Selain itu, pada usia maksimum, jumlah yang mati pasti sama dengan jumlah yang hidup. Pada saat modul cetak ilustrasi dijalankan, data dari tabel penduduk diambil dan disimpan ke dalam sebuah array dua dimensi. 3.6.2 Perancangan data karyawan
Data untuk masing-masing usia masuk disimpan dalam sebuah record / structure yaitu : Nama record
: karyawan
Data
: age (integer), salary (real), benefit (real), premi (real), percent_premi (real)
Field premi akan diisi bila yang dipilih adalah manfaat tetap, sedangkan percent_premi akan diisi bila yang dipilih adalah manfaat berdasarkan persentasi dari gaji.
3.7 Spesifikasi Modul
Untuk menjelaskan cara kerja program, di bawah ini dijelaskan rincian spesifikasi untuk tiap modul sebagai berikut :
40 3.7.1 Modul Perhitungan Premi
Variabel Data -> diambil dari tabel penduduk
Validasi input Begin Jika jumlah usia masuk = 1 maka Cek usia1, jumlah1, gaji1 harus diisi dan berupa angka Jika jumlah usia masuk = 2 maka Cek usia1, jumlah1, gaji1 harus diisi dan berupa angka Cek usia2, jumlah2, gaji2 harus diisi dan berupa angka Jika jumlah usia masuk = 3 maka Cek usia1, jumlah1, gaji1 harus diisi dan berupa angka Cek usia2, jumlah2, gaji2 harus diisi dan berupa angka Cek usia3, jumlah3, gaji3 harus diisi dan berupa angka Jika benefit tetap maka Cek a harus diisi dan berupa angka Jika benefit berdasarkan persentasi dari gaji rata-rata sampai mencapai usia pensiun maka Cek b dan alpha harus diisi dan berupa angka Jika benefit berdasarkan persentasi dari f tahun gaji rata-rata terakhir sampai mencapai usia pensiun maka Cek c, f, dan alpha harus diisi dan berupa angka
41 Cek bunga dan usia pensiun harus diisi dan berupa angka Bila salah satu salah maka Keluarkan pesan error 'Semua input harus diisi dan harus berupa angka' End
Inisialisasi Begin Masukkan nilai kar[0].age, kar[0].salary dan kar[0].jmlh_kar Bila jumlah usia masuk bukan 1 maka Masukkan nilai kar[1].age, kar[1].salary dan kar[1].jmlh_kar Bila jumlah usia masuk = 3 maka Masukkan nilai kar[2].age, kar[2].salary dan kar[2].jmlh_kar End
Sn (base,r, n) Begin result = base*(power(r,n)-1)/(r-1); end
hit_benefit begin kalau diambil manfaat tetap maka untuk i = 0 sampai sejumlah usia masuk -1 kar[i].benefit = a
42 bila tidak untuk i = 0 sampai sejumlah usia masuk -1 kar[i].benefit = Sn(kar[i].gaji, 1+kenaikan gaji, jumlah tahun kerja)/ bila diambil manfaat rata-rata gaji f tahun terakhir maka untuk i = 0 sampai sejumlah usia masuk -1 kar[i].benefit = kar[i].benefit-Sn(kar[i].gaji, 1+kenaikan gaji, jumlah tahun kerja-f) Bila diambil manfaat adalah gaji rata-rata Kar[i].benefit = kar[i].benefit/lama kerja Bila diambil manfaat adalah gaji rata –rata f tahun terakhir Kar[i].benefit = kar[i].benefit/f End
A_r(count,x) Begin Untuk i dari x sampai count-1 temp = temp + power(v,i-x)*(data[i][0]/data[x][0]); result = temp end
function a_s (x,y) begin Untuk i dari x sampai y temp = temp + power(v,i-x)*(data[i][0]/data[x][0]);
43 result = temp end
function a_ss(x,r,y) begin Untuk i dari x sampai y temp = temp + power(v*r,i-x) * data[i][0]/data[x][0]; result = temp; end;
procedure hit_premi(count); begin kalau benefit tetap maka untuk i = 0 sampai sejumlah usia masuk-1 kar[i].premi
=
kar[i].benefit*a_r*power(v,usia_pensiun-
kar[i].age)*(data[usia_pensiun][0]/data[kar[i].age][0]); kar[i].premi = kar[i].premi/a_s bila tidak maka untuk i = 0 sampai sejumlah usia masuk-1 kar[i].percent_premi = kar[i].benefit*a_r*power(v,usia_pensiunkar[i].age)*(data[usia_pensiun][0]/data[kar[i].age][0]); kar[i].percent_premi = kar[i].percent_premi/(kar[i].salary*anuitas_ss);
44 end
procedure hit_cadangan(count : integer); begin kalau benefit tetap maka untuk i = 0 sampai sejumlah usia masuk-1 untuk j = 1 sampai count-1-kar[i].age reserve[i][j]*a_s(kar[i].age,kar[i].age+j)/a_s(kar[i].age,u sia_pensiun); reserve[i][j]
:=
kar[i].benefit*anuitas_r*power(v,usia_pensiunkar[i].age-j)*data[usia_pensiun][0]/data[kar[i].age+j][0](kar[i].premi*a_s(kar[i].age+j,usia_pensiun)); untuk j sesudahnya sampai usia maksimum-1 reserve[i][j] = kar[i].benefit* a_r(count,kar[i].age+j); bila tidak maka untuk i = 0 sampai sejumlah usia masuk-1 untuk j = 1 sampai count-1-kar[i].age reserve[i][j]*a_ss(kar[i].age,kenaikan_gaji+1,j)*a_ss(kar [i].age,kenaikan_gaji+1,usia_pensiun-kar[i].age); reserve[i][j]
:=
kar[i].benefit*anuitas_r*power(v,usia_pensiunkar[i].age-j)*data[usia_pensiun][0]/data[kar[i].age+j][0]-
45 (kar[i].percent_premi*kar[i].salary*a_ss(kar[i].age+j,ken aikan_gaji+1,usia_pensiun)); untuk j sesudahnya sampai usia maksimum-1 reserve[i][j] = kar[i].benefit* a_r(count,kar[i].age+j); end
hit_payment begin setlength(temp,partisi); jika partisi = 1 then i = usia_pensiun-kar[0].age jika partisi = 2 then i = usia_pensiun - min(kar[0].age,kar[1].age) jika tidak keduanya maka i = usia_pensiun min(kar[0].age,min(kar[1].age,kar[2].age)); setlength(payment,i); untuk j := 0 sampai indeks maksimum payment payment[j] = 0 end
print_to_file(count) begin appPath = getCurrentDir; saveFile.InitialDir = appPath; saveFile.Filter = 'Text File|*.txt|'; fileConfirm = saveFile.Execute();
46 jika fileConfirm = true maka begin fileName = saveFile.FileName+’.txt’; AssignFile(fileHandle, fileName); Rewrite(fileHandle); writeln(fileHandle, 'Perhitungan Premi Asuransi Pensiun'); writeln(fileHandle,' '); writeln (fileHandle,' '); untuk i := 0 sampai partisi-1 do begin writeln(fileHandle, 'Usia writeln(fileHandle,
'Benefit
: ' + inttostr(kar[i].age)); tahunan
:
'
+
:
'
+
floattostrf(kar[i].benefit,format,15,0)); kalau benefit tetap maka writeln(fileHandle,'Premi
tahunan
sebesar
floattostrf(kar[i].premi,format,15,0));
writeln(fileHandle,'====================================== ============================================'); writeln(fileHandle,'Pembayaran ke
Usia
Premi
Nilai Tunai');
writeln(fileHandle,'====================================== ============================================');
47 untuk j := 1 sampai usia_pensiun-kar[i].age do writeln(fileHandle,j
+
kar[i].age
+
kar[i].premi
+
reserve[i][j]) payment[j-1] = payment[j]-1+kar[i].premi*kar[i].jmlh_kar untuk j sisanya writeln(fileHandle,j + kar[i].age + 0 + reserve[i][j])
jika tidak maka else temp := kar[i].salary; kenaikan_gaji := (strtofloat(alpha.text)/100)+1; writeln(fileHandle,'Persentasi
premi
sebesar
:
'
+
floattostrf(kar[i].percent_premi*100,format,3,0)+ ' % dari gaji tahunan');
writeln(fileHandle,'========================================== ========================================'); writeln(fileHandle,'Pembayaran ke
Usia
Premi
Nilai
Tunai');
writeln(fileHandle,'========================================== ========================================'); for j := 1 to usia_pensiun-kar[i].age do writeln(fileHandle,j + kar[i].age + kar[i].premi + reserve[i][j]) untuk j sisanya
48 writeln(fileHandle,j + kar[i].age + 0 + reserve[i][j])
writeln(fileHandle,'======================================== =========================================='); writeln(fileHandle,' '); writeln(fileHandle,' '); end; writeln(fileHandle,'Total Pembayaran Perusahaan'); writeln(fileHandle,'=========================================='); writeln(fileHandle,'Pembayaran ke
Total Premi');
writeln(fileHandle,'=========================================='); for i := 0 to high(payment) do writeln(fileHandle,i+1,payment[i]) flush(fileHandle); CloseFile(fileHandle); end;
procedure TForm1.cetakClick(Sender: TObject); begin jika validasi sukses maka ambil data dari tabel penduduk hitung jumlah data masukkann data ke variabel data
49 v := 1/(1+(strtofloat(bunga.text)/100)); if cek1.Checked = true then partisi := 1 else if cek2.checked = true then partisi := 2 else partisi := 3; setlength(kar,partisi); setlength(reserve,partisi,count); initialize(); hit_benefit(); hit_premi(count); hit_cadangan(count); hit_payment(); print_to_file(count); showmessage('Hasil ilustrasi Anda sudah tersimpan'); end.
3.7.2 Modul Edit Database
//kalau tombol entry data diklik procedure TForm4.Button5Click(Sender: TObject); begin set panjang array penampung sebanyak max tampilkan input_data.text := 'Jumlah yang hidup pada usia 0'; end
50 //kalau tombol OK diklik procedure TForm4.okClick(Sender: TObject); begin lakukan perulangan dari i= 0 sampai sampai usia maksimum tampilkan teks jumlah yang hidup pada usia i masukkan data sebelumnya ke memo end;
procedure TForm4.saveClick(Sender: TObject); begin Ambil isi tabel penduduk Hitung jumlah data tabel penduduk Hapus seluruh data tabel penduduk Untuk i dari 0 sampai usia maksimum Masukkan semua data baru ke tabel Tampilkan pesan 'Data penduduk baru sudah tersimpan' end;