Anda di halaman 1dari 84

i

PEMBUATAN REST SERVICE SIMPEG API


DI KANTOR WALIKOTA BOGOR

FERNALIA

PROGRAM KEAHLIAN MANAJEMEN INFORMATIKA


PROGRAM DIPLOMA
INSTITUT PERTANIAN BOGOR
BOGOR
2015
ii
iii

PERNYATAAN MENGENAI LAPORAN AKHIR DAN


SUMBER INFORMASI

Dengan ini saya menyatakan laporan akhir Pembuatan REST Service


SIMPEG API di Kantor Walikota Bogor adalah karya saya dengan arahan dosen
pembimbing dan belum diajukan dalam bentuk apapun kepada perguruan tinggi
manapun. Sumber informasi yang berasal atau dikutip dari karya yang diterbitkan
dari penulis lain telah disebutkan dalam teks dan dicantumkan dalam Daftar
Pustaka di bagian akhir laporan ini.

Bogor, Mei 2015

Fernalia
NIM J3C212210
i

ABSTRAK

FERNALIA. Pembuatan REST Service SIMPEG API di Kantor Walikota Bogor.


Dibimbing oleh FIRMAN ARDIANSYAH.
SIMPEG API merupakan sebuah application programming interface yang
menyediakan service dari pihak BKPP Kota Bogor untuk pengembang publik.
SIMPEG API adalah service yang dapat dijalankan diberbagai platform dan
diakses pada aplikasi web dan mobile. Metode dalam pengembangan sistem ini
yaitu incremental. Pada pengembangan SIMPEG API digunakan tiga increment
yang menyediakan 31 method untuk pengembang publik dan 4 method yang
diakses pada setiap method. SIMPEG API menggunakan user acceptance test
sebagai teknik pengujian method. Oleh karena itu, SIMPEG API digunakan oleh
pengembang publik untuk menyediakan informasi kepada pengguna dengan
mengkonsumsi service dari SIMPEG API.

Kata Kunci: web service, REST service, API, SIMPEG API, sistem informasi.

ABSTRACT

FERNALIA. The Development of REST Service SIMPEG API in Bogor Mayor


Office. Supervised by FIRMAN ARDIANSYAH.
SIMPEG API is an application programming interface which provides
services from BKPP Kota Bogor to public developers. SIMPEG API is a
multiplatform service that could be accessed from web and mobile. The method
used in developing this system was incremental. The development of SIMPEG
API used three increments which provide 31 methods for the public developer and
4 methods which is accessed in every method. SIMPEG API used user acceptance
test for the technic for testing the method. Therefore, SIMPEG API is used by the
public developer to provide an information for the user by consuming a service
from SIMPEG API.

Keywords: REST service, API, SIMPEG API, information system.


ii

RINGKASAN

FERNALIA. Pembuatan REST Service SIMPEG API di Kantor Walikota Bogor.


Dibimbing oleh FIRMAN ARDIANSYAH.
SIMPEG API merupakan sebuah application programming interface yang
menyediakan service dari pihak BKPP Kota Bogor untuk pengembang publik.
SIMPEG API merupakan sebuah solusi dari penyediaan data kepegawaian PNS
Kota Bogor tanpa harus mengoneksikan aplikasi yang dibuat oleh pengembang
publik dengan basis data tertentu. SIMPEG API adalah service yang dapat
dijalankan diberbagai platform dan diakses pada aplikasi web dan mobile. Akan
tetapi, SIMPEG API membatasi setiap perangkat untuk mengakses service yang
telah disediakan. Metode dalam pengembangan sistem ini yaitu incremental. Pada
metode incremental tersebut terdapat lima tahapan pengembangan yaitu, tahap
komunikasi; tahap perencanaan; tahap pemodelan; tahap pembangunan; tahap
pengujian. Pada pengembangan SIMPEG API digunakan tiga increment yang
menyediakan 31 method untuk pengembang publik dan 4 method yang diakses
pada setiap method. Pada increment pertama menghasilkan 4 method yang
digunakan pada setiap method. Pada increment kedua menghasilkan 8 method
yang dapat diakses oleh aplikasi web. Sedangkan pada increment ketiga
menghasilkan 23 method yang dapat diakses oleh aplikasi web atau mobile.
SIMPEG API menggunakan user acceptance test sebagai teknik pengujian
method. Oleh karena itu, SIMPEG API digunakan oleh pengembang publik untuk
menyediakan informasi kepada pengguna dengan mengkonsumsi service dari
SIMPEG API.

Kata Kunci: web service,REST service,API, SIMPEG API, sistem informasi.


iii

PEMBUATAN REST SERVICE SIMPEG API


DI KANTOR WALIKOTA BOGOR

FERNALIA

Laporan Akhir
sebagai salah satu syarat untuk memperoleh gelar
Ahli Madya
pada
Program Diploma Kehalian Manajemen Informatika

PROGRAM KEAHLIAN MANAJEMEN INFORMATIKA


PROGRAM DIPLOMA
INSTITUT PERTANIAN BOGOR
BOGOR
2015
iv
v

Judul Tugas Akhir : Pembuatan REST Service SIMPEG API di Kantor


Walikota Bogor
Nama : Fernalia
NIM : J3C212210

Disetujui oleh

Firman Ardiansyah, SKom, MSi


Pembimbing

Diketahui oleh

Dr Ir Bagus P. Purwanto, MAgr Dr Ir Muhammad Syamsun, MSc


Direktur Koordinator Program Keahlian

Tanggal lulus:
vi
v

PRAKATA

Puji dan syukur penulis panjatkan kepada Allah SWT, karena atas rahmat
dan hidayah-Nya karya ilmiah ini dapat terselesaikan dengan baik. Tema yang
dipilih dalam kegiatan Praktik Kerja Lapangan yang dilaksanakan sejak tanggal
02 Februari 2015 sampai tanggal 28 Maret 2015 ini ialah sistem informasi,
dengan judul Pembuatan Dokumentasi dan REST Service SIMPEG API di Kantor
Walikota Bogor.
Dalam pembuatan karya ilmiah ini, penulis menghaturkan terima kasih
kepada pihak-pihak yang telah membantu penulis untuk menyelesaikan karya
ilmiah beserta proyek akhir penulis. Terima kasih penulis ucapkan kepada ayah,
ibu, dan keluarga besar yang selalu memberikan do’a dan kekuatan kepada
penulis. Tidak lupa ungkapan terima kasih juga penulis sampaikan kepada Bapak
Firman Ardiansyah, SKom, MSi selaku dosen pembimbing, Bapak Vicky
Vitriandi, SKom selaku pembimbing lapangan, Bapak Tosan Wiar Ramdhani,
SKom, MTI selaku Kasubid Informasi, dan Data Kepegawaian serta Bapak Cunda
Dwi Sespandana, Amd selaku penasehat proyek akhir. Selain itu, penghargaan
penulis sampaikan kepada staff Divisi Badan Kepegawaian Pendidikan dan
Pelatihan Kota Bogor. Tidak lupa ungkapan terima kasih penulis ucapkan kepada
teman-teman Manajemen Informatika 49, khususnya kepada Nisful Lailatul
Nikmah, Ceria Agnantria, Ahmad Isyfa’lana Amin, dan Andika Wiryawan.

Bogor, Mei 2015

Fernalia
vi

DAFTAR ISI

DAFTAR TABEL viii


DAFTAR GAMBAR viii
DAFTAR LAMPIRAN ix
1 PENDAHULUAN 1
1.1 Latar Belakang 1
1.2 Tujuan 1
1.3 Ruang Lingkup 2
1.4 Manfaat 2
2 METODE KAJIAN 2
2.1 Lokasi dan Waktu PKL 2
2.2 Metode Bidang Kajian 2
2.2.1 Komunikasi 3
2.2.2 Perencanaan 5
2.2.3 Pemodelan 5
2.2.4 Pembangunan 5
2.2.5 Penyerahan 6
2.3 Tinjauan Pustaka 6
2.3.1 REST 6
2.3.2 Service 6
2.3.3 Application Programming Interface 6
2.3.4 Object Oriented Programming 6
2.3.5 JAVA 7
2.3.6 Spring 7
2.3.7 Maven 8
2.3.8 Subversion (SVN) 8
2.3.9 Basis Data 8
2.3.10 SQL 9
2.3.11 MySQL 9
3 KERAGAAN INSTANSI 9
3.1 Sejarah 9
3.2 Kegiatan 9
3.3 Tugas Pokok dan Fungsi 10
3.4 Visi dan Misi 10
3.4.1 Visi 10
3.4.2 Misi 10
3.5 Rencana Strategis 11
3.6 Struktur Organisasi 11
4 PEMBUATAN REST SERVICE SIMPEG API DI KANTOR WALIKOTA
BOGOR 13
4.1 Increment Pertama 13
4.1.1 Komunikasi 13
4.1.2 Perencanaan 13
4.1.3 Pemodelan 14
4.1.4 Pembangunan 16
4.1.5 Penyerahan 17
vii

4.2 Increment Kedua 18


4.2.1 Komunikasi 18
4.2.2 Perencanaan 18
4.2.3 Pemodelan 19
4.2.4 Pembangunan 21
4.2.5 Penyerahan 24
4.3 Increment Ketiga 25
4.3.1 Komunikasi 25
4.3.2 Perencanaan 25
4.3.3 Pemodelan 26
4.3.4 Pembangunan 29
4.3.5 Penyerahan 34
5 SIMPULAN DAN SARAN 35
5.1 Simpulan 35
5.2 Saran 35
DAFTAR PUSTAKA 35
LAMPIRAN 37
viii

DAFTAR TABEL

1 Rencana strategis BKPP Kota Bogor 11


2 Struktur data aplikasi 14
3 Struktur data user 14
4 Struktur data method 15
5 Struktur data error_status 15
6 Struktur data user_app 15
7 Struktur data dum_user_app 15
8 Struktur data api_akses 15
9 Struktur data log_api 15
10 Kebutuhan fungsional pada increment pertama 16
11 Struktur data pegawai 19
12 Struktur data oasys_attendance_log 20
13 Struktur data oasys_absent_reason_log 20
14 Kebutuhan fungsional pada increment kedua 20
15 Struktur data post 26
16 Struktur data unit_kerja 26
17 Struktur data current_lokasi_kerja 27
18 Struktur data kgb_daftar 27
19 Struktur data pendidikan_terakhir 27
20 Struktur data pendidikan 27
21 Struktur data bidang_pendidikan 28
22 Struktur data institusi_pendidikan 28
23 Struktur data jabatan 28
24 Kebutuhan fungsional pada increment ketiga 28

DAFTAR GAMBAR

1 Metode incremental (Pressman 2010) 3


2 Ruang pertemuan grup JAD menurut (Dennis et al. 2012) 4
3 Arsitektur framework spring (Johnson et al. 2014) 8
4 Struktur organisasi BKPP Kota Bogor 12
5 Kode program Log_api layer DAO interface class 16
6 Kode program Log_api layer DAO 17
7 Kode program bean Log_api 17
8 Penyerahan sistem increment pertama 18
9 Kode program pegawai layer model 22
10 Kode program pegawai layer DAO interface class 22
11 Kode program bean pegawai 24
12 URL pengujian method pegawai/find_by_nip 24
13 Hasil pengujian method pegawai/find_by_nip 24
ix

14 Penyerahan sistem increment kedua 25


15 Kode program absensi_mobile layer model 30
16 Kode program absensi_mobile layer DAO interface class 31
17 Kode program bean absensi_mobile 32
18 Form pengujian absensi_mobile/hadir 33
19 Kode program form pengujian absensi_mobile/hadir 33
20 Hasil pengujian absensi_mobile/hadir 33
21 Penyerahan sistem increment ketiga 34
22 Dokumentasi SIMPEG API 34

DAFTAR LAMPIRAN

1 Kode program Log_api layer model 38


2 Kode program pegawai layer DAO 39
3 Kode program pegawai layer controller 45
4 Kode program absensi_mobile layer DAO 47
5 Kode program absensi_mobile layer controller 54
6 Kode program Pegawai_mobile layer model 56
7 Kode program Pegawai_mobile layer DAO interface class 59
8 Kode program Pegawai_mobile layer DAO 59
9 Kode program Pegawai_mobile layer controller 66
10 Daftar request status 67
1

1 PENDAHULUAN

1.1 Latar Belakang

Data adalah hal yang tidak memiliki arti. Data merupakan bahan yang harus
diproses untuk menghasilkan suatu informasi. Data yang didapatkan harus melalui
proses pemformatan, pemilihan dan peringkasan sehingga data yang akan diproses
menjadi informasi yang tepat. Umumnya data dan informasi saling berkaitan
dengan erat. Data bagi beberapa perusahaan merupakan hal yang rahasia,
sehingga perusahaan tidak serta merta mempublikasikan data tersebut kepada
publik. Oleh karena itu, penyediaan data dari perusahaan terhadap publik adalah
salah satu solusi dari masalah tersebut.
Permasalahan terkait kerahasiaan data maupun permasalahan mengenai
pengaksesan data ke basis data perusahaan secara langsung oleh pihak publik
adalah masalah utama dari penyediaan data kepegawaian dari Badan
Kepegawaian, Pendidikan dan Pelatihan (BKPP) Kota Bogor. Dalam hal ini,
REST service merupakan salah satu solusi dari penyediaan data untuk kebutuhan
publik sehingga para pengembang aplikasi tidak perlu berkaitan langsung dengan
basis data. Penyediaan data dengan REST service ini tentu saja tidak dapat
dikonsumsi secara langsung. Aplikasi adalah jembatan dari REST service itu
dikonsumsi, sehingga pengguna dapat mengerti makna dari data tersebut. Artinya,
pengguna mendapatkan informasi dari aplikasi yang mengkonsumsi REST
service. Aplikasi yang dikembangkan oleh pihak publik maupun pihak BKPP itu
sendiri tidak perlu berhubungan langsung dengan basis data, tidak perlu
memahami struktur data tabel dan relasinya. Oleh karena itu, pengembang
aplikasi hanya perlu memahami penggunaan dari web service yang telah
disediakan.
Solusi pembuatan REST service yang dapat digunakan di berbagai
perangkat keras seperti personal computer maupun smart phone adalah latar
belakang dari Pembuatan REST Service SIMPEG API di Kantor Walikota Bogor.
Adapun metode yang dipakai dalam pembuatan sistem ini adalah metode
incremental. Metode incremental dipilih karena dalam pembangunan sistem ini
dibagi-bagi atas beberapa subsistem yang memiliki skala prioritas yang berbeda-
beda.

1.2 Tujuan

Tujuan dari pembuatan dokumentasi dan REST service SIMPEG API di


Kantor Walikota Bogor adalah sebagai berikut:
1 Menyediakan layanan penyediaan data yang dinamis secara publik.
2 Keseragaman data yang diterima oleh pihak internal maupun eksternal
mengenai data kepegawaian Pegawai Negeri Sipil Kota Bogor.
3 Menyediakan akses data yang dapat digunakan di berbagai aplikasi dan di
berbagai platform.
2

4 Adanya keamanan yang berkaitan dengan penggunaan data maupun sumber


data, karena pengembang aplikasi tidak perlu berhubungan langsung dengan
basis data.

1.3 Ruang Lingkup

Ruang lingkup dari pembuatan REST service SIMPEG API di Kantor


Walikota Bogor meliputi pembuatan method REST service. Pembuatan method
REST service pada SIMPEG API dibatasi atas 31 method. Jumlah dari
keseluruhan method ini terbagi atas 8 method yang dapat diakses oleh SIMPEG
Mobile, 8 method yang dapat diakses oleh SIMPEG WEB dan 15 method yang
dapat diakses oleh keduanya. Selain itu, terdapat 4 method tambahan yang diakses
oleh 31 method.

1.4 Manfaat

Manfaat dari pembuatan REST service SIMPEG API di Kantor Walikota


Bogor adalah agar pihak internal maupun eksternal dapat menggunakan data
kepegawaian Pegawai Negeri Sipil Kota Bogor dengan mudah dan termonitor.
Selain itu, dengan adanya SIMPEG API ini memberikan jalur akses pengaksesan
data kepegawaian yang telah dibatasi oleh pihak BKPP Kota Bogor. Sehingga
pihak BKPP Kota Bogor dapat menyediakan keperluan eksternal tanpa
memberikan akses langsung terhadap basis data BKPP Kota Bogor.

2 METODE KAJIAN

2.1 Lokasi dan Waktu PKL

Kegiatan Praktik Kerja Lapangan (PKL) dilaksanakan di Kantor Walikota


Bogor. Adapun secara spesifik PKL dilaksanakan di Badan Kepegawaian,
Pendidikan dan Pelatihan (BKPP) Kota Bogor yang beralamat di Jalan Ir. H.
Juanda No.10, Bogor. Kegiatan Praktik Kerja Lapangan berlangsung sejak tanggal
02 Februari 2015 sampai tanggal 28 Maret 2015. Kegiatan Praktik Kerja
Lapangan dilakukan mulai hari Senin sampai Jum’at dari pukul 08.00-15.45 WIB.

2.2 Metode Bidang Kajian

Metode dalam pengembangan sistem informasi sangat beragam dan


memiliki fungsionalitasnya masing-masing. Metode incremental merupakan
sebuah metode yang dilakukan secara bertahap. Pada umumnya metode ini
3

memiliki kebutuhan yang sudah jelas. Akan tetapi, metode ini memungkinkan
adanya penambahan fungsi pada saat tahap pembangunan sistem telah berlanjut.
Metode incremental adalah sebuah metodologi yang membagi-bagi sistem ke
dalam subsistem. Sehingga pada pembuatan maupun pengembangan sistem akan
dilakukan secara cepat dengan mendahulukan fungsi-fungsi yang memiliki skala
prioritas yang tinggi.
Model incremental menggabungkan elemen-elemen dari proses kerja linear
dan paralel. Model incremental menggunakan rangkaian linear dalam bentuk yang
tersusun seperti perkembangan waktu kalender. Setiap susunan linear
menghasilkan “increments” dari perangkat lunak. Ketika model incremental
digunakan, seringkali pada increment pertama dihasilkan produk utama dari
sistem. Produk utama digunakan oleh pengguna sebagai evaluasi. Evaluasi dari
produk utama yang telah digunakan oleh pengguna akan menghasilkan sebuah
perencanaan yang dikembangkan pada increment selanjutnya. Sebuah
perencanaan digunakan untuk memodifikasi produk utama dan menemukan
kebutuhan pengguna yang lainnya. Proses ini akan berulang mengikuti
penyerahaan subsistem pada setiap increment, sampai produk yang dihasilkan
sesuai dengan kebutuhan pengguna (Pressman 2010). Metode incremental
menurut Pressman dapat dilihat pada Gambar 1.

Gambar 1 Metode incremental (Pressman 2010)

Setiap increment atau versi dari sebuah sistem mempersatukan beberapa


fungsionalitas yang dibutuhkan oleh pengguna. Pada umumnya, increment dari
subsistem yang didahulukan merupakan sebuah fungsionalitas yang sangat
penting dan sangat dibutuhkan. Artinya pengguna dapat mengevaluasi sistem
dengan cepat untuk memastikan kebutuhannya. Jika produk yang dihasilkan tidak
sesuai dengan kebutuhan pengguna, increment yang sedang dijalankan harus
mengalami perubahan dan fungsionalitas yang baru didefinisikan untuk increment
selanjutnya (Sommervile 2011).

2.2.1 Komunikasi
Komunikasi adalah langkah awal dari metode incremental. Pada tahap ini
dilakukan untuk menentukan keseluruhan tujuan atau sasaran dari pembuatan
4

sistem, mengidentifikasi apa saja kebutuhan yang diketahui dan batasan-


batasannya.

a Wawancara
Wawancara adalah teknik mendapatkan kebutuhan sistem yang paling
sering digunakan. Teknik wawancara ini lebih mudah digunakan, karena jika para
pengembang ingin mengetahui tentang sesuatu, pengembang hanya perlu bertanya
kepada sesorang dari pihak pelanggan. Pada umumnya, wawancara ini dilakukan
secara one to one (satu pewawancara dan satu narasumber), tetapi terkadang untuk
mengefisienkan waktu, beberapa orang diwawancara pada waktu yang sama.
(Dennis et al. 2012).

b Pengembangan Aplikasi Bersama


Pengembangan Aplikasi Bersama atau Joint Application Development
(JAD) adalah teknik pengumpulan informasi yang memungkinkan tim
pengembang proyek, pengguna dan manajemen untuk berkerja sama untuk
mengidentifikasi kebutuhan untuk sistem. Grup JAD bertemu untuk beberapa jam,
beberapa hari atau beberapa minggu sampai semua masalah telah didiskusikan
dan informasi yang dibutuhkan telah terkumpul. Kebanyakan JAD menghabiskan
waktu pada ruang rapat yang didesain khusus, jauh dari ruang peserta lain,
sehingga mereka tidak terganggu. Ruang pertemuan biasanya didesain dalam
bentuk U sehingga peserta lainnya dapat dengan mudah melihat satu sama lain
(Dennis et al. 2012). Ruang pertemuan disusun seperti Gambar 2.

Gambar 2 Ruang pertemuan grup JAD menurut (Dennis et al. 2012)

c Observasi
Observasi merupakan proses yang berlangsung untuk mengumpulkan
informasi. Observasi merupakan alat yang sangat berpengaruh untuk memahami
lebih dalam lagi mengenai sistem yang akan dikembangkan. Observasi
memungkinkan seorang analis untuk melihat situasi yang terjadi dan hal ini akan
lebih baik dibandingkan dengan hanya mendengarkan penjelasan dari narasumber
saat melakukan wawancara atau pada saat kegiatan JAD berlangsung. Beberapa
5

riset membuktikan bahwa manajer terkadang tidak mengingat apa yang mereka
kerjakan dan bagaimana mereka menghabiskan waktunya untuk megerjakannya.
Observasi adalah cara yang paling baik untuk meneliti informasi yang telah
dikumpulkan saat kegiatan wawancara dan kuisioner (Dennis et al. 2012).

2.2.2 Perencanaan
Fase perencanaan adalah proses pokok untuk memahami mengapa sebuah
sistem informasi harus dibuat dan menentukan bagaimana tim proyek akan
mengembangkannya (Dennis et al. 2012). Pada perencanaan, pengembang
diharuskan untuk menelaah kebutuhan sistem dari pelanggan dan
merencanakannya. Pengembang merencanakan proyek sesuai dengan kebutuhan
pelanggan, bukan merencanakan proyek sesuai prediksi pengembang.

2.2.3 Pemodelan
Pada tahap ini dilakukan dua aktivitas yaitu analisis dan perancangan. Pada
aktivitas analisis dijelaskan siapa saja yang akan memakai sistem, apa yang akan
dilakukan oleh sistem dan di mana sistem akan digunakan. Pada aktivitas ini, tim
proyek menginvestigasi beberapa sistem yang sedang dijalankan, meng-
indentifikasi perluang perbaikan dan mengembangkan konsep untuk sistem yang
baru. Sedangkan pada aktivitas perancangan disimpulkan bagaimana sistem akan
dioperasikan pada perangkat keras, perangkat lunak dan infrastruktur jaringan;
antarmuka pengguna, form, dan laporan yang akan digunakan; spesifik program,
basis data dan file yang akan dibutuhkan (Dennis et al. 2012).

a Analisis Spesifikasi
Pada analisis spesifikasi diidentifikasi kebutuhan perangkat lunak yang
dibutuhkan saat pembuatan sistem. Analisis spesifikasi digunakan sebagai
dokumentasi perangkat lunak. Selain itu, analisis spesifikasi dibuat untuk
pengacuan pembuatan sistem pada tahap selanjutnya.

b Analisis Database
Pada analisis database diidentifikasi struktur tabel yang akan dibutuhkan
dalam pembuatan sistem. Selain itu, dijelaskan juga basis data yang terkait dalam
pembuatan sistem. Pada umumnya, analisis basis data menunjukkan atribut-atribut
yang akan dibutuhkan dalam perancangan basis data.

c Analisis Kebutuhan Fungsional


Pada analisis kebutuhan fungsional diidentifikasi fungsionalitas sistem.
Dijelaskan dan dikelompokkan berdasarkan modul yang akan dibuat. Selain itu,
analisis kebutuhan sistem ini adalah acuan dari pembuatan sistem sesuai dengan
kebutuhan pengguna.

2.2.4 Pembangunan
Pada tahap ini dilakukan dua aktivitas yaitu pengkodean dan tes program.
Aktivitas pengkodean dilakukan degan menggunakan spesifikasi yang telah
dianalisis sebelumnya. Sedangkan tes program dilakukan dengan metode User
Acceptance Test (UAT) yang dilakukan langsung oleh pengguna.
6

2.2.5 Penyerahan
Pada tahap ini dilakukan dua aktivitas yaitu penyerahan sistem dan umpan
balik. Tahap penyerahan dilakukan pada setiap increment telah selesai
dilaksanakan. Pada umumnya, tahap ini dilakukan sebagai tahap terakhir pada
setiap increment untuk mengidentifikasi kebutuhan yang lainnya ketika pengguna
merasa bahawa sistem yang telah diserahkan masih belum sesuai dengan
kebutuhan pengguna.

2.3 Tinjauan Pustaka

2.3.1 REST
Representational State Transfer (REST) merupakan sebuah gaya arsitektur
perangkat lunak untuk mendistribusikan sistem hypermedia atau sistem yang
berisi teks, grafik, audio, dan media lainnya yang disimpan di dalam jaringan dan
saling terhubung melalui hyperlink. Internet merupakan contoh nyata dari sistem
tersebut. Sebagai fokus utamanya terletak pada layanan web, World Wide Web
merupakan sistem hypermedia terdistribusi. Pada web, HTTP merupakan sebuah
protokol transportasi dan sistem pemesanan karena HTTP permintaan dan HTTP
respon adalah sebuah pesan (Karlin 2013).

2.3.2 Service
Service merupakan sebuah sistem yang menyediakan sesuatu hal yang
dibutuhkan oleh publik, disusun oleh pemerintah atau sebuah perusahaan (Hornby
2000).
Service merupakan acuan untuk pemrograman dan perangkat lunak, sebuah
program atau rutinitas yang menyediakan dukungan untuk program lainnya
(Microsoft 2002).

2.3.3 Application Programming Interface


Satu set rutinitas yang digunakan oleh program aplikasi untuk mengarahkan
kinerja dari prosedur oleh sistem operasi komputer (Microsoft 2002).

2.3.4 Object Oriented Programming


Object Oriented Programming (OOP) merupakan sebuah pemrograman
berbasis objek. Pada model ini, komponen-komponen penyusun program secara
konseptual akan dipecah menjadi bagian-bagian tersendiri yang disebut dengan
objek. Setiap objek akan memiliki data dan method. Selain itu, kelas adalah
bentuk abstrak dari suatu objek. Wujud nyata dari suatu kelas disebut dengan
instance (Raharjo et al. 2007).
7

2.3.5 JAVA
Java merupakan sebuah bahasa pemrograman berbasis objek. Platform Java
adalah himpunan kelas-kelas Java yang sudah didefinisikan sebelumnya. Selain
itu, platform Java mengacu pada lingkungan runtime atau API. Sun Microsystem
mendefinisikan tiga edisi Java yaitu J2ME (Java 2 Micro Edition), J2SE (Java 2
Standard Edition) dan J2EE (Java 2 Enterprise Edition). Java adalah bahasa
pemrograman yang kode programnya dikompilasi dan diinterpretasi (Prasetyo
2007).

2.3.6 Spring
Spring merupakan sebuah framework atau kerangka kerja. Kerangka kerja
spring merupakan salah satu dari kerangka kerja Depedency Injection atau
Inversion of Control yang menyediakan depedency untuk objek yang dibuat agar
objek tersebut dapat berjalan dengan baik. Kerangka kerja spring didasari pada
Depedency Injection dan terkadang dapat berubah menjadi prinsip dari Inversion
of Control atau IoC (Konda 2011).
Ada banyak keuntungan dari pemakaian framework spring. Spring
memungkinkan pengembang untuk mengenbangkan aplikasi skala enterprise
menggunakan “plain old Java objects” (POJOs). Spring diorganisasikan dalam
bentuk modular, artinya pengembang hanya perlu memperhatikan apa saja yang
diperlukannya dan tidak perlu memperhatikan rest. Spring meyediakan teknologi
yang berkembang seperti beberapa framework ORM, logging frramework, JEE,
Quartz, dan JDK timers. Pengujian aplikasi yang dibuat menggunakan spring
sangat mudah karena kode environment-dependent disarankan pada framework
spring. Framework spring merupakan framework MVC. Spring menyediakan API
yang mudah untuk menterjemahkan pengecualian spesifik tenologi (JDBC,
Hibernate, atau JDO) secara konsisten. IoC pada spring sangat ringan, artinya
dalam pengembangan dan penyerahan aplikasi dapat dilakukan pada komputer
dengan memori yang terbatas dan CPU yang terbatas. Spring menyediakan
transaksi antarmuka manajemen yang konsisten yang dapat digunakan pada
tingkat bawah yaitu transaksi lokal dan dapat digunakan pada tingkat atas yaitu
transaksi global (Johnson et al. 2014).
Framework spring terdiri atas fitur-fitur yang diorganisasikan ke dalam 20
modul. Modul tersebut dikelompokkan ke dalam Core Container, Data
Access/Integration, Web, AOP (Aspect Oriented Programming), Instrumentation,
Messaging, dan Test (Johnson et al. 2014). Adapun arsitektur atau modul-modul
yang telah dikelompokkan pada spring dapat dilihat pada Gambar 3.
8

Gambar 3 Arsitektur framework spring (Johnson et al. 2014)

2.3.7 Maven
Maven merupakan sebuah strandard untuk membangun, mengatur, dan
mengotomatisasikan Java dan proyek berbasis JEE. Apache Maven merupakan
sebuah kerangka kerja yang open source, manajemen proyek yang terstandarisasi
untuk membangun, menguji, melaporkan, dan menyatukan projek dengan mudah.
Maven menyediakan rekomendasi untuk meletakkan bagian-bagian yang berbeda
dari proyek, seperti kode program, kode pengujian, dan file konfigurasi. Selain itu,
Maven menyediakan t4 yang mudah untuk mendeklarasikan depedency proyek
yang terpisah yaitu dengan pom.xml yang terpisah (Varanasi dan Belida 2014).

2.3.8 Subversion (SVN)


Subversion merupakan sistem kontrol versi open source yang sangat besar
dan populer. Subversion merupakan sebuah sistem kontrol yang tersentralisasi,
artinya subversion menggunakan server yang tersentralisasi untuk menyimpan file
dan memungkinkan untuk pengerjaan suatu proyek secara berkelompok.
Subversion dapat menunjukkan informasi versi dari direktori dan metadata.
Penyerahan sebuah perubahan pada subversion dilakukan secara atomic.
Subversion memiliki branches dan tags yang dapat dibuat secara mudah. Selain
itu, subversion merupakan sebuah alat yang dapat dipakai diberbagai macam
platform (Mason 2010).

2.3.9 Basis Data


Basis data merupakan sebuah sekumpulan data yang disimpan secara
berintegrasi yang dapat dikelola dan dikontrol. Sebuah basis data menyimpan
informasi mengenai jutaan atau ribuan dari tipe entitas dan kelas. Informasi yang
tersimpan terdiri atas entitas atau atribut kelas dan hubungan antara entitas dan
kelas. Basis data juga menyimpan informasi deskriptif mengenai data, seperti field
nama, batasan-batasan nilai yang diperbolehkan dan kontrol akses yang peka
9

terhadap satuan data. Basis data dikelola dan dikontrol oleh sebuah database
management system (Satzinger et al. 2010).

2.3.10 SQL
Structured Query Language (SQL) merupakan sebuah bahasa pemrograman
basis data yang dipakai untuk menuliskan argumen yang akan diproses oleh server
basis data. SQL didasari oleh teori formal dan matematis. SQL merupakan sebuah
bahasa pemrograman basis data relasional. Bahasa tersebut terdiri atas argumen
tambah, ubah, hapus, query, dan perlindungan data. SQL disebut sebagai bahasa
pemrograman basis data relasional karena SQL berkerja dengan datayang telah
didefinisikan sesuai dengan aturan-aturan dari model relasional (Lans 2007).

2.3.11 MySQL
MySQL merupakan sebuah sistem manajemen basis data relasional yang di
rancang untuk dipakai pada arsitektur client/server. MySQL juga dapat dipakai
sebagai library basis data tertanam. MySQL dibuat menggunakan kompilasi
GNU C (GCC) yang menyediakan fleksibilitas untuk sasaran yang dituju (Bell
2012).

3 KERAGAAN INSTANSI

3.1 Sejarah

Badan Kepegawaian, Pendidikan, dan Pelatihan Kota Bogor dibentuk pada


awal tahun anggaran 2009 yang merupakan penggabungan dari Bagian
Kepegawaian Sekretariat Daerah Kota Bogor dengan Badan Penelitian,
Pengembangan, Pendidikan, dan Pelatihan (BP4). BKPP dibentuk berdasarkan
Perda Kota Bogor No.13 Tahun 2008 Tentang Organisasi Perangkat Daerah.
Jumlah pegawai Badan Kepegawaian, Pendidikan, dan Pelatihan Kota Bogor
sebanyak 61 orang terdiri dari 55 orang PNS, 4 orang Widyaiswara dan 2 orang
Calon Pegawai Negeri Sipil (CPNS) yang melayani 9.650 orang Pegawai Negeri
Sipil (PNS) dalam lingkup wilayah Kota Bogor. BKPP dikepalai oleh Kepala
Badan dan memiliki beberapa Subbagian seperti Subbagian Keuangan, Subbagian
Perencanaan dan Pelaporan, Subbagian Umum dan Kepegawaian.

3.2 Kegiatan

Badan Kepegawaian, Pendidikan, dan Pelatihan Kota Bogor merupakan


salah satu divisi yang berada di Kantor Walikota Bogor. Badan Kepegawaian,
Pendidikan, dan Pelatihan beralamat di Jalan Ir. H. Juanda No.10, Bogor. Badan
Kepegawaian, Pendidikan, dan Pelatihan Kota Bogor ini memiliki kegiatan yang
berkaitan tentang penyediaan data kepegawaian, merumuskan kebijakan teknis di
10

bidang tersebut, hingga kegiatan yang berkaitan dengan kesejahteraan pegawai


negeri sipil.

3.3 Tugas Pokok dan Fungsi

Berdasarkan Peraturan Walikota Bogor Nomor 62 Tahun 2014 tentang


Tugas Pokok, Fungsi, Tata Kerja, dan Uraian Tugas Jabatan Struktural di
lingkungan Badan Kepegawaian, Pendidikan, dan Pelatihan Pasal 2 dan Pasal 3:
a Tugas Pokok
Badan mempunyai tugas pokok melaksanakan kebijakan di bidang
kepegawaian, pendidikan, dan pelatihan.
b Fungsi
Perumusan kebijakan teknis di Bidang Kepegawaian, pendidikan, dan pelatihan.
1 Pemberian dukungan atas penyelenggaraan kepegawaian, pendidikan, dan
pelatihan.
2 Pembinaan dan pelaksanaan kepegawaian, pendidikan dan pelatihan.
3 Pelaksanaan tugas lainnya yang diberikan oleh Walikota sesuai dengan
tugas dan fungsinya.

3.4 Visi dan Misi

3.4.1 Visi
Penetapan visi merupakan satu langkah penting dalam perjalanan suatu
organisasi, karena dengan visi tersebut akan dapat mencerminkan apa yang
hendak dicapai oleh organisasi tersebut serta memberikan arah dan fokus strategis
yang berorientasi terhadap masa depan pembangunan dan bahkan menjamin
kesinambungan pelaksanaan tugas organisasi.
Visi yang ditetapkan senantiasa mencerminkan gambaran peran dan kondisi
yang ingin diwujudkan oleh Badan Kepegawaian, Pendidikan, dan Pelatihan Kota
Bogor yaitu: “Mewujudkan Aparatur Kota Bogor yang Profesional, Transparan
dan Akuntabel Menuju Reformasi Birokrasi”.
Dengan terumuskannya visi Badan Kepegawaian, Pendidikan, dan Pelatihan
Kota Bogor tersebut, maka dapat menjadi motivasi bagi seluruh elemen untuk
mewujudkannya, melalui peningkatan kinerja sesuai dengan tugas pokok dan
fungsi masing-masing.

3.4.2 Misi
Misi adalah rumusan umum mengenai upaya-upaya yang akan dilaksanakan
dan diwujudkan, agar tujuan dapat terlaksana dan berhasil dengan baik sesuai
dengan visi yang telah ditetapkan. Berdasarkan Tugas Pokok dan Fungsi
Organisasi serta dilandasi oleh visi, maka misi BKPP Kota Bogor yaitu:
Misi 1 : Mewujudkan pelayanan administrasi kepegawaian yang prima.
Misi 2 : Mewujudkan aparatur pemerintah daerah sesuai kompetensi berdasarkan
kebutuhan organisasi.
Misi 3 : Meningkatkan pengembangan karir aparatur.
11

Misi 4 : Meningkatkan pemenuhan kesejahteraan aparatur.


Misi 5 : Meningkatkan pelayanan data dan informasi kepegawaian yang akurat
dan terkini.
Misi 6 : Meningkatkan kualitas aparatur melalui pendidikan dan pelatihan.

3.5 Rencana Strategis

Badan Kepegawaian, Pendidikan, dan Pelatihan Kota Bogor memiliki


rencana strategis yang didasari pada tujuan, sasaran, dan indikator sasaran.
Adapun rencana strategis tersebut dijelaskan pada Tabel 1.

Tabel 1 Rencana strategis BKPP Kota Bogor


Tujuan Sasaran Indikator Sasaran
Peningkatan pelayanan Terlaksananya pelayanan Meningkatnya
kepegawaian yang prima administrasi kepegawaian pelayanan administrasi
yang cepat, tepat, akurat, kepegawaian
transparan dan dapat
dipertanggungjawabkan

Meningkatnya kompetensi Terpenuhinya kebutuhan Jumlah aparatur


aparatur pemerintahan PNS sesuai kompetensi pemerintah daerah yang
daerah berdasarkan berdasarkan kebutuhan sesuai kompetensi
kebutuhan organisasi organisasi

Melakukan pengembangan Terpenuhinya pengembangan Jumlah aparatur


karir pegawai agar sesuai karir aparatur pemerintah daerah yang
kompetensi terpola pengembangan
karirnya

Peningkatan pemenuhan Terwujudnya kesejahteraan Presentase pemenuhan


kebutuhan kesejahteraan pegawai melalui pemberian kesejahteraan pegawai
pegawai penghargaan/reward

Tersedianya data dan Terpenuhinya pelayanan data Jumlah aparatur yang


informasi kepegawaian dan informasi kepegawaian terlayani data dan
yang akurat dan terkini yang akurat dan terkini informasi kepegawaian

Mewujudkan Terwujudnya pegawai yang Jumlah PNS yang


profesionalisme aparatur memiliki kemampuan teknis mengikuti Diklat
pemerintah melalui wawasan dan keterampilan Teknis/Fungsional
pendidikan dan pelatihan yang profesional tugas dan untuk peningkatan
fungsi pengetahuan dan
kemampuan

3.6 Struktur Organisasi

Struktur organisasi Badan Kepegawaian, Pendidikan, dan Pelatihan Kota


Bogor dapat dilihat secara rinci pada Gambar 4.
12

Kasubid Diklat
Struktural

H Junaedi SE
Kepala Bidang
Pendidikan dan
Pelatihan Kasubid Diklat
Fungsional dan
Dra Elly Yulia Teknis Umum

Indriyanto Setio P.
SKom

Kasubid Pembinaan
Kepala Bidang Disiplin dan Kinerja
Pengembangan
Karir Nia Kurniawati SIP

H Rachmat Kasubid Penempatan


Supriatna SH dalam Jabatan
MM
Aries Hendardi SH
Kepala Badan MH
Kepegawaian,
Pendidikan dan Kasubid
Pelatihan Kota Bogor Kepangkatan dan
Pensiun
Dwi Eoman Pujo
Kepala Bidang
Prasetyo SH MM Mutasi Ade Sumarjo SKom

Hidayatulloh
SIP MSi Kasubid Formasi dan
Pengadaan Pegawai
2013
Ela Pamela AMd

Kasubid
Administrasi dan
Kesejahteraan
Kepala Bidang Pegawsi
Informasi,
Administrasi Neneng
dan Sukarnengsih
Kesejahteraan
Pegawai Kasubid Informasi
dan Data
Euis Rochayati Kepegawaian
SIP MSi
Tosan Wiar
Ramdhani Skom MTi

Kasubang
Perencanaan dan
Pelaporan

Sekertaris Badan Indriyani Yuni


Kepegawaian, Nugraha SH
Pendidikan dan
Pelatihan
Kasubang Keuangan
Hj Ida Priatni SH
Sri Sulastri

Kasubang Umum dan


Kepegawaian

Endang Murtisari SE

Gambar 4 Struktur organisasi BKPP Kota Bogor


13

4 PEMBUATAN REST SERVICE SIMPEG API DI KANTOR


WALIKOTA BOGOR

Pembuatan REST service SIMPEG API di Kantor Walikota Bogor


merupakan sebuah aplikasi yang dibuat menggunakan metode incremental.
Metode ini menggunakan lima tahap yaitu tahap komunikasi, perencanaan,
pemodelan, pembangunan, dan penyerahan sistem. Model incremental memiliki
iterasi yang disebut dengan increment yang membagi sistem ke dalam subsistem.
Dalam pelaksanaanya, terdapat tiga kali increment untuk menghasilkan SIMPEG
API yang sesuai dengan kebutuhan pengguna. Jalur akses yang digunakan untuk
mengakses method SIMPEG API menggunakan protokol HTTPS yang aman dan
tersertifikasi.

4.1 Increment Pertama

Pada increment pertama dilakukan untuk menghasilkan produk utama.


Produk utama yang dihasilkan merupakan sebuah sistem yang akan digunakan
pada semua method pada increment selanjutnya. Produk utama ini dibuat sebagai
method utama untuk melakukan validasi user, validasi method, dan mencatat
pengaksesan method yang dipanggil pada SIMPEG API. Dalam pembutan produk
utama ini digunakan basis data yang berbeda dengan method pada increment
selanjutnya.

4.1.1 Komunikasi
Pada tahap komunikasi, digunakan teknik wawancara, JAD (joint
application development), dan observasi. Dari hasil komunikasi didapatkan bahwa
BKPP Kota Bogor memerlukan sebuah API (application programming interface)
sebagai aplikasi yang dapat digunakan diberbagai pengembangan aplikasi lainnya.
Selain itu, diidentifikasi bahwa API yang akan dikembangkan harus dapat
memverifikasi, memproses dan mengembalikan nilai yang sesuai dengan
kebutuhan aplikasi.

4.1.2 Perencanaan
SIMPEG API merupakan sebuah sistem yang memungkinkan pengguna
internal maupun eksternal untuk mengkonsumsi data yang telah disediakan.
SIMPEG API merupakan sebuah sistem penyediaan data kepegawaian yang basis
datanya sudah dikembangkan oleh pihak BKPP. Dalam pembuatan SIMPEG API
ini, direncanakan dengan mengidentifikasi spesifikasi yang dibutuhkan.
Spesifikasi tersebut adalah:
1 REST service
2 DBMS MYSQL
3 Bahasa pemrograman Java.
4 Framework spring.
14

Pada increment pertama, SIMPEG API menyediakan layanan validasi user,


validasi method, dan pencatatan pengaksesan data. Basis data yang diakses
merupakan basis data yang terpisah dengan basis data kepegawaian.

4.1.3 Pemodelan
Pada tahap ini dilakukan analisis dan perancangan yang akan digunakan
pada pembangunan SIMPEG API. Adapun analisis yang dilakukan adalah analisis
spesifikasi, analisis database dan analisis kebutuhan fungsional. Hasil dari
analisis tersebut adalah sebagai berikut:

a Analisis Spesifikasi
Pada tahap sebelumnya, dilakukan perencanaan spesifikasi dalam
pembangunan SIMPEG API. Setelah dilakukan perencanaan, maka diidentifikasi
spesifikasi perangkat lunak yang akan digunakan dalam pembangunan SIMPEG
API. Adapun spesifikasi perangkat lunak adalah sebagai berikut:
1 Spring Tool Suite 3.6.4
2 Java Development Kit (JDK) 7
3 JavaSE 1.7
4 Maven
5 Subversion (SVN)

b Analisis Database
Pada tahap analisis database diidentifikasi struktur data pada tabel yang
akan digunakan pada SIMPEG API. Database yang digunakan pada increment
pertama yaitu database SIMPEG API yang memiliki 4 tabel yang diakses oleh
REST service SIMPEG API dan 8 tabel yang diakses oleh dokumentasi SIMPEG
API. Jumlah dari database ini adalah 8 tabel yaitu tabel aplikasi, user, method,
error_status, user_app, dum_user_app, api_akses, log_api, Tabel 2 merupakan
struktur data pada tabel aplikasi, Tabel 3 merupakan struktur data pada tabel user,
Tabel 4 merupakan struktur data pada tabel method, Tabel 5 merupakan strktur
data pada tabel error_status, Tabel 6 merupakan struktur data pada tabel user_app,
Tabel 7 merupakan struktur data pada tabel dum_user_app, Tabel 8 merupakan
struktur data pada tabel api_akses, dan Tabel 9 merupakan struktur data pada tabel
log_api.

Tabel 2 Struktur data aplikasi


Nama Kolom Tipe Data Keterangan
id_aplikasi Integer Primary Key
nama_aplikasi varchar(50)
api_key varchar(50)

Tabel 3 Struktur data user


Nama Kolom Tipe Data Keterangan
id_user Integer Primary Key
nama varchar(50)
username char(50)
password varchar(50)
email varchar(50)
15

no_telp varchar(12)
flag Integer

Tabel 4 Struktur data method


Nama Kolom Tipe Data Keterangan
id_method Integer Primary Key
nama_method varchar(50)
parameter varchar(500)
method_request char(4)
output varchar(500)
deskripsi varchar(1000)

Tabel 5 Struktur data error_status


Nama Kolom Tipe Data Keterangan
id_error Integer Primary Key
status varchar(100)

Tabel 6 Struktur data user_app


Nama Kolom Tipe Data Keterangan
id Integer Primary Key
id_user Integer Foreign Key
id_aplikasi Integer Foreign Key

Tabel 7 Struktur data dum_user_app


Nama Kolom Tipe Data Keterangan
id Integer Primary Key
id_user Integer
id_aplikasi Integer

Tabel 8 Struktur data api_akses


Nama Kolom Tipe Data Keterangan
id_api_akses Integer Primary Key
id_aplikasi Integer Foreign Key
id_method Integer Foreign Key

Tabel 9 Struktur data log_api


Nama Kolom Tipe Data Keterangan
id_log Integer Primary Key
id_aplikasi Integer Foreign Key
id_method Integer Foreign Key
date_time Datetime

c Analisis Kebutuhan Fungsional


Pada increment pertama kebutuhan fungsional REST service SIMPEG API
dikelompokkan berdasarkan modul yang dikembangkan. Increment pertama
terdapat 4 modul dengan method yang berbeda-beda. Kebutuhan fungsional pada
increment pertama dapat dilihat pada Tabel 10.
16

Tabel 10 Kebutuhan fungsional pada increment pertama


Modul Fungsi
get_by_method
Api_akses
get_status
get_all
Aplikasi_api
get_aplikasi_detail
Log_api Tambah
get_by_nama
Method_api
get_id

4.1.4 Pembangunan
Pada tahap ini dilakukan pengkodean dan tes program dari SIMPEG API.
Bahasa pemrograman yang dipakai dalam pembuatan REST service SIMPEG API
adalah java dengan framework spring dan maven. Pada pembuatan REST service
dilakukan pengkodean pada layer model terlebih dahulu. Setelah melakukan
pengkodean pada layer model, dilakukan pengkodean pada layer DAO yang
melakukan pengambilan data pada basis data. Lalu, dilakukan penambahan bean
pada file spring.xml yang dapat menghubungkan layer DAO untuk berhubungan
dengan basis data menggunakan data source. Contoh pembuatan REST service
SIMPEG API adalah pembuatan Log_api. Kode program Log_api pada layer
model dapat dilihat pada Lampiran 1. Gambar 5 merupakan kode program
Log_api pada layer DAO interface class, Gambar 6 merupakan kode program
Log_api pada layer DAO, dan Gambar 7 merupakan kode program pembuatan
bean pada file spring.xml.

package api.simpeg.simpeg_api.dao;

public interface LogAPIDAO{

public void tambah(int id_aplikasi, int id_method);


}

Gambar 5 Kode program Log_api layer DAO interface class

package api.simpeg.simpeg_api.dao;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class LogAPIDAOJDBCTemplateImpl implements LogAPIDAO{

private DataSource dataSource;

@Autowired
public void setDataSource(DataSource dataSource){
this.dataSource = dataSource;
}

@Override
public void tambah(int id_aplikasi, int id_method){
String query = "INSERT INTO
log_api(id_aplikasi,id_method,date_time) VALUES("
17

@Override
public void tambah(int id_aplikasi, int id_method){
String query = "INSERT INTO
log_api(id_aplikasi,id_method,date_time) VALUES("
+ id_aplikasi + "," + id_method + ", now())";
JdbcTemplate jdbcTemplate = new
JdbcTemplate(dataSource);

jdbcTemplate.update("INSERT INTO
log_api(id_aplikasi,id_method,date_time)
VALUES(?,?, now())", id_aplikasi, id_method);
}
}

Gambar 6 Kode program Log_api layer DAO

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="logAPIDAO"
class="api.simpeg.simpeg_api.DAO.LogAPIDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource2" />
</bean>

<bean id="dataSource2"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/simpeg_api"
/>
<property name="username" value="root" />
<property name="password" value="" />
</bean>
</beans>

Gambar 7 Kode program bean Log_api

4.1.5 Penyerahan
Tahap penyerahan sistem dilakukan dengan menggunakan subversion
(SVN) sebagai tool untuk menyimpan pengerjaan method ke server. Selain itu,
penyerahan sistem menggunakan SVN ini merupakan penyerahan sistem yang
paling mudah kepada pengguna. Cara penyerahan sistem melalui SVN dapat
dilakukan ketika pengerjaan method sudah selesai dengan memilih menu team dan
memilih commit atau dengan menekan Ctrl+Alt+C. Penyerahan sistem
menggunakan SVN dapat dilihat pada Gambar 8.
18

Gambar 8 Penyerahan sistem increment pertama

4.2 Increment Kedua

Pada increment kedua dilakukan pembuatan method sebanyak 8 method.


Method yang dikembangkan pada increment kedua merupakan method yang akan
digunakan oleh aplikasi web. Secara spesifik 8 method yang akan dikembangkan
merupakan method untuk mendapatkan data pegawai dan data absensi.

4.2.1 Komunikasi
Komunikasi yang dilakukan pada increment kedua merupakan komunikasi
tambahan dari tahapan komunikasi yang telah dilakukan pada increment pertama.
Pada tahap komunikasi increment kedua dilakukan dengan menggunakan teknik
JAD. Hasil dari komunikasi dengan pihak BKPP Kota Bogor adalah
diperlukannya method yang menampilkan data pegawai dan data absensi. Data
pegawai secara spesifik dikembangkan menjadi 4 method. Sama halnya dengan
data pegawai, data absensi juga dikembangkan menjadi 4 method.

4.2.2 Perencanaan
Tahap perencanaan pada increment kedua, direncanakan penambahan
method sebanyak 8 method. Adapun 8 method tersebut merupakan 4 method yang
menampilkan data pegawai. dan 4 method yang menampilkan data absensi. Pada 4
method data pegawai yang akan dikembangkan merupakan method yang
menampilkan semua data pegawai, menampilkan data pegawai berdasarkan nama
pegawai, menampilkan data pegawai berdasarkan NIP pegawai, dan menampilkan
data pegawai berdasarkan unit kerja. Sedangkan 4 method data absensi yang akan
dikembangkan merupakan method yang menampilkan jumlah data pegawai yang
tidak hadir dan tidak ada keterangan apapun (alpa), menampilkan jumlah data
19

pegawai yang hadir, menampilkan jumlah data pegawai yang sakit, dan jumlah
data pegawai yang izin berdasarkan unit kerja.

4.2.3 Pemodelan

a Analisis Database
Pada increment kedua, basis data yang digunakan berbeda dengan basis data
yang digunakan pada increment pertama. Increment kedua menggunakan basis
data SIMPEG yang berisi data kepegawaian yang telah dikembangkan terlebih
dahulu oleh pihak BKPP. Adapun penggunaan tabel pada increment kedua
berjumlah tiga tabel yaitu tabel pegawai, tabel oasys_attendance_log, dan tabel
oasys_absent_reason_log. Tabel 11 merupakan struktur data pada tabel pegawai,
Tabel 12 merupakan struktur data pada tabel oasys_attendance_log yang berisi
data pegawai yang hadir, dan Tabel 13 merupakan struktur data pada tabel
oasys_absent_reason_log yang berisi data pegawai yang tidak hadir.

Tabel 11 Struktur data pegawai


Nama Kolom Tipe Data Keterangan
id_pegawai Integer Primary Key
nama varchar(50)
nama_pendek varchar(100)
gelar_depan varchar(20)
gelar_belakang varchar(20)
jenis_kelamin varchar(10)
gol_darah varchar(3)
agama varchar(20)
t4_lahir varchar(45)
tgl_lahir Date
alamat varchar(128)
kota varchar(50)
telepon varchar(15)
ponsel varchar(15)
status_pegawai varchar(15)
jenis_pegawai varchar(100)
nip_lama varchar(10)
nip_baru varchar(20)
no_karpeg varchar(20)
masa_kerja_pasif Integer
pangkat_gol varchar(10)
jenjab varchar(75)
jabatan varchar(150)
eselonering varchar(20)
tgl_pensiun_dini_old Date
tgl_pensiun_dini Date
status_kawin varchar(20)
password varchar(128)
status_aktif varchar(45)
keterangan varchar(128)
id_user varchar(20)
tgl_update Date
20

flag_pensiun Integer
id_j Integer
id_next Integer
npwp varchar(20)
my_status varchar(1000)
no_karisu varchar(20)
id_detail Integer
id_bos Integer
tgl_cetak_card_depan Date
tgl_cetak_card_belakang Date
timestamp Timestamp
email Text
jumlah_transit Integer
os Text
imei Bigint

Tabel 12 Struktur data oasys_attendance_log


Nama Kolom Tipe Data Keterangan
id Integer Primary Key
id_pegawai Integer Foreign Key
date_time Datetime
status varchar(45)
longitude Double
latitude Double

Tabel 13 Struktur data oasys_absent_reason_log


Nama Kolom Tipe Data Keterangan
id Integer Primary Key
id_pegawai Integer Foreign Key
date_time Datetime
status varchar(45)

b Analisis Kebutuhan Fungsional


Analisis kebutuhan fungsional pada increment kedua terdapat dua modul
yaitu modul pegawai dan modul absensi. Masing-masing modul memiliki 4
method. Adapun kebutuhan fungsional dapat dilihat pada Tabel 14.

Tabel 14 Kebutuhan fungsional pada increment kedua


Modul Fungsi
absensi get_alpha
get_hadir
get_izin
get_sakit

pegawai find_all
find_by_nama
find_by_nip
find_by_unit_kerja
21

4.2.4 Pembangunan
Tahap pembangunan pada increment kedua dilakukan dengan membuat file
dengan ekstensi .java pada layer model. File yang dibuat pada layer model adalah
file Pegawai.java dan Absensi.java. Pada layer model dideklarasikan atribut dan
fungsi yang dibutuhkan. Contoh pembuatan REST service pada increment kedua
ialah pembuatan REST service pegawai. Gambar 8 merupakan kode program
pegawai pada layer model.

package api.simpeg.model;

public class Pegawai{

private int id;


private String nama;
private String nip;
private String jabatan;
private String unit_kerja;

//attribute for error handling


private int request_status=100;

public int getId() {


return id;
}
public void setId(int id) {
this.id = id;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public String getNip() {
return nip;
}
public void setNip(String nip) {
this.nip = nip;
}
public String getJabatan() {
return jabatan;
}
public void setJabatan(String jabatan) {
this.jabatan = jabatan;
}
public String getUnit_kerja() {
return unit_kerja;
}
public void setUnit_kerja(String unit_kerja) {
this.unit_kerja = unit_kerja;
}

//method for error handling


public int getRequest_status() {
return request_status;
}
public void setRequest_status(int request_status) {
this.request_status = request_status;
}

@Override
public String toString(){
return "{id=" + id + ", nama=" + nama + ", nip =" + nip
22

}
public void setRequest_status(int request_status) {
this.request_status = request_status;
}

@Override
public String toString(){
return "{id=" + id + ", nama=" + nama + ", nip =" + nip
+ ", jabatan=" + jabatan + ", unit_kerja=" +
unit_kerja + ", request_status=" + request_status
+ "}";
}

public String ReqtoString(){


return "[{\"request_status\":" + request_status + "}]";
}
}

Gambar 9 Kode program pegawai layer model

Setelah pembuatan Pegawai.java pada layer model, dibuat pula


PegawaiDAO.java yang merupakan kelas interface. PegawaiDAO.java ini akan
diimplementasi pada file PegawaiDAOJDBCTemplateImpl.java pada tahap
selanjutnya. Gambar 10 merupakan kode program PegawaiDAO.java atau
pegawai pada layer DAO interface class.

package api.simpeg.dao;

import java.util.List;

import api.simpeg.model.Pegawai;

public List<Pegawai> find_all(String api_key);

public List<Pegawai> find_by_nama(String nama, String


api_key);

public List<Pegawai> find_by_nip(String nip, String api_key);

public List<Pegawai> find_by_unit_kerja(String unit_kerja,


String api_key);
}

Gambar 10 Kode program pegawai layer DAO interface class

PegawaiDAO.java yang telah dibuat sebelumnya merupakan kelas yang


harus diimplementasikan pada kelas lainnya. PegawaiDAOJDBCTemplate-
Impl.java merupakan kelas implements dari kelas PegawaiDAO.java.
PegawaiDAOJDBCTemplateImpl.java merupakan kelas yang berhubungan
langsung dengan basis data untuk mengambil data yang dibutuhkan. Lampiran 2
merupakan kode program dari PegawaiDAOJDBCTemplateImpl.java atau
pegawai layer DAO.
23

Dalam REST service penghubung antara masukan pengguna dengan layer


DAO adalah layer controller. Pada tahap sebelumnya telah dibuat kode program
pada layer DAO yaitu PegawaiDAOJDBCTemplateImpl.java. Oleh karena itu,
dibuat pula PegawaiRestController.java sebagai layer controller dari pegawai.
Lampiran 3 merupakan kode program dari PegawaiRestController.java atau
pegawai layer controller.
Sebelum melakukan pengujian pada method yang sudah dikembangkan,
dibuat pula bean pada sping.xml. Pembuatan bean ini merupakan penghubung
antara datasource yang diperlukan untuk menghubungkan service dengan basis
data. Adapun kode program bean pada spring.xml dapat dilihat pada Gambar 11.
Setelah pembuatan kode program pada layer model; DAO interface class;
DAO; controller; pembuatan bean pada spring.xml selesai, maka dilakukan
metode pengujian dengan menggunakan UAT (user acceptance test). Metode
pengujian ini dilakukan oleh pengguna dan pembuat sistem. Dalam pengujiannya,
dilakukan dengan membuat URL pada browser. Gambar 12 merupakan URL
untuk pengujian untuk method pegawai/find_by_nip. Sedangkan Gambar 13
merupakan hasil pengujian dari method pegawai/find_by_nip.

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- Penambahan kode bean -->


<bean id="pegawaiDAO"
class="api.simpeg.dao.PegawaiDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- Penambahan kode bean -->

<bean id="apiAksesDAO"
class="api.simpeg.simpeg_api.dao.ApiAksesDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource2" />
</bean>

<bean id="methodAPIDAO"
class="api.simpeg.simpeg_api.dao.MethodAPIDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource2" />
</bean>

<bean id="aplikasiAPIDAO"
class="api.simpeg.simpeg_api.dao.AplikasiAPIDAOJDBCTempaletImpl">
<property name="dataSource" ref="dataSource2" />
</bean>
<bean id="logAPIDAO"
class="api.simpeg.simpeg_api.dao.LogAPIDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource2" />
</bean>

<!-- Penambahan kode bean -->


<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"

value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/simpeg" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
24

<!-- Penambahan kode bean -->


<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/simpeg" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<!-- Penambahan kode bean -->

<bean id="dataSource2"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/simpeg_api"/>
<property name="username" value="root" />
<property name="password" value="" />
</bean>
</beans>

Gambar 11 Kode program bean pegawai

https://localhost:8080/pegawai/find_by_nip?nip=198107292006041008&api
_key=068ef921a60778c4e7d71c488ff3c475

Gambar 12 URL pengujian method pegawai/find_by_nip

[{"id":4086,"nama":"Tosan Wiar
Ramdhani","nip":"198107292006041008","jabatan":"Kasubid Informasi dan
Data Kepegawaian pada Badan Kepegawaian, Pendidikan dan Pelatihan
Kota Bogor","unit_kerja":"Badan Kepegawaian Pendidikan dan
Pelatihan","request_status":100}]

Gambar 13 Hasil pengujian method pegawai/find_by_nip

4.2.5 Penyerahan
Penyerahan sistem pada increment kedua dilakukan menggunakan SVN.
Penyerahan dilakukan untuk menambahkan kode program pada increment kedua
dengan kode program yang sudah diserahkan sebelumnya pada increment
pertama. Penyerahan dapat dilakukan dengan memilih menu team dan memilih
commit atau dengan CTRL+ALT+C. Gambar 14 merupakan penyerahan sistem
pada increment kedua dengan menggunakan SVN.
25

Gambar 14 Penyerahan sistem increment kedua

4.3 Increment Ketiga

Pada increment ketiga dilakukan pembuatan method untuk aplikasi mobile


dan web. Method yang dikembangkan pada increment ketiga berjumlah 23
method. Secara spesifik method yang dikembangkan diklasifikasikan menjadi data
pegawai mobile, absensi mobile, post, unit kerja, kenaikan gaji berkala (KGB),
dan statistik.

4.3.1 Komunikasi
Tahap komunikasi pada increment ketiga dilakukan dengan teknik JAD.
Komunikasi pada increment ketiga dilakukan untuk mengklarifikasi kembali
kebutuhan sistem SIMPEG API. Selain itu, komunikasi dilakukan untuk
mendapatakan kebutuhan sistem yang sebelumnya belum teridentifikasi. Hasil
dari komunikasi yang dilakukan dengan pihak BKPP dan pengguna yaitu
diperlukannya method yang diakses oleh aplikasi mobile dan
mengimplementasikan beberapa method yang sudah ada pada SIMPEG Web.
Jumlah method yang diperlukan sebanyak 23 method tambahan.

4.3.2 Perencanaan
Tahap perencanaan pada increment ketiga ini direncanakan dengan
menambahkan 23 method tambahan. Method tersebut merupakan method yang
telah diklasifikasikan berdasarkan data yang dibutuhkan. Method yang
diklasifikasikan tersebut merupakan method yang membutuhkan data pegawai,
absensi, post, unit kerja, KGB, dan statistik. Data KGB dan statistik merupakan
method yang sudah dikembangkan oleh pihak BKPP pada SIMPEG Web.
Sedangkan data pegawai, absensi, post, dan unit kerja dikembangkan berdasarkan
26

kebutuhan pengguna. Pada aplikasi mobile diperlukan method untuk


menambahkan kehadiran pegawai; menambahkan ketidakhadiran pegawai;
menampilkan riwayat absensi pegawai; membuat fungsi login; menambahkan
komentar; menambahkan posting-an; menampilkan id dan nama unit kerja;
menampilkan lokasi kerja berdasarkan unit kerja. Sedangkan untuk method yang
dapat diakses oleh aplikasi mobile dan aplikasi web terdapat 15 method
diantaranya adalah method untuk menampikan data KGB; menampilkan data
KGB berdasarkan unit kerja; menampilkan komentar; menampilkan posting-an;
menampilkan unit kerja; menampilkan unit kerja berdasarkan unit kerja;
menampilkan data statistik pegawai berdasarkan bidang pendidikan; menampilkan
data statistik pegawai berdasarkan fungsional; menampilkan data statistik pegawai
berdasarkan golongan; menampilkan data statistik pegawai berdasarkan jabatan;
menampilkan data statistik berdasarkan jenis kelamin; menampilkan data statistik
pegawai berdasarkan lulusan perguran tinggi; menampilkan statistik pegawai
berdasarkan pendidikan; menampilkan statistik pegawai berdasarkan struktural;
menampilkan statistik pegawai berdasarkan umur.

4.3.3 Pemodelan

a Analisis Database
Pada increment ketiga basis data yang dipakai sama dengan basis data pada
increment kedua yaitu basis data SIMPEG. Data yang diperlukan pada increment
ketiga membutuhkan 12 tabel yaitu tabel pegawai, oasys_attendance_log yang
berisi data kehadiran pegawai, oasys_absent_reason_log yang berisi data
ketidakhadiran pegawai, post, unit_kerja, current_lokasi_kerja, kgb_daftar,
pendidikan_terakhir, pendidikan, bidang_pendidikan, institusi_pendidikan, dan
jabatan. Struktur data pada tabel pegawai, oasys_attendance_log, dan tabel
oasys_absent_reason_log dapat dilihat pada Tabel 11, Tabel 12, dan Tabel 13.
Sedangkan Tabel 15 adalah struktur data pada tabel post, Tabel 16 adalah struktur
data pada tabel unit_kerja, Tabel 17 adalah struktur data pada tabel
current_lokasi_kerja, Tabel 18 adalah struktur data pada tabel kgb_daftar,
Tabel 19 adalah struktur data pada tabel pendidikan_terakhir, Tabel 20 adalah
struktur data pada tabel pendidikan, Tabel 21 adalah struktur data pada tabel
bidang_pendidikan, Tabel 22 adalah struktur data pada tabel institusi_pendidikan,
dan Tabel 23 adalah struktur data pada tabel jabatan.

Tabel 15 Struktur data post


Nama Kolom Tipe Data Keterangan
id_post integer Primary Key
msg text
id_pegawai integer Foreign Key
kapan datetime
parent_id integer

Tabel 16 Struktur data unit_kerja


Nama Kolom Tipe Data Keterangan
id_unit_kerja integer Primary Key
nama_lama varchar(100)
27

nama_baru varchar(100)
alamat varchar(128)
telp varchar(20)
ext_telp varchar(10)
email_opd varchar(300)
tahun integer
singkatan varchar(50)
id_skpd integer
id_old integer
long_lat point
long_lat_outer point

Tabel 17 Struktur data current_lokasi_kerja


Nama Kolom Tipe Data Keterangan
id_aja integer Primary Key
id_pegawai integer Foreign Key
id_unit_kerja integer Foreign Key

Tabel 18 Struktur data kgb_daftar


Nama Kolom Tipe Data Keterangan
tahun integer Primary Key
id_pegawai integer Foreign Key
id_unit_kerja integer Foreign Key
pangkat_gol varchar(10)
mkg_thn integer
mkg_bln integer
gapok double
tmt_kgb date
tmt_kgb_yad date

Tabel 19 Struktur data pendidikan_terakhir


Nama Kolom Tipe Data Keterangan
id_pendidikan integer Primary Key
id_pegawai integer Foreign Key
lembaga_pendidikan varchar(128)
tingkat_pendidikan varchar(30)
jurusan_pendidikan varchar(128)
tahun_lulus integer
level_p integer
id_berkas bigint

Tabel 20 Struktur data pendidikan


Nama Kolom Tipe Data Keterangan
id_pendidikan integer Primary Key
id_pegawai integer Foreign Key
lembaga_pendidikan varchar(128)
tingkat_pendidikan varchar(30)
jurusan_pendidikan varchar(128)
tahun_lulus integer
level_p integer
id_berkas bigint
28

id_bidang integer Foreign Key


id_institusi integer Foreign Key

Tabel 21 Struktur data bidang_pendidikan


Nama Kolom Tipe Data Keterangan
id integer Primary Key
bidang text

Tabel 22 Struktur data institusi_pendidikan


Nama Kolom Tipe Data Keterangan
id integer Primary Key
institusi text

Tabel 23 Struktur data jabatan


Nama Kolom Tipe Data Keterangan
id_j integer Primary Key
jabatan varchar(150)
id_unit_kerja integer Foreign Key
id_bos integer Foreign Key
eselon varchar(20)
level integer
tunjangan varchar(20)
tahun integer
id_pegawai integer Foreign Key
id_j_old integer

b Analisis Kebutuhan Fungsional


Kebutuhan fungsional pada increment ketiga dapat dilihat pada Tabel 24.

Tabel 24 Kebutuhan fungsional pada increment ketiga


Modul Fungsi Aktor
absensi_mobile hadir SIMPEG Mobile
tidak_hadir SIMPEG Mobile
get_attendance SIMPEG Mobile

pegawai_mobile login SIMPEG Mobile

post add_comments SIMPEG Mobile


add_message SIMPEG Mobile
get_comments SIMPEG Mobile,
SIMPEG Web
get_timeline SIMPEG Mobile,
SIMPEG Web

unit_kerja get_id_nama SIMPEG Mobile


get_location_uk SIMPEG Mobile
get_all SIMPEG Mobile,
SIMPEG Web
get_by_unit_kerja SIMPEG Mobile,
SIMPEG Web
29

kgb get_all SIMPEG Mobile,


SIMPEG Web
get_by_unit_kerja SIMPEG Mobile,
SIMPEG Web

statistic getStatisticBidangPendidikan SIMPEG Mobile,


SIMPEG Web
getStatisticFungsional SIMPEG Mobile,
SIMPEG Web
getStatisticGolongan SIMPEG Mobile,
SIMPEG Web
getStatisticJabatan SIMPEG Mobile,
SIMPEG Web
getStatisticJenisKelamin SIMPEG Mobile,
SIMPEG Web
getStatisticLulusanPt SIMPEG Mobile,
SIMPEG Web
getStatisticPendidikan SIMPEG Mobile,
SIMPEG Web
getStatisticStruktural SIMPEG Mobile,
SIMPEG Web
getStatisticUmur SIMPEG Mobile,
SIMPEG Web

4.3.4 Pembangunan
Tahap pembangunan pada increment ketiga dilakukan dengan
mendefinisikan atribut dan fungsi pada layer model untuk setiap modul.
Pendefinisian dilakukan dengan membuat file berekstensi .java. Contoh REST
service yang dibuat pada increment ketiga adalah service absensi_mobile.
Gambar 15 merupakan kode program dari Absensi_mobile.java atau
absensi_mobile layer model.

package api.simpeg.model;

public class Absensi_mobile{


private int id;
private int id_pegawai;
private String date_time;
private String status;
private String long_lat;

//attribute for error handling


private int request_status=100;

public int getId() {


return id;
}
public void setId(int id) {
this.id = id;
}
public int getId_pegawai() {
return id_pegawai;
}
public void setId_pegawai(int id_pegawai) {
this.id_pegawai = id_pegawai;
}
public String getDate_time() {
return date_time;
}
public void setDate_time(String date_time) {
30

}
public void setId_pegawai(int id_pegawai) {
this.id_pegawai = id_pegawai;
}
public String getDate_time() {
return date_time;
}
public void setDate_time(String date_time) {
this.date_time = date_time;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getLong_lat() {
return long_lat;
}
public void setLong_lat(String long_lat) {
this.long_lat = long_lat;
}

//method for error handling


public int getRequest_status() {
return request_status;
}
public void setRequest_status(int request_status) {
this.request_status = request_status;
}
return id_pegawai;
}
public void setId_pegawai(int id_pegawai) {
this.id_pegawai = id_pegawai;
}
public String getDate_time() {
return date_time;
}
public void setDate_time(String date_time) {
this.date_time = date_time;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getLong_lat() {
return long_lat;
}
public void setLong_lat(String long_lat) {
this.long_lat = long_lat;
}

Gambar 15 Kode program absensi_mobile layer model


//method for error handling
public int getRequest_status() {
return request_status;
}
public void setRequest_status(int request_status) {
this.request_status = request_status;
}

@Override
31

Setelah pembuatan absensi_mobile.java selesai, dilakukan pengkodean pada


layer DAO interface class yang merupakan kelas interface yang akan
diimplementasi pada layer DAO. Pembuatan layer DAO interface class berisi
daftar method yang akan dikembangkan pada layer DAO. Dalam pembuatan
absensi_mobile layer DAO interface class, dibuat file AbsensiDAO.java. Adapun
absensi_mobile layer DAO interface class dapat dilihat pada Gambar 16.

package api.simpeg.dao;

import java.util.List;

import api.simpeg.model.Absensi_mobile;

public interface AbsensiMobileDAO{

public String hadir(String id_pegawai, String nip, String


password, String x, String y, String imei, String
api_key);

public String tidak_hadir(String id_pegawai, String status,


String api_key);

public List<Absensi_mobile> get_attendance(String id_pegawai,


String api_key);
}

Gambar 16 Kode program absensi_mobile layer DAO interface class

AbsensiMobileDAO.java yang telah dibuat sebelumnya merupakan kelas


interface yang akan diimplementasi pada AbsensiMobileDAOJDBC-
TemplateImpl.java. AbsensiMobileDAOJDBCTemplateImpl.java merupakan
nama file dari absensi_mobile layer DAO. Pada file ini akan diimplementasi
semua method yang telah dibuat pada kelas AbsensiMobileDAO.java. Adapun
kode program dari AbsensiMobileDAOJDBCTemplateImpl.java atau
absensi_mobile layer DAO dapat dilihat pada Lampiran 4.
Service yang telah dibuat dapat diakses langsung oleh pengguna dengan
membuat layer controller. Pada layer controller ditentukan secara spesifik nama
method, parameter yang dibutuhkan, dan metode pemanggilan service. Dalam
modul absensi_mobile dibuat AbsensiMobileRestController.java sebagai
absensi_mobile layer controller. Adapun absensi_mobile layer controller dapat
dilihat pada Lampiran 5. Selain absensi_mobile, dibuat pula pegawai_mobile
sebagai contoh pembuatan service. Lampiran 6 merupakan kode program dari
pegawai_mobile layer model, Lampiran 7 merupakan kode program
pegawai_monile layer DAO interface class, Lampiran 8 merupakan kode program
pegawai_mobile layer DAO, dan Lampiran 9 merupakan kode program
pegawai_mobile layer controller. Sedangkan Lampiran 10 merupakan daftar
request status dari setiap pemanggilan method.
Setelah membuat layer controller, penambahan bean pada file spring.xml
merupakan tahapan selanjutnya. Penambahan bean dilakukan untuk mengakses
32

datasource yang menghubungkannya langsung pada basis data. Adapun


penambahan bean pada spring.xml dapat dilihat pada Gambar 17.

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="pegawaiDAO"
class="api.simpeg.DAO.PegawaiDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource" />
</bean>

<!-- Penambahan kode bean -->


<bean id="absensiMobileDAO"
class="api.simpeg.DAO.AbsensiMobileDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- Penambahan kode bean -->

<bean id="apiAksesDAO"
class="api.simpeg.simpeg_api.DAO.ApiAksesDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource2" />
</bean>

<bean id="methodAPIDAO"
class="api.simpeg.simpeg_api.DAO.MethodAPIDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource2" />
</bean>

<bean id="aplikasiAPIDAO"
class="api.simpeg.simpeg_api.DAO.AplikasiAPIDAOJDBCTempaletImpl">
<property name="dataSource" ref="dataSource2" />
</bean>

<bean id="logAPIDAO"
class="api.simpeg.simpeg_api.DAO.LogAPIDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource2" />
</bean>

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/simpeg" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>

<bean id="dataSource2"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/simpeg_api"
/>
<property name="username" value="root" />
<property name="password" value="" />
</bean>
</beans>
Gambar 17 Kode program bean absensi_mobile
33

Setelah pembuatan absensi_mobile pada layer model; DAO; controller


selesai dibuat, dilakukan pengujian terhadap method yang telah dibuat pada modul
absensi_mobile. Pengujian yang dilakukan yaitu dengan menggunakan metode
UAT. Selain itu, dalam metode pengujian dibuat sebuah file .html yang berisi
form pengujian. Gambar 18 adalah kode program form pengujian method
absensi_mobile/hadir, Gambar 19 adalah form pengujian method
absensi_mobile/hadir dan Gambar 20 adalah hasil pengujian method
absensi_mobile/hadir.

<html>
<head></head>
<body>
<form method="post"
action="https://localhost:8080/absensi_mobile
/hadir">
<label>ID Pegawai : </label>
<input name="id_pegawai" /><br/>
<label>NIP : </label>
<input name="nip" /><br/>
<label>Password : </label>
<input name="password" /><br/>
<label>Latitude : </label>
<input name="latitude" /><br/>
<label>Longitude : </label>
<input name="longitude" /><br/>
<label>Imei : </label>
<input name="imei" /><br/>
<label>API KEY : </label>
<input name="api_key" /><br/>
<button>Cek</button>
</form>
</body>
</html>

Gambar 18 Kode program form pengujian absensi_mobile/hadir

Gambar 19 Form pengujian absensi_mobile/hadir

[{"request_status":107}]

Gambar 20 Hasil pengujian absensi_mobile/hadir


34

4.3.5 Penyerahan
Tahap penyerahan pada increment ketiga dilakukan dengan menggunakan
SVN. Penyerahan dilakukan dengan menambahkan kode program yang telah
dikembangkan pada increment ketiga. Penyerahan dilakukan dengan memilih
menu team dan commit atau dengan CTRL+ALT+C. Adapun penyerahan sistem
increment ketiga dapat dilihat pada Gambar 21.

Gambar 21 Penyerahan sistem increment ketiga

Dalam pembuatan SIMPEG API, dibuat pula dokumentasi SIMPEG API.


Dokumentasi SIMPEG API ini merupakan sebuah dokumentasi yang mendukung
pengembang sistem untuk menggunakan SIMPEG API. Selain itu, dokumentasi
SIMPEG API ini menyediakan fungsi pendaftaran bagi pengembang yang belum
memiliki API key. Dokumentasi SIMPEG API dapat dilihat pada halaman website
http://bkpp.kotabogor.go.id/simpeg_api. Adapun layout dari dokumentasi
SIMPEG API dapat dilihat pada Gambar 22.

Gambar 22 Dokumentasi SIMPEG API


35

5 SIMPULAN DAN SARAN

5.1 Simpulan

SIMPEG API merupakan penyedia data kepegawaian PNS Kota Bogor.


SIMPEG API disediakan untuk pihak internal maupun eksternal untuk dapat
mengkonsumsi data kepegawaian PNS Kota Bogor sesuai dengan kebutuhannya.
SIMPEG API menjembatani antara basis data kepegawaian dengan aplikasi web
maupun mobile. SIMPEG API diuji dengan memakai metode UAT. Selain itu,
pengembangan SIMPEG API ditunjang oleh SVN sebagai cara penyerahan sistem
pada setiap increment selesai dilakukan.
SIMPEG API telah menyediakan layanan penyediaan data yang dinamis
secara publik. SIMPEG API menyeragamkan data yang diterima oleh pihak
internal maupun eksternal mengenai data kepegawaian Pegawai Negeri Sipil Kota
Bogor. SIMPEG API telah menyediakan akses data yang dapat digunakan di
berbagai aplikasi dan di berbagai platform. SIMPEG API menyediakan keamanan
yang berkaitan dengan penggunaan data maupun sumber data, karena
pengembang aplikasi tidak perlu berhubungan langsung dengan basis data. Selain
itu, SIMPEG API merupakan service yang menyediakan 31 method yang dapat
diakses oleh publik dan 4 method yang diakses oleh setiap method.

5.2 Saran

Dalam pengembangan SIMPEG API lebih lanjut, diharapkan adanya sebuah


spesifikasi yang berbeda antara method yang dikembangkan untuk pihak eksternal
dan method yang dikembangkan untuk pihak publik. Perlu adanya verifikasi
device pada setiap method, agar hak akses pada setiap aplikasi dapat dibatasi.
Selain itu, diperlukannya fungsi monitoring penggunaan method pada website
dokumentasi SIMPEG API.

DAFTAR PUSTAKA

Bell C. 2012. Expert MySQL. Ed ke-2. California (US): Apress Media.

Dennis A, Wixom BH, Roth RM. 2012. Systems Analysis and Design. Ed ke-5.
New Jersey (US): John Wiley & Sons.

Hornby AS. 2000. Oxford Advanced Learner's Dictonary of Current English. Ed


ke-6. Oxford (UK): Oxford University Press.
36

Johnson R, Hoeller J, Donald K, Sampaleanu C, Harrop R, Risberg T, Arendsen


A, Davison D, Kopylenko D, Pollack M, Tempiler T et al. 2014. Spring
Framework Reference Documentation. California (US): Pivotal Software.

Karlin M. 2013. Java Web Services: Up and Running. Ed ke-2. Blanchette M,


editor. California (US): O'Reilly Media.

Konda M. 2011. Just Spring. Loukides M, editor. California (US): O'Reilly


Media.

Lans RF van der. 2007. Introduction to SQL. Ed ke-4. Massachusetts (US):


Pearson Education.

Mason M. 2010. Pragmantic Guide to Subversion. Carter J, editor. Texas (US):


Pragmantic Programmers.

[Microsoft] Microsoft Corporation. 2002. Microsoft Computer Dictonary. Ed ke-


5. Washington (US): Microsoft Press.

Prasetyo DD. 2007. 150 Rahasia Pemrograman Java. Jakarta (ID): PT Elex
Media Komputindo.

Pressman RS. 2010. Software Engineering: A Practitioner’s Approach. New York


(US): McGraw-Hill Higher Education.

Raharjo B, Heryanto I, Haryono A. 2007. Mudah Belajar Java. Bandung (ID):


Penerbit Informatika.

Satzinger JW, Jackson RB, Burd SD. 2010. Systems Analysis and Design in a
Changing World. Ed ke-5. Massachusetts (US): Course Technology.

Sommervile I. 2011. Software Engineering. Ed ke-9. Massachusetts (US): Pearson


Education.

Varanasi B, Belida S. 2014. Introducing Maven. California (US): Apress Media.


37

LAMPIRAN
38

Lampiran 1 Kode program Log_api layer model


package api.simpeg.simpeg_api.model;

public class Log_api{


private int id_log;
private int id_aplikasi;
private int id_method;
private String date_time;

public int getId_log() {


return id_log;
}

public void setId_log(int id_log) {


this.id_log = id_log;
}
public int getId_aplikasi() {
return id_aplikasi;
}
public void setId_aplikasi(int id_aplikasi) {
this.id_aplikasi = id_aplikasi;
}
public int getId_method() {
return id_method;
}
public void setId_method(int id_method) {
this.id_method = id_method;

}
public String getDate_time() {
return date_time;
}
public void setDate_time(String date_time) {
this.date_time = date_time;
}

@Override
public String toString(){
return "{id=" + id_log + ", id_aplikasi=" + id_aplikasi
+ ", id_method =" + id_method + ", date_time=" +
date_time + "}";
}
}
39

Lampiran 2 Kode program pegawai layer DAO


package api.simpeg.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import api.simpeg.model.Pegawai;
import api.simpeg.simpeg_api.dao.ApiAksesDAO;
import api.simpeg.simpeg_api.dao.AplikasiAPIDAO;
import api.simpeg.simpeg_api.dao.LogAPIDAO;
import api.simpeg.simpeg_api.dao.MethodAPIDAO;
import api.simpeg.simpeg_api.model.Api_akses;
import api.simpeg.simpeg_api.model.Aplikasi_api;

@Repository
public class PegawaiDAOJDBCTemplateImpl implements PegawaiDAO{
private DataSource dataSource;

@Autowired
public void setDataSource(DataSource dataSource){
this.dataSource = dataSource;
}

@Override
public List<Pegawai> find_all(String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
MethodAPIDAO methodDAO = ctx.getBean("methodAPIDAO",
MethodAPIDAO.class);
AplikasiAPIDAO aplikasiDAO = ctx.getBean("aplikasiAPIDAO",
AplikasiAPIDAO.class);
LogAPIDAO logDAO = ctx.getBean("logAPIDAO",
LogAPIDAO.class);
ApiAksesDAO apiDAO = ctx.getBean("apiAksesDAO",
ApiAksesDAO.class);

//atribut untuk mengambil data aplikasi dan method


int id_method;
String api_keydb;
int id_aplikasi;
int id_app;
String nama_method = "pegawai/find_all";
Aplikasi_api aplikasi_api = new Aplikasi_api();
Api_akses app_akses = new Api_akses();

aplikasi_api = aplikasiDAO.get_aplikasi_detail(api_key);
id_aplikasi = aplikasi_api.getId_aplikasi();
api_keydb = aplikasi_api.getApi_key();

id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();

//atribut untuk menampilkan data pegawai


40

Lampiran 2 Kode program pegawai layer DAO (lanjutan)


api_keydb = aplikasi_api.getApi_key();

id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();

//atribut untuk menampilkan data pegawai


JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<Pegawai> pgwList = new ArrayList<Pegawai>();
Pegawai pgw_error = new Pegawai();

if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);

List<Map<String, Object>> pgwRows =


jdbcTemplate.queryForList("SELECT
p.id_pegawai, p.nama, p.nip_baru,
p.jabatan, p.flag_pensiun,
c.id_unit_kerja, u.nama_baru FROM
(pegawai as p INNER JOIN
current_lokasi_kerja as c on
p.id_pegawai = c.id_pegawai) INNER
JOIN unit_kerja as u on
c.id_unit_kerja = u.id_unit_kerja
WHERE p.flag_pensiun=0");

for (Map<String, Object> pgwRow : pgwRows){


Pegawai pgw = new Pegawai();

pgw.setId(Integer.parseInt(String.valueOf
(pgwRow.get("id_pegawai"))));

pgw.setNama(String.valueOf
(pgwRow.get("nama")));

pgw.setNip(String.valueOf
(pgwRow.get("nip_baru")));

pgw.setUnit_kerja(String.valueOf
(pgwRow.get("nama_baru")));

pgw.setJabatan(String.valueOf
(pgwRow.get("jabatan")));

pgwList.add(pgw);
}
}
else{
pgw_error.setRequest_status(101);
pgwList.add(pgw_error);
}
}
else{
pgw_error.setRequest_status(101);
pgwList.add(pgw_error);
}
return pgwList;
}

@Override
41

Lampiran 2 Kode program pegawai layer DAO (lanjutan)


pgw_error.setRequest_status(101);
pgwList.add(pgw_error);
}
return pgwList;
}

@Override
public List<Pegawai> find_by_nama(String nama, String
api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
MethodAPIDAO methodDAO = ctx.getBean("methodAPIDAO",
MethodAPIDAO.class);
AplikasiAPIDAO aplikasiDAO = ctx.getBean("aplikasiAPIDAO",
AplikasiAPIDAO.class);
LogAPIDAO logDAO = ctx.getBean("logAPIDAO", LogAPIDAO.class);
ApiAksesDAO apiDAO = ctx.getBean("apiAksesDAO",
ApiAksesDAO.class);

//atribut untuk mengambil data aplikasi dan method


int id_method;
String api_keydb;
int id_aplikasi;
int id_app;
String nama_method = "pegawai/find_by_nama";
Aplikasi_api aplikasi_api = new Aplikasi_api();
Api_akses app_akses = new Api_akses();

aplikasi_api = aplikasiDAO.get_aplikasi_detail(api_key);
id_aplikasi = aplikasi_api.getId_aplikasi();
api_keydb = aplikasi_api.getApi_key();

id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();
//atribut untuk menampilkan data pegawai
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<Pegawai> pgwList = new ArrayList<Pegawai>();
Pegawai pgw_error = new Pegawai();

if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);

List<Map<String, Object>> pgwRows =


jdbcTemplate.queryForList("SELECT p.id_pegawai, p.nama,
p.nip_baru, p.jabatan, p.flag_pensiun, c.id_unit_kerja,
u.nama_baru FROM (pegawai as p INNER JOIN
current_lokasi_kerja as c on p.id_pegawai =
c.id_pegawai) INNER JOIN unit_kerja as u on
c.id_unit_kerja = u.id_unit_kerja WHERE nama like ? AND
p.flag_pensiun=0", nama + "%");

for (Map<String, Object> pgwRow : pgwRows){


Pegawai pgw = new Pegawai();
u.id_unit_kerja WHERE nama like ? AND p.flag_pensiun=0", nama + "%");

for (Map<String, Object> pgwRow : pgwRows){


Pegawai pgw = new Pegawai();

pgw.setId(Integer.parseInt(String.valueOf(pgwRow.get("id_pegaw
42

Lampiran 2 Kode program pegawai layer DAO (lanjutan)


Pegawai pgw = new Pegawai();

pgw.setId(Integer.parseInt(String.valueOf
(pgwRow.get("id_pegawai"))));

pgw.setNama(String.valueOf(pgwRow.get("nama")));

pgw.setNip(String.valueOf(pgwRow.get
("nip_baru")));

pgw.setUnit_kerja(String.valueOf
(pgwRow.get("nama_baru")));

pgw.setJabatan(String.valueOf(pgwRow.get
("jabatan")));

pgwList.add(pgw);
}
}
else{
pgw_error.setRequest_status(101);
pgwList.add(pgw_error);
}
}
else{
pgw_error.setRequest_status(101);
pgwList.add(pgw_error);
}
return pgwList;
}

@Override
public List<Pegawai> find_by_nip(String nip, String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
MethodAPIDAO methodDAO = ctx.getBean("methodAPIDAO",
MethodAPIDAO.class);
AplikasiAPIDAO aplikasiDAO = ctx.getBean("aplikasiAPIDAO",
AplikasiAPIDAO.class);
LogAPIDAO logDAO = ctx.getBean("logAPIDAO",
LogAPIDAO.class);
ApiAksesDAO apiDAO = ctx.getBean("apiAksesDAO",
ApiAksesDAO.class);

//atribut untuk mengambil data aplikasi dan method


int id_method;
String api_keydb;
int id_aplikasi;
int id_app;
String nama_method = "pegawai/find_by_nip";
Aplikasi_api aplikasi_api = new Aplikasi_api();
Api_akses app_akses = new Api_akses();

aplikasi_api = aplikasiDAO.get_aplikasi_detail(api_key);
id_aplikasi = aplikasi_api.getId_aplikasi();
api_keydb = aplikasi_api.getApi_key();
api_keydb = aplikasi_api.getApi_key();

id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();
43

Lampiran 2 Kode program pegawai layer DAO (lanjutan)


@Override
public List<Pegawai> find_by_unit_kerja(String unit_kerja,
String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
MethodAPIDAO methodDAO = ctx.getBean("methodAPIDAO",
MethodAPIDAO.class);
AplikasiAPIDAO aplikasiDAO = ctx.getBean("aplikasiAPIDAO",
AplikasiAPIDAO.class);
LogAPIDAO logDAO = ctx.getBean("logAPIDAO", LogAPIDAO.class);
ApiAksesDAO apiDAO = ctx.getBean("apiAksesDAO",
ApiAksesDAO.class);

//atribut untuk mengambil data aplikasi dan method


int id_method;
String api_keydb;
int id_aplikasi;
int id_app;
String nama_method = "pegawai/find_by_unit_kerja";
Aplikasi_api aplikasi_api = new Aplikasi_api();
Api_akses app_akses = new Api_akses();

aplikasi_api = aplikasiDAO.get_aplikasi_detail(api_key);
id_aplikasi = aplikasi_api.getId_aplikasi();
api_keydb = aplikasi_api.getApi_key();

id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();

//atribut untuk menampilkan data pegawai


JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<Pegawai> pgwList = new ArrayList<Pegawai>();
Pegawai pgw_error = new Pegawai();

if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);

List<Map<String, Object>> pgwRows =


jdbcTemplate.queryForList("SELECT p.id_pegawai, p.nama,
p.nip_baru, p.jabatan, p.flag_pensiun, c.id_unit_kerja,
u.nama_baru FROM (pegawai as p INNER JOIN
current_lokasi_kerja as c on p.id_pegawai =
c.id_pegawai) INNER JOIN unit_kerja as u on
c.id_unit_kerja = u.id_unit_kerja WHERE nama_baru like ?
AND p.flag_pensiun=0", unit_kerja + "%");

for (Map<String, Object> pgwRow : pgwRows){


Pegawai pgw = new Pegawai();

pgw.setId(Integer.parseInt(String.valueOf
(pgwRow.get("id_pegawai"))));

pgw.setNama(String.valueOf(pgwRow.get("nama")));

pgw.setNip(String.valueOf(pgwRow.get
("nip_baru")));

pgw.setNama(String.valueOf(pgwRow.get("nama")));
44

Lampiran 2 Kode program pegawai layer DAO (lanjutan)


id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();

//atribut untuk menampilkan data pegawai


JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<Pegawai> pgwList = new ArrayList<Pegawai>();
Pegawai pgw_error = new Pegawai();

if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);

List<Map<String, Object>> pgwRows =


jdbcTemplate.queryForList("SELECT p.id_pegawai,
p.nama, p.nip_baru, p.jabatan, p.flag_pensiun,
c.id_unit_kerja, u.nama_baru FROM (pegawai as p
INNER JOIN current_lokasi_kerja as c on
p.id_pegawai = c.id_pegawai) INNER JOIN
unit_kerja as u on c.id_unit_kerja =
u.id_unit_kerja WHERE nip_baru=? AND
p.flag_pensiun=0", nip);

for (Map<String, Object> pgwRow : pgwRows){


Pegawai pgw = new Pegawai();

pgw.setId(Integer.parseInt(String.valueOf
(pgwRow.get("id_pegawai"))));

pgw.setNama(String.valueOf(pgwRow.get
("nama")));

pgw.setNip(String.valueOf
(pgwRow.get("nip_baru")));

pgw.setUnit_kerja(String.valueOf
(pgwRow.get("nama_baru")));

pgw.setJabatan(String.valueOf
(pgwRow.get("jabatan")));
pgwList.add(pgw);
}
}
else{
pgw_error.setRequest_status(101);
pgwList.add(pgw_error);
}
}
else{
pgw_error.setRequest_status(101);
pgwList.add(pgw_error);
}
return pgwList;
}

@Override
public List<Pegawai> find_by_unit_kerja(String unit_kerja,
String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
MethodAPIDAO methodDAO = ctx.getBean("methodAPIDAO",
45

Lampiran 2 Kode program pegawai layer DAO (lanjutan)


pgw.setNama(String.valueOf(pgwRow.get("nama")));

pgw.setNip(String.valueOf(pgwRow.get
("nip_baru")));

pgw.setUnit_kerja(String.valueOf(pgwRow.get
("nama_baru")));

pgw.setJabatan(String.valueOf(pgwRow.get
("jabatan")));
pgwList.add(pgw);
}
}
else{
pgw_error.setRequest_status(101);
pgwList.add(pgw_error);
}
}
else{
pgw_error.setRequest_status(101);
pgwList.add(pgw_error);
}
return pgwList;
}
}

Lampiran 3 Kode program pegawai layer controller


package api.simpeg.controllers;

import java.util.List;

import
org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import api.simpeg.dao.PegawaiDAO;
import api.simpeg.model.Pegawai;

@RestController
public class PegawaiRestController{

@RequestMapping("/pegawai/find_all")
@ResponseBody
List<Pegawai> pegawai_find_all(@RequestParam(value="api_key")
String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
PegawaiDAO pegawaiDAO = ctx.getBean("pegawaiDAO",

PegawaiDAO.class);
List<Pegawai> pgwList = pegawaiDAO.find_all(api_key);
return pgwList;
}
}
46

Lampiran 3 Kode program pegawai layer controller (lanjutan)


PegawaiDAO.class);
List<Pegawai> pgwList = pegawaiDAO.find_all(api_key);
return pgwList;
}

@RequestMapping("/pegawai/find_by_nama")
@ResponseBody
List<Pegawai> pegawai_find_by_nama(@RequestParam(value="nama")
String nama, @RequestParam(value="api_key") String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
PegawaiDAO pegawaiDAO = ctx.getBean("pegawaiDAO",
PegawaiDAO.class);
List<Pegawai> pgwList = pegawaiDAO.find_by_nama(nama,
api_key);
return pgwList;
}

@RequestMapping("/pegawai/find_by_nip")
@ResponseBody
List<Pegawai> pegawai_find_by_nip(@RequestParam(value="nip")
String nip, @RequestParam(value="api_key") String api_key){

ApplicationContext ctx = new


ClassPathXmlApplicationContext("spring.xml");
PegawaiDAO pegawaiDAO = ctx.getBean("pegawaiDAO",
PegawaiDAO.class);
List<Pegawai> pgwList = pegawaiDAO.find_by_nip(nip,api_key);
return pgwList;
}

@RequestMapping("/pegawai/find_by_unit_kerja")
@ResponseBody
List<Pegawai> pegawai_find_by_unit_kerja(@RequestParam
(value="unit_kerja") String unit_kerja,
@RequestParam(value="api_key") String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
PegawaiDAO pegawaiDAO = ctx.getBean("pegawaiDAO",
PegawaiDAO.class);
List<Pegawai> pgwList =
pegawaiDAO.find_by_unit_kerja(unit_kerja, api_key);
return pgwList;
}
}
47

Lampiran 4 Kode program absensi_mobile layer DAO


package api.simpeg.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.RowCountCallbackHandler;
import org.springframework.stereotype.Repository;

import scala.annotation.meta.getter;
import api.simpeg.model.Absensi_mobile;
import api.simpeg.model.Pegawai_mobile;
import api.simpeg.model.Unit_kerja;
import api.simpeg.simpeg_api.dao.ApiAksesDAO;
import api.simpeg.simpeg_api.dao.AplikasiAPIDAO;
import api.simpeg.simpeg_api.dao.LogAPIDAO;
import api.simpeg.simpeg_api.dao.MethodAPIDAO;
import api.simpeg.simpeg_api.model.Api_akses;
import api.simpeg.simpeg_api.model.Aplikasi_api;

@Repository
public class AbsensiMobileDAOJDBCTemplateImpl implements
AbsensiMobileDAO{
private DataSource dataSource;

@Autowired
public void setDataSource(DataSource dataSource){
this.dataSource = dataSource;
}

@Override
public String hadir(String id_pegawai, String nip, String
password, String x, String y, String imei, String
api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
MethodAPIDAO methodDAO = ctx.getBean("methodAPIDAO",
MethodAPIDAO.class);
AplikasiAPIDAO aplikasiDAO = ctx.getBean("aplikasiAPIDAO",
AplikasiAPIDAO.class);
LogAPIDAO logDAO = ctx.getBean("logAPIDAO",
LogAPIDAO.class);
ApiAksesDAO apiDAO = ctx.getBean("apiAksesDAO",
ApiAksesDAO.class);

//atribut untuk mengambil data aplikasi dan method

//atribut untuk mengambil data aplikasi dan method


int id_method;
48

//atribut untuk mengambil data aplikasi dan method


int id_method;
String api_keydb;
int id_aplikasi;
int id_app;
String nama_method = "absensi_mobile/hadir";
Aplikasi_api aplikasi_api = new Aplikasi_api();
Api_akses app_akses = new Api_akses();
aplikasi_api = aplikasiDAO.get_aplikasi_detail(api_key);
id_aplikasi = aplikasi_api.getId_aplikasi();
api_keydb = aplikasi_api.getApi_key();
id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();

//atribut untuk menambahkan absensi


JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
int status = 0;
int status_query = 0;
String latitude = null;
String longitude = null;
String imei_db = null;
UnitKerjaDAO ukDAO = ctx.getBean("unitKerjaDAO",
UnitKerjaDAO.class);
PegawaiMobileDAO pmDAO = ctx.getBean("pegawaiMobileDAO",
PegawaiMobileDAO.class);
Unit_kerja uk = new Unit_kerja();
Pegawai_mobile pm = new Pegawai_mobile();
uk = ukDAO.get_location_uk(id_pegawai);
pm = pmDAO.get_imei(id_pegawai);
latitude = String.valueOf(uk.getLatitude());
longitude = String.valueOf(uk.getLongitude());
imei_db = pm.getImei();
Absensi_mobile am = new Absensi_mobile();

//cek nip
PegawaiMobileDAO ogwDAO = ctx.getBean("pegawaiMobileDAO",
PegawaiMobileDAO.class);
String nip_pgw = null;
nip_pgw = ogwDAO.cek_nip(nip);
Pegawai_mobile pegawai = new Pegawai_mobile();

if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
if(nip.equals(nip_pgw)){
List<Map<String, Object>> pmRows =
jdbcTemplate.queryForList("SELECT p.id_pegawai,
p.nama, p.gelar_depan, p.gelar_belakang,
p.jenis_kelamin, p.gol_darah, p.agama,
p.tempat_lahir, p.tgl_lahir, p.alamat, p.nip_baru,
p.no_karpeg, p.masa_kerja_pasif, p.pangkat_gol,
p.jenjab, p.jabatan, p.eselonering,
p.tgl_pensiun_dini_old, p.tgl_pensiun_dini,
p.imei, p.flag_pensiun, p.password,
c.id_unit_kerja, u.nama_baru FROM (pegawai as p
INNER JOIN current_lokasi_kerja as c on
p.id_pegawai = c.id_pegawai) INNER JOIN unit_kerja
as u on c.id_unit_kerja = u.id_unit_kerja WHERE
p.flag_pensiun=0 AND p.nip_baru=? AND
p.password=?", nip, password);
, p.flag_pensiun, p.password, c.id_unit_kerja, u.nama_baru FROM
(pegawai as p INNER JOIN current_lokasi_kerja as c on p.id_pegawai =
49

Lampiran 4 Kode program absensi_mobile layer DAO (lanjutan)


INNER JOIN current_lokasi_kerja as c on
p.id_pegawai = c.id_pegawai) INNER JOIN unit_kerja
as u on c.id_unit_kerja = u.id_unit_kerja WHERE
p.flag_pensiun=0 AND p.nip_baru=? AND
p.password=?", nip, password);

for (Map<String, Object> pmRow : pmRows){

pegawai.setId_pegawai(Integer.parseInt(String.valu
eOf(pmRow.get("id_pegawai"))));

pegawai.setPassword(String.valueOf(pmRow.get("pas
sword")));
}

if(password.equals(pegawai.getPassword())){

//menambahkan data log_api


logDAO.tambah(id_aplikasi, id_method);

String stts;
int now_db = 0;
int min_db = 0;
int sec_db = 0;
String day_db = null;
int absensi_riwayat = 0;
String imei_dbb = null;

List<Map<String, Object>> now =


jdbcTemplate.queryForList("SELECT TIME(now()) as
now");

for (Map<String, Object> nows : now){


now_db = Integer.parseInt(String.valueOf
(nows.get("now")).substring(0, 2));

min_db = Integer.parseInt(String.valueOf
(nows.get("now")).substring(3, 5));

sec_db = Integer.parseInt(String.valueOf
(nows.get("now")).substring(6, 8));
}

now_db = 7 - now_db;
min_db = 40 - min_db;
sec_db = 0 - sec_db;

if(now_db > 0){


stts = "PRESENT";
status = 100;
}
else if(now_db == 0){
if(min_db >= 0){
if(sec_db >= 0){
stts = "PRESENT";

status = 100;
}
else{
stts = "LATE";
status = 107;
}
}
50

Lampiran 4 Kode program absensi_mobile layer DAO (lanjutan)


status = 100;
}
else{
stts = "LATE";
status = 107;
}
}
else{
stts = "LATE";
status = 107;
}
}
else{
stts = "LATE";
status = 107;
}

List<Map<String, Object>> cek_input =


jdbcTemplate.queryForList("SELECT * FROM
oasys_attendance_log WHERE id_pegawai=? AND date_time
LIKE CONCAT(DATE(now()),'%')", id_pegawai);

for (Map<String, Object> cek : cek_input){


absensi_riwayat = Integer.parseInt(String.valueOf
(cek.get("id")));
}

List<Map<String, Object>> day =


jdbcTemplate.queryForList("SELECT DAYNAME(now()) as
hari_ini");

for (Map<String, Object> days : day){


day_db = String.valueOf(days.get("hari_ini"));
}

//cek hari
if(day_db.equals("Saturday") ||
day_db.equals("Sunday")){
status = 108;
}
else{
//cek riwayat
if(absensi_riwayat == 0){
//cek imei
if(imei_db.equals(imei)){
status_query = jdbcTemplate.update("INSERT
INTO oasys_attendance_log(id_pegawai,
date_time, status, latitude, longitude)
VALUES (?,now(),?,?,?)",
id_pegawai,stts,x,y);

if(status_query == 1 && status == 100){


status = 100;
am.setRequest_status(status)
}
else if(status_query == 1 &&
status == 107){
status = 107;
am.setRequest_status(status);
}
else{
status = 104;
51

Lampiran 4 Kode program absensi_mobile layer DAO (lanjutan)


status == 107){
status = 107;
am.setRequest_status(status);
}
else{
status = 104;
am.setRequest_status(status);
}
}
else{
status = 106;
am.setRequest_status(status);
}

}
else{
status = 109;
am.setRequest_status(status);
}
}
}
else{
status = 103;
am.setRequest_status(status);
}
}
else{
status = 102;
am.setRequest_status(status);
}
}
else{
status = 101;
am.setRequest_status(status);
}
}
else{
status = 101;
am.setRequest_status(status);
}

return am.ReqtoString();
}

@Override
public String tidak_hadir(String id_pegawai, String stts, String
api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
MethodAPIDAO methodDAO = ctx.getBean("methodAPIDAO",
MethodAPIDAO.class);
AplikasiAPIDAO aplikasiDAO = ctx.getBean("aplikasiAPIDAO",
AplikasiAPIDAO.class);
LogAPIDAO logDAO = ctx.getBean("logAPIDAO", LogAPIDAO.class);
ApiAksesDAO apiDAO = ctx.getBean("apiAksesDAO",
ApiAksesDAO.class);
AplikasiAPIDAO aplikasiDAO = ctx.getBean("aplikasiAPIDAO",
AplikasiAPIDAO.class);
LogAPIDAO logDAO = ctx.getBean("logAPIDAO", LogAPIDAO.class);
ApiAksesDAO apiDAO = ctx.getBean("apiAksesDAO",
ApiAksesDAO.class);
52

Lampiran 4 Kode program absensi_mobile layer DAO (lanjutan)


ApiAksesDAO.class);

//atribut untuk mengambil data aplikasi dan method


int id_method;
String api_keydb;
int id_aplikasi;
int id_app;
String nama_method = "absensi_mobile/tidak_hadir";
Aplikasi_api aplikasi_api = new Aplikasi_api();
Api_akses app_akses = new Api_akses();

aplikasi_api = aplikasiDAO.get_aplikasi_detail(api_key);
id_aplikasi = aplikasi_api.getId_aplikasi();
api_keydb = aplikasi_api.getApi_key();

id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();

//atribut untuk menambahkan absensi


JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
int status = 0;
Absensi_mobile abs_mobile = new Absensi_mobile();

if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);

status = jdbcTemplate.update("INSERT INTO


oasys_absent_reason_log(id_pegawai,date_time,status)
VALUES (?,now(),?)", id_pegawai, stts);

if(status == 1){
status = 100;
abs_mobile.setRequest_status(status);
}
else{
status = 104;
abs_mobile.setRequest_status(status);
}

}
else{
status = 101;
abs_mobile.setRequest_status(status);
}
}
else{
status = 101;
abs_mobile.setRequest_status(status);
}

return abs_mobile.ReqtoString();
}
abs_mobile.setRequest_status(status);
}
}
else{
status = 101;
abs_mobile.setRequest_status(status);
53

Lampiran 4 Kode program absensi_mobile layer DAO (lanjutan)


}

public List<Absensi_mobile> get_attendance(String id_pegawai,


String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
MethodAPIDAO methodDAO = ctx.getBean("methodAPIDAO",
MethodAPIDAO.class);
AplikasiAPIDAO aplikasiDAO = ctx.getBean("aplikasiAPIDAO",
AplikasiAPIDAO.class);
LogAPIDAO logDAO = ctx.getBean("logAPIDAO", LogAPIDAO.class);
ApiAksesDAO apiDAO = ctx.getBean("apiAksesDAO",
ApiAksesDAO.class);

//atribut untuk mengambil data aplikasi dan method


int id_method;
String api_keydb;
int id_aplikasi;
int id_app;
String nama_method = "absensi_mobile/get_attendance";
Aplikasi_api aplikasi_api = new Aplikasi_api();
Api_akses app_akses = new Api_akses();

aplikasi_api = aplikasiDAO.get_aplikasi_detail(api_key);
id_aplikasi = aplikasi_api.getId_aplikasi();
api_keydb = aplikasi_api.getApi_key();

id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();

//atribut untuk menampilkan data absensi


JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<Absensi_mobile> absList = new
ArrayList<Absensi_mobile>();
Absensi_mobile abs_error = new Absensi_mobile();

if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);

List<Map<String, Object>> absRows =


jdbcTemplate.queryForList("SELECT * FROM
`oasys_attendance_log` WHERE month(date_time) =
month(now()) AND year(date_time) = year(now()) AND
id_pegawai=?", id_pegawai);

for (Map<String, Object> absRow : absRows){


Absensi_mobile abs = new Absensi_mobile();

abs.setId(Integer.parseInt(String.valueOf
(absRow.get("id"))));

abs.setId_pegawai(Integer.parseInt(String.valueOf
(absRow.get("id_pegawai"))));

abs.setDate_time(String.valueOf(absRow.get
("date_time")));

abs.setStatus(String.valueOf(absRow.get
54

Lampiran 4 Kode program absensi_mobile layer DAO (lanjutan)


abs.setId_pegawai(Integer.parseInt(String.valueOf
(absRow.get("id_pegawai"))));

abs.setDate_time(String.valueOf(absRow.get
("date_time")));

abs.setStatus(String.valueOf(absRow.get
("status")));

abs.setLong_lat(String.valueOf(absRow.get("long_l
at")));

absList.add(abs);
}
}
else{
abs_error.setRequest_status(101);
absList.add(abs_error);
}
}
else{
abs_error.setRequest_status(101);
absList.add(abs_error);
}

return absList;
}
}

Lampiran 5 Kode program absensi_mobile layer controller


package api.simpeg.controllers;

import java.util.List;

import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import api.simpeg.dao.AbsensiMobileDAO;
import api.simpeg.model.Absensi_mobile;

@RestController
public class AbsensiMobileRestController{

@RequestMapping(value="/absensi_mobile/hadir",
method=RequestMethod.POST)
@ResponseBody
String absensi_mobile_hadir(@RequestParam(value="id_pegawai")
String id_pegawai, @RequestParam(value="nip") String nip,
@RequestParam(value="password") String password,
@RequestParam(value="latitude") String latitude,
@RequestParam(value="longitude") String longitude,
@RequestParam(value="imei") String imei,
@RequestParam(value="api_key") String api_key){
ApplicationContext ctx = new
55

LampiranString
5 Kode program absensi_mobile layer controller (lanjutan)
id_pegawai, @RequestParam(value="nip") String nip,
@RequestParam(value="password") String password,
@RequestParam(value="latitude") String latitude,
@RequestParam(value="longitude") String longitude,
@RequestParam(value="imei") String imei,
@RequestParam(value="api_key") String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");

AbsensiMobileDAO absmDAO =
ctx.getBean("absensiMobileDAO", AbsensiMobileDAO.class);
latitude, longitude, imei, api_key);

String stts = absmDAO.hadir(id_pegawai, nip, password,


password, latitude, longitude, imei, api_key);

return stts;
}

@RequestMapping(value="/absensi_mobile/tidak_hadir",
method=RequestMethod.POST)
@ResponseBody
String absensi_mobile_tidak_hadir
(@RequestParam(value="id_pegawai") String id_pegawai,
@RequestParam(value="status") String status,
@RequestParam(value="api_key") String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");

AbsensiMobileDAO absmDAO =
ctx.getBean("absensiMobileDAO", AbsensiMobileDAO.class);

String stts = absmDAO.tidak_hadir(id_pegawai, status,


api_key);

return stts;
}

@RequestMapping(value="absensi_mobile/get_attendance",
method=RequestMethod.POST)
@ResponseBody
List<Absensi_mobile> absesnsi_mobile_get_attendance
(@RequestParam(value="id_pegawai") String id_pegawai,
@RequestParam(value="api_key") String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");

AbsensiMobileDAO absmDAO =
ctx.getBean("absensiMobileDAO", AbsensiMobileDAO.class);

List<Absensi_mobile> absList =
absmDAO.get_attendance(id_pegawai, api_key);

return absList;
}
}

ApplicationContext ctx = new


ClassPathXmlApplicationContext("spring.xml");
AbsensiMobileDAO absmDAO = ctx.getBean("absensiMobileDAO",
AbsensiMobileDAO.class);
List<Absensi_mobile> absList =
absmDAO.get_attendance(id_pegawai, api_key);
56

Lampiran 6 Kode program Pegawai_mobile layer model


package api.simpeg.model;

public class Pegawai_mobile{


private int id_pegawai;
private String nama;
private String gelar_depan;
private String gelar_belakang;
private String jenis_kelamin;
private String gol_darah;
private String agama;
private String t4_lahir;
private String tgl_lahir;
private String alamat;
private String nip_baru;
private String no_karpeg;
private int masa_kerja_pasif;
private String pangkat_gol;
private String jenjab;
private String jabatan;
private String eseloning;
private String tgl_pensiun_dini_old;
private String tgl_pensiun_dini;
private String password;
private String imei;
private String unit_kerja;

//attribute for error handling


private int request_status=100;

public int getId_pegawai() {


return id_pegawai;
}
public void setId_pegawai(int id_pegawai) {
this.id_pegawai = id_pegawai;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public String getGelar_depan() {
return gelar_depan;
}
public void setGelar_depan(String gelar_depan) {
this.gelar_depan = gelar_depan;
}
public String getGelar_belakang() {
return gelar_belakang;
}
public void setGelar_belakang(String gelar_belakang) {
this.gelar_belakang = gelar_belakang;
}
public String getJenis_kelamin() {
return jenis_kelamin;
}
public void setJenis_kelamin(String jenis_kelamin) {
this.jenis_kelamin = jenis_kelamin;
}
public String getGol_darah() {
return gol_darah;
}
57

Lampiran 6 Kode program Pegawai_mobile layer model (lanjutan)


}
public void setJenis_kelamin(String jenis_kelamin) {
this.jenis_kelamin = jenis_kelamin;
}
public String getGol_darah() {
return gol_darah;
}
public String getAgama() {
return agama;
}
public void setAgama(String agama) {
this.agama = agama;
}
public String getT4_lahir() {
return t4_lahir;
}
public void setT4_lahir(String t4_lahir) {
this.t4_lahir = t4_lahir;
}
public String getTgl_lahir() {
return tgl_lahir;
}
public void setTgl_lahir(String tgl_lahir) {
this.tgl_lahir = tgl_lahir;
}
public String getAlamat() {
return alamat;
}
public void setAlamat(String alamat) {
this.alamat = alamat;
}
public String getNip_baru() {
return nip_baru;
}
public void setNip_baru(String nip_baru) {
this.nip_baru = nip_baru;
}
public String getNo_karpeg() {
return no_karpeg;
}
public void setNo_karpeg(String no_karpeg) {
this.no_karpeg = no_karpeg;
}
public int getMasa_kerja_pasif() {
return masa_kerja_pasif;
}
public void setMasa_kerja_pasif(int masa_kerja_pasif) {
this.masa_kerja_pasif = masa_kerja_pasif;
}
public String getPangkat_gol() {
return pangkat_gol;
}
public void setPangkat_gol(String pangkat_gol) {
this.pangkat_gol = pangkat_gol;
}
public String getJenjab() {
return jenjab;
}
public void setJenjab(String jenjab) {
this.jenjab = jenjab;
}
public String getJabatan() {
return jabatan;
58

Lampiran 6 Kode program Pegawai_mobile layer model (lanjutan)


}
public void setJenjab(String jenjab) {
this.jenjab = jenjab;
}
public void setJabatan(String jabatan) {
this.jabatan = jabatan;
}
public String getEseloning() {
return eseloning;
}
public void setEseloning(String eseloning) {
this.eseloning = eseloning;
}
public String getTgl_pensiun_dini_old() {
return tgl_pensiun_dini_old;
}
public void setTgl_pensiun_dini_old(String
tgl_pensiun_dini_old) {
this.tgl_pensiun_dini_old = tgl_pensiun_dini_old;
}
public String getTgl_pensiun_dini() {

return tgl_pensiun_dini;
}
public void setTgl_pensiun_dini(String tgl_pensiun_dini) {
this.tgl_pensiun_dini = tgl_pensiun_dini;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getImei() {
return imei;
}
public void setImei(String imei) {
this.imei = imei;
}
public String getUnit_kerja() {
return unit_kerja;
}
public void setUnit_kerja(String unit_kerja) {
this.unit_kerja = unit_kerja;
}

//method for error handling


public int getRequest_status() {
return request_status;
}
public void setRequest_status(int request_status) {
this.request_status = request_status;
}

@Override
public String toString(){
return "{id=" + id_pegawai + ", nama=" + nama + ",
gelar_depan=" + gelar_depan + ", gelar_belakang=" +
gelar_belakang + ", jenis_kelamin=" + jenis_kelamin + ",
gol_darah=" + gol_darah + ", agama=" + agama + ",
59

Lampiran 6 Kode program Pegawai_mobile layer model (lanjutan)


@Override
public String toString(){
return "{id=" + id_pegawai + ", nama=" + nama + ",
gelar_depan=" + gelar_depan + ", gelar_belakang=" +
gelar_belakang + ", jenis_kelamin=" + jenis_kelamin + ",
gol_darah=" + gol_darah + ", agama=" + agama + ",
tempat_lahir=" + tempat_lahir + ", tgl_lahir=" +
t4_lahir=" + t4_lahir + ", tgl_lahir=" + tgl_lahir + ",
alamat=" + alamat + ", nip=" + nip_baru + ", no_karpeg="
+ no_karpeg + ", masa_kerja_pasif=" + masa_kerja_pasif +
", pangkat_gol=" + pangkat_gol + ", jenjab =" + jenjab +
", jabatan" + jabatan + ", eseloning=" + eseloning + ",
tgl_pensiun_dini_old=" + tgl_pensiun_dini_old + ",
tgl_pensiun_dini=" + tgl_pensiun_dini + ", imei=" + imei
+ ", unit_kerja=" + unit_kerja + ", request_status=" +
request_status + "}";
}

public String ReqtoString(){


return "[{\"request_status\":" + request_status + "}]";
}
}

Lampiran 7 Kode program Pegawai_mobile layer DAO interface class


package api.simpeg.DAO;

import java.util.List;
import api.simpeg.model.Pegawai_mobile;

public interface PegawaiMobileDAO{

public String cek_nip(String nip);

public List<Pegawai_mobile> login(String nip, String password,


String imei, String android_api_level, String api_key);

public Pegawai_mobile get_imei(String id_pegawai);


}

Lampiran 8 Kode program Pegawai_mobile layer DAO


package api.simpeg.DAO;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

import api.simpeg.model.Pegawai_mobile;
import api.simpeg.simpeg_api.DAO.ApiAksesDAO;
import api.simpeg.simpeg_api.DAO.AplikasiAPIDAO;
import api.simpeg.simpeg_api.DAO.LogAPIDAO;
import api.simpeg.simpeg_api.DAO.MethodAPIDAO;
import api.simpeg.simpeg_api.model.Api_akses;
60

Lampiran 8 Kode program Pegawai_mobile layer DAO (lanjutan)


import api.simpeg.model.Pegawai_mobile;
import api.simpeg.simpeg_api.dao.ApiAksesDAO;
import api.simpeg.simpeg_api.dao.AplikasiAPIDAO;
import api.simpeg.simpeg_api.dao.LogAPIDAO;
import api.simpeg.simpeg_api.dao.MethodAPIDAO;
import api.simpeg.simpeg_api.model.Api_akses;
import api.simpeg.simpeg_api.model.Aplikasi_api;

public class PegawaiMobileDAOJDBCTemplateImpl implements


PegawaiMobileDAO{
private DataSource dataSource;

@Autowired
public void setDataSource(DataSource dataSource){
this.dataSource = dataSource;
}

@Override
public String cek_nip(String nip){
JdbcTemplate jdbcTemplate = new
JdbcTemplate(dataSource);
String nip_pgw = null;

List<Map<String, Object>> nipRows =


jdbcTemplate.queryForList("SELECT nip_baru FROM pegawai
WHERE nip_baru=?", nip);

for (Map<String, Object> nipRow : nipRows){


nip_pgw = String.valueOf(nipRow.get("nip_baru"));
}
return nip_pgw;
}

@Override
public List<Pegawai_mobile> login(String nip, String password,
String imei, String android_api_level, String api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");
MethodAPIDAO methodDAO = ctx.getBean("methodAPIDAO",
MethodAPIDAO.class);
AplikasiAPIDAO aplikasiDAO =
ctx.getBean("aplikasiAPIDAO", AplikasiAPIDAO.class);
LogAPIDAO logDAO = ctx.getBean("logAPIDAO",
LogAPIDAO.class);
ApiAksesDAO apiDAO = ctx.getBean("apiAksesDAO",
ApiAksesDAO.class);

//atribut untuk mengambil data aplikasi dan method


int id_method;
String api_keydb;
int id_aplikasi;
int id_app;
String nama_method = "pegawai_mobile/login";
Aplikasi_api aplikasi_api = new Aplikasi_api();
Api_akses app_akses = new Api_akses();

aplikasi_api = aplikasiDAO.get_aplikasi_detail(api_key);
id_aplikasi = aplikasi_api.getId_aplikasi();
api_keydb = aplikasi_api.getApi_key();

id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
61

Lampiran 8 Kode program Pegawai_mobile layer DAO (lanjutan)


aplikasi_api = aplikasiDAO.get_aplikasi_detail(api_key);
id_aplikasi = aplikasi_api.getId_aplikasi();
api_keydb = aplikasi_api.getApi_key();

id_method = methodDAO.get_id(nama_method);

app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();

//atribut untuk menampilkan data pegawai


JdbcTemplate jdbcTemplate = new
JdbcTemplate(dataSource);
List<Pegawai_mobile> pmList = new
ArrayList<Pegawai_mobile>();
int error = 0;
Pegawai_mobile pegawai = new Pegawai_mobile();
String nip_pgw = null;
String jenkel = null;
String cek_imei_count = null;
String cek_imei_count2 = null;

if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
List<Map<String, Object>> cek_imei_db =
jdbcTemplate.queryForList("SELECT imei FROM
pegawai WHERE imei=?", imei);

for (Map<String, Object> cek_imei_dbd :


cek_imei_db){
cek_imei_count = String.valueOf
(cek_imei_dbd.get("imei"));
}

List<Map<String, Object>> cek_imei_db_user


= jdbcTemplate.queryForList("SELECT imei
FROM pegawai WHERE imei=? AND nip_baru=?",
imei, nip);

for (Map<String, Object> cek_imei_dbd_user


: cek_imei_db_user){
cek_imei_count2 = String.valueOf
(cek_imei_dbd_user.get("imei"));
}

if(cek_imei_db.isEmpty()){
//menambahkan data log_api
logDAO.tambah(id_aplikasi,
id_method);

//cek nip
nip_pgw = cek_nip(nip);

List<Map<String, Object>> pmRows =


jdbcTemplate.queryForList("SELECT
p.id_pegawai, p.nama, p.gelar_depan,

p.gelar_belakang, p.jenis_kelamin,
p.gol_darah, p.agama,
p.tempat_lahir, p.tgl_lahir,
p.alamat, p.nip_baru, p.no_karpeg,
p.masa_kerja_pasif, p.pangkat_gol,
p.jenjab, p.jabatan, p.eselonering,
p.tgl_pensiun_dini_old,
62

Lampiran 8 Kode program Pegawai_mobile layer DAO (lanjutan)


p.gelar_belakang, p.jenis_kelamin,
p.gol_darah, p.agama,
p.tempat_lahir, p.tgl_lahir,
p.alamat, p.nip_baru, p.no_karpeg,
p.masa_kerja_pasif, p.pangkat_gol,
p.jenjab, p.jabatan, p.eselonering,
p.tgl_pensiun_dini_old,
p.tgl_pensiun_dini, p.imei,
p.flag_pensiun, p.password,
c.id_unit_kerja, u.nama_baru FROM
(pegawai as p INNER JOIN
current_lokasi_kerja as c on
p.id_pegawai = c.id_pegawai) INNER
JOIN unit_kerja as u on
c.id_unit_kerja = u.id_unit_kerja
WHERE p.flag_pensiun=0 AND
p.nip_baru=? AND p.password=?", nip,
password);

for (Map<String, Object> pmRow :


pmRows){
pegawai.setId_pegawai(Integer.
parseInt(String.valueOf(pmRow.get
("id_pegawai"))));
pegawai.setNama(String.valueOf
(pmRow.get("nama")));
pegawai.setGelar_depan(String.
valueOf(pmRow.get("gelar_depan")));

pegawai.setGelar_belakang(String.
valueOf(pmRow.get("gelar_belakang"))
);

if(Integer.parseInt(String.valueOf
(pmRow.get("jenis_kelamin"))) == 1){
jenkel = "Laki-laki";
}
else{
jenkel = "Perempuan";
}
pegawai.setJenis_kelamin
(String.valueOf(jenkel));
pegawai.setGol_darah(String.valueOf
(pmRow.get("gol_darah")));
pegawai.setAgama(String.valueOf
(pmRow.get("agama")));
pegawai.setT4_lahir(String.
valueOf(pmRow.get("t4_lahir")));pega
wai.setTgl_lahir(String.valueOf
(pmRow.get("tgl_lahir")));
pegawai.setAlamat(String.valueOf
(pmRow.get("alamat")));
pegawai.setNip_baru(String.valueOf
(pmRow.get("nip_baru")));
pegawai.setNo_karpeg(String.valueOf

(pmRow.get("no_karpeg")));
pegawai.setMasa_kerja_pasif(Integer.
parseInt(String.valueOf(pmRow.get
("masa_kerja_pasif"))));
pegawai.setPangkat_gol(String.
valueOf(pmRow.get("pangkat_gol")));
63

Lampiran 8 Kode program Pegawai_mobile layer DAO (lanjutan)


(pmRow.get("no_karpeg")));
pegawai.setMasa_kerja_pasif(Integer.
parseInt(String.valueOf(pmRow.get
("masa_kerja_pasif"))));
pegawai.setPangkat_gol(String.
valueOf(pmRow.get("pangkat_gol")));
pegawai.setJenjab(String.valueOf
(pmRow.get("jenjab")));
pegawai.setJabatan(String.valueOf
(pmRow.get("jabatan")));
pegawai.setEseloning(String.valueOf
(pmRow.get("eselonering")));
pegawai.setTgl_pensiun_dini_old
(String.valueOf(pmRow.get
("tgl_pensiun_dini_old")));
pegawai.setTgl_pensiun_dini(String.
valueOf(pmRow.get("tgl_pensiun_dini"
)));
pegawai.setImei(String.valueOf
(pmRow.get("imei")).toString());
pegawai.setUnit_kerja(String.valueOf
(pmRow.get("nama_baru")));
pegawai.setPassword(String.valueOf
(pmRow.get("password")));
}

if(nip.equals(nip_pgw)){
if(password.equals(pegawai.getPassword())){
if(imei.equals(pegawai.getImei())){
pegawai.setImei("ok,"+imei);
}
else if(!(imei.equals(pegawai.getImei())))
{
Long imei_long = Long.parseLong(imei);
jdbcTemplate.update("UPDATE pegawai SET
imei=? WHERE nip_baru=?", imei_long, nip);
pegawai.setImei("different,"+imei);
}
else{
pmList.clear();
}
}
else{
pegawai.setRequest_status(103);
}
}
else{
pegawai.setRequest_status(102);
}
}
else{
if(cek_imei_db_user.isEmpty()){
egawai.setRequest_status(111);
}
else{
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);

//cek nip
nip_pgw = cek_nip(nip);

List<Map<String, Object>> pmRows =


64

Lampiran 8 Kode program Pegawai_mobile layer DAO (lanjutan)


//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);

//cek nip
nip_pgw = cek_nip(nip);

List<Map<String, Object>> pmRows =


jdbcTemplate.queryForList("SELECT p.id_pegawai,
p.nama, p.gelar_depan, p.gelar_belakang,
p.jenis_kelamin, p.gol_darah, p.agama,
p.tempat_lahir, p.tgl_lahir, p.alamat,
p.nip_baru, p.no_karpeg, p.masa_kerja_pasif,
p.pangkat_gol, p.jenjab, p.jabatan,
p.eselonering, p.tgl_pensiun_dini_old,
p.tgl_pensiun_dini, p.imei, p.flag_pensiun,
p.password, c.id_unit_kerja, u.nama_baru FROM
(pegawai as p INNER JOIN current_lokasi_kerja as
c on p.id_pegawai = c.id_pegawai) INNER JOIN
unit_kerja as u on c.id_unit_kerja =
u.id_unit_kerja WHERE p.flag_pensiun=0 AND
p.nip_baru=? AND p.password=?", nip, password);

for (Map<String, Object> pmRow : pmRows){


pegawai.setId_pegawai(Integer.parseInt
(String.valueOf(pmRow.get("id_pegawai"))));
pegawai.setNama(String.valueOf
(pmRow.get("nama")));
pegawai.setGelar_depan(String.valueOf
(pmRow.get("gelar_depan")));
pegawai.setGelar_belakang(String.valueOf
(pmRow.get("gelar_belakang")));

if(Integer.parseInt(String.valueOf
(pmRow.get("jenis_kelamin"))) == 1){
jenkel = "Laki-laki";
}
else{
jenkel = "Perempuan";
}
pegawai.setJenis_kelamin(String.valueOf(jenkel));
pegawai.setGol_darah(String.valueOf
(pmRow.get("gol_darah")));
pegawai.setAgama(String.valueOf(pmRow.get
("agama")));
pegawai.setT4_lahir(String.valueOf
(pmRow.get("t4_lahir")));
pegawai.setTgl_lahir(String.valueOf(pmRow.get
("tgl_lahir")));
pegawai.setAlamat(String.valueOf(pmRow.get
("alamat")));
pegawai.setNip_baru(String.valueOf(pmRow.get
("nip_baru")));
pegawai.setNo_karpeg(String.valueOf(pmRow.get
("no_karpeg")));
pegawai.setMasa_kerja_pasif(Integer.parseInt
(String.valueOf(pmRow.get("masa_kerja_pasif"))));

pegawai.setPangkat_gol(String.valueOf(pmRow.get
("pangkat_gol")));
pegawai.setJenjab(String.valueOf(pmRow.get
("jenjab")));
pegawai.setJabatan(String.valueOf(pmRow.get
65

Lampiran 8 Kode program Pegawai_mobile layer DAO (lanjutan)


pegawai.setPangkat_gol(String.valueOf(pmRow.get
("pangkat_gol")));
pegawai.setJenjab(String.valueOf(pmRow.get
("jenjab")));
pegawai.setJabatan(String.valueOf(pmRow.get
("jabatan")));
pegawai.setEseloning(String.valueOf(pmRow.get
("eselonering")));
pegawai.setTgl_pensiun_dini_old(String.valueOf
(pmRow.get("tgl_pensiun_dini_old")));
pegawai.setTgl_pensiun_dini(String.valueOf
(pmRow.get("tgl_pensiun_dini")));
pegawai.setImei(String.valueOf(pmRow.get
("imei")).toString());
pegawai.setUnit_kerja(String.valueOf(pmRow.get
("nama_baru")));
pegawai.setPassword(String.valueOf(pmRow.get
("password")));
}

if(nip.equals(nip_pgw)){
if(password.equals
(pegawai.getPassword())){
if(imei.equals(pegawai.getImei())){
pegawai.setImei("ok,"+imei);
}
else if(!(imei.equals
(pegawai.getImei()))){
Long imei_long =
Long.parseLong(imei);

jdbcTemplate.update("UPDATE
pegawai SET imei=? WHERE
nip_baru=?", imei_long, nip);
pegawai.setImei
("different,"+imei);
}
else{
pmList.clear();
}
}
else{
pegawai.setRequest_status(103);
}
}
else{
pegawai.setRequest_status(102);
}
}
}
}
}
else{
pegawai.setRequest_status(101);
}
pmList.add(pegawai);
return pmList;
}

@Override
public Pegawai_mobile get_imei(String id_pegawai){
JdbcTemplate jdbcTemplate = new
JdbcTemplate(dataSource);
66

Lampiran 8 Kode program Pegawai_mobile layer DAO (lanjutan)


pmList.add(pegawai);
return pmList;
}

@Override
public Pegawai_mobile get_imei(String id_pegawai){
JdbcTemplate jdbcTemplate = new
JdbcTemplate(dataSource);
String imei = null;
Pegawai_mobile pgw = new Pegawai_mobile();

List<Map<String, Object>> pgwRows =


jdbcTemplate.queryForList("SELECT imei FROM pegawai
WHERE id_pegawai=?", id_pegawai);
for (Map<String, Object> pgwRow : pgwRows){
imei = String.valueOf(pgwRow.get("imei"));
}

pgw.setImei(imei);

return pgw;
}
}

Lampiran 9 Kode program Pegawai_mobile layer controller


package api.simpeg.controllers;

import java.util.List;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import api.simpeg.DAO.PegawaiMobileDAO;
import api.simpeg.model.Pegawai_mobile;

@RestController
public class PegawaiMobileRestController{

@RequestMapping(value="/pegawai_mobile/login",
method=RequestMethod.POST)
@ResponseBody
List<Pegawai_mobile> pm_login(@RequestParam(value="nip")
String nip, @RequestParam(value="password") String password,
@RequestParam(value="imei") String imei,
@RequestParam(value="android_api_level") String
android_api_level, @RequestParam(value="api_key") String
api_key){
ApplicationContext ctx = new
ClassPathXmlApplicationContext("spring.xml");

PegawaiMobileDAO pmDAO = ctx.getBean("pegawaiMobileDAO",


PegawaiMobileDAO.class);
List<Pegawai_mobile> pmList =
pmDAO.login(nip,password,imei,android_api_level,api_key);
67

Lampiran 9 Kode program Pegawai_mobile layer controller (lanjutan)


PegawaiMobileDAO pmDAO = ctx.getBean("pegawaiMobileDAO",
PegawaiMobileDAO.class);
List<Pegawai_mobile> pmList =
pmDAO.login(nip,password,imei,android_api_level,api_key);
return pmList;
}
}

Lampiran 10 Daftar request status


ID Status Status
100 Sukses
101 API Key yang Anda masukkan tidak sesuai
102 NIP yang dimasukkan tidak tersedia
103 Password yang dimasukkan salah
104 Penambahan data tidak berhasil
105 Lokasi salah
106 Imei salah
107 Maaf, Anda telat
108 Hari ini bukan hari kerja
109 Anda sudah absen
110 Lokasi kerja belum ada
111 Imei sudah ada
68

RIWAYAT HIDUP

Penulis bernama lengkap Fernalia, lahir di Sukabumi


pada tanggal 11 Agustus 1994. Penulis merupakan anak
pertama dari pasangan Budi Halim dan Ratna Puspasari.
Selain itu, penulis memiliki satu orang adik laki-laki yang
bernama Ferdy Rezky.
Riwayat pendidikan formal penulis yaitu, penulis pernah
menempuh pendidikan Sekolah Dasar (SD) di SD Negeri
Leuwi Orok pada tahun 2000-2006. Kemudian penulis
melanjutkan pendidikannya ke jenjang Sekolah Menengah Pertama (SMP) di
SMP Negeri 1 Parungkuda pada tahun 2006-2009. Setelah lulus pada tahun 2009,
penulis melanjutkan pendidikan Sekolah Menengah Atas (SMA) di SMA Negeri 1
Parungkuda dan lulus pada tahun 2012. Penulis diterima sebagai mahasiswa
Program Diploma Institut Pertanian Bogor pada tahun 2012 melalui jalur Reguler
pada Program Keahlian Manajemen Informatika.
Riwayat keorganisasian mahasiswa penulis yaitu, penulis merupakan
anggota dari Mipro MICRO pada divisi Jurnalistik. Selain itu, penulis merupakan
tim pengajar di Lembaga Struktural Diploma IPB Mengajar.

Anda mungkin juga menyukai