update : API siswa, devices, absensi siswa

This commit is contained in:
Rizky 2025-06-06 23:54:14 +07:00
parent c3776bea0b
commit 4c77ade45f
17 changed files with 225 additions and 57 deletions

View File

@ -1,49 +1,43 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers;
use App\Models\AbsensiSiswa;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\AbsensiSiswa;
class PresensiController extends Controller
class AbsensiSiswaApiController extends Controller
{
public function indexSiswa(){
return view ('admin.presensi.siswa');
}
public function indexGuru(){
return view('admin.presensi.guru');
}
public function store(Request $request){
public function store(Request $request)
{
$validated = $request->validate([
'id_siswa' => 'required|exists:siswa,id',
'waktu_absen' => 'required|date_format:Y-m-d H:i:s',
'devices_id' => 'required|exists:devices,id',
'waktu' => 'required|date_format:Y-m-d H:i:s',
'status' => 'required|in:hadir,tidak_hadir',
'device_id' => 'required|exists:devices,id'
]);
$tanggal = date('Y-m-d', strtotime($validated['waktu_absen']));
$tanggal = date('Y-m-d', strtotime($validated['waktu']));
$sudahAbsen = AbsensiSiswa::where('id_siswa', $validated['id_siswa'])
->whereDate('waktu_absen', $tanggal)
->whereDate('waktu', $tanggal)
->first();
if($sudahAbsen){
if ($sudahAbsen) {
return response()->json([
'message' => 'Siswa sudah absen pada tanggal ini'
]);
], 409);
}
$absensi = AbsensiSiswa::create([
'id_siswa' => $validated['id_siswa'],
'waktu_absen' => $validated['waktu_absen'],
'waktu' => $validated['waktu'],
'status' => $validated['status'],
'devices_id' => $validated['device_id'],
'id_devices' => $validated['devices_id'],
]);
return response()->json([
'message' => 'Absensi berhasil dicatat',
'data' => $absensi
], 200);
], 201);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Devices;
class DevicesApiController extends Controller
{
public function index()
{
$devices = Devices::with(['kelas', 'ruangan'])->get();
return response()->json([
'success' => true,
'data' => $devices
]);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Siswa;
class SiswaApiController extends Controller
{
public function index()
{
$siswa = Siswa::with(['kelas', 'jurusan'])->get();
return response()->json([
'success' => true,
'data' => $siswa
]);
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Http\Controllers;
use App\Models\AbsensiGuru;
use Illuminate\Http\Request;
class AbsensiGuruController extends Controller
{
public function index()
{
$absensi = AbsensiGuru::with('guru')->latest()->get();
return view('admin.presensi.guru', compact('absensi'));
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Http\Controllers;
use App\Models\AbsensiSiswa;
use Illuminate\Http\Request;
class AbsensiSiswaController extends Controller
{
public function index()
{
$absensi = AbsensiSiswa::with('siswa')->latest()->get();
return view('admin.presensi.siswa', compact('absensi'));
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class AbsensiGuru extends Model
{
use HasFactory;
protected $table = 'absensi_guru';
protected $fillable = [
'id_guru',
'id_devices',
'waktu',
'status',
];
//Relasi ke tabel devices
public function devices()
{
return $this->belongsTo(Device::class, 'id_devices');
}
// Relasi ke tabel siswa
public function siswa()
{
return $this->belongsTo(Siswa::class, 'id_guru');
}
}

View File

@ -13,14 +13,15 @@ class AbsensiSiswa extends Model
protected $fillable = [
'id_siswa',
'waktu_absen',
'id_devices',
'waktu',
'status',
];
//Relasi ke tabel devices
public function devices()
{
return $this->belongsTo(Device::class, 'devices_id');
return $this->belongsTo(Device::class, 'id_devices');
}
// Relasi ke tabel siswa

View File

@ -1,18 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Device extends Model
{
protected $fillable = ['nama_device', 'kelas_id'];
public function kelas(){
return $this->belongsTo(Kelas::class);
}
public function absensi(){
return $this->hasMany(AbsensiSiswa::class, 'device_id');
}
}

18
app/Models/Devices.php Normal file
View File

@ -0,0 +1,18 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Devices extends Model
{
protected $fillable = ['nama_device', 'id_kelas', 'id_ruangan'];
public function kelas(){
return $this->belongsTo(Kelas::class);
}
public function ruangan(){
return $this->belongsTo(Ruangan::class);
}
}

View File

@ -14,7 +14,7 @@ public function up(): void
Schema::create('absensi_guru', function (Blueprint $table) {
$table->id();
$table->foreignId('id_guru')->constrained('guru')->onDelete('cascade');
$table->date('tanggal');
$table->date('waktu');
$table->string('status');
$table->timestamps();
});

View File

@ -13,11 +13,10 @@ public function up(): void
{
Schema::create('devices', function (Blueprint $table) {
$table->id();
$table->string('devices_id')->unique();
$table->unsignedBigInteger('kelas_id');
$table->string('nama_device')->unique();
$table->foreignId('id_kelas')->constrained('kelas')->onDelete('cascade');
$table->foreignId('id_ruangan')->constrained('ruangan')->onDelete('cascade');
$table->timestamps();
$table->foreign('kelas_id')->references('id')->on('kelas')->onDelete('cascade');
});
}

View File

@ -14,11 +14,11 @@ public function up(): void
Schema::create('absensi_siswa', function (Blueprint $table) {
$table->id();
$table->foreignId('id_siswa')->constrained('siswa')->onDelete('cascade');
$table->timestamp('waktu_absen');
$table->foreignId('id_devices')->nullable()->constrained('devices')->onDelete('set null');
$table->timestamp('waktu');
$table->string('status');
$table->timestamps();
$table->foreignId('device_id')->nullable()->constrained('devices')->onDelete('set null');
});
}

View File

@ -17,6 +17,8 @@ public function run(): void
UserTableSeeder::class,
JurusanSeeder::class,
KelasSeeder::class,
RuanganSeeder::class,
DevicesSeeder::class,
SiswaTableSeeder::class,
StatusSeeder::class,
GuruSeeder::class

View File

@ -0,0 +1,29 @@
<?php
namespace Database\Seeders;
use App\Models\Devices;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DevicesSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
Devices::insert([
[
'nama_device' => 'R_Lab_TKK',
'id_kelas' => 1, // Referencing Kelas ID
'id_ruangan' => 1, // Referencing Ruangan ID
],
[
'nama_device' => 'R_Lab_TIF',
'id_kelas' => 2, // Referencing Kelas ID
'id_ruangan' => 2, // Referencing Ruangan ID
],
]);
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace Database\Seeders;
use App\Models\Ruangan;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class RuanganSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
Ruangan::insert([
[
'nama_ruangan' => 'Lab_TKK',
'id_kelas' => 1, // Referencing Kelas ID
'id_jurusan' => 1, // Referencing Jurusan ID
'relay_state' => 'off',
],
[
'nama_ruangan' => 'Lab_TIF',
'id_kelas' => 2, // Referencing Kelas ID
'id_jurusan' => 2, // Referencing Jurusan ID
'relay_state' => 'off',
],
]);
}
}

View File

@ -6,6 +6,10 @@
use App\Http\Controllers\SiswaController;
use App\Http\Controllers\API\BellController;
use App\Http\Controllers\AnnouncementController;
use App\Http\Controllers\Api\DevicesApiController;
use App\Http\Controllers\Api\SiswaApiController;
use App\Http\Controllers\Api\AbsensiSiswaApiController;
Route::prefix('bel')->group(function () {
Route::post('/ring', [BelController::class, 'ring'])->name('api.bel.ring');
@ -42,8 +46,8 @@
});
#Presensi
Route::post('/presensi', [PresensiController::class, 'store']);
Route::prefix('admin')->group(function () {
Route::apiResource('/siswa', SiswaController::class)->only(['index', 'store']);
});
Route::get('/siswa', [SiswaApiController::class, 'index']);
Route::get('/devices', [DevicesApiController::class, 'index']);
Route::post('/absensi-siswa', [AbsensiSiswaApiController::class, 'store']);

View File

@ -1,5 +1,7 @@
<?php
use App\Http\Controllers\AbsensiGuruController;
use App\Http\Controllers\AbsensiSiswaController;
use App\Http\Controllers\AdminController;
use App\Http\Controllers\BelController;
use App\Http\Controllers\GuruController;
@ -14,6 +16,8 @@
use App\Http\Controllers\AnnouncementController;
use App\Http\Controllers\RuanganController;
use App\Http\Controllers\BellHistoryController;
use App\Models\AbsensiGuru;
use App\Models\AbsensiSiswa;
// Public routes
Route::get('/', [IndexController::class, 'index'])->name('index');
@ -87,10 +91,14 @@
'update' => 'admin.ruangan.update',
'destroy' => 'admin.ruangan.destroy',
]);
// Presensi
Route::controller(PresensiController::class)->group(function () {
Route::get('/presensi/siswa', 'indexSiswa')->name('admin.presensi.siswa');
Route::get('/presensi/guru', 'indexGuru')->name('admin.presensi.guru');
// Presensi Siswa
Route::controller(AbsensiSiswaController::class)->group(function () {
Route::get('/presensi/siswa', 'index')->name('admin.presensi.siswa');
});
// Presensi Guru
Route::controller(AbsensiGuruController::class)->group(function () {
Route::get('/presensi/guru', 'index')->name('admin.presensi.guru');
});
// Laporan