Problemas con el manejo de transacciones

Hola! como les va?
Estoy personalizando la operación de Inscripción a Propuestas desde Preinscripción para incorporar la lógica de “Opciones de Cursado” que se utiliza en la universidad. Cada opción tiene un cupo, y cada carrera tiene varias opciones.
En la operación de Inscripción a Propuestas, ésto ya esta incorporado y funciona correctamente, pero en la de Preinscripción, tengo el problema de que al surgir el error de que no hay cupo para una opción, la transacción no se aborta, por lo tanto, el alumno se inscribe igual.
Dejo el código del evento procesar de esta operación.

    function evt__procesar_insc()
    {
        if (isset($this->s__datos_opcion['opcion'])) {
            $this->cn()->desactivar_transacciones_anidadas();

            try {
                toba::db()->abrir_transaccion();

                $this->cn()->procesar_inscripciones($this->s__datos_inscripciones, $this->s__persona, $this->s__preinscripcion['id_preinscripcion']);

                // INSERTAR CAMPO OPCION_CURSADO
                $datos_alumno = toba::consulta_php('co_alumnos')->get_alumno($this->s__persona, $this->s__datos_opcion['propuesta']);
                $alumno = $datos_alumno['alumno'];
                if (guarani::co('co_opciones_cursada_U840')->hay_cupo_opcion_cursado($this->s__datos_opcion['opcion'])) {
                    guarani::act('act_alumnos')->insertar_opcion_cursado_alumno($alumno, $this->s__datos_opcion['opcion']);
                    guarani::act('act_opcion_cursado_U840')->actualizar_cupo($this->s__datos_opcion['opcion']);
                } else {
                    $mje = 'No hay cupo para la opcion de cursada elegida';
                    $this->s__datos_opcion = NULL;
                    throw guarani::error($mje);
                }

                $this->s__datos_opcion = NULL;
                $this->s__procesar_ok = true;
                $this->set_pantalla('requisitos');

                toba::db()->cerrar_transaccion();
            } catch (guarani_error $e) {
                toba::db()->abortar_transaccion();
                toba::notificacion()->agregar($e->getMessage(), 'error');
                toba::logger()->error($e->getMessage());
            }
        } else {
            $this->cn()->desactivar_transacciones_anidadas();

            try {
                $this->cn()->procesar_inscripciones($this->s__datos_inscripciones, $this->s__persona, $this->s__preinscripcion['id_preinscripcion']);
                $this->s__procesar_ok = true;
                $this->set_pantalla('requisitos');
            } catch (guarani_error $e) {
                toba::db()->abortar_transaccion();
                toba::notificacion()->agregar($e->getMessage(), 'error');
                toba::logger()->error($e->getMessage());
            }
        }

    }

El array $s__datos_opcion se carga en la pantalla a través de un formulario que agregué.
Y en el manejador de datos cambie la clase de la cual extiende a “cn_manejador_entidad” para que tenga la función desactivar_transacciones_anidadas.

El error lo está lanzando correctamente cuando no hay cupo en una opción, por eso me resulta raro que no aborte la transacción.
Desde ya, gracias por la ayuda.

Saludos,
Felipe.

Hola Felipe,

El código original (no personalizado) el método ‘procesar_inscripciones’ de la clase ‘cn_man_insc_prop_preinscripcion’ (que se invoca desde el evento ‘evt__procesar_insc’ al que hacés mención) contiene una transacción. Lo de desactivar transacciones anidadas se usa cuando interfieren “datos_relacion”, para evitar que al sincronizarlos se genere una nueva transacción, pero este no es tu caso.
Tenés dos opciones:

  1. Enviar como parámetro los datos de la opción al método ‘procesar_inscripciones’, incluir el control de cupos en el método ‘validar_inscripciones’ y las inserciones y actualizaciones dentro de la misma transacción que ya existe hoy.
  2. Modificar el método ‘procesar_inscripciones’ quitando la transacción y agregarla en el evento ‘evt__procesar_insc’.

Saludos, Florencia.

Hola Florencia! Muchas gracias, la opción uno me sirvio.

Saludos!

Felipe