IMMREX7

aku nok ndi : /home/spdtg/www/schoolmis/app/Http/Controllers/API/
File Up :
aku nok ndi : /home/spdtg/www/schoolmis/app/Http/Controllers/API/EmployeeController.php

<?php

namespace App\Http\Controllers\API;

use Carbon\Carbon;
use Illuminate\Support\Facades\Validator;
use \App\Http\SendNotificationApi;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\File;
use PDF;
use Illuminate\Support\Facades\Crypt;
use App\Http\SendSmsApi;
use Illuminate\Contracts\Encryption\DecryptException;


class EmployeeController extends Controller {


    public function validateOtp($user){
        $user->tokens()->update(['revoked' => true]);
        $details['access_token'] =  $user->createToken('MyApp')->accessToken; 
        $details['name'] = $user->firstName;
        if(isset($user->middleName)) $details['name'].= ' '.$user->middleName;
        if(isset($user->lastName)) $details['name'].= ' '.$user->lastName;
        $details['enrollment_no'] = $user->enrollmentNo;
        $school = \App\School::where('idSchool', '=', $user->idSchool)->first();
        if($school != null){
            $details['organization'] = $school->schoolName;
        }
        $department = DB::table('departments')->where('idDepartment', '=', $user->idDepartment)->first();
        if($department != null){
            $details['department'] = $department->departmentName;
        }else $details['department'] = "NA";
        $designation = DB::table('designations')->where('idDesignation', '=', $user->idDesignation)->first();
        if($designation != null){
            $details['designation'] = $designation->designationName;
        }else $details['designation'] = "NA";
        return response()->json(['result' => 1 , 'details' => $details, 'message'=>'Logged In'], 200);
    }
    public function login(Request $request){ 
        if(isset($request->sid) && isset($request->otp)){
            try {
                $decrypted = Crypt::decryptString($request->sid);
                $user = Auth::guard('teacher')->loginUsingId($decrypted);
                if($user->otp == $request->otp)
                return $this->validateOtp($user);
                else return response()->json(['message'=>'Invalid session or otp', 'result' => 0], 401);
            } catch (DecryptException $e) {
                return response()->json(['message'=>'Invalid session or otp', 'result' => 0], 401); 
            }
        }

        if(Auth::guard('teacher')->attempt(['mobile' => request('mobile'), 'password' => request('password')])){ 
            $user = Auth::guard('teacher')->user(); 
            if(isset($request->firebase)){
                $user->firebase = $request->firebase;
                $user->update();
            }  
            $school = \App\School::where('idSchool', '=', $user->idSchool)->first();
            $otp = mt_rand(100000, 999999);
            $user->otp = $otp;
            $user->otpsendAt = Carbon::now();
            $user->update();
            $message = $otp.' OTP for reseting Password. Regards Jijau Enterprises.';
            $phone_number = 9076204090;
            //SendSmsApi::initiateForgotPassword($phone_number, $message, $school);
            $enc = Crypt::encryptString($user->idEmployee);
            return response()->json(['message'=>'Otp has been sent to the boss mobile number',
            'sid' => $enc, 'otp' => 'Otp :'.$otp.' this parameter is enable for testing will be removed during production', 'result' => 1], 200);
        } 
        else{ 
            return response()->json(['message'=>'Invalid mobile or password', 'result' => 0], 401); 
        } 
    }


    public function addAttendance(Request $request){
        date_default_timezone_set("Asia/Kolkata");
        $user = Auth::guard('teacher-api')->user();
        if ($user->enrollmentNo != $request->enrollment_no) {
            return response()->json(['message' => 'Invalid access token', 'result' => 0], 201);
        }
        $request->validate([
            'enrollment_no' => 'required|string|max:255',
            'attendance_date_time' => 'required|string|max:20',
            'status' => 'required|string|max:20',
            'latitude' => 'required|string|max:20',
            'longitude' => 'required|string|max:20',
            'photo' => 'required|string',
        ]);

        if($this->isValidDateTime($request->attendance_date_time)){

            $school = \App\School::where('idSchool', '=', $user->idSchool)->first();
            if( $school == null){
                return response()->json(['message' => 'Invalid organization details', 'result' => 0], 201);
            }
            $checkAttendance = \App\EmpAttendance::where('Enrollment_Number', '=', $user->enrollmentNo)
                            ->where('Device_ID', '=', $school->Device_ID)
                            ->whereDate('date', '=', Carbon::parse($request->attendance_date_time)->format('Y-m-d'))
                            ->where('status', '=', $request->status)
                            ->where('idType', '=', 'A')
                            ->orderBy('ID','DESC')
                            ->first();
            if($checkAttendance != null){
                return response()->json(['message' => 'Attendance already registered', 'result' => 0], 201);
            }
            $empattendance = new \App\EmpAttendance();
            $empattendance->idRequest = json_encode($request->getContent());
            $empattendance->idMonth = Carbon::parse($request->attendance_date_time)->month;
            $empattendance->latitude = $request->latitude;
            $empattendance->longitude = $request->longitude;
            $empattendance->Device_ID = $school->Device_ID;
            $empattendance->Enrollment_Number = $user->enrollmentNo;
            $empattendance->status = $request->status;
            $empattendance->TimeStamp = Carbon::parse($request->attendance_date_time)->format('Y-m-d H:i:s');
            $empattendance->idSchool = $user->idSchool;
            $empattendance->date = Carbon::parse($request->attendance_date_time)->format('d-m-Y');
            if(isset($request->photo)){
                $empattendance->photo = $request->photo;
            }
            /*if ($request->hasFile('photo')) {
                $empattendance->photo = $request->file('photo')->store('attendance-photo', 'public');
            }*/
            $empattendance->save();
            if($school != null){
                $employee = $user;
                if ($request->status == 'IN') {
                    if ($school->smsmode == "auto") {
                        $reachAt = Carbon::parse($request->attendance_date_time);
                        $now = Carbon::now();
                        $totalDuration = $now->diffInSeconds($reachAt);
                        $phone_number = $employee->mobile;
                        if ($totalDuration < 3600) {
                            if ($school->idSchool == 73 || $school->idSchool == 79) {
                                $message = 'Dear Admin, ' . $employee->firstName . ' has reached at ' . Carbon::parse($request->attendance_date_time)->format('d-m-Y H:i:s') . ' Regards ' . $school->sms_regard_text . '.';
                            } else
                                $message = 'Dear Admin, ' . $employee->firstName . ' has reached at ' . Carbon::parse($request->attendance_date_time)->format('d-m-Y H:i:s') . ' Regards, Regards JIJAU ENTP.';
                            $template = \App\SchoolSmsTemplate::where('idSchool', '=', $school->idSchool)->where('template_name', '=', 'emp_attendance')->first();
                            if (!empty($template)) {
                                $tempid = $template->template_id;
                                if ($template->status == "Y")
                                    \App\Http\SendSmsApi::getUserNumber($phone_number, $message, $school, $tempid);
                            }
                        }
                    }
                }
                if ($request->status == 'OUT') {
                    if ($school->smsmode == "auto") {
                        $reachAt = Carbon::parse($request->attendance_date_time);
                        $now = Carbon::now();
                        $totalDuration = $now->diffInSeconds($reachAt);
                        $phone_number = $employee->mobile;
                        if ($totalDuration < 3600) {
                            if ($school->idSchool == 73 || $school->idSchool == 79) {
                                $message = 'Dear Admin, ' . $employee->firstName . ' left at ' . Carbon::parse($request->attendance_date_time)->format('d-m-Y H:i:s') . ' Regards ' . $school->sms_regard_text . '.';
                            } else
                                $message = 'Dear Admin, ' . $employee->firstName . ' left at ' . Carbon::parse($request->attendance_date_time)->format('d-m-Y H:i:s') . ' Regards, Regards JIJAU ENTP.';
                            $template = \App\SchoolSmsTemplate::where('idSchool', '=', $school->idSchool)->where('template_name', '=', 'emp_attendance_left')->first();
                            if (!empty($template)) {
                                $tempid = $template->template_id;
                                if ($template->status == "Y")
                                    \App\Http\SendSmsApi::getUserNumber($phone_number, $message, $school, $tempid);
                            }
                        }
                    }
                }
            }
            return response()->json(['message' => 'Attendance saved', 'result' => 1], 200);
        }else{
            return response()->json(['message' => 'Invalid date time format', 'result' => 0], 201);
        }
    }

    private function isValidDateTime(string $dateTimeString): bool
    {
        $format = 'Y-m-d H:i:s';
        $carbonDate = Carbon::createFromFormat($format, $dateTimeString);
        return $carbonDate !== false && $carbonDate->format($format) === $dateTimeString;
    }

    public function fetchAttendance(Request $request){
        date_default_timezone_set("Asia/Kolkata");
        $user = Auth::guard('teacher-api')->user();
        $validator = Validator::make($request->query(), [
            'month' => 'required|integer|min:1|max:12',
            'year' => 'required'
        ]);
        if ($validator->fails()) {
             return response()->json(['message' => 'Invalid Month (1-12)', 'result' => 0], 404);
        }
        $school = \App\School::where('idSchool', '=', $user->idSchool)->first();
        $emp = $user;
        if( $school == null){
            return response()->json(['message' => 'Invalid organization details', 'result' => 0], 404);
        }
        $todaydate = Carbon::now();
        $month = \App\Month::where('idMonth', '=', $request->month)->first();
        $noOfdays = $month->noOfDays;
        $m = $month->idMonth;
        $y = $request->year;
        $days = [];
        $excluded = 0;
        $result = [];
        $total_working = $noOfdays;
        for ($i = 1; $i <= $noOfdays; $i++) {
            $dt = $i . '-' . $m . '-' . $y;

            $tdate = \Carbon\Carbon::parse($dt);
            $hd = '';
            if ($school->idCountry == 1) {
                if ($tdate->dayOfWeek == '0' && $school->idSchool != 144) {
                    $hd = 'SUNDAY';
                    $excluded++;
                }
            } else {
                if ($tdate->dayOfWeek == '5') {
                    $hd = 'FRIDAY';
                    $excluded++;
                }
            }
            $days[] = array($dt, $hd);
        }
        $total_present = 0;
        $total_absent = 0;
        $total_holiday = 0;
        $allowedLateMinutes = 0;
        $allowedEarlyMinutes = 0;
        $totalLateDays = 0;
        $totalEarlyDays = 0;
        $empDays = [];
        $idFinancialYear = $this->fys();
        $leaveMaster = fetchLeaveMaster($emp, $idFinancialYear);
        foreach ($days as $key => $var) {
            $obj = [];
            $tdate = \Carbon\Carbon::parse($var[0]);
            $now = \Carbon\Carbon::now();
            $jdate = $tdate->format('Y-m-d');
            $obj['date'] = $jdate;
            $obj['remarks'] = "";
            //$obj['shift'] = "";
            $obj['data'] = "A";
            $obj['check_in'] = [];
            $obj['check_out'] = [];
            $obj['check_in']['data'] = false;
            $obj['check_out']['data'] = false;
            $cdate = intval($tdate->format('d'));
            $length = $tdate->diffInDays($now);
            //check for holiday 
            $holiday = getHoliday($emp, $jdate);
            $shifts = fetchShift($emp, $jdate);
            $dayNight = "AM";
            $nightDay = "AM";
            $isLeaveMaster = "N";
            $empDays[$cdate] = "A";
            $isPaidLeaveMaster = "N";
            if ($shifts != null && $holiday == null) {
                $dayNight = strtoupper($shifts->shift_from);
                $nightDay = strtoupper($shifts->shift_to);
                $arrival = checkArrival($emp, $jdate, $shifts, $school, $dayNight, $idFinancialYear, $allowedLateMinutes, $totalLateDays);
                $departure = checkDeparture($emp, $jdate, $shifts, $school, $nightDay, $idFinancialYear, $allowedEarlyMinutes, $totalEarlyDays);
                $overtime = fetchOvertime($emp, $shifts, $dayNight, $nightDay, $school, $jdate, $idFinancialYear);
                $totalEarlyDays = $departure['days'];
                $totalLateDays = $arrival['days'];
                $nonPaidLeave = DB::table('employee_leave')
                    ->whereDate('leave_from', '<=', $jdate)
                    ->whereDate('leave_to', '>=', $jdate)
                    ->where('idEmployee', $emp->idEmployee)
                    ->where('status', '!=', 'Approve with PL(Paid Leave)')
                    ->first();
                if ($nonPaidLeave != null) {
                    $isPaidLeaveMaster = "K";
                } else
                    if (fetchPaidLeave($jdate, $emp) == 1) {
                        $isPaidLeaveMaster = "Y";
                    } else if ($leaveMaster != null) {
                        if ($leaveMaster->leave_allocation == "A") {
                            $month = \App\Month::where('monthName', '=', $tdate->format('F'))->first();
                            if ($cdate > 1 && $cdate < $month->noOfDays) {
                                if (isset($leaveMaster->exclude_month)) {
                                    $month = \App\Month::where('monthName', $tdate->format('F'))->whereIn('idMonth', json_decode($leaveMaster->exclude_month, true))->get();
                                    if (count($month) == 0) {
                                        //check for sandwich leave
                                        if ($holiday != null) {
                                            if (checkForSandwich($emp, $leaveMaster->sandwich, $empDays, $tdate, $cdate, $school) == 1) {
                                                $isLeaveMaster = "Y";
                                            }
                                        }

                                        if ($shifts->weekOff == "Y") {
                                            if (checkForSandwich($emp, $leaveMaster->sandwich, $empDays, $tdate, $cdate, $school) == 1) {
                                                $isLeaveMaster = "Y";
                                            }
                                        }
                                    }
                                } else {
                                    //check for sandwich leave
                                }
                            }
                        }
                    }

            } else {
                $arrival = [];
                $departure = [];
            }
            if ($jdate <= $todaydate) {
                if ($isPaidLeaveMaster == "Y" || $isPaidLeaveMaster == "K") {
                    if ($isPaidLeaveMaster == "K") {
                        $empDays[$cdate] = "A";
                        $total_absent = $total_absent + 1;
                        $obj['data'] = "A";
                        $obj['late'] = "A (Leave)";
                    } else {
                        $total_present = $total_present + 1;
                        $empDays[$cdate] = "H";
                        $obj['data'] = "P";
                        $obj['remarks'] = "P (Leave)";
                    }
                } else {
                    if ($isLeaveMaster == "Y" && $shifts != null) {
                        $total_absent = $total_absent + 1;
                        $empDays[$cdate] = "A";
                        $obj['data'] = "A";
                        $obj['late'] = "A (Leave)";
                    } else {
                        if ($holiday != null) {
                            $total_holiday = $total_holiday + 1;
                            $empDays[$cdate] = "H";
                            $obj['data'] = "W";
                            $obj['remarks'] = $holiday->holidayName;
                        } else {
                            if ($shifts != null) {
                                if ($shifts->weekOff == "Y") {
                                    $total_holiday = $total_holiday + 1;
                                    $empDays[$cdate] = "H";
                                    $obj['data'] = "W";
                                    $obj['remarks'] = "Weekly-Off";
                                } else {
                                    //$obj['shift'] = \Carbon\Carbon::parse($shifts->fromTime . ' ' . $dayNight)->format('H:i') . '-' . \Carbon\Carbon::parse($shifts->toTime . ' ' . $nightDay)->format('H:i');
                                    if (isset($shifts->fromTime) && isset($shifts->toTime)) {
                                        $a_mat = \App\EmpAttendance::where('Enrollment_Number', '=', $emp->enrollmentNo)
                                            ->where('idSchool', '=', $school->idSchool)
                                            ->whereDate('date', '=', $jdate)
                                            ->where('status', '=', 'P')
                                            ->where('idType', '=', 'M')
                                            ->orderBy('ID','DESC')
                                            ->first(); 
                                        if ($a_mat == null) {
                                            $aintime = \App\EmpAttendance::where('Enrollment_Number', '=', $emp->enrollmentNo)
                                                ->where('Device_ID', '=', $school->Device_ID)
                                                ->whereDate('date', '=', $jdate)
                                                ->where('status', '=', 'IN')
                                                ->where('idType', '=', 'A')
                                                ->orderBy('ID','DESC')
                                                ->first();
                                            if ($aintime){
                                                $obj['check_in']['data'] = true;
                                                $obj['remarks'] = "IN: " . explode(" ", $aintime->TimeStamp)[1];
                                                if(isset($aintime->TimeStamp))
                                                $obj['check_in']['time'] = explode(" ", $aintime->TimeStamp)[1];
                                                if(isset($aintime->status))
                                                $obj['check_in']['status'] = $aintime->status;
                                                if(isset($aintime->latitude))
                                                $obj['check_in']['latitude'] = number_format($aintime->latitude, 6);
                                                if(isset($aintime->longitude))
                                                $obj['check_in']['longitude'] = number_format($aintime->longitude, 6);
                                                if(isset($aintime->photo))
                                                $obj['check_in']['photo'] = $aintime->photo;
                                            } 
                                            else
                                                $obj['remarks'] = "IN: Incomplete Attendance";

                                            $aouttime = \App\EmpAttendance::where('Enrollment_Number', '=', $emp->enrollmentNo)
                                                ->where('Device_ID', '=', $school->Device_ID)
                                                ->whereDate('date', '=', $jdate)
                                                ->where('status', '=', 'OUT')
                                                ->where('idType', '=', 'A')
                                                ->orderBy('ID','DESC')
                                                ->first();

                                            if ($aouttime)
                                            {
                                                $obj['check_out']['data'] = true;
                                                $obj['remarks'] = $obj['remarks'] . " OUT: " . explode(" ", $aouttime->TimeStamp)[1];
                                                if(isset($aouttime->TimeStamp))
                                                $obj['check_out']['time'] = explode(" ", $aouttime->TimeStamp)[1];
                                                if(isset($aouttime->status))
                                                $obj['check_out']['status'] = $aouttime->status;
                                                if(isset($aouttime->latitude))
                                                $obj['check_out']['latitude'] = number_format($aouttime->latitude, 6);
                                                if(isset($aouttime->longitude))
                                                $obj['check_out']['longitude'] = number_format($aouttime->longitude, 6);
                                                if(isset($aouttime->photo))
                                                $obj['check_out']['photo'] = $aouttime->photo;
                                            }
                                            else
                                                $obj['remarks'] = $obj['remarks'] . " OUT: Incomplete Attendance";

                                        }
                                        if ($arrival['status'] == "I" && $departure['status'] == "I") {
                                            $total_absent = $total_absent + 1;
                                            $empDays[$cdate] = "A";
                                            $obj['data'] = "A";
                                            $obj['remarks'] = "";
                                        } else {
                                            $empDays[$cdate] = "P";
                                            $obj['data'] = "A";

                                            if ($arrival['status'] == "I") {
                                                $obj['data'] = "A";
                                            } elseif ($arrival['status'] == "HF") {
                                                $obj['data'] = "H";
                                                $obj['late'] = $arrival['normal_html'];
                                            } elseif ($arrival['status'] == "LT") {
                                                $obj['data'] = "P";
                                                $obj['late'] = $arrival['normal_html'];
                                            } elseif ($arrival['status'] == "P") {
                                                $obj['data'] = "P";
                                            }

                                            if ($arrival['status'] == "A") {
                                                $total_absent = $total_absent + 1;
                                                $empDays[$cdate] = "AB";
                                                $obj['data'] = "A";
                                                $obj['remarks'] = $obj['remarks'] . ' ' . $arrival['normal_html'];
                                            } elseif ($departure['status'] == "A") {
                                                $total_absent = $total_absent + 1;
                                                $empDays[$cdate] = "AB";
                                                $obj['data'] = "A";
                                                $obj['remarks'] = $obj['remarks'] . ' ' . $arrival['normal_html'];
                                            } elseif ($departure['status'] == "P" && $arrival['status'] == "P") {
                                                $total_present = $total_present + 1;
                                                $obj['data'] = "P";
                                            } elseif (($departure['status'] == "LT" || $departure['status'] == "P") && ($arrival['status'] == "LT" || $arrival['status'] == "P")) {
                                                $total_present = $total_present + 1;
                                                $obj['data'] = "P";
                                            } elseif ($departure['status'] == "HF" || $arrival['status'] == "HF") {
                                                $total_present = $total_present + 0.5;
                                                $obj['data'] = "H";
                                            }

                                            if ($departure['status'] == "I") {
                                                if ($obj['data'] != "H")
                                                    $obj['data'] = "A";
                                            } elseif ($departure['status'] == "HF") {
                                                //$obj['data'] = "H";
                                                $obj['late'] = $arrival['normal_html'];
                                            } elseif ($departure['status'] == "LT") {
                                                $obj['data'] = "P";
                                                $obj['late'] = $arrival['normal_html'];
                                            } elseif ($departure['status'] == "P") {
                                                $obj['data'] = "P";
                                            }

                                            if ($overtime['status'] == "Y") {

                                            }
                                        }


                                    }
                                }
                            }
                        }
                    }
                }
            } else {
                $obj['data'] = "Date not came yet";
                $obj['remarks'] = "";
            }
            array_push($result, $obj);
        }
        return response()->json(['message' => 'Attendance', 'result' => 1, "data" => $result], 200);
    } 

    function fys() {
        $now = \Carbon\Carbon::now();
        $finyear = \App\FinancialYear::where('idSchool', '=', Auth::guard('teacher-api')->user()->idSchool)->get();
        foreach ($finyear as $fy) {
            $start_date = \Carbon\Carbon::parse($fy->startDate);
            $end_date = \Carbon\Carbon::parse($fy->endDate);
            if ($now->between($start_date, $end_date) == true || $end_date->diffInDays($now) == 0) {
                return $fy->idFinancialYear;
            }
        }
    }

}

Copyright © 2021 - 2025 IMMREX7