TUGAS AKHIRspmi.poltekba.ac.id/spmi/fileTA/150309281393_2018.pdf · 2018-08-28 · i pembuatan...
-
Upload
truongcong -
Category
Documents
-
view
239 -
download
0
Transcript of TUGAS AKHIRspmi.poltekba.ac.id/spmi/fileTA/150309281393_2018.pdf · 2018-08-28 · i pembuatan...
PEMBUATAN APLIKASI ABSENSI MENGGUNAKAN QR CODE
DI POLDA KALTIM BERBASIS ANDROID
TUGAS AKHIR
WINDAWATI
NIM : 150309281393
POLITEKNIK NEGERI BALIKPAPAN
JURUSAN TEKNIK ELEKTRONIKA
BALIKPAPAN
2018
i
PEMBUATAN APLIKASI ABSENSI MENGGUNAKAN QR CODE
DI POLDA KALTIM BERBASIS ANDROID
TUGAS AKHIR
KARYA TULIS INI DIAJUKAN SEBAGAI SALAH SATU SYARAT
UNTUK MEMPEROLEH GELAR AHLI MADYA DARI
POLITEKNIK NEGERI BALIKPAPAN
WINDAWATI
NIM : 150309281393
POLITEKNIK NEGERI BALIKPAPAN
JURUSAN TEKNIK ELEKTRONIKA
BALIKPAPAN
2018
iii
SURAT PERNYATAAN
Yang bertanda tangan di bawah ini :
Nama : Windawati
Tempat/Tgl Lahir : Petung, 12 Agustus 1997
NIM : 150309281393
Menyatakan bahwa tugas akhir saya yang berjudul ” Pembuatan Aplikasi Absensi
Menggunakan Qr Code Di Polda Kaltim Berbasis Android“ adalah bukan
merupakan hasil karya tulis orang lain, baik sebagian maupun keseluruhan,
kecuali dalam kutipan yang saya sebutkan sumbernya.
Demikian pernyataan ini saya buat dengan sebenar-benarnya dan apabila
pernyataan ini tidak benar, penulis bersedia mendapat sanksi akademis.
Balikpapan, 21 Agustus 2018
Mahasiswa,
Windawati
NIM : 150309281393
iv
Tugas Akhir ini saya persembahkan kepada
Ayahanda dan Ibunda tercinta
Darmad & Partimah
Saudara yang kusayangi
Zuda Ersa Hidayat
Seluruh Teman-Teman TKJ Angkatan 2015
Sahabat – Sahabat yang selalu memberi dukungan
Risa Ariska
Umi Syafa’ati
Julia Maulinda
Rahmayanti
Ruri Juliana
Yuliana Dwi Suwardina
Rahayu Ningsih
Julianita Carlina
Elvis Yericzon
Hermasnyah
Pembimbing Saya
Totok Sulistyo.S.T.,M.T.
Ali Abrar S.Si.,M.T.
v
SURAT PERNYATAAN PERSETUJUAN
PUBLIKASI KARYA ILMIAH UNTUK
KEPENTINGAN AKADEMIS
Sebagai civitas akademik Politeknik Negeri Balikpapan, saya yang bertanda
tangan di bawah ini :
Nama : Windawati
NIM : 150309281393
Program Studi : Teknik Elektronika
Judul TA : Pembuatan Aplikasi Absensi Menggunakan Qr Code
Di Polda Kaltim Berbasis Android
Demi pengembangan ilmu pengetahuan, saya menyetujui pemberian hak kepada
Politeknik Negeri Balikpapan untuk menyimpan, mengalih media atau format-
kan, mengelola dalam bentuk pangkalan data (database), dan merawat, serta
untuk mempublikasikan tugas akhir saya selama tetap mencantumkan nama saya
sebagai penulis/pencipta.
Demikian pernyataan ini saya buat dengan sebenarnya.
Dibuat di : Kota Balikpapan
Pada tanggal : 21 Agustus 2018
Yang menyatakan
Materai 6000
Windawati
150309281393
vi
ABSTRACT
At present each institution does attendance which aims to find out
employees both manually and computerized including in East Kalimantan
Regional Police who do fingerprint attendance located in different places and
often absent employees on time for this to be ineffective and efficient. Therefore
the author makes attendance using an Android-based QR code.
In this application employees must have android to be able to access the
application and scan attendance. The QR Code will issue at the admin's entry and
return hours on a monitor that can be scanned by all employees. This application
is android based which can be accessed by employees and web based for admin.
When the admin logs in on the web, it can manage employee data that is
changing, adding and deleting employee data and can also recover employee
attendance data can be downloaded according to the time required in the form of
a pdf file. Making this application using an Android studio. Therefore, in the
making, besides using the Java programming language, the author also uses the
PHP and HTML programming languages on the web and the database uses
MySQL.
This study resulted in an application that is useful to facilitate employees
in attendance by using a scan QR code that can be accessed on android owned by
employees.
Keywords: Application, attendance, Scan, QR Code, Android.
vii
ABSTRAK
Saat ini setiap instansi melakukan absensi yang bertujuan untuk
mengetahui kehadiran karyawan baik secara manual ataupun yang sudah
terkomputerisasi termasuk di Polda Kaltim yang melakukan absensi
menggunakan fingerprint yang terletak di tempat yang berbeda – beda dan
karyawan sering melakukan absensi tidak tepat waktu sehingga hal ini menjadi
tidak efektif dan efisien. Oleh karena itu penulis membuat aplikasi absensi
menggunakan QR code berbasis android.
Pada aplikasi ini karyawan harus memiliki android untuk dapat mengakses
aplikasi dan melakukan scan absensi . QR Code nya akan ditampilkan pada jam
masuk dan pulang oleh admin pada monitor yang dapat di scan oleh seluruh
karyawan. Aplikasi ini berbasis android yang dapat diakses oleh karyawan dan
berbasis web untuk admin. Ketika admin login pada web tersebut maka dapat
mengelola data karyawan yaitu mengubah, manambah dan menghapus data
karyawan serta juga dapat mengelola data rekap absensi karyawan dapat di unduh
sesuai waktu yang dibutuhkan yang berupa file pdf. Pembuatan aplikasi ini
menggunakan android studio. Oleh karena itu dalam pembuatannya, selain
menggunakan bahasa pemrograman Java, penulis juga menggunakan bahasa
pemrograman PHP, dan HTML pada web serta database-nya menggunakan
MySQL.
Penelitian ini menghasilkan sebuah aplikasi absensi yang berguna untuk
memudahkan karyawan dalam melakukan absensi dengan menggunakan scan QR
code yang dapat diakses pada android yang dimiliki oleh karyawan.
Kata kunci : Aplikasi, absensi, Scan, QR Code, Android.
viii
KATA PENGANTAR
Dengan memanjatkan puja dan puji syukur kehadirat Allah Yang Maha Esa,
karena atas rahmat serta hidayah-Nya, penulis dapat menyelesaikan sebuah tugas
akhir dengan judul “Pembuatan Aplikasi Absensi Menggunakan Qr Code Di
Polda Kaltim Berbasis Android”. Penulis tidak dapat menyelesaikannya
penyusunan tugas akhir ini apabila tidak dibantu oleh berbagai pihak oleh karena
itu penulis mengucapankan terima kasih yang sebesar-besanya kepada :
1. Direktur Politeknik Negeri Balikpapan, Bapak Ramli, SE.,M. M.
2. Ketua Program Studi Teknik Elektronika, Bapak Drs. Armin, M.T.
3. Pembimbing I, Bapak Totok Sulistyo S.T., M. T., yang telah membimbing
dan memberikan pengarahan selama pengerjaan tugas akhir ini.
4. Pembimbing II, Bapak Ali Abrar S.Si,MT., yang telah membimbing dan
memberikan pengarahan selama pengerjaan tugas akhir ini.
5. Dosen Wali, Bapak Drs. Armin, M.T. yang telah membina selama
perkuliahan.
6. Seluruh Dosen yang telah mengajar di program studi Teknik Elektronika.
7. Kedua orang tua tercinta dan keluarga yang selalu mendukung kegiatan ini.
8. Segenap staf dan karyawan program studi Teknik Elektronika.
9. Segenap staf dan karyawan Bidang Teknologi Informasi Polda Kaltim.
10. Seluruh teman-teman mahasiswa seperjuangan Teknik Elektronika angkatan
tahun 2015.
11. Semua pihak yang penulis tidak dapat menyebutkan satu per satu, yang telah
memberikan bantuan secara langsung maupun tidak langsung dalam
penyusunan tugas akhir ini hingga selesai.
Penulis menyadari bahwa karya ini memliki kekurangan dan kelemahan. Oleh
sebab itu, saran-saran dan masukan yang membangun sangat diharapkan.
Balikpapan, 21 Agustus 2018
Windawati
ix
DAFTAR ISI
Halaman
HALAMAN JUDUL i
LEMBAR PENGESAHAN ii
SURAT PERNYATAAN iii
LEMBAR PERSEMBAHAN iv
SURAT PERNYATAAN PERSETUJUAN v
ABSTRACT vi
ABSTRAK vii
KATA PENGANTAR viii
DAFTAR ISI ix
DAFTAR GAMBAR xii
DAFTAR TABEL xiv
DAFTAR LAMPIRAN xv
BAB I PENDAHULUAN
1.1 Latar Belakang 1
1.2 Rumusan Masalah 2
1.3 Batasan Masalah 2
1.4 Tujuan 2
1.5 Manfaat 2
BAB II LANDASAN TEORI
2.1 Aplikasi 4
2.2 Absensi 4
2.3 QR Code 4
2.4 Android 5
2.4.1 Fitur Android 7
2.4.2 Versioning 9
BAB III METODE PERANCANGAN
3.1 Tempat dan Waktu 11
3.2 Peralatan dan Bahan 11
3.3 Proses Perancangan 11
3.4 Penjelasan Flowchart 12
x
3.4.1 Menentukan Judul 12
3.4.2 Pengumpulan Data 12
3.4.3 Membuat Rancangan Sistem 12
3.4.4 Penyusunan Proposal 12
3.4.5 Seminar Proposal 13
3.4.6 Pembuatan Program 13
3.4.7 Implementasi Program 13
3.4.8 Uji Coba Program 13
3.4.9 Penyusunan Laporan TA 13
3.4.10 Sidang TA 13
3.5 Flowchart 13
3.6 Use Case Diagram 14
3.7 Entity Relationship Diagram (ERD) 15
3.8 Rancangan Database 16
3.8.1 Tabel Admin 16
3.8.2 Tabel Karyawan 16
3.8.3 Tabel Absensi 16
3.9 Tampilan Rancangan Aplikasi 17
3.9.1 Tampilan Karyawan Login 17
3.9.2 Tampilan Scan Code 17
BAB IV HASIL DAN PEMBAHASAN
4.1 Hasil 18
4.1.1 Halaman Login Admin 18
4.1.2 Halaman Home 19
4.1.3 Halaman Karyawan 20
4.1.4 Halaman Tambah Karyawan 21
4.1.5 Halaman Ganti Password 22
4.1.6 Halaman Cetak Rekapan Absensi 24
4.1.7 Halaman Login Karyawan 25
4.1.8 Halaman Scan QR Code 26
4.1.9 Halaman History 27
4.1.10 Halaman Ubah Password Karyawan 28
xi
4.2 Pembahasan Program 29
BAB V PENUTUP
5.1 Kesimpulan 30
5.2 Saran 30
DAFTAR PUSTAKA 31
LAMPIRAN 32
xii
DAFTAR GAMBAR
Halaman
Gambar 2.1 QR Code 5
Gambar 2.2 Tampilan Android 6
Gambar 2.3 Komponen utama Android 6
Gambar 2.4 Versi OS Android 9
Gambar 2.5 Grafik Pengguna OS Android 10
Gambar 3.1 Flowchart Perancangan 11
Gambar 3.2 Flowchart Admin 14
Gambar 3.2 Flowchart Absensi 14
Gambar 3.4 Use Case Diagram Aplikasi 14
Gambar 3.5 ERD Aplikasi 15
Gambar 3.6 Tampilan Login Karyawan 17
Gambar 3.7 Tampilan Scan Code 17
Gambar 4.1 Tampilan Login Admin 18
Gambar 4.2 Script login 18
Gambar 4.3 Peringatan Login Gagal 19
Gambar 4.4 Halaman Home 19
Gambar 4.5 Script Tabel Absensi 19
Gambar 4.6 Halaman Karyawan 20
Gambar 4.7 Script Tabel Karyawan 21
Gambar 4.8 Halaman Tambah Karyawan 22
Gambar 4.9 Notifikasi Data Berhasil 22
Gambar 4.10 Notifikasi Data Gagal 22
Gambar 4.11 Script Tambah Karyawan 22
Gambar 4.12 Halaman Ubah Password 23
Gambar 4.13 Notifikasi Password Berhasil 23
Gambar 4.14 Notifikasi Password Gagal 23
Gambar 4.15 Script Ganti Password 23
Gambar 4.16 Halaman Cetak 24
Gambar 4.17 Script Cetak 24
Gambar 4.18 Tampilan Login Karyawan 25
xiii
Gambar 4.19 Script Login Karyawan 25
Gambar 4.20 Tampilan Scan QR Code 26
Gambar 4.21 Tampilan Input Absensi 27
Gambar 4.22 Tampilan History Karyawan 27
Gambar 4.23 Tampilan Ubah Password Karyawan 28
xiv
DAFTAR TABEL
Halaman
Tabel 3.1 Alat dan Bahan 11
Tabel 3.2 Admin 16
Tabel 3.3 Karyawan 16
Tabel 3.3 Absensi 16
xv
DAFTAR LAMPIRAN
Lampiran 1 config.php digunakan untuk menghubungkan database dengan php
pada halaman web admin.
Lampiran 2 login.php digunakan untuk tampilan halaman login admin sehingga
dapat memasuki sistem.
Lampiran 3 index.php digunakan untuk tampilan home admin yang berisi
riwayat absensi karyawan dalam bentuk tabel.
Lampiran 4 response.php digunakan untuk proses menampilkan data riwayat
absensi karyawan.
Lampiran 5 karyawan.php digunakan untuk menampilkan daftar tabel
karyawan.
Lampiran 6 add_modal.php digunakan untuk menampilkan form untuk
memasukkan data karyawan.
Lampiran 7 addnew.php digunakan untuk proses memasukkan data dari form
ke database.
Lampiran 8 button.php digunakan untuk menampilkan form edit data karyawan
dan tampilan ketika akan menghapus data karyawan.
Lampiran 9 delete.php digunakan untuk proses menghapus data karyawan.
Lampiran 10 edit.php digunakan untuk proses mengupdate data karyawan.
Lampiran 11 changes.php digunakan untuk admin mengganti password ketika
login pada sistem.
Lampiran 12 cetak.php digunakan untuk mencetak data riwayat absensi
karyawan berupa file pdf.
Lampiran 13 logout.php digunakan untuk keluar dari sistem apabila telah selesai
menggunakan sistem.
Lampiran 14 init.php digunakan untuk menghubungkan database dengan php
pada aplikasi absensi.
Lampiran 15 loginkaryawan.php digunakan proses login pada aplikasi.
Lampiran 16 input.php digunakan untuk proses saat melakukan scan barcode
pada aplikasi.
Lampiran 17 getabsensi.php digunakan untuk proses menampilkan riwayat
absensi karyawan pada aplikasi.
xvi
Lampiran 18 changepasskaryawan.php digunakan untuk proses mengganti
password yang digunakan oleh setiap karyawan pada aplikasi.
Lampiran 19 AndroidManifest.xml digunakan untuk memberikan hak akses
Lampiran 20 MainActivity.java
Lampiran 21 LoginActivity.java digunakan untuk membuat login
Lampiran 22 CustomListHistory.java digunakan untuk membuat daftar riwayat
absensi
Lampiran 23 InActivity.java digunakan untuk membuat scan barcode
Lampiran 24 AbsensiService.java digunakan untuk mengambil data riwayat
absensi
Lampiran 25 HttpParse.java digunakan untuk mengatur waktu koneksi
Lampiran 26 KaryawanService.java digunakan untuk mengambil data karyawan
Lampiran 27 Retroserver.java digunakan untuk menampilkan data absensi
Lampiran 28 ForgotPasswordActivity.java digunakan untuk membuat ubah
password untuk karyawan
Lampiran 29 Absensi.java digunakan untuk mengambil data absensi
Lampiran 30 Karyawan.java digunakan untuk mengambil data karyawan
Lampiran 31 Value.java digunakan untuk menampilkan data karyawan
Lampiran 32 activity_main.xml digunakan untuk menampilkan interface menu
Lampiran 33 activity_login.xml digunakan untuk menampilkan interface login
Lampiran 34 activity_in.xml digunakan untuk menampilkan interface scan
barcode
Lampiran 35 activity_history.xml digunakan untuk menampilkan interface
riwayat absensi yang telah digabungkan dengan foto
Lampiran 37 activity_forgot_password.xml digunakan untuk menampilkan
interface ganti password
Lampiran 38 activity_custom_list_history.xml digunakan untuk menampilkan
data absensi karyawan
1
BAB I
PENDAHULUAN
1.1 Latar Belakang
Perkembangan teknologi yang demikian pesat memudahkan untuk
mendapatkan informasi yang kita dapatkan dimana pun dan kapanpun. Teknologi
membawa dampak positif di berbagai bidang, salah satu dampak positifnya yaitu
informasi yang dibutuhkan dapat lebih cepat dan lebih mudah dalam
mengaksesnya. Dengan adanya android banyak masyarakat yang sudah
menggunakan android untuk membuat semua kegiatan menjadi mudah.
Setiap instansi melakukan absensi bertujuan untuk mengetahui kehadiran
setiap karyawan, termasuk juga di Polda Kaltim selalu melakukan absensi setiap
hari dengan pengambilan data yang dilakukan menggunakan alat fingerprint. Di
Polda Kaltim memiliki 22 unit divisi dengan setiap unit terdiri dari 30 orang dengan
alat fingerprint di setiap gedung yang terbatas yaitu 8 sampai 9 buah terletak di
lantai yang berbeda – beda. Absensi mulai dilakukan pada pukul 06.00 sampai
07.30 , di Polda Kaltim setiap hari selalu melakukan apel atau upacara setiap pagi
pada pukul 07.00 sampai pukul 08.00 sehingga banyak anggota polri dan staff tidak
sempat melakukan absensi dikarenakan waktu yang berdekatan menjelang apel pagi
dan harus mengantri untuk melakukan absensi fingerprint maka banyak yang
melakukan absensi fingerprint setelah apel atau upacara pagi. Hal ini sangat tidak
efisien karena keterlambatan absensi dapat mempengaruhi gaji anggota polri dan
staff tersebut.
Dari permasalahan yang terjadi, penulis merancang suatu sistem teknologi
dengan menggunakan android. Sistem ini menggunakan teknologi Scan QR code
yang dapat menyimpan tanggal dan waktu di hari tersebut, kemudian discan dengan
aplikasi pada android yang telah disediakan. Untuk pelaksanaannya QR code akan
ditampilkan pada layar aula Polda Kaltim setiap pagi dan sore kemudian anggota
polri dan staff dapat men-scan QR code tersebut menggunakan smarthphone
android masing – masing. Sistem ini memberikan laporan rekap absensi setiap
bulan. Dengan adanya sistem ini diharapkan dapat membantu karyawan melakukan
absensi dengan waktu yang lebih cepat dan efisien. Aplikasi ini bertujuan untuk
2
membuat pengguna mudah melakukan absensi tanpa harus mencari letak
fingerprint di tempat yang berbeda-beda. Berdasarkan latar belakang masalah
tersebut maka penulis ingin melakukan penelitian dengan judul “Pembuatan
Aplikasi Absensi Menggunakan QR Code Di Polda Kaltim Berbasis Android”.
1.2 Rumusan Masalah
Adapun rumusan masalahnya yaitu:
1. Bagaimana cara mempermudah absensi di Polda Kaltim dengan
menggunakan QR code berbasis android dengan efisien ?
1.3 Batasan Masalah
Agar pembahasan ini tidak menyimpang dari rumusan masalah yang telah
ditentukan maka perlu diadakan pembatasan masalah, yaitu :
1. Penelitian membahas mengenai pembuatan aplikasi absensi menggunakan
QR Code yang dapat diakses pada android.
2. Aplikasi ini dibuat dengan menggunakan program android studio.
3. Tidak membahas keamanan data pada jaringan maupun server database
yang ada pada web hosting
4. Aplikasi berjalan di android minimal Kitkat.
5. Cetak barcode menggunakan aplikasi yang sudah ada.
1.4 Tujuan Penelitian
Berdasarkan uraian latar belakang dan perumusan masalah diatas, maka adapun
tujuan dari tugas akhir ini adalah:
1. Mempermudah melakukan absensi di Polda Kaltim menggunakan sistem
informasi berbasis android dengan efektif dan efisien.
2. Agar lebih efisien dan efektif untuk merekapitulasi absensi.
1.5 Manfaat Penelitian
Diharapkan dari hasil pelaksanaan penelitian ini dapat memberikan manfaat bagi
pihak polda kaltim antara lain :
3
1. Bagi Polda Kaltim
Memberikan kemudahan dalam melakukan absensi tanpa harus mencari
letak fingerprint di tempat yang berbeda-beda.
2. Bagi Penulis
Bisa menjadi tolak ukur penulis dalam melakukan pengerjaan Tugas Akhir
dari ilmu yang didapat selama perkuliahan.
3. Bagi Instansi
Bisa dijadikan referensi Tugas Akhir bagi mahasiswa lainnya.
4
BAB II
LANDASAN TEORI
2.1 Aplikasi
Aplikasi adalah program siap pakai yang dapat digunakan untuk
menjalankan perintah – perintah dari pengguna aplikasi tersebut dengan tujuan
mendapatkan hasil yang lebih akurat sesuai dengan tujuan pembuatan aplikasi
tersebut, aplikasi mempunyai arti yaitu pemecahan masalah yang menggunakan
salah satu tehnik pemrosesan data aplikasi yang biasanya berpacu pada sebuah
komputansi yang diinginkan atau diharapkan maupun pemrosesan data yang
diharapkan (Supiah, 2016).
2.2 Absensi
Absensi adalah suatu pendataan kehadiran, bagian dari pelaporan aktifitas
suatu institusi, atau komponen institusi itu sendiri yang berisi data-data kehadiran
yang disusun dan diatur sedemikian rupa sehingga mudah untuk dicari dan
dipergunakan apabila sewaktu-waktu diperlukan oleh pihak yang berkepentingan .
Kita mengenal beberapa jenis absensi. Yang membedakan jenis-jenis absensi
tersebut adalah cara penggunaannya, dan tingkat daya gunanya Secara umum jenis-
jenis absensi dapat di kelompokkan menjadi dua, yaitu;
1. Absensi manual, adalah cara pengentrian kehadiran dengan cara
menggunakan pena (tanda tangan).
2. Absensi non manual (dengan menggunakan alat), adalah suatu cara
pengentrian kehadiran dengan menggunakan system terkomputerisasi, bisa
menggunakan kartu dengan barcode, finger print ataupun dengan
mengentrikan nip dan sebagainya (Erna Simonna ,2009).
2.3 QR Code
Menurut Bambang Sugiantoro dan Fuad Hasan (2015) QR code merupakan
singkatan dari Quick Respone code, atau yang biasa disebut Kode QR adalah suatu
jenis kode matriks atau kode batang dua dimensi yang dikembangkan oleh Denso
Wave, sebuah divisi Denso Corporation yang merupakan sebuah perusahaan
5
Jepang dan dipublikasikan pada tahun 1994 dengan fungsionalitas utama yaitu
dapat dengan mudah dibaca oleh pemindai QR merupakan singkatan dari quick
response atau respons cepat, yang sesuai dengan tujuannya adalah untuk
menyampaikan informasi dengan cepat dan mendapatkan respons yang cepat pula.
Berbeda dengan kode batang, yang hanya menyimpan informasi secara horizontal,
kode QR mampu menyimpan informasi secara horizontal dan vertikal, oleh karena
itu secara otomatis Kode QR dapat menampung informasi yang lebih banyak
daripada kode batang.
Gambar 2.1 QR Code
(Sumber : www.the-qrcode-generator.com)
2.4 Android
Menurut Yudha Yudhanto & Ardhi Wijayanto (2017) Android adalah
sistem operasi berbasis Linux yang dirancang untuk perangkat bergerak layar
sentuh seperti telepon pintar dan komputer tablet. Android awalnya dikembangkan
oleh Android,Inc., dengan dukungan finansial dari Google, yang kemudian
membelinya pada tahun 2005. Sistem operasi ini dirilis secara resmi pada tahun
2007, bersama dengan didirikannya Open Handset Alliance, konsorsium dari
perusahaan-perusahaan perangkat keras, Perangkat lunak dan telekomunikasi
bertujuan untuk memajukan standar terbuka perangkat seluler.
6
Gambar 2.2 Tampilan Android
(Sumber : zentizen.com)
Adapun komponen utama sistem tingkat android , gambaran sistem operasi , dan
arsitektur development sebagai berikut :
Gambar 2.3 Komponen Utama Android
(Sumber : google-developer-training.gitbooks.io)
Dalam gambar diatas:
1. Aplikasi: aplikasi berada pada tingkat ini bersama dengan aplikasi sistem
inti untuk email, perpesanan SMS, kalender, penjelajahan internet, atau
kontak.
2. Java API Framework : Semua fitur android tersedia untuk developer
melalui antarmuka permrograman aplikasi.
Sistem tampilan digunakan untuk membangun UI aplikasi, termasuk daftar,
tombol , dan menu.
Pengelola Referensi digunakan untuk mengakses sumber daya non-kode
seperti string, grafik , dan file layout.
7
Pengelola Notifikasi digunakan untuk menampilkan peringatan khusus di
bilah status.
Pengelola Aktivitas yang mengelola daur hidup aplikasi.
Penyedia Materi yang memungkinkan aplikasi untuk mengakses data dari
aplikasi lain.
Semua API kerangka kerja yang digunakan aplikasi sistem android.
3. Library and Android Runtime: Setiap aplikasi berjalan dalam prosesnya
sendiri dengan instance Android Runtime sendiri, yang memungkinkan
beberapa mesin sekaligus virtual pada perangkat bermemori rendah.
menyediakan antarmuka standar yang menunjukkan kemampuan perangkat
keras di perangkat ke kerangka kerja Java API yang lebih tinggi. HAL
terdiri atas beberapa modul pustaka, masing-masing mengimplementasikan
antarmuka untuk komponen perangkat keras tertentu, seperti modul kamera
atau bluetooth.
4. Hardware Abstraction Layer(HAL) : Lapisan ini menyediakan antarmuka
standar yang menunjukkan kemampuan perangkat keras di perangkat ke
kerangka kerja Java API yang lebih tinggi. HAL terdiri atas beberapa modul
pustaka, masing-masing mengimplementasikan antarmuka untuk
komponen perangkat keras tertentu, seperti modul kamera atau bluetooth.
5. Kernel Linux: Fondasi platform Android adalah kernel Linux. Lapisan di
atas mengandalkan kernel Linux untuk fungsionalitas pokok seperti
threading dan manajemen memori tingkat rendah. Menggunakan kernel
Linux memungkinkan Android memanfaatkan fitur keamanan utama dan
memungkinkan produsen perangkat mengembangkan driver perangkat
keras untuk kernel yang cukup dikenal .
2.4.1 Fitur Android
Perangkat android memiliki beberapa fitur perangkat keras di dalamnya untuk
membangun aplikasi diantaranya :
1. Touchscreen. Perangkat android memiliki fitur layar sentuh(touchscreen)
memberikan kemungkinan bagi pengguna untuk berinteraksi dengan
aplikasi menggunakan jari. Pengguna dapat melakukan swipe,flip, drag dan
8
pinch untuk zoom. Android juga mendukung multitouch yang berarti
keseluruhan layar dapat disentuh dengan satu atau lebih jari pada saat yang
bersamaan.
2. GPS. Sistem operasi Android mendukung GPS yang memungkinkan
developer untuk mengakses lokasi pengguna.
3. Accelerometer. Android mendukung Accelerometer, yaitu perangkat yang
digunakan untuk mengukur kecepatan seperti Android bergerak,
terguncang, atau berbalik arah posisinya.
4. SD Card. Android memiliki fitur memungkinkan pengguna atau aplikasi
untuk mengakses (menyimpan atau membuka) file pada SD Card. SD Card
merupakan media penyimpanan yang digunakan perangkat android dan
beberapa perangkat mobile lainnya.
Android memiliki beberapa fitur perangkat lunak yang dapat digunakan oleh
developer dalam pengembangan aplikasi, yakni :
1. Internet. Kemampuan akses internet pada android memberikan banyak
keunggulan. Berbagai informasi secara real-time dapat diperoleh dengan
mudah dengan internet. Pengguna dapat mengakses internet untuk melihat
jadwal pemutaran film bioskop, cuaca suatu area, jadwal penerbangan dan
lainnya.
2. Audio dan Video Support. Sistem operasi android memungkinkan developer
menyertakan audio dan video dalam aplikasi dengan mudah. Berbagai
standar format audio dan video telah didukung.
3. Contact. Android memungkinkan akses ke kontak yang tersimpan pada
perangkat. Sebagai contoh, developer dapat membangun aplikasi yang
menggabung antara kontak dengan GPS untuk memberikan notifikasi jika
pengguna berada di dekat alamat salah satu kontak tertentu.
4. Security. Android memungkinkan aplikasi melakukan banyak hal. Android
juga menyiapkan mekanisme keamanan berupa permission berkaintan
dengan beberapa tugas.
5. Google APIs. Sistem operasi android memungkinkan dengan tidak terbatas
membuat panggilan telepon, mengorganisasi kontak atau menginstal
aplikasi.
9
2.4.2 Versioning
Sistem android terdiri dari beberapa versi. Setiap android terbaru memiliki nama-
nama unik tersendiri dan memiliki beberapa jenis kelebihan mulai dari tampilan
hingga optimasi keamanan. Berikut daftar OS menurut versi.
Gambar 2.4 Versi OS Android (Sumber : futureloka.com)
1. Android versi 1.0 dirilis tanggal 23.09.2008
2. Android versi 1.1 dirilis tanggal 09.02.2009
3. Android versi 1.5 Cupcake dirilis tanggal 30.04.2009
4. Android versi 1.6 Donut dirilis tanggal 15.09.2009
5. Android versi 2.0 Eclair dirilis tanggal 26.10.2009
6. Android versi 2.2 Froyo dirilis tanggal 10.05.2010
7. Android versi 2.4 Gingerbread dirilis tanggal 06.12.2010
8. Android versi 3.0 Honeycomb dirilis tanggal 22.02.2011
9. Android versi 4.0 Ice Cream Sandwich dirilis tanggal 19.10.2011
10. Android versi 4.1 Jelly Bean dirilis tanggal 09.07.2012
11. Android versi 4.4 Kitkat dirilis tanggal 31.10.2013
12. Android versi 5.0 Lollipop dirilis tanggal 17.10.2014
13. Android versi 6.0 Marshmallow dirilis tanggal 28.05.2015
14. Android versi 7.0 Nougat dirilis tanggal 22.08.16
15. Android versi 8.0 Oreo dirilis tanggal 21.08.2017
10
Dibawah ini merupakan grafik pengguna smartphone berdasarkan OS Android
menjelaskan bahwa masih banyak pengguna yang menggunakan OS Kitkat dan
pengguna semakin meningkat di Lollipop, Marshmallow maupun Nougat
sekalipun.
Gambar 2.5 Grafik Pengguna OS Android
(Sumber : androidcentral.com)
11
BAB III
METODE PERANCANGAN
3.1 Tempat dan Waktu
Tempat penelitian dilaksanakan di Polda Kaltim Jl. Syarifuddin Yoes No 99
Balikpapan, Kalimantan Timur. Waktu penelitian mulai bulan Maret 2018 sampai
dengan Agustus 2018.
3.2 Peralatan dan Bahan
Penelitian tentang perancangan Aplikasi Absensi QR Code di Polda Kaltim
berbasis android membutuhkan peralatan dan bahan sebagai berikut :
Tabel 3.1 Alat dan Bahan
No Nama Spesifikasi Jumlah
1 Notebook Processor Intel Core i5, Memory
DDR3 4GB, Storage Hard disk
500GB SATA + , Graphic Intel ,
dan System Type 64-bit Operating
System.
1
2 Smartphone Android LTE Cat4, 1.5GHz Quad Core
Processor ,126.3 mm(5.0”) HD
sAMOLED, 8MP AF + 5MP, 8GB
Memory , Lollipop (5.1.1)
1
3 Android Studio V3.3 -
4 Google Chrome v65.0.3325.181 -
3.3 Proses Perancangan
Sebelum melakukan perancangann dan pembuatan Aplikasi Absensi berbasis
Android, perlu adanya perancangan gambaran prinsip kerja dari program aplikasi
yang akan di buat, agar mengetahui bagaimana program aplikasi ini bekerja sesuai
dengan harapan penulis. Di bawah ini merupakan flowchart tentang metode
pengumpulan data.
12
Gambar 3.1 Flowchart Perancangan
3.4 Penjelasan Flowchart
3.4.1 Menentukan Judul
Disini penulis mencari ide – ide atau topik yang didapat, kemudian penulis
menentukan judul yang kira – kira untuk diangkat menjadi Tugas Akhir yang
nantinya akan disetujui oleh kepala bidang tersebut.
3.4.2 Pengumpulan Data
Pengumpulan data ini dilakukan setelah judul disetujui oleh pembimbing,
data yang dikumpulkan berupa data – data pendukung untuk menunjang dalam
pembuatan sistem nantinya.
3.4.3 Membuat Rancangan Sistem
Pembuatan rancangan sistem ini dilakukan setelah dilakukan pengumpulan
data yang nantinya akan diimplementasikan saat proses pembuatan Tugas Akhir.
3.4.4 Penyusunan Proposal
Proses penyusunan proposal setelah dilakukan pengumpulan data dan
membuat rancangan sistem dan penulis membuat proposal TA sebanyak 4 bab yang
nantinya diajukan untuk sidang proposal TA.
13
3.4.5 Seminar Proposal
Pada saat ini mahasiswa mempresentasikan proposal TA yang dibuat
kepada penguji, disini terdapat moderator dan 2 penguji yang nantinya akan menilai
presentasi mahasiswa tersebut . Apakah proposal akan diterima atau tidak
tergantung dari nilai yang akan di beri oleh penguji.
3.4.6 Pembuatan Program
Pembuatan program dilakukan setelah proposal disetujui oleh penguji .
Kemudian pembuatannya sesuai dengan yang sudah rancangan sistem yang telah
dibuat.
3.4.7 Implementasi Program
Pengimplementasian program dilaksanakan setelah program telah selesai
dibuat dan disini termasuk dalam penghostingan aplikasi tersebut.
3.4.8 Uji Coba Program
Ketika program sudah diimplementasikan maka program akan diuji coba di
depan pembimbing dan apakah aplikasi berhasil atau perlu di edit atau direvisi
tergantung oleh pembimbing.
3.4.9 Penyusunan Laporan TA
Penyusunan laporan TA dilaksanakan saat program tekah di uji coba
danpenulis membuat laporan TA sebanyak 4 bab yang nantinya diajukan untuk
sidang proposal TA.
3.4.10 Sidang TA
Pada saat ini mahasiswa mempresentasikan hasil TA berupa program yang
telah dibuat kepada penguji, disini terdapat moderator dan 2 penguji yang nantinya
akan menilai presentasi mahasiswa tersebut . Apakah laporan TA tersebut akan
diterima atau tidak tergantung dari nilai yang akan di beri oleh penguji dan
pembimbing.
3.5 Flowchart
Pada penelitian cara Pembuatan Aplikasi Absensi terdapat flowchart yang dapat
menjelaskan bagaimana perencanaan kerja dari Absensi QR Code yang dapat
membantu pembaca untuk memahami sistem kerja yang di inginkan atau di
rencanakan oleh penulis.
14
Gambar 3.2 Flowchart Admin Gambar 3.3 Flowchart Absensi
3.6 Use Case Diagram
Pada penelitian pembuatan Aplikasi Absensi terdapat Use Case Admin dan User
yang dapat menjelaskan bagaimana menggambarkan kelakuan sistem yang akan
di buat.
Gambar 3.4 Use Case Diagram Aplikasi
15
3.7 Entity Relationship Diagram (ERD)
Gam
bar
3.5
ER
D A
pli
kas
i
16
3.8 Rancangan Database
3.8.1 Tabel Admin
Tabel 3.2 Admin
Nama Field Tipe Data Panjang
username varchar 100
password varchar 100
3.8.2 Tabel Karyawan
Tabel 3.3 Karyawan
Nama Field Tipe Data Panjang
nrp int 11
nama varchar 100
pangkat varchar
jabatan varchar 100
divisi varchar 100
password varchar 100
3.8.3 Tabel Absensi
Tabel 3.4 Absensi
Nama Field Tipe Data Panjang
id absen int 11
nrp varchar 11
status varchar 10
waktu timestamp
17
3.9 Tampilan Rancangan Aplikasi
3.9.1 Tampilan Karyawan Login
Gambar 3.6 Tampilan Login Karyawan
3.9.2 Tampilan Scan Code
Gambar 3.7 Tampilan Scan Code
18
BAB IV
HASIL DAN PEMBAHASAN
4.1 Hasil
Berikut adalah hasil-hasil dari pembuatan aplikasi absensi menggunakan QR
code di Polda Kaltim. Semua hasil tampilan memiliki kode script di bagian daftar
lampiran.
4.1.1 Halaman Login Admin
Gambar 4.1 Halaman Login Admin
Pada halaman ini berisi tentang halaman login admin yang diakses melalui
website. Ketika admin ingin mengelola data karyawan maupun data absensi admin
diharuskan untuk login. Halaman login ini terdiri dari field username dan password
, dimana username adalah admin sedangkan untuk password hanya admin yang
mengetahuinya. Ketika field-field telah terisi dengan baik dan benar maka
selanjutnya mengklik tombol login seperti pada Gambar 4.1 dan akan di arahkan ke
halaman home dan jika mengisi field-field tidak benar ataupun salah akan
menampilkan peringatan. Hasil program atau kode script login ini sebagai berikut :
Gambar 4.2 Script Login
19
Dari gambar 4.2 diatas menjelaskan bahwa variabel username dan password yang
didapat saat menginputkan pada halaman login admin dikirim ke ke database pada
tabel admin (baris 4) , ketika data yang diisi sesuai maka halaman akan menuju ke
index.php (baris 9) atau halaman home namun jika data salah maka akan mengarah
ke login-gagal (baris 11) dan memunculkan pesan seperti gambar 4.3.
Gambar 4.3 Peringatan Login Gagal
4.1.2 Halaman Home
Ketika proses login selesai maka akan diarahkan ke halaman home yang berisi
rekam absensi karyawan yang telah melakukan absensi berupa NRP, nama, status
dan waktu, serta admin disini juga dapat melakukan print rekapan absensi menurut
tanggal ataupun bulan . Disetiap halaman juga menampilkan navigasi seperti home,
karyawan, change password dan logout seperti pada gambar 4.4.
Gambar 4.4 Halaman Home
Hasil program atau kode script dari halaman home sebagai berikut :
Gambar 4.5 Script Tabel Absensi
20
Dari gambar 4.5 diatas menjelaskan untuk menampilkan data absensi yang diambil
dari database, pada baris 3 menggunakan array untuk menampilkan data pada
database yang terdiri dari id_absen,nrp,status, dan waktu. Pada baris 8 digunakan
untuk menampilkan data dari 2 tabel database yaitu tabel karyawan (nrp) dan tabel
absensi (id_absensi,nrp,nama, status, dan waktu) dalam satu tabel menggunakan
inner join. Script ini juga menampilkan data dari yang terbaru ke yang terlama(baris
11).
4.1.3 Halaman Karyawan
Halaman ini adalah untuk menampilkan data karyawan berupa no, foto, nrp,
nama , pangkat, jabatan, divisi, dan password. Password disini bertujuan agar
karyawan dapat mengakses aplikasi absensi berbasis android untuk melakukan
absensi. Admin diberi hak akses dalam mengelola data karyawan seperti
menghapus , menambah dan mengedit data karyawan yang diinginkan sesuai
kebutuhan seperti pada Gambar 4.6.
Gambar 4.6 Halaman Karyawan
Hasil kode script dari halaman ini sebagai berikut:
21
Gambar 4.7 Script Tabel Karyawan
Dari gambar 4.7 diatas menjelaskan untuk menampilkan data karyawan yang
diambil dari database yaitu tabel karyawan pada variabel sql(baris 1), variabel x
berfungsi untuk menampilkan angka otomatis pada tabel yang ditampilkan pada
halaman karyawan , variabel actionButton berfungsi menampilkan dropdown untuk
menu edit dan delete. pada variabel output (baris 22) disini menggunakan array
untuk menampilkan data dari database tabel karyawan yang akan ditampilkan pada
interface tabel di halaman karyawan.
4.1.4 Halaman Tambah Karyawan
Halaman ini adalah untuk membuat data karyawan baru berupa nrp, nama ,
pangkat, jabatan, divisi, dan password. Field nrp berupa nomor registrasi pusat yang
telah dimiliki oleh setiap anggota polri dan karyawan, field nama berupa nama
karyawan tersebut, field pangkat berisi daftar pangkat yang berada di kepolisian,
field jabatan yaitu jabatan yang dimiliki oleh karyawan tersebut, divisi yaitu tempat
atau bidang dimana karyawan itu berada, dan password ini berfungsi untuk login
karyawan ketika akan melakukan absensi pada aplikasi android seperti pada gambar
4.8.Ketika semua field sudah terisi dan berhasil tersimpan maka akan muncul
seperti gambar 4.9 namun ketika nrp yang diinput sudah ada maka akan muncul
seperti gambar 4.10.
22
Gambar 4.8 Halaman Tambah Karyawan
Gambar 4.9 Notifikasi Data Berhasil
Gambar 4.10 Notifikasi Data Gagal
Hasil kode script dari halaman ini adalah sebagai berikut:
Gambar 4.11 Script Tambah Karyawan
Dari Gambar 4.11 diatas menjelaskan bahwa variabel nrp sampai password (baris
1-6) yang didapat saat menginputkan pada Gambar 4.9 dikirim ke ke database pada
tabel karyawan (baris 7) , ketika data yang diisi sesuai maka akan menampilkan
notifikasi pada Gambar 4.10 dan skrip nya pada baris 12 dan ketika data yang
diinput tidak sesuai maka akan menampilkan notifikasi pada Gambar 4.10 dan
skrip nya pada baris 15.
4.1.5 Halaman Ganti Password
Halaman ini adalah untuk mengganti password yang digunakan oleh admin
ketika akan login di website admin, field current password berisi password lama,
field new password berisi password baru, field confirm password berisi password
23
baru yang telah dimasukkan seperti pada Gambar 4.12. Ketika password sudah
diinputkan dan sesuai maka akan menampilkan notifikasi seperti Gambar 4.13
namun ketika password yang diinput tidak sesuai maka akan menampilkan
notifikasi seperti Gambar 4.14.
Gambar 4.12 Halaman Ubah Password
Gambar 4.13 Notifikasi Password berhasil
Gambar 4.14 Notifikasi Password Gagal
Hasil kode script dari halaman ini adalah sebagai berikut :
Gambar 4.15 Script Ganti Password
Dari Gambar 4.15 diatas menjelaskan bahwa variabel sip digunakan untuk
menampilkan notifikasi ketika data berhasil atau tidaknya saat disimpan. Variabel
oldpassword (baris 4) untuk password lama dan variabel newpassword (baris 6)
untuk password baru ketika diinputkan pada Gambar 4.12. variabel user yaitu
session mengambil data dari database pada tabel admin field id (baris 5). Pada
24
variabel sql berfungsi untuk memilih password apakah password sesuai dengan
yang diinputkan pada database. Variabel con berfungsi mengubah password data
yang telah diinputkan dikirim ke database admin. Ketika password yang diinputkan
sesuai maka akan menampilkan Gambar 4.13 dan skrip nya pada baris 12 dan ketika
password yang diinput tidak sesuai maka akan menampilkan notifikasi pada
gambar 4.14 dan skrip nya pada baris 16.
4.1.6 Halaman Cetak Rekapan Absensi
Halaman ini adalah untuk mencetak rekapan laporan absensi karyawan yang
dapat diatur waktu sesuai yang diinginkan , halaman ini menampilkan nrp, nama,
status, tanggal, waktu saat karyawan melakukan absensi serta menampilkan tanggal
saat itu ketika dokumen akan dicetak seperti pada Gambar 4.16.
Gambar 4.16 Halaman Cetak
Hasil kode script dari halaman ini adalah sebagai berikut :
Gambar 4.17 Script Cetak
25
Dari Gambar 4.17 diatas menjelaskan bahwa variabel karayawan untuk
menampilkan data dari tabel absensi dan karyawan yang ada pada database disini
penulis menggunakan inner join sama seperti pada Gambar 4.5. Disini data yang
ditampilkan berdasarkan waktu dari yang terbaru hingga yang terlama . Variabel
pdf berfungsi untuk menampilkan pada data kolom pdf .
4.1.7 Halaman Login Karyawan
Pada halaman ini berisi tentang halaman login karyawan yang diakses
melalui aplikasi android. Aplikasi ini hanya bisa diakses oleh karyawan yang
namanya sudah di input oleh admin pada daftar karyawan. Interface ini
menampilkan field username dan password yang harus diisi oleh karyawan ketika
akan login seperti pada gambar 4.18.
Gambar 4.18 Tampilan Login Karyawan
Hasil kode script dari halaman ini adalah sebagai berikut:
Gambar 4.19 Script Login karyawan
Dari Gambar 4.19 diatas menjelaskan bahwa variabel nrp dan password yang
didapat saat menginputkan pada aplikasi login admin dikirim ke database pada tabel
26
karyawan (baris 4). ketika data yang diisi sesuai maka halaman akan menuju ke
kehalaman scan qr jika salah maka akan menampilakan “Invalid Username or
password Please Try Again” atau “check again”.
String HttpURL = "http://tkjpoltekba15.com/absen/loginkaryawan.php";
Pada skrip di atas merupakan url pada java untuk mencari dimana letak file php
login untuk karyawan tersimpan agar aplikasi bisa mengakses untuk login
karyawan ketika digunakan pada aplikasi android.
4.1.8 Halaman Scan Qr Code
Pada halaman ini berisi scan qr code yang digunakan karyawan untuk
melakukan absensi yang berfungsi menscan QR Code yang telah disediakan oleh
instansi yang rencananya akan ditampilkan di layar aula, ketika karyawan
melakukan scanner menggunakan android maka data akan otomatis masuk ke
database berupa nama, nrp, waktu, dan status. Interface ini hanya menampilkan
scanner seperti pada Gambar 4.20.
Gambar 4.20 Tampilan Scan QR Code
Hasil kode script dari halaman ini adalah sebagai berikut:
public static final String BASE_URL = "http://tkjpoltekba15.com/absen/input.php";
skrip diatas berfungsi untuk mengambil data php yang ada pada database pada
input.php. data yang diambil yaitu berupa qr code yang telah di scan “result
code”, nomor registrasi karyawan yaitu “nrp” dan status pada “status”,
StringRequest stringRequest = new StringRequest(Request.Method.GET,
BASE_URL+"?status="+resultCode+"&nrp="+nrpb,
jika scan berhasil maka akan menampilkan “scan success” dan skripnya yaitu :
27
public void onResponse(String response) {
Toast.makeText(getContext(),"scan success",Toast.LENGTH_LONG).show();
apabila scan gagal maka akan menampilkan “scan gagal” dan skripnya yaitu :
public void onErrorResponse(VolleyError error) {
Toast.makeText(getContext(),"scan gagal",Toast.LENGTH_LONG).show();
}
Gambar 4.21 Script Input Absensi
Dari Gambar 4.21 diatas menjelaskan bahwa variabel status didapatkan saat
karyawan melakukan scan qr, nrp otomatis terkirim saat melakukan scanner, dan
waktu saat karyawan melakukan scanner saat itu juga, variabel status berfungsi
menampilkan notifikasi ketika barcode berhasil disimpan atau tidaknya.
4.1.9 Halaman History
Pada halaman ini berisi riwayat absensi yang telah dilakukan oleh karyawan
tersebut, interface ini menampilkan nrp, status dan waktu yang telah dilakukan oleh
karyawan tersebut dalam melakukan absensi seperti pada Gambar 4.22.
Gambar 4.22 Tampilan History Karyawan
Hasil kode script dari halaman adalah sebagai berikut:
public View getView(int position, View convertView, ViewGroup parent) {
convertView =
layoutInflater.inflate(R.layout.activity_custom_list_history, parent,
false);
TextView status = (TextView)
convertView.findViewById(R.id.text_view_status);
28
TextView waktu = (TextView)
convertView.findViewById(R.id.text_view_waktu);
status.setText(this.fData.get(position).getStatus());
waktu.setText(this.fData.get(position).getWaktu());
skrip diatas yaitu untuk menampilkan data history yang data nya diambil dari status
dan waktu karyawan itu sendiri.
4.1.10 Halaman Ubah Password Karyawan
Pada halaman ini untuk mengganti password karyawan yang digunakan
oleh karyawan itu sendiri ketika akan login pada aplikasi android, field current
password berisi password lama, field new password berisi password baru, field
confirm password berisi password baru yang telah dimasukkan sebelumnya seperti
Gambar 4.23.
Gambar 4.23 Tampilan Ubah Password Karyawan
Hasil kode script dari halaman adalah sebagai berikut:
mCurrentPassword = (EditText)
view.findViewById(R.id.edit_text_current_password);
NRPholder = getActivity().getIntent().getStringExtra("password");
mCurrentPassword.setText(NRPholder);
mNewPassword = (EditText) view.findViewById(R.id.edit_text_new_password);
mConfirmPassword = (EditText)
view.findViewById(R.id.edit_text_confirm_password);
mSave = (Button) view.findViewById(R.id.button_save);
mSave.setOnClickListener(v -> {
Skrip diatas yaitu untuk mengubah password karyawan itu sendiri ketika akan
mengakses aplikasi absensi pada android.
29
4.2 Pembahasan Program
Fokus Penelitian ini adalah pembuatan aplikasi absensi menggunakan qr
code yang akan digunakan oleh karyawan sebagai media berupa aplikasi berbasis
android yang menjelaskan bagaimana cara menggunakan aplikasi qr code yang
bertujuan untuk mempermudah karyawan dalam melakukan absensi tanpa harus
mencari letak fingerprint di letak yang berbeda - beda. Disini penulis melakukan
hostingan sementara di internet yang kedepannya nanti akan diletakkan di server
lokal ketika sudah dapat mendapatkan hak akses di instansi tersebut karena
membutuhkan proses yang lama. Penulis menggunakan www.hostinger.co.id untuk
melakukan hostingan sementara dengan nama domain yang dapat diakses oleh
admin yaitu www.tkjpoltekba15.com/absen.
Sistem informasi ini terdiri dari website dan aplikasi android. Pada sistem
website disini hanya bisa diakses oleh admin , ketika admin login mereka dapat
mengelola data karyawan dan data absensi. Password admin dibuat menggunakan
compile md5 agar tidak mudah diserang oleh hacker serta pasword juga dapat
diganti sesuai keinginan admin itu sendiri. Sedangkan pada aplikasi android dapat
diakses oleh karyawan yang namanya sudah diinputkan oleh admin di daftar
karyawan. Ketika karyawan telah melakukan login dengan nrp dan password yang
telah dibuat oleh admin, mereka dapat melakukan absensi dengan menscan qr code
yang telah disediakan oleh pihak instansi. Karyawan juga dapat mengganti
password untuk login sesuai dengan keinginannya masing-masing, dan dapat
melihat history yang telah melakukan absensi sebelumnya. Scan qr ini dilakukan 2
kali saat baru datang dan akan pulang. Pada sistem ini semua fungsi pada aplikasi
telah diuji dan didapatkan hasilnya sesuai dengan rancangan awal, sehingga
diperoleh hasil yang berjalan sesuai dengan fungsinya yang dapat dilihat disetiap
gambar pada BAB IV.
30
BAB V
PENUTUP
5.1 Kesimpulan
Dari hasil analisa, perancangan dan pembuatan program aplikasi yang telah dijabarkan
di bab sebelumnya, maka dapat disimpulkan bahwa:
1. Aplikasi absensi bermanfaat untuk mempermudah setiap karyawan khususnya
dalam melakukan absensi menggunakan Qr Code yang telah disediakan untuk
diakses pada android setiap karyawan.
2. Melalui aplikasi absensi menggunakan Qr Code berbasis android ini karyawan
dapat menghemat waktu saat melakukan absensi secara efektif dan efisien tanpa
harus mencari tempat absensi.
3. Aplikasi ini membantu admin dalam mempermudah mengelola rekapan absensi
karyawan sesuai waktu yang dibutuhkan.
5.2 Saran
Dalam Pembuatan Aplikasi Absensi menggunakan QR Code di Polda Kaltim berbasis
android ini penulis manyatakan bahwa masih banyak kekurangan. Oleh karena itu perlu
dikembangkan penyempurnaan untuk lebih lanjut. Adapun saran agar aplikasi ini lebih
optimal adalah sebagai berikut :
1. Pengembangan selanjutnya, penulis berharap untuk dapat menambah fitur-fitur
yang belum ada sebelumnya.
2. Menambahkan IMEI android pada aplikasi agar meminimalisir terjadinya titip
absen.
3. Membuat aplikasi ini dapat berjalan di semua tipe smartphone.
31
DAFTAR PUSTAKA
Android Central.(2018, 5 Mei). Android distribution numbers: Everything you need
to know!.diakses tgl 5 Mei 2018. Dari https://www.androidcentral.com/
android-distribution-numbers/
Futureloka.(2018, 2 April).Daftar OS Android. diakses tgl 2 April 2018.Dari
http://futureloka.com/daftar-os-android/
Google Developer Training.(2018, 2 April).Pengantar Android. diakses tgl 2 April
2018.Dari https://google-developer-training.gitbooks.io/android-developer-
fundamentals-course-concepts/content/idn/Unit%201/10_c_intro_to_
android.html
QR Code Generator.(2018, 2 April).QR Code. diakses tgl 2 April 2018.Dari
https://www.qr-code-generator.com/a1
Simonna,Erna.(2008) : Sistem Tekhnologi Informasi, Pengembangan dan Pengolahan.
Yogyakarta. Andi. 87
Supiah.(2016). Tugas Akhir: Aplikasi Berbasis Java untuk Absensi Karyawan di SMA
PJHI Balikpapan. POLTEKBA . Balikpapan. 3.
Wikipedia. (2018, 2 April). Pengertian QR Code. Diakses tgl 2 April 2018. Dari
https://id.wikipedia.org/wiki/QR_Code/
Yudhanto ,Y & Wijayanto, A. (2017) : Mudah Membuat dan Berbisnis Aplikasi
Android dengan Android Studio. Jakarta. PT Elex Media Komputindo. 1-13.
Zetizen .(2018, 2 April). Android 8.0 Resmi Rilis. diakses tgl 2 April 2018.Dari
https://www.zetizen.com/show/11344/android-8-0-resmi-rilis-namanya-oreo-
ada-fitur-baru-apa-aja-ya/
32
LAMPIRAN
1. config.php
<?php
global $koneksi;
$nameserver = "mysql.hostinger.co.id";
$username = "u847393371_absn2";
$password = "20152018absn2";
$namadb = "u847393371_absn2";
$koneksi =
mysqli_connect($nameserver,$username,$password,$namadb);
if(!$koneksi) {
die("Koneksi Gagal".mysqli_connect_error());
}
?>
2. login.php
<?php
ob_start();
session_start();
if(isset($_SESSION['admin_username'])) header("location: index.php");
include "assets/includes/config.php";
/* PROSES LOGIN */
if(isset($_POST['submit_login'])) {
$username = $_POST['username'];
$password = md5($_POST['password']);
$sql_login = mysqli_query($koneksi, "SELECT * FROM admin WHERE
username = '$username' AND password = '$password'");
if(mysqli_num_rows($sql_login)>0) {
$row_admin = mysqli_fetch_array($sql_login);
$_SESSION['admin_id'] = $row_admin['id'];
$_SESSION['admin_username'] = $row_admin['username'];
header("location: index.php");
}else {
header("location: login.php?login-gagal");
}
}
?>
<html>
33
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ABONPOLKA</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<link rel="shorcut icon" type="image/png" href="img/iconts.png">
<style>
body{
background: url(img/Polkat.jpg)no-repeat;
background-size: cover;
background-position: center;
}
</style>
</head>
<body>
<div class="login-box">
<img src="img/icontb.png" class="avatar">
<h1>Login Here</h1>
<form method="post">
<p>Username</p>
<input type="text" name="username" value="" placeholder="Enter
Username" required>
<p>Password</p>
<input type="password" name="password" value=""
placeholder="Enter Password" required>
<?php if(isset($_GET['login-gagal'])) {?> <div>
<p>Maaf, Username / Password yang Anda masukkan Salah</p>
</div>
<?php }?>
<input type="submit" name="submit_login" value="Login" >
<!-- <a onclick="lupa()" style="cursor:pointer;">Forget
Password?</a> -->
</form>
</div>
</body>
</html>
<?php
mysqli_close($koneksi);
?>
34
3. index.php
<?php
ob_start();
session_start();
if(isset($_SESSION['admin_username'])) header("location: index.php");
include "assets/includes/config.php";
/* PROSES LOGIN */
if(isset($_POST['submit_login'])) {
$username = $_POST['username'];
$password = md5($_POST['password']);
$sql_login = mysqli_query($koneksi, "SELECT * FROM admin WHERE username =
'$username' AND password = '$password'");
if(mysqli_num_rows($sql_login)>0) {
$row_admin = mysqli_fetch_array($sql_login);
$_SESSION['admin_id'] = $row_admin['id'];
$_SESSION['admin_username'] = $row_admin['username'];
header("location: index.php");
}else {
header("location: login.php?login-gagal");
}
}
?>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ABONPOLKA</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<link rel="shorcut icon" type="image/png" href="img/iconts.png">
<style>
body{
background: url(img/Polkat.jpg)no-repeat;
background-size: cover;
background-position: center;
}
</style>
</head>
<body>
<div class="login-box">
35
<img src="img/icontb.png" class="avatar">
<h1>Login Here</h1>
<form method="post">
<p>Username</p>
<input type="text" name="username" value="" placeholder="Enter Username"
required>
<p>Password</p>
<input type="password" name="password" value="" placeholder="Enter
Password" required>
<?php if(isset($_GET['login-gagal'])) {?> <div>
<p>Maaf, Username / Password yang Anda masukkan Salah</p>
</div>
<?php }?>
<input type="submit" name="submit_login" value="Login" >
</form>
</div>
</body>
</html>
<?php
mysqli_close($koneksi);
?>
4. response.php
<?php
include_once("../includes/config.php");
$params = $columns = $totalRecords = $data = array();
$params = $_REQUEST;
$columns = array(
0 =>'id_absen',
1 =>'nrp',
2 => 'status',
3 => 'waktu'
);
$where = $sqlTot = $sqlRec = "";
$sql = "SELECT c.id_absen, nrp , nama, status, waktu FROM absensi2 c
JOIN karyawan s USING (nrp) ";
$sqlTot .= $sql;
$sqlRec .= $sql;
$sqlRec .= " ORDER BY status DESC";
36
$queryTot = mysqli_query($koneksi, $sqlTot) or die("database error:".
mysqli_error($koneksi));
$totalRecords = mysqli_num_rows($queryTot);
$queryRecords = mysqli_query($koneksi, $sqlRec) or die("error to
fetch absensi2 data");
while( $row = mysqli_fetch_row($queryRecords) ) {
$data[] = $row;
}
$json_data = array(
"draw" => 1,
"recordsTotal" => intval( $totalRecords ),
"recordsFiltered" => intval($totalRecords),
"data" => $data
);
echo json_encode($json_data); ?>
5. karyawan.php
<?php
ob_start();
session_start();
if(!isset($_SESSION['admin_id'])) header("location:login.php");
include "assets/includes/config.php";
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ABONPOLKA</title>
<link rel="shorcut icon" type="image/png" href="img/icontb.png">
<link rel="stylesheet" href="css/main.css">
<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:700,
600,500,400,300' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-
awesome/4.5.0/css/font-awesome.min.css">
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"
/>
37
<link rel="stylesheet"
href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" />
<link rel="stylesheet"
href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></scr
ipt>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script
>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></sc
ript>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></
script>
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></sc
ript>
<script
src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></scrip
t>
</head>
<body>
<div class="header">
<div class="logo">
<i><img src="img/iconts.png" width="30px"></i>
<span>Absensi Online</span>
</div>
<a href="#" class="nav-trigger"><span></span></a>
<div><h4 style="color:white;"><marquee>Selamat Datang di Administrator
Absensi Online Polda Kaltim</marquee></h4></div>
</div>
<div class="side-nav">
<div class="logo">
<i><img src="img/iconts.png" width="30px"></i>
<span>Admin</span>
</div>
38
<nav>
<ul>
<li>
<a href="index.php">
<span><i class="fa fa-bar-chart"></i></span>
<span>Home</span>
</a>
</li>
<li>
<a href="#">
<span><i class="fa fa-user"></i></span>
<span>Karyawan</span>
</a>
</li>
<li>
<a href="changes.php">
<span><i class="fa fa-key"></i></span>
<span>Change Password</span>
</a>
</li>
<li>
<a href="logout.php">
<span><i class="fa fa-power-off"></i></span>
<span>Log Out</span>
</a>
</li>
</ul>
</nav>
</div>
<div class="main-content">
<div class="title">
Karyawan Polda Kaltim
</div>
<div class="main">
<div class="container">
<div class="widget">
<div style="margin-bottom: 10px;">
<form class="form-inline" action="" method="post">
<div class="form-group">
39
<span class="pull-left"><a href="#addnew" data-toggle="modal" class="btn
btn-primary"><span class="glyphicon glyphicon-plus"></span> Tambah
Karyawan</a></span>
</div>
<div class="form-group">
<button class="btn btn-default btn-xs"><span class="glyphicon glyphicon-
refresh "></span></button>
</div>
</form>
</div>
<div style="height:20px;"></div>
<table class="table table-striped table-bordered table-hover">
<thead>
<th>No</th>
<th>foto</th>
<th>nrp</th>
<th>nama</th>
<th>pangkat</th>
<th>jabatan</th>
<th>divisi</th>
<th>password</th>
<th>Action</th>
</thead>
<tbody>
<?php
include('assets/includes/config.php');
$no = 0;
$query=mysqli_query($koneksi,"select * from `karyawan`");
while($row=mysqli_fetch_array($query)){
$no++;
?>
<tr>
<td><?php echo $no; ?></td>
<td><img src="img/user/<?php echo $row['foto'];?>" height="50px"
width="50px"> </td>
<td><?php echo $row['nrp']; ?></td>
<td><?php echo $row['nama']; ?></td>
<td><?php echo $row['pangkat']; ?></td>
<td><?php echo $row['jabatan']; ?></td>
<td><?php echo $row['divisi']; ?></td>
40
<td><?php echo $row['password']; ?></td>
<td>
<a href="#edit<?php echo $row['nrp']; ?>" data-toggle="modal" class="btn
btn-warning"><span class="glyphicon glyphicon-edit"></span> Edit</a> ||
<a href="#del<?php echo $row['nrp']; ?>" data-toggle="modal" class="btn btn-
danger"><span class="glyphicon glyphicon-trash"></span> Delete</a>
<?php require('assets/button.php'); ?>
</td>
</tr>
<?php
}
?>
</tbody>
</table>
</div>
<?php include('assets/add_modal.php'); ?>
</div>
</div>
</div>
</body>
</html>
6. add_modal.php
<!-- Add New -->
<div class="modal fade" id="addnew" tabindex="-1" role="dialog" aria-
labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-
hidden="true">×</button>
<center><h4 class="modal-title" id="myModalLabel">Tambah
Karyawan</h4></center>
</div>
<div class="modal-body">
<div class="container-fluid">
<form method="POST" action="assets/addnew.php" enctype="multipart/form-
data">
<div class="row">
<div class="col-lg-2">
41
<label class="control-label" style="position:relative;
top:7px;">NRP:</label>
</div>
<div class="col-lg-10">
<input type="text" class="form-control" name="nrp">
</div>
</div>
<div style="height:10px;"></div>
<div class="row">
<div class="col-lg-2">
<label class="control-label" style="position:relative;
top:7px;">Nama:</label>
</div>
<div class="col-lg-10">
<input type="text" class="form-control" name="nama">
</div>
</div>
<div style="height:10px;"></div>
<div class="row">
<div class="col-lg-2">
<label class="control-label" style="position:relative;
top:7px;">Pangkat:</label>
</div>
<div class="col-lg-10">
<select name="pangkat" class="form-control">
<option>KOMBES POL</option>
<option>AKBP</option>
<option>KOMPOL</option>
<option>IPTU</option>
<option>IPDA</option>
<option>AIPTU</option>
<option>AIPDA</option>
<option>BRIGADIR</option>
<option>BRIPKA</option>
<option>BRIPTU</option>
<option>BRIPDA</option>
<option>PENATA</option>
<option>PENATA I</option>
<option>PENDA</option>
<option>PENDA TK I</option>
42
<option>PENGATUR I</option>
</select>
</div>
</div>
<div style="height:10px;"></div>
<div class="row">
<div class="col-lg-2">
<label class="control-label" style="position:relative;
top:7px;">Jabatan:</label>
</div>
<div class="col-lg-10">
<input type="text" class="form-control" name="jabatan">
</div>
</div>
<div style="height:10px;"></div>
<div class="row">
<div class="col-lg-2">
<label class="control-label" style="position:relative;
top:7px;">Divisi:</label>
</div>
<div class="col-lg-10">
<input type="text" class="form-control" name="divisi">
</div>
</div>
<div style="height:10px;"></div>
<div class="row">
<div class="col-lg-2">
<label class="control-label" style="position:relative;
top:7px;">Password:</label>
</div>
<div class="col-lg-10">
<input type="text" class="form-control" name="password">
</div>
</div>
<div style="height:10px;"></div>
<div class="row">
<div class="col-lg-2">
<label class="control-label" style="position:relative;
top:7px;">Foto:</label>
</div>
43
<div class="col-lg-10">
<input type="file" name="foto">
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"><span
class="glyphicon glyphicon-remove"></span> Cancel</button>
<button type="submit" class="btn btn-primary"><span class="glyphicon
glyphicon-floppy-disk"></span> Save</button>
</form>
</div>
</div>
</div>
</div>
7. addnew.php
<?php
include('includes/config.php');
$nrp=$_POST['nrp'];
$nama=$_POST['nama'];
$pangkat=$_POST['pangkat'];
$jabatan=$_POST['jabatan'];
$divisi=$_POST['divisi'];
$password=$_POST['password'];
$target_dir = "";
$foto = $target_dir . basename($_FILES["foto"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($foto,PATHINFO_EXTENSION));
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
echo "File is an image - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "File is not an image.";
$uploadOk = 0;
44
}
}
// Check if file already exists
if (file_exists($foto)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
// Check file size
if ($_FILES["foto"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType !=
"jpeg"
&& $imageFileType != "gif" ) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
mysqli_query($koneksi ,"insert into karyawan (nrp, nama, pangkat, jabatan,
divisi, password, foto) values ('$nrp', '$nama', '$pangkat', '$jabatan',
'$divisi', '$password', '$foto')");
move_uploaded_file($_FILES['foto']['tmp_name'],'../img/user/'.$foto);
header ('location: ../karyawan.php');
?>
8. button.php
<!-- Delete -->
<div class="modal fade" id="del<?php echo $row['nrp']; ?>" tabindex="-1"
role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-
hidden="true">×</button>
<center><h4 class="modal-title" id="myModalLabel">Delete</h4></center>
</div>
<div class="modal-body">
<?php
45
$del=mysqli_query($koneksi,"select * from karyawan where
nrp='".$row['nrp']."'");
$drow=mysqli_fetch_array($del);
?>
<div class="container-fluid">
<h5><center>NRP : <strong><?php echo $drow['nrp']; ?></strong></center></h5>
<h5><center>Nama: <strong><?php echo $drow['nama'];
?></strong></center></h5>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"><span
class="glyphicon glyphicon-remove"></span> Cancel</button>
<a href="assets/delete.php?id=<?php echo $row['nrp']; ?>" class="btn btn-
danger"><span class="glyphicon glyphicon-trash"></span> Delete</a>
</div>
</div>
</div>
</div>
<!-- /.modal -->
<!-- Edit -->
<div class="modal fade" id="edit<?php echo $row['nrp']; ?>" tabindex="-1"
role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-
hidden="true">×</button>
<center><h4 class="modal-title" id="myModalLabel">Edit</h4></center>
</div>
<div class="modal-body">
<?php
$edit=mysqli_query($koneksi,"select * from karyawan where
NRP='".$row['nrp']."'");
$erow=mysqli_fetch_array($edit);
?>
<div class="container-fluid">
<form method="POST" action="assets/edit.php?id=<?php echo $erow['nrp']; ?>">
<div class="row">
<div class="col-lg-2">
46
<label style="position:relative; top:7px;">NRP:</label>
</div>
<div class="col-lg-10">
<input type="text" name="nrp" class="form-control" value="<?php echo
$erow['nrp']; ?>">
</div>
</div>
<div style="height:10px;"></div><div class="row">
<div class="col-lg-2">
<label style="position:relative; top:7px;">Nama:</label>
</div>
<div class="col-lg-10">
<input type="text" name="nama" class="form-control" value="<?php echo
$erow['nama']; ?>">
</div>
</div>
<div style="height:10px;"></div><div class="row">
<div class="col-lg-2">
<label style="position:relative; top:7px;">Pangkat:</label>
</div>
<div class="col-lg-10">
<select name="pangkat" class="form-control" value"<?php echo
$erow['pangkat']; ?>">
<option>KOMBES POL</option>
<option>AKBP</option>
<option>KOMPOL</option>
<option>IPTU</option>
<option>IPDA</option>
<option>AIPTU</option>
<option>AIPDA</option>
<option>BRIGADIR</option>
<option>BRIPKA</option>
<option>BRIPTU</option>
<option>BRIPDA</option>
<option>PENATA</option>
<option>PENATA I</option>
<option>PENDA</option>
<option>PENDA TK I</option>
<option>PENGATUR I</option>
</select>
47
</div>
</div>
<div style="height:10px;"></div><div class="row">
<div class="col-lg-2">
<label style="position:relative; top:7px;">Jabatan:</label>
</div>
<div class="col-lg-10">
<input type="text" name="jabatan" class="form-control" value="<?php echo
$erow['jabatan']; ?>">
</div>
</div>
<div style="height:10px;"></div><div class="row">
<div class="col-lg-2">
<label style="position:relative; top:7px;">Divisi:</label>
</div>
<div class="col-lg-10">
<input type="text" name="divisi" class="form-control" value="<?php echo
$erow['divisi']; ?>">
</div>
</div>
<div style="height:10px;"></div>
<div class="row">
<div class="col-lg-2">
<label style="position:relative; top:7px;">Password:</label>
</div>
<div class="col-lg-10">
<input type="text" name="password" class="form-control" value="<?php echo
$erow['password']; ?>">
</div>
</div>
<div style="height:10px;"></div>
<div class="row">
<div class="col-lg-2">
<label style="position:relative; top:7px;">Foto:</label>
</div>
<div class="col-lg-10">
<input type="file" name="foto" value="<?php echo $erow['foto']; ?>">
</div>
</div>
48
<div style="height:10px;"></div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"><span
class="glyphicon glyphicon-remove"></span> Cancel</button>
<button type="submit" class="btn btn-warning"><span class="glyphicon
glyphicon-check"></span> Save</button>
</div>
</form>
</div>
</div>
</div>
<!-- /.modal -->
9. delete.php
<?php
include('includes/config.php');
$id=$_GET['id'];
mysqli_query($koneksi, "delete from karyawan where nrp='$id'");
header ('location:../karyawan.php');
?>
10. edit.php
<?php
include('includes/config.php');
$id=$_GET['id'];
$nrp=$_POST['nrp'];
$nama=$_POST['nama'];
$pangkat=$_POST['pangkat'];
$jabatan=$_POST['jabatan'];
$divisi=$_POST['divisi'];
$password=$_POST['password'];
$foto = $target_dir . basename($_FILES["foto"]["name"]);
mysqli_query($koneksi,"update karyawan set nrp='$nrp',nama='$nama',
pangkat='$pangkat', jabatan='$jabatan', divisi='$divisi',
password='$password' , foto='$foto' where nrp='$id' ");
header('location:../karyawan.php');
?>
11. changes.php
49
<?php
ob_start();
session_start();
if(!isset($_SESSION['admin_id'])) header("location:login.php");
include "assets/includes/config.php";
$sip="";
if(isset($_POST['Submit']))
{
$oldpass=md5($_POST['opwd']);
$user=$_SESSION['admin_id'];
$newpassword=md5($_POST['npwd']);
$sql=mysqli_query($koneksi,"SELECT password FROM admin where
password='$oldpass' && id='$user'");
$num=mysqli_fetch_array($sql);
if($num>0)
{
$con=mysqli_query($koneksi,"update admin set password='$newpassword' where
id='$user'");
$sip="Password Changed Successfully !!";
}
else
{
$sip="Old Password not match !!";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ABONPOLKA</title>
<link rel="shorcut icon" type="image/png" href="img/icontb.png">
<link rel="stylesheet" href="css/main.css">
<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:700,
600,500,400,300' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-
awesome/4.5.0/css/font-awesome.min.css">
50
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"
/>
<link rel="stylesheet"
href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></scr
ipt>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></
script>
<script src="https://code.jquery.com/jquery-2.2.1.min.js"></script>
<script src="js/main.js"></script>
</head>
<body>
<div class="header">
<div class="logo">
<i><img src="img/iconts.png" width="30px"></i>
<span>Admin</span>
</div>
<a href="#" class="nav-trigger"><span></span></a>
<div><h4 style="color:white;"><marquee>Selamat Datang di Administrator
Absensi Online Polda Kaltim</marquee></h4></div>
</div>
<div class="side-nav">
<div class="logo">
<i><img src="img/iconts.png" width="30px"></i>
<span>Admin</span>
</div>
<nav>
<ul>
<li>
<a href="index.php">
<span><i class="fa fa-bar-chart"></i></span>
<span>Home</span>
</a>
</li>
<li>
<a href="karyawan.php">
<span><i class="fa fa-user"></i></span>
51
<span>Karyawan</span>
</a>
</li>
<li>
<a href="#">
<span><i class="fa fa-key"></i></span>
<span>Change Password</span>
</a>
</li>
<li>
<a href="logout.php">
<span><i class="fa fa-power-off"></i></span>
<span>Log Out</span>
</a>
</li>
</ul>
</nav>
</div>
<div class="main-content">
<div class="title">
Change Password Admin
</div>
<div class="main">
<div class="container">
<div class="widget">
<p style="color:red;">
<?php echo $sip;?><?php echo $sip="";?></p>
<form name="chngpwd" action="" method="post" onSubmit="return valid();">
<div class="row">
<div class="col-lg-2">
<label class="control-label" style="position:relative; top:7px;">Current
Password:</label>
</div>
<div class="col-lg-10">
<input type="text" class="form-control" name="opwd" id="opwd">
</div>
</div>
<div style="height:10px;"></div>
<div class="row">
<div class="col-lg-2">
52
<label class="control-label" style="position:relative; top:7px;">New
Password:</label>
</div>
<div class="col-lg-10">
<input type="text" class="form-control" name="npwd" id="npwd">
</div>
</div>
<div style="height:10px;"></div>
<div class="row">
<div class="col-lg-2">
<label class="control-label" style="position:relative; top:7px;">Confirm
Password:</label>
</div>
<div class="col-lg-10">
<input type="text" class="form-control" name="cpwd" id="cpwd">
</div>
</div>
<div style="height:10px;"></div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"><span
class="glyphicon glyphicon-remove"></span><a href="index.php"/>
Cancel</button>
<button type="submit" class="btn btn-primary" name="Submit"><span
class="glyphicon glyphicon-floppy-disk"></span> Save </button> </div>
</form>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript">
function valid()
{
if(document.chngpwd.opwd.value=="")
{
alert("Old Password Filed is Empty !!");
document.chngpwd.opwd.focus();
return false;
}
else if(document.chngpwd.npwd.value=="")
53
{
alert("New Password Filed is Empty !!");
document.chngpwd.npwd.focus();
return false;
}
else if(document.chngpwd.cpwd.value=="")
{
alert("Confirm Password Filed is Empty !!");
document.chngpwd.cpwd.focus();
return false;
}
else if(document.chngpwd.npwd.value!= document.chngpwd.cpwd.value)
{
alert("Password and Confirm Password Field do not match !!");
document.chngpwd.cpwd.focus();
return false;
}
return true;
}
</script>
<?php
mysqli_close($con);
?>
</html>
12. cetak.php
<?php
// memanggil library FPDF
require('fpdf.php');
$id=$_GET['date'];
{
date_default_timezone_set('Asia/Makassar');// change according timezone
$currentTime = date( 'd-m-Y h:i:s A', time () );
}
// intance object dan memberikan pengaturan halaman PDF
$pdf = new FPDF('p','mm','Legal');
// membuat halaman baru
$pdf->AddPage();
$pdf->SetFont('Arial','B',10);
54
//Format tanggal
$pdf->Cell(200,5,'Balikpapan',0,1,'R');
$pdf->SetFont('Times','B',10);
$pdf->Cell(200,2,"Printed On : ".date("D-d/m/Y"),0,1,'R');
$pdf->ln(1);
$pdf->Image('../../img/iconts.png',60,5,15);
$pdf->Cell(10,2,'',0,1);
$pdf->SetFont('Arial','B',13);
// mencetak string
$pdf->Cell(120,5,'KEPOLISIAN NEGARA REPUBLIK INDONESIA',0,1,'C');
$pdf->SetFont('Arial','B',12);
// mencetak string
$pdf->Cell(120,5,'DAERAH KALIMANTAN TIMUR',0,5,'C');
$pdf->SetFont('Arial','U',11);
$pdf->Cell(120,5,'Jalan Syarifuddin Yoes 99 Balikpapan 76115',0,5,'C');
$pdf->Cell(5,7,'',0,4);
$pdf->SetFont('Arial','B',12);
//Format tanggal
$pdf->Cell(200,5,'REKAPAN ABSENSI ONLINE POLDA KALTIM ',0,1,'C');
$pdf->Cell(10,2,'',0,4);
$pdf->SetFont('Arial','B',10,'C');
$pdf->Cell(10,6,'No',1,0,'C');
$pdf->Cell(40,6,'NRP',1,0,'C');
$pdf->Cell(50,6,'Nama',1,0,'C');
$pdf->Cell(25,6,'Status',1,0,'C');
$pdf->Cell(35,6,'Tanggal',1,0,'C');
$pdf->Cell(35,6,'Waktu',1,1,'C');
$pdf->SetFont('Arial','',10);
include '../includes/config.php';
//$mahasiswa = mysqli_query($connect, "select * from mahasiswa");
$no =0;
$mahasiswa = mysqli_query($koneksi, "SELECT c.id_absen, nrp , nama, status,
waktu FROM absensi2 c JOIN karyawan s USING (nrp) WHERE (waktu BETWEEN
'$id') ORDER BY waktu DESC ");
while ($row = mysqli_fetch_array($mahasiswa)){
$no++;
55
//$pdf->Cell(10,6,$row['id_absen'],1,0,'C');
$pdf->Cell(10,6, $no ,1,0,'C');
$pdf->Cell(40,6,$row['nrp'],1,0,'C');
$pdf->Cell(50,6,$row['nama'],1,0,'C');
$pdf->Cell(25,6,$row['status'],1,0,'C');
$pdf->Cell(35,6,date('Y-m-d',strtotime ($row['waktu'])),1,0,'C');
$pdf->Cell(35,6,date('G:i',strtotime($row['waktu'])),1,1,'C');
}
$pdf->Output();
?>
13. logout.php
<?php
session_start();
$_SESSION["admin_id"];
unset($_SESSION["admin_id"]);
session_unset();
session_destroy();
header("location:login.php");
?>
14. init.php
<?php
$host = "mysql.hostinger.co.id";
$user_name = "u847393371_absn2";
$user_password = "20152018absn2";
$db_name = "u847393371_absn2";
?>
15. loginkaryawan.php
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
include 'init.php';
$con = mysqli_connect($host,$user_name,$user_password,$db_name);
$nrp = $_POST['nrp'];
$password = $_POST['password'];
$Sql_Query = "select * from karyawan where nrp = '$nrp' and password =
'$password' ";
$check = mysqli_fetch_array(mysqli_query($con,$Sql_Query));
56
if(isset($check)){
echo "Data Matched";
}
else{
echo "Invalid Username or Password Please Try Again";
}
}else{
echo "Check Again";
}
mysqli_close($con);
?>
16. input.php
<?php
include "init.php";
$con = mysqli_connect($host,$user_name,$user_password,$db_name);
date_default_timezone_set("Asia/Makassar");
$nrp=$_GET['nrp'];
$status=$_GET['status'];
$waktu=date('Y-m-d H:i:s');
if($status!=""){
$Sql_Query="INSERT INTO absensi2 (`nrp`, `status`, `waktu`) VALUES ('$nrp',
'$status', '$waktu')";
$check = mysqli_fetch_array(mysqli_query($con,$Sql_Query));
}
?>
17. getabsensi.php
<?php
include "init.php";
$con = mysqli_connect($host,$user_name,$user_password,$db_name);
if(mysqli_connect_error($con)){
echo "Failed to connect";
}
$query = mysqli_query($con,"select * from absensi2");
if($query){
while($row = mysqli_fetch_array($query)){
$flag[] = $row;
}
print(json_encode($flag));
57
}
mysqli_close($con);
?>
18. changepasskaryawan.php
<?php
if($_SERVER['REQUEST_METHOD']=='POST') {
include 'init.php';
$con = mysqli_connect($host,$user_name,$user_password,$db_name);
$response = array();
//mendapatkan data
$nrp = $_POST['nrp'];
$password = $_POST['password'];
$sql = "UPDATE karyawan SET password = '$password' WHERE nrp = '$nrp'";
if(mysqli_query($con,$sql)) {
$response["value"] = 1;
$response["message"] = "Berhasil diperbarui";
echo json_encode($response);
} else {
$response["value"] = 0;
$response["message"] = "oops! Gagal merubah!";
echo json_encode($response);
}
mysqli_close($con);
}
19. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.winda-ww97.abonpolka">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher_logo"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
58
<activity android:name=".LoginActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity android:name=".MainActivity"
android:screenOrientation="portrait"
android:noHistory="true"/>
</application>
</manifest>
20. MainActivity.java
package com.example.winda-ww97.abonpolka;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
import com.example.winda-ww97.abonpolka.fragment.ForgotPasswordActivity;
import com.example.winda-ww97.abonpolka.fragment.HistoryActivity;
import com.example.winda-ww97.abonpolka.fragment.InActivity;
public class MainActivity extends AppCompatActivity {
String NameHolder;
String nrpb;
private BottomNavigationView.OnNavigationItemSelectedListener
mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_absensi:
setTitle("ABONPOLKA"); //this will set title of Action
Bar
InActivity fragment1 = new InActivity();
59
FragmentTransaction fragmentTransaction1 =
getSupportFragmentManager().beginTransaction();
fragmentTransaction1.replace(R.id.fram, fragment1,
"Fragment One"); //create first framelayout with id fram in the activity
where fragments will be displayed
fragmentTransaction1.commit();
return true;
case R.id.navigation_forgot_password:
setTitle("ABONPOLKA");
ForgotPasswordActivity fragment2 = new
ForgotPasswordActivity();
FragmentTransaction fragmentTransaction2 =
getSupportFragmentManager().beginTransaction();
fragmentTransaction2.replace(R.id.fram, fragment2,
"FragmentTwo"); //create first framelayout with id fram in the activity
where fragments will be displayed
fragmentTransaction2.commit();
return true;
case R.id.navigation_history:
setTitle("ABONPOLKA");
HistoryActivity fragment3 = new HistoryActivity();
FragmentTransaction fragmentTransaction3 =
getSupportFragmentManager().beginTransaction();
fragmentTransaction3.replace(R.id.fram, fragment3,
"FragmentThree"); //create first framelayout with id fram in the activity
where fragments will be displayed
fragmentTransaction3.commit();
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navigation = (BottomNavigationView)
findViewById(R.id.navigation);
60
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedList
ener);
setTitle("Fragment One"); //this will set title of Action Bar
InActivity fragment1 = new InActivity();
FragmentTransaction fragmentTransaction1 =
getSupportFragmentManager().beginTransaction();
fragmentTransaction1.replace(R.id.fram, fragment1, "Fragment One");
//create first framelayout with id fram in the activity where fragments will
be displayed
fragmentTransaction1.commit();
}
}
21. LoginActivity.java
package com.example.winda-ww97.abonpolka;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.example.winda-ww97.abonpolka.api.HttpParse;
import com.example.winda-ww97.abonpolka.api.KaryawanService;
import com.example.winda-ww97.abonpolka.model.Karyawan;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.HashMap;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
61
public class LoginActivity extends AppCompatActivity {
private Button mLoginButton;
EditText mNRP, mPassword;
String NRPHolder, PasswordHolder;
String finalResult;
String HttpURL = "http://tkjpoltekba15.com/absen/loginkaryawan.php";
SharedPreferences pref;
SharedPreferences.Editor editor;
Boolean CheckEditText;
ProgressDialog progressDialog;
HashMap<String, String> hashMap = new HashMap<>();
HttpParse httpParse = new HttpParse();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mNRP = (EditText) findViewById(R.id.edit_text_username);
mPassword = (EditText) findViewById(R.id.edit_text_password);
mLoginButton = (Button) findViewById(R.id.login_button);
mLoginButton.setOnClickListener(v -> {
CheckEditTextIsEmptyOrNot();
if (CheckEditText) {
UserLoginFunction(NRPHolder, PasswordHolder);
} else {
Toast.makeText(LoginActivity.this, "Please fill all form
fields.", Toast.LENGTH_LONG).show();
}
});
}
public void CheckEditTextIsEmptyOrNot() {
NRPHolder = mNRP.getText().toString();
PasswordHolder = mPassword.getText().toString();
if (TextUtils.isEmpty(NRPHolder) ||
TextUtils.isEmpty(PasswordHolder)) {
CheckEditText = false;
} else {
CheckEditText = true;
}
}
62
public void UserLoginFunction(final String nrp, final String password) {
class UserLoginClass extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(LoginActivity.this,
"Loading Data", null, true, true);
}
@Override
protected void onPostExecute(String httpResponseMsg) {
super.onPostExecute(httpResponseMsg);
progressDialog.dismiss();
if (httpResponseMsg.equalsIgnoreCase("Data Matched")) {
finish();
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
intent.putExtra("nrp", nrp);
intent.putExtra("password", password);
startActivity(intent);
} else {
Toast.makeText(LoginActivity.this, httpResponseMsg,
Toast.LENGTH_LONG).show();
}
}
@Override
protected String doInBackground(String... params) {
hashMap.put("nrp", params[0]);
hashMap.put("password", params[1]);
finalResult = httpParse.postRequest(hashMap, HttpURL);
return finalResult;
}
}
UserLoginClass userLoginClass = new UserLoginClass();
userLoginClass.execute(nrp, password);
}
}
22. CustomListHistory.java
package com.example.winda-ww97.abonpolka.fragment;
63
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.example.winda-ww97.abonpolka.MainActivity;
import com.example.winda-ww97.abonpolka.R;
import com.example.winda-ww97.abonpolka.api.AbsensiService;
import com.example.winda-ww97.abonpolka.api.KaryawanService;
import com.example.winda-ww97.abonpolka.model.Absensi;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.vision.CameraSource;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.zxing.Result;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Time;
import java.util.Date;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
import retrofit2.Call;
import retrofit2.Callback;
64
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import static java.sql.Time.*;
public class InActivity extends Fragment {
private ZXingScannerView scannerView;
private String resultCode;
private ImageButton imageButton;
public static final String BASE_URL = "http://tkjpoltekba15.com/absen/";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.activity_in, container,
false);
((AppCompatActivity)
getActivity()).getSupportActionBar().setTitle("Pindai Barcode");
imageButton = (ImageButton) view.findViewById(R.id.imageButton);
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
scanCode();
}
});
return view;
}
public void scanCode() {
scannerView = new ZXingScannerView(getContext());
scannerView.setResultHandler(new ZXingScannerResultHandler());
getActivity().setContentView(scannerView);
scannerView.startCamera();
}
@Override
65
public void onPause() {
super.onPause();
}
class ZXingScannerResultHandler implements
ZXingScannerView.ResultHandler {
@Override
public void handleResult(Result result) {
resultCode = result.getText();
AlertDialog.Builder alertDialogBuilder = new
AlertDialog.Builder(getContext());
alertDialogBuilder
.setMessage(resultCode)
.setCancelable(false)
.setPositiveButton("OK", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int
which) {
insertAbsensi();
getActivity().finish();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
scannerView.stopCamera();
}
}
private void insertAbsensi() {
Gson gson = new GsonBuilder().create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
AbsensiService api = retrofit.create(AbsensiService.class);
String nrp = getActivity().getIntent().getStringExtra("nrp");
int nrp1 = Integer.parseInt(nrp);
String status = resultCode;
66
String waktu = resultCode;
Absensi absensi = new Absensi();
absensi.setNrp(nrp1);
absensi.setStatus(status);
absensi.setWaktu(waktu);
api.insertAbsen(nrp1, status, waktu)
.enqueue(new Callback<Absensi>() {
@Override
public void onResponse(Call<Absensi> call,
Response<Absensi> response) {
Toast.makeText(getContext(), "scan success",
Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(Call<Absensi> call, Throwable
throwable) {
}
});
}
}
23. InActivity.java
package com.example.winda-ww97.abonpolka.fragment;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.SparseArray;
67
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
import com.example.winda-ww97.abonpolka.LoginActivity;
import com.example.winda-ww97.abonpolka.MainActivity;
import com.example.winda-ww97.abonpolka.PopActivity;
import com.example.winda-ww97.abonpolka.R;
import com.example.winda-ww97.abonpolka.api.AbsensiService;
import com.example.winda-ww97.abonpolka.api.HttpParse;
import com.example.winda-ww97.abonpolka.api.KaryawanService;
import com.example.winda-ww97.abonpolka.model.Absensi;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.vision.CameraSource;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.zxing.Result;
import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Time;
import java.util.Date;
68
import java.util.HashMap;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
import retrofit2.Call;
import retrofit2.Callback;
//import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class InActivity extends Fragment {
String finalResult ;
private ZXingScannerView scannerView;
private String resultCode;
private ImageButton imageButton;
HashMap<String,String> hashMap = new HashMap<>();
HttpParse httpParse = new HttpParse();
public static final String BASE_URL =
"http://tkjpoltekba15.com/absen/input.php";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.activity_in, container,
false);
((AppCompatActivity)
getActivity()).getSupportActionBar().setTitle("Pindai Barcode");
imageButton = (ImageButton) view.findViewById(R.id.imageButton);
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
scanCode();
}
});
69
return view;
}
public void scanCode(){
scannerView = new ZXingScannerView(getContext());
scannerView.setResultHandler( new ZXingScannerResultHandler());
getActivity().setContentView(scannerView);
scannerView.startCamera();
}
@Override
public void onPause() {
super.onPause();
}
class ZXingScannerResultHandler implements
ZXingScannerView.ResultHandler {
@Override
public void handleResult(Result result) {
resultCode=result.getText();
AlertDialog.Builder alertDialogBuilder = new
AlertDialog.Builder(getContext());
alertDialogBuilder
.setMessage(resultCode)
.setCancelable(false)
.setPositiveButton("OK", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int
which) {
// insertAbsensi();
absen();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
scannerView.stopCamera();
70
}
}
private void absen(){
// Instantiate the RequestQueue.
MainActivity activity=(MainActivity)getActivity();
String nrpb = activity.myNRP();
// Request a string response from the provided URL.
RequestQueue queue = Volley.newRequestQueue(getContext());
//RequestQueue rq = Volley.newRequestQueue(getApplicationContext());
StringRequest stringRequest = new StringRequest(Request.Method.GET,
BASE_URL+"?status="+resultCode+"&nrp="+nrpb,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Display the first 500 characters of the response
string.
Toast.makeText(getContext(),"scan
success",Toast.LENGTH_LONG).show();
Intent i = new Intent(getContext(),
MainActivity.class);
startActivity(i);
Intent p = new Intent(getContext(),
PopActivity.class);
startActivity(p);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// mTextView.setText("That didn't work!");
Toast.makeText(getContext(),"scan
gagal",Toast.LENGTH_LONG).show();
}
});
queue.add(stringRequest);
// Add the request to the RequestQueue.
71
// queue.add(stringRequest);
}
24. AbsensiService.java
package com.example.winda-ww97.abonpolka.api;
import com.example.winda-ww97.abonpolka.model.Absensi;
import com.example.winda-ww97.abonpolka.model.Karyawan;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
public interface AbsensiService {
@GET("getabsensi.php")
Call<List<Absensi>> getAbsensi(
@Query("nrp") String nrp,
@Query("status") String status,
@Query("waktu") String waktu
);
@FormUrlEncoded
@POST("input.php")
Call<Absensi> insertAbsen(
//@Field("id_absen") int id_absen,
@Field("nrp") int nrp,
@Field("status") String status,
@Field("waktu") String waktu
);
}
25. HttpParse.java
package com.example.winda-ww97.abonpolka.api;
import java.io.BufferedReader;
import java.io.BufferedWriter;
72
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
public class HttpParse {
String FinalHttpData = "";
String Result ;
BufferedWriter bufferedWriter ;
OutputStream outputStream ;
BufferedReader bufferedReader ;
StringBuilder stringBuilder = new StringBuilder();
URL url;
public String postRequest(HashMap<String, String> Data, String
HttpUrlHolder) {
try {
url = new URL(HttpUrlHolder);
HttpURLConnection httpURLConnection = (HttpURLConnection)
url.openConnection();
httpURLConnection.setReadTimeout(14000);
httpURLConnection.setConnectTimeout(14000);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
outputStream = httpURLConnection.getOutputStream();
bufferedWriter = new BufferedWriter(
new OutputStreamWriter(outputStream, "UTF-8"));
bufferedWriter.write(FinalDataParse(Data));
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
if (httpURLConnection.getResponseCode() ==
HttpURLConnection.HTTP_OK) {
bufferedReader = new BufferedReader(
73
new InputStreamReader(
httpURLConnection.getInputStream()
)
);
FinalHttpData = bufferedReader.readLine();
}
else {
FinalHttpData = "Something Went Wrong";
}
} catch (Exception e) {
e.printStackTrace();
}
return FinalHttpData;
}
public String FinalDataParse(HashMap<String,String> hashMap2) throws
UnsupportedEncodingException {
for(Map.Entry<String,String> map_entry : hashMap2.entrySet()){
stringBuilder.append("&");
stringBuilder.append(URLEncoder.encode(map_entry.getKey(), "UTF-8"));
stringBuilder.append("=");
stringBuilder.append(URLEncoder.encode(map_entry.getValue(), "UTF-8"));
}
Result = stringBuilder.toString();
return Result ;
}
}
26. KaryawanService.java
package com.example.winda-ww97.abonpolka.api;
import com.example.winda-ww97.abonpolka.model.Karyawan;
import java.util.HashMap;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
74
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Query;
public interface KaryawanService{
@FormUrlEncoded
@POST("changepasskaryawan.php")
Call<Karyawan> ubah(
@Field("nrp") String nrp,
@Field("password") String password);
}
27. Retroserver.java
package com.example.winda-ww97.abonpolka.api;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class Retroserver {
private static final String base_url =
"http://tkjpoltekba15.com/absen/";
private static Retrofit retrofit;
public static Retrofit getClient()
{
retrofit = new Retrofit.Builder()
.baseUrl(base_url)
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit;
}
}
28. ForgotPasswordActivity.java
package com.example.winda-ww97.abonpolka.fragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
75
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.winda-ww97.abonpolka.LoginActivity;
import com.example.winda-ww97.abonpolka.R;
import com.example.winda-ww97.abonpolka.api.HttpParse;
import com.example.winda-ww97.abonpolka.api.KaryawanService;
import com.example.winda-ww97.abonpolka.api.Retroserver;
import com.example.winda-ww97.abonpolka.model.Karyawan;
import com.example.winda-ww97.abonpolka.model.Value;
import java.util.HashMap;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ForgotPasswordActivity extends Fragment {
String HttpURL = "http://tkjpoltekba15.com/absen/";
ProgressDialog progressDialog;
private Button mCancel, mSave;
private EditText mCurrentPassword, mNewPassword, mConfirmPassword;
private String NRPholder;
SharedPreferences pref;
76
SharedPreferences.Editor editor;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_forgot_password,
container, false);
((AppCompatActivity)
getActivity()).getSupportActionBar().setTitle("Forgot Password");
Context context = view.getContext();
pref = context.getSharedPreferences("karyawan",
Context.MODE_PRIVATE);
mCurrentPassword = (EditText)
view.findViewById(R.id.edit_text_current_password);
NRPholder = getActivity().getIntent().getStringExtra("password");
mCurrentPassword.setText(NRPholder);
mNewPassword = (EditText)
view.findViewById(R.id.edit_text_new_password);
mConfirmPassword = (EditText)
view.findViewById(R.id.edit_text_confirm_password);
mSave = (Button) view.findViewById(R.id.button_save);
mSave.setOnClickListener(v -> {
String currentPassHolder =
mCurrentPassword.getText().toString();
String newPassHolder = mNewPassword.getText().toString();
String confirmPassHolder =
mConfirmPassword.getText().toString();
if (newPassHolder.isEmpty() && confirmPassHolder.isEmpty()) {
Toast.makeText(getContext(), "Please fill all form fields.",
Toast.LENGTH_LONG).show();
} else {
if (newPassHolder.equals(currentPassHolder)) {
Toast.makeText(getContext(), "Use a different
password.", Toast.LENGTH_LONG).show();
77
} else {
if (newPassHolder.equals(confirmPassHolder)) {
String nrp =
getActivity().getIntent().getStringExtra("nrp");
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(HttpURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
KaryawanService api =
retrofit.create(KaryawanService.class);
Call<Karyawan> call = api.ubah(nrp, newPassHolder);
call.enqueue(new Callback<Karyawan>() {
@Override
public void onResponse(Call<Karyawan> call,
Response<Karyawan> response) {
String value = response.body().getValue();
String message =
response.body().getMessage();
progressDialog = new
ProgressDialog(getContext());
progressDialog.setCancelable(false);
progressDialog.setMessage("Loading ...");
progressDialog.show();
progressDialog.dismiss();
if (value.equals("1")) {
Toast.makeText(getContext(), message,
Toast.LENGTH_SHORT).show();
getActivity().finish();
} else {
Toast.makeText(getContext(), message,
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<Karyawan> call,
78
Throwable throwable) {
throwable.printStackTrace();
progressDialog.dismiss();
Toast.makeText(getContext(), "Error
Connection.", Toast.LENGTH_SHORT).show();
}
});
} else {
Toast.makeText(getContext(), "Failed",
Toast.LENGTH_LONG).show();
}
}
}
});
mCancel = (Button) view.findViewById(R.id.button_cancel);
mCancel.setOnClickListener(v -> {
mCurrentPassword.setText("");
mNewPassword.setText("");
mConfirmPassword.setText("");
});
return view;
}
}
29. Absensi.java
package com.example.winda-ww97.abonpolka.model;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import java.sql.Time;
import java.util.Date;
public class Absensi implements Serializable{
@SerializedName("id_absen")
@Expose
private int id_absen;
79
@SerializedName("nrp")
@Expose
private int nrp;
@SerializedName("status")
@Expose
private String status;
@SerializedName("waktu")
@Expose
private String waktu;
public int getIdAbsen() {
return id_absen;
}
public void setIdAbsen(int id_absen) {
this.id_absen = id_absen;
}
public int getNrp() {
return nrp;
}
public void setNrp(int nrp) {
this.nrp = nrp;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getWaktu() {
return waktu;
}
public void setWaktu(String waktu) {
this.waktu = waktu;
}
}
30. Karyawan.java
package com.example.winda-ww97.abonpolka.model;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
80
import java.io.Serializable;
public class Karyawan implements Serializable {
@SerializedName("nrp")
@Expose
private String nrp;
@SerializedName("nama")
@Expose
private String nama;
@SerializedName("password")
@Expose
private String password;
String value;
String message;
public String getNRP() {
return nrp;
}
public void setNRP(String nrp) {
this.nrp = nrp;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
81
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
31. Value.java
package com.example.winda-ww97.abonpolka.model;
import java.util.List;
public class Value {
String value;
String message;
List<Karyawan> karyawanList;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public List<Karyawan> getKaryawanList() {
return karyawanList;
}
public void setKaryawanList(List<Karyawan> karyawanList) {
this.karyawanList = karyawanList;
}
}
82
32. Activity_main.xml
33. activity_login.xml
83
34. activity_in.xml
35. activity_history.xml
84
36. activity_forgot_password.xml
37. activity_custom_list_history.xml