<?php

/**
 * credito_detalle actions.
 *
 * @package    cartera
 * @subpackage credito_detalle
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class credito_detalleActions extends sfQuery {
    /*
     * ------------VARIABLES PARA SERVICIOS DE CONSULTA - LIST
     */

    protected $table_names = array(
        'CA_CREDITO_DETALLE',
        'CA_CREDITO',
        'CA_VENCIMIENTOS',
        'CA_TIP_MON',
        'CA_DEBITO',
        'INTERCEROS'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'CA_CREDITO' =>
        array(
            'id_credito' => 'CA_CREDITO_DETALLE'
        ),
        'CA_VENCIMIENTOS' =>
        array(
            'id_vencimiento' => 'CA_CREDITO_DETALLE'
        ),
        'CA_TIP_MON' =>
        array(
            'id_tip_mon' => 'CA_CREDITO_DETALLE'
        ),
        'CA_DEBITO' =>
        array(
            'id_debito' => 'CA_VENCIMIENTOS'
        ),
        'INTERCEROS' =>
        array(
            'id_mae_ter' => 'CA_DEBITO'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CA_CREDITO_DETALLE' =>
        array(
            'id_credito_detalle' => 'id_credito_detalle',
            'id_credito' => 'id_credito',
            'id_vencimiento' => 'id_vencimiento',
            'valor_bruto' => 'valor_bruto',
            'valor_retenciones' => 'valor_retenciones',
            'valor_abono' => 'valor_abono',
            'id_tip_mon' => 'id_tip_mon',
            'valor_total_moneda' => 'valor_total_moneda',
            'trm_credito' => 'trm_credito',
            'diferencia_cambio' => 'diferencia_cambio',
            'observaciones' => 'observaciones'
        ),
        'CA_CREDITO' =>
        array(
            'id_punto_venta' => 'id_punto_venta'
        ),
        'CA_VENCIMIENTOS' =>
        array(
            'id_debito' => 'id_debito',
            'valor' => 'valor',
            'fecha_vence' => 'fecha_vence',
            'estado' => 'estado_vence'
        ),
        'CA_TIP_MON' =>
        array(
            'codigo' => 'codigo_tm',
            'descripcion' => 'tipo_moneda'
        ),
        'CA_DEBITO' =>
        array(
            'id_punto_venta' => 'id_punto_venta_deb',
            'id_tipo_debito' => 'id_tipo_debito_deb',
            'sec_debito' => 'sec_debit',
            'id_mae_ter' => 'id_mae_ter_deb',
            'fecha_proceso' => 'fecha_proceso_deb',
            'valor_total' => 'valor_total_deb',
            'estado' => 'estado_deb'
        ),
        'INTERCEROS' =>
        array(
            'num_doc' => 'num_doc',
            'razon_soc' => 'razon_soc',
            'num_doc,||, - ,||,razon_soc' => 'tercero'
        )
    ); //por cada tabla especificar los campos del select
    protected $table_field_conditions = array(
        'CA_CREDITO_DETALLE' => array(
            'id_credito_detalle,a' => array('!=' => array(-1)),
            'id_credito_detalle,b' => array('=' => array('id_credito_detalle')),
            'id_credito' => array('=' => array('id_credito')),
            'id_vencimiento' => array('=' => array('id_vencimiento')),
            'id_tip_mon' => array('=' => array('id_tip_mon')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $fields_orderBy = array(
        'id_credito', 'id_vencimiento'
    ); //campos para el ordenamiento de la consulta
    protected $table_field_obligatory = array('id_credito'); //campos obligatorios de filtro - estan en el request

    /*
     * Variables manejo de log
     */
    //true - consulta de administracion
    protected $is_admin = false;
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = false;


    /*
     * ------------VARIABLES PARA SERVICIO DE SUMATORIA - SUM
     *
     */
    protected $summatory_data = array(
        'CA_CREDITO_DETALLE' => array(
            'fields' => array('valor_bruto', 'valor_retenciones', 'valor_abono', 'valor_total_moneda', 'trm_credito', 'diferencia_cambio'),
            'labels' => array('id_credito_detalle2,Total'),
            'count' => 'id_credito_detalle'
        )
    ); //se especifica por tabla los campos de suma y condiciones de filtro


    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_credito_detalle'; //identificador de la tabla
    protected $id_names = array('id_credito_detalle'); //llave primaria
    protected $field_names = array('id_credito', 'id_vencimiento', 'valor_bruto', 'valor_retenciones', 'valor_abono', 'id_tip_mon', 'valor_total_moneda',
        'trm_credito', 'diferencia_cambio', 'observaciones'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'CA_CREDITO_DETALLE'; //tabla en la cual se aplican los cambios
    protected $has_activo = true; //si posee campo en la tabla de nombre activo ---- ESTADO PARA REGALIAS
    protected $has_vigencia = false; //si posee vigencia
    protected $has_cen_op = false; //si posee centro de operacion
    protected $has_id_cia = false; //si posee compañia
    protected $has_secuencia = true; //si posee secuencia la tabla


    /*
     * Manejo de registro log
     */
    protected $id_unico = 'id_credito_detalle'; //identificador unico de la tabla

    /**
     * Metodo para add credito detalle y actualizar saldos debito
     *
     * @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");


        //manejo de errores
        try {
            
            $resultado = array();

            //variables obligatorias
            $id_credito = $request['id_credito'];
            $id_vencimiento = $request['id_vencimiento'];
            $valor_bruto = $request['valor_bruto'];
            $valor_abono = $request['valor_abono'];
            $fecha_proceso = $request['fecha_proceso'];
//            $fecha_proceso = CN_TABLE::fechaSistema();
            //variables NO obligatorias
            $id_tip_mon = 1; //validar su fincionamiento
            if (isset($request['id_tip_mon'])) {
                $id_tip_mon = $request['id_tip_mon'];
            }

            $observaciones = 'null';
            if (isset($request['observaciones'])) {
                $observaciones = "'" . $request['observaciones'] . "'";
            }


            $valor_retenciones = 0;
            if (isset($request['valor_retenciones'])) {
                $valor_retenciones = $request['valor_retenciones'];
            }
            $valor_total_moneda = 0;
            if (isset($request['valor_total_moneda'])) {
                $valor_total_moneda = $request['valor_total_moneda'];
            }
            $diferencia_cambio = 0;
            if (isset($request['diferencia_cambio'])) {
                $diferencia_cambio = $request['diferencia_cambio'];
            }
            $trm_credito = 1;
            if (isset($request['trm_credito'])) {
                $trm_credito = $request['trm_credito'];
            }
            $valor_devolucion = 0;
            if (isset($request['valor_devolucion'])) {
                $valor_devolucion = $request['valor_devolucion'];
            }


            //obtener id_debito para el vencimiento del detalle credito
            //sentencia sql
            $sql = <<<EOD
select * from ca_vencimientos_saldo
where id_vencimiento = $id_vencimiento
EOD;
            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            //si existe vencimiento
            if (count($result) > 0) {
                $this->logMessage("[CREDITO DETALLE] si existe vencimiento.");

                /*
                 * Validar estado activo vencimiento
                 */
                if ($result[0]['estado'] == 1) {
                    $this->logMessage("[CREDITO DETALLE] Validar estado activo vencimiento.");

                    /*
                     * Validar estado que no este cancelado el Vencimiento
                     * Si trae valor_devolucion, se deja guardar, ya que es detalle sin valor - 20170829
                     */
                    if ($result[0]['cancelado'] == 0 or isset($request['valor_devolucion'])) {
                        $this->logMessage("[CREDITO DETALLE] Validar estado que no este cancelado el Vencimiento.");


                        //saldo del vencimiento
                        $saldo_vence = $result[0]['valor'] - $result[0]['valor_creditodet'];
//                        $saldo_vence = round($result[0]['valor'],2) - round($result[0]['valor_creditodet'],2);                       
                        $this->logMessage("[CREDITO DETALLE] Saldos Vencimiento: " . $result[0]['valor'] . " - " . $result[0]['valor_creditodet']);

                        //saldo para verificar si acepta el pago
                        $saldo = round($saldo_vence, 2) - $valor_abono;
                        $this->logMessage("[CREDITO DETALLE] Saldos: " . $saldo_vence . " - " . $valor_abono);

                        /*
                         * Validar saldo del Vencimiento
                         * Si trae valor_devolucion, se deja guardar, ya que es detalle sin valor - 20170829
                         */
                        if ($saldo >= 0 or isset($request['valor_devolucion'])) {
                            $this->logMessage("[CREDITO DETALLE] Validar saldo del Vencimiento.");

                            //Cambio a cancelado del vencimiento
                            if ($saldo == 0) {
                                $this->logMessage("[CREDITO DETALLE] Cambio a cancelado del vencimiento.");

                                /*
                                 * cancelado vencimiento
                                 */
                                //sentencia sql
                                $sql = <<<EOD
UPDATE CA_VENCIMIENTOS SET cancelado = 1
            WHERE id_vencimiento = $id_vencimiento
EOD;
                                //$this->logMessage("---" . $sql);
                                //ejecuta el sql
                                CN_TABLE::executeSQL($sql);
                            }

                            /**
                             * aplica_devol_deb-Id de concepto credito que devuelve debito - 20180425
                             */
                            if (isset($request['aplica_devol_deb'])) {
                                //activar el vencimiento
                                //sentencia sql
                                $sql = <<<EOD
UPDATE CA_VENCIMIENTOS SET cancelado = 0
            WHERE id_vencimiento = $id_vencimiento
EOD;
                                $this->logMessage("-aplica_devol_deb-" . $sql);
                                //ejecuta el sql
                                CN_TABLE::executeSQL($sql);

                                $valor_bruto = $valor_devolucion * (-1);
                                $valor_abono = $valor_devolucion * (-1);
                            }


                            /*
                             * Se agrega campo de VALOR_DEVOLUCION - 20170829
                             */
                            //sentencia sql ingresar CA_CREDITO_DETALLE
                            $sql = <<<EOD
Insert into CA_CREDITO_DETALLE
    (ID_CREDITO_DETALLE,ID_CREDITO,ID_VENCIMIENTO,VALOR_BRUTO,VALOR_RETENCIONES,VALOR_ABONO,
        ID_TIP_MON,VALOR_TOTAL_MONEDA,TRM_CREDITO,DIFERENCIA_CAMBIO,OBSERVACIONES,VALOR_DEVOLUCION)
    values ( 0, $id_credito, $id_vencimiento, $valor_bruto, $valor_retenciones, $valor_abono, 
        $id_tip_mon, $valor_total_moneda, $trm_credito, $diferencia_cambio, $observaciones, $valor_devolucion)
EOD;

                            //ejecuta el sql
                            CN_TABLE::executeSQL($sql);


                            /*
                             * INICIO CREAR TRM
                             */
                            if (isset($request['crear_trm'])) {
                                if ($request['crear_trm'] == "true") {

                                    $this->logMessage("[CA_CREDITO_DETALLE] Crear registro TRM.");

                                    //sentencia sql
                                    $sql = <<<EOD
Insert into CA_TRM ( ID_TRM, ID_TIP_MON, FECHA_TRM, VALOR_TRM)
    values ( null, $id_tip_mon, to_date('$fecha_proceso','yyyy-mm-dd'), $trm_credito)
EOD;
                                    //ejecuta el sql
                                    CN_TABLE::executeSQL($sql);
                                } else {

                                    $this->logMessage("[CA_CREDITO_DETALLE] No Crear registro TRM.");
                                }
                            }
                            /*
                             * FIN CREAR TRM
                             */


                            // ultimo registro insertado CA_CREDITO_DETALLE
                            $sql = <<<EOD
Select
*
From Ca_Credito_Detalle
Where
Id_Credito = $id_credito
And Id_Vencimiento = $id_vencimiento
And Id_Tip_Mon = $id_tip_mon
And Id_Credito_Detalle = (
    Select
    max(id_credito_detalle)
    From Ca_Credito_Detalle
    Where
    Id_Credito = $id_credito
    And Id_Vencimiento = $id_vencimiento
    And Id_Tip_Mon = $id_tip_mon
)
EOD;
                            //ejecuta y obtiene el resultado del sql
                            $resultado = CN_TABLE::executeSQL($sql);
//            $this->logMessage("SQL CREDITO nueva. " . $sql);

                            /*
                             * INICIO variables por defecto para el registro de log
                             */ {
                                //obtiene el valor para su identificador unico
                                $id_tabla = $resultado[0]['id_credito_detalle'];

                                //validar vigencia
                                $id_vigencia = 'null';
                                if ($this->has_vigencia) {
                                    if (isset($request['id_anhos'])) {
                                        $id_vigencia = $request['id_anhos'];
                                    }
                                }

                                //validar centro de operacion
                                $id_cen_op = 'null';
                                if ($this->has_cen_op) {
                                    if (isset($request['id_cen_op'])) {
                                        $id_cen_op = $request['id_cen_op'];
                                    }
                                }

                                $id_cia = 'null';
                                if ($this->has_id_cia) {
                                    if (isset($request['id_cia'])) {
                                        $id_cia = $request['id_cia'];
                                    }
                                }

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

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

                                //id del maestro tercero
                                $id_mae_ter = 1;
                                if (isset($request['id_username'])) {
                                    $id_mae_ter = $request['id_username'];
                                }
                                //el username desde qebsafiERP
                                $usuario = 'admin';
                                if (isset($request['username']) && $request['username'] != '') {
                                    $usuario = $request['username'];
                                }
                                //comando que identifica la funcionalidad
                                $comando = 'sin comando';
                                if (isset($request['comando'])) {
                                    $comando = $request['comando'];
                                }

                                /*
                                 * Construir observacion
                                 */
                                $observacion = "'Se adiciono id_credito_detalle : " . $id_tabla . " desde la funcionalidad: " . $comando . "'";


                                $id_punto_venta_log = 'null';
                                if (isset($request['punto_venta_log'])) {
                                    $id_punto_venta_log = $request['punto_venta_log'];
                                }
                            }
                            /*
                             * FIN variables por defecto para el registro de 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);



                            //Saldos...
                            /*
                             * INICIO Actualizar tabla CA_SALDOS
                             */

                            //eliminar registros de la tabla CA_SALDOS para cada recaudo en el periodo y fecha de anulacion y posteriores
                            //debe ser solo un registro para el caso de vencimiento-debito
                            foreach ($result as $result_fila) {

                                $id_debito = $result_fila['id_debito'];


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

                                    //fecha del sistema
                                    $anho_req = date('Y'); //anho completo cuatro digitos
                                    $mes_req = date('n'); //mes con dos digitos

                                    do {

                                        $saldosAnt = CN_TABLE::fechaAnterior($anho_req, $mes_req); //obtener anho-mes anterior

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

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

                                        $saldos = CN_TABLE::fechaSiguiente($anho_req, $mes_req); //obtener anho-mes siguiente
                                        //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->status = 0;
                                        $this->list_data = array();
                                        $this->logMessage(" [Update]  Anho - Mes for." . $anho_req . " - " . $mes_req);
                                        $this->logMessage(" [Update]  Anho - Mes ultimo." . $anho . " - " . $mes);
                                    } while ($anho_req <= $anho && $mes_req <= $mes);
                                } else {

                                    $this->status = 1;
                                    $this->mensajeError = "[CREDITO_DETALLE] No hay saldos de los debitos.";
                                    $this->list_data = array();
                                    $this->logMessage("[CREDITO_DETALLE] No hay saldos de los debitos.");
                                }
                            }


                            /*
                             * FIN Actualizar tabla CA_SALDOS
                             */

                            /**
                             * INICIO DEBITOS AUTOMATICOS
                             * Anula los debitos automaticos que se relacionan con el debito cancelado - 20180206
                             * Incidente #10079, se cambia asi no quede en 0 el saldo, --and deb.cancelado = 1 - 20181012
                             */
                            //sentencia sql
                            $sql = <<<EOD
select
to_char((select max(cre.fecha_proceso) from ca_credito cre where cre.id_credito = $id_credito), 'yyyy-mm-dd') as text_date,                                         
(select max(cre.sec_credito) from ca_credito cre where cre.id_credito = $id_credito) as sec_credito,
(select max(cre.id_anhos) from ca_credito cre where cre.id_credito = $id_credito) as id_anhos_credito,                                        
debbase.sec_debito,
debbase.id_anhos as id_anhos_aut,
debaut.*
from ca_debito_automatico debaut

join ca_debito_vencimientos deb 
on deb.id_debito = debaut.id_debito

join ca_debito debbase
on debbase.id_debito = debaut.id_debito_base

where
debaut.id_debito_base in (
    select 
    deb.id_debito 
    from ca_debito_vencimientos deb
    
    where
    deb.id_debito in (select ca_debito_automatico.id_debito_base from ca_debito_automatico)
    --and deb.cancelado = 1
    and deb.estado = 1
)
and deb.estado = 1
and deb.cancelado = 0
and debaut.estado = 1
and debaut.id_debito_base in ( select id_debito from ca_debito_vencimientos where ca_debito_vencimientos.id_vencimiento = $id_vencimiento )
EOD;
                            //ejecuta el sql
                            $result_automatico = CN_TABLE::executeSQL($sql);

                            $usuario = 'admin';
                            if (isset($request['username']) && $request['username'] != '') {
                                $usuario = $request['username'];
                            }

                            foreach ($result_automatico as $value_automatico) {

                                $id_debito_aut = $value_automatico['id_debito'];
                                $sec_debito_aut = $value_automatico['sec_debito'];
                                $id_anhos_aut = $value_automatico['id_anhos_aut'];
                                $text_date = $value_automatico['text_date'];
                                $sec_credito = $value_automatico['sec_credito'];
                                $id_anhos_credito = $value_automatico['id_anhos_credito'];

                                /*
                                 * Anula vencimiento
                                 */
                                //sentencia sql
                                $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = to_date('$text_date','yyyy-mm-dd'), 
    motivo_anu = 'CANCELADA POR PAGO A CAPITAL NC.$sec_credito de $id_anhos_credito, CONCILIACION CON INTERESES REALES ND.$sec_debito_aut de $id_anhos_aut' 
        where id_debito = $id_debito_aut
EOD;
                                //ejecuta el sql
                                CN_TABLE::executeSQL($sql);

                                /**
                                 * Anula debito
                                 */
                                //sentencia sql
                                $sql = <<<EOD
update ca_debito set usuario_anu = '$usuario', estado = 0, fecha_anu = to_date('$text_date','yyyy-mm-dd'), 
    motivo_anu = 'CANCELADA POR PAGO A CAPITAL NC.$sec_credito de $id_anhos_credito, CONCILIACION CON INTERESES REALES ND.$sec_debito_aut de $id_anhos_aut' 
        where id_debito = $id_debito_aut
EOD;
                                //ejecuta el sql
                                CN_TABLE::executeSQL($sql);
                            }

                            $id_debito = $result[0]['id_debito'];
                            $CODIGOTIMELOG = date('Y') . date('m') . date('d') . date('H') . date('i') . date('s');
                            if ($saldo > 0) {

                                /**
                                 * Genera debito automatico - 20181012
                                 */

                                /*
                                 * Variables de filtro
                                 */
                                $fecha_proceso = CN_TABLE::fechaSistema();
                                $username = $request['username'];

                                $observaciones = 'GENERACION AUTOMATICA DEBITOS POR INTERESES ' . $fecha_proceso;

                                /**
                                 * Debitos que tienen productos con aplicacion debito automatico, saldo a la fecha, estado ven activo
                                 */
                                //Sql
                                $sql = <<<EOD
select distinct

tab0.id_debito,
tab0.valor_total,
tab0.id_anhos_sal,
tab0.id_meses_sal,
tab0.saldo_actual,
tab0.periodo_ini,
debref.id_referencia2

from ca_debito_saldos tab0

join ca_debito_ref debref
on tab0.id_debito = debref.id_debito

join ca_debito_producto debprod
on tab0.id_debito = debprod.id_debito

where 
tab0.estado_ven = 1
and tab0.id_meses_sal = EXTRACT(MONTH FROM to_date ('$fecha_proceso', 'yyyy-mm-dd')) 
and tab0.id_anhos_sal = EXTRACT(YEAR FROM to_date ('$fecha_proceso', 'yyyy-mm-dd'))
and tab0.saldo_actual > 0

and tab0.periodo_ini <= trunc (to_date ('$fecha_proceso', 'yyyy-mm-dd'))  
and debprod.aplica_auto_deb = 1
and tab0.id_debito = $id_debito            

order by
tab0.id_debito                    
EOD;
                                //Ejecutar SQL
                                $records_deb = CN_TABLE::executeSQL($sql);

                                if (count($records_deb) > 0) {

                                    $this->logMessage("[CREDITO] Existen debitos automaticos: " . count($records_deb));

                                    //obtener secuencia para el debito, esto ya no es necesario ya que  pueden ser de varias fechas en el periodo - 20181012
                                    $sql = <<<EOD
select * from ca_debito_automatico
where
estado = 999
and id_anhos = EXTRACT(YEAR FROM to_date ('$fecha_proceso', 'yyyy-mm-dd'))
and id_meses = EXTRACT(MONTH FROM to_date ('$fecha_proceso', 'yyyy-mm-dd'))  
EOD;

                                    //ejecuta el sql
                                    $result = CN_TABLE::executeSQL($sql);

                                    if (count($result) == 0) {

                                        /**
                                         * Generar registros de debitos automaticos
                                         * Calculo de intereses
                                         * 
                                         * * Incidente #7350 CAUSACION AUTOMATICA DE INTERESES EN CUENTAS DE ORDEN: - 20171201
                                          a. Cálculo de intereses:
                                          Se calcularán intereses totales de cada obligación con corte del mes. El cálculo se aplicará a las obligaciones que:
                                          • Tenga registro de inicio real de la mora, esta información se encuentra registrada para anualidades de Canon superficiario con la especificación de la fecha de inicio y fecha final de la anualidad, en este caso el inicio de la mora es la fecha de inicio de la anualidad.
                                          • Cuando la obligación no tenga definido el inicio de la mora, los intereses se calculan a partir de la fecha de registro de la obligación.
                                          • El cálculo se aplicará para Canon y compensaciones de recursos propios.
                                          . Cuando el título no tenga tasa de interes tomar el 12%
                                         * Se coloca que no tengan marca de novedad de CC, AP  - 20180110
                                         * 
                                         */
                                        $sql = <<<EOD
insert into CA_DEBITO_AUTOMATICO (
ID_DEBITO_AUTOMATICO,
CODIGOTIMELOG,
ID_ANHOS,
ID_MESES,
FECHA_PROCESO,
ID_DEBITO,
ESTADO,
OBSERVACIONES,
FECHA_LOG,
USUARIOLOG,
ID_DEBITO_BASE,
VALOR                            
)

select 
tab0.id_debito_automatico,
tab0.codigotimelog,
tab0.id_anhos,
tab0.id_meses,
tab0.fecha_proceso,
tab0.id_debito,
tab0.estado,
tab0.observaciones,
tab0.fecha_log,
tab0.usuariolog , 
tab0.id_debito_base,
tab0.VALOR 
from(
    
    
    select 
    tab0.id_debito_automatico,
    tab0.codigotimelog,
    tab0.id_anhos,
    tab0.id_meses,
    tab0.fecha_proceso,
    tab0.id_debito,
    tab0.estado,
    tab0.observaciones,
    tab0.fecha_log,
    tab0.usuariolog , 
    tab0.id_debito_base,
    case when tab0.aplica_usuara = 0 
    then CONSULTA_SQL_INTERES_normal@CAN.ANM.LOCAL(
        to_number(to_char(trunc(fecha_pago_oportuno),'yyyy')),to_number(to_char(trunc(fecha_pago_oportuno),'mm')),
        to_number(to_char(trunc(fecha_pago_oportuno),'dd')),
        to_number(to_char(trunc(fecha_pago),'yyyy')),to_number(to_char(trunc(fecha_pago),'mm')),
        to_char (fecha_pago_oportuno, 'yyyy-mm-dd'), to_char (fecha_pago, 'yyyy-mm-dd'), ceil(tab0.saldo_actual), tab0.tasa_interes
        )
    else CONSULTA_SQL_INTERES@CAN.ANM.LOCAL(
        to_number(to_char(trunc(fecha_pago_oportuno),'yyyy')),to_number(to_char(trunc(fecha_pago_oportuno),'mm')),
        to_number(to_char(trunc(fecha_pago),'yyyy')),to_number(to_char(trunc(fecha_pago),'mm')),
        to_char (fecha_pago_oportuno, 'yyyy-mm-dd'), to_char (fecha_pago, 'yyyy-mm-dd'), ceil(tab0.saldo_actual)
        )
    end as VALOR

    from(
    
        select  
        null as id_debito_automatico,
        '$CODIGOTIMELOG' as codigotimelog,
        tab0.id_anhos_sal as id_anhos,
        tab0.id_meses_sal as id_meses,
        tab0.fecha_proc as fecha_proceso,
        null as id_debito,
        1 as estado,
        '$observaciones' as observaciones,
        sysdate as fecha_log,
        '$username' as usuariolog , 
        tab0.id_debito as id_debito_base,
                            
        nvl(ti.aplica_usura,0) as aplica_usuara,
        tab0.saldo_actual,
        nvl(tt.id_tasa_interes,1) as tasa_interes,
                       
        /*case when tab0.periodo_ini >= to_date(tab0.id_anhos_sal||'-'||tab0.id_meses_sal||'-'||'01', 'yyyy-mm-dd')
        then tab0.periodo_ini
        else to_date(tab0.id_anhos_sal||'-'||tab0.id_meses_sal||'-'||'01', 'yyyy-mm-dd')
        end as fecha_pago_oportuno,*/
        --to_date(tab0.id_anhos_sal||'-'||tab0.id_meses_sal||'-'||'01', 'yyyy-mm-dd') as fecha_pago_oportuno,
        tab0.periodo_ini as fecha_pago_oportuno,
        to_date('$fecha_proceso', 'yyyy-mm-dd') as fecha_pago

        from(

            select distinct

            tab0.id_debito,
            tab0.valor_total,
            tab0.id_anhos_sal,
            tab0.id_meses_sal,
            tab0.saldo_actual,
            nvl(tab0.periodo_ini,tab0.fecha_proceso) as periodo_ini,
            debref.id_referencia2,
            to_date ('$fecha_proceso', 'yyyy-mm-dd') as fecha_proc

            from ca_debito_saldos tab0

            join ca_debito_ref debref
            on tab0.id_debito = debref.id_debito

            join ca_debito_producto debprod
            on tab0.id_debito = debprod.id_debito

            where 
            tab0.estado_ven = 1
            and tab0.id_meses_sal = EXTRACT(MONTH FROM to_date ('$fecha_proceso', 'yyyy-mm-dd')) 
            and tab0.id_anhos_sal = EXTRACT(YEAR FROM to_date ('$fecha_proceso', 'yyyy-mm-dd'))
            and tab0.saldo_actual > 0

            and nvl(tab0.periodo_ini,tab0.fecha_proceso) <= trunc (to_date ('$fecha_proceso', 'yyyy-mm-dd'))  
            and debprod.aplica_auto_deb = 1
            and tab0.id_debito = $id_debito 
            
            and tab0.id_debito not in (select distinct nov.id_debito from ca_novedad_cartera nov where nov.id_tipo_novedad in (2,4) and nov.abierto = 1)

        )tab0  
        
        join rmn_titulo@can.anm.local tit 
        on tab0.id_referencia2 = tit.COD_TITULO
        
        left join ca_titulo_tasa@can.anm.local tt on tt.id_titulo = tit.id_titulo and tt.estado = 1
        left join ca_tasa_interes@can.anm.local ti on tt.id_tasa_interes = ti.id_tasa_interes
        
    )tab0      

)tab0

where
tab0.VALOR > 0

order by
tab0.id_debito 
EOD;
                                        //Ejecutar SQL
                                        CN_TABLE::executeSQL($sql);

                                        /**
                                         * Generar Debito
                                         * Generar en producción las ND de itnereses automáticos  con fecha 30 de septiembre.   Correspondiente a intereses de 1 al 30 de septiembre de 2017
                                         * Incluir datos del debito base a las observaciones - 20171002
                                         */
                                        $sql = <<<EOD
insert into ca_debito(
ID_DEBITO,
ID_ANHOS,
ID_PUNTO_VENTA,
ID_TIPO_DEBITO,
SEC_DEBITO,
ID_MAE_TER,
FECHA_PROCESO,
DIAS_PAGO,
VALOR_BRUTO,
VALOR_IVA,
VALOR_DCTO,
PORCEN_DCTO,
VALOR_TOTAL,
ID_MAE_TER_VEN,
OBSERVACIONES,
ID_TIP_MON,
VALOR_MONEDA,
TRM_DEBITO,
ESTADO,
FECHA_ANU,
MOTIVO_ANU,
PERIODO_INI,
PERIODO_FIN,
USUARIOLOG,
ID_PR_TIPO_INGRE,
FECHA_VENCIMIENTO,
ORDEN_SERVICIO,
ID_INTERCEROS_CONTACTO,
ID_TIPO_FACTURA,
USUARIO_ANU
)

select 
null as ID_DEBITO,
tab0.id_anhos as ID_ANHOS,
deb.ID_PUNTO_VENTA,
deb.ID_TIPO_DEBITO,
rownum + nvl((select max(debcon.consecutivo) from ca_consecutivo_deb debcon 
  where debcon.id_tipo_debito = deb.id_tipo_debito and debcon.id_anhos = tab0.id_anhos and debcon.id_punto_venta = deb.id_punto_venta ),0) as SEC_DEBITO,
deb.ID_MAE_TER,
trunc(sysdate) FECHA_PROCESO,
deb.DIAS_PAGO,
tab0.valor as VALOR_BRUTO,
0 as VALOR_IVA,
0 as VALOR_DCTO,
0 as PORCEN_DCTO,
tab0.valor as VALOR_TOTAL,
deb.ID_MAE_TER_VEN,
desc_corta_tipdeb || ' ' || deb.sec_debito || ', Fecha: ' || to_char (deb.fecha_proceso, 'yyyy-mm-dd') || ', SALDO CAPITAL: ' || TO_CHAR(nvl(deb.saldo_actual,0), 'FM9,999,999,999') || '. ' || deb.OBSERVACIONES as OBSERVACIONES,
deb.ID_TIP_MON,
tab0.valor as VALOR_MONEDA,
deb.TRM_DEBITO,
deb.ESTADO,
null as FECHA_ANU,
null as MOTIVO_ANU,

/*case when deb.periodo_ini >= to_date(tab0.id_anhos||'-'||tab0.id_meses||'-'||'01', 'yyyy-mm-dd')
        then deb.periodo_ini
        else to_date(tab0.id_anhos||'-'||tab0.id_meses||'-'||'01', 'yyyy-mm-dd')
        end as PERIODO_INI,*/
nvl(deb.periodo_ini,deb.fecha_proceso) as PERIODO_INI,
tab0.FECHA_PROCESO as PERIODO_FIN,                            
                            
tab0.USUARIOLOG,
deb.ID_PR_TIPO_INGRE,
deb.FECHA_VENCIMIENTO,
deb.ORDEN_SERVICIO,
tab0.id_debito_base as ID_INTERCEROS_CONTACTO,
deb.ID_TIPO_FACTURA,
null as USUARIO_ANU
 
from ca_debito_automatico tab0

join ca_debito_saldos deb
on deb.id_debito = tab0.id_debito_base 
   

where
tab0.codigotimelog = $CODIGOTIMELOG
and deb.id_meses_sal = tab0.id_meses
and deb.id_anhos_sal = tab0.id_anhos

order by
tab0.id_debito_automatico 
EOD;
                                        //Ejecutar SQL
                                        CN_TABLE::executeSQL($sql);

                                        /*
                                         * sentencia sql actualizar valores de secuencia debito
                                         */
                                        $sql = <<<EOD
update ca_consecutivo_deb tab 
set tab.consecutivo = nvl((select max(deb.sec_debito) from ca_debito deb where deb.id_anhos = tab.id_anhos and deb.id_tipo_debito = tab.id_tipo_debito and deb.id_punto_venta = tab.id_punto_venta),0)
where
tab.id_anhos = EXTRACT(YEAR FROM to_date ('$fecha_proceso', 'yyyy-mm-dd'))  
EOD;

                                        //ejecuta el sql
                                        CN_TABLE::executeSQL($sql);


                                        /**
                                         * Actualizo debito automatico
                                         */
                                        $sql = <<<EOD
update ca_debito_automatico tab0 
    set tab0.id_debito = (select max(deb.id_debito) from ca_debito deb where deb.ID_INTERCEROS_CONTACTO = tab0.id_debito_base)
where
tab0.codigotimelog = $CODIGOTIMELOG 
EOD;
                                        //Ejecutar SQL
                                        CN_TABLE::executeSQL($sql);

                                        /**
                                         * Registrar saldo nuevo
                                         */
                                        $sql = <<<EOD
insert into ca_saldos(
ID_DEBITO,
ID_VENCIMIENTO,
ID_ANHOS,
ID_MESES,
SALDO_ANTERIOR,
DEBITOS_MES,
CREDITOS_MES,
SALDO_ACTUAL
)

select 
tab0.ID_DEBITO,
ven.id_vencimiento as ID_VENCIMIENTO,
tab0.ID_ANHOS,
tab0.ID_MESES,
0 as SALDO_ANTERIOR,
ven.valor as DEBITOS_MES,
0 as CREDITOS_MES,
ven.valor as SALDO_ACTUAL

from ca_debito_automatico tab0

join ca_vencimientos ven
on ven.id_debito = tab0.id_debito

where
tab0.codigotimelog = $CODIGOTIMELOG

order by
tab0.id_debito_automatico 
EOD;
                                        //Ejecutar SQL
                                        CN_TABLE::executeSQL($sql);

                                        /**
                                         * Generar debito ref
                                         */
                                        $sql = <<<EOD
insert into ca_debito_ref(
ID_DEBITO,
ID_REFERENCIA1,
ID_REFERENCIA2
)

select 
tab0.id_debito,
debref.ID_REFERENCIA1,
debref.ID_REFERENCIA2

from ca_debito_automatico tab0

join ca_debito deb
on deb.id_debito = tab0.id_debito_base

left join ca_debito_ref debref
on debref.id_debito = deb.id_debito

where
tab0.codigotimelog = $CODIGOTIMELOG

order by
tab0.id_debito_automatico  
EOD;
                                        //Ejecutar SQL
                                        CN_TABLE::executeSQL($sql);

                                        /**
                                         * Generar Detalle
                                         */
                                        $id_producto = 2542;
                                        $cantidad = 1;
                                        $sql = <<<EOD
insert into ca_debito_detalle(
ID_DEBITO_DETALLE,
ID_DEBITO,
ID_PRODUCTO,
CANTIDAD,
VALOR_UNITARIO,
VALOR_IVA,
VALOR_DCTO,
PORCEN_DCTO,
VALOR_TOTAL,
OBSERVACIONES,
POR_IVA,
VALOR_UNI_ME,
VALOR_IVA_ME,
VALOR_TOTAL_ME
)

select 
null as ID_DEBITO_DETALLE,
tab0.id_debito as ID_DEBITO,
$id_producto as ID_PRODUCTO,
$cantidad as CANTIDAD,
deb.valor_bruto as VALOR_UNITARIO,
deb.VALOR_IVA,
deb.VALOR_DCTO,
deb.PORCEN_DCTO,
deb.VALOR_TOTAL,
deb.OBSERVACIONES,
0 as POR_IVA,
0 as VALOR_UNI_ME,
0 as VALOR_IVA_ME,
0 as VALOR_TOTAL_ME

from ca_debito_automatico tab0

join ca_debito deb
on deb.id_debito = tab0.id_debito

where
tab0.codigotimelog = $CODIGOTIMELOG

order by
tab0.id_debito_automatico  
EOD;
                                        //Ejecutar SQL
                                        CN_TABLE::executeSQL($sql);

                                        /*
                                         * actualizar campo ID_INTERCEROS_CONTACTO del debito
                                         */
                                        $sql = <<<EOD
update ca_debito tab0 set tab0.ID_INTERCEROS_CONTACTO = null
where
tab0.ID_INTERCEROS_CONTACTO is not null
and tab0.id_debito in ( select aut.id_debito from ca_debito_automatico aut 
    where aut.codigotimelog = $CODIGOTIMELOG )   
EOD;

                                        //ejecuta el sql
                                        CN_TABLE::executeSQL($sql);

                                        $this->logMessage("[CREDITO] Proceso terminado.");
                                    } else {
                                        //throw new Exception("Ya se ejecuto el proceso para el año y mes de la fecha de proceso ingresada.");
                                    }
                                } else {
                                    //throw new Exception("No existen registros para generar, favor verificar.");
                                }
                            }
                            /*
                             * FIN DEBITOS AUTOMATICOS
                             */

                            //Resultado para el Template
                            $this->list_data = $resultado;
                            $this->logMessage("[CREDITO DETALLE] Guardar detalle credito.");

                            /**
                             * Validacion de secuencias para no repetir debitos - 20220701::LAVILA
                             */
                            $sql = <<<EOD
select 
tab0.id_debito,
deb.id_anhos,
deb.id_punto_venta,
deb.id_tipo_debito

from ca_debito_automatico tab0

join ca_debito deb
on deb.id_debito = tab0.id_debito

where
tab0.codigotimelog = $CODIGOTIMELOG
and tab0.id_debito is not null

order by
tab0.id_debito_automatico desc
EOD;
                            $records_deb = CN_TABLE::executeSQL($sql);
                            foreach ($records_deb as $value_deb) {
                                $this->validateNumeroUnico($value_deb['id_debito'],$value_deb['id_anhos'],$value_deb['id_punto_venta'],$value_deb['id_tipo_debito']);
                            }
                        } else {


                            $mensaje = "[CREDITO_DETALLE] El vencimiento no posee saldo suficiente.";
                            $this->status = 1;
                            $this->mensajeError = $mensaje;
                            $this->list_data = array();
                            $this->logMessage($mensaje);
                        }
                    } else {


                        $mensaje = "[CREDITO_DETALLE] El vencimiento se encuenta Cancelado.";
                        $this->status = 1;
                        $this->mensajeError = $mensaje;
                        $this->list_data = array();
                        $this->logMessage($mensaje);
                    }
                } else {


                    $mensaje = "[CREDITO_DETALLE] Vencimiento no esta activo.";
                    $this->status = 1;
                    $this->mensajeError = $mensaje;
                    $this->list_data = array();
                    $this->logMessage($mensaje);
                }
            } else {

                $mensaje = "[CREDITO_DETALLE] No hay debitos para el detalle credito, existe vencimiento.";
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "ERROR!!!";
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

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

        //manejo de errores
        try {

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

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

            /*
             * Elimina saldos por vigencia/periodo
             */
            $sql = <<<EOD
DELETE FROM CA_SALDOS

WHERE  ID_DEBITO = $id_debito
       AND 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/20211015::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
                                   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
                                   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
                                   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
                                   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

                where
                debcre.id_debito = $id_debito
                /*to_char(debcre.fecha_proceso,'mm') = '11' */


          )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());
        }
    }

    // Validate

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Add
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateAdd(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Update
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateUpdate(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Remove
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateRemove(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Acciones anteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function preprocessRequest($Action, sfWebRequest $request) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a preprocessRequest");

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

    /**
     * Acciones posteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function postprocessRequest($Action, sfWebRequest $request, $list_data_post) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a postprocessRequest - " . $list_data_post);

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

    /**
     * Validacion de secuencias para no repetir debitos - 20220701::LAVILA
     * @param type $id_debito
     * @return type
     */
    private function validateNumeroUnico($id_debito,$id_anhos,$id_punto_venta,$id_tipo_debito) {
        
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("[credito_detalle] Ingreso a validar numero secuencia");

        $sql = <<<EOD
select 
id_debito, sec_debito, id_anhos

from CA_DEBITO

where sec_debito = (select sec_debito from CA_DEBITO where id_debito = $id_debito)
and id_anhos = $id_anhos
and id_punto_venta = $id_punto_venta
and id_tipo_debito = $id_tipo_debito
order by id_debito ASC
EOD;
        $records = CN_TABLE::executeSQL($sql);
        if (count($records) > 1) {
            
            if ($records[0]['id_debito'] == $id_debito) {
                return array("sec_debito" => $records[0]['sec_debito']);
            } else {
                $conn = Doctrine_Manager::getInstance()->getCurrentConnection();
                $conn->beginTransaction();
                $logger->info("[credito_detalle] Ingreso a actualizar la sec_debito");
                
                $id_anhos_rec = $records[0]['id_anhos'];
                
                //actualziar debito con secuencia
                $sql = <<<EOD
update CA_DEBITO deb
set deb.sec_debito = nvl((select max(debcon.consecutivo) from ca_consecutivo_deb debcon 
  where debcon.id_tipo_debito = deb.id_tipo_debito and debcon.id_anhos = deb.id_anhos and debcon.id_punto_venta = deb.id_punto_venta ),0) + 1
where
deb.id_debito = $id_debito
EOD;
                $conn->execute($sql);

                /*
                 * sentencia sql actualizar valores de secuencia debito
                 */
                $sql = <<<EOD
update ca_consecutivo_deb tab 
set tab.consecutivo = nvl((select max(deb.sec_debito) from ca_debito deb where deb.id_anhos = tab.id_anhos and deb.id_tipo_debito = tab.id_tipo_debito and deb.id_punto_venta = tab.id_punto_venta),0)
where
tab.id_anhos = $id_anhos_rec 
EOD;

                //ejecuta el sql
                $conn->execute($sql);


                $conn->commit();
                return $this->validateNumeroUnico($id_debito,$id_anhos,$id_punto_venta,$id_tipo_debito);
            }
            
        } else {
            $logger->info("[credito_detalle] numero radicado unico");
            return array("sec_debito" => $records[0]['sec_debito']);
        }
    }

}
