@extends('layouts.adminlte') @section('title', 'SETTING MOBILE APP') @section('page_title', 'SETTING MOBILE APP') @push('styles') @endpush @section('content')
@if(session('success'))
{{ session('success') }}
@endif @if($errors->any())
Ada beberapa input yang perlu diperiksa:
@endif
@csrf
Ringkasan Cepat

Lihat kondisi utama mobile app sebelum mengubah detail setting.

Offline Queue
{{ $mobile_offline_allowed ? 'Diizinkan' : 'Dimatikan' }}
Mode Absen
@php $activeAttendanceModes = collect([ $mobile_attendance_mode_face ? 'FaceID' : null, $mobile_attendance_mode_gps ? 'GPS' : null, $mobile_attendance_mode_twofa ? '2FA' : null, ])->filter()->implode(' + '); @endphp {{ $activeAttendanceModes !== '' ? $activeAttendanceModes : 'Belum ada mode aktif' }}
Log Bug Mobile
{{ $mobile_client_log_enabled ? 'Aktif' : 'Nonaktif' }}
Required Android / iOS
A: {{ $mobile_android_required_version !== '' ? $mobile_android_required_version : '-' }}
I: {{ $mobile_ios_required_version !== '' ? $mobile_ios_required_version : '-' }}
Branding Login

Dipakai bersama oleh login Laravel dan aplikasi Flutter.

Contoh: /storage/branding/logo-login.png
@php $themePreview = [ 'enabled' => old('mobile_theme_enabled', $mobile_theme_enabled ? '1' : '0') === '1', 'name' => old('mobile_theme_name', $mobile_theme_name), 'event_label' => old('mobile_theme_event_label', $mobile_theme_event_label), 'primary' => old('mobile_theme_primary_color', $mobile_theme_primary_color), 'primary_dark' => old('mobile_theme_primary_dark_color', $mobile_theme_primary_dark_color), 'secondary' => old('mobile_theme_secondary_color', $mobile_theme_secondary_color), 'background' => old('mobile_theme_background_color', $mobile_theme_background_color), 'surface' => old('mobile_theme_surface_color', $mobile_theme_surface_color), 'text' => old('mobile_theme_text_color', $mobile_theme_text_color), 'muted' => old('mobile_theme_muted_text_color', $mobile_theme_muted_text_color), 'gradient_enabled' => old('mobile_theme_gradient_enabled', $mobile_theme_gradient_enabled ? '1' : '0') === '1', 'gradient_start' => old('mobile_theme_gradient_start_color', $mobile_theme_gradient_start_color), 'gradient_end' => old('mobile_theme_gradient_end_color', $mobile_theme_gradient_end_color), ]; @endphp
Tema Android / Event Theme

Warna ini dikirim dari Laravel ke aplikasi Android saat app refresh data, login, atau membuka dashboard.

Jika OFF, Android memakai tema default aplikasi.
Opsional, tampil sebagai penanda tema/event.
{{ $themePreview['primary'] }}
{{ $themePreview['primary_dark'] }}
{{ $themePreview['secondary'] }}
{{ $themePreview['background'] }}
{{ $themePreview['surface'] }}
{{ $themePreview['text'] }}
{{ $themePreview['muted'] }}
Jika aktif, background halaman mobile memakai warna start-end.
{{ $themePreview['gradient_start'] }}
{{ $themePreview['gradient_end'] }}
Perubahan warna berlaku setelah klik Simpan, lalu user mobile refresh data / buka ulang dashboard.
{{ $themePreview['name'] }}
Halo, Karyawan
{{ $themePreview['event_label'] !== '' ? $themePreview['event_label'] : 'Mobile' }}
08:00 / 17:00
Preview kartu dashboard Android
Presensi Mobile

Atur apakah user boleh offline, butuh selfie, dan apakah face AI wajib.

Jika internet putus, data presensi boleh disimpan dulu di HP lalu dikirim belakangan.
Gunakan jika log offline ingin ditinjau HR/Admin sebelum dianggap final.
Jika lewat batas ini saat sync, server akan menolak log offline.
Jika OFF, tab FaceID di Android akan dikunci dan submit sumber FaceID ditolak server.
Jika ON, user boleh presensi cukup GPS sesuai radius/site tanpa FaceID.
Jika ON, user bisa submit setelah scan QR 2FA aktif dan GPS valid.
Aturan ini berlaku untuk mode FaceID + GPS. Mode GPS Only dan 2FA + GPS diatur oleh switch mode di atas.
Otomatis hanya relevan jika wajib selfie dan mode FaceID + GPS aktif.
Jika ON, FaceID wajib membawa challenge liveness dari Android. Payload FaceID lama tanpa challenge akan ditolak server.
Strict = paling ketat. Normal = default aman. Hijab Friendly = lebih toleran untuk wajah berjilbab dan kacamata, tetapi masker penuh tetap ditolak.
Semakin kecil semakin mudah lolos. Default aman: 0.75. Coba 0.70 jika scan terasa terlalu susah.
Dipakai server untuk validasi liveness. Jika challenge aktif dan sering gagal, coba 0.70 - 0.75.
Jika ON, user tanpa penugasan lokasi harian tidak bisa submit presensi sampai diberi Site Assign.
Pengaturan ini sudah dipindah ke section "Policy Aplikasi" di bawah. Silakan atur di bagian SPL / Leave / Forgetting Clock.
Scan IN/OUT dengan tipe yang sama akan ditolak jika berulang lebih cepat dari nilai ini. Default aman: 60 detik.
Policy Aplikasi (SPL / Cuti / Lupa Absen)

Atur aturan untuk pengajuan SPL, cuti/leave, dan lupa absen. Perubahan berlaku untuk semua user mobile.

{{-- SPL --}}
SPL (Surat Perintah Lembur)
Cek kelayakan sebelum izinkan pengajuan SPL.
Izinkan pengajuan SPL di hari Sabtu/Minggu.
Izinkan pengajuan SPL di hari libur nasional.

{{-- Leave / Cuti --}}
Leave / Cuti
Cek kelayakan cuti sebelum izinkan pengajuan.
Izinkan cuti jatuh di hari Sabtu/Minggu.
Izinkan cuti jatuh di hari libur nasional.

{{-- Forgetting Clock / Lupa Absen --}}
Lupa Absen (Forgetting Clock)
Cek kelayakan sebelum izinkan pengajuan lupa absen.
Izinkan pengajuan lupa absen di hari Sabtu/Minggu.
Izinkan pengajuan lupa absen di hari libur nasional.
Notifikasi & Broadcast

Atur reminder check-in/check-out dan pesan broadcast untuk user mobile.

Kalau aktif, pesan di bawah akan ikut dipolling oleh aplikasi mobile.
Dipakai jika mode cek hadir pagi = jam tetap.
Shift = pakai jadwal masuk. Fixed = pakai jam tetap harian.
Wajib Update Profil Mobile

Kunci aplikasi ke halaman update profil hanya saat HR benar-benar butuh, bisa untuk semua user atau user tertentu saja.

Saat aktif, user target akan dipaksa stay di halaman pengisian profil sampai menekan finish update.
Batch key menandai gelombang popup. Jika ingin memunculkan lagi ke user yang sama, ganti batch key atau pakai tombol Simpan + Kirim Ulang Popup.
Aktifkan jika HR juga ingin minta upload KTP, KK, BPJS, rekening, atau file pelengkap lain.
Klik tag field yang relevan. Referensi diambil dari kolom profil karyawan yang memang dipakai untuk mobile update.
@foreach(($mobile_profile_update_field_refs ?? []) as $ref) @endforeach
Dipakai hanya jika target = user tertentu. Bisa isi campuran employee code atau finger ID, pisahkan dengan koma / enter.
Aksi Batch Update Profil
Simpan lock profil dari form ini. Pakai kirim ulang jika batch yang sama perlu memunculkan popup lagi di Android.
Klik tag dokumen yang diperlukan. Yang ditampilkan hanya kode referensi yang relevan untuk mobile.
@foreach(($mobile_profile_update_doc_refs ?? []) as $ref) @endforeach
Version Gate

Kontrol update app per platform. Android dan iOS bisa punya versi wajib dan link update yang berbeda.

Alur cepat update versi
  1. Set versi di attendance_mobile_client/pubspec.yaml pada field version.
  2. Build APK/IPA dengan versi yang sama.
  3. Isi Required Version dengan format exact, misalnya 1.0.1+2.
Jika enforce aktif, versi yang beda sedikit pun tetap dianggap mismatch.
Android

Dipakai oleh APK Android. Nilai ini juga dimirror ke setting lama agar kompatibel.

iOS

Dipakai oleh build iPhone/iPad. Bisa arahkan ke App Store / TestFlight secara terpisah.

Kontrol Upload Log Hari Lalu

Kunci ingest tanggal kemarin dan lebih lama setelah jam tertentu.

Jika aktif, log tanggal kemarin terkunci setelah cutoff. Log yang lebih lama selalu terkunci.
Contoh: 10:00. Setelah jam ini, upload log kemarin ditolak kecuali admin override.
Log Bug Mobile

Kontrol apakah error Flutter/Android disimpan ke database, dan batasi jumlah row agar tetap ringan.

Matikan jika sistem sudah stabil dan Anda tidak ingin database terus menampung log baru.
Saat jumlah log melewati batas ini, row paling lama akan dibersihkan otomatis.
Simpan Perubahan

Simpan semua setting mobile app sekaligus dari halaman ini.

Perubahan berlaku di Laravel. App Flutter akan membaca konfigurasi server saat request data berikutnya.
Panel Cepat

Beberapa kontrol yang paling sering dicari.

Cara baca halaman ini
  • Presensi Mobile: aturan check-in/check-out.
  • Notifikasi & Broadcast: reminder dan pengumuman.
  • Version Gate: wajib update app atau tidak.
  • Kontrol Upload Log: lock upload log hari lalu.
@endsection @push('scripts') @endpush