requiredMapping() ->exampleHeader('Plant Code') ->example('1000') ->label('Plant Code') ->relationship(resolveUsing: 'code') ->rules(['required']), ImportColumn::make('guardNames') ->requiredMapping() ->exampleHeader('Guard Name') ->example('ARUMUGAM - HG') ->label('Guard Name') ->relationship(resolveUsing: 'name') ->rules(['required']), ImportColumn::make('checkPointNames') ->requiredMapping() ->exampleHeader('Check Point Name') ->example('STP BACKSIDE') ->label('Check Point Name') ->relationship(resolveUsing: 'name') ->rules(['required']), // ImportColumn::make('reader_code') // ->requiredMapping() // ->exampleHeader('Reader Code') // ->example('0C03-25010112') // ->label('Reader Code'), ImportColumn::make('patrol_time') ->requiredMapping() ->exampleHeader('Patrol Time') ->example('01-01-2025 08:00:00') ->label('Patrol Time') ->rules(['required']), // ImportColumn::make('created_by') // ->requiredMapping() // ->exampleHeader('Created By') // ->example(Filament::auth()->user()->name ?? 'Admin') // ->label('Created By') // ->rules(['required']), // ImportColumn::make('updated_by') // ->requiredMapping() // ->rules(['required']), ]; } public function resolveRecord(): ?GuardPatrolEntry { $warnMsg = []; $plantCod = $this->data['plant']; $plant = null; $guardNames = null; $checkPointNames = null; $patrolDateTime = null; // $fdateTime = null; 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'; // '" . $plantCod . "' } else { $guardNames = GuardName::where('plant_id', $plant->id)->where('name', $this->data['guardNames'])->first(); if (! $guardNames) { $warnMsg[] = 'Guard name not found'; } else { $checkPointNames = CheckPointName::where('plant_id', $plant->id)->where('name', $this->data['checkPointNames'])->first(); if (! $checkPointNames) { $warnMsg[] = 'Check point name not found'; } else { $patrolTime = $this->data['patrol_time']; // $fromDate = $this->data['from_datetime']; $formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; // '07-05-2025 08:00' or '07-05-2025 08:00:00' foreach ($formats as $format) { try { $patrolDateTime = Carbon::createFromFormat($format, $patrolTime); break; } catch (\Exception $e) { // Optionally collect warning messages // $warnMsg[] = "Date format mismatch with format: $format"; } } if (! isset($patrolDateTime)) { // throw new \Exception('Invalid date time format'); $warnMsg[] = "Invalid 'Patrol DateTime' format. Expected DD-MM-YYYY HH:MM:SS"; } else { $guardEntryFound = GuardPatrolEntry::where('plant_id', $plant->id)->where('guard_name_id', $guardNames->id)->where('check_point_name_id', $checkPointNames->id)->where('patrol_time', $patrolDateTime->format('Y-m-d H:i:s'))->first(); if ($guardEntryFound) { $warnMsg[] = 'Duplicate guard patrol entry found'; } } } } } } $createdBy = Filament::auth()->user()->name; // ?? 'Admin' if (! $createdBy) { $warnMsg[] = 'Invalid created by name found'; } if (! empty($warnMsg)) { throw new RowImportFailedException(implode(', ', $warnMsg)); } GuardPatrolEntry::updateOrCreate([ 'plant_id' => $plant->id, 'guard_name_id' => $guardNames->id, 'check_point_name_id' => $checkPointNames->id, 'patrol_time' => $patrolDateTime->format('Y-m-d H:i:s'), ], [ 'reader_code' => null, 'created_by' => $createdBy, 'updated_by' => $createdBy, ] ); return null; // // return GuardPatrolEntry::firstOrNew([ // // // Update existing records, matching them by `$this->data['column_name']` // // 'email' => $this->data['email'], // // ]); // return new GuardPatrolEntry(); } public static function getCompletedNotificationBody(Import $import): string { $body = 'Your guard patrol 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; } }