<?php

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

    protected $table_names = array(
        'CA_DEBITO_DETALLE',
        'CA_PRODUCTO'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        '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_DETALLE' =>
        array(
            'id_debito_detalle' => 'id_debito_detalle',
            'id_debito' => 'id_debito',
            'id_producto' => 'id_producto',
            'cantidad' => 'cantidad',
            'valor_unitario' => 'valor_unitario',
            'valor_iva' => 'valor_iva',
            'valor_dcto' => 'valor_dcto',
            'porcen_dcto' => 'porcen_dcto',
            'valor_total' => 'valor_total',
            'observaciones' => 'observaciones',
            'por_iva' => 'por_iva',
            'valor_unitario,*,cantidad' => 'valor_bruto',
            'valor_uni_me' => 'valor_uni_me',
            'valor_iva_me' => 'valor_iva_me',
            'valor_total_me' => 'valor_total_me'
        ),
        'CA_PRODUCTO' =>
        array(
            'codigo' => 'codigo',
            'descripcion' => 'descripcion',
            'precio_ven_pub' => 'precio_ven_pub',
            'valor_unitario' => 'valor_unitario_pro'
        )
    ); //por cada tabla especificar los campos del select
    protected $table_field_conditions = array(
        'CA_DEBITO_DETALLE' => array(
            'id_debito_detalle,a' => array('!=' => array(-1)),
            'id_debito_detalle,b' => array('=' => array('id_debito_detalle')),
            'id_debito' => array('=' => array('id_debito')),
            'id_producto' => array('=' => array('id_producto')),
            'cantidad' => array('=' => array('cantidad')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $fields_orderBy = array(
        'id_debito', 'id_producto'
    ); //campos para el ordenamiento de la consulta
    protected $table_field_obligatory = array('id_debito'); //campos obligatorios de filtro - estan en el request

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


    /*
     * ------------VARIABLES PARA SERVICIO DE SUMATORIA - SUM
     *
     */
    protected $summatory_data = array(
        'CA_DEBITO_DETALLE' => array(
            'fields' => array('valor_unitario', 'valor_iva', 'valor_dcto', 'valor_total', 'valor_bruto'),
            'labels' => array('id_debito_detalle2,Total'),
            'count' => 'id_debito_detalle'
        )
    ); //se especifica por tabla los campos de suma y condiciones de filtro


    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_debito_detalle'; //identificador de la tabla
    protected $id_names = array('id_debito_detalle'); //llave primaria
    protected $field_names = array('id_debito', 'id_producto', 'cantidad', 'valor_unitario', 'valor_iva', 'valor_dcto', 'porcen_dcto', 'valor_total', 'observaciones', 'por_iva', 'valor_uni_me', 'valor_iva_me', 'valor_total_me'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'CA_DEBITO_DETALLE'; //tabla en la cual se aplican los cambios
    protected $has_activo = true; //si posee campo en la tabla de nombre activo ---- ESTADO PARA REGALIAS
    protected $has_vigencia = false; //si posee vigencia
    protected $has_cen_op = false; //si posee centro de operacion
    protected $has_id_cia = false; //si posee compañia


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

    // 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") {

            /*
             * (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++;
            }

            $id_punto_venta = $request["punto_venta_log"];
            $id_debito = $request["id_debito"];

            /**
             * Incidente #10372, Generar registro detalle ABACO - 20190321
             */
            if ($entidadCliente == 2 && $id_punto_venta == 62) {

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

                    //Llamado a abaco
                    $array_abaco = $this->llamadoAbaco($id_debito);
                }
            }
        }

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

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

        return $request;
    }

    /**
     * Se hace llamado a Abaco - 20190321
     * @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. id_debito::" . $id_debito);
        $this->logMessage("----------------------------------------BEGIN llamadoAbaco. 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 = 3;
        //id del maestro tercero
        $id_mae_ter_log = 1;
        $usuario = 'admin';
        $comando = 'debito';
        //construir observacion
        $observacion = "'Se ingreso a generar llamadoAbaco.'";

        $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
             * Validacion campo vacio - departamento - 20200127
             * Incidente #17555 - 20200604::LAVIA
             */
            $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,
ter.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
tab0.estado_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) {

                $id_debito = $value['id_debito'];

                $this->custom_logger->info("Procesar el llamadoAbaco id_debito: " . $id_debito);
                $this->logMessage("Procesar el llamadoAbaco 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
                  "idInvoiceType" de  120 A 121
                  "signed" :  false  A  true
                  "send": false  A  true
                  "sendToCustomer" :  false  A  true
                  "username": adm_anm@yopmail.com   A   factura.electronica@anm.gov.co
                 */
                /*
                 * Incidente #14878
                  "idRange" de 174 A 135
                 */
                /** 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');
                $idObjectPrefijo = sfConfig::get('app_idObjectPrefijo');
                
                /*
                 * Incidente #17555 - 20200604::LAVIA
                 * paymentMethod
                  Código: 1- Significado: Contado
                  Código: 2- Significado: Credito
                 * paymentCode
                  Cuando son pagos por PSE
                  Código : 3 - Significado: Debito ACH
                  Cuando son pagos por Codigo de Barras
                  Código : 42 - Significado: Consignacion Bancaria.
                 */
                $paymentMethod = 2;
                $paymentCode = $value['payment_code'];
                $paymentDueDate = $value['payment_duedate'];

                /**
                 * 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" :0,
	"invoiceIdType" :1,
	"idRange" :$idRange,
	"idObject" :"$idObjectPrefijo$sec_factura",
	"idInvoiceType" :$idInvoiceType,
	"idNoteType" : null,
	"signed" : $signed,
	"send" : $send,
	"sendToCustomer" : $sendToCustomer,
	"notificationStrings" : ["EMAIL"],
	"description" :"$observaciones",
	"currencyCode" :"COP",
	"paymentMethod" :"$paymentMethod",
	"paymentCode" :"$paymentCode",
	"paymentDueDate" :"$paymentDueDate",
	"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.");

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

                    //actualizar registro de CA_FACTURA_ABACO      
                    //set idinvoice = nvl('$idInvoice',idinvoice),se quida texto solo guarda numeros - 20191202 
                    $sql = <<<EOD
update CA_FACTURA_ABACO
set idinvoice = nvl(  translate( '$idInvoice','QWERTYUIOPASDFGHJKLÑZXCVBNMqwertyuiopasdfghjklñzxcvbnm','0')  ,idinvoice),
message = '$message',
successful_txt = '$successful',
idrequest = '$idrequest',
estado_abaco = '$estado_abaco',
fecha_abaco = $fecha_abaco
where
id_debito = $id_debito  
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                } else {

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

            //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 = 3;
            //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");
            $this->logMessage("----------------------------------------FIN llamadoAbaco");

            /*
             * 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 = 3;
            $observacion = "'Se termino el proceso de debito llamadoAbaco, 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");
            $this->logMessage("----------------------------------------FIN Exception llamadoAbaco");


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

            return $array_abaco;
        }
    }

}
