<?php

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

    /**
     * Servicio de list
     * lista los datos del informe
     * @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 . "'";



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


        /*
         * obtener variables del request
         */
        //filtros obligatorios
        $this->cia = $cia = $request['id_cia'];
        $cen_op = $request['id_cen_op'];
        $this->vig1 = $vigencia = $request['id_vigencia'];
        $this->per1 = $periodo = $request['id_periodo_contable'];

        //validar comparacion de periodos
        if (isset($request["compara"])) {

            if ($request['compara'] == 'true') {

                $this->vig2 = $vig_compar = $request['vig_compar'];
                $this->per2 = $per_compar = $request['per_compar'];
                $this->comparar = $compara = $request['compara'];
            } else {
                $this->comparar = $compara = 'false';
            }
        }

        //variables para reportes
        $this->variacion = $request['variacion'];
        $this->cuenta = $request['cuenta'];
        $this->pesos = $request['pesos'];

        $records = array();

        if ($compara == 'true') {

            /*
             * obtener los records de la consulta sql para los periodos a comparar
             */

            //resultado del periodo de consulta
            $rec = $this->sql_balance_general($cia, $cen_op, $vigencia, $periodo);

            //validar si hay resultados
            if (count($rec) > 0) {
                //obtener saldo actual para el resultado del ejercicio
                $saldo = $this->sql_resultado_ejercicio($cia, $cen_op, $vigencia, $periodo);

                //log del valor resultado del ejercicio
                $this->logMessage("*** Resultado del Ejercicio: " . $saldo);

                //llamado al metodo de resultado del ejercicio
                $rec = $this->resultado_ejercicio($rec, $saldo);
            }

            //resultado del periodo a comparar
            $rec_compar = $this->sql_balance_general($cia, $cen_op, $vig_compar, $per_compar);

            //validar si hay resultados
            if (count($rec_compar) > 0) {
                //obtener saldo actual para el resultado del ejercicio
                $saldo = $this->sql_resultado_ejercicio($cia, $cen_op, $vig_compar, $per_compar);

                //log del valor resultado del ejercicio
                $this->logMessage("*** Resultado del Ejercicio: " . $saldo);

                //llamado al metodo de resultado del ejercicio
                $rec_compar = $this->resultado_ejercicio($rec_compar, $saldo);
            }

            $rec_completo = array_merge($rec, $rec_compar);

            //validar datos del arreglo
//        echo var_dump($rec);die();
            //ordenar la consulta de los dos periodos
            if (count($rec_completo) > 0) {
                $rec = $this->ordenar_array($rec_completo, 'orden', SORT_ASC, 'dig_cla', SORT_ASC, 'corriente', SORT_DESC, 'dig_gru', SORT_ASC, 'dig_cue', SORT_ASC, 'id_vigencia', SORT_DESC, 'id_periodo_contable', SORT_DESC) or die('<br>ERROR!<br>');
            } else {
                $rec = array();
            }

            $records = array();
//        $num_key = 0;
//        foreach ($rec as $rec_one) {
            /*
             * 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)]['debito'];
                        $records_one['credito2'] = $rec[($num_key + 1)]['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
                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'] = ($records_one['saldo_actual2'] * 100) / $records_one['saldo_actual'];
                }

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

//            $num_key++;
            }
        } else {
            //obtener filas de consultas sql por filtros
            $records = $this->sql_balance_general($cia, $cen_op, $vigencia, $periodo);

            //obtener saldo actual para el resultado del ejercicio
            $saldo = $this->sql_resultado_ejercicio($cia, $cen_op, $vigencia, $periodo);

            //log del valor resultado del ejercicio
            $this->logMessage("*** Resultado del Ejercicio: " . $saldo);

            //llamado al metodo de resultado del ejercicio
            $records = $this->resultado_ejercicio($records, $saldo);
        }

        //Valida si se obtuvo valores en la consulta
        if (count($records) > 0) {
            $this->list_data = $records;
        } else {
            $this->list_data = array();
        }


        //totales de filas y de consulta
        $this->logMessage('record_count = ' . count($records));
        $this->logMessage('total_record_count = ' . count($records));


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

    /**
     * Metodo para insertar valor del resultado del ejercicio para la clase cuenta del patrimonio
     *
     * @param <type> $records
     * @param <type> $saldo
     */
    function resultado_ejercicio($records, $saldo) {

        /*
         * buscar cuenta 3230 resultado ejercicio
         */
        foreach ($records as $key => $rec) {

            //solo para el patrimonio ordende mayor o igual a 3, o menor que 4
            if ($rec['orden'] >= 3 && $rec['orden'] < 4) {


                /*
                 * si corresponde a la cuenta 3230, grupo 32, clase 3 o es total pasivo y patrimonio sume al saldo actual
                 *
                 * dig_cue = 99999 - para el total pasivo y patrimonio
                 */
                if (( $rec['id_clase_cuenta'] == 4 && is_null($rec['id_grupo_cuenta']) )
                        || $rec['cuenta'] == '32' || $rec['cuenta'] == '3230' || $rec['dig_cue'] == '99999') {


                    //nombre de cuenta para modificar
                    $this->logMessage("* Nombre cuenta: " . $rec['nombre_cuenta']);


                    //log del valor saldo actual + resultado del ejercicio
                    $this->logMessage("** Saldo actual cuenta " . $rec['cuenta'] . " : " . ($rec['saldo_actual'] + $saldo));


                    //suma el resultado del saldo si es igual a 0, no hay movimientos para este calculo
                    if ($rec['saldo_actual'] == 0 || $rec['cuenta'] != '3230') {

                        //si se modifica
                        $this->logMessage("*** Modifico saldo actual cuenta  con saldo: " . $saldo);

                        //modifica el saldo actual
                        $records[$key]['saldo_actual'] = $rec['saldo_actual'] + $saldo;
                    }
                }
            }
        }

        //retornar filas con modificacion de saldo actual
        return $records;
    }

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

    function sql_balance_general($cia, $cen_op, $vigencia, $periodo) {

        //sentencia sql para balance general

        $sql = <<<EOD
SELECT
*
FROM CN_BALANCE_GENERAL tab0

WHERE tab0.id_cia = $cia
AND tab0.id_vigencia = $vigencia
AND tab0.id_periodo_contable = $periodo
EOD;
        //and (tab0.dig_cla = 1 or tab0.dig_cla = 8)
        //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 para ejecutar consulta sql sel calculo del resultado del ejercicio
     *
     * @param <type> $cia
     * @param <type> $cen_op
     * @param <type> $vigencia
     * @param <type> $periodo
     * @return <type>
     */
    function sql_resultado_ejercicio($cia, $cen_op, $vigencia, $periodo) {

        //sentencia sql calcular el resultado del ejercicio, cuenta mayor 3230

        $sql = <<<EOD
/*EXCEDENTE(DEFICIT) DEL EJERCICIO*/

SELECT
3.1 AS ORDEN,
null as CUENTA,
'EXCEDENTE(DEFICIT) DEL EJERCICIO' AS NOMBRE_CUENTA,
null as NATURALEZA,
CORRIENTE,
null as ID_CLASE_CUENTA,
null as ID_GRUPO_CUENTA,
null as ID_CUENTA_MAYOR,
null as dig_cla,
null as nom_cla,
null as dig_gru,
null as nom_gru,
null as dig_cue,
null as nom_cue,
sum(SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(DEBITO) AS DEBITO,
sum(CREDITO) AS CREDITO,
sum(SALDO_ACTUAL) AS SALDO_ACTUAL,
/*llave de la vista*/
VIG_PER,
ID_CIA,
ID_VIGENCIA,
ID_PERIODO_CONTABLE
FROM (

/*EXCEDENTE(DEFICIT) OPERACIONAL*/
/*sumatoria cuentas 4, menos 5 y 6*/
SELECT
null as ORDEN,
null as CUENTA,
null as NOMBRE_CUENTA,
null as NATURALEZA,
CORRIENTE,
null as ID_CLASE_CUENTA,
null as ID_GRUPO_CUENTA,
null as ID_CUENTA_MAYOR,
null as dig_cla,
null as nom_cla,
null as dig_gru,
null as nom_gru,
null as dig_cue,
null as nom_cue,
sum(SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(DEBITO) AS DEBITO,
sum(CREDITO) AS CREDITO,
sum(SALDO_ACTUAL) AS SALDO_ACTUAL,
/*llave de la vista*/
VIG_PER,
ID_CIA,
ID_VIGENCIA,
ID_PERIODO_CONTABLE

FROM (
/*totales por otros ingresos y gastos para cuenta de clase 4 al 6 solo grupo 8*/
Select
/*otros ingresos y gastos*/
null as orden,
null  AS CUENTA,
null as NOMBRE_CUENTA,
null as NATURALEZA,
cat.CORRIENTE,
sal.ID_CLASE_CUENTA,
null as ID_GRUPO_CUENTA,
null as ID_CUENTA_MAYOR,
cla.DIGITO as dig_cla,
cla.NOMBRE as nom_cla,
null as  dig_gru,
null as  nom_gru,
null as dig_cue,
null as nom_cue,
(CASE
       WHEN cla.DIGITO = 4 THEN sum(sal.SALDO_ANTERIOR)
    ELSE -sum(sal.SALDO_ANTERIOR)
  END) SALDO_ANTERIOR,
--sum(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
(CASE
       WHEN cla.DIGITO = 4 THEN sum(sal.DEBITO)
    ELSE -sum(sal.DEBITO)
  END) DEBITO,
--sum(sal.DEBITO) AS DEBITO,
(CASE
       WHEN cla.DIGITO = 4 THEN sum(sal.CREDITO)
    ELSE -sum(sal.CREDITO)
  END) CREDITO,
--sum(sal.CREDITO) AS CREDITO,
(CASE
       WHEN cla.DIGITO = 4 THEN sum(sal.SALDO_ACTUAL)
    ELSE -sum(sal.SALDO_ACTUAL)
  END) SALDO_ACTUAL,
--sum(sal.SALDO_ACTUAL) AS SALDO_ACTUAL,
/*llave de la vista*/
sal.VIG_PER,
sal.ID_CIA,
sal.ID_VIGENCIA,
sal.ID_PERIODO_CONTABLE
/*saldo mes comparativo*/

from CN_SALDO_VIGPER sal

JOIN CN_CLASE_CUENTA cla on
sal.ID_CLASE_CUENTA = cla.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_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_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

where
 cla.DIGITO BETWEEN 4 AND 6
and gru.DIGITO != 8

group by
cat.CORRIENTE,
sal.ID_CLASE_CUENTA,
cla.DIGITO,
cla.NOMBRE,
/*llave de la vista*/
sal.VIG_PER,
sal.ID_CIA,
sal.ID_VIGENCIA,
sal.ID_PERIODO_CONTABLE
)
group by
ORDEN,
CUENTA,
NOMBRE_CUENTA,
NATURALEZA,
CORRIENTE,
/*llave de la vista*/
VIG_PER,
ID_CIA,
ID_VIGENCIA,
ID_PERIODO_CONTABLE


UNION


/*EXCEDENTE(DEFICIT) NO OPERACIONAL*/
/*sumatoria cuentas 4, menos 5 y 6*/
SELECT
null as ORDEN,
null as CUENTA,
null as NOMBRE_CUENTA,
null as NATURALEZA,
CORRIENTE,
null as ID_CLASE_CUENTA,
null as ID_GRUPO_CUENTA,
null as ID_CUENTA_MAYOR,
null as dig_cla,
null as nom_cla,
null as dig_gru,
null as nom_gru,
null as dig_cue,
null as nom_cue,
sum(SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(DEBITO) AS DEBITO,
sum(CREDITO) AS CREDITO,
sum(SALDO_ACTUAL) AS SALDO_ACTUAL,
/*llave de la vista*/
VIG_PER,
ID_CIA,
ID_VIGENCIA,
ID_PERIODO_CONTABLE

FROM (
/*totales por otros ingresos y gastos para cuenta de clase 4 al 6 solo grupo 8*/
Select
/*otros ingresos y gastos*/
2 as orden,
null  AS CUENTA,
'EXCEDENTE(DEFICIT) NO OPERACIONAL' AS NOMBRE_CUENTA,
null as NATURALEZA,
cat.CORRIENTE,
sal.ID_CLASE_CUENTA,
null as ID_GRUPO_CUENTA,
null as ID_CUENTA_MAYOR,
cla.DIGITO as dig_cla,
cla.NOMBRE as nom_cla,
null as  dig_gru,
null as  nom_gru,
null as dig_cue,
null as nom_cue,
(CASE
       WHEN cla.DIGITO = 4 THEN sum(sal.SALDO_ANTERIOR)
    ELSE -sum(sal.SALDO_ANTERIOR)
  END) SALDO_ANTERIOR,
--sum(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
(CASE
       WHEN cla.DIGITO = 4 THEN sum(sal.DEBITO)
    ELSE -sum(sal.DEBITO)
  END) DEBITO,
--sum(sal.DEBITO) AS DEBITO,
(CASE
       WHEN cla.DIGITO = 4 THEN sum(sal.CREDITO)
    ELSE -sum(sal.CREDITO)
  END) CREDITO,
--sum(sal.CREDITO) AS CREDITO,
(CASE
       WHEN cla.DIGITO = 4 THEN sum(sal.SALDO_ACTUAL)
    ELSE -sum(sal.SALDO_ACTUAL)
  END) SALDO_ACTUAL,
--sum(sal.SALDO_ACTUAL) AS SALDO_ACTUAL,
/*llave de la vista*/
sal.VIG_PER,
sal.ID_CIA,
sal.ID_VIGENCIA,
sal.ID_PERIODO_CONTABLE
/*saldo mes comparativo*/

from CN_SALDO_VIGPER sal

JOIN CN_CLASE_CUENTA cla on
sal.ID_CLASE_CUENTA = cla.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_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_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

where
 cla.DIGITO BETWEEN 4 AND 6
and gru.DIGITO = 8
AND cue.DIGITOS != 10
AND cue.DIGITOS != 15

group by
cat.CORRIENTE,
sal.ID_CLASE_CUENTA,
cla.DIGITO,
cla.NOMBRE,
/*llave de la vista*/
sal.VIG_PER,
sal.ID_CIA,
sal.ID_VIGENCIA,
sal.ID_PERIODO_CONTABLE
)
group by
ORDEN,
CUENTA,
NOMBRE_CUENTA,
NATURALEZA,
CORRIENTE,
/*llave de la vista*/
VIG_PER,
ID_CIA,
ID_VIGENCIA,
ID_PERIODO_CONTABLE


UNION


/*PARTIDAS EXTRAORDINARIAS*/

select
null as orden,
NULL AS CUENTA,
null as  NOMBRE_CUENTA,
null as NATURALEZA,
CORRIENTE,
null as ID_CLASE_CUENTA,
null as ID_GRUPO_CUENTA,
NULL AS ID_CUENTA_MAYOR,
null as dig_cla,
null as nom_cla,
null as dig_gru,
null as nom_gru,
NULL AS dig_cue,
NULL AS nom_cue,
sum(SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(DEBITO) AS DEBITO,
sum(CREDITO) AS CREDITO,
sum(SALDO_ACTUAL) AS SALDO_ACTUAL,
/*llave de la vista*/
VIG_PER,
ID_CIA,
ID_VIGENCIA,
ID_PERIODO_CONTABLE
from (
/*grupos de clase 4 al 6*/
select
/*otros ingresos y gastos*/
   (CASE
       WHEN gru.DIGITO = 8 and ( cue.DIGITOS != 10 and cue.DIGITOS != 15 ) THEN 2
       WHEN gru.DIGITO = 8 THEN 3
    ELSE 1
  END ) orden,
cla.DIGITO || gru.DIGITO AS CUENTA,
/*TITULO PARA GRUPO*/
GRU.NOMBRE AS NOMBRE_CUENTA,
cla.NATURALEZA,
cat.CORRIENTE,
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
null as ID_CUENTA_MAYOR,
cla.DIGITO as dig_cla,
cla.NOMBRE as nom_cla,
gru.DIGITO as dig_gru,
gru.NOMBRE as nom_gru,
null as dig_cue,
null as nom_cue,
sum(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(sal.DEBITO) AS DEBITO,
sum(sal.CREDITO) AS CREDITO,
sum(sal.SALDO_ACTUAL) AS SALDO_ACTUAL,
/*llave de la vista*/
sal.VIG_PER,
sal.ID_CIA,
sal.ID_VIGENCIA,
sal.ID_PERIODO_CONTABLE
/*saldo mes comparativo*/

from CN_SALDO_VIGPER sal

JOIN CN_CLASE_CUENTA cla on
sal.ID_CLASE_CUENTA = cla.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_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_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

where
 cla.DIGITO BETWEEN 4 AND 6
and gru.DIGITO = 8
AND ( cue.DIGITOS = 10 OR cue.DIGITOS = 15 )

group by
cla.NATURALEZA,
cat.CORRIENTE,
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
cla.DIGITO,
cla.NOMBRE,
gru.DIGITO,
gru.NOMBRE,
cue.DIGITOS,
cue.NOMBRE,
/*llave de la vista*/
sal.VIG_PER,
sal.ID_CIA,
sal.ID_VIGENCIA,
sal.ID_PERIODO_CONTABLE

)
group by
orden,
CUENTA,
NOMBRE_CUENTA,
NATURALEZA,
CORRIENTE,
ID_CLASE_CUENTA,
ID_GRUPO_CUENTA,
ID_CUENTA_MAYOR,
dig_cla,
nom_cla,
dig_gru,
nom_gru,
dig_cue,
nom_cue,
/*llave de la vista*/
VIG_PER,
ID_CIA,
ID_VIGENCIA,
ID_PERIODO_CONTABLE

)
WHERE id_cia = $cia
AND id_vigencia = $vigencia
AND id_periodo_contable = $periodo

GROUP BY
CUENTA,
NATURALEZA,
CORRIENTE,
ID_CLASE_CUENTA,
ID_GRUPO_CUENTA,
ID_CUENTA_MAYOR,
dig_cla,
nom_cla,
dig_gru,
nom_gru,
dig_cue,
nom_cue,
/*llave de la vista*/
VIG_PER,
ID_CIA,
ID_VIGENCIA,
ID_PERIODO_CONTABLE
EOD;
        //AND tab0.id_cen_op = $cen_op
        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);

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

            return $saldo_actual = $records[0]['saldo_actual'];
        } else {

            return $saldo_actual = 0;
        }
    }

}
