DEV Community

Story Coding
Story Coding

Posted on

Logika Absensi Barcode

1️⃣ Buat migrasi tabel jadwal

php artisan make:migration create_jadwal_table

Enter fullscreen mode Exit fullscreen mode

Lalu isi migrasinya seperti ini:

public function up()
{
    Schema::create('jadwal', function (Blueprint $table) {
        $table->id();
        $table->boolean('libur')->default(false);
        $table->time('masuk_pagi_start');
        $table->time('masuk_pagi_end');
        $table->time('masuk_siang_start');
        $table->time('masuk_siang_end');
        $table->time('pulang_pagi_start');
        $table->time('pulang_pagi_end');
        $table->time('pulang_siang_start');
        $table->time('pulang_siang_end');
        $table->timestamps();
    });
}

Enter fullscreen mode Exit fullscreen mode

Lalu jalankan:

php artisan migrate

Enter fullscreen mode Exit fullscreen mode

2️⃣ Buat model Jadwal

php artisan make:model Jadwal

Enter fullscreen mode Exit fullscreen mode

Isi modelnya sederhana:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Jadwal extends Model
{
    use HasFactory;

    protected $table = 'jadwal';

    protected $fillable = [
        'libur',
        'masuk_pagi_start', 'masuk_pagi_end',
        'masuk_siang_start', 'masuk_siang_end',
        'pulang_pagi_start', 'pulang_pagi_end',
        'pulang_siang_start', 'pulang_siang_end',
    ];
}

Enter fullscreen mode Exit fullscreen mode

3️⃣ Sesuaikan Controller scanBarcode()
Sekarang kita ambil data jadwal dari database:

public function scanBarcode(Request $request)
{
    // Cari data siswa berdasarkan barcode yang discan
    $student = Student::where('barcode', $request->barcode)->first();

    // Jika barcode tidak ditemukan, kembalikan status notfound
    if (!$student) {
        return response()->json(['status' => 'notfound']);
    }

    // Ambil waktu saat ini
    $now = Carbon::now();
    $today = $now->toDateString();
    $time = $now->format('H:i');

    // Ambil jadwal dari database
    $jadwal = Jadwal::first();

    // Jika jadwal tidak ditemukan, kembalikan error
    if (!$jadwal) {
        return response()->json(['status' => 'failed', 'message' => 'Jadwal belum diatur di database']);
    }

    // ================= CEK LIBUR =================
    if ($jadwal->libur) {
        // Jika hari libur, langsung kembalikan status libur
        return response()->json(['status' => 'holiday', 'message' => 'Hari ini libur']);
    }

    // ================= CEK JAM MASUK =================
    $isMasuk = (
        ($time >= $jadwal->masuk_pagi_start && $time <= $jadwal->masuk_pagi_end) ||
        ($time >= $jadwal->masuk_siang_start && $time <= $jadwal->masuk_siang_end)
    );

    // ================= CEK JAM PULANG =================
    $isPulang = (
        ($time >= $jadwal->pulang_pagi_start && $time <= $jadwal->pulang_pagi_end) ||
        ($time >= $jadwal->pulang_siang_start && $time <= $jadwal->pulang_siang_end)
    );

    // Cek apakah siswa sudah punya data absensi hari ini
    $absen = Absensi::where('student_id', $student->id)
                    ->whereDate('created_at', $today)
                    ->first();

    // ================= PROSES ABSEN MASUK =================
    if ($isMasuk) {
        if ($absen) {
            return response()->json(['status' => 'already', 'message' => 'Sudah absen masuk']);
        } else {
            Absensi::create([
                'student_id' => $student->id,
                'masuk' => $now,
            ]);
            return response()->json(['status' => 'success', 'message' => 'Absen masuk berhasil']);
        }
    }
    // ================= PROSES ABSEN PULANG =================
    elseif ($isPulang) {
        if ($absen) {
            if (!$absen->pulang) {
                $absen->update(['pulang' => $now]);
                return response()->json(['status' => 'success', 'message' => 'Absen pulang berhasil']);
            } else {
                return response()->json(['status' => 'already', 'message' => 'Sudah absen pulang']);
            }
        } else {
            return response()->json(['status' => 'failed', 'message' => 'Belum absen masuk']);
        }
    }
    // ================= DILUAR JAM ABSEN =================
    else {
        return response()->json(['status' => 'failed', 'message' => 'Diluar jam absensi']);
    }
}


Enter fullscreen mode Exit fullscreen mode

✅ Sekarang seluruh jam diambil dari tabel jadwal.
✅ Lebih fleksibel, tinggal atur lewat database kapan saja.

Top comments (0)