IMMREX7
<?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 -