<?php

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

    protected $table_names = array(
        'CA_DEBITO',
        'CA_DEBITO_REF',
        'CA_PUNTO_VENTA',
        'CA_EJE_CUE_VEN_PUNTO',
        'CA_TIPO_DEBITO',
        'RE_MINERAL',
        'INTERCEROS_V',
        'CA_TIP_MON',
        'USUARIO',
        'CA_DEBITO_DETALLE',
        'CA_PRODUCTO'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'CA_DEBITO_REF,LEFT' =>
        array(
            'id_debito' => 'CA_DEBITO'
        ),
        'CA_PUNTO_VENTA' =>
        array(
            'id_punto_venta' => 'CA_DEBITO'
        ),
        'CA_TIPO_DEBITO' =>
        array(
            'id_tipo_debito' => 'CA_DEBITO'
        ),
        'CA_TIP_MON' =>
        array(
            'id_tip_mon' => 'CA_DEBITO'
        ),
        'RE_MINERAL,LEFT' =>
        array(
            'id_referencia1-id_mineral' => 'CA_DEBITO_REF'
        ),
        'INTERCEROS_V' =>
        array(
            'id_mae_ter' => 'CA_DEBITO'
        ),
        'CA_EJE_CUE_VEN_PUNTO,LEFT' =>
        array(
            'id_mae_ter_ven-id_mae_ter' => 'CA_DEBITO'
        ),
        'USUARIO,LEFT' =>
        array(
            'usuariolog-username' => 'CA_DEBITO'
        ),
        'CA_DEBITO_DETALLE' =>
        array(
            'id_debito' => 'CA_DEBITO'
        ),
        'CA_PRODUCTO' =>
        array(
            'id_producto' => 'CA_DEBITO_DETALLE'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CA_DEBITO' =>
        array(
            'id_debito' => 'id_debito',
            'id_anhos' => 'id_anhos',
            'id_punto_venta' => 'id_punto_venta',
            'id_tipo_debito' => 'id_tipo_debito',
            'sec_debito' => 'sec_debito',
            'id_mae_ter' => 'id_mae_ter',
            'fecha_proceso' => 'fecha_proceso',
            'fecha_vencimiento' => 'fecha_vencimiento',
            'dias_pago' => 'dias_pago',
            'valor_bruto' => 'valor_bruto',
            'valor_iva' => 'valor_iva',
            'valor_dcto' => 'valor_dcto',
            'porcen_dcto' => 'porcen_dcto',
            'valor_total' => 'valor_total',
            'id_mae_ter_ven' => 'id_mae_ter_ven',
            'observaciones' => 'observaciones',
            'id_tip_mon' => 'id_tip_mon',
            'valor_moneda' => 'valor_moneda',
            'trm_debito' => 'trm_debito',
            'estado' => 'estado',
            'fecha_anu' => 'fecha_anu',
            'motivo_anu' => 'motivo_anu',
            'periodo_ini' => 'periodo_ini',
            'periodo_fin' => 'periodo_fin',
            'usuariolog' => 'usuariolog',
            'id_pr_tipo_ingre' => 'id_pr_tipo_ingre',
            'orden_servicio' => 'orden_servicio',
            'id_interceros_contacto' => 'id_interceros_contacto',
            'id_tipo_factura' => 'id_tipo_factura',
            'usuario_anu' => 'usuario_anu'
        ),
        'CA_DEBITO_REF' =>
        array(
            'id_referencia1' => 'id_referencia1',
            'id_referencia2' => 'id_referencia2',
            'id_referencia2,||,id_referencia1' => 'titulo_minero'
        ),
        'CA_PUNTO_VENTA' =>
        array(
            'nombre' => 'punto_venta'
        ),
        'CA_TIPO_DEBITO' =>
        array(
            'descripcion' => 'tipo_debito'
        ),
        'CA_TIP_MON' =>
        array(
            'codigo' => 'codigo_tm',
            'descripcion' => 'tipo_moneda',
            'simbolo' => 'simbolo',
            'local' => 'local',
            'abrev_fac' => 'abrev_fac'
        ),
        'RE_MINERAL' =>
        array(
            'cod_mineral,||,descripcion' => 'mineral',
            'cod_mineral,||, ,||,descripcion' => 'mineral_completo'
        ),
        'INTERCEROS_V' =>
        array(
            'num_doc' => 'num_doc',
            'razon_soc' => 'razon_soc',
            'num_doc,||, - ,||,razon_soc' => 'tercero',
            'num_doc,||, - ,||,papellido,||,  ,||,sapellido,||, ,||,pnombre,||, ,||,snombre' => 'nombre_completo',
        ),
        'CA_EJE_CUE_VEN_PUNTO' =>
        array(
            'num_doc' => 'num_doc_ven',
            'razon_soc' => 'razon_soc_ven',
            'num_doc,||, - ,||,razon_soc' => 'vendedor'
        ),
        'USUARIO' =>
        array(
            'num_doc' => 'num_doc_usuario',
            'nombre,||, ,||,apellido' => 'nombre_usuario',
            'num_doc,||, - ,||,nombre,||, ,||,apellido' => 'completo_usuario'
        )
    ); //por cada tabla especificar los campos del select
    protected $table_field_conditions = array(
        'CA_DEBITO' => array(
//            'id_debito,a' => array('!=' => array(-1)),
            'id_debito' => array('=' => array('id_debito')),
            'id_anhos' => array('=' => array('id_anhos')),
            'id_punto_venta' => array('=' => array('id_punto_venta')),
            'id_tipo_debito' => array('=' => array('id_tipo_debito')),
            'id_tipo_factura' => array('=' => array('id_tipo_factura')),
            'sec_debito' => array('LIKE' => array('sec_debito')),
            'id_mae_ter' => array('=' => array('id_mae_ter')),
            'fecha_proceso' => array('BETWEENFECHA' => array('fecha_ini', 'fecha_fin')),
            'fecha_anu' => array('BETWEENFECHA' => array('fecha_ini_anu', 'fecha_fin_anu')),
            'id_mae_ter_ven' => array('=' => array('id_mae_ter_ven')),
            'id_tip_mon' => array('=' => array('id_tip_mon')),
            'estado' => array('=' => array('estado')),
            'valor_total,a' => array('>=' => array('valor_ini')),
            'valor_total,b' => array('<=' => array('valor_fin')),
            'valor_total,c' => array('=' => array('valor_exacto')),
            'id_interceros_contacto' => array('=' => array('id_interceros_contacto')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        ),
        'CA_DEBITO_REF' => array(
            'id_referencia2' => array('=' => array('id_referencia2')),
        ),
        'CA_PRODUCTO' => array(
            'aplica_intereses' => array('=' => array('aplica_intereses')),
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $table_field_or_conditions = array(
        'CA_DEBITO' => array(
            'id_tipo_debito,a' => array('=' => array('tipo_debito_a')),
            'id_tipo_debito,b' => array('=' => array('tipo_debito_b')),
            'id_tipo_debito,c' => array('=' => array('tipo_debito_c'))
        )
    ); // filtros de condicion or
    protected $query_qualifier = 'DISTINCT'; //eliminar filas repetivas de consulta sql
    protected $fields_orderBy = array(
        'id_anhos', '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;


    /*
     * ------------VARIABLES PARA SERVICIO DE SUMATORIA - SUM
     *
     */
    protected $summatory_data = array(
        'CA_DEBITO' => array(
            'fields' => array(
                'case  when estado = 1 then valor_bruto  else 0 end#valor_bruto',
                'case  when estado = 1 then valor_iva  else 0 end#valor_iva',
                'case  when estado = 1 then valor_dcto  else 0 end#valor_dcto',
                'case  when estado = 1 then valor_total  else 0 end#valor_total',
                'case  when estado = 1 then valor_moneda  else 0 end#valor_moneda',
                'trm_debito'),
            'labels' => array('id_anhos,Total'),
            'count' => 'sec_debito'
        ),
    ); //se especifica por tabla los campos de suma y condiciones de filtro


    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_debito'; //identificador de la tabla
    protected $id_names = array('id_debito'); //llave primaria
    protected $field_names = array('id_anhos', 'id_punto_venta', 'id_tipo_debito', 'sec_debito', 'id_mae_ter', 'fecha_proceso', 'fecha_vencimiento', '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', 'orden_servicio', 'id_interceros_contacto', 'id_tipo_factura', 'usuario_anu'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'CA_DEBITO'; //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_debito'; //identificador unico de la tabla

    /**
     * Metodo para add 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");

        $mensaje_tope = "";
        $status = 0;

        //manejo de errores
        try {

            /*
             * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
             */
            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                //echo $routeName . "\n";
                if ('entidad_cliente' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $entidadCliente = $value;
                        }
                    }
                }
                $int++;
            }

            //variables obligatorias
            if (isset($request['id_anhos'])) {
                $id_anhos = $request['id_anhos'];
            } else {
                $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_vencimiento = $request['fecha_vence'];
            $dias_pago = $request['dias_pago'];
            $valor_bruto = $request['valor_bruto'];
            $valor_iva = $request['valor_iva'];
            $valor_total = $request['valor_total'];
            $valor_moneda = $request['valor_moneda'];
            $trm_debito = $request['trm_debito'];

            /**
             * Validar valor tope debito - 20200529::LAVILA
             */
            //sentencia sql
            $sql = <<<EOD
SELECT
    *
FROM CA_PARAM_CARTERA

where
parametro = 'VALOR_TOPE_DEB' 
EOD;

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

            //validar si hay registro de VALOR_TOPE_DEB
            if (count($result) > 0) {
                $this->logMessage("Si hay registro VALOR_TOPE_DEB");

                $valor_tope_deb = $result[0]['valor'] * 1;

                if ($valor_tope_deb > 0) {
                    $this->logMessage("Es mayor de 0 VALOR_TOPE_DEB");

                    if ($valor_total <= $valor_tope_deb) {

                        $mensaje_tope = "NO SE PERMITE EL REGISTRO DE NOTAS DÉBITO POR VALOR MENOR A ($valor_tope_deb), EN CUMPLIMIENTO DE POLITICA CONTABLE REFERENTE A LA MATERIALIDAD.";

                        $this->logMessage("El valor total($valor_total) es menor o igual al valor de tope parametrizado del debito/factura($valor_tope_deb).");

                        $status = 3;

                        throw new Exception($mensaje_tope);
                    }
                } else {

                    $this->logMessage("Es 0 VALOR_TOPE_DEB");
                }
            }


            //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'];
            }
            //Incidente #4896, nuevo tipo de factura BIP - 20161101
            $orden_servicio = 'null';
            if (isset($request['orden_servicio'])) {
                $orden_servicio = "'" . $request['orden_servicio'] . "'";
            }
            //Incidente #4896, nuevo id_interceros_contacto - 20161108
            $id_interceros_contacto = 'null';
            if (isset($request['id_interceros_contacto'])) {
                $id_interceros_contacto = $request['id_interceros_contacto'];
            }
            $id_tipo_factura = '1';
            if (isset($request['id_tipo_factura'])) {
                $id_tipo_factura = $request['id_tipo_factura'];
            }

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

            /*
             * 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] La secuencia = " . $sec_debito);
            } else {

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

            /**
             * Si en ANM y punto de venta 62, usa el consecutivo de caja de POS id punto venta-102 - 20190321
             * Se valida tipo 1	FACTURA - 20200504::LAVILA
             */
            if ($entidadCliente == 2 && $id_punto_venta == 62 && $id_tipo_debito == 1) {

                $this->logMessage("Si en ANM y punto de venta 62, usa el consecutivo de caja de POS id punto venta-102");

                $id_punto_venta_pos = 102;
                $sql = <<<EOD
select * from ca_consecutivo_caja where id_punto_venta = $id_punto_venta_pos   
EOD;
                //ejecuta el sql
                //$this->conn->execute($sql);
                $resultado_punt = CN_TABLE::executeSQL($sql);

                $id_caja = $resultado_punt[0]['id_caja'];
                $consec_fac = $resultado_punt[0]['consec_fac'] + 1;
                $sesion_caja = $resultado_punt[0]['sesion_caja'];

                //Actualiza el consecutivo, este se vuelve a modificar al insertar la factura_pos - 20160223      
                $sql = <<<EOD
update ca_consecutivo_caja set consec_fac = $consec_fac 
where id_punto_venta = $id_punto_venta_pos and id_caja = $id_caja 
EOD;
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);

                //Nuevo consecutivo para debito
                $sec_debito = $consec_fac;
            }

            /*
             * 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'])) {
                    $periodo_fin = " to_date('" . $request['periodo_fin'] . "','yyyy-mm-dd') ";
                }
            }

            //Si email_web no es vacio lo guarda en el debito y lo toma para abaco - 20190322
            $email_web = "";
            if (isset($request['email_web'])) {
                $email_web = $request['email_web'];
            }


            //sentencia sql ingresar CA_DEBITO
            $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,EMAIL_WEB)
    values (null,$id_anhos,$id_punto_venta,$id_tipo_debito,$sec_debito,$id_mae_ter, 
        to_date('$fecha_proceso','yyyy-mm-dd'),$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_vencimiento','yyyy-mm-dd'),$orden_servicio,$id_interceros_contacto,$id_tipo_factura,'$email_web')
EOD;

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

            /*
             * INICIO ACTUALIZAR SECUENCIA DEBITO
             */
            if (count($result) == 1) {
                $this->logMessage("[DEBITO] 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] SQL de actualizacion secuencia debito: " . $sql);
            } else {
                $this->logMessage("[DEBITO] 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] 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] 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] No Crear registro TRM.");
                }
            }
            /*
             * FIN CREAR TRM
             */

            // 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) == 1) {

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


                /**
                 * Incidente #10372, Generar registro detalle ABACO - 20190321
                 * Se valida tipo 1	FACTURA - 20200504::LAVILA
                 */
                if ($entidadCliente == 2 && $id_punto_venta == 62 && $id_tipo_debito == 1) {

                    /*
                     * Verificar tipo_debito 1-factura - 20191113
                     */
                    $sql = <<<EOD
SELECT * FROM ca_debito where id_debito = $id_debito and id_tipo_debito = 1 
EOD;
                    $results_tip = CN_TABLE::executeSQL($sql);

                    if (count($results_tip) > 0) {
                        $this->logMessage("[DEBITO] Incidente #10372, Generar registro detalle ABACO");

                        $sql = <<<EOD
Insert into CA_FACTURA_ABACO (ID_DEBITO,USUARIO,FECHA_LOG,IDINVOICE,MESSAGE,SUCCESSFUL_TXT,IDREQUEST,
    ESTADO_ABACO,FECHA_ABACO,ESTADO_CORREO,FECHA_CORREO) 
values ('$id_debito','websafi',sysdate,'$consec_fac',null,'false',null,
    '0',null,'0',null)
EOD;
                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);
                    }
                }

                /*
                 * 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] SQL de creacion saldo vencimientos: " . $sql);
                    } else {

                        $mensaje = "[DEBITO] 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']) && $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_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
                    //Se quitan espacios en blanco del titulo - 20200313
                    $sql = <<<EOD
Insert into CA_DEBITO_REF values ( $id_debito, $id_referencia1, replace('$id_referencia2',' ','') )
EOD;
                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);
                    $this->logMessage("[DEBITO] SQL de las referencias del debito: " . $sql);
                }
            }

            $this->list_data = $resultado;
            $this->logMessage("Total filas: " . count($resultado));
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "ERROR!!! " . $mensaje_tope;

            if ($status != 0) {
                $this->status = $status;
                $this->mensajeError = $mensaje_tope;
            }
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Metodo para anular el debito
     *
     * @param sfWebRequest $request
     */
    public function executeRemove(sfWebRequest $request) {

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

        /*
         * Manejo de errores
         */
        try {

            //variables obligatorias
            $id_debito = $request['id_debito'];
            $fecha_sistema = $request['fecha_proceso'];
//            $fecha_sistema = CN_TABLE::fechaSistema();
            $motivo_anu = 'null';
            if (isset($request['motivo_anu'])) {
                if ($request['motivo_anu'] != 'null') {
                    $motivo_anu = "'" . $request['motivo_anu'] . "'";
                } else {
                    $motivo_anu = 'null';
                }
            }

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

            //5 - indica operacion de anulacion de registro
            $id_ope_bd = 5;

            //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'];
            }
            $usuario_anu = $usuario;
            //comando que identifica la funcionalidad
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }

            /*
             * Construir observacion
             */
            $observacion = "'Se anulo 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
             */

            $resultado = array();

            /*
             * Validar si no posee creditos activos para el vencimientos del debito
             * Incidente #4228 <-> Se quita validacion "and ven.cancelado = 0", ya que se anula si tiene credito activo - 20160817
             */
            //sentencia sql
            $sql = <<<EOD
/*Obtener los registros asociados a un debito,
por los vencimientos al credito*/
select
*
from ca_debito deb

join ca_vencimientos ven
on deb.id_debito = ven.id_debito
and ven.estado = 1
--and ven.cancelado = 0

join ca_credito_detalle credet
on ven.id_vencimiento = credet.id_vencimiento

join ca_credito cre
on credet.id_credito = cre.id_credito
and cre.estado = 1

where
deb.id_debito = $id_debito
and deb.estado = 1
EOD;

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

            if (count($result) == 0) {
                $this->logMessage("[DEBITO] Se puede anular no existen creditos.");

                /*
                 * anular obligacion
                 */
                //sentencia sql
                $sql = <<<EOD
UPDATE CA_DEBITO SET estado = 0, fecha_anu = '$fecha_sistema', motivo_anu = $motivo_anu, usuario_anu = '$usuario_anu'
            WHERE id_debito = $id_debito
EOD;
//                $this->logMessage("---" . $sql);
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);

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

                /*
                 * anular vencimiento
                 */
                //sentencia sql
                $sql = <<<EOD
UPDATE CA_VENCIMIENTOS SET estado = 0, fecha_anu = '$fecha_sistema', motivo_anu = $motivo_anu
            WHERE id_debito = $id_debito
EOD;
//            $this->logMessage("---" . $sql);
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);



                //resultado del debito anulado
                $resultado[] = array(
                    'id_debito' => $id_debito,
                    'estado' => false,
                    'fecha_anu' => $fecha_sistema,
                    'motivo_anu' => $motivo_anu/* ,
                          'valor_bruto' => 0,
                          'valor_total' => 0 */
                );

                $this->list_data = $resultado;
                $this->logMessage("Se anulo el DEBITO.");
            } else {

                $this->status = 1;
                $this->mensajeError = "DEBITO no se puede anular, existen creditos.";
                $this->list_data = array();
                $this->logMessage("DEBITO no se puede anular, existen creditos.");
            }
        } catch (Exception $e) {

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

        /*
         * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
         */
        $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

        $int = 0;
        foreach ($array as $routeName => $routeData) {
            //echo $routeName . "\n";
            if ('entidad_cliente' == $routeName) {
                foreach ($routeData as $key => $value) {
                    //echo $value . "\n";
                    if ($key == 'value') {
                        $entidadCliente = $value;
                    }
                }
            }
            $int++;
        }

        /**
         * Segun entidad
         */
        if ($entidadCliente == 2) {
            try {
                //sentencia sql
                $sql = <<<EOD
SELECT
    *
FROM ca_factura_abaco
where
id_debito = $id_debito               
EOD;

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

                /**
                 * Llamado a abaco anulacion si aplica - 20190815
                 */
                if (count($result) > 0) {
                    $this->logMessage("Llamado a abaco anulacion si aplica");

                    //Llamado a abaco
                    $array_abaco = $this->llamadoAbaco($id_debito);
                }
            } catch (Exception $exc) {
                $this->logMessage("ERROR!!!");
                $this->logMessage($exc->getTraceAsString());
            }
        }
    }

    public function executeUpdate(sfWebRequest $request) {


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

        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        try {


            $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
            //ejecuta y obtiene el resultado del sql
            CN_TABLE::executeSQL($sql);



            //variables obligatorias
            $id_debito = $request['id_debito'];
            $fecha_vencimiento = $request['fecha_vencimiento'];


            $sql = <<<EOD
UPDATE CA_DEBITO SET fecha_vencimiento = '$fecha_vencimiento'
            WHERE id_debito = $id_debito
EOD;


            $this->conn->execute($sql);
            $mensaje = "Se edito correctamente la Fecha";

            $this->conn->commit();
            $this->list_data = array();
            $this->status = 0;
            $this->mensajeError = $mensaje;
        } catch (Exception $e) {

            $mensaje = "No se puede editar";
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array();
            $this->logMessage($mensaje);
            $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;
    }

    /**
     * Se hace llamado a Abaco Anulacion - 20190815
     * @param type $id_debito
     */
    public function llamadoAbaco($id_debito = null) {

        $id_debito_filtro = $id_debito;

        //Log especifico de procesos completos - 20160527
        $logPath = sfConfig::get('sf_log_dir') . '/factura_portal_abaco.log';
        $this->custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));

        $this->custom_logger->info("----------------------------------------BEGIN llamadoAbaco Anulacion. id_debito::" . $id_debito);
        $this->logMessage("----------------------------------------BEGIN llamadoAbaco Anulacion. id_debito::" . $id_debito);


        $id_tabla = $id_debito;
        $id_vigencia = 'null';
        $id_cen_op = 'null';
        $id_cia = 'null';

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

        //  1- CONSULTAR, 2- ACTUALIZAR, 3 - ADICIONAR, 4 - ELIMINAR, 5 - ANULAR
        $id_ope_bd = 5;
        //id del maestro tercero
        $id_mae_ter_log = 1;
        $usuario = 'admin';
        $comando = 'debito';
        //construir observacion
        $observacion = "'Se ingreso a generar llamadoAbaco anulacion.'";

        $id_punto_venta = '62';

        CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);

        try {

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

            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                //echo $routeName . "\n";
                if ('url_abaco' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $url_abaco = $value;
                        }
                    }
                }
                if ('ipServidorCorreo' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $ipServidorCorreo = $value;
                        }
                    }
                }
                if ('correoEnvio' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $correoEnvio = $value;
                        }
                    }
                }
                $int++;
            }


            //valores por defecto
            $message = '';
            $successful = 'false';
            $idrequest = '';
            $idInvoice = '';

            if (!is_null($id_debito_filtro)) {

                $whereFactura = 'and tab0.id_debito = ' . $id_debito_filtro;
                $idInvoice = $id_debito_filtro;
            }


            /**
             * For de ca_facturas_abaco sin procesar para el estado_abaco en 0
             * Se coloca validación para cuando no tiene nombre o apellido - 20190618
             * Se valida en el nombre del tercero las comillas dobles - 20190628
             */
            $sql = <<<EOD
select
tab0.*,
pos.sec_debito,
pos.observaciones,
DECODE(ter.id_tip_ter, 1, 2, 2, 1) as id_tip_ter,
ter.num_doc,
DECODE(ter.id_tipo_doc, 1,13, 26,22, 27,11, 28,12, 29,31, 31,41, 81,31) as id_tipo_doc,
nvl(ter.dv,digito_verificacion(ter.num_doc)) as dv,

upper(nvl(ter.direccion,'NA')) as direccion,
upper(ter.ciudad) as ciudad,
upper(nvl(dep.descripcion,11)) as departamento,
nvl(dep.coddepto,11) as coddepto,
upper( nvl(mun.codmun_text, nvl(mundep.codmun_text, case when dep.coddepto is null then '11001' else dep.coddepto||'001' end ) ) ) as codmun_text,
upper(replace(ter.razon_soc,'"','')) as razon_soc,
case when DECODE(ter.id_tip_ter, 1, 2, 2, 1) = 2 and ter.pnombre is null then upper(replace(ter.razon_soc,'"','')) else upper(replace(ter.pnombre,'"','')) end as pnombre,
upper(replace(ter.snombre,'"','')) as snombre,
case when DECODE(ter.id_tip_ter, 1, 2, 2, 1) = 2 and ter.papellido is null then upper(replace(ter.razon_soc,'"','')) else upper(replace(ter.papellido,'"','')) end as papellido,
ter.tel,
nvl( pos.email_web, nvl(ter.mail,ter.mail_con) ) as mail,

produc.codigo || ' ' || upper(produc.descripcion) as producto,
prod.valor_unitario + prod.valor_iva as valor_uni_bruto,
prod.valor_iva as valor_uni_iva,  
prod.valor_total as valor_uni_total,
prod.valor_unitario as valorsiniva_uni,          
prod.cantidad as cantidad,
prod.por_iva as por_iva,

produc.codigo,
to_char(pos.fecha_proceso,'dd/mm/yyyy') as fecha_facturacion,
upper(null) as caja,
upper(null) as banco,
null as cuenta,
upper(null) as tipo_pago,
upper(null) as oficina,
null as pin,

pos.valor_total - pos.valor_iva as valorsiniva,
pos.valor_iva,
pos.valor_total,
upper(numero_a_texto(pos.valor_total)) as valor_total_text,
                    
null as payment_code,
to_char(ven.fecha_vence,'dd/mm/yyyy') as payment_duedate,

ter.id_mae_ter,
nvl(tipores.codigo_dian,'"R-99-PN"') as codigo_dian  

from ca_factura_abaco tab0

left join ca_debito pos
on pos.id_debito = tab0.id_debito

left join ca_debito_detalle prod
on pos.id_debito = prod.id_debito

left join ca_producto produc
on produc.id_producto = prod.id_producto

left join interceros_du_dir_v ter
on ter.id_mae_ter = pos.id_mae_ter

left join departamento dep
on dep.coddepto = ter.copdepto

left join municipios mundep
on mundep.depto = dep.id_depto
and upper(mundep.municipio) = upper(ter.ciudad)

left join municipios mun
on mun.codmun = ter.codmun

left join ca_vencimientos ven
on ven.id_debito = pos.id_debito

left join(
    
    SELECT
    ter.id_mae_ter,
    LISTAGG( '"' || reg.codigo_dian || '"', ', ') WITHIN GROUP (ORDER BY reg.codigo_dian) as codigo_dian,
    LISTAGG(reg.descripcion, ';') WITHIN GROUP (ORDER BY reg.codigo_dian) as descripcion
    
    FROM (
    
        select distinct
        id_reg_tri,
        id_inf_tri
        from ts_res_tri     
    )tsreg
    
    left join ts_reg_tri reg
    on reg.id_reg_tri = tsreg.id_reg_tri
    
    left join intercer_dt terdt
    on tsreg.id_inf_tri = terdt.id_inf_tri
    
    left join interceros ter
    on ter.id_mae_ter = terdt.id_mae_ter
    
    where
    reg.codigo_dian is not null
    
    group by
    ter.id_mae_ter

)tipores
on tipores.id_mae_ter = ter.id_mae_ter

where
pos.estado = 0 
and tab0.estado_abaco = 1 
and tab0.anulado_abaco = 0 
and tab0.id_debito is not null 
$whereFactura 

order by
tab0.fecha_log                 
EOD;

            //ejecuta el sql
            $resultado = CN_TABLE::executeSQL($sql);
            foreach ($resultado as $value) {

                //Se agreaga sec_anulacion - 20190830
                $sql = <<<EOD
SELECT
nvl(max(sec_anulacion)+1,1) as sec_anulacion
FROM ca_factura_abaco             
EOD;

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

                $sec_anulacion = $resultado_sec[0]['sec_anulacion'];
                $this->logMessage("Procesar el llamadoAbaco sec_anulacion: " . $sec_anulacion);

                $id_debito = $value['id_debito'];

                $this->custom_logger->info("Procesar el llamadoAbaco anulacion id_debito: " . $id_debito);
                $this->logMessage("Procesar el llamadoAbaco anulacion id_debito: " . $id_debito);

                $sec_factura = $value['sec_debito'];
                $observaciones = $value['observaciones'];
                $id_tip_ter = $value['id_tip_ter'];
                $num_doc = $value['num_doc'];
                $id_tipo_doc = $value['id_tipo_doc'];
                $dv = $value['dv'];
                $direccion = $value['direccion'];
                $direccion = str_replace('"', '', $direccion);
                $ciudad = $value['ciudad'];
                $departamento = $value['departamento'];
                $coddepto = $value['coddepto'];
                $codmun_text = $value['codmun_text'];
                $razon_soc = $value['razon_soc'];
                $pnombre = $value['pnombre'];
                $snombre = $value['snombre'];
                $papellido = $value['papellido'];
                $tel = $value['tel'];
                $mail = $value['mail'];

                $producto = $value['producto'];
                $por_iva = $value['por_iva'];
                $valor_uni_bruto = $value['valor_uni_bruto'];
                $valor_uni_iva = $value['valor_uni_iva'];
                $valor_uni_total = $value['valor_uni_total'];
                //valores por cantidad - 20200625
                $valorsiniva_uni = $value['valorsiniva_uni'];
                $quantity = $value['cantidad'];
                $valorsiniva_unicant = $valorsiniva_uni * $quantity;
                $valor_uni_iva_cant = $valor_uni_iva * $quantity;

                $codigo = $value['codigo'];
                $fecha_facturacion = $value['fecha_facturacion'];
                $caja = $value['caja'];
                $banco = $value['banco'];
                $cuenta = $value['cuenta'];
                $tipo_pago = $value['tipo_pago'];
                $oficina = $value['oficina'];
                $pin = $value['pin'];

                $valorsiniva = $value['valorsiniva'];
                $valor_iva = $value['valor_iva'];
                $valor_total = $value['valor_total'];
                $valor_total_text = $value['valor_total_text'];

                /** Ejemplo de JSON - ABACO
                  {
                  "username" : "adm_anm@yopmail.com",				//[Usuario del ANM previamente creado en la plataforma. Este usuario cambia de ambiente de producción a ambiente de pruebas]
                  "password" : "G+AiJ1Cq84iauVtdWTuhLk/xBGR0cC1rR3n0tScwWyM=",      //[Contraseña de acceso asociado al usuario - SHA256 codificada Base 64 de la contraseña registrada en la plataforma]
                  "objectType" :0,                                                  //[FACTURA(0), NOTA_CREDITO(1), NOTA_DEBITO(2)]
                  "invoiceIdType" :1,						//[FACTURA_DE_VENTA(0), FACTURA_DE_COMPRA_VENTA(1)]
                  "idRange" :174,							//[Identificador del rango de facturación registrado en la plataforma Ábaco. Esta información cambia de ambiente de pruebas a ambiente de producción]
                  "idObject" :"4",							//[Identificador de la Factura generado por la plataforma WebSafi]
                  "idInvoiceType" :120,						//[Identificador de la plantilla PDF a utilizar. Esta información cambia de ambiente de pruebas a ambiente de producción]
                  "idNoteType" : null,						//[Identificador de la plantilla PDF a utilizar para notas crédito. Esta información cambia de ambiente de pruebas a ambiente de producción]
                  "signed" : false,							//[true si se va a firmar digitalmente la factura]
                  "send" : false,							//[true si se va a enviar a la DIAN]
                  "sendToCustomer" : false,						//[true si se va a enviar al cliente]
                  "notificationStrings" : ["EMAIL"],				//[Mecanismo de envío de la factura al cliente]
                  "description" :"descripción de la factura",			//[Descripción de la factura]
                  "currencyCode" :"COP",						//[Código de moneda]
                  "customer" : {
                  "personType" :1,							//[PERSONA_JURIDICA(1), PERSONA_NATURAL(2), GRAN_CONTRIBUYENTE(3)]
                  "personId" :"890903937",						//[No. de documento]
                  "idType" :31,							//[NIT(31), REGISTRO_CIVIL(11), TARJETA_DE_IDENTIDAD(12), CEDULA_DE_CIUDADANIA(13), TARJETA_DE_EXTRANJERIA(21), CEDULA_DE_EXTRANJERIA(22), PASAPORTE(41), DOCUMENTO_DE_IDENTIFICACION_EXTRANJERO(42), NUIP(91)]
                  "schemeType" :0,							//[REGIMEN_SIMPLIFICADO(0), REGIMEN_OTRO(1), REGIMEN_COMUN(2),REGIMEN_CLIENTE_EN_EL_EXTERIOR(-1)]
                  "address" :"CALLE 12 7 46",					//[Dirección del adquirente]
                  "city" :"Bogotá, D.C.",						//[Ciudad del adquirente]
                  "department" :"BOGOTÁ DC",					//[Departamento del adquirente]
                  "citySubDivision" :"",						//[Barrio o zona del adquirente]
                  "countryCode" :"CO",						//[Código del país]
                  "organizationName" :"BANCO COLPATRIA S.A.",			//[Razón social o nombre del adquirente]
                  "firstName" :"",							//[Primer nombre]
                  "middleName" :"",							//[Segundo nombre]
                  "lastName" :"",							//[Apellido]
                  "codePhoneNumber" :"",						//[Código telefónico del país. i.e. +57]
                  "cellPhone" :"",							//[Número celular]
                  "email" :"diego.bulla@software-colombia.com"			//[Correo electrónico]
                  },
                  "lines" : [ {
                  "description" :"CERTIFICADO DE REGISTRO MINERO DIGITAL ",         //[Descripción del item facturado No. 1]
                  "quantity" : 1,							//[Cantidad del ítem facturado No. 1]
                  "currencyCode" :"COP",						//[Código de moneda]
                  "unityPrice" : 69000.00,						//[Precio unitario]
                  "noteLine" : null,						//[Observaciones]
                  "accountingCost" : null,						//[Centro de costo]
                  "totalPrice" : 69000.00,						//[Precio total]
                  "taxes" : [{
                  "taxAmount": 100000.0,						//[Base para el cálculo del impuesto]
                  "taxEvidenceType": false,                                         //[true: Impuesto retenido - false: Impuesto no retenido]
                  "taxableAmount": 19000.0,                                         //[Valor del impuesto]
                  "percent": 19.0,							//[Procentaje del impuesto]
                  "currencyCode": "COP",						//[Código de moneda]
                  "taxTypeCode": "01"						//[VALOR_TOTAL_DE_IVA("01"), VALOR_TOTAL_DE_IMPUESTO_AL_CONSUMO("02"), VALOR_TOTAL_DE_ICA("03"), VALOR_TOTAL_DE_IMPUESTO_NACIONAL_AL_CONSUMO("04")]
                  }] ,
                  },{
                  "description": "Esferos",
                  "quantity": 1,
                  "currencyCode": "COP",
                  "unityPrice": 120000.0,
                  "noteLine": null,
                  "accountingCost": null,
                  "totalPrice": 120000.0,
                  "taxes": []
                  }
                  ],
                  "extraWSProperties" : {
                  "Codigo" : "SM-40",                                               //[Opcional: Nombre y valor de propiedades adicionales que no se enviarán a la DIAN pero sí se mostrarán en la factura]
                  "Fecha" :"25/10/2018",						//[Opcional: Nombre y valor de propiedades adicionales que no se enviarán a la DIAN pero sí se mostrarán en la factura]
                  "Caja" :"01 - PRINCIPAL",						//[Opcional: Nombre y valor de propiedades adicionales que no se enviarán a la DIAN pero sí se mostrarán en la factura]
                  "Banco" :"BANCO DE BOGOTA",					//[Opcional: Nombre y valor de propiedades adicionales que no se enviarán a la DIAN pero sí se mostrarán en la factura]
                  "Cuenta" :"000021980",						//[Opcional: Nombre y valor de propiedades adicionales que no se enviarán a la DIAN pero sí se mostrarán en la factura]
                  "Recibo" :"CODIGO BARRAS",					//[Opcional: Nombre y valor de propiedades adicionales que no se enviarán a la DIAN pero sí se mostrarán en la factura]
                  "Oficina" :"VENTAS PORTAL WEB - CODIGO BARRAS",                   //[Opcional: Nombre y valor de propiedades adicionales que no se enviarán a la DIAN pero sí se mostrarán en la factura]
                  "Num" :"20180815093337"						//[Opcional: Nombre y valor de propiedades adicionales que no se enviarán a la DIAN pero sí se mostrarán en la factura]
                  },
                  "amountNoTaxes" :69000.00,					//[Total de la factura sin impuestos]
                  "amountTaxes" :13110.00,						//[Total de impuestos]
                  "totalAmount" :82110.00,						//[Total de la factura con impuestos]
                  "totalAmountText" :"DOSCIENTOS DIEZ MIL DOSCIENTOS SETENTA Y NUEVE PESOS CON DIEZ Y OCHO CENTAVOS M/CTE.************" //[Texto Total de la factura con impuestos]
                  }
                 */
                /**
                 * Paso Produccion - 20190215
                  "idRange" de 174 A   85, 191 a 102 NC - anuladas
                  "idInvoiceType" de  120 A 121, 180 a 139 NC - anuladas
                  "signed" :  false  A  true
                  "send": false  A  true
                  "sendToCustomer" :  false  A  true
                  "username": adm_anm@yopmail.com   A   factura.electronica@anm.gov.co
                 * 
                 * Novedad Anualcion - 20190515
                 * A diferencia de la factura, los atributos mostrados arriba son los únicos que cambian:

                  objectType: 0-Factura, 1-Nota Crédito, 2-Nota Débito
                  invoiceIdType y idInvoiceType: Ahora deben ser omitidos o nulos
                  idNoteType : Contiene el ID de la plantilla creada en Abaco. Si es null se usará una por defecto
                  invoiceSourceId: Contiene el consecutivo de la factura a la que se aplica la nota.
                  noteTypeId: Código del concepto de la nota. Debe regirse con los valores dados por la DIAN como se muestra a continuación:(imagen 1)
                 * 
                  1.	Se debe cambiar el rango de numeración de "idRange" :174, a "idRange" :191 para Notas
                  2.	Se debe trasmitir bajo la numeración 1 a 9999999, por lo tanto el que se debería transmitir es "idObject" :"9",
                  3.	Se debe considerar el ID de la plantilla para notas que corresponde a "idNoteType": 180.  - 20190829
                 */
                /** Incidente #15151 - 20191129
                  "idObject": "SETT27", De esta manera se debe enviar en ambiente de pruebas las facturas, puedes utilizar desde número SETT28.
                  "idVerificationDigit": "1", En este campo se debe agregar el dígito de verificación de los Nit cliente.
                  "city": "15244", El código de la ciudad debe estar alineado a los códigos brindados y que te adjunto nuevamente.
                  "department" :"91", El código de la departamento debe estar alineado a los códigos brindados y que te adjunto nuevamente.
                 */
                //Parametros de app.yml - 20191129
                $username = sfConfig::get('app_username');
                $password = sfConfig::get('app_password');
                $idRange = sfConfig::get('app_idRange');
                $idInvoiceType = sfConfig::get('app_idInvoiceType');
                $signed = sfConfig::get('app_signed');
                $send = sfConfig::get('app_send');
                $sendToCustomer = sfConfig::get('app_sendToCustomer');
                $idRangeAnu = sfConfig::get('app_idRangeAnu');
                $idNoteType = sfConfig::get('app_idNoteType');

                /**
                 * Campo de impuesto IVA - 20200625::LAVILA
                 */
                $json_taxes = "";
                if ($por_iva > 0) {
                    $json_taxes = <<<EOD

                            {
				"taxAmount": $valor_uni_iva_cant,
				"taxEvidenceType": false,
				"taxableAmount": $valorsiniva_unicant,
				"percent": $por_iva.0,
                                "taxTypeCode": "01"
                            }
EOD;
                }

                /**
                 * Incidente #18203 - 20200806::LAVILA
                 * 
                 * "partyTaxSchema": ["O-13", "O-15", "O-23"]
                 * tipo_responsabilidad = O-13;O-15;O-23 o por defecto R-99-PN
                 */
                $partyTaxSchema = $value['codigo_dian'];

                $json_clave = <<<EOD
{
	"username" : "$username",
	"password" : "$password",
EOD;
                $json_cuerpo = <<<EOD
	"objectType" :1,
        "noteTypeId": 2,
	"idRange" :$idRangeAnu,
	"idObject" :"NC$sec_anulacion",
	"idNoteType" : $idNoteType,
        "invoiceSourceId" : "$sec_factura",
	"signed" : $signed,
	"send" : $send,
	"sendToCustomer" : $sendToCustomer,
	"notificationStrings" : ["EMAIL"],
	"description" :"$observaciones",
	"currencyCode" :"COP",
	"customer" : {
		"personType" :$id_tip_ter,
		"personId" :"$num_doc",
		"idType" :$id_tipo_doc,
		"idVerificationDigit" :"$dv",
		"schemeType" :0,
		"address" :"$direccion",
		"city" :"$codmun_text",
		"department" :"$coddepto",
		"citySubDivision" :"",
		"countryCode" :"CO",
		"organizationName" :"$razon_soc",
		"firstName" :"$pnombre",
		"middleName" :"$snombre",
		"lastName" :"$papellido",
		"codePhoneNumber" :"",
		"cellPhone" :"$tel",
		"email" :"$mail",
                "partyTaxSchema": [$partyTaxSchema]
	},
	"lines" : [ 
		{
		"description" :"$producto - $observaciones",
                "quantity" : $quantity,
		"currencyCode" :"COP",
		"unityPrice" : $valorsiniva_uni,
		"noteLine" : null,
		"accountingCost" : null,
		"totalPrice" : $valorsiniva_unicant,
		"taxes" : [
                            $json_taxes
                        ]
		}
	],
	"extraWSProperties" : {
		"Codigo" : "$codigo",
		"Fecha" :"$fecha_facturacion",
		"Caja" :"$caja",
		"Banco" :"$banco",
		"Cuenta" :"$cuenta",
		"Recibo" :"$tipo_pago",
		"Oficina" :"$oficina",
		"Num" :"$pin"
	},
	"amountNoTaxes" :$valorsiniva,
	"amountTaxes" :$valor_iva,
	"totalAmount" :$valor_total,
	"totalAmountText" :"$valor_total_text M/CTE.************"
}
EOD;
                //Json de envio
                //Separa JSON por clave visible en log - 20191120
                $json = <<<EOD
$json_clave
$json_cuerpo                        
EOD;
                //echo $json;
                //die();
                $this->custom_logger->info("---Formato Json de envio:" . $json_cuerpo);
                $this->logMessage("---Formato Json de envio:" . $json_cuerpo);


                //Ejemplo Json simple
                //$data = array("name" => "Hagrid", "age" => "36");
                //$data_string = json_encode($data);
                $data_string = $json;

                /**
                 * Llamado CURL
                 */
                $ch = curl_init($url_abaco);
                //Parametros de retorno en cURL
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                    'Content-Type: application/json',
                    'Content-Length: ' . strlen($data_string))
                );
                //Ejecuta la petición
                $respuesta = curl_exec($ch);
                //$respuesta = "";
                $this->custom_logger->info("[DEBITO] respuesta: " . $respuesta . ".\n");
                $this->logMessage("[DEBITO] respuesta: " . $respuesta);
                //Error CURL
                if ($respuesta === false) {
                    $message = curl_error($ch);
                    //echo $message;
                } elseif (count($respuesta) <= 0) {
                    $this->logMessage("[DEBITO] Sin respuesta.");
                    $message = "Sin respuesta.";
                }
                //Se cierra la conexión
                curl_close($ch);
                //die();
                //echo $respuesta;
                $arrayRespuesta = json_decode($respuesta, true);
                //print_r($arrayRespuesta);
                //die();
                //valida que esten las variables en la respuesta
                $this->logMessage("************Valida que esten las variables en la respuesta************");
                //if (isset($arrayRespuesta['idInvoice']) && isset($arrayRespuesta['message'])) {
                //if (true) {
                $pos = strpos($respuesta, 'idInvoice');
                $pos2 = strpos($respuesta, 'message');
                if ($pos !== false && $pos2 !== false) {

                    $this->logMessage("Si vienen variables en la respuesta de llamadoAbaco anulacion.");

                    $idInvoice = $arrayRespuesta['idInvoice'];
                    $message = $arrayRespuesta['message'];
                    $message = str_replace("'", "'|| chr(39) ||'", $message);
                    $successful = $arrayRespuesta['successful'];
                    if (isset($arrayRespuesta['idrequest'])) {
                        $idrequest = $arrayRespuesta['idrequest'];
                    } else {
                        $idrequest = '';
                    }

                    //valida successful
                    if ($successful == 'true') {
                        $successful = 'true';
                        $estado_abaco = '1';
                        $fecha_abaco = 'sysdate';
                    } else {
                        $successful = 'false';
                        $estado_abaco = '0';
                        $fecha_abaco = 'null';
                        $sec_anulacion = '';
                    }

                    //actualizar registro de CA_FACTURA_ABACO      
                    $sql = <<<EOD
update CA_FACTURA_ABACO
set 
message_anulado = '$message',
anulado_abaco = '$estado_abaco',
fecha_anulado = $fecha_abaco,
sec_anulacion = '$sec_anulacion'
where
id_debito = $id_debito  
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                } else {

                    $this->logMessage("No vienen variables en la respuesta de llamadoAbaco anulacion.");
                }
            }

            //die();
            /**
             * Incidente #10372, Llamado a servicio envio correo ABACO - 20181114
             */
            /*
             * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
             */
            $id_ope_bd = 5;
            //construir observacion
            $observacion = "'INICIO LLAMADO ENVIO CORREO ABACO'";
            //$this->custom_logger->info("[DEBITO] " . $observacion . ".\n");
            //CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);
            //$this->llamadoCorreoAbaco($id_debito);
            //$this->logMessage("[DEBITO] Fin llamado a servicio envio correo ABACO.");


            $this->custom_logger->info("----------------------------------------FIN llamadoAbaco anulacion");
            $this->logMessage("----------------------------------------FIN llamadoAbaco anulacion");

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

            $array_abaco = array(
                'message' => $message,
                'successful' => $successful,
                'idRequest' => $idrequest,
                'idinvoice' => $idInvoice
            );

            return $array_abaco;
        } catch (Exception $e) {

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

            $mensaje = "ERROR!!!";

            $this->logMessage($mensaje);
            $this->custom_logger->info("[DEBITO] Exception:: " . $mensaje);
            $this->logMessage("state");
            $this->logMessage("Code " . $e->getCode());
            $this->logMessage("Message " . $e->getMessage());


            /*
             * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
             */
            $id_ope_bd = 5;
            $observacion = "'Se termino el proceso de debito llamadoAbaco anulacion, se generaron errores en el proceso de creación...'";
            $this->custom_logger->info("[DEBITO] Exception:: " . $observacion . ".\n");

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

            CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);

            $this->conn->commit();

            $this->custom_logger->info("----------------------------------------FIN Exception llamadoAbaco anulacion");
            $this->logMessage("----------------------------------------FIN Exception llamadoAbaco anulacion");


            $array_abaco = array(
                'message' => "Message " . $e->getMessage(),
                'successful' => 'false',
                'idRequest' => '',
                'idinvoice' => ''
            );

            return $array_abaco;
        }
    }

}
