diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index 4fadcfb..b3ed763 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -113,7 +113,28 @@ class CustomerController extends Controller public function importCustomer(Request $request) { - Excel::import(new CustomerImport, request()->file('file')); - return redirect()->route('dashboard.customer.index')->with('success', 'Data customer berhasil Di Import'); + $import = new CustomerImport; + + try { + Excel::import($import, request()->file('file')); + + if ($import->getRowCount() > 0) { + return redirect()->route('dashboard.customer.index')->with('success', 'Data Customer berhasil diimport'); + } else { + $errors = $import->getErrors(); + + if (!empty($errors)) { + session()->flash('error', $errors); + } + + return redirect()->back()->with('import', $import)->with('error', 'Data Customer gagal di import.'); + } + } catch (\Maatwebsite\Excel\Validators\ValidationException $e) { + $failures = $e->failures(); + + foreach ($failures as $failure) { + session()->flash('error', ['Baris ' . $failure->row() => implode(', ', $failure->errors())]); + } + } } } diff --git a/app/Http/Controllers/DisposalController.php b/app/Http/Controllers/DisposalController.php index 0d7e07b..59c2174 100644 --- a/app/Http/Controllers/DisposalController.php +++ b/app/Http/Controllers/DisposalController.php @@ -6,7 +6,9 @@ use App\Models\Peti; use App\Models\Customer; use App\Models\Disposal; use App\Models\m_warehouse; +use Illuminate\Http\Request; use Symfony\Component\Uid\Uuid; +use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Auth; use App\Http\Requests\Disposal\ValidasiCreateDisposal; use App\Http\Requests\Disposal\ValidasiUpdateDisposal; @@ -164,4 +166,32 @@ class DisposalController extends Controller return redirect()->back()->with('error', 'Data disposal peti gagal dihapus'); } } + + /** + * Search peti by fix_lot + */ + public function autoCompleteSearch(Request $request): JsonResponse + { + $petiData = []; + $customerData = []; + + if ($request->filled('q')) { + $petiData = Peti::select("fix_lot", "id") + ->where('fix_lot', 'LIKE', '%' . $request->get('q') . '%') + ->where(function ($query) { + $query->whereHas('assetStatuses', function ($subquery) { + $subquery->where('status', '!=', 0) + ->where('created_at', '=', function ($maxQuery) { + $maxQuery->selectRaw('MAX(created_at)') + ->from('asset_statuses') + ->whereColumn('peti_id', 'petis.id'); + }); + })->orWhereDoesntHave('assetStatuses'); + }) + ->where('status', 'AKTIF') + ->get(); + } + + return response()->json(['peti' => $petiData, 'customer' => $customerData]); + } } diff --git a/app/Http/Controllers/KondisiPetiController.php b/app/Http/Controllers/KondisiPetiController.php index bc19142..d5faa94 100644 --- a/app/Http/Controllers/KondisiPetiController.php +++ b/app/Http/Controllers/KondisiPetiController.php @@ -69,7 +69,28 @@ class KondisiPetiController extends Controller public function importKondisiPeti(Request $request) { - Excel::import(new KondisiPetiImport, request()->file('file')); - return redirect()->route('dashboard.kondisipeti.index')->with('success', 'Data kondisi peti berhasil di import'); + $import = new KondisiPetiImport; + + try { + Excel::import($import, request()->file('file')); + + if ($import->getRowCount() > 0) { + return redirect()->route('dashboard.kondisipeti.index')->with('success', 'Data Kondisi Peti berhasil diimport'); + } else { + $errors = $import->getErrors(); + + if (!empty($errors)) { + session()->flash('error', $errors); + } + + return redirect()->back()->with('import', $import)->with('error', 'Data Kondisi Peti gagal di import.'); + } + } catch (\Maatwebsite\Excel\Validators\ValidationException $e) { + $failures = $e->failures(); + + foreach ($failures as $failure) { + session()->flash('error', ['Baris ' . $failure->row() => implode(', ', $failure->errors())]); + } + } } } diff --git a/app/Http/Controllers/PeminjamanController.php b/app/Http/Controllers/PeminjamanController.php index a35ab85..f248fcf 100644 --- a/app/Http/Controllers/PeminjamanController.php +++ b/app/Http/Controllers/PeminjamanController.php @@ -9,6 +9,7 @@ use App\Models\asset_status; use App\Models\Kondisi_Peti; use Illuminate\Http\Request; use Symfony\Component\Uid\Uuid; +use Illuminate\Http\JsonResponse; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Auth; use App\Http\Requests\ValidasiCreatePeminjaman; @@ -19,18 +20,6 @@ class PeminjamanController extends Controller /** * Display a listing of the resource. */ - // public function index() - // { - - // $data = [ - // // 'peminjaman' => asset_status::get(), - // 'peminjaman' => asset_status::orderBy('created_at', 'desc')->get(), - // 'warehouse' => m_warehouse::get(), - // 'active' => 'menu-peminjaman', - // ]; - - // return view('dashboard.Peminjaman.index', $data); - // } public function index(Request $request) { $perPage = $request->input('perPage', 5); @@ -220,4 +209,29 @@ class PeminjamanController extends Controller ]; return view('dashboard.Peminjaman.pengembalian', $data); } + + public function autoCompleteSearch(Request $request): JsonResponse + { + $petiData = []; + $customerData = []; + + if ($request->filled('q')) { + $petiData = Peti::select("fix_lot", "id") + ->where('fix_lot', 'LIKE', '%' . $request->get('q') . '%') + ->where(function ($query) { + $query->whereHas('assetStatuses', function ($subquery) { + $subquery->where('status', '!=', 0) + ->where('created_at', '=', function ($maxQuery) { + $maxQuery->selectRaw('MAX(created_at)') + ->from('asset_statuses') + ->whereColumn('peti_id', 'petis.id'); + }); + })->orWhereDoesntHave('assetStatuses'); + }) + ->where('status', 'AKTIF') + ->get(); + } + + return response()->json(['peti' => $petiData, 'customer' => $customerData]); + } } diff --git a/app/Http/Controllers/PetiController.php b/app/Http/Controllers/PetiController.php index 0fc7f08..d69a6ca 100644 --- a/app/Http/Controllers/PetiController.php +++ b/app/Http/Controllers/PetiController.php @@ -24,81 +24,60 @@ class PetiController extends Controller /** * Display a listing of the resource. */ - // public function index() - // { - // $data = [ - // // 'peti' => Peti::orderBy('created_at', 'desc')->get(), - // 'peti' => Peti::orderBy('created_at', 'desc')->get(), - // 'kondisiPeti' => Kondisi_Peti::all(), - // 'active' => 'menu-peti', - // ]; - // return view('dashboard.Master_Data.Manajemen_Peti.Peti.index', $data); - // } - // public function index() - // { - // // $perPage = 10; // Jumlah data per halaman, sesuaikan dengan kebutuhan Anda - - // // $peti = Peti::orderBy('created_at', 'desc')->paginate($perPage); - // $peti = Peti::orderBy('created_at', 'desc')->get(); - // $kondisiPeti = Kondisi_Peti::all(); - - // $data = [ - // 'peti' => $peti, - // 'kondisiPeti' => $kondisiPeti, - // 'active' => 'menu-peti', - // ]; - - // return view('dashboard.Master_Data.Manajemen_Peti.Peti.index', $data); - // } public function index(Request $request) { $perPage = $request->input('perPage', 5); - $query = Peti::select(['petis.*', 'customers.code_customer', 'customers.lot_no', 'type_petis.type', 'type_petis.size_peti', 'm_warehouses.name as warehouse_name']) - ->join('customers', 'customers.id', '=', 'petis.customer_id') - ->join('type_petis', 'type_petis.id', '=', 'petis.tipe_peti_id') - ->join('m_warehouses', 'm_warehouses.id', '=', 'petis.warehouse_id') - ->join('kondisi_petis', 'kondisipeti_id', '=', 'petis.kondisipeti_id') - ->orderBy('petis.created_at', 'desc'); + $query = Peti::with(['customer', 'warehouse', 'tipe_peti', 'kondisipeti', 'transfer', 'assetStatuses']) + ->orderBy('created_at', 'desc'); + // Tambahkan logika pencarian + $search = $request->input('search') ?? ''; // Tambahkan logika pencarian $search = $request->input('search') ?? ''; if ($search) { $query->where(function ($q) use ($search) { - $q->where('petis.fix_lot', 'like', "%$search%") - ->orWhere('petis.created_by', 'like', "%$search%") - ->orWhere('customers.name', 'like', "%$search%") - ->orWhere('m_warehouses.name', 'like', "%$search%") - ->orWhere('customers.code_customer', 'like', "%$search%") - ->orWhere('type_petis.type', 'like', "%$search%") - ->orWhere('type_petis.size_peti', 'like', "%$search%") - ->orWhere('customers.lot_no', 'like', "%$search%") - ->orWhere('kondisi_petis.nama_kondisi', 'like', "%$search%") - ->orWhere('petis.packing_no', 'like', "%$search%") - ->orWhere('petis.status', 'like', "%$search%"); + $q->where('fix_lot', 'like', "%$search%") + ->orWhere('created_by', 'like', "%$search%") + ->orWhereHas('customer', function ($customerQuery) use ($search) { + $customerQuery->where('name', 'like', "%$search%") + ->orWhere('code_customer', 'like', "%$search%") + ->orWhere('lot_no', 'like', "%$search%"); + }) + ->orWhereHas('warehouse', function ($warehouseQuery) use ($search) { + $warehouseQuery->where('name', 'like', "%$search%"); + }) + ->orWhereHas('tipe_peti', function ($tipePetiQuery) use ($search) { + $tipePetiQuery->where('type', 'like', "%$search%") + ->orWhere('size_peti', 'like', "%$search%"); + }) + ->orWhereHas('kondisipeti', function ($kondisiPetiQuery) use ($search) { + $kondisiPetiQuery->where('nama_kondisi', 'like', "%$search%"); + }) + ->orWhere('packing_no', 'like', "%$search%") + ->orWhere('status', 'like', "%$search%"); }); } if ($perPage == 'Semua') { $chunkSize = 100; - $stores = new Collection(); + $petis = new Collection(); $currentPage = 1; - $query->chunk($chunkSize, function ($storesChunk) use ($stores, &$currentPage) { - foreach ($storesChunk as $store) { - $store->setAttribute('i', ($currentPage - 1) * $storesChunk->perPage() + 1); - $stores->push($store); + $query->chunk($chunkSize, function ($petiChunk) use ($petis, &$currentPage) { + foreach ($petiChunk as $peti) { + $peti->setAttribute('i', ($currentPage - 1) * $petiChunk->perPage() + 1); + $petis->push($peti); $currentPage++; } }); } else { - $stores = $query->paginate($perPage); + $petis = $query->paginate($perPage); } $data = [ - // 'peti' => Peti::orderBy('created_at', 'desc')->paginate(10), - 'peti' => $stores, + 'peti' => $petis, 'kondisiPeti' => Kondisi_Peti::all(), - 'i' => ($stores->currentPage() - 1) * $stores->perPage() + 1, + 'i' => ($petis->currentPage() - 1) * $petis->perPage() + 1, 'search' => $search, 'active' => 'menu-peti', ]; @@ -343,9 +322,55 @@ class PetiController extends Controller ); } + // public function importPeti(Request $request) + // { + // $import = new PetiImport; + // Excel::import($import, request()->file('file')); + + // // Cek apakah ada data yang berhasil diimpor + // if ($import->getRowCount() > 0) { + // return redirect()->route('dashboard.peti.index')->with('success', 'Data Peti berhasil diimport'); + // } else { + // $errors = $import->getErrors(); + + // if ($errors) { + // foreach ($errors as $error) { + // foreach ($error->all() as $message) { + // // Tampilkan pesan kesalahan untuk setiap baris + // // Simpan pesan flash dengan kategori 'error' + // session()->flash('error', $message); + // } + // } + // } + + // // Redirect back with import data and error message + // return redirect()->back()->with('import', $import)->with('error', 'Data Import Peti gagal di import.'); + // } + // } public function importPeti(Request $request) { - Excel::import(new PetiImport, request()->file('file')); - return redirect()->route('dashboard.peti.index')->with('success', 'Data peti berhasil di import'); + $import = new PetiImport; + + try { + Excel::import($import, request()->file('file')); + + if ($import->getRowCount() > 0) { + return redirect()->route('dashboard.peti.index')->with('success', 'Data Peti berhasil diimport'); + } else { + $errors = $import->getErrors(); + + if (!empty($errors)) { + session()->flash('error', $errors); + } + + return redirect()->back()->with('import', $import)->with('error', 'Data Peti gagal di import.'); + } + } catch (\Maatwebsite\Excel\Validators\ValidationException $e) { + $failures = $e->failures(); + + foreach ($failures as $failure) { + session()->flash('error', ['Baris ' . $failure->row() => implode(', ', $failure->errors())]); + } + } } } diff --git a/app/Http/Controllers/Report/PetternLotPetiController.php b/app/Http/Controllers/Report/PetternLotPetiController.php index 5e50c9a..7ebd17f 100644 --- a/app/Http/Controllers/Report/PetternLotPetiController.php +++ b/app/Http/Controllers/Report/PetternLotPetiController.php @@ -5,16 +5,75 @@ namespace App\Http\Controllers\Report; use App\Models\Peti; use App\Models\asset_status; use Illuminate\Http\Request; +use Illuminate\Support\Collection; use App\Http\Controllers\Controller; use Maatwebsite\Excel\Facades\Excel; use App\Exports\PetternLotPetiExport; class PetternLotPetiController extends Controller { - public function index() + // public function index() + // { + // $data = [ + // 'peti' => Peti::withTrashed()->get(), + // 'active' => 'menu-Pettern_Lot_Peti' + // ]; + // return view('dashboard.Master_Data.Report.Pattern_lot_peti.index', $data); + // } + public function index(Request $request) { + $perPage = $request->input('perPage', 5); + + $query = Peti::with(['customer', 'warehouse', 'tipe_peti', 'kondisipeti', 'transfer', 'assetStatuses']) + ->orderBy('created_at', 'desc'); + // Tambahkan logika pencarian + $search = $request->input('search') ?? ''; + // Tambahkan logika pencarian + $search = $request->input('search') ?? ''; + if ($search) { + $query->where(function ($q) use ($search) { + $q->where('fix_lot', 'like', "%$search%") + ->orWhere('created_by', 'like', "%$search%") + ->orWhereHas('customer', function ($customerQuery) use ($search) { + $customerQuery->where('name', 'like', "%$search%") + ->orWhere('code_customer', 'like', "%$search%") + ->orWhere('lot_no', 'like', "%$search%"); + }) + ->orWhereHas('warehouse', function ($warehouseQuery) use ($search) { + $warehouseQuery->where('name', 'like', "%$search%"); + }) + ->orWhereHas('tipe_peti', function ($tipePetiQuery) use ($search) { + $tipePetiQuery->where('type', 'like', "%$search%") + ->orWhere('size_peti', 'like', "%$search%"); + }) + ->orWhereHas('kondisipeti', function ($kondisiPetiQuery) use ($search) { + $kondisiPetiQuery->where('nama_kondisi', 'like', "%$search%"); + }) + ->orWhere('packing_no', 'like', "%$search%") + ->orWhere('status', 'like', "%$search%"); + }); + } + + if ($perPage == 'Semua') { + $chunkSize = 100; + $petis = new Collection(); + $currentPage = 1; + + $query->chunk($chunkSize, function ($petiChunk) use ($petis, &$currentPage) { + foreach ($petiChunk as $peti) { + $peti->setAttribute('i', ($currentPage - 1) * $petiChunk->perPage() + 1); + $petis->push($peti); + $currentPage++; + } + }); + } else { + $petis = $query->paginate($perPage); + } + $data = [ - 'peti' => Peti::withTrashed()->get(), + 'peti' => $petis, + 'i' => ($petis->currentPage() - 1) * $petis->perPage() + 1, + 'search' => $search, 'active' => 'menu-Pettern_Lot_Peti' ]; return view('dashboard.Master_Data.Report.Pattern_lot_peti.index', $data); diff --git a/app/Http/Controllers/TransferController.php b/app/Http/Controllers/TransferController.php index 462f4ff..4a35337 100644 --- a/app/Http/Controllers/TransferController.php +++ b/app/Http/Controllers/TransferController.php @@ -3,11 +3,12 @@ namespace App\Http\Controllers; use App\Models\Peti; -use Symfony\Component\Uid\Uuid; use App\Models\Customer; use App\Models\Transfer; use App\Models\m_warehouse; use Illuminate\Http\Request; +use Symfony\Component\Uid\Uuid; +use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Auth; use App\Http\Requests\Transfer\ValidasiCreateTransfer; use App\Http\Requests\Transfer\ValidasiUpdateTransfer; @@ -220,4 +221,30 @@ class TransferController extends Controller return redirect()->back()->with('error', 'Data transfer peti gagal dihapus'); } } + + // Proses select2 autocomplete + public function autoCompleteSearch(Request $request): JsonResponse + { + $petiData = []; + $customerData = []; + + if ($request->filled('q')) { + $petiData = Peti::select("fix_lot", "id") + ->where('fix_lot', 'LIKE', '%' . $request->get('q') . '%') + ->where(function ($query) { + $query->whereHas('assetStatuses', function ($subquery) { + $subquery->where('status', '!=', 0) + ->where('created_at', '=', function ($maxQuery) { + $maxQuery->selectRaw('MAX(created_at)') + ->from('asset_statuses') + ->whereColumn('peti_id', 'petis.id'); + }); + })->orWhereDoesntHave('assetStatuses'); + }) + ->where('status', 'AKTIF') + ->get(); + } + + return response()->json(['peti' => $petiData, 'customer' => $customerData]); + } } diff --git a/app/Http/Controllers/TypePetiController.php b/app/Http/Controllers/TypePetiController.php index 0efeb80..56bb5fa 100644 --- a/app/Http/Controllers/TypePetiController.php +++ b/app/Http/Controllers/TypePetiController.php @@ -113,7 +113,28 @@ class TypePetiController extends Controller public function importTipePeti(Request $request) { - Excel::import(new TipePetiImport, request()->file('file')); - return redirect()->route('dashboard.typepeti.index')->with('success', 'Data tipe peti berhasil di import'); + $import = new TipePetiImport; + + try { + Excel::import($import, request()->file('file')); + + if ($import->getRowCount() > 0) { + return redirect()->route('dashboard.typepeti.index')->with('success', 'Data Tipe Peti berhasil diimport'); + } else { + $errors = $import->getErrors(); + + if (!empty($errors)) { + session()->flash('error', $errors); + } + + return redirect()->back()->with('import', $import)->with('error', 'Data Tipe Peti gagal di import.'); + } + } catch (\Maatwebsite\Excel\Validators\ValidationException $e) { + $failures = $e->failures(); + + foreach ($failures as $failure) { + session()->flash('error', ['Baris ' . $failure->row() => implode(', ', $failure->errors())]); + } + } } } diff --git a/app/Http/Controllers/WarehouseController.php b/app/Http/Controllers/WarehouseController.php index 7f021b5..c4c6964 100644 --- a/app/Http/Controllers/WarehouseController.php +++ b/app/Http/Controllers/WarehouseController.php @@ -4,11 +4,14 @@ namespace App\Http\Controllers; use App\Models\m_warehouse; use Illuminate\Http\Request; +use App\Imports\WarehouseImport; use Illuminate\Support\Facades\Auth; use Maatwebsite\Excel\Facades\Excel; +use Illuminate\Support\Facades\Session; use App\Http\Requests\ValidasiCreateWarehouse; use App\Http\Requests\ValidasiUpdateWarehouse; -use App\Imports\WarehouseImport; +use Maatwebsite\Excel\Exceptions\NoTypeDetectedException; +use Illuminate\Support\Facades\Log; class WarehouseController extends Controller { @@ -26,10 +29,10 @@ class WarehouseController extends Controller /** * Show the form for creating a new resource. */ - public function create() - { - // return view('dashboard.Master_Data.Warehouse.create'); - } + // public function create() + // { + // // return view('dashboard.Master_Data.Warehouse.create'); + // } /** * Store a newly created resource in storage. @@ -54,20 +57,20 @@ class WarehouseController extends Controller /** * Display the specified resource. */ - public function show($id) - { - // dd('oke'); - // return view('dashboard.Master_Data.Warehouse.show'); - } + // public function show($id) + // { + // // dd('oke'); + // // return view('dashboard.Master_Data.Warehouse.show'); + // } /** * Show the form for editing the specified resource. */ - public function edit() - { - // dd('oke'); - // return view('dashboard.Master_Data.Warehouse.edit'); - } + // public function edit() + // { + // // dd('oke'); + // // return view('dashboard.Master_Data.Warehouse.edit'); + // } /** * Update the specified resource in storage. @@ -104,7 +107,28 @@ class WarehouseController extends Controller public function importWarehouse(Request $request) { - Excel::import(new WarehouseImport, request()->file('file')); - return redirect()->route('dashboard.warehouse.index')->with('success', 'Data Warehouse berhasil diimport'); + $import = new WarehouseImport; + + try { + Excel::import($import, request()->file('file')); + + if ($import->getRowCount() > 0) { + return redirect()->route('dashboard.warehouse.index')->with('success', 'Data Warehouse berhasil diimport'); + } else { + $errors = $import->getErrors(); + + if (!empty($errors)) { + session()->flash('error', $errors); + } + + return redirect()->back()->with('import', $import)->with('error', 'Data Warehouse gagal di import.'); + } + } catch (\Maatwebsite\Excel\Validators\ValidationException $e) { + $failures = $e->failures(); + + foreach ($failures as $failure) { + session()->flash('error', ['Baris ' . $failure->row() => implode(', ', $failure->errors())]); + } + } } } diff --git a/app/Imports/CustomerImport.php b/app/Imports/CustomerImport.php index 7381f2d..06f1ecc 100644 --- a/app/Imports/CustomerImport.php +++ b/app/Imports/CustomerImport.php @@ -3,9 +3,11 @@ namespace App\Imports; use App\Models\Customer; +use Illuminate\Support\MessageBag; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Maatwebsite\Excel\Concerns\ToModel; +use Maatwebsite\Excel\Events\AfterImport; use Maatwebsite\Excel\Concerns\WithHeadingRow; class CustomerImport implements ToModel, WithHeadingRow @@ -15,11 +17,37 @@ class CustomerImport implements ToModel, WithHeadingRow * * @return \Illuminate\Database\Eloquent\Model|null */ + + private $rowCount = 0; + private $errors; + public function model(array $row) { + // Pemeriksaan apakah semua kolom yang dibutuhkan ada dalam format yang benar + $requiredColumns = ['name', 'code_customer', 'lot_no', 'no_tlp', 'address']; + + foreach ($requiredColumns as $column) { + if (!array_key_exists($column, $row) || empty($row[$column])) { + $this->errors[] = 'Kolom ' . $column . ' pada baris ' . $this->rowCount . ' tidak boleh kosong.'; + return null; // Abaikan data dengan kolom yang tidak sesuai + } + } + // Mendapatkan informasi pengguna yang sedang login $user = Auth::user(); + // Cek apakah nama warehouse sudah ada dalam database + $existingCustomer = Customer::where('name', $row['name'])->first(); + + if ($existingCustomer) { + // Jika nama warehouse sudah ada, tambahkan pesan kesalahan ke dalam array $errors + $this->errors[] = new MessageBag(['Row ' . $this->rowCount => 'Data Customer sudah ada dalam database.']); + return null; // Abaikan data yang sudah ada + } + + // Increment rowCount setiap kali ada data yang diimpor + $this->rowCount++; + return new Customer([ 'name' => $row['name'], 'code_customer' => $row['code_customer'], @@ -29,4 +57,32 @@ class CustomerImport implements ToModel, WithHeadingRow 'created_by' => $user->fullname, ]); } + + public function registerEvents(): array + { + return [ + AfterImport::class => function (AfterImport $event) { + // Setelah import selesai, kita bisa mengakses semua data yang diimpor + $importedData = $event->getReader()->getDelegate()->getActiveSheet()->toArray(); + + // Lakukan pemeriksaan apakah ada data yang bernilai null dan hapus dari hasil import + $filteredData = array_filter($importedData, function ($row) { + return $row[0] !== null; // Jika nilai kolom pertama tidak null, pertahankan baris tersebut + }); + + // Update hasil import dengan data yang telah difilter + $event->getReader()->getDelegate()->getActiveSheet()->fromArray($filteredData); + }, + ]; + } + + public function getErrors() + { + return $this->errors; + } + + public function getRowCount() + { + return $this->rowCount; + } } diff --git a/app/Imports/KondisiPetiImport.php b/app/Imports/KondisiPetiImport.php index f750a04..e287574 100644 --- a/app/Imports/KondisiPetiImport.php +++ b/app/Imports/KondisiPetiImport.php @@ -4,8 +4,10 @@ namespace App\Imports; use App\Models\Kondisi_Peti; use Illuminate\Support\Collection; +use Illuminate\Support\MessageBag; use Illuminate\Support\Facades\Auth; use Maatwebsite\Excel\Concerns\ToModel; +use Maatwebsite\Excel\Events\AfterImport; use Maatwebsite\Excel\Concerns\ToCollection; use Maatwebsite\Excel\Concerns\WithHeadingRow; @@ -16,15 +18,69 @@ class KondisiPetiImport implements ToModel, WithHeadingRow * * @return \Illuminate\Database\Eloquent\Model|null */ + + private $rowCount = 0; + private $errors; + public function model(array $row) { + // Pemeriksaan apakah semua kolom yang dibutuhkan ada dalam format yang benar + $requiredColumns = ['nama_kondisi', 'deskripsi_kondisi']; + + foreach ($requiredColumns as $column) { + if (!array_key_exists($column, $row) || empty($row[$column])) { + $this->errors[] = 'Kolom ' . $column . ' pada baris ' . $this->rowCount . ' tidak boleh kosong.'; + return null; // Abaikan data dengan kolom yang tidak sesuai + } + } + // Mendapatkan informasi pengguna yang sedang login $user = Auth::user(); + // Cek apakah nama warehouse sudah ada dalam database + $existingKondisiPeti = Kondisi_Peti::where('nama_kondisi', $row['nama_kondisi'])->first(); + + if ($existingKondisiPeti) { + // Jika nama warehouse sudah ada, tambahkan pesan kesalahan ke dalam array $errors + $this->errors[] = new MessageBag(['Row ' . $this->rowCount => 'Data Kondisi Peti sudah ada dalam database.']); + return null; // Abaikan data yang sudah ada + } + + // Increment rowCount setiap kali ada data yang diimpor + $this->rowCount++; + return new Kondisi_Peti([ 'nama_kondisi' => $row['nama_kondisi'], 'deskripsi_kondisi' => $row['deskripsi_kondisi'], 'created_by' => $user->fullname, ]); } + + public function registerEvents(): array + { + return [ + AfterImport::class => function (AfterImport $event) { + // Setelah import selesai, kita bisa mengakses semua data yang diimpor + $importedData = $event->getReader()->getDelegate()->getActiveSheet()->toArray(); + + // Lakukan pemeriksaan apakah ada data yang bernilai null dan hapus dari hasil import + $filteredData = array_filter($importedData, function ($row) { + return $row[0] !== null; // Jika nilai kolom pertama tidak null, pertahankan baris tersebut + }); + + // Update hasil import dengan data yang telah difilter + $event->getReader()->getDelegate()->getActiveSheet()->fromArray($filteredData); + }, + ]; + } + + public function getErrors() + { + return $this->errors; + } + + public function getRowCount() + { + return $this->rowCount; + } } diff --git a/app/Imports/PetiImport.php b/app/Imports/PetiImport.php index 87ea035..4555bc5 100644 --- a/app/Imports/PetiImport.php +++ b/app/Imports/PetiImport.php @@ -3,35 +3,101 @@ namespace App\Imports; use App\Models\Peti; +use App\Models\Customer; +use App\Models\Type_peti; +use App\Models\m_warehouse; +use App\Models\Kondisi_Peti; use Illuminate\Support\Collection; +use Illuminate\Support\MessageBag; use Illuminate\Support\Facades\Auth; use Maatwebsite\Excel\Concerns\ToModel; +use Maatwebsite\Excel\Events\AfterImport; use Maatwebsite\Excel\Concerns\ToCollection; use Maatwebsite\Excel\Concerns\WithHeadingRow; class PetiImport implements ToModel, WithHeadingRow { - /** - * @param array $row - * - * @return \Illuminate\Database\Eloquent\Model|null - */ + private $rowCount = 0; + private $errors; + public function model(array $row) { - // Mendapatkan informasi pengguna yang sedang login + // Pemeriksaan apakah semua kolom yang dibutuhkan ada dalam format yang benar + $requiredColumns = ['tipe_peti_id', 'warna', 'customer_id', 'warehouse_id', 'kondisipeti_id', 'packing_no', 'fix_lot', 'status']; + + foreach ($requiredColumns as $column) { + if (!array_key_exists($column, $row) || empty($row[$column])) { + $this->errors[] = 'Kolom ' . $column . ' pada baris ' . $this->rowCount . ' tidak boleh kosong.'; + return null; // Abaikan data dengan kolom yang tidak sesuai + } + } + $user = Auth::user(); + $existingPeti = Peti::where('fix_lot', $row['fix_lot'])->first(); + + if ($existingPeti) { + $this->errors[] = new MessageBag(['Row ' . $this->rowCount => 'Data Peti sudah ada dalam database.']); + return null; + } + + $tipePeti = Type_peti::firstOrCreate( + ['type' => $row['tipe_peti_id']], + ['size_peti' => 'Default Size', 'description' => 'Default Description'] + ); + + $customer = Customer::firstOrCreate( + ['name' => $row['customer_id']], + ['code_customer' => 'Default Code', 'lot_no' => 'Default Lot No', 'no_tlp' => 'Default No Tlp', 'address' => 'Default Address'] + ); + + $warehouse = m_warehouse::firstOrCreate( + ['name' => $row['warehouse_id']], + ['description' => 'Default Description', 'address' => 'Default Address'] + ); + + $kondisiPeti = Kondisi_Peti::firstOrCreate( + ['nama_kondisi' => $row['kondisipeti_id']], + ['deskripsi_kondisi' => 'Default Deskripsi'] + ); + + $this->rowCount++; + return new Peti([ 'created_by' => $user->fullname, - 'tipe_peti_id' => $row['tipe_peti_id'], + 'tipe_peti_id' => $tipePeti->id, 'warna' => $row['warna'], - 'customer_id' => $row['customer_id'], - 'warehouse_id' => $row['warehouse_id'], + 'customer_id' => $customer->id, + 'warehouse_id' => $warehouse->id, 'date_pembuatan' => now(), - 'kondisipeti_id' => $row['kondisipeti_id'], + 'kondisipeti_id' => $kondisiPeti->id, 'packing_no' => $row['packing_no'], 'fix_lot' => $row['fix_lot'], 'status' => $row['status'], ]); } + + public function registerEvents(): array + { + return [ + AfterImport::class => function (AfterImport $event) { + $importedData = $event->getReader()->getDelegate()->getActiveSheet()->toArray(); + $filteredData = array_filter($importedData, function ($row) { + return $row[0] !== null; + }); + + $event->getReader()->getDelegate()->getActiveSheet()->fromArray($filteredData); + }, + ]; + } + + public function getErrors() + { + return $this->errors; + } + + public function getRowCount() + { + return $this->rowCount; + } } diff --git a/app/Imports/TipePetiImport.php b/app/Imports/TipePetiImport.php index 62d3fae..26a9598 100644 --- a/app/Imports/TipePetiImport.php +++ b/app/Imports/TipePetiImport.php @@ -4,8 +4,10 @@ namespace App\Imports; use App\Models\Type_peti; use Illuminate\Support\Collection; +use Illuminate\Support\MessageBag; use Illuminate\Support\Facades\Auth; use Maatwebsite\Excel\Concerns\ToModel; +use Maatwebsite\Excel\Events\AfterImport; use App\Models\Type_peti as ModelsType_peti; use Maatwebsite\Excel\Concerns\ToCollection; use Maatwebsite\Excel\Concerns\WithHeadingRow; @@ -17,11 +19,37 @@ class TipePetiImport implements ToModel, WithHeadingRow * * @return \Illuminate\Database\Eloquent\Model|null */ + + private $rowCount = 0; + private $errors; + public function model(array $row) { + // Pemeriksaan apakah semua kolom yang dibutuhkan ada dalam format yang benar + $requiredColumns = ['type', 'size_peti', 'description']; + + foreach ($requiredColumns as $column) { + if (!array_key_exists($column, $row) || empty($row[$column])) { + $this->errors[] = 'Kolom ' . $column . ' pada baris ' . $this->rowCount . ' tidak boleh kosong.'; + return null; // Abaikan data dengan kolom yang tidak sesuai + } + } + // Mendapatkan informasi pengguna yang sedang login $user = Auth::user(); + // Cek apakah nama warehouse sudah ada dalam database + $existingTipePeti = Type_peti::where('type', $row['type'])->first(); + + if ($existingTipePeti) { + // Jika nama warehouse sudah ada, tambahkan pesan kesalahan ke dalam array $errors + $this->errors[] = new MessageBag(['Row ' . $this->rowCount => 'Data Tipe peti sudah ada dalam database.']); + return null; // Abaikan data yang sudah ada + } + + // Increment rowCount setiap kali ada data yang diimpor + $this->rowCount++; + return new Type_peti([ 'type' => $row['type'], 'size_peti' => $row['size_peti'], @@ -29,4 +57,32 @@ class TipePetiImport implements ToModel, WithHeadingRow 'created_by' => $user->fullname, ]); } + + public function registerEvents(): array + { + return [ + AfterImport::class => function (AfterImport $event) { + // Setelah import selesai, kita bisa mengakses semua data yang diimpor + $importedData = $event->getReader()->getDelegate()->getActiveSheet()->toArray(); + + // Lakukan pemeriksaan apakah ada data yang bernilai null dan hapus dari hasil import + $filteredData = array_filter($importedData, function ($row) { + return $row[0] !== null; // Jika nilai kolom pertama tidak null, pertahankan baris tersebut + }); + + // Update hasil import dengan data yang telah difilter + $event->getReader()->getDelegate()->getActiveSheet()->fromArray($filteredData); + }, + ]; + } + + public function getErrors() + { + return $this->errors; + } + + public function getRowCount() + { + return $this->rowCount; + } } diff --git a/app/Imports/WarehouseImport.php b/app/Imports/WarehouseImport.php index c0025b2..d7b8d48 100644 --- a/app/Imports/WarehouseImport.php +++ b/app/Imports/WarehouseImport.php @@ -3,9 +3,12 @@ namespace App\Imports; use App\Models\m_warehouse; +use Illuminate\Validation\Rule; use Illuminate\Support\Collection; +use Illuminate\Support\MessageBag; use Illuminate\Support\Facades\Auth; use Maatwebsite\Excel\Concerns\ToModel; +use Maatwebsite\Excel\Events\AfterImport; use Maatwebsite\Excel\Concerns\ToCollection; use Maatwebsite\Excel\Concerns\WithHeadingRow; @@ -16,11 +19,36 @@ class WarehouseImport implements ToModel, WithHeadingRow * * @return \Illuminate\Database\Eloquent\Model|null */ + private $rowCount = 0; + private $errors; + public function model(array $row) { + $requiredColumns = ['name', 'description', 'address']; + + foreach ($requiredColumns as $column) { + if (!array_key_exists($column, $row) || empty($row[$column])) { + $this->errors[] = 'Kolom ' . $column . ' pada baris ' . $this->rowCount . ' tidak boleh kosong.'; + return null; // Abaikan data dengan kolom yang tidak sesuai + } + } + // Mendapatkan informasi pengguna yang sedang login $user = Auth::user(); + // Cek apakah nama warehouse sudah ada dalam database + $existingWarehouse = m_warehouse::where('name', $row['name'])->first(); + + if ($existingWarehouse) { + // Jika nama warehouse sudah ada, tambahkan pesan kesalahan ke dalam array $errors + $this->errors[] = new MessageBag(['Row ' . $this->rowCount => 'Data warehouse sudah ada dalam database.']); + return null; // Abaikan data yang sudah ada + } + + // Increment rowCount setiap kali ada data yang diimpor + $this->rowCount++; + + // Buat model baru jika nama warehouse belum ada return new m_warehouse([ 'name' => $row['name'], 'description' => $row['description'], @@ -28,4 +56,32 @@ class WarehouseImport implements ToModel, WithHeadingRow 'created_by' => $user->fullname, ]); } + + public function registerEvents(): array + { + return [ + AfterImport::class => function (AfterImport $event) { + // Setelah import selesai, kita bisa mengakses semua data yang diimpor + $importedData = $event->getReader()->getDelegate()->getActiveSheet()->toArray(); + + // Lakukan pemeriksaan apakah ada data yang bernilai null dan hapus dari hasil import + $filteredData = array_filter($importedData, function ($row) { + return $row[0] !== null; // Jika nilai kolom pertama tidak null, pertahankan baris tersebut + }); + + // Update hasil import dengan data yang telah difilter + $event->getReader()->getDelegate()->getActiveSheet()->fromArray($filteredData); + }, + ]; + } + + public function getErrors() + { + return $this->errors; + } + + public function getRowCount() + { + return $this->rowCount; + } } diff --git a/resources/views/dashboard/Disposal/create.blade.php b/resources/views/dashboard/Disposal/create.blade.php index 8c7254a..c3f0563 100644 --- a/resources/views/dashboard/Disposal/create.blade.php +++ b/resources/views/dashboard/Disposal/create.blade.php @@ -16,7 +16,8 @@