MMCT TEAM
Server IP : 103.191.208.50  /  Your IP : 216.73.216.53
Web Server : LiteSpeed
System : Linux orion.herosite.pro 4.18.0-553.53.1.lve.el8.x86_64 #1 SMP Wed May 28 17:01:02 UTC 2025 x86_64
User : celkcksm ( 1031)
PHP Version : 7.4.33
Disable Function : show_source, system, shell_exec, passthru, popen, exec
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON
Directory (0755) :  /home/celkcksm/hrms.ncriptech.com/app/Services/Hrm/

[  Home  ][  C0mmand  ][  Upload File  ]

Current File : /home/celkcksm/hrms.ncriptech.com/app/Services/Hrm/EmployeeBreakService.php
<?php

namespace App\Services\Hrm;

use Validator;
use Carbon\Carbon;
use App\Services\Core\BaseService;
use App\Models\Expenses\HrmExpense;
use App\Models\Hrm\Attendance\Attendance;
use Illuminate\Database\Eloquent\Builder;
use App\Helpers\CoreApp\Traits\DateHandler;
use App\Models\Hrm\Attendance\EmployeeBreak;
use App\Helpers\CoreApp\Traits\TimeDurationTrait;
use App\Helpers\CoreApp\Traits\ApiReturnFormatTrait;
use App\Models\coreApp\Relationship\RelationshipTrait;
use App\Http\Resources\Hrm\Attendance\BreakBackCollection;
use App\Http\Resources\Hrm\Attendance\BreakBackStaticsCollection;

class EmployeeBreakService extends BaseService
{
    use RelationshipTrait, DateHandler, ApiReturnFormatTrait, TimeDurationTrait;

    protected $attendance;

    public function __construct(Attendance $attendance, EmployeeBreak $employeeBreak)
    {
        $this->attendance = $attendance;
        $this->model = $employeeBreak;
    }

    public function breakBackList()
    {
        $validator = Validator::make(\request()->all(), [
            'date' => 'required',
        ]);

        if ($validator->fails()) {
            return $this->responseWithError(__('Validation field required'), $validator->errors(), 422);
        }

        $breakList = $this->model->query()
            ->where('company_id', $this->companyInformation()->id)
            ->whereNotNull('back_time')
            ->when(\request()->get('date'), function (Builder $builder) {
                return $builder->where('date', \request()->get('date'));
            })->paginate(10);


        $totalBreakTime = 0;
        $totalBackTime = 0;
        $totalBreakTimeCount = 0;
        foreach ($breakList as $item) {
            $totalBreakTime += $this->timeToSeconds($item->break_time);
            $totalBackTime += $this->timeToSeconds($item->back_time);
        }
        $totalBreakTimeCount = $this->totalSpendTime($totalBreakTime, $totalBackTime);
        $data['total_break_time'] = $totalBreakTimeCount;
        $data['has_break'] = $breakList->count() > 0 ? true : false;
        $data['break_history'] = new BreakBackCollection($breakList);

        return $this->responseWithSuccess('Employees break history', $data, 200);
    }

    public function breakStartEnd($request, $slug)
    {
        $validator = Validator::make($request->all(), [
            'time' => 'required',
        ]);

        if ($validator->fails()) {
            return $this->responseWithError(__('Validation field required'), $validator->errors(), 422);
        }
        try {
            if ($slug === 'start') {
                $attendance = $this->attendance->query()
                    ->where('user_id', auth()->user()->id)
                    ->where('date', date('Y-m-d'))
                    ->first();
                if ($attendance) {
                    //take Break
                    $takeBreak = $this->model->query()
                        ->where([
                            'company_id' => $this->companyInformation()->id,
                            'user_id' => auth()->id(),
                            'date' => date('Y-m-d'),
                        ])->whereNull('back_time')
                        ->orderByDesc('id')->first();
                    if ($takeBreak) {
                        $takeBreak->back_time = $request->time;
                        $takeBreak->save();
                        $takeBreak['status'] = "break_out";
                        return $this->responseWithSuccess('Your last break has been end', $takeBreak, 200);
                    } else {
                        $break = $this->model->create([
                            'company_id' => $this->companyInformation()->id,
                            'user_id' => auth()->id(),
                            'date' => date('Y-m-d'),
                            'break_time' => $request->time,
                            'back_time' => null,
                            'reason' => 'Break'
                        ]);
                        $break['status'] = "break_in";
                        return $this->responseWithSuccess('Break start successfully', $break, 200);
                    }
                } else {
                    $break = $this->model->create([
                        'company_id' => $this->companyInformation()->id,
                        'user_id' => auth()->id(),
                        'date' => date('Y-m-d'),
                        'break_time' => $request->time,
                        'back_time' => null,
                        'reason' => $request->reason ?? 'Break'
                    ]);

                    $break['status'] = "break_in";
                    return $this->responseWithSuccess('Break start successfully', $break, 200);
                }
            } else {
                //Check break started
                $takeBreak = $this->model->query()
                    ->where([
                        'company_id' => $this->companyInformation()->id,
                        'user_id' => auth()->id(),
                        'date' => date('Y-m-d'),
                    ])->whereNull('back_time')
                    ->orderByDesc('id')->first();
                if ($takeBreak) {
                    $takeBreak->back_time = $request->time;
                    $takeBreak->save();
                    $takeBreak['status'] = "break_out";
                    return $this->responseWithSuccess('Break End successfully', $takeBreak, 200);
                } else {
                    return $this->responseWithSuccess('Already break end', [], 200);
                }
            }
        } catch (\Throwable $th) {
            return $this->responseWithError(_trans('response.Something went wrong.'), [], 400);
        }
    }

    public function breakBackEnd($request)
    {
        try {

            // $attendance = $this->attendance->query()
            //     ->where('user_id', auth()->user()->id)
            //     ->where('date', date('Y-m-d'))->whereNull('check_out')
            //     ->first();
            // if ($attendance) {

                //take Break
                $takeBreak = $this->model->query()
                    ->where([
                        'company_id' => $this->companyInformation()->id,
                        'user_id' => auth()->id(),
                        'date' => date('Y-m-d'),
                    ])->whereNull('back_time')
                    ->orderByDesc('id')->first();
                if ($takeBreak) {
                    $takeBreak->back_time = date('H:i');
                    $takeBreak->save();
                    $takeBreak['status'] = "break_out";
                    $takeBreak['histroy'] = $this->breakBackTodayHistoryStatics($request);
                    return $this->responseWithSuccess('Your last break has been end', $takeBreak, 200);
                } else {
                    $break = $this->model->create([
                        'company_id' => $this->companyInformation()->id,
                        'user_id' => auth()->id(),
                        'date' => date('Y-m-d'),
                        'break_time' => date('H:i'),
                        'back_time' => null,
                        'reason' => 'Break'
                    ]);
                    $break['status'] = "break_in";
                    return $this->responseWithSuccess('Break start successfully', $break, 200);
                }
            // } else {
               
            //     return $this->responseWithError('You have not checked in yet', [], 200);
            // }
        } catch (\Throwable $th) {
            return $this->responseWithError(_trans('response.Something went wrong.'), [], 400);
        }
    }

    public function breakStartEndWeb($request, $slug)
    {
        try {
            $takeBreak = $this->model->query()
                ->where([
                    'company_id' => $this->companyInformation()->id,
                    'user_id' => auth()->id(),
                    'date' => date('Y-m-d'),
                ])->whereNull('back_time')
                ->orderByDesc('id')->first();
            if ($takeBreak) {
                $takeBreak->back_time = $request->time;
                $takeBreak->save();
                return $takeBreak;
            } else {
                return false;
            }
        } catch (\Throwable $th) {
            return false;
        }
    }

    public function breakBackHistory($request)
    {
        // if (appSuperUser() || $request->user_id) {
        //     $validator = Validator::make($request->all(), [
        //         'user_id' => 'required',
        //     ]);

        //     if ($validator->fails()) {
        //         return $this->responseWithError(__('Validation field required'), $validator->errors(), 422);
        //     }

        //     $userId = $request->user_id;
        // } else {
        //     $userId = auth()->user()->id;
        // }

        // code from hrm-api-2.0  
        if(!$request->user_id){  // logic added new
            $userId = auth()->user()->id;
        } else if (appSuperUser() || $request->user_id) {
            $userId = $request->user_id;
        } else {
            $userId = auth()->user()->id;
        }
        // code from hrm-api-2.0 end

        $totalBreakBacks = $this->model->query()->where('user_id', $userId)->whereNotNull('back_time');
        $totalBreakBacks->when(\request()->get('date'), function (Builder $builder) {
            return $builder->where('date', \request()->get('date'));
        });
        if (!\request()->get('date')) {
            $totalBreakBacks = $totalBreakBacks->where('date', date('Y-m-d'));
        }
        $totalBreakBacks = $totalBreakBacks->orderBy('created_at', 'DESC')->paginate(10);
        $totalBreakTime = 0;
        $totalBackTime = 0;
        $totalBreakTimeCount = 0;
        foreach ($totalBreakBacks as $item) {
            $totalBreakTime += $this->timeToSeconds($item->break_time);
            $totalBackTime += $this->timeToSeconds($item->back_time);
        }
        $totalBreakTimeCount = $this->totalSpendTime($totalBreakTime, $totalBackTime);
        $data['total_break_time'] = $totalBreakTimeCount;
        $data['has_break'] = $totalBreakBacks->count() > 0 ? true : false;
        $data['break_history'] = new BreakBackCollection($totalBreakBacks);

        return $this->responseWithSuccess('Break history', $data, 200);
    }

    public function breakBackHistoryStatics($request)
    {
        if (appSuperUser()) {
            $userId = $request->user_id;
        } else {
            $userId = auth()->user()->id;
        }
    
        $currentDate = date('Y-m-d');
        $totalBreakBacks = $this->model->query()
            ->where('user_id', $userId)
            ->whereNotNull('back_time')
            ->where('date', $currentDate)
            ->orderBy('created_at', 'DESC')
            ->paginate(10);
    
        $totalBreakTime = 0;
        $totalBackTime = 0;
    
        foreach ($totalBreakBacks as $item) {
            $totalBreakTime += $this->timeToSeconds($item->break_time);
            $totalBackTime += $this->timeToSeconds($item->back_time);
        }
    
        $totalBreakTimeCount = $this->totalSpendTime($totalBreakTime, $totalBackTime);
    
        $data['total_break_time'] = $totalBreakTimeCount;
        $data['has_break'] = $totalBreakBacks->count() > 0 ? true : false;
        $data['break_history'] = new BreakBackStaticsCollection($totalBreakBacks);
    
        return $this->responseWithSuccess('Break history', $data, 200);
    }

    public function breakBackTodayHistoryStatics($request)
    {
        if (appSuperUser()) {
            $userId = $request->user_id;
        } else {
            $userId = auth()->user()->id;
        }
    
        $currentDate = date('Y-m-d');
        $totalBreakBacks = $this->model->query()
            ->where('user_id', $userId)
            ->whereNotNull('back_time')
            ->where('date', $currentDate)
            ->orderBy('created_at', 'DESC')
            ->paginate(10);
    
        return new BreakBackStaticsCollection($totalBreakBacks);
    }
    
    public function userBreakHistory($request)
    {
        $validator = Validator::make($request->all(), [
            'user_id' => 'required',
        ]);

        if ($validator->fails()) {
            return $this->responseWithError(__('Validation field required'), $validator->errors(), 422);
        }
        $totalBreakBacks = $this->model->query()->where('user_id', $request->user_id)->whereNotNull('back_time');
        $totalBreakBacks->when(\request()->get('date'), function (Builder $builder) {
            return $builder->where('date', \request()->get('date'));
        });
        if (!\request()->get('date')) {
            $totalBreakBacks = $totalBreakBacks->where('date', date('Y-m-d'));
        }
        $totalBreakBacks = $totalBreakBacks->orderBy('created_at', 'DESC')->paginate(10);
        $totalBreakTime = 0;
        $totalBackTime = 0;
        $totalBreakTimeCount = 0;
        foreach ($totalBreakBacks as $item) {
            $totalBreakTime += $this->timeToSeconds($item->break_time);
            $totalBackTime += $this->timeToSeconds($item->back_time);
        }
        $totalBreakTimeCount = $this->totalSpendTime($totalBreakTime, $totalBackTime);
        $data['total_break_time'] = $totalBreakTimeCount;
        $data['has_break'] = $totalBreakBacks->count() > 0 ? true : false;
        $data['break_history'] = new BreakBackCollection($totalBreakBacks);

        return $this->responseWithSuccess('Break history', $data, 200);
    }

    public function isBreakRunning()
    {
        $takeBreak = $this->model->query()
            ->where([
                'company_id' => $this->companyInformation()->id,
                'user_id' => auth()->id(),
                'date' => date('Y-m-d')
            ])->whereNull('back_time')
            ->first();
        if ($takeBreak) {
            $takeBreak['status'] = "break_in";
            $takeBreak['back_time'] = "";
            $diffTime = Carbon::parse(now())->format("H%:%i:s%");
            $takeBreak['diff_time'] = $this->hourMinSecond($takeBreak->break_time);
            return $takeBreak;
        } else {
            $takeBreak = [
                "break_time" => "",
                "back_time" => "",
                "reason" => "",
                "created_at" => "",
                "updated_at" => "",
                "status" => "break_out",
                "diff_time" => ""
            ];
            return $takeBreak;
        }
    }
}

MMCT - 2023