<?php
namespace App\Models;
use App\Helpers\Helper;
use Bagusindrayana\LaravelFilter\Traits\LaravelFilter;
use DateInterval;
use DatePeriod;
use DateTime;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;
class Karyawan extends Authenticatable
{
use HasFactory, LaravelFilter, HasApiTokens;
protected $fillable = [
'id_karyawan',
'nik',
'nama',
'email',
'password',
'perusahaan_id',
'departemen_id',
'jabatan_id',
'jabatan',
'user_id',
'foto',
'jenis_kelamin',
'no_hp',
'gaji_id',
'tanggal_mulai_kerja',
'device_id',
'fcm_token'
];
protected $appends = [
'_type',
'jadwal_kerja_hari_ini',
'kalender_jadwal_hari_ini',
'total_rit',
'total_hm'
// 'total_jam_kerja_bulan_ini',
// 'total_premi_bulan_ini'
];
public function perusahaan()
{
return $this->belongsTo(Perusahaan::class)->withDefault(['nama_perusahaan' => 'Tidak Ada']);
}
public function perusahaans(){
return $this->morphToMany(Perusahaan::class,'perusahaanable');
}
public function user()
{
return $this->belongsTo(User::class);
}
public function jadwal_kerja()
{
return $this->belongsToMany(JadwalKerja::class, 'jadwal_kerja_karyawans');
}
public function absensi()
{
return $this->hasMany(Absensi::class);
}
public function lokasi_absen()
{
return $this->belongsToMany(LokasiAbsen::class, 'lokasi_absen_karyawans');
}
public function lokasi_kerja()
{
return $this->belongsToMany(LokasiKerja::class, 'lokasi_kerja_karyawans');
}
public function getTypeAttribute()
{
return "karyawan";
}
public function getJadwalKerjaHariIniAttribute()
{
$jadwalKerjaDetail = null;
$karyawan = $this;
try {
if((env("APP_ENV") == "local" || env("APP_ENV") == "testing") && request()->has('test_tanggal')){
$hariIni = new DateTime(date("Y-m-d",strtotime(request()->get('test_tanggal'))));
$tanggalIni = new DateTime(date("Y-m-d",strtotime(request()->get('test_tanggal'))));
$input = date("H:i:00",strtotime(request()->has('test_jam')));
} else {
$hariIni = new DateTime(date("Y-m-d"));
$tanggalIni = new DateTime(date("Y-m-d"));
$input = date("H:i:00");
}
$jadwal_kerja_id = 0;
$last_absen = $this->absensi()->whereDate('tanggal_absen', '<=', date('Y-m-d'))->orderBy('created_at', 'DESC')->orderBy('tanggal_absen', 'DESC')->first();
$ci = null;
if ($last_absen) {
$ci = $last_absen->getRiwayat('check-in', 'reject');
$co = $last_absen->getRiwayat('check-out', 'reject');
if ($ci && $co == null) {
$jadwal_kerja_id = $ci->jadwal_kerja_id;
$hariIni = new DateTime($ci->tanggal_absen);
} else if ($ci && $co) {
$jadwal_kerja_id = $co->jadwal_kerja_id;
$hariIni = new DateTime($co->tanggal_absen);
}
}
$awal = new DateTime($karyawan->tanggal_mulai_kerja);
//urutkan jadwal kerja yang ada di karyawan dengan jam masuk yang paling dekat dengan jam absen
$jadwals = JadwalKerjaDetail::has('jadwal_kerja')
->selectRaw("*,ABS(TIMEDIFF(jam_masuk, '" . $input . "')) as _diff")
->whereIn('jadwal_kerja_id', $karyawan->jadwal_kerja->pluck('id')->toArray())
// ->where('status_kerja', 'work-day')
->orderBy('_diff', 'ASC')
->get();
//dari urutan jadwal kerja tersebut akan di tentukan jadwal kerja apa yang sesuai dengan hari saat request absen
//(hari jadwal kerja di htiung dari hari mulai kerjanya karyawan)
$day = 1;
$jadwalKerjaDetail = null;
foreach ($jadwals as $key => $detail) {
while ($awal < $tanggalIni) {
if ($day < $detail->jadwal_kerja->jumlah_hari) {
$day++;
} else {
$day = 1;
}
$awal->modify('+1 day');
}
$jam_masuk = strtotime($detail->jam_masuk);
$jam_pulang = strtotime($detail->jam_pulang);
$_input = strtotime($input);
if ($detail->hari == "Day $day") {
$f = DateTime::createFromFormat('H:i:s', $detail->jam_masuk);
$t = DateTime::createFromFormat('H:i:s', $detail->jam_pulang);
$i = DateTime::createFromFormat('H:i:s', $input);
//jika jam masuk lebih besar dari jam pulang
//contoh jam masuk hari ini pada jam 18:00 sore namun jam pulangnya besok jam 06:00 pagi
if ($f > $t)
$t->modify('+1 day');
if ($jadwal_kerja_id == $detail->jadwal_kerja_id) {
$jadwalKerjaDetail = $detail;
break;
} else if (($f <= $i && $i <= $t) || ($f <= $i->modify('+1 day') && $i <= $t)) {
$jadwalKerjaDetail = $detail;
//dd($jadwalKerjaDetail);
break;
} else if ($_input < $jam_masuk || ($_input >= $jam_masuk && $_input <= $jam_pulang)) {
$jadwalKerjaDetail = $detail;
break;
} else {
$jadwalKerjaDetail = $detail;
break;
}
}
}
if ($jadwalKerjaDetail) {
$kal = $this->kalender_jadwal_hari_ini;
if ($kal && $kal->status != "work") {
$jadwalKerjaDetail->status_kerja = $kal->status;
}
}
} catch (\Throwable $th) {
$jadwalKerjaDetail = null;
}
return $jadwalKerjaDetail;
}
function getKalenderJadwalHariIniAttribute()
{
if((env("APP_ENV") == "local" || env("APP_ENV") == "testing") && request()->has('test_tanggal')){
$tanggal = date('Y-m-d',strtotime(request()->get('test_tanggal')));
} else {
$tanggal = date('Y-m-d');
}
return $this->kalender_jadwal()->whereDate("tanggal", $tanggal)->first();
}
public function departemen()
{
return $this->belongsTo(Departemen::class)->withDefault([
'nama_departemen'=>'Tidak Ada'
]);
}
// public function jabatan()
// {
// return $this->belongsTo(Jabatan::class);
// }
public function getTotalJamKerja2Attribute(){
return $this->absensi->sum('total_jam_kerja_2');
}
public function getTotalJamKerjaBulanIniAttribute()
{
$bulan = date('m');
$tahun = date('Y');
$gaji = $this->gaji;
if ($gaji->jenis_gaji == "jam") {
$ttl = Absensi::where('karyawan_id', $this->id)
->whereYear('tanggal_absen', $tahun)
->whereMonth('tanggal_absen', $bulan)
->get()->sum('total_jam_kerja');
} else if ($gaji->jenis_gaji == "rit") {
$ttl = Absensi::where('karyawan_id', $this->id)
->whereYear('tanggal_absen', $tahun)
->whereMonth('tanggal_absen', $bulan)->sum('rit');
} else if ($gaji->jenis_gaji == "hari") {
$ttl = Absensi::where('karyawan_id', $this->id)
->whereYear('tanggal_absen', $tahun)
->whereMonth('tanggal_absen', $bulan)->count();
}
return $ttl;
}
public function getTotalPremiBulanIniAttribute()
{
$ttl = 0;
$gaji = $this->gaji;
if ($gaji) {
$ttl = $gaji->jumlah_gaji * $this->total_jam_kerja_bulan_ini;
}
return $ttl;
}
public function getTotalRitAttribute()
{
$hari = date('d');
$bulan = (int) date('m') - 1;
$tahun = date('Y');
if ($hari < 20) {
return Absensi::where('karyawan_id', $this->id)
->whereBetween('tanggal_absen', [date("Y-$bulan-20"), date("Y-m-20")])->sum('rit');
} else {
return Absensi::where('karyawan_id', $this->id)
->whereBetween('tanggal_absen', [date("Y-m-20"), date("Y-m-20", strtotime('+1 month'))])->sum('rit');
}
}
public function getTotalHmAttribute()
{
$hari = date('d');
$bulan = date('m');
$tahun = date('Y');
if ($hari < 20) {
return Absensi::where('karyawan_id', $this->id)
->whereBetween('tanggal_absen', [date("Y-$bulan-20"), date("Y-m-20")])->sum('hm');
} else {
return Absensi::where('karyawan_id', $this->id)
->whereBetween('tanggal_absen', [date("Y-m-20"), date("Y-m-20", strtotime('+1 month'))])->sum('hm');
}
}
public function unit()
{
return $this->belongsToMany(Unit::class, 'karyawan_units');
}
public function gaji()
{
return $this->belongsTo(Gaji::class);
}
public function kalender_jadwal()
{
return $this->hasMany(KalenderJadwal::class);
}
public function getKalenderJadwalPeriode($periode = null)
{
$periode_awal = $periode[0] ?? date("Y-m-d", strtotime('-1 week'));
$periode_akhir = $periode[1] ?? date("Y-m-d");
$begin = new DateTime($periode_awal);
$end = new DateTime($periode_akhir);
$end = $end->modify('+1 day');
$periods = new DatePeriod(
$begin,
new DateInterval('P1D'),
$end
);
$kalenders = $this->kalender_jadwal()->whereBetween('tanggal', [$periode_awal, $periode_akhir])->orderBy('created_at','desc')->pluck('status', 'tanggal');
$datas = [];
$haris = Helper::checkJadwal($this->id, $periode_awal, $periode_akhir);
$jadwalkerja = $this->jadwal_kerja;
foreach ($periods as $key => $periode) {
if (isset($kalenders[$periode->format("Y-m-d")])) {
$datas[$periode->format("Y-m-d")] = @$kalenders[$periode->format("Y-m-d")] ?? "na";
} else {
foreach ($jadwalkerja as $jadwal) {
$s = $haris[$jadwal->id][$key] ?? null;
if ($s) {
if ($s->status_kerja == 'work-day') {
$datas[$periode->format("Y-m-d")] = "work";
break;
} else {
$datas[$periode->format("Y-m-d")] = "off";
}
}
}
}
}
return $datas;
}
public function getJadwalKerjaDetail($jadwal_kerja_id)
{
$karyawan = $this;
// $hariIni = new DateTime(date("Y-m-d"));
// $input = date("H:i:00");
$awal = new DateTime($karyawan->tanggal_mulai_kerja);
if((env("APP_ENV") == "local" || env("APP_ENV") == "testing") && request()->has('test_tanggal')){
$hariIni = new DateTime(date("Y-m-d",strtotime(request()->get('test_tanggal'))));
$input = date("H:i:00",strtotime(request()->has('test_jam')));
} else {
$hariIni = new DateTime(date("Y-m-d"));
$input = date("H:i:00");
}
$jadwals = JadwalKerjaDetail::has('jadwal_kerja')
->selectRaw("*,ABS(TIMEDIFF(jam_masuk, '" . $input . "')) as _diff")
->whereIn('jadwal_kerja_id', [$jadwal_kerja_id])
->orderBy('_diff', 'ASC')
->get();
$day = 1;
$jadwalKerjaDetail = null;
foreach ($jadwals as $key => $detail) {
while ($awal < $hariIni) {
if ($day < $detail->jadwal_kerja->jumlah_hari) {
$day++;
} else {
$day = 1;
}
$awal->modify('+1 day');
}
$jam_masuk = strtotime($detail->jam_masuk);
$jam_pulang = strtotime($detail->jam_pulang);
$_input = strtotime($input);
if ($detail->hari == "Day $day") {
$f = DateTime::createFromFormat('H:i:s', $detail->jam_masuk);
$t = DateTime::createFromFormat('H:i:s', $detail->jam_pulang);
$i = DateTime::createFromFormat('H:i:s', $input);
//jika jam masuk lebih besar dari jam pulang
//contoh jam masuk hari ini pada jam 18:00 sore namun jam pulangnya besok jam 06:00 pagi
if ($f > $t)
$t->modify('+1 day');
if (($f <= $i && $i <= $t) || ($f <= $i->modify('+1 day') && $i <= $t)) {
$jadwalKerjaDetail = $detail;
break;
} else if ($_input < $jam_masuk || ($_input >= $jam_masuk && $_input <= $jam_pulang)) {
$jadwalKerjaDetail = $detail;
break;
}
else {
$jadwalKerjaDetail = $detail;
break;
}
}
}
if ($jadwalKerjaDetail) {
$kal = $this->kalender_jadwal_hari_ini;
if ($kal && $kal->status != "work") {
$jadwalKerjaDetail->status_kerja = $kal->status;
}
}
return $jadwalKerjaDetail;
}
public function devices() {
return $this->hasMany(KaryawanDevice::class);
}
public function izins() {
return $this->hasMany(Izin::class);
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]