Anons79 Mini Shell

Directory : /home/aplikasiposinfo/.trash/app/Models/
Upload File :
Current File : /home/aplikasiposinfo/.trash/app/Models/Karyawan.php

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