endpoint para actualizar web

This commit is contained in:
Juan Felipe Zapata Moreno 2025-12-01 13:45:07 -06:00
parent 48eaf28151
commit fbf55ae67c
3 changed files with 291 additions and 79 deletions

View File

@ -384,8 +384,6 @@ public function vehicleUpdate(VehicleUpdateRequest $request)
DB::commit();
$sentToRepuve = $hasVehicleChanges || $hasOwnerChanges || count($uploadedFiles) > 0;
$message = 'Vehículo actualizado exitosamente';
if (!$hasVehicleChanges && !$hasOwnerChanges && empty($uploadedFiles)) {
$message = 'No se detectaron cambios. Los datos ya estaban actualizados.';
@ -405,81 +403,10 @@ public function vehicleUpdate(VehicleUpdateRequest $request)
'owner_updated' => $hasOwnerChanges,
'files_uploaded' => count($uploadedFiles) > 0,
],
'record' => [
'id' => $record->id,
'folio' => $record->folio,
'updated_at' => $record->updated_at->toDateTimeString(),
],
'vehicle' => [
'id' => $vehicle->id,
'placa' => $vehicle->placa,
'niv' => $vehicle->niv,
'marca' => $vehicle->marca,
'modelo' => $vehicle->modelo,
'color' => $vehicle->color,
],
'owner' => [
'id' => $owner->id,
'full_name' => $owner->full_name,
'rfc' => $owner->rfc,
],
'tag' => [
'id' => $tag->id,
'tag_number' => $tag->tag_number,
'status' => $tag->status->name,
],
'uploaded_files' => $uploadedFiles,
'replaced_count' => count($replacedFiles),
'total_files' => File::where('record_id', $record->id)->count(),
]);
DB::commit();
$sentToRepuve = $hasVehicleChanges || $hasOwnerChanges || count($uploadedFiles) > 0;
$message = 'Vehículo actualizado exitosamente';
if (!$hasVehicleChanges && !$hasOwnerChanges && empty($uploadedFiles)) {
$message = 'No se detectaron cambios. Los datos ya estaban actualizados.';
} elseif (!$hasVehicleChanges && !$hasOwnerChanges && empty($uploadedFiles)) {
$message = 'Solo se actualizaron archivos. Los datos del vehículo/propietario no cambiaron.';
} elseif (($hasVehicleChanges || $hasOwnerChanges) && empty($uploadedFiles)) {
$message = 'Datos del vehículo/propietario actualizados exitosamente. No se subieron archivos.';
} elseif ((!$hasVehicleChanges && !$hasOwnerChanges) && !empty($uploadedFiles)) {
$message = 'Archivos subidos exitosamente. No hubo cambios en los datos del vehículo/propietario.';
}
return ApiResponse::OK->response([
'message' => $message,
'has_error' => false,
'sent_to_repuve' => $sentToRepuve,
'changes_made' => [
'vehicle_updated' => $hasVehicleChanges,
'owner_updated' => $hasOwnerChanges,
'files_uploaded' => count($uploadedFiles) > 0,
],
'record' => [
'id' => $record->id,
'folio' => $record->folio,
'updated_at' => $record->updated_at->toDateTimeString(),
],
'vehicle' => [
'id' => $vehicle->id,
'placa' => $vehicle->placa,
'niv' => $vehicle->niv,
'marca' => $vehicle->marca,
'modelo' => $vehicle->modelo,
'color' => $vehicle->color,
],
'owner' => [
'id' => $owner->id,
'full_name' => $owner->full_name,
'rfc' => $owner->rfc,
],
'tag' => [
'id' => $tag->id,
'tag_number' => $tag->tag_number,
'status' => $tag->status->name,
],
'record' => $record,
'vehicle' => $vehicle,
'owner' => $owner,
'files' => $record->files,
'uploaded_files' => $uploadedFiles,
'replaced_count' => count($replacedFiles),
'total_files' => File::where('record_id', $record->id)->count(),
@ -618,4 +545,290 @@ private function getOwner(string $niv): array
$datos = $this->padronEstatalService->getVehiculoByNiv($niv);
return $this->padronEstatalService->extraerDatosPropietario($datos);
}
/* --------------------------------------------------------- */
public function updateData(VehicleUpdateRequest $request)
{
try {
$request->validate([
'folio' => 'required|string|exists:records,folio',
]);
$folio = $request->input('folio');
$record = Record::with(['vehicle.owner', 'vehicle.tag', 'files', 'error'])
->where('folio', $folio)
->first();
if (!$record) {
return ApiResponse::NOT_FOUND->response([
'message' => 'No se encontró el expediente',
'folio' => $folio,
]);
}
$vehicle = $record->vehicle;
$owner = $vehicle->owner;
$tag = $vehicle->tag;
DB::beginTransaction();
$hasVehicleChanges = false;
$hasOwnerChanges = false;
if ($request->has('vehicle')) {
$vehicleData = $request->input('vehicle', []);
$allowedVehicleFields = [
'placa',
'niv',
'marca',
'linea',
'sublinea',
'modelo',
'color',
'numero_motor',
'clase_veh',
'tipo_servicio',
'rfv',
'ofcexpedicion',
'fechaexpedicion',
'tipo_veh',
'numptas',
'observac',
'cve_vehi',
'nrpv',
'tipo_mov'
];
$vehicleData = array_filter(
array_intersect_key($vehicleData, array_flip($allowedVehicleFields)),
fn($value) => $value !== null && $value !== ''
);
if (!empty($vehicleData)) {
$vehicle->update($vehicleData);
$hasVehicleChanges = true;
}
}
// Actualizar propietario si se envían datos
if ($request->has('owner')) {
$ownerInput = $request->input('owner', []);
$allowedOwnerFields = [
'name',
'paternal',
'maternal',
'rfc',
'curp',
'address',
'tipopers',
'pasaporte',
'licencia',
'ent_fed',
'munic',
'callep',
'num_ext',
'num_int',
'colonia',
'cp',
'telefono'
];
$ownerData = array_filter(
array_intersect_key($ownerInput, array_flip($allowedOwnerFields)),
fn($value) => $value !== null && $value !== ''
);
if (!empty($ownerData)) {
// Si se intenta cambiar el RFC
if (isset($ownerData['rfc']) && $ownerData['rfc'] !== $owner->rfc) {
// Verificar que el nuevo RFC no exista ya
$existingOwner = Owner::where('rfc', $ownerData['rfc'])->first();
if ($existingOwner) {
DB::rollBack();
return ApiResponse::BAD_REQUEST->response([
'message' => 'El RFC ya existe en el sistema',
'rfc' => $ownerData['rfc'],
'owner_id' => $existingOwner->id,
]);
}
// Si no existe, actualizar el RFC del propietario actual
$owner->update($ownerData);
}
$hasOwnerChanges = true;
}
}
// Procesar archivos
$uploadedFiles = [];
$replacedFiles = [];
if ($request->hasFile('files')) {
$files = $request->file('files');
$nameIds = $request->input('name_id', []);
if (!empty($nameIds)) {
$validIds = CatalogNameImg::whereIn('id', $nameIds)->pluck('id')->toArray();
if (count($validIds) !== count($nameIds)) {
DB::rollBack();
return ApiResponse::BAD_REQUEST->response([
'message' => 'Algunos ids del catálogo de nombres no son válidos',
'provided_id' => $nameIds,
'valid_id' => $validIds,
]);
}
}
foreach ($files as $indx => $file) {
$nameId = $nameIds[$indx] ?? null;
if ($nameId === null) {
DB::rollBack();
return ApiResponse::BAD_REQUEST->response([
'message' => "Falta el nombre para el archivo, busca en el catálogo de nombres",
]);
}
$existingFile = File::where('record_id', $record->id)
->where('name_id', $nameId)
->first();
if ($existingFile) {
Storage::disk('public')->delete($existingFile->path);
$replacedFiles[] = [
'id' => $existingFile->id,
'name_id' => $nameId,
'old_path' => $existingFile->path,
];
$existingFile->delete();
}
// Obtener el nombre del catálogo para el nombre del archivo
$catalogName = CatalogNameImg::find($nameId);
$extension = $file->getClientOriginalExtension();
$fileName = $catalogName->name . '_' . date('dmY_His') . '.' . $extension;
$path = $file->storeAs("records/{$record->folio}", $fileName, 'public');
$md5 = md5_file($file->getRealPath());
$fileRecord = File::create([
'name_id' => $nameId,
'path' => $path,
'md5' => $md5,
'record_id' => $record->id,
]);
$uploadedFiles[] = [
'id' => $fileRecord->id,
'name' => $catalogName->name,
'path' => $fileRecord->path,
'url' => $fileRecord->url,
'replaced' => $existingFile !== null,
];
}
}
// Registrar el log de cambios si hubo actualizaciones
if ($hasVehicleChanges || $hasOwnerChanges || count($uploadedFiles) > 0) {
VehicleTagLog::create([
'vehicle_id' => $vehicle->id,
'tag_id' => $tag->id,
'action_type' => 'actualizacion',
'performed_by' => Auth::id()
]);
}
// datos para REPUVE Nacional usando datos actuales de la BD
if ($hasVehicleChanges || $hasOwnerChanges || count($uploadedFiles) > 0) {
// Recargar el vehículo y propietario con los datos actualizados
$vehicle->refresh();
$owner->refresh();
$datosCompletos = [
'ent_fed' => $owner->ent_fed ?? '',
'ofcexp' => $vehicle->ofcexpedicion ?? '',
'fechaexp' => $vehicle->fechaexpedicion ?? '',
'placa' => $vehicle->placa ?? '',
'tarjetacir' => $vehicle->rfv ?? '',
'marca' => $vehicle->marca ?? '',
'submarca' => $vehicle->linea ?? '',
'version' => $vehicle->sublinea ?? '',
'clase_veh' => $vehicle->clase_veh ?? '',
'tipo_veh' => $vehicle->tipo_veh ?? '',
'tipo_uso' => $vehicle->tipo_servicio ?? '',
'modelo' => $vehicle->modelo ?? '',
'color' => $vehicle->color ?? '',
'motor' => $vehicle->numero_motor ?? '',
'niv' => $vehicle->niv ?? '',
'rfv' => $vehicle->rfv ?? '',
'numptas' => $vehicle->numptas ?? '',
'observac' => $vehicle->observac ?? '',
'tipopers' => $owner->tipopers ?? '',
'curp' => $owner->curp ?? '',
'rfc' => $owner->rfc ?? '',
'pasaporte' => $owner->pasaporte ?? '',
'licencia' => $owner->licencia ?? '',
'nombre' => $owner->name ?? '',
'ap_paterno' => $owner->paternal ?? '',
'ap_materno' => $owner->maternal ?? '',
'munic' => $owner->munic ?? '',
'callep' => $owner->callep ?? '',
'num_ext' => $owner->num_ext ?? '',
'num_int' => $owner->num_int ?? '',
'colonia' => $owner->colonia ?? '',
'cp' => $owner->cp ?? '',
'cve_vehi' => $vehicle->cve_vehi ?? '',
'nrpv' => $vehicle->nrpv ?? '',
'tipo_mov' => $vehicle->tipo_mov ?? '',
];
// Enviar job a REPUVE Nacional
ProcessRepuveResponse::dispatch($record->id, $datosCompletos);
}
DB::commit();
// Recargar relaciones para la respuesta
$record->load(['vehicle.owner', 'vehicle.tag', 'files', 'error']);
$message = 'Expediente actualizado exitosamente';
if (!$hasVehicleChanges && !$hasOwnerChanges && empty($uploadedFiles)) {
$message = 'No se detectaron cambios. Los datos ya estaban actualizados.';
} elseif (($hasVehicleChanges || $hasOwnerChanges) && !empty($uploadedFiles)) {
$message = 'Datos del vehículo/propietario y archivos actualizados exitosamente.';
} elseif (($hasVehicleChanges || $hasOwnerChanges) && empty($uploadedFiles)) {
$message = 'Datos del vehículo/propietario actualizados exitosamente. No se subieron archivos.';
} elseif (!$hasVehicleChanges && !$hasOwnerChanges && !empty($uploadedFiles)) {
$message = 'Archivos subidos exitosamente. No hubo cambios en los datos del vehículo/propietario.';
}
return ApiResponse::OK->response([
'message' => $message,
'has_error' => false,
'changes_made' => [
'vehicle_updated' => $hasVehicleChanges,
'owner_updated' => $hasOwnerChanges,
'files_uploaded' => count($uploadedFiles) > 0,
],
'record' => $record,
'uploaded_files' => $uploadedFiles,
'replaced_count' => count($replacedFiles),
'total_files' => File::where('record_id', $record->id)->count(),
]);
} catch (Exception $e) {
DB::rollBack();
return ApiResponse::INTERNAL_ERROR->response([
'message' => 'Error al actualizar el expediente',
'error' => $e->getMessage(),
]);
}
}
}

View File

@ -134,8 +134,6 @@ private function parseVehicleResponse(string $soapResponse, string $niv)
'pedimento',
'fecha_pedimento',
'clave_importador',
'folio_ci',
'identificador_ci',
'observaciones'
];

View File

@ -47,6 +47,7 @@
//Rutas de Actualización
Route::get('consulta', [UpdateController::class, 'vehicleData']);
Route::post('actualizar', [UpdateController::class, 'vehicleUpdate']);
Route::post('actualizar-expediente', [UpdateController::class, 'updateData']);
// Rutas de cancelación de constancias
Route::resource('/razones-cancelacion', CatalogController::class);