From 3f697d67f5a09b07b8c6c8c37fd6101cb77f25fa Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Fri, 24 Jul 2026 10:14:06 +0530 Subject: [PATCH] Added panel gr master importer and exporter --- .../Exports/PanelGrMasterExporter.php | 60 +++++++ .../Imports/PanelGrMasterImporter.php | 146 ++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 app/Filament/Exports/PanelGrMasterExporter.php create mode 100644 app/Filament/Imports/PanelGrMasterImporter.php diff --git a/app/Filament/Exports/PanelGrMasterExporter.php b/app/Filament/Exports/PanelGrMasterExporter.php new file mode 100644 index 0000000..c0f9f8d --- /dev/null +++ b/app/Filament/Exports/PanelGrMasterExporter.php @@ -0,0 +1,60 @@ +label('NO') + ->state(function ($record) use (&$rowNumber) { + // Increment and return the row number + return ++$rowNumber; + }), + ExportColumn::make('plant.name') + ->label('PLANT NAME'), + ExportColumn::make('item.code') + ->label('ITEM CODE'), + ExportColumn::make('document_number') + ->label('DOCUMENT NUMBER'), + ExportColumn::make('invoice_number') + ->label('INVOICE NUMBER'), + ExportColumn::make('supplier_number') + ->label('SUPPLIER NUMBER'), + ExportColumn::make('quantity') + ->label('QUANTITY'), + ExportColumn::make('created_at') + ->label('CREATED AT'), + ExportColumn::make('updated_at') + ->label('UPDATED AT'), + ExportColumn::make('created_by') + ->label('CREATED BY'), + ExportColumn::make('updated_by') + ->label('UPDATED BY'), + ExportColumn::make('deleted_at') + ->label('DELETED AT') + ->enabledByDefault(false), + ]; + } + + public static function getCompletedNotificationBody(Export $export): string + { + $body = 'Your panel gr master export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.'; + + if ($failedRowsCount = $export->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/PanelGrMasterImporter.php b/app/Filament/Imports/PanelGrMasterImporter.php new file mode 100644 index 0000000..bbfb363 --- /dev/null +++ b/app/Filament/Imports/PanelGrMasterImporter.php @@ -0,0 +1,146 @@ +requiredMapping() + ->exampleHeader('Plant Code') + ->example('1000') + ->label('Plant Code') + ->relationship(resolveUsing: 'code') + ->rules(['required']), + ImportColumn::make('item') + ->requiredMapping() + ->exampleHeader('Item Code') + ->example('630214') + ->label('Item Code') + ->relationship(resolveUsing: 'code') + ->rules(['required']), + ImportColumn::make('document_number') + ->requiredMapping() + ->exampleHeader('Document Number') + ->example('11023567') + ->label('Document Number') + ->rules(['required']), + ImportColumn::make('invoice_number') + ->requiredMapping() + ->exampleHeader('Invoice Number') + ->example('3RAW0012345') + ->label('Invoice Number') + ->rules(['required']), + ImportColumn::make('supplier_number') + ->requiredMapping() + ->exampleHeader('Supplier Number') + ->example('154564564') + ->label('Supplier Number') + ->rules(['required']), + ImportColumn::make('quantity') + ->requiredMapping() + ->exampleHeader('Quantity') + ->example('10') + ->label('Quantity') + ->rules(['required']), + ]; + } + + public function resolveRecord(): ?PanelGrMaster + { + $warnMsg = []; + $plantCod = $this->data['plant']; + $plant = null; + $item = null; + $userName = Filament::auth()->user()?->name; + + if (Str::length($plantCod) < 4 || ! is_numeric($plantCod) || ! preg_match('/^[1-9]\d{3,}$/', $plantCod)) { + $warnMsg[] = 'Invalid plant code found'; + } else { + $plant = Plant::where('code', $plantCod)->first(); + if (! $plant) { + $warnMsg[] = 'Plant not found'; + } else { + $item = Item::where('code', $this->data['item'])->where('plant_id', $plant->id)->first(); + } + if (! $item) { + $warnMsg[] = 'Item not found'; + } + } + + if (empty($this->data['document_number'])) { + $warnMsg[] = 'Document Number cannot be empty.'; + } + + if (Str::length($this->data['invoice_number']) < 7 || ! ctype_alnum($this->data['invoice_number'])) { + $warnMsg[] = 'Invalid invoice number found'; + } + + if (empty($this->data['supplier_number'])) { + $warnMsg[] = 'Supplier Number cannot be empty.'; + } + + if (empty($this->data['quantity'])) { + $warnMsg[] = 'Quantity cannot be empty.'; + } + elseif (!is_numeric($this->data['quantity'])) { + $warnMsg[] = 'Quantity must be a valid number.'; + } elseif ((float) $this->data['quantity'] <= 0) { + $warnMsg[] = 'Quantity must be greater than 0.'; + } + + $existingRecord = PanelGrMaster::where('document_number', $this->data['document_number'])->where('plant_id', $this->data['plant'])->first(); + + if ($existingRecord && $existingRecord->invoice_number != $this->data['invoice_number']) + { + $warnMsg[] = "Document Number '{$this->data['document_number']}' is already associated with Invoice Number '{$existingRecord->invoice_number}'."; + } + + if (! empty($warnMsg)) { + throw new RowImportFailedException(implode(', ', $warnMsg)); + } + + PanelGrMaster::updateOrCreate( + [ + 'plant_id' => $plant->id, + 'item_id' => $item->id, + 'document_number' => $this->data['document_number'], + 'invoice_number' => $this->data['invoice_number'], + 'supplier_number' => $this->data['supplier_number'] ?? null, + ], + [ + 'quantity' => $this->data['quantity'] ?? null, + 'updated_by' => $userName, + 'created_by' => $userName, // Only used when creating + ] + ); + + return null; + // return new PanelGrMaster(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your panel gr master import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +}