<?php

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

    protected $table_names = array(
        'CA_DEBITO_AUTOMATICO',
        'CA_DEBITO_PRODUCTO'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'CA_DEBITO_PRODUCTO' =>
        array(
            'id_debito' => 'CA_DEBITO_AUTOMATICO'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CA_DEBITO_AUTOMATICO' =>
        array(
            'id_debito_automatico' => 'id_debito_automatico',
            'codigotimelog' => 'codigotimelog',
            'id_anhos' => 'id_anhos',
            'id_meses' => 'id_meses',
            'fecha_proceso' => 'fecha_proceso',
            'id_debito' => 'id_debito',
            'estado' => 'estado',
            'observaciones' => 'observaciones',
            'fecha_log' => 'fecha_log',
            'usuariolog' => 'usuariolog'
        ),
        'CA_DEBITO_PRODUCTO' =>
        array(
            'sec_debito' => 'sec_debito',
            'fecha_proceso' => 'fecha_debito',
            'id_mae_ter' => 'id_mae_ter',
            'valor_total' => 'valor_total',
            'id_referencia2' => 'id_referencia2',
            'tipo_debito' => 'desc_corta',
            'num_doc' => 'num_doc_ter',
            'razon_soc' => 'razon_soc_ter',
            'tercero' => 'tercero_ter',
            'codigo_pro' => 'codigo_pro',
            'descripcion_pro' => 'descripcion_pro',
            'codigo_pro,||, - ,||,descripcion_pro' => 'producto'
        )
    ); //por cada tabla especificar los campos del select
    protected $table_field_conditions = array(
        'CA_DEBITO_AUTOMATICO' => array(
            'id_debito_automatico,a' => array('!=' => array(-1)),
            'id_debito_automatico,b' => array('=' => array('id_debito_automatico')),
            'id_anhos' => array('=' => array('id_anhos')),
            'id_meses' => array('=' => array('id_meses')),
            'fecha_proceso' => array('BETWEENFECHA' => array('fecha_ini', 'fecha_fin')),
            'estado' => array('=' => array('estado')),
            'id_debito' => array('=' => array('id_debito')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        ),
        'CA_DEBITO_PRODUCTO' => array(
            'sec_debito' => array('=' => array('sec_debito')),
            'id_mae_ter' => array('=' => array('id_mae_ter')),
            'id_referencia2' => array('=' => array('id_referencia2'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $query_qualifier = 'DISTINCT'; //eliminar filas repetivas de consulta sql
    protected $fields_orderBy = array(
        'id_anhos', 'id_meses', 'fecha_proceso', 'sec_debito'
    ); //campos para el ordenamiento de la consulta

    /*
     * 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 = true;

    // 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") {
            if (isset($request['estado'])) {
                $estado = $request['estado'];
                if ($estado == "0") {
                    $request['fecha_anu'] = CN_TABLE::fechaSistema();
                }
            }
        }

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

    /**
     * Metodo de generacion dautomatica debitos por intereses
     * 
     * @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");

        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Formato de fecha
         */
        //Sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        $CODIGOTIMELOG = date('Y') . date('m') . date('d') . date('H') . date('i') . date('s');


        /*
         * Manejo de errores
         */
        try {


            /*
             * Variables de filtro
             */
            $fecha_proceso = $request['fecha_proceso'];
            $username = $request['username'];

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

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

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

            if (count($records_deb) > 0) {

                $this->logMessage("[ca_gen_aut_deb_int] 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,
        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 = 53339
            
            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
                    $this->conn->execute($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,
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
                    $this->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 = EXTRACT(YEAR FROM to_date ('$fecha_proceso', 'yyyy-mm-dd'))  
EOD;

                    //ejecuta el sql
                    $this->conn->execute($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
                    $this->conn->execute($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
                    $this->conn->execute($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
                    $this->conn->execute($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
                    $this->conn->execute($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
                    $this->conn->execute($sql);

                    $this->logMessage("[ca_gen_aut_deb_int] 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.");
            }


            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();


            /**
             * Respuesta JSON
             */
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[ca_gen_aut_deb_int] Generación exitosa.");
        } catch (Exception $e) {


            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();

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

    /**
     * Metodo de generacion dautomatica debitos por intereses desde su periodo ini - 20171027
     * 
     * @param sfWebRequest $request
     */
    public function executeAdd2(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");

        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Formato de fecha
         */
        //Sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        $CODIGOTIMELOG = date('Y') . date('m') . date('d') . date('H') . date('i') . date('s');


        /*
         * Manejo de errores
         */
        try {


            /*
             * Variables de filtro
             */
            $fecha_proceso = $request['fecha_proceso'];
            $username = $request['username'];

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

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

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

            if (count($records_deb) > 0) {

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

                //obtener secuencia para el debito
                $sql = <<<EOD
select * from ca_debito_automatico
where
estado = 1
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 a Noviembre 30. 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%
                     * 
                     */
                    $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 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 = 53339

        )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
                    $this->conn->execute($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') 
  || ', ' || debref.id_referencia2 || ', TI: ' || (case when tab0.aplica_usura = 0 then '12%' else 'Usura' end) || '. ' || 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

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

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
                    $this->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 = EXTRACT(YEAR FROM to_date ('$fecha_proceso', 'yyyy-mm-dd'))  
EOD;

                    //ejecuta el sql
                    $this->conn->execute($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
                    $this->conn->execute($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
                    $this->conn->execute($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
                    $this->conn->execute($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
                    $this->conn->execute($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
                    $this->conn->execute($sql);

                    $this->logMessage("[ca_gen_aut_deb_int] 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.");
            }


            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();


            /**
             * Respuesta JSON
             */
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[ca_gen_aut_deb_int] Generación exitosa.");
        } catch (Exception $e) {


            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();

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

}
