FERNALIA
Fernalia
NIM J3C212210
i
ABSTRAK
Kata Kunci: web service, REST service, API, SIMPEG API, sistem informasi.
ABSTRACT
RINGKASAN
FERNALIA
Laporan Akhir
sebagai salah satu syarat untuk memperoleh gelar
Ahli Madya
pada
Program Diploma Kehalian Manajemen Informatika
Disetujui oleh
Diketahui oleh
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.
Fernalia
vi
DAFTAR ISI
DAFTAR TABEL
DAFTAR GAMBAR
DAFTAR LAMPIRAN
1 PENDAHULUAN
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
1.4 Manfaat
2 METODE KAJIAN
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.
2.2.1 Komunikasi
Komunikasi adalah langkah awal dari metode incremental. Pada tahap ini
dilakukan untuk menentukan keseluruhan tujuan atau sasaran dari pembuatan
4
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).
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.
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.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.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
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).
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
3.2 Kegiatan
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
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
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
Endang Murtisari SE
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
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.
no_telp varchar(12)
flag Integer
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;
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{
@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);
}
}
<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>
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
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.
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
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;
@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
+ "}";
}
package api.simpeg.dao;
import java.util.List;
import api.simpeg.model.Pegawai;
<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>
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
<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>
https://localhost:8080/pegawai/find_by_nip?nip=198107292006041008&api
_key=068ef921a60778c4e7d71c488ff3c475
[{"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}]
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
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
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.
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
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 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;
}
@Override
31
package api.simpeg.dao;
import java.util.List;
import api.simpeg.model.Absensi_mobile;
<bean id="pegawaiDAO"
class="api.simpeg.DAO.PegawaiDAOJDBCTemplateImpl">
<property name="dataSource" ref="dataSource" />
</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
<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>
[{"request_status":107}]
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.
5.1 Simpulan
5.2 Saran
DAFTAR PUSTAKA
Dennis A, Wixom BH, Roth RM. 2012. Systems Analysis and Design. Ed ke-5.
New Jersey (US): John Wiley & Sons.
Prasetyo DD. 2007. 150 Rahasia Pemrograman Java. Jakarta (ID): PT Elex
Media Komputindo.
Satzinger JW, Jackson RB, Burd SD. 2010. Systems Analysis and Design in a
Changing World. Ed ke-5. Massachusetts (US): Course Technology.
LAMPIRAN
38
}
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
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);
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();
id_method = methodDAO.get_id(nama_method);
app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();
if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);
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
@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);
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);
pgw.setId(Integer.parseInt(String.valueOf(pgwRow.get("id_pegaw
42
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);
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
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();
if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);
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
app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();
if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);
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
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;
}
}
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
@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){
@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
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);
app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();
//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
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())){
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;
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;
status = 100;
}
else{
stts = "LATE";
status = 107;
}
}
50
//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);
}
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
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();
if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);
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
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();
if(id_app == id_aplikasi){
if(api_key.equals(api_keydb)){
//menambahkan data log_api
logDAO.tambah(id_aplikasi, id_method);
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
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;
}
}
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);
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);
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;
}
}
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;
}
@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
import java.util.List;
import api.simpeg.model.Pegawai_mobile;
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
@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;
@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);
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
id_method = methodDAO.get_id(nama_method);
app_akses = apiDAO.get_by_method(id_method);
id_app = app_akses.getId_aplikasi();
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);
if(cek_imei_db.isEmpty()){
//menambahkan data log_api
logDAO.tambah(id_aplikasi,
id_method);
//cek nip
nip_pgw = cek_nip(nip);
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
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
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);
//cek nip
nip_pgw = cek_nip(nip);
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
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
@Override
public Pegawai_mobile get_imei(String id_pegawai){
JdbcTemplate jdbcTemplate = new
JdbcTemplate(dataSource);
String imei = null;
Pegawai_mobile pgw = new Pegawai_mobile();
pgw.setImei(imei);
return pgw;
}
}
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");
RIWAYAT HIDUP