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 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 194
LeaveApiController
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 11
1980
0.00% covered (danger)
0.00%
0 / 194
 index
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 4
 getLeaveRequests
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 6
 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
342
0.00% covered (danger)
0.00%
0 / 77
 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
2
0.00% covered (danger)
0.00%
0 / 5
 destroy
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 3
 getLeaveCount
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 3
 updateLeaveRequest
0.00% covered (danger)
0.00%
0 / 1
110
0.00% covered (danger)
0.00%
0 / 42
 getLeaveReport
0.00% covered (danger)
0.00%
0 / 1
56
0.00% covered (danger)
0.00%
0 / 51
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Admin\Leave;
use App\Models\Auth\User;
use App\Models\Leave\ApplyLeave;
use App\Models\Leave\LeaveEntitlement;
use App\Models\Admin\Weekend;
use Illuminate\Support\Facades\Validator;
use Session;
use Carbon\Carbon;
use Auth;
use DB;
use Illuminate\Support\Facades\Log;
use App\Notifications\AppNotifications;
//use App\Models\NotificationModel\NotificationList;
use App\Notifications\ApplyLeaveNotifications;
use App\Models\Leave\RejectedLeave;
use App\Models\Admin\Team;
use App\Helpers\LeaveHelper;
class LeaveApiController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {   
        $leaves = Leave::all();
        return response()->json([
            'status' =>200,
            'leaves' => $leaves
        ]);
    }
    public function getLeaveRequests(Request $request) { 
        if( auth()->user()->can('Administration Module') ) {
            $appliedleave = ApplyLeave::where('status', 'pending')->orderBy('created_at','DESC')->get();
            return response()->json([
                'status' =>200,
                'leaves' => $appliedleave
            ]);
        }else{
            return response()->json(['status' => '404', 'message'=> 'you not have right permission to call this api']);
        }
    }
    /**
     * 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)
    {   
        $to_date= ''; $from_date='';
        if($request->from_date){
            $from_date = Carbon::parse( Carbon::createFromFormat( config('settings.php_date_format') , $request->from_date ) )->format('Y-m-d');
        }
        if($request->from_date){
            $to_date = Carbon::parse( Carbon::createFromFormat( config('settings.php_date_format') , $request->to_date ) )->format('Y-m-d');
        }
        $t = $to_date;  $f = $from_date;
        $request->request->add(['f' =>$f ]);
        $request->request->add(['t' =>$t ]);
        if($request->leavetype == 'full_day'){
           $validator = Validator::make($request->all(), [
                'reason' => 'required',
                'f' => 'required|unique:apply_leaves,from_date,' . $f . ',id,user_id,' . Auth::user()->id,
                't' => 'required|unique:apply_leaves,to_date,' . $t . ',id,user_id,' . Auth::user()->id,
            ]);
        }else{
            $validator = Validator::make($request->all(), [
                'reason' => 'required',
                'f' => 'required|unique:apply_leaves,from_date,' . $f . ',id,user_id,' . Auth::user()->id,
                'halfDayType' => 'required' ]);
        }
        if ($validator->fails())
        {
            if ($validator->messages()->has('reason'))
            {
                return response()->json(['status' => '422', 'message'=> 'Reason field is required']);
            }else if($validator->messages()->has('halfDayType')){
                return response()->json(['status' => '422', 'message'=> 'Duration field is required']);
            }else{
                return response()->json(['status' => '422', 'message'=> 'Already Taken Leave On This Date!']);
            }
            return response()->json($validator->errors());
        }
        else{
            $leaveBalance= LeaveHelper::getEntitlementLeave(Auth::user()->id,  $request->leave_id);
            if($leaveBalance < $request->leave_length && LeaveHelper::checkTotalLeaves($request->leave_id)){
                return response()->json(['status' => '200', 'message'=> ' Not Enough Leave Balance!']);
            }
            $leave = new ApplyLeave();
            $leave->from_date = $from_date;
            if($request->leavetype == 'full_day'){
                $leave->to_date = $to_date;
            }else{
                $leave->to_date =  $leave->from_date;
            }
            $leave->leave_length = $request->leave_length;
            $leave->leave_type = $request->leavetype;
            $leave->half_day_type = $request->halfDayType;
            if($leave->leave_type == "half_day") {
                $leave->leave_length = 0.5;
                $leave_type = "Half Day";
                $leave->half_day_type = $request->halfDayType;
            }
            if($leave->leave_type == "full_day") {
                $leave->half_day_type = null;
                $leave_type = "Full Day";
            }
            $leave->reason = $request->reason;
            $leave->is_process = 'false';
            $leave->status = 'Pending';
            $leave->user_id = Auth::user()->id;
            $leave->leave_id = $request->leave_id;
            $leave->save();
            LeaveHelper::updateLeaveBalance($leave->leave_id ,$leave->leave_length);
            
            //get user team
            $user = Auth::user();
            // $userAttendanceTeam =$user->userdetail->teams;
            // foreach($userAttendanceTeam as $userTeam)
            // {
            //     $userInTeam = $userTeam->team;
            // }
            //primary team name
            $userInTeam = $user->userdetail->primaryTeamName->team;
            //notification users
            // $notificationList = NotificationList::firstOrFail();
            // $usersToNotifyList = $notificationList->users;
            $user = User::find(Auth::user()->id);
            
            //mail notifications
            $subjectLine = 'AMS Notification : '.$leave_type." Leave requested by ".$user->name . ' ' . $user->lastName.' for '.$request->from_date;
            $mailArr = null;
            
            if($leave->leave_type == "full_day")
            {
            $mailArr = [$subjectLine, $userInTeam, $user->name.' '. $user->lastName, $leave_type ,$request->from_date, $request->to_date];
            }else{
            $mailArr = [$subjectLine, $userInTeam, $user->name.' '. $user->lastName, $leave_type ,ucwords(str_replace("_", " ", $leave->half_day_type)),$request->from_date];
       
            }
            
            //app notifications
            $title = "Leave Request";
            $message = $leave_type." requested by ".$user->name . ' ' . $user->lastName;
            $actionUrl = 'leave-report.index';
            //primary reporting manager
            $primary_reporting_manager_id = $user->userdetail->primary_reporting_manager_id;
            //secondary reporting manager
            $secondaryManagers = $user->userdetail->secondaryManager;
            
            if ($primary_reporting_manager_id != 0) {
                //primary reporting manager
                $primary_reporting_manager = User::find($primary_reporting_manager_id);
                //check if user is exists  
                if(!empty($primary_reporting_manager)){
                $primary_reporting_manager->notify(new AppNotifications(
                    [
                        $title,
                        $message,
                        $actionUrl
                    ]
                ));
                //mail notification
                $primary_reporting_manager->notify(new ApplyLeaveNotifications($mailArr));
                }
            }
            //secondary reporting managers
            if (count($user->userdetail->secondaryManager) > 0) {
                foreach ($user->userdetail->secondaryManager as $secondaryManager) {
                    if ($primary_reporting_manager_id != $secondaryManager->id){
                    $arr = null;
                    $arr = [$title, $message, $actionUrl];
                     $secondaryManager->notify(new AppNotifications($arr));
                    //mail notification
                    $secondaryManager->notify(new ApplyLeaveNotifications($mailArr));
                    } 
                }
            }
            //  else {
            //     foreach ($usersToNotifyList as $notification_user) {
            //         $arr = null;
            //         $arr = [$title, $message, $actionUrl];
            //         $notification_user->notify(new AppNotifications($arr));
            //         //mail notification
            //         $notification_user->notify(new ApplyLeaveNotifications($mailArr));
            //     }
            // }
                return response()->json([ 'status' => '200', 'message'=> ' Submit Leave Successfuly! ']);
            }
    }
    /**
     * 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)
    {
        $leaves = ApplyLeave::find($id);
        $leaves->is_process = 'true';
        $leaves->update($request->all());
        LeaveHelper::updateLeaveBalanceOnCancelling($leaves->status,$leaves->leave_id,$leaves->leave_length);
        return response()->json([ 'status' => '200', 'message'=>  'Cancel Leave Successful!']);
    }
    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $leave = ApplyLeave::find($id);
        $leave->delete();
        return response()->json([ 'status' => '200', 'message'=>  'Leave Deleted Successfully']);
    }
    public function getLeaveCount(Request $request)
    {
        $leaveBalance = LeaveHelper::getEntitlementLeave(Auth::user()->id,$request->leaveId);
            return response()->json([
                'leaveBalance'=> $leaveBalance,
            ]);
    }
   
      
    //**************** admin api  ***********************************//
    public function updateLeaveRequest(Request $request, $id) {
        
        if( !auth()->user()->can('Administration Module') ) {
            if ($request->has('approver_comments')) {
                $status = $request->status_reject;
                $approver_comments = $request->approver_comments;
            } else {
                $approver_comments = null;
              return   $status = $request->status;
                if ($status == '') {
                   return response()->json(['status' => '422', 'message'=> 'Please select status and update']);
                   //return redirect()->back()->with('warning', 'Please select status and update');
                }
            }
            $leaves = ApplyLeave::find($id);
            //$leaves->is_process = 'true';
            //$leaves->update(['status' => $status]); //dd($leaves);
            LeaveHelper::updateLeaveBalanceOnRejecting($leaves->user_id, $status, $leaves->leave_id, $leaves->leave_length);
            //notification to user
            $user = User::find($leaves->user_id);
            
            if($leaves->from_date == $leaves->to_date){
                $leave_days = Carbon::parse($leaves->from_date)->format('jS M Y');
            }else{
                $leave_days = Carbon::parse($leaves->from_date)->format('jS M Y').' to '.Carbon::parse($leaves->to_date)->format('jS M Y');
            }
            $leave_status='';
            if ($status == 'Approve') {
                $leave_status = 'approved';
            }else if($status == 'Reject'){
                $leave_status = 'rejected';
            }    
            
            $title = "Leave request";
            if ($request->has('approver_comments') && $status == 'Reject') {
                $rejected_leave = new RejectedLeave();
                $rejected_leave->from_date = $leaves->from_date;
                $rejected_leave->to_date = $leaves->to_date;
                $rejected_leave->reason = $leaves->reason;
                $rejected_leave->is_process = 'true';
                $rejected_leave->user_id = $leaves->user_id;
                $rejected_leave->leave_id = $leaves->leave_id;
                $rejected_leave->leave_length = $leaves->leave_length;
                $rejected_leave->leave_type = $leaves->leave_type;
                $rejected_leave->half_day_type = $leaves->half_day_type;
                $rejected_leave->approver_comments = $approver_comments;
                $rejected_leave->save();
                $leaves->delete();    
            $message = 'Your leave request for '.$leave_days.' has been '. $leave_status.' due to '.$approver_comments;
            }else{
            $message = 'Your leave request for '.$leave_days.' has been '. $leave_status;
            }
            $actionUrl = 'apply-leave.index';
            
            $arr = null;
            $arr = [$title, $message, $actionUrl];
            $user->notify(new AppNotifications($arr));
            if ($status == 'Approve') {
                return response()->json(['status' => '200', 'message'=> 'Approve Leave Successful!']);
                //Session::flash('success', 'Approve Leave Successful!');
            } else {
                return response()->json(['status' => '200', 'message'=> 'Reject Leave Successful!']);
                //Session::flash('warning', 'Reject Leave Successful!');
            }
            //return redirect()->route('leave-report.index')->withErrors($this);
            return response()->json(['status' => '200', 'message'=> 'some error']);
        }else{
            return response()->json(['status' => '404', 'message'=> 'you not have right permission to call this api']);
        }
        
    }
   
    public function getLeaveReport(Request $request)
    {
        if( !auth()->user()->can('Administration Module') ) {
            //return $request->month_year;
            $startDate = Carbon::parse('01-'.$request->month_year ,Config('app.timezone'));
            $startDate = $startDate->format('Y-m-d');
            $endDate =  Carbon::parse('01-'.$request->month_year ,Config('app.timezone'))->endOfMonth()->format('Y-m-d');
            //$dateDayAdded = $date->addDay()->toDateString();
            $teamId = $request->teamId;
            $columnHeaders = collect(['Employee Name','Team Name','Leave Type','Half Day Leave Type','Reason','From Date','To Date','Leave Length','Status']);
            if($teamId == 0)
            {
                // $leaveReport =  DB::select('select concat(us.name," ",us.lastName) as name, us.id,t.team,(select date(a.from_date)) as from_date,
                //                 (select date(a.to_date)) as to_date, a.leave_length, a.reason, a.leave_type, a.half_day_type, a.status
                //                 from apply_leaves a
                //                 join user_details u on a.user_id = u.user_id
                //                 join team_user_detail tsd on  tsd.user_detail_id = u.id
                //                 join teams t on t.id = tsd.team_id
                //                 join users us on us.id = u.user_id
                //                 where ((a.from_date between :startDate1 and :endDate1)
                //                 or (a.to_date between :startDate2  and :endDate2)) order by us.id,a.id',
                //                 ['startDate1'=>$startDate,'endDate1'=>$endDate,
                //                 'startDate2'=>$startDate,'endDate2'=>$endDate]);
                $leaveReport =  DB::select('select concat(us.name," ",us.lastName) as name, us.id,t.team,(select date(a.from_date)) as from_date,
                                (select date(a.to_date)) as to_date, a.leave_length, a.reason, a.leave_type, a.half_day_type, a.status
                                from apply_leaves a
                                join user_details u on a.user_id = u.user_id
                                join teams t on t.id = u.primary_team_id
                                join users us on us.id = u.user_id
                                where ((a.from_date between :startDate1 and :endDate1)
                                or (a.to_date between :startDate2  and :endDate2)) order by us.id,a.id',
                                ['startDate1'=>$startDate,'endDate1'=>$endDate,
                                'startDate2'=>$startDate,'endDate2'=>$endDate]);
            }
            else
            {
                // $leaveReport =  DB::select(' select concat(us.name," ",us.lastName) as name, us.id,t.team,(select date(a.from_date)) as from_date,
                //                             (select date(a.to_date)) as to_date,a.leave_length, a.reason, a.leave_type, a.half_day_type, a.status
                //                             from apply_leaves a
                //                             join user_details u on a.user_id = u.user_id
                //                             join team_user_detail tsd on  tsd.user_detail_id = u.id
                //                             join teams t on t.id = tsd.team_id
                //                             join users us on us.id = u.user_id
                //                             where t.id in (:teamId) and
                //                             ((a.from_date between :startDate1 and :endDate1)
                //                             or (a.to_date between :startDate2  and :endDate2)) order by us.id,a.id',
                //                              ['teamId' => $teamId,'startDate1'=>$startDate,'endDate1'=>$endDate,
                //                              'startDate2'=>$startDate,'endDate2'=>$endDate]);
                $leaveReport =  DB::select(' select concat(us.name," ",us.lastName) as name, us.id,t.team,(select date(a.from_date)) as from_date,
                                             (select date(a.to_date)) as to_date,a.leave_length, a.reason, a.leave_type, a.half_day_type, a.status
                                             from apply_leaves a
                                             join user_details u on a.user_id = u.user_id
                                             join teams t on t.id = u.primary_team_id
                                             join users us on us.id = u.user_id
                                             where t.id in (:teamId) and
                                             ((a.from_date between :startDate1 and :endDate1)
                                             or (a.to_date between :startDate2  and :endDate2)) order by us.id,a.id',
                                              ['teamId' => $teamId,'startDate1'=>$startDate,'endDate1'=>$endDate,
                                              'startDate2'=>$startDate,'endDate2'=>$endDate]);                             
            }
            $leaveReportColl = collect($leaveReport);
            $leaveReportTempColl = collect([]);
                foreach($leaveReportColl as $data)
                {
                     $leave = collect([]);
                     $leave->name = $data->name;
                     $leave->team = $data->team;
                     $leave->reason = $data->reason;
                     $leave->from_date = $data->from_date;
                     $leave->to_date = $data->to_date;
                     $leave->leave_length = $data->leave_length;
                     $leave->status = $data->status;
                    if($data->leave_type =='full_day')
                    {
                        $leave->leave_type = $data->leave_type ="Full Day";
                    }
                    else
                    {
                        $leave->leave_type = $data->leave_type ="Half Day";
                    }
                    if($data->half_day_type =='second_half')
                    {
                        $leave->half_day_type = $data->half_day_type ="Second Half";
                    }
                    else
                    if($data->half_day_type =='first_half')
                    {
                        $leave->half_day_type = $data->half_day_type ="First Half";
                    }
                    else
                    {
                        $leave->half_day_type ='---';
                    }
                    $leaveArr = array(
                        "name" => $leave->name,
                        "team" => $leave->team,
                        "leave_type" => $leave->leave_type,
                        "half_day_type" =>$leave->half_day_type,
                        "reason" => $leave->reason,
                        "from_date" => Carbon::parse($leave->from_date)->format(Config('settings.php_date_format')),
                        "to_date" => Carbon::parse($leave->to_date)->format(Config('settings.php_date_format')),
                        "leave_length" => $leave->leave_length,
                        "status" => $leave->status,
                      );
                    $leaveReportTempColl->push($leaveArr);
                    $checkOutDate = null;
                    $checkInDate = null;
                }
            $leaveReportColl = collect([]);
            $leaveReportColl = $leaveReportTempColl;
            $teams =Team::all();
            $startDate = Carbon::parse($startDate)->format(Config('settings.php_date_format'));
            $endDate = Carbon::parse($endDate)->format(Config('settings.php_date_format'));
            
            return response()->json(['status' => '200', 'leaveReportColl' => $leaveReportColl, 'columnHeaders'=>$columnHeaders, 'startDate'=>$startDate, 'endDate'=>$endDate ]);
        
        }else{
            return response()->json(['status' => '404', 'message'=> 'you not have right permission to call this api']);
        }
    }
}