<?php

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

    /**
     * Metodo del servicio list - consulta balance general
     *
     * @param sfWebRequest $request
     */
    public function executeList(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 . "'";



        /*
         * Paginacion
         */
        if (isset($request['_startRow'])) {
            $rowStart = $request['_startRow'];
        } else {
            $rowStart = 0;
        }

        if (isset($request['_endRow'])) {
            $rowEnd = $request['_endRow'];
        } else {
            $rowEnd = 75;
        }

        /*
         * tomar variables del request - obligatorias
         */
        $cia = $request['id_cia'];
        $vigencia = $request['id_vigencia'];
        $periodo = $request['id_periodo_contable'];
        $vig_compar = $request['vig_compar'];
        $per_compar = $request['per_compar'];
        $vig_perIni = $request['vig_perIni'];
        $vig_perFin = $request['vig_perFin'];


        /*
         * 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 . ' )';


        /*
         * sentencia sql para balance prueba comparativo
         */
        $sql_filtros = $this->consultaSQL($cia, $vigencia, $periodo, $request);
        $sql = <<<EOD
 SELECT count(ID_CATALOGO) as count
   FROM
    (
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",
    "ID_CIA",
    WM_CONCAT (UNIRVIGPER ), WM_CONCAT (SALDO_ANTERIOR) , WM_CONCAT ( MVTO_DEBITO),  WM_CONCAT (MVTO_CREDITO) , WM_CONCAT (SALDO_ACTUAL)
    FROM (
 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_PERIODO_CONTABLE" || '_' || "ID_VIGENCIA"  AS "UNIRVIGPER"
  FROM
    (

    SELECT * FROM ( $sql_filtros )
    where
    VIG_PER BETWEEN $vig_perIni AND  $vig_perFin

    )
    
/*
  ORDER BY
    CUENTA ASC,
    --ORDEN ASC,
    NVL(ORDEN,'000') ASC,
    --NVL(AUXILIAR,'000') ASC,
    NVL(SUBAUXILIAR,'000') ASC,
    NVL(TERCERO,'00000000000000000000000000000000') ASC,
    ID_VIGENCIA ASC,
    ID_PERIODO_CONTABLE ASC
*/

    )
    
    where
    id_cia = $cia
/*   $whereClase $whereGrupo $whereCuenta $whereCatalogo  */
     
    $filtro_auxter


    GROUP BY
    "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",
    "ID_CIA"



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



        //ejecuta el sql y se obtiene las filas de la consulta
        $total_record_count = CN_TABLE::executeSQL($sql);
        $total_record_count = $total_record_count[0]['count'];

        /*
         * sentencia sql para balance prueba comparativo
         */
        $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
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",
    "ID_CIA",
        WM_CONCAT (UNIRVIGPER ) as UNIRVIGPER,
        WM_CONCAT (SALDO_ANTERIOR) as SALDO_ANTERIOR,
        WM_CONCAT ( MVTO_DEBITO) as MVTO_DEBITO,
        WM_CONCAT (MVTO_CREDITO) as MVTO_CREDITO,
        WM_CONCAT (SALDO_ACTUAL) as SALDO_ACTUAL
    FROM (
 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_PERIODO_CONTABLE" || '_' || "ID_VIGENCIA"  AS "UNIRVIGPER"
  FROM
    (

    SELECT * FROM ( $sql_filtros )
    where
    VIG_PER BETWEEN $vig_perIni AND  $vig_perFin

    )
    
/*
   ORDER BY
    CUENTA ASC,
    --ORDEN ASC,
    NVL(ORDEN,'000') ASC,
    --NVL(AUXILIAR,'000') ASC,
    NVL(SUBAUXILIAR,'000') ASC,
    NVL(TERCERO,'00000000000000000000000000000000') ASC,
    ID_VIGENCIA ASC,
    ID_PERIODO_CONTABLE ASC
*/

    )
    
    where
    id_cia = $cia
/*    $whereClase $whereGrupo $whereCuenta $whereCatalogo */
    
    $filtro_auxter


    GROUP BY
    "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",
    "ID_CIA"



  ORDER BY
    CUENTA ASC,
    --ORDEN ASC,
    NVL(ORDEN,'000') ASC,
    --NVL(AUXILIAR,'000') ASC,
    NVL(SUBAUXILIAR,'000') ASC,
    NVL(TERCERO,'00000000000000000000000000000000') ASC
) row_ WHERE ROWNUM <= $rowEnd ) where rownum_ > $rowStart
EOD;

        //ejecuta el sql y se obtiene las filas de la consulta
        $records = CN_TABLE::executeSQL($sql);

//        $records = array();

        /*
         *
         */
        foreach ($records as $key => $value) {


            $unirvigper = explode(",", $value["unirvigper"]);
            $saldo_inicial = explode(",", $value["saldo_anterior"]);
            $debito = explode(",", $value["mvto_debito"]);
            $credito = explode(",", $value["mvto_credito"]);
            $saldo_final = explode(",", $value["saldo_actual"]);

            foreach ($unirvigper as $key_vigper => $valor_vigper) {
                $records[$key][$valor_vigper . "ini"] = $saldo_inicial[$key_vigper];
                $records[$key][$valor_vigper . "deb"] = $debito[$key_vigper];
                $records[$key][$valor_vigper . "cred"] = $credito[$key_vigper];
                $records[$key][$valor_vigper . "fin"] = $saldo_final[$key_vigper];
            }
        }


        //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 = $total_record_count;
            $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 = ' . $total_record_count);
        } else {

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

    /**
     * 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 "VIG_PER",
    "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 */
    SELECT *
    FROM
      (SELECT VIG_PER,
        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_VIGPER 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_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
        
      GROUP BY VIG_PER,
        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 VIG_PER,
        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_VIGPER 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_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
        
      GROUP BY VIG_PER,
        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 VIG_PER,
        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_VIGPER 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_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
        
      GROUP BY VIG_PER,
        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 VIG_PER,
        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_VIGPER 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_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
        
      GROUP BY VIG_PER,
        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 VIG_PER,
        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_VIGPER 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_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
        
      GROUP BY VIG_PER,
        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 VIG_PER,
        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_VIGPER 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_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
        
      GROUP BY VIG_PER,
        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;
    }

}