<?php namespace App\Models; use Tymon\JWTAuth\Contracts\JWTSubject; use Illuminate\Auth\Authenticatable; use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Laravel\Lumen\Auth\Authorizable; use Carbon\Carbon; class User extends Model implements AuthenticatableContract, AuthorizableContract, JWTSubject { use Authenticatable, Authorizable, HasFactory; protected $table = 'm_users'; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'role_id', 'username', 'session_login', 'phone_number', 'email', 'address', 'fcm_token', 'gender', 'birth_place', 'birth_date', 'blood_type', 'ktp_number', 'working_hours', 'created_at', 'created_by', 'updated_at', 'updated_by', 'status_resource', 'discount_id','company_id' ]; const CREATED_AT = 'created_at'; const UPDATED_AT = 'updated_at'; const DEFAULT_TZ = 'Asia/Jakarta'; const INSIDE = "INSIDE"; const OUTSIDE = "OUTSIDE"; const HOLIDAY = "HOLIDAY"; /** * The attributes excluded from the model's JSON form. * * @var array */ protected $hidden = [ 'password', ]; /** * Get the identifier that will be stored in the subject claim of the JWT. * * @return mixed */ public function getJWTIdentifier() { return $this->getKey(); } /** * Return a key value array, containing any custom claims to be added to the JWT. * * @return array */ public function getJWTCustomClaims() { return []; } /** * Get working hours for given timestamp * * @return array of carbon or NULL in case HOLIDAY */ public function getWorkingTime(Carbon $ts, $f = "08:00", $t = "17:00", $tz = self::DEFAULT_TZ) { $workingTime = array( "from" => Carbon::createFromTimeString($f, $tz), "to" => Carbon::createFromTimeString($t, $tz) ); $userShift = UserShift::where('user_id',) ->orderByDesc('from_date') ->first(); $shift = null; if ($userShift !== null) { $shiftId = null; switch ($ts->shortEnglishDayOfWeek) { case "Mon": $shiftId = $userShift->mon_shift_id; break; case "Tue": $shiftId = $userShift->tue_shift_id; break; case "Wed": $shiftId = $userShift->wed_shift_id; break; case "Thu": $shiftId = $userShift->thu_shift_id; break; case "Fri": $shiftId = $userShift->fri_shift_id; break; case "Sat": $shiftId = $userShift->sat_shift_id; break; case "Sun": $shiftId = $userShift->sun_shift_id; break; } if ($shiftId === null) { return null; } $shift = Shift::where('id', $shiftId)->first(); } else { $shift = Shift::where('is_non_shift', true) ->orderByDesc('created_at') ->first(); } if ($shift !== null) { $from = Carbon::createFromTimeString($shift->start_time, $tz) ->subMinutes($shift->flex_time_minute); $to = Carbon::createFromTimeString($shift->end_time, $tz) ->addMinutes($shift->flex_time_minute); /* if ($to->lessThan($from)) { $to->addDay(); } */ $workingTime['from'] = $from; $workingTime['to'] = $to; } return $workingTime; } /** * Get presence status */ public function presenceStatus(Carbon $at = null, $tz = self::DEFAULT_TZ) { $ts = $at; if ($at !== null) { $ts = Carbon::now($tz); } $tsSec = $ts->secondsSinceMidnight(); $status = ""; $wt = $this->getWorkingTime($ts, $tz); if ($wt === null) { $status = self::HOLIDAY; } else { $from = $wt->from; $to = $wt->to; $tsFrom = $from->secondsSinceMidnight(); $tsTo = $to->secondsSinceMidnight(); if ($from->greaterThan($to)) { $tsMid = 24 * 60 * 60 - $tsFrom; if ($tsSec >= $tsFrom || $tsSec < $tsTo) { $status = self::INSIDE; } else { $status = self::OUTSIDE; } } else { if ($tsSec < $tsFrom || $tsSec > $tsTo) { $status = self::OUTSIDE; } else { $status = self::INSIDE; } } } $clockIn = null; $clockOut = null; $inout = Presence::where('user_id', $this->id) ->orderByDesc('clock_in') ->first(); if ($inout !== null) { $clockIn = Carbon::parse($inout->clock_in, $tz); $clockOut = Carbon::parse($inout->clock_out, $tz); } return array( "status" => $status, "ts" => $ts, "clock_in" => $clockIn, "clock_out" => $clockOut ); } }