<?php

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

    /**
     * Executes index action
     *
     * @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_cb = $request['id_cb'];
        $id_bn = $request['id_bn'];
        $archivo = $request['file_name'];
        $enviar_email = $request['EnviarEmail'];
        $id_forma_pago = $request['id'];
        $mensaje = "";

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

        $cant = 0;
        $cant_real = 0;

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

                    $sql = <<<EOD
TRUNCATE TABLE CA_IMP_FACTURA_T    
EOD;



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

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

                        $fila_i = $fila_i + 1;
                        if (isset($datos['NUMERO_CONSIGNACION']) && isset($datos['FECHA_CONSIGNACION']) && isset($datos['IDENTIFICACION']) &&
                                isset($datos['NOMBRE_O_RAZON_SOCIAL']) && isset($datos['VALOR']) && isset($datos['FECHA_RADICACION']) &&
                                isset($datos['DIRECCION']) && isset($datos['TELEFONO']) && isset($datos['CIUDAD']) && isset($datos['SUCURSAL']) &&
                                isset($datos['CODIGO_BANCO']) && isset($datos['EMAIL']) && isset($datos['PRODUCTO']) && isset($datos['CANTIDAD']) &&
                                isset($datos['OBSERVACIONES']) && isset($datos['REFERENCIA'])
                        ) {

                            $tag_cabecera = false;

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


                            //Se coloca entre comillas el num_doc, ya que es un texto - 20150929
                            $num_doc = $datos['NUMERO_CONSIGNACION'];
                            $fecha_doc = $datos['FECHA_CONSIGNACION'];
                            $identificacion = $datos['IDENTIFICACION'];
                            $razon_soc = $datos['NOMBRE_O_RAZON_SOCIAL'];
                            $razon_soc = str_replace('\'', ' ', $razon_soc);
                            $valor = str_replace(',', '.', $datos['VALOR']);
                            $fecha_facturacion = $datos['FECHA_RADICACION'];
                            $direccion = $datos['DIRECCION'];
                            $observaciones = $datos['OBSERVACIONES'];
                            $direccion = str_replace('\'', ' ', $direccion);
                            $telefono = str_replace(' ', '', $datos['TELEFONO']);
                            $ciudad = $datos['CIUDAD'];
                            $oficina = $datos['SUCURSAL'];
                            $banco = $datos['CODIGO_BANCO'];
                            $referencia = $datos['REFERENCIA'];
                            if ($observaciones == "") {
                                $observaciones = "FACTURA POS";
                            }
                            $email = str_replace(' ', '', $datos['EMAIL']);
                            $cod_producto = $datos['PRODUCTO'];
                            $cantidad = $datos['CANTIDAD'];

                            //VERIFICAR CAMPOS OBLIGATORIOS

                            if ($num_doc != "" && $fecha_doc != "" && $identificacion != "" && $razon_soc != "" && $valor != "" && $fecha_facturacion != "" && $ciudad != "" && $oficina != "" && $banco != "" && $cod_producto != "" && $cantidad != "") {



                                $sql = <<<EOD
                    SELECT tab0.id_producto,por_iva FROM CA_PRODUCTO tab0 WHERE tab0.codigo = '$cod_producto'
EOD;
                                $producto = CN_TABLE::executeSQL($sql);

                                if (count($producto) > 0) {

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


                                    //EMAIL
                                    //Se verifica si el punto de venta esta parametrizado para enviar correo, si SI valida que el campo de email no este vacio
                                    if ($enviar_email && $email == "") {
                                        $this->logMessage("-----------NO HA REGISTRADO EMAIL PARA UNA DE LAS FACTURAS----------");
                                        $mensaje = "NO HA REGISTRADO EMAIL PARA UNA DE LAS FACTURAS";
                                        $fail = true;
                                    } else {

                                        //BENEFICIARIO

                                        $sql = <<<EOD
                    SELECT tab0.id_mae_ter FROM INTERCEROS tab0 WHERE tab0.num_doc = '$identificacion'
EOD;
                                        $consec = CN_TABLE::executeSQL($sql);

                                        //SI EXISTE EL TERCERO TOMO EL ID_MAE_TER
                                        if (count($consec) > 0) {

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

                                            $sql = <<<EOD
                    SELECT tab0.id_mt_ubi FROM INTERCER_DU tab0 WHERE tab0.id_mae_ter = '$id_mae_ter'
EOD;
                                            $consec = CN_TABLE::executeSQL($sql);

                                            if (count($consec) > 0) {

                                                $sql = <<<EOD
                    UPDATE INTERCER_DU SET MAIL = '$email',ID_PAIS=49,CIUDAD = '$ciudad'
                    WHERE ID_MAE_TER = $id_mae_ter
                    
EOD;
                                                $this->conn->execute($sql);
                                            } else {

                                                $sql = <<<EOD
                    INSERT INTO INTERCER_DU (ID_MAE_TER,MAIL,ID_PAIS,CIUDAD)
                    VALUES ($id_mae_ter,'$email',49,'$ciudad')   
                    
EOD;
                                                $this->conn->execute($sql);
                                            }

                                            if ($direccion != "") {

                                                $sql = <<<EOD
                    SELECT tab0.id_mt_ubi FROM INTERCER_DU tab0 WHERE tab0.id_mae_ter = '$id_mae_ter'
EOD;


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

                                                $id_mt_ubi = $consec[0]['id_mt_ubi'];

                                                $sql = <<<EOD
                    SELECT tab0.* FROM INTERCER_DU_DIR tab0 WHERE tab0.id_mt_ubi = '$id_mt_ubi'
EOD;

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

                                                if (count($consec) > 0) {

                                                    $sql = <<<EOD
                    UPDATE INTERCER_DU_DIR SET DIRECCION = '$direccion',TEL='$telefono',CIUDAD = '$ciudad'
                    WHERE ID_MT_UBI = $id_mt_ubi
                    
EOD;
                                                    $this->conn->execute($sql);
                                                } else {

                                                    $sql = <<<EOD
                    INSERT INTO INTERCER_DU_DIR (ID_MT_UBI,ID_TIP_DIR,DIRECCION,TEL,ID_PAIS,CIUDAD)
                    VALUES ($id_mt_ubi,5,'$direccion','$telefono',49,'$ciudad')   
                    
EOD;
                                                    $this->conn->execute($sql);
                                                }
                                            }
                                        } else {
                                            //SI NO EXISTE EL TERCERO LO CREO

                                            if ($identificacion > 800000000 && $identificacion <= 999999999) {
                                                $id_tip_ter = 2;
                                            } else {
                                                $id_tip_ter = 1;
                                            }

                                            if ($id_tip_ter == 1) {
                                                $id_nat_jur = 22;
                                                $id_tipo_doc = 1;
                                            } else {
                                                $id_nat_jur = 1;
                                                $id_tipo_doc = 29;
                                            }

                                            $sql = <<<EOD
                    INSERT INTO INTERCEROS (ID_NAT_JUR,ID_TIP_TER,ID_TIPO_DOC,NUM_DOC,RAZON_SOC)
                    VALUES ($id_nat_jur,$id_tip_ter,$id_tipo_doc,'$identificacion','$razon_soc')   
                    
EOD;
                                            $this->conn->execute($sql);




                                            $sql = <<<EOD
                    SELECT tab0.id_mae_ter FROM INTERCEROS tab0 WHERE tab0.num_doc = '$identificacion'
EOD;


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

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

                                            $sql = <<<EOD
                    INSERT INTO INTERCER_DU (ID_MAE_TER,MAIL,ID_PAIS,CIUDAD)
                    VALUES ($id_mae_ter,'$email',49,'$ciudad')   
                    
EOD;
                                            $this->conn->execute($sql);

                                            if ($direccion != "") {

                                                $sql = <<<EOD
                    SELECT tab0.id_mt_ubi FROM INTERCER_DU tab0 WHERE tab0.id_mae_ter = '$id_mae_ter'
EOD;


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

                                                $id_mt_ubi = $consec[0]['id_mt_ubi'];

                                                $sql = <<<EOD
                    INSERT INTO INTERCER_DU_DIR (ID_MT_UBI,ID_TIP_DIR,DIRECCION,TEL,ID_PAIS,CIUDAD)
                    VALUES ($id_mt_ubi,5,'$direccion','$telefono',49,'$ciudad')   
                    
EOD;
                                                $this->conn->execute($sql);
                                            }
                                        }


                                        /*
                                         * VERIFICO SI LA FACTURA YA EXISTE
                                         * Se coloca los datos de la factura en el mensaje - 20151016
                                         */
                                        $sql = <<<EOD
select tab0.*, tab1.sec_factura, to_char(tab1.fecha_facturacion,'dd-mm-yyyy') as fecha_factura, tab2.abreviatura from ca_factura_pago tab0 
    join ca_factura_pos tab1 on tab1.id_factura = tab0.id_factura and tab1.id_punto_venta = $id_punto_venta  
    join ca_punto_venta tab2 on tab2.id_punto_venta = tab1.id_punto_venta
        where tab0.num_doc = '$num_doc' 
EOD;
                                        $factura_repetidas = CN_TABLE::executeSQL($sql);

                                        if (count($factura_repetidas) > 0) {

                                            $sec_factura = $factura_repetidas [0]['sec_factura'];
                                            $fecha_factura = $factura_repetidas [0]['fecha_factura'];
                                            $abreviatura = $factura_repetidas [0]['abreviatura'];

                                            $mensaje = "EXISTEN FACTURAS CON NUMERO DE CONSIGNACION REPETIDO ->  NO FACTURA ($sec_factura) - FECHA ($fecha_factura) - NUMERO CONSIGNACION ($num_doc) - PUNTO VENTA ($abreviatura). FAVOR VERIFICAR";
                                            $this->logMessage("-----------$mensaje----------");
                                            $this->logMessage("Query SELECT tab0.id_factura FROM CA_FACTURA_PAGO tab0 JOIN CA_FACTURA_POS tab1 ON tab1.id_factura = tab0.id_factura and tab1.id_punto_venta =" . $id_punto_venta . " WHERE tab0.num_doc = '" . $num_doc . "'");

                                            $fail = true;
                                        } else {



                                            $estado = 1;


                                            $sql = <<<EOD
INSERT INTO CA_IMP_FACTURA_T (NUM_DOC,FECHA_DOC,IDENTIFICACION,RAZON_SOC,VALOR,
    FECHA_FACTURACION,DIRECCION,TELEFONO,CIUDAD,OFICINA,BANCO,OBSERVACIONES,
        ID_MAE_TER,ESTADO,EMAIL,PRODUCTO,CANTIDAD,REFERENCIA)
    VALUES('$num_doc',to_date('$fecha_doc','DD/MM/YYYY'),'$identificacion','$razon_soc',$valor,
        to_date('$fecha_facturacion','DD/MM/YYYY'),'$direccion','$telefono','$ciudad','$oficina','$banco','$observaciones',
            $id_mae_ter,$estado,'$email','$id_producto','$cantidad','$referencia')
EOD;

                                            $this->conn->execute($sql);
                                        }
                                    }
                                } else {

                                    $this->logMessage("-----------EL PRODUCTO NO EXISTE CODIGO: $cod_producto----------");
                                    $mensaje = "ALGUNO DE LOS PRODUCTOS REGISTRADOS NO SE ENCUENTRA CREADO. FAVOR VERIFICAR CODIGO:" . $cod_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;
                    }
                }

                fclose($handle);
            } 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 facturas segun tabla CA_IMP_FACTURA_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");



        $id_punto_venta = $request['punto_venta_log'];
        $id_cb = $request['id_cb'];
        $id_bn = $request['id_bn'];
        $id_forma_pago = $request['id'];

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

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

            $sql = <<<EOD
                    SELECT tab0.* FROM CA_CAJA tab0 WHERE ID_PUNTO_VENTA = $id_punto_venta
EOD;
            $punto_venta = CN_TABLE::executeSQL($sql);
            $id_caja = $punto_venta[0]['id_caja'];

            $sql = <<<EOD
                    SELECT tab0.* FROM CA_ESTADO_CAJA tab0 WHERE ID_PUNTO_VENTA = $id_punto_venta AND ESTADO = 1 AND ACTUAL = 1
EOD;
            $apertura = CN_TABLE::executeSQL($sql);

            //Valida la apertura de la caja
            if (count($apertura)) {

                $id_estado_caja = $apertura[0]['id_estado_caja'];
                $cajero = $apertura[0]['cajero'];

                //Se cambia el orden de ingreso, segun archivo de carga  tab0.fecha_facturacion, tab0.num_doc - 20150929
                $sql = <<<EOD
select 
    tab0.id_imp_factura_t, tab0.num_doc,tab0.fecha_doc, 
    tab0.banco,to_char(tab0.fecha_facturacion,'dd-mm-yyyy') AS FECHA,
        to_char(tab0.fecha_facturacion,'YYYY') AS ID_ANHOS,
            tab0.id_mae_ter,tab0.id_punto_venta,tab0.observaciones,tab0.oficina,tab0.referencia,sum(tab0.valor)

from ca_imp_factura_t tab0
WHERE tab0.estado=1
group by 
    tab0.id_imp_factura_t,tab0.num_doc,tab0.fecha_doc, tab0.banco,tab0.fecha_facturacion,
        tab0.id_mae_ter,tab0.id_punto_venta,tab0.observaciones,tab0.oficina,tab0.referencia
order by 
    tab0.id_imp_factura_t 
EOD;
                $records_real = CN_TABLE::executeSQL($sql);


                //CONSECUTIVO DE FACTURA

                $sql = <<<EOD
                    SELECT tab0.consec_fac FROM CA_CONSECUTIVO_CAJA tab0 WHERE tab0.id_caja = $id_caja
EOD;
                $consec = CN_TABLE::executeSQL($sql);

                $sec_factura = $consec[0]['consec_fac'];
                $sec_factura +=1;

                //TRAER DATOS DEL PRODUCTO




                foreach ($records_real as $facturas) {


                    $num_doc = $facturas['num_doc'];
                    $fecha_doc = $facturas['fecha_doc'];
                    $fecha_facturacion = $facturas['fecha'];
                    $oficina = $facturas['oficina'];
                    $banco = $facturas['banco'];
                    $referencia = $facturas['referencia'];
                    $observaciones = $facturas['observaciones'];
                    $id_anhos = $facturas['id_anhos'];
                    $id_mae_ter = $facturas['id_mae_ter'];

                    $total_bruto = 0;
                    $total_iva = 0;
                    $total = 0;

                    //LLENO LA CABECERA DE LA FACTURA

                    $sql = <<<EOD
                    INSERT INTO CA_FACTURA_POS (ID_ANHOS,ID_PUNTO_VENTA,ID_CAJA,SEC_FACTURA,ID_MAE_TER,FECHA_FACTURACION,VALOR_BRUTO,VALOR_IVA,VALOR_TOTAL,
                        CAJERO,OBSERVACIONES,ESTADO,FECHA_ANU,MOTIVO_ANU,ID_ESTADO_CAJA)
                    VALUES ($id_anhos,$id_punto_venta,$id_caja,$sec_factura,$id_mae_ter,to_date('$fecha_facturacion','DD-MM-YYYY'),$total_bruto,$total_iva,$total,
                            $cajero,'$observaciones',1,null,null,$id_estado_caja
                        )   
                 
EOD;

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



                    //LLENO EL DETALLE DE LA FACTURA

                    $sql = <<<EOD
                    SELECT tab0.id_factura FROM CA_FACTURA_POS tab0 WHERE tab0.sec_factura = $sec_factura and tab0.id_caja = $id_caja
EOD;
                    $factura = CN_TABLE::executeSQL($sql);

                    $id_factura = $factura[0]['id_factura'];


                    $sql = <<<EOD
                    SELECT tab0.* from ca_imp_factura_t tab0 WHERE tab0.num_doc = '$num_doc'
EOD;
                    $records = CN_TABLE::executeSQL($sql);

                    foreach ($records as $detalle) {

                        $valor = $detalle['valor'];
                        $cantidad = $detalle['cantidad'];
                        $producto = $detalle['producto'];
                        $total+=$valor;

                        $sql = <<<EOD
                    SELECT tab0.id_producto,por_iva FROM CA_PRODUCTO tab0 WHERE tab0.id_producto = '$producto'
EOD;
                        $productos = CN_TABLE::executeSQL($sql);

                        $id_producto = $productos[0]['id_producto'];
                        $por_iva = $productos[0]['por_iva'];

                        if ($por_iva > 0) {

                            //crear cabecera
                            if ($cantidad > 1) {
                                $valor_bruto_uni = round($valor / $cantidad);
                                $iva = round($valor_bruto_uni / ($por_iva / 100 + 1));
                                $valor_iva_ini = round($valor_bruto_uni - $iva);
                                $valor_bruto = round($valor / ($por_iva / 100 + 1));
                                $valor_iva = round($valor - $valor_bruto);

                                $this->logMessage("VALOR BRUTO UNI => " . $valor_bruto_uni);
                                $this->logMessage("VALOR IVA => " . $iva);
                                $this->logMessage("VALOR IVA UNI => " . $valor_iva_ini);
                            } else {

                                $valor_bruto_uni = $valor;
                                $iva = round($valor_bruto_uni / ($por_iva / 100 + 1));
                                $valor_iva_ini = round($valor - $iva);
                                $valor_bruto = round($valor / ($por_iva / 100 + 1));
                                $valor_iva = round($valor - $valor_bruto);
                            }
                        } else {
                            if ($cantidad > 1) {
                                $valor_bruto_uni = round($valor / $cantidad);
                                $valor_iva_ini = 0;
                                $valor_bruto = round($valor / $cantidad);
                                $valor_iva = 0;
                            } else {
                                $valor_bruto_uni = round($valor);
                                $valor_iva_ini = 0;
                                $valor_bruto = $valor;
                                $valor_iva = 0;
                            }
                        }



                        $total_bruto+=$valor_bruto;
                        $total_iva+=$valor_iva;


                        $sql = <<<EOD
                    INSERT INTO CA_FACTURA_PROD (ID_FACTURA,ID_PRODUCTO,CANTIDAD,VALOR_UNI_BRUTO,VALOR_UNI_IVA,VALOR_UNI_TOTAL,REFERENCIA)
                    VALUES ($id_factura,$id_producto,$cantidad,$valor_bruto_uni,$valor_iva_ini,$valor,'$referencia'
                        )   
                 
EOD;
                        $this->conn->execute($sql);
                    }




                    //LLENO EL DETALLE DE PAGO

                    $sql = <<<EOD
                    INSERT INTO CA_FACTURA_PAGO (ID_FACTURA,ID_TS_PC_FP,VALOR,ID_BN,ID_CB,OFICINA,NUM_DOC,FECHA_DOC)
                    VALUES ($id_factura,$id_forma_pago,$total,$id_bn,$id_cb,'$oficina','$num_doc',to_date('$fecha_doc','YYYY-MM-DD')
                        )   
                 
EOD;
                    $this->conn->execute($sql);

                    //ACTUALIZO LA TABLA DE FACTURAS CON LOS CAMPOS DE ID_FACTURA, SEC_FACTURA Y ID_PUNTO_VENTA
                    $sql = <<<EOD
                    UPDATE CA_IMP_FACTURA_T SET ID_FACTURA = $id_factura, SEC_FACTURA = $sec_factura, ID_PUNTO_VENTA = $id_punto_venta
                    WHERE NUM_DOC = '$num_doc'
                     
                 
EOD;
                    $this->conn->execute($sql);


                    $sql = <<<EOD
                    UPDATE CA_FACTURA_POS SET VALOR_BRUTO = $total_bruto, VALOR_IVA = $total_iva, VALOR_TOTAL = $total
                    WHERE ID_FACTURA = $id_factura
                     
                 
EOD;
                    $this->conn->execute($sql);


                    $sql = <<<EOD
                    select aplica_bn from ts_pc_fp where id = $id_forma_pago
EOD;
                    $result = CN_TABLE::executeSQL($sql);
                    $aplica_banco = $result[0]['aplica_bn'];

                    if ($aplica_banco == 1) {

                        //CREO EL MOVIMIENTO DE BANCOS


                        /*
                         * $usuario => Con el CA_FACTURA_POS.cajero buscar en INTERCEROS 
                         * por el id_mae_ter, traer el num_doc y buscar en la tabla de USUARIO el username
                         */
                        //sentencia sql
                        $sql = <<<EOD
select * from usuario
where
num_doc = to_char (
(select num_doc from interceros
where id_mae_ter = $cajero)
)  
EOD;
                        //ejecuta el sql
                        $result = CN_TABLE::executeSQL($sql);
                        $username = 'null';
                        if (count($result) > 0) {
                            $username = $result[0]['username'];
                        }

                        /*
                         * OBSERVACIONES => CANCELACION FACTURA: $compañia – CA_FACTURA_POS.sec_factura
                         * 
                         * $compañia => CA_PUNTO_VENTA.abreviatura buscando por el id_punto_venta de CA_FACTURA_POS
                         */
                        //sentencia sql
                        $sql = <<<EOD
select * from ca_punto_venta where id_punto_venta = $id_punto_venta    
EOD;
                        //ejecuta el sql
                        $result = CN_TABLE::executeSQL($sql);

                        if (count($result) > 0) {
                            $nombre_pv = $result[0]['nombre'];
                        } else {
                            $nombre_pv = "Sin Identificar";
                        }

                        $observaciones = "'CANCELACION FACTURA:" . $nombre_pv . " - CA_FACTURA_POS. " . $sec_factura . ".'";

                        /*
                         * ID_TS_MB => 95 
                         * ID_TS_TD => 6
                         */

                        $id_ts_mb = 95;
                        $id_ts_td = 6;
                        $consecutivo = 0;


                        /*
                         * Calcular secuencia movimiento
                         */

                        //sentencia sql
                        $sql = <<<EOD
Select tab0.consecutivo_mb cons from TS_MPT tab0    
EOD;

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

                        $consecutivo = $st[0]['cons'];

                        $cons = $id_anhos . "00";

                        $ceros = 4 - strlen($consecutivo);

                        for ($i = 0; $i < $ceros; $i++) {
                            $cons = $cons . "0";
                        }

                        $con = $cons . ($consecutivo + 1);

                        $consecutivo = 0;
                        $consecutivo = $con;



                        $sql = <<<EOD
Insert into TS_MOV_BANC 
(ID,ID_TS_BN,ID_TS_CB,ID_TS_MB,ID_TS_TD,NUMERO_DOC,FECHA,FECHA_PROC,
                ID_MAE_TER,VALOR,OBSERVACIONES,AFECTA_PAC,USUARIOLOG,FECHALOG,
                OFICINA,ID_MINERAL_CB,CONSECUTIVO_MB,ESTADO) 
values (null,$id_bn,$id_cb,$id_ts_mb,$id_ts_td,'$num_doc',
    to_date( substr( '$fecha_doc',0,10) ,'yyyy-mm-dd' ), to_date( substr('$fecha_facturacion',0,10) ,'dd-mm-yyyy'),
    $id_mae_ter,$total,$observaciones,'0','$username',
    sysdate,'$oficina',null,$consecutivo,null)   
EOD;
                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);

                        /*
                         * Despues se guarda el movimiento y se actualiza el consecutivo asi: 
                         */
                        $sub = substr($consecutivo, 4);
                        //sentencia sql
                        $sql = <<<EOD
update TS_MPT set consecutivo_mb = $sub 
EOD;

                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);
                    }
                    $sec_factura +=1;
                }
                $sec_factura = $sec_factura - 1;
                $sql = <<<EOD
                UPDATE CA_CONSECUTIVO_CAJA SET CONSEC_FAC = $sec_factura WHERE id_caja = $id_caja
EOD;
                $this->conn->execute($sql);


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

                $this->logMessage($mensaje);
            } else {

                $mensaje = "La caja esta cerrada, favor verificar.";
                $this->conn->commit();
                $this->list_data = array();
                $this->status = 1;
                $this->mensajeError = $mensaje;

                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            $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());
        }
    }

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



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

select tab0.id_factura, tab0.sec_factura,tab0.num_doc, tab0.fecha_doc, tab0.identificacion, tab0.razon_soc,
tab0.email, tab0.observaciones, decode(tab0.estado,1,'Creada',0,'Duplicada') AS TIPO, SUM(tab0.valor) AS VALOR


from CA_IMP_FACTURA_T tab0

group by tab0.id_factura, tab0.sec_factura,tab0.num_doc, tab0.fecha_doc, tab0.identificacion, tab0.razon_soc,
tab0.email, tab0.observaciones,tab0.estado
order by tab0.sec_factura

)
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_factura, tab0.sec_factura,tab0.num_doc, tab0.fecha_doc, tab0.identificacion, tab0.razon_soc,
tab0.email, tab0.observaciones, decode(tab0.estado,1,'Creada',0,'Duplicada') AS TIPO, SUM(tab0.valor) AS VALOR


from CA_IMP_FACTURA_T tab0

group by tab0.id_factura, tab0.sec_factura,tab0.num_doc, tab0.fecha_doc, tab0.identificacion, tab0.razon_soc,
tab0.email, tab0.observaciones,tab0.estado
order by tab0.sec_factura
          
) 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;
    }

}
