Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 302
ApproveAttendanceController
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 8
5550
0.00% covered (danger)
0.00%
0 / 302
 index
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 15
 create
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 store
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 show
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 edit
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 update
0.00% covered (danger)
0.00%
0 / 1
1122
0.00% covered (danger)
0.00%
0 / 138
 updateFromHomePage
0.00% covered (danger)
0.00%
0 / 1
1122
0.00% covered (danger)
0.00%
0 / 144
 destroy
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
<?php
namespace App\Http\Controllers\Attendance;
use App\Http\Controllers\FirebaseController\FirebaseCloudMessaging;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Admin\UserDetail;
use App\Models\Auth\User;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Auth;
use App\Helpers\GetShiftDetailHelper;
use Carbon\Carbon;
use App\Models\AttendanceRequests\UserAttendanceRequests;
use App\Models\Dashboard\AttendanceDetail;
use App\Notifications\AppNotifications;
//use App\Models\NotificationModel\NotificationList;
use App\Models\Auth\userRequestCollaborator;
use App\Models\Leave\ApplyLeave;
use App\Helpers\LeaveHelper;
use App\Helpers\AttendanceHelper;
class ApproveAttendanceController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        // [2,5,8,30,32,36,37,38] [10,9,6,1,13,28,30,34,35,36,37]
        $title = '/Attendance/Attendance On Request';
        $backurl = route('home');
        $request_attendances = [];
        //return auth()->user()->can('Edit All Attendance request');
        if (auth()->user()->can('View All Attendance request')) {
            $request_attendances = UserAttendanceRequests::where('status', 'pending')->orderBy('created_at', 'DESC')->get();
        } 
        else if (auth()->user()->can('View All Attendance requests of team')) {
            $userIds =  GetShiftDetailHelper::getMyteamMembers();
            $request_attendances = UserAttendanceRequests::where('status', 'pending')->whereIn('user_id', $userIds)->orderBy('created_at', 'DESC')->get();
        }
        else{
            //View All Attendance requests of assigned employees
            $userIds =  GetShiftDetailHelper::getMyReportingEmployees();
            $request_attendances = UserAttendanceRequests::where('status', 'pending')->whereIn('user_id', $userIds)->orderBy('created_at', 'DESC')->get();
        } 
        // For Attendance Marking
        $val = AttendanceHelper::getAttendanceMarkValue();
        $valTeam = AttendanceHelper::getAttendanceTeam($request);
        $valUser = AttendanceHelper::getAttendanceUser($request);
        // dd($request->user()->id);
        return view('attendance.ApproveAttendanceForm', compact('title', 'request_attendances','title',
                    'val','valTeam','valUser'));
    }
    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }
    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }
    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
    }
    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request,$id)
    {
        $request_attendance = UserAttendanceRequests::find($id);
        $primary_id = userDetail::get('user_id',$request_attendance->user_id)[0]->primary_team_id;
 
        $user_id = $request_attendance->user_id;
        
        $val = AttendanceHelper::getAttendanceMarkValue();
        $valTeam = AttendanceHelper::getAttendanceTeam($primary_id,0);
        $valUser = AttendanceHelper::getAttendanceUser($user_id,0);
        $attendanceValue = null;
        if($valUser){
            $attendanceValue = $valUser;
        }
        elseif($valTeam){
            $attendanceValue = $valTeam;
        }
        elseif($val){
            $attendanceValue = $val;
        }
        else{
            $attendanceValue = null;
        }
            //attendance_frequency saving
             if($request->status == 'Approve'){
                
                $request_attendance = UserAttendanceRequests::find($id);
                $attendance_freq = $request_attendance->user_id;
                $thisvalue=UserAttendanceRequests::where('user_id',$attendance_freq)->pluck('attendance_freq');
                $previousvalue=$thisvalue[0];
               UserAttendanceRequests::where('user_id', $attendance_freq)->update(['attendance_freq'=> $previousvalue+1]);
               
            }
           
            
             
        if ($request->has('approver_comments')) {
            $status = $request->status_reject;
            $approver_comments = $request->approver_comments;
        } else {
            $approver_comments = null;
            if ($request->status == 'Approve') {
                $status = 'approved';
            } else if ($request->status == 'Reject') {
                $status = 'rejected';
            } else {
                return redirect()->back()->with('warning', 'Please select status and update');
            }
        }
        $request_attendance->update(['status' => $status,'updated_by_user' => Auth::user()->id ,'approver_comments' => $approver_comments]);
        //get shift timing
        if ($request_attendance->start_time != '00:00:00') {
            $shiftStartTime =  $request_attendance->start_time;
            $shiftEndTime =  $request_attendance->end_time;
        } else {
            $shiftDetails = UserDetail::where('user_id', $user_id)->first()->shifts;
            foreach ($shiftDetails  as $shift) {
                $shiftStartTime =  $shift->start_time;
                $shiftEndTime =  $shift->end_time;
            }
        }
        if ($request->status == 'Approve') {
            //create or update attendance deatil
            $checkin_date = $request_attendance->check_in;
            $checkin_location = $request_attendance->check_in_location;
            $checkin_location_address = $request_attendance->check_in_location_address;
            $checkout_date = $request_attendance->check_out;
            $checkout_location = $request_attendance->check_out_location;
            $checkout_location_address = $request_attendance->check_out_location_address;
            $attendance_sett = $request_attendance->attendance_setting;
            $checkin_date_only = Carbon::parse($request_attendance->check_in, config('settings.time_zone'))
                                ->setTimezone(config('settings.time_zone'))
                                ->format(config('settings.php_date_format H:i:s'));
            $startDate = Carbon::parse($checkin_date_only . '00:00:00', config('settings.time_zone'))->setTimezone(config('app.time_zone'));
            // $startDate = $checkin_date_only;
            $endDate = Carbon::parse(Carbon::parse($checkin_date_only)->addDay()->toDateString() . '00:00:00', config('settings.time_zone'))->setTimezone(config('app.time_zone'));
            
            $attendanceDetail = AttendanceDetail::where('user_id', '=', $user_id)
                ->whereBetween('check_in', [$startDate, $endDate])
                ->first();
            if (!empty($attendanceDetail)) {
                $attendance = $attendanceDetail;
            } else {
                $attendance = new AttendanceDetail();
                $attendance->attendance_setting = $attendanceValue;
                $attendance->user_id = $user_id;
                $attendance->shift_start = $shiftStartTime;
                $attendance->shift_end = $shiftEndTime;
            }
            
            $attendance->mode = 'On Request';
            $attendance->attendance_setting = $attendance_sett;
            $attendance->check_in = $checkin_date;
            $attendance->check_in_location = $checkin_location;
            $attendance->check_in_location_address = $checkin_location_address;
            $attendance->check_out = $checkout_date;
            $attendance->check_out_location = $checkout_location;
            $attendance->check_out_location_address = $checkout_location_address;
            $attendance->save();
            $dcheck_in = Carbon::parse($checkin_date);
            $dcheck_in->setTimezone(config('settings.time_zone'));
            $dcheck_in =  $dcheck_in->format(config('settings.php_date_format'));
            //if user is on leave
            $userOnLeave = ApplyLeave::where('from_date', '<=', $dcheck_in)
                                        ->where('to_date', '>=', $dcheck_in)
                                        ->where('status', 'Approve')
                                        ->where('user_id', $user_id)
                                        ->first();
            if(!empty($userOnLeave)){
            $reason = $userOnLeave->reason.' '.'(System : Leave length reduced due to  approving attendance)';
            if($userOnLeave->leave_length == 1 ){
                if (strstr($userOnLeave->reason , 'System : Leave length reduced due to  approving attendance)')){
                   $userOnLeave->update(['status' => 'cancel','leave_length' => 0]);
                }else{
                   $userOnLeave->update(['status' => 'cancel','leave_length' => 0,'reason' => $reason]);
                }
            }
            else if($userOnLeave->leave_length > 1){
                    if (strstr($userOnLeave->reason , 'System : Leave length reduced due to  approving attendance)')){
                        $userOnLeave->update(['leave_length' => $userOnLeave->leave_length-1]);
                    }else{
                        $userOnLeave->update(['leave_length' => $userOnLeave->leave_length-1,'reason' => $reason]);
                    }
            }
            else if($userOnLeave->leave_length == '0.5'){
                //to do the logic while approving the leave on a half day leave request.
            }
            if($userOnLeave->leave_length == '0.5'){
                $length = '0.5';
            }else{
                $length = 1;
            }
            LeaveHelper::updateLeaveBalanceOnAdminCancelling($user_id,$userOnLeave->leave_id,$length);
            }
        }
        $user_detail = UserDetail::where('user_id', $user_id)->first();
        $attedance_date = Carbon::parse($request_attendance->check_in, Config('app.time_zone'))->format(config('settings.php_date_format'));
        //notification to user
        $title = "Attendance Request";
        $message = "Your attendance has been " . $request_attendance->status . ' for ' . $attedance_date;
        $collaboratorMessage = $user_detail->user->name . ' ' . $user_detail->user->lastName . "'s attendance has been " . $request_attendance->status . ' for ' . $attedance_date . ' by ' . auth()->user()->name . ' ' . auth()->user()->lastName;
        $actionUrl = null;
        $arr = null;
        $arr = [$title, $message, $actionUrl];
        $user_detail->user->notify(new AppNotifications($arr));
        $firebaseObject = new FirebaseCloudMessaging();
        $firebaseObject->sendFirebaseNotification($title,$message,$user_detail->user->id);
        //get collaborators
        $collaborators = userRequestCollaborator::where('module', 'attendance')
            ->where('context_id', $id)
            ->pluck('user_id')->toArray();
        //primary reporting manager
        $primaryReportingManagerId = $user_detail->primary_reporting_manager_id;
        $collArr = [$title, $collaboratorMessage, null];
        if (!empty($collaborators)) {
            if (in_array(auth()->user()->id, $collaborators)) {
                foreach ($collaborators as $collaborator) {
                    $collaboratorUser = User::where('id', $collaborator)->first();
                    //send notification to all collaborators
                    if(auth()->user()->id != $collaborator){
                    $collaboratorUser->notify(new AppNotifications($collArr));
                    $firebaseObject = new FirebaseCloudMessaging();
                    $firebaseObject->sendFirebaseNotification($title,$collaboratorMessage,$collaborator);
                    }
                }
            }else{
                foreach ($collaborators as $collaborator) {
                    $collaboratorUser = User::where('id', $collaborator)->first();
                    //send notification to all collaborators
                    $collaboratorUser->notify(new AppNotifications($collArr));
                    $firebaseObject = new FirebaseCloudMessaging();
                    $firebaseObject->sendFirebaseNotification($title,$collaboratorMessage,$collaborator);
                }
            }
        }
        //check if user has primary reporting manager
        if ($primaryReportingManagerId != 0 || $primaryReportingManagerId != NULL) {
            $primary_manger = User::where('id', $primaryReportingManagerId)->first();
            if($primaryReportingManagerId != Auth::user()->id){
                $primary_manger->notify(new AppNotifications($collArr));
                $firebaseObject = new FirebaseCloudMessaging();
                $firebaseObject->sendFirebaseNotification($title,$collaboratorMessage,$primaryReportingManagerId);
            }
        }
        //secondary reporting managers
        $secondaryManagers = $user_detail->secondaryManager;
        if(!empty($secondaryManagers)){
        foreach ($secondaryManagers as $secondaryManager) {
            if ($primaryReportingManagerId != $secondaryManager->id && $secondaryManager->id != Auth::user()->id && !in_array($secondaryManager->id, $collaborators)) {
                $secondaryManager->notify(new AppNotifications($collArr));
                $firebaseObject = new FirebaseCloudMessaging();
                    $firebaseObject->sendFirebaseNotification($title,$collaboratorMessage,$secondaryManager->id);
            }
        }
        }
        if ($request_attendance->status == 'approved') {
            Session::flash('success', 'Attendance Approved Successfully!');
        } else {
            Session::flash('warning', 'Attendance Rejected Successfully!');
        }
        //return redirect()->route('approve-attendance.index')->withErrors($this);
        return redirect()->back()->withErrors($this);
    }
    public function updateFromHomePage($id,Request $request)
    {
        $request_attendance = UserAttendanceRequests::find($id);
        $primary_id = userDetail::get('user_id',$request_attendance->user_id)[0]->primary_team_id;
 
        $user_id = $request_attendance->user_id;
        
        $val = AttendanceHelper::getAttendanceMarkValue();
        $valTeam = AttendanceHelper::getAttendanceTeam($primary_id,0);
        $valUser = AttendanceHelper::getAttendanceUser($user_id,0);
        $attendanceValue = null;
        if($valUser){
            $attendanceValue = $valUser;
        }
        elseif($valTeam){
            $attendanceValue = $valTeam;
        }
        elseif($val){
            $attendanceValue = $val;
        }
        else{
            $attendanceValue = null;
        }
        if ($request->has('approver_comments')) {
            $status = $request->status_reject;
            $approver_comments = $request->approver_comments;
            $request = UserAttendanceRequests::findOrFail($id);
            $userId = $request->user_id;
            $late_checkin = $request->check_in;
           // dd($late_checkin);
           // $request->update(['status' => 'rejected']);
            $otherRequests = UserAttendanceRequests::where('user_id', $request->user_id)
            ->where('check_in', $late_checkin)
             ->where('id', '<>', $id)
             ->get();
         
            foreach ($otherRequests as $otherRequest) {
              $otherRequest->update(['status' => $status,'updated_by_user' => Auth::user()->id , 'approver_comments' => $approver_comments]);
            }
        } else {
            $approver_comments = null;
            if ($request->status == 'Approve') {
                $status = 'approved';
            } else if ($request->status == 'Reject') {
                $status = 'rejected';
            } else {
                return response()->json(['status' => 422, 'message' => 'Please select status and update']);
            }
        }
        if($request->status == 'Approve'){
                
            $request_attendance = UserAttendanceRequests::find($id);
            $attendance_freq = $request_attendance->user_id;
            $thisvalue=UserAttendanceRequests::where('user_id',$attendance_freq)->pluck('attendance_freq');
            $previousvalue=$thisvalue[0];
           UserAttendanceRequests::where('user_id', $attendance_freq)->update(['attendance_freq'=> $previousvalue+1]);
           
        }
        $request_attendance->update(['status' => $status,'updated_by_user' => Auth::user()->id , 'approver_comments' => $approver_comments]);
        //get shift timing
        if ($request_attendance->start_time != '00:00:00') {
            $shiftStartTime =  $request_attendance->start_time;
            $shiftEndTime =  $request_attendance->end_time;
        } else {
            $shiftDetails = UserDetail::where('user_id', $user_id)->first()->shifts;
            foreach ($shiftDetails  as $shift) {
                $shiftStartTime =  $shift->start_time;
                $shiftEndTime =  $shift->end_time;
            }
        }
        if ($request->status == 'Approve') {
            //create or update attendance deatil
            $checkin_date = $request_attendance->check_in;
            $checkin_location = $request_attendance->check_in_location;
            $checkin_location_address = $request_attendance->check_in_location_address;
            $checkout_date = $request_attendance->check_out;
            $checkout_location = $request_attendance->check_out_location;
            $checkout_location_address = $request_attendance->check_out_location_address;
            $attendance_sett = $request_attendance->attendance_setting;
            $checkin_date_only = Carbon::parse($request_attendance->check_in, config('settings.time_zone'))
                                ->setTimezone(config('settings.time_zone'))
                                ->format(config('settings.php_date_format H:i:s'));
            $startDate = Carbon::parse($checkin_date_only . '00:00:00', config('settings.time_zone'))->setTimezone(config('app.time_zone'));
            // $startDate = $checkin_date_only;
            $endDate = Carbon::parse(Carbon::parse($checkin_date_only)->addDay()->toDateString() . '00:00:00', config('settings.time_zone'))->setTimezone(config('app.time_zone'));
            // $endDate = $checkout_date;
            // dd($checkin_date, $checkout_date, $checkin_date_only, $startDate, $endDate);
            $attendanceDetail = AttendanceDetail::where('user_id', '=', $user_id)
                ->whereBetween('check_in', [$checkin_date, $checkout_date])
                ->first();
            // dd($attendanceDetail);
            if (!empty($attendanceDetail)) {
                $attendance = $attendanceDetail;
            } else {
                $attendance = new AttendanceDetail();
                $attendance->attendance_setting = $attendanceValue;
                $attendance->user_id = $user_id;
                $attendance->shift_start = $shiftStartTime;
                $attendance->shift_end = $shiftEndTime;
            }
            
            $attendance->mode = 'On Request';
            $attendance->attendance_setting = $attendance_sett;
            $attendance->check_in = $checkin_date;
            $attendance->check_in_location = $checkin_location;
            $attendance->check_in_location_address = $checkin_location_address;
            $attendance->check_out = $checkout_date;
            $attendance->check_out_location = $checkout_location;
            $attendance->check_out_location_address = $checkout_location_address;
            $attendance->save();
            $dcheck_in = Carbon::parse($checkin_date);
            $dcheck_in->setTimezone(config('settings.time_zone'));
            $dcheck_in =  $dcheck_in->format(config('settings.php_date_format'));
            //if user is on leave
            $userOnLeave = ApplyLeave::where('from_date', '<=', $dcheck_in)
                                        ->where('to_date', '>=', $dcheck_in)
                                        ->where('status', 'Approve')
                                        ->where('user_id', $user_id)
                                        ->first();
            if(!empty($userOnLeave)){
            if($userOnLeave->leave_type == 'full_day'){
            $reason = $userOnLeave->reason.' '.'(System : Leave length reduced due to  approving attendance)';
            if($userOnLeave->leave_length == 1){
                if (strstr($userOnLeave->reason , 'System : Leave length reduced due to  approving attendance)')){
                   $userOnLeave->update(['status' => 'cancel','leave_length' => 0]);
                }else{
                   $userOnLeave->update(['status' => 'cancel','leave_length' => 0,'reason' => $reason]);
                }
            }else if($userOnLeave->leave_length > 1){
                if (strstr($userOnLeave->reason , 'System : Leave length reduced due to  approving attendance)')){
                    $userOnLeave->update(['leave_length' => $userOnLeave->leave_length-1]);
                }else{
                    $userOnLeave->update(['leave_length' => $userOnLeave->leave_length-1,'reason' => $reason]);
                }
            }
            $length = 1;
            LeaveHelper::updateLeaveBalanceOnAdminCancelling($user_id,$userOnLeave->leave_id,$length);
              }
            }
        }
        $user_detail = UserDetail::where('user_id', $user_id)->first();
        $attedance_date = Carbon::parse($request_attendance->check_in, Config('app.time_zone'))->format(config('settings.php_date_format'));
        //notification to user
        $title = "Attendance Request";
        $message = "Your attendance has been " . $request_attendance->status . ' for ' . $attedance_date;
        $collaboratorMessage = $user_detail->user->name . ' ' . $user_detail->user->lastName . "'s attendance has been " . $request_attendance->status . ' for ' . $attedance_date . ' by ' . auth()->user()->name . ' ' . auth()->user()->lastName;
        $actionUrl = null;
        $arr = null;
        $arr = [$title, $message, $actionUrl];
        $user_detail->user->notify(new AppNotifications($arr));
        $firebaseObject = new FirebaseCloudMessaging();
        $firebaseObject->sendFirebaseNotification($title,$message,$user_detail->user->id);
        //get collaborators
        $collaborators = userRequestCollaborator::where('module', 'attendance')
            ->where('context_id', $id)
            ->pluck('user_id')->toArray();
        //primary reporting manager
        $primaryReportingManagerId = $user_detail->primary_reporting_manager_id;
        $collArr = [$title, $collaboratorMessage, null];
        if (!empty($collaborators)) {
            if (in_array(auth()->user()->id, $collaborators)) {
                foreach ($collaborators as $collaborator) {
                    $collaboratorUser = User::where('id', $collaborator)->first();
                    //send notification to all collaborators
                    if(auth()->user()->id != $collaborator){
                    $collaboratorUser->notify(new AppNotifications($collArr));
                    $firebaseObject = new FirebaseCloudMessaging();
                    $firebaseObject->sendFirebaseNotification($title,$collaboratorMessage,$collaborator);
                    }
                }
            }else{
                foreach ($collaborators as $collaborator) {
                    $collaboratorUser = User::where('id', $collaborator)->first();
                    //send notification to all collaborators
                    $collaboratorUser->notify(new AppNotifications($collArr));
                    $firebaseObject = new FirebaseCloudMessaging();
                    $firebaseObject->sendFirebaseNotification($title,$collaboratorMessage,$collaborator);
                }
            }
        }
        //check if user has primary reporting manager
        if ($primaryReportingManagerId != 0 || $primaryReportingManagerId != NULL) {
            $primary_manger = User::where('id', $primaryReportingManagerId)->first();
            if($primaryReportingManagerId != Auth::user()->id ){
                $primary_manger->notify(new AppNotifications($collArr));
                $firebaseObject = new FirebaseCloudMessaging();
                $firebaseObject->sendFirebaseNotification($title,$collaboratorMessage,$primaryReportingManagerId);
            }
        }
          //secondary reporting managers
            $secondaryManagers = $user_detail->secondaryManager;
            if(!empty($secondaryManagers)){
            foreach ($secondaryManagers as $secondaryManager) {
                 if ($primaryReportingManagerId != $secondaryManager->id && $secondaryManager->id != Auth::user()->id && !in_array($secondaryManager->id, $collaborators)) {
                    $secondaryManager->notify(new AppNotifications($collArr));
                    $firebaseObject = new FirebaseCloudMessaging();
                    $firebaseObject->sendFirebaseNotification($title,$collaboratorMessage,$secondaryManager->id);
                }
            }
            }
        if ($request_attendance->status == 'approved') {
            //Session::flash('success', 'Approved Attendance Successful!');
            return response()->json(['status' => 200, 'collaborators'=> $collaborators ,'message' => 'Approved Attendance Successful!']);
        } else {
            //Session::flash('warning', 'Rejected Attendance Successful!');
            return response()->json(['status' => 200, 'message' => 'Rejected Attendance Successful!']);
        }
        return response()->json(['status' => 200, 'message' => '']);
    }
    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}