From 72b90abb66842522c3e31d75b0cc46c3a4d85e09 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 1 Jun 2026 15:02:52 +0530 Subject: [PATCH 1/2] Added visitor entry importer and exporter --- app/Filament/Exports/VisitorEntryExporter.php | 72 +++++++++++++++++++ app/Filament/Imports/VisitorEntryImporter.php | 65 +++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 app/Filament/Exports/VisitorEntryExporter.php create mode 100644 app/Filament/Imports/VisitorEntryImporter.php diff --git a/app/Filament/Exports/VisitorEntryExporter.php b/app/Filament/Exports/VisitorEntryExporter.php new file mode 100644 index 0000000..e48a567 --- /dev/null +++ b/app/Filament/Exports/VisitorEntryExporter.php @@ -0,0 +1,72 @@ +label('NO') + ->state(function ($record) use (&$rowNumber) { + // Increment and return the row number + return ++$rowNumber; + }), + ExportColumn::make('register_id') + ->label('REGISTER ID'), + ExportColumn::make('employeeMaster.name') + ->label('EMPLOYEE NAME'), + ExportColumn::make('mobile_number') + ->label('MOBILE NUMBER'), + ExportColumn::make('name') + ->label('VISITOR NAME'), + ExportColumn::make('company') + ->label('COMPANY'), + ExportColumn::make('purpose_of_visit') + ->label('PURPOSE OF VISIT'), + ExportColumn::make('type') + ->label('TYPE'), + ExportColumn::make('photo') + ->label('PHOTO') + ->enabledByDefault(false), + ExportColumn::make('number_of_person') + ->label('NUMBER OF PERSON'), + ExportColumn::make('in_time') + ->label('IN TIME'), + ExportColumn::make('out_time') + ->label('OUT TIME'), + ExportColumn::make('valid_upto') + ->label('VALID UPTO'), + 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'), + ]; + } + + public static function getCompletedNotificationBody(Export $export): string + { + $body = 'Your visitor entry 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/VisitorEntryImporter.php b/app/Filament/Imports/VisitorEntryImporter.php new file mode 100644 index 0000000..5bc55ef --- /dev/null +++ b/app/Filament/Imports/VisitorEntryImporter.php @@ -0,0 +1,65 @@ +requiredMapping() + ->relationship() + ->rules(['required']), + ImportColumn::make('mobile_number') + ->requiredMapping() + ->numeric() + ->rules(['required', 'integer']), + ImportColumn::make('name'), + ImportColumn::make('company'), + ImportColumn::make('purpose_of_visit'), + ImportColumn::make('type'), + ImportColumn::make('photo'), + ImportColumn::make('number_of_person') + ->numeric() + ->rules(['integer']), + ImportColumn::make('in_time') + ->rules(['datetime']), + ImportColumn::make('out_time') + ->rules(['datetime']), + ImportColumn::make('created_by'), + ImportColumn::make('updated_by'), + ImportColumn::make('register_id'), + ImportColumn::make('valid_upto') + ->rules(['datetime']), + ]; + } + + public function resolveRecord(): ?VisitorEntry + { + // return VisitorEntry::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new VisitorEntry(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your visitor entry 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; + } +} From d9f020171060017034ba3ec9bf4f1101c9d06062 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Mon, 1 Jun 2026 15:03:55 +0530 Subject: [PATCH 2/2] Added import and export action for visitor --- .../Resources/VisitorEntryResource.php | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/app/Filament/Resources/VisitorEntryResource.php b/app/Filament/Resources/VisitorEntryResource.php index 166c5b1..7fe7892 100644 --- a/app/Filament/Resources/VisitorEntryResource.php +++ b/app/Filament/Resources/VisitorEntryResource.php @@ -2,6 +2,8 @@ namespace App\Filament\Resources; +use App\Filament\Exports\VisitorEntryExporter; +use App\Filament\Imports\VisitorEntryImporter; use App\Filament\Resources\VisitorEntryResource\Pages; use App\Filament\Resources\VisitorEntryResource\RelationManagers; use App\Models\VisitorEntry; @@ -18,6 +20,8 @@ use Filament\Infolists\Components\ImageEntry; use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\Section; use Carbon\Carbon; +use Filament\Tables\Actions\ExportAction; +use Filament\Tables\Actions\ImportAction; class VisitorEntryResource extends Resource { @@ -216,10 +220,12 @@ class VisitorEntryResource extends Resource Tables\Columns\TextColumn::make('register_id') ->label('Register ID') ->alignCenter() + ->searchable() ->sortable(), Tables\Columns\TextColumn::make('type') ->label('Visitor Type') ->alignCenter() + ->searchable() ->sortable(), Tables\Columns\TextColumn::make('name') ->label('Visitor Name') @@ -229,14 +235,18 @@ class VisitorEntryResource extends Resource Tables\Columns\TextColumn::make('mobile_number') ->label('Visitor Mobile Number') ->alignCenter() + ->searchable() + ->searchable() ->sortable(), Tables\Columns\TextColumn::make('employeeMaster.name') ->label('Recipient Name') ->alignCenter() + ->searchable() ->sortable(), Tables\Columns\TextColumn::make('employeeMaster.code') ->label('Receipient ID') ->alignCenter() + ->searchable() ->sortable(), Tables\Columns\TextColumn::make('employeeMaster.department') ->label('Receipient Department') @@ -245,20 +255,24 @@ class VisitorEntryResource extends Resource Tables\Columns\TextColumn::make('number_of_person') ->label('Number of Person') ->numeric() + ->searchable() ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('in_time') ->label('In Time') + ->searchable() ->dateTime() ->sortable() ->alignCenter(), Tables\Columns\TextColumn::make('out_time') ->label('Out Time') + ->searchable() ->dateTime() ->sortable() ->alignCenter(), Tables\Columns\TextColumn::make('valid_upto') ->label('Valid Upto') + ->searchable() ->dateTime() ->sortable() ->alignCenter() @@ -298,6 +312,18 @@ class VisitorEntryResource extends Resource Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), + ]) + ->headerActions([ + ImportAction::make() + ->importer(VisitorEntryImporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view import visitor entries'); + }), + ExportAction::make() + ->exporter(VisitorEntryExporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view export visitor entries'); + }), ]); } @@ -323,6 +349,8 @@ class VisitorEntryResource extends Resource // ── Visitor Details ── Section::make('Visitor Details') ->schema([ + TextEntry::make('register_id') + ->label('Register ID'), TextEntry::make('name') ->label('Visitor Name'), TextEntry::make('mobile_number')