350 lines
13 KiB
PHP
350 lines
13 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\View;
|
|
use Illuminate\Support\Facades\Response;
|
|
use Illuminate\Support\Facades\Redirect;
|
|
use App\Models\Employee;
|
|
use App\Models\Attendance;
|
|
use App\Models\Leave;
|
|
use App\Models\Presensi;
|
|
use Carbon\Carbon;
|
|
use Yajra\DataTables\Facades\DataTables;
|
|
use Flash;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class CheckController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
try {
|
|
// Ambil parameter filter jika ada
|
|
$month = $request->has('month') ? Carbon::parse($request->month) : Carbon::now();
|
|
$statusFilter = $request->status;
|
|
|
|
// Log untuk debugging
|
|
Log::info('Filter parameters:', [
|
|
'month' => $month->format('Y-m'),
|
|
'status' => $statusFilter
|
|
]);
|
|
|
|
// Query menggunakan model Presensi dengan relasi user
|
|
$query = Presensi::with('user')
|
|
->select([
|
|
'id',
|
|
'created_at',
|
|
'status',
|
|
'keterangan',
|
|
'clock_type',
|
|
'user_id',
|
|
'foto',
|
|
'file_pdf'
|
|
]);
|
|
|
|
// Filter berdasarkan bulan
|
|
$query->whereMonth('created_at', $month->month)
|
|
->whereYear('created_at', $month->year);
|
|
|
|
// Filter berdasarkan status jika ada
|
|
if ($statusFilter) {
|
|
switch ($statusFilter) {
|
|
case 'Hadir':
|
|
$query->whereIn('status', ['Hadir', 'Masuk']);
|
|
break;
|
|
case 'Terlambat':
|
|
$query->where('status', 'Terlambat');
|
|
break;
|
|
case 'Sakit':
|
|
$query->where('status', 'Sakit');
|
|
break;
|
|
case 'Izin':
|
|
$query->where('status', 'Izin');
|
|
break;
|
|
default:
|
|
$query->where('status', $statusFilter);
|
|
}
|
|
}
|
|
|
|
// Log query untuk debugging
|
|
Log::info('SQL Query:', [
|
|
'sql' => $query->toSql(),
|
|
'bindings' => $query->getBindings()
|
|
]);
|
|
|
|
$presensis = $query->orderBy('created_at', 'desc')->get();
|
|
|
|
// Log hasil query
|
|
Log::info('Query results count:', ['count' => $presensis->count()]);
|
|
|
|
// Hitung statistik untuk bulan yang dipilih
|
|
$hadir = Presensi::whereMonth('created_at', $month->month)
|
|
->whereYear('created_at', $month->year)
|
|
->whereIn('status', ['Hadir', 'Terlambat'])
|
|
->where('clock_type', ['in', 'out'])
|
|
->count();
|
|
|
|
$sakit = Presensi::whereMonth('created_at', $month->month)
|
|
->whereYear('created_at', $month->year)
|
|
->where('status', 'Sakit')
|
|
->count();
|
|
|
|
$izin = Presensi::whereMonth('created_at', $month->month)
|
|
->whereYear('created_at', $month->year)
|
|
->where('status', 'Izin')
|
|
->count();
|
|
|
|
return View::make('admin.check', compact('presensis', 'hadir', 'sakit', 'izin', 'month'));
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error('Error in index: ' . $e->getMessage());
|
|
Log::error('Stack trace: ' . $e->getTraceAsString());
|
|
return redirect()->back()->with('error', 'Terjadi kesalahan saat memuat data');
|
|
}
|
|
}
|
|
|
|
public function getData(Request $request)
|
|
{
|
|
try {
|
|
Log::info('getData called with:', ['request' => $request->all()]);
|
|
|
|
if (!$request->has('month')) {
|
|
throw new \Exception('Month parameter is required');
|
|
}
|
|
|
|
$month = Carbon::parse($request->month);
|
|
$status = $request->status;
|
|
|
|
Log::info('Parsed month:', ['month' => $month->format('Y-m')]);
|
|
|
|
// Dapatkan semua data presensi untuk bulan yang dipilih
|
|
$query = DB::table('presensi')
|
|
->join('users', 'presensi.user_id', '=', 'users.id')
|
|
->select([
|
|
'presensi.id',
|
|
'presensi.created_at',
|
|
'presensi.status',
|
|
'presensi.keterangan',
|
|
'presensi.clock_type',
|
|
'presensi.user_id',
|
|
'presensi.foto',
|
|
'presensi.file_pdf',
|
|
'users.name'
|
|
])
|
|
->whereMonth('presensi.created_at', $month->month)
|
|
->whereYear('presensi.created_at', $month->year);
|
|
|
|
if ($status) {
|
|
switch ($status) {
|
|
case 'Hadir':
|
|
$query->whereIn('presensi.status', ['Hadir', 'Masuk']);
|
|
break;
|
|
case 'Terlambat':
|
|
$query->where('presensi.status', 'Terlambat');
|
|
break;
|
|
case 'Sakit':
|
|
$query->where('presensi.status', 'Sakit');
|
|
break;
|
|
case 'Izin':
|
|
$query->where('presensi.status', 'Izin');
|
|
break;
|
|
default:
|
|
$query->where('presensi.status', $status);
|
|
}
|
|
}
|
|
|
|
// Log the SQL query
|
|
Log::info('SQL Query:', [
|
|
'sql' => $query->toSql(),
|
|
'bindings' => $query->getBindings()
|
|
]);
|
|
|
|
$data = $query->get();
|
|
|
|
Log::info('Raw data count:', ['count' => $data->count()]);
|
|
|
|
// Debug data yang ditemukan
|
|
if ($data->count() > 0) {
|
|
Log::info('Sample data:', ['first_item' => $data->first()]);
|
|
} else {
|
|
Log::warning('No data found for the query');
|
|
return DataTables::of([])->make(true);
|
|
}
|
|
|
|
// Kelompokkan data berdasarkan user_id dan tanggal
|
|
$groupedData = [];
|
|
foreach ($data as $row) {
|
|
$date = Carbon::parse($row->created_at)->format('Y-m-d');
|
|
$key = $row->user_id . '_' . $date;
|
|
|
|
if (!isset($groupedData[$key])) {
|
|
$groupedData[$key] = [
|
|
'tanggal' => $date,
|
|
'nama' => $row->name,
|
|
'status' => $row->status === 'Masuk' ? 'Hadir' : $row->status,
|
|
'jam_masuk' => '-',
|
|
'jam_keluar' => '-',
|
|
'keterangan' => $row->keterangan,
|
|
'foto' => $row->foto,
|
|
'file_pdf' => $row->file_pdf
|
|
];
|
|
}
|
|
|
|
// Simpan jam masuk dan jam keluar
|
|
if ($row->clock_type === 'in') {
|
|
$groupedData[$key]['jam_masuk'] = Carbon::parse($row->created_at)->format('H:i:s');
|
|
// Pastikan foto tersimpan
|
|
if ($row->foto) {
|
|
$groupedData[$key]['foto'] = $row->foto;
|
|
}
|
|
} else if ($row->clock_type === 'out') {
|
|
$groupedData[$key]['jam_keluar'] = Carbon::parse($row->created_at)->format('H:i:s');
|
|
}
|
|
|
|
// Simpan file_pdf jika ada
|
|
if ($row->file_pdf) {
|
|
$groupedData[$key]['file_pdf'] = $row->file_pdf;
|
|
}
|
|
}
|
|
|
|
// Konversi ke array untuk DataTables
|
|
$result = [];
|
|
$index = 1;
|
|
foreach ($groupedData as $item) {
|
|
$item['DT_RowIndex'] = $index++;
|
|
$result[] = $item;
|
|
}
|
|
|
|
Log::info('Result data count:', ['count' => count($result)]);
|
|
if (count($result) > 0) {
|
|
Log::info('Result data sample:', ['first_item' => $result[0]]);
|
|
}
|
|
|
|
return DataTables::of($result)
|
|
->rawColumns(['status'])
|
|
->make(true);
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error('Error in getData: ' . $e->getMessage());
|
|
Log::error('Stack trace: ' . $e->getTraceAsString());
|
|
return response()->json(['error' => $e->getMessage()], 500);
|
|
}
|
|
}
|
|
|
|
public function getSummary(Request $request)
|
|
{
|
|
try {
|
|
if (!$request->has('month')) {
|
|
throw new \Exception('Month parameter is required');
|
|
}
|
|
|
|
$month = Carbon::parse($request->month);
|
|
|
|
// Query untuk menghitung data
|
|
$query = DB::table('presensi')
|
|
->whereMonth('created_at', $month->month)
|
|
->whereYear('created_at', $month->year);
|
|
|
|
// Log query untuk debugging
|
|
Log::info('Summary query:', [
|
|
'month' => $month->format('Y-m'),
|
|
'sql' => $query->toSql(),
|
|
'bindings' => $query->getBindings()
|
|
]);
|
|
|
|
// Hitung total hadir (termasuk status 'Masuk')
|
|
$hadir = (clone $query)
|
|
->whereIn('status', ['Hadir', 'Terlambat'])
|
|
->where('clock_type', ['in', 'out'])
|
|
->count();
|
|
|
|
// Untuk sakit dan izin, tidak perlu memeriksa clock_type
|
|
$sakit = (clone $query)
|
|
->where('status', 'Sakit')
|
|
->count();
|
|
|
|
$izin = (clone $query)
|
|
->where('status', 'Izin')
|
|
->count();
|
|
|
|
Log::info('Summary data:', [
|
|
'month' => $month->format('Y-m'),
|
|
'hadir' => $hadir,
|
|
'sakit' => $sakit,
|
|
'izin' => $izin
|
|
]);
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'data' => [
|
|
'hadir' => $hadir,
|
|
'sakit' => $sakit,
|
|
'izin' => $izin
|
|
]
|
|
]);
|
|
} catch (\Exception $e) {
|
|
Log::error('Error in getSummary: ' . $e->getMessage());
|
|
return response()->json([
|
|
'success' => false,
|
|
'error' => $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
public function CheckStore(Request $request)
|
|
{
|
|
if (isset($request->attd)) {
|
|
foreach ($request->attd as $keys => $values) {
|
|
foreach ($values as $key => $value) {
|
|
if ($employee = Employee::where('id', request('emp_id'))->first()) {
|
|
if (
|
|
!Attendance::where('attendance_date', $keys)
|
|
->where('emp_id', $key)
|
|
->where('type', 0)
|
|
->first()
|
|
) {
|
|
$data = new Attendance();
|
|
|
|
$data->emp_id = $key;
|
|
$emp_req = Employee::where('id', $data->emp_id)->first();
|
|
$data->attendance_time = date('H:i:s', strtotime($emp_req->schedules->first()->time_in));
|
|
$data->attendance_date = $keys;
|
|
$data->save();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (isset($request->leave)) {
|
|
foreach ($request->leave as $keys => $values) {
|
|
foreach ($values as $key => $value) {
|
|
if ($employee = Employee::where('id', request('emp_id'))->first()) {
|
|
if (
|
|
!Leave::where('leave_date', $keys)
|
|
->where('emp_id', $key)
|
|
->where('type', 1)
|
|
->first()
|
|
) {
|
|
$data = new Leave();
|
|
$data->emp_id = $key;
|
|
$emp_req = Employee::where('id', $data->emp_id)->first();
|
|
$data->leave_time = $emp_req->schedules->first()->time_out;
|
|
$data->leave_date = $keys;
|
|
$data->save();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Flash::success('Success', 'You have successfully submited the attendance !');
|
|
return Redirect::back();
|
|
}
|
|
|
|
public function sheetReport()
|
|
{
|
|
return View::make('admin.sheet-report')->with(['employees' => Employee::all()]);
|
|
}
|
|
}
|