<?php

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

    /**
     * Metodo que inserta registros del CSV a la tabla ca_imp_debito_t
     *
     * @param sfRequest $request A request object
     */
    public function executeUpdate(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");

        $fail = false;

        $id_punto_venta = $request['punto_venta_log'];
        $id_username = $request['id_username'];
        $username = $request['username'];
        $id_pr_tipo_ingre = 4;

        $id_tipo_debito = $request['id_tipo_debito'];
        $id_mae_ter_ven = $request['id_mae_ter_ven'];
        $id_tip_mon = $request['id_tip_mon'];
        $archivo = $request['file_name'];

        $header = NULL;
        $data = array();
        $delimiter = ";";
        $mensaje = "";

        /*
         * Se crea conexión
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        //Se borra tabla de carga, siempre antes de iniciar el proceso - 20170103
        $sql = <<<EOD
TRUNCATE TABLE ca_imp_debito_t    
EOD;

        $this->conn->execute($sql);

        $this->conn->commit();


        /*
         * Se crea conexión
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();


        /*
         * Manejo de errores
         */
        $fila_i = 0;
        try {

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

            //Mensaje de error diferentes columnas cabecera y fila - 20160801
            $tag_dif_cant = true;

            if (($handle = fopen("uploads/carga_datos/" . $archivo, "r")) !== FALSE) {

                $this->logMessage("-----------SI HAY ARCHIVO----------");

                while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {

                    $this->logMessage("-----------ENTRE AQUI----------");

                    if (!$header) {
                        $header = $row;
                    } else {
                        if (count($row) == count($header)) {
                            $data[] = array_combine($header, $row);
                        } else {
                            $row_cant = count($row);
                            $tag_dif_cant = false;
                        }
                    }
                }

                if (count($data) > 0) {

                    $this->logMessage("-----------SI TIENE DATOS----------");


                    //LLENO LA TABLA TEMPORAL

                    $tag_cabecera = true;
                    foreach ($data as $datos) {

                        $fila_i = $fila_i + 1;

                        if (isset($datos['FECHA_PROCESO']) && isset($datos['IDENTIFICACION']) && isset($datos['DIAS_PAGO']) && isset($datos['VALOR_TOTAL_DEB']) &&
                                isset($datos['OBSERVACIONES_DEB']) && isset($datos['PERIODO_INI']) && isset($datos['PERIODO_FIN']) &&
                                isset($datos['FECHA_OBLIGACION']) && isset($datos['COD_TITULO']) && isset($datos['ID_MINERAL']) &&
                                isset($datos['NO_DEBITO']) && isset($datos['ID_PRODUCTO']) && isset($datos['CANTIDAD']) && isset($datos['VALOR_UNITARIO']) &&
                                isset($datos['VALOR_IVA']) && isset($datos['VALOR_TOTAL']) && isset($datos['OBSERVACIONES']) && isset($datos['EMAIL'])
                        ) {

                            $tag_cabecera = false;

                            $this->logMessage("-----------entre aca----------");

                            $fecha_proceso = $datos['FECHA_PROCESO'];
                            $identificacion = $datos['IDENTIFICACION'];
                            $dias_pago = $datos['DIAS_PAGO'];
                            $valor_total_deb = str_replace(',', '.', $datos['VALOR_TOTAL_DEB']);
                            $observaciones_deb = $datos['OBSERVACIONES_DEB'];
                            $periodo_ini = $datos['PERIODO_INI'];
                            $periodo_fin = $datos['PERIODO_FIN'];
                            $fecha_obligacion = $datos['FECHA_OBLIGACION'];
                            $cod_titulo = $datos['COD_TITULO'];
                            $id_mineral = $datos['ID_MINERAL'];
                            $no_debito = $datos['NO_DEBITO'];
                            $id_producto = $datos['ID_PRODUCTO'];
                            $cantidad = $datos['CANTIDAD'];
                            $valor_unitario = str_replace(',', '.', $datos['VALOR_UNITARIO']);
                            $valor_iva = str_replace(',', '.', $datos['VALOR_IVA']);
                            $valor_total = str_replace(',', '.', $datos['VALOR_TOTAL']);
                            $observaciones = $datos['OBSERVACIONES'];
                            $email = $datos['EMAIL'];


                            $observaciones_deb = str_replace('\'', ' ', $observaciones_deb);
                            if ($observaciones == "") {
                                $observaciones = $observaciones_deb;
                            }

                            //VERIFICAR CAMPOS OBLIGATORIOS

                            if ($fecha_proceso != "" && $identificacion != "" && $dias_pago != "" && $valor_total_deb != "" && $observaciones_deb != "" && $no_debito != "" && $id_producto != "" && $cantidad != "" && $valor_unitario != "" && $valor_iva != "" && $valor_total != "" && $cantidad != "") {

                                /**
                                 * Consultar producto
                                 * Se consulta el tipo de ingreso segun el grupo del producto - 20171004
                                 */
                                $sql = <<<EOD
select 
tab0.id_producto,
por_iva,
nvl(gi.id_pr_tipo_ingre,4) as id_pr_tipo_ingre

from ca_producto tab0 

join ts_gi gi
on tab0.id_grupo = gi.id

where 
tab0.codigo = '$id_producto' 
EOD;
                                $producto = CN_TABLE::executeSQL($sql);

                                if (count($producto) > 0) {

                                    $id_producto = $producto[0]['id_producto'];
                                    $id_pr_tipo_ingre = $producto[0]['id_pr_tipo_ingre'];

                                    $sql = <<<EOD
select * from re_mineral 
    where cod_mineral = '$id_mineral'
EOD;
                                    $mineral = CN_TABLE::executeSQL($sql);

                                    if (count($mineral) > 0 || $id_mineral == '') {

                                        if (count($mineral) > 0) {
                                            $id_mineral = $mineral[0]['id_mineral'];
                                        }

                                        $sql = <<<EOD
Insert into CA_IMP_DEBITO_T (ID_IMP_DEBITO_T,ID_PUNTO_VENTA,ID_TIPO_DEBITO,IDENTIFICACION,FECHA_PROCESO,DIAS_PAGO,
    VALOR_TOTAL_DEB,EJECUTIVO,OBSERVACIONES_DEB,ID_TIP_MON,PERIODO_INI,PERIODO_FIN,
        USUARIOLOG,ID_PR_TIPO_INGRE,FECHA_OBLIGACION,COD_TITULO,ID_MINERAL,NO_DEBITO,
            ID_PRODUCTO,CANTIDAD,VALOR_UNITARIO,VALOR_IVA,VALOR_TOTAL,
                OBSERVACIONES,ID_DEBITO,ID_DEBITO_DETALLE,EMAIL) 
    values ('$fila_i','$id_punto_venta','$id_tipo_debito','$identificacion',to_date('$fecha_proceso','DD/MM/YYYY'),'$dias_pago',
        '$valor_total_deb','$id_mae_ter_ven','$observaciones_deb','$id_tip_mon',to_date('$periodo_ini','DD/MM/YYYY'),to_date('$periodo_fin','DD/MM/YYYY'),
            '$username',$id_pr_tipo_ingre,to_date('$fecha_obligacion','DD/MM/YYYY'),'$cod_titulo','$id_mineral','$no_debito','$id_producto','$cantidad','$valor_unitario','$valor_iva','$valor_total',
                '$observaciones',null,null,'$email') 
EOD;

                                        $this->conn->execute($sql);
                                    } else {
                                        $this->logMessage("-----------EL MINERAL NO EXISTE CODIGO: $id_mineral----------");
                                        $mensaje = "ALGUNO DE LOS MINERALES REGISTRADOS NO SE ENCUENTRA CREADO. FAVOR VERIFICAR CODIGO:" . $id_mineral;
                                        $fail = true;
                                    }
                                } else {
                                    $this->logMessage("-----------EL PRODUCTO NO EXISTE CODIGO: $id_producto----------");
                                    $mensaje = "ALGUNO DE LOS PRODUCTOS REGISTRADOS NO SE ENCUENTRA CREADO. FAVOR VERIFICAR CODIGO:" . $id_producto;
                                    $fail = true;
                                }
                            } else {

                                $this->logMessage("-----------NO TIENE DATOS----------");
                                $mensaje = "Datos Incompletos. Favor Verificar Fila: " . $fila_i;
                                $fail = true;
                            }
                        } else {

                            $this->logMessage("-----------NO TIENE DATOS/CABECERA----------");
                            //Si no estan todos los datos, aun vacios, el problema es de la cabera o la fila correspondiente - 20160607
                            if ($tag_cabecera) {
                                $mensaje = "No se pudo Cargar el archivo. Revisar Formato de Cabecera, verificar espacios y contenido.";
                            } else {
                                $mensaje = "No se pudo Cargar el archivo. Revisar datos de la Fila: " . $fila_i;
                            }
                            $fail = true;
                        }
                    }
                } else {

                    if ($tag_dif_cant) {
                        $this->logMessage("-----------NO TIENE DATOS----------");
                        $mensaje = "El archivo esta vacio. Favor Verificar.";
                        $fail = true;
                    } else {
                        $this->logMessage("-----------CANTIDAD DE ELEMENTOS DIFERENTES CABECERA(" . count($header) . ")/FILA(" . $row_cant . ")----------");
                        $mensaje = "La cantidad de elementos de la cabecera no corresponde a la de las filas, revisar separador(;). Favor Verificar.";
                        $fail = true;
                    }
                }
            } else {
                $this->logMessage("-----------NO HAY ARCHIVO----------");
                $mensaje = "El archivo no existe. Favor Verificar.";
                $fail = true;
            }


            if (!$fail) {

                $this->conn->commit();

                $this->list_data = array();
                $this->status = 0;
                //$mensaje = "Se cargo archivo.";
                $this->mensajeError = $mensaje;
            } else {

                $this->conn->rollback();
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
            }
        } catch (Exception $e) {
            $mensaje = "[Error] No se pudo Cargar Archivo. Revisar Fila: " . $fila_i . " - Caracteres extraños.";
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array();
            $this->logMessage($mensaje);
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Metodo que crea las debitos segun tabla ca_imp_debito_t
     * 
     * @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");

        $fail = false;
        $tag_error = false;

        $id_punto_venta = $request['punto_venta_log'];
        $id_username = $request['id_username'];
        $username = $request['username'];
        $id_pr_tipo_ingre = 4;

        $id_tipo_debito = $request['id_tipo_debito'];
        $id_mae_ter_ven = $request['id_mae_ter_ven'];
        $id_tip_mon = $request['id_tip_mon'];
        $archivo = $request['file_name'];

        /*
         * Se crea conexión
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

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

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


            /*
             * Se recorre tabla ca_imp_debito_t para cargar debitos
             */
            $sql = <<<EOD
select
nvl(consec.consecutivo,0) as consecutivo,
to_char(imp.fecha_proceso, 'yyyy' ) as id_anhos,
imp.id_imp_debito_t,
imp.id_punto_venta,
imp.id_tipo_debito,
imp.identificacion,
imp.fecha_proceso,
imp.dias_pago,
imp.valor_total_deb,
imp.ejecutivo,
imp.observaciones_deb,
imp.id_tip_mon,
imp.periodo_ini,
imp.periodo_fin,
imp.usuariolog,
imp.id_pr_tipo_ingre,
imp.fecha_obligacion,
imp.cod_titulo,
imp.id_mineral,
imp.no_debito,
imp.id_producto,
imp.cantidad,
imp.valor_unitario,
imp.valor_iva,
imp.valor_total,
imp.observaciones,
imp.id_debito,
imp.id_debito_detalle,
imp.email,
tipmon.local
from ca_imp_debito_t imp

left join ca_tip_mon tipmon
on tipmon.id_tip_mon = imp.id_tip_mon

left join ca_consecutivo_deb consec
on imp.id_punto_venta = consec.id_punto_venta
and imp.id_tipo_debito = consec.id_tipo_debito
and consec.id_anhos = to_char(imp.fecha_proceso, 'yyyy' )

order by
imp.no_debito, 
imp.id_imp_debito_t    
EOD;
            $records = CN_TABLE::executeSQL($sql);

            $id_anhos = 0;

            $tag_fila_uno = true;
            $no_debito_ini = 0;

            //for de los debitos
            foreach ($records as $debitos) {

                $id_anhos = $debitos['id_anhos'];
                $id_imp_debito_t = $debitos['id_imp_debito_t'];
                $id_tipo_debito = $debitos['id_tipo_debito'];
                $id_punto_venta = $debitos['id_punto_venta'];
                $identificacion = $debitos['identificacion'];
                $fecha_proceso = $debitos['fecha_proceso'];
                $dias_pago = $debitos['dias_pago'];
                $valor_iva_deb = 0;
                $valor_total_deb = $debitos['valor_total_deb'];
                $ejecutivo = $debitos['ejecutivo'];
                $observaciones_deb = $debitos['observaciones_deb'];
                $id_tip_mon = $debitos['id_tip_mon'];
                $periodo_ini = $debitos['periodo_ini'];
                $periodo_fin = $debitos['periodo_fin'];
                $usuariolog = $debitos['usuariolog'];
                $id_pr_tipo_ingre = $debitos['id_pr_tipo_ingre'];
                $fecha_obligacion = $debitos['fecha_obligacion'];
                $cod_titulo = $debitos['cod_titulo'];
                $id_mineral = $debitos['id_mineral'];
                $no_debito = $debitos['no_debito'];
                $id_producto = $debitos['id_producto'];
                $cantidad = $debitos['cantidad'];
                $valor_unitario = $debitos['valor_unitario'];
                $valor_iva = $debitos['valor_iva'];
                $valor_total = $debitos['valor_total'];
                $observaciones = $debitos['observaciones'];
                $email = $debitos['email'];
                $local = $debitos['local'];

                //Solo entra la primera vez, fila uno del record
                if ($tag_fila_uno) {
                    $tag_fila_uno = false;
                    $sec_debito = $debitos['consecutivo'];
                    $id_caja = 0;

                    /**
                     * Si en ANM y punto de venta 62, usa el consecutivo de caja de POS id punto venta-102 - 20190925
                     * 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'];
                        $sesion_caja = $resultado_punt[0]['sesion_caja'];

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


                    //Si no hay consecutivo se crea uno en 0
                    if ($sec_debito == 0) {
                        $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;
                        $this->conn->execute($sql);
                    }
                }


                /*
                 * Actualizar correo si aplica para tercero
                 */
                //sentencia sql
                $sql = <<<EOD
SELECT * FROM interceros
where
num_doc = '$identificacion'
order by
estado_ter desc, id_mae_ter 
EOD;

                //ejecuta el sql
                $result = CN_TABLE::executeSQL($sql);
                if (count($result) > 0) {

                    $id_mae_ter = $result[0]['id_mae_ter']; //tercero del debito

                    $sql = <<<EOD
SELECT * FROM intercer_du
where
id_mae_ter = '$id_mae_ter'
order by
id_mt_ubi desc 
EOD;

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

                    if (count($result_du) > 0) {
                        $id_mt_ubi = $result_du[0]['id_mt_ubi']; //id_mt_ubi del tercero

                        /**
                         * Actualiza el correo del tercero - 20160601
                         */
                        if ($id_mt_ubi == null || $id_mt_ubi == '' || $id_mt_ubi == 'null') {
                            $sql = <<<EOD
Insert into INTERCER_DU (ID_MT_UBI,ID_MAE_TER,ID_LOC_DIR,WEB_SITE,MAIL,CONTACTO,CARGO_CON,AP_AEREO,MAIL_CON,ID_PAIS,COPDEPTO,CIUDAD) 
values (null,'$id_mae_ter','1',null,'$email',null,null,null,null,'49','11','BOGOTA') 
EOD;

                            //ejecuta el sql
                            $this->conn->execute($sql);
                        } else {
                            $sql = <<<EOD
update intercer_du
set mail = '$email'
where id_mae_ter = $id_mae_ter
and id_mt_ubi = $id_mt_ubi  
EOD;

                            //ejecuta el sql
                            $this->conn->execute($sql);
                        }
                    }
                } else {
                    $tag_error = true;
                    throw new Exception("El tercero ($identificacion) no existe.");
                }

                /*
                 * Validar fecha de creacion, solo mes actual - Pendiente
                 */

                /*
                 * Tipo de moneda 
                 */
                if ($local == 1) {
                    $valor_moneda = $valor_total_deb;
                    $trm_debito = 1;
                } else {
                    //Pendiente cuando es otro tipo de moneda
                    $valor_moneda = $valor_total_deb;
                    $trm_debito = 0;
                }

                //Verificar consecutivo no_debito, para varios detalles de un mismo debito
                if ($no_debito_ini != $no_debito) {

                    $sec_debito += 1;
                    $no_debito_ini = $no_debito;
                    $tag_debito = true; //si se crea debito, para detalles varios

                    /*
                     * Crear 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)
    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_total_deb,$valor_iva_deb,0,0,$valor_total_deb,$ejecutivo,
            '$observaciones_deb',$id_tip_mon,$valor_moneda,$trm_debito,1,null,null,to_date('$periodo_ini','yyyy-mm-dd'),to_date('$periodo_fin','yyyy-mm-dd'),
                '$usuariolog', $id_pr_tipo_ingre,to_date('$fecha_obligacion','yyyy-mm-dd'))
EOD;
                    //ejecuta y obtiene el resultado del sql
                    $this->conn->execute($sql);


                    /**
                     * Si en ANM y punto de venta 62, usa el consecutivo de caja de POS id punto venta-102 - 20190925
                     * Se valida tipo 1	FACTURA - 20200504::LAVILA
                     */
                    if ($entidadCliente == 2 && $id_punto_venta == 62 && $id_tipo_debito == 1) {
                        //Actualiza el consecutivo, este se vuelve a modificar al insertar la factura_pos - 20160223      
                        $sql = <<<EOD
update ca_consecutivo_caja set consec_fac = $sec_debito 
where id_punto_venta = $id_punto_venta_pos and id_caja = $id_caja 
EOD;
                        //ejecuta el sql
                        $this->conn->execute($sql);
                    }
                } else {
                    $tag_debito = false;
                }

                //Ultimo registro insertado CA_DEBITO
                $sql = <<<EOD
select * from ca_debito
where 
sec_debito = $sec_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);


                /*
                 * Verifica que sea un registro para insertar las referencias del debito
                 * y vienen registros para las referenciass
                 */
                $id_debito_detalle = 'null';
                if (count($resultado) > 0) {

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

                    //Si tiene referencia de titulo o mineral
                    if (!is_null($id_mineral) || !is_null($cod_titulo)) {
                        //si se crea debito
                        if ($tag_debito) {
                            //sentencia sql
                            $sql = <<<EOD
insert into ca_debito_ref values ( $id_debito, '$id_mineral', '$cod_titulo')
EOD;
                            //ejecuta el sql
                            $this->conn->execute($sql);
                        }
                    }


                    //Registro debito detalle
                    $sql = <<<EOD
insert into ca_debito_detalle 
(id_debito_detalle,id_debito,id_producto,cantidad,valor_unitario,valor_iva,valor_dcto,porcen_dcto,valor_total,observaciones,por_iva) 
values ( null, $id_debito, $id_producto, $cantidad, 
            $valor_unitario, $valor_iva, 0, 0, $valor_total, '$observaciones', 0 ) 
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);

                    //Ultimo registro insertado ca_debito_detalle
                    $sql = <<<EOD
select * from ca_debito_detalle
where 
id_debito = $id_debito
and id_producto = $id_producto  
order by
id_debito_detalle desc                         
EOD;
                    //ejecuta y obtiene el resultado del sql
                    $resultado_det = CN_TABLE::executeSQL($sql);
                    if (count($resultado_det) > 0) {
                        $id_debito_detalle = $resultado_det[0]['id_debito_detalle'];
                    }

                    $valor_iva_deb = $valor_iva;
                }


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

                    $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,'$sec_debito',null,'false',null,
    '0',null,'0',null)
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                }


                /**
                 * Actualizar datos iva del debito
                 */
                //sentencia sql
                $sql = <<<EOD
update ca_debito set valor_iva = valor_iva + $valor_iva_deb, valor_bruto = valor_bruto - $valor_iva_deb
where
id_debito = $id_debito  
EOD;
                //ejecuta el sql
                $this->conn->execute($sql);

                //sentencia sql
                $sql = <<<EOD
update ca_imp_debito_t set id_debito = $id_debito, id_debito_detalle = $id_debito_detalle
where
id_imp_debito_t = $id_imp_debito_t  
EOD;
                //ejecuta el sql
                $this->conn->execute($sql);
            }

            $consecutivo = $sec_debito;
            $sql = <<<EOD
UPDATE CA_CONSECUTIVO_DEB SET CONSECUTIVO = $consecutivo 
    WHERE id_anhos = $id_anhos
    and id_tipo_debito = $id_tipo_debito               
    and id_punto_venta = $id_punto_venta                
EOD;
            $this->conn->execute($sql);

            $mensaje = "Termino Proceso";

            $this->conn->commit();
            $this->list_data = array();
            $this->status = 0;
            $this->mensajeError = $mensaje;

            $this->logMessage($mensaje);



            /**
             * Incidente #10372, Generar registro detalle ABACO - 20190925
             */
            if ($entidadCliente == 2 && $id_punto_venta == 62) {
                //Registros creados para ser llamado a ABACO - 20190925
                $sql = <<<EOD
select distinct
                    
imp.id_debito        

from ca_imp_debito_t imp    

where
imp.id_debito is not null

order by
imp.id_debito    
EOD;
                $records = CN_TABLE::executeSQL($sql);

                //for de los debitos
                foreach ($records as $debitos) {
                    $id_debito = $debitos['id_debito']; //Llamado a abaco

                    /*
                     * 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) {
                        $array_abaco = $this->llamadoAbaco($id_debito);
                    }
                }
            }


            /**
             * Llamado INTERFAZ CONTABLE - 20190816
             * Se coloca al final al hacer COMMIT de todo el debito y credito - 20170906
             */
            $this->logMessage("INICIO INTERFAZ CONTABLE DEBITO");

            //Se trae de la configuracion la url que se ha establecido para las interfaces contables
            $arrayAtrib = array();

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

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                if ('service_url_local' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        if ($key == 'value') {
                            $service_url = $value;
                        }
                    }
                }
                $int++;
            }
            $url = $service_url;
            $url = $url . 'ejecutaInterfacesContables/list.json?id_mod=11&username=websafi&nitocc=800189921&id_username=946';
            //variables del debito
            //$fecha_proceso = $fecha_sistema;
            $id_mae_ter = 946;
            $mov_ejecutado = "Notas-.-Debito";
            $url = $url . '&fecha_proceso=' . $fecha_proceso;
            $url = $url . '&id_mae_ter=' . $id_mae_ter;
            $url = $url . '&mov_ejecutado=' . $mov_ejecutado;
            //$url = $url . '&id_movimiento=' . $id_debito_interes;
            $url = $url . '&tag_portal_web=1'; //facturas portal web - validar el retorno del json

            $ch = curl_init($url);

            //Parametros de retorno en cURL
            curl_setopt($ch, CURLOPT_HEADER, 0);
            $rta = curl_exec($ch);
            curl_close($ch);

            $arrayRespuesta = json_decode($rta, true);
            //Verifica el status, si es diferente de 0, ocurrio un error al subir la interfaz y debe reportarlo
            if ($arrayRespuesta['response']['status'] == 1) {
                $mensajeError = "Error :: Al generar la interfaz contable.";
                $this->status = 1;
                $this->list_data = array();
                $this->mensajeError = $mensajeError;
                $this->logMessage("[CARGAR_DEBITOS] " . $mensajeError);
            } else {
                $this->logMessage("[CARGAR_DEBITOS] Genero interfaz contable.");
            }

            $this->logMessage("FIN INTERFAZ CONTABLE DEBITO");
        } catch (Exception $e) {

            if ($tag_error) {
                $mensaje = $e->getMessage();
            } else {
                $mensaje = "No se pudo Cargar Registros del Archivo. Revisar Formato.";
            }

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

    /**
     * Executes list action
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {

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


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

        //TRAE LOS REGISTROS

        /*
         * Paginacion
         */
        if (isset($request['_startRow'])) {
            $rowStart = $request['_startRow'];
        } else {
            $rowStart = 0;
        }

        if (isset($request['_endRow'])) {
            $rowEnd = $request['_endRow'];
        } else {
            $rowEnd = 75;
        }

        //ordenar consulta
        if (isset($request['_sortBy'])) {
            $sortBy = " Order by " . $request['_sortBy'];
        } else {
            $sortBy = 'order by no_debito';
        }


        /*
         * sql que trae los resultados
         * por los filtros, para totalizar las filas
         */
        $sql = <<<EOD
select count(*) as count from (

select 
tab0.id_imp_debito_t,
tab0.id_punto_venta,
tab0.id_tipo_debito,
tab0.identificacion,
tab0.fecha_proceso,
tab0.dias_pago,
tab0.valor_total_deb,
tab0.ejecutivo,
tab0.observaciones_deb,
tab0.id_tip_mon,
tab0.periodo_ini,
tab0.periodo_fin,
tab0.usuariolog,
tab0.id_pr_tipo_ingre,
tab0.fecha_obligacion,
tab0.cod_titulo,
tab0.id_mineral,
tab0.no_debito,
tab0.id_producto,
tab0.cantidad,
tab0.valor_unitario,
tab0.valor_iva,
tab0.valor_total,
tab0.observaciones,
tab0.id_debito,
tab0.id_debito_detalle,
tab0.email,
pv.abreviatura,
pv.descripcion as punto_venta,
tipdeb.descripcion as descripcion_tipdeb,
tipdeb.desc_corta,
mine.cod_mineral,
mine.descripcion as descripcion_mine,
mon.codigo,
mon.descripcion as descripcion_mon,
pro.codigo as codigo_pro,
pro.descripcion as descripcion_pro,
deb.sec_debito

from ca_imp_debito_t tab0

left join ca_punto_venta pv
on tab0.id_punto_venta = pv.id_punto_venta

left join ca_tipo_debito tipdeb
on tipdeb.id_tipo_debito = tab0.id_tipo_debito

left join re_mineral mine
on mine.id_mineral = tab0.id_mineral

left join ca_tip_mon mon
on mon.id_tip_mon = tab0.id_tip_mon

left join ca_producto pro
on pro.id_producto = tab0.id_producto

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

)
EOD;


        $total_record_count = CN_TABLE::executeSQL($sql);
        $total_record_count = $total_record_count[0]["count"];


        $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
    
select 
tab0.id_imp_debito_t,
tab0.id_punto_venta,
tab0.id_tipo_debito,
tab0.identificacion,
tab0.fecha_proceso,
tab0.dias_pago,
tab0.valor_total_deb,
tab0.ejecutivo,
tab0.observaciones_deb,
tab0.id_tip_mon,
tab0.periodo_ini,
tab0.periodo_fin,
tab0.usuariolog,
tab0.id_pr_tipo_ingre,
tab0.fecha_obligacion,
tab0.cod_titulo,
tab0.id_mineral,
tab0.no_debito,
tab0.id_producto,
tab0.cantidad,
tab0.valor_unitario,
tab0.valor_iva,
tab0.valor_total,
tab0.observaciones,
tab0.id_debito,
tab0.id_debito_detalle,
tab0.email,
pv.abreviatura,
pv.descripcion as punto_venta,
tipdeb.descripcion as descripcion_tipdeb,
tipdeb.desc_corta,
mine.cod_mineral,
mine.descripcion as descripcion_mine,
mon.codigo,
mon.descripcion as descripcion_mon,
pro.codigo as codigo_pro,
pro.descripcion as descripcion_pro,
deb.sec_debito

from ca_imp_debito_t tab0

left join ca_punto_venta pv
on tab0.id_punto_venta = pv.id_punto_venta

left join ca_tipo_debito tipdeb
on tipdeb.id_tipo_debito = tab0.id_tipo_debito

left join re_mineral mine
on mine.id_mineral = tab0.id_mineral

left join ca_tip_mon mon
on mon.id_tip_mon = tab0.id_tip_mon

left join ca_producto pro
on pro.id_producto = tab0.id_producto

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

$sortBy
          
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

        $records = CN_TABLE::executeSQL($sql);

        $mensaje = "Proceso Terminado";

        //Ejecuta sql
        $this->totalRows = $total_record_count;
        $this->startRow = $rowStart;
        $this->endRow = $rowStart + count($records);
        $this->list_data = $records;
    }

    /**
     * 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
             * 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(ter.direccion) as direccion,
upper(ter.ciudad) as ciudad,
upper(dep.descripcion) as departamento,
dep.coddepto 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
and estado_abaco = 0        
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;
        }
    }

}
