<?php

/**
 * saldo actions.
 *
 * @package    cartera
 * @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('CA_SALDOS');

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

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

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



        /*
         * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
         */
        $sql = <<<EOD
select distinct
       sal.id_anhos, sal.id_meses , mes.descripcion
       from CA_SALDOS sal
       join meses mes on
       sal.id_meses = mes.id_meses
       order by sal.id_anhos desc, sal.id_meses desc
EOD;

        //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 = <<<EOD
select distinct
       sal.id_anhos, sal.id_meses , mes.descripcion
       from CA_SALDOS sal
join meses mes on
       sal.id_meses = mes.id_meses
order by
       sal.id_anhos desc,
       sal.id_meses desc
EOD;

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

        $numero_saldos_ant = count($saldos_rec);

        //Valida si esta vacio
        if (empty($saldos_rec)) {
            $this->logMessage("[SALDO] Valida si esta vacio");


            /*
             * Valores de vigencia/periodo en los debitos
             */
            $sql = <<<EOD
select * from(
select
deb.*,
to_char(deb.fecha_proceso,'yyyy') as anho,
to_char(deb.fecha_proceso,'mm') as mes
from CA_DEBITO deb
order by
deb.fecha_proceso

)
where rownum = 1
EOD;

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

            //si hay debitos ultima fecha
            if (!empty($recaudos)) {
                $this->logMessage("[SALDO] Si hay debitos ultima fecha");

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

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

                /*
                 * insertar saldos del mes mas antiguo
                 */
                $anho = $recaudos[0]['anho'];
                $mes = $recaudos[0]['mes'];


                $saldos = array(
                    'id_anhos' => $anho,
                    'id_meses' => $mes
                );
                $saldosAnt = CN_TABLE::fechaAnterior($anho, $mes);

                $this->removeSaldo($saldos, $saldosAnt); //borra y genera nuevos saldos

                /*
                 * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
                 */
                $sql = <<<EOD
select distinct
       sal.id_anhos, sal.id_meses , mes.descripcion
       from CA_SALDOS sal
       join meses mes on
       sal.id_meses = mes.id_meses
       order by sal.id_anhos, sal.id_meses
EOD;

                //Ejecuta sql
                $records = CN_TABLE::executeSQL($sql);
                $vigencia_periodo_add[0] = $records[0];
                $this->list_data = $vigencia_periodo_add;
            } else {
                $this->status = 1;
                $this->list_data = array();
                $this->logMessage("No hay debitos.");
            }
        } else {
            $this->logMessage("[SALDO] Si NO hay debitos ultima fecha");

            /*
             * obtener fecha siguiente anho - mes
             */
            $anho = $saldos_rec[0]['id_anhos'];
            $mes = $saldos_rec[0]['id_meses'];


            $saldosAnt = array(
                'id_anhos' => $anho,
                'id_meses' => $mes
            );
            $saldos = CN_TABLE::fechaSiguiente($anho, $mes);

            $this->logMessage("--------------------------------------------------*  Remover y generar saldo.");
            $this->removeSaldo($saldos, $saldosAnt); //borra y genera nuevos saldos

            /*
             * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
             */
            $sql = <<<EOD
select distinct
       sal.id_anhos, sal.id_meses , mes.descripcion
from CA_SALDOS sal
       join meses mes on
       sal.id_meses = mes.id_meses
order by
       sal.id_anhos desc,
       sal.id_meses desc
EOD;

            //Ejecuta sql
            $records = CN_TABLE::executeSQL($sql);
            $vigencia_periodo_add[0] = $records[0];

            $numero_saldos_act = count($records);
            $this->logMessage("[SALDO] No. Saldos Ant." . $numero_saldos_ant . " No. Saldos Act." . $numero_saldos_act);

            //validar que si se inserto un nuevo periodo a los saldos
            if ($numero_saldos_ant < $numero_saldos_act) {
                $this->logMessage("Si hay debitos para el siguiente periodo o los debitos existentes ya estan pagados o anulados.");
                $this->list_data = $vigencia_periodo_add;
            } else {
                $this->status = 1;
                $this->list_data = array();
                $this->logMessage("No hay debitos para el siguiente periodo o los debitos existentes ya estan pagados o anulados.");
            }


            /*
             * Validar si se adiciono saldo nuevo - falta completar
             */
            if (true) {
                $this->logMessage("[SALDO] Validar si se adiciono saldo nuevo - falta completar");

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

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

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

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



                /*
                 * 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, $id_punto_venta_log);
            }
        }
    }

    /**
     * Remueve el saldo ultimo 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('CA_SALDOS');

        //4 - indica operacion de eliminar
        $id_ope_bd = 4;

        //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 = <<<EOD
select distinct
       sal.id_anhos, sal.id_meses , mes.descripcion
from CA_SALDOS sal
       join meses mes on
       sal.id_meses = mes.id_meses
order by
       sal.id_anhos desc,
       sal.id_meses desc
EOD;

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

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

            $firstRow = $records[0];

            //Obtiene valores de la primera fila
            /*
             * obtener fecha siguiente anho - mes
             */
            $anho = $firstRow['id_anhos'];
            $mes = $firstRow['id_meses'];
            $anhomes_req = $anho . str_pad($mes, 2, "0", STR_PAD_LEFT);

            $anho_actual = date('Y'); //anho completo cuatro digitos
            $mes_actual = date('m'); //mes con dos digitos

            $saldos_anterior = CN_TABLE::fechaAnterior($anho_actual, $mes_actual);
            $anho_anterior = $saldos_anterior['id_anhos'];
            $mes_anterior = $saldos_anterior['id_meses'];

            $anhomes_anterior = $anho_anterior . str_pad($mes_anterior, 2, "0", STR_PAD_LEFT);
            if ($anhomes_req >= $anhomes_anterior) {//CART-16 validar - 20150504


                /*
                 * Elimina saldos por vigencia/periodo
                 */
                $sql = <<<EOD
DELETE FROM CA_SALDOS
       WHERE ID_ANHOS =  $anho
       AND ID_MESES =  $mes
EOD;

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

                //construir observacion
                $observacion = "'Se removio saldo para periodo/vigencia - $mes/$anho desde la funcionalidad: " . $comando . "'";

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



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


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

                $this->status = 1;
                $this->list_data = array();
                $mensaje = "Solo se permite borrar saldos de meses anteriores -> " . $anhomes_anterior . ".";
                $this->mensajeError = $mensaje;
                $this->logMessage($mensaje);
            }
        } else {
            $this->status = 1;
            $this->list_data = array();
            $mensaje = "No hay saldos de cartera.";
            $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('CA_SALDOS');

        //2 - indica operacion de actualizar
        $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 . "'";

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




        /*
         * Obtiene las vigencias y periodos que se encuentran en los saldos
         */
        $sql = <<<EOD
select distinct
       sal.id_anhos, sal.id_meses , mes.descripcion
       from CA_SALDOS sal
join meses mes on
       sal.id_meses = mes.id_meses
order by
       sal.id_anhos desc,
       sal.id_meses desc
EOD;

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

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


            //Obtiene valores de la ultima fila
            $anho = $saldos_rec[0]['id_anhos'];
            $mes = $saldos_rec[0]['id_meses'];

            //variables del request
            $anho_req = $request['id_anhos'];
            $mes_req = $request['id_meses'];
            $anhomes_req = $anho_req . str_pad($mes_req, 2, "0", STR_PAD_LEFT);

            $anho_actual = date('Y'); //anho completo cuatro digitos
            $mes_actual = date('m'); //mes con dos digitos

            $saldos_anterior = CN_TABLE::fechaAnterior($anho_actual, $mes_actual);
            $anho_anterior = $saldos_anterior['id_anhos'];
            $mes_anterior = $saldos_anterior['id_meses'];

            $anhomes_anterior = $anho_anterior . str_pad($mes_anterior, 2, "0", STR_PAD_LEFT);
            if ($anhomes_req >= $anhomes_anterior) {//CART-16 validar - 20150504
                do {

                    $saldosAnt = CN_TABLE::fechaAnterior($anho_req, $mes_req);

                    $saldos = array(
                        'id_anhos' => $anho_req,
                        'id_meses' => $mes_req
                    );

                    $this->logMessage(" [Update]  Remover y generar saldo.");
                    $this->removeSaldo($saldos, $saldosAnt); //borra y genera nuevos saldos

                    $saldos = CN_TABLE::fechaSiguiente($anho_req, $mes_req);

                    //variables del request - actualiza por siguientes
                    $anho_req = $saldos['id_anhos'];
                    $mes_req = $saldos['id_meses'];

                    //validar ciclo infinito
                    if ($anho_req > 2111) {
                        die();
                    }

                    $this->logMessage(" [Update]  Anho - Mes for." . $anho_req . " - " . $mes_req);
                    $this->logMessage(" [Update]  Anho - Mes ultimo." . $anho . " - " . $mes);

                    /*
                     * Cambio por ciclo comparacion fecha - 20120724
                     */
                    $comparar_req = $anho_req . str_pad($mes_req, 2, '0', STR_PAD_LEFT);
                    $comparar = $anho . str_pad($mes, 2, '0', STR_PAD_LEFT);

                    $this->logMessage(" [Update]  Anho - Mes Comparar." . $comparar_req . " - " . $comparar);

//            } while ($anho_req <= $anho && $mes_req <= $mes);
                } while ($comparar_req <= $comparar);

                $this->logMessage(" [Update] Termino ciclo de regenerar saldos.");
            } else {

                $this->status = 1;
                $this->list_data = array();
                $mensaje = "Solo se permite regenerar saldos del mes anterior -> " . $anhomes_anterior . ".";
                $this->mensajeError = $mensaje;
                $this->logMessage($mensaje);
            }

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


            $this->list_data = array();
        } else {

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

    /**
     * Remueve los saldo e inserta los nuevos calculos
     *
     * @param sfWebRequest $request
     */
    public static function removeSaldo($saldos, $saldosAnt) {

        //manejo de errores
        try {

            //Obtener valores
            $anho = $saldos['id_anhos'];
            $mes = $saldos['id_meses'] + 0;

            $anho_ant = $saldosAnt['id_anhos'];
            $mes_ant = $saldosAnt['id_meses'];

            /*
             * Elimina saldos por vigencia/periodo
             */
            $sql = <<<EOD
DELETE FROM CA_SALDOS
       WHERE ID_ANHOS =   $anho
       AND ID_MESES =  $mes
EOD;

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

            //Se anexa campo id_mae_ter de saldos o de la novedad de cesion - 20210913::LAVILA
            $sql = <<<EOD
Insert into CA_SALDOS (ID_DEBITO,ID_VENCIMIENTO,ID_ANHOS,ID_MESES,SALDO_ANTERIOR,DEBITOS_MES,CREDITOS_MES,SALDO_ACTUAL,ID_MAE_TER) 

SELECT * FROM
(

    select

    tab1.id_debito,
    tab1.id_vencimiento,
    tab1.anho,
    tab1.mes,
    NVL( sal.saldo_actual , 0 ) as saldo_anterior,
    --tab1.recaudado_distri as recaudado,
    CASE
         WHEN sal.debitos_mes < 0
              THEN 0
         ELSE tab1.debitos_mes
    END as debitos_mes,

    tab1.creditos_mes as creditos_mes,

    (NVL( sal.saldo_actual , 0 )) +
    (CASE
         WHEN sal.debitos_mes < 0
              THEN 0
         ELSE tab1.debitos_mes
    END )- tab1.creditos_mes as saldo_actual,
    
    nvl(ces.id_mae_ter,nvl(sal.id_mae_ter,tab1.id_mae_ter)) as ID_MAE_TER

    from (

        select


        tab0.id_debito,
        tab0.id_vencimiento,
        --to_char(tab0.fecha_proc,'yyyy') as anho,
        '$anho' as anho,
        --to_char(tab0.fecha_proc,'mm') as mes,
        '$mes' as mes,
        tab0.debitos_mes,
        SUM(tab0.creditos_mes) as creditos_mes,
        min(tab0.id_mae_ter) as id_mae_ter

        from (

                  SELECT

                  debcre.id_debito,
                  debcre.fecha_proceso,
                  debcre.valor_total,
                  debcre.estado,
                  debcre.fecha_anu,
                  debcre.id_vencimiento,
                  debcre.fecha_vence,
                  debcre.estado_ven,
                  debcre.fecha_anu_ven,
                  debcre.cancelado,
                  debcre.id_credito_detalle,
                  debcre.valor_abono,
                  debcre.id_credito,
                  debcre.fecha_proceso_cre,
                  debcre.valor_cre,
                  debcre.estado_cre,
                  debcre.fecha_anu_cre,

                  /*colocar el respectivo valor debito segun el registro*/

                  CASE
                     -- segun el estado del vencimiento
                     WHEN debcre.estado_ven = 0
                          THEN
                                -- segun fecha de anulacion vencimiento
                                CASE
                                   WHEN To_Char(Debcre.Fecha_Proceso,'yyyy') = To_Char(Debcre.fecha_anu_ven,'yyyy') And To_Char(Extract(Month From Debcre.Fecha_Proceso)) = To_Char(Extract(Month From debcre.fecha_anu_ven))
                                        THEN 0
                                   WHEN To_Char(Debcre.fecha_anu_ven,'yyyy') = '$anho' And To_Char(Extract(Month From Debcre.fecha_anu_ven)) = '$mes'
                                        THEN -debcre.valor
            /* ??? Esta condición es para...?
                                   When To_Char(Debcre.Fecha_Proceso,'yyyy') >= '$anho' And To_Char(Extract(Month From Debcre.Fecha_Proceso)) >= '$mes'
                                        And To_Char(Debcre.fecha_anu_ven,'yyyy') <= '$anho' And To_Char(Extract(Month From Debcre.fecha_anu_ven)) > '$mes'
                                        THEN debcre.valor
            */
                                   When To_Char(Debcre.Fecha_Proceso,'yyyy') = '$anho' And To_Char(Extract(Month From Debcre.Fecha_Proceso)) = '$mes'
                                        THEN debcre.valor
                                   Else 0
                                /*
                                   WHEN to_char(debcre.fecha_proceso,'yyyy')  = to_char(debcre.fecha_anu,'yyyy') and to_char(debcre.fecha_proceso,'mm') = to_char(debcre.fecha_anu,'mm')
                                        THEN 0
                                   WHEN to_char(debcre.fecha_anu,'yyyy') = '$anho' and to_char(Extract(Month From Debcre.fecha_anu)) = '$mes'
                                        Then -Debcre.Valor_Total
                                   When To_Char(Debcre.Fecha_Anu,'yyyy') >= '$anho' And To_Char(Debcre.Fecha_Anu,'mm') > '$mes'
                                        and to_char(debcre.fecha_proceso,'yyyy') <= '$anho' and to_char(Extract(Month From Debcre.Fecha_Proceso)) != '$mes'
                                        THEN 0
                                   WHEN ( to_char(debcre.fecha_anu,'yyyy') = '$anho' and to_char(debcre.fecha_anu,'mm') < '$mes' )
                                        or
                                        ( to_char(debcre.fecha_anu,'yyyy') < '$anho')
                                        THEN 0
                                   ELSE debcre.valor_total
                                   */
                                END

                    WHEN debcre.estado_ven = 1
                          Then
                              --segun fecha de proceso de debito
                              Case
                                   WHEN to_char(debcre.fecha_proceso,'yyyy') = '$anho' and to_char(Extract(Month From Debcre.Fecha_Proceso)) = '$mes'
                                        THEN debcre.valor
                                   ELSE 0
                              END

                     ELSE 0
                  END AS debitos_mes,

                 /*colocar el respectivo valor credito segun el registro*/

                  Case
                     -- segun el estado del credito
                     WHEN debcre.estado_cre = 0
                          Then
                                -- segun fecha anulacion credito
                                Case
                                   When To_Char(Debcre.Fecha_Proceso_Cre,'yyyy') = To_Char(Debcre.Fecha_Anu_Cre,'yyyy') And To_Char(Extract(Month From Debcre.Fecha_Proceso_Cre)) = To_Char(Extract(Month From Debcre.Fecha_Anu_Cre))
                                        Then 0
                                   When To_Char(Debcre.Fecha_Anu_Cre,'yyyy') = '$anho' And To_Char(Extract(Month From Debcre.Fecha_Anu_Cre)) = '$mes'
                                        Then -Debcre.Valor_Abono
            /* ??? Esta condición es para...?
                                   When To_Char(Debcre.Fecha_Proceso_Cre,'yyyy') >= '$anho' And To_Char(Extract(Month From Debcre.Fecha_Proceso_Cre)) >= '$mes'
                                        And To_Char(Debcre.fecha_anu_cre,'yyyy') <= '$anho' And To_Char(Extract(Month From Debcre.fecha_anu_cre)) > '$mes'
                                        Then debcre.valor_abono
            */
                                   When To_Char(Debcre.Fecha_Proceso_Cre,'yyyy') = '$anho' And To_Char(Extract(Month From Debcre.Fecha_Proceso_Cre)) = '$mes'
                                        Then debcre.valor_abono
                                   Else 0
                                   /*
                                   WHEN to_char(debcre.fecha_anu_cre,'yyyy') = '$anho' and to_char(Extract(Month From Debcre.fecha_anu_cre)) = '$mes'
                                        THEN 0
                                   WHEN to_char(debcre.fecha_proceso_cre,'yyyy') = to_char(debcre.fecha_anu_cre,'yyyy') and to_char(debcre.fecha_proceso_cre,'mm') = to_char(debcre.fecha_anu_cre,'mm')
                                        THEN 0
                                   ELSE -debcre.valor_abono
                                   */
                                END

                    WHEN Debcre.Estado_Cre = 1
                          Then
                              --segun fecha de proceso de credito
                              Case
                                   WHEN To_Char(Debcre.Fecha_Proceso_Cre,'yyyy') = '$anho' And To_Char(Extract(Month From Debcre.Fecha_Proceso_Cre)) = '$mes'
                                        THEN Debcre.Valor_Abono
                                   ELSE 0
                              END

                     ELSE 0
                  END AS  creditos_mes,
                    
                  debcre.id_mae_ter

                  FROM CA_DEBITO_CREDITO debcre
          
          )tab0
          group by
          tab0.id_debito,
          tab0.id_vencimiento,
          to_char(tab0.fecha_proceso,'yyyy'),
          to_char(tab0.fecha_proceso,'mm'),
          tab0.debitos_mes

          order by
          tab0.id_debito

    )tab1

    left join CA_SALDOS sal
    on sal.id_debito = tab1.id_debito
    and sal.id_anhos = $anho_ant
    and sal.id_meses = $mes_ant
    --and sal.saldo_actual <> 0
    
    left join(
        
        select
        id_debito,
        id_mae_ter
        from (
        
            SELECT            
            aut.*,
            ROW_NUMBER() OVER (
                partition by aut.id_debito
                ORDER BY aut.id_debito, aut.fecha_proceso desc
            ) AS rn               
            FROM ca_cesion_cartera aut
            where
            EXTRACT(YEAR FROM aut.fecha_proceso) = $anho
            and EXTRACT(MONTH FROM aut.fecha_proceso) = $mes
            
        )           
        where
        rn = 1
    
    )ces
    on ces.id_debito = tab1.id_debito

    order by
    tab1.id_debito

)
where
saldo_anterior !=0
or debitos_mes !=0
or creditos_mes !=0
or saldo_actual !=0

EOD;

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

//            $this->list_data = array();
//            $this->logMessage("Se ingreso saldos");
        } catch (Exception $e) {

//            $this->status = 1;
//            $this->totalRows = 0;
//            $this->startRow = 0;
//            $this->endRow = 0;
//            $this->list_data = array();
//            $this->logMessage("ERROR!!!");
//            $this->logMessage($e->getMessage());
        }
    }

}
