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 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 259
LeaveHelper
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 9
6806
0.00% covered (danger)
0.00%
0 / 259
 getEntitlementLeave
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 11
 updateLeaveBalanceOnCancelling
0.00% covered (danger)
0.00%
0 / 1
72
0.00% covered (danger)
0.00%
0 / 19
 updateLeaveBalanceOnRejecting
0.00% covered (danger)
0.00%
0 / 1
210
0.00% covered (danger)
0.00%
0 / 22
 updateLeaveBalance
0.00% covered (danger)
0.00%
0 / 1
72
0.00% covered (danger)
0.00%
0 / 19
 updateUserLeaveBalance
0.00% covered (danger)
0.00%
0 / 1
72
0.00% covered (danger)
0.00%
0 / 19
 updateLeaveBalanceOnAdminCancelling
0.00% covered (danger)
0.00%
0 / 1
72
0.00% covered (danger)
0.00%
0 / 19
 checkTotalLeaves
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 checkUserOnLeave
0.00% covered (danger)
0.00%
0 / 1
930
0.00% covered (danger)
0.00%
0 / 144
 getShiftDetails
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
<?php
namespace App\Helpers;
use App\Models\Auth\User;
use Carbon\Carbon;
use App\Models\Leave\LeaveEntitlement;
use App\Models\Admin\Leave;
use Auth;
use App\Models\Leave\CompOffLeave;
use App\Models\Auth\UserShift;
use App\Models\Admin\AttendanceApproval;
use Session;
use App\Models\Admin\Team;
use App\Models\Leave\ApplyLeave;
class LeaveHelper{
    public static function getEntitlementLeave($userId,$leaveId)
    {
        $query = LeaveEntitlement::query();
        $query->where('user_id','=',$userId);
        $query->where('year', '=',Carbon::now(config('settings.time_zone'))->year);
        $query->where('leave_id','=',$leaveId);
        $leaveEntitlementArr = $query->get();
        $leaveBalance = null;
        foreach($leaveEntitlementArr as $leaveEntitlement)
        {
            $leaveBalance = $leaveEntitlement->leave_balance;
        }
        if($leaveBalance == null )
            {
                $leaveBalance = '0';
            }
        return $leaveBalance;
    }
    public static function updateLeaveBalanceOnCancelling($status,$leaveId,$leaveDuration)
    {
        $query = LeaveEntitlement::query();
            $query->where('user_id','=',Auth::user()->id);
            $query->where('year', '=',Carbon::now(config('settings.time_zone'))->year);
            $query->where('leave_id','=',$leaveId);
            $leaveEntitlementArr = $query->get();
            
            $leave = Leave::withTrashed()->where('id', $leaveId)->first();
            if($leave->name == "Comp off Leave - Paid" && $leave->system_generated == 1){
                $compOffLeave = CompOffLeave::where("is_process", 'true')
                                            ->where("approved_date",'!=',NULL)
                                            ->where("avail_date",'!=',NULL)
                                            ->where("lapsed_date",NULL)
                                            ->first();
                if(!empty($compOffLeave)){
                    $compOffLeave->update(['avail_date' => NULL]);
                }                          
                
            }
            foreach( $leaveEntitlementArr as $leaveEntitlement)
            {
                if(isset($leaveEntitlement->leave_balance) && ($leave->leave_allocation_type == 'no_application' || $leaveEntitlement->entitled_leaves != '0.00'))
                {
                    $leaveEntitlement->leave_balance = $leaveEntitlement->leave_balance + $leaveDuration;
                    $leaveEntitlement->save();
                }
            }
    }
    public static function updateLeaveBalanceOnRejecting($userId, $status, $leaveId, $leaveDuration)
    {
        $query = LeaveEntitlement::query();
        $query->where('user_id', '=', $userId);
        $query->where('year', '=', Carbon::now(config('settings.time_zone'))->year);
        $query->where('leave_id', '=', $leaveId);
        $leaveEntitlementArr = $query->get();
        $leave = Leave::withTrashed()->where('id', $leaveId)->first();
            if($status == "Reject" && $leave->name == "Comp off Leave - Paid" && $leave->system_generated == 1){
                $compOffLeave = CompOffLeave::where("is_process", 'true')
                                            ->where("approved_date",'!=',NULL)
                                            ->where("avail_date",'!=',NULL)
                                            ->where("lapsed_date",NULL)
                                            ->first();
                if(!empty($compOffLeave)){                          
                $compOffLeave->update(['avail_date' => NULL]);
                }
            }
        foreach ($leaveEntitlementArr as $leaveEntitlement) {
            if (isset($leaveEntitlement->leave_balance) && $status == "Reject"  && ($leave->leave_allocation_type == 'no_application' || $leaveEntitlement->entitled_leaves != '0.00')) {
                $leaveEntitlement->leave_balance = $leaveEntitlement->leave_balance + $leaveDuration;
                $leaveEntitlement->save();
            }
            if (isset($leaveEntitlement->leave_balance) && $status == "Approve" && ($leave->leave_allocation_type == 'no_application' || $leaveEntitlement->entitled_leaves != '0.00')) { {
                    $leaveEntitlement->leave_balance = $leaveEntitlement->leave_balance;
                    $leaveEntitlement->save();
                }
            }
        }
    }
    public static function updateLeaveBalance($leaveId,$leaveDuration)
    {
        $query = LeaveEntitlement::query();
            $query->where('user_id','=',Auth::user()->id);
            $query->where('year', '=',Carbon::now(config('settings.time_zone'))->year);
            $query->where('leave_id','=',$leaveId);
            $leaveEntitlementArr = $query->get();
            $leave = Leave::withTrashed()->where('id', $leaveId)->first();
            if($leave->name == "Comp off Leave - Paid" && $leave->system_generated == 1){
                $compOffLeave = CompOffLeave::where("is_process", 'true')
                                            ->where("approved_date",'!=',NULL)
                                            ->where("avail_date",NULL)
                                            ->where("lapsed_date",NULL)
                                            ->first();
                if(!empty($compOffLeave)){                          
                $compOffLeave->update(['avail_date' => Carbon::now(config('settings.time_zone'))->format('Y-m-d')]);
                }
            }
            foreach( $leaveEntitlementArr as $leaveEntitlement)
            {
                if(isset($leaveEntitlement->leave_balance) && ($leave->leave_allocation_type == 'no_application' || $leaveEntitlement->entitled_leaves != '0.00'))
                {
                    $leaveEntitlement->leave_balance = $leaveEntitlement->leave_balance - $leaveDuration;
                    $leaveEntitlement->save();
                }
            }
    }
        
    public static function updateUserLeaveBalance($userId,$leaveId,$leaveDuration)
    {
        $query = LeaveEntitlement::query();
            $query->where('user_id','=',$userId);
            $query->where('year', '=',Carbon::now(config('settings.time_zone'))->year);
            $query->where('leave_id','=',$leaveId);
            $leaveEntitlementArr = $query->get();
            $leave = Leave::withTrashed()->where('id', $leaveId)->first();
            if($leave->name == "Comp off Leave - Paid" && $leave->system_generated == 1){
                $compOffLeave = CompOffLeave::where("is_process", 'true')
                                            ->where("approved_date",'!=',NULL)
                                            ->where("avail_date",NULL)
                                            ->where("lapsed_date",NULL)
                                            ->first();
                if(!empty($compOffLeave)){                          
                $compOffLeave->update(['avail_date' => Carbon::now(config('settings.time_zone'))->format('Y-m-d')]);
                }
            }
            foreach( $leaveEntitlementArr as $leaveEntitlement)
            {
                if(isset($leaveEntitlement->leave_balance) && ($leave->leave_allocation_type == 'no_application' || $leaveEntitlement->entitled_leaves != '0.00'))
                {
                    $leaveEntitlement->leave_balance = $leaveEntitlement->leave_balance - $leaveDuration;
                    $leaveEntitlement->save();
                } 
            }
    }
    public static function updateLeaveBalanceOnAdminCancelling($userId,$leaveId,$leaveDuration)
    {
        $query = LeaveEntitlement::query();
            $query->where('user_id','=',$userId);
            $query->where('year', '=',Carbon::now(config('settings.time_zone'))->year);
            $query->where('leave_id','=',$leaveId);
            $leaveEntitlementArr = $query->get();
            $leave = Leave::withTrashed()->where('id', $leaveId)->first();
            if($leave->name == "Comp off Leave - Paid" && $leave->system_generated == 1){
                $compOffLeave = CompOffLeave::where("is_process", 'true')
                                            ->where("approved_date",'!=',NULL)
                                            ->where("avail_date",'!=',NULL)
                                            ->where("lapsed_date",NULL)
                                            ->first();
                if(!empty($compOffLeave)){                          
                $compOffLeave->update(['avail_date' => NULL]);
                }
            }
            foreach( $leaveEntitlementArr as $leaveEntitlement)
            {
                if(isset($leaveEntitlement->leave_balance) && ($leave->leave_allocation_type == 'no_application' || $leaveEntitlement->entitled_leaves != '0.00'))
                {
                    $leaveEntitlement->leave_balance = $leaveEntitlement->leave_balance + $leaveDuration;
                    $leaveEntitlement->save();
                } 
            }
    }
        
    public static function checkTotalLeaves($leaveId){
        $leave = Leave::find($leaveId);
        if($leave->n_days == 0){
            return false;
        }else{
            return true;
        }
    }
    public static function checkUserOnLeave($user_id){
        $startDate = Carbon::parse(Carbon::now(config('settings.time_zone'))->toDateString().'00:00:00', config('settings.time_zone'))->setTimezone(config('app.time_zone'));
        $endDate = Carbon::parse(Carbon::now(config('settings.time_zone'))->addDay()->toDateString().'00:00:00', config('settings.time_zone'))->setTimezone(config('app.time_zone'));
 
        $user = User::where('id',$user_id)->first();
        if(isset($user))
        {
           $shiftDetails = self::getShiftDetails($user);
        }
        else
        {
            return;    // user/userdetail not entered in AMS
        }
        
        $teamId = $user->userdetail->primary_team_id;         
        $team =  Team::find($teamId);
        //current time
        $today_date_time  = Carbon::now(config('settings.time_zone'));
        $time_now = $today_date_time->toTimeString();
        $currentDate = Carbon::now(config('settings.time_zone'))->toDateString();
        $subdayWithTimezone = Carbon::now(config('settings.time_zone'))->subday()->toDateString();
        //if user is on leave
        $userOnLeave = ApplyLeave::where('from_date', '<=', $currentDate)
                                    ->where('to_date', '>=', $currentDate)
                                    ->where('status', 'Approve')
                                    ->where('user_id', $user->id)
                                    ->where('leave_length','>=',1)
                                    ->first();
        //query for sub day
        $userOnLeaveSubday = ApplyLeave::where('from_date', '<=', $subdayWithTimezone)
        ->where('to_date', '>=', $subdayWithTimezone)
        ->where('status', 'Approve')
        ->where('user_id', $user_id)
        ->first();  
        //check if user is on shedule or not
        if($team->has_schedule == 1) {
            //get sub day user shift first
            $subday_date = Carbon::now(config('settings.time_zone'))->subday()->toDateString();
            $startDateForSubday = Carbon::parse($subday_date.'00:00:00', config('settings.time_zone'))->setTimezone(config('app.time_zone'));
            $endDateForSubday = Carbon::parse(Carbon::parse($subday_date)->addDay()->toDateString().'00:00:00', config('settings.time_zone'))->setTimezone(config('app.time_zone'));
            $userShiftForSubday = UserShift::where('user_id',$user->id)
                                            ->whereBetween('created_at', [$startDateForSubday, $endDateForSubday])
                                            ->first();
                                           
            //if user shift for sub day is not empty
            if(!empty($userShiftForSubday)){
                
                $shiftStartTime =  $userShiftForSubday->shift_start;
                $shiftEndTime =  $userShiftForSubday->shift_end;
                $shiftStartTimeForSubday = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'));
                $shiftStartTimeForSubday->setTimezone(config('settings.time_zone'));
                $shiftStartTimeForSubday = $shiftStartTimeForSubday->toTimeString();
                $shiftEndTimeForSubday = Carbon::createFromFormat('H:i:s', $shiftEndTime, Config('app.timezone'));
                $shiftEndTimeForSubday->setTimezone(config('settings.time_zone'));
                $shiftEndTimeForSubday = $shiftEndTimeForSubday->toTimeString();
               
                
                //check user is on two day shift
                if($shiftStartTimeForSubday > $shiftEndTimeForSubday){
                
                //offset start time for two day shift 
                $offsetStartTime = Carbon::parse($shiftStartTimeForSubday);
                $offsetStartTime = $offsetStartTime->subHours(4)->toTimeString();
                
                //offset end time for two day shift 
                $offsetEndTime = Carbon::parse($shiftEndTimeForSubday);
                $offsetEndTime = $offsetEndTime->addHours(4)->toTimeString();
                
                $time = Carbon::now(config('settings.time_zone'));
                
                $day = $time->day+1;
                //set time to shift start time
                $setShiftStartTime = Carbon::createFromFormat('Y-m-d H:i:s',$time->year.'-'.$time->month.'-'.$time->day.' '. $offsetStartTime,config('settings.time_zone'));
                
                //set time to next day 12am
                $set12am = Carbon::createFromFormat('Y-m-d H:i:s',$time->year.'-'.$time->month.'-'.$day.' 00:00:00',config('settings.time_zone')); 
       
                
                if(!$time->between($setShiftStartTime, $set12am, true) && $time_now < $offsetEndTime) {
                                
                    
                }else{
                    
                      //if user is single day shift  check user shift for today
                      $userShift = UserShift::where('user_id',$user->id)
                      ->whereBetween('created_at', [$startDate, $endDate])
                      ->first();
                  if(!empty($userShift)){
                      $shiftStartTime =  $userShift->shift_start;
                      $shiftEndTime =  $userShift->shift_end;
                      $shiftStartTimeForToday = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'));
                      $shiftStartTimeForToday->setTimezone(config('settings.time_zone'));
                     
                   //set time
                   $shiftStartTimeForToday = $shiftStartTimeForToday->toTimeString();
                    
                   //get shift time with date
                   $setShiftStartTime = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'))
                                               ->setTimezone(config('settings.time_zone'))
                                               ->format('Y-m-d H:i:s');
                   
                   //set offset time with date 
                   $offsetStartTime = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'))
                                               ->setTimezone(config('settings.time_zone'))
                                               ->subHours(4)
                                               ->format('Y-m-d H:i:s');
                                          
                    //time for check 
                    $time = Carbon::now(config('settings.time_zone'));
                                      
                    //check offset start time and shift start time
                    if( ($time->between($offsetStartTime,$setShiftStartTime)) ||
                        ($time_now == $shiftStartTimeForToday) || ($time_now > $shiftStartTimeForToday ))
                        { //if time now is near to shift start time
                      }else{
                        //   Session::flash('warning', 'Shift not assigned for you in schedule. Please request attendance.');
                        //   redirect()->route('request-attendance.index')->send();
                        return'shift not assigned';
                      }    
 
                  }else{
                    // Session::flash('warning', 'Shift not assigned for you in schedule. Please request attendance.');
                    // redirect()->route('request-attendance.index')->send();
                    return 'shift not assigned';
                  }
                }
            }else{
               
                //if user is single day shift  check user shift for today
                $userShift = UserShift::where('user_id',$user->id)
                ->whereBetween('created_at', [$startDate, $endDate])
                ->first();
               
            if(!empty($userShift)){
                $shiftStartTime =  $userShift->shift_start;
                $shiftEndTime =  $userShift->shift_end;
                $shiftStartTimeForToday = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'));
                $shiftStartTimeForToday->setTimezone(config('settings.time_zone'));
                
               //set time
               $shiftStartTimeForToday = $shiftStartTimeForToday->toTimeString();
                    
               //get shift time with date
               $setShiftStartTime = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'))
                                           ->setTimezone(config('settings.time_zone'))
                                           ->format('Y-m-d H:i:s');
               
               //set offset time with date 
               $offsetStartTime = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'))
                                           ->setTimezone(config('settings.time_zone'))
                                           ->subHours(4)
                                           ->format('Y-m-d H:i:s');
                                       
                 //time for check 
                 $time = Carbon::now(config('settings.time_zone'));
                                   
                 //check offset start time and shift start time
                 if( ($time->between($offsetStartTime,$setShiftStartTime)) ||
                ($time_now == $shiftStartTimeForToday) || ($time_now > $shiftStartTimeForToday ))
                 { //if time now is near to shift start time
                    
                      
                }else{
                    
                    // Session::flash('warning', 'Shift not assigned for you in schedule. Please request attendance.');
                    // redirect()->route('request-attendance.index')->send();
                    return 'shift not assigned';
                }    
            }else{
                   
                // Session::flash('warning', 'Shift not assigned for you in schedule. Please request attendance.');
                // redirect()->route('request-attendance.index')->send();
                return 'shift not assigned';
            }
            }                                
               
            }else{
                //if empty check user shift for today
                $userShift = UserShift::where('user_id',$user->id)
                                ->whereBetween('created_at', [$startDate, $endDate])
                                ->first();
                if(!empty($userShift)){
                    $shiftStartTime =  $userShift->shift_start;
                    $shiftEndTime =  $userShift->shift_end;
                    $shiftStartTimeForToday = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'));
                    $shiftStartTimeForToday->setTimezone(config('settings.time_zone'));
                    
                    //set time
                    $shiftStartTimeForToday = $shiftStartTimeForToday->toTimeString();
                    
                    //get shift time with date
                    $setShiftStartTime = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'))
                                                ->setTimezone(config('settings.time_zone'))
                                                ->format('Y-m-d H:i:s');
                    
                    //set offset time with date 
                    $offsetStartTime = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'))
                                                ->setTimezone(config('settings.time_zone'))
                                                ->subHours(4)
                                                ->format('Y-m-d H:i:s');
                                           
                     //time for check 
                     $time = Carbon::now(config('settings.time_zone'));
                                       
                     //check offset start time and shift start time
                     if( ($time->between($offsetStartTime,$setShiftStartTime)) ||
                ($time_now == $shiftStartTimeForToday) || ($time_now > $shiftStartTimeForToday ))
                 { //if time now is near to shift start time
                    }else{
                        // Session::flash('warning', 'Shift not assigned for you in schedule. Please request attendance.');
                        // redirect()->route('request-attendance.index')->send();
                        return 'shift not assigned';
                    }    
                      
                }else{  
                        // Session::flash('warning', 'Shift not assigned for you in schedule. Please request attendance.');
                        // redirect()->route('request-attendance.index')->send();
                        return 'shift not assigned';
                }         
                
            }                      
            
        }else{  
        if($shiftDetails->count() == 1) //if there is only one applicable shift for a user
        {      
            foreach ($shiftDetails  as $shift)
            {
                $shiftStartTime =  $shift->start_time;
                $shiftEndTime =  $shift->end_time;
            
            }
        }
        }
            
        
        //change start time and end time to settings timezone 
        
        $shiftStartTimeForTimezone = Carbon::createFromFormat('H:i:s', $shiftStartTime, Config('app.timezone'));
        $shiftStartTimeForTimezone->setTimezone(config('settings.time_zone'));
        $shiftStartTimeForTimezone = $shiftStartTimeForTimezone->toTimeString();
        $shiftEndTimeForTimezone = Carbon::createFromFormat('H:i:s', $shiftEndTime, Config('app.timezone'));
        $shiftEndTimeForTimezone->setTimezone(config('settings.time_zone'));
        $shiftEndTimeForTimezone = $shiftEndTimeForTimezone->toTimeString();
        
        //checking for two day shift or single day shift
        //if start time is greater than end time, that is two day shift
        if($shiftStartTimeForTimezone > $shiftEndTimeForTimezone) // to check if the shift ends the next day
            {
                
        $time_now = Carbon::now(config('settings.time_zone'))->toTimeString();
        
        //offset start time for two day shift 
        $offsetStartTime = Carbon::parse($shiftStartTimeForTimezone);
        $offsetStartTime = $offsetStartTime->subHours(4)->toTimeString();
        //offset end time for two day shift 
        $offsetEndTime = Carbon::parse($shiftEndTimeForTimezone);
        $offsetEndTime = $offsetEndTime->addHours(4)->toTimeString();
        $currentDate = Carbon::now(config('settings.time_zone'))->toDateString();
        $subdayWithTimezone = Carbon::now(config('settings.time_zone'))->subday()->toDateString();
        
          if( ($time_now < $shiftStartTimeForTimezone && $time_now > $offsetStartTime) ||
                ($time_now == $shiftStartTimeForTimezone) || ($time_now > $shiftStartTimeForTimezone && ($offsetEndTime < $time_now)))
            {//if time now is near to shift start time or after shift offset end time
               
                if(!empty($userOnLeave)){
                   return true;
                }else{
                    return false;
                }
                
            }
            else
            { // else check user leave on sub day
                
                if(!empty($userOnLeaveSubday)){
                    return true;
                }else{
                    return false;
                }
               
            }
            }
            else
            { // single day shift
               
                if(!empty($userOnLeave)){
                    return true;
                }else{      
                    return false;
                }
            }                        
    }
    
   
    public static function getShiftDetails($user)
    {
       $shift = $user->userdetail;
       return $user->userdetail->shifts;
    }
}