Disusun Oleh :
Nama : Dicky Rahmat Rifai (1062237)
: Muhammad Al Hakim (1062247)
: Muhammad Ferdi Firmansyah (1062248)
: Rachman (1062252)
: Taqiy Jayya Muhammad (1062258)
Kelas : 2 TRPL B
Mata Kuliah : Pemrograman Berorientasi Objek (PBO)
Dosen Pengajar : Riki Afriansyah, M. T
Pendahuluan
A. Latar Belakang
Kotlin merupakan bahasa pemrograman open-source yang dikembangkan
oleh JetBrains untuk berbagai platform. Namun, bahasa ini semakin banyak
digunakan untuk membangun aplikasi Android.
Bahasa Kotlin berjalan pada platform Java Virtual Machine (JVM), sebuah
platform yang memungkinkan komputer menjalankan kode berbasis Java, atau
kode dari bahasa lain yang dikompilasi (compile) menggunakan Java.
Bahasa pemrograman Kotlin tergolong bahasa yang diketik secara statis
(statically typed). Artinya, semua variabel yang dimasukkan ke dalam program
harus dikenalkan terlebih dahulu apa jenisnya. Dengan begitu, error yang terjadi
ketika menulis kode (coding) dapat terdeteksi saat itu juga. Sehingga pada saat
proses compile, program sudah benar-benar bersih dari error.
Pemrograman Berorientasi Objek (PBO) atau Object Oriented
Programming (OOP) adalah suatu metode pemrograman yang berorientasi kepada
objek. Tujuan dari PBO/OOP diciptakan adalah untuk mempermudah
pengembangan program dengan cara mengikuti model yang telah ada dikehidupan
sehari-hari. Jadi setiap bagian dari suatu permasalahan adalah objek, sedangkan
objek itu sendiri merupakan gabungan dari beberapa objek yang lebih kecil lagi.
B. Tujuan
Menyelesaikan tugas pembuatan sebuah progaram studi kasus dengan
mengimplementasikan database SQL kedalamnya, yang progaram inputan data
barang pada sebuah toko dengan beragam sebagai penjual maupun pembeli, yang
mana bisa menyimpan data dan menampilkan data yang ada sesuai dengan
penerapan database sql didalamnya.
C. Manfaat
Pembaca dapat mengetahui penyelesaian tugas studi kasus SQL pada kotlin yang
mana mempermudah seorang pengusaha dalam pendataan barang untuk tokonya
1
dan membuat semua teransaksi dapat lebih tertata rapi sehingga dapat menaikkan
nilai mutu dari toko tersebut.
2
Bab II
Landasan Materi
Class pada Kotlin sedikit mirip dengan class pada Java, Class disini adalah cetak biru
untuk objek yang memiliki properti umum.
Class Kotlin dideklarasikan menggunakan kata kunci class (Class keyword). Class Kotlin
memiliki Header class yang menentukan parameter tipenya, konstruktor, dll. Dan badan
kelas yang dikelilingi oleh tanda kurung kurawal.
Dalam contoh di atas, class namaClass adalah konstruktor kosong. Ia dihasilkan oleh
kompilator secara otomatis tetapi jika kita ingin menyediakan konstruktor, kita perlu
menulis kata kunci konstruktor diikuti dengan nama kelas, misalnya:
// property
// member function
3
2. Contoh Class Pada Kotlin
class account {
fun deposit() {
//deposite code
fun withdraw() {
// withdraw code
fun checkBalance() {
Kelas akun (account) memiliki tiga properti acc_no, nama, jumlah dan tiga fungsi
anggota yakni deposit (), withdraw (), checkBalance ().
4
3. Object di Program Kotlin
Object (Objek) adalah entitas waktu nyata atau mungkin merupakan entitas logis yang
memiliki status dan perilaku. Ia memiliki karakteristik:
Objek digunakan untuk mengakses properti dan fungsi anggota class. Kotlin
memungkinkan untuk membuat banyak objek dari sebuah class
Object didalam kotlin bisa dibuat dalam 2 langkah. Pertama yaitu membuat referensi
(reference) dan kemudian membuat objeknya:
• Setter dan Getter adalah metode untuk mengakses dan mengubah nilai properti
dalam kelas.
class Car {
var speed: Int = 0
set(value) {
5
if (value >= 0) {
field = value // setter
}
get() = field // getter
}
}
Pada contoh di atas, val name: String dan var age: Int adalah parameter dari
primary constructor. Kata kunci val membuat parameter tersebut menjadi read-only
(sebagai getter), sedangkan var membuatnya menjadi read-write (getter dan setter).
a. Dimulai dari yang pertama yaitu list, list merupakan salah satu jenis koleksi di Kotlin
yang mewakili urutan elemen dengan indeks. Elemen-elemen dalam List bersifat read-
only, artinya kita tidak dapat mengubah elemen-elemen yang ada di dalamnya setelah list
dibuat. Contoh:
b. Selanjutnya adalah mutableList yang mana adalah turunan dari List, akan tetapi dengan
perbedaan bahwa elemen-elemen di dalamnya dapat diubah atau bisa disebut mutable,
yang mana Ini berarti kita dapat menambah, menghapus, atau memodifikasi elemen-
elemen di dalamnya setelah list dibuat.
Dengan contoh:
c. pada pewarisan atau inheritance sendiri adalah konsep yang mana jika didalam
pemrograman berorientasi objek pada sebuah kelas dapat mewarisi sifat dan perilaku dari
kelas lain. Dalam Kotlin, pewarisan dapat dicapai dengan menggunakan kata kunci :,
diikuti oleh nama kelas yang diwarisi.
6
speerti pada kode diatas, memberitahukan bahwasannya ‘Cat’ merupakan sebuah subclass,
dengan mewarisi sifat dan perilaku dari animal, maksudny bisa berupa atribut ataupun
method
d. kemudian overloading, overloading sendiri dapat terjadi ketika dua atau lebih fungsi
dalam satu kelas memiliki nama yang sama tetapi jumlah atau tipe parameter yang berbeda.
Ini memungkinkan kita membuat fungsi dengan nama yang sama yang dapat menerima
berbagai jenis parameter.
dari isi pada contoh kode di atas, terdapat dua fungsi addNumbers yang dioverload,dengan
satu untuk parameter bertipe Int dan satu untuk parameter bertipe Double.
e. dan yang terakhir adalah override terjadi ketika sebuah kelas anak (subclass)
memberikan implementasi yang berbeda untuk fungsi yang sudah dideklarasikan di kelas
induk (superclass). Untuk melakukan override dalam Kotlin, kita menggunakan kata kunci
override.
contoh diatas menunjukkan jika class circle melakukan override terhadap fun draw yang
ada didalam class shape.
1. Pada padasarnya kotlin juga dapat diintegrasikan dengan sql maka dari itu kami
mempelajari Access modifier sql dalam pemograman kotlin, disini diawali dengan
mengaktifkan liberary-liberarynya dengan mengimport, terutama untuk jdbcnya.
Import java.sql.Connection
import java.sql.drivermanager
import java.sql.resultset
import java.util.Scanner
7
val JDBC_DRIVER = "com.mysql.jdbc.Driver"
val DB_URL = "jdbc:mysql://localhost/registrasimahasiswa"
val USER = "root"
val PASS = ""
lateinit var conn : Connection
lateinit var stmt : java.sql.Statement
lateinit var rs : resultset
val input = Scanner(System.in)
Fun main(args:Array<String>){
Class.forname(JDBC_DRIVER)
conn = drivermanager.getconnection(DB_URL, USER, PASS)
stmt = conn.createstatement()
while (!Conn.isclosed){
showmenu()
}
}
3. Barulah ada fun main dengan memanggil object serta variable akun database tadi,
untuk mengkoneksikannya.
Fun showmenu(){
val input = Scanner(System.in)
println("\n====Silahkan Pilih Menu====")
println("1. Tampilkan Data Mahasiswa")
println("2. Tambahkan Data Mahasiswa")
println("3. Edit Data Mahasiswa")
println("4. Delete Data Mahasiswa")
println("0. Keluar")
println("")
print("Pilih >>> ")
try {
val pilihan:Int = input.nextline().toint()
when (pilihan){
0 -> System.exit(0)
1 -> showdatamahasiswa()
2 -> insertdatamahasiswa()
3 -> updatedatamahasiswa()
4 -> deletedatamahasiswa()
else -> println("Silahkan Piluh Menu yang
Tersedia.....")
}
} catch (e : Exception){
e.printstacktrace()
}
}
8
4. Yang pertama ada method untuk menampilkan menu untuk setiap method yang
ada.
Fun showdatamahasiswa() {
val sql = "SELECT * FROM data_mahasiswa"
try {
rs = stmt.executequery(sql)
println("=================================")
println("TAMPIL DATA MAHASISWA")
println("=================================")
while (rs.next()) {
var id: Int = rs.getint("id")
var nama: String = rs.getstring("nama")
var npm: String = rs.getstring("npm")
var kelas: String = rs.getstring("kelas")
var prodi: String = rs.getstring("prodi")
var alamat: String = rs.getstring("alamat")
var telpon: String = rs.getstring("telpon")
println(
"Id: $id, Nama : $nama, NPM : $npm, Prodi :
$prodi, Kelas : $kelas" +
"Alamat : $alamat, Telpon : $telpon"
)
}
}catch (e: java.lang.Exception){
e.printstacktrace()
}
}
5. Dilanjutkan pilihan pertama yang ada pada menu yaitu methodu untuk
menampilkan data mahasiswa, dengan memanggil setiap kolom yang ada pada
table data base mahasiswa.
Fun insertdatamahasiswa(){
try {
print("Nama : ")
var nama = input.nextline()
print("NPM : ")
var npm = input.nextline()
print("Prodi : ")
var prodi = input.nextline()
print("Kelas : ")
var kelas = input.nextline()
print("Alamat : ")
var alamat = input.nextline()
print("Telpon : ")
var telpon = input.nextline()
print("Niliai : ")
var nilai = input.nextline()
9
VALUES('$nama','$npm','$prodi','$kelas','$alamat','$telpon','$nila
i')"
stmt.execute(sql)
println("Data Verhasil disimpan")
}catch (e: java.lang.Exception){
e.printstacktrace()
}
}
6. Ada method insert data untuk table mahasiswa tadi, disini juga akan lngsung ada
code sql dengan ‘INSERT’ untuk memasukkan data dari user melalui program
kedalam databse local.
Fun updatedatamahasiswa(){
try {
print("ID yang mau diedit : "
var id = input.nextline().toint()
print("Nama : ")
var nama = input.nextline()
print("NPM : ")
var npm = input.nextline().toint()
print("Prodi : ")
var prodi = input.nextline()
print("Kelas : "
var kelas = input.nextline()
print("Alamat : ")
var alamat = input.nextline()
print("Telpon : ")
var telpon = input.nextline()
print("Nilai : ")
var nilai = input.nextline()
var sql = "UPDATE data_mahasiswa SET
nama='$nama',npm='$npm',prodi='$prodi',kelas = '$kelas',alamat =
'$alamat',telpon = '$telpon', nilai ='$nilai' WHERE id=$id"
stmt.execute(sql)
println("DATA BERHASIL DIUPDATE")
}catch (e :java.lang.Exception){
e.printstacktrace()
}
}
7. Ada method update mahasiswa juga yang berfungsi sebagai salah satu method edit,
disini akan mengubah lngsung data yang ada didalam database melalu program
kotlin yang dibuat.
Fun deletedatamahasiswa(){
try {
print("ID yang mau dihapus : ")
var id = input.next()
var sql = "DELETE FROM data_mahasiswa WHERE id=$id"
stmt.execute(sql)
10
println("DATA BERHASIL DIHAPUS")
}catch (e : java.lang.Exception){
e.printstacktrace()
}
}
8. Dan yang terakhir adalah fitur edit lainya yaitu menghapus data pada database
melalui pemograman kotlin dengan menselect melalui idnya.
11
Bab III
Pembahasan
A. Studi Kasus
Sebuah program kasir toko yang didalamnya terdapat:
1. terdapat opsi membuat akun yaitu user/pembeli dan login sebagai
penjual ataupun login sebagai pembeli.
2. Menu kasir apabila sebagai admin, dan menu beli apabila sebagai
pembeli.
3. Terdapat pilihan tambah barang, lihat nominal transaksi, lihat
riwayat transaksi, kelola akun pembeli dalam menu admin kasir
4. terdapat lihat daftar akun pembeli, hapus akun pembeli dalam menu
kelola akun pembeli pada menu admin.
5. terdapat lihat barang, beli barang, cetak nota,pada menu pembeli
dalam menu login sebagai pembeli dan menampilkan detai nya
termasuk juga waktu.
B. Penyelesaian
1. Source Code
Class Barang.kt:
import java.sql.Connection
import java.sql.DriverManager
import java.sql.ResultSet
import java.util.Scanner
import java.text.SimpleDateFormat
import java.util.Date
12
while (true) {
showMainMenu()
}
}
fun initializeDatabase() {
try {
Class.forName(JDBC_DRIVER)
conn = DriverManager.getConnection(DB_URL, USER, PASS)
stmt = conn.createStatement()
} catch (e: Exception) {
e.printStackTrace()
}
}
fun showMainMenu() {
println("\n=== Program Kasir ===")
when (currentUserId) {
null -> {
println("1. Buat Akun Pembeli")
println("2. Login sebagai Admin Kasir")
println("3. Login sebagai Pembeli")
}
else -> {
val role = getUserRole(currentUserId!!)
when (role) {
"admin" -> {
println("1. Admin Kasir")
println("2. Logout")
}
"pembeli" -> {
println("1. Beli Barang")
println("2. Logout")
}
else -> println("Peran tidak valid.")
}
}
}
println("0. Keluar")
print("Pilih menu >>> ")
try {
when (input.nextInt()) {
0 -> System.exit(0)
1 -> when (currentUserId) {
null -> buatAkun()
else -> {
val role = getUserRole(currentUserId!!)
when (role) {
"admin", "kasir" -> kasirMenu()
"pembeli" -> pembeliMenu()
else -> println("Peran tidak valid.")
}
}
}
13
2 -> if (currentUserId != null) {
logout()
} else {
loginAdminKasir()
}
3 -> loginPembeli()
else -> println("Pilihan tidak valid. Silakan pilih
lagi.")
}
} catch (e: java.util.InputMismatchException) {
println("Masukkan tidak valid. Silakan masukkan angka.")
input.next() // Membersihkan buffer masukan
} catch (e: Exception) {
e.printStackTrace()
}
}
fun loginAdminKasir() {
try {
print("Username: ")
val username = input.next()
print("Password: ")
val password = input.next()
if (rs.next()) {
currentUserId = rs.getInt("id")
println("Login berhasil. Anda sudah login sebagai
$username.")
} else {
println("Login gagal. Username atau password salah
atau Anda bukan admin/kasir.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
fun loginPembeli() {
try {
print("Username: ")
val username = input.next()
print("Password: ")
val password = input.next()
14
rs = stmt.executeQuery(sql)
if (rs.next()) {
currentUserId = rs.getInt("id")
println("Login berhasil. Anda sudah login sebagai
$username.")
} else {
println("Login gagal. Username atau password salah
atau Anda bukan pembeli.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
fun kasirMenu() {
while (true) {
println("\n=== Menu Admin Kasir ===")
println("1. Tambah Barang")
println("2. Lihat Nominal Transaksi")
println("3. Lihat Riwayat Transaksi")
println("4. Kelola Akun Pembeli")
println("0. Kembali")
print("Pilih menu >>> ")
try {
when (input.nextInt()) {
0 -> return
1 -> tambahBarang()
2 -> lihatNominalTransaksi()
3 -> lihatRiwayatTransaksi()
4 -> kelolaAkunPembeli()
else -> println("Pilihan tidak valid. Silakan
pilih lagi.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
fun kelolaAkunPembeli() {
while (true) {
println("\n=== Kelola Akun Pembeli ===")
println("1. Lihat Daftar Akun Pembeli")
println("2. Hapus Akun Pembeli")
println("0. Kembali")
print("Pilih menu >>> ")
try {
when (input.nextInt()) {
1 -> lihatDaftarAkunPembeli()
2 -> hapusAkunPembeli()
0 -> return
else -> println("Pilihan tidak valid. Silakan
pilih lagi.")
15
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
fun lihatDaftarAkunPembeli() {
try {
val sql = "SELECT * FROM akun WHERE role = 'pembeli'"
rs = stmt.executeQuery(sql)
println("===============================")
println("Daftar Akun Pembeli")
println("===============================")
while (rs.next()) {
val id = rs.getInt("id")
val username = rs.getString("username")
println("ID: $id, Username: $username")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
fun hapusAkunPembeli() {
try {
print("ID Akun Pembeli yang akan dihapus: ")
val idAkunPembeli = input.nextInt()
if (deletedRows > 0) {
println("Akun Pembeli berhasil dihapus.")
} else {
println("Gagal menghapus akun pembeli. ID tidak valid
atau bukan akun pembeli.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
fun tambahBarang() {
try {
print("Nama Barang: ")
input.nextLine() // Menangkap karakter newline yang
tersisa di buffer
16
val hargaBarang = input.nextDouble()
fun lihatNominalTransaksi() {
try {
val sql = "SELECT SUM(harga) AS total FROM transaksi"
rs = stmt.executeQuery(sql)
if (rs.next()) {
val total = rs.getDouble("total")
println("Nominal Transaksi: $total")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
fun lihatRiwayatTransaksi() {
try {
val sql = "SELECT * FROM transaksi"
rs = stmt.executeQuery(sql)
println("===============================")
println("Riwayat Transaksi")
println("===============================")
while (rs.next()) {
val id = rs.getInt("id")
val namaBarang = rs.getString("nama_barang")
val harga = rs.getDouble("harga")
val tanggal = rs.getTimestamp("tanggal") // Menambah
tanggal transaksi
17
fun pembeliMenu() {
while (true) {
println("\n=== Menu Pembeli ===")
println("1. Lihat Daftar Barang")
println("2. Beli Barang")
println("3. Cetak Seluruh Nota Pembelian")
println("4. Lihat Nota Riwayat Belanja")
println("0. Kembali")
print("Pilih menu >>> ")
try {
when (input.nextInt()) {
0 -> return
1 -> lihatDaftarBarang()
2 -> beliBarang()
3 -> cetakNotaPembelian()
4 -> lihatRiwayatBelanja()
else -> println("Pilihan tidak valid. Silakan
pilih lagi.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
fun lihatRiwayatBelanja() {
try {
if (currentUserId == null) {
println("Anda belum login. Silakan login terlebih
dahulu.")
return
}
val sql =
"SELECT DISTINCT DATE_FORMAT(tanggal,
'%Y-%m-%d %H:%i:%s') AS waktu, MIN(id) AS id_transaksi FROM
transaksi WHERE akun_id = $currentUserId GROUP BY waktu ORDER BY
waktu DESC"
rs = stmt.executeQuery(sql)
println("===============================")
println("Riwayat Belanja")
println("===============================")
while (rs.next()) {
val idTransaksi = rs.getInt("id_transaksi")
val waktuTransaksi = rs.getString("waktu")
println("ID Transaksi: $idTransaksi, Waktu:
$waktuTransaksi")
}
18
if (idTransaksi != 0) {
lihatNotaPembelian(idTransaksi)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
println("===============================")
println("Nota Pembelian - ID Transaksi: $idTransaksi")
println("===============================")
while (rs.next()) {
val id = rs.getInt("id")
val namaBarang = rs.getString("nama_barang")
val harga = rs.getDouble("harga")
tanggalTransaksi =
rs.getTimestamp("tanggal").toString() // Mendapatkan tanggal
transaksi
totalBelanja += harga
fun lihatDaftarBarang() {
try {
val sql = "SELECT * FROM barang"
rs = stmt.executeQuery(sql)
println("===============================")
println("Daftar Barang")
19
println("===============================")
while (rs.next()) {
val id = rs.getInt("id")
val namaBarang = rs.getString("nama")
val harga = rs.getDouble("harga")
val jumlah = rs.getInt("jumlah")
println("ID: $id, Nama Barang: $namaBarang, Harga:
$harga, Jumlah: $jumlah")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
fun beliBarang() {
try {
if (currentUserId == null) {
println("Anda belum login. Silakan login terlebih
dahulu.")
return
}
while (true) {
print("ID Barang yang dibeli (0 untuk selesai): ")
val idBarang = input.nextInt()
if (idBarang == 0) {
break
}
if (rs.next()) {
val namaBarang = rs.getString("nama")
val hargaBarang = rs.getDouble("harga")
val stokBarang = rs.getInt("jumlah")
if (stokBarang > 0) {
print("Masukkan Jumlah Barang yang dibeli: ")
val jumlahBeli = input.nextInt()
20
transaksiDetails.add(Triple(namaBarang,
jumlahBeli, totalHarga))
21
fun cetakNotaPembelian() {
try {
if (currentUserId == null) {
println("Anda belum login. Silakan login terlebih
dahulu.")
return
}
println("===============================")
println("Seluruh Nota Belanja")
println("===============================")
fun buatAkun() {
try {
print("Username: ")
val username = input.next()
print("Password: ")
val password = input.next()
22
if (rs.next()) {
currentUserId = rs.getInt("id")
println("Akun berhasil dibuat. Anda sudah login
sebagai $username.")
} else {
println("Terjadi kesalahan saat membuat akun.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
return if (rs.next()) {
rs.getString("role")
} else {
null
}
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
fun logout() {
currentUserId = null
println("Logout berhasil. Anda kembali ke menu awal.")
}
23
2. Penjelasan
import java.sql.Connection
import java.sql.DriverManager
import java.sql.ResultSet
import java.util.Scanner
import java.text.SimpleDateFormat
import java.util.Date
while (true) {
showMainMenu()
}
}
fun initializeDatabase() {
try {
Class.forName(JDBC_DRIVER)
conn = DriverManager.getConnection(DB_URL, USER, PASS)
stmt = conn.createStatement()
} catch (e: Exception) {
e.printStackTrace()
24
}
}
25
fun main(args: Array<String>) {
initializeDatabase()
while (true) {
showMainMenu()
}
}
C. Pada fun main yang mana merupakan titik masuk utama program akan memanggil
initializeDatabase untuk menginisialisasi koneksi ke database, lalu menjalankan loop tak
terbatas (while (true)) yang memanggil showMainMenu secara berulang.
fun initializeDatabase() {
try {
Class.forName(JDBC_DRIVER)
conn = DriverManager.getConnection(DB_URL, USER, PASS)
stmt = conn.createStatement()
} catch (e: Exception) {
e.printStackTrace()
}
}
D. Fun initializeDatabase dalam funtion ini kita akan menginisialisasi koneksi ke database
MySQL. Jika terdapat kesalahan,ada yang namanya mencetak stack trace untuk membantu
pemecahan masalah.
fun showMainMenu() {
println("\n=== Program Kasir ===")
when (currentUserId) {
null -> {
println("1. Buat Akun Pembeli")
println("2. Login sebagai Admin Kasir")
println("3. Login sebagai Pembeli")
}
else -> {
val role = getUserRole(currentUserId!!)
when (role) {
26
"admin" -> {
println("1. Admin Kasir")
println("2. Logout")
}
"pembeli" -> {
println("1. Beli Barang")
println("2. Logout")
}
else -> println("Peran tidak valid.")
}
}
}
println("0. Keluar")
print("Pilih menu >>> ")
try {
when (input.nextInt()) {
0 -> System.exit(0)
1 -> when (currentUserId) {
null -> buatAkun()
else -> {
val role = getUserRole(currentUserId!!)
when (role) {
"admin", "kasir" -> kasirMenu()
"pembeli" -> pembeliMenu()
else -> println("Peran tidak valid.")
}
}
}
2 -> if (currentUserId != null) {
logout()
} else {
loginAdminKasir()
}
3 -> loginPembeli()
else -> println("Pilihan tidak valid. Silakan pilih
lagi.")
}
27
} catch (e: java.util.InputMismatchException) {
println("Masukkan tidak valid. Silakan masukkan angka.")
input.next() // Membersihkan buffer masukan
} catch (e: Exception) {
e.printStackTrace()
}
}
F. Selanjutnya adalah fun showMainMenu ‘role’ yang mana merupakan variabel lokal
untuk menyimpan peran pengguna yang diperoleh dari pemanggilan fun ‘getUserRole’,.
fun loginAdminKasir() {
try {
print("Username: ")
val username = input.next()
print("Password: ")
val password = input.next()
if (rs.next()) {
currentUserId = rs.getInt("id")
println("Login berhasil. Anda sudah login sebagai
$username.")
} else {
println("Login gagal. Username atau password salah
atau Anda bukan admin/kasir.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
28
fun loginPembeli() {
try {
print("Username: ")
val username = input.next()
print("Password: ")
val password = input.next()
if (rs.next()) {
currentUserId = rs.getInt("id")
println("Login berhasil. Anda sudah login sebagai
$username.")
} else {
println("Login gagal. Username atau password salah
atau Anda bukan pembeli.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
G. Dalam fun loginAdminKasir dan loginPembeli diatas terdapat,’username’, ‘password’
yang merupakan variabel lokal untuk menyimpan data terkait input username dan password
dari pengguna, yang mana nntinya apabila user mencoba login akan tetapi inputan
username serta passwordnya tidak sesuai dengan idcurren yang sudah di masukkan maka
user tidak akan dapat login untuk masuk kedalam menu kasir.
fun kasirMenu() {
while (true) {
println("\n=== Menu Admin Kasir ===")
println("1. Tambah Barang")
println("2. Lihat Nominal Transaksi")
29
println("3. Lihat Riwayat Transaksi")
println("4. Kelola Akun Pembeli")
println("0. Kembali")
print("Pilih menu >>> ")
try {
when (input.nextInt()) {
0 -> return
1 -> tambahBarang()
2 -> lihatNominalTransaksi()
3 -> lihatRiwayatTransaksi()
4 -> kelolaAkunPembeli()
else -> println("Pilihan tidak valid. Silakan
pilih lagi.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
H. Fun kasirMenu
Fungsi kasirMenu bertanggung jawab untuk menampilkan menu admin kasir dan
memproses pilihan yang dibuat oleh pengguna. Menu ini memberikan opsi untuk
menambahkan barang, melihat nominal transaksi, melihat riwayat transaksi, dan mengelola
akun pembeli. Jika pengguna memilih 0, mereka akan kembali ke menu sebelumnya.
fun kelolaAkunPembeli() {
while (true) {
println("\n=== Kelola Akun Pembeli ===")
println("1. Lihat Daftar Akun Pembeli")
println("2. Hapus Akun Pembeli")
println("0. Kembali")
print("Pilih menu >>> ")
30
try {
when (input.nextInt()) {
1 -> lihatDaftarAkunPembeli()
2 -> hapusAkunPembeli()
0 -> return
else -> println("Pilihan tidak valid. Silakan
pilih lagi.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
1. Fun kelolaAkunPembeli
Fungsi kelolaAkunPembeli mengelola opsi terkait akun pembeli. Pengguna
dapat memilih untuk melihat daftar akun pembeli, menghapus akun pembeli,
atau kembali ke menu sebelumnya dengan memilih 0.
fun lihatDaftarAkunPembeli() {
try {
val sql = "SELECT * FROM akun WHERE role = 'pembeli'"
rs = stmt.executeQuery(sql)
println("===============================")
println("Daftar Akun Pembeli")
println("===============================")
while (rs.next()) {
val id = rs.getInt("id")
val username = rs.getString("username")
println("ID: $id, Username: $username")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
31
2. Fun lihatDaftarAkunPembeli
Fungsi lihatDaftarAkunPembeli bertanggung jawab untuk menampilkan daftar
akun pembeli dari database. Ini melibatkan eksekusi kueri ke database untuk
mengambil informasi yang diperlukan, seperti ID dan nama pengguna, dan
kemudian menampilkannya di layar.
fun hapusAkunPembeli() {
try {
print("ID Akun Pembeli yang akan dihapus: ")
val idAkunPembeli = input.nextInt()
if (deletedRows > 0) {
println("Akun Pembeli berhasil dihapus.")
} else {
println("Gagal menghapus akun pembeli. ID tidak valid
atau bukan akun pembeli.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
3. Fun hapusAkunPembeli
Fungsi hapusAkunPembeli memungkinkan pengguna untuk menghapus akun
pembeli berdasarkan ID yang dimasukkan. Fungsi ini mengirimkan pernyataan
SQL DELETE ke database dan memberikan umpan balik kepada pengguna
apakah penghapusan berhasil atau tidak.
fun tambahBarang() {
try {
print("Nama Barang: ")
32
input.nextLine() // Menangkap karakter newline yang
tersisa di buffer
fun lihatNominalTransaksi() {
try {
val sql = "SELECT SUM(harga) AS total FROM transaksi"
rs = stmt.executeQuery(sql)
if (rs.next()) {
val total = rs.getDouble("total")
println("Nominal Transaksi: $total")
}
} catch (e: Exception) {
e.printStackTrace()
33
}
}
5. Fun lihatNominalTransaksi
Fungsi lihatNominalTransaksi bertanggung jawab untuk menghitung total
nominal transaksi dari seluruh transaksi yang ada dalam database. Fungsi ini
menggunakan pernyataan SQL SELECT SUM(harga) AS total FROM transaksi untuk
mengambil jumlah total harga dari seluruh transaksi. Jika ada hasil dari kueri
tersebut, nilai total akan ditampilkan ke pengguna.
fun lihatRiwayatTransaksi() {
try {
val sql = "SELECT * FROM transaksi"
rs = stmt.executeQuery(sql)
println("===============================")
println("Riwayat Transaksi")
println("===============================")
while (rs.next()) {
val id = rs.getInt("id")
val namaBarang = rs.getString("nama_barang")
val harga = rs.getDouble("harga")
val tanggal = rs.getTimestamp("tanggal") // Menambah
tanggal transaksi
34
transaksi untuk mengambil semua data transaksi. Selanjutnya, ia menggunakan
suatu loop untuk iterasi melalui setiap baris hasil kueri dan menampilkan
informasi seperti ID transaksi, nama barang, harga, dan tanggal transaksi.
fun pembeliMenu() {
while (true) {
println("\n=== Menu Pembeli ===")
println("1. Lihat Daftar Barang")
println("2. Beli Barang")
println("3. Cetak Seluruh Nota Pembelian")
println("4. Lihat Nota Riwayat Belanja")
println("0. Kembali")
print("Pilih menu >>> ")
try {
when (input.nextInt()) {
0 -> return
1 -> lihatDaftarBarang()
2 -> beliBarang()
3 -> cetakNotaPembelian()
4 -> lihatRiwayatBelanja()
else -> println("Pilihan tidak valid. Silakan
pilih lagi.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
7. Fun pembeliMenu
Fungsi pembeliMenu merupakan menu utama untuk pengguna dengan peran sebagai
pembeli. Pengguna dapat memilih berbagai opsi, seperti melihat daftar barang,
melakukan pembelian, mencetak seluruh nota pembelian, melihat riwayat belanja, atau
kembali ke menu utama. Pilihan pengguna ditangani melalui blok when di dalam loop
while (true).
35
Berikut adalah submenu yang ada didalam menu Pembeli:
fun lihatRiwayatBelanja() {
try {
if (currentUserId == null) {
println("Anda belum login. Silakan login terlebih
dahulu.")
return
}
val sql =
"SELECT DISTINCT DATE_FORMAT(tanggal,
'%Y-%m-%d %H:%i:%s') AS waktu, MIN(id) AS id_transaksi FROM
transaksi WHERE akun_id = $currentUserId GROUP BY waktu ORDER BY
waktu DESC"
rs = stmt.executeQuery(sql)
println("===============================")
println("Riwayat Belanja")
println("===============================")
while (rs.next()) {
val idTransaksi = rs.getInt("id_transaksi")
val waktuTransaksi = rs.getString("waktu")
println("ID Transaksi: $idTransaksi, Waktu:
$waktuTransaksi")
}
if (idTransaksi != 0) {
lihatNotaPembelian(idTransaksi)
}
} catch (e: Exception) {
e.printStackTrace()
36
}
}
1. Fun lihatRiwayatBelanja
Fungsi lihatRiwayatBelanja digunakan untuk menampilkan riwayat belanja
pembeli. Fungsi ini menggunakan suatu kueri SQL untuk mengambil informasi
waktu transaksi dan ID transaksi. Kemudian, hasil kueri tersebut ditampilkan
dalam bentuk ID transaksi dan waktu transaksi. Setelah itu, pengguna diminta
untuk memasukkan ID transaksi yang ingin dilihat lebih detail, dan jika ID
tersebut tidak sama dengan 0, fungsi lihatNotaPembelian akan dipanggil.
println("===============================")
println("Nota Pembelian - ID Transaksi: $idTransaksi")
println("===============================")
while (rs.next()) {
val id = rs.getInt("id")
val namaBarang = rs.getString("nama_barang")
val harga = rs.getDouble("harga")
tanggalTransaksi =
rs.getTimestamp("tanggal").toString() // Mendapatkan tanggal
transaksi
totalBelanja += harga
37
println("ID: $id, Nama Barang: $namaBarang, Harga:
$harga")
}
fun lihatDaftarBarang() {
try {
val sql = "SELECT * FROM barang"
rs = stmt.executeQuery(sql)
println("===============================")
println("Daftar Barang")
println("===============================")
while (rs.next()) {
val id = rs.getInt("id")
val namaBarang = rs.getString("nama")
val harga = rs.getDouble("harga")
val jumlah = rs.getInt("jumlah")
println("ID: $id, Nama Barang: $namaBarang, Harga:
$harga, Jumlah: $jumlah")
}
38
} catch (e: Exception) {
e.printStackTrace()
}
}
3. Fun lihatDaftarBarang
Fungsi lihatDaftarBarang bertanggung jawab untuk menampilkan daftar semua
barang yang tersedia dalam database. Fungsi ini menggunakan kueri SQL
sederhana untuk mengambil informasi barang seperti ID, nama, harga, dan
jumlah. Data ini kemudian ditampilkan kepada pengguna.
fun beliBarang() {
try {
if (currentUserId == null) {
println("Anda belum login. Silakan login terlebih
dahulu.")
return
}
while (true) {
print("ID Barang yang dibeli (0 untuk selesai): ")
val idBarang = input.nextInt()
if (idBarang == 0) {
break
}
39
if (rs.next()) {
val namaBarang = rs.getString("nama")
val hargaBarang = rs.getDouble("harga")
val stokBarang = rs.getInt("jumlah")
if (stokBarang > 0) {
print("Masukkan Jumlah Barang yang dibeli: ")
val jumlahBeli = input.nextInt()
40
}
} else {
println("Stok barang habis.")
}
} else {
println("Barang tidak ditemukan.")
}
}
41
return dateFormat.format(date)
}
K. Fun getCurrentTimestamp
Fungsi ini digunakan untuk mendapatkan timestamp saat ini dalam format yang
ditentukan ("yyyy-MM-dd HH:mm:ss"). Fungsi ini menggunakan kelas
SimpleDateFormat dari Java untuk memformat tanggal dan waktu saat ini.
fun cetakNotaPembelian() {
try {
if (currentUserId == null) {
println("Anda belum login. Silakan login terlebih
dahulu.")
return
}
println("===============================")
println("Seluruh Nota Belanja")
println("===============================")
42
}
fun buatAkun() {
try {
print("Username: ")
val username = input.next()
print("Password: ")
val password = input.next()
43
if (rs.next()) {
currentUserId = rs.getInt("id")
println("Akun berhasil dibuat. Anda sudah login
sebagai $username.")
} else {
println("Terjadi kesalahan saat membuat akun.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
M. Fungsi buatAkun
Fungsi buatAkun digunakan untuk membuat akun baru. Pengguna diminta untuk
memasukkan username dan password, dan akun baru akan disimpan dalam database.
Setelah membuat akun, fungsi ini juga mengambil ID akun yang baru dibuat untuk
menyimpannya dalam variabel currentUserId. Ini memungkinkan pengguna yang baru
mendaftar langsung masuk ke dalam sistem.
return if (rs.next()) {
rs.getString("role")
} else {
null
}
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
N. Fungsi getUserRole
44
Fungsi getUserRole digunakan untuk mendapatkan peran (role) pengguna berdasarkan
ID pengguna. Fungsi ini melakukan kueri SQL untuk mengambil peran pengguna dari
database.
fun logout() {
currentUserId = null
println("Logout berhasil. Anda kembali ke menu awal.")
}
O. Fungsi logout
Fungsi logout digunakan untuk keluar dari akun pengguna saat ini dengan mengatur
nilai currentUserId menjadi null. Pesan berhasil logout akan dicetak, dan pengguna
kembali ke menu awal.
45
Bab IV
Kesimpulan
Seperti yang kita ketahui bahwasannya zaman sudah sangat berkembang, dengan
perkembangan industri yang sudah memasuki 4.0 bahkan 5.0 sudah membuat semua orang
merasa bahwa aktifitas – aktifitas sepele seperti contohnya bertransaksi sebaiknya bisa
dilakukan dengan lebih efisien, kenapa ? karena sekarang waktu adalah segalanya,
keefisiensian lah yang dicari, contohnya dengan program yang sudah kami buat ini yaitu
program aplikasi, kenapa ? karena selain lebih efisien, dengan program ini juga membuat
aktivitas terkait perdagangan juga menjadi lebih akurat, seperti perhitungan pembayaran,
pendataan barang serta pendataan untuk catatan keuangan. Makanya orang orang lebih
senang berbelanja ke supermarket dibandingkan dengan warung biasa, karena dengan
dilengkapi teknologi seperti mesin kasir, maka aktivitas pembayaran lebih efisien, ya betul
hal ini akan bagus untuk orang – orang yang berbelanja banyak, akan tetapi bagaimana
dalam segi pendataan ? jika manual sang pedagang akan menuliskannya secara fisik
melalui buku atau kertas, yang mana risiko kehancuran data sangatlah tinggi, berbeda
dengan mesin kasir, dengan terintegrasinya dengan data base sql, maka data terjamin tetap
aman, walau suatu waktu mesinnya malah rusak secara hardware, namun tetap aman secara
software. Maka dari itu dapat disimpulkan bahwa semakin berkembangnya zaman, akan
semakin dibutuhkan teknologi teknologi berbasis program seperti ini yang akan menaikkan
efisiensi daripada aktivitas yang dijalankan oleh manusia dalam sehari hari.
46
Daftar Pustaka
1. https://www.techfor.id/class-dan-object-pada-bahasa-program-kotlin/
2. https://stackoverflow.com/questions/62338410/kotlin-getter-setter-when-
using-a-primary-constructor
47