diff --git a/src/app/main.py b/src/app/main.py
index c8f6cd83486e7bf471625d03ebc3cd152bbac56c..075a70fa4bd1d30fc0ab6e589698fee5c376c606 100644
--- a/src/app/main.py
+++ b/src/app/main.py
@@ -1,13 +1,92 @@
 from app.ui.main_window_ui import *
 from app.db import init_db
+import datetime
+import sys
+
+from PyQt5.QtWidgets import (
+    QApplication, QDialog, QMainWindow, QMessageBox
+)
+from PyQt5.uic import loadUi
+
+from app.ui.detail_acara_window_ui import Ui_DetailAcaraWindow
+
+class Window(QMainWindow, Ui_DetailAcaraWindow):
+    def __init__(self, content, kategori, isMember, parent=None):
+        super().__init__(parent)
+        self.setupUi(self,content,kategori,isMember)
+
+    def about(self):
+        QMessageBox.about(
+            self,
+            "About Sample Editor",
+            "<p>A sample text editor app built with:</p>"
+            "<p>- PyQt</p>"
+            "<p>- Qt Designer</p>"
+            "<p>- Python</p>",
+        )
+
+def write_file(data, filename):
+    # Convert binary data to proper format and write it on Hard Disk
+    with open(filename, 'wb') as file:
+        file.write(data)
+
+def get_image(filename):
+    with open(filename, 'rb') as file:
+        return file.read()
 
 if __name__ == '__main__':
     conn = init_db()
     cur = conn.cursor()
 
-    app = QtWidgets.QApplication(sys.argv)
-    YesManagement = QtWidgets.QMainWindow()
-    ui = Ui_YesManagement(conn)
-    ui.setupUi(YesManagement)
-    YesManagement.show()
-    sys.exit(app.exec_())
\ No newline at end of file
+    ###################
+    # BUAT DETAIL ACARA
+    # Ini tinggal diganti aja
+    PATH = "./ui/assets/"
+    currIDUser = 2
+    currIDAcara = 1
+    isMember = True
+
+    # execute SQL query
+    # lengkapnya: https://mariadb.com/resources/blog/how-to-connect-python-programs-to-mariadb/
+    cur.execute('SELECT * FROM acara WHERE id_acara = {0} LIMIT 1'.format(currIDAcara))
+    # ngeprint hasil eksekusi
+    content = cur.fetchone()
+
+    cur.execute("SELECT penanggung_jawab,no_wa FROM penyelenggara WHERE id_penyelenggara = "+str(content[9]))
+    val = cur.fetchone()
+    contact = val[0] + ": " + val[1]
+    contact = (contact,)
+    content = tuple([content[i] for i in range(9)])
+    content += contact
+
+    # Buat insert image
+    # img = get_image("D:\Tugas\Others\\redpanda.jpg")
+    # cur.execute("INSERT INTO foto_acara(id_acara,foto) VALUES (%s,%s)", (currIDAcara,img))
+    # conn.commit()
+
+    cur.execute("SELECT id_foto,foto FROM foto_acara WHERE id_acara ="+str(content[0]))
+    files = cur.fetchall()
+    images = []
+    for aFile in files:
+        images.append(aFile[1])
+
+    cur.execute("SELECT nama_kategori FROM kategori_acara WHERE id_acara = "+str(content[0]))
+    query = cur.fetchall()
+    kategori = ()
+    for val in query:
+        kategori += val
+
+    cur.execute("SELECT SUM(jumlah) FROM mengikuti WHERE id_acara = "+str(currIDAcara))
+    jmlPesanan = cur.fetchone()
+    jmlPesanan = jmlPesanan[0]
+    content += (currIDUser,images,jmlPesanan)
+
+    # (idacara, nama, linkvideo, syarat, kuota, desc, time, harga, link, penyelenggara: no WA)
+    app = QApplication(sys.argv)
+    #print(content)
+    win = Window(content,kategori,isMember)
+    win.show()
+    sys.exit(app.exec())
+    #################
+
+    conn.close()
diff --git a/src/app/ui/detail_acara_window_ui.py b/src/app/ui/detail_acara_window_ui.py
new file mode 100644
index 0000000000000000000000000000000000000000..efc51ea637bcbcc015a8e8531d4faa5279d24f41
--- /dev/null
+++ b/src/app/ui/detail_acara_window_ui.py
@@ -0,0 +1,319 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file './ui/main_window.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.2
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+import datetime
+from app import db
+from app.modules import pesan
+
+class Ui_Dialog(object):
+    def setupUi(self, Dialog, first):
+        Dialog.setObjectName("Dialog")
+        Dialog.resize(311, 79)
+        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
+        self.buttonBox.setGeometry(QtCore.QRect(210, 10, 81, 241))
+        self.buttonBox.setOrientation(QtCore.Qt.Vertical)
+        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
+        self.buttonBox.setObjectName("buttonBox")
+        self.horizontalLayoutWidget = QtWidgets.QWidget(Dialog)
+        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 20, 161, 41))
+        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
+        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
+        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout.setSpacing(80)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)
+        self.label.setObjectName("label")
+        self.horizontalLayout.addWidget(self.label)
+        self.spinBox = QtWidgets.QSpinBox(self.horizontalLayoutWidget)
+        self.spinBox.setObjectName("spinBox")
+        self.horizontalLayout.addWidget(self.spinBox)
+
+        if first: 
+            self.retranslateUi(Dialog)
+        else:
+            self.revalidationUi(Dialog)
+
+        self.buttonBox.accepted.connect(Dialog.accept)
+        self.buttonBox.rejected.connect(Dialog.reject)
+        QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+    def retranslateUi(self, Dialog):
+        _translate = QtCore.QCoreApplication.translate
+        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
+        self.label.setText(_translate("Dialog", "Jumlah"))
+    
+    def revalidationUi(self, Dialog):
+        _translate = QtCore.QCoreApplication.translate
+        Dialog.setWindowTitle(_translate("Dialog", "Pemesanan gagal"))
+        self.label.setText(_translate("Dialog", "Jumlah"))
+
+    def getQuantity(self):
+        return self.spinBox.value()
+
+class Ui_DetailAcaraWindow(object):
+    def setupUi(self, MainWindow, content, kategori, isMember):
+        MainWindow.setObjectName("MainWindow")
+        MainWindow.resize(813, 600)
+
+        self.idAcara = content[0]
+        self.idMember = content[10]
+        self.isMember = isMember
+
+        self.centralwidget = QtWidgets.QWidget(MainWindow)
+        self.centralwidget.setObjectName("centralwidget")
+
+        self.frame = QtWidgets.QFrame(self.centralwidget)
+        self.frame.setGeometry(QtCore.QRect(10, 310, 781, 261))
+        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
+        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
+        self.frame.setObjectName("frame")
+
+        self.textBrowser = QtWidgets.QTextBrowser(self.frame)
+        self.textBrowser.setGeometry(QtCore.QRect(10, 50, 256, 192))
+        self.textBrowser.setObjectName("textBrowser")
+
+        self.label_2 = QtWidgets.QLabel(self.frame)
+        self.label_2.setGeometry(QtCore.QRect(10, 10, 241, 31))
+        font = QtGui.QFont()
+        font.setPointSize(20)
+        self.label_2.setFont(font)
+        self.label_2.setObjectName("label_2")
+
+        self.scrollArea = QtWidgets.QScrollArea(self.frame)
+        self.scrollArea.setGeometry(QtCore.QRect(290, 10, 481, 231))
+        self.scrollArea.setWidgetResizable(True)
+        self.scrollArea.setObjectName("scrollArea")
+        self.scrollAreaWidgetContents = QtWidgets.QWidget()
+        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 479, 229))
+        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
+
+        self.textBrowser_2 = QtWidgets.QTextBrowser(self.scrollAreaWidgetContents)
+        self.textBrowser_2.setGeometry(QtCore.QRect(0, 0, 481, 231))
+        self.textBrowser_2.setObjectName("textBrowser_2")
+        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
+
+        self.idxPhoto = 0
+        self.photos = content[11]
+        self.label_5 = QtWidgets.QLabel(self.centralwidget)
+        if len(self.photos)!=0:
+            self.label_5.setGeometry(QtCore.QRect(230, 10, 311, 211))
+            self.label_5.setText("")
+            img = QtGui.QImage()
+            img.loadFromData(self.photos[self.idxPhoto])
+            self.label_5.setPixmap(QtGui.QPixmap.fromImage(img))
+            self.label_5.setScaledContents(True)
+            self.label_5.setObjectName("label_5")
+        else:
+            self.label_5.setGeometry(QtCore.QRect(340, 10, 311, 211))
+            font = QtGui.QFont()
+            font.setPointSize(16)
+            self.label_5.setText("No Photos")
+            self.label_5.setFont(font)
+
+        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
+        self.pushButton_2.setGeometry(QtCore.QRect(20, 10, 75, 23))
+        self.pushButton_2.setObjectName("pushButton_2")
+
+        self.frame_2 = QtWidgets.QFrame(self.centralwidget)
+        self.frame_2.setGeometry(QtCore.QRect(10, 230, 781, 81))
+        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
+        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
+        self.frame_2.setObjectName("frame_2")
+
+        self.pushButton = QtWidgets.QPushButton(self.frame_2)
+        self.pushButton.setGeometry(QtCore.QRect(660, 20, 111, 41))
+        self.pushButton.setObjectName("pushButton")
+        self.pushButton.clicked.connect(self.loadPesanDialog)
+
+        self.label_3 = QtWidgets.QLabel(self.frame_2)
+        self.label_3.setGeometry(QtCore.QRect(520, 22, 120, 20))
+        self.label_3.setObjectName("label_3")
+
+        self.label_4 = QtWidgets.QLabel(self.frame_2)
+        self.label_4.setGeometry(QtCore.QRect(540, 45, 81, 20))
+        self.label_4.setObjectName("label_4")
+
+        self.label = QtWidgets.QLabel(self.frame_2)
+        self.label.setGeometry(QtCore.QRect(10, 20, 211, 41))
+        font = QtGui.QFont()
+        font.setPointSize(24)
+        self.label.setFont(font)
+        self.label.setObjectName("label")
+
+        self.widget = QtWidgets.QWidget(self.frame_2)
+        self.widget.setGeometry(QtCore.QRect(240, 35, 281, 16))
+        self.widget.setObjectName("widget")
+
+        self.label_6 = QtWidgets.QLabel(self.widget)
+        self.label_6.setGeometry(QtCore.QRect(10, 0, 61, 16))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.label_6.setFont(font)
+        self.label_6.setObjectName("label_6")
+
+        self.label_7 = QtWidgets.QLabel(self.widget)
+        self.label_7.setGeometry(QtCore.QRect(80, 0, 61, 16))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.label_7.setFont(font)
+        self.label_7.setObjectName("label_7")
+
+        self.label_8 = QtWidgets.QLabel(self.widget)
+        self.label_8.setGeometry(QtCore.QRect(150, 0, 61, 16))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.label_8.setFont(font)
+        self.label_8.setObjectName("label_8")
+
+        self.label_9 = QtWidgets.QLabel(self.widget)
+        self.label_9.setGeometry(QtCore.QRect(220, 0, 61, 16))
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.label_9.setFont(font)
+        self.label_9.setObjectName("label_9")
+
+        self.line = QtWidgets.QFrame(self.frame_2)
+        self.line.setObjectName(u"line")
+        self.line.setGeometry(QtCore.QRect(0, 70, 781, 16))
+        self.line.setFrameShape(QtWidgets.QFrame.HLine)
+        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
+
+        self.line_2 = QtWidgets.QFrame(self.frame_2)
+        self.line_2.setObjectName(u"line_2")
+        self.line_2.setGeometry(QtCore.QRect(0, 0, 781, 16))
+        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
+        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
+
+        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
+        self.pushButton_3.setObjectName(u"pushButton_3")
+        self.pushButton_3.setGeometry(QtCore.QRect(580, 110, 75, 23))
+        self.pushButton_3.clicked.connect(self.nextPicture)
+
+        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
+        self.pushButton_4.setObjectName(u"pushButton_4")
+        self.pushButton_4.setGeometry(QtCore.QRect(130, 110, 75, 23))
+        self.pushButton_4.clicked.connect(self.prevPicture)
+
+        self.widget.raise_()
+        self.pushButton.raise_()
+        self.label_3.raise_()
+        self.label_4.raise_()
+        self.label.raise_()
+        self.line.raise_()
+        self.line_2.raise_()
+
+        self.line_3 = QtWidgets.QFrame(self.centralwidget)
+        self.line_3.setObjectName(u"line_3")
+        self.line_3.setGeometry(QtCore.QRect(10, 560, 781, 16))
+        self.line_3.setFrameShape(QtWidgets.QFrame.HLine)
+        self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken)
+        MainWindow.setCentralWidget(self.centralwidget)
+        self.statusbar = QtWidgets.QStatusBar(MainWindow)
+        self.statusbar.setObjectName("statusbar")
+        MainWindow.setStatusBar(self.statusbar)
+
+        self.retranslateUi(MainWindow,content,kategori)
+        QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+    def retranslateUi(self, MainWindow, content, kategori):
+        _translate = QtCore.QCoreApplication.translate
+        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+
+        syarat = content[3] if content[3] != None else "Tidak ada syarat"
+        htmlSyarat = '''<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n
+<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n
+p, li {0}\n
+</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n
+<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:12pt;\">{val}</span></p></body></html>'''.format("{white-space: pre-wrap;}",val=syarat)
+        self.textBrowser.setHtml(_translate("MainWindow", htmlSyarat))
+        
+        self.label_2.setText(_translate("MainWindow", "Syarat"))
+        
+        desc = content[5] if content[5] != None else "-"
+        contact = content[9]
+        htmlInfo = """<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n
+<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n
+p, li {0}\n
+</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n
+<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:20pt;\">Deskripsi</span></p>\n
+<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:12pt;\">{descVal}</span></p>\n
+<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;\"><br /></p>\n
+<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;\"><br /></p>\n
+<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt;\"><br /></p>\n
+<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:20pt;\">Contact Person</span></p>\n
+<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:12pt;\">{contactVal}</span></p></body></html>""".format("{ white-space: pre-wrap; }",descVal=desc,contactVal=contact)
+        self.textBrowser_2.setHtml(_translate("MainWindow", htmlInfo))
+        
+        self.pushButton_2.setText(_translate("MainWindow", "Back"))
+        
+        if not self.isMember:
+            self.pushButton.setEnabled(False)
+            self.pushButton.setText(_translate("MainWindow", "Edit Acara"))
+        else:
+            self.pushButton.setText(_translate("MainWindow", "Pesan Tiket"))
+        
+        tanggal = content[6].strftime("%d %b %Y %H:%M:%S")
+        self.label_3.setText(_translate("MainWindow", tanggal))
+        
+        kuota = "Kuota: " + str(content[12]) + "/" + str(content[4])
+        self.label_4.setText(_translate("MainWindow", kuota))
+        
+        nama = content[1]
+        self.label.setText(_translate("MainWindow", nama))
+        
+        kat1 = kategori[0]
+        self.label_6.setText(_translate("MainWindow", kat1))
+        
+        kat2 = kategori[1] if len(kategori) > 1 else ""
+        self.label_7.setText(_translate("MainWindow", kat2))
+        
+        kat3 = kategori[2] if len(kategori) > 2 else ""
+        self.label_8.setText(_translate("MainWindow", kat3))
+        
+        kat4 = kategori[3] if len(kategori) > 3 else ""
+        self.label_9.setText(_translate("MainWindow", kat4))
+
+        self.pushButton_3.setText(_translate("MainWindow", u"Next", None))
+        self.pushButton_4.setText(_translate("MainWindow", u"Prev", None))
+
+    def nextPicture(self):
+        self.idxPhoto = self.idxPhoto +1 if self.idxPhoto +1<len(self.photos) else 0
+        img = QtGui.QImage()
+        img.loadFromData(self.photos[self.idxPhoto])
+        self.label_5.setPixmap(QtGui.QPixmap.fromImage(img))
+    
+    def prevPicture(self):
+        self.idxPhoto = self.idxPhoto -1 if self.idxPhoto -1>=0 else len(self.photos)-1
+        img = QtGui.QImage()
+        img.loadFromData(self.photos[self.idxPhoto])
+        self.label_5.setPixmap(QtGui.QPixmap.fromImage(img))
+
+    def loadPesanDialog(self):
+        first = True
+        pesan_dialog = PesanDialog(first)
+
+        while pesan_dialog.exec():
+            self.quantity = pesan_dialog.getQuantity()
+            conn = db.init_db()
+
+            if self.quantity>0 and pesan.pesanTiket(conn,self.idAcara,self.idMember,self.quantity):
+                _translate = QtCore.QCoreApplication.translate
+                self.pushButton.setEnabled(False)
+                self.pushButton.setText(_translate("MainWindow", "Pemesanan Berhasil!"))
+                break
+            else:
+                first = False
+                pesan_dialog = PesanDialog(first)
+
+class PesanDialog(QtWidgets.QDialog, Ui_Dialog):
+    def __init__(self,first,parent=None):
+        super().__init__(parent)
+        self.setupUi(self, first)