Anda di halaman 1dari 49

Laporan Studi Kasus

Overriding dan Overloading


Pemrograman Berorientasi Objek

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

Politeknik Manufaktur Negeri Bangka Belitung


Jurusan Teknik Elektro dan Informatika
Program Studi Teknologi Rekayasa Perangkat Lunak
Tahun 2023 / 2024
Daftar Isi
Bab I .................................................................................................................................... 1
Pendahuluan ........................................................................................................................ 1
A. Latar Belakang ...................................................................................................... 1
B. Tujuan .................................................................................................................... 1
C. Manfaat .................................................................................................................. 1
Bab II .................................................................................................................................. 3
Landasan Materi.................................................................................................................. 3
A. Class di Program Kotlin ....................................................................................... 3
1. Contoh sintaks deklarasi Class Kotlin ............................................................ 3
2. Contoh Class Pada Kotlin ................................................................................ 4
3. Object di Program Kotlin................................................................................. 5
4. Cara membuat Object ...................................................................................... 5
B. List mutablelist inheritance overloading override ............................................. 6
C. Access modifier sql ................................................................................................ 7
Bab III ............................................................................................................................... 12
Pembahasan....................................................................................................................... 12
A. Studi Kasus .......................................................................................................... 12
B. Penyelesaian ........................................................................................................... 12
Bab IV ............................................................................................................................... 46
Kesimpulan ....................................................................................................................... 46
Daftar Pustaka ................................................................................................................... 47
Bab I

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

A. Class di Program Kotlin

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.

1. Contoh sintaks deklarasi Class Kotlin

class namaClass{ // class header

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:

class namaClass constructor(){ // class header

// property

// member function

3
2. Contoh Class Pada Kotlin

class account {

var acc_no: Int = 0

var name: String? = null

var amount: Float = 0f

fun deposit() {

//deposite code

fun withdraw() {

// withdraw code

fun checkBalance() {

//balance check code

Kelas akun (account) memiliki tiga properti acc_no, nama, jumlah dan tiga fungsi
anggota yakni deposit (), withdraw (), checkBalance ().

Di Kotlin, properti harus diinisialisasi atau dideklarasikan sebagai abstrak. Di kelas di


atas, properti acc_no diinisialisasi sebagai 0, nama sebagai null dan jumlah 0f.

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:

● State: mewakili nilai suatu objek.


● Behaviour: mewakili fungsionalitas suatu objek.

Objek digunakan untuk mengakses properti dan fungsi anggota class. Kotlin
memungkinkan untuk membuat banyak objek dari sebuah class

4. Cara membuat Object

Object didalam kotlin bisa dibuat dalam 2 langkah. Pertama yaitu membuat referensi
(reference) dan kemudian membuat objeknya:

var obj1 = className()

Untuk membuat beberapa objek maka :

var obj1 = className()

var obj2 = className()

begitulah untuk penjelasan singkat mengenai object dan method.

Kemudian ada constructor setter, dan getter.


• Constructor digunakan untuk menginisialisasi objek kelas. Kotlin mendukung
dua jenis constructor: primary constructor dan secondary constructor.
class Person(val name: String, var age: Int) {
// Class body
}

• 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).

B. List mutablelist inheritance overloading override

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:

val myList: List<String> = listOf("apple", "banana",


"orange")

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:

val myMutableList: MutableList<String> =


mutableListOf("apple", "banana", "orange")
myMutableList.add("grape")

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.

open class Animal(val name: String) class Cat(name:


String) : Animal(name)

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.

fun addNumbers(a: Int, b: Int): Int { return a + b }

fun addNumbers(a: Double, b: Double): Double { return a +


b }

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.

open class Shape { open fun draw() { println("Drawing a


shape") } } class Circle : Shape() { override fun draw()
{ println("Drawing a circle") } }

contoh diatas menunjukkan jika class circle melakukan override terhadap fun draw yang
ada didalam class shape.

C. Access modifier sql

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)

2. Kemudian ada variable – variable untuk mengkoneksikan program dengan


database yang tersimpan, diawali dengan menghubungkan akun yaitu ‘root’ dan
beberapa hal lainnya seperti connection dan keamanan database.

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()

var sql = "INSERT INTO data_mahasiswa


(nama,npm,prodi,kelas,alamat,telpon,nilai)

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

val JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"


val DB_URL = "jdbc:mysql://localhost/kasir"
val USER = "root"
val PASS = ""

lateinit var conn: Connection


lateinit var stmt: java.sql.Statement
lateinit var rs: ResultSet
val input = Scanner(System.`in`)
var currentUserId: Int? = null

fun main(args: Array<String>) {


initializeDatabase()

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()

val sql = "SELECT id FROM akun WHERE username =


'$username' AND password = '$password' AND role IN ('admin',
'kasir')"
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 admin/kasir.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}

fun loginPembeli() {
try {
print("Username: ")
val username = input.next()

print("Password: ")
val password = input.next()

val sql = "SELECT id FROM akun WHERE username =


'$username' AND password = '$password' AND role = 'pembeli'"

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()

val sql = "DELETE FROM akun WHERE id = $idAkunPembeli AND


role = 'pembeli'"
val deletedRows = stmt.executeUpdate(sql)

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

val namaBarang = input.nextLine()

print("Harga Barang: ")

16
val hargaBarang = input.nextDouble()

print("Jumlah Barang: ")


val jumlahBarang = input.nextInt()

val sql = "INSERT INTO barang (nama, harga, jumlah) VALUES


('$namaBarang', $hargaBarang, $jumlahBarang)"
stmt.executeUpdate(sql)

println("Barang berhasil ditambahkan.")


} catch (e: Exception) {
e.printStackTrace()
}
}

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

println("ID: $id, Nama Barang: $namaBarang, Harga:


$harga, Tanggal: $tanggal")
}
} catch (e: Exception) {
e.printStackTrace()
}
}

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")
}

print("Masukkan ID Transaksi yang ingin dilihat (0 untuk


kembali): ")
val idTransaksi = input.nextInt()

18
if (idTransaksi != 0) {
lihatNotaPembelian(idTransaksi)
}
} catch (e: Exception) {
e.printStackTrace()
}
}

fun lihatNotaPembelian(idTransaksi: Int) {


try {
val sql =
"SELECT * FROM transaksi WHERE akun_id =
$currentUserId AND DATE_FORMAT(tanggal, '%Y-%m-%d %H:%i:%s') =
(SELECT DATE_FORMAT(tanggal, '%Y-%m-%d %H:%i:%s') FROM transaksi
WHERE id = $idTransaksi)"
rs = stmt.executeQuery(sql)

println("===============================")
println("Nota Pembelian - ID Transaksi: $idTransaksi")
println("===============================")

var totalBelanja = 0.0


var tanggalTransaksi: String? = null

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

println("ID: $id, Nama Barang: $namaBarang, Harga:


$harga")
}

// Menampilkan tanggal transaksi


println("Tanggal Transaksi: $tanggalTransaksi")
println("Total Belanja: $totalBelanja")
} catch (e: Exception) {
e.printStackTrace()
}
}

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
}

val waktuTransaksi = getCurrentTimestamp() // Menggunakan


waktu saat ini
val transaksiDetails = mutableListOf<Triple<String, Int,
Double>>() // List untuk menyimpan detail transaksi
var totalBelanja = 0.0 // Menyimpan total belanja

while (true) {
print("ID Barang yang dibeli (0 untuk selesai): ")
val idBarang = input.nextInt()

if (idBarang == 0) {
break
}

val sqlBarang = "SELECT * FROM barang WHERE id =


$idBarang"
rs = stmt.executeQuery(sqlBarang)

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()

if (jumlahBeli > 0 && jumlahBeli <=


stokBarang) {
val updatedStok = stokBarang - jumlahBeli
val totalHarga = hargaBarang * jumlahBeli

// Menambah detail transaksi ke dalam list

20
transaksiDetails.add(Triple(namaBarang,
jumlahBeli, totalHarga))

// Menyimpan transaksi ke database


val sqlTransaksi =
"INSERT INTO transaksi (nama_barang,
harga, akun_id, tanggal) VALUES ('$namaBarang', $totalHarga,
$currentUserId, '$waktuTransaksi')"
stmt.executeUpdate(sqlTransaksi)

// Mengurangi stok barang


val sqlUpdateStok = "UPDATE barang SET
jumlah = $updatedStok WHERE id = $idBarang"
stmt.executeUpdate(sqlUpdateStok)

totalBelanja += totalHarga // Menambahkan


total harga transaksi ke total belanja

println("Barang berhasil dibeli. Jumlah


barang tersisa: $updatedStok")
} else {
println("Jumlah barang yang dimasukkan
tidak valid atau melebihi stok.")
}
} else {
println("Stok barang habis.")
}
} else {
println("Barang tidak ditemukan.")
}
}

// Menampilkan detail transaksi setelah selesai belanja,


termasuk total belanja
println("===============================")
println("Detail Transaksi")
println("===============================")
for ((namaBarang, jumlah, totalHarga) in transaksiDetails)
{
println("Barang: $namaBarang, Jumlah: $jumlah, Total
Harga: $totalHarga")
}
println("Total Belanja: $totalBelanja")

} catch (e: Exception) {


e.printStackTrace()
}
}

// Fungsi untuk mendapatkan timestamp saat ini


fun getCurrentTimestamp(): String {
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val date = Date()
return dateFormat.format(date)
}

21
fun cetakNotaPembelian() {
try {
if (currentUserId == null) {
println("Anda belum login. Silakan login terlebih
dahulu.")
return
}

val sql = "SELECT * FROM transaksi WHERE akun_id =


$currentUserId"
rs = stmt.executeQuery(sql)

println("===============================")
println("Seluruh Nota Belanja")
println("===============================")

var totalBelanja = 0.0 // Menyimpan total belanja


while (rs.next()) {
val id = rs.getInt("id")
val namaBarang = rs.getString("nama_barang")
val harga = rs.getDouble("harga")
val tanggal = rs.getTimestamp("tanggal") // Retrieve
purchase date

totalBelanja += harga // Menambahkan harga transaksi


ke total belanja

println("ID: $id, Nama Barang: $namaBarang, Harga:


$harga, Tanggal Pembelian: $tanggal")
}

println("Total Belanja: $totalBelanja") // Menampilkan


total belanja
} catch (e: Exception) {
e.printStackTrace()
}
}

fun buatAkun() {
try {
print("Username: ")
val username = input.next()

print("Password: ")
val password = input.next()

val sqlTambahAkun = "INSERT INTO akun (username, password,


role) VALUES ('$username', '$password', 'pembeli')"
stmt.executeUpdate(sqlTambahAkun)

val sqlGetUserId = "SELECT id FROM akun WHERE username =


'$username'"
rs = stmt.executeQuery(sqlGetUserId)

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()
}
}

fun getUserRole(userId: Int): String? {


try {
val sql = "SELECT role FROM akun WHERE id = $userId"
rs = stmt.executeQuery(sql)

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

val JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"


val DB_URL = "jdbc:mysql://localhost/kasir"
val USER = "root"
val PASS = ""

lateinit var conn: Connection


lateinit var stmt: java.sql.Statement
lateinit var rs: ResultSet
val input = Scanner(System.`in`)
var currentUserId: Int? = null

fun main(args: Array<String>) {


initializeDatabase()

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
}
}

Variable yang ada pada Global:

val JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"


val DB_URL = "jdbc:mysql://localhost/kasir"
val USER = "root"
val PASS = ""
A. JDBC_DRIVER, DB_URL, USER, PASS, seperti yang terlihat pada variabel-variabel
tersebut berfungsi dalam menyimpan informasi yang akan kita input kemudian
dikoneksikan ke database, seperti driver JDBC, URL database, username, dan password.

lateinit var conn: Connection


lateinit var stmt: java.sql.Statement
lateinit var rs: ResultSet
val input = Scanner(System.`in`)
var currentUserId: Int? = null
B . Kemudian ada ‘conn’ yang mana merupakan objek Connection yang digunakan untuk
mengelola koneksi ke database, ‘stmt’ adalah objek Statement yang digunakan untuk
mengeksekusi pernyataan SQL kemudian ‘rs’ bbjek ResultSet yang akan menyimpan hasil
dari kueri database, ada juga ‘input’ objek Scanner untuk mengambil input dari pengguna
melalui konsol user,’currentUserId’ untuk menyimpan ID pengguna yang sedang
digunakan dalam aplikasi. Digunakan untuk melacak status login dan peran pengguna.

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()

val sql = "SELECT id FROM akun WHERE username =


'$username' AND password = '$password' AND role IN ('admin',
'kasir')"
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 admin/kasir.")
}
} catch (e: Exception) {
e.printStackTrace()
}
}

28
fun loginPembeli() {
try {
print("Username: ")
val username = input.next()

print("Password: ")
val password = input.next()

val sql = "SELECT id FROM akun WHERE username =


'$username' AND password = '$password' AND role = 'pembeli'"
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()
}
}
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.

Berikut adalah submenu yang ada didalam menu admin kasir:

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()

val sql = "DELETE FROM akun WHERE id = $idAkunPembeli AND


role = 'pembeli'"
val deletedRows = stmt.executeUpdate(sql)

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

val namaBarang = input.nextLine()

print("Harga Barang: ")


val hargaBarang = input.nextDouble()

print("Jumlah Barang: ")


val jumlahBarang = input.nextInt()

val sql = "INSERT INTO barang (nama, harga, jumlah) VALUES


('$namaBarang', $hargaBarang, $jumlahBarang)"
stmt.executeUpdate(sql)

println("Barang berhasil ditambahkan.")


} catch (e: Exception) {
e.printStackTrace()
}
}
4. Fun tambahBarang
Fungsi tambahBarang meminta pengguna untuk memasukkan informasi tentang
barang baru yang ingin ditambahkan ke database. Ini mencakup nama barang,
harga barang, dan jumlah barang. Informasi yang dimasukkan oleh pengguna
kemudian digunakan untuk mengeksekusi pernyataan SQL INSERT ke database.

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

println("ID: $id, Nama Barang: $namaBarang, Harga:


$harga, Tanggal: $tanggal")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
6. Fun lihatRiwayatTransaksi
Fungsi lihatRiwayatTransaksi menampilkan seluruh riwayat transaksi yang ada
dalam database. Fungsi ini menggunakan pernyataan SQL SELECT * FROM

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")
}

print("Masukkan ID Transaksi yang ingin dilihat (0 untuk


kembali): ")
val idTransaksi = input.nextInt()

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.

fun lihatNotaPembelian(idTransaksi: Int) {


try {
val sql =
"SELECT * FROM transaksi WHERE akun_id =
$currentUserId AND DATE_FORMAT(tanggal, '%Y-%m-%d %H:%i:%s') =
(SELECT DATE_FORMAT(tanggal, '%Y-%m-%d %H:%i:%s') FROM transaksi
WHERE id = $idTransaksi)"
rs = stmt.executeQuery(sql)

println("===============================")
println("Nota Pembelian - ID Transaksi: $idTransaksi")
println("===============================")

var totalBelanja = 0.0


var tanggalTransaksi: String? = null

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")
}

// Menampilkan tanggal transaksi


println("Tanggal Transaksi: $tanggalTransaksi")
println("Total Belanja: $totalBelanja")
} catch (e: Exception) {
e.printStackTrace()
}
}
2. Fungsi lihatNotaPembelian
Fungsi lihatNotaPembelian menampilkan nota pembelian berdasarkan ID
transaksi yang dipilih oleh pengguna. Fungsi ini menggunakan kueri SQL untuk
mengambil semua detail transaksi yang sesuai dengan ID transaksi tersebut.
Informasi seperti ID barang, nama barang, harga, dan total belanja akan
ditampilkan, dan pada akhirnya, total belanja dan tanggal transaksi akan
dicetak.

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
}

val waktuTransaksi = getCurrentTimestamp() // Menggunakan


waktu saat ini
val transaksiDetails = mutableListOf<Triple<String, Int,
Double>>() // List untuk menyimpan detail transaksi
var totalBelanja = 0.0 // Menyimpan total belanja

while (true) {
print("ID Barang yang dibeli (0 untuk selesai): ")
val idBarang = input.nextInt()

if (idBarang == 0) {
break
}

val sqlBarang = "SELECT * FROM barang WHERE id =


$idBarang"
rs = stmt.executeQuery(sqlBarang)

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()

if (jumlahBeli > 0 && jumlahBeli <=


stokBarang) {
val updatedStok = stokBarang - jumlahBeli
val totalHarga = hargaBarang * jumlahBeli

// Menambah detail transaksi ke dalam list


transaksiDetails.add(Triple(namaBarang,
jumlahBeli, totalHarga))

// Menyimpan transaksi ke database


val sqlTransaksi =
"INSERT INTO transaksi (nama_barang,
harga, akun_id, tanggal) VALUES ('$namaBarang', $totalHarga,
$currentUserId, '$waktuTransaksi')"
stmt.executeUpdate(sqlTransaksi)

// Mengurangi stok barang


val sqlUpdateStok = "UPDATE barang SET
jumlah = $updatedStok WHERE id = $idBarang"
stmt.executeUpdate(sqlUpdateStok)

totalBelanja += totalHarga // Menambahkan


total harga transaksi ke total belanja

println("Barang berhasil dibeli. Jumlah


barang tersisa: $updatedStok")
} else {
println("Jumlah barang yang dimasukkan
tidak valid atau melebihi stok.")

40
}
} else {
println("Stok barang habis.")
}
} else {
println("Barang tidak ditemukan.")
}
}

// Menampilkan detail transaksi setelah selesai belanja,


termasuk total belanja
println("===============================")
println("Detail Transaksi")
println("===============================")
for ((namaBarang, jumlah, totalHarga) in transaksiDetails)
{
println("Barang: $namaBarang, Jumlah: $jumlah, Total
Harga: $totalHarga")
}
println("Total Belanja: $totalBelanja")

} catch (e: Exception) {


e.printStackTrace()
}
}
4. FunbeliBarang
Fungsi beliBarang memungkinkan pembeli untuk melakukan pembelian
barang. Pengguna diminta untuk memasukkan ID barang yang ingin dibeli dan
jumlah barang yang diinginkan. Setelah validasi, detail transaksi disimpan
dalam list transaksiDetails. Transaksi juga direkam dalam database, dan stok
barang diperbarui. Fungsi ini menampilkan detail transaksi setelah selesai
belanja, termasuk total belanja.

fun getCurrentTimestamp(): String {


val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val date = Date()

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
}

val sql = "SELECT * FROM transaksi WHERE akun_id =


$currentUserId"
rs = stmt.executeQuery(sql)

println("===============================")
println("Seluruh Nota Belanja")
println("===============================")

var totalBelanja = 0.0 // Menyimpan total belanja


while (rs.next()) {
val id = rs.getInt("id")
val namaBarang = rs.getString("nama_barang")
val harga = rs.getDouble("harga")
val tanggal = rs.getTimestamp("tanggal") // Retrieve
purchase date

totalBelanja += harga // Menambahkan harga transaksi


ke total belanja

println("ID: $id, Nama Barang: $namaBarang, Harga:


$harga, Tanggal Pembelian: $tanggal")

42
}

println("Total Belanja: $totalBelanja") // Menampilkan


total belanja
} catch (e: Exception) {
e.printStackTrace()
}
}
L. Fun cetakNotaPembelian
Fungsi cetakNotaPembelian digunakan untuk mencetak seluruh nota pembelian dari
seorang pembeli. Fungsi ini memeriksa apakah pengguna sudah login. Jika belum,
pesan kesalahan akan dicetak. Jika sudah, fungsi ini akan melakukan kueri SQL untuk
mengambil semua transaksi yang terkait dengan akun pembeli tersebut. Selanjutnya,
detail transaksi seperti ID, nama barang, harga, dan tanggal pembelian akan dicetak.
Total belanja juga dihitung dan dicetak di akhir.

fun buatAkun() {
try {
print("Username: ")
val username = input.next()

print("Password: ")
val password = input.next()

val sqlTambahAkun = "INSERT INTO akun (username, password,


role) VALUES ('$username', '$password', 'pembeli')"
stmt.executeUpdate(sqlTambahAkun)

val sqlGetUserId = "SELECT id FROM akun WHERE username =


'$username'"
rs = stmt.executeQuery(sqlGetUserId)

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.

fun getUserRole(userId: Int): String? {


try {
val sql = "SELECT role FROM akun WHERE id = $userId"
rs = stmt.executeQuery(sql)

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

Anda mungkin juga menyukai