<?php

/**
 * balprucom actions.
 *
 * @package    Sofhouse
 * @subpackage balprucom
 * @author     Software House
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class balprucomActions 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 = ' ';
        }

        /*
         * 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 = 2 ';
            }
        }
        //con tercero
        if (isset($request["nitocc"])) {
            if ($request["nitocc"] == "true") {
                $filtro_auxter = ' or filtroauxter = 3 ';
            }
        }
        //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 = 2 or filtroauxter = 4 ';
            }
        }
        //con cuenta
        $filtro_auxter = 'and ( filtroauxter = 1 ' . $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) 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';


            //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'];
                    $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';
                }
            }

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

            //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']));
            }

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

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



            /*
             * 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) {
        /*
         * 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

  ORDER BY
    CUENTA ASC,
    --ORDEN ASC,
    NVL(ORDEN,'000') ASC,
    --NVL(AUXILIAR,'000') ASC,
    NVL(SUBAUXILIAR,'000') ASC,
    NVL(TERCERO,'00000000000000000000000000000000') ASC
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') ";
        }

        /*
         * sql que trae el balance prueba comparativo
         * por los filtros, para totalizar las filas
         */
        //sentencia sql
        $sql = <<<EOD
  SELECT "FILTROAUXTER",
    "ORDEN",
    "ID_CLASE_CUENTA",
    "ID_GRUPO_CUENTA",
    "ID_CUENTA_MAYOR",
    "ID_CATALOGO",
    "ID_AUXILIAR",
    "ID_MAE_TER",
    "NATURALEZA",
    "CUENTA",
    "AUXILIAR",
    "SUBAUXILIAR",
    "TERCERO",
    "NOMBRE_CUENTA",
    "SALDO_ANTERIOR",
    "MVTO_DEBITO",
    "MVTO_CREDITO",
    "SALDO_ACTUAL",
    "ID_CIA",
    "ID_VIGENCIA",
    "ID_PERIODO_CONTABLE"
  FROM
    (
    /** INICIA BALANCE */
    /* Subcuenta con terceros SIN AUXILIAR*/
    SELECT *
    FROM
      (SELECT 3     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
        
      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 1 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
            
      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 4     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
            
      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 2     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
            
      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
            
      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 5 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
            
      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 **/
    )     
              
EOD;

        return $sql;
    }

}
