<?php

/**
 * balance_all_c actions.
 *
 * @package    contab2
 * @subpackage balance_all_c
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class balance_all_cActions extends sfActions {

    /**
     * Metodo del servicio list - consulta balance nivel auxiliar
     *
     * @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");
        }
        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 - grid live GWT
         */
        if (isset($request['_startRow'])) {
            $rowStart = $request['_startRow'];
        } else {
            $rowStart = 0;
        }

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


        //tomar variables del request
        $cia = $request['id_cia'];
        $vigencia = $request['id_vigencia'];
        $periodo = $request['id_periodo_contable'];


        //validar si es por centro de operacion
        if (isset($request['id_cen_op'])) {
            $cen_op = $request['id_cen_op'];
            $whereCenOP = 'and  ( ID_CEN_OP = ' . $request['id_cen_op'] . ' ) ';
            $tabla = "CN_BALANCE_DET_CUE";
        } else {
            $cen_op = ' ';
            $whereCenOP = ' ';
            $tabla = "CN_BALANCE_CON_CUE";
        }

//        $auxiliar = $request['id_auxiliar'];
//        $auxiliar = $request['id_mae_ter'];
//        $catalogo = $request['id_catalogo'];
//        $cuenta = $request['id_cuenta_mayor'];
//        $grupo = $request['id_grupo_cuenta'];
//        $clase = $request['id_clase_cuenta'];


        /*
         * construccion de sql para variables  de cuentas
         */
        if (isset($request['id_clase_cuenta_ini']) && isset($request['id_clase_cuenta_fin'])) {

//            $whereClase = 'and ( id_clase_cuenta = ' . $request['id_clase_cuenta'] . ' or id_clase_cuenta is null ) ';
            $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 = ' ( id_clase_cuenta is null ) ';
            $whereClase = ' ';
        }


        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 = ' ( id_grupo_cuenta is null ) ';
            $whereGrupo = ' ';
        }

        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 = ' ( id_cuenta_mayor is null ) ';
            $whereCuenta = ' ';
        }

        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 = ' ( id_catalogo is null ) ';
            $whereCatalogo = ' ';
        }


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

            $whereAuxiliar = 'and  ( id_auxiliar = ' . $request['id_auxiliar'] . ' or id_auxiliar is null ) ';
        } else {

            $whereAuxiliar = ' ';
        }

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

            $whereTercero = 'and  ( id_mae_ter = ' . $request['id_mae_ter'] . ' or id_mae_ter is null ) ';
        } else {

            $whereTercero = ' ';
        }

        /*
         * no mostar registros con valores cero en saldos y movimientos - 20111026
         * correo: registros cuyos campos de dinero (Saldos, débito y crédito) en ceros los que no se deben mostrar,
         * es decir, para los que no ha habido movimiento en el periodo y filtros seleccionados, a nivel de tercero.
         */
        $whereValorCero = '';
        if (isset($request['valor_cero'])) {
            if ($request['valor_cero'] == 'true') {
                $whereValorCero = '
                 and
                 (CASE WHEN

                 LENGTH(cuenta) = 6
                 and (
                    id_auxiliar is not null
                    or id_mae_ter is not null)
                    AND SALDO_ANTERIOR = 0
                 AND MVTO_DEBITO = 0
                 AND MVTO_CREDITO = 0
                 AND NUEVO_SALDO = 0

                      THEN 0

                    ELSE 1
                END) = 1';
            }
        }

//        $vig_ini = $request['vig_ini'];
//        $vig_fin = $request['vig_fin'];
//        $per_ini = $request['per_ini'];
//        $per_fin = $request['per_fin'];



        /*
         * sql que trae el balance
         * por los filtros, para totalizar las filas
         */
        $sql_filtros = $this->consultaSQL($request);
        //sentencia sql
        $sql = <<<EOD
select count(*) as count from (
    select distinct * from (
        $sql_filtros
    )
) 
EOD;
        
//        $sql = '            select count(*) as count
//            from            (
//            select distinct *
//            from            (
//            select *
//            from ' . $tabla . '
//            where
//            ID_VIGENCIA = ' . $vigencia . '
//            and ID_PERIODO_CONTABLE = ' . $periodo . '
//            ' . $whereCenOP . '
//            and ID_cia = ' . $cia . '
//            ' . $whereClase . '
//            ' . $whereGrupo . '
//            ' . $whereCuenta . '
//            ' . $whereCatalogo . '
//            ' . $whereAuxiliar . '
//            ' . $whereTercero . '
//             --no tener en cuenta auxiliar y tercero, valores cero
//            ' . $whereValorCero . '
//            )            )                ';

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

        /*
         * sql que obtiene el balance  en un rango de filas
         */
        $sql_filtros = $this->consultaSQL($request);
        //sentencia sql
        $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
    select distinct lib.* from (
        $sql_filtros
    )
    lib
    ORDER BY
    lib.CUENTA ASC,
    NVL(lib.AUXILIAR, '000') ASC,
    NVL(lib.SUBAUXILIAR,'000') ASC,
    NVL(lib.TERCERO,'00000000000000000000000000000000') ASC
) row_ WHERE ROWNUM <= $rowEnd ) where rownum_ > $rowStart 
EOD;
        
//        $sql = 'SELECT *
//          FROM ( SELECT row_.*, ROWNUM rownum_
//          FROM (
//            select *
//            from            (
//            select distinct *
//            from            (
//            select *
//            from ' . $tabla . '
//            where
//            ID_VIGENCIA = ' . $vigencia . '
//            and ID_PERIODO_CONTABLE = ' . $periodo . '
//            ' . $whereCenOP . '
//            and ID_cia = ' . $cia . '
//            ' . $whereClase . '     ' . $whereGrupo . '
//            ' . $whereCuenta . '   ' . $whereCatalogo . '
//            ' . $whereAuxiliar . '    ' . $whereTercero . '
//             --no tener en cuenta auxiliar y tercero, valores cero
//            ' . $whereValorCero . '
//            )
//            )
//            lib
//            ORDER BY
//            lib.CUENTA ASC,
//            NVL(lib.AUXILIAR, \'000\') ASC,
//             NVL(lib.SUBAUXILIAR,\'000\') ASC,
//              NVL(lib.TERCERO,\'00000000000000000000000000000000\') ASC
//) row_ WHERE ROWNUM <= ' . $rowEnd . '  ) where rownum_ > ' . $rowStart . '
//                ';



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

        /*
         * Valida si se obtuvo valores en la consulta
         */
        if (count($records) > 0) {

            /*
             * registro de consulta en tabla de log
             */
            $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 de JSON
            $this->list_data = $records;
        } else {
            $this->list_data = array();
        }

        //guardar en el archivo de log el resultado de total de filas
        $this->logMessage('record_count = ' . count($records));
        $this->logMessage('total_record_count = ' . $total_record_count);

        //datos de cabecera del JSON
        $this->totalRows = $total_record_count;
        $this->startRow = $request['_startRow'];
        $this->endRow = $this->startRow + count($records);
    }

    /**
     * Actions de sum - realiza una consulta sql para la suma de los campos requeridos
     *
     * @param sfWebRequest $request
     */
    public function executeSum(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");
        }
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        //tomar variables del request
        $cia = $request['id_cia'];
        $vigencia = $request['id_vigencia'];
        $periodo = $request['id_periodo_contable'];

        //validar si es por centro de operacion
        if (isset($request['id_cen_op'])) {
            $cen_op = $request['id_cen_op'];
            $whereCenOP = 'and  ( ID_CEN_OP = ' . $request['id_cen_op'] . ' ) ';
            $tabla = "CN_BALANCE_DET_CUE";
        } else {
            $cen_op = ' ';
            $whereCenOP = ' ';
            $tabla = "CN_BALANCE_CON_CUE";
        }


        /*
         * construccion de sql para variables  de cuentas
         */
        if (isset($request['subc_ini']) && isset($request['subc_fin'])) {
            $whereDigitos = 'and ( cuenta between ' . $request['subc_ini'] . ' and ' . $request['subc_fin'] . ' ) ';
        } else {
            $whereDigitos = ' ';
        }

        if (isset($request['id_clase_cuenta_ini']) && isset($request['id_clase_cuenta_fin'])) {

//            $whereClase = 'and ( id_clase_cuenta = ' . $request['id_clase_cuenta'] . ' or id_clase_cuenta is null ) ';
            $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 = ' ( id_clase_cuenta is null ) ';
            $whereClase = ' ';
        }


        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 = ' ( id_grupo_cuenta is null ) ';
            $whereGrupo = ' ';
        }

        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 = ' ( id_cuenta_mayor is null ) ';
            $whereCuenta = ' ';
        }

        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 = ' ( id_catalogo is null ) ';
            $whereCatalogo = ' ';
        }


//        if (isset($request['cod_aux'])) {
//            $whereAuxiliar = 'and ' . $request['cod_aux'];
//        } else {
//            $whereAuxiliar = ' ';
//        }
//
//        if (isset($request['nitocc'])) {
//            $whereTercero = 'and ' . $request['nitocc'];
//        } else {
//            $whereTercero = ' ';
//        }

        /*
         * sql de totales por naturaleza debito
         * solo tiene en cuenta las subcuentas sin auxiliar ni tercero
         */
        $sql_filtros = $this->consultaSQL($request);
        //sentencia sql
        $sql = <<<EOD
select
'Total saldo débito' AS CUENTA,
NATURALEZA,
sum(SALDO_ANTERIOR) as SALDO_ANTERIOR,
sum(MVTO_DEBITO) as MVTO_DEBITO,
sum(MVTO_CREDITO) as MVTO_CREDITO,
sum(NUEVO_SALDO) as NUEVO_SALDO
from
(
    select distinct lib.* from (
        $sql_filtros
    )lib
    where 
    LENGTH(lib.CUENTA)=6
    and lib.AUXILIAR is null
    and lib.TERCERO is null
)
WHERE
NATURALEZA = 'D'

group by
NATURALEZA 
EOD;
//        
//        $sql = '
//
//            select
//            \'Total saldo débito\' AS CUENTA,
//            NATURALEZA,
//            sum(SALDO_ANTERIOR) as SALDO_ANTERIOR,
//            sum(MVTO_DEBITO) as MVTO_DEBITO,
//            sum(MVTO_CREDITO) as MVTO_CREDITO,
//            sum(NUEVO_SALDO) as NUEVO_SALDO
//            from
//            (
//            select * from ' . $tabla . '
//            where LENGTH(CUENTA)=6
//            and AUXILIAR is null
//            and TERCERO is null
//            and ID_VIGENCIA = ' . $vigencia . '
//            and ID_PERIODO_CONTABLE = ' . $periodo . '
//            and ID_cia = ' . $cia . '
//            ' . $whereCenOP . '
//            ' . $whereClase . ' ' . $whereGrupo . ' ' . $whereCuenta . ' ' . $whereCatalogo . '
//            )
//            WHERE
//            NATURALEZA = \'D\'
//
//            group by
//            NATURALEZA ';


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

        $recordsTwo = array();

        if (count($records) > 0) {
            $recordsTwo[] = array(
                'cuenta' => $records[0]['cuenta'],
//                'naturaleza' => $records[0]['naturaleza'],
                'naturaleza' => 'Débito',
                'saldo_anterior' => $records[0]['saldo_anterior'],
                'mvto_debito' => $records[0]['mvto_debito'],
                'mvto_credito' => $records[0]['mvto_credito'],
                'nuevo_saldo' => $records[0]['nuevo_saldo']
            );
        } else {
            $recordsTwo[] = array(
                'cuenta' => 'Total Saldo Débitos',
                'naturaleza' => 'Débito',
                'saldo_anterior' => '0',
                'mvto_debito' => '0',
                'mvto_credito' => '0',
                'nuevo_saldo' => '0'
            );
        }

        /*
         * sql de totales por naturaleza credito
         * solo tiene en cuenta las subcuentas sin auxiliar ni tercero
         */
        $sql_filtros = $this->consultaSQL($request);
        //sentencia sql
        $sql = <<<EOD
select
'Total saldo crédito' AS CUENTA,
NATURALEZA,
sum(SALDO_ANTERIOR) as SALDO_ANTERIOR,
sum(MVTO_DEBITO) as MVTO_DEBITO,
sum(MVTO_CREDITO) as MVTO_CREDITO,
sum(NUEVO_SALDO) as NUEVO_SALDO
from
(
    select distinct lib.* from (
        $sql_filtros
    )lib
    where 
    LENGTH(lib.CUENTA)=6
    and lib.AUXILIAR is null
    and lib.TERCERO is null
)
WHERE
NATURALEZA = 'C'

group by
NATURALEZA 
EOD;
        
//        $sql = '
//
//            select
//            \'Total saldo crédito\' AS CUENTA,
//            NATURALEZA,
//            sum(SALDO_ANTERIOR) as SALDO_ANTERIOR,
//            sum(MVTO_DEBITO) as MVTO_DEBITO,
//            sum(MVTO_CREDITO) as MVTO_CREDITO,
//            sum(NUEVO_SALDO) as NUEVO_SALDO
//            from
//            (
//            select * from ' . $tabla . '
//            where LENGTH(CUENTA)=6
//            and AUXILIAR is null
//            and TERCERO is null
//            and ID_VIGENCIA = ' . $vigencia . '
//            and ID_PERIODO_CONTABLE = ' . $periodo . '
//            and ID_cia = ' . $cia . '
//            ' . $whereCenOP . '
//            ' . $whereClase . ' ' . $whereGrupo . ' ' . $whereCuenta . ' ' . $whereCatalogo . '
//            )
//            WHERE
//            NATURALEZA = \'C\'
//
//            group by
//            NATURALEZA ';


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


        if (count($records) > 0) {
            $recordsTwo[] = array(
                'cuenta' => $records[0]['cuenta'],
//                'naturaleza' => $records[0]['naturaleza'],
                'naturaleza' => 'Crédito',
                'saldo_anterior' => $records[0]['saldo_anterior'],
                'mvto_debito' => $records[0]['mvto_debito'],
                'mvto_credito' => $records[0]['mvto_credito'],
                'nuevo_saldo' => $records[0]['nuevo_saldo']
            );
        } else {
            $recordsTwo[] = array(
                'cuenta' => 'Total Saldo Crédito',
                'naturaleza' => 'Crédito',
                'saldo_anterior' => '0',
                'mvto_debito' => '0',
                'mvto_credito' => '0',
                'nuevo_saldo' => '0'
            );
        }

        $recordsThree[] = array(
            'cuenta' => 'Total',
            'saldo_anterior' => $recordsTwo[0]['saldo_anterior'] - $recordsTwo[1]['saldo_anterior'],
            'mvto_debito' => $recordsTwo[0]['mvto_debito'] + $recordsTwo[1]['mvto_debito'],
            'mvto_credito' => $recordsTwo[0]['mvto_credito'] + $recordsTwo[1]['mvto_credito'],
            'nuevo_saldo' => $recordsTwo[0]['nuevo_saldo'] - $recordsTwo[1]['nuevo_saldo'],
        );

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

        //guardar en el archivo de log el resultado de total de filas
        $this->logMessage('record_count = ' . count($recordsThree));
        $this->logMessage('total_record_count = ' . count($recordsThree));

        //datos de cabecera del JSON
        $this->totalRows = count($recordsThree);
        $this->startRow = $request['_startRow'];
        $this->endRow = count($recordsThree);
    }

    public function executeSumAnt(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");
        }
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        /*
         * 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
        $cia = $request['id_cia'];
        $vigencia = $request['id_vigencia'];
        $periodo = $request['id_periodo_contable'];
        $cen_op = $request['id_cen_op'];
//        $auxiliar = $request['id_auxiliar'];
//        $auxiliar = $request['id_mae_ter'];
//        $catalogo = $request['id_catalogo'];
//        $cuenta = $request['id_cuenta_mayor'];
//        $grupo = $request['id_grupo_cuenta'];
//        $clase = $request['id_clase_cuenta'];


        /*
         * construccion de sql para variables  de cuentas
         */
        if (isset($request['id_clase_cuenta_ini']) && isset($request['id_clase_cuenta_fin'])) {

//            $whereClase = 'and ( id_clase_cuenta = ' . $request['id_clase_cuenta'] . ' or id_clase_cuenta is null ) ';
            $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 = ' ( id_clase_cuenta is null ) ';
            $whereClase = ' ';
        }


        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 = ' ( id_grupo_cuenta is null ) ';
            $whereGrupo = ' ';
        }

        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 = ' ( id_cuenta_mayor is null ) ';
            $whereCuenta = ' ';
        }

        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 = ' ( id_catalogo is null ) ';
            $whereCatalogo = ' ';
        }


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

            $whereAuxiliar = 'and  ( id_auxiliar = ' . $request['id_auxiliar'] . ' or id_auxiliar is null ) ';
        } else {

            $whereAuxiliar = ' ';
        }

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

            $whereTercero = 'and  ( id_mae_ter = ' . $request['id_mae_ter'] . ' or id_mae_ter is null ) ';
        } else {

            $whereTercero = ' ';
        }



//        $vig_ini = $request['vig_ini'];
//        $vig_fin = $request['vig_fin'];
//        $per_ini = $request['per_ini'];
//        $per_fin = $request['per_fin'];



        $sql = '

            select

            \'Total\' AS cuenta,

            sum(saldo_anterior) as saldo_anterior,
            sum(mvto_debito) as mvto_debito,
            sum(mvto_credito) as mvto_credito,
            sum(nuevo_saldo) as nuevo_saldo

            from
            (

                select distinct *
                from
                (

                select *
                from CN_BALANCE_DET_CUE
                where
                ID_VIGENCIA = ' . $vigencia . '
                and ID_PERIODO_CONTABLE = ' . $periodo . '
                and ID_CEN_OP = ' . $cen_op . '
                and ID_cia = ' . $cia . '
                ' . $whereClase . '
                ' . $whereGrupo . '
                ' . $whereCuenta . '
                ' . $whereCatalogo . '
                ' . $whereAuxiliar . '
                ' . $whereTercero . '
                AND LENGTH(cuenta) = 6
                AND auxiliar IS NULL
                AND tercero IS NULL

                )


            )


                ';


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

        /*
         * Guardar valores obtenidos en el sql
         */
        foreach ($sum as $value) {
            foreach ($value as $key => $val) {
                $this->logMessage("val[$key] = $val");
            }
        }

        //Valida si se obtuvo valores en la consulta
        if (count($sum) > 0) {
            //array de filas de consulta para uso del template de JSON
            $this->list_data = $sum;
        } else {
            $this->list_data = array();
        }
    }

    /**
     * Metodo para el calculo de saldos del balance, discriminado por tipo de naturaleza
     *
     * @param sfWebRequest $request
     */
    public function executeSaldo(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");
        }
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        //tomar variables del request
        $cia = $request['id_cia'];
        $vigencia = $request['id_vigencia'];
        $periodo = $request['id_periodo_contable'];


        //validar si es por centro de operacion
        if (isset($request['id_cen_op'])) {
            $cen_op = $request['id_cen_op'];
            $whereCenOP = 'and  ( ID_CEN_OP = ' . $request['id_cen_op'] . ' ) ';
            $tabla = "CN_BALANCE_DET_CUE_TER";
        } else {
            $cen_op = ' ';
            $whereCenOP = ' ';
            $tabla = "CN_BALANCE_CON_CUE_TER";
        }

        /*
         * construccion de sql para variables  de cuentas
         */
        if (isset($request['subc_ini']) && isset($request['subc_fin'])) {
            $whereDigitos = 'and ( cuenta between ' . $request['subc_ini'] . ' and ' . $request['subc_fin'] . ' ) ';
        } else {
            $whereDigitos = ' ';
        }

        if (isset($request['id_clase_cuenta_ini']) && isset($request['id_clase_cuenta_fin'])) {

//            $whereClase = 'and ( id_clase_cuenta = ' . $request['id_clase_cuenta'] . ' or id_clase_cuenta is null ) ';
            $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 = ' ( id_clase_cuenta is null ) ';
            $whereClase = ' ';
        }


        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 = ' ( id_grupo_cuenta is null ) ';
            $whereGrupo = ' ';
        }

        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 = ' ( id_cuenta_mayor is null ) ';
            $whereCuenta = ' ';
        }

        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 = ' ( id_catalogo is null ) ';
            $whereCatalogo = ' ';
        }


//        if (isset($request['cod_aux'])) {
//            $whereAuxiliar = 'and ' . $request['cod_aux'];
//        } else {
//            $whereAuxiliar = ' ';
//        }
//
//        if (isset($request['nitocc'])) {
//            $whereTercero = 'and ' . $request['nitocc'];
//        } else {
//            $whereTercero = ' ';
//        }



        /*
         * sql de totales por naturaleza débito
         * solo tiene en cuenta las subcuentas sin auxiliar ni tercero
         */
        $sql_filtros = $this->consultaSQL($request);
        //sentencia sql
        $sql = <<<EOD
select
'Total saldo débito' AS CUENTA,
NATURALEZA,
sum(SALDO_ANTERIOR) as SALDO_ANTERIOR,
sum(MVTO_DEBITO) as MVTO_DEBITO,
sum(MVTO_CREDITO) as MVTO_CREDITO,
sum(NUEVO_SALDO) as NUEVO_SALDO
from
(
    select distinct lib.* from (
        $sql_filtros
    )lib
    where 
    LENGTH(lib.CUENTA)=6
    and lib.AUXILIAR is null
    and lib.TERCERO is null
)
WHERE
NATURALEZA = 'D'

group by
NATURALEZA 
EOD;
        
//        $sql = '
//
//            select
//            \'Total saldo débito\' AS CUENTA,
//            NATURALEZA,
//            sum(SALDO_ANTERIOR) as SALDO_ANTERIOR,
//            sum(MVTO_DEBITO) as MVTO_DEBITO,
//            sum(MVTO_CREDITO) as MVTO_CREDITO,
//            sum(NUEVO_SALDO) as NUEVO_SALDO
//            from
//            (
//            select * from ' . $tabla . '
//            where LENGTH(CUENTA)=6
//            and AUXILIAR is null
//            and TERCERO is null
//            and ID_VIGENCIA = ' . $vigencia . '
//            and ID_PERIODO_CONTABLE = ' . $periodo . '
//            and ID_cia = ' . $cia . '
//            ' . $whereCenOP . '
//            ' . $whereClase . ' ' . $whereGrupo . ' ' . $whereCuenta . ' ' . $whereCatalogo . '
//            )
//            WHERE
//            NATURALEZA = \'D\'
//
//            group by
//            NATURALEZA ';


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

        $recordsTwo = array();

        //si no hay resultado agrega valores en 0
        if (count($records) > 0) {
            $recordsTwo[] = array(
                'cuenta' => $records[0]['cuenta'],
//                'naturaleza' => $records[0]['naturaleza'],
                'naturaleza' => 'Débito',
                'saldo_anterior' => $records[0]['saldo_anterior'],
                'mvto_debito' => $records[0]['mvto_debito'],
                'mvto_credito' => $records[0]['mvto_credito'],
                'nuevo_saldo' => $records[0]['nuevo_saldo']
            );
        } else {
            $recordsTwo[] = array(
                'cuenta' => 'Total Saldo Débitos',
                'naturaleza' => 'Débito',
                'saldo_anterior' => '0',
                'mvto_debito' => '0',
                'mvto_credito' => '0',
                'nuevo_saldo' => '0'
            );
        }


        /*
         * sql de totales por naturaleza crédito
         * solo tiene en cuenta las subcuentas sin auxiliar ni tercero
         */
        $sql_filtros = $this->consultaSQL($request);
        //sentencia sql
        $sql = <<<EOD
select
'Total saldo crédito' AS CUENTA,
NATURALEZA,
sum(SALDO_ANTERIOR) as SALDO_ANTERIOR,
sum(MVTO_DEBITO) as MVTO_DEBITO,
sum(MVTO_CREDITO) as MVTO_CREDITO,
sum(NUEVO_SALDO) as NUEVO_SALDO
from
(
    select distinct lib.* from (
        $sql_filtros
    )lib
    where 
    LENGTH(lib.CUENTA)=6
    and lib.AUXILIAR is null
    and lib.TERCERO is null
)
WHERE
NATURALEZA = 'C'

group by
NATURALEZA 
EOD;
        
//        $sql = '
//
//            select
//            \'Total saldo crédito\' AS CUENTA,
//            NATURALEZA,
//            sum(SALDO_ANTERIOR) as SALDO_ANTERIOR,
//            sum(MVTO_DEBITO) as MVTO_DEBITO,
//            sum(MVTO_CREDITO) as MVTO_CREDITO,
//            sum(NUEVO_SALDO) as NUEVO_SALDO
//            from
//            (
//            select * from ' . $tabla . '
//            where LENGTH(CUENTA)=6
//            and AUXILIAR is null
//            and TERCERO is null
//            and ID_VIGENCIA = ' . $vigencia . '
//            and ID_PERIODO_CONTABLE = ' . $periodo . '
//            and ID_cia = ' . $cia . '
//            ' . $whereCenOP . '
//            ' . $whereClase . ' ' . $whereGrupo . ' ' . $whereCuenta . ' ' . $whereCatalogo . '
//            )
//            WHERE
//            NATURALEZA = \'C\'
//
//            group by
//            NATURALEZA ';


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


        //si no hay resultado agrega valores en 0
        if (count($records) > 0) {
            $recordsTwo[] = array(
                'cuenta' => $records[0]['cuenta'],
//                'naturaleza' => $records[0]['naturaleza'],
                'naturaleza' => 'Crédito',
                'saldo_anterior' => $records[0]['saldo_anterior'],
                'mvto_debito' => $records[0]['mvto_debito'],
                'mvto_credito' => $records[0]['mvto_credito'],
                'nuevo_saldo' => $records[0]['nuevo_saldo']
            );
        } else {
            $recordsTwo[] = array(
                'cuenta' => 'Total Saldo Crédito',
                'naturaleza' => 'Crédito',
                'saldo_anterior' => '0',
                'mvto_debito' => '0',
                'mvto_credito' => '0',
                'nuevo_saldo' => '0'
            );
        }

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

        //guardar en el archivo de log el resultado de total de filas
        $this->logMessage('record_count = ' . count($recordsTwo));
        $this->logMessage('total_record_count = ' . count($recordsTwo));

        //datos de cabecera del JSON
        $this->totalRows = count($recordsTwo);
        $this->startRow = $request['_startRow'];
        $this->endRow = count($recordsTwo);
    }

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


        /*
         * Tomar variables del request
         */
        $cia = $request['id_cia'];
        $vigencia = $request['id_vigencia'];
        $periodo = $request['id_periodo_contable'];

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

        //Auxiliar 
        if (isset($request['id_auxiliar'])) {
            if (isset($request['id_mae_ter'])) {
                $whereAuxiliar = 'and  ( sal.id_auxiliar = ' . $request['id_auxiliar'] . ' ) ';
            } else {
                $whereAuxiliar = 'and  ( sal.id_auxiliar = ' . $request['id_auxiliar'] . ' ) ';
            }
        } else {
            $whereAuxiliar = ' ';
        }

        //Tercero
        if (isset($request['id_mae_ter'])) {
            if (isset($request['id_auxiliar'])) {
                $whereTercero = 'and  ( sal.id_mae_ter = ' . $request['id_mae_ter'] . ' or sal.id_mae_ter is null ) ';
            } else {
                $whereTercero = 'and  ( sal.id_mae_ter = ' . $request['id_mae_ter'] . ' ) ';
            }
        } else {
            $whereTercero = ' ';
        }

        /*
         * no mostar registros con valores cero en saldos y movimientos - 20111026
         * correo: registros cuyos campos de dinero (Saldos, débito y crédito) en ceros los que no se deben mostrar,
         * es decir, para los que no ha habido movimiento en el periodo y filtros seleccionados, a nivel de tercero.
         */
        $whereValorCero = '';
        if (isset($request['valor_cero'])) {
            if ($request['valor_cero'] == 'true') {
                $whereValorCero = '
                 where
                 (CASE WHEN

                 LENGTH(cuenta) = 6
                 and (
                    id_auxiliar is not null
                    or id_mae_ter is not null)
                    AND SALDO_ANTERIOR = 0
                 AND MVTO_DEBITO = 0
                 AND MVTO_CREDITO = 0
                 AND NUEVO_SALDO = 0

                      THEN 0

                    ELSE 1
                END) = 1 ';
            }
        }

        //$cenop = $request['id_cen_op'];
        //validar si es por centro de operacion
        if (isset($request['id_cen_op'])) {
            $cenop = $request['id_cen_op'];
            $whereCenOP = 'and  ( ID_CEN_OP = ' . $request['id_cen_op'] . ' ) ';
            $tabla = "CN_BALANCE_DET_CUE";

            /*
             * sql que trae el balance
             * por los filtros, para totalizar las filas
             */
            //sentencia sql
            $sql = <<<EOD
        
  
  select 

    NATURALEZA,
    ID_CLASE_CUENTA,
    ID_GRUPO_CUENTA,
    ID_CUENTA_MAYOR,
    ID_CATALOGO,
    ID_AUXILIAR,
    ID_MAE_TER,
    CUENTA,
    AUXILIAR,
    SUBAUXILIAR,
    TERCERO,
    NOMBRE_CUENTA,
    SALDO_ANTERIOR,
    MVTO_DEBITO,
    MVTO_CREDITO,
    NUEVO_SALDO,
    /**Llave de la vista*/
    ID_CIA,
    ID_CEN_OP,
    ID_VIGENCIA,
    ID_PERIODO_CONTABLE
  FROM
    (
    /** INICIA BALANCE */
    /* Clase Cuenta*/
    SELECT *
    FROM
      (SELECT NATURALEZA,
        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,
        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 NUEVO_SALDO,
        /**Llave de la vista*/
        ID_CIA,
        ID_CEN_OP,
        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_CEN_OP,
          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_CEN_OP = $cenop
        and sal.id_cia = $cia
        --Filtro Digitos Cuenta
        $whereClase     
        
        )
      GROUP BY NATURALEZA,
        ID_CLASE_CUENTA,
        CUENTA,
        NOMBRE_CUENTA,
        /**Llave de la vista*/
        ID_CIA,
        ID_CEN_OP,
        ID_VIGENCIA,
        ID_PERIODO_CONTABLE
      )
    UNION
    /* Grupo Cuenta*/
    SELECT *
    FROM
      (SELECT NATURALEZA,
        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,
        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 NUEVO_SALDO,
        /**Llave de la vista*/
        ID_CIA,
        ID_CEN_OP,
        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_CEN_OP,
          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_CEN_OP = $cenop
        and sal.id_cia = $cia
        --Filtro Digitos Cuenta
        $whereGrupo
        
        )
      GROUP BY NATURALEZA,
        ID_CLASE_CUENTA,
        ID_GRUPO_CUENTA,
        CUENTA,
        NOMBRE_CUENTA,
        /**Llave de la vista*/
        ID_CIA,
        ID_CEN_OP,
        ID_VIGENCIA,
        ID_PERIODO_CONTABLE
      )
    UNION
    /* Cuenta Mayor*/
    SELECT *
    FROM
      (SELECT cue.NATURALEZA,
        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,
        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 NUEVO_SALDO,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_CEN_OP,
        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_CEN_OP = $cenop
        and sal.id_cia = $cia
      --Filtro Digitos Cuenta
      $whereCuenta
      
      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_CEN_OP,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      )
    UNION
    /* Subcuenta sin terceros y sin auxiliar*/
    SELECT *
    FROM
      (SELECT cue.NATURALEZA,
        cat.ID_CLASE_CUENTA     AS ID_CLASE_CUENTA,
        cat.ID_GRUPO_CUENTA     AS ID_GRUPO_CUENTA,
        cat.ID_CUENTA_MAYOR     AS ID_CUENTA_MAYOR,
        cat.ID_CATALOGO         AS ID_CATALOGO,
        NULL                    AS ID_AUXILIAR,
        NULL                    AS ID_MAE_TER,
        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 NUEVO_SALDO,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_CEN_OP,
        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
        
        where
        sal.id_vigencia = $vigencia
        and sal.id_periodo_contable = $periodo
        and sal.ID_CEN_OP = $cenop
        and sal.id_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
        
      GROUP BY cue.NATURALEZA,
        cat.ID_CLASE_CUENTA,
        cat.ID_GRUPO_CUENTA,
        cat.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        sal.SUBCUENTA,
        cat.NOMBRE,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_CEN_OP,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      )
      /** TERMINA BALANCE **/
    ) 
    $whereValorCero  

EOD;
        } else {
            $cenop = ' ';
            $whereCenOP = ' ';
            $tabla = "CN_BALANCE_CON_CUE";

            /*
             * sql que trae el balance consolidado
             * por los filtros, para totalizar las filas 
             */
            //sentencia sql
            $sql = <<<EOD

       
  SELECT 

    naturaleza,
    ID_CLASE_CUENTA,
    ID_GRUPO_CUENTA,
    ID_CUENTA_MAYOR,
    ID_CATALOGO,
    ID_AUXILIAR,
    ID_MAE_TER,
    CUENTA,
    AUXILIAR,
    SUBAUXILIAR,
    TERCERO,
    NOMBRE_CUENTA,
    SALDO_ANTERIOR,
    MVTO_DEBITO,
    MVTO_CREDITO,
    NUEVO_SALDO,
    /**Llave de la vista*/
    ID_CIA,
    ID_VIGENCIA,
    ID_PERIODO_CONTABLE
  FROM
    (
    /** INICIA BALANCE */
    /* Clase Cuenta*/
    SELECT *
    FROM
      (SELECT NATURALEZA,
        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,
        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 NUEVO_SALDO,
        /**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     
        
        )
      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 NATURALEZA,
        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,
        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 NUEVO_SALDO,
        /**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
        
        )
      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 cue.NATURALEZA,
        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,
        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 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
      $whereCuenta
      
      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 sin terceros y sin auxiliar*/
    SELECT *
    FROM
      (SELECT cue.NATURALEZA,
        cat.ID_CLASE_CUENTA     AS ID_CLASE_CUENTA,
        cat.ID_GRUPO_CUENTA     AS ID_GRUPO_CUENTA,
        cat.ID_CUENTA_MAYOR     AS ID_CUENTA_MAYOR,
        cat.ID_CATALOGO         AS ID_CATALOGO,
        NULL                    AS ID_AUXILIAR,
        NULL                    AS ID_MAE_TER,
        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 NUEVO_SALDO,
        /**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
        
        where
        sal.id_vigencia = $vigencia
        and sal.id_periodo_contable = $periodo
        and sal.id_cia = $cia
        --Filtro Digitos Cuenta
        $whereCatalogo
        
      GROUP BY cue.NATURALEZA,
        cat.ID_CLASE_CUENTA,
        cat.ID_GRUPO_CUENTA,
        cat.ID_CUENTA_MAYOR,
        cat.ID_CATALOGO,
        sal.SUBCUENTA,
        cat.NOMBRE,
        /**Llave de la vista*/
        sal.ID_CIA,
        sal.ID_VIGENCIA,
        sal.ID_PERIODO_CONTABLE
      )
      /** TERMINA BALANCE **/
    )
    $whereValorCero 
        
EOD;
        }

        return $sql;
    }

}
