/**
  * @{inheritdoc}
  * @see \TSLBasicRecordDAO::getFetchQuery()
  */
 protected function getFetchQuery(\TSLDataModel &$record = NULL, \TSLRequestConstraints &$constraints = NULL, $subOperation = NULL)
 {
     if ($subOperation === 'fetchJoinedWithNames') {
         $postas_id = $constraints->getFilterField('postas_id');
         if ($postas_id) {
             $sql = 'SELECT * FROM (
                    SELECT po.postas_id,postas_descripcion,array_to_string(ARRAY(SELECT unnest(array_agg(atl.atletas_ap_paterno))
                              ORDER BY 1),\',\') AS postas_atletas
                    FROM tb_postas po
                    LEFT JOIN tb_postas_detalle pd ON pd.postas_id = po.postas_id
                    LEFT JOIN tb_atletas atl ON atl.atletas_codigo = pd.atletas_codigo
                    WHERE po.postas_id=' . $postas_id . ' GROUP BY po.postas_id
                    ORDER BY  postas_descripcion
                ) res';
             $constraints->removeFilterField('postas_id');
         } else {
             $sql = 'SELECT * FROM (
                    SELECT po.postas_id,postas_descripcion,array_to_string(ARRAY(SELECT unnest(array_agg(atl.atletas_ap_paterno))
                              ORDER BY 1),\',\') AS postas_atletas
                    FROM tb_postas po
                    LEFT JOIN tb_postas_detalle pd ON pd.postas_id = po.postas_id
                    LEFT JOIN tb_atletas atl ON atl.atletas_codigo = pd.atletas_codigo
                    WHERE po.competencias_pruebas_id=' . $constraints->getFilterField('competencias_pruebas_id') . ' GROUP BY po.postas_id
                    ORDER BY  postas_descripcion
                ) res';
             $constraints->removeFilterField('competencias_pruebas_id');
         }
     } else {
         $sql = 'SELECT postas_id,postas_descripcion,competencias_pruebas_id,activo,xmin AS "versionId" FROM  tb_postas ';
     }
     if ($this->activeSearchOnly == TRUE && $subOperation != 'fetchJoinedWithNames') {
         // Solo activos
         $sql .= ' where activo=TRUE ';
     }
     $where = $constraints->getFilterFieldsAsString();
     if (strlen($where) > 0) {
         if ($this->activeSearchOnly == TRUE && $subOperation != 'fetchJoinedWithNames') {
             $sql .= ' and ' . $where;
         } else {
             $sql .= ' where ' . $where;
         }
     }
     if (isset($constraints)) {
         $orderby = $constraints->getSortFieldsAsString();
         if ($orderby !== NULL) {
             $sql .= ' order by ' . $orderby;
         }
     }
     // Chequeamos paginacion
     $startRow = $constraints->getStartRow();
     $endRow = $constraints->getEndRow();
     if ($endRow > $startRow) {
         $sql .= ' LIMIT ' . ($endRow - $startRow) . ' OFFSET ' . $startRow;
     }
     $sql = str_replace('like', 'ilike', $sql);
     //echo $sql;
     return $sql;
 }
 /**
  * @see \TSLBasicRecordDAO::getFetchQuery()
  */
 protected function getFetchQuery(\TSLDataModel &$record = NULL, \TSLRequestConstraints &$constraints = NULL, $subOperation = NULL)
 {
     $sql = '';
     if ($subOperation == 'fetchRecordsResumen') {
         $sql = 'select * from  sp_view_resumen_records_por_prueba_categorias(\'' . $constraints->getFilterField('apppruebas_codigo') . '\',\'' . $constraints->getFilterField('atletas_sexo') . '\',' . '\'' . $constraints->getFilterField('records_tipo_codigo') . '\',' . '\'' . $constraints->getFilterField('fecha_desde') . '\',\'' . $constraints->getFilterField('fecha_hasta') . '\',\'' . $constraints->getFilterField('categorias_codigo') . '\',' . $constraints->getFilterField('incluye_manuales') . ',' . $constraints->getFilterField('incluye_altura') . ',null)';
     }
     return $sql;
 }
 /**
  * @see \TSLBasicRecordDAO::getFetchQuery()
  */
 protected function getFetchQuery(\TSLDataModel &$record = NULL, \TSLRequestConstraints &$constraints = NULL, $subOperation = NULL)
 {
     if ($subOperation == 'fetchJoined') {
         $sql = 'select eatl.competencias_pruebas_id,eatl.competencias_pruebas_origen_id,eatl.competencias_codigo,atletas_resultados_id,eatl.pruebas_codigo,competencias_pruebas_fecha,' . '(case when apppruebas_viento_individual = TRUE THEN ar.atletas_resultados_viento ELSE competencias_pruebas_viento END) as competencias_pruebas_viento,' . 'competencias_pruebas_manual,competencias_pruebas_tipo_serie,competencias_pruebas_nro_serie,' . 'competencias_pruebas_anemometro, competencias_pruebas_material_reglamentario, competencias_pruebas_origen_combinada, competencias_pruebas_observaciones, ' . 'coalesce(atletas_codigo,\'' . $constraints->getFilterField('atletas_codigo') . '\') as atletas_codigo,atletas_resultados_resultado,atletas_resultados_puntos,atletas_resultados_puesto,pr.pruebas_descripcion,apppruebas_marca_menor,' . 'apppruebas_marca_menor,apppruebas_verifica_viento,unidad_medida_regex_e,unidad_medida_tipo,unidad_medida_regex_m,' . 'eatl.activo,ar.xmin as "versionId" ' . 'from  tb_competencias_pruebas eatl ' . 'left join tb_atletas_resultados ar on ar.competencias_pruebas_id = eatl.competencias_pruebas_id ' . 'inner join tb_pruebas pr on pr.pruebas_codigo =eatl.pruebas_codigo ' . 'inner join tb_app_pruebas_values pv on pv.apppruebas_codigo = pr.pruebas_generica_codigo ' . 'inner join tb_pruebas_clasificacion cl on cl.pruebas_clasificacion_codigo = pv.pruebas_clasificacion_codigo ' . 'inner join tb_unidad_medida um on um.unidad_medida_codigo = cl.unidad_medida_codigo ';
         // 'where competencias_pruebas_origen_id  is not null and atletas_codigo=\'46658908\'';
     } else {
         if ($subOperation == 'fetchDetalleForPrueba') {
             $sql = 'select * from sp_view_prueba_resultados_detalle(' . $constraints->getFilterField('atletas_resultados_id') . ') ';
             $constraints->removeFilterField('atletas_resultados_id');
         } else {
             $sql = 'select competencias_pruebas_id,atletas_resultados_id,atletas_codigo,competencias_codigo,' . '(case when apppruebas_viento_individual = TRUE THEN eatl.atletas_resultados_viento ELSE competencias_pruebas_viento END) as competencias_pruebas_viento,' . 'competencias_pruebas_manual,' . 'pruebas_codigo,competencias_pruebas_origen_combinada,competencias_pruebas_fecha,' . 'competencias_pruebas_tipo_serie,competencias_pruebas_nro_serie,' . 'competencias_pruebas_anemometro,competencias_pruebas_material_reglamentario,' . 'competencias_pruebas_observaciones,atletas_resultados_resultado,atletas_resultados_puntos,atletas_resultados_puesto,' . 'activo,xmin as "versionId" from  tb_atletas_resultados eatl ' . 'inner join tb_competencias_pruebas cp on cp.competencias_pruebas_id = eatl.competencias_pruebas_id ' . 'inner join tb_pruebas pr on pr.pruebas_codigo =eatl.pruebas_codigo ' . 'inner join tb_app_pruebas_values pv on pv.apppruebas_codigo = pr.pruebas_generica_codigo ';
         }
     }
     if ($this->activeSearchOnly == TRUE) {
         // Solo activos
         $sql .= ' where eatl.activo=TRUE ';
     }
     // Que pasa si el campo a buscar existe en ambas partes del join?
     $where = $constraints->getFilterFieldsAsString();
     if (strlen($where) > 0) {
         if ($this->activeSearchOnly == TRUE) {
             $sql .= ' and ' . $where;
         } else {
             $sql .= ' where ' . $where;
         }
     }
     if (isset($constraints)) {
         $orderby = $constraints->getSortFieldsAsString();
         if ($orderby !== NULL) {
             $sql .= ' order by ' . $orderby;
         }
     }
     // Chequeamos paginacion
     $startRow = $constraints->getStartRow();
     $endRow = $constraints->getEndRow();
     if ($endRow > $startRow) {
         $sql .= ' LIMIT ' . ($endRow - $startRow) . ' OFFSET ' . $startRow;
     }
     $sql = str_replace('"atletas_resultados_id"', 'eatl.atletas_resultados_id', $sql);
     return $sql;
 }
    /**
     * @see \TSLBasicRecordDAO::getFetchQuery()
     */
    protected function getFetchQuery(\TSLDataModel &$record = NULL, \TSLRequestConstraints &$constraints = NULL, $subOperation = NULL)
    {
        /* @var $record  CompetenciasPruebasModel  */
        if ($subOperation == 'fetchPruebasPorCompetencia') {
            // Aqui solo se devolveran las pruebas genericas que componen una competencia , por ende
            // se espera coo parametro el codigo de competencia, es similar a la anterior pero esperando diferente
            // parametro , las separa por comodidad. La lista solo contendra las pruebas ya actualmente
            // definidas como parte de la competencia
            $where = $constraints->getFilterFieldsAsString();
            $sql = 'select  cp.competencias_pruebas_id,cp.competencias_codigo,
                        pr.pruebas_codigo,
                        cp.competencias_pruebas_fecha,cp.competencias_pruebas_viento,cp.competencias_pruebas_manual,
                        cp.competencias_pruebas_origen_combinada,
                        cp.competencias_pruebas_tipo_serie,cp.competencias_pruebas_nro_serie,cp.competencias_pruebas_anemometro,
                        cp.competencias_pruebas_material_reglamentario,
                        cp.competencias_pruebas_observaciones,
                        pr.pruebas_generica_codigo,
                        pv.apppruebas_descripcion,
                        pr.pruebas_descripcion || \' (\' || (case when pruebas_sexo = \'F\' then \'Damas\' else \'Varones\' end) || \')\' as pruebas_descripcion,
                        pv.apppruebas_multiple,
                        (case when cp.competencias_pruebas_tipo_serie IN (\'SU\',\'FI\')  then cp.competencias_pruebas_tipo_serie else (cp.competencias_pruebas_tipo_serie || \'-\' || cp.competencias_pruebas_nro_serie) end) as serie,
                        cp.competencias_pruebas_origen_id,pruebas_sexo,cp.xmin as "versionId"
                 from  tb_competencias_pruebas cp
                            inner join tb_pruebas pr on pr.pruebas_codigo = cp.pruebas_codigo
                            inner join tb_app_pruebas_values pv on pv.apppruebas_codigo = pr.pruebas_generica_codigo
                            where ' . str_replace('"competencias_', 'cp."competencias_', $where) . 'order by pruebas_sexo,apppruebas_descripcion,cp.competencias_pruebas_tipo_serie,cp.competencias_pruebas_nro_serie';
        } else {
            if ($subOperation == 'fetchCompetenciasResultadoPrueba') {
                // Devuelve los datos de una tleta para una especifica prueba , si la prueba es null retornara todos
                // sus resultados.
                $sql = 'select * from  sp_view_resultados_competencia_especifica(\'' . $constraints->getFilterField('competencias_codigo') . '\',\'' . $constraints->getFilterField('pruebas_codigo') . '\',\'' . $constraints->getFilterField('pruebas_sexo') . '\',null,null) ';
                $constraints->removeFilterField('pruebas_codigo');
                $constraints->removeFilterField('competencias_codigo');
                $constraints->removeFilterField('pruebas_sexo');
                // echo $sql;
            } else {
                if ($subOperation == 'fetchPruebasValidasForCompetencia') {
                    // Lista de todas las competencias posibles de crear para una determinada competencia esten creadas o no, por la
                    // posibilidad que se requiere crear series o grupos, Si una combinada es parte ya de la competencia , no
                    // aparecera en esta lista, ya que no se puede definir 2 veces.
                    //
                    // El query busca todas las posibles pruebas para la categoria de la competencia , menos la combinadas ya definidasd
                    // Devuelve informacion complemnetaria de las pruebas para su posible trabajo/validacion en el lado solicitante.
                    $sql = 'select * from (
                        select
                        pruebas_codigo,pruebas_descripcion || \' (\' || (case when pruebas_sexo = \'F\' then \'Damas\' else \'Varones\' end) || \')\' as pruebas_descripcion,
                        pruebas_generica_codigo,
                        pr.categorias_codigo,
                        pruebas_sexo,
                        pg.apppruebas_multiple,
                        pg.apppruebas_verifica_viento,
                        pg.apppruebas_descripcion,
                        pg.apppruebas_viento_individual,
                        pg.apppruebas_nro_atletas,
                        unidad_medida_tipo,
                        unidad_medida_regex_e,
                        unidad_medida_regex_m,
                        (SELECT competencias_pruebas_id
FROM tb_competencias_pruebas where pruebas_codigo =
	(select pruebas_codigo from tb_pruebas_detalle where pruebas_detalle_prueba_codigo=pr.pruebas_codigo) and
        competencias_codigo=\'' . $constraints->getFilterField('competencias_codigo') . '\') as competencias_pruebas_origen_id
                        from  tb_pruebas pr
                        inner join tb_app_pruebas_values pg on pg.apppruebas_codigo = pr.pruebas_generica_codigo
                        inner join tb_pruebas_clasificacion pc on pc.pruebas_clasificacion_codigo = pg.pruebas_clasificacion_codigo
                        inner join tb_unidad_medida um on um.unidad_medida_codigo = pc.unidad_medida_codigo
                        where pr.categorias_codigo = (select categorias_codigo from tb_competencias where competencias_codigo=\'' . $constraints->getFilterField('competencias_codigo') . '\')) results ';
                    $constraints->removeFilterField('competencias_codigo');
                } else {
                    $sql = 'select  cp.competencias_pruebas_id,cp.competencias_codigo,
                        cp.pruebas_codigo,
                        cp.competencias_pruebas_fecha,cp.competencias_pruebas_viento,cp.competencias_pruebas_manual,
                        cp.competencias_pruebas_origen_combinada,
                        cp.competencias_pruebas_tipo_serie,cp.competencias_pruebas_nro_serie,cp.competencias_pruebas_anemometro,
                        cp.competencias_pruebas_material_reglamentario,
                        cp.competencias_pruebas_observaciones,cp.competencias_pruebas_origen_id,
                        competencias_pruebas_origen_combinada,
                        cp.xmin as "versionId"
                 from  tb_competencias_pruebas cp ';
                }
            }
            if ($this->activeSearchOnly == TRUE) {
                // Solo activos
                $sql .= ' where eatl.activo = TRUE ';
            }
            // Que pasa si el campo a buscar existe en ambas partes del join?
            $where = $constraints->getFilterFieldsAsString();
            if (strlen($where) > 0) {
                if ($this->activeSearchOnly == TRUE) {
                    $sql .= ' and ' . $where;
                } else {
                    $sql .= ' where ' . $where;
                }
            }
            if (isset($constraints)) {
                $orderby = $constraints->getSortFieldsAsString();
                if ($orderby !== NULL) {
                    $sql .= ' order by ' . $orderby;
                }
            }
            // Chequeamos paginacion
            $startRow = $constraints->getStartRow();
            $endRow = $constraints->getEndRow();
            if ($endRow > $startRow) {
                $sql .= ' LIMIT ' . ($endRow - $startRow) . ' OFFSET ' . $startRow;
            }
        }
        $sql = str_replace('like', 'ilike', $sql);
        //  echo $sql;
        return $sql;
    }
 /**
  * @see \TSLBasicRecordDAO::getFetchQuery()
  */
 protected function getFetchQuery(\TSLDataModel &$record = NULL, \TSLRequestConstraints &$constraints = NULL, $subOperation = NULL)
 {
     $sql = '';
     // Construyo el arreglo pgsql de atletas
     $prefix = '';
     $atletasArray = '\'{';
     for ($i = 1; $i <= 5; $i++) {
         $atleta_num = 'atletas_codigo_0' . $i;
         if ($constraints->getFilterField($atleta_num)) {
             $atletasArray .= $prefix . $constraints->getFilterField($atleta_num) . '';
         }
         $prefix = ',';
     }
     $atletasArray .= '}\'';
     if ($subOperation == 'fetchResultadosPorPrueba') {
         $sql = 'select * from  sp_view_resumen_resultados_por_prueba_atletas(\'' . $constraints->getFilterField('apppruebas_codigo') . '\'' . ',' . $atletasArray . ',' . '\'' . $constraints->getFilterField('atletas_sexo') . '\',' . '\'' . $constraints->getFilterField('fecha_desde') . '\',\'' . $constraints->getFilterField('fecha_hasta') . '\',\'' . $constraints->getFilterField('categorias_desde') . '\',\'' . $constraints->getFilterField('categorias_hasta') . '\',' . $constraints->getFilterField('incluye_manuales') . ',' . $constraints->getFilterField('incluye_observadas') . ',null)';
     } else {
         if ($subOperation == 'fetchResultadosPorPruebaTopN') {
             $sql = 'select * from  sp_view_resumen_topn_resultados_por_prueba_atletas(\'' . $constraints->getFilterField('apppruebas_codigo') . '\'' . ',' . $atletasArray . ',' . '\'' . $constraints->getFilterField('atletas_sexo') . '\',' . '\'' . $constraints->getFilterField('fecha_desde') . '\',\'' . $constraints->getFilterField('fecha_hasta') . '\',\'' . $constraints->getFilterField('categorias_desde') . '\',\'' . $constraints->getFilterField('categorias_hasta') . '\',' . $constraints->getFilterField('incluye_manuales') . ',' . $constraints->getFilterField('incluye_observadas') . ',' . $constraints->getFilterField('n_records') . ')';
         }
     }
     //  $sql = str_replace('"competencias_pruebas_id"', 'ar.competencias_pruebas_id', $sql);
     //  echo $sql;
     return $sql;
 }
 /**
  * @see TSLBasicRecordDAO::getFetchQuery()
  */
 protected function getFetchQuery(\TSLDataModel &$record = NULL, \TSLRequestConstraints &$constraints = NULL, $subOperation = NULL)
 {
     if ($subOperation == 'fetchForList') {
         // USamos un campo virtual que es atletas_agno el cual es computado , por ende se usa un select
         /// extermo para que el where lo pueda usar.
         $sql = 'select atletas_codigo ,atletas_nombre_completo,atletas_sexo,' . 'paises_codigo from  tb_atletas a';
     } else {
         if ($subOperation == 'fetchForListByPosta') {
             // USamos un campo virtual que es atletas_agno el cual es computado , por ende se usa un select
             /// extermo para que el where lo pueda usar.
             $atletas_codigo = $constraints->getFilterField('atletas_codigo');
             if ($atletas_codigo) {
                 $where = $constraints->getFilterFieldsAsString();
                 $sql = 'SELECT
                       a.atletas_codigo,
                       a.atletas_nombre_completo
                     FROM tb_atletas a ';
                 if (strlen($where) > 0) {
                     $sql .= ' where ' . $where;
                 }
             } else {
                 $sql = 'SELECT
                       a.atletas_codigo,
                       a.atletas_nombre_completo
                     FROM tb_atletas a
                     WHERE atletas_sexo = (SELECT pr.pruebas_sexo
                                           FROM tb_postas ps
                                             INNER JOIN tb_competencias_pruebas cp ON cp.competencias_pruebas_id = ps.competencias_pruebas_id
                                             INNER JOIN tb_pruebas pr ON pr.pruebas_codigo = cp.pruebas_codigo
                                             WHERE ps.postas_id = ' . $constraints->getFilterField('postas_id') . ')  ';
                 $constraints->removeFilterField('postas_id');
                 $where = $constraints->getFilterFieldsAsString();
                 if (strlen($where) > 0) {
                     $sql .= ' and ' . $where . ' and a.atletas_protected=FALSE ';
                 } else {
                     $sql .= 'and a.atletas_protected=FALSE ';
                 }
             }
         } else {
             if ($subOperation == 'fetchForListByPrueba') {
                 // USamos un campo virtual que es atletas_agno el cual es computado , por ende se usa un select
                 /// extermo para que el where lo pueda usar.
                 $sql = 'SELECT DISTINCT
                       CASE WHEN ar.postas_id IS  NULL
                         THEN  a.atletas_codigo
                         ELSE pd.atletas_codigo
                         END AS atletas_codigo,
                       CASE WHEN ar.postas_id IS NOT  NULL
                         THEN  (SELECT atletas_nombre_completo FROM tb_atletas WHERE atletas_codigo = pd.atletas_codigo)
                       ELSE atletas_nombre_completo
                       END AS atletas_nombre_completo
                     FROM tb_atletas a
                       INNER JOIN tb_atletas_resultados ar ON ar.atletas_codigo = a.atletas_codigo
                       INNER JOIN tb_competencias_pruebas cp ON cp.competencias_pruebas_id = ar.competencias_pruebas_id
                       INNER JOIN tb_pruebas pc ON pc.pruebas_codigo = cp.pruebas_codigo
                       LEFT  JOIN tb_postas po ON po.competencias_pruebas_id = cp.competencias_pruebas_id AND po.postas_id = ar.postas_id
                       LEFT JOIN  tb_postas_detalle pd ON pd.postas_id = ar.postas_id ';
             } else {
                 if ($subOperation == 'fetchForListByPruebaGenerica') {
                     $sql = 'SELECT DISTINCT
                       -- IMPORTANTE , si es una posta dado que no existe un unico codigo de atleta
                       -- lo simulamos con el concatenado ordenado de los codigos de los atletas de las postas.
                       -- Si se desea ubicar a una posta DEBERA ENVIARSE el valor de atletas_resultados_id del resultado
                       -- si no la respuesta sera incorrecta.
                       (CASE WHEN ar.postas_id IS NOT NULL
                         THEN
                           (SELECT array_to_string(ARRAY(SELECT unnest(array_agg(atl.atletas_codigo))
                                                         ORDER BY 1), \',\')
                            FROM tb_postas_detalle pd
                              INNER JOIN tb_postas po ON po.postas_id = pd.postas_id
                              INNER JOIN tb_atletas atl ON atl.atletas_codigo = pd.atletas_codigo
                            WHERE pd.postas_id = ar.postas_id
                            GROUP BY pd.postas_id)
                        ELSE
                          a.atletas_codigo
                        END) AS atletas_codigo,
                       (CASE WHEN ar.postas_id IS NOT NULL
                         THEN
                           (SELECT array_to_string(ARRAY(SELECT unnest(array_agg(atl.atletas_ap_paterno))
                                                         ORDER BY 1), \',\')
                            FROM tb_postas_detalle pd
                              INNER JOIN tb_postas po ON po.postas_id = pd.postas_id
                              INNER JOIN tb_atletas atl ON atl.atletas_codigo = pd.atletas_codigo
                            WHERE pd.postas_id = ar.postas_id
                            GROUP BY pd.postas_id)
                        ELSE
                          atletas_nombre_completo
                        END) AS atletas_nombre_completo
                     FROM tb_atletas a
                       INNER JOIN tb_atletas_resultados ar ON ar.atletas_codigo = a.atletas_codigo
                       INNER JOIN tb_competencias_pruebas cp ON cp.competencias_pruebas_id = ar.competencias_pruebas_id
                       INNER JOIN tb_pruebas pc ON pc.pruebas_codigo = cp.pruebas_codigo
                       INNER JOIN tb_app_pruebas_values pv ON pv.apppruebas_codigo = pc.pruebas_generica_codigo';
                 } else {
                     if ($subOperation == 'fetchForListForResultados') {
                         $sql = 'SELECT *  FROM (SELECT atletas_codigo ,atletas_nombre_completo,atletas_sexo,activo 
                     FROM  tb_atletas
                     WHERE atletas_protected != TRUE ) a';
                     } else {
                         // USamos un campo virtual que es atletas_agno el cual es computado , por ende se usa un select
                         /// extermo para que el where lo pueda usar.
                         $sql = 'SELECT *  FROM (SELECT atletas_codigo ,atletas_ap_paterno ,atletas_ap_materno,atletas_nombres,atletas_nombre_completo,atletas_sexo,' . 'atletas_nro_documento,atletas_nro_pasaporte,paises_codigo,atletas_fecha_nacimiento,EXTRACT(YEAR FROM atletas_fecha_nacimiento)::CHARACTER VARYING AS atletas_agno,atletas_telefono_casa,' . 'atletas_telefono_celular,atletas_email,atletas_direccion,atletas_observaciones,atletas_talla_ropa_buzo,atletas_talla_ropa_poloshort,atletas_talla_zapatillas,atletas_norma_zapatillas,' . 'atletas_url_foto,atletas_protected,activo,xmin AS "versionId" FROM  tb_atletas 
                 WHERE atletas_protected != TRUE) a';
                     }
                 }
             }
         }
     }
     if ($this->activeSearchOnly == TRUE) {
         // Solo activos
         if ($subOperation == 'fetchForListByPosta') {
             $sql .= ' and a.activo=TRUE ';
         } else {
             $sql .= ' where a.activo=TRUE ';
         }
     }
     if ($subOperation !== 'fetchForListByPosta') {
         $where = $constraints->getFilterFieldsAsString();
         if (strlen($where) > 0) {
             if ($this->activeSearchOnly == TRUE) {
                 $sql .= ' and ' . $where;
             } else {
                 $sql .= ' where ' . $where;
             }
         }
     }
     if (isset($constraints)) {
         $orderby = $constraints->getSortFieldsAsString();
         if ($orderby !== NULL) {
             $sql .= ' order by ' . $orderby;
         }
     }
     $sql = str_replace('"atletas_codigo"', 'a.atletas_codigo', $sql);
     // Chequeamos paginacion
     $startRow = $constraints->getStartRow();
     $endRow = $constraints->getEndRow();
     if ($endRow > $startRow) {
         $sql .= ' LIMIT ' . ($endRow - $startRow) . ' OFFSET ' . $startRow;
     }
     $sql = str_replace('like', 'ilike', $sql);
     // echo $sql;
     return $sql;
 }
 /**
  * @see TSLBasicRecordDAO::getFetchQuery()
  */
 protected function getFetchQuery(\TSLDataModel &$record = NULL, \TSLRequestConstraints &$constraints = NULL, $subOperation = NULL)
 {
     /* @var $record  AtletasPruebasResultadosModel */
     // Las 2 primeras operaciones no requieren proceso alguno de parametors fuera del modelo, como filtros , limites ,etc
     if ($subOperation == 'fetchPruebasPorAtleta') {
         // Aqui solo se devolveran en que pruebas genericas ha participado historicamente el atleta especificado, se espera el codigo de atleta como parametro
         $atletas_codigo = $constraints->getFilterField('atletas_codigo');
         $sql = 'SELECT DISTINCT pv.apppruebas_codigo,pv.apppruebas_descripcion
                     FROM
                       tb_atletas_resultados ar
                       INNER JOIN tb_competencias_pruebas cp ON cp.competencias_pruebas_id = ar.competencias_pruebas_id
                         INNER JOIN tb_pruebas pr ON pr.pruebas_codigo = cp.pruebas_codigo
                         INNER JOIN tb_app_pruebas_values pv ON pv.apppruebas_codigo = pr.pruebas_generica_codigo
                     WHERE ar.atletas_codigo = \'' . $atletas_codigo . '\'' . 'UNION ALL                        
                     SELECT DISTINCT pv.apppruebas_codigo,pv.apppruebas_descripcion 
                     FROM tb_postas_detalle pd
                     INNER JOIN tb_postas po ON po.postas_id = pd.postas_id
                       INNER JOIN tb_competencias_pruebas cp ON cp.competencias_pruebas_id = po.competencias_pruebas_id
                       INNER JOIN tb_atletas_resultados ar on ar.competencias_pruebas_id = cp.competencias_pruebas_id
                       INNER JOIN tb_pruebas pr ON pr.pruebas_codigo = cp.pruebas_codigo
                       INNER JOIN tb_app_pruebas_values pv ON pv.apppruebas_codigo = pr.pruebas_generica_codigo
                     WHERE pd.atletas_codigo = \'' . $atletas_codigo . '\'' . ' ORDER BY apppruebas_descripcion';
         $constraints->removeFilterField('atletas_codigo');
     } else {
         if ($subOperation == 'fetchPruebasPorCompetencia') {
             // Aqui solo se devolveran las pruebas genericas que componen una competencia , por ende
             // se espera coo parametro el codigo de competencia, es similar a la anterior pero esperando diferente
             // parametro , las separa por comodidad.
             $where = $constraints->getFilterFieldsAsString();
             $sql = 'SELECT DISTINCT pv.apppruebas_codigo,pv.apppruebas_descripcion FROM  tb_atletas_resultados ar ' . 'INNER JOIN tb_competencias_pruebas cp ON cp.competencias_pruebas_id = ar.competencias_pruebas_id ' . 'INNER JOIN tb_pruebas pr ON pr.pruebas_codigo = cp.pruebas_codigo ' . 'INNER JOIN tb_app_pruebas_values pv ON pv.apppruebas_codigo = pr.pruebas_generica_codigo ' . 'WHERE' . $where . 'order BY apppruebas_descripcion';
         } else {
             if ($subOperation == 'fetchForRecords') {
                 // Aqui solo se devolveran las pruebas genericas de uno o mas atletas , se espera como filto un atleta y
                 // una prueba para una seleccion afinada. Se retiran las pruebas con viento ilegal
                 $atletas_codigo = $constraints->getFilterField('atletas_codigo');
                 $apppruebas_codigo = $constraints->getFilterField('apppruebas_codigo');
                 $constraints->removeFilterField('atletas_codigo');
                 $constraints->removeFilterField('apppruebas_codigo');
                 $sql = 'SELECT *
                 FROM (SELECT
                 atletas_resultados_id,
                 (CASE WHEN eatl.postas_id IS NOT NULL
                   THEN
                     (SELECT array_to_string(ARRAY(SELECT unnest(array_agg(atl.atletas_codigo))
                                                   ORDER BY 1), \',\')
                      FROM tb_postas_detalle pd
                        INNER JOIN tb_postas po ON po.postas_id = pd.postas_id
                        INNER JOIN tb_atletas atl ON atl.atletas_codigo = pd.atletas_codigo
                      WHERE pd.postas_id = eatl.postas_id
                      GROUP BY pd.postas_id)
                  ELSE
                    atl.atletas_codigo
                  END)                        AS atletas_codigo,
                 apppruebas_codigo,
                 (CASE WHEN
                   coalesce((CASE WHEN apppruebas_viento_individual = TRUE
                     THEN eatl.atletas_resultados_viento
                             ELSE competencias_pruebas_viento END), 0.00) > apppruebas_viento_limite_normal
                   THEN -10000.00
                  ELSE coalesce((CASE WHEN apppruebas_viento_individual = TRUE
                    THEN eatl.atletas_resultados_viento
                                 ELSE competencias_pruebas_viento END), 0.00)
                  END)                        AS competencias_pruebas_viento,
                 co.categorias_codigo,
                 co.competencias_descripcion,
                 ciudades_descripcion,
                 paises_descripcion,
                 ciudades_altura,
                 competencias_pruebas_fecha,
                 atletas_resultados_resultado AS numb_resultado
                 FROM  tb_atletas_resultados eatl
                 INNER JOIN tb_competencias_pruebas cp ON cp.competencias_pruebas_id = eatl.competencias_pruebas_id
                 INNER JOIN tb_atletas atl ON eatl.atletas_codigo = atl.atletas_codigo
                 INNER JOIN tb_pruebas pr ON pr.pruebas_codigo = cp.pruebas_codigo
                 INNER JOIN tb_app_pruebas_values pv ON pv.apppruebas_codigo = pr.pruebas_generica_codigo
                 INNER JOIN tb_competencias co ON co.competencias_codigo = cp.competencias_codigo
                 INNER JOIN tb_ciudades ciu ON ciu.ciudades_codigo = co.ciudades_codigo
                 INNER JOIN tb_paises pa ON pa.paises_codigo = ciu.paises_codigo
                 INNER JOIN tb_pruebas_clasificacion cl ON cl.pruebas_clasificacion_codigo = pv.pruebas_clasificacion_codigo
                 INNER JOIN tb_unidad_medida um ON um.unidad_medida_codigo = cl.unidad_medida_codigo
                 where apppruebas_codigo=\'' . $apppruebas_codigo . '\' and competencias_pruebas_anemometro = TRUE AND
                         competencias_pruebas_material_reglamentario = TRUE AND
                        -- competencias_pruebas_manual = false and
                         atletas_resultados_resultado != \'0\' AND atletas_resultados_resultado IS NOT NULL AND atletas_resultados_resultado <> \'\'
                 ) res
                 WHERE res.competencias_pruebas_viento != -10000.00  AND atletas_codigo = \'' . $atletas_codigo . '\' ' . 'ORDER BY competencias_pruebas_fecha';
             } else {
                 if ($subOperation == 'fetchJoined') {
                     $sql = 'SELECT * FROM (' . 'SELECT
                       atletas_resultados_id,
                       cp.pruebas_codigo,
                       eatl.atletas_codigo,
                       -- Esto para resolver los casos de postas
                       (CASE WHEN eatl.postas_id IS NOT NULL
                         THEN
                           (SELECT max(postas_descripcion) || \' - \' || array_to_string(ARRAY(SELECT unnest(array_agg(atl.atletas_ap_paterno))
                                                                                             ORDER BY 1), \',\')
                            FROM tb_postas_detalle pd
                              INNER JOIN tb_postas po ON po.postas_id = pd.postas_id
                              INNER JOIN tb_atletas atl ON atl.atletas_codigo = pd.atletas_codigo
                            WHERE pd.postas_id = eatl.postas_id
                            GROUP BY pd.postas_id)
                        ELSE
                          atletas_nombre_completo
                        END ) AS atletas_nombre_completo,
                       pr.pruebas_descripcion,
                       cp.competencias_pruebas_tipo_serie,
                       cp.competencias_pruebas_nro_serie,
                       cp.competencias_codigo,
                       (CASE WHEN apppruebas_viento_individual = TRUE
                         THEN eatl.atletas_resultados_viento
                        ELSE competencias_pruebas_viento END)                                                AS competencias_pruebas_viento,
                       atletas_resultados_puesto,
                       competencias_pruebas_manual,
                       apppruebas_multiple,
                       co.categorias_codigo,
                       competencias_pruebas_material_reglamentario,
                       competencias_pruebas_anemometro,
                       co.competencias_descripcion,
                       ciudades_descripcion,
                       paises_descripcion,
                       atl.atletas_sexo,
                       ciudades_altura,
                       competencias_pruebas_observaciones,
                       atletas_resultados_protected,
                       competencias_pruebas_fecha,
                       atletas_resultados_resultado,
                       atletas_resultados_puntos,
                       (CASE WHEN competencias_pruebas_tipo_serie IN (\'SU\', \'FI\')
                         THEN competencias_pruebas_tipo_serie
                        ELSE (competencias_pruebas_tipo_serie || \'-\' || competencias_pruebas_nro_serie) END) AS serie,
                       (CASE WHEN competencias_pruebas_material_reglamentario = FALSE OR competencias_pruebas_anemometro = FALSE OR
                                  competencias_pruebas_manual = TRUE OR ciudades_altura = TRUE
                         THEN TRUE
                        ELSE FALSE END)                                                                      AS obs,
                       eatl.competencias_pruebas_id,
                       eatl.postas_id,
                       eatl.activo,
                       eatl.xmin                                                                             AS "versionId"
                     FROM tb_atletas_resultados eatl
                       INNER JOIN tb_competencias_pruebas cp ON cp.competencias_pruebas_id = eatl.competencias_pruebas_id
                       INNER JOIN tb_atletas atl ON eatl.atletas_codigo = atl.atletas_codigo
                       INNER JOIN tb_pruebas pr ON pr.pruebas_codigo = cp.pruebas_codigo
                       INNER JOIN tb_app_pruebas_values pv ON pv.apppruebas_codigo = pr.pruebas_generica_codigo
                       INNER JOIN tb_competencias co ON co.competencias_codigo = cp.competencias_codigo
                       INNER JOIN tb_ciudades ciu ON ciu.ciudades_codigo = co.ciudades_codigo
                       INNER JOIN tb_paises pa ON pa.paises_codigo = ciu.paises_codigo
                     WHERE competencias_pruebas_origen_combinada = FALSE' . ' ) answer ';
                 } else {
                     if ($subOperation == 'fetchAtletasResultadoPrueba') {
                         // Devuelve los datos de una tleta para una especifica prueba , si la prueba es null retornara todos
                         // sus resultados.
                         $sql = 'SELECT * FROM  sp_view_resultados_atleta(\'' . $constraints->getFilterField('atletas_codigo') . '\',\'' . $constraints->getFilterField('apppruebas_codigo') . '\',NULL,NULL) ';
                         $constraints->removeFilterField('apppruebas_codigo');
                         $constraints->removeFilterField('atletas_codigo');
                     } else {
                         $sql = 'select atletas_resultados_id, atletas_codigo, competencias_codigo, pruebas_codigo,' . 'atletas_resultados_viento, atletas_resultados_puesto, atletas_resultados_manual,' . 'competencias_pruebas_fecha, competencias_pruebas_viento,' . 'competencias_pruebas_tipo_serie, competencias_pruebas_nro_serie, competencias_pruebas_anemometro,' . 'competencias_pruebas_material_reglamentario, competencias_pruebas_manual, competencias_pruebas_observaciones,' . 'atletas_resultados_resultado, atletas_resultados_puntos, ' . 'atletas_resultados_puesto, activo, xmin as "versionId" from tb_atletas_resultados eatl ' . 'inner join tb_competencias_pruebas cp on cp.competencias_pruebas_id = eatl.competencias_pruebas_id ' . 'inner join tb_pruebas pr on pr.pruebas_codigo = cp.pruebas_codigo ' . 'inner join tb_app_pruebas_values pv on pv.apppruebas_codigo = pr.pruebas_generica_codigo ';
                     }
                 }
                 if ($this->activeSearchOnly == TRUE) {
                     // Solo activos
                     $sql .= ' where eatl.activo = TRUE ';
                 }
                 // Que pasa si el campo a buscar existe en ambas partes del join?
                 $where = $constraints->getFilterFieldsAsString();
                 if (strlen($where) > 0) {
                     if ($this->activeSearchOnly == TRUE) {
                         $sql .= ' and ' . $where;
                     } else {
                         $sql .= ' where ' . $where;
                     }
                 }
                 // TRUCO: dado que en pantalla se muestra e resultado para formato visual , ese
                 // campo no puede ser usado para el sort , en este caso se cambia por el real
                 // uniformizado. (norm_resultado)
                 // Asi mismo para el fetch principal de todas las pruebas , retiramos de la pantalla principal aquellas
                 // que son parte de una prueba combinada, ya que estas se editaran a traves de las mismas.
                 if ($subOperation == 'fetchAtletasResultadoPrueba') {
                     $sql = str_replace('atletas_resultados_resultado', 'norm_resultado', $sql);
                 }
                 // order by?
                 if (isset($constraints)) {
                     $orderby = $constraints->getSortFieldsAsString();
                     if ($orderby !== NULL) {
                         $sql .= ' order by ' . $orderby;
                     }
                 }
                 // Chequeamos paginacion
                 $startRow = $constraints->getStartRow();
                 $endRow = $constraints->getEndRow();
                 if ($endRow > $startRow) {
                     $sql .= ' LIMIT ' . ($endRow - $startRow) . ' OFFSET ' . $startRow;
                 }
             }
         }
     }
     $sql = str_replace('like', 'ilike', $sql);
     // echo $sql;
     return $sql;
 }