diff --git a/app/Filament/Resources/InvoiceOutValidationResource.php b/app/Filament/Resources/InvoiceOutValidationResource.php index 110170d..6b9c275 100644 --- a/app/Filament/Resources/InvoiceOutValidationResource.php +++ b/app/Filament/Resources/InvoiceOutValidationResource.php @@ -398,122 +398,104 @@ class InvoiceOutValidationResource extends Resource // } $successCount = 0; + $updateCount = 0; + $insertCount = 0; $failedRecords = []; - DB::beginTransaction(); - - try { - foreach ($rows as $index => $row) { - if ($index == 0) { - continue; - } - - $rowNumber = $index + 1; - - try { - $qrcode = trim($row[1]); - $plantCode = trim($row[2]); - $scannedAt = trim($row[3]); - $scannedBy = trim($row[4]); - - if (empty($qrcode)) { - throw new \Exception("Row '{$rowNumber}' Missing QR Code"); - } - - $plant = Plant::where('code', $plantCode)->first(); - if (! $plant) { - throw new \Exception("Invalid plant code : '{$plantCode}'"); - } - - $formattedDate = null; - if (! empty($scannedAt)) { - try { - // $formattedDate = Carbon::createFromFormat('d-m-Y H:i:s', $scannedAt) - // ->format('Y-m-d H:i:s'); - if (is_numeric($scannedAt)) { - $formattedDate = ExcelDate::excelToDateTimeObject($scannedAt) - ->format('Y-m-d H:i:s'); - } else { - // Or handle as manual string date (d-m-Y H:i:s) - $formattedDate = Carbon::createFromFormat('d-m-Y H:i:s', $scannedAt) - ->format('Y-m-d H:i:s'); - } - } catch (\Exception $e) { - throw new \Exception("Invalid date format : '{$scannedAt}'"); - } - } - - $record = InvoiceOutValidation::where('plant_id', $plant->id) - ->where('qr_code', $qrcode) - ->first(); - - $curStat = $record ? 'Updation' : 'Insertion'; - - if ($record) { - $record->update([ - 'scanned_at' => $formattedDate, - 'scanned_by' => $scannedBy, - 'updated_by' => $operatorName, - ]); - $inserted = $record; - } else { - // Record does not exist, create with 'created_by' - $inserted = InvoiceOutValidation::create([ - 'plant_id' => $plant->id, - 'qr_code' => $qrcode, - 'scanned_at' => $formattedDate, - 'scanned_by' => $scannedBy, - 'created_by' => $operatorName, - ]); - } - // $inserted = InvoiceOutValidation::create([ - // 'plant_id' => $plant->id, - // 'qr_code' => $qrcode, - // 'scanned_at' => $formattedDate, - // 'scanned_by' => $scannedBy, - // 'created_by' => $operatorName - // ]); - - if (! $inserted) { - throw new \Exception("{$curStat} failed for QR : {$qrcode}"); - } - - $successCount++; - } catch (\Exception $e) { - $failedRecords[] = [ - 'row' => $rowNumber, - 'qrcode' => $qrcode ?? null, - 'error' => $e->getMessage(), - ]; - } + foreach ($rows as $index => $row) + { + if ($index == 0) { + continue; } - DB::commit(); + $rowNumber = $index + 1; - if (count($failedRecords) > 0) { + try { + $qrcode = trim($row[1]); + $plantCode = trim($row[2]); + $scannedAt = trim($row[3]); + $scannedBy = trim($row[4]); + + if (empty($qrcode)) { + throw new \Exception("Row '{$rowNumber}' Missing QR Code"); + } + + $plant = Plant::where('code', $plantCode)->first(); + if (! $plant) { + throw new \Exception("Invalid plant code : '{$plantCode}'"); + } + + $formattedDate = null; + if (! empty($scannedAt)) { + try { + // $formattedDate = Carbon::createFromFormat('d-m-Y H:i:s', $scannedAt) + // ->format('Y-m-d H:i:s'); + if (is_numeric($scannedAt)) { + $formattedDate = ExcelDate::excelToDateTimeObject($scannedAt) + ->format('Y-m-d H:i:s'); + } else { + // Or handle as manual string date (d-m-Y H:i:s) + $formattedDate = Carbon::createFromFormat('d-m-Y H:i:s', $scannedAt) + ->format('Y-m-d H:i:s'); + } + } catch (\Exception $e) { + throw new \Exception("Invalid date format : '{$scannedAt}'"); + } + } + + $exists = InvoiceOutValidation::where('plant_id', $plant->id) + ->where('qr_code', $qrcode) + ->first(); + + InvoiceOutValidation::updateOrCreate( + [ + 'plant_id' => $plant->id, + 'qr_code' => $qrcode, + ], + [ + 'scanned_at' => $formattedDate, + 'scanned_by' => $scannedBy, + 'updated_by' => $operatorName, + 'created_by' => $operatorName, + ] + ); + + $exists ? $updateCount++ : $insertCount++; + $successCount++; + + } + catch (\Exception $e) { + $failedRecords[] = [ + 'row' => $rowNumber, + 'qrcode' => $qrcode ?? null, + 'error' => $e->getMessage(), + ]; + } + } + + if (count($failedRecords) > 0) { $failedSummary = collect($failedRecords) ->map(fn ($f) => "Row {$f['row']} ({$f['qrcode']}) : {$f['error']}") - ->take(5) // limit preview to first 5 errors + ->take(5) ->implode("\n"); - - Notification::make() - ->title('Partial Import Warning') - ->body("'{$successCount}' records inserted. ".count($failedRecords)." failed.\n\n{$failedSummary}") - ->warning() - ->send(); - } else { - Notification::make() - ->title('Import Success') - ->body("Successfully imported '{$successCount}' records.") - ->success() - ->send(); - } - } catch (\Exception $e) { - DB::rollBack(); + Notification::make() + ->title('Partial Import Warning') + ->body( + "Total Success: {$successCount}\n" . + "Inserted: {$insertCount}\n" . + "Updated: {$updateCount}\n" . + "Failed: " . count($failedRecords) . "\n\n" . + $failedSummary + ) + ->warning() + ->send(); + } + else + { Notification::make() - ->title('Import Failed') - ->body("No records were inserted. Error : {$e->getMessage()}") - ->danger() + ->title('Import Success') + ->body("Successfully imported '{$successCount}' records.") + ->success() ->send(); } }