maaya1109
@maaya1109

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

日付ごとで勤怠管理する方法

解決したいこと

日付で勤怠管理できる。
出勤・退勤ボタンを押したら出退勤時間が表示される。
管理者と一般で閲覧できる情報の制御

出退勤ボタン押したら出勤日、出勤時間・退勤時間までは表示できましたが、
次の日に出勤ボタンを押すとすでに出勤されていると表示される。

発生している問題・エラー

すでに出勤しています。

例)

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

3Answer

This answer has been deleted for violation of our Terms of Service.

This answer has been deleted for violation of our Terms of Service.

とりあえず読みにくいのでメモ

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Attendance;
use App\Models\Employee;
use Carbon\Carbon;
use App\Helpers\AttendanceStatusHelper;
use APP\Enums\Status;
use Illuminate\Support\Facades\Auth;
class AttendanceController extends Controller
{
    public function index()
    {
       $employee = Auth::user();
       $is_admin = $employee->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'));
    }
    
    
}
0Like

Comments

  1. 比較する対象が間違っているかもしれないです。

    - ->whereDate('clock_in', Carbon::today())
    + ->whereDate('date', Carbon::today())
    

    $attendance->clock_in = $now->format('H:i:s');を見る限り、clock_inには時間が入っているように見えます。
    今回「その日に打刻がすでにあったか」をチェックしたいものだと思うので、dateのほうで検索する必要があるかと思います。

Your answer might help someone💌