<?php

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

    /**
     * Obtener records para los saldos
     *
     * @param sfWebRequest $request
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //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 por defecto para el registro de log
         */
        $id_tabla = 'null';
        $id_vigencia = 'null';
        $id_cen_op = 'null';

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

        //obtener id maestro tabla
        $id_mae_bd = CN_TABLE::consultarIdTablaBD('CN_SALDO');

        //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
        $observacion = "'Se consulto regenerar saldos 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);



        /*
         * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
         */
        $sql = 'select distinct
                sal.ID_CIA , sal.ID_VIGENCIA, sal.ID_PERIODO_CONTABLE , per.NOM_PERIODO
                from CN_SALDO sal
                join CN_PERIODO_CONTABLE per on
                sal.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE
                order by sal.ID_VIGENCIA DESC, sal.ID_PERIODO_CONTABLE DESC ';

        //Ejecuta sql
        $this->list_data = CN_TABLE::executeSQL($sql);
    }

    /**
     * Metodo para adjuntar nuevos saldos
     * @param sfWebRequest $request
     */
    public function executeAdd(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //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");


        /*
         * Obtiene las vigencias y periodos que se encuentran en los saldos
         */
        $sql = 'select distinct
                sal.ID_CIA , sal.ID_VIGENCIA, sal.ID_PERIODO_CONTABLE , per.NOM_PERIODO
                from CN_SALDO sal
                join CN_PERIODO_CONTABLE per on
                sal.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE
                order by sal.ID_VIGENCIA DESC, sal.ID_PERIODO_CONTABLE DESC';

        //Ejecuta sql
        $saldos = CN_TABLE::executeSQL($sql);

        //Valida si esta vacio
        if (empty($saldos)) {


            /*
             * Valores de vigencia/periodo en los movimientos
             */
            $sql = <<<EOD
        select distinct 
        ID_PERIODO_CONTABLE,  
        ID_VIGENCIA 
        from CN_MOVIMIENTO_VIGPER
        where
        ID_PERIODO_CONTABLE = 13 and
        ID_VIGENCIA = 2010
EOD;
//        order by VIG_PER
            //Ejecuta sql
            $movimientos = CN_TABLE::executeSQL($sql);

            if (!empty($movimientos)) {

                //Elimina datos de la tabla
                $sql = 'TRUNCATE TABLE CN_SALDO';

                //Ejecuta sql
                CN_TABLE::executeSQL($sql);

                /*
                 * Sql para insertar saldos
                 */
                $sql = 'INSERT INTO CN_SALDO
                        SELECT *
                        FROM
                        (
                        SELECT *
                        FROM
                        (
                        SELECT
                         mov.ID_CIA,
                         mov.ID_CEN_OP,
                         mov.ID_VIGENCIA,
                         cad.ID_PERIODO_CONTABLE,
                         mov.ID_CLASE_CUENTA,
                         mov.ID_GRUPO_CUENTA,
                         mov.ID_CUENTA_MAYOR,
                         mov.ID_CATALOGO,
                         mov.ID_MAE_TER,
                         mov.ID_AUXILIAR,
                         mov.ID_SUB_AUX,
                         mov.ID_CENTRO_COSTO,
                         mov.ID_SUB_CENTRO_COSTO,
                         cla.DIGITO|| gru.DIGITO|| cue.DIGITOS||cat.DIGITOS AS SUBCUENTA,
                         0 AS SALDO_ANTERIOR,
                         SUM(mov.DEBITO) AS DEBITO,
                         SUM(mov.CREDITO) AS CREDITO,
                         SUM(mov.DEBITO) - SUM(mov.CREDITO)
                         AS SALDO_ACTUAL

                        FROM CN_MOVIMIENTO_CONTABLE mov

                        JOIN CN_DOCUMENTO doc ON
                         mov.ID_DOCUMENTO = doc.ID_DOCUMENTO
                         AND mov.ID_CAD = doc.ID_CAD
                         and mov.ID_CIA = doc.ID_CIA
                         AND mov.ID_CEN_OP = doc.ID_CEN_OP
                         AND mov.ID_VIGENCIA = doc.ID_VIGENCIA

                        JOIN CN_CONTROL_CAD cad ON
                         mov.ID_CAD = cad.ID_CAD
                         and mov.ID_CIA = cad.ID_CIA
                         AND mov.ID_CEN_OP = cad.ID_CEN_OP
                         AND mov.ID_VIGENCIA = cad.ID_VIGENCIA

                        JOIN CN_VIGENCIA vig ON
                         mov.ID_VIGENCIA = vig.ID_VIGENCIA

                        JOIN CN_PERIODO_CONTABLE per ON
                         cad.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE

                        JOIN CN_CATALOGO cat ON
                         mov.ID_CIA = cat.ID_CIA
                         AND mov.ID_CATALOGO = cat.ID_CATALOGO
                         AND mov.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
                         AND mov.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA

                        JOIN CN_CUENTA_MAYOR cue ON
                         mov.ID_CIA = cue.ID_CIA
                         AND mov.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
                         AND mov.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

                        JOIN CN_GRUPO_CUENTA gru ON
                         mov.ID_CIA = gru.ID_CIA
                         AND mov.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA

                        JOIN CN_CLASE_CUENTA cla ON
                         mov.ID_CIA = cla.ID_CIA
                         AND mov.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA

                        WHERE vig.ID_VIGENCIA = 2010 AND per.ID_PERIODO_CONTABLE = 13 AND cue.NATURALEZA = \'D\'

                        GROUP BY
                         mov.ID_CIA,
                         mov.ID_CEN_OP,
                         mov.ID_VIGENCIA,
                         cad.ID_PERIODO_CONTABLE,
                         mov.ID_CLASE_CUENTA,
                         mov.ID_GRUPO_CUENTA,
                         mov.ID_CUENTA_MAYOR,
                         mov.ID_CATALOGO,
                         mov.ID_MAE_TER,
                         mov.ID_AUXILIAR,
                         mov.ID_SUB_AUX,
                         mov.ID_CENTRO_COSTO,
                         mov.ID_SUB_CENTRO_COSTO,
                         cla.DIGITO,
                         gru.DIGITO,
                         cue.DIGITOS,
                         cat.DIGITOS

                        ORDER BY
                         SUBCUENTA
                        )

                        UNION

                        SELECT *
                        FROM
                        (
                        SELECT
                         mov.ID_CIA,
                         mov.ID_CEN_OP,
                         mov.ID_VIGENCIA,
                         cad.ID_PERIODO_CONTABLE,
                         mov.ID_CLASE_CUENTA,
                         mov.ID_GRUPO_CUENTA,
                         mov.ID_CUENTA_MAYOR,
                         mov.ID_CATALOGO,
                         mov.ID_MAE_TER,
                         mov.ID_AUXILIAR,
                         mov.ID_SUB_AUX,
                         mov.ID_CENTRO_COSTO,
                         mov.ID_SUB_CENTRO_COSTO,
                         cla.DIGITO||
                         gru.DIGITO||
                         cue.DIGITOS||
                         cat.DIGITOS
                         AS SUBCUENTA,
                         0 AS SALDO_ANTERIOR,
                         SUM(mov.DEBITO) AS DEBITO,
                         SUM(mov.CREDITO) AS CREDITO,
                         SUM(mov.CREDITO) - SUM(mov.DEBITO)
                         AS SALDO_ACTUAL

                        FROM CN_MOVIMIENTO_CONTABLE mov

                        JOIN CN_DOCUMENTO doc ON
                         mov.ID_DOCUMENTO = doc.ID_DOCUMENTO
                         AND mov.ID_CAD = doc.ID_CAD
                         and mov.ID_CIA = doc.ID_CIA
                         AND mov.ID_CEN_OP = doc.ID_CEN_OP
                         AND mov.ID_VIGENCIA = doc.ID_VIGENCIA

                        JOIN CN_CONTROL_CAD cad ON
                         mov.ID_CAD = cad.ID_CAD
                         and mov.ID_CIA = cad.ID_CIA
                         AND mov.ID_CEN_OP = cad.ID_CEN_OP
                         AND mov.ID_VIGENCIA = cad.ID_VIGENCIA

                        JOIN CN_VIGENCIA vig ON
                         mov.ID_VIGENCIA = vig.ID_VIGENCIA

                        JOIN CN_PERIODO_CONTABLE per ON
                         cad.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE

                        JOIN CN_CATALOGO cat ON
                         mov.ID_CIA = cat.ID_CIA
                         AND mov.ID_CATALOGO = cat.ID_CATALOGO
                         AND mov.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
                         AND mov.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA

                        JOIN CN_CUENTA_MAYOR cue ON
                         mov.ID_CIA = cue.ID_CIA
                         AND mov.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
                         AND mov.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

                        JOIN CN_GRUPO_CUENTA gru ON
                         mov.ID_CIA = gru.ID_CIA
                         AND mov.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA

                        JOIN CN_CLASE_CUENTA cla ON
                         mov.ID_CIA = cla.ID_CIA
                         AND mov.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA

                        WHERE vig.ID_VIGENCIA = 2010 AND per.ID_PERIODO_CONTABLE = 13 AND cue.NATURALEZA = \'C\'

                        GROUP BY
                         mov.ID_CIA,
                         mov.ID_CEN_OP,
                         mov.ID_VIGENCIA,
                         cad.ID_PERIODO_CONTABLE,
                         mov.ID_CLASE_CUENTA,
                         mov.ID_GRUPO_CUENTA,
                         mov.ID_CUENTA_MAYOR,
                         mov.ID_CATALOGO,
                         mov.ID_MAE_TER,
                         mov.ID_AUXILIAR,
                         mov.ID_SUB_AUX,
                         mov.ID_CENTRO_COSTO,
                         mov.ID_SUB_CENTRO_COSTO,
                         cla.DIGITO,
                         gru.DIGITO,
                         cue.DIGITOS,
                         cat.DIGITOS

                        ORDER BY
                         SUBCUENTA
                        )
                        )
                        ORDER BY
                         SUBCUENTA';

                //Ejecuta sql
                CN_TABLE::executeSQL($sql);


                $this->logMessage("se ingreso saldos");

                /*
                 * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
                 */
                $sql = 'select distinct
                sal.ID_CIA , sal.ID_VIGENCIA, sal.ID_PERIODO_CONTABLE , per.NOM_PERIODO
                from CN_SALDO sal
                join CN_PERIODO_CONTABLE per on
                sal.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE
                order by sal.ID_VIGENCIA DESC, sal.ID_PERIODO_CONTABLE DESC';

                //Ejecuta sql
                $records = CN_TABLE::executeSQL($sql);
                $vigencia_periodo_add[0] = $records[0];
                $this->list_data = $vigencia_periodo_add;
            } else {
                $this->logMessage("No hay movimientos para el siguiente saldo");
                $this->list_data = array();
            }
        } else {

            $firstRow = $saldos[0];

            //valida ultimo periodo
            if ($firstRow['id_periodo_contable'] == 13) {

                //Obtiene valores de la primera fila
                $vig = $firstRow['id_vigencia'] + 1;
                $per_cont = 1;
            } else {

                //Obtiene valores de la primera fila
                $vig = $firstRow['id_vigencia'];
                $per_cont = $firstRow['id_periodo_contable'] + 1;
            }

            $cia = $request['id_cia'];
//            $cia = 1;
            $vig_ant = $firstRow['id_vigencia'];
            $per_cont_ant = $firstRow['id_periodo_contable'];


            /*
             * Valores de vigencia/periodo en los movimientos
             */
            $sql = <<<EOD
        select distinct
        ID_PERIODO_CONTABLE,
        ID_VIGENCIA
        from CN_MOVIMIENTO_VIGPER
        where
        ID_PERIODO_CONTABLE = ' $per_cont ' and
        ID_VIGENCIA = '  $vig  '
EOD;
//  order by VIG_PER
            //Ejecuta sql
//            $movimientos = CN_TABLE::executeSQL($sql);
//            if (!empty($movimientos)) { cambiar por control periodo

            /*
             * Valores de vigencia/periodo en los movimientos
             */
            $sql = <<<EOD
SELECT * FROM cn_control_periodo
where 
id_cia = $cia
and id_vigencia = $vig
and id_periodo_contable = $per_cont
/* and id_cen_op = 16 */ 
EOD;
//  order by VIG_PER
            //Ejecuta sql
            $control_periodos = CN_TABLE::executeSQL($sql);

            //que existe el control periodo creado
            if (!empty($control_periodos)) {

                /*
                 * Elimina y actualiza los saldos para la vigencia/periodo
                 */
                $sql = 'DELETE FROM CN_SALDO
                WHERE ID_VIGENCIA =  ' . $vig . '
                AND ID_CIA = ' . $cia . '
                AND ID_PERIODO_CONTABLE = ' . $per_cont;

                //Ejecuta sql
                CN_TABLE::executeSQL($sql);

                $sql = 'INSERT INTO CN_SALDO
                    SELECT *
                    FROM
                    (
                    SELECT *
                    FROM
                    (
                    SELECT
                     NVL(sal_sig.ID_CIA, sal_old.ID_CIA) AS ID_CIA,
                     NVL(sal_sig.ID_CEN_OP, sal_old.ID_CEN_OP) AS ID_CEN_OP,
                     ' . $vig . ' AS ID_VIGENCIA,
                     ' . $per_cont . ' AS ID_PERIODO_CONTABLE,
                     NVL(sal_sig.ID_CLASE_CUENTA, sal_old.ID_CLASE_CUENTA) AS ID_CLASE_CUENTA,
                     NVL(sal_sig.ID_GRUPO_CUENTA, sal_old.ID_GRUPO_CUENTA) AS ID_GRUPO_CUENTA,
                     NVL(sal_sig.ID_CUENTA_MAYOR, sal_old.ID_CUENTA_MAYOR) AS ID_CUENTA_MAYOR,
                     NVL(sal_sig.ID_CATALOGO, sal_old.ID_CATALOGO) AS ID_CATALOGO,
                     NVL(sal_sig.ID_MAE_TER, sal_old.ID_MAE_TER) AS ID_MAE_TER,
                     NVL(sal_sig.ID_AUXILIAR, sal_old.ID_AUXILIAR) AS ID_AUXILIAR,
                     NVL(sal_sig.ID_SUB_AUX, sal_old.ID_SUB_AUX) AS ID_SUB_AUX,
                     NVL(sal_sig.ID_CENTRO_COSTO, sal_old.ID_CENTRO_COSTO) AS ID_CENTRO_COSTO,
                     NVL(sal_sig.ID_SUB_CENTRO_COSTO, sal_old.ID_SUB_CENTRO_COSTO) AS ID_SUB_CENTRO_COSTO,
                     NVL(sal_sig.SUBCUENTA, sal_old.SUBCUENTA) AS SUBCUENTA,
                     sal_old.SALDO_ACTUAL AS SALDO_ANTERIOR,
                     NVL(sal_sig.DEBITO,0) AS DEBITO,
                     NVL(sal_sig.CREDITO,0) AS CREDITO,
                     sal_old.SALDO_ACTUAL + NVL(sal_sig.SALDO_PERIODO, 0) AS SALDO_ACTUAL
                    FROM
                    (
                    SELECT *
                    FROM CN_SALDO_DEB_SIN_ANT
                    WHERE ID_VIGENCIA = ' . $vig . ' AND ID_PERIODO_CONTABLE = ' . $per_cont . '

                    UNION

                    SELECT *
                    FROM CN_SALDO_CRE_SIN_ANT
                    WHERE ID_VIGENCIA = ' . $vig . ' AND ID_PERIODO_CONTABLE = ' . $per_cont . '
                    ) sal_sig
                    RIGHT JOIN
                    (
                    SELECT *
                    FROM CN_SALDO
                    WHERE ID_VIGENCIA = ' . $vig_ant . ' AND ID_PERIODO_CONTABLE = ' . $per_cont_ant . '
                    ) sal_old ON
                     sal_sig.ID_CIA = sal_old.ID_CIA AND
                     sal_sig.ID_CEN_OP = sal_old.ID_CEN_OP AND
                     sal_sig.SUBCUENTA = sal_old.SUBCUENTA AND
                     NVL(sal_sig.ID_MAE_TER,0) = NVL(sal_old.ID_MAE_TER,0) AND
                     NVL(sal_sig.ID_AUXILIAR,0) = NVL(sal_old.ID_AUXILIAR,0) AND
                     NVL(sal_sig.ID_SUB_AUX,0) = NVL(sal_old.ID_SUB_AUX,0) AND
                     NVL(sal_sig.ID_CENTRO_COSTO,0) = NVL(sal_old.ID_CENTRO_COSTO,0) AND
                     NVL(sal_sig.ID_SUB_CENTRO_COSTO,0) = NVL(sal_old.ID_SUB_CENTRO_COSTO,0)
                    )

                    UNION

                    SELECT *
                    FROM
                    (
                    SELECT
                     NVL(sal_old.ID_CIA, sal_sig.ID_CIA) AS ID_CIA,
                     NVL(sal_old.ID_CEN_OP, sal_sig.ID_CEN_OP) AS ID_CEN_OP,
                     ' . $vig . ' AS ID_VIGENCIA,
                     ' . $per_cont . ' AS ID_PERIODO_CONTABLE,
                     NVL(sal_old.ID_CLASE_CUENTA, sal_sig.ID_CLASE_CUENTA) AS ID_CLASE_CUENTA,
                     NVL(sal_old.ID_GRUPO_CUENTA, sal_sig.ID_GRUPO_CUENTA) AS ID_GRUPO_CUENTA,
                     NVL(sal_old.ID_CUENTA_MAYOR, sal_sig.ID_CUENTA_MAYOR) AS ID_CUENTA_MAYOR,
                     NVL(sal_old.ID_CATALOGO, sal_sig.ID_CATALOGO) AS ID_CATALOGO,
                     NVL(sal_old.ID_MAE_TER, sal_sig.ID_MAE_TER) AS ID_MAE_TER,
                     NVL(sal_old.ID_AUXILIAR, sal_sig.ID_AUXILIAR) AS ID_AUXILIAR,
                     NVL(sal_old.ID_SUB_AUX, sal_sig.ID_SUB_AUX) AS ID_SUB_AUX,
                     NVL(sal_old.ID_CENTRO_COSTO, sal_sig.ID_CENTRO_COSTO) AS ID_CENTRO_COSTO,
                     NVL(sal_old.ID_SUB_CENTRO_COSTO, sal_sig.ID_SUB_CENTRO_COSTO) AS ID_SUB_CENTRO_COSTO,
                     NVL(sal_old.SUBCUENTA, sal_sig.SUBCUENTA) AS SUBCUENTA,
                     NVL(sal_old.SALDO_ACTUAL,0) AS SALDO_ANTERIOR,
                     sal_sig.DEBITO AS DEBITO,
                     sal_sig.CREDITO AS CREDITO,
                     sal_sig.SALDO_PERIODO + NVL(sal_old.SALDO_ACTUAL, 0) AS SALDO_ACTUAL
                    FROM
                    (
                    SELECT *
                    FROM CN_SALDO_DEB_SIN_ANT
                    WHERE ID_VIGENCIA = ' . $vig . ' AND ID_PERIODO_CONTABLE = ' . $per_cont . '

                    UNION

                    SELECT *
                    FROM CN_SALDO_CRE_SIN_ANT
                    WHERE ID_VIGENCIA = ' . $vig . ' AND ID_PERIODO_CONTABLE = ' . $per_cont . '
                    ) sal_sig
                    LEFT JOIN
                    (
                    SELECT *
                    FROM CN_SALDO
                    WHERE ID_VIGENCIA = ' . $vig_ant . ' AND ID_PERIODO_CONTABLE = ' . $per_cont_ant . '
                    ) sal_old ON
                     sal_old.ID_CIA = sal_sig.ID_CIA AND
                     sal_old.ID_CEN_OP = sal_sig.ID_CEN_OP AND
                     sal_old.SUBCUENTA = sal_sig.SUBCUENTA AND
                     NVL(sal_old.ID_MAE_TER,0) = NVL(sal_sig.ID_MAE_TER,0) AND
                     NVL(sal_old.ID_AUXILIAR,0) = NVL(sal_sig.ID_AUXILIAR,0) AND
                     NVL(sal_old.ID_SUB_AUX,0) = NVL(sal_sig.ID_SUB_AUX,0) AND
                     NVL(sal_old.ID_CENTRO_COSTO,0) = NVL(sal_sig.ID_CENTRO_COSTO,0) AND
                     NVL(sal_old.ID_SUB_CENTRO_COSTO,0) = NVL(sal_sig.ID_SUB_CENTRO_COSTO,0)
                    )
                    )';

                //Ejecuta sql
                CN_TABLE::executeSQL($sql);

                $this->logMessage("se ingreso saldos");

                /*
                 * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
                 */
                $sql = 'select distinct
                sal.ID_CIA , sal.ID_VIGENCIA, sal.ID_PERIODO_CONTABLE , per.NOM_PERIODO
                from CN_SALDO sal
                join CN_PERIODO_CONTABLE per on
                sal.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE
                order by sal.ID_VIGENCIA DESC, sal.ID_PERIODO_CONTABLE DESC';

                //Ejecuta sql
                $records = CN_TABLE::executeSQL($sql);
                $vigencia_periodo_add[0] = $records[0];
                $this->list_data = $vigencia_periodo_add;
            } else {
//                $this->logMessage("no hay movimientos para el siguiente saldo");
                $mensaje = "No hay registro de control periodo, para vigencia y periodo, recarge la pagina.";
                $this->list_data = array();
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->logMessage($mensaje);
            }


            /*
             * Validar si se adiciono saldo nuevo - falta completar
             */
            if (true) {
                /*
                 * variables por defecto para el registro de log
                 */
                $id_tabla = 'null';
                $id_vigencia = 'null';
                $id_cen_op = 'null';

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

                //obtener id maestro tabla
                $id_mae_bd = CN_TABLE::consultarIdTablaBD('CN_SALDO');

                //2 - indica operacion de adicion
                $id_ope_bd = 2;

                //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
                $observacion = "'Se adiciono saldos para el siguiente periodo/vigencia 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);
            }
        }


        /*
         * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
         */
        $sql = 'select distinct
                sal.ID_CIA , sal.ID_VIGENCIA, sal.ID_PERIODO_CONTABLE , per.NOM_PERIODO
                from CN_SALDO sal
                join CN_PERIODO_CONTABLE per on
                sal.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE
                order by sal.ID_VIGENCIA, sal.ID_PERIODO_CONTABLE';

        //Ejecuta sql
//        $this->list_data = CN_TABLE::executeSQL($sql);
//        $this->list_data = array();
    }

    /**
     * Remueve el saldo seleccionado y siguientes por fecha
     *
     * @param sfWebRequest $request
     */
    public function executeRemove(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //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 por defecto para el registro de log
         */
        $id_tabla = 'null';
        $id_vigencia = 'null';
        $id_cen_op = 'null';

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

        //obtener id maestro tabla
        $id_mae_bd = CN_TABLE::consultarIdTablaBD('CN_SALDO');

        //2 - indica operacion de adicion
        $id_ope_bd = 2;

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


        /*
         * Obtiene las vigencias y periodos que se encuentran en los saldos
         */
        $sql = 'select distinct
                sal.ID_CIA , sal.ID_VIGENCIA, sal.ID_PERIODO_CONTABLE , per.NOM_PERIODO
                from CN_SALDO sal
                join CN_PERIODO_CONTABLE per on
                sal.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE
                order by sal.ID_VIGENCIA DESC, sal.ID_PERIODO_CONTABLE DESC';

        //Ejecuta sql
        $saldos = CN_TABLE::executeSQL($sql);

        //Valida si esta vacio
        if (!empty($saldos)) {

            $firstRow = $saldos[0];

            //Obtiene valores de la primera fila
            $vig = $firstRow['id_vigencia'];
            $per_cont = $firstRow['id_periodo_contable'];
            $cia = $firstRow['id_cia'];

            $sql = "select nvl(sum(val_activo),0) as val_activo from(
                select 
                case when conper.activo = 0 then 1 else 0 end as val_activo,
                conper.* 
                from cn_control_periodo conper
                where 
                conper.id_cia = $id_cia
                and conper.id_vigencia = $vig
                and conper.id_periodo_contable = $per_cont )";

            //Ejecuta sql
            $saldos_activo = CN_TABLE::executeSQL($sql);

            $val_activo = $saldos_activo[0]['val_activo'];


            /**
             * Revisar que el proceso de regeneraciòn de saldos no se pueda ejecutar para periodos ya cerrados - 20221028
             */
            if ($val_activo == 0) {

                /*
                 * Elimina y actualiza los saldos para la vigencia/periodo
                 */
                $sql = 'DELETE FROM CN_SALDO
                    WHERE ID_VIGENCIA =  ' . $vig . '
                    AND ID_CIA = ' . $cia . '
                    AND ID_PERIODO_CONTABLE = ' . $per_cont;

                //Ejecuta sql
                CN_TABLE::executeSQL($sql);

                //construir observacion
                $observacion = "'Se removio saldo para periodo/vigencia - $per_cont/$vig 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);


                //Retorna la fila inicial eliminada
                $this->list_data = array($firstRow);
            } else {

                $this->list_data = array();

                $this->status = 1;
                $mensaje = "Ya existe un periodo cerrado para el mes/vigencia - $per_cont/$vig, en uno o más centros de operación.";
                $this->mensajeError = $mensaje;
                $this->logMessage($mensaje);
            }
        } else {
            $this->list_data = array();

            $this->status = 1;
            $mensaje = "No hay registros para eliminar, verificar.";
            $this->mensajeError = $mensaje;
            $this->logMessage($mensaje);
        }
    }

    /**
     * Actualiza los saldos
     * se actualizan de la vigencia/periodo hasta las siguientes por orden de fecha
     *
     * @param sfWebRequest $request
     */
    public function executeUpdate(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //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 por defecto para el registro de log
         */
        $id_tabla = 'null';
        $id_vigencia = 'null';
        $id_cen_op = 'null';

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

        //obtener id maestro tabla
        $id_mae_bd = CN_TABLE::consultarIdTablaBD('CN_SALDO');

        //2 - indica operacion de adicion
        $id_ope_bd = 2;

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

        //obtener datos de actualizacion
        $vig = $request['id_vigencia'];
        $per_cont = $request['id_periodo_contable'];
        //construir observacion
        $observacion = "'Se actualizaron saldos desde el periodo/vigencia - $per_cont/$vig, desde la funcionalidad: " . $comando . "'";



        $sql = "select nvl(sum(val_activo),0) as val_activo from(
                select 
                case when conper.activo = 0 then 1 else 0 end as val_activo,
                conper.* 
                from cn_control_periodo conper
                where 
                conper.id_cia = $id_cia
                and conper.id_vigencia = $vig
                and conper.id_periodo_contable = $per_cont )";

        //Ejecuta sql
        $saldos_activo = CN_TABLE::executeSQL($sql);

        $val_activo = $saldos_activo[0]['val_activo'];


        /**
         * Revisar que el proceso de regeneraciòn de saldos no se pueda ejecutar para periodos ya cerrados - 20140924
         */
        if ($val_activo == 0) {

            $this->logMessage("Revisar que el proceso de regeneraciòn de saldos no se pueda ejecutar para periodos ya cerrados");

            $sql = 'select distinct
                sal.ID_CIA , sal.ID_VIGENCIA, sal.ID_PERIODO_CONTABLE , per.NOM_PERIODO
                from CN_SALDO sal
                join CN_PERIODO_CONTABLE per on
                sal.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE
                order by sal.ID_VIGENCIA ASC, sal.ID_PERIODO_CONTABLE ASC';

            //Ejecuta sql
            $saldos = CN_TABLE::executeSQL($sql);

            //Valida si estan vacio los saldos
            if (!empty($saldos)) {

                $firstRow = $saldos[0];

                //Obtiene valores de la primera fila
                $vig = $firstRow['id_vigencia'];
                $per_cont = $firstRow['id_periodo_contable'];
                $cia = $firstRow['id_cia'];

                for ($i = 0; $i < count($saldos); $i++) {
                    $saldo_actual = $saldos[$i];

                    if ($saldo_actual['id_vigencia'] == $request['id_vigencia'] && $saldo_actual['id_periodo_contable'] == $request['id_periodo_contable'] && $saldo_actual['id_cia'] == $request['id_cia']) {

                        /*
                         * si es el primer valor de la tabla realiza calculo a partir de saldos anteriores de 0
                         */
                        if ($vig == $request['id_vigencia'] && $per_cont == $request['id_periodo_contable'] && $cia == $request['id_cia']) {

                            //Elimina datos de la tabla
                            $sql = 'TRUNCATE TABLE CN_SALDO';

                            //Ejecuta sql
                            CN_TABLE::executeSQL($sql);

                            /*
                             * Sql para insertar saldos
                             */
                            $sql = 'INSERT INTO CN_SALDO
                        SELECT *
                        FROM
                        (
                        SELECT *
                        FROM
                        (
                        SELECT
                         mov.ID_CIA,
                         mov.ID_CEN_OP,
                         mov.ID_VIGENCIA,
                         cad.ID_PERIODO_CONTABLE,
                         mov.ID_CLASE_CUENTA,
                         mov.ID_GRUPO_CUENTA,
                         mov.ID_CUENTA_MAYOR,
                         mov.ID_CATALOGO,
                         mov.ID_MAE_TER,
                         mov.ID_AUXILIAR,
                         mov.ID_SUB_AUX,
                         mov.ID_CENTRO_COSTO,
                         mov.ID_SUB_CENTRO_COSTO,
                         cla.DIGITO|| gru.DIGITO|| cue.DIGITOS||cat.DIGITOS AS SUBCUENTA,
                         0 AS SALDO_ANTERIOR,
                         SUM(mov.DEBITO) AS DEBITO,
                         SUM(mov.CREDITO) AS CREDITO,
                         SUM(mov.DEBITO) - SUM(mov.CREDITO)
                         AS SALDO_ACTUAL

                        FROM CN_MOVIMIENTO_CONTABLE mov

                        JOIN CN_DOCUMENTO doc ON
                         mov.ID_DOCUMENTO = doc.ID_DOCUMENTO
                         AND mov.ID_CAD = doc.ID_CAD
                         and mov.ID_CIA = doc.ID_CIA
                         AND mov.ID_CEN_OP = doc.ID_CEN_OP
                         AND mov.ID_VIGENCIA = doc.ID_VIGENCIA

                        JOIN CN_CONTROL_CAD cad ON
                         mov.ID_CAD = cad.ID_CAD
                         and mov.ID_CIA = cad.ID_CIA
                         AND mov.ID_CEN_OP = cad.ID_CEN_OP
                         AND mov.ID_VIGENCIA = cad.ID_VIGENCIA

                        JOIN CN_VIGENCIA vig ON
                         mov.ID_VIGENCIA = vig.ID_VIGENCIA

                        JOIN CN_PERIODO_CONTABLE per ON
                         cad.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE

                        JOIN CN_CATALOGO cat ON
                         mov.ID_CIA = cat.ID_CIA
                         AND mov.ID_CATALOGO = cat.ID_CATALOGO
                         AND mov.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
                         AND mov.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA

                        JOIN CN_CUENTA_MAYOR cue ON
                         mov.ID_CIA = cue.ID_CIA
                         AND mov.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
                         AND mov.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

                        JOIN CN_GRUPO_CUENTA gru ON
                         mov.ID_CIA = gru.ID_CIA
                         AND mov.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA

                        JOIN CN_CLASE_CUENTA cla ON
                         mov.ID_CIA = cla.ID_CIA
                         AND mov.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA

                        WHERE vig.ID_VIGENCIA = ' . $vig . ' AND per.ID_PERIODO_CONTABLE = ' . $per_cont . ' AND cue.NATURALEZA = \'D\'

                        GROUP BY
                         mov.ID_CIA,
                         mov.ID_CEN_OP,
                         mov.ID_VIGENCIA,
                         cad.ID_PERIODO_CONTABLE,
                         mov.ID_CLASE_CUENTA,
                         mov.ID_GRUPO_CUENTA,
                         mov.ID_CUENTA_MAYOR,
                         mov.ID_CATALOGO,
                         mov.ID_MAE_TER,
                         mov.ID_AUXILIAR,
                         mov.ID_SUB_AUX,
                         mov.ID_CENTRO_COSTO,
                         mov.ID_SUB_CENTRO_COSTO,
                         cla.DIGITO,
                         gru.DIGITO,
                         cue.DIGITOS,
                         cat.DIGITOS

                        ORDER BY
                         SUBCUENTA
                        )

                        UNION

                        SELECT *
                        FROM
                        (
                        SELECT
                         mov.ID_CIA,
                         mov.ID_CEN_OP,
                         mov.ID_VIGENCIA,
                         cad.ID_PERIODO_CONTABLE,
                         mov.ID_CLASE_CUENTA,
                         mov.ID_GRUPO_CUENTA,
                         mov.ID_CUENTA_MAYOR,
                         mov.ID_CATALOGO,
                         mov.ID_MAE_TER,
                         mov.ID_AUXILIAR,
                         mov.ID_SUB_AUX,
                         mov.ID_CENTRO_COSTO,
                         mov.ID_SUB_CENTRO_COSTO,
                         cla.DIGITO||
                         gru.DIGITO||
                         cue.DIGITOS||
                         cat.DIGITOS
                         AS SUBCUENTA,
                         0 AS SALDO_ANTERIOR,
                         SUM(mov.DEBITO) AS DEBITO,
                         SUM(mov.CREDITO) AS CREDITO,
                         SUM(mov.CREDITO) - SUM(mov.DEBITO)
                         AS SALDO_ACTUAL

                        FROM CN_MOVIMIENTO_CONTABLE mov

                        JOIN CN_DOCUMENTO doc ON
                         mov.ID_DOCUMENTO = doc.ID_DOCUMENTO
                         AND mov.ID_CAD = doc.ID_CAD
                         and mov.ID_CIA = doc.ID_CIA
                         AND mov.ID_CEN_OP = doc.ID_CEN_OP
                         AND mov.ID_VIGENCIA = doc.ID_VIGENCIA

                        JOIN CN_CONTROL_CAD cad ON
                         mov.ID_CAD = cad.ID_CAD
                         and mov.ID_CIA = cad.ID_CIA
                         AND mov.ID_CEN_OP = cad.ID_CEN_OP
                         AND mov.ID_VIGENCIA = cad.ID_VIGENCIA

                        JOIN CN_VIGENCIA vig ON
                         mov.ID_VIGENCIA = vig.ID_VIGENCIA

                        JOIN CN_PERIODO_CONTABLE per ON
                         cad.ID_PERIODO_CONTABLE = per.ID_PERIODO_CONTABLE

                        JOIN CN_CATALOGO cat ON
                         mov.ID_CIA = cat.ID_CIA
                         AND mov.ID_CATALOGO = cat.ID_CATALOGO
                         AND mov.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
                         AND mov.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA

                        JOIN CN_CUENTA_MAYOR cue ON
                         mov.ID_CIA = cue.ID_CIA
                         AND mov.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
                         AND mov.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

                        JOIN CN_GRUPO_CUENTA gru ON
                         mov.ID_CIA = gru.ID_CIA
                         AND mov.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
                         AND mov.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA

                        JOIN CN_CLASE_CUENTA cla ON
                         mov.ID_CIA = cla.ID_CIA
                         AND mov.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA

                        WHERE vig.ID_VIGENCIA = ' . $vig . ' AND per.ID_PERIODO_CONTABLE = ' . $per_cont . ' AND cue.NATURALEZA = \'C\'

                        GROUP BY
                         mov.ID_CIA,
                         mov.ID_CEN_OP,
                         mov.ID_VIGENCIA,
                         cad.ID_PERIODO_CONTABLE,
                         mov.ID_CLASE_CUENTA,
                         mov.ID_GRUPO_CUENTA,
                         mov.ID_CUENTA_MAYOR,
                         mov.ID_CATALOGO,
                         mov.ID_MAE_TER,
                         mov.ID_AUXILIAR,
                         mov.ID_SUB_AUX,
                         mov.ID_CENTRO_COSTO,
                         mov.ID_SUB_CENTRO_COSTO,
                         cla.DIGITO,
                         gru.DIGITO,
                         cue.DIGITOS,
                         cat.DIGITOS

                        ORDER BY
                         SUBCUENTA
                        )
                        )
                        ORDER BY
                         SUBCUENTA';

                            //Ejecuta sql
                            CN_TABLE::executeSQL($sql);

                            $i++;
                        }

                        for ($j = $i; $j < count($saldos); $j++) {
                            //Remueve los saldos siguientes por orden de fecha
                            $this->removeSaldo($saldos[$j], $saldos[($j - 1)]);
                            $this->logMessage("[SALDO] Se recalculo saldos.");
//                        $this->logMessage("[SALDO] Se recalculo saldo de vigencia:" + $saldos['id_vigencia'] + " y periodo: " + $saldos['id_periodo_contable']);
                        }
                        break;
                    }
                }


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


                $this->list_data = array();

                $this->status = 0;
                $mensaje = "Actualizo saldos.";
//            $this->mensajeError = $mensaje;
                $this->logMessage($mensaje);
            } else {

                $this->list_data = array();

                $this->status = 1;
                $mensaje = "No hay saldos, recarge la pagina.";
                $this->mensajeError = $mensaje;
                $this->logMessage($mensaje);
            }
        } else {

            $this->list_data = array();

            $this->status = 1;
            $mensaje = "Ya existe un periodo cerrado para el mes/vigencia - $per_cont/$vig, en uno o más centros de operación.";
            $this->mensajeError = $mensaje;
            $this->logMessage($mensaje);
        }
    }

    /**
     * Remueve los saldo e inserta los nuevos caldulos
     *
     * @param sfWebRequest $request
     */
    public static function removeSaldo($saldos, $saldosAnt) {
        //realiza la conexion a la base de datos
//        $conn = Doctrine_Manager::connection();
//        
//        $sp = new StoredProcedure('DBMS_SNAPSHOT.REFRESH', $conn); 
//$sp->addParameter('name', 'halfer', SQLT_CHR); 
//$sp->addOutputParameter($outAll = 'OutAll', SQLT_INT); 
//$sp->addOutputCursor($cName = 'OutResults'); 
//try 
//{ 
//    $sp->execute(); 
//} 
//catch (StoredProcedureException $e) 
//{ 
//    // ... your handling code here 
//} 
//die();



        /*
         * $conn = Doctrine_Manager::connection();
          $q = new Doctrine_RawSql($conn);
         */


//        //realiza la conexion a la base de datos
//        $conn = Doctrine_Manager::connection();
//        //sentencia sql
//        $sql = <<<EOD
//call DBMS_SNAPSHOT.REFRESH( 'CN_RES_AUX_SUBC_M','c');
//EOD;
////        $sql = <<<EOD
////DBMS_SNAPSHOT.REFRESH( 'CN_RES_AUX_SUBC_M','c')
////EOD;
//
//        
////ejecuta el sql
////        CN_TABLE::executeSQL($sql);
////$conn->execute($sql);
////        $conn->exec($sql);
//        $q = new Doctrine_RawSql($conn);
//        $q->execute($sql);
//
//        die();
//        //sentencia sql
//        $sql = <<<EOD
//execute DBMS_SNAPSHOT.REFRESH( 'CN_CONTROL_CAD_TOT_M','c')
//EOD;
//        //ejecuta el sql
//        CN_TABLE::executeSQL($sql);
//
//        //sentencia sql
//        $sql = <<<EOD
//execute DBMS_SNAPSHOT.REFRESH( 'CN_LIBRO_DIARIO_OF','c')
//EOD;
//        //ejecuta el sql
//        CN_TABLE::executeSQL($sql);
//
//        die();


        /*
          //sentencia sql
          //        $sql = <<<EOD
          //
          //DECLARE
          //  TABLA_M VARCHAR2(200);
          //BEGIN
          //  TABLA_M := 'CN_LIBRO_DIARIO_OF_M';
          //
          //  EJECUTAR_DDL_EN_TRIGGER(
          //    TABLA_M => TABLA_M
          //  );
          //END;
          //
          //EOD;
          //        //ejecuta el sql
          //        CN_TABLE::executeSQL($sql);
          //
          //
          //        //se instancia la clase del manejo del log
          //        $logger = sfContext::getInstance()->getLogger();
          //        $logger->info("mensaje");
          //        die();


         */

        //Obtener valores
        $vig = $saldos['id_vigencia'];
        $per_cont = $saldos['id_periodo_contable'];
        $cia = $saldos['id_cia'];

        $vig_ant = $saldosAnt['id_vigencia'];
        $per_cont_ant = $saldosAnt['id_periodo_contable'];
        $cia_ant = $saldosAnt['id_cia'];

        /*
         * Elimina saldos por vigencia/periodo
         */
        $sql = 'DELETE FROM CN_SALDO
                WHERE ID_VIGENCIA =  ' . $vig . '
                AND ID_CIA = ' . $cia . '
                AND ID_PERIODO_CONTABLE = ' . $per_cont;

        //Ejecuta sql
        CN_TABLE::executeSQL($sql);

        $sql = '
INSERT INTO CN_SALDO

SELECT 
*
FROM
(
    
    SELECT 
    *
    FROM(
        SELECT
        NVL(sal_sig.ID_CIA, sal_old.ID_CIA) AS ID_CIA,
        NVL(sal_sig.ID_CEN_OP, sal_old.ID_CEN_OP) AS ID_CEN_OP,
        ' . $vig . ' AS ID_VIGENCIA,
        ' . $per_cont . ' AS ID_PERIODO_CONTABLE,
        NVL(sal_sig.ID_CLASE_CUENTA, sal_old.ID_CLASE_CUENTA) AS ID_CLASE_CUENTA,
        NVL(sal_sig.ID_GRUPO_CUENTA, sal_old.ID_GRUPO_CUENTA) AS ID_GRUPO_CUENTA,
        NVL(sal_sig.ID_CUENTA_MAYOR, sal_old.ID_CUENTA_MAYOR) AS ID_CUENTA_MAYOR,
        NVL(sal_sig.ID_CATALOGO, sal_old.ID_CATALOGO) AS ID_CATALOGO,
        NVL(sal_sig.ID_MAE_TER, sal_old.ID_MAE_TER) AS ID_MAE_TER,
        NVL(sal_sig.ID_AUXILIAR, sal_old.ID_AUXILIAR) AS ID_AUXILIAR,
        NVL(sal_sig.ID_SUB_AUX, sal_old.ID_SUB_AUX) AS ID_SUB_AUX,
        NVL(sal_sig.ID_CENTRO_COSTO, sal_old.ID_CENTRO_COSTO) AS ID_CENTRO_COSTO,
        NVL(sal_sig.ID_SUB_CENTRO_COSTO, sal_old.ID_SUB_CENTRO_COSTO) AS ID_SUB_CENTRO_COSTO,
        NVL(sal_sig.SUBCUENTA, sal_old.SUBCUENTA) AS SUBCUENTA,
        sal_old.SALDO_ACTUAL AS SALDO_ANTERIOR,
        NVL(sal_sig.DEBITO,0) AS DEBITO,
        NVL(sal_sig.CREDITO,0) AS CREDITO,
        sal_old.SALDO_ACTUAL + NVL(sal_sig.SALDO_PERIODO, 0) AS SALDO_ACTUAL
        FROM
        (
            SELECT *
            FROM CN_SALDO_DEB_SIN_ANT
            WHERE ID_VIGENCIA = ' . $vig . ' AND ID_PERIODO_CONTABLE = ' . $per_cont . '
            
            UNION
            
            SELECT *
            FROM CN_SALDO_CRE_SIN_ANT
            WHERE ID_VIGENCIA = ' . $vig . ' AND ID_PERIODO_CONTABLE = ' . $per_cont . '
        ) sal_sig
        RIGHT JOIN
        (
            SELECT *
            FROM CN_SALDO
            WHERE ID_VIGENCIA = ' . $vig_ant . ' AND ID_PERIODO_CONTABLE = ' . $per_cont_ant . '
        ) sal_old ON
        sal_sig.ID_CIA = sal_old.ID_CIA AND
        sal_sig.ID_CEN_OP = sal_old.ID_CEN_OP AND
        sal_sig.SUBCUENTA = sal_old.SUBCUENTA AND
        NVL(sal_sig.ID_MAE_TER,0) = NVL(sal_old.ID_MAE_TER,0) AND
        NVL(sal_sig.ID_AUXILIAR,0) = NVL(sal_old.ID_AUXILIAR,0) AND
        NVL(sal_sig.ID_SUB_AUX,0) = NVL(sal_old.ID_SUB_AUX,0) AND
        NVL(sal_sig.ID_CENTRO_COSTO,0) = NVL(sal_old.ID_CENTRO_COSTO,0) AND
        NVL(sal_sig.ID_SUB_CENTRO_COSTO,0) = NVL(sal_old.ID_SUB_CENTRO_COSTO,0)
    )
    
    UNION
    
    SELECT 
    *
    FROM(
        SELECT
        NVL(sal_old.ID_CIA, sal_sig.ID_CIA) AS ID_CIA,
        NVL(sal_old.ID_CEN_OP, sal_sig.ID_CEN_OP) AS ID_CEN_OP,
        ' . $vig . ' AS ID_VIGENCIA,
        ' . $per_cont . ' AS ID_PERIODO_CONTABLE,
        NVL(sal_old.ID_CLASE_CUENTA, sal_sig.ID_CLASE_CUENTA) AS ID_CLASE_CUENTA,
        NVL(sal_old.ID_GRUPO_CUENTA, sal_sig.ID_GRUPO_CUENTA) AS ID_GRUPO_CUENTA,
        NVL(sal_old.ID_CUENTA_MAYOR, sal_sig.ID_CUENTA_MAYOR) AS ID_CUENTA_MAYOR,
        NVL(sal_old.ID_CATALOGO, sal_sig.ID_CATALOGO) AS ID_CATALOGO,
        NVL(sal_old.ID_MAE_TER, sal_sig.ID_MAE_TER) AS ID_MAE_TER,
        NVL(sal_old.ID_AUXILIAR, sal_sig.ID_AUXILIAR) AS ID_AUXILIAR,
        NVL(sal_old.ID_SUB_AUX, sal_sig.ID_SUB_AUX) AS ID_SUB_AUX,
        NVL(sal_old.ID_CENTRO_COSTO, sal_sig.ID_CENTRO_COSTO) AS ID_CENTRO_COSTO,
        NVL(sal_old.ID_SUB_CENTRO_COSTO, sal_sig.ID_SUB_CENTRO_COSTO) AS ID_SUB_CENTRO_COSTO,
        NVL(sal_old.SUBCUENTA, sal_sig.SUBCUENTA) AS SUBCUENTA,
        NVL(sal_old.SALDO_ACTUAL,0) AS SALDO_ANTERIOR,
        sal_sig.DEBITO AS DEBITO,
        sal_sig.CREDITO AS CREDITO,
        sal_sig.SALDO_PERIODO + NVL(sal_old.SALDO_ACTUAL, 0) AS SALDO_ACTUAL
        FROM
        (
            SELECT *
            FROM CN_SALDO_DEB_SIN_ANT
            WHERE ID_VIGENCIA = ' . $vig . ' AND ID_PERIODO_CONTABLE = ' . $per_cont . '
            
            UNION
            
            SELECT *
            FROM CN_SALDO_CRE_SIN_ANT
            WHERE ID_VIGENCIA = ' . $vig . ' AND ID_PERIODO_CONTABLE = ' . $per_cont . '
        ) sal_sig
        LEFT JOIN
        (
            SELECT *
            FROM CN_SALDO
            WHERE ID_VIGENCIA = ' . $vig_ant . ' AND ID_PERIODO_CONTABLE = ' . $per_cont_ant . '
        ) sal_old ON
        sal_old.ID_CIA = sal_sig.ID_CIA AND
        sal_old.ID_CEN_OP = sal_sig.ID_CEN_OP AND
        sal_old.SUBCUENTA = sal_sig.SUBCUENTA AND
        NVL(sal_old.ID_MAE_TER,0) = NVL(sal_sig.ID_MAE_TER,0) AND
        NVL(sal_old.ID_AUXILIAR,0) = NVL(sal_sig.ID_AUXILIAR,0) AND
        NVL(sal_old.ID_SUB_AUX,0) = NVL(sal_sig.ID_SUB_AUX,0) AND
        NVL(sal_old.ID_CENTRO_COSTO,0) = NVL(sal_sig.ID_CENTRO_COSTO,0) AND
        NVL(sal_old.ID_SUB_CENTRO_COSTO,0) = NVL(sal_sig.ID_SUB_CENTRO_COSTO,0)
    ) 
    
) 
';

        //Ejecuta sql
        CN_TABLE::executeSQL($sql);

        /*
         * INICIO actualizar totales de CAD
         */

        //sentencia sql
        $sql = <<<EOD
ALTER TRIGGER CN_COTROL_CAD_TOT_TRG DISABLE
EOD;
        //ejecuta el sql
        CN_TABLE::executeSQL($sql);

        //Se agrega filtro de $vig para mejorar consulta - 20221031::LAVILA
        //sentencia sql
        $sql = <<<EOD
UPDATE cn_control_cad cad SET ( TOT_DEBITO , TOT_CREDITO ) = (
    SELECT 
    nvl(sum(DEBITO),0) , nvl(sum(CREDITO),0) 
    FROM cn_movimiento_contable cadtot
    WHERE cad.ID_CAD = cadtot.ID_CAD
    AND cad.ID_CIA = cadtot.ID_CIA
    AND cad.ID_VIGENCIA = cadtot.ID_VIGENCIA
    AND cad.ID_CEN_OP = cadtot.ID_CEN_OP
    and cad.id_periodo_contable = $per_cont and cad.id_vigencia = $vig
)
where
cad.id_periodo_contable = $per_cont and cad.id_vigencia = $vig 
EOD;
        //ejecuta el sql
        CN_TABLE::executeSQL($sql);


        //sentencia sql
        $sql = <<<EOD
ALTER TRIGGER CN_COTROL_CAD_TOT_TRG ENABLE
EOD;
        //ejecuta el sql
        CN_TABLE::executeSQL($sql);

        /*
         * FIN actualizar totales de CAD
         */
    }

}
