feat: add console command to import student data from CSV file
This commit is contained in:
parent
c738f4b5c2
commit
b50fa7b240
150
app/Console/Commands/ImportStudentsCommand.php
Normal file
150
app/Console/Commands/ImportStudentsCommand.php
Normal file
@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Enums\IsActive;
|
||||
use App\Enums\RoleEnum;
|
||||
use App\Enums\Sex;
|
||||
use App\Models\Student;
|
||||
use App\Models\User;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class ImportStudentsCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'app:import-students {file=public/Data MHS SI.csv}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Import student data from a CSV file into users and students tables';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$filePath = base_path($this->argument('file'));
|
||||
|
||||
if (! file_exists($filePath)) {
|
||||
$this->error("File not found: {$filePath}");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Handle CSV properly including potential multi-line fields
|
||||
$allRowsData = [];
|
||||
if (($handle = fopen($filePath, 'r')) !== false) {
|
||||
while (($data = fgetcsv($handle, 0, ',')) !== false) {
|
||||
// Skiping empty last rows
|
||||
if (array_filter($data)) {
|
||||
$allRowsData[] = $data;
|
||||
}
|
||||
}
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
$successCount = 0;
|
||||
$errorCount = 0;
|
||||
|
||||
$this->info('Importing student data ('.count($allRowsData).' entities)...');
|
||||
|
||||
foreach ($allRowsData as $index => $data) {
|
||||
if (count($data) < 7) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
DB::transaction(function () use ($data, &$successCount) {
|
||||
$fullName = trim($data[0]);
|
||||
$studentNumber = trim($data[1]);
|
||||
$phoneNumber = trim($data[2]);
|
||||
$sexRaw = trim($data[3]);
|
||||
$placeOfBirth = trim($data[4]);
|
||||
$dobRaw = trim($data[5]);
|
||||
$address = trim($data[6]);
|
||||
|
||||
if (empty($fullName) || empty($studentNumber)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Mapping sex
|
||||
$sex = str_contains(strtolower($sexRaw), 'perempuan') ? Sex::Female : Sex::Male;
|
||||
|
||||
// Mapping Date Of Birth
|
||||
try {
|
||||
$dateOfBirth = Carbon::parse($dobRaw)->format('Y-m-d');
|
||||
} catch (\Exception $e) {
|
||||
$dateOfBirth = '2000-01-01';
|
||||
}
|
||||
|
||||
// Create/Restore User
|
||||
$user = User::withTrashed()->updateOrCreate(
|
||||
['username' => $studentNumber],
|
||||
[
|
||||
'email' => $studentNumber.'@student.ac.id',
|
||||
'password' => Hash::needsRehash($studentNumber) ? Hash::make($studentNumber) : $studentNumber,
|
||||
'is_active' => IsActive::Active,
|
||||
]
|
||||
);
|
||||
|
||||
if ($user->trashed()) {
|
||||
$user->restore();
|
||||
}
|
||||
|
||||
// Rehash password if newly created or needs it
|
||||
if ($user->wasRecentlyCreated) {
|
||||
$user->update(['password' => Hash::make($studentNumber)]);
|
||||
}
|
||||
|
||||
// Assign Role (using RoleEnum::Student)
|
||||
try {
|
||||
$user->syncRoles([RoleEnum::Student]);
|
||||
} catch (\Exception $e) {
|
||||
// ignore role error if not exists
|
||||
Log::warning("Could not assign role to user {$studentNumber}: ".$e->getMessage());
|
||||
}
|
||||
|
||||
// Create/Restore Student
|
||||
$student = Student::withTrashed()->updateOrCreate(
|
||||
['student_number' => $studentNumber],
|
||||
[
|
||||
'user_id' => $user->id,
|
||||
'full_name' => $fullName,
|
||||
'phone_number' => '0'.$phoneNumber,
|
||||
'sex' => $sex,
|
||||
'address' => $address,
|
||||
'date_of_birth' => $dateOfBirth,
|
||||
'place_of_birth' => $placeOfBirth,
|
||||
]
|
||||
);
|
||||
|
||||
if ($student->trashed()) {
|
||||
$student->restore();
|
||||
}
|
||||
|
||||
$successCount++;
|
||||
});
|
||||
} catch (\Exception $e) {
|
||||
$this->error('Error at row '.($index + 1).': '.$e->getMessage());
|
||||
Log::error('Import Row Error: '.$e->getMessage());
|
||||
$errorCount++;
|
||||
}
|
||||
}
|
||||
|
||||
$this->newLine();
|
||||
$this->info("Import completed: {$successCount} Success, {$errorCount} Errors.");
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
51
public/Data MHS SI.csv
Normal file
51
public/Data MHS SI.csv
Normal file
@ -0,0 +1,51 @@
|
||||
Teguh Budi Harto,2457201032,81990384149,Laki Laki,Trenggalek,1978-07-25,Jln Anis 3 Blok C5.39 RT.11 RW.13 Perum Bukit Panorama Indah Ciseureuh Purwakarta
|
||||
Riyan Ardiansyah,2457201037,8.82001E+11,Laki Laki,Purwakarta,2006-06-05,Bandung
|
||||
Nurdin,2457201024,83195796437,Laki Laki,Purwakarta,2005-07-09,PURWAKARTA
|
||||
Julio Sandra,2457201018,89519340176,Laki Laki,Padang,2003-07-17,Purwakarta
|
||||
Dede rohmat,2457201026,85213590894,Laki Laki,Subang,2000-06-14,"Karawang
|
||||
Karawang"
|
||||
Suparjono,2457201052,82310975015,Laki Laki,Boyolali,1979-01-07,"Perum. Bukit Panorama Indah
|
||||
Blok C5 no.50
|
||||
RT 11 RW 13
|
||||
Ciseureuh
|
||||
Purwakarta"
|
||||
Abdulah Syauki,2457201019,83116672027,Laki Laki,Subang,2005-10-08,Kp. Sukajaya Ds. Wanakerta Kec. Purwadadi Kab. Subang Jawa Barat
|
||||
Dicky permana,2457201009,83148505597,Laki Laki,KABUPATEN PURWAKARTA,2006-02-21,Kp. Cikakak RT/RW 009/005 Des. Batutumpang Kec. Tegalwaru
|
||||
AHMAD GINANJAR,2457201038,87824493963,Laki Laki,Purwakarta,1999-09-04,Ds. Legokhuni 006/002 Kec. Wanayasa Kab. Purwakarta
|
||||
Nanang Setiawan,2457201029,85759072373,Laki Laki,Ngawi,1987-03-06,Perum panorama indah
|
||||
Nurisa Istiqomah,2457201002,85721146920,Perempuan,Purwakarta,2006-06-11,"Jln. Pramuka no.11, RT/RW: 001/001 Ds Bunder, Kec. Jatiluhur, Kab. Purwakarta - 41152 Jawa Barat"
|
||||
Siti Nurlaela,2457201022,85711657143,Perempuan,Karawang,2004-12-08,Karawang
|
||||
Yoga Pangestu,2457201008,72121495806,Laki Laki,Subang,2005-03-13,Purwakarta
|
||||
Siti Aminah,2457201025,83147598816,Perempuan,Purwakarta,2005-05-09,Purwakarta
|
||||
Rendy Handana,2457201005,87782861989,Laki Laki,Karawang,1989-06-06,Gg Mawar Purwakarta
|
||||
Tiara Dea Eka Pratiwi,2457201023,83159389815,Perempuan,Purwakarta,2006-07-05,Purwakarta
|
||||
Firdaus Fadhilah,2457201014,82111193100,Laki Laki,Purwakarta,2001-05-02,"Lelilef Sawai, Kec. Weda Tengah, Kab. Halmahera Tengah, Prov. Maluku Utara"
|
||||
UJANG FINA ABDUL FATAH,2457201001,85846002358,Laki Laki,Purwakarta,2004-07-18,Kp. Ciwareng kulon RT.10/RW.04 Ds. Cibogo girang
|
||||
Azhari Fikri,2457201039,83829951942,Laki Laki,Purwakarta,2004-12-02,"Purwakarta, Kec.Wanayasa, Ds.Wanasari"
|
||||
Robi Repaldo,2457201004,8993118873,Laki Laki,SUBANG,2004-09-27,SUBANG
|
||||
Fajar Karismawan,2457201033,83102038013,Laki Laki,Subang,2005-04-30,Wanayasa
|
||||
Nazla Khoerun Nisa,2457201020,83816319230,Perempuan,Purwakarta,2004-04-30,Kp. Cipinang 09/04 Ds. Cipinang Kec. Cibatu Kab. Purwakarta
|
||||
denna agustin,2457201017,85938650364,Perempuan,purwakarta,2026-03-29,purwakarta
|
||||
Nina Man Aida,2457201040,8315878103,Perempuan,Ciamis,1999-10-25,Dsn.Cisodong Rt.035 Rw.008 Ds.Sindangsari Kec.Cimerak Kab.Pangandaran
|
||||
Agung sri aprilianto,2457201016,83821988145,Laki Laki,Purwakarta,1993-04-04,Kp.krajan rt 001 rw 002 desa situ kec.pondoksalam kab purwakarta
|
||||
Saras Ayuwati,2457201028,85314092893,Perempuan,Ciamis,1998-11-21,"Kebon Jeruk, Jakarta"
|
||||
Muhamad Abdul Rohan,2457201011,83861811988,Laki Laki,Purwakarta,2005-12-29,Wanayasa
|
||||
Rizki Saepuloh,2457201021,85218384590,Laki Laki,Sumedang,2004-05-12,Purwakarta
|
||||
Putri Widiyanti Rohman,2457201055,85715425723,Perempuan,Grobogan,1999-11-11,"Jl Masjid Al Abror, Tangerang Selatan"
|
||||
Abdul Azis Alfarizy,2857201044,83829951981,Laki Laki,Purwakarta,2006-06-17,"Purwakarta, wanayasa"
|
||||
Abdul Walid,2457201043,83141324836,Laki Laki,Purwakarta,2004-09-04,Wanayasa purwakarta
|
||||
Dika Zainal Aspia,2457201015,8383451545,Laki Laki,Purwakarta,2002-12-15,Kp. Sukajaga RT. 09/04 Desa. Cihajawar Kec. Bojong
|
||||
Muhammad Nuryana Iskandar,2457201048,85703573107,Laki Laki,Bandung,1999-06-02,Jl. Sekeloa No. 151/152c RT03 RW05 Kelurahan Sekeloa Kecamatan Coblong Kota Bandung Provinsi Jawa Barat 40134
|
||||
Gilang Rivaldy,2457201049,83824862809,Laki Laki,Purwakarta,2004-08-19,"GG.salim, RT02/ RW01
|
||||
Kel.MunjulJaya
|
||||
Kab.Purwakarta"
|
||||
Muhammad Zacky Alghifari,2457201053,83168283392,Laki Laki,Purwakarta,2005-04-27,"Ds. Linggamukti, Kec. Darangdan, Kab. Purwakarta."
|
||||
DONI SETIAWAN RAMADHAN,2457201007,85793462823,Laki Laki,PURWAKARTA,2004-10-30,"KP. TEGAL KELAPA, DESA CITEKO, KEC PLERED, KAB PURWAKARTA"
|
||||
Dava Rifandi,2457201013,85220637953,Laki Laki,18 agustus 2006,2006-08-18,Jl. Sekeloa utara no 183/152c Kota Bandung
|
||||
Luqman Nurhuda,2457201050,8.81022E+11,Laki Laki,Bandung,2000-02-12,Jl. Sekeloa Utara no 11b RT04 rw05 kelurahan sekeloa kecamatan Coblong kota bandung
|
||||
Lisnawati,2457201006,85624430269,Perempuan,Tasikmalaya,2002-04-25,"Campaka, Purwakarta"
|
||||
MUHAMMAD BASITH ARRASYID,2457201031,89518782297,Laki Laki,PURWAKARTA,1995-11-11,PURWAKARTA
|
||||
Muhamad Agus Saepudin,2457201012,895402277699,Laki Laki,Purwakarta,1992-08-11,Perumahan Griya Ebony Campaka Purwakarta
|
||||
Lusi Kusnaeni,2457201054,81548791826,Perempuan,Boyolali,1998-09-10,"Bakulan , RT 02 RW 04, Jelok, Cepogo, Boyolali, Jawa Tengah"
|
||||
HILMAN ALBAR,2457201030,87844729757,Laki Laki,SUBANG,2005-02-17,Marengmang - Kalijati - Subang
|
||||
Asep Irawan,2457201003,81546505033,Laki Laki,Purwakarta,2005-09-24,Kiarapedes
|
||||
|
Loading…
Reference in New Issue
Block a user