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 <?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers; use App\Http\Controllers\Controller;
use App\Models\AbsensiSiswa;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\AbsensiSiswa;
class PresensiController extends Controller class AbsensiSiswaApiController extends Controller
{ {
public function indexSiswa(){ public function store(Request $request)
return view ('admin.presensi.siswa'); {
}
public function indexGuru(){
return view('admin.presensi.guru');
}
public function store(Request $request){
$validated = $request->validate([ $validated = $request->validate([
'id_siswa' => 'required|exists:siswa,id', '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', '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']) $sudahAbsen = AbsensiSiswa::where('id_siswa', $validated['id_siswa'])
->whereDate('waktu_absen', $tanggal) ->whereDate('waktu', $tanggal)
->first(); ->first();
if($sudahAbsen){ if ($sudahAbsen) {
return response()->json([ return response()->json([
'message' => 'Siswa sudah absen pada tanggal ini' 'message' => 'Siswa sudah absen pada tanggal ini'
]); ], 409);
} }
$absensi = AbsensiSiswa::create([ $absensi = AbsensiSiswa::create([
'id_siswa' => $validated['id_siswa'], 'id_siswa' => $validated['id_siswa'],
'waktu_absen' => $validated['waktu_absen'], 'waktu' => $validated['waktu'],
'status' => $validated['status'], 'status' => $validated['status'],
'devices_id' => $validated['device_id'], 'id_devices' => $validated['devices_id'],
]); ]);
return response()->json([ return response()->json([
'message' => 'Absensi berhasil dicatat', 'message' => 'Absensi berhasil dicatat',
'data' => $absensi '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 = [ protected $fillable = [
'id_siswa', 'id_siswa',
'waktu_absen', 'id_devices',
'waktu',
'status', 'status',
]; ];
//Relasi ke tabel devices //Relasi ke tabel devices
public function devices() public function devices()
{ {
return $this->belongsTo(Device::class, 'devices_id'); return $this->belongsTo(Device::class, 'id_devices');
} }
// Relasi ke tabel siswa // 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) { Schema::create('absensi_guru', function (Blueprint $table) {
$table->id(); $table->id();
$table->foreignId('id_guru')->constrained('guru')->onDelete('cascade'); $table->foreignId('id_guru')->constrained('guru')->onDelete('cascade');
$table->date('tanggal'); $table->date('waktu');
$table->string('status'); $table->string('status');
$table->timestamps(); $table->timestamps();
}); });

View File

@ -13,11 +13,10 @@ public function up(): void
{ {
Schema::create('devices', function (Blueprint $table) { Schema::create('devices', function (Blueprint $table) {
$table->id(); $table->id();
$table->string('devices_id')->unique(); $table->string('nama_device')->unique();
$table->unsignedBigInteger('kelas_id'); $table->foreignId('id_kelas')->constrained('kelas')->onDelete('cascade');
$table->foreignId('id_ruangan')->constrained('ruangan')->onDelete('cascade');
$table->timestamps(); $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) { Schema::create('absensi_siswa', function (Blueprint $table) {
$table->id(); $table->id();
$table->foreignId('id_siswa')->constrained('siswa')->onDelete('cascade'); $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->string('status');
$table->timestamps(); $table->timestamps();
$table->foreignId('device_id')->nullable()->constrained('devices')->onDelete('set null');
}); });
} }

View File

@ -17,6 +17,8 @@ public function run(): void
UserTableSeeder::class, UserTableSeeder::class,
JurusanSeeder::class, JurusanSeeder::class,
KelasSeeder::class, KelasSeeder::class,
RuanganSeeder::class,
DevicesSeeder::class,
SiswaTableSeeder::class, SiswaTableSeeder::class,
StatusSeeder::class, StatusSeeder::class,
GuruSeeder::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\SiswaController;
use App\Http\Controllers\API\BellController; use App\Http\Controllers\API\BellController;
use App\Http\Controllers\AnnouncementController; 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::prefix('bel')->group(function () {
Route::post('/ring', [BelController::class, 'ring'])->name('api.bel.ring'); Route::post('/ring', [BelController::class, 'ring'])->name('api.bel.ring');
@ -42,8 +46,8 @@
}); });
#Presensi #Presensi
Route::post('/presensi', [PresensiController::class, 'store']);
Route::prefix('admin')->group(function () { Route::get('/siswa', [SiswaApiController::class, 'index']);
Route::apiResource('/siswa', SiswaController::class)->only(['index', 'store']); Route::get('/devices', [DevicesApiController::class, 'index']);
});
Route::post('/absensi-siswa', [AbsensiSiswaApiController::class, 'store']);

View File

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