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