feat: agregar manejo de archivos duplicados en la actualización de datos del vehículo
This commit is contained in:
parent
a18f028a3d
commit
908ba8aaf1
@ -860,6 +860,7 @@ public function updateData(VehicleUpdateRequest $request, $id)
|
|||||||
$uploadedFiles = [];
|
$uploadedFiles = [];
|
||||||
$replacedFiles = [];
|
$replacedFiles = [];
|
||||||
$deletedFiles = [];
|
$deletedFiles = [];
|
||||||
|
$skippedFiles = [];
|
||||||
|
|
||||||
// Manejar eliminación de archivos
|
// Manejar eliminación de archivos
|
||||||
if ($request->has('delete_files')) {
|
if ($request->has('delete_files')) {
|
||||||
@ -898,14 +899,30 @@ public function updateData(VehicleUpdateRequest $request, $id)
|
|||||||
$nameIds = $request->input('name_id', []);
|
$nameIds = $request->input('name_id', []);
|
||||||
$observations = $request->input('observations', []);
|
$observations = $request->input('observations', []);
|
||||||
|
|
||||||
|
// Normalizar arrays
|
||||||
|
if (!is_array($nameIds)) {
|
||||||
|
$nameIds = [$nameIds];
|
||||||
|
}
|
||||||
|
if (!is_array($observations)) {
|
||||||
|
$observations = [$observations];
|
||||||
|
}
|
||||||
|
if (!is_array($files)) {
|
||||||
|
$files = [$files];
|
||||||
|
}
|
||||||
|
|
||||||
if (!empty($nameIds)) {
|
if (!empty($nameIds)) {
|
||||||
$validIds = CatalogNameImg::whereIn('id', $nameIds)->pluck('id')->toArray();
|
// Obtener IDs únicos para validar
|
||||||
if (count($validIds) !== count($nameIds)) {
|
$uniqueNameIds = array_unique($nameIds);
|
||||||
|
$validIds = CatalogNameImg::whereIn('id', $uniqueNameIds)->pluck('id')->toArray();
|
||||||
|
|
||||||
|
// Verificar que todos los IDs únicos existan en el catálogo
|
||||||
|
if (count($validIds) !== count($uniqueNameIds)) {
|
||||||
|
$invalidIds = array_diff($uniqueNameIds, $validIds);
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
return ApiResponse::BAD_REQUEST->response([
|
return ApiResponse::BAD_REQUEST->response([
|
||||||
'message' => 'Algunos ids del catálogo de nombres no son válidos',
|
'message' => 'Algunos ids del catálogo de nombres no son válidos',
|
||||||
'provided_id' => $nameIds,
|
'provided_ids' => $nameIds,
|
||||||
'valid_id' => $validIds,
|
'invalid_ids' => array_values($invalidIds),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -913,10 +930,10 @@ public function updateData(VehicleUpdateRequest $request, $id)
|
|||||||
foreach ($files as $indx => $file) {
|
foreach ($files as $indx => $file) {
|
||||||
$nameId = $nameIds[$indx] ?? null;
|
$nameId = $nameIds[$indx] ?? null;
|
||||||
|
|
||||||
if ($nameId === null) {
|
if ($nameId === null || $nameId === '') {
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
return ApiResponse::BAD_REQUEST->response([
|
return ApiResponse::BAD_REQUEST->response([
|
||||||
'message' => "Falta el nombre para el archivo, busca en el catálogo de nombres",
|
'message' => "Falta el nombre para el archivo en el índice {$indx}",
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,24 +950,96 @@ public function updateData(VehicleUpdateRequest $request, $id)
|
|||||||
$extension = $file->getClientOriginalExtension();
|
$extension = $file->getClientOriginalExtension();
|
||||||
$isEvidenciaAdicional = $catalogName->name === 'EVIDENCIA ADICIONAL';
|
$isEvidenciaAdicional = $catalogName->name === 'EVIDENCIA ADICIONAL';
|
||||||
|
|
||||||
// Si NO es Evidencia Adicional, verificar si existe y reemplazar
|
// Calcular MD5 antes de guardar para verificar duplicados
|
||||||
|
$md5 = md5_file($file->getRealPath());
|
||||||
|
|
||||||
|
// Verificar si el archivo ya existe por MD5 en este expediente
|
||||||
|
$existingByMd5 = File::where('record_id', $record->id)
|
||||||
|
->where('md5', $md5)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($existingByMd5) {
|
||||||
|
// Archivo duplicado detectado, registrar y omitir
|
||||||
|
$skippedFiles[] = [
|
||||||
|
'index' => $indx,
|
||||||
|
'catalog_name' => $catalogName->name,
|
||||||
|
'md5' => $md5,
|
||||||
|
'reason' => 'Archivo duplicado ya existe en el expediente',
|
||||||
|
'existing_file_id' => $existingByMd5->id,
|
||||||
|
'existing_file_path' => $existingByMd5->path,
|
||||||
|
];
|
||||||
|
continue; // Salta al siguiente archivo sin guardarlo
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verificar si existe archivo para reemplazar
|
||||||
|
$existingFile = null;
|
||||||
|
|
||||||
if (!$isEvidenciaAdicional) {
|
if (!$isEvidenciaAdicional) {
|
||||||
|
// Para archivos estándar (FACTURA, INE, etc.), buscar por name_id
|
||||||
$existingFile = File::where('record_id', $record->id)
|
$existingFile = File::where('record_id', $record->id)
|
||||||
->where('name_id', $nameId)
|
->where('name_id', $nameId)
|
||||||
->first();
|
->first();
|
||||||
|
} else {
|
||||||
|
// Para EVIDENCIA ADICIONAL con observación, buscar por name_id + observations
|
||||||
|
$observation = $observations[$indx] ?? null;
|
||||||
|
|
||||||
if ($existingFile) {
|
if (!empty($observation)) {
|
||||||
Storage::disk('public')->delete($existingFile->path);
|
$existingFile = File::where('record_id', $record->id)
|
||||||
|
->where('name_id', $nameId)
|
||||||
$replacedFiles[] = [
|
->where('observations', $observation)
|
||||||
'id' => $existingFile->id,
|
->first();
|
||||||
'name_id' => $nameId,
|
|
||||||
'old_path' => $existingFile->path,
|
|
||||||
];
|
|
||||||
|
|
||||||
$existingFile->delete();
|
|
||||||
}
|
}
|
||||||
|
// Si no tiene observación o no se encuentra, se creará nuevo archivo
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si existe archivo, reemplazarlo
|
||||||
|
if ($existingFile) {
|
||||||
|
$oldPath = $existingFile->path;
|
||||||
|
$oldMd5 = $existingFile->md5;
|
||||||
|
|
||||||
|
// Eliminar archivo físico viejo
|
||||||
|
Storage::disk('public')->delete($oldPath);
|
||||||
|
|
||||||
|
// Mantener el mismo nombre de archivo pero actualizar extensión si cambió
|
||||||
|
$pathInfo = pathinfo($oldPath);
|
||||||
|
$fileName = $pathInfo['filename'] . '.' . $extension;
|
||||||
|
$directory = $pathInfo['dirname'];
|
||||||
|
|
||||||
|
// Guardar nuevo archivo con el mismo nombre
|
||||||
|
$path = $file->storeAs($directory, $fileName, 'public');
|
||||||
|
|
||||||
|
// Actualizar registro existente
|
||||||
|
$existingFile->update([
|
||||||
|
'path' => $path,
|
||||||
|
'md5' => $md5,
|
||||||
|
'observations' => $observations[$indx] ?? $existingFile->observations,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$replacedFiles[] = [
|
||||||
|
'file_id' => $existingFile->id,
|
||||||
|
'name' => $catalogName->name,
|
||||||
|
'old_path' => $oldPath,
|
||||||
|
'new_path' => $path,
|
||||||
|
'old_md5' => $oldMd5,
|
||||||
|
'new_md5' => $md5,
|
||||||
|
'replaced_by' => 'observation_match',
|
||||||
|
];
|
||||||
|
|
||||||
|
// Agregar a uploadedFiles también para mantener compatibilidad
|
||||||
|
$uploadedFiles[] = [
|
||||||
|
'file_id' => $existingFile->id,
|
||||||
|
'name' => $catalogName->name,
|
||||||
|
'path' => $path,
|
||||||
|
'md5' => $md5,
|
||||||
|
'observations' => $existingFile->observations,
|
||||||
|
'action' => 'replaced',
|
||||||
|
];
|
||||||
|
|
||||||
|
continue; // Siguiente archivo
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si no existe, crear nuevo archivo
|
||||||
|
if (!$isEvidenciaAdicional) {
|
||||||
$fileName = $catalogName->name . '_' . date('dmY_His') . '.' . $extension;
|
$fileName = $catalogName->name . '_' . date('dmY_His') . '.' . $extension;
|
||||||
} else {
|
} else {
|
||||||
// Si es Evidencia Adicional, contar cuántas ya existen y agregar número
|
// Si es Evidencia Adicional, contar cuántas ya existen y agregar número
|
||||||
@ -962,7 +1051,6 @@ public function updateData(VehicleUpdateRequest $request, $id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
$path = $file->storeAs("records/{$record->folio}", $fileName, 'public');
|
$path = $file->storeAs("records/{$record->folio}", $fileName, 'public');
|
||||||
$md5 = md5_file($file->getRealPath());
|
|
||||||
|
|
||||||
$fileRecord = File::create([
|
$fileRecord = File::create([
|
||||||
'name_id' => $nameId,
|
'name_id' => $nameId,
|
||||||
@ -1060,6 +1148,9 @@ public function updateData(VehicleUpdateRequest $request, $id)
|
|||||||
$message = 'Expediente actualizado exitosamente';
|
$message = 'Expediente actualizado exitosamente';
|
||||||
if (!$hasVehicleChanges && !$hasOwnerChanges && !$hasFolioChange && empty($uploadedFiles) && empty($deletedFiles)) {
|
if (!$hasVehicleChanges && !$hasOwnerChanges && !$hasFolioChange && empty($uploadedFiles) && empty($deletedFiles)) {
|
||||||
$message = 'No se detectaron cambios. Los datos ya estaban actualizados.';
|
$message = 'No se detectaron cambios. Los datos ya estaban actualizados.';
|
||||||
|
if (!empty($skippedFiles)) {
|
||||||
|
$message .= ' Se omitieron ' . count($skippedFiles) . ' archivo(s) duplicado(s).';
|
||||||
|
}
|
||||||
} elseif ($hasFolioChange) {
|
} elseif ($hasFolioChange) {
|
||||||
$message = 'Folio actualizado exitosamente de "' . $oldFolio . '" a "' . $record->folio . '".';
|
$message = 'Folio actualizado exitosamente de "' . $oldFolio . '" a "' . $record->folio . '".';
|
||||||
if ($hasVehicleChanges || $hasOwnerChanges) {
|
if ($hasVehicleChanges || $hasOwnerChanges) {
|
||||||
@ -1068,12 +1159,24 @@ public function updateData(VehicleUpdateRequest $request, $id)
|
|||||||
if (!empty($uploadedFiles) || !empty($deletedFiles)) {
|
if (!empty($uploadedFiles) || !empty($deletedFiles)) {
|
||||||
$message .= ' Archivos modificados.';
|
$message .= ' Archivos modificados.';
|
||||||
}
|
}
|
||||||
|
if (!empty($skippedFiles)) {
|
||||||
|
$message .= ' Se omitieron ' . count($skippedFiles) . ' archivo(s) duplicado(s).';
|
||||||
|
}
|
||||||
} elseif (($hasVehicleChanges || $hasOwnerChanges) && (!empty($uploadedFiles) || !empty($deletedFiles))) {
|
} elseif (($hasVehicleChanges || $hasOwnerChanges) && (!empty($uploadedFiles) || !empty($deletedFiles))) {
|
||||||
$message = 'Datos del vehículo/propietario y archivos actualizados exitosamente.';
|
$message = 'Datos del vehículo/propietario y archivos actualizados exitosamente.';
|
||||||
|
if (!empty($skippedFiles)) {
|
||||||
|
$message .= ' Se omitieron ' . count($skippedFiles) . ' archivo(s) duplicado(s).';
|
||||||
|
}
|
||||||
} elseif (($hasVehicleChanges || $hasOwnerChanges) && empty($uploadedFiles) && empty($deletedFiles)) {
|
} elseif (($hasVehicleChanges || $hasOwnerChanges) && empty($uploadedFiles) && empty($deletedFiles)) {
|
||||||
$message = 'Datos del vehículo/propietario actualizados exitosamente. No se modificaron archivos.';
|
$message = 'Datos del vehículo/propietario actualizados exitosamente. No se modificaron archivos.';
|
||||||
|
if (!empty($skippedFiles)) {
|
||||||
|
$message .= ' Se omitieron ' . count($skippedFiles) . ' archivo(s) duplicado(s).';
|
||||||
|
}
|
||||||
} elseif (!$hasVehicleChanges && !$hasOwnerChanges && (!empty($uploadedFiles) || !empty($deletedFiles))) {
|
} elseif (!$hasVehicleChanges && !$hasOwnerChanges && (!empty($uploadedFiles) || !empty($deletedFiles))) {
|
||||||
$message = 'Archivos modificados exitosamente. No hubo cambios en los datos del vehículo/propietario.';
|
$message = 'Archivos modificados exitosamente. No hubo cambios en los datos del vehículo/propietario.';
|
||||||
|
if (!empty($skippedFiles)) {
|
||||||
|
$message .= ' Se omitieron ' . count($skippedFiles) . ' archivo(s) duplicado(s).';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1085,12 +1188,10 @@ public function updateData(VehicleUpdateRequest $request, $id)
|
|||||||
'owner_updated' => $hasOwnerChanges,
|
'owner_updated' => $hasOwnerChanges,
|
||||||
'files_uploaded' => count($uploadedFiles) > 0,
|
'files_uploaded' => count($uploadedFiles) > 0,
|
||||||
'files_deleted' => count($deletedFiles) > 0,
|
'files_deleted' => count($deletedFiles) > 0,
|
||||||
|
'files_skipped' => count($skippedFiles) > 0,
|
||||||
|
'files_replaced' => count($replacedFiles) > 0,
|
||||||
],
|
],
|
||||||
'record' => $record,
|
'record' => $record,
|
||||||
'uploaded_files' => $uploadedFiles,
|
|
||||||
'deleted_files' => $deletedFiles,
|
|
||||||
'replaced_count' => count($replacedFiles),
|
|
||||||
'total_files' => File::where('record_id', $record->id)->count(),
|
|
||||||
]);
|
]);
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
@ -1245,4 +1346,5 @@ private function moveRecordFiles(int $recordId, string $oldFolio, string $newFol
|
|||||||
Storage::disk('public')->deleteDirectory($oldDirectory);
|
Storage::disk('public')->deleteDirectory($oldDirectory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user