Anda di halaman 1dari 50

LAPORAN PRAKTIK KERJA LAPANGAN (PKL)

PERUSAHAAN/INDUSTRI

PT. PLN INDONESIA PUSMANPRO UPMK II

Implementasi Timesheet API dan Monitoring Log Menggunakan NEST.js,


Grafana dan Loki

Diajukan untuk memenuhi sebagian persyaratan kurikulum sarjana

Disusun oleh:
Ar Rafii Alfa
NIM: 175150407111024

PROGRAM STUDI SISTEM INFORMASI


DEPARTEMEN SISTEM INFORMASI
FAKULTAS ILMU KOMPUTER
UNIVERSITAS BRAWIJAYA
MALANG
2023
PENGESAHAN

LAPORAN PRAKTIK KERJA LAPANGAN (PKL)

PERUSAHAAN/TNDUSTRT

PT. PLN INDONESIA PUSMANPRO UPMK II

IMPLEMENTASITIMESHEET API DAN MONITORING LOG MENGGUNAKAN NEST.JS,


GRAFANA DAN LOKI

Diajukan untuk memenuhi sebagian persyaratan

Kurikulum Sarjana Program Studi Sistem lnformasi

Bidang Pengembangan perangkat lunak API

Disusun oleh:

Ar Rafii Alfa NIM: 175150407LLL024

Praktik Kerja Lapangan ini dilaksanakan


padaT Agustus sampai dengan 7
Oktober 2023
Telah diperiksa dan disetujui oleh:

i,

rtemen Sistem lnformasi Dosen ng

198309222012121003 NrP/NrK:
PERNYATAAN ORISINALITAS

Saya menyatakan dengan sebenar-benarnya bahwa sepanjang saya, di dalam laporan


PKL ini tidak terdapat karya ilmiah yang pernah diajukan oleh orang lain dalam kegiatan
akademik di suatu perguruan tinggi, dan tidak terdapat karya atau pendapat yang
pernah ditulis atau diterbitkan oleh orang lain, kecuali yang secara tertulis disitasi dalam
naskah ini dan disebutkan dalam daftar pustaka.

Apabila ternyata di dalam laporan PKL ini terbukti terdapat unsur-unsur plagiasi, saya
bersedia PKL ini digugurkan, serta diproses sesuai dengan peraturan perundang
undangan yang berlaku (UU No. 20 tahun 2003, Pasal 25 Ayat 2 dan pasal 70).

Malang, 29 November 2023

Ar Rafii Alfa
NIM. 175150407111024

ii
KATA PENGANTAR

Puji syukur penulis panjatkan ke hadirat Allah SWT yang berkat rahmat dan
karunianya penulis dapat menyelesaikan kegiatan hingga pelaporan Praktik Kerja
Lapangan dengan baik di Departemen Sistem Informasi Fakultas Ilmu Komputer
Universitas Brawijaya.

Penyelesaian kegiatan PKL dan laporan ini tidak lepas dari dukungan, doa dan
bantuan dari banyak pihak lainnya sehingga penulis ingin menyampaikan rasa hormat
dan terimakasih kepada:

1. Kedua orang tua penulis yang senantiasa memberikan doa dan dukungan kepada
penulis
2. Bapak Buce Trias Hanggara, S.Kom., M.Kom. Selaku Dosen Pembimbing PKL.
3. Bapak Ir. Issa Arwani, S.Kom., M.Sc. selaku Ketua Departemen Sistem Informasi
Fakultas Ilmu Komputer Universitas Brawijaya
4. Bapak Yusi Tyroni Mursityo, S.Kom., M.AB. selaku Ketua Program Studi Sistem
Informasi Fakultas Ilmu Komputer Universitas Brawijaya.
5. Seluruh staf PT. PUSMANPRO UPMK II yang telah memberikan bantuannya
dalam penyelesaian laporan ini.
6. Seluruh civitas akademik Sistem Informasi Universitas Brawijaya yang telah
banyak memberi bantuan dan dukungan selama penyelesaian laporan PKL ini.

iii
ABSTRAK

Pada kegiatan Praktik Kerja Lapangan kali ini, penulis berkesempatan melakukan
pengembangan API pada metode pencatatan dan pelaporan waktu jam kerja pegawai
di PT. PLN PUSMANPRO UPMK II. Dalam praktiknya, pencatatan jam kerja pegawai
dibuat secara manual pada dokumen timesheet di aplikasi Excel. Dokumen tersebut
kemudian akan digunakan oleh perusahaan dalam proses penggajian pegawai.
Digitalisasi dokumen Timesheet melalui pengembangan API dilakukan untuk
meningkatkan efisiensi dan mengurangi faktor kesalahan manusia. Timesheet API
tersebut dibangun menggunakan framework Nest.js dan dilengkapi dengan sistem
monitoring log menggunakan Grafana dan Loki yang memudahkan pengawasan melalui
visualisasi log dan fitur query log. Pengembangan Timesheet API menghasilkan 15 end-
point/rute yang dapat digunakan oleh user yang telah terotentikasi. Selain menyediakan
fungsi pengelolaan data Timesheet, API tersebut juga menyediakan fitur unduh
timesheet dalam bentuk file Excel dengan format timesheet yang sebelumnya sudah
digunakan perusahaan. Timesheet API diuji menggunakan pengujian fungsional dengan
teknik Blackbox Testing, dimana penulis menguji setiap 15 end-poin API tersebut tanpa
memperhatikan kode implementasi dari API. Dari hasil pengujian tersebut didapatkan
hasil bahwa setiap end-point dapat berjalan sesuai rancangan tanpa bug ataupun error.

Kata kunci: Timesheet, Pengembangan API, Sistem Monitoring Log, Nest.js

iv
ABSTRACT

In this fieldwork activity, the author had the opportunity to develop an API for
employee work hour recording and reporting method at PT. PLN PUSMANPRO UPMK II.
In practice, recording and reporting is done manually through the use of Timesheet
documents made in Excel which then used in the company payroll process. Digitalization
through API is done to improve efficiency and reduce human error in the timesheet
creation and management process. The Timesheet API is made using Nest.js framework
and equipped with a log monitoring solution using Grafana and Loki. This log monitoring
solution facilitate the supervision of the newly created Timesheet API through log
visualization and query capability. The development of the Timesheet API produces 15
end points/route that’s available for an authenticated user. In addition to the
management of timesheet, the API also provide an export function that user can use to
download timesheet in previously used Excel format. The API is tested using functional
testing with blackbox testing technique, where the author tests all 15 end points without
considering the code implementation of the API. The test shows that each end points
are working correctly without bug and error.

Keywords: Timesheet, API Development, Monitoring Log System, Nest.js

v
DAFTAR ISI

LAPORAN PRAKTIK KERJA LAPANGAN (PKL).................................................................... i


PENGESAHAN................................................................................................................... i
PERNYATAAN ORISINALITAS ........................................................................................... ii
KATA PENGANTAR ..........................................................................................................iii
ABSTRAK .........................................................................................................................iv
ABSTRACT ....................................................................................................................... v
DAFTAR ISI ......................................................................................................................vi
DAFTAR TABEL .............................................................................................................. viii
DAFTAR GAMBAR ...........................................................................................................ix
DAFTAR LAMPIRAN..........................................................................................................x
BAB 1 PENDAHULUAN .................................................................................................... 1
1.1 Latar Belakang ............................................................................................... 1
1.2 Rumusan Masalah ......................................................................................... 1
1.3 Tujuan ............................................................................................................ 2
1.4 Manfaat ......................................................................................................... 2
1.5 Sistematika Pembahasan .............................................................................. 2
BAB 2 PROFIL PERUSAHAAN ........................................................................................... 3
2.1 PT. PLN Indonesia PUSMANPRO ................................................................... 3
2.2 Visi dan Misi .................................................................................................. 3
2.3 Struktur Organisasi ........................................................................................ 4
BAB 3 TINJAUAN PUSTAKA ............................................................................................. 5
3.1 Studi Literatur................................................................................................ 5
3.2 Landasan Teori .............................................................................................. 5
3.2.1 Timesheet ............................................................................................. 5
3.2.2 Timesheet API menggunakan Nest.js ................................................... 5
3.2.3 Typescript ............................................................................................. 5
3.2.4 Log monitoring menggunakan Grafana dan Loki ................................. 6

vi
3.2.5 Docker ................................................................................................... 6
BAB 4 METODE PELAKSANAAN ...................................................................................... 7
4.1 Tahapan pelakasanaan .................................................................................. 7
4.2 Alat Kerja ....................................................................................................... 7
BAB 5 PERANCANGAN DAN IMPLEMENTASI .................................................................. 9
5.1 Perancangan end-point API ........................................................................... 9
5.2 Class Diagram .............................................................................................. 12
5.3 Entity Relationship Diagram (ERD) .............................................................. 14
5.4 Sistem monitoring log ................................................................................. 17
5.5 Implementasi............................................................................................... 18
5.5.1 Timesheet Controller .......................................................................... 20
5.5.2 Timesheet Service............................................................................... 23
5.5.3 Sistem Monitoring Log........................................................................ 26
BAB 6 PENGUJIAN ......................................................................................................... 29
6.1 Pengujian Fungsionalitas Otentikasi ........................................................... 29
6.2 Pengujian rute timesheet, timesheet detail dan holiday............................ 30
BAB 7 KESIMPULAN DAN SARAN .................................................................................. 34
7.1 Kesimpulan .................................................................................................. 34
7.2 Saran ............................................................................................................ 34
DAFTAR REFERENSI ....................................................................................................... 35
LAMPIRAN..................................................................................................................... 36

vii
DAFTAR TABEL

Tabel 4.1 Alat Kerja ........................................................................................................... 7


Tabel 5.1 Penjelasan Endpoin Timesheet API ................................................................ 10
Tabel 5.2 Penjelasan Entitas ........................................................................................... 15
Tabel 5.3 Penjelasan Implementasi Modul .................................................................... 18
Tabel 5.4 Implementasi Modul Timesheet ..................................................................... 19
Tabel 5.5 Penjelasan Argumen Modul ........................................................................... 20
Tabel 5.6 Implementasi Timesheet Controller ............................................................... 20
Tabel 5.7 Implementasi Timesheet Service .................................................................... 23
Tabel 5.8 Implementasi docker-compose.yaml ............................................................. 26
Tabel 6.1 Pengujian fungsi otentikasi ............................................................................. 29
Tabel 6.2 Pengujian Rute Timesheet, Timesheet Detail dan Holiday ............................ 31

viii
DAFTAR GAMBAR

Gambar 2.1 Struktur Organisasi ....................................................................................... 4


Gambar 5.1 Endpoin Timesheet API................................................................................. 9
Gambar 5.2 Class Diagram Timesheet API ..................................................................... 13
Gambar 5.3 ERD Timesheet API ..................................................................................... 15
Gambar 5.4 Sistem Monitoring Log................................................................................ 17
Gambar 5.5 Implementasi Modul .................................................................................. 18
Gambar 5.6 Sistem Monitoring Log................................................................................ 26

ix
DAFTAR LAMPIRAN

Lampiran A Logbook aktivitas harian PKL 1.................................................................... 36


Lampiran B Logbook aktivitas harian PKL 2 .................................................................... 37
Lampiran C Dokumen kontrak PKL ................................................................................. 38
Lampiran D Dokumen pernyataan selesai PKL ............................................................... 39

x
BAB 1 PENDAHULUAN

1.1 Latar Belakang


Pada praktik kerja lapangan kali ini, penulis berkesempatan melakukan
pengembangan RESTful API menggunakan NestJS dalam rangka optimalisasi manajemen
timesheet di lingkungan perusahaan. Timesheet sendiri adalah salah satu metode
pelaporan dan perhitungan jam kerja pegawai yang digunakan oleh PLN PUSMANPRO
UPMK II dalam urusan penggajian pegawai. Dalam praktiknya, timesheet dibuat manual
menggunakan aplikasi Excel, lalu diisi setiap harinya oleh pegawai untuk kemudian
dijadikan pertimbangan dalam proses penggajian pada akhir bulan.
Optimalisasi manajemen timesheet menjadi Aplikasi berbasis digital terbukti
dapat meningkatkan efisiensi, dan mengurangi waktu serta tenaga dalam pembuatan
dan pelaporan timesheet (Alicea Dominguez, 2014). Aplikasi timesheet berbasis digital
juga memungkinkan pengelolaan data timesheet yang lebih baik dan mengurangi
potensi kesalahan manusia.
Pemilihan RESTful API sebagai bagian dari solusi digitalisasi timesheet juga
menjadi salah satu strategi integrasi perusahaan. Menurut (Patni, 2017) Pembangunan
API terpisah memungkinkan aplikasi timesheet yang dibuat dapat berintegrasi dengan
berbagai platform dan aplikasi lainnya didalam ataupun diluar lingkungan perusahaan.
Lebih lanjut lagi, ia juga mengatakan pembuatan API secara internal dapat
meningkatkan produktifitas dari developer dengan memaksimalkan penggunaan ulang
aplikasi serta memastikan konsistensi dari aplikasi lain yang akan dibuat
Dalam pembangunan perangkat lunak, monitoring log muncul sebagai elemen
penting dalam mendukung keberlanjutan dan keamanan perangkat lunak. Log dapat
membantu developer melakukan kegiatan diagnosis dalam menemukan bug, melacak
kinerja aplikasi secara real-time, mendeteksi potensi masalah, dan meningkatkan
keamanan melalui analisis log (Barik et al., 2016). Karena alasan tersebut, sistem
monitoring log perlu dibangun bersama dengan pembangunan API Timesheet.
Penggunaan Grafana dan Loki sebagai sistem monitoring log memberikan kemampuan
analisis log melalui visualisasi data dan kemampuan query log pada dasbor. Dasbor
tersebut juga dapat dikonfigurasi untuk memberikan peringatan terhadap suatu baris
log yang mungkin muncul saat aplikasi berjalan (Grafana.com, n.d.).
Dengan demikian, pengalaman praktik kerja lapangan ini tidak hanya mencakup
aspek teknis pembuatan RESTful API dengan NestJS, tetapi juga melibatkan pemahaman
tentang kebutuhan perusahaan dalam meningkatkan efisiensi, integrasi, dan
pemantauan kinerja serta keamanan API timesheet.

1.2 Rumusan Masalah


Rumusan masalah yang didapat dari latar belakang diatas adalah sebagai berikut.
1. Bagaimana rancangan dan implementasi API Timesheet?
2. Bagaimana rancangan dan implementasi Monitoring log API Timesheet?

1
1.3 Tujuan
Tujuan yang ingin dicapai dalam PKL ini berdasarkan perumusan masalah adalah
sebagai berikut.
1. Membangun Timesheet API yang dapat digunakan oleh aplikasi dalam perusahaan
untuk mengelola data timesheet pegawai
2. Membangun sistem monitoring log pada API Timesheet untuk meningkatkan
pemantauan kinerja dan keamanan API.

1.4 Manfaat
Dengan adanya PKL ini diharapkan PT. PLN PUSMANPRO UPMK II dapat
mengintegrasikan dan menggunakan API Timesheet dalam aplikasi dan sistem
perusahaan.

1.5 Sistematika Pembahasan


Sistematika pembahasan laporan ini terdiri dari beberapa tahap, yaitu pendahuluan,
profil objek laporan, tinjauan Pustaka, metode pelaksanaan, perancangan dan
implementasi serta penutup dan saran.
BAB I PENDAHULUAN
Bab pendahuluan menjelaskan mengenai latar belakang, rumusan masalah tujuan dan
manfaat penelitian, ruang lingkup penelitian dan sistematika pembahasan.
BAB II PROFIL PT. PLN PUSMANPRO
Bab Landasan kepustakaan menjelaskan teori dan konsep dan hasil penelitian terdahulu
serta metode penelitian yang berkaitan dengan penelitian yang dilakukan
BAB III TINJAUAN PUSTAKA
Bab ini menjelaskan mengenai Pustaka dan Landasan teori yang digunakan dalam
pengembangan Timesheet API
BAB IV METODE PELAKSANAAN
Bab ini menjelaskan tahapan pelaksanaan dari pengembangan Timesheet API serta
daftar alat kerja yang digunakan.
BAB V PERANCANGAN DAN IMPLEMENTASI
Bab perancangan dan implementasi menjelaskan perancangan Timesheet API melalui
perancangan sistem, perancangan kelas hingga perancangan data dan implementasi
Timesheet API menggunakan framework Nest.js
BAB VI PENGUJIAN
Pengujian ini akan dilaksanakan untuk memastikan API yang dibuat bekerja sesuai
fungsinya dan terbebas dari kesalahan
BAB VII KESIMPULAN DAN PENUTUP
Bab penutup dan saran menjelaskan kesimpulan dan hasil dari laporan yang dibuat.
2
BAB 2 PROFIL PERUSAHAAN

2.1 PT. PLN Indonesia PUSMANPRO


PT. PLN Pusat Manajemen Proyek UPMK II adalah salah satu unit pelaksana PLN
PUSMANPRO yang berlokasi di kota Surabaya dengan wilayah kerja yang meliputi Jawa
Timur, Jawa Tengah, Yogyakarta, Bali, Nusa Tenggara Timur, Nusa Tenggara Barat,
Kalimantan Selatan, Kalimantan Tengah, Kalimantan Timur, dan Kalimantan Utara.
Lingkup tugas PLN Pusmanpro UPMK II meliputi manajemen konstruksi dan quality
assurance/quality control, supervisi konstruksi untuk proyek pembangkit, transmisi,
gardu induk dan proyek OHC PLTU Bima.

2.2 Visi dan Misi


Dalam menyelenggarakan perusahaan, PT. PLN PUSMANPRO UPMK II memiliki visi
dan misi sebagai berikut.
• Visi
Menjadi Unit Jasa Manajemen Proyek yang terpercaya, professional dengan
layanan yang ekselen di Asia Tenggara dan menjadi pilihan pelanggan untuk
solusi pengelolaan project.
• Misi
1. Menjalankan kegiatan usaha jasa manajemen proyek yang berorientasi pada
kepuasan pemangku kepentingan, etika bisnis dan tata Kelola perusahaan yang
baik (good corporate governance)
2. Melaksanakan usaha jasa manjemen proyek untuk meningkatkan kualitas
industry ketenagalistrikan dan mendorong pengembangan bidang usaha jasa
manjemen proyek

3
2.3 Struktur Organisasi

Gambar 2.1 Struktur Organisasi

Gambar 2.1 merupakan bagan struktur organisasi PT. PLN Pusmanpro UPMK II.
Pada PKL kali ini, penulis berkesempatan bekerja di bagian unit pelaksana yang
bertugas sebagai unit quality control/quality assurance untuk pengembangan proyek
pada PLN Pusmanpro.

4
BAB 3 TINJAUAN PUSTAKA

3.1 Studi Literatur


Pada tahap ini, penulis melakukan pencarian referensi terkait pengembangan
Timesheet API yang akan dilaksanakan. Penulis menggunakan referensi dalam
pengembangan API melalui halaman web resmi teknologi yang bersangkutan.
(Nestjs.com, n.d.) memberikan penjelasan komprehensif seputar framework Nest.js dan
pengembangan aplikasi menggunakan framework tersebut, termasuk beberapa best-
practice yang dapat diterapkan dalam pengembangan. Selain nestjs.com sebagai
framework utama pengembangan, penulis juga mengambil referensi dari beberapa
halaman web resmi lainnya seperti (Grafana.com, n.d.; typeorm.io, n.d.;
typescriptlang.org, n.d.)

3.2 Landasan Teori


3.2.1 Timesheet
Pada PLN Pusmanpro UPMK II, timesheet merujuk kepada sebuah alat pengukur
produktifitas pegawai melalui pencatatan jam kerja selama satu bulan yang digunakan
dalam proses penggajian. Setiap timesheet akan memiliki 2 supervisor timesheet berupa
site inspector dan checker II yang bertugas memastikan keabsahan dari timesheet
tersebut. Setiap Timesheet akan memiliki beberapa detail seperti jam masuk pegawai,
jam keluar pegawai, proyek terkait, dan data lainnya.

3.2.2 Timesheet API menggunakan Nest.js


Dilansir dari halaman web (nestjs.com, n.d.) Nestjs adalah sebuah framework yang
digunakan untuk membangun aplikasi serverside yang dibangun diatas framework HTTP
Express. Dalam PKL kali ini, Nestjs digunakan sebagai framework yang membantu
penulis membangun Timesheet API karena Nestjs memiliki beberapa kelebihan, seperti
tools bawaan yang lengkap dan mudah digunakan untuk pengembangan API,
ekstensibilitas dan skalabilitas yang tinggi serta dukungan pengembangan menggunakan
Typescript. Ekstensibilitas yang ditawarkan oleh framework Nestjs memudahkan penulis
dalam menambahkan modul – modul, baik dari penulis sendiri ataupun dari pihak ke
tiga.

3.2.3 Typescript
Pada dasarnya Nestjs menggunakan Bahasa pemrograman Javascript. Javascript
adalah Bahasa pemrograman scripting yang mempunyai karakteristik loosely typed,
yang berarti variable tidak perlu di deklarasikan untuk tipe data tertentu. Hal ini
mempunyai beberapa keunggulan terutama dalam segi penulisan kode yang lebih cepat.
Namun, karakteristik loosely typed tersebut dapat menimbulkan beberapa masalah
dalam pengembangan seperti mudahnya developer untuk menempatkan nilai pada
variable yang bukan tempatnya yang akan menimbulkan berbagai macam kesalahan
program (typescriptlang.org/docs/handbook, n.d.). Untungnya, framework Nestjs
mendukung pengembangan menggunakan Typescript, sebuah Bahasa pemrograman
5
yang memberikan ekstensibilitas ke bahasa pemrograman Javascript berupa type safety
yang akan meminimalisir terjadinya kesalahan yang diakibatkan oleh sifat loosely typed
dari javascript.

3.2.4 Log monitoring menggunakan Grafana dan Loki


Dilansir dari situs resmi (Grafana.com, n.d.) Grafana adalah sebuah alat
monitoring dan analisis open-source yang dapat digunakan untuk seluruh database.
Grafana dapat menyediakan visualisasi data dalam berbagai bentuk diagram, tabel
ataupun text dan angka dan menyajikannya dalam suatu dasbor. Grafana digunakan
pada PKL ini untuk memvisualisasikan data Log yang dihasilkan oleh API Timesheet yang
dibuat. Log yang dibuat oleh API ini terlebih dahulu harus diproses dan dikirim ke aplikasi
Grafana menggunakan sebuah sistem log aggregator yang dinamakan Loki. Log yang
ditampilkan di dasbor Grafana kemudian akan digunakan oleh admin untuk mengecek
kegiatan dan keamanan pada API yang dibangun

3.2.5 Docker
Pada PKL kali ini, sistem monitoring log Grafana dan Loki dijalankan melalui
Docker. Dilansir dari halaman web resmi dokumentasi Docker (docs.docker.com, n.d.),
Docker adalah platform yang digunakan untuk mengembangkan, menyebarkan (deploy),
dan menjalankan aplikasi melalui containers. Containers tersebut memungkinkan proses
enkapsulasi aplikasi Grafana dan Loki beserta dependency aplikasi tersebut sehingga
menjamin konsistensi di berbagai lingkungan perangkat lunak seperti windows, mac,
ubuntu, dll. Docker juga memudahkan penulis untuk melakukan instalasi Grafana dan
Loki melalui file YAML dengan tools Docker Compose.

6
BAB 4 METODE PELAKSANAAN

4.1 Tahapan pelakasanaan


Tahapan pelaksanaan implementasi Timesheet API dari awal sampai akhir dilaksanakan
sebagai berikut.
1. Studi literatur
Pada tahap ini peneliti mengumpulkan literatur terkait pengembangan API dan
dokumentasi - dokumentasi terkait mekanisme pembuatan timesheet yang sudah
ada.
2. Perancangan sistem
Pada tahap ini penulis, melakukan perancangan sistem yang akan dibuat.
perancangan meliputi beberapa perancangan dan pemodelan yaitu perancangan
arsitektur API, perancangan data, hingga perancangan kelas yang digunakan pada
API tersebut.
3. Implementasi sistem
Pada tahap ini penulis memulai implementasi API sesuai dengan perancangan yang
telah dibuat. peneliti memulai implementasi dengan pengaturan database hingga
penulisan kode kelas pada API
4. Pengujian
Pengujian dilakukan agar memastikan API yang dibuat dapat berjalan sesuai tujuan.
Pengujian dilakukan menggunakan teknik pengujian black box untuk menguji
seluruh end-point Timesheet API.
5. Kesimpulan
Tahap ini adalah tahap terakhir dimana penulis menyimpulkan kegiatan
pengembangan API Timesheet tersebut.

4.2 Alat Kerja


Alat yang digunakan selama pengembangan API ini dapat dilihat pada Tabel 4.1.
Tabel 4.1 Alat Kerja
Tools Version Description
Nodejs 18.17.1 Runtime environment yang digunakan untuk
menjalankan framework nestjs
Nestjs 10.0.0 Framework yang digunakan untuk
mengembangkan Timesheet API
Nestjs/Swagger 7.1.10 Alat yang digunakan untuk mendokumentasi
dan mengetest API yang dibuat

7
PostgreSQL 15.4 Basis data yang digunakan Timesheet API
untuk menyimpan data timesheet dan data
lainnya yang berkaitan dengan timesheet
Visual Studio Code 1.84.2 Code editor yang digunakan untuk menuliskan
kode program
Docker Windows 24.0.5 Sebuah container yang digunakan untuk
menjalankan Log monitoring system Grafana
dan Loki

8
BAB 5 PERANCANGAN DAN IMPLEMENTASI

5.1 Perancangan end-point API


Timesheet API yang akan dibuat memiliki 2 fungsi utama yaitu fungsi
Authentication dan fungsi pengelolaan Timesheet. Fungsi authentication merupakan
fungsi yang memastikan API hanya dapat digunakan oleh pihak tertentu yang telah
dikonfigurasi. Sedangkan fungsi pengelolaan timesheet mencakup fungsi pembuatan
timesheet, pembaruan data timesheet, hingga penghapusan data timesheet. Fungsi
pengelolaan timesheet terbagi menjadi fungsi pengelolaan Timesheet, fungsi
pengelolaan Timesheet Detail dan fungsi konverter timesheet ke file excel. Untuk
menjalankan kedua fungsi utama tersebut, Timesheet API akan menyediakan beberapa
end-point yang dapat digunakan oleh pengguna API. Endpoint - endpoint tersebut
dijelaskan pada Gambar 5.1 dan Tabel 5.1.

Gambar 5.1 Endpoin Timesheet API


Gambar 5.1 merupakan visualisasi end-point pada Timesheet API. End-point API
adalah sebuah alamat digital yang digunakan API untuk memberi akses fungsi API
kepada pengguna API. Endpoint tersebut kemudian dapat diakses oleh user
menggunakan metode HTTP Get, Post, Put, Patch dan Delete untuk mengambil data dari
9
server dan mengirim data ke server. Timesheet API yang dibuat menyediakan 4 kategori
end-point, yaitu Auth, Timesheet, Timesheet Detail dan Holiday dengan metode GET
untuk mengambil data dan POST untuk mengirim data. Penjelasan setiap end-point
tersebut dapat dilihat pada Tabel 5.1.
Tabel 5.1 Penjelasan Endpoin Timesheet API
Fungsi Alamat Metode Parameter Penjelasan
Auth /auth/login POST Email & Seluruh end-point pada Timesheet
Password API hanya dapat diakses oleh
pengguna yang telah terautentikasi.
Metode log-in akan memberikan
jalan kepada user untuk dapat
terautentikasi pada setiap request.
Timesheet /timesheet/find GET - End-point ini akan memberikan
seluruh data timesheet yang dimiliki
oleh user yang terautentikasi
/timesheet/findOne GET Id/period End-point ini akan memberikan
data timesheet user yang
terautentikasi berdasarkan id
timesheet atau periode timesheet
tertentu. Period merupakan
periode timesheet tersebut dengan
format ‘YYYY:MM’
/timesheet/create POST Period, Endpoint ini memberikan fungsi
site_inspector kepada user untuk membuat
_id, timesheet baru untuk user tersebut.
checker_ii_id Site inspector id dan checker ii id
adalah id dari user yang bertugas
sebagai site inspector dan checker
untuk timesheet user tersebut.
Data timesheet yang dibuat akan
berstatus ‘WAITING’ yang berarti
timesheet sedang menunggu
pengesahan oleh atasan user
tersebut
/timesheet/update POST Id, data Memberikan fungsi untuk
timesheet memperbarui data timesheet
lainnya.
/timesheet/delete POST Id Memberikan fungsi untuk
menghapus timesheet yang
memiliki id sesuai dengan id yang
diberikan
/timesheet/conver- GET id Fungsi ini akan memberikan return
to-excel value berupa timesheet dalam
bentuk file Excel yang dapat
diunduh oleh pengguna API
Timesheet /timesheet- GET id Data timesheet detail adalah data
Detail detail/findOne rincian dari satu timesheet
tertentu.

10
Timesheet detail memiliki relasi
one-to-many dengan timesheet
dengan data timesheet memiliki
satu atau banyak timesheet-detail
Endpoint ini akan memberikan satu
data timesheet detail dari user yang
terautentikasi yang memiliki
timesheet dengan id yang sama
dengan id yang diberikan oleh
pengguna API
/timesheet- POST Timesheet_id, Endpoint ini memberikan fungsi
detail/create timesheet_per untuk membuat data timesheet
iod,data detail baru untuk timesheet
timesheet tertentu dari user yang
detail lainnya terautentikasi.
/timesheet- POST Id, data Endpoint ini memberikan fungsi
detail/update timesheet untuk memperbarui data timesheet
detail yang detail dari user yang terautentikasi
ingin
diperbarui
/timesheet- POST id Endpoint ini memberikan fungsi
detail/delete untuk menghapus data timesheet
detail dari user yang terautentikasi
/holiday/find GET Periode Timesheet akan menghitung data
timesheet jam masuk dan jam keluar dari
setiap pegawai pada setiap harinya
dalam menentukan produktivitas
pegawai tersebut. API yang dibuat
akan menyesuaikan proses
perhitungan tersebut dengan data
hari libur yang diinputkan oleh
admin. Endpoint /holiday/find akan
memberikan seluruh data hari libur
pada periode timesheet yang
diberikan oleh pengguna API
Holiday /holiday/create- POST Periode Endpoint /holiday/create-from-csv
from-csv timesheet, File memberikan fungsi memasukkan
csv dengan data hari libur pada periode
data hari libur timesheet tertentu ke dalam
pada satu Timesheet API menggunakan file
periode csv.
timesheet

11
5.2 Class Diagram
Timesheet API akan dibangun menggunakan framework Nest.js dengan pola
pemrograman berorientasi objek. Pada pemrograman berorientasi objek aplikasi
diprogram menggunakan beberapa kelas yang saling berkaitan. Kelas tersebut
kemudian dimodelkan kedalam diagram kelas untuk memudahkan perancangan dan
implementasi dan dapat dilihat pada Gambar 5.2.

12
Gambar 5.2 Class Diagram Timesheet API

13
Gambar 5.2 menjelaskan kumpulan kelas pada Timesheet API beserta atribut dan
fungsinya. Timesheet API juga akan menggunakan beberapa kode program dari pihak
ketiga yang direpresentasikan menggunakan kelas DatabaseModule, dan Logger yang
terletak pada bagian atas diagram kelas. DatabaseModule akan menggunakan library
pihak ketiga TypeORM yang digunakan untuk berinteraksi dengan basis data tanpa harus
menggunakan bahasa asal (native query) dari basis data tersebut dengan bantuan
method. Sedangkan kelas logger adalah kelas yang digunakan untuk mengimplementasi
proses monitoring log yang akan menyimpan aktifitas log kedalam file .log dalam folder
logs.

5.3 Entity Relationship Diagram (ERD)


Setelah end-point dan class diagram telah dirancang selanjutnya dilaksanakan
perancangan data. pada tahap ini, penulis memilih PostgreSQL sebagai basis data pada
Timesheet API yang digunakan. PostgreSQL adalah sistem manajemen basis data
relasional open-source yang memanfaatkan Structured Query Language (SQL) dalam
mengakses dan memanipulasi data.

14
Gambar 5.3 ERD Timesheet API
Gambar 5.3 menunjukkan Entity Relationship Diagram (ERD) dari database
Timesheet API yang akan dibuat. Entity pada diagram tersebut merepresentasikan tabel
beserta kolom dari database PostgreSQL yang digunakan. Penjelasan dari setiap entitas
yang terdapat pada ERD tersebut dapat dilihat pada Tabel 5.2.
Tabel 5.2 Penjelasan Entitas
Entitas Deskripsi
User Tabel yang menyimpan data user seperti
nama, email dan password.
Role Tabel yang menyimpan data terkait peran
user di dalam sistem (Timesheet API). Tabel
role ini memiliki relasi one to many dengan
tabel user dengan tabel role yang memiliki
satu atau banyak user di database. Tabel role
ini yang akan menyimpan data peran Site

15
Inspector dan Checker II yang akan
digunakan oleh Timesheet API dalam proses
pengelolaan data timesheet. Entitas Role ini
juga berelasi dengan Role lainnya yang
menghasilkan relasi hirarki antar data pada
tabel Role.
Timesheet Tabel yang akan menyimpan data Timesheet
pada database. Tabel timesheet akan
memiliki data status, periode timesheet,
serta beberapa foreign key berupa id yang
mereferensi tabel yang berbeda seperti
site_inspector_id, checker_ii_id dan user_id.
user_id akan digunakan pada proses
pengelolaan timesheet untuk
menghubungkan kepemilikan timesheet
yang dibuat dengan user di database. Tabel
timesheet akan memiliki satu atau lebih
tabel tabel timesheet detail yang akan
menyimpan rincian data dari timesheet pada
periode tersebut
Timesheet Detail Merupakan tabel yang menyimpan rincian
data yang dimiliki oleh tabel timesheet.
Tabel ini akan digunakan Timesheet API
untuk menyimpan informasi terkait detil jam
kerja dari pegawai melalui beberapa kolom
seperti kolom tanggal, clock_in (jam masuk
kerja), clock_out (jam selesai kerja) dan
kolom value. Kolom value adalah kolom yang
menyimpan perbandingan jam kerja
pegawai dengan jam kerja seharusnya.
Setiap data timesheet detail akan
menyimpan referensi dari tabel timesheet
terkait melalui kolom timesheet_id. Tabel
Timesheet Detail juga memiliki relasi many
to one ke tabel Project dan Scope of Work,
dengan tabel project dan scope of work
memiliki satu atau lebih tabel timesheet
detail.
Scope Of Work Merupakan tabel yang menyimpan
informasi lingkup kerja dari timesheet
pegawai
Project Merupakan tabel yang menyimpan data
proyek yang dikerjakan oleh pegawai.

16
Holiday Merupakan tabel yang menyimpan data hari
libur. Tabel ini digunakan oleh TimesheetAPI
untuk mengecualikan proses perhitungan
absensi melalui kolom value pada tabel
timesheet detail pada saat hari libur.

5.4 Sistem monitoring log

Gambar 5.4 Sistem Monitoring Log

Gambar 5.4 adalah gambaran umum relasi antara Timesheet API dengan sistem
monitoring log yang dibuat. API akan dibuat menggunakan framework Nest.js dengan
sistem monitoring log yang memanfaatkan dasbor Grafana dan sistem agregrasi log yang
Bernama Loki. Loki berkerja dengan cara memantau aktifitas log pada server dan
mengirim log tersebut ke Grafana yang kemudian dapat diakses oleh Admin untuk
memantau aktifitas log dari server tersebut.

17
5.5 Implementasi

Gambar 5.5 Implementasi Modul


Gambar 5.5 menjelaskan arsitektur Timesheet API yang dibuat menggunakan
framework Nest.js. Dalam framework Nest.js, aplikasi terdiri dari beberapa modul
terpisah yang memberikan suatu fungsionalitas spesifik ke aplikasi. Setiap modul dapat
memiliki beberapa kelas controllers dan kelas providers. Controller merupakan kelas
yang bertugas menangani HTTP request dan mengirim response sedangkan Providers
merupakan kelas yang bertugas untuk mengenkapsulasi logika bisnis, berinteraksi
dengan basis data ataupun memberikan fungsionalitas lain didalam aplikasi. Pada
Gambar 5.5, kelas providers direpresentasikan melalui kelas Timesheet Service dan User
Service. Pada Implementasi kali ini, interaksi ke basis data PostgreSQL dicapai melalui
kelas repository dengan bantuan library TypeORM. Kelas yang telah dimodelkan pada
diagram kelas sebelumnya diimplementasikan sebagai providers dan controllers untuk 4
modul utama yaitu modul Auth, Timesheet, Timesheet Detail dan Holiday. Penjelasan
Modul tersebut beserta providers-nya dapat dilihat pada Tabel 5.3.
Tabel 5.3 Penjelasan Implementasi Modul
No Nama Modul Providers & Controllers End-point Deskripsi
1 AuthModule • AuthController /Auth Merupakan modul yang menangani
fungsi autentikasi dari Timesheet API
• AuthService menggunakan sistem JSON Web
• UserService Token.

• UserRepository
2 TimesheetModule • Timesheet /timesheet Modul yang menangani HTTP request
Controller untuk pengelolaan data timesheet
pada database. modul ini juga

18
• TimesheetService menyediakan end-point untuk
mengubah timesheet menjadi file
• UserService excel yang dapat didownload melalui
• TimesheetToExcel bantuan kelas servis
Service TimesheetToExcel.

• Timesheet
Repository
3 TimesheetDetail • TimesheetDetail /timesheet- Modul yang menangani HTTP request
Module Controller detail untuk pengelolaan data rincian
timesheet untuk timesheet tertentu
• TimesheetDetail
Service
• TimesheetDetail
Repository
• TimesheetService
• UserService
• ProjectService
• ScopeOfWork
Service
4 HolidayModule • HolidayController /holiday Modul yang menangani HTTP request
untuk keperluan pengelolaan data
• HolidayService hari libur
• HolidayRepository

Ke-4 Modul tersebut kemudian digunakan oleh modul utama Nest.js dalam untuk
memberikan fungsionalitas kepada aplikasi Timesheet API. Pada laporan PKL ini, penulis
akan menjelaskan contoh implementasi kode dari salah satu modul, yaitu
TimesheetModule.
Tabel 5.4 Implementasi Modul Timesheet
Nama Class TimesheetModule
import { Module } from '@nestjs/common';
import { TimesheetService } from './timesheet.service';
import { TimesheetController } from './timesheet.controller';
import { timesheetProviders } from 'src/entities/providers/timesheet.providers';
import { DatabaseModule } from 'src/database/database.module';
import { UsersModule } from '../users/users.module';
import { JwtModule } from '@nestjs/jwt';
import { AuthModule } from '../auth/auth.module';
import { TimesheetToExcelModule } from '../timesheet-to-excel/timesheet-to-excel.module';

@Module({
imports: [DatabaseModule, UsersModule, JwtModule, AuthModule, TimesheetToExcelModule],
controllers: [TimesheetController],
providers: [TimesheetService, ...timesheetProviders],
exports: [TimesheetService, ...timesheetProviders]
})

19
export class TimesheetModule { }

Tabel 5.4 memperlihatkan implementasi kode dari modul TimesheetModule yang


digunakan Timesheet API untuk mengelola data timesheet. Kode @Module pada tabel
tersebut merupakan sebuah fungsi dekorator yang memberikan metada ke kelas
TimesheetModule. Metadata tersebut digunakan oleh Nest.js untuk menstruktur dan
mengatur struktur aplikasi serta menandakan kelas tersebut sebagai suatu kelas modul.
Dekorator @Module menerima 1 argumen berupa objek yang memberikan fungsi serta
konfigurasi pada modul tersebut. Penjelasan argumen dari fungsi dekorator pada tabel
5 dapat dilihat pada Tabel 5.5.
Tabel 5.5 Penjelasan Argumen Modul
Key Explanation
Imports Merupakan array yang berisikan daftar modul yang diperlukan oleh
modul TimesheetModule
controllers Daftar controller yang didefinisikan pada modul TimesheetModule,
yang harus diinstansiasi
Providers Daftar providers yang akan diinstansiasi oleh nestjs dan dapat
dipergunakan oleh kelas lain dalam TimesheetModule
exports Subset providers yang diberikan oleh modul TimesheetModule yang
akan digunakan di modul lain

5.5.1 Timesheet Controller


Pada Tabel 5.5 dapat dilihat kelas TimesheetController dimasukkan kedalam
daftar controller pada argument dari fungsi dekorator @module Nest.js. Kelas
TimesheetController ini yang bertugas menyediakan end-point timesheet yang
didefinisikan pada tabel 2 serta menerima HTTP request dan mengirim response ke
pengguna API. Tabel 5.6 memperlihatkan hasil implementasi kode TimesheetController
tersebut.
Tabel 5.6 Implementasi Timesheet Controller
Nama Class TimesheetController
import { Controller, Get, Post, Body, Param, HttpStatus, HttpCode, Request, Response,
NotFoundException } from '@nestjs/common';
import { TimesheetService } from './timesheet.service';
import { CreateTimesheetDto } from './dto/create-timesheet.dto';
import { UpdateTimesheetDto } from './dto/update-timesheet.dto';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { AuthService } from '../auth/auth.service';
import { CreateExcelDto } from './dto/create-timesheet-to-excel.dto';
import { TimesheetToExcelService } from '../timesheet-to-excel/timesheet-to-excel.service';
import { UsersService } from '../users/users.service';

20
import { CreateTimesheetExcelDto } from '../timesheet-to-excel/dto/create-timesheet-
excel.dto';
import { RoleNames } from 'src/enums';

@ApiTags('Timesheet')
@Controller('timesheet')
export class TimesheetController {
constructor(
private readonly timesheetService: TimesheetService,
private readonly toExcelService: TimesheetToExcelService,
private authService: AuthService,
private userService: UsersService
) { }

@ApiBearerAuth()
@Post()
@HttpCode(HttpStatus.OK)
async create(@Body() createTimesheetDto: CreateTimesheetDto, @Request() request) {
const {
site_inspector_id, checker_2_id
} = createTimesheetDto

const userId = await this.authService.getUserIdFromJwt(request);


const timesheet_user = await this.userService.findOneById(userId);
if (!timesheet_user) {
throw new NotFoundException(`User ${userId} does not exist`)
}

const site_inspector = await this.userService.checkUserRole(site_inspector_id,


RoleNames.site_inspector);
const checker_2 = await this.userService.checkUserRole(checker_2_id, RoleNames.checker2);
return this.timesheetService.create(createTimesheetDto, timesheet_user, checker_2,
site_inspector);
}

@ApiBearerAuth()
@Get()
@HttpCode(HttpStatus.OK)
findAll() {
return this.timesheetService.findAll();
}

@ApiBearerAuth()
@Get(':id')
@HttpCode(HttpStatus.OK)
findOne(@Param('id') id: string) {

21
return this.timesheetService.findOne(+id);
}

@ApiBearerAuth()
@Post('/update/:id')
@HttpCode(HttpStatus.OK)
async update(@Param('id') id: string, @Body() updateTimesheetDto: UpdateTimesheetDto) {
const rolesToCheck = [
{
id: updateTimesheetDto.site_inspector_id,
roleToCheck: RoleNames.site_inspector
},
{
id: updateTimesheetDto.checker_2_id,
roleToCheck: RoleNames.checker2
}
]

for (const role of rolesToCheck) {


if (role.id) {
await this.userService.checkUserRole(role.id, role.roleToCheck);
}
}

return this.timesheetService.update(+id, updateTimesheetDto);


}

@ApiBearerAuth()
@Post('/delete/:id')
@HttpCode(HttpStatus.OK)
remove(@Param('id') id: string) {
return this.timesheetService.delete({ id: +id });
}

@ApiBearerAuth()
@Post('/convert-to-excel')
@HttpCode(HttpStatus.OK)
async toExcel(@Body() excelDto: CreateExcelDto, @Request() request, @Response() res) {
const userId = await this.authService.getUserIdFromJwt(request);
const user = await this.userService.findOneById(userId);
const userTimesheet = await this.timesheetService.findOneBy({
period: excelDto.period,
user: { id: user.id }
})
if (!userTimesheet) {
throw new Error(`User [${user.name}]'s Timesheet with period [${excelDto.period}] not
found`)

22
}

const createTimesheetData: CreateTimesheetExcelDto = {


name: user.name,
nip: user.nip,
job_title: user.role.name,
timesheet: userTimesheet,
year: parseInt(excelDto.period.split('-')[0]),
month: excelDto.period.split('-')[1]
}

const buffer = await this.toExcelService.create(createTimesheetData);


res.setHeader("Content-Type", "application/vnd.ms-excel");
res.setHeader("Content-disposition", "attachment; filename=biodata.xlsx");
res.send(buffer);
}
}

Kelas TimesheetController dideklarasikan menggunakan dekorator @controller


dengan parameter string ‘timesheet’. Dekorator ini memberi tanda kepada nest.js
bahwa kelas TimesheetController merupakan sebuah kelas controller yang akan
menangani setiap request user yang tertuju ke rute ‘/timesheet’. Setiap method kelas
yang ditandai dengan dekorator @Get atau @Post akan menyediakan end-poin API dan
memproses HTTP request pada end-point yang dideklarasikan melalui parameter pada
dekorator tersebut. Sebagai contoh, method async update dengan dekorator
@Post(‘/update/:id’) akan menangani HTTP POST request yang tertuju ke rute
/timesheet/update/:id

5.5.2 Timesheet Service


Dalam menjalankan tugasnya, kelas TimesheetController akan menggunakan
kelas TimesheetService untuk memproses request dan menjalankan logika bisnis terkait
pengelolaan data timesheet. Tabel 5.7 menunjukkan implementasi kode kelas
TimesheetService tersebut.
Tabel 5.7 Implementasi Timesheet Service
Nama Kelas TimesheetService
import { Inject, Injectable } from '@nestjs/common';
import { CreateTimesheetDto } from './dto/create-timesheet.dto';
import { UpdateTimesheetDto } from './dto/update-timesheet.dto';
import { FindOptionsWhere, Repository } from 'typeorm';
import { Timesheet } from 'src/entities/timesheet.entity';
import { TimesheetStatus } from 'src/enums';
import { User } from 'src/entities/user.entity';

23
export interface TimesheetUserDto {
timesheet_user: User
site_inspector: User,
checker_2: User
}
@Injectable()
export class TimesheetService {

constructor(
@Inject('TIMESHEET_REPOSITORY')
private timesheetRepository: Repository<Timesheet>,
) { }

async create(createTimesheetDto: CreateTimesheetDto, timesheetUser: User, siteInspector:


User, checker_2: User): Promise<Timesheet> {
const newTimesheet = this.timesheetRepository.create({
user: timesheetUser,
site_inspector: siteInspector,
checker_2: checker_2,
status: TimesheetStatus.Waiting,
...createTimesheetDto
})
return this.timesheetRepository.save(newTimesheet)
}

findAll(): Promise<Timesheet[]> {
return this.timesheetRepository.find();
}

find(where: FindOptionsWhere<Timesheet>): Promise<Timesheet[]> {


return this.timesheetRepository.findBy(where)
}

findOneBy(where: FindOptionsWhere<Timesheet>): Promise<Timesheet> {


return this.timesheetRepository.findOne({
where: where,
relations: {
user: true,
site_inspector: true,
checker_2: true,
timesheet_details: {
project: true
}
}
})
}

24
async findOne(id: number): Promise<Timesheet> {
const timesheet = await this.timesheetRepository
.createQueryBuilder('timesheet')
.leftJoinAndSelect('timesheet.timesheet_details', 'timesheet_details')
.where('timesheet.id = :id', { id })
.getOne();

return timesheet;
}

async update(id: number, updateTimesheetDto: UpdateTimesheetDto) {


return this.timesheetRepository.update(id, updateTimesheetDto);
}

softDelete(id: number) {
return this.timesheetRepository.softDelete(id);
}

delete(findOptionsWhere: FindOptionsWhere<Timesheet>) {
return this.timesheetRepository.delete(findOptionsWhere);
}
}

Kelas TimesheetService memiliki 8 method, create, find, findAll, findOneBy,


findOne, update, softDelete dan delete. Masing – masing method tersebut menjalankan
logika bisnis serta mengelola data timesheet pada basis data dengan bantuan atribut
timesheetRepository. Atribut ini menyediakan berbagai method dari kelas Repository
yang dapat digunakan untuk memanipulasi data timesheet pada basis data PostgreSQL.
Kelas Repository merupakan kelas dari library pihak ke tiga TypeORM yang penulis
gunakan untuk memudahkan pengelolaan data pada basis data.
Pada Tabel 5.7 dapat dilihat bahwa atribut timesheetRepository dideklarasikan
melalui argument konsturktor kelas tanpa diinstansiasi. Deklarasi tersebut merupakan
bentuk pola perancangan dependency injection yang dianut oleh Nest.js. Dekelarasi
atribut ini memberikan instruksi ke framework Nest.js untuk menginstansiasi kelas
Repository dengan tipe <Timesheet> melalui atribut timesheetRepository pada saat
kelas TimesheetService di instansiasi.

25
5.5.3 Sistem Monitoring Log

Gambar 5.6 Sistem Monitoring Log


Gambar 5.6 memperlihatkan hasil implementasi dasbor Grafana pada sistem
monitoring log yang dibahas sebelumnya. Dasbor tersebut memperlihatkan riwayat log
dari Timesheet API yang diurutkan berdasarkan waktu log diproduksi. Dasbor Grafana
dijalankan menggunakan Docker Container dengan menggunakan tools docker compose
yang disediakan oleh Docker. Docker compose memungkinkan penulis untuk
mendefinisikan dan menjalankan aplikasi docker multi-container menggunakan file
YAML. Implementasi file YAML tersebut dapat dilihat pada Tabel 5.8.
Tabel 5.8 Implementasi docker-compose.yaml
Nama file docker-compose.yaml
version: "3"

networks:
loki:

services:
loki:
image: grafana/loki:2.8.3
ports:
- "3100:3100"

26
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki

promtail:
image: grafana/promtail:2.8.3
volumes:
- ../logs:/var/log
command: -config.file=/etc/promtail/config.yml
networks:
- loki

grafana:
environment:
- GF_PATHS_PROVISIONING=/etc/grafana/provisioning
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
entrypoint:
- sh
- -euc
- |
mkdir -p /etc/grafana/provisioning/datasources
cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
orgId: 1
url: http://loki:3100
basicAuth: false
isDefault: true
version: 1
editable: false
EOF
/run.sh
image: grafana/grafana:latest
ports:
- "3000:3000"
networks:
- loki

Tabel 5.8 menampilkan implementasi kode konfigurasi container Docker yang


ditulis dengan format YAML. File ini yang kemudian digunakan penulis untuk
menjalankan sistem monitoring log yang dibahas pada tahap perancangan
27
menggunakan tools Docker Compose. Dapat dilihat pada file YAML terdapat 3 container
yang dikonfigurasi dibawah bagian kode services, yaitu container Loki, Promtail dan
Grafana. Container Loki merupakan container yang berisi sistem agregrasi log Loki,
container Promtail merupakan komponen dari Loki yang bertugas melakukan scrapping
log dan mengirimkannya ke Loki. Sedangkan container Grafana adalah aplikasi dasbor
Grafana yang menyediakan visualisasi data log dari Loki seperti yang terlihat pada
Gambar 5.6.

28
BAB 6 PENGUJIAN

Pada PKL kali ini pengujian dilaksanakan dengan teknik Blackbox testing yang
menguji fungsionalitas Timesheet API yang telah dibuat. Setiap end-poin Timesheet API
diuji menggunakan beberapa test scenario yang dijalankan menggunakan aplikasi
Postman. Response dari aplikasi Postman dibandingkan dengan expected result untuk
menentukan kesesuaian fungsionalitas. Hasil yang sesuai dengan expected result akan
ditandai dengan label "PASS” sedangkan hasil yang tidak sesuai akan ditandai dengan
label “NOT PASS”.
Sebelum pengujian dilaksanakan, aplikasi Timesheet API yang telah selesai
diimplementasi dijalankan beserta seluruh aplikasi pendukungnya pada komputer
penulis menggunakan alat kerja yang dibahas pada Bab 4.2. Selanjutnya, untuk
memudahkan proses pengujian penulis juga melakukan proses seeding data pada basis
data PostgreSQL. Data ini meliputi data user admin, data dummy timesheet, timesheet
detail, project dan data dummy lainnya yang hanya akan digunakan pada tahap
pengujian.

6.1 Pengujian Fungsionalitas Otentikasi


Pada PKL kali ini, sistem autentikasi Timesheet API dibuat dengan memanfaatkan
json web token (JWT), sebuah standar yang menjamin keamanan transmisi data yang
berbentuk objek JSON. JWT ini digunakan oleh sistem autentikasi Timesheet API dalam
menentukan otoritas user saat user melakukan request terhadap suatu rute di API.
Request tersebut akan diteruskan atau ditolak oleh API berdasarkan informasi otoritas
user yang disediakan melalui bearer token dalam bentuk JWT pada authorization header
request tersebut. JWT ini bisa didapat oleh user setelah melakukan login dengan cara
mengirim data email dan password yang sesuai dengan metode POST ke rute
/auth/login. JWT yang didapat mempunyai durasi terbatas dan dapat dibuat ulang jika
user melakukan login kembali pada API. Tabel 6.1 akan menjelaskan hasil testing dari
sistem autentikasi Timesheet API yang dijalankan tanpa memasukkan bearer token pada
request untuk mensimulasikan user yang tidak terautentikasi.
Tabel 6.1 Pengujian fungsi otentikasi
No Rute Parameter/ Test Scenario Expected Actual Status
Request Body Result Result
1 [GET]/timesheet - 1. Buat HTTP request API mengirim Sesuai PASS
dengan metode GET pesan dengan
ke rute /timesheet Unauthorized expected
request error result
2. Pastikan
authorization
header tidak
menyimpan bearer
token

2 [POST]/auth/login Email tidak 1. Buat HTTP request API mengirim Sesuai PASS
sesuai & dengan metode pesan dengan
Password tidak POST ke rute Unauthorized expected
sesuai /auth/login dengan request error result
menyertakan

29
request body email
dan password

3 [POST]/auth/login Email sesuai & 1. Buat HTTP request API mengirim Sesuai PASS
password tidak dengan metode pesan dengan
sesuai POST ke rute Unauthorized expected
/auth/login dengan request error result
menyertakan
request body email
dan password

4 [POST]/auth/login Email tidak 1. Buat HTTP request API mengirim too Sesuai PASS
sesuai & dengan metode many failed dengan
password tidak POST ke rute attempts error expected
sesuai /auth/login dengan message result
menyertakan
request body email
dan password
2. Tunggu response
dari server
3. Tahap nomor satu
dan dua sebanyak 4
kali

5 [POST]/auth/login Email sesuai & 1. Buat HTTP request API mengirim json Sesuai PASS
password ke rute /auth/login dengan access dengan
sesuai dengan metode token expected
POST dengan result
menyertakan
request body email
dan password

6 [GET]/timesheet - 1. Buat HTTP request API mengirim json Sesuai PASS


ke rute /auth/login dengan array dengan
dengan metode berisi data expecterd
POST dengan timesheet
menyertakan
request body email
dan password
2. Simpan access
token dari response
server
3. Buat HTTP request
ke rute /timesheet
dengan metode GET
dengan
menyertakan
bearer token
berupa access
token yang didapat
pada tahap 2

6.2 Pengujian rute timesheet, timesheet detail dan holiday


Setelah fungsionalitas autentikasi berhasil dilaksanakan penulis melakukan
pengujian terhadap rute API lainnya. Hasil pengujian tersebut dapat dilihat pada Tabel
6.2. Perlu diperhatikan juga bahwa setiap request pada pengujian tersebut dibuat

30
dengan menyertakan bearer token yang didapat setelah melakukan login sebagai admin
pada rute /auth/login.
Tabel 6.2 Pengujian Rute Timesheet, Timesheet Detail dan Holiday
No Rute Parameter/ Test Scenario Expected Actual Status
Request Body Result Result
1 [GET]/timesheet - 1. Buat HTTP request API mengirim json Sesuai PASS
ke rute /timesheet yang berisikan dengan
dengan metode data array expected
GET tmesheet result

2 [GET]/timeshset/[ id: number 1. Buat HTTP request API mengirim json Sesuai PASS
param] ke rute yang berisikan dengan
/timesheet/1 satu data expected
dengan metode timesheet result
GET

3 [POST]/timesheet site_inspector_i 1. Buat HTTP request API mengirimkan Sesuai PASS


d: number ke rute /timesheet json yang dengan
dengan metode berisikan data expected
checker_2_id: post dengan timesheet baru result
number menyertakan dengan id dan
period: “YYYY- request body period yang sama
MM” dengan id dan
2. Tunggu response period yang di
dari server masukkan
3. Buat HTTP request
GET ke rute
/timesheet dengan
parameter id
timesheet yang
didapat dari
response server
pada tahap ke 3.

4 [POST]/timesheet Id: number 1. Buat HTTP request API mengirimkan Sesuai PASS
/update/{id} ke rute data timesheet expected
Status: string /timesheet/update/ dengan data result
dengan parameter status yang telah
rute id timesheet berubah sesuai
dan request body dengan status
status yang diinputkan
pada request body
2. Tunggu response
dari server
3. Buat HTTP request
GET ke rute
/timesheet/ dengan
parameter rute id
yang sama

5 [POST]/timesheet 1. Buat HTTP request API akan Sesuai PASS


/delete/{id} POST ke rute mengirimkan json dengan
timesheet/delete/{i dengan data expected
d} dengan timesheet null result, API
parameter id atau array yang mengirimk
timesheet yang kosong an data
dibuat pada test null
nomor 3
2. Tunggu response
dari server
3. Buat HTTP request
GET ke rute
/timesheet dengan

31
parameter id yang
sama

6 [POST]/timesheet- Period: ‘yyyy- 1. Buat HTTP request API akan Sesuai PASS
detail mm’ POST ke rute mengirimkan json dengan
/timesheet-detail dengan data expected
Site_inspector_i dengan request timesheet baru
d: number body yang tertera dengan data
Checker_2_id: pada kolom timesheet_detail
number parameter yang sesuai
dengan yang
Scope_of_work dikirim pada POST
_id: number request melalui
request body
Project_id:
number
Weather: string
Manpower_qty:
number
Date: ‘yyyy-
mm-dd’
Clock_in:
‘hh:mm:ss’
Clock_out:
‘hh:mm:ss’

7 [GET]/timesheet- 1. Buat HTTP GET API akan Sesuai PASS


detail/{id} request ke rute mengirimkan data dengan
/timesheet-detail json dengan data expected
dengan parameter timesheet_detail result
id yang sama
dengan yang
didapat di tes
nomor 6

8 [POST]/timesheet- Scope_of_work 1. Buat HTTP POST API akan json yang Sesuai PASS
detail/update/{id} _id: number request ke rute berisi data dengan
/timesheet- timesheet detail expected
Project_id: detail/update/{id} dengan data yang result
number dengan rute sudah berubah
Weather: string parameter id yang sesuai dengan
sama dengan id request body
Manpower_qty: pada tes 7 dan
number request body yang
tertera pada kolom
Date: ‘yyyy-
parameter
mm-dd’
2. Tunggu response
Clock_in:
dari server
‘hh:mm:ss’
3. Buat HTTP GET
Clock_out:
request ke rute
‘hh:mm:ss’
/timesheet-
Description: detail/{id}
string

9 [POST]/timesheet- Id: number 1. Buat HTTP POST API akan Sesuai PASS
detail/delete/{id} request ke rute mengirimkan json dengan
/timesheet- dengan data expected
detail/delete timesheet_detail result
dengan rute yang bernilai null
parameter id

32
2. Tunggu response
dari server
3. buat HTTP GET
request ke rute
/timesheet-
detail/{id}

10 [POST]/holiday/cr Daftar hari libur 1. Buat HTTP POST API akan Sesuai PASS
eate-from-csv dalam file CSV request ke rute mengirimkan json dengan
dengan header /holiday/create- dengan pesan expected
date, day, from-csv dengan operation result
month, year, menyertakan file successful
holiday, csv pada request
datetime_ms body

11 [GET]/holiday 1. Buat HTTP GET API akan Sesuai PASS


request ke rute mengirimkan json dengan
/holiday dengan data array expected
yang berisi data result
holidays

12 [POST]/holiday/up Date: ‘yyyy- 1. Buat HTTP POST API akan Sesuai PASS
date/{id} mm-dd’ request ke rute mengirimkan json dengan
/holiday/update dengan pesan expected
Day:’string’ dengan rute operation result
Month:’string’ parameter id dan successful
menyertakan
Year: number request body
Holiday: string
Datetime_ms:
string

13 [POST]/holiday/de Id: 1 1. Buat HTTP POST Data holiday Sesuai PASS


lete{id} request ke rute dengan id yang dengan
/holiday/delete/{id} dimasukkan di expected
dengan parameter rute result
rute id /holiday/delete
hilang dari data
2. Tunggu response holiday pada
server response API
3. Buat HTTP GET
request ke rute
/holiday

14 [POST]/timesheet Period: ‘2023- 1. Buat HTTP request File excel yang Sesuai PASS
/convert-to-excel 12’ ke rute didownload dari dengan
/timesheet/convert response API expected
-to-excel dengan sesuai dengan result
menyertakan requirements file
request body Timesheet
berupa period
2. Tunggu response
server
3. Download response
server sebagai file
excel

33
BAB 7 KESIMPULAN DAN SARAN

7.1 Kesimpulan
Pada penelitian ini, Timesheet API berhasil dibuat menggunakan framework
Nest.js dengan basis data PostgreSQL. Timesheet API memilki 15 end-poin/rute yang
dapat digunakan user untuk mengelola data timesheet. Pada penelitian ini, sistem
monitoring log dari Timesheet API juga dibuat dengan bantuan Grafana dan Loki. Sistem
monitoring log merekam setiap aktifitas log sistem dan user di Timesheet API dan
menyediakan visualisasi data log tersebut melalui tabel pada dasbor yang dapat diakses
oleh Admin.
Hasil pengujian rute dan fungsionalitas Timesheet API yang dilakukan pada Bab 6
menunjukkan bahwa Timesheet API yang dibuat berjalan dengan baik tanpa
menunjukkan bug atau error. Pengujian tersebut juga menunjukkan bahwa aplikasi
Timesheet API berjalan sesuai fungsinya. Timesheet API tersebut kemudian dapat
digunakan di berbagai aplikasi atau service lainnya didalam maupun diluar lingkungan
PT Pusmanpro UPMK II untuk dipergunakan sebagaimana mestinya.

7.2 Saran
Adapun saran untuk penelitian selanjutnya dari pengembangan API ini dapat
dilakukan pengujian integrasi terhadap aplikasi atau service yang akan menggunakan
Timesheet API serta pengujian penetrasi dan pengujian unit secara detil agar dapat lebih
menjamin keamanan dari API tersebut.

34
DAFTAR REFERENSI

Alicea Dominguez, P. L. (2014). Timesheet Management System Project.


https://prcrepository.org/handle/20.500.12475/805
Barik, T., DeLine, R., Drucker, S., & Fisher, D. (2016). The Bones of the System: A Case
Study of Logging and Telemetry at Microsoft. 2016 IEEE/ACM 38th International
Conference on Software Engineering Companion (ICSE-C), 92–101.
Docker overview. (n.d.). Retrieved November 28, 2023, from
https://docs.docker.com/get-started/overview/
Grafana Loki. (n.d.). Retrieved November 24, 2023, from https://grafana.com/oss/loki/
Nest.js Documentation. (n.d.). Retrieved November 24, 2023, from
https://docs.nestjs.com/
Patni, S. (2017). Fundamentals of RESTful APIs. In S. Patni (Ed.), Pro RESTful APIs: Design,
Build and Integrate with REST, JSON, XML and JAX-RS (pp. 1–9). Apress.
https://doi.org/10.1007/978-1-4842-2665-0_1
TypeORM Documentation. (n.d.). Retrieved November 24, 2023, from
https://typeorm.io/
Typescript Handbook. (n.d.). Retrieved November 24, 2023, from
https://www.typescriptlang.org/docs/handbook/intro.html

35
LAMPIRAN

Lampiran A Logbook aktivitas harian PKL 1

36
Lampiran B Logbook aktivitas harian PKL 2

37
Lampiran C Dokumen kontrak PKL

38
Lampiran D Dokumen pernyataan selesai PKL

39

Anda mungkin juga menyukai