findOrFail($request->record_id); $vehicle = $record->vehicle; $tag = $vehicle->tag; // Validar que el vehículo tiene un tag asignado if (!$tag) { return ApiResponse::BAD_REQUEST->response([ 'message' => 'El vehículo no tiene un tag/constancia asignada.' ]); } // Validar que el tag está en estado activo if (!$tag->isAssigned()) { return ApiResponse::BAD_REQUEST->response([ 'message' => 'El tag ya no está activo. Status actual: ' . $tag->status->name ]); } // Validar que el registro no tenga errores previos if ($record->error_id !== null) { return ApiResponse::BAD_REQUEST->response([ 'message' => 'No se puede cancelar un registro que tiene errores. El vehículo no fue inscrito.', 'error_id' => $record->error_id ]); } // Crear registro en el log de cancelaciones $cancellationLog = VehicleTagLog::create([ 'vehicle_id' => $vehicle->id, 'tag_id' => $tag->id, 'cancellation_reason' => $request->cancellation_reason, 'cancellation_observations' => $request->cancellation_observations, 'cancellation_at' => now(), 'cancelled_by' => Auth::id(), ]); // Actualizar estado del tag a 'cancelled' y desasignar vehículo $tag->markAsCancelled(); DB::commit(); return ApiResponse::OK->response([ 'message' => 'Constancia cancelada exitosamente', 'cancellation' => [ 'id' => $cancellationLog->id, 'vehicle' => [ 'id' => $vehicle->id, 'placa' => $vehicle->placa, 'niv' => $vehicle->niv, ], 'tag' => [ 'id' => $tag->id, 'folio' => $tag->folio, 'old_status' => $tag->status->name, 'new_status' => 'Cancelado', ], 'cancellation_reason' => $request->cancellation_reason, 'cancellation_observations' => $request->cancellation_observations, 'cancelled_at' => $cancellationLog->cancellation_at->toDateTimeString(), 'cancelled_by' => Auth::user()->name, ] ]); } catch (\Exception $e) { DB::rollBack(); Log::error('Error en cancelarConstancia: ' . $e->getMessage(), [ 'record_id' => $request->record_id ?? null, 'cancellation_reason' => $request->cancellation_reason ?? null, 'trace' => $e->getTraceAsString() ]); return ApiResponse::BAD_REQUEST->response([ 'message' => 'Error al cancelar la constancia', 'error' => $e->getMessage() ]); } } }