日付ごとで勤怠管理する方法
Q&A
解決したいこと
日付で勤怠管理できる。
出勤・退勤ボタンを押したら出退勤時間が表示される。
管理者と一般で閲覧できる情報の制御
出退勤ボタン押したら出勤日、出勤時間・退勤時間までは表示できましたが、
次の日に出勤ボタンを押すとすでに出勤されていると表示される。
発生している問題・エラー
すでに出勤しています。
例)
NameError (uninitialized constant World)
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
該当するソースコード
is_administrator; // 管理者かどうかのフラグをセット if ($employee->is_administrator == 1) { // 管理者の場合は全従業員の勤怠情報を取得 $attendances = Attendance::with('employee') //->whereYear('clock_in', Carbon::now()->year) //->whereDate('clock_in', Carbon::now()) ->orderBy('clock_in', 'asc') ->get(); } else { // 一般ユーザーの場合は自分の勤怠情報のみ取得 $attendances = Attendance::where('employee_id', $employee->id) //->whereYear('clock_in', Carbon::now()->year) //->wheredate('clock_in', Carbon::now()) ->orderBy('clock_in', 'asc') ->get(); } // 総労働時間の計算を各勤怠データに追加 foreach ($attendances as $attendance) { if ($attendance->clock_in && $attendance->clock_out) { $clockInTime = Carbon::parse($attendance->clock_in); $clockOutTime = Carbon::parse($attendance->clock_out); $attendance->total_time = $clockInTime->diffInHours($clockOutTime); // 総労働時間を計算 } else { $attendance->total_time = 0; // 退勤していない場合は総労働時間を0にする } } return view('attendances.index',compact('attendances','is_admin')); } //出勤ボタン処理 public function clockIn(Request $request) { // 今日の出勤記録を取得 $todayAttendance = Attendance::where('employee_id', auth()->id()) ->whereDate('clock_in', Carbon::today()) ->first(); if ($todayAttendance) { return redirect()->route('attendances.index')->with('message', 'すでに出勤しています'); } // 出勤を記録 $attendance = new Attendance(); $attendance->employee_id = auth()->id(); //$attendance->clock_in = Carbon::now(); $now = Carbon::now(); $attendance->date = $now->format('Y-m-d'); $attendance->clock_in = $now->format('H:i:s'); $attendance->save(); return redirect()->route('attendances.index')->with('message', '出勤しました');; } // 退勤 public function clockOut(Request $request) { $employee = Auth::user(); // 今日の出勤記録を取得 $todayAttendance = Attendance::where('employee_id', $employee->id) ->whereDate('clock_in', Carbon::today()) ->first(); if (!$todayAttendance || $todayAttendance->clock_out) { return redirect()->route('attendances.index')->with('message','まだ出勤していないか、既に退勤しています。' ); } // 退勤時間を記録 $todayAttendance->clock_out = Carbon::now(); $todayAttendance->save(); return redirect()->route('attendances.index')->with('message','退勤しました'); // 所定労働時間(8時間として定義) $standardWorkHours = 8; // 出勤時間と退勤時間の差を計算 $clockInTime = Carbon::parse($todayAttendance->clock_in); $clockOutTime = Carbon::parse($todayAttendance->clock_out); $totalWorkedHours = $clockInTime->diffInHours($clockOutTime); // 所定労働時間を超えた場合、時間外労働時間を計算 $overTimeHours = max(0, $totalWorkedHours - $standardWorkHours); // セッションにメッセージとして所定労働時間と時間外労働時間を保存 return redirect()->route('attendances.index')->with([ 'message' => '退勤しました', 'standard_work_hours' => $standardWorkHours, 'worked_hours' => $totalWorkedHours, 'over_time_hours' => $overTimeHours ]); } public function store(Request $request) { // バリデーション $request->validate([ 'clock_in' => 'required|date', 'clock_out' => 'required|date|after:clock_in', // その他のバリデーションルール ]); // 勤怠モデルの作成と保存 $attendance = new Attendance; $attendance->user_id = auth()->user()->id; // ログインユーザーIDを設定 $attendance->clock_in = $request->clock_in; $attendance->clock_out = $request->clock_out; // その他の属性を設定 $attendance->save(); // 保存成功時の処理 return redirect()->route('attendances.index')->with('success', '勤怠情報を登録しました。'); } public function edit(Attendance $attendance) { return view('attendances.edit', compact('attendance')); } public function update(Request $request, Attendance $attendance) { $request->validate([ 'clock_in' => 'required|date', 'clock_out' => 'nullable|date', ]); // $attendance->clock_in = $request->clock_in; // $attendance->clock_out = $request->clock_out; $attendance->clock_in = Carbon::parse($request->clock_in)->format('Y-m-d H:i:s'); $attendance->clock_out = Carbon::parse($request->clock_out)->format('Y-m-d H:i:s'); $attendance->save(); return redirect()->route('attendances.index')->with('success', '勤怠が更新されました'); } public function show(Attendance $attendance) { return view('attendances.show', compact('attendance')); } } ### 自分で試したこと 日付ごとで勤怠管理できるような設計で書いてみました。0