-ABSENLOC-
APLIKASI LAYANAN ABSENSI BERBASIS LOKASI
SALATIGA
2020
DAFTAR ISI
ii
ABSTRAK
Location Based Service (LBS) adalah sebuah layanan yang digunakan untuk
mengetahui posisi dari pengguna. Pada penelitian ini LBS diterapkan sebagai
layanan untuk memvalidasi kehadiran dalam suatu acara, yaitu aplikasi AbsenLoc
yang berbasis mobile Android agar peserta acara bisa langsung melakukan absensi
tanpa perlu mengantre.
iii
BAB 1. PENDAHULUAN
1
1.2 Tujuan
Tujuan aplikasi ini adalah:
• Membantu perusahaan sebagai penyelenggara acara untuk dapat merekam
kehadiran karyawannya dengan efisien dan efektif.
• Membantu pengarsipan riwayat acara-acara yang terselenggara dan peserta
yang hadir maupun yang absen.
1.3 Manfaat
Manfaat aplikasi ini adalah:
• Bagi penyelenggara, memberikan efisiensi dalam mengelola absensi serta
membuat acara lebih terorganisir.
• Bagi peserta, memudahkan peserta dalam melakukan absensi dan mengurangi
waktu antrean yang diperlukan.
2
BAB 2. METODE PENGEMBANGAN
1) Potensi dan masalah. Pada tahap ini dilakukan identifikasi adanya potensi
dan masalah. Potensi yang ada yaitu dibutuhkannya absensi kehadiran
karyawan atau pegawai pada acara-acara yang diwajibkan. Akan tetapi sering
muncul permasalahan yaitu tidak efisiennya absensi menggunakan perangkat
pembaca finger print.
2) Pengumpulan data. Setelah potensi dan masalah dapat ditunjukkan secara
faktual, langkah selanjutnya yaitu mengumpulkan berbagai informasi yang
didapatkan studi literatur dan wawancara kepada pemangku kebijakan dari
beberapa perusahaan. Dari wawancara yang dilakukan didapatkan bahwa
banyak karyawan menggunakan smartphone android, maka dari itu
direncanakan pembangunan aplikasi absensi online berbasis android. Selain
itu, dibutuhkan suatu mekanisme validasi lokasi karyawan ketika melakukan
absensi agar karyawan hanya bisa melakukan absensi hanya dalam range
lokasi yang telah ditentukan berdasarkan titik longitude latitude.
3
3) Desain produk. Tahap ini adalah hasil akhir dari serangkaian penelitian awal
yang dapat berupa rancangan kerja baru atau produk baru. Tahap ini diawali
dengan perancangan aplikasi menggunakan UML (Unified Modelling
Language) untuk menghasilkan gambaran dasar dari aplikasi AbsenLoc
online. Adapun salah satu diagram yang dibangun adalah use case diagram
yang terlihat pada Gambar 2.2.
4
ditambahkan, penyelenggara dapat menambahkan atau mengkonfirmasi
anggota yang mendaftar pada setiap acara yang ditambahkan. Aktor anggota
dapat melakukan absensi dengan waktu acara harus pada rentang yang telah
ditentukan oleh penyelenggara acara dan lokasi anggota harus pada
jangkauan lokasi acara, anggota juga dapat menambah jadwal acara. Aktor
Admin dapat melakukan pengelolaan data acara, anggota dan penyelenggara.
Desain database pada aplikasi AbsenLoc online terdiri dari empat tabel
yaitu tabel absen, acara_detail, acara dan user. Berikut merupakan detail dari
empat tabel dan desain data model yang digunakan dalam aplikasi:
5
longtitude string longtitude
periode number periode acara
tanggal_dari timestamp tanggal mulai
tanggal_sampai timestamp tanggal selesai
tanggal_hari string nama hari
6
Gambar 2.3 Desain data model document absen, acara_detail dan user
7
Gambar 2.4 Desain data model document acara
4) Validasi Desain. Dalam proses ini desain yang sudah dibuat dievaluasi, akan
tetapi hanya berdasarkan pemikiran rasional dan dilakukan secara internal.
5) Revisi desain produk. Berdasarkan validasi yang dilakukan pada tahap
sebelumnya, didapatkan beberapa revisi seperti desain antar muka, dan jenis
laporan yang diberikan. Dari revisi yang ada, produk dibangun menggunakan
bahasa pemrograman Java pada Android Studio dan Firebase untuk database.
6) Uji coba produk. Pada tahap ini dilakukan uji coba aplikasi AbsenLoc untuk
melihat apakah aplikasi sudah berjalan sesuai yang diharapkan.
7) Revisi produk. Pada tahap ini dilakukan revisi jika pada tahap sebelumnya
ditemukan hal-hal yang harus diubah atau ditambahkan pada aplikasi.
8
8) Uji coba pemakaian. Pada tahap ini dilakukan uji coba aplikasi AbsenLoc
dalam kondisi yang sesungguhnya, yaitu diuji pada beberapa acara. Dari
tahap ini ditemukan kekurangan, yaitu tidak kompatibel pada beberapa
device, sehingga beberapa anggota tidak dapat melakukan absensi.
9) Revisi produk. Pada tahap ini dilakukan revisi atau perbaikan dari
kelemahan yang ditemukan pada uji coba pemakaian.
10) Produksi Masal. Aplikasi AbsenLoc tidak/belum diproduksi secara masal
tetapi sudah diunggah di Google Store
https://play.google.com/store/apps/details?id=com.appabsensi.absensiku&hl
=en
9
BAB 3. MANUAL BOOK
10
Kode Program 1 Pendaftaran Akun
1. private void signUp() {
2. progressDialog = new ProgressDialog(Daftar.this);
3. progressDialog.setMessage("Loading...");
4. progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
5. if(!validateForm()) {return;}
6. progressDialog.show();
7. String email = edtEmail.getText().toString();
8. String password = edtPass.getText().toString();
9. mAuth.createUserWithEmailAndPassword(email, password)
10. .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
11. @Override
12. public void onComplete(@NonNull Task<AuthResult> task) {
13. if (task.isSuccessful()) {
14. int selectedId = radioGroup.getCheckedRadioButtonId();
15. radioButton = (RadioButton) findViewById(selectedId);
16. String statusee = (String) radioButton.getText();
17. if (statusee.equalsIgnoreCase("Anggota")){
18. status = Long.valueOf(0);
19. } else {
20. status = Long.valueOf(1);
21. }
22. String id = task.getResult().getUser().getUid();
23. String email = task.getResult().getUser().getEmail();
24. onAuthSuccess(id,email,status);
25. } else {
26. Toast.makeText(Daftar.this, "Email sudah di gunakan!",
27. Toast.LENGTH_SHORT).show();
28. progressDialog.dismiss();}}});}
29. private void onAuthSuccess(String id, String email,Long status) {
30. String nama_user = edtNama.getText().toString();
31. writeNewUser(id, nama_user, email,status);
32. progressDialog.dismiss();
33. if (status == 0){
34. myIntent = new Intent(Daftar.this, AnggotaActivity.class);
35. bun = new Bundle();
36. bun.putString("email", email);
37. bun.putString("id_user", id);
38. bun.putString("nama_user", nama_user);
39. bun.putLong("status",status);
40. myIntent.putExtras(bun);
41. Daftar.this.startActivity(myIntent);
42. finish();
43. } else {
44. myIntent = new Intent(Daftar.this,PenyelenggaraActivity.class);
45. bun = new Bundle();
46. bun.putString("email", email);
47. bun.putString("id_user", id);
48. bun.putString("nama_user", nama_user);
49. bun.putLong("status",status);
50. myIntent.putExtras(bun);
51. Daftar.this.startActivity(myIntent);
52. finish();}}
53. private void writeNewUser(String userId, String name, String email, Long
status) {
54. Map<String, Object> users = new HashMap<>();
55. users.put("nama_user", name);
56. users.put("email", email);
57. users.put("status", status);
58. db.collection("User").document(userId)
11
59. .set(users).addOnSuccessListener(new OnSuccessListener<Void>() {
60. @Override
61. public void onSuccess(Void aVoid) {
62. Log.d("msg", "DocumentSnapshot successfully written!");}})
63. .addOnFailureListener(new OnFailureListener() {
64. @Override
65. public void onFailure(@NonNull Exception e) {
66. Log.w("msg", "Error writing document", e);}
67. });}
12
45. Toast.LENGTH_SHORT).show();}} else {
46. progressDialog.dismiss();
47. Toast.makeText(Login.this, "Database error!"+task.getException(),
48. Toast.LENGTH_SHORT).show();}}});}
13
• Tambah Acara
Gambar 3.3 From Tambah Acara (1) Menentukan Lokasi Acara (2)
14
Kode Program 3 Tambah Acara
1. btnSimpan.setOnClickListener(new View.OnClickListener() {
2. public void onClick(View v) {
3. progressDialog.show();
4. mAuth = FirebaseAuth.getInstance();
5. SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
6. SimpleDateFormat format_jam = new SimpleDateFormat("HH:mm:ss");
7. final String tanggal_mulai = String.valueOf(edtTanggal.getText())+"
"+String.valueOf(edtJam_mulai.getText());
8. final String tanggal_sampai = String.valueOf(edtTanggal.getText())+"
"+String.valueOf(edtJam_selesai.getText());
9. Date tgl_mulai = null;
10. Date tgl_sampai = null;
11. Date tgl_sampai2 = null;
12. int periode = Integer.valueOf(String.valueOf(edtPeriode.getText()));
13. try {
14. tgl_mulai = formatter.parse(tanggal_mulai);
15. tgl_sampai = formatter.parse(tanggal_sampai);
16. calendar2 = Calendar.getInstance();
17. calendar2.setTime(tgl_sampai);
18. calendar2.add(Calendar.WEEK_OF_YEAR, +periode-1);
19. tgl_sampai2 = calendar2.getTime();
20. } catch (ParseException e) {e.printStackTrace();}
21. Map<String, Object> acara = new HashMap<>();
22. acara.put("nama_acara", String.valueOf(edtNama_acara.getText()));
23. acara.put("des_lokasi", String.valueOf(edtDes_lokasi.getText()));
24. acara.put("id_penyelenggara", mAuth.getCurrentUser().getUid());
25. acara.put("nama_user", nama_user);
26. acara.put("latitude", edtLatitude.getText().toString());
27. acara.put("longtitude", edtLongtitude.getText().toString());
28. acara.put("tanggal_dari", tgl_mulai);
29. acara.put("tanggal_sampai", tgl_sampai2);
30. acara.put("periode", Long.valueOf(String.valueOf(edtPeriode.getText())));
31. acara.put("tanggal_hari", String.valueOf(edtTanggal_hari.getText()));
32. acara.put("jam_terlambat", edtJam_terlambat.getText().toString());
33. acara.put("distance", Long.valueOf(edtDistance.getText().toString()));
34. db.collection("Acara")
35. .add(acara)
36. .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
37. @Override
38. public void onSuccess(DocumentReference documentReference) {
39. progressDialog.dismiss();
40. Toast.makeText(TambahAcara.this, "Acara berhasil di simpan!, silakan pilih
anggota absensi pada menu (acara berlangsung -> tambah anggota)!",
41. Toast.LENGTH_LONG).show();
42. finish();
43. }}).addOnFailureListener(new OnFailureListener() {
44. @Override
45. public void onFailure(@NonNull Exception e) {
46. Toast.makeText(TambahAcara.this, "Opps, Ada kesalahan dalam input data
acara, silahkan coba input data lagi!",
47. Toast.LENGTH_LONG).show();
48. }});}});
15
• Tambah Anggota
16
Kode Program 4 Tambah Anggota
1. btnPilih.setOnClickListener(new View.OnClickListener() {
2. @Override
3. public void onClick(View v) {
4. SelectMultiDialog multiSelectDialog;
5. multiSelectDialog = new SelectMultiDialog()
6. .title("Pilih Anggota") //setting title for dialog
7. .titleSize(25)
8. .positiveText("Simpan")
9. .negativeText("Batal")
10. .setMinSelectionLimit(0)
11. .setMaxSelectionLimit(listOfCountries.size())
12. .multiSelectList(listOfCountries)
13. .onSubmit(new SelectMultiDialog.SubmitCallbackListener() {
14. @Override
15. public void onSelected(ArrayList<Integer> selectedIds, final
ArrayList<String> selectedNames, final ArrayList<String> selectedID,
String dataString) {
16. int i = 0;
17. progressDialog.show();
18. for (i = 0; i < selectedIds.size(); i++) {
19. final String nama_user = selectedNames.get(i);
20. final String id_user = selectedID.get(i);
21. db.collection("Acara_detail").whereEqualTo("id_acara",id_acara).whereEqu
alTo("id_user",selectedID.get(i))
22. .get()
23. .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
24. @Override
25. public void onComplete(@NonNull Task<QuerySnapshot> task) {
26. QuerySnapshot document2 = task.getResult();
27. if (task.isSuccessful()) {
28. if (document2.isEmpty()){
29. Map<String, Object> acara = new HashMap<>();
30. acara.put("id_acara", id_acara);
31. acara.put("id_user", id_user);
32. acara.put("nama_user", nama_user);
33. db.collection("Acara_detail")
34. .add(acara)
35. .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
36. @Override
37. public void onSuccess(DocumentReference documentReference) {
38. }})
39. .addOnFailureListener(new OnFailureListener() {
40. @Override
41. public void onFailure(@NonNull Exception e) {}});
42. } else {}} else {
43. Log.w("gagal", "Error get document: ", task.getException());
44. }}});}
45. progressDialog.dismiss();
46. kosong = findViewById(R.id.empty);
47. kosong.setVisibility(View.GONE);}
48. @Override
49. public void onCancel() {}});
50. multiSelectDialog.show(getSupportFragmentManager(),
"multiSelectDialog");}});}
17
• Data Rekap Absensi
Gambar 3.5 Data acara selesai (1) Data rekap absensi (2) Data statistik
absensi (3)
Pada menu acara berlangsung penyelenggara dapat melihat rekap data absensi dan
statistik absensi. Penyelenggara juga dapat menghapus data acara.
18
Anggota yang akan menggunakan aplikasi AbsenLoc online harus melakukan
pendaftaran akun terlebih dahulu. Anggota harus mengisi form nama lengkap,
email, password dan memilih role anggota, kemudian daftar. Setelah akun berhasil
terdaftar kemudian masuk ke halaman login, masukkan username dan password
yang sudah didaftarkan.
• Halaman Home Anggota
Halaman ini merupakan halaman home untuk anggota. Terdapat tiga menu yaitu
absen hari ini, jadwal acara dan riwayat absen. Menu absen hari ini digunakan untuk
melakukan absen dengan jadwal hari ini. Menu jadwal acara digunakan untuk
melihat acara anggota dan melihat rekap data absensi anggota. Menu riwayat absen
digunakan untuk melihat history absensi anggota.
19
• Proses Absensi
Gambar 3.8 Menu Absen hari ini (1) Submit absen (2)
Pada menu absen hari ini, anggota dapat melakukan absensi dengan jadwal acara
pada hari ini jika acara tidak pada hari tersebut maka acara tidak muncul. Anggota
yang akan melakukan absensi harus memalui dua tahap validasi yang pertama
validasi LBS dengan mencocokan lokasi anggota dengan lokasi acara. Kemudian
yang kedua yaitu validasi foto wajah dengan melakukan foto wajah di dalam
aplikasi. Berikut adalah kode program untuk proses absensi pada Kode Program 5.
20
Kode Program 5 Proses absensi
1. private void cekLokasi(){
2. progressDialog = new ProgressDialog(AbsenSubmitActivity.this);
3. progressDialog.setMessage("Loading..."); // Setting Message
4. progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
5. float lat_a = Float.valueOf(lat);
6. float lng_a = Float.valueOf(longe);
7. float lat_b = (float) mLastLocation.getLatitude();
8. float lng_b = (float) mLastLocation.getLongitude();
9. double earthRadius = 3958.75;
10. double latDiff = Math.toRadians(lat_b-lat_a);
11. double lngDiff = Math.toRadians(lng_b-lng_a);
12. double a = Math.sin(latDiff /2) * Math.sin(latDiff /2) +
13. Math.cos(Math.toRadians(lat_a)) * Math.cos(Math.toRadians(lat_b))
14. Math.sin(lngDiff /2) * Math.sin(lngDiff /2);
15. double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
16. double distance = earthRadius * c;
17. int meterConversion = 1609;
18. float meter = (float) (distance * meterConversion);
19. if ((int) meter > distance2){
20. ada = false;
21. showToast("Anda tidak pada jangkauan lokasi acara ini!");
22. }
23. if (ada){
24. if (first) {
25. progressDialog.show();
26. mAuth = FirebaseAuth.getInstance();
27. Date currentTime = Calendar.getInstance().getTime();
28. SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
29. String tanggal = formatter.format(currentTime);
30. Map<String, Object> absen = new HashMap<>();
31. absen.put("id_acara", id_acara);
32. absen.put("nama_acara", nama_acara);
33. absen.put("id_user", mAuth.getCurrentUser().getUid());
34. absen.put("nama_user", nama_user);
35. absen.put("des_lokasi", des_lokasi);
36. absen.put("tanggal_acara", tanggal);
37. absen.put("tanggal_absen", currentTime);
38. db = FirebaseFirestore.getInstance();
39. db.collection("Absen")
40. .add(absen)
41. .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
42. @Override
43. public void onSuccess(DocumentReference documentReference) {
44. progressDialog.dismiss();
45. showToast("Anda berhasil absen!");
46. finish();}})
47. .addOnFailureListener(new OnFailureListener() {
48. @Override
49. public void onFailure(@NonNull Exception e) {
50. Log.w(TAG, "Error adding document", e);
51. }}); first = false;}}}
21
3.4 Role Admin
• Login akun admin
22
• Halaman home admin
Halaman ini merupakan halaman home untuk admin. Terdapat tiga menu yaitu data
anggota, data penyelenggara dan data acara. Menu data anggota digunakan untuk
mengolah data anggota. Menu penyelenggara digunakan untuk mengolah data
penyelenggara. Menu data anggota digunakan mengolah data acara.
23
• Halaman data penyelenggara
Halaman ini merupakan halaman menu data penyelenggara. Menu ini digunakan
untuk mengelola data penyelenggara.
24
• Halaman data anggota
Halaman ini merupakan halaman menu data anggota. Menu ini digunakan untuk
mengelola data anggota.
25
• Halaman data acara
Halaman ini merupakan halaman menu data acara. Menu ini digunakan untuk
mengelola data acara.
26
BAB 4. KESIMPULAN
27
REFERENSI
[1] Location Based Services on Mobile in India For IAMAI - Version: 14 April
2008 http://www.iamai.in/Upload/policy/LBS_Draft_Indicus.pdf.
28