diff --git a/app/Http/Controllers/Repuve/UpdateController.php b/app/Http/Controllers/Repuve/UpdateController.php index 62ac66e..e2253af 100644 --- a/app/Http/Controllers/Repuve/UpdateController.php +++ b/app/Http/Controllers/Repuve/UpdateController.php @@ -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(), + ]); + } + } } diff --git a/app/Services/RepuveService.php b/app/Services/RepuveService.php index 97c78b7..4f374a3 100644 --- a/app/Services/RepuveService.php +++ b/app/Services/RepuveService.php @@ -134,8 +134,6 @@ private function parseVehicleResponse(string $soapResponse, string $niv) 'pedimento', 'fecha_pedimento', 'clave_importador', - 'folio_ci', - 'identificador_ci', 'observaciones' ]; diff --git a/routes/api.php b/routes/api.php index 3add0a1..643740a 100644 --- a/routes/api.php +++ b/routes/api.php @@ -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);