<?php

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

    /**
     * Executes index action
     *
     * @param sfRequest $request A request object
     */
    public function executeGenerarArchivoBogota(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_periodo = $request['id_periodo_filtro'];

        $cuentaDePago = $request['cuenta'];

        $banco = $request['banco'];


        //Funcionario num_doc
        $num_doc = null;
        $whereFuncionarioNumDoc = "";
        if (isset($request['num_doc'])) {
            $num_doc = $request['num_doc'];
            $whereFuncionarioNumDoc = " AND tab0.num_doc = '" . $request['num_doc'] . "'";
        }
        //Funcionario id_tipo_doc 
        $id_tipo_doc = null;
        $whereFuncionarioTipoDoc = "";
        if (isset($request['id_tipo_doc'])) {
            $id_tipo_doc = $request['id_tipo_doc'];
            $whereFuncionarioTipoDoc = " AND tab0.id_tipo_doc = " . $request['id_tipo_doc'];
        }


        /* TIPO BANCO
         * 1 -> BANCO DE BOGOTA
         * 2 -> BANCO DAVIVIENDA
         */

        $tipo_banco = $request['tipo_banco'];

        //SI ES 1 SE GENERARA EL FORMATO PARA BANCO DE BOGOTÁ

        if ($tipo_banco == 1) {

            $archivo = fopen("uploads/archivos_banco/pago" . $id_periodo . ".txt", "w"); //generacion del nuevo documento txt.
            $linea = "";


            /*
             * Nombre empresa - 20130702
             */
            $sql = <<<EOD
select 
translate(substr(NOMBRE_EMPRESA,0,40),'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as NOMBRE_EMPRESA,
ABREVIATURA,
DIRECCION,
TELEFONO,
NIT,
DIGITO_VERIFICACION(NIT) as dv,
PAIS,
CIUDAD,
REPRESENTANTE_LEGAL,
SECCION_PRESUPUESTAL,
CORREO_ELECTRONICO,
PAGINA_WEB,
FAX,
JEFEPRESUPUESTO,
CORREO_ENVIO,
JEFE_FINANCIERO,
CARGO_FINANCIERO,
APLICA_RETEIVA
from DATOS_COMPANIA 
EOD;
            //Ejecutar SQL
            $records = CN_TABLE::executeSQL($sql);

            $nombre_empresa = $records[0]['nombre_empresa'];
            $nit_empresa = $records[0]['nit'];
            $dv_empresa = $records[0]['dv'];

            $cabecera = $this->cabecera($cuentaDePago, $nombre_empresa, $nit_empresa, $dv_empresa);
            $band = 0;
            fputs($archivo, $cabecera . "\n");

            $consul = Doctrine_Manager::getInstance()->connection();

            /*
             * Se agrega campo pago_func para tenerlo en cuenta en el calculo del neto a pagar - 20130731
             * Validacion para no traer las personas retiradas en fechas anteriores al nuevo periodo - 20141202
             * Se cambia la validacion para los datos del banco, si la persona esta retirada trae el ultimo registro por fecha y estado de no_pago_func  - 20150226
             */
            $sql = "select tab0.*

            from(

            SELECT NUM_DOC, id_tipo_doc,
            translate(substr(nombre_apellido,0,40),'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as nombre_apellido,
            BANCO,CODIGO_ACH,NUM_CUENTA,TIPCUENTA,ID_PERIODO,SUM(NVL(VALOR,0)) AS VALOR

            FROM(

            select tab1.id_tipo_doc, tab1.num_doc,tab6.nombre_apellido,tab3.codigo||' '||tab3.descripcion AS BANCO, tab3.codigo_ach, tab2.num_cuenta, decode(tab4.id,1,'2',2,'1') AS TIPCUENTA,
            case when tab5.operador = 1 then tab1.valor_liquidado ELSE (tab1.valor_liquidado * -1) END AS VALOR,
            tab1.id_periodo

            from no_liquida_nomina tab1

            left join no_concep_nomina tab5 ON tab5.id_concep_nomina = tab1.id_concep_nomina

            left join no_datos_funcionario_v tab6  ON tab6.id_tipo_doc = tab1.id_tipo_doc and tab6.num_doc = tab1.num_doc

            --join no_pago_func tab2 ON tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
            left join (
                SELECT
                 aut.*,
                 ROW_NUMBER() OVER (
                  partition by aut.num_doc
                  ORDER BY aut.estado desc, aut.fecha_activacion desc
                 ) AS rn
                from no_pago_func aut
            )tab2 ON tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
            and tab2.rn = 1
            left join no_nombramiento_v tab7  ON tab7.id_tipo_doc = tab1.id_tipo_doc and tab7.num_doc = tab1.num_doc

            join ts_bn tab3 ON tab3.id_bn = tab2.id_bn

            join ts_tc tab4 ON tab4.id = tab2.tipo_cuenta

            where 
            tab5.pago_func = 1
            and (
                tab2.estado = 1
                or
                (
                    tab2.estado = 0 and tab7.estado = 0 and tab2.fecha_terminacion <= tab7.fecha_termina
                )
            )

            )
            group by NUM_DOC, id_tipo_doc,NOMBRE_APELLIDO,BANCO,CODIGO_ACH,NUM_CUENTA,TIPCUENTA,ID_PERIODO
            )tab0

            where tab0.id_periodo = $id_periodo and tab0.VALOR != 0 
            $whereFuncionarioTipoDoc $whereFuncionarioNumDoc 

            and tab0.NUM_DOC not in (
             select nom.NUM_DOC from no_nombramiento_v nom 
              where nom.fecha_retiro is not null
              and (select no_periodo.fecha_ini from no_periodo 
                    where id_periodo = $id_periodo) > trunc(last_day( nom.fecha_termina ))
            )
                    
            order by  tab0.NUM_DOC, tab0.id_tipo_doc ";


            $st = $consul->execute($sql);
            $pagos = $st->fetchAll();
            $consec = 1;
            foreach ($pagos as $pagos) {

                $linea = "";

                $valor = $pagos['VALOR'];

                /*
                 * Validar que solo muestre valores superiores a 0 - 20140408
                 */
                if ($valor > 0) {

                    $linea.="2C";

                    $ideAnt = $pagos['NUM_DOC'];

                    $nombde = trim($pagos['NOMBRE_APELLIDO']);
                    $nombde = str_replace("Ñ", "N", $nombde);
                    $nombde = str_replace("ñ", "n", $nombde);

                    $i = strlen($ideAnt);
                    for (; $i < 11; $i++) {
                        $linea.="0";
                    }
                    $linea.=$ideAnt; //R2_NITOCC


                    $linea.=$nombde; //R2_NOMBRE


                    $i = strlen($nombde);

                    for (; $i < 40; $i++) {//por si el nombre es menor a los 40
                        $linea.=" "; //escribimos espacios
                    }

                    $linea.="0"; //R2_CERO

                    $ticude = $pagos['TIPCUENTA'];
                    $cuende = $pagos['NUM_CUENTA'];
                    $banco = $pagos['CODIGO_ACH'];

                    if ($ticude == "1") {
                        $linea.="1"; //R2_TIPCUE
                    } else {
                        $linea.="2"; //R2_TIPCUE
                    }
                    $linea.=$cuende; //R2_CUENTA
                    $i = strlen($cuende);
                    for (; $i < 17; $i++) {
                        $linea.=" ";
                    }
                    $i = strlen($valor);
                    for (; $i < 16; $i++) {
                        $linea.="0";
                    }
                    $linea.=$valor; //R2_VALOR
                    $linea.="00";
                    $linea.="A"; //R2_FORPAG
                    $linea.="000"; //R2_CERO2
                    $linea.=$banco; //R2_BANCO
                    $linea.="0001"; //R2_CODCIU                                  OJO!!
                    for ($i = 0; $i < 9; $i++) {
                        $linea.=" "; //R2_ORIGEN
                    }
                    $linea.=" "; //R2_BLANCO
                    $linea.="PAGO_NOMINA_PERIODICA"; //R2_DESCRI
                    $i = strlen("PAGO NOMINA PERIODICA");
                    for (; $i < 70; $i++) {
                        $linea.=" "; //R2_DESCRI espacios en blanco
                    }
                    $linea.="0"; //R2_CERO3

                    $tamaño = strlen($consec);

                    $ceros = "";

                    for (; $tamaño < 3; $tamaño++) {
                        $ceros.="0"; //ceros de la numfac
                    }
                    $consec = $ceros . "" . $consec;

                    $linea.=$consec; //R2_NUMFAC  

                    $i = strlen($consec);
                    for (; $i < 10; $i++) {
                        $linea.=" "; //ceros de la numfac
                    }

                    $linea.="N"; //R2_INFO
                    for ($i = 0; $i < 48; $i++) {
                        $linea.=" "; //R2_BLANCO2
                    }
                    $linea.="N"; //R2_ENVIO
                    for ($i = 0; $i < 8; $i++) {
                        $linea.=" "; //R2_BLANCO3
                    }

                    fputs($archivo, $linea . "\n");

                    $consec++;
                }
            }

            fclose($archivo);
            echo "<script>
		window.location='../../../../nomina/web/uploads/archivos_banco/pago" . $id_periodo . ".txt' </script>";
            die();
        }
        //SI ES 2 SE GENERARA EL FORMATO PARA EL BANCO DAVIVIENDA

        if ($tipo_banco == 2) {

            $archivo = fopen("uploads/archivos_banco/pago" . $id_periodo . ".txt", "w"); //generacion del nuevo documento txt.
            $linea = "";


            $consul = Doctrine_Manager::getInstance()->connection();

            /*
             * Se agrega campo pago_func para tenerlo en cuenta en el calculo del neto a pagar - 20130731
             * Validacion para no traer las personas retiradas en fechas anteriores al nuevo periodo - 20141202
             * Se cambia la validacion para los datos del banco, si la persona esta retirada trae el ultimo registro por fecha y estado de no_pago_func  - 20150226
             */
            $sql = "select tab0.*

            from(

            SELECT NUM_DOC, id_tipo_doc,
            translate(substr(nombre_apellido,0,30),'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as nombre_apellido,
            BANCO,CODIGO_ACH,NUM_CUENTA,TIPCUENTA,ID_PERIODO,SUM(NVL(VALOR,0)) AS VALOR

            FROM(

            select tab1.id_tipo_doc, tab1.num_doc,tab6.nombre_apellido,tab3.codigo||' '||tab3.descripcion AS BANCO, tab3.codigo_ach, tab2.num_cuenta, tab4.id AS TIPCUENTA,
            case when tab5.operador = 1 then tab1.valor_liquidado ELSE (tab1.valor_liquidado * -1) END AS VALOR,
            tab1.id_periodo

            from no_liquida_nomina tab1

            left join no_concep_nomina tab5 ON tab5.id_concep_nomina = tab1.id_concep_nomina

            left join no_datos_funcionario_v tab6  ON tab6.id_tipo_doc = tab1.id_tipo_doc and tab6.num_doc = tab1.num_doc

            --join no_pago_func tab2 ON tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
            left join (
                SELECT
                 aut.*,
                 ROW_NUMBER() OVER (
                  partition by aut.num_doc
                  ORDER BY aut.estado desc, aut.fecha_activacion desc
                 ) AS rn
                from no_pago_func aut
            )tab2 ON tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
            and tab2.rn = 1
            left join no_nombramiento_v tab7  ON tab7.id_tipo_doc = tab1.id_tipo_doc and tab7.num_doc = tab1.num_doc

            join ts_bn tab3 ON tab3.id_bn = tab2.id_bn

            join ts_tc tab4 ON tab4.id = tab2.tipo_cuenta

            where 
            tab5.pago_func = 1
            and (
                tab2.estado = 1
                or
                (
                    tab2.estado = 0 and tab7.estado = 0 and tab2.fecha_terminacion <= tab7.fecha_termina
                )
            )

            )
            group by NUM_DOC, id_tipo_doc,NOMBRE_APELLIDO,BANCO,CODIGO_ACH,NUM_CUENTA,TIPCUENTA,ID_PERIODO
            )tab0

            where tab0.id_periodo = $id_periodo and tab0.VALOR != 0 
            $whereFuncionarioTipoDoc $whereFuncionarioNumDoc 

            and tab0.NUM_DOC not in (
             select nom.NUM_DOC from no_nombramiento_v nom 
              where nom.fecha_retiro is not null
              and (select no_periodo.fecha_ini from no_periodo 
                    where id_periodo = $id_periodo) > trunc(last_day( nom.fecha_termina ))
            )
                    
            order by  tab0.NUM_DOC, tab0.id_tipo_doc  ";

            $st = $consul->execute($sql);
            $pagos = $st->fetchAll();
            $consec = 1;
            foreach ($pagos as $pagos) {

                $linea = "";

                $valor = $pagos['VALOR'];

                /*
                 * Validar que solo muestre valores superiores a 0 - 20140408
                 */
                if ($valor > 0) {

                    $linea.=$pagos['CODIGO_ACH'];

                    $ideAnt = $pagos['NUM_DOC'];

                    $nombde = trim($pagos['NOMBRE_APELLIDO']);
                    $nombde = str_replace("Ñ", "N", $nombde);
                    $nombde = str_replace("ñ", "n", $nombde);

                    $linea.=$ideAnt; //R2_NITOCC

                    $i = strlen($ideAnt);
                    for (; $i < 15; $i++) {
                        $linea.=" ";
                    }




                    $linea.="1"; //TIPO IDENTIFICACION    

                    $ticude = $pagos['TIPCUENTA'];
                    $cuende = $pagos['NUM_CUENTA'];

                    $linea.=$cuende; //R2_CUENTA
                    $i = strlen($cuende);
                    for (; $i < 17; $i++) {
                        $linea.=" ";
                    }

                    if ($ticude == "1") {
                        $linea.="1"; //R2_TIPCUE
                    } else {
                        $linea.="0"; //R2_TIPCUE
                    }
                    $linea.=$nombde; //R2_NOMBRE

                    $i = strlen($nombde);

                    for (; $i < 30; $i++) {//por si el nombre es menor a los 40
                        $linea.=" "; //escribimos espacios
                    }
                    $valor = $valor . ".00";

                    $i = strlen($valor);
                    for (; $i < 16; $i++) {
                        $linea.="0";
                    }
                    $linea.=$valor; //R2_VALOR

                    $linea.="999"; //R2_CODCIU                                  OJO!!
                    $linea.="PAGO NOMINA"; //R2_DESCRI
                    $i = strlen("PAGO NOMINA");

                    fputs($archivo, $linea . "\n");
                }
            }

            fclose($archivo);
            echo "<script>
		window.location='../../../../nomina/web/uploads/archivos_banco/pago" . $id_periodo . ".txt' </script>";
            die();
        }

        /**
         * CYC :: SI ES 3 SE GENERARA EL FORMATO PARA EL BANCO BBVA - 20140129
         */
        if ($tipo_banco == 3) {

            $archivo = fopen("uploads/archivos_banco/pago" . $id_periodo . ".txt", "w"); //generacion del nuevo documento txt.
            $linea = "";


            $consul = Doctrine_Manager::getInstance()->connection();

            /*
             * Se agrega campo pago_func para tenerlo en cuenta en el calculo del neto a pagar - 20130731
             * Validacion para no traer las personas retiradas en fechas anteriores al nuevo periodo - 20141202
             * Se cambia la validacion para los datos del banco, si la persona esta retirada trae el ultimo registro por fecha y estado de no_pago_func  - 20150226
             */
            $sql = "select tab0.*

    from(
    
    SELECT NUM_DOC, id_tipo_doc,
    translate(substr(nombre_apellido,0,36),'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as nombre_apellido,
    codigo,BANCO,CODIGO_ACH,NUM_CUENTA,TIPCUENTA,ID_PERIODO,SUM(NVL(VALOR,0)) AS VALOR,
    email,
    trim(upper(TO_CHAR(fecha,'MONTH','nls_date_language=spanish'))) as mes
    
        FROM(
        
        select tab1.id_tipo_doc, tab1.num_doc,tab6.nombre_apellido,tab3.codigo,tab3.codigo||' '||tab3.descripcion AS BANCO, tab3.codigo_ach, tab2.num_cuenta, tab4.id AS TIPCUENTA,
        case when tab5.operador = 1 then tab1.valor_liquidado ELSE (tab1.valor_liquidado * -1) END AS VALOR,
        tab1.id_periodo,
        tab6.email,
        (select no_periodo.fecha_ini from no_periodo where id_periodo = tab1.id_periodo) as fecha
        
        from no_liquida_nomina tab1
        
        left join no_concep_nomina tab5 ON tab5.id_concep_nomina = tab1.id_concep_nomina
        
        left join no_datos_funcionario_v tab6  ON tab6.id_tipo_doc = tab1.id_tipo_doc and tab6.num_doc = tab1.num_doc
        
        --join no_pago_func tab2 ON tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
        left join (
            SELECT
             aut.*,
             ROW_NUMBER() OVER (
              partition by aut.num_doc
              ORDER BY aut.estado desc, aut.fecha_activacion desc
             ) AS rn
            from no_pago_func aut
        )tab2 ON tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
        and tab2.rn = 1
        left join no_nombramiento_v tab7  ON tab7.id_tipo_doc = tab1.id_tipo_doc and tab7.num_doc = tab1.num_doc
        
        join ts_bn tab3 ON tab3.id_bn = tab2.id_bn
        
        join ts_tc tab4 ON tab4.id = tab2.tipo_cuenta
        
        where 
        tab5.pago_func = 1
        and (
            tab2.estado = 1
            or
            (
                tab2.estado = 0 and tab7.estado = 0 and tab2.fecha_terminacion <= tab7.fecha_termina
            )
        )
    
    )
    group by NUM_DOC, id_tipo_doc,NOMBRE_APELLIDO,codigo,BANCO,CODIGO_ACH,NUM_CUENTA,TIPCUENTA,ID_PERIODO,email, fecha
)tab0

where tab0.id_periodo = $id_periodo and tab0.VALOR != 0 
            $whereFuncionarioTipoDoc $whereFuncionarioNumDoc 

            and tab0.NUM_DOC not in (
             select nom.NUM_DOC from no_nombramiento_v nom 
              where nom.fecha_retiro is not null
              and (select no_periodo.fecha_ini from no_periodo 
                    where id_periodo = $id_periodo) > trunc(last_day( nom.fecha_termina ))
            )
                    
            order by  to_number(tab0.NUM_DOC), tab0.id_tipo_doc  ";

            $st = $consul->execute($sql);
            $pagos = $st->fetchAll();
            $consec = 1;
            foreach ($pagos as $pagos) {

                $linea = "";
                $linea.="01";

                $ideAnt = $pagos['NUM_DOC']; //NITOCC
                $i = strlen($ideAnt);
                for (; $i < 15; $i++) {
                    $linea.="0";
                }
                $linea.=$ideAnt;

                $linea.="01"; //TIPO IDENTIFICACION  

                $ideCod = $pagos['CODIGO']; //BANCO
                $i = strlen($ideCod);
                for (; $i < 4; $i++) {
                    $linea.="0";
                }
                $linea.=$ideCod;

                /**
                 * si es del banco bbva
                 */
                if ($ideCod == '13') {
                    //se anexan ceros
                    $cuende = substr($pagos['NUM_CUENTA'], 0, 3) . "000200" . substr($pagos['NUM_CUENTA'], 3);
                } else {
                    $cuende = $pagos['NUM_CUENTA'];
                }
                $i = strlen($cuende);
                for (; $i < 16; $i++) {
                    $linea.="0";
                }
                $linea.=$cuende; //CUENTA

                $valor = $pagos['VALOR'];
                $i = strlen($valor);
                for (; $i < 32; $i++) {
                    $linea.="0";
                }
                $linea.=$valor; //R2_VALOR

                $linea.="0";
                $linea.=" ";

                $linea.="000000000000";

                $nombde = trim($pagos['NOMBRE_APELLIDO']);
                $nombde = str_replace("Ñ", "N", $nombde);
                $nombde = str_replace("ñ", "n", $nombde);
                $linea.=$nombde; //R2_NOMBRE
                $i = strlen($nombde);
                for (; $i < 36; $i++) {//por si el nombre es menor a los 36
                    $linea.=" "; //escribimos espacios
                }

                $banco = "BOGOTA"; //R2_DESCRI                
                $i = strlen($banco);
                $linea.=$banco;
                for (; $i < 72; $i++) {//por si el nombre es menor a los 12
                    $linea.=" "; //escribimos espacios
                }

                $mail = $pagos['EMAIL']; //EMAIL           
                $i = strlen($mail);
                $linea.= $mail;
                for (; $i < 48; $i++) {//por si el nombre es menor a los 48
                    $linea.=" "; //escribimos espacios
                }

                $obs = "NOMINA MES DE " . $pagos['MES']; //Obs           
                $i = strlen($obs);
                $linea.= $obs;
                for (; $i < 40; $i++) {//por si el nombre es menor a los 40
                    $linea.=" "; //escribimos espacios
                }

                fputs($archivo, $linea . "\n");
            }

            fclose($archivo);

            $this->logMessage(">>>> Found files");
            $uploadDir = sfConfig::get("sf_upload_dir");
            $this->logMessage($uploadDir);
            $Contacts_uploads = $uploadDir . "/archivos_banco/pago";

            // It will be called downloaded.pdf
            header('Content-Disposition: attachment; filename="pago' . $id_periodo . '.txt"');

            // The PDF source is in original.pdf
            readfile($Contacts_uploads . $id_periodo . ".txt");


//            echo "<script>
//		window.location='../../../../nomina/web/uploads/archivos_banco/pago" . $id_periodo . ".txt' </script>";
//            readfile("window.location='../../../../nomina/web/uploads/archivos_banco/pago" . $id_periodo . ".txt");
            die();
        }

        /**
         * COL :: SI ES 4 SE GENERARA EL FORMATO PARA EL BANCO POPULAR - 20140701
         * 
         * ACHPOPDE:  Detalles
          1  R2_TIPREG   Character      2
          2  R2_NITBEN   Character     15
          3  R2_VALTRA   Character     18
          4  R2_NOMBEN   Character     22
          5  R2_BANCO    Character      9
          6  R2_TIPTRA   Character      2 :  Tipo de cuenta bancaria destino, así:
          22= CUENTA CORRIENTE
          32= CUENTA DE AHORROS
          7  R2_CUENTA   Character     17
          8  R2_ICLIORI  Character     15
          9  R2_RESERVA  Character      2
          10  R2_PROPOSI  Character     10
          11  R2_REFEREN  Character     53
          12  R2_CAMPODI  Character      2
          13  R2_RESPU    Character     40
         * 
         */
        if ($tipo_banco == 4) {


            $archivo = fopen("uploads/archivos_banco/pago" . $id_periodo . ".txt", "w"); //generacion del nuevo documento txt.
            $linea = "";


            /*
             * Nombre empresa - 20130702
             */
            $sql = <<<EOD
select 
translate(substr(NOMBRE_EMPRESA,0,16),'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as NOMBRE_EMPRESA,
ABREVIATURA,
DIRECCION,
TELEFONO,
NIT,
DIGITO_VERIFICACION(NIT) as dv,
PAIS,
CIUDAD,
REPRESENTANTE_LEGAL,
SECCION_PRESUPUESTAL,
CORREO_ELECTRONICO,
PAGINA_WEB,
FAX,
JEFEPRESUPUESTO,
CORREO_ENVIO,
JEFE_FINANCIERO,
CARGO_FINANCIERO,
APLICA_RETEIVA
from DATOS_COMPANIA 
EOD;
            //Ejecutar SQL
            $records = CN_TABLE::executeSQL($sql);

            $nombre_empresa = $records[0]['nombre_empresa'];
            $nit_empresa = $records[0]['nit'];
            $dv_empresa = $records[0]['dv'];


            $sql = <<<EOD
select 
 
tab0.id_periodo,
count(*) as CANT,
sum(tab0.VALOR) as VALOR

    from(
    
    SELECT NUM_DOC, id_tipo_doc,
    translate(substr(nombre_apellido,0,22),'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as nombre_apellido,
    codigo,BANCO,CODIGO_ACH,NUM_CUENTA,
    
    case when TIPCUENTA = 1 then '32' else '22' end as TIPCUENTA,
    
    ID_PERIODO,SUM(NVL(VALOR,0)) AS VALOR,
    
    (select nit from datos_compania) as NITCIA,
    
    email,
    trim(upper(TO_CHAR(fecha,'MONTH','nls_date_language=spanish'))) as mes
    
        FROM(
        
        select tab1.id_tipo_doc, tab1.num_doc,tab6.nombre_apellido,tab3.CODIGO_ACH_BP as codigo,tab3.codigo||' '||tab3.descripcion AS BANCO, tab3.codigo_ach, tab2.num_cuenta, tab4.id AS TIPCUENTA,
        case when tab5.operador = 1 then tab1.valor_liquidado ELSE (tab1.valor_liquidado * -1) END AS VALOR,
        tab1.id_periodo,
        tab6.email,
        (select no_periodo.fecha_ini from no_periodo where id_periodo = tab1.id_periodo) as fecha
        
        from no_liquida_nomina tab1
        
        left join no_concep_nomina tab5 ON tab5.id_concep_nomina = tab1.id_concep_nomina
        
        left join no_datos_funcionario_v tab6  ON tab6.id_tipo_doc = tab1.id_tipo_doc and tab6.num_doc = tab1.num_doc
        
        --join no_pago_func tab2 ON tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
        left join (
            SELECT
             aut.*,
             ROW_NUMBER() OVER (
              partition by aut.num_doc
              ORDER BY aut.estado desc, aut.fecha_activacion desc
             ) AS rn
            from no_pago_func aut
        )tab2 ON tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
        and tab2.rn = 1
        left join no_nombramiento_v tab7  ON tab7.id_tipo_doc = tab1.id_tipo_doc and tab7.num_doc = tab1.num_doc
        
        join ts_bn tab3 ON tab3.id_bn = tab2.id_bn
        
        join ts_tc tab4 ON tab4.id = tab2.tipo_cuenta
        
        where 
        tab5.pago_func = 1
        and (
            tab2.estado = 1
            or
            (
                tab2.estado = 0 and tab7.estado = 0 and tab2.fecha_terminacion <= tab7.fecha_termina
            )
        )
    
    )
    group by NUM_DOC, id_tipo_doc,NOMBRE_APELLIDO,codigo,BANCO,CODIGO_ACH,NUM_CUENTA,TIPCUENTA,ID_PERIODO,email, fecha
)tab0

where tab0.id_periodo = $id_periodo and tab0.VALOR != 0 
            $whereFuncionarioTipoDoc $whereFuncionarioNumDoc 
                    
 group by
 tab0.id_periodo 
EOD;
            //Ejecutar SQL
            $records = CN_TABLE::executeSQL($sql);
            $numtra = $records[0]['cant'];
            $valtra = $records[0]['valor'];

            $cabecera = $this->cabeceraBP($cuentaDePago, $nombre_empresa, $nit_empresa, $dv_empresa, $numtra, $valtra);
            $band = 0;
            fputs($archivo, $cabecera . "\n");


            $consul = Doctrine_Manager::getInstance()->connection();

            /*
             * Se agrega campo pago_func para tenerlo en cuenta en el calculo del neto a pagar - 20130731
             * Validacion para no traer las personas retiradas en fechas anteriores al nuevo periodo - 20141202
             * Se cambia la validacion para los datos del banco, si la persona esta retirada trae el ultimo registro por fecha y estado de no_pago_func  - 20150226
             */
            $sql = "select tab0.*

    from(
    
    SELECT NUM_DOC, id_tipo_doc,
    translate(substr(nombre_apellido,0,22),'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as nombre_apellido,
    codigo,BANCO,CODIGO_ACH,NUM_CUENTA,
    
    case when TIPCUENTA = 1 then '32' else '22' end as TIPCUENTA,
    
    (select nit from datos_compania) as NITCIA,
    
    ID_PERIODO,SUM(NVL(VALOR,0)) AS VALOR,
    email,
    trim(upper(TO_CHAR(fecha,'MONTH','nls_date_language=spanish'))) as mes
    
        FROM(
        
        select tab1.id_tipo_doc, tab1.num_doc,tab6.nombre_apellido,tab3.CODIGO_ACH_BP as codigo,tab3.codigo||' '||tab3.descripcion AS BANCO, tab3.codigo_ach, tab2.num_cuenta, tab4.id AS TIPCUENTA,
        case when tab5.operador = 1 then tab1.valor_liquidado ELSE (tab1.valor_liquidado * -1) END AS VALOR,
        tab1.id_periodo,
        tab6.email,
        (select no_periodo.fecha_ini from no_periodo where id_periodo = tab1.id_periodo) as fecha
        
        from no_liquida_nomina tab1
        
        left join no_concep_nomina tab5 ON tab5.id_concep_nomina = tab1.id_concep_nomina
        
        left join no_datos_funcionario_v tab6  ON tab6.id_tipo_doc = tab1.id_tipo_doc and tab6.num_doc = tab1.num_doc
        
        --join no_pago_func tab2 ON tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
        left join (
            SELECT
             aut.*,
             ROW_NUMBER() OVER (
              partition by aut.num_doc
              ORDER BY aut.estado desc, aut.fecha_activacion desc
             ) AS rn
            from no_pago_func aut
        )tab2 ON tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
        and tab2.rn = 1
        left join no_nombramiento_v tab7  ON tab7.id_tipo_doc = tab1.id_tipo_doc and tab7.num_doc = tab1.num_doc
        
        join ts_bn tab3 ON tab3.id_bn = tab2.id_bn
        
        join ts_tc tab4 ON tab4.id = tab2.tipo_cuenta
        
        where 
        tab5.pago_func = 1
        and (
            tab2.estado = 1
            or
            (
                tab2.estado = 0 and tab7.estado = 0 and tab2.fecha_terminacion <= tab7.fecha_termina
            )
        )
    
    )
    group by NUM_DOC, id_tipo_doc,NOMBRE_APELLIDO,codigo,BANCO,CODIGO_ACH,NUM_CUENTA,TIPCUENTA,ID_PERIODO,email, fecha
)tab0

where tab0.id_periodo = $id_periodo and tab0.VALOR != 0 
            $whereFuncionarioTipoDoc $whereFuncionarioNumDoc 

            and tab0.NUM_DOC not in (
             select nom.NUM_DOC from no_nombramiento_v nom 
              where nom.fecha_retiro is not null
              and (select no_periodo.fecha_ini from no_periodo 
                    where id_periodo = $id_periodo) > trunc(last_day( nom.fecha_termina ))
            )
                    
            order by  to_number(tab0.NUM_DOC), tab0.id_tipo_doc  ";

            $st = $consul->execute($sql);
            $pagos = $st->fetchAll();
            $consec = 1;
            foreach ($pagos as $pagos) {

                $linea = "";
                $linea.="02"; //R2_TIPREG

                $ideAnt = $pagos['NUM_DOC']; //R2_NITBEN
                $i = strlen($ideAnt);
                $linea.=$ideAnt;
                for (; $i < 15; $i++) {
                    $linea.=" ";
                }

                $valor = $pagos['VALOR'] . "00"; // R2_VALTRA
                $i = strlen($valor);
                for (; $i < 18; $i++) {
                    $linea.="0";
                }
                $linea.=$valor;

                $nombde = trim($pagos['NOMBRE_APELLIDO']);
                $nombde = str_replace("Ñ", "N", $nombde);
                $nombde = str_replace("ñ", "n", $nombde);
                $linea.=$nombde; //R2_NOMBEN
                $i = strlen($nombde);
                for (; $i < 22; $i++) {//por si el nombre es menor a los 36
                    $linea.=" "; //escribimos espacios
                }


                $ideCod = $pagos['CODIGO']; //BANCO
                $i = strlen($ideCod);
                for (; $i < 9; $i++) {
                    $linea.="0";
                }
                $linea.= $ideCod;

                $linea.= $pagos['TIPCUENTA']; //R2_TIPTRA


                $cuende = $pagos['NUM_CUENTA'];
                $i = strlen($cuende);
                $linea.=$cuende; //R2_CUENTA
                for (; $i < 17; $i++) {
                    $linea.=" ";
                }

                $icliori = $pagos['NITCIA']; //R2_ICLIORI
                $i = strlen($icliori);
                $linea.=$icliori; //R2_CUENTA
                for (; $i < 15; $i++) {
                    $linea.=" ";
                }

                $linea.="  "; //R2_RESERVA

                $propo = "NOMINA"; //R2_PROPOSI
                $i = strlen($propo);
                $linea.=$propo; //R2_CUENTA
                for (; $i < 10; $i++) {
                    $linea.=" ";
                }

                $referen = "PAGO NOMINA FUNCIONARIOS"; //R2_REFEREN
                $i = strlen($referen);
                $linea.=$referen; //R2_CUENTA
                for (; $i < 53; $i++) {
                    $linea.=" ";
                }

                $linea.="V "; //R2_CAMPODI

                $respu = ""; //R2_RESPU
                $i = strlen($respu);
                $linea.=$respu; //R2_CUENTA
                for (; $i < 40; $i++) {
                    $linea.=" ";
                }

                fputs($archivo, $linea . "\n");
            }

            fclose($archivo);

            $this->logMessage(">>>> Found files");
            $uploadDir = sfConfig::get("sf_upload_dir");
            $this->logMessage($uploadDir);
            $Contacts_uploads = $uploadDir . "/archivos_banco/pago";

            // It will be called downloaded.pdf
            header('Content-Disposition: attachment; filename="pago' . $id_periodo . '.txt"');

            // The PDF source is in original.pdf
            readfile($Contacts_uploads . $id_periodo . ".txt");


//            echo "<script>
//		window.location='../../../../nomina/web/uploads/archivos_banco/pago" . $id_periodo . ".txt' </script>";
//            readfile("window.location='../../../../nomina/web/uploads/archivos_banco/pago" . $id_periodo . ".txt");
            die();
        }
    }

    /**
     * CABECERA PARA BANCO DE BOGOTÁ
     * 
     * @param type $cuenta
     * @return string
     */
    public function cabecera($cuenta, $nombre_empresa, $nit_empresa, $dv_empresa) {

        $fecha1 = date("Ymd");
        $linea = "1"; //R1_TIPREG
        $linea.=$fecha1; //R1_FECABO
        for ($i = 0; $i < 24; $i++) {
            $linea.="0"; //R1_CEROS
        }
        $linea.="1"; //R1_TIPCUE                                                  INCONSISTENCIAS
        for ($i = 0; $i < 8; $i++) {
            $linea.="0"; //R1_CEROS2                                              INCONSISTENCIAS
        }
        $i = strlen($cuenta);
        for (; $i < 9; $i++) {//si la cuenta es de longitud menor a 9
            $linea.="0"; //colocamos este simbolo antes para identificar OJO!!!
        }
        $linea.=$cuenta; //R1_CUENTA
        $linea.= $nombre_empresa; //R1_EMPRE
        $i = strlen($nombre_empresa);
        for (; $i < 40; $i++) {//si la R1_EMPRE es de longitud menor a 40
            $linea.=" "; //colocamos este simbolo antes para identificar OJO!!!
        }
        $linea.="0" . $nit_empresa . $dv_empresa; //R1_NITEMP
        $linea.="001"; //R1_TIPMOV
        $linea.="0001"; //R1_CODCIU
        $linea.=$fecha1; //R1_FECELA
        $linea.="000"; //R1_CODBAN
        $linea.="N"; //R1_TIPIDE
        for ($i = 0; $i < 48; $i++) {
            $linea.=" "; //R1_BLANCO
        }
        $linea.=" "; //R1_ENVIO
        for ($i = 0; $i < 80; $i++) {
            $linea.=" "; //R1_BLANCO2
        }

        return $linea;
    }

    /**
     * CABECERA PARA BANCO POPULAR - 20140702
     * 
     * Cabecera,  

      1  R1_TIPREG   Character      2
      2  R1_FECAPL   Character      8
      3  R1_NOMEMP   Character     16
      4  R1_CTADEB   Character     12
      5  R1_NITEMP   Character     10
      6  R1_NUMTRA   Character      6       numero de registros tipo 2
      7  R1_VALTRA   Character     18
      8  R1_NOMARC   Character     12
      9  R1_DESLOT   Character     10
      10  R1_CAMPO    Character     71
      11  R1_CAMPO2   Character      2
      12  R1_CAMPO3   Character     40

     * @param type $cuenta
     * @return string
     */
    public function cabeceraBP($cuenta, $nombre_empresa, $nit_empresa, $dv_empresa, $numtra, $valtra) {

        $fecha1 = date("Ymd");
        $linea = "01"; //R1_TIPREG        
        $linea.=$fecha1; //R1_FECABO

        $linea.= $nombre_empresa; //R1_EMPRE
        $i = strlen($nombre_empresa);
        for (; $i < 16; $i++) {//si la R1_EMPRE es de longitud menor a 16
            $linea.=" ";
        }


        $i = strlen($cuenta);
        $linea.=$cuenta; //R1_CUENTA
        for (; $i < 12; $i++) {//si la cuenta es de longitud menor a 9
            $linea.=" ";
        }

        $linea.= $nit_empresa . " "; //R1_NITEMP


        $cant = $numtra; //R1_NUMTRA : numero de registros tipo 2
        $i = strlen($cant);
        for (; $i < 6; $i++) {
            $linea.="0";
        }
        $linea.=$cant;

        $valor = $valtra . "00"; //R1_VALTRA
        $i = strlen($valor);
        for (; $i < 18; $i++) {
            $linea.="0";
        }
        $linea.=$valor;

        $linea.= "            "; //R1_NOMARC

        $propo = "NOMINA"; //R1_DESLOT
        $i = strlen($propo);
        $linea.=$propo;
        for (; $i < 10; $i++) {
            $linea.=" ";
        }

        $campo = ""; //R1_CAMPO
        $i = strlen($campo);
        $linea.=$campo;
        for (; $i < 71; $i++) {
            $linea.=" ";
        }

        $linea.= "V "; //R1_CAMPO2

        $linea.= ""; //R1_CAMPO3
        for ($i = 0; $i < 40; $i++) {
            $linea.=" "; //R1_BLANCO
        }

        return $linea;
    }

}
