<?php

/**
 * balprunivaux_comp actions.
 *
 * @package    Sofhouse
 * @subpackage balprunivaux_comp
 * @author     Software House
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class balprunivaux_compActions extends sfQuery {

    /**
     * Metodo del servicio list - consulta balance prueba comparativo
     *
     * @param sfWebRequest $request
     */
    public function executeListopt(sfWebRequest $request) {

        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        /*
         * Variables globales
         */
        $modulo = sfConfig::get('app_modulo');
        $usuarioERP = sfConfig::get('app_usuarioERP');
        $claveERP = sfConfig::get('app_claveERP');
        $usuarioERPContab = sfConfig::get('app_usuarioERPContab');
        $claveERPContab = sfConfig::get('app_claveERPContab');



        /*
         * variables por defecto para el registro de log
         */
        $id_tabla = 'null';

        //validar vigencia
        $id_vigencia = 'null';
        if (isset($request['id_vigencia'])) {
            $id_vigencia = $request['id_vigencia'];
        }

        //validar centro de operacion
        $id_cen_op = 'null';
        if (isset($request['id_cen_op'])) {
            $id_cen_op = $request['id_cen_op'];
        }

        $id_cia = 'null';
        if (isset($request['id_cia'])) {
            $id_cia = $request['id_cia'];
        }

        //id maestro tabla - para consulta informes no es necesario
        $id_mae_bd = 'null';

        //1 - indica operacion de consulta
        $id_ope_bd = 1;

        //id del maestro tercero
        $id_mae_ter = 1;
        if (isset($request['id_username'])) {
            $id_mae_ter = $request['id_username'];
        }
        $usuario = 'admin';
        if (isset($request['username'])) {
            if (!is_null($request['username']) && $request['username'] != '') {
                $usuario = $request['username'];
            }
        }
        $comando = 'sin comando';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }

        /*
         * construir observacion
         */
        $informe = 'sin especificar';

        //sentencia sql
        $sql = <<<EOD
select * from CREDENCIAL
where ID_MOD = $modulo
and comando = '$comando'
EOD;

        //ejecuta y obtiene el resultado del sql
        $resultado = CN_TABLE::executeOCI_SQL_List($sql, $usuarioERP, $claveERP);

        if (count($resultado) > 0) {
            $informe = $resultado[0]['NOMBRE'];
        }

        //observacion para el log
        $observacion = "'Se consulto informe: " . $informe . " desde la funcionalidad: " . $comando . "'";



        /*
         * tomar variables del request - obligatorias
         */
        $this->cia = $cia = $request['id_cia'];
        $this->vigIni = $vigencia = $request['id_vigencia'];
        $this->perIni = $periodo = $request['id_periodo_contable'];
        $this->vigFin = $vig_compar = $request['vig_compar'];
        $this->perFin = $per_compar = $request['per_compar'];

        //nombres de meses
        $this->nom_perIni = $request['namePeriodoIni'];
        $this->nom_perFin = $request['namePeriodoFin'];

        /*
         * construccion de sql para variables  de cuentas
         */
        //construir where para clase cuenta
        if (isset($request['id_clase_cuenta_ini']) && isset($request['id_clase_cuenta_fin'])) {
            $whereClase = 'and ( id_clase_cuenta between ' . $request['id_clase_cuenta_ini'] . ' and ' . $request['id_clase_cuenta_fin'] . ' or id_clase_cuenta is null ) ';
        } else {
            $whereClase = ' ';
        }
        //construir where para grupo cuenta
        if (isset($request['id_grupo_cuenta_ini']) && isset($request['id_grupo_cuenta_fin'])) {
            $whereGrupo = 'and ( id_grupo_cuenta between ' . $request['id_grupo_cuenta_ini'] . ' and ' . $request['id_grupo_cuenta_fin'] . ' or id_grupo_cuenta is null ) ';
        } else {
            $whereGrupo = ' ';
        }
        //construir where para cuenta mayor
        if (isset($request['id_cuenta_mayor_ini']) && isset($request['id_cuenta_mayor_fin'])) {
            $whereCuenta = 'and  ( id_cuenta_mayor between ' . $request['id_cuenta_mayor_ini'] . ' and ' . $request['id_cuenta_mayor_fin'] . ' or id_cuenta_mayor is null ) ';
        } else {
            $whereCuenta = ' ';
        }
        //construir where para catalogo
        if (isset($request['id_catalogo_ini']) && isset($request['id_catalogo_fin'])) {
            $whereCatalogo = 'and  ( id_catalogo between ' . $request['id_catalogo_ini'] . ' and ' . $request['id_catalogo_fin'] . ' or id_catalogo is null ) ';
        } else {
            $whereCatalogo = ' ';
        }
        //construir where para id_cen_op
        if (isset($request['id_cen_op'])) {
            $whereCenOp = 'and  ( id_cen_op = ' . $request['id_cen_op'] . ') ';
        } else {
            $whereCenOp = ' ';
        }

        /*
         * Filtro para mostrar consulta con axuiliar/con tercero
         */

        $filtro_auxter = ' ';
        //con auxiliar
        if (isset($request["cod_aux"])) {
            if ($request["cod_aux"] == "true") {
                $filtro_auxter = ' or filtroauxter = 5 ';
            }
        }
        //con tercero
        if (isset($request["nitocc"])) {
            if ($request["nitocc"] == "true") {
                $filtro_auxter = ' or filtroauxter = 6 ';
            }
        }
        //con auxiliar y con tercero
        if (isset($request["nitocc"]) && isset($request["cod_aux"])) {
            if ($request["nitocc"] == "true" && $request["cod_aux"] == "true") {
                $filtro_auxter = ' or filtroauxter = 5 or filtroauxter = 7 ';
            }
        }
        //con cuenta
        $filtro_auxter = 'and ( filtroauxter in (1,2,3,4) ' . $filtro_auxter . ' )';


        /*
         * obtener los records de la consulta sql para los periodos a comparar
         */
        $rec = $this->sql_balance_comparativo($cia, $vigencia, $periodo, $whereClase, $whereGrupo, $whereCuenta, $whereCatalogo, $filtro_auxter, $request);
        $rec_compar = $this->sql_balance_comparativo($cia, $vig_compar, $per_compar, $whereClase, $whereGrupo, $whereCuenta, $whereCatalogo, $filtro_auxter, $request);


        //unir los dos array
        $rec_completo = array_merge($rec, $rec_compar);


        //validar datos del arreglo
        if (count($rec_completo) > 0) {
            //ordenar la consulta de los dos periodos
            $rec = $this->ordenar_array($rec_completo, 'cuenta', SORT_ASC, 'orden', SORT_ASC, 'subauxiliar', SORT_ASC, 'tercero', SORT_ASC, 'id_vigencia', SORT_ASC, 'id_periodo_contable', SORT_ASC, 'id_documento', SORT_ASC) or die('<br>ERROR!<br>');
        } else {
            $rec = array();
        }

        $records = array();

        /*
         * recorrer el arreglo de la union
         * generar un array con saldos de ambos periodos
         */
        for ($num_key = 0; $num_key < count($rec); $num_key++) {

            $records_one = array();

            foreach ($rec[$num_key] as $key => $value) {

                $records_one[$key] = $value;
            }


            //iniciar variables
            $records_one['id_vigencia2'] = '?';
            $records_one['id_periodo_contable2'] = '?';
            $records_one['saldo_anterior2'] = '0';
            $records_one['debito2'] = '0';
            $records_one['credito2'] = '0';
            $records_one['saldo_actual2'] = '0';
            $records_one['observaciones2'] = '?';


            //validar si hay otra fila
            if (($num_key + 1) < count($rec)) {
                //si son iguales las cuentas
                if ($rec[($num_key)]['cuenta'] == $rec[($num_key + 1)]['cuenta'] &&
                        $rec[($num_key)]['nombre_cuenta'] == $rec[($num_key + 1)]['nombre_cuenta']) {

                    $records_one['id_vigencia2'] = $rec[($num_key + 1)]['id_vigencia'];
                    $records_one['id_periodo_contable2'] = $rec[($num_key + 1)]['id_periodo_contable'];
                    $records_one['saldo_anterior2'] = $rec[($num_key + 1)]['saldo_anterior'];
                    $records_one['debito2'] = $rec[($num_key + 1)]['mvto_debito'];
                    $records_one['credito2'] = $rec[($num_key + 1)]['mvto_credito'];
                    $records_one['saldo_actual2'] = $rec[($num_key + 1)]['saldo_actual'];
                    $records_one['observaciones2'] = $rec[($num_key + 1)]['observaciones'];
                    $num_key++;
                } else {

                    $records_one['id_vigencia2'] = '?';
                    $records_one['id_periodo_contable2'] = '?';
                    $records_one['saldo_anterior2'] = '0';
                    $records_one['debito2'] = '0';
                    $records_one['credito2'] = '0';
                    $records_one['saldo_actual2'] = '0';
                    $records_one['observaciones2'] = '?';
                }
            }

            //calculo variacion
            $records_one['variacion'] = $records_one['saldo_actual2'] - $records_one['saldo_actual'];

            //calculo porcentaje = 100-((F26*100)/H26)
            if ($records_one['saldo_actual'] == 0 || $records_one['saldo_actual2'] == 0 || $records_one['saldo_actual'] == $records_one['saldo_actual2']) {

                $records_one['porcentaje'] = 0;
            } else {

                $records_one['porcentaje'] = (100 - (($records_one['saldo_actual'] * 100) / $records_one['saldo_actual2']));
            }

            $records_one['observaciones'] = $records_one['observaciones2'];

            //adjuntar la fila al arreglo de filas
            $records[] = $records_one;
        }

        //Titulo para revelacion contable - 20180904
        $this->revelacion = " ";
        if (isset($request['id_tipo_revelacion'])) {

            $id_tipo_revelacion = $request['id_tipo_revelacion'];

            //sentencia sql
            $sql = <<<EOD
select * from cn_tipo_revelacion
where id_tipo_revelacion = $id_tipo_revelacion
EOD;

            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);

            if (count($resultado) > 0) {
                $this->revelacion = "Revelación - " . $resultado[0]['nombre'];
            }
        }

        //validar si hay datos
        if (count($records) > 0) {
            
            
            /**
             * Limpia registros y crea nuevos - 20190122
             */
            $sql = <<<EOD
DELETE from cn_inf_revelaciones 
EOD;

            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);
            

            /*
             * registro de consulta en tabla de log
             */
            //validar que solo sea al entrar 1 vez - click boton filtrar
            if ($request['_startRow'] == 0) {
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion);
            }

            //array de filas de consulta para uso del template
            $this->list_data = $records;

            //datos de grids live GWT
            $this->totalRows = count($records);
            $this->startRow = $request['_startRow'];
            $this->endRow = $this->startRow + count($records);
            //totales de filas y de consulta
            $this->logMessage('record_count = ' . count($records));
            $this->logMessage('total_record_count = ' . count($records));
        } else {

            //datos de grids live GWT
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array();
        }

        /*
         * variables para tipo de archivo de salida
         */
        if (isset($request["type"])) {
            $this->type = $request['type'];
        } else {
            $this->type = "csv";
        }
    }

    /*
     * Metodo para ejecutar consulta sql de balance prueba comparativo un periodo y vigencia
     */

    function sql_balance_comparativo($cia, $vigencia, $periodo, $whereClase, $whereGrupo, $whereCuenta, $whereCatalogo, $filtro_auxter, $request) {


        if (isset($request['id_tipo_revelacion'])) {

            //catalogo            
            $whereCatalogoRevelacion = "AND CUENTA IN (SELECT   
            tab1.digitos as digitos
            
            FROM CN_CUENTA_TIPO_REVELACION tab0  
            
            JOIN CN_TIPO_REVELACION tab2 
            ON tab0.id_tipo_revelacion = tab2.id_tipo_revelacion 
            AND tab0.id_cia = tab2.id_cia  
            
            JOIN CN_SUBC_DIGITOS tab1 ON tab0.id_clase_cuenta = tab1.id_clase_cuenta 
            AND tab0.id_grupo_cuenta = tab1.id_grupo_cuenta AND tab0.id_cuenta_mayor = tab1.id_cuenta_mayor 
            AND tab0.id_catalogo = tab1.id_catalogo AND tab0.id_cia = tab1.id_cia
            
            WHERE 
            tab0.id_tipo_revelacion = '" . $request['id_tipo_revelacion'] . "' and tab0.estado = 1 ) ";
        } else {
            $whereCatalogoRevelacion = " ";
        }

        /*
         * sentencia sql para balance prueba comparativo
         */
        $sql_filtros = $this->consultaSQL($cia, $vigencia, $periodo, $request);
        $sql = <<<EOD

  select * from ( 
        $sql_filtros
    )

  where 
  1 = 1 
                
  $filtro_auxter
                
$whereCatalogoRevelacion

  ORDER BY
    CUENTA ASC,
    --ORDEN ASC,
    NVL(ORDEN,'000') ASC,
    --NVL(AUXILIAR,'000') ASC,
    NVL(SUBAUXILIAR,'000') ASC,
    NVL(TERCERO,'00000000000000000000000000000000') ASC,
    NVL(SALDO_ANTERIOR,'0000000000000000000000000') DESC,
    ID_DOCUMENTO
EOD;

        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);

        //validar si hay datos
        if (count($records) > 0) {

            return $records;
        } else {

            return array();
        }
    }

    /*
     * Metodo para ordenar por varios campos
     */

    function ordenar_array() {

        $n_parametros = func_num_args(); // Obenemos el número de parámetros
        if ($n_parametros < 3 || $n_parametros % 2 != 1) { // Si tenemos el número de parametro mal...
            return false;
        } else { // Hasta aquí todo correcto...veamos si los parámetros tienen lo que debe ser...
            $arg_list = func_get_args();

            if (!(is_array($arg_list[0]) && is_array(current($arg_list[0])))) {
                return false; // Si el primero no es un array...MALO!
            }
            for ($i = 1; $i < $n_parametros; $i++) { // Miramos que el resto de parámetros tb estén bien...
                if ($i % 2 != 0) {// Parámetro impar...tiene que ser un campo del array...
                    if (!array_key_exists($arg_list[$i], current($arg_list[0]))) {
                        return false;
                    }
                } else { // Par, no falla...si no es SORT_ASC o SORT_DESC...a la calle!
                    if ($arg_list[$i] != SORT_ASC && $arg_list[$i] != SORT_DESC) {
                        return false;
                    }
                }
            }
            $array_salida = $arg_list[0];

            // Una vez los parámetros se que están bien, procederé a ordenar...
            $a_evaluar = "foreach (\$array_salida as \$fila){\n";
            for ($i = 1; $i < $n_parametros; $i += 2) { // Ahora por cada columna...
                $a_evaluar .= "  \$campo{$i}[] = \$fila['$arg_list[$i]'];\n";
            }
            $a_evaluar .= "}\n";
            $a_evaluar .= "array_multisort(\n";
            for ($i = 1; $i < $n_parametros; $i += 2) { // Ahora por cada elemento...
                $a_evaluar .= "  \$campo{$i}, SORT_REGULAR, \$arg_list[" . ($i + 1) . "],\n";
            }
            $a_evaluar .= "  \$array_salida);";
            // La verdad es que es más complicado de lo que creía en principio... :)

            eval($a_evaluar);
            return $array_salida;
        }
    }

    /**
     * Metodo de construccion SQL para filtros de digitos de cuenta
     * 
     * @param type $cia
     * @param type $vigencia
     * @param type $periodo
     * @param type $request
     * @return type
     */
    public function consultaSQL($cia, $vigencia, $periodo, $request) {

        /*
         * construccion de sql para variables  de cuentas
         */
        $whereClase = ' ';
        $whereGrupo = ' ';
        $whereCuenta = ' ';
        $whereCatalogo = ' ';
        //and sal.subcuenta between '411003' and '481590' 
        //and sal.subcuenta between RPAD('4',6,'0') and RPAD('4',6,'9')
        if (isset($request['subc_ini']) && isset($request['subc_fin'])) {

            $cant_ini = strlen($request['subc_ini']);
            $cant_fin = strlen($request['subc_fin']);
            $this->logMessage("Cant subc_ini: " . $cant_ini . " - Cant subc_fin: " . $cant_fin);

            //clase
            $whereClase = "and sal.subcuenta between RPAD('" . substr($request['subc_ini'], 0, 1) . "',6,'0') and RPAD('" . substr($request['subc_fin'], 0, 1) . "',6,'9') ";

            //grupo            
            $whereGrupo = "and sal.subcuenta between RPAD('" . substr($request['subc_ini'], 0, 2) . "',6,'0') and RPAD('" . substr($request['subc_fin'], 0, 2) . "',6,'9') ";

            //cuenta            
            $whereCuenta = "and sal.subcuenta between RPAD('" . substr($request['subc_ini'], 0, 4) . "',6,'0') and RPAD('" . substr($request['subc_fin'], 0, 4) . "',6,'9') ";

            //catalogo            
            $whereCatalogo = "and sal.subcuenta between RPAD('" . substr($request['subc_ini'], 0, 6) . "',6,'0') and RPAD('" . substr($request['subc_fin'], 0, 6) . "',6,'9') ";
        }
        //construir where para id_cen_op
        if (isset($request['id_cen_op'])) {
            $whereCenOp = 'and  ( id_cen_op = ' . $request['id_cen_op'] . ') ';
            $whereCenOpMov = 'and  ( mov.id_cen_op = ' . $request['id_cen_op'] . ') ';
        } else {
            $whereCenOp = ' ';
            $whereCenOpMov = ' ';
        }
        if (isset($request['id_tipo_revelacion'])) {

            //catalogo            
            $whereCatalogoRevelacion = " ";
        } else {
            $whereCatalogoRevelacion = " ";
        }

        /*
         * sql que trae el balance prueba comparativo
         * por los filtros, para totalizar las filas
         * Filas por observacion, solo valor en un registro - 20190118
         */
        //sentencia sql
        $sql = <<<EOD
SELECT 
tab0.FILTROAUXTER,
tab0.ORDEN,
tab0.ID_CLASE_CUENTA,
tab0.ID_GRUPO_CUENTA,
tab0.ID_CUENTA_MAYOR,
tab0.ID_CATALOGO,
tab0.ID_AUXILIAR,
tab0.ID_MAE_TER,
tab0.NATURALEZA,
RPAD(tab0.CUENTA,6,'0') as CUENTA,
tab0.AUXILIAR,
tab0.SUBAUXILIAR,
tab0.TERCERO,
tab0.NOMBRE_CUENTA,
                
case when tab0.AUXILIAR is null then tab0.SALDO_ANTERIOR else 0 end as SALDO_ANTERIOR,
case when tab0.AUXILIAR is null then tab0.MVTO_DEBITO else 0 end as MVTO_DEBITO,
case when tab0.AUXILIAR is null then tab0.MVTO_CREDITO else 0 end as MVTO_CREDITO,
case when tab0.AUXILIAR is null then tab0.SALDO_ACTUAL else 0 end as SALDO_ACTUAL,
                
tab0.ID_CIA,
tab0.ID_VIGENCIA,
tab0.ID_PERIODO_CONTABLE,
                
tab1.id_documento,
tab1.observaciones,
tab1.tipo_comprobante,
nvl(tab1.debito,0) as debito,
nvl(tab1.credito,0) as credito
                
FROM(
                
    /** INICIA BALANCE */
     /* Clase Cuenta*/
     SELECT *
     FROM
       (SELECT 
         1     AS FILTROAUXTER,
         null AS ORDEN,
         ID_CLASE_CUENTA AS ID_CLASE_CUENTA,
         NULL            AS ID_GRUPO_CUENTA,
         NULL            AS ID_CUENTA_MAYOR,
         NULL            AS ID_CATALOGO,
         NULL            AS ID_AUXILIAR,
         NULL            AS ID_MAE_TER,
         NATURALEZA,       
         CUENTA,
         NULL AS AUXILIAR,
         NULL AS SUBAUXILIAR,
         NULL AS TERCERO,
         NOMBRE_CUENTA,
         SUM(SALDO_ANTERIOR) AS SALDO_ANTERIOR,
         SUM(MVTO_DEBITO)    AS MVTO_DEBITO,
         SUM(MVTO_CREDITO)   AS MVTO_CREDITO,
         SUM(NUEVO_SALDO)    AS SALDO_ACTUAL,
         /**Llave de la vista*/
         ID_CIA,
         ID_VIGENCIA,
         ID_PERIODO_CONTABLE
       FROM
         (SELECT

         cla.NATURALEZA,
           cla.ID_CLASE_CUENTA,
           SUBSTR(sal.SUBCUENTA,1,1) AS CUENTA,
           cla.NOMBRE                AS NOMBRE_CUENTA,
           CASE cue.NATURALEZA
             WHEN cla.NATURALEZA
             THEN sal.SALDO_ANTERIOR
             ELSE -sal.SALDO_ANTERIOR
           END         AS SALDO_ANTERIOR,
           sal.DEBITO  AS MVTO_DEBITO,
           sal.CREDITO AS MVTO_CREDITO,
           CASE cue.NATURALEZA
             WHEN cla.NATURALEZA
             THEN sal.SALDO_ACTUAL
             ELSE -sal.SALDO_ACTUAL
           END AS NUEVO_SALDO,
           /**Llave de la vista*/
           sal.ID_CIA,
           sal.ID_VIGENCIA,
           sal.ID_PERIODO_CONTABLE
         FROM CN_SALDO sal
         JOIN CN_CUENTA_MAYOR cue
         ON sal.ID_CIA           = cue.ID_CIA
         AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
         AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
         AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA
         JOIN CN_CLASE_CUENTA cla
         ON sal.ID_CIA           = cla.ID_CIA
         AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA

         where
         sal.id_vigencia = $vigencia
         and sal.id_periodo_contable = $periodo
         and sal.id_cia = $cia
         --Filtro Digitos Cuenta
         $whereClase
         $whereCenOp    

         )

       GROUP BY NATURALEZA,
         ID_CLASE_CUENTA,
         CUENTA,
         NOMBRE_CUENTA,
         /**Llave de la vista*/
         ID_CIA,
         ID_VIGENCIA,
         ID_PERIODO_CONTABLE
       )
     UNION

     /* Grupo Cuenta*/
     SELECT *
     FROM
       (SELECT 
         2     AS FILTROAUXTER,
         null AS ORDEN,
         ID_CLASE_CUENTA AS ID_CLASE_CUENTA,
         ID_GRUPO_CUENTA AS ID_GRUPO_CUENTA,
         NULL            AS ID_CUENTA_MAYOR,
         NULL            AS ID_CATALOGO,
         NULL            AS ID_AUXILIAR,
         NULL            AS ID_MAE_TER,
         NATURALEZA,   
         CUENTA,    
         NULL AS AUXILIAR,
         NULL AS SUBAUXILIAR,
         NULL AS TERCERO,
         NOMBRE_CUENTA,
         SUM(SALDO_ANTERIOR) AS SALDO_ANTERIOR,
         SUM(MVTO_DEBITO)    AS MVTO_DEBITO,
         SUM(MVTO_CREDITO)   AS MVTO_CREDITO,
         SUM(NUEVO_SALDO)    AS SALDO_ACTUAL,
         /**Llave de la vista*/
         ID_CIA,
         ID_VIGENCIA,
         ID_PERIODO_CONTABLE
       FROM
         (SELECT

         cla.NATURALEZA,
           cla.ID_CLASE_CUENTA,
           gru.ID_GRUPO_CUENTA,
           SUBSTR(sal.SUBCUENTA,1,2) AS CUENTA,
           gru.NOMBRE                AS NOMBRE_CUENTA,
           CASE cue.NATURALEZA
             WHEN cla.NATURALEZA
             THEN sal.SALDO_ANTERIOR
             ELSE -sal.SALDO_ANTERIOR
           END         AS SALDO_ANTERIOR,
           sal.DEBITO  AS MVTO_DEBITO,
           sal.CREDITO AS MVTO_CREDITO,
           CASE cue.NATURALEZA
             WHEN cla.NATURALEZA
             THEN sal.SALDO_ACTUAL
             ELSE -sal.SALDO_ACTUAL
           END AS NUEVO_SALDO,
           /**Llave de la vista*/
           sal.ID_CIA,
           sal.ID_VIGENCIA,
           sal.ID_PERIODO_CONTABLE
         FROM CN_SALDO sal
         JOIN CN_CUENTA_MAYOR cue
         ON sal.ID_CIA           = cue.ID_CIA
         AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
         AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
         AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA
         JOIN CN_GRUPO_CUENTA gru
         ON sal.ID_CIA           = gru.ID_CIA
         AND sal.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
         AND sal.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA
         JOIN CN_CLASE_CUENTA cla
         ON sal.ID_CIA           = cla.ID_CIA
         AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA

         where
         sal.id_vigencia = $vigencia
         and sal.id_periodo_contable = $periodo
         and sal.id_cia = $cia
         --Filtro Digitos Cuenta
         $whereGrupo
         $whereCenOp    

         )

       GROUP BY NATURALEZA,
         ID_CLASE_CUENTA,
         ID_GRUPO_CUENTA,
         CUENTA,
         NOMBRE_CUENTA,
         /**Llave de la vista*/
         ID_CIA,
         ID_VIGENCIA,
         ID_PERIODO_CONTABLE
       )
     UNION

     /* Cuenta Mayor*/
     SELECT *
     FROM
       (SELECT 
         3    AS FILTROAUXTER,
         null AS ORDEN,
         cla.ID_CLASE_CUENTA       AS ID_CLASE_CUENTA,
         gru.ID_GRUPO_CUENTA       AS ID_GRUPO_CUENTA,
         cue.ID_CUENTA_MAYOR       AS ID_CUENTA_MAYOR,
         NULL                      AS ID_CATALOGO,
         NULL                      AS ID_AUXILIAR,
         NULL                      AS ID_MAE_TER,         
         cue.NATURALEZA,    
         SUBSTR(sal.SUBCUENTA,1,4) AS CUENTA,
         NULL                      AS AUXILIAR,
         NULL                      AS SUBAUXILIAR,
         NULL                      AS TERCERO,
         cue.NOMBRE                AS NOMBRE_CUENTA,
         SUM(sal.SALDO_ANTERIOR)   AS SALDO_ANTERIOR,
         SUM(sal.DEBITO)           AS MVTO_DEBITO,
         SUM(sal.CREDITO)          AS MVTO_CREDITO,
         SUM(sal.SALDO_ACTUAL)     AS SALDO_ACTUAL,
         /**Llave de la vista*/
         sal.ID_CIA,
         sal.ID_VIGENCIA,
         sal.ID_PERIODO_CONTABLE
       FROM CN_SALDO sal
       JOIN CN_CUENTA_MAYOR cue
       ON sal.ID_CIA           = cue.ID_CIA
       AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
       AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
       AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA
       JOIN CN_GRUPO_CUENTA gru
       ON sal.ID_CIA           = gru.ID_CIA
       AND sal.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
       AND sal.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA
       JOIN CN_CLASE_CUENTA cla
       ON sal.ID_CIA           = cla.ID_CIA
       AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA

       where
         sal.id_vigencia = $vigencia
         and sal.id_periodo_contable = $periodo
         and sal.id_cia = $cia
       --Filtro Digitos Cuenta
       $whereCuenta
         $whereCenOp    


       GROUP BY cue.NATURALEZA,
         cla.ID_CLASE_CUENTA,
         gru.ID_GRUPO_CUENTA,
         cue.ID_CUENTA_MAYOR,
         SUBSTR(sal.SUBCUENTA,1,4),
         cue.NOMBRE,
         /**Llave de la vista*/
         sal.ID_CIA,
         sal.ID_VIGENCIA,
         sal.ID_PERIODO_CONTABLE
       )
     UNION          
                
                
    /* Subcuenta con terceros SIN AUXILIAR*/
    SELECT *
    FROM
      (SELECT 6     AS FILTROAUXTER,
        aux.COD_AUX AS ORDEN,
        cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        NULL AS ID_AUXILIAR,
        ter.ID_MAE_TER,
        cue.NATURALEZA,
        sal.SUBCUENTA           AS CUENTA,
        NULL                    AS AUXILIAR,
        NULL                    AS SUBAUXILIAR,
        ter.NITOCC              AS TERCERO,
        ter.NOMBRE              AS NOMBRE_CUENTA,
        SUM(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
        SUM(sal.DEBITO)         AS MVTO_DEBITO,
        SUM(sal.CREDITO)        AS MVTO_CREDITO,
        SUM(sal.SALDO_ACTUAL)   AS SALDO_ACTUAL,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      FROM CN_SALDO sal
      LEFT JOIN CN_AUXILIAR aux
      ON sal.ID_CIA           = aux.ID_CIA
      AND sal.ID_AUXILIAR     = aux.ID_AUXILIAR
      AND sal.ID_CATALOGO     = aux.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = aux.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = aux.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = aux.ID_CLASE_CUENTA
      JOIN CN_CATALOGO cat
      ON sal.ID_CIA           = cat.ID_CIA
      AND sal.ID_CATALOGO     = cat.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA
      JOIN CN_CUENTA_MAYOR cue
      ON sal.ID_CIA           = cue.ID_CIA
      AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA
      JOIN CN_GRUPO_CUENTA gru
      ON sal.ID_CIA           = gru.ID_CIA
      AND sal.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA
      JOIN CN_CLASE_CUENTA cla
      ON sal.ID_CIA           = cla.ID_CIA
      AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA
      JOIN CN_MAE_TER ter
      on sal.id_cia      = ter.id_cia
      AND sal.ID_MAE_TER = ter.ID_MAE_TER   
      
        where
        sal.id_vigencia = $vigencia
        and sal.id_periodo_contable = $periodo
        and sal.id_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
         $whereCenOp 
         $whereCatalogoRevelacion   
        
      GROUP BY aux.COD_AUX,
        cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        ter.ID_MAE_TER,
        cue.NATURALEZA,
        sal.SUBCUENTA,
        ter.NITOCC,
        ter.NOMBRE,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      )
    /* Fin Subcuenta con terceros */
    UNION
    
    /* Subcuenta sin terceros */
    SELECT *
    FROM
      (SELECT 4 AS FILTROAUXTER,
        NULL    AS ORDEN,
        cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        NULL AS ID_AUXILIAR,
        NULL AS ID_MAE_TER,
        cue.NATURALEZA,
        sal.SUBCUENTA           AS CUENTA,
        NULL                    AS AUXILIAR,
        NULL                    AS SUBAUXILIAR,
        NULL                    AS TERCERO,
        cat.NOMBRE              AS NOMBRE_CUENTA,
        SUM(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
        SUM(sal.DEBITO)         AS MVTO_DEBITO,
        SUM(sal.CREDITO)        AS MVTO_CREDITO,
        SUM(sal.SALDO_ACTUAL)   AS SALDO_ACTUAL,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      FROM CN_SALDO sal
      JOIN CN_CATALOGO cat
      ON sal.ID_CIA           = cat.ID_CIA
      AND sal.ID_CATALOGO     = cat.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA
      JOIN CN_CUENTA_MAYOR cue
      ON sal.ID_CIA           = cue.ID_CIA
      AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA
      JOIN CN_GRUPO_CUENTA gru
      ON sal.ID_CIA           = gru.ID_CIA
      AND sal.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA
      JOIN CN_CLASE_CUENTA cla
      ON sal.ID_CIA           = cla.ID_CIA
      AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA 
      
        where
        sal.id_vigencia = $vigencia
        and sal.id_periodo_contable = $periodo
        and sal.id_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
         $whereCenOp    
         $whereCatalogoRevelacion
            
      GROUP BY cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        cue.NATURALEZA,
        sal.SUBCUENTA,
        cat.NOMBRE,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      )
    /* Fin Subcuenta sin terceros */
    UNION
    
    /* Auxiliares con terceros*/
    SELECT *
    FROM
      (SELECT 7     AS FILTROAUXTER,
        aux.COD_AUX AS ORDEN,
        cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        aux.ID_AUXILIAR,
        ter.ID_MAE_TER,
        cue.NATURALEZA,
        sal.SUBCUENTA           AS CUENTA,
        aux.COD_AUX             AS AUXILIAR,
        NULL                    AS SUBAUXILIAR,
        ter.NITOCC              AS TERCERO,
        ter.NOMBRE              AS NOMBRE_CUENTA,
        SUM(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
        SUM(sal.DEBITO)         AS MVTO_DEBITO,
        SUM(sal.CREDITO)        AS MVTO_CREDITO,
        SUM(sal.SALDO_ACTUAL)   AS SALDO_ACTUAL,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      FROM CN_SALDO sal
      JOIN CN_AUXILIAR aux
      ON sal.ID_CIA           = aux.ID_CIA
      AND sal.ID_AUXILIAR     = aux.ID_AUXILIAR
      AND sal.ID_CATALOGO     = aux.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = aux.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = aux.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = aux.ID_CLASE_CUENTA
      JOIN CN_CATALOGO cat
      ON sal.ID_CIA           = cat.ID_CIA
      AND sal.ID_CATALOGO     = cat.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA
      JOIN CN_CUENTA_MAYOR cue
      ON sal.ID_CIA           = cue.ID_CIA
      AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA
      JOIN CN_GRUPO_CUENTA gru
      ON sal.ID_CIA           = gru.ID_CIA
      AND sal.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA
      JOIN CN_CLASE_CUENTA cla
      ON sal.ID_CIA           = cla.ID_CIA
      AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA
      JOIN CN_MAE_TER ter
      ON sal.ID_CIA      = ter.ID_CIA
      AND sal.ID_MAE_TER = ter.ID_MAE_TER
      
        where
        sal.id_vigencia = $vigencia
        and sal.id_periodo_contable = $periodo
        and sal.id_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
         $whereCenOp    
         $whereCatalogoRevelacion
            
      GROUP BY cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        aux.ID_AUXILIAR,
        ter.ID_MAE_TER,
        cue.NATURALEZA,
        sal.SUBCUENTA,
        aux.COD_AUX,
        ter.NOMBRE,
        ter.NITOCC,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      )
    /* Fin Auxiliares con terceros*/
    UNION
    
    /* Auxiliares sin terceros*/
    SELECT *
    FROM
      (SELECT 5     AS FILTROAUXTER,
        aux.COD_AUX AS ORDEN,
        cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        aux.ID_AUXILIAR,
        NULL AS ID_MAE_TER,
        cue.NATURALEZA,
        sal.SUBCUENTA           AS CUENTA,
        aux.COD_AUX             AS AUXILIAR,
        NULL                    AS SUBAUXILIAR,
        NULL                    AS TERCERO,
        aux.NOMBRE              AS NOMBRE_CUENTA,
        SUM(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
        SUM(sal.DEBITO)         AS MVTO_DEBITO,
        SUM(sal.CREDITO)        AS MVTO_CREDITO,
        SUM(sal.SALDO_ACTUAL)   AS SALDO_ACTUAL,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      FROM CN_SALDO sal
      JOIN CN_AUXILIAR aux
      ON sal.ID_CIA           = aux.ID_CIA
      AND sal.ID_AUXILIAR     = aux.ID_AUXILIAR
      AND sal.ID_CATALOGO     = aux.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = aux.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = aux.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = aux.ID_CLASE_CUENTA
      JOIN CN_CATALOGO cat
      ON sal.ID_CIA           = cat.ID_CIA
      AND sal.ID_CATALOGO     = cat.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA
      JOIN CN_CUENTA_MAYOR cue
      ON sal.ID_CIA           = cue.ID_CIA
      AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA
      JOIN CN_GRUPO_CUENTA gru
      ON sal.ID_CIA           = gru.ID_CIA
      AND sal.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA
      JOIN CN_CLASE_CUENTA cla
      ON sal.ID_CIA           = cla.ID_CIA
      AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA
      
        where
        sal.id_vigencia = $vigencia
        and sal.id_periodo_contable = $periodo
        and sal.id_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
         $whereCenOp   
         $whereCatalogoRevelacion
            
      GROUP BY cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        aux.ID_AUXILIAR,
        cue.NATURALEZA,
        sal.SUBCUENTA,
        aux.COD_AUX,
        aux.NOMBRE,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      )
    /* Fin Auxiliares sin terceros*/
    UNION
    
    /* Sub auxiliares con terceros*/
    SELECT *
    FROM
      (SELECT 5 AS FILTROAUXTER,
        NULL    AS ORDEN,
        cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        aux.ID_AUXILIAR,
        ter.ID_MAE_TER,
        cue.NATURALEZA,
        sal.SUBCUENTA           AS CUENTA,
        aux.COD_AUX             AS AUXILIAR,
        subaux.COD_SUB_AUX      AS SUBAUXILIAR,
        ter.NITOCC              AS TERCERO,
        ter.NOMBRE              AS NOMBRE_CUENTA,
        SUM(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
        SUM(sal.DEBITO)         AS MVTO_DEBITO,
        SUM(sal.CREDITO)        AS MVTO_CREDITO,
        SUM(sal.SALDO_ACTUAL)   AS SALDO_ACTUAL,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      FROM CN_SALDO sal
      JOIN CN_AUXILIAR aux
      ON sal.ID_CIA           = aux.ID_CIA
      AND sal.ID_AUXILIAR     = aux.ID_AUXILIAR
      AND sal.ID_CATALOGO     = aux.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = aux.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = aux.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = aux.ID_CLASE_CUENTA
      JOIN CN_SUB_AUX subaux
      ON sal.ID_CIA           = subaux.ID_CIA
      AND sal.ID_SUB_AUX      = subaux.ID_SUB_AUX
      AND aux.ID_TIPO_SUB_AUX = subaux.ID_TIPO_SUB_AUX
      JOIN CN_CATALOGO cat
      ON sal.ID_CIA           = cat.ID_CIA
      AND sal.ID_CATALOGO     = cat.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA
      JOIN CN_CUENTA_MAYOR cue
      ON sal.ID_CIA           = cue.ID_CIA
      AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA
      JOIN CN_GRUPO_CUENTA gru
      ON sal.ID_CIA           = gru.ID_CIA
      AND sal.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA
      JOIN CN_CLASE_CUENTA cla
      ON sal.ID_CIA           = cla.ID_CIA
      AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA
      JOIN CN_MAE_TER ter
      ON sal.ID_CIA      = ter.ID_CIA
      AND sal.ID_MAE_TER = ter.ID_MAE_TER
      
        where
        sal.id_vigencia = $vigencia
        and sal.id_periodo_contable = $periodo
        and sal.id_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
         $whereCenOp   
         $whereCatalogoRevelacion 
            
      GROUP BY cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        aux.ID_AUXILIAR,
        ter.ID_MAE_TER,
        cue.NATURALEZA,
        sal.SUBCUENTA,
        aux.COD_AUX,
        subaux.COD_SUB_AUX,
        ter.NITOCC,
        ter.NOMBRE,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      )
    UNION
    
    /* Sub auxiliares sin terceros*/
    SELECT *
    FROM
      (SELECT 8 AS FILTROAUXTER,
        NULL    AS ORDEN,
        cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        aux.ID_AUXILIAR,
        NULL AS ID_MAE_TER,
        cue.NATURALEZA,
        sal.SUBCUENTA           AS CUENTA,
        aux.COD_AUX             AS AUXILIAR,
        subaux.COD_SUB_AUX      AS SUBAUXILIAR,
        NULL                    AS TERCERO,
        subaux.NOMBRE           AS NOMBRE_CUENTA,
        SUM(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
        SUM(sal.DEBITO)         AS MVTO_DEBITO,
        SUM(sal.CREDITO)        AS MVTO_CREDITO,
        SUM(sal.SALDO_ACTUAL)   AS SALDO_ACTUAL,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      FROM CN_SALDO sal
      JOIN CN_AUXILIAR aux
      ON sal.ID_CIA           = aux.ID_CIA
      AND sal.ID_AUXILIAR     = aux.ID_AUXILIAR
      AND sal.ID_CATALOGO     = aux.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = aux.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = aux.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = aux.ID_CLASE_CUENTA
      JOIN CN_CATALOGO cat
      ON sal.ID_CIA           = cat.ID_CIA
      AND sal.ID_CATALOGO     = cat.ID_CATALOGO
      AND sal.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA
      JOIN CN_CUENTA_MAYOR cue
      ON sal.ID_CIA           = cue.ID_CIA
      AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
      AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA
      JOIN CN_GRUPO_CUENTA gru
      ON sal.ID_CIA           = gru.ID_CIA
      AND sal.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
      AND sal.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA
      JOIN CN_CLASE_CUENTA cla
      ON sal.ID_CIA           = cla.ID_CIA
      AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA
      JOIN CN_SUB_AUX subaux
      ON sal.ID_CIA           = subaux.ID_CIA
      AND sal.ID_SUB_AUX      = subaux.ID_SUB_AUX
      AND aux.ID_TIPO_SUB_AUX = subaux.ID_TIPO_SUB_AUX
      
        where
        sal.id_vigencia = $vigencia
        and sal.id_periodo_contable = $periodo
        and sal.id_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
         $whereCenOp    
         $whereCatalogoRevelacion
            
      GROUP BY cla.ID_CLASE_CUENTA,
        gru.ID_GRUPO_CUENTA,
        cue.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        aux.ID_AUXILIAR,
        cue.NATURALEZA,
        sal.SUBCUENTA,
        aux.COD_AUX,
        subaux.COD_SUB_AUX,
        subaux.NOMBRE,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      )
      /** TERMINA BALANCE **/

)tab0    
                
left join(
    
    select  
       ROW_NUMBER() OVER (
        partition by tab0.id_vigencia,
        tab0.id_periodo_contable,
        tab0.id_cia,
        tab0.id_catalogo,
        tab0.id_cuenta_mayor,
        tab0.id_grupo_cuenta,
        tab0.id_clase_cuenta,
        tab0.id_mae_ter,
        tab0.id_auxiliar
        
        ORDER BY tab0.id_vigencia,
        tab0.id_periodo_contable,
        tab0.id_cia,
        tab0.id_catalogo,
        tab0.id_cuenta_mayor,
        tab0.id_grupo_cuenta,
        tab0.id_clase_cuenta,
        tab0.id_mae_ter,
        tab0.id_auxiliar
        
       ) AS rn,
    tab0.id_vigencia,
    tab0.id_periodo_contable,
    tab0.id_cia,
    tab0.id_catalogo,
    tab0.id_cuenta_mayor,
    tab0.id_grupo_cuenta,
    tab0.id_clase_cuenta,
    tab0.id_mae_ter,
    tab0.id_auxiliar,
    
    tab0.id_documento,  
            
    sum(tab0.debito) as debito,
    sum(tab0.credito) as credito,
    0 as tipo_comprobante,
    0 as observaciones_corta,
    0 as observaciones

    from(

        select distinct 
        tab0.id_vigencia,
        tab0.id_periodo_contable,
        tab0.id_cia,
        tab0.id_catalogo,
        tab0.id_cuenta_mayor,
        tab0.id_grupo_cuenta,
        tab0.id_clase_cuenta,
        tab0.id_mae_ter,
        tab0.id_auxiliar,
            
        tab0.debito,
        tab0.credito,

        /*tab0.id_cad,*/
        tab0.fecha_cad,
        tab0.nom_corto,
        tab0.nom_tipo_comprobante,
        tab0.id_documento,
        tab0.DESCR_MTO

        from(

            select
            tip.nom_corto,
            tip.nom_tipo_comprobante,
            cad.*,
            doc.id_documento,
            doc.DESCR_MTO,
            mov.id_mov_cont,
            mov.id_catalogo,
            mov.id_cuenta_mayor,
            mov.id_grupo_cuenta,
            mov.id_clase_cuenta,
            mov.id_mae_ter,
            mov.id_auxiliar,
            
            mov.debito,
            mov.credito

            from cn_control_cad cad

            join cn_tipo_comprobante tip
            on tip.id_tipo_comprobante = cad.id_tipo_comprobante

            join cn_documento doc
            on doc.id_cad = cad.id_cad
            and doc.id_vigencia = cad.id_vigencia
            and doc.id_cen_op = cad.id_cen_op
            and doc.id_cia = cad.id_cia

            join cn_movimiento_contable mov
            on mov.id_documento = doc.id_documento
            and mov.id_cad = doc.id_cad
            and mov.id_vigencia = doc.id_vigencia
            and mov.id_cen_op = doc.id_cen_op
            and mov.id_cia = doc.id_cia

            where
            cad.id_vigencia = $vigencia
            and cad.id_periodo_contable = $periodo
            and cad.id_cia = $cia
            $whereCenOpMov 
            --and mov.id_catalogo = 632

        )tab0

    )tab0

    group by
    tab0.id_vigencia,
    tab0.id_periodo_contable,
    tab0.id_cia,
    tab0.id_catalogo,
    tab0.id_cuenta_mayor,
    tab0.id_grupo_cuenta,
    tab0.id_clase_cuenta,
    tab0.id_mae_ter,
    tab0.id_auxiliar,
    tab0.id_documento
                
)tab1
on tab1.id_vigencia = tab0.id_vigencia 
and tab1.id_periodo_contable = tab0.id_periodo_contable
and tab1.id_cia = tab0.id_cia
and tab1.id_catalogo = tab0.id_catalogo
and tab1.id_cuenta_mayor = tab0.id_cuenta_mayor
and tab1.id_grupo_cuenta = tab0.id_grupo_cuenta
and tab1.id_clase_cuenta = tab0.id_clase_cuenta 
and nvl(tab1.id_mae_ter,1) = nvl(tab0.id_mae_ter,1)
and nvl(tab1.id_auxiliar,1) = nvl(tab0.id_auxiliar,1)        
              
EOD;

        return $sql;
    }

}
