bab iii pembahasan - repository.bsi.ac.id · toko obat ini telah mendapat ijin dari departemen...
TRANSCRIPT
24
BAB III
PEMBAHASAN
3.1. Tinjauan Perusahaan
Tinjauan perusahaan ini berisi tentang sejarah berdirinya Apotek Cito,
struktur organisasi dan fungsi dari masing-masing bagian yang ada dalam Apotek,
serta beberapa informasi tambahan yang didapat penulis selama proses penelitian.
Penulis melakukan penelitian pada Apotek Cito. Apotek Cito merupakan
usaha yang bergerak pada penjualan obat yang beralamat di Jl. Kertabumi No.271
Karawang, Kabupaten Karawang Provinsi Jawa Barat. Kode pos 41311
3.1.1. Sejarah Perusahaan
Apotek Cito didirikan pada tahun 2016 yang beralamat di Jl. Kertabumi
No.271 Karawang, Kabupaten Karawang Provinsi Jawa Barat. Toko obat ini telah
mendapat ijin dari Departemen Kesehatan RI dengan Surat Ijin Kerja:
KP.01.01.1.3.0587.
Pada tahun 2017 Apotek Cito berkembang sangat pesat. Saat ini Apotek Cito
menyediakan dan menerima obat berdasarkan resep ataupun obat tanpa resep (obat
bebas dan obat bebas terbatas). Apotek Cito melakukan kegiatannya mulai pukul
16.00 sampai dengan pukul 22.00, buka setiap hari Senin-Jum‟at.
25
3.1.2. Struktur Organisasi Perusahaan
Berikut ini struktur organisasi yang bertanggung jawab terhadap berjalannya
Apotek Cito:
STRUKTUR ORGANISASI
Sumber : Struktur Organisasi Apotek Cito (2019)
Gambar III.1. Struktur Organisasi Apotek Cito
26
3.1.3. Uraian Tugas dan Tanggung Jawab
1. Pemilik Apotek
a. Bertugas dan bertanggung jawab sebagai pemimpin jalannya Apotek .
b. Memastikan bahwa seluruh pengoperasian Apotek berjalan dengan lancar dan
sesuai harapan serta menganalisa penerimaan kas.
2. HRD
a. Membuat job description dan rekrutmen
b. Mengelola absensi karyawan dan payroll yang meliputi gaji, tunjangangan,
PPh 21, upah lembur dan bonus karyawan
3. Apoteker Pengelola Apotek
a. Memimpin seluruh kegiatan, baik kegiatan teknis maupun non teknis
kefarmasian sesuai dengan ketentuan maupun perundangan yang berlaku.
b. Melakukan pengembangan usaha apotek agar dapat memberikan hasil yang
optimal.
4. Bagian Keuangan
a. Melaksanakan pengelolaan penatausahaan keuangan dengan tertib
b. Menyelenggarakan kepengurusan keuangan.
5. Bagian Pembelian
a. Mencatat dan menerima data permintaan obat yang harus dibeli.
b. Melaksanakan pembelian
6. Bagian Koordinator Pelayanan
a. Mengkoordinasikan pelaksanaan dan program dan kegiatan medik.
b. Mengevaluasi kegiatan pelaksanaan program pelayanan untuk
mengetahuitingkat pencapaian.
27
7. Kasir
a. Melakukan pelayanan penjualan obat pada Apotek Cito.
b. Menerima pembayaran dan membuatkan laporan penerimaan kas.
3.2. Tinjauan Kasus
Penulis menguraikan gambaran tentang bagaimana prosedur dari sistem
penerimaan kas yang ada di perusahaan sesuai dengan ruang lingkup tugas akhir
yang telah penulis buat, yakni sebagai berikut:
3.2.1. Proses Bisnis Sistem Berjalan
1. Proses Pemesanan
Konsumen datang langsung ke toko dan memberikan resep obat. Kasir
menerima resep kemudian mengecek ketersediaan obat. Jika obat tersedia
maka kasir memberitahukan kepada konsumen bahwa obat berdasarkan resep
tersebut tersedia di apotek. Jika tidak tersedia maka kasir memberitahukan
dan menyarankan obat lain yang sejenis dengan resep obat. Jika konsumen
setuju maka kasir akan menyiapkan obat, tetapi jika konsumen tidak setuju
maka kasir mengembalikan resep obat.
2. Proses Pembayaran
Konsumen melakukan pembayaran kemudian kasir membuatkan kwitansi.
Kwitansi berwarna putih di serahkan kepada konsumen. Sedangkan kwitansi
berwarna merah diarsipkan.
3. Proses Pembuatan Laporan
Setiap akhir bulan, kasir mengumpulkan nota penjualan berwarna merah dan
menghitung keseluruhan transaksi pada bulan tersebut. Kasir menyerahkan
28
laporan penerimaaan kas kepada pemilik. Pemilik menerima laporan
penerimaan kas periode 1 bulan.
3.2.2. Activity Diagram Sistem Berjalan
Sumber : Data Olahan Penulis
Gambar III.2. Activity Diagram Proses Sistem Berjalan
29
3.2.3. Dokumen Masukan
1. Nama Dokumen : Resep Obat
Fungsi : Sebagai dokumen resep dari dokter
Sumber : Konsumen
Tujuan : Kasir
Media : Kertas
Jumlah : 1 Lembar
Frekuensi : Setiap adanya pembelian obat
3.2.4. Dokumen Keluaran
1. Nama Dokumen : Kwitansi
Fungsi : Sebagai transaksi penjualan
Sumber : Kasir
Tujuan : Konsumen
Media : Kertas
Jumlah : 1 Lembar
Frekuensi : Setiap adanya proses penjualan
4. Nama Dokumen : Laporan Penerimaan Kas
Fungsi : Sebagai laporan penerimaan kas yang di dapat
Sumber : Kasir
Tujuan : Pemilik
Media : Kertas
Jumlah : 1 Lembar
Frekuensi : Setiap Bulan
30
3.2.5. Permasalahan Pokok
Permasalahan yang sering muncul pada sistem berjalan yang ada pada
Apotek Cito adalah sebagai berikut:
1. Proses penjualan dan penerimaan obat yang berjalan pada Apotek Cito masih
menggunakan cara sederhana sehingga seringkali menyulitkan Kasir saat
proses pengecekan obat, proses pencatatan penjualan dan proses pembuatan
laporan penerimaan kas.
2. Media dokumen pencatatan yang masih menggunakan kertas sehingga
keamanannya kurang terjamin. Dokumen mudah hilang atau rusak serta
penyimpanan data yang belum terstruktur dengan baik memakan kapasitas
ruang data secara fisik.
3.2.6. Pemecahan Masalah
Berdasarkan permasalahan tersebut, penulis mencoba memberikan beberapa
alternatif pemecahan masalah, diantaranya sebagai berikut:
1. Disarankan untuk menggunakan sistem yang sudah terkomputerisasi agar
mempermudah proses pencarian obat, proses penjualan serta proses
pembuatan laporan yang sistematis sehingga meminamilisir kesalahan dalam
pencatatan obat ataupun pembuatan laporan.
2. Selain bentuk dokumen, disarankan juga menggunakan media penyimpanan
yang lebih terorganisir penulis menyarankan menggunakan media database
sebagai tempat penyimpanan data agar terhindar dari resiko hilang ataupun
rusak. Sehingga dapat dengan mudah melakukan pencarian data jika sewaktu-
waktu diperlukan.
31
3.3. Analisis Kebutuhan Software
Penulis mendokumentasikannya melalui Analisis Kebutuhan, Use Case
Diagram, dan Activity Diagram sesuai dengan tinjauan kasus diatas.
3.3.1. Analisis Kebutuhan
A. Kasir
A1. Kasir Login
A2. Kasir Mengakses Menu Utama
A2.1. Kasir Mengakses Menu Master
a) Kasir Mengelola Data Pengguna
b) Kasir Mengelola Data Resep
c) Kasir Mengelola Data Obat
d) Kasir Mengelola Data Akun
A.2.2. Kasir Mengakses Menu Transaksi
a) Kasir Mengelola Penjualan
b) Kasir Mengelola Resep
c) Kasir Mengelola Piutang
d) Kasir Mengelola Jurnal
A.3. Kasir Logout
P. Pemilik
P1. Pemilik Login
P2. Pemilik Mengakses Menu Utama
P.2.1. Pemilik Mengakses Menu Laporan
a) Pemilik Mengakses Laporan Penerimaan Kas
P.3. Pemilik Logout
32
3.3.2. Usecase Diagram
Berdasarkan analisis kebutuhan yang telah diuraikan diatas. Berikut ini
dibuatkan use case diagram sesuai kebutuhan menu perangkat lunak yang akan
dibuat, beserta deskripsi detail dari masing-masing diagramnya.
A. Use Case Diagram Kasir
Use Case Diagram Kasir
Login
Master
Batal
<<include>>
Kasir
Transaksi
Menu Utama
Pengguna Obat Akun
<<extend>> <<extend>> <<extend>>
Resep
<<extend>>
<<include>> <<include>>
Jurnal
<<extend>>
Penjualan
<<extend>>
Piutang
<<extend>>
Gambar III.3. Use Case Diagram Kasir
Tabel III.1. Deskripsi Use Case Diagram Kasir
Use Case Narative Kasir
Tujuan Kasir dapat melakukan login, mengakses menu utama, mengakses menu master, mengakses menu
transaksi dan logout.
Deskripsi Sistem ini memungkinkan aktor untuk mengelola menu master mulai dari submenu pengguna, pasien, obat dan akun
Skenario Utama
Aktor Kasir
Kondisi awal Aktor melakukan login dan masuk ke dalam system informasi penerimaan kas
33
Aksi Aktor Reaksi Sistem
1. Aktor memilih menu
master
2. Aktor memilih menu
transaksi
Sistem akan menampilkan form submenu pengguna
Sistem akan menampilkan form submenu obat Sistem akan menampilkan form submenu akun
Sistem akan menampilkan form submenu resep Sistem akan menampilkan form submenu penjualan
Sistem akan menampilkan form submenu piutang Sistem akan menampilkan form submenu jurnal
Kondisi Akhir Jika perintah sesuai maka akan masuk kedalam aplikasi dan aktor dapat melakukan aktivitas sistem.
B. Use Case Diagram Pemilik
Gambar III.4. Use Case Diagram Pemilik
Tabel III.2.
Deskripsi Use Case Diagram Pemilik
Use Case Narative Pemilik
Tujuan Pemilik dapat melakukan login, mengakses menu utama, mengakses menu laporan dan logout.
Deskripsi Sistem ini memungkinkan aktor untuk mengelola
menu laporan dan melihat laporan penerimaan kas
Skenario Utama
Aktor Kasir
Kondisi awal Aktor melakukan login dan masuk ke dalam system informasi penerimaan kas
34
Aksi Aktor Reaksi Sistem
1. Aktor memilih
menu laporan
Sistem akan menampilkan form submenu laporan
penerimaan kas
Kondisi Akhir Jika perintah sesuai maka akan masuk kedalam aplikasi dan aktor dapat melakukan aktivitas sistem.
3.3.3. Activity Diagram
Berikut ini dibuatkan activity diagram yang lebih rinci dan detail dalam
menggambarkan alur kerja sistem yang juga dapat digunakan sebagai pengantar
dalam tahap pembuatan desain.
1. Activity Diagram Menu Login
Activity Diagram Menu Login
Sistem Kasir
START
Melakukan
Login
Masukkan
Kode User
Masukkan
Password
Cek Kode User
dan Password
Selamat Datang
Kasir
Data Tidak
Ditemukan
VALID?
[VALID?]
END
[TIDAK
VALID]
Mengakses
Menu Utama
Gambar III.5. Activity Diagram Login
35
2. Activity Diagram Menu Utama
Activity Diagram Menu Utama
SistemKasir
Ph
ase
START
Mengakses
Menu Utama
Menampilkan
Menu Utama
Menu
Master
Menu
Transaksi
Keluar Sistem
END
Menu
Logout
Gambar III.6. Activity Diagram Menu Utama
36
3. Activity Diagram Submenu Pengguna
Activity Diagram Menu Master Submenu Pengguna
SistemKasir
Ph
ase
START
Mengklik Menu Master
Submenu Pengguna
Menampilkan Form
Input Pengguna
Tampil Form
Input
Proses Ubah
Data
Klik
Ubah
Klik
Hapus
END
Tidak
Ya
Klik Tambah Pilih Data
Input Data Yang
Ingin diubah
Tampil
Info Hapus
Proses
Hapus data
Klik
Simpan
Proses simpan
Data
Textbox
Kembali Bersih
Input
Kode Pengguna
Nama Pengguna
Password
Level
Klik
Batal
Klik
Edit
Gambar III.7. Activity Diagram Submenu Pengguna
37
4. Activity Diagram Menu Obat
Activity Diagram Menu Master Submenu Obat
SistemKasir
Ph
ase
START
Mengklik Menu Master
Submenu Obat
Menampilkan Form
Input Obat
Tampil Form
Input
Proses Ubah
Data
Klik
Ubah
Klik
Hapus
END
Tidak
Ya
Klik Tambah Pilih Data
Input Data Yang
Ingin diubah
Tampil
Info Hapus
Proses
Hapus data
Klik
Simpan
Proses simpan
Data
Textbox
Kembali Bersih
Input
Kode Obat
Nama Obat
Jenis Obat
Harga Jual
Stok
Klik
Batal
Klik
Edit
Gambar III.8. Activity Diagram Submenu Obat
38
5. Activity Diagram Menu Akun
Activity Diagram Menu Master Submenu Akun
SistemKasir
Ph
ase
START
Mengklik Menu Master
Submenu Akun
Menampilkan Form
Input Akun
Tampil Form
Input
Proses Ubah
Data
Klik
Ubah
Klik
Hapus
END
Tidak
Ya
Klik Tambah Pilih Data
Input Data Yang
Ingin diubah
Tampil
Info Hapus
Proses
Hapus data
Klik
Simpan
Proses simpan
Data
Textbox
Kembali Bersih
Input
Kode Akun
Nama Akun
Saldo Normal
Klik
Batal
Klik
Edit
Gambar III.9. Activity Diagram Submenu Akun
39
6. Activity Diagram Menu Resep
Activity Diagram Menu Transaksi Submenu Resep
SistemKasir
Ph
ase
START
Mengklik Menu Transaksi
Submenu Resep
Menampilkan Form
Input Resep
Tampil Form
Input
Proses Ubah
Data
Klik
Ubah
Klik
Hapus
END
Tidak
Ya
Klik Tambah Pilih Data
Input Data Yang
Ingin diubah
Tampil
Info Hapus
Proses
Hapus data
Klik
Simpan
Proses simpan
Data
Textbox
Kembali Bersih
Input
Kode Resep
Tanggal
Nama Pengguna
Nama Pasien
Umur
Okter
Alamat Pasien
Klik
Batal
Klik
Edit
Gambar III.10. Activity Diagram Submenu Resep
40
7. Activity Diagram Menu Penjualan
Activity Diagram Menu Transaksi Submenu Penjualan
SistemKasir
Ph
ase
START
Mengklik Menu Transaksi
Submenu Penjualan
Menampilkan Form
Input Penjualan
Tampil Form
Input
Proses Ubah
Data
Klik
Ubah
Klik
Hapus
END
Tidak
Ya
Klik Tambah Pilih Data
Input Data Yang
Ingin diubah
Tampil
Info Hapus
Proses
Hapus data
Klik
Simpan
Proses simpan
Data
Textbox
Kembali Bersih
Input
Kode Penjualan
Tanggal
Nama Pengguna
Kode Obat
Nama Obat
Harga Obat
Jumlah Beli
Sub Total
Klik
Batal
Klik
Edit
Gambar III.11 Activity Diagram Submenu Penjualan
41
8. Activity Diagram Submenu Piutang
Activity Diagram Menu Transaksi Submenu Piutang
SistemKasir
Phase
START
Mengklik Menu Transaksi
Submenu Piutang
Menampilkan Form
Input Piutang
Tampil Form
Input
Proses Ubah
Data
Klik
Ubah
Klik
Hapus
END
Tidak
Ya
Klik Tambah Pilih Data
Input Data Yang
Ingin diubah
Tampil
Info Hapus
Proses
Hapus data
Klik
Simpan
Proses simpan
Data
Textbox
Kembali Bersih
Input
Kode Piutang
Kode Pengguna
Tanggal
Pembayar_Piutang
Total
Keterangan
Klik
Batal
Klik
Edit
Gambar III.12. Activity Diagram Submenu Piutang
42
9. Activity Diagram Menu Jurnal
Activity Diagram Menu Transaksi Submenu Jurnal
SistemKasir
Ph
ase
START
Mengklik Menu Transaksi
Submenu Jurnal
Menampilkan Form
Input Jurnal
Tampil Form
Input
Proses Ubah
Data
Klik
Ubah
Klik
Hapus
END
Tidak
Ya
Klik Tambah Pilih Data
Input Data Yang
Ingin diubah
Tampil
Info Hapus
Proses
Hapus data
Klik
Simpan
Proses simpan
Data
Textbox
Kembali Bersih
Input
Kode Jurnal
Tanggal
Keterangan
Kode Akun
Debit
Kredit
Klik
Batal
Klik
Edit
Gambar III.13. Activity Diagram Submenu Jurnal
43
3.4. Desain
Desain perangkat lunak adalah proses multi langkah yang fokus pada desain
pembuatan program perangkat lunak termasuk struktur data, arsitektur perangkat
lunak, respresentasi antarmuka, dan prosedur pengodean. Tahap ini mentranslasi
kebutuhan perangkat lunak dari tahap analisis kebutuhan ke representasi desain agar
dapat diimplementasikan menjadi program pada tahap selanjutnya.
3.4.1. Entity Relationship Diagram (ERD)
Gambar III.14. Entity Relationship Diagram (ERD)
44
3.4.2. Logical Record Structure (LRS)
Gambar III.15. Logical Record Structure (LRS)
3.4.3. Spesifikasi File
Berikut spesifikasi file yang dibuatkan untuk menguraikan rancangan tabel
yang akan digunakan dalam sistem informasi penerimaan kas.
1. Spesifikasi File Pengguna
Nama File : pengguna
Akronim : db_apotek
Fungsi : sebagai penyimpan data pengguna
Tipe File : File Master
Organisasi File : Indexed Sequential
Akses File : Random
Media : Harddisk
Panjang record : 63 Byte
45
Kunci field : kode_pengguna
Software : MySQL
Tabel III.3.
Spesifikasi File Pengguna
No Elemen Data Nama Field Type Size Keterangan
1 Kode Pengguna kode_pengguna Varchar 8 Primary Key
2 Nama Pengguna nama_pengguna Varchar 15
3 Password password Varchar 30
4 Level level Varchar 10
2. Spesifikasi File Obat
Nama File : obat
Akronim : db_apotek
Fungsi : sebagai penyimpan data obat
Tipe File : File Master
Organisasi File : Indexed Sequential
Akses File : Random
Media : Harddisk
Panjang record : 90 Byte
Kunci field : kode_obat
Software : MySQL
Tabel III.4.
Spesifikasi File Obat
No Elemen Data Nama Field Type Size Keterangan
1 Kode Obat kode_obat Varchar 8 Primary Key
2 Nama Obat nama_obat Varchar 30
3 Jenis Obat Jenis_obat Varchar 30
4 Harga Jual Harga_jual Int 11
5 Stok stok Nt 11
46
3. Spesifikasi File Akun
Nama File : akun
Akronim : db_apotek
Fungsi : sebagai penyimpan data akun
Tipe File : File Master
Organisasi File : Indexed Sequential
Akses File : Random
Media : Harddisk
Panjang record : 90 Byte
Kunci field : kode_akun
Software : MySQL
Tabel III.5
Spesifikasi File Akun
No Elemen Data Nama Field Type Size Keterangan
1 Kode Akun kode_obat Varchar 8 Primary Key
2 Nama Obat nama_obat Varchar 30
3 Saldo Normal saldo_normal Varchar 3
4. Spesifikasi File Resep
Nama File : resep
Akronim : db_apotek
Fungsi : sebagai penyimpan data resep
Tipe File : File Transaksi
Organisasi File : Indexed Sequential
Akses File : Random
Media : Harddisk
Panjang record : 107 Byte
47
Kunci field : kode_resep
Software : MySQL
Tabel III.6.
Spesifikasi File Resep
No Elemen Data Nama Field Type Size Keterangan
1 Kode Resep kode_resep Varchar 15 Primary Key
2 Tanggal Taggal Varchar 30
3 Total Bayar totalbayar Int 11
4 Kode Pengguna kode_pengguna Varchar 8 Foreign Key
5 Nama Pasien nama_pasien Varchar 30
6 Umur Umur Varchar 3
7 Alamat Alamat Text -
8 Dokter Dokter Varchar 30
5. Spesifikasi File Detail Resep
Nama File : detail_resep
Akronim : db_apotek
Fungsi : sebagai penyimpan data resep
Tipe File : File Transaksi
Organisasi File : Indexed Sequential
Akses File : Random
Media : Harddisk
Panjang record : 45 Byte
Kunci field : kode_resep
Software : MySQL
Tabel III.7.
Spesifikasi File Detail Resep
No Elemen Data Nama Field Type Size Keterangan
1 Kode Resep kode_resep Varchar 15 Primary Key
2 Kode Obat kode_obat Varchar 8 Primary Key
3 Jumlah Beli jumlahbeli Int 11
4 Subtotal subtotal Int 11
48
6. Spesifikasi File Penjualan
Nama File : penjualan
Akronim : db_apotek
Fungsi : sebagai penyimpan data penjualan
Tipe File : File Transaksi
Organisasi File : Indexed Sequential
Akses File : Random
Media : Harddisk
Panjang record : 64 Byte
Kunci field : kode_penjualan
Software : MySQL
Tabel III.8.
Spesifikasi File Penjualan
No Elemen Data Nama Field Type Size Keterangan
1 Kode Penjualan kode_penjualan Varchar 15 Primary Key
2 Tanggal tanggal Varchar 30
3 Total Bayar totalbayar Int 11
4 Kode Pengguna kode_pengguna Varchar 8 Foreign Key
7. Spesifikasi File Detail Penjualan
Nama File : penjualan
Akronim : db_apotek
Fungsi : sebagai penyimpan data penjualan
Tipe File : File Transaksi
Organisasi File : Indexed Sequential
Akses File : Random
Media : Harddisk
49
Panjang record : 45 Byte
Kunci field : kode_penjualan
Software : MySQL
Tabel III.9.
Spesifikasi File Detail Penjualan
No Elemen Data Nama Field Type Size Keterangan
1 Kode Penjualan kode_penjualan Varchar 15 Primary Key
2 Kode Obat kode_obat Varchar 8 Foreign Key
3 Jumlah Beli jumlahbeli Int 11
4 Subtotal subtotal Int 11
8. Spesifikasi File Piutang
Nama File : piutang
Akronim : db_apotek
Fungsi : sebagai penyimpan data piutang
Tipe File : File Transaksi
Organisasi File : Indexed Sequential
Akses File : Random
Media : Harddisk
Panjang record : 66 Byte
Kunci field : kode_piutang
Software : MySQL
Tabel III.10.
Spesifikasi File Piutang
No Elemen Data Nama Field Type Size Keterangan
1 Kode Piutang Kode_piutang Varchar 15 Primary Key
2 Kode Pengguna Kode_pengguna Varchar 10 Foreign Key
3 Tanggal Tanggal Date -
4 Pembayar Pembayaran_piuta Varchar 30
50
Piutang ng
5 Total Total Int 11
6 Keterangan Keterangan Text -
9. Spesifikasi File Jurnal
Nama File : jurnal
Akronim : db_apotek
Fungsi : sebagai penyimpan data jurnal
Tipe File : File Transaksi
Organisasi File : Indexed Sequential
Akses File : Random
Media : Harddisk
Panjang record : 75 Byte
Kunci field : kode_jurnal
Software : MySQL
Tabel III.11.
Spesifikasi File Jurnal
No Elemen Data Nama Field Type Size Keterangan
1 Kode Jurnal kode_jurnal Varchar 15 Primary Key
2 Tanggal Tanggal Varchar 30
3 Keterangan keterangan Varchar 30
10. Spesifikasi File Detail Jurnal
Nama File : detail_jurnal
Akronim : db_apotek
Fungsi : sebagai penyimpan data jurnal
51
Tipe File : File Transaksi
Organisasi File : Indexed Sequential
Akses File : Random
Media : Harddisk
Panjang record : 45 Byte
Kunci field : kode_jurnal
Software : MySQL
Tabel III.12.
Spesifikasi File Detail Jurnal
No Elemen Data Nama Field Type Size Keterangan
1 Kode Jurnal kode_jurnal Varchar 15 Primary Key
2 Kode Akun kode_akun Varchar 8 Foreign Key
3 Debet Debet Int 11
4 Kredit Kredit Int 11
3.4.4. Sequence Diagram
Penulis yang membatasi pembuatan sequence diagram dengan memilih
transaksi bisnis yang utama, yaitu transaksi penjualan:
52
Kasir
Sequance Diagram Transaksi Penjualan
Login
Input Kode User dan
Password()Cek Kode User dan
Password()
Kode User dan Password
tidak ada atau salah()
Menu
Utama
Kode User Dan
Password Benar()
Control
Form
Penjualan
Input Penjualan()
Sistem
Simpan
Data()
Batal()
Manampilkan
kode_penjualan()
tanggal()
Totalbayar()
kode_pengguna()
Menampilkan kode
akun()
Simpanr()
debet()
kredit()
set (data telah
tersimpan)
Gambar III.16. Sequence Diagram
53
3.4.5. Deployment Diagram
Berikut ini deployment diagram yang dibuat oleh penulis dalam
menggambarkan program aplikasi dan software database yang digunakan dalam
perancangan sistem penerimaan kas.
MAIN
JAVA
<<database>> DATABASE
<<DBMS>> MYSQL
db_apotek.sql
<<device>>
AppApotek
Gambar III.17. Deployment Diagram
54
3.4.6. User Interface
Berdasarkan anilisis kebutuhan software yang telah dirancang, berikut ini
adalah desain tampilan program yang dibuat penulis:
1. User Interface Form Menu Login
Gambar III.18. Menu Login
2. User Interface Form Menu Utama
Gambar III.19. Menu Utama
55
3. User Interface Form Menu Pengguna
Gambar III.20. Menu Pengguna
4. User Interface Form Menu Obat
Gambar III.21. Menu Obat
5. User Interface Form Menu Akun
Gambar III.22. Menu Akun
56
6. User Interface Form Menu Resep
Gambar III.23. Menu Resep
7. User Interface Form Menu Penjualan
Gambar III.24. Menu Penjualan
57
8. User Interface Form Menu Piutang
Gambar III.25. Menu Piutang
9. User Interface Form Menu Jurnal
Gambar III.26. Menu Jurnal
58
10. User Interface Kartu Resep
Gambar III.27. Kartu Resep
11. User Interface Nota Penjulan
Gambar III.28. Nota Penjualan
59
3.5. Implementasi
Implementasi merupakan tahap akhir pada pembahasan laporan tugas akhir
ini, dimana penulis menjelaskan tentang code generation, testing, dan spesifikasi
hardware dan software yang akan diuraikan sebagai berikut:
3.5.1. Code Generation
Penulis akan menampilkan listing program pada form yang terkait dengan
proses bisnis utamanya yaitu proses penjualan:
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates
* and open the template in the editor. */
package menu; import java.awt.event.KeyEvent;
import java.util.Date; import java.sql.*;
import java.text.SimpleDateFormat; import java.util.HashMap; import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel; import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.view.JasperViewer;
public class menuPenjualan extends javax.swing.JFrame {
koneksi kon = new koneksi(); private Object[][] datasementara = null;
private String[] labelsementara = {"Kode obat", "Nama obat", "Harga", "Jumlah Beli", "Subtotal"};
/** * Creates new form menupenjualan
*/ public menuPenjualan() {
initComponents(); kon.setKoneksi(); setTanggal();
awal();
60
kode_pengguna.setVisible(false);
}
public Date date = new Date(); public SimpleDateFormat noformat = new SimpleDateFormat("yyMM"); public String Kodeobat;
public String Namaobat; public String Hargaobat;
public String KodeUser; public String NamaUser;
public String getKodeobat() { return Kodeobat;
} public String getNamaobat() {
return Namaobat; }
public String getHargaobat() { return Hargaobat;
}
public String getKodeUser() { return KodeUser; }
public String getNamaUser() { return NamaUser;
} private void bersih() {
nama_obat.setText(""); jumlahbeli.setText("");
tsubtotal.setText(""); tbayar.setText(""); tkembali.setText("");
ltotal.setText("0"); }
private void nonaktif() { kode.setEditable(false);
tgl.setEditable(false); nama_obat.setEditable(false);
kode_obat.setEditable(false); jumlahbeli.setEditable(false); tsubtotal.setEditable(false);
harga_jual.setEditable(false); tbayar.setEditable(false);
tkembali.setEditable(false);
61
nama_pengguna.setEditable(false);
}
private void aktif() { kode_obat.setEditable(true); jumlahbeli.setEditable(true);
tbayar.setEditable(true); }
private void setTanggal() { java.util.Date skrg = new java.util.Date();
java.text.SimpleDateFormat kal = new java.text.SimpleDateFormat("yyyy-MM-dd");
tgl.setText(kal.format(skrg)); }
private void awal() { nonaktif();
} public String nomor() {
String urutan = null; try {
kon.rs = kon.st.executeQuery("select right(kode_penjualan,3)+1 from penjualan"); if (kon.rs.next()) {
kon.rs.last(); urutan = kon.rs.getString(1);
while (urutan.length() < 3) { urutan = "0" + urutan; }
urutan = "NO-" + noformat.format(date) + urutan;
} else { urutan = "NO-" + noformat.format(date) + "001"; }
} catch (SQLException e) { JOptionPane.showMessageDialog(null, "Mungkin Database Anda: " + e);
} return urutan;
}
private void tampilTabelSementara() { try { String sql = "Select * from sementara order by kode_obat";
kon.rs = kon.st.executeQuery(sql); ResultSetMetaData m = kon.rs.getMetaData();
int kolom = m.getColumnCount();
62
int baris = 0;
while (kon.rs.next()) { baris = kon.rs.getRow();
} datasementara = new Object[baris][kolom]; int x = 0;
kon.rs.beforeFirst(); while (kon.rs.next()) {
datasementara[x][0] = kon.rs.getString("kode_obat"); datasementara[x][1] = kon.rs.getString("nama_obat"); datasementara[x][2] = kon.rs.getString("harga_jual");
datasementara[x][3] = kon.rs.getString("jumlahbeli"); datasementara[x][4] = kon.rs.getString("subtotal");
x++; } tbpenjualan.setModel(new DefaultTableModel(datasementara,
labelsementara)); } catch (SQLException e) {
JOptionPane.showMessageDialog(null, e); } }
private void tampilDataobat() {
try { String sql = "select * from obat where kode_obat ='" + kode_obat.getText() + "'";
kon.rs = kon.st.executeQuery(sql); if (kon.rs.next()) {
nama_obat.setText(kon.rs.getString("nama_obat")); harga_jual.setText(kon.rs.getString("harga_jual")); jumlahbeli.requestFocus();
} else { JOptionPane.showMessageDialog(null, "Kode " + kode_obat.getText() +
"tidak ditemukan"); } } catch (SQLException e) {
JOptionPane.showMessageDialog(null, e); }
} private void simpanSementara() {
try { String sql = "insert into sementara values ('" + kode_obat.getText() + "','"
+ nama_obat.getText() + "','" + harga_jual.getText() + "','" + jumlahbeli.getText() + "','" + tsubtotal.getText() + "')";
kon.st.executeUpdate(sql); tampilTabelSementara();
} catch (SQLException e) {
63
JOptionPane.showMessageDialog(null, e);
} }
private void hapusIsiSementara() { int row = tbpenjualan.getSelectedRow();
int x; int total = Integer.parseInt(ltotal.getText());
x = Integer.parseInt((String) tbpenjualan.getValueAt(row, 4)); total = total - x; ltotal.setText(Integer.toString(total));
try { String sql = "delete from sementara where kode_obat ='" + (String)
tbpenjualan.getValueAt(row, 0) + "'"; kon.st.executeUpdate(sql); tampilTabelSementara();
} catch (SQLException e) { JOptionPane.showMessageDialog(null, e);
} }
private void simpanpenjualan() { try {
String sql = "insert into penjualan values('" + kode.getText() + "','" + tgl.getText() + "','" + ltotal.getText() + "','" + kode_pengguna.getText() + "')";
kon.st.executeUpdate(sql); } catch (SQLException e) {
System.out.println("Koneksi Gagal " + e.toString()); } }
private void simpanDetailpenjualan() {
try { String sql = "insert into detailpenjualan select '" + kode.getText() + "',kode_obat,jumlahbeli,subtotal from sementara";
kon.st.executeUpdate(sql); } catch (SQLException e) {
System.out.println("Koneksi Gagal " + e.toString()); } }
private void hapusTabelSementara() {
try { String sql = "Delete from sementara"; kon.st.executeUpdate(sql);
tampilTabelSementara(); } catch (SQLException e) {
JOptionPane.showMessageDialog(null, e);
64
}
}
private void cetakStruk() { cetakPenjualan mt = new cetakPenjualan(); mt.setLocationRelativeTo(null);
mt.setVisible(true); mt.Kodeobat = kode.getText();
} /**
* This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor. */ @SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() { jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel(); kode = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel(); tgl = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel();
nama_pengguna = new javax.swing.JTextField(); jPanel2 = new javax.swing.JPanel();
jPanel3 = new javax.swing.JPanel(); jLabel4 = new javax.swing.JLabel(); kode_obat = new javax.swing.JTextField();
btbrowse = new javax.swing.JButton(); jLabel5 = new javax.swing.JLabel();
nama_obat = new javax.swing.JTextField(); jLabel6 = new javax.swing.JLabel(); harga_jual = new javax.swing.JTextField();
jLabel7 = new javax.swing.JLabel(); jumlahbeli = new javax.swing.JTextField();
jLabel8 = new javax.swing.JLabel(); tsubtotal = new javax.swing.JTextField(); jScrollPane1 = new javax.swing.JScrollPane();
tbpenjualan = new javax.swing.JTable(); jPanel4 = new javax.swing.JPanel();
jLabel9 = new javax.swing.JLabel(); ltotal = new javax.swing.JLabel(); jLabel11 = new javax.swing.JLabel();
tbayar = new javax.swing.JTextField(); jLabel12 = new javax.swing.JLabel();
tkembali = new javax.swing.JTextField();
65
bttambah = new javax.swing.JButton();
btsimpan = new javax.swing.JButton(); btbatal = new javax.swing.JButton();
btkeluar = new javax.swing.JButton(); kode_pengguna = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Penjualan"); setUndecorated(true); addWindowListener(new java.awt.event.WindowAdapter() {
public void windowActivated(java.awt.event.WindowEvent evt) { formWindowActivated(evt);
} }); getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
jPanel1.setBorder(new
javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED)); jLabel1.setText("Kode Penjualan");
jLabel2.setText("Tanggal");
jLabel3.setText("Nama Pengguna");
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(kode, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jLabel2)
.addGap(18, 18, 18) .addComponent(tgl, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jLabel3)
66
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(nama_pengguna,
javax.swing.GroupLayout.DEFAULT_SIZE, 143, Short.MAX_VALUE) .addContainerGap()) );
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1)
.addComponent(kode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel2) .addComponent(tgl, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel3) .addComponent(nama_pengguna, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) );
getContentPane().add(jPanel1, new
org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 690, -1)); jPanel2.setBorder(new
javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
jPanel3.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));
jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel4.setText("Kode Obat"); kode_obat.addContainerListener(new java.awt.event.ContainerAdapter() {
public void componentAdded(java.awt.event.ContainerEvent evt) { kode_obatComponentAdded(evt);
}
67
});
kode_obat.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {
kode_obatActionPerformed(evt); } });
btbrowse.setText("...");
btbrowse.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btbrowseActionPerformed(evt);
} });
jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel5.setText("Nama Obat");
jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel6.setText("Harga Obat"); jLabel7.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel7.setText("Jumlah Beli");
jumlahbeli.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jumlahbeliActionPerformed(evt);
} });
jumlahbeli.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { jumlahbeliKeyTyped(evt);
} });
jLabel8.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel8.setText("Sub Total");
javax.swing.GroupLayout jPanel3Layout = new
javax.swing.GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING
) .addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
TRAILING, false)
68
.addComponent(jLabel8, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel7, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel6, javax.swing.GroupLayout.DEFAULT_SIZE, 85, Short.MAX_VALUE)
.addComponent(jLabel4, javax.swing.GroupLayout.Alignment.LEADING,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel5,
javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(27, 27, 27)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() .addComponent(kode_obat,
javax.swing.GroupLayout.DEFAULT_SIZE, 79, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btbrowse)) .addComponent(nama_obat)
.addComponent(harga_jual) .addComponent(jumlahbeli)
.addComponent(tsubtotal)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
); jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(kode_obat) .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(btbrowse, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE))
.addGap(18, 18, 18)
69
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(nama_obat, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(harga_jual,
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(jPanel3Layout.createSequentialGroup() .addComponent(jLabel6,
javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(3, 3, 3))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
BASELINE) .addComponent(jLabel7) .addComponent(jumlahbeli,
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
BASELINE) .addComponent(jLabel8) .addComponent(tsubtotal,
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) );
tbpenjualan.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
70
{null, null, null, null, null},
{null, null, null, null, null}, {null, null, null, null, null},
{null, null, null, null, null}, {null, null, null, null, null}, {null, null, null, null, null},
{null, null, null, null, null}, {null, null, null, null, null},
{null, null, null, null, null}, {null, null, null, null, null} },
new String [] { "Title 1", "Title 2", "Title 3", "Title 4", "Title 5"
} )); tbpenjualan.setCursor(new
java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); tbpenjualan.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) { tbpenjualanKeyPressed(evt); }
}); jScrollPane1.setViewportView(tbpenjualan);
jPanel4.setBorder(javax.swing.BorderFactory.createEtchedBorder());
jLabel9.setFont(new java.awt.Font("Times New Roman", 1, 18)); // NOI18N jLabel9.setText("Rp.");
ltotal.setFont(new java.awt.Font("Times New Roman", 1, 18)); // NOI18N ltotal.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
ltotal.setText("Total");
jLabel11.setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N jLabel11.setText("Uang Bayar");
tbayar.setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N tbayar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { tbayarActionPerformed(evt); }
}); tbayar.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) { tbayarKeyTyped(evt); }
});
jLabel12.setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N
71
jLabel12.setText("Uang Kembali");
tkembali.setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N
javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
jPanel4.setLayout(jPanel4Layout); jPanel4Layout.setHorizontalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel4Layout.createSequentialGroup() .addContainerGap()
.addComponent(jLabel9) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(ltotal, javax.swing.GroupLayout.PREFERRED_SIZE, 220, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(49, 49, 49) .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING) .addComponent(jLabel12)
.addComponent(jLabel11)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING) .addComponent(tkembali) .addComponent(tbayar))
.addContainerGap()) );
jPanel4Layout.setVerticalGroup( jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING
) .addGroup(jPanel4Layout.createSequentialGroup()
.addContainerGap() .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING, false) .addGroup(jPanel4Layout.createSequentialGroup()
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel11) .addComponent(tbayar,
javax.swing.GroupLayout.PREFERRED_SIZE,
72
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18)
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel12) .addComponent(tkembali,
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addComponent(ltotal, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel9, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(29, Short.MAX_VALUE))
);
bttambah.setIcon(new javax.swing.ImageIcon(getClass().getResource("/gambar/Pencil.png"))); // NOI18N bttambah.setText("TAMBAH");
bttambah.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {
bttambahActionPerformed(evt); } });
btsimpan.setIcon(new
javax.swing.ImageIcon(getClass().getResource("/gambar/Pencil and Ruler.png"))); // NOI18N btsimpan.setText("SIMPAN");
btsimpan.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {
btsimpanActionPerformed(evt); } });
btbatal.setIcon(new
javax.swing.ImageIcon(getClass().getResource("/gambar/Error.png"))); // NOI18N btbatal.setText("BATAL"); btbatal.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { btbatalActionPerformed(evt);
} });
btkeluar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/gambar/keluar.png"))); // NOI18N
btkeluar.setText("KELUAR");
73
btkeluar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { btkeluarActionPerformed(evt);
} });
kode_pengguna.setFont(new java.awt.Font("Tahoma", 0, 1)); // NOI18N kode_pengguna.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
kode_pengguna.setText("0"); javax.swing.GroupLayout jPanel2Layout = new
javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING
) .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel2Layout.createSequentialGroup()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup() .addGap(405, 405, 405) .addComponent(kode_pengguna,
javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 154, Short.MAX_VALUE)) .addGroup(jPanel2Layout.createSequentialGroup()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(jPanel2Layout.createSequentialGroup() .addComponent(bttambah) .addGap(40, 40, 40)
.addComponent(btsimpan)) .addComponent(jPanel3,
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addGroup(jPanel2Layout.createSequentialGroup()
74
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(btbatal) .addGap(47, 47, 47)
.addComponent(btkeluar))))) .addContainerGap()) );
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING, false) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(18, 18, 18) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
BASELINE) .addComponent(bttambah)
.addComponent(btsimpan) .addComponent(btbatal) .addComponent(btkeluar))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(kode_pengguna) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap()) );
getContentPane().add(jPanel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 54, 690, 390));
pack(); }// </editor-fold>//GEN-END:initComponents
private void kode_obatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
FIRST:event_kode_obatActionPerformed // TODO add your handling code here: tampilDataobat();
}//GEN-LAST:event_kode_obatActionPerformed
75
private void btbrowseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
FIRST:event_btbrowseActionPerformed // TODO add your handling code here:
boolean closable = true; dataObat db = new dataObat(null, closable); db.transaksi = this;
db.setVisible(true); db.setResizable(true);
kode_obat.setText(Kodeobat); nama_obat.setText(Namaobat); harga_jual.setText(Hargaobat);
}//GEN-LAST:event_btbrowseActionPerformed
private void kode_obatComponentAdded(java.awt.event.ContainerEvent evt) {//GEN-FIRST:event_kode_obatComponentAdded // TODO add your handling code here:
jumlahbeli.requestFocus(); }//GEN-LAST:event_kode_obatComponentAdded
private void btkeluarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btkeluarActionPerformed
// TODO add your handling code here: hapusTabelSementara();
dispose(); }//GEN-LAST:event_btkeluarActionPerformed
private void bttambahActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bttambahActionPerformed
// TODO add your handling code here: aktif(); kode.setText(nomor());
}//GEN-LAST:event_bttambahActionPerformed
private void formWindowActivated(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowActivated
// TODO add your handling code here: nama_pengguna.setText(KodeUser);
tampilTabelSementara(); }//GEN-LAST:event_formWindowActivated
private void btbatalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btbatalActionPerformed
// TODO add your handling code here: awal(); hapusTabelSementara();
kode.setText(""); }//GEN-LAST:event_btbatalActionPerformed
76
private void tbpenjualanKeyPressed(java.awt.event.KeyEvent evt) {//GEN-
FIRST:event_tbpenjualanKeyPressed // TODO add your handling code here:
if (evt.getKeyCode() == KeyEvent.VK_ENTER || evt.getKeyCode() == KeyEvent.VK_BACK_SPACE || evt.getKeyCode() == KeyEvent.VK_DELETE ) {
hapusIsiSementara(); jumlahbeli.setText("");
jumlahbeli.requestFocus(); } }//GEN-LAST:event_tbpenjualanKeyPressed
private void jumlahbeliActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
FIRST:event_jumlahbeliActionPerformed // TODO add your handling code here: int harga, jumbel, total;
if(jumlahbeli.getText().equals("")){ JOptionPane.showMessageDialog(null, "Masukkan Jumlah Beli");
} else{
harga = Integer.parseInt(harga_jual.getText()); jumbel = Integer.parseInt(jumlahbeli.getText());
total = harga * jumbel; tsubtotal.setText(Integer.toString(total)); simpanSementara();
tampilTabelSementara(); int ttl = 0;
for (int a = 0; a < tbpenjualan.getRowCount(); a++) { int sub = Integer.parseInt((String) tbpenjualan.getValueAt(a, 4)); ttl += sub;
} ltotal.setText(Integer.toString(ttl));
if (JOptionPane.showConfirmDialog(this, "Mau Tambah obat?", "Konfirmasi", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
aktif(); kode_obat.requestFocus();
kode_obat.setText(""); nama_obat.setText(""); harga_jual.setText("");
jumlahbeli.setText(""); tsubtotal.setText("");
} else { tbayar.requestFocus();
}
}
77
}//GEN-LAST:event_jumlahbeliActionPerformed
private void btsimpanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
FIRST:event_btsimpanActionPerformed // TODO add your handling code here: if (tbayar.getText().equals("")) {
JOptionPane.showMessageDialog(this, "Silahkan Masukkan Uang Bayar", "Informasi", JOptionPane.INFORMATION_MESSAGE);
tbayar.requestFocus(); } else { simpanpenjualan();
simpanDetailpenjualan(); JOptionPane.showMessageDialog(this, "Berhasil di Simpan",
"Informasi", JOptionPane.INFORMATION_MESSAGE); tampilTabelSementara(); if (JOptionPane.showConfirmDialog(this, "Mau Cetak Struk?",
"Konfirmasi", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
cetakStruk(); hapusTabelSementara(); awal();
bersih(); tampilTabelSementara();
} else { hapusTabelSementara(); awal();
bersih(); kode.setText("");
} }
}//GEN-LAST:event_btsimpanActionPerformed
private void tbayarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tbayarActionPerformed // TODO add your handling code here:
int kembali, total, bayar; total = Integer.parseInt(ltotal.getText());
bayar = Integer.parseInt(tbayar.getText()); kembali = bayar - total; tkembali.setText(Integer.toString(kembali));
}//GEN-LAST:event_tbayarActionPerformed
private void jumlahbeliKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jumlahbeliKeyTyped // TODO add your handling code here:
char c = evt.getKeyChar(); if (!((c >= '0') && (c <= '9')&&jumlahbeli.getText().length()<4
|| (c == com.sun.glass.events.KeyEvent.VK_BACKSPACE)
78
|| (c == com.sun.glass.events.KeyEvent.VK_DELETE))) {
getToolkit().beep(); evt.consume();
} }//GEN-LAST:event_jumlahbeliKeyTyped
private void tbayarKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tbayarKeyTyped
// TODO add your handling code here: char c = evt.getKeyChar(); if (!((c >= '0') && (c <= '9')&&tbayar.getText().length()<11
|| (c == com.sun.glass.events.KeyEvent.VK_BACKSPACE) || (c == com.sun.glass.events.KeyEvent.VK_DELETE))) {
getToolkit().beep(); evt.consume(); }
}//GEN-LAST:event_tbayarKeyTyped
/** * @param args the command line arguments */
public static void main(String args[]) { /* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available, stay with the default
look and feel. * For details see
http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break;
} }
} catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(menuPenjualan.class.getName()).log(java.util.log
ging.Level.SEVERE, null, ex); } catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(menuPenjualan.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
79
java.util.logging.Logger.getLogger(menuPenjualan.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(menuPenjualan.class.getName()).log(java.util.log
ging.Level.SEVERE, null, ex); }
//</editor-fold> //</editor-fold> //</editor-fold>
//</editor-fold>
/* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
new menuPenjualan().setVisible(true); }
}); }
// Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btbatal;
private javax.swing.JButton btbrowse; private javax.swing.JButton btkeluar; private javax.swing.JButton btsimpan;
private javax.swing.JButton bttambah; private javax.swing.JTextField harga_jual;
private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel12;
private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4;
private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextField jumlahbeli; private javax.swing.JTextField kode;
private javax.swing.JTextField kode_obat; private javax.swing.JLabel kode_pengguna;
private javax.swing.JLabel ltotal;
80
private javax.swing.JTextField nama_obat;
private javax.swing.JTextField nama_pengguna; private javax.swing.JTextField tbayar;
private javax.swing.JTable tbpenjualan; private javax.swing.JTextField tgl; private javax.swing.JTextField tkembali;
private javax.swing.JTextField tsubtotal; // End of variables declaration//GEN-END:variables
} 3.5.2. Blackbox Testing
Pada tahap pengujian ini penulis menggunakan pendekatan pengujian validasi
dengan menggunakan Black Box Testing (pengujian kotak hitam) yang berfokus pada
persyaratan fungsional dari sistem yang dibangun.
1. Pengujian Login
Tabel III.13.
Pengujian Menu Login
No Skenario
Pengujian Test Case
Hasil Yang
Diharapkan
Hasil
Pengujian Kesimpulan
1
Mengosongkan semua isian data
login, kemudian langsung klik
tombol ‘Login’
Kode User:
(Kosong) Password:
(Kosong)
Sistem akan menolak akses login dan
menampilkan pesan “Data
tidak ditemukan !!”
Sesuai Harapan
Valid
2
Hanya mengisi
data Kode User, mengosongkan data password,
kemudian langsung klik
tombol ‘Login’
Kode User: U001
Password: (Kosong)
Sistem akan
menolak akses login dan menampilkan
pesan “Data tidak
ditemukan !!”
Sesuai
Harapan Valid
3
Hanya mengisi data password dan
mengosongkan Kode User,
kemudian langsung klik tombol ‘Login’
Password:
Ba03 Kode User:
(Kosong)
Sistem akan menolak akses
login dan menampilkan pesan “Data
tidak ditemukan !!”
Sesuai Harapan
Valid
81
4
Menginputkan dengan kondisi
salah satu data benar dan salah
satu lagi salah, kemudian klik tombol ‘Login’
Kode User:
U001 (Benar)
Password: Asd01 (Salah)
Sistem akan menolak akses
login dan menampilkan
pesan “Data tidak ditemukan !!”
Sesuai Harapan
Valid
2. Pengujian Menu Utama
Tabel III.14.
Pengujian Menu Utama
No
Skenario Pengujian
Hasil Yang
Diharapkan
Hasil
Pengujian
Kesimpulan
1 Memilih Menu
Master
Menampilkan submenu
master
Sesuai
Harapan
Valid
2
Memilih Menu
Transaksi
Menampilkan submenu
transaksi
Sesuai
Harapan Valid
3 Memilih Menu
Laporan
Menampilkan submenu
laporan
Sesuai
Harapan Valid
4 Memilih Menu
Logout
Keluar dari aplikasi sisfo
pendapatan jasa
Sesuai
Harapan
Valid
82
3. Pengujian Submenu Master Data User
Tabel III.15.
Pengujian Submenu User
No Skenario Pengujian Hasil Yang
Diharapkan
Hasil
Pengujian Kesimpulan
1
Mengisi semua data
secara lengkap kemudian klik
tombol „Simpan‟
Menampilkan
pesan peringatan “Data Berhasil
Disimpan!!”
Sesuai Harapan
Valid
2
Mengisi semua data secara lengkap kemudian klik
tombol „Batal‟
Menampilkan inputan data
menjadi kosong
Sesuai Harapan
Valid
3
Langsung klik
tombol „Tambah‟, lalu menampilkan kode user urutan
angka terakhir, kemudian klik
tombol „Simpan‟
Menampilkan pesan peringatan “Data
Tidak Boleh Kosong!!”
Sesuai
Harapan
Valid
4
Mengosongkan
semua data, Kemudian klik
tombol „Simpan‟
Menampikan
pesan peringatan “Data Tidak Boleh
Kosong !!”
Sesuai Harapan
Valid
5
Langsung klik tombol „Cari‟ tanpa memasukkan kode
user
Menampilkan pesan peringatan “Data
tidak ditemukan”
Sesuai Harapan
Valid
6
Mencari data dengan kode user
yang salah, kemudian klik
tombol „Cari‟
Menampilkan pesan peringatan
“Data tidak ditemukan”
Sesuai Harapan
Valid
83
7
Mencari data dengan kode user yang
benar, lalu klik tombol „Cari‟
Menampilkan pesan
peringata “Data ditemukan”
Sesuai
Harapan
Valid
8
Langsung memilih tombol „Hapus‟ tanpa mencari data
kode user
Menampilkan
pesan peringata
“Silahkan Cari Data!!”
Sesuai Harapan
Valid
9
Memasukkan kode
user dikolom pencarian kemudian klik tombol „Batal‟
Menampilkan
inputan data menjadi kosong
Sesuai Harapan
Valid
10
Memasukkan kode user yang akan
dihapus dikolom pencarian lalu klik tombol „Cari‟
kemudian klik tombol „Hapus‟
Menampilkan
pesan peringatan “Data berhasil di
hapus”
Sesuai Harapan
Valid
11
Memilih submenu
lain ketika sedang membuka form data user
Menampilkan
pesan informasi “Silahkan tutup form dahulu !!”
Sesuai Harapan
Valid
12 Membuka submenu form data user lalu
klik tombol „Keluar‟
Keluar dari
submenu form data user dan
menampilkan menu utama
Sesuai Harapan
Valid
84
3.5.3. Spesifikasi Hardware dan Software
Spesifikasi hardware dan software dibuatkan untuk menjelaskan mengenai
kebutuhan perangkat keras dan perangkat lunak yang akan digunakan untuk
menjalankan sistem. Berikut spesifikasi yang disarankan penulis:
Tabel III.16.
Spesifikasi Hardware dan Software
Kebutuhan Keterangan
Sistem Operasi Windows 8 Profesional
Processor Intel (R) Celeron (R) Up to 2.39 GHz
RAM 2.00 GB
Harddisk 232 GB
Monitor Generic PnP
Keyboard Standard PS/2
Mouse Microsoft PS/2