No ejecuta evento implicito en toba 3.4

Tengo un ci con el modelo de eventos ABM / CRUD y con un formulario_ml con su evento implicito modificacion, cuando hago clic en el botón guardar no ejecuta el evento evt__formulario_ml__modificacion.
Este es el código de evt__formulario_ml__modificacion:

    function evt__formulario_ml__modificacion($datos)
    {
        if (!empty($this->s__cuit)) {
            $aportes_pendientes = toba::tabla("aportes_pendientes");
            $array_aporte_pendiente = array();
            $total = 0;

            foreach ($datos as $key => $value) {
                $importe = $value['importe'];
                $datos[$key]['anula'] = false;
                $timezone = new DateTimeZone('America/Argentina/Cordoba');
                $fecalt = new DateTime('now', $timezone);
                $datos[$key]['fecalt'] = $fecalt->format('Y-m-d H:i:s');

                $aporte_pendiente = $this->get_pendientes($value['id_aporte_pendiente']);

                if (!empty($aporte_pendiente)) {
                    $aporte_pendiente['importe'] -= $importe;
                    $aporte_pendiente['apex_ei_analisis_fila'] = !empty($aporte_pendiente['importe']) ? 'M' : 'B';
                    $aportes_pendientes->resetear();
                    $aportes_pendientes->anexar_datos($aporte_pendiente, false);
                    $array_aporte_pendiente[] = $aporte_pendiente;
                }

                $total += $importe;
            }

            $aportes_pendientes->procesar_filas($array_aporte_pendiente);
            $paramet = toba::tabla("paramet");
            $paramet->cargar(array("cuit" => $this->s__cuit));
            $datos_p = $paramet->get();
            $numrec = $datos_p['numrec'] + 1;
            $ahora = new DateTime('now', $timezone);
            $fecha = $ahora->format('Y-m-d');
            $fecalt = $ahora->format('Y-m-d H:i:s');
            $total = round($total, 2);
            $restriccion = toba::perfil_de_datos()->get_restricciones_dimension("sindicato", "empresas");
            $id_empresa = $restriccion[0];
            $recibo = array(
                "id_empresa" => $id_empresa,
                "fecha" => $fecha,
                "fijcom" => $datos_p['fijrec'],
                "comprob" => $numrec,
                "total" => $total,
                "fecalt" => $fecalt,
                "anula" => false
            );
            $this->dep('datos')->tabla('recibos')->set($recibo);
            $datos_p["fecha"] = $fecha;
            $datos_p["numrec"] = $numrec;
            $paramet->set($datos_p);
            $this->dep('datos')->tabla("aportes_recibos")->procesar_filas($datos);
            $pendientes = toba::tabla("pendientes");
            $pendiente = $pendientes->get_listado_grupo();
            $guardar_pendiente = array();
            foreach ($pendiente as $value) {
                $pendientes->cargar(array("id_pendiente" => $value["id_pendiente"]));
                $datos_pend = $pendientes->get();
                $pendientes->resetear();
                $datos_pend["total"] = $value["aporte"];
                $datos_pend["apex_ei_analisis_fila"] = "M";
                $pendientes->anexar_datos($datos_pend);
                $guardar_pendiente[] = $datos_pend;
            }
            $pendientes->procesar_filas($guardar_pendiente);
            $pendientes->resetear();
            $pendiente = $pendientes->get_listado_baja();
            foreach ($pendiente as $key => $value) {
                $pendiente[$key]["apex_ei_analisis_fila"] = "B";
            }
            $pendientes->anexar_datos($pendiente, false);
            $pendientes->procesar_filas($pendiente)
        }
    }

Este es el código de conf_formulario_ml:

	function conf__formulario_ml(sindicato_ei_formulario_ml $form_ml)
	{
		$sql = "select * from paramet";
		$paramet = consultar_fuente($sql);
		$this->s__cuit = $paramet[0]['cuit'];
		$datos = $this->get_datos_empresa();
		foreach ($datos as $key => $value) {
			$datos[$key]['apex_ei_analisis_fila'] = 'A';
		}
		$form_ml->set_datos($datos);
	}

Estos son los ef del formulario_ml:


Y este es el código del evento evt__guardar:

	function evt__guardar()
	{
		$this->dep('datos')->sincronizar();
		$paramet = toba::tabla('paramet');
		$paramet->sincronizar();
		$pendientes = toba::tabla('pendientes');
		$pendientes->sincronizar();
		$aportes_pendientes = toba::tabla("aportes_pendientes");
		$aportes_pendientes->sincronizar();
		$this->s__cuit = null;
		$this->detalle();
	}

Por favor me pueden decir donde está el error por el que no ejecuta el evento modificacion del formulario_ml?

Ya descubrí cual es el error, estaba tratando de obtener el estado de un ef_oculto en js con this.ef('id_aporte_pendiente').ir_a_fila(fila).get_estado(); pero me daba error de undefined, cómo tengo que poner para obtener el estado de un ef_oculto de un formulario_ml en js?

Por favor respondanme esta pregunta, necesito resolverlo con urgencia

Hola Matias,

los ef_oculto no viajan al cliente ya que suelen ser meramente un mecanismo para conservar valores entre pedidos de pagina, por lo que no salen nunca del servidor.

Respecto del problema con los eventos implícitos, te iba a decir que chequees no tener ningún error JS ya que ello puede influir en los parámetros que se envían al servidor al hacer el submit.

Saludos

Sí, ese era el problema, había un error JS, estaba tratando de acceder a un ef_oculto con this.ef('id_concepto_pendiente').ir_a_fila(fila).get_estado() y ya me dijiste que el ef_oculto no es accesible desde JS.
La duda que tengo es si hay alguna forma de hacerlo accesible desde JS pero que no sea visible en el formulario_ml, te agradecería si me podes pasar el código o la forma de hacer eso en toba_editor.

Por favor, respondanme esta pregunta, necesito solucionarlo urgente.

Hola Matias,

pareciera que es simplemente un dato de lectura, por que no lo envias como tal en la salida del formulario?… digamos, no es algo que debe volver al server, tranquilamente podes incluirlo en algun arreglo JS.

Es el unico dato que tenes en estas condiciones?.. por que no dejarlo directamente en la invocacion que hace el boton?

Saludos

Gracias por la respuesta @richard, en realidad si necesito que vuelva al server porque lo guardo en una tabla de la base de datos, pero quiero saber cómo puedo hacer para tenerlo disponible en js sin que esté visible en el formulario porque lo uso como parámetro para una función ajax, pero es la clave principal de una tabla así que necesito que no se vea en el formulario.

Me pueden dar una mano con esto por favor? Necesito resolverlo con urgencia.

Hola Matias,

podes tenerlo como un arreglo JS si queres… pero igualmente el tema es que esta disponible para cualquier script que se este corriendo. Una opcion es que hagas un mapeo y mandes a JS los valores mapeados nomas, luego en la funcion ajax recuperas el valor original del mapeo previo a hacer la consulta.

Una pregunta, la columna se llama id_importe_pendiente no es mas sencillo enviar el importe directamente?… calculo que lo haces por un tema de tener el dato actualizado… pero entre la invocacion ajax y lo que sea que hagas hasta que impactas en la bd, eso puede cambiar igual.

Fijate, por ahi te estas complicando de mas.

Saludos

No, la columna se llama id_concepto_pendiente que está en la tabla conceptos_pendientes, necesito de alguna forma obtener el importe que está guardado en esa tabla para compararlo con el que se ingresa por teclado para no ingresar un importe mayor y al actualizar el registro de la tabla conceptos_pendientes me quede un número negativo, ese número tiene que ser mayor o igual a 0.

Explicame un poco como puedo hacer un array js, así hago la comparación del ef_numero con el array js y no necesito tener el ef_oculto id_concepto_pendiente.

Ya lo solucioné mandando la consulta completa a través del método de ajax y recibiéndola en js con $respuesta→set_datos($datos); y haciendo la validación usando el array data del método js atender_respuesta.

Este es el código js:

			{$this->objeto_js}.evt__importe__validar = function(fila)
			{
				var parametros = {};
				this.controlador.ajax('get_importe', parametros, this, this.atender_respuesta, fila);
			}
			{$this->objeto_js}.atender_respuesta = function(data, fila)
			{
				var ef_importe = this.ef('importe').ir_a_fila(fila);
				var importe = ef_importe.get_estado();
				var necesita_chequeo = importe !== null;
				if(necesita_chequeo && data){
					if(importe > data[fila].importe){
						ef_importe.set_error('Debe ingresar un importe menor o igual a ' + data[fila].importe.toString());
						ef_importe.set_estado(data[fila].importe);
						return false;
					}
				}
				return true;
			}

Y este es el código ajax:

	function ajax__get_importe($parametros, toba_ajax_respuesta $respuesta)
	{
		$datos = $this->get_datos_cliente();
		$respuesta->set($datos);
	}

Sigue con otro error, cuando quiero guardar el registro y ningún importe tiene error me da error de null

Me pueden responder esta pregunta por favor? Necesito resolverlo con urgencia.

Este es el código de la extensión del formulario:

<?php
class form_ml_conceptos extends matger_ei_formulario_ml
{
	//-----------------------------------------------------------------------------------
	//---- JAVASCRIPT -------------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function extender_objeto_js()
	{
		echo "
		//---- Validacion de EFs -----------------------------------
		
			{$this->objeto_js}.evt__importe__validar = function(fila)
			{
				var parametros = {};
				this.controlador.ajax('get_importe', parametros, this, this.atender_respuesta, fila);
			}
			{$this->objeto_js}.atender_respuesta = function(data, fila)
			{
				var ef_importe = this.ef('importe').ir_a_fila(fila);
				var importe = ef_importe.get_estado();
				var necesita_chequeo = importe !== null;
				if(necesita_chequeo && data){
					if(importe > data[fila].importe){
						ef_importe.set_error('Debe ingresar un importe menor o igual a ' + data[fila].importe.toString());
						ef_importe.set_estado(data[fila].importe);
						return false;
					}
				}
				return true;
			}
		";
	}

}
?>

@richard Buenas, Ricardo.

En mi oficina actualmente tenemos todos los sistemas desarrollados en Toba 2.7 y queríamos consultar si existe alguna forma de migrarlos a Toba 3.3, o si necesariamente hay que realizar una instalación limpia y luego ir replicando las funcionalidades.

Además, Claudio Canzoneri, de la Municipalidad de Corrientes, me comentó que te conoce y que perdió el acceso al foro; por ese motivo me pidió que me contacte con vos por este medio.

Por favor me pueden responder esta pregunta? Ya me estoy cansando de esperar, esto lo hago por trabajo para ganar plata, es mi profesión, no es un hobbie, así que por favor respóndanme lo más pronto posible.