Anons79 Mini Shell

Directory : /home/aplikasiposinfo/.trash/app/Helpers/
Upload File :
Current File : /home/aplikasiposinfo/.trash/app/Helpers/Helper.php

<?php
namespace App\Helpers;

use App\Models\Absensi;
use App\Models\Izin;
use App\Models\JadwalKerjaDetail;
use App\Models\Karyawan;
use App\Models\KaryawanLog;
use App\Models\RiwayatAbsensi;
use App\Models\UserLog;
use DateTime;
use Illuminate\Support\Facades\Auth;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log;
use PNGMetadata\PNGMetadata;

class Helper
{
    // public static function dayNumber($date){
    //     $t=date('Y-m-d',strtotime($date));

    //     $dayName = strtolower(date("D",strtotime($t)));
    //     $dayNum = strtolower(date("d",strtotime($t)));
    //     $return = floor(($dayNum - 1) / 7) + 1;
    //     return $return;
    // }

    public static function sendWa($number, $message)
    {

        //jika masih development
        if (env("APP_ENV") == "local") {
            return;
        }
        //jika nomor kosong
        if ($number === "" || $number === null || strlen($number) < 4) {
            return "nomor hp kosong";
        }
        //return self::sendWaFonnte($number,$message);
        $ptn = "/^0/";  // Regex
        $rpltxt = "+62";  // Replacement string
        $number = preg_replace($ptn, $rpltxt, "$number");
        $key = 'aec57ead1d6a730d6e79844e106e4eab';
        $url = 'https://notifapi.com/async_send_message';
        $data = array(
            "phone_no" => $number,
            "key" => $key,
            "message" => $message,
            "pendingTime"=>2
            // "url"        =>$img_url,
        );
        $data_string = json_encode($data);
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_VERBOSE, 0);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 360);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt(
            $ch,
            CURLOPT_HTTPHEADER,
            array(
                'Content-Type: application/json',
                'Content-Length: ' . strlen($data_string)
            )
        );
        $res = curl_exec($ch);
        curl_close($ch);
        // Log::info("WA : ".$res);

        return $res;

    }

    public static function sendWaFonnte($number, $message)
    {   
        $tokens = [
            "7ap5MovVzhzSK5QPznnU",
        ];
        $k = array_rand($tokens);
        $token = $tokens[$k];
        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => 'https://api.fonnte.com/send',
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => '',
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_POSTFIELDS => array(
                'target' =>$number,
                'message' => $message,
                'typing' => true,
                'delay' => rand(2, 6),
                'countryCode' => '62',
            ),
            CURLOPT_HTTPHEADER => array(
                'Authorization: '.$token
            ),
        ));

        $response = curl_exec($curl);
        if (curl_errno($curl)) {
            $error_msg = curl_error($curl);
        }
        curl_close($curl);

        if (isset($error_msg)) {
            return $error_msg;
        }
        return $response;

    }

    public static function jamKerja($karyawan_id, $tanggal)
    {
        $ttl = 0;
        $karyawan = Karyawan::find($karyawan_id);
        $gaji = $karyawan->gaji;
        $absensi = Absensi::where('karyawan_id', $karyawan_id)->whereDate('tanggal_absen', $tanggal)->orderBy('tanggal_absen', 'desc')
            ->orderBy('created_at', 'desc')->first();


        if ($absensi && $absensi->status_absen != null) {
            if ($absensi->status_absen == "h") {
                if ($gaji && $absensi && $absensi->status_absen == "h") {
                    if ($gaji->jenis_gaji == "jam") {
                        $ttl = (float) $absensi->total_jam_kerja;
                    } else if ($gaji->jenis_gaji == "rit") {
                        $ttl = (int) $absensi->rit;
                    } else if ($gaji->jenis_gaji == "hari") {
                        $ttl = 1;
                    }
                }
            } else {
                $ttl = strtoupper($absensi->status_absen);
            }

        } else {
            $jadwalKerjas = $karyawan->jadwal_kerja;

            foreach ($jadwalKerjas as $jadwalKerja) {
                if ($jadwalKerja->jumlah_hari > 7) {
                    $day_of_week = (int) date('d', strtotime($tanggal));
                } else {
                    $day_of_week = (int) date('N', strtotime($tanggal));
                }
                $detailJadwal = $jadwalKerja->jadwal_kerja_detail->where('hari', 'Day ' . $day_of_week)->first();

                if ($detailJadwal) {
                    if ($detailJadwal->status_kerja == 'day-off') {
                        $ttl = 'Off';
                    } else {
                        $ttl = 'A';
                        break;
                    }
                }
            }
        }

        return $ttl;
    }

    public static function unitAbsen($karyawan_id, $tanggal)
    {
        if (is_integer($karyawan_id)){
            return RiwayatAbsensi::whereHas('absensi', function ($w) use ($karyawan_id) {
                $w->where('karyawan_id', $karyawan_id);
            })->whereDate('tanggal_absen', $tanggal)->first()->unit->kode_unit ?? null;
        } else {
            return null;
        }
    }

    public static function premiAbsen($karyawan_id, $tanggal)
    {
        $ttl = 0;
        $absensi = Absensi::where('karyawan_id', $karyawan_id)->whereDate('tanggal_absen', $tanggal)->orderBy('tanggal_absen', 'desc')
            ->orderBy('created_at', 'desc')->first();
        $gaji = Karyawan::find($karyawan_id)->gaji;
        if ($gaji && $absensi && $absensi->status_absen == "h") {
            if ($gaji->jenis_gaji == "jam") {
                $ttl = $gaji->jumlah_gaji * $absensi->total_jam_kerja;
            } else if ($gaji->jenis_gaji == "rit") {
                $ttl = $gaji->jumlah_gaji * $absensi->rit;
            } else if ($gaji->jenis_gaji == "hari") {
                $ttl = $gaji->jumlah_gaji;
            }
        }
        return $ttl;
    }

    public static function hitungPremiLembur($karyawan_id, $totalJamKerja)
    {
        $ttl = 0;
        $karyawan = Karyawan::find($karyawan_id);
        $gaji = $karyawan->gaji;

        if ($gaji && $gaji->gaji_detail) {
            foreach ($gaji->gaji_detail as $detail) {
                if ($detail->jumlah_maksimal < $totalJamKerja) {
                    $ttl += $totalJamKerja * $detail->jumlah_gaji_tambahan;

                }
            }

        }
        return $ttl;

    }

    public static function jumlahPermintaanAsben()
    {
        $datas = RiwayatAbsensi::join('absensis as ap', 'ap.id', '=', 'riwayat_absensis.absensi_id')
            ->join('karyawans as k', 'k.id', '=', 'ap.karyawan_id')->where('status', 'pending');
        $user = auth()->user()->load(['perusahaans','departemen']);
        $departemen_ids = $user->departemen()->pluck('departemen_id')->toArray();
        if (count($departemen_ids) > 0) {
            $datas = $datas->whereHas('absensi.karyawan', function ($q) use ($departemen_ids) {
                $q->whereHas("departemen", function ($qd) use ($departemen_ids) {
                    $qd->whereIn('id', $departemen_ids);
                });
            });
        }

        // if ($user->perusahaan_id != null) {
        //     $datas = $datas->whereHas('absensi.karyawan', function ($q) use ($user) {
        //         $q->where('perusahaan_id', $user->perusahaan_id);
        //     });
        // }

        if (count($user->perusahaans) > 0) {
            $datas = $datas->whereHas('absensi.karyawan', function ($q) use ($user) {
                $q->whereHas('perusahaans',function($w)use($user){
                    $w->whereIn('perusahaan_id', $user->perusahaans->pluck('id')->toArray());
                });
            });
        }
        return $datas->count();
    }

    public static function permintaanAsben($limit = 10)
    {   

        $datas = RiwayatAbsensi::join('absensis as ap', 'ap.id', '=', 'riwayat_absensis.absensi_id')
            ->join('karyawans as k', 'k.id', '=', 'ap.karyawan_id')->where('status', 'pending');
        $user = auth()->user()->load(['perusahaans','departemen']);
        $departemen_ids = $user->departemen->pluck('id')->toArray();
        if (count($departemen_ids) > 0) {
            $datas = $datas->whereHas('absensi.karyawan', function ($q) use ($departemen_ids) {
                $q->whereHas("departemen", function ($qd) use ($departemen_ids) {
                    $qd->whereIn('id', $departemen_ids);
                });
            });
        }


        if (count($user->perusahaans) > 0) {
            $datas = $datas->whereHas('absensi.karyawan', function ($q) use ($user) {
                $q->whereHas('perusahaans',function($w)use($user){
                    $w->whereIn('perusahaan_id', $user->perusahaans->pluck('id')->toArray());
                });
            });
        }
        return $datas->limit($limit)->get();
        // if ($limit != null) {
        //     return RiwayatAbsensi::join('absensis as ap', 'ap.id', '=', 'riwayat_absensis.absensi_id')
        //         ->join('karyawans as k', 'k.id', '=', 'ap.karyawan_id')->with('absensi.karyawan', 'jadwal_kerja')->where('riwayat_absensis.status', 'pending')->orderBy('riwayat_absensis.created_at', 'DESC')->limit($limit)->get();
        // } else {
        //     return RiwayatAbsensi::join('absensis as ap', 'ap.id', '=', 'riwayat_absensis.absensi_id')
        //         ->join('karyawans as k', 'k.id', '=', 'ap.karyawan_id')->with('absensi.karyawan', 'jadwal_kerja')->where('riwayat_absensis.status', 'pending')->orderBy('riwayat_absensis.created_at', 'DESC')->get();
        // }
    }

    public static function checkIzin($karyawan_id, $tanggal)
    {
        $cek_izin = Izin::where('karyawan_id', $karyawan_id)->whereDate('tanggal_izin', $tanggal)->first();
        if ($cek_izin != null && $cek_izin->status == "accept") {
            return $cek_izin;
        }
        return null;
    }

    //melihat status jadwal kerja dimulai dari tanggal mulai kerja (statusnya apakah masuk atau libur dan sebagainya)
    public static function checkJadwal($karyawan_id, $tanggal_awal, $tanggal_akhir)
    {

        if (is_integer($karyawan_id)) {
            $karyawan = Karyawan::with('jadwal_kerja.jadwal_kerja_detail', 'izins', 'kalender_jadwal')->find($karyawan_id);

        } else {
            $karyawan = $karyawan_id;

        }
        $haris = [];
        $kArr = $karyawan->kalender_jadwal->toArray();

        usort($kArr, function ($a, $b) {
            return strtotime($a['updated_at']) - strtotime($b['updated_at']);
        });
        $kalender_jadwal = array_reduce($kArr, function ($carry, $item) {
            $carry[$item['tanggal']] = $item['status'];
            return $carry;
        }, []);
        // $kalender_jadwal = $karyawan->kalender_jadwal->toArray();
        $izins = $karyawan->izins ?? [];
        $tw = new DateTime($tanggal_akhir);

        foreach ($karyawan->jadwal_kerja as $jadwal) {

            $awal = new DateTime($tanggal_awal);

            $bulans = [];
            while ($awal <= $tw) {
                $bulans[] = $awal->format("Y-m-d");
                $awal->modify('+1 day');
            }

            $awal = new DateTime($tanggal_awal);
            $day = 1;
            $mulaiKerja = new DateTime($karyawan->tanggal_mulai_kerja);


            $details = [];
            $mulaiKerja = new DateTime($karyawan->tanggal_mulai_kerja);
            while ($mulaiKerja <= $tw) {
                if ($mulaiKerja >= $awal) {
                    $d = $jadwal->jadwal_kerja_detail->where('hari', "Day " . $day)->first();
                    if ($d) {
                        $details[$mulaiKerja->format("Y-m-d")] = $d;
                    } else {
                        $details[$mulaiKerja->format("Y-m-d")] = [
                            "status_kerja" => "day-off"
                        ];
                    }
                }


                if ($day < $jadwal->jumlah_hari) {
                    $day++;
                } else {
                    $day = 1;
                }

                $mulaiKerja->modify('+1 day');
            }
            $status = "na";
            foreach ($bulans as $tanggal) {

                
                $kal = @$kalender_jadwal[$tanggal];
                if (isset($kal)) {
                    switch (@$kal) {
                        case 'cuti':
                            $status = "cuti";
                            break;
                        case 'work':
                            $status = "work-day";
                            break;
                        case 'off':
                            $status = "day-off";
                            break;
                        default:
                            $status = @$kal;
                            break;
                    }

                } else {
                    if (isset($details[$tanggal]) && $details[$tanggal] != null) {
                        $status = $details[$tanggal]->status_kerja;
                    } else {
                        $haris[$jadwal->id][] = null;
                    }
                }

                if (count($izins) > 0) {
                    $izins->each(function ($izin) use ($tanggal, &$status) {
                        $tglIzin = new DateTime($izin['tanggal_izin']);
                        if ($tglIzin->format("Y-m-d") == $tanggal && $izin['status'] == "accept") {
                            $status = $izin->jenis_izin;
                        }
                    });
                }

                if (isset($details[$tanggal])) {
                    $newDetail = $details[$tanggal]->toArray();
                    $newDetail['status_kerja'] = $status;
                    $haris[$jadwal->id][] = (object) $newDetail;
                }

            }

        }



        return $haris;
    }


    //untuk mengecek tanggal yang diinputkan apakah masuk detail jadwal kerja yang mana
    public static function checkJadwalTanggal($karyawan_id, $tanggal, $waktu = null)
    {


        $hariIni = new DateTime(date("Y-m-d", strtotime($tanggal)));
        if ($waktu) {
            $input = date("H:i:00", strtotime($waktu));
        } else {
            $input = date("H:i:00");
        }

        if (is_integer($karyawan_id)) {
            $karyawan = Karyawan::with('jadwal_kerja.jadwal_kerja_detail')->find($karyawan_id);
        } else {
            $karyawan = $karyawan_id;
        }
        $jadwal_kerja_id = 0;
        $last_absen = $karyawan->absensi()->whereDate('tanggal_absen', $tanggal)->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);
        $jadwals = JadwalKerjaDetail::with('jadwal_kerja')->has('jadwal_kerja')
            ->selectRaw("*,CASE WHEN jam_masuk < TIME('" . $input . "') THEN TIMEDIFF('" . $input . "', jam_masuk)
            ELSE TIMEDIFF(jam_masuk, '" . $input . "')
       END as _diff")
            ->whereIn('jadwal_kerja_id', $karyawan->jadwal_kerja->pluck('id')->toArray())
            // ->where('status_kerja', 'work-day')
            ->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($last_absen && $ci){
            //     if($)
            // }

            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);
                //jam masuk lebih besar dari jam pulang, tambahkan 1 hari kedepan
                if ($f > $t)
                    $t->modify('+1 day');

                //jika jam masuk kurang/sama dengan jam sekarang dan jam sekarang kurang/sama dengan jam pulang
                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 if ($jadwal_kerja_id == $detail->jadwal_kerja_id) {
                    $jadwalKerjaDetail = $detail;
                    break;
                }
            }

        }

        if ($jadwalKerjaDetail == null) {
            $jadwalKerjaDetail = $jadwals->first();
        }

        return $jadwalKerjaDetail;
    }

    // @param $tanggal_mulai_kerja = tanggal mulai kerja karyawan
    // @param $jadwal_kerja_detail = array model detail jadwal kerja
    // @param $tanggal = tanggal yang ingin dicek
    // @param $last_absen = model absensi terakhir karyawan
    // @param $last_ci = model riwayat absensi check in terakhir karyawan
    // @param $last_co = model riwayat absensi check out terakhir karyawan
    public static function checkJadwalTanggalRaw($tanggal_mulai_kerja, $jadwal_kerja_detail, $tanggal, $last_absen = null, $last_ci = null, $last_co = null)
    {


        $hariIni = new DateTime(date("Y-m-d", strtotime($tanggal)));
        $input = date("H:i:00");

        $jadwal_kerja_id = 0;

        $ci = null;
        if ($last_absen) {
            $ci = $last_ci;
            $co = $last_co;
            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($tanggal_mulai_kerja);
        $jadwals = $jadwal_kerja_detail;

        $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($last_absen && $ci){
            //     if($)
            // }

            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);
                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 if ($jadwal_kerja_id == $detail->jadwal_kerja_id) {
                    $jadwalKerjaDetail = $detail;
                    break;
                } else {
                    $jadwalKerjaDetail = $detail;
                    break;
                }
            }

        }

        return $jadwalKerjaDetail;
    }


    public static function jumlahPermintaanIzin()
    {   

        $datas = Izin::with('karyawan')->where('status', 'pending');
        $user = auth()->user()->load(['perusahaans','departemen']);
        $departemen_ids = $user->departemen()->pluck('departemen_id')->toArray();
        if (count($departemen_ids) > 0) {
            $datas = $datas->whereHas('karyawan', function ($q) use ($departemen_ids) {
                $q->whereHas("departemen", function ($qd) use ($departemen_ids) {
                    $qd->whereIn('id', $departemen_ids);
                });
            });
        }
        if (count($user->perusahaans) > 0) {
            $datas = $datas->whereHas('karyawan', function ($q) use ($user) {
                $q->whereHas('perusahaans',function($w)use($user){
                    $w->whereIn('perusahaan_id', $user->perusahaans->pluck('id')->toArray());
                });
            });
        }
        return $datas->count();
    }

    //mendapatkan ip public dari user yang melakukan request
    public static function getIp()
    {
        $ip = "";
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        $ip = explode(",", $ip);
        return $ip[0];
    }

    public static function addUserLog($keterangan)
    {
        $userLog = UserLog::create([
            'user_id' => Auth::user()->id,
            'keterangan' => $keterangan,
            'ip_address' => self::getIp(),
        ]);
        return $userLog;
    }

    public static function addKaryawanLog($karyawan_id, $keterangan)
    {
        try {
            $userLog = KaryawanLog::create([
                'karyawan_id' => $karyawan_id,
                'keterangan' => $keterangan
            ]);
        } catch (\Throwable $th) {
            $userLog = null;
        }
        return $userLog;
    }

    //menghitung jarak anntara 2 koodinat
    public static function distance($lat1, $lon1, $lat2, $lon2)
    {
        $R = 6378137; // Radius bumi dalam meter
        $dLat = deg2rad($lat2 - $lat1); // deg2rad konversi dari derajat ke radian
        $dLong = deg2rad($lon2 - $lon1);
        $a = sin($dLat / 2) * sin($dLat / 2) +
            cos(deg2rad($lat1)) * cos(deg2rad($lat2)) *
            sin($dLong / 2) * sin($dLong / 2);
        $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
        $d = $R * $c; // Jarak dalam meter
        return $d; // Hasilnya dalam meter
    }

    public static function sendPushNotification($to, $title, $body)
    {
        if ($to === "" || $to === null) {
            return "nomor hp kosong";
        }
        $client = new Client();

        $headers = [
            'Content-Type' => 'application/json',
            'Authorization' => 'key=AAAADIa2UHk:APA91bGL6pdLy4tHza22Yz48m5c_3vaJHFUp-eXlyKEo_pvXmn8mRPZ0vf7hRc1Y2AMwWRV1XPQ9Rv1DCSbVaBYOXe6S9ezr8BAUfLhoAFpcMNjR9tIvchjG0Cu_JYeDn52q0GVbVjk0',
        ];

        $body = [
            'to' => $to,
            'notification' => [
                "priority" => "high",
                'title' => $title,
                'body' => $body,
                'sound' => 'default'
            ],
            'data' => [
                "priority" => "high",
                'title' => $title,
                'sound' => 'default',
                'body' => $body,
            ]
        ];

        $response = $client->request('POST', 'https://fcm.googleapis.com/fcm/send', [
            'headers' => $headers,
            'body' => json_encode($body),
        ]);
        return $response->getBody()->getContents();
    }

    //run exiftool command
    public static function runExifTool($command)
    {
        $os = strtoupper(substr(PHP_OS, 0, 3));
        $path = storage_path('app/exiftool');

        //if folder doesn't exist trhow error
        if (!file_exists($path)) {
            throw new \Exception("Exiftool not found");
        }
        if ($os == "WIN") {
            $path = $path . "/windows/exiftool.exe";
        } else {
            $path = $path . "/linux/exiftool";
        }
        $output = shell_exec($path . "" . $command);
        return json_decode($output);
    }

    public static function optimizeImage($path)
    {   
        $oldPath = str_replace("//","/",$path);
        $checkSize = filesize($oldPath) / 1024 / 1024;
        if($checkSize < 1){
            return str_replace(storage_path('app'), '', $oldPath); 
        }
        
       
        $newPath = null;
        try {

            $info = getimagesize($oldPath);

            $exif = null;

            
            if ($info['mime'] == 'image/jpeg') {
                $exif = exif_read_data($oldPath);
                $image = imagecreatefromjpeg($oldPath);
            } elseif ($info['mime'] == 'image/gif') {
                $image = imagecreatefromgif($oldPath);
            } elseif ($info['mime'] == 'image/png') {
                $png_metadata = new PNGMetadata($oldPath);
                $exif = $png_metadata->toArray();
                $image = imagecreatefrompng($oldPath);
            } elseif ($info['mime'] == 'image/webp') {
                $image = imagecreatefromwebp($oldPath);
            } else {

                $image = imagecreatefromstring(file_get_contents($oldPath));
            }
            if (isset($image)) {
                $takenDate = null;
                $metaData = [];
                if ($exif != null && $exif != false) {

                    if (array_key_exists('DateTime', $exif)) {
                        $takenDate = new DateTime($exif['DateTime']);
                    } else if (array_key_exists('Creation Time', $exif)) {
                        $takenDate = new DateTime($exif['Creation Time'][""]);
                    } else if (array_key_exists('FileDateTime', $exif)) {
                        $takenDate = new DateTime($exif['FileDateTime']);
                    } else if (array_key_exists('DateTaken', $exif)) {
                        $takenDate = new DateTime($exif['DateTaken']);
                    }

                    $exclude = ["ComponentsConfiguration","UserComment"];
                    $include = ["FileDateTime","Make","Model","Software","DateTime","DateTaken"];
                    foreach ($exif as $key => $value) {
                        if(is_string($value) && !is_array($value) && $value != null && !preg_match('/[\x00]/', $value) && !str_contains((string)$value,"\x")){
                            $metaData[$key] = (string)$value;
                        }
                    }

                } else {
                    throw new \Exception("Not found exif data");
                }

                //set exif taken date with runExifTool
                if ($takenDate != null) {
                    //change extension to jpg
                    $newPath = str_replace(pathinfo($oldPath, PATHINFO_EXTENSION), 'jpg', $oldPath);

                    imagejpeg($image, $newPath, 75);
                    $command = " -overwrite_original -DateTimeOriginal=\"" . $takenDate->format('Y:m:d H:i:s') . "\" ";

                    foreach ($metaData as $key => $value) {
                        $command .= '-'.$key.'="'.$value.'" ';
                    }

                    $command .=  " ".$newPath;
                   
                    self::runExifTool($command);
                    
                } 
                
                else {
                    
                    // $command = " -overwrite_original -DateTimeOriginal=\"" . date('Y:m:d H:i:s') . "\" " . $newPath;
                    // self::runExifTool($command);
                    $newPath = null;
                }

                if($newPath == $oldPath){
                    $oldPath = null;
                }
            } else {
                throw new \Exception("Not found image");
            }
        } catch (\Throwable $th) {
            //throw $th;
            Log::error($th);
            return str_replace(storage_path('app/'), '', $path);
        }
        if ($newPath != null) {
            //delete old file
            if ($oldPath != null && file_exists($oldPath)) {
                unlink($oldPath);
            }
            return str_replace(storage_path('app'), '', $newPath);
        } else {
            return str_replace(storage_path('app'), '', $path);
        }
    }

  

}

Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]