Anons79 Mini Shell

Directory : /home/aplikasiposinfo/public_html/talent.gosepakat.id/app/Imports/
Upload File :
Current File : /home/aplikasiposinfo/public_html/talent.gosepakat.id/app/Imports/PesertasImport.php

<?php

namespace App\Imports;

use App\Jobs\SendNotifWa;
use App\Models\District;
use App\Models\Pelatihan;
use App\Models\PelatihanPeserta;
use App\Models\Peserta;
use App\Models\Regency;
use App\Models\User;
use DateTime;
use Hash;
use Log;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithCalculatedFormulas;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;

class PesertasImport implements ToModel, WithMultipleSheets, WithCalculatedFormulas
{

    private $columnIndex = [
        'nama_lengkap' => -1,
        'email' => -1,
        'alamat' => -1,
        'no_hp' => -1,
        'tanggal_lahir' => -1,
        'tempat_lahir' => -1,
        'jenis_kelamin' => -1,
        'nik' => -1,
        'npwp' => -1,
        'foto_profil' => -1,
        'status_pekerjaan' => -1,
        'bidang_pekerjaan' => -1,
        'tempat_bekerja' => -1,
        'status_kawin' => -1,
        'agama' => -1,
        'kecamatan_id' => -1,
        'kabupaten_id' => -1,
        'usia' => -1,
        'pelatihan' => -1,
    ];

    private $kaltim = [
        '6401' => 'Kabupaten Paser',
        '6402' => 'Kabupaten Kutai Kartanegara',
        '6403' => 'Kabupaten Berau',
        '6407' => 'Kabupaten Kutai Barat',
        '6408' => 'Kabupaten Kutai Timur',
        '6409' => 'Kabupaten Penajam Paser Utara',
        '6411' => 'Kabupaten Mahakam Ulu',
        '6471' => 'Kota Balikpapan',
        '6472' => 'Kota Samarinda',
        '6474' => 'Kota Bontang'
    ];

    public $fileName = "";
    public $tahun = "2025";
    public $createLogin = false;

    public $passwordKostum = null;

    public $errors = [];
    public $totalImport = 0;

    public function sheets(): array
    {
        return [
            0 => $this,
        ];
    }


    private function cleanKabupatenKota($nama)
    {
        $nama = strtolower($nama);
        if (str_contains($nama, "kutim") || str_contains($nama, "kutai timur")) {
            return "KABUPATEN KUTAI TIMUR";
        }

        if (str_contains($nama, "kubar") || str_contains($nama, "kutai barat")) {
            return "KABUPATEN KUTAI BARAT";
        }
        if (str_contains($nama, "kukar")) {
            return "KABUPATEN KUTAI KARTANEGARA";
        }
        if (str_contains($nama, "mahulu")) {
            return "KABUPATEN MAHAKAM ULU";
        }

        if (str_contains($nama, "ppu")) {
            return "KABUPATEN PENAJAM PASER UTARA";
        }
        if (str_contains($nama, "kab.")) {
            return str_replace("kab.", "KABUPATEN ", $nama);
        }
        if (!str_contains($nama, "kota")) {
            return "KOTA " . $nama;
        }

        return $nama;
    }

    private function cleanKecamataan($nama)
    {
        $nama = strtolower($nama);
        $nama = str_replace("kec.", "", $nama);
        $nama = str_replace("kecamatan", "", $nama);
        return trim($nama);
    }

    private function konversiBulan($bulanIndo)
    {
        $bulanIndo = strtolower(trim($bulanIndo));

        // Array mapping bulan Indonesia ke Inggris
        $namaBulan = [
            'januari' => 'January',
            'februari' => 'February',
            'maret' => 'March',
            'april' => 'April',
            'mei' => 'May',
            'juni' => 'June',
            'juli' => 'July',
            'agustus' => 'August',
            'september' => 'September',
            'oktober' => 'October',
            'november' => 'November',
            'desember' => 'December',
            // Menambahkan alternatif penulisan
            'pebruari' => 'February',
            'nopember' => 'November'
        ];

        // Cek apakah bulan ada dalam array
        if (array_key_exists($bulanIndo, $namaBulan)) {
            return $namaBulan[$bulanIndo];
        }
        return $bulanIndo;
    }

    private function cleanTanggal($tanggal)
    {

        $namaBulan = [
            'januari' => 'January',
            'februari' => 'February',
            'maret' => 'March',
            'april' => 'April',
            'mei' => 'May',
            'juni' => 'June',
            'juli' => 'July',
            'agustus' => 'August',
            'september' => 'September',
            'oktober' => 'October',
            'november' => 'November',
            'desember' => 'December',
            'pebruari' => 'February',
            'nopember' => 'November'
        ];

        $cek = explode(",", $tanggal);
        if (count($cek) > 1) {
            $tanggal = $cek[1];
        } else {
            $cek = explode(" ", $tanggal);
            if (count($cek) > 1) {
                if (preg_match("/[a-z]/i", $cek[0])) {
                    $tanggal = str_replace($cek[0], "", $tanggal);
                }
            }
        }

        foreach ($namaBulan as $k => $m) {
            $tanggal = trim(str_replace($k, $m, strtolower($tanggal)));
        }
        $dateFormats = [
            'd F Y', // e.g., 20 January 2025
            'd-m-Y', // e.g., 20-02-2025
            'Y/m/d', // e.g., 2025/01/20
            // Add more formats as needed
        ];

        $date = null;

        // Try to parse the date using each format
        foreach ($dateFormats as $format) {
            $date = DateTime::createFromFormat($format, $tanggal);
            if ($date) {
                break;
            }
        }

        if ($date) {
            // Convert the date to a standard format (e.g., Y-m-d for MySQL)
            return $date->format('Y-m-d');

        } else {
            if ($this->isValidDate($tanggal)) {
                return $tanggal;
            } else {
                return null;
            }

        }
    }


    private function ekstrakNik($nik)
    {
        // Pastikan NIK memiliki 16 digit
        if (strlen($nik) != 16 || !is_numeric($nik)) {
            return "NIK tidak valid";
        }

        // Ambil 6 digit pertama sebagai kode wilayah
        $kodeWilayah = substr($nik, 0, 6);

        // Pisahkan kode wilayah menjadi provinsi, kota/kabupaten, dan kecamatan
        $kodeProvinsi = substr($kodeWilayah, 0, 2);
        $kodeKotaKabupaten = substr($kodeWilayah, 0, 4);
        $kodeKecamatan = substr($kodeWilayah, 4, 2);

        return [
            'kode_provinsi' => $kodeProvinsi,
            'kode_kota_kabupaten' => $kodeKotaKabupaten,
            'kode_kecamatan' => $kodeKecamatan
        ];
    }

    function keepOnlySpecificWords($text, $wordsToKeep)
    {
        // Convert words to keep into an array if it's a string
        if (!is_array($wordsToKeep)) {
            $wordsToKeep = array($wordsToKeep);
        }

        // Convert to lowercase for case-insensitive matching
        $wordsToKeep = array_map('strtolower', $wordsToKeep);

        // Split the text into words
        $words = preg_split('/\s+/', $text);

        // Filter words
        $filteredWords = array_filter($words, function ($word) use ($wordsToKeep) {
            return in_array(strtolower($word), $wordsToKeep);
        });

        // Join the words back together
        return implode(' ', $filteredWords);
    }

    function isValidDate($date)
    {
        return date('Y-m-d', strtotime($date)) === $date;
    }

    /**
     * @param array $row
     *
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    public function model(array $row)
    {

        if ($row[0] == "") {
            return;
        }
        if (strtolower($row[0]) == "timestamp" || strtolower($row[0]) == "nik" || strtolower($row[0]) == "nama") {

            foreach ($row as $k => $r) {
                if (str_contains(strtolower($r), "nama") && $this->columnIndex['nama_lengkap'] == -1 && !str_contains(strtolower($r), "usaha") && !str_contains(strtolower($r), "kerja")) {
                    $this->columnIndex['nama_lengkap'] = $k;
                } else if (str_contains(strtolower($r), "nik") && $this->columnIndex['nik'] == -1) {
                    $this->columnIndex['nik'] = $k;
                } else if (str_contains(strtolower($r), "npwp") && $this->columnIndex['npwp'] == -1) {
                    $this->columnIndex['npwp'] = $k;
                } else if (str_contains(strtolower($r), "tempat lahir") && $this->columnIndex['tempat_lahir'] == -1) {
                    $this->columnIndex['tempat_lahir'] = $k;
                } else if (str_contains(strtolower($r), "tanggal lahir") && $this->columnIndex['tanggal_lahir'] == -1) {
                    $this->columnIndex['tanggal_lahir'] = $k;
                    if (str_contains(strtolower($r), "tempat") && $this->columnIndex['tempat_lahir'] == -1) {
                        $this->columnIndex['tempat_lahir'] = $k;
                    }
                } else if (str_contains(strtolower($r), "usia") && $this->columnIndex['usia'] == -1) {
                    $this->columnIndex['usia'] = $k;
                } else if (str_contains(strtolower($r), "kelamin") && $this->columnIndex['jenis_kelamin'] == -1) {
                    $this->columnIndex['jenis_kelamin'] = $k;
                } else if (str_contains(strtolower($r), "agama") && $this->columnIndex['agama'] == -1) {
                    $this->columnIndex['agama'] = $k;
                } else if (str_contains(strtolower($r), "status") && $this->columnIndex['status_kawin'] == -1) {
                    $this->columnIndex['status_kawin'] = $k;
                } else if ((str_contains(strtolower($r), "telepon") || str_contains(strtolower($r), "handphone") || str_contains(strtolower($r), "no wa") || str_contains(strtolower($r), "no hp")) && $this->columnIndex['no_hp'] == -1) {
                    $this->columnIndex['no_hp'] = $k;
                } else if (str_contains(strtolower($r), "kecamatan") && $this->columnIndex['kecamatan_id'] == -1) {
                    $this->columnIndex['kecamatan_id'] = $k;
                } else if (str_contains(strtolower($r), "kabupaten") && $this->columnIndex['kabupaten_id'] == -1) {
                    $this->columnIndex['kabupaten_id'] = $k;
                } else if (str_contains(strtolower($r), "email") && $this->columnIndex['email'] == -1) {
                    $this->columnIndex['email'] = $k;
                } else if (str_contains(strtolower($r), "alamat") && $this->columnIndex['alamat'] == -1) {
                    $this->columnIndex['alamat'] = $k;
                } else if (str_contains(strtolower($r), "pelatihan") && $this->columnIndex['pelatihan'] == -1) {
                    $this->columnIndex['pelatihan'] = $k;
                }
            }

            return;
        }


        $data = [];
        foreach ($this->columnIndex as $kci => $ci) {
            if ($ci != -1) {
                $data[$kci] = $row[$ci];
            }
        }

        if (!isset($data['nama_lengkap']) || $data['nama_lengkap'] == -1) {
            return;
        }

        $cekNama = explode("\n", $data['nama_lengkap']);
        if (count($cekNama) > 1) {
            return;
        }
        $cekNama = explode(",", $data['nama_lengkap']);
        if (count($cekNama) > 1) {
            return;
        }
        $this->createData($data);
        // return new Peserta($data);
    }

    private function createData($data)
    {

        if (isset($data['kecamatan_id'])) {
            $cek = District::where('name', strtoupper($this->cleanKecamataan($data['kecamatan_id'])))->first();
            if ($cek) {
                $data['kecamatan_id'] = $cek->id;
                $data['kabupaten_id'] = $cek->regency_id;
                $data['provinsi_id'] = $cek->regency->province_id;
            } else {
                $data['kecamatan_id'] = null;
            }
        } else {
            if (isset($data['kabupaten_id'])) {
                $cek = Regency::where('name', strtoupper($this->cleanKabupatenKota($data['kabupaten_id'])))->first();
                if ($cek) {
                    $data['kabupaten_id'] = $cek->id;
                    $data['provinsi_id'] = $cek->province_id;
                } else {
                    $data['kabupaten_id'] = null;
                }
            }
        }


        if (isset($data['nik'])) {
            $data['nik'] = preg_replace("/[^0-9]/", '', $data['nik']);
            $data['nik'] = substr($data['nik'], 0, 20);
        }
        if (isset($data['npwp'])) {
            $data['npwp'] = preg_replace("/[^0-9]/", '', $data['npwp']);
            $data['npwp'] = substr($data['npwp'], 0, 20);
        }
        if (isset($data['usia'])) {
            $data['usia'] = trim(preg_replace("/[^0-9]/", '', $data['usia']));
            if ($data['usia'] == '') {
                $data['usia'] = null;
            } else {
                $data['usia'] = substr($data['usia'], 0, length: 2);
            }
        }
        if (isset($data['no_hp'])) {
            $no_hp = explode("\n", preg_replace("/[^0-9]/", '', $data['no_hp']))[0];
            $cek = explode(" ", $no_hp);
            $data['no_hp'] = substr($no_hp, 0, 12);
        }
        if (isset($data['email'])) {
            $data['email'] = str_replace("-", "", $data['email']);
        }
        if (isset($data['jenis_kelamin'])) {
            $data['jenis_kelamin'] = trim(strtolower(str_replace(" ", "", $data['jenis_kelamin'])));
            if (!str_contains($data['jenis_kelamin'], "laki-laki") && !str_contains($data['jenis_kelamin'], "perempuan") && strtolower($data['jenis_kelamin']) != "l" && strtolower($data['jenis_kelamin']) != "p") {
                $data['jenis_kelamin'] = null;
            } else {
                if(strtolower($data['jenis_kelamin']) == "l") {
                    $data['jenis_kelamin'] = "laki-laki";
                } else if(strtolower($data['jenis_kelamin']) == "p") {
                    $data['jenis_kelamin'] = "perempuan";
                }
            }
        }
        if (isset($data['tanggal_lahir'])) {
            $data['tanggal_lahir'] = $this->cleanTanggal($data['tanggal_lahir']);
        }
        if (isset($data['tempat_lahir'])) {
            $cek = explode(",", $data['tempat_lahir']);
            // $data['tempat_lahir'] = preg_replace('/[^a-zA-Z\s]/', '', $data['tempat_lahir']);
            $data['tempat_lahir'] = $cek[0];
            $data['tempat_lahir'] = preg_replace('/[^a-zA-Z\s]/', '', $data['tempat_lahir']);
        }
        if (isset($data['nik'])) {
            $kode = $this->ekstrakNik($data['nik']);
            if (isset($kode['kode_provinsi']) && (int) $kode['kode_provinsi'] == 64) {
                $data['provinsi_id'] = 64;
                $cek = true;

                if (!isset($data['kabupaten_id']) && isset($this->kaltim[(string) $kode['kode_kota_kabupaten']])) {
                    $cek = Regency::where('name', strtoupper($this->kaltim[(string) $kode['kode_kota_kabupaten']]))->first();
                    if ($cek) {
                        $data['kabupaten_id'] = $cek->id;
                        $data['provinsi_id'] = $cek->province_id;
                    }
                    // $data['kabupaten_id'] = $kode['kode_kota_kabupaten'];
                }
                // if (!isset($data['kabupaten_id'])) {
                //     $data['kecamatan_id'] = $kode['kode_kecamatan'];
                // }
                // if (!isset($data['provinsi_id'])) {
                //     $data['provinsi_id'] = $kode['kode_provinsi'];
                // }
            }
        }
        $user = null;
        if(!isset($data['nik']) || $data['nik'] == ""){
            $this->errors[] = "NIK tidak boleh kosong " . $data['nama_lengkap'];
            return;
        }
        try {
           
            if ($this->createLogin && isset($data['no_hp']) && isset($data['email'])) {
                
                $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
                $charactersLength = strlen($characters);
                $randomPassword = '';

                if ($this->passwordKostum != null) {
                    $randomPassword = $this->passwordKostum;
                } else {
                    // Generate random password
                    for ($i = 0; $i < 8; $i++) {
                        $randomPassword .= $characters[rand(0, $charactersLength - 1)];
                    }
                }

                $user = User::where([
                    'nama' => $data['nama_lengkap'],
                    'email' => $data['email']
                ])->first();

                if(!$user){
                    $user = User::create([
                        'nama' => $data['nama_lengkap'],
                        'email' => $data['email'],
                        'password' => Hash::make($randomPassword),
    
                    ]);
                } else {
                    throw new \Exception("Akun ".$data['nama_lengkap']." sudah terdaftar");
                }
                $data['user_id'] = $user->id;
            }
            $data['tahun'] = $this->tahun;
            $peserta = Peserta::where([
                'nik'=>$data['nik']
            ])->first();

            $usia = @$data['usia'] ?? null;

            if(isset($data['tanggal_lahir']) && $data['tanggal_lahir'] != null && $usia == null){
                $tanggalLahir = new DateTime($data['tanggal_lahir']);
                $sekarang = new DateTime(); // tanggal hari ini
                $usia = $sekarang->diff($tanggalLahir);
                $data['usia'] = $usia->y;
            }
            if(!$peserta){
                $peserta = Peserta::create($data);
            } else {
                $peserta->update($data);
            }
            $this->totalImport++;

            if(isset($data['pelatihan']) && $data['pelatihan'] != ""){
                $cekPelatihan = Pelatihan::where('title',$data['pelatihan'])->first();
                if($cekPelatihan){
                    $exists = PelatihanPeserta::where('pelatihan_id', $cekPelatihan->id)
                        ->where('peserta_id', $peserta->id)
                        ->exists();
                    
                    if (!$exists) {
                        // Add the peserta to the pelatihan
                        PelatihanPeserta::create([
                            'pelatihan_id' => $cekPelatihan->id,
                            'peserta_id' => $peserta->id,
                            'status' => 'approve' // Auto-approve since admin is adding them
                        ]);
                        
                    }
                }
            }

            if ($this->createLogin && isset($data['no_hp']) && isset($data['email']) && env('APP_ENV') !== 'local') {
                $no_hp = $data['no_hp'];
                //check $no_hp have +62
                if (strpos($no_hp, '+62') !== 0) {
                    //if leading zero remove it
                    $no_hp = ltrim($no_hp, '0');
                    $no_hp = '+62' . $no_hp;
                }


                //check if length less than 10
                if (strlen($no_hp) > 10) {
                    dispatch(new SendNotifWa($no_hp, "Anda sudah terdaftar pada website *Talent : " . url("/") . "*\n" . "Silahkan Login Ke Akun Anda.\n" . "Username: " . $data['email'] . "\n" . "Password: " . $randomPassword));
                }

            }

        } catch (\Throwable $th) {
            //throw $th;
            Log::error($th);
            //dd($this->fileName, $th);
            if ($user) {
                $user->delete();
            }
            $this->errors[] = "gagal mengimport " . $data['nama_lengkap'];
        }
    }
}

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