<?php

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

    //Indica si la operacion es una reliquidacion
    public $reLiquida = 0;
    //Indica si la operacion de reliquidacion es la creacion de un debito o la edicion de uno existente
    public $creaDebito = 1;
    //Si la operacion es una reliquidacion creara una ND por la diferencia contra la ND vieja
    public $valorTotal = 0;
    public $observaciones = "";

    /**
     * Metodo pra la creacion de tercero- debito - debito detalle desde canon
     * Verifica el tercero y lo crea ne no existir
     * Crea la cabecera del debito
     * Crea el detale del debito
     * Retorna el debito creado
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        /*
         * Manejo de errores
         */
        try {

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

            //sentencia sql
            $sql = <<<EOD
SELECT * FROM INTERCEROS  WHERE num_doc = '$num_doc' order by id_mae_ter
EOD;
            //ejecuta el sql
            $resultado = CN_TABLE::executeSQL($sql);

            /*
             * Verificar tercero existe
             */
            if (count($resultado) > 0) {
                $this->logMessage("[DEBITO_CANON] El Tercero existe.");

                $id_mae_ter = $resultado[0]['id_mae_ter'];

                /*
                 * Llamar al metodo de crear el debito
                 */
                $resultado = array();
                $resultado = $this->crearDebito($id_mae_ter, $request);

                $id_debito = $resultado[0]['id_debito'];

                /*
                 * Llamar al metodo de crear el debito
                 */
                $this->crearDebitoDetalle($id_debito, $request);

                $this->list_data = $resultado;
                $this->logMessage("[DEBITO_CANON] OK. Registros creados correctamente.");
            } else {
                $this->logMessage("[DEBITO_CANON] El Tercero No existe.");

                //Obligatorias
                $id_nat_jur = $request['id_nat_jur'];
                $id_tip_ter = $request['id_tip_ter'];
                $id_tipo_doc = $request['id_tipo_doc'];

                //Opcionales
                $razon_soc = "null";
                if (isset($request['razon_soc'])) {
                    if ($request['razon_soc'] != "null" && $request['razon_soc'] != null && $request['razon_soc'] != '') {
                        $razon_soc = "'" . $request['razon_soc'] . "'";
                    }
                }
                $pnombre = "null";
                if (isset($request['pnombre'])) {
                    if ($request['pnombre'] != "null" && $request['pnombre'] != null && $request['pnombre'] != '') {
                        $pnombre = "'" . $request['pnombre'] . "'";
                    }
                }
                $papellido = "null";
                if (isset($request['papellido'])) {
                    if ($request['papellido'] != "null" && $request['papellido'] != null && $request['papellido'] != '') {
                        $papellido = "'" . $request['papellido'] . "'";
                    }
                }
                $sapellido = "null";
                if (isset($request['sapellido'])) {
                    if ($request['sapellido'] != "null" && $request['sapellido'] != null && $request['sapellido'] != '') {
                        $sapellido = "'" . $request['sapellido'] . "'";
                    }
                }


                /*
                 * insert into INTERCEROS (id_mae_ter,id_nat_jur,id_tip_ter,id_tipo_doc,num_doc,codigo,razon_soc,cam_com,pnombre,snombre,estado_ter,
                 * fecha_doc,papellido,sapellido,nmatricula,nmatriculamer,profesion,dv,objetivo) 
                 * values (1,22,1,1,'1',null,'OTROS R.C',null,null,null,null,null,null,null,null,null,null,null,null);
                 */
                /*
                 * Se deja por defecto el tercero como 1 - activo - 20150414
                 */

                //sentencia sql
                $sql = <<<EOD
insert into INTERCEROS (id_mae_ter,id_nat_jur,id_tip_ter,id_tipo_doc,num_doc,codigo,razon_soc,cam_com,pnombre,snombre,estado_ter,fecha_doc,papellido,sapellido,nmatricula,nmatriculamer,profesion,dv,objetivo) 
values (null,$id_nat_jur,$id_tip_ter,$id_tipo_doc,'$num_doc',null,$razon_soc,null,$pnombre,null,1,null,$papellido,$sapellido,null,null,null,null,null) 
EOD;
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);

                $this->logMessage("[DEBITO_CANON] OK. Tercero con num_doc: " . $num_doc . " creado.");

                //sentencia sql
                $sql = <<<EOD
SELECT * FROM INTERCEROS  WHERE num_doc = '$num_doc' order by id_mae_ter
EOD;
                //ejecuta el sql
                $resultado = CN_TABLE::executeSQL($sql);

                $id_mae_ter = $resultado[0]['id_mae_ter'];

                /*
                 * Llamar al metodo de crear el debito
                 */
                $resultado = array();
                $resultado = $this->crearDebito($id_mae_ter, $request);

                $id_debito = $resultado[0]['id_debito'];

                /*
                 * Llamar al metodo de crear el debito
                 */
                $this->crearDebitoDetalle($id_debito, $request);

                $this->list_data = $resultado;
                $this->logMessage("[DEBITO_CANON] OK. Registros creados correctamente.");
            }

            /**
             * Envio de correo de notificación ND - 20190517
             */
            if (isset($request['id_persona'])) {

                $id_persona = $request['id_persona'];
                $periodo_ini = $request['periodo_ini'];
                $periodo_fin = $request['periodo_fin'];
                $anualidad = $request['anualidad'];
                $abreviacion = $request['abreviacion'];
                $id_det_liq_canon = $request['id_det_liq_canon'];
                $vig_liq = $request['vig_liq'];
                $this->logMessage("[DEBITO_CANON] Envio de correo de notificación ND.");


                /*
                 * to_date('$fecha_proceso','yyyy-mm-dd'), se deja con sysdate - 20190117
                 * Se genera solo para anualidades que empiezan posterior a la fecha de causacion - 
                 * Por que está generando correo de titulos que se actualizan incluso de anualidades anteriores - 20200217
                 */
                //sentencia sql
                $sql = <<<EOD
select 

(SELECT
case 
when correo_notif is not null then correo_notif
when correo is not null then correo
when correo_alt is not null then correo_alt
else null end as correo
FROM rmn_persona@CAN.ANM.LOCAL where id_persona = $id_persona) as correo_notif,

nvl((SELECT nombre_etapa FROM ca_det_liq_canon_tit_v@CAN.ANM.LOCAL where id_det_liq_canon = $id_det_liq_canon and vigencia = $vig_liq) , '$abreviacion') as etapa,
                        
nvl((SELECT descripcion FROM rvc_numero_pago where id_numero_pago = $anualidad) , $anualidad) as anualidad,
                        
to_char(to_date('$periodo_ini','yyyy-mm-dd'),'yyyy') as vigencia_ini,
to_char(to_date('$periodo_fin','yyyy-mm-dd'),'yyyy') as vigencia_fin,
lower(trim(to_char(sysdate,'dd','nls_date_language=spanish'))||' de '|| trim(to_char(sysdate,'Month','nls_date_language=spanish'))||' de '||trim(to_char(sysdate,'yyyy'))) AS fecha_actual

from dual    
   
where
to_date('$periodo_ini','yyyy-mm-dd') >= trunc(sysdate)    
EOD;
                //ejecuta el sql
                $resultado = CN_TABLE::executeSQL($sql);

                if (count($resultado) > 0) {

                    $vigencia_ini = $resultado[0]['vigencia_ini'];
                    $vigencia_fin = $resultado[0]['vigencia_fin'];
                    $fecha_actual = $resultado[0]['fecha_actual'];
                    $anualidad = $resultado[0]['anualidad'];
                    $etapa = $resultado[0]['etapa'];
                    $correo_notif = $resultado[0]['correo_notif'];

                    //DE
                    $report_params["email_envio"] = "canonenlinea@anm.gov.co";
                    $report_params["username"] = "canonenlinea";

                    //PARA
                    $report_params["email"] = $correo_notif;
                    $report_params["username_email"] = $num_doc;
                    //$report_params["email"] = "derly.rodriguez@anm.gov.co";
                    //$report_params["email"] = "lavila@sofhouse.net";              
                    //$report_params["email"] = "canonenlinea@anm.gov.co";          
                    $report_params["email"] = "websafi@anm.gov.co";

                    $id_referencia2 = '';
                    if (isset($request['id_referencia2'])) {
                        $id_referencia2 = $request['id_referencia2'];
                    }
                    $valor_total = 0;
                    if (isset($request['valor_total'])) {
                        $valor_total = $request['valor_total'];
                    }
                    $fecha_vence_rec = $request['fecha_vence_rec'];

                    /**
                     * PHPMailer
                     */
                    // Instanciar PHPMailer una primera Vez
                    $mail = new PHPMailer(); // defaults to using php "mail()"

                    /*
                     * Sofhouse
                     */
                    /* $mail->IsSMTP(); // telling the class to use SMTP
                      $mail->SMTPSecure = "";
                      $mail->Host = "correo.sofhouse.net";      // SMTP server
                      //$mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
                      // 1 = errors and messages
                      // 2 = messages only
                      $mail->SMTPAuth = false;                  // enable SMTP authentication
                      $mail->Port = 25;                    // set the SMTP port for the GMAIL server
                      //            $mail->Username = "alexia.velasquez@sofhouse.net";              // SMTP account username
                      //            $mail->Password = "51s4em@s";           // SMTP account password
                      $mail->Username = "servicios";              // SMTP account username
                      $mail->Password = "a95NRBC7";           // SMTP account password
                      $mail->SetFrom($report_params["email_envio"], utf8_decode('Notificacion Websafi'));
                      //$mail->AddReplyTo($report_params["email_envio"], utf8_decode('Facturacion Websafi'));
                      $mail->AddAddress($report_params["email_envio"], utf8_decode('Notificacion Websafi')); */

                    /*
                     * ANM
                     */
                    //$mail->IsSMTP(); // telling the class to use SMTP
                    //$mail->Host       = "mail.yourdomain.com"; // SMTP server
                    $mail->IsSMTP(); // telling the class to use SMTP
                    $mail->SMTPSecure = "tls";
                    $mail->Host = "10.0.100.46";      // SMTP serverP debug information (for testing)
                    // 1 = errors and messages
                    // 2 = messages only
                    $mail->SMTPAuth = false;                  // enable SMTP authentication
                    $mail->Port = 25;                    // set the SMTP port for the GMAIL server
                    $mail->Username = "canonenlinea";              // SMTP account username
                    $mail->Password = "agencia2017";           // SMTP account password
                    $mail->SetFrom($report_params["email_envio"], utf8_decode('Notificacion Websafi'));
                    $mail->SMTPOptions = array(
                        'ssl' => array(
                            'verify_peer' => false,
                            'verify_peer_name' => false,
                            'allow_self_signed' => true
                        )
                    );

                    //$mail->AddReplyTo($report_params["email_envio"], utf8_decode('Facturacion Websafi'));
                    $mail->AddAddress($report_params["email_envio"], utf8_decode('Notificacion Websafi'));

                    $mail->Subject = utf8_decode("Recordatorio de pago - Canon Superficiario, Titulo: " . $id_referencia2);


                    $address = $report_params["email"];
                    $mail->AddBCC($address, $report_params["username_email"]);

                    /*
                     * body
                     */
                    //$body = "<html><body> Factura de .<br/><br/></body></html>";                
                    $body = <<<EOD
Bogotá, D.C., $fecha_actual                                                                                                               
<br/> 
<br/> 
<br/>
Señor (a) (es):
<br/><br/>
Titular Contrato de Concesión $id_referencia2
<br/>
<br/>
<br/>
Asunto: Recordatorio de pago - Canon Superficiario
<br/>
<br/> 
<br/> 
<br/>
Reciba un cordial saludo.
<br/>
<br/>
<p align="justify">Para la ANM, es esencial mantener una estrecha relación con nuestros titulares mineros y es por ello que hemos 
estado trabajando en la inclusión de nuevas estrategias que nos permitan una comunicación directa, ágil y 
oportuna con el gremio minero.</p>
<br/>
<p align="justify">Es por lo anterior, señor titular del contrato de concesión que deseamos recordarle que el próximo $fecha_vence_rec 
se da inicio al $anualidad año de la etapa $etapa de vigencia $vigencia_ini - $vigencia_fin, por lo que nos permitimos 
suma de $ $valor_total y así evitar incurrir en sanciones o posibles causales de caducidad de su título, 
afectación de póliza minera contractual, envío de las obligaciones pendientes a Cobro Coactivo de la entidad 
y las demás que se consideren necesarias a fin de lograr el recaudo de las obligaciones económicas pendientes.</p>
<br/>
<p align="justify">El pago de la obligación económica señalada la podrá efectuar de manera electrónica ingresando a nuestra página 
web <a href="https://tramites.anm.gov.co/Portal/pages/canon/terminosCondiciones.jsf">www.anm.gov.co</a> en la siguiente ruta: servicios en línea / "Tramites en línea - ventanilla única" / <b>Pago 
de canon superficiario (<a href="https://tramites.anm.gov.co/Portal/pages/canon/terminosCondiciones.jsf">clic aquí</a>)</b>. En esta opción deberá diligenciar todos los campos de carácter 
obligatorio, posteriormente descargue el recibo con código de barras para presentarlo en cualquier oficina 
de Banco de Bogotá a nivel nacional u optar por la opción de pagos mediante sistema PSE.</p>
<br/>
<p align="justify">Con gusto estaremos prestos en atenderle en caso de que requiera aclaraciones sobre el particular o información 
adicional; para lo cual podrá comunicarse en Bogotá con la línea telefónica 2201999 a la Ext. 5018 ó al 
correo electrónico <a href="mailto:canonenlinea@anm.gov.co">canonenlinea@anm.gov.co</a>.</p>
<br/>
Cordialmente,
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<b>PABLO ROBERTO BERNAL LÓPEZ</b>
<br/>
<br/>
<b>Gerente de Proyectos - Grupo de Regalías y Contraprestaciones Económicas</b>
<br/>
<br/>
<br/>
<br/>
<p align="center">Bogotá D.C., Avenida Calle 26 No. 59 - 51 Pisos 8, 9 y 10. Teléfono: (571) 2201999</p>
<br/>
<p align="center">Web: http//:www.anm.gov.co</p>
<br/> 
EOD;

                    $mail->MsgHTML(utf8_decode($body));
//                    $mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

                    /*
                     *  Enviar el correo
                     */
                    if (!$mail->Send()) {
                        $this->logMessage("Mailer Error: " . $mail->ErrorInfo . "<br/>");
                    } else {
                        $this->logMessage("Correo enviado");
                    }

                    /*
                     * Limpiar datos del correo
                     */
                    $mail->ClearAllRecipients();
                    $mail->ClearAttachments();
                }
                $this->logMessage("FIN Envio de correo de notificación ND");
            }
        } catch (Exception $e) {

            $mensaje = "[DEBITO_CANON] ERROR!!!";

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

    /**
     * Crear debito
     * 
     * @param type $id_mae_ter
     * @param sfWebRequest $request
     * @return type 
     */
    public function crearDebito($id_mae_ter, sfWebRequest $request) {


        /*
         * Manejo de errores
         */
        try {

            //variables obligatorias
//            $id_anhos = $request['id_anhos'];
            $id_anhos = date('Y');
            $id_punto_venta = $request['id_punto_venta'];
            $id_tipo_debito = $request['id_tipo_debito'];
//            $id_mae_ter = $request['id_mae_ter'];
//            $fecha_proceso = $request['fecha_proceso'];
            $fecha_proceso = CN_TABLE::fechaSistema();
            //fecha_vence_rec fecha de vencimiento de canon para los debitos - 20130920
            $fecha_vence_rec = $request['fecha_vence_rec'];
            $dias_pago = $request['dias_pago'];
            $valor_bruto = $request['valor_bruto'];
            $valor_total = $request['valor_total'];
            $valor_moneda = $request['valor_moneda'];
            $trm_debito = $request['trm_debito'];


            //validar username
            if (isset($request['username'])) {
                $username = $request['username'];
            } else {
                if (isset($request['username_log'])) {
                    $username = $request['username_log'];
                } else {
                    $username = "Sin Identificar";
                }
            }

            //variables NO obligatorias
            $id_mae_ter_ven = 'null';
            if (isset($request['id_mae_ter_ven'])) {
                $id_mae_ter_ven = $request['id_mae_ter_ven'];
            }
            $id_tip_mon = 'null';
            if (isset($request['id_tip_mon'])) {
                $id_tip_mon = $request['id_tip_mon'];
            }
            $observaciones = 'null';
            if (isset($request['observaciones'])) {
                $observaciones = "'" . $request['observaciones'] . "'";
            }
            $id_pr_tipo_ingre = 'null';
            if (isset($request['id_pr_tipo_ingre'])) {
                $id_pr_tipo_ingre = $request['id_pr_tipo_ingre'];
            }


            $valor_dcto = 0;
            if (isset($request['$valor_dcto'])) {
                $valor_dcto = $request['$valor_dcto'];
            }
            $porcen_dcto = 0;
            if (isset($request['porcen_dcto'])) {
                $porcen_dcto = $request['porcen_dcto'];
            }
            $valor_iva = 0;
            if (isset($request['valor_iva'])) {
                $valor_iva = $request['valor_iva'];
            }


            $tiene_referencias = false;
            //varialbes de referencias
            $id_referencia1 = 'null';
            if (isset($request['id_referencia1'])) {
                $tiene_referencias = true;
                $id_referencia1 = $request['id_referencia1'];
            }

            $id_referencia2 = 'null';
            if (isset($request['id_referencia2'])) {
                $tiene_referencias = true;
                $id_referencia2 = $request['id_referencia2'];
            }

            //Variables para reliquidacion
            /*
             * ID_DEBITO_OLD
             * Vista ca_anual_etapa_deb_v para debitos a mas de una anual_etapa, id_debito_old mas de un registro - 20170710
             */
            if (isset($request['id_debito_old']) && $request['id_debito_old'] != 'null') {

                $this->reLiquida = 1;

                $idDebitoOld = $request['id_debito_old'];
                //consultar valor del debito antiguo
                $sql = <<<EOD

SELECT 
sum(VALOR_TOTAL) as VALOR_TOTAL 
FROM CA_DEBITO where id_debito in ( $idDebitoOld )     
EOD;

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

                /*
                 * Evaluar diferencia entre debito existente y el debito que se esta creando
                 * 1. Si el valor de la nueva liquidación es igual a la notá debido asociada previamente a la anualidad, 
                 * solo se modificará la observación de la nota débito.
                 * 2. Si el valor de la nueva liquidación excede el valor de la nota débito asociada previamente a la anualidad, 
                 * se creará una nueva nota débito por el valor de la diferencia.
                 * 3. Si el valor de la nueva liquidación es inferior a la nota débito asociada previamente a la anualidad, se evaluará la siguiente condición:
                 *  1. Si la nota débito no ha sido pagada, se generará una nota crédito en concepto del valor excedido. 
                 *  2. Si la nota débito ya ha sido pagada, no se podrá realizar la reliquidación, por lo que este caso deberá ser estudiado. 
                 */

                if (count($result) > 0) {
                    $valorActualDeb = $result[0]['valor_total'];

                    //Para todos los casos de reliquidacion se actualizan las observaciones de la nota debito vieja
                    $sql = <<<EOD
                                              
UPDATE CA_DEBITO
SET OBSERVACIONES     = OBSERVACIONES||' Modificado por reliquidación: '||$observaciones
WHERE ID_DEBITO       in ( $idDebitoOld ) 
EOD;

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

                    $sql = <<<EOD
                                              
UPDATE CA_DEBITO_DETALLE
SET OBSERVACIONES     = OBSERVACIONES||' Modificado por reliquidación: '||$observaciones
WHERE ID_DEBITO       in ( $idDebitoOld )    
EOD;

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



                    //Caso 1. Si el valor de la nueva liquidación es igual a la notá debido asociada previamente a la anualidad, 
                    //solo se modificará la observación de la nota débito.
                    if ($valor_total == $valorActualDeb) {
                        $this->logMessage("[DEBITO_CANON] Caso 1. Nota debito antigua No." . $idDebitoOld . " por valor de " . $valorActualDeb . " es igual al valor de la nueva liquidación, "
                                . "No se genera ND, se actualizan observaciones");

                        $this->creaDebito = 0;

                        //Caso 2. Si el valor de la nueva liquidación excede el valor de la nota débito asociada previamente a la anualidad, 
                        //se creará una nueva nota débito por el valor de la diferencia.
                    } elseif ($valor_total > $valorActualDeb) {
                        $this->logMessage("[DEBITO_CANON] Caso 2. Nota debito antigua No." . $idDebitoOld . " por valor de " . $valorActualDeb . " es menor al valor de la nueva "
                                . "liquidación " . $valor_total . " Se genera ND.");

                        $this->creaDebito = 1;
                        $diferencia = $valor_total - $valorActualDeb;

                        //recalcular el valor de la nota debito
                        $valor_bruto = $diferencia;
                        $valor_total = $diferencia;
                        $valor_moneda = $diferencia;
                        $observaciones = "'ND Autogenerada por exedente en la reliquidación '||" . $observaciones;
                        $this->observaciones = $observaciones;
                        $this->valorTotal = $diferencia;
                        //Caso 3. Si el valor de la nueva liquidación es inferior a la nota débito asociada previamente a la anualidad, se evaluará la siguiente condición:
                        //  a. Si la nota débito no ha sido pagada, se generará una nota crédito en concepto del valor excedido. 
                        //  b. Si la nota débito ya ha sido pagada, no se podrá realizar la reliquidación, por lo que este caso deberá ser estudiado.     
                    } else {
                        $this->logMessage("[DEBITO_CANON] Caso 3. Nota debito antigua No." . $idDebitoOld . " por valor de " . $valorActualDeb . " es mayor al valor "
                                . "de la nueva liquidación " . $valor_total . " TODO caso de creacion Nota credito");
                        $this->creaDebito = 0;
                    }
                } else {
                    //TODO ERROR DEBITO ANTIGUO NO EXISTENTE O INVALIDO!
                    $this->logMessage("[DEBITO_CANON] El débito es invalido o inexistente");
                    throw new Exception("El débito es invalido o inexistente");
                }
            }


            if ($this->creaDebito == 1) {
                /*
                 * OBTENER SECUENCIA PARA EL DEBITO
                 * si no esta creada crearla
                 */
                //sentencia sql
                $sql = <<<EOD
SELECT * FROM ca_consecutivo_deb
WHERE id_anhos = $id_anhos
AND id_punto_venta = $id_punto_venta
AND id_tipo_debito = $id_tipo_debito
EOD;

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

                //validar si hay registro de secuencia debito
                if (count($result) == 1) {

                    //valores de la secuencia debito
                    $sec_debito = $result[0]['consecutivo'] + 1;
                    $this->logMessage("[DEBITO_CANON] La secuencia = " . $sec_debito);
                } else {

                    $sec_debito = 1;
                    $this->logMessage("[DEBITO_CANON] La secuencia = " . $sec_debito);
                }

                /*
                 * VALIDAR SI SE GUARDAN LOS PERIODOS DEL DEBITO
                 */
                $periodo_ini = 'null';
                $periodo_fin = 'null';
                if ($tiene_referencias) {

                    if (isset($request['periodo_ini'])) {
                        $periodo_ini = " to_date('" . $request['periodo_ini'] . "','yyyy-mm-dd') ";
                    }
                    if (isset($request['periodo_fin'])) {
                        if ($request['periodo_fin'] != 'null' && $request['periodo_fin'] != '' && $request['periodo_fin'] != null) {
                            $periodo_fin = " to_date('" . $request['periodo_fin'] . "','yyyy-mm-dd') ";
                        }
                    }
                }


                //sentencia sql ingresar CA_DEBITO
                //to_date('$fecha_proceso','yyyy-mm-dd'), se deja con sysdate - 20190117
                $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)
    values (null,$id_anhos,$id_punto_venta,$id_tipo_debito,$sec_debito,$id_mae_ter, 
            trunc(sysdate),$dias_pago,$valor_bruto,$valor_iva,$valor_dcto,$porcen_dcto,$valor_total,$id_mae_ter_ven,
            $observaciones,$id_tip_mon,$valor_moneda,$trm_debito,1,null,null,$periodo_ini,$periodo_fin,
                '$username', $id_pr_tipo_ingre,to_date('$fecha_vence_rec','yyyy-mm-dd'))
EOD;

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

                /*
                 * INICIO ACTUALIZAR SECUENCIA DEBITO
                 */
                if (count($result) == 1) {
                    $this->logMessage("[DEBITO_CANON] La secuencia existe.");

                    //valores de la secuencia debito
                    $sec_debito = $result[0]['consecutivo'] + 1;
                    $id_consecutivo_deb = $result[0]['id_consecutivo_deb'];

                    //sentencia sql actualizar valores  de secuencia debito
                    $sql = <<<EOD
UPDATE CA_CONSECUTIVO_DEB SET consecutivo = $sec_debito  WHERE id_consecutivo_deb = $id_consecutivo_deb
EOD;

                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);
                    $this->logMessage("[DEBITO_CANON] SQL de actualizacion secuencia debito: " . $sql);
                } else {
                    $this->logMessage("[DEBITO_CANON] La secuencia NO existe.");

                    $sec_debito = 1;

                    //sentencia sql
                    $sql = <<<EOD
Insert into CA_CONSECUTIVO_DEB (ID_CONSECUTIVO_DEB,ID_TIPO_DEBITO,ID_ANHOS,ID_PUNTO_VENTA,CONSECUTIVO) 
                values ( null, $id_tipo_debito, $id_anhos, $id_punto_venta, $sec_debito)
EOD;
                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);
                    $this->logMessage("[DEBITO_CANON] SQL de creacion secuencia debito: " . $sql);
                }

                /*
                 * FIN ACTUALIZAR SECUENCIA DEBITO
                 */

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

                        $this->logMessage("[DEBITO_CANON] 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_debito)
EOD;
                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);
                    } else {

                        $this->logMessage("[DEBITO_CANON] No Crear registro TRM.");
                    }
                }
            }

            //Caso en el que es una reliquidacion y se crea una nueva nota debito
            if ($this->reLiquida == 1 && $this->creaDebito == 1) {
                //Devuelve dos ND
                // ultimo registro insertado CA_DEBITO
                $sql = <<<EOD
select * from(                        
select * from CA_DEBITO
where id_debito = (
      select
      --max (id_debito)
      id_debito
      from CA_DEBITO
      where
      id_anhos = $id_anhos
      AND id_punto_venta = $id_punto_venta
      AND id_tipo_debito = $id_tipo_debito
      AND sec_debito = (
              SELECT CONSECUTIVO
              FROM ca_consecutivo_deb
              WHERE id_anhos = $id_anhos
              AND id_punto_venta = $id_punto_venta
              AND id_tipo_debito = $id_tipo_debito
      )
)
and id_anhos = $id_anhos
AND id_punto_venta = $id_punto_venta
AND id_tipo_debito = $id_tipo_debito
union 
select * from CA_DEBITO
where id_debito in ( $idDebitoOld ))tab0
order by id_debito desc                        
                        
EOD;
                //ejecuta y obtiene el resultado del sql
                $resultado = CN_TABLE::executeSQL($sql);
//            $this->logMessage("SQL DEBITO nueva. " . $sql);
            } else if ($this->reLiquida == 1 && $this->creaDebito == 0) {
                //caso en el que es una reliquidacion pero no se crea una nota debito
                //Si edita ND DEBITO el retorno sera el debito existente y no el ultimo creado
                //consulta el debito que ya existe y NO el ultimo creado
                $sql = <<<EOD
select * from CA_DEBITO
where id_debito in ( $idDebitoOld )
EOD;
                //ejecuta y obtiene el resultado del sql
                $resultado = CN_TABLE::executeSQL($sql);
            } else {//caso en el que no es una reliquidacion
                // ultimo registro insertado CA_DEBITO
                $sql = <<<EOD
select * from CA_DEBITO
where id_debito = (
      select
      --max (id_debito)
      id_debito
      from CA_DEBITO
      where
      id_anhos = $id_anhos
      AND id_punto_venta = $id_punto_venta
      AND id_tipo_debito = $id_tipo_debito
      AND sec_debito = (
              SELECT CONSECUTIVO
              FROM ca_consecutivo_deb
              WHERE id_anhos = $id_anhos
              AND id_punto_venta = $id_punto_venta
              AND id_tipo_debito = $id_tipo_debito
      )
)
and id_anhos = $id_anhos
AND id_punto_venta = $id_punto_venta
AND id_tipo_debito = $id_tipo_debito
EOD;
                //ejecuta y obtiene el resultado del sql
                $resultado = CN_TABLE::executeSQL($sql);
//            $this->logMessage("SQL DEBITO nueva. " . $sql);
            }



            /*
             * Verifica que sea un registro para insertar las referencias del debito
             * y vienen registros para las referenciass
             */
            if (count($resultado) > 0 && $this->creaDebito == 1) {

                $id_debito = $resultado[0]['id_debito'];

                /*
                 * INICIO registro saldo nuevo por vencimiento
                 */ {

                    //obtener vencimiento nuevo
                    //sentencia sql
                    $sql = <<<EOD
SELECT * FROM CA_VENCIMIENTOS
WHERE id_debito = $id_debito
EOD;

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

                    //validar si hay registro de VENCIMIENTO
                    if (count($result) == 1) {

                        //valores de VENCIMIENTO
                        $id_vencimiento = $result[0]['id_vencimiento'];
                        $valor = $result[0]['valor'];

                        //registrar saldo nuevo
                        //sentencia sql
                        $sql = <<<EOD
Insert Into Ca_Saldos (Id_Debito, Id_Vencimiento, Id_Anhos, Id_Meses, Saldo_Anterior, Debitos_Mes, Creditos_Mes, Saldo_Actual)
    Values ( $id_debito, $id_vencimiento, $id_anhos,  Extract(Month From to_date('$fecha_proceso','yyyy-mm-dd') ), 0, $valor, 0, $valor)
EOD;
                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);
                        $this->logMessage("[DEBITO_CANON] SQL de creacion saldo vencimientos: " . $sql);
                    } else {

                        $mensaje = "[DEBITO_CANON] El vencimiento no existe.";
                        $this->status = 1;
                        $this->mensajeError = $mensaje;
                        $this->logMessage($mensaje);
                    }
                }
                /*
                 * FIN registro saldo nuevo por vencimiento
                 */

                /*
                 * INICIO variables por defecto para el registro de log
                 */ {
                    //obtiene el valor para su identificador unico
                    $id_tabla = $id_debito;

                    //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_DEBITO');

                    //3 - indica operacion de adicionar 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'])) {
                        if ($request['username'] != '') {
                            $usuario = $request['username'];
                        }
                    } elseif (isset($request['username_log'])) {
                        if ($request['username_log'] != '') {
                            $usuario = $request['username_log'];
                        }
                    }
                    //Obtener id_mae_ter por usuario
                    //sentencia sql
                    $sql = <<<EOD
select * from INTERCEROS where num_doc = (select num_doc from usuario where username = '$usuario') 
EOD;
                    //ejecuta el sql
                    $rec = CN_TABLE::executeSQL($sql);
                    if (count($rec) > 0) {
                        $id_mae_ter = $rec[0]['id_mae_ter'];
                    }


                    //comando que identifica la funcionalidad
                    $comando = 'sin comando';
                    if (isset($request['comando'])) {
                        $comando = $request['comando'];
                    }

                    /*
                     * Construir observacion
                     */
                    $observacion = "'Se adiciono id_debito : " . $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'];
                    }
                }
                /*
                 * FNI 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);

                if ($tiene_referencias) {
                    //sentencia sql
                    $sql = <<<EOD
Insert into CA_DEBITO_REF values ( $id_debito, $id_referencia1, '$id_referencia2')
EOD;
                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);
                    $this->logMessage("[DEBITO_CANON] SQL de las referencias del debito: " . $sql);
                }
            }

            $this->logMessage("[DEBITO_CANON] Total filas: " . count($resultado));
            return $resultado;
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "[DEBITO_CANON] ERROR!!!";
            $this->logMessage("[DEBITO_CANON] ERROR!!!");
            $this->logMessage($e->getMessage());
            return array();
        }
    }

    /**
     * Crear debito detalle
     * 
     * @param type $id_debito
     * @param sfWebRequest $request 
     */
    public function crearDebitoDetalle($id_debito, sfWebRequest $request) {

        /*
         * Manejo de errores
         */
        try {

            /*
             * Variables Obligatorias
             */
            $id_producto = $request['id_producto'];
            $cantidad = $request['cantidad'];
            $valor_unitario = $request['valor_unitario'];
            $valor_total = $request['valor_total'];

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

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

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

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

            $por_iva = 0;
            if (isset($request['por_iva'])) {
                $por_iva = $request['por_iva'];
            }
            $idDebitoOld = $request['id_debito_old'];
            //Caso en el que la reliquidacion de como resultado una nueva ND
            if ($this->reLiquida == 1 && $this->creaDebito == 1) {
                $valor_unitario = $this->valorTotal;
                $valor_total = $this->valorTotal;
                $observaciones = $this->observaciones;
            }

            if ($this->creaDebito == 1) {
                /*
                 * Registro debito detalle
                 */
                $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) 
values ( null, $id_debito, $id_producto, $cantidad, 
            $valor_unitario, $valor_iva, $valor_dcto, $porcen_dcto, $valor_total, $observaciones, $por_iva ) 
EOD;
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);
                $this->logMessage("[DEBITO_CANON] Se registro debito detalle.");
            }
//            else {
//                //Actualiza debito viejo
//                //Vista ca_anual_etapa_deb_v para debitos a mas de una anual_etapa, id_debito_old mas de un registro - 20170710
//
//                $sql = <<<EOD
//                             
//UPDATE CA_DEBITO_DETALLE
//SET OBSERVACIONES     = OBSERVACIONES||' Modificado por reliquidación: '||$observaciones
//WHERE ID_DEBITO       in ( $idDebitoOld )
//
//EOD;
//                //ejecuta el sql
//                CN_TABLE::executeSQL($sql);
//            }
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "[DEBITO_CANON] ERROR!!!";
            $this->list_data = array();
            $this->logMessage("[DEBITO_CANON] 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;
    }

}
