<?php

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

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

        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");


        /**
         * Borra los archivos del directorio
         */
        $dir = "uploads/archivos_siif/";
        $ficheroseliminados = 0;
        $handle = opendir($dir);
        while ($file = readdir($handle)) {
            if (is_file($dir . $file)) {
                if (unlink($dir . $file)) {
                    $ficheroseliminados++;
                }
            }
        }

        /*
         * Manejo de errores
         */
        try {
            /*
             * Variables obligatorias
             */
            $cia = $request['id_cia'];
            $fecha_ini = $request['fecha_ini'];
            $fecha_fin = $request['fecha_fin'];

            //formato
            $request['formato_val'] = 0;
            $formato_tex = "";
            $formato_val = $request['formato_val'];

            /**
             * Generar archivos SIIF
             */
            $this->generarArchivoSiif($request);


            /**
             * Generar el archivo .ZIP
             */
            $ruta = "uploads/archivos_siif/";
            //tipo de consulta
            $nombre = "archivos_siif_obligaciones.zip";
            $this->generarArchivoZip($ruta, $nombre);

            echo "Generacion Terminada";
            die();
        } catch (Exception $e) {

            $this->logMessage("Error en construccion archivos SIIF." . $e->getMessage());

            echo "Error en construccion archivos SIIF.";
            die();

            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Generar archivos siif
     * 
     * @param sfWebRequest $request
     * @param type $di_ini
     * @param type $di_fin
     */
    function generarArchivoSiif(sfWebRequest $request) {

        //tomar variables del request
        $cia = $request['id_cia'];
        $type = $request['type'];
        $codigolog = date('Ymd His');

        /*
         * Variables obligatorias
         */
        $fecha_ini_text = $request['fecha_ini_text'];
        $fecha_fin_text = $request['fecha_fin_text'];

        /*
         * Variables opcionales
         */
        //id_contratista
        if (isset($request['id_contratista'])) {
            $whereIdContratista = " AND tab0.id_contratista = " . $request['id_contratista'];
        } else {
            $whereIdContratista = ' ';
        }
        //id_contrato
        if (isset($request['id_contrato'])) {
            $whereIdContrato = " AND tab0.id_contrato = " . $request['id_contrato'];
        } else {
            $whereIdContrato = ' ';
        }
        //id_numero_pago
        if (isset($request['id_numero_pago'])) {
            $whereIdNumeroPago = " AND tab0.id_numero_pago = " . $request['id_numero_pago'];
        } else {
            $whereIdNumeroPago = ' ';
        }
        //usuario_asignado
        if (isset($request['usuario_asignado'])) {
            $whereUsuarioAsignado = " AND tab0.usuario_asignado = '" . $request['usuario_asignado'] . "'";
        } else {
            $whereUsuarioAsignado = ' ';
        }
        //Recurso: 0-ANM 1-SGR
        $recurso = '';
        if (isset($request['recurso'])) {
            if ($request['recurso'] == 1) {
                $recurso = ' SGR';
                $whereTipoRecurso = " AND tab0.tipo_recurso = 1 ";
            } elseif ($request['recurso'] == 0 && $request['recurso'] != 'false') {
                $recurso = ' PGN';
                $whereTipoRecurso = " AND tab0.tipo_recurso = 0 ";
            } else {
                $whereTipoRecurso = " ";
            }
        } else {
            $whereTipoRecurso = "";
        }

        $filtro_clase_presup = "";
        $filtro_rub = "";
        if (isset($request['clasepresup'])) {
            if ($request['clasepresup'] == 8) {
                $clasepresup = 8;
                $filtro_rub = "and rub.id_clase_presup = " . $clasepresup;
            } elseif ($request['clasepresup'] == 9) {
                $clasepresup = 9;
                $filtro_rub = "and rub.id_clase_presup = " . $clasepresup;
            } else {
                $clasepresup = 0;
            }

            if ($clasepresup != 0) {
                /**
                 * Filtro por clase presupuestal 8-funcionamiento o 9-inversion - 20220405::LAVILA
                 */
                $filtro_clase_presup = <<<EOD
and tab0.id_formato_pago in (

    select
    forrp.id_formato_pago
    
    from rvc_formato_proy_rp forrp
    
    join rvc_formato_pago forpag
    on forrp.id_formato_pago = forpag.id_formato_pago
    
    left join pr_rubro_pgnsgr_v rub
    on rub.id_rubro = forrp.id_rubro
    and rub.sgr = forrp.is_rp_sgr
    
    where
    rub.id_clase_presup = $clasepresup                            
    and forrp.valor != 0
    and forpag.estado = 1
    and forpag.cargasiif = 1
    and trunc(forpag.fecha_radicado) between to_date('$fecha_ini_text','yyyy-mm-dd') and to_date('$fecha_fin_text','yyyy-mm-dd')

)
EOD;
            }
        }

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

        /**
         * GENERAL
          Consulta tabla principal RVC_FORMATO_PROY_RP y RVC_FORMATO_PAGO
          Filtros fecha radicado y en estado asignada
         *  Incidente #30066, fecha_radicado fecha actual - 20220606::LAVILA
         *  Incidente #32229, estructura del concepto - 20221011::LAVILA
         */
        /**
         * Generar archivo tipo 1-Cabecera
         */
        $sql = <<<EOD
select 
rownum as consecutivo,
record.fecha,
record.PCIConexion,
record.rp,
record.fecha_pago,
record.moneda,
record.TipoCuentaPorPagar,                
record.valor_iva,
record.tipo_doc_sop,
record.no_radicado,
to_char(trunc(sysdate),'yyyy/mm/dd') as fecha_radicado,
record.expedidor,
record.supervisor,
record.cargo,
record.texto
                
from(   
                
    select        
    to_char(trunc(sysdate),'yyyy/mm/dd') as fecha,
    case when tipo_recurso = 0 then dat.CODIGO_SIIF else dat.CODIGO_SPGR end as PCIConexion,
    tab0.id_rp_proyrp as rp,      
    to_char(trunc(sysdate),'yyyy/mm/dd') as fecha_pago,
    'NO' as moneda,
    /*case when tipo_recurso = 0
          then case when tab0.declarante_renta = 1 then '31' else '64' end
          else case when tab0.declarante_renta = 1 then '053' else '054' end end as TipoCuentaPorPagar,*/
    case when tipo_recurso = 0
      then case when tab0.RESPONSABLE_FACT_ELECT = 1 then '93' else '103' end
      else case when tab0.RESPONSABLE_FACT_ELECT = 1 then '93' else '28' end end as TipoCuentaPorPagar,
    '0' || replace(replace(to_char(0,'9999999.99'),'.',','),' ','') as valor_iva,
    11 as tipo_doc_sop,
    'RVC-' || tab0.numero_radicado as no_radicado,
    to_char(tab0.fecha_radicado,'yyyy/mm/dd') as fecha_radicado,
    11 as expedidor,
    upper(tab0.razon_soc_sup) as supervisor,
    'SUPERVISOR' as cargo,
    --'RVC '|| tab0.numero_radicado ||' CTO '|| tab0.num_contrato ||' '|| upper(tab0.pago_text) ||' PAGO - PERIODO '|| trim(upper(to_char(tab0.FECHA_INI_PAGO,'MONTH','nls_date_language=spanish'))) ||'/'|| to_char(tab0.FECHA_INI_PAGO,'yy') ||' '|| ' - RP '|| tab0.id_rp_proyrp as texto,
    --'RVC '|| tab0.numero_radicado ||' CTO '|| tab0.num_contrato ||' '|| upper(tab0.pago_text) ||' PAGO - PERIODO '|| to_char(tab0.FECHA_INI_PAGO,'yyyy-mm-dd') ||' A '|| to_char(tab0.FECHA_FIN_PAGO,'yyyy-mm-dd') ||' '|| ' - RP '|| tab0.id_rp_proyrp  || ' ASIG. ' || upper(tab0.RAZON_SOC_USU_ASIGNA) as texto,
    'RVC '|| tab0.numero_radicado ||' CTO'|| tab0.num_contrato ||' P'|| tab0.id_numero_pago ||' P'|| to_char(tab0.FECHA_INI_PAGO,'MON')|| to_char(tab0.FECHA_INI_PAGO,'YY') || ' - RP '|| tab0.id_rp_proyrp  || ' ASIG. ' || upper(tab0.RAZON_SOC_USU_ASIGNA) as texto

    from(

        select
        proyrp.is_rp_sgr as tipo_recurso,
        proyrp.id_rp as id_rp_proyrp,
        proyrp.vigencia_rp,
        proyrp.is_rp_sgr,

        contra.declarante_renta,
        cont.razon_soc_sup,
        contra.profesion,
        cont.num_contrato,
        nump.descripcion as pago_text,

        forpag.*

        from rvc_formato_pago_v forpag

        left join rvc_contrato_v cont
        on forpag.id_contrato = cont.id_contrato

        left join rvc_contratista_v contra
        on forpag.id_contratista = contra.id_contratista

        left join ts_tc tc
        on tc.id = contra.tipo_cuenta

        left join rvc_numero_pago nump
        on nump.id_numero_pago = forpag.id_numero_pago

        left join(

            select
            id_formato_pago,
            id_rp,
            vigencia_rp,
            is_rp_sgr,
            sum(valor) as valor
            from
            rvc_formato_proy_rp
            where
            valor != 0
            group by
            id_formato_pago,
            id_rp,
            vigencia_rp,
            is_rp_sgr

        )proyrp
        on proyrp.id_formato_pago = forpag.id_formato_pago

        where
        forpag.estado = 1
        and forpag.estado_general = 10
        and trunc(forpag.fecha_radicado) between to_date('$fecha_ini_text','yyyy-mm-dd') and to_date('$fecha_fin_text','yyyy-mm-dd')

    )tab0

    left join datos_compania dat
    on dat.id = 1

    where
    1 = 1
    $whereIdContratista
    $whereIdContrato
    $whereIdNumeroPago
    $whereTipoRecurso
    $whereUsuarioAsignado
    $filtro_clase_presup  

    order by
    tab0.fecha_radicado,
    tab0.radicado  
    
)record                 
EOD;
        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);

        $i = 1;
        //CONSECUTIVO;FECHA;PCI;RP;FECHA_PAGO;MONEDA;TIPO_CUENTA;VALOR_IVA;TIPO_DOCSOP;NO_RADICADO;FECHA_RADICADO;EXPEDIDOR;SUPERVISOR;CARGO;TEXTO;C1;C2
        foreach ($records as $rec) {
            $records1["tipo1" . $i] = array(
                "CONSECUTIVO" => $rec['consecutivo'],
                "FECHA" => $rec['fecha'],
                "PCI" => $rec['pciconexion'],
                "RP" => $rec['rp'],
                "FECHA_PAGO" => $rec['fecha_pago'],
                "MONEDA" => $rec['moneda'],
                "TIPO_CUENTA" => $rec['tipocuentaporpagar'],
                "VALOR_IVA" => $rec['valor_iva'],
                "TIPO_DOCSOP" => $rec['tipo_doc_sop'],
                "NO_RADICADO" => $rec['no_radicado'],
                "FECHA_RADICADO" => $rec['fecha_radicado'],
                "EXPEDIDOR" => $rec['expedidor'],
                "SUPERVISOR" => $rec['supervisor'],
                "CARGO" => $rec['cargo'],
                "TEXTO" => $rec['texto'],
                "C1" => '',
                "C2" => ''
            );
            /*
             * contador filas
             */
            $i++;
        }

        /**
         * Generar archivo tipo 2-Items Rubros
         * Cambios - 20220331::LAVILA
         * atributo_contable por defecto siempre 5
         * tipo_gasto - LOS DE INVERSION VAN A TABLA TCON 12(CUANDO ESTA EN TCON 12  QUEDA EN BLANCO)
          A-05 =39
          PROYECTO  NO GENERA CONOCIMIENTO= 21
          PROYECTO  SI GENERA CONOCIMIENTO =59
         * cuenta_contable - 20220506::LAVILA
         Solo se completa para los que tiene uso_contable. se lleno con TCON12, TCON07 no completa el campo USO
         */
        $sql = <<<EOD
select
    
tab0.consecutivo as consecutivo,
rownum as consec_item,
tab0.proyecto,
tab0.rubro,
tab0.recurso,
tab0.fuente,
tab0.csf_ssf,
to_char(tab0.valor_bruto) || case when '$type' != 'xls' then ',00000000' else '' end as valor_bruto,
                
tab0.atributo_contable as atributo_contable,
case 
    when tab0.rubro like '%C%' then ''
    when tab0.rubro like '%A-05%' then '39'
    when upper(tab0.conocgeocientifico) = 'NO' then '21'
    when upper(tab0.conocgeocientifico) = 'SI' then '59'
else '' end as tipo_gasto,
tab0.tipo_operacion as tipo_operacion,
tab0.uso_contable as uso_contable,
case 
    when tab0.uso_contable is not null then tab0.cuenta_contable 
else null end as cuenta_contable

from(

    select
    tab0.id_formato_pago,
    
    tab0.consecutivo as consecutivo,
    null as consec_item,
    proyrp.codigo as proyecto,
    proyrp.rubro as rubro,
    proyrp.tiprec as recurso,
    lpad(proyrp.ff,2,'0') as fuente,
    proyrp.csf_ssf as csf_ssf,
    nvl(proyrp.valor,0) as valor_bruto,
                
    5 as atributo_contable,
    proyrp.tipo_gasto as tipo_gasto,
    proyrp.tipo_operacion as tipo_operacion,
    proyrp.uso_contable as uso_contable,
    proyrp.cuenta_contable as cuenta_contable,
                
    proyccg.conocgeocientifico
    
    from(
        select 
        rownum as consecutivo,
        record.*
        from( 
    
            select 
            tab0.*

            from(

                select
                proyrp.is_rp_sgr as tipo_recurso,
                proyrp.id_rp as id_rp_proyrp,
                proyrp.vigencia_rp,
                proyrp.is_rp_sgr,

                contra.declarante_renta,
                cont.razon_soc_sup,
                contra.profesion,
                cont.num_contrato,
                nump.descripcion as pago_text,

                forpag.*

                from rvc_formato_pago_v forpag

                left join rvc_contrato_v cont
                on forpag.id_contrato = cont.id_contrato

                left join rvc_contratista_v contra
                on forpag.id_contratista = contra.id_contratista

                left join ts_tc tc
                on tc.id = contra.tipo_cuenta

                left join rvc_numero_pago nump
                on nump.id_numero_pago = forpag.id_numero_pago

                left join(

                    select
                    id_formato_pago,
                    id_rp,
                    vigencia_rp,
                    is_rp_sgr,
                    sum(valor) as valor
                    from
                    rvc_formato_proy_rp
                    where
                    valor != 0
                    group by
                    id_formato_pago,
                    id_rp,
                    vigencia_rp,
                    is_rp_sgr

                )proyrp
                on proyrp.id_formato_pago = forpag.id_formato_pago

                where
                forpag.estado = 1
                and forpag.estado_general = 10
                and trunc(forpag.fecha_radicado) between to_date('$fecha_ini_text','yyyy-mm-dd') and to_date('$fecha_fin_text','yyyy-mm-dd')

            )tab0

            left join datos_compania dat
            on dat.id = 1

            where
            1 = 1
            $whereIdContratista
            $whereIdContrato
            $whereIdNumeroPago
            $whereTipoRecurso
            $whereUsuarioAsignado
            $filtro_clase_presup

            order by
            tab0.fecha_radicado,
            tab0.radicado
        )record         
    )tab0
            
    left join(
    
        select
        forrp.id_formato_pago,
        formproy.id_cpo,
        forrp.id_rp,
        forrp.vigencia_rp,
        forrp.is_rp_sgr,
        forrp.id_rubro,
        sum(forrp.valor) as valor,
        
        proy.codigo,
        rub.codigo_rubro_text as rubro,
        tiprec.codigo as tiprec,
        REPLACE(agrup.codigo,'0','') as ff,
        '01' as csf_ssf,
        
        max(forrp.tipo_gasto) as tipo_gasto,
        max(forrp.tipo_operacion) as tipo_operacion,
        max(forrp.uso_contable) as uso_contable,
        max(forrp.cuenta_contable) as cuenta_contable
        
        from rvc_formato_proy_rp forrp
        
        left join rvc_formato_proyecto formproy
        on formproy.id_formato_pago = forrp.id_formato_pago
        and formproy.id_proyecto_ep = forrp.id_proyecto_ep
        
        left join co_proyectos_all_v proy
        on proy.id = formproy.id_cpo
        and proy.sgr = formproy.sgr
        
        left join pr_rubro_pgnsgr_v rub
        on rub.id_rubro = forrp.id_rubro
        and rub.sgr = forrp.is_rp_sgr
        
        left join pr_tipo_rec tiprec
        on tiprec.id = forrp.id_tipo_rec
        
        left join pr_agrup_rec agrup
        on agrup.id = tiprec.id_agrup
        
        where
        forrp.valor != 0
        $filtro_rub        
        
        group by
        forrp.id_formato_pago,
        formproy.id_cpo,
        forrp.id_rp,
        forrp.vigencia_rp,
        forrp.is_rp_sgr,
        forrp.id_rubro,
        
        proy.codigo,
        rub.codigo_rubro_text,
        tiprec.codigo,
        agrup.codigo
    
    )proyrp
    on proyrp.id_formato_pago = tab0.id_formato_pago
    and proyrp.id_rp = tab0.id_rp_proyrp

    left join ccg_proyectos proyccg
    on proyccg.sgccode = proyrp.codigo
        
    order by
    tab0.consecutivo,
    proyrp.codigo,
    proyrp.rubro

)tab0 
EOD;
        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);

        $i = 1;
        //CONSECUTIVO;NUMERO_REGISTRO;PROYECTO;RUBRO;RECURSO;FUENTE;CSF_SSF;VALOR_BRUTO;ATRIBUTO_CONTABLE;TIPO_GASTO;TIPO_OPERACION;USO_CONTABLE;CUENTA_CONTABLE
        foreach ($records as $rec) {
            $records2["tipo2" . $i] = array(
                "CONSECUTIVO" => $rec['consecutivo'],
                "NUMERO_REGISTRO" => $rec['consec_item'],
                "PROYECTO" => $rec['proyecto'],
                "RUBRO" => $rec['rubro'],
                "RECURSO" => $rec['recurso'],
                "FUENTE" => $rec['fuente'],
                "CSF_SSF" => $rec['csf_ssf'],
                "VALOR_BRUTO" => $rec['valor_bruto'],
                "ATRIBUTO_CONTABLE" => $rec['atributo_contable'],
                "TIPO_GASTO" => $rec['tipo_gasto'],
                "TIPO_OPERACION" => $rec['tipo_operacion'],
                "USO_CONTABLE" => $rec['uso_contable'],
                "CUENTA_CONTABLE" => $rec['cuenta_contable']
            );
            /*
             * contador filas
             */
            $i++;
        }

        /**
         * Generar archivo tipo 3-Deducciones
         * Incidente #32505, se coloca datos para estapilla - 20221102::LAVILA
         */
        $sql = <<<EOD
select 
    
tab0.consecutivo,
rownum as secuencial,
tab0.posicion_pago,
tab0.naturaleza,
tab0.nit,
tab0.base_gravable,
replace(replace(to_char(tarifa,'99999.99999'),'.',','),' ','') as tarifa,
tab0.valor_deduccion 

from(

    select
    
    tab0.id_formato_pago,
    deduc.codigo_ref,
    
    tab0.consecutivo as consecutivo,
    case when tab0.tipo_recurso = 0 then deduc.codigo_siif_cppgn else deduc.codigo_siif_cpsgr end as posicion_pago,
    deduc.naturaleza as naturaleza,
    deduc.num_doc as nit,
    nvl(deduc.base_gravable,0) as base_gravable,
    nvl(deduc.tatifa,0) as tarifa,
    nvl(deduc.valor_deduccion,0) as valor_deduccion 
    
    from(
                
        select 
        rownum as consecutivo,
        record.*

        from( 
    
            select
            tab0.id_formato_pago,
            tab0.tipo_recurso,

            to_char(trunc(sysdate),'dd/mm/yyyy') as fecha,
            case when tipo_recurso = 0 then dat.CODIGO_SIIF else dat.CODIGO_SPGR end as PCIConexion,
            tab0.id_rp_proyrp as rp,      
            to_char(trunc(sysdate),'dd/mm/yyyy') as fecha_pago,
            'NO' as moneda,
            case when tipo_recurso = 0
                  then case when tab0.declarante_renta = 1 then '31' else '64' end
                  else case when tab0.declarante_renta = 1 then '053' else '054' end end as TipoCuentaPorPagar,
            0 as valor_iva,
            11 as tipo_doc_sop,
            'RVC-' || tab0.numero_radicado as no_radicado,
            to_char(tab0.fecha_radicado,'dd/mm/yyyy') as fecha_radicado,
            11 as expedidor,
            upper(tab0.razon_soc_sup) as supervisor,
            'SUPERVISOR' as cargo,
            'RVC '|| tab0.numero_radicado ||' CTO '|| tab0.num_contrato ||' '|| upper(tab0.pago_text) ||' PAGO - PERIODO '|| trim(upper(to_char(tab0.FECHA_INI_PAGO,'MONTH','nls_date_language=spanish'))) ||'/'|| to_char(tab0.FECHA_INI_PAGO,'yy') ||' '|| ' - RP '|| tab0.id_rp_proyrp as texto

            from(

                select
                proyrp.is_rp_sgr as tipo_recurso,
                proyrp.id_rp as id_rp_proyrp,
                proyrp.vigencia_rp,
                proyrp.is_rp_sgr,

                contra.declarante_renta,
                cont.razon_soc_sup,
                contra.profesion,
                cont.num_contrato,
                nump.descripcion as pago_text,

                forpag.*

                from rvc_formato_pago_v forpag

                left join rvc_contrato_v cont
                on forpag.id_contrato = cont.id_contrato

                left join rvc_contratista_v contra
                on forpag.id_contratista = contra.id_contratista

                left join ts_tc tc
                on tc.id = contra.tipo_cuenta

                left join rvc_numero_pago nump
                on nump.id_numero_pago = forpag.id_numero_pago

                left join(

                    select
                    id_formato_pago,
                    id_rp,
                    vigencia_rp,
                    is_rp_sgr,
                    sum(valor) as valor
                    from
                    rvc_formato_proy_rp
                    where
                    valor != 0
                    group by
                    id_formato_pago,
                    id_rp,
                    vigencia_rp,
                    is_rp_sgr

                )proyrp
                on proyrp.id_formato_pago = forpag.id_formato_pago

                where
                forpag.estado = 1
                and forpag.estado_general = 10
                and trunc(forpag.fecha_radicado) between to_date('$fecha_ini_text','yyyy-mm-dd') and to_date('$fecha_fin_text','yyyy-mm-dd')

            )tab0

            left join datos_compania dat
            on dat.id = 1

            where
            1 = 1
            $whereIdContratista
            $whereIdContrato
            $whereIdNumeroPago
            $whereTipoRecurso
            $whereUsuarioAsignado
            $filtro_clase_presup

            order by
            tab0.fecha_radicado,
            tab0.radicado 
            
        )record
    
    )tab0    
    
    left join(
    
        select
        
        tab0.id_formato_pago,
        
        tab0.codigo_ref,
        
        tab0.codigo_siif_cppgn,
        tab0.codigo_siif_cpsgr,
        
        '01' as naturaleza,
        tab0.num_doc,
        
        case 
        when tab0.codigo_ref = 'RETE' then tab0.valor_base_reten
        when tab0.codigo_ref = 'IVA' then tab0.valor_base_iva
        when tab0.codigo_ref = 'ICA' and tab0.id_ciudad_formpag = tab0.id_ciudad then tab0.valor_base_ica
        when tab0.codigo_ref = 'ESTAM' then tab0.valor_base_estampilla
        else 0 end as base_gravable,
        
        case 
        when tab0.codigo_ref = 'RETE' then tab0.tarifa_reten
        when tab0.codigo_ref = 'IVA' then tab0.tarifa_iva
        when tab0.codigo_ref = 'ICA' and tab0.id_ciudad_formpag = tab0.id_ciudad then tab0.tarifa_ica
        when tab0.codigo_ref = 'ESTAM' then tab0.tarifa_estampilla
        else 0 end as tatifa,
        
        case 
        when tab0.codigo_ref = 'RETE' then tab0.valor_retencion
        when tab0.codigo_ref = 'IVA' then tab0.valor_iva_reg
        when tab0.codigo_ref = 'ICA' and tab0.id_ciudad_formpag = tab0.id_ciudad then tab0.valor_ica
        when tab0.codigo_ref = 'ESTAM' then tab0.valor_estampilla
        else 0 end as valor_deduccion
        
        from(
            select
            formpag.id_formato_pago,
            formpag.id_ciudad as id_ciudad_formpag,
            
            tip.codigo_ref,
            tip.descripcion,
            tip.id_ciudad,
            tip.id_catalogo_pago_pgn,
            tip.id_catalogo_pago_sgr,
            tip.id_mae_ter,
            tip.codigo_siif_cppgn,
            tip.codigo_siif_cpsgr,
            tip.num_doc,
            
            formpag.valor_base_reten,
            formpag.tarifa_reten,
            formpag.valor_retencion,
            
            formpag.valor_iva as valor_base_iva,
            15 as tarifa_iva,
            formpag.valor_iva_reg,
            
            formpag.valor_base_ica,
            (100*nvl(act.tarifa_por_mil,0))/1000 as tarifa_ica,
            formpag.valor_ica,
            
            formpag.valor_base_estampilla,
            formpag.tarifa_estampilla,
            formpag.valor_estampilla
            
            from rvc_formato_pago_v formpag
            
            left join rvc_actividad_ciiu act
            on act.id_actividad_ciiu = formpag.id_actividad_ciiu
            
            left join rvc_tipo_deduc_cat_pag_v tip
            on tip.id_tipo_deduc_cat_pag != 0
            
            where
            formpag.estado = 1
            and formpag.estado_general = 10
            and trunc(formpag.fecha_radicado) between to_date('$fecha_ini_text','yyyy-mm-dd') and to_date('$fecha_fin_text','yyyy-mm-dd')
        
        )tab0
    
    )deduc
    on deduc.id_formato_pago = tab0.id_formato_pago
    and deduc.valor_deduccion > 0
    
    order by
    tab0.consecutivo,
    case when tab0.tipo_recurso = 1 then deduc.codigo_siif_cppgn else deduc.codigo_siif_cpsgr end
        
)tab0
    
where
tab0.valor_deduccion > 0 
EOD;
        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);

        $i = 1;
        //CONSECUTIVO;SECUENCIAL;POSICION_PAGO;NATURALEZA;NIT;BASE_GRAVABLE;TARIFA;VALOR_DEDUCCION
        foreach ($records as $rec) {
            $records3["tipo3" . $i] = array(
                "CONSECUTIVO" => $rec['consecutivo'],
                "SECUENCIAL" => $rec['secuencial'],
                "POSICION_PAGO" => $rec['posicion_pago'],
                "NATURALEZA" => $rec['naturaleza'],
                "NIT" => $rec['nit'],
                "BASE_GRAVABLE" => $rec['base_gravable'],
                "TARIFA" => $rec['tarifa'],
                "VALOR_DEDUCCION" => $rec['valor_deduccion']
            );
            /*
             * contador filas
             */
            $i++;
        }

        /**
         * Generar archivo tipo 4-Usos
         */
        $sql = <<<EOD
select

tabla.consec_item,
rownum as secuencial,
tabla.codigo_uso as uso,
to_char(tabla.valor_uso) || case when '$type' != 'xls' then ',00000000' else '' end as valor_bruto

from(

select

tabla.*

from(

    select 
    tab0.*,
        
    proyrp.codigo_uso,
    nvl(proyrp.valor,0) as valor_uso
    
    from(    
        
        select
            
        rownum as consec_item,
        tab0.*
        
        from(
        
            select
            tab0.id_formato_pago,
            
            proyrp.id_proyecto_ep,
            proyrp.id_cpo,
            proyrp.id_rp,
            proyrp.vigencia_rp,
            proyrp.is_rp_sgr,
            
            tab0.consecutivo as consecutivo,
            proyrp.codigo as proyecto,
            proyrp.rubro as rubro,
            proyrp.tiprec as recurso,
            proyrp.ff as fuente,
            proyrp.csf_ssf as csf_ssf,
            nvl(proyrp.valor,0) as valor_bruto,
            null as atributo_contable,
            null as tipo_gasto,
            null as tipo_operacion,
            null as uso_contable,
            null as cuenta_contable
            
            from(
            
                select 
                rownum as consecutivo,
                record.*
                from( 

                    select 
                    tab0.*

                    from(

                        select
                        proyrp.is_rp_sgr as tipo_recurso,
                        proyrp.id_rp as id_rp_proyrp,
                        proyrp.vigencia_rp,
                        proyrp.is_rp_sgr,

                        contra.declarante_renta,
                        cont.razon_soc_sup,
                        contra.profesion,
                        cont.num_contrato,
                        nump.descripcion as pago_text,

                        forpag.*

                        from rvc_formato_pago_v forpag

                        left join rvc_contrato_v cont
                        on forpag.id_contrato = cont.id_contrato

                        left join rvc_contratista_v contra
                        on forpag.id_contratista = contra.id_contratista

                        left join ts_tc tc
                        on tc.id = contra.tipo_cuenta

                        left join rvc_numero_pago nump
                        on nump.id_numero_pago = forpag.id_numero_pago

                        left join(

                            select
                            id_formato_pago,
                            id_rp,
                            vigencia_rp,
                            is_rp_sgr,
                            sum(valor) as valor
                            from
                            rvc_formato_proy_rp
                            where
                            valor != 0
                            group by
                            id_formato_pago,
                            id_rp,
                            vigencia_rp,
                            is_rp_sgr

                        )proyrp
                        on proyrp.id_formato_pago = forpag.id_formato_pago

                        where
                        forpag.estado = 1
                        and forpag.estado_general = 10
                        and trunc(forpag.fecha_radicado) between to_date('$fecha_ini_text','yyyy-mm-dd') and to_date('$fecha_fin_text','yyyy-mm-dd')

                    )tab0

                    left join datos_compania dat
                    on dat.id = 1

                    where
                    1 = 1
                    $whereIdContratista
                    $whereIdContrato
                    $whereIdNumeroPago
                    $whereTipoRecurso
                    $whereUsuarioAsignado
                    $filtro_clase_presup

                    order by
                    tab0.fecha_radicado,
                    tab0.radicado
                )record
                
            )tab0
                    
            left join(
            
                select
                forrp.id_formato_pago,
                formproy.id_proyecto_ep,
                formproy.id_cpo,
                forrp.id_rp,
                forrp.vigencia_rp,
                forrp.is_rp_sgr,
                forrp.id_rubro,
                sum(forrp.valor) as valor,
                
                proy.codigo,
                rub.codigo_rubro_text as rubro,
                tiprec.codigo as tiprec,
                REPLACE(agrup.codigo,'0','') as ff,
                1 as csf_ssf
                
                from rvc_formato_proy_rp forrp
                
                left join rvc_formato_proyecto formproy
                on formproy.id_formato_pago = forrp.id_formato_pago
                and formproy.id_proyecto_ep = forrp.id_proyecto_ep
                
                left join co_proyectos_all_v proy
                on proy.id = formproy.id_cpo
                and proy.sgr = formproy.sgr
                
                left join pr_rubro_pgnsgr_v rub
                on rub.id_rubro = forrp.id_rubro
                and rub.sgr = forrp.is_rp_sgr
                
                left join pr_tipo_rec tiprec
                on tiprec.id = forrp.id_tipo_rec
                
                left join pr_agrup_rec agrup
                on agrup.id = tiprec.id_agrup
                
                where
                forrp.valor != 0
                $filtro_rub
                
                group by
                forrp.id_formato_pago,
                formproy.id_proyecto_ep,
                formproy.id_cpo,
                forrp.id_rp,
                forrp.vigencia_rp,
                forrp.is_rp_sgr,
                forrp.id_rubro,
                
                proy.codigo,
                rub.codigo_rubro_text,
                tiprec.codigo,
                agrup.codigo
            
            )proyrp
            on proyrp.id_formato_pago = tab0.id_formato_pago
            and proyrp.id_rp = tab0.id_rp_proyrp
                
            order by
            tab0.consecutivo,
            proyrp.codigo,
            proyrp.rubro
        
        )tab0 
    
    )tab0
                    
    left join(
    
        select
        forrp.id_formato_pago,
        formproy.id_proyecto_ep,
        formproy.id_cpo,
        forrp.id_rp,
        forrp.vigencia_rp,
        forrp.is_rp_sgr,
        forrp.id_rubro,
        forrp.id_elementos_gasto,
        sum(forrp.valor) as valor,
        
        proy.codigo,
        rub.codigo_rubro_text as rubro,
        tiprec.codigo as tiprec,
        REPLACE(agrup.codigo,'0','') as ff,
        1 as csf_ssf,
        
        elem.codigo_uso
        
        from rvc_formato_proy_rp forrp
        
        left join rvc_formato_proyecto formproy
        on formproy.id_formato_pago = forrp.id_formato_pago
        and formproy.id_proyecto_ep = forrp.id_proyecto_ep
        
        left join co_proyectos_all_v proy
        on proy.id = formproy.id_cpo
        and proy.sgr = formproy.sgr
        
        left join pr_rubro_pgnsgr_v rub
        on rub.id_rubro = forrp.id_rubro
        and rub.sgr = forrp.is_rp_sgr
        
        left join pr_tipo_rec tiprec
        on tiprec.id = forrp.id_tipo_rec
        
        left join pr_agrup_rec agrup
        on agrup.id = tiprec.id_agrup
        
        left join pr_elementos_gasto_pgnsgr_v elem
        on elem.id_elementos_gasto = forrp.id_elementos_gasto
        and elem.sgr = forrp.is_rp_sgr
        
        where
        forrp.valor != 0
        $filtro_rub
        
        group by
        forrp.id_formato_pago,
        formproy.id_proyecto_ep,
        formproy.id_cpo,
        forrp.id_rp,
        forrp.vigencia_rp,
        forrp.is_rp_sgr,
        forrp.id_rubro,
        forrp.id_elementos_gasto,
        
        proy.codigo,
        rub.codigo_rubro_text,
        tiprec.codigo,
        agrup.codigo,
        
        elem.codigo_uso
    
    )proyrp
    on proyrp.id_formato_pago = tab0.id_formato_pago
    and proyrp.id_proyecto_ep = tab0.id_proyecto_ep
    and proyrp.id_rp = tab0.id_rp
    and proyrp.vigencia_rp = tab0.vigencia_rp
    and proyrp.is_rp_sgr = tab0.is_rp_sgr

)tabla    

order by
tabla.consec_item,
tabla.rubro,
tabla.codigo_uso

)tabla
EOD;
        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);

        $i = 1;
        //CONSEC_ITEM;SECUENCIAL;USO;VALOR_BRUTO
        foreach ($records as $rec) {
            $records4["tipo4" . $i] = array(
                "CONSEC_ITEM" => $rec['consec_item'],
                "SECUENCIAL" => $rec['secuencial'],
                "USO" => $rec['uso'],
                "VALOR_BRUTO" => $rec['valor_bruto']
            );
            /*
             * contador filas
             */
            $i++;
        }


        //En linux 
        $salto_linea = "\n"; //variable global para manejo del salto de linea
        //En windows 
        $salto_linea = "\r\n"; //variable global para manejo del salto de linea


        /**
         * Generar archivos de excel
         */
        $cabecera1 = "CONSECUTIVO;FECHA;PCI;RP;FECHA_PAGO;MONEDA;TIPO_CUENTA;VALOR_IVA;TIPO_DOCSOP;NO_RADICADO;FECHA_RADICADO;EXPEDIDOR;SUPERVISOR;CARGO;TEXTO;C1;C2" . $salto_linea;
        $cabecera2 = "CONSECUTIVO;CONSEC_ITEM;PROYECTO;RUBRO;RECURSO;FUENTE;CSF_SSF;VALOR_BRUTO;ATRIBUTO_CONTABLE;TIPO_GASTO;TIPO_OPERACION;USO_CONTABLE;CUENTA_CONTABLE" . $salto_linea;
        $cabecera3 = "CONSECUTIVO;SECUENCIAL;POSICION_PAGO;NATURALEZA;NIT;BASE_GRAVABLE;TARIFA;VALOR_DEDUCCION" . $salto_linea;
        $cabecera4 = "CONSEC_ITEM;SECUENCIAL;USO;VALOR_BRUTO" . $salto_linea;


        //Cabecera
        $nombre = "SIGPAA Cabecera " . $codigolog . $recurso;
        if ($type == 'xls') {
            $this->archivoExcelHtml($nombre, $records1, $cabecera1, $type);
        } else {
            $this->archivoExcel($nombre, $records1, $cabecera1, $type);
        }
        //Items Rubros
        $nombre = "SIGPAA Items " . $codigolog . $recurso;
        if ($type == 'xls') {
            $this->archivoExcelHtml($nombre, $records2, $cabecera2, $type);
        } else {
            $this->archivoExcel($nombre, $records2, $cabecera2, $type);
        }
        //Deducciones
        $nombre = "SIGPAA Deducciones " . $codigolog . $recurso;
        if ($type == 'xls') {
            $this->archivoExcelHtml($nombre, $records3, $cabecera3, $type);
        } else {
            $this->archivoExcel($nombre, $records3, $cabecera3, $type);
        }
        //Usos
        $nombre = "SIGPAA Usos " . $codigolog . $recurso;
        if ($type == 'xls') {
            $this->archivoExcelHtml($nombre, $records4, $cabecera4, $type);
        } else {
            $this->archivoExcel($nombre, $records4, $cabecera4, $type);
        }
    }

    /**
     * Generacion de archivo en excel
     * 
     * @param type $nombre
     * @param type $records
     * @param type $cabecera
     */
    function archivoExcelHtml($nombre, $records, $cabecera, $type = "xls") {

        $this->logMessage("Generacion de archivo en excel-Html, nombre: " . $nombre);

        try {

            //$sepa = "|"; ???

            $scarpeta = "uploads"; //carpeta donde guardar el archivo.

            $sfile = $scarpeta . "/archivos_siif/" . $nombre . "." . $type; //ruta del archivo a generar
            $fp = fopen($sfile, "w");

            //CABECERA DE LOS ARCHIVOS
            $cabecera = explode(';', $cabecera);

            //$shtml = "<table border='1'><tr>";
            $shtml = "<table><tr>";
            foreach ($cabecera as $key => $value) {
                $shtml .= "<td>" . $value . "</td>";
            }
            $shtml .= "</tr>";

            //cuerpo del excel
            foreach ($records as $rec) {//fila
                $shtml .= "<tr>";

                $cont_fila = 1;

                foreach ($rec as $key => $value) {//campo
                    if ($key == 'CONSECUTIVO' || $key == 'FECHA' || $key == 'FECHA_PAGO' || $key == 'FECHA_RADICADO' || $key == 'PCICONEXION' || $key == 'TIPO_CUENTA') {
                        $shtml .= "<td style='mso-number-format:\@'>" . $value . "</td>"; //formato de texto
                    } else if ($key == 'VALOR' || $key == 'VALOR_IVA' || $key == 'VALOR_BRUTO' || $key == 'BASE_GRAVABLE' || $key == 'VALOR_DEDUCCION') {
                        $shtml .= "<td>" . str_replace('.', ',', $value) . "</td>";
                    } else {
                        $shtml .= "<td>" . $value . "</td>";
                    }

                    $cont_fila++;

                    if ($cont_fila > count($cabecera)) {
                        break;
                    }
                }

                $shtml .= "</tr>";
            }
            //datos
//            $shtml.="<tr>";
//            $shtml.="<td>CONSECUTI</td>";
//            $shtml.="<td>FECHA_CON</td>";
//            $shtml.="<td>TIPO_DOC</td>";
//            $shtml.="<td>NUMERO_DOC</td>";
//            $shtml.="<td>DESCRIPCIO</td>";
//            $shtml.="</tr>";

            $shtml .= "</table>";
            //echo $shtml;die();

            fwrite($fp, $shtml);
            fclose($fp);
            $sfile = "../../" . $sfile;
        } catch (Exception $exc) {

            $this->logMessage("Error: " . $exc);
        }
    }

    /**
     * Generacion de archivo en excel CSV
     * 
     * @param type $nombre
     * @param type $records
     * @param type $cabecera
     */
    function archivoExcel($nombre, $records, $cabecera, $type = "xls") {

        $this->logMessage("Generacion de archivo en excel-CSV, nombre: " . $nombre);

        //En linux 
        $salto_linea = "\n"; //variable global para manejo del salto de linea
        //En windows 
        $salto_linea = "\r\n"; //variable global para manejo del salto de linea


        $html_sp = "'\t";
        if ($type == 'xls') {
            $html_sp = ";";
            $type = "csv";
        }
        if ($type == 'txt') {
            $html_sp = "|";
        }

        //CABECERA DE LOS ARCHIVOS
        $cabecera_cant = explode(';', $cabecera);
        $cabecera = str_replace(";", $html_sp, $cabecera);

        try {

            $scarpeta = "uploads"; //carpeta donde guardar el archivo.

            $sfile = $scarpeta . "/archivos_siif/" . $nombre . "." . $type; //ruta del archivo a generar
            $fp = fopen($sfile, "w");

            //cabecera
            $shtml = "";
            if ($type != 'txt') {
                $shtml = $cabecera;
            }
            $shtml .= "";

            //cuerpo del excel
            foreach ($records as $rec) {//fila
                //echo ($rec);
                //var_dump($rec);
                //tag
                $tag = false;

                $cont_fila = 1;

                foreach ($rec as $key => $value) {//campo

                    /*
                     * valida que coloque el separador solo despues del primer registro
                     */
                    if ($tag) {
                        $shtml .= $html_sp;
                    } else {
                        $tag = true;
                    }

                    //echo ($key . " - " . $value . " " );
                    if ($type == 'txt') {
                        $shtml .= "" . $value;
                    } else {
                        $shtml .= "" . str_replace('.', ',', $value);
                    }

                    $cont_fila++;

                    if ($cont_fila > count($cabecera_cant)) {
                        break;
                    }
                }
                //echo " <br>";
                $shtml .= $salto_linea;
            }

            fwrite($fp, $shtml);
            fclose($fp);
            $sfile = "../../" . $sfile;
        } catch (Exception $exc) {

            $this->logMessage("Error: " . $exc);
        }
    }

    /**
     * Generar el archivo .ZIP
     * 
     * @param type $ruta
     * @param type $nombre
     */
    function generarArchivoZip($ruta, $nombre) {

        //echo "generarArchivoZip";die();

        /**
         * Generar el archivo .ZIP
         */
        /*
          $zip = new ZipArchive();
          $filename = "uploads/archivos_siif/con.zip";

          if ($zip->open($filename, ZipArchive::CREATE) !== TRUE) {
          echo("No se pudo abrir <$filename>\n");
          die();
          }

          $zip->addFile("uploads/archivos_siif/c1.xls", "c1.xls");
          $zip->addFile("c2.xls", "c2.xls");

          echo "numficheros: " . $zip->numFiles . "\n";
          echo "estado:" . $zip->status . "\n";
          $zip->close();
         */


        $error = ""; //error holder
        if (true) {

            //$file_folder = "uploads/archivos_siif/"; // folder to load files
            $file_folder = $ruta;
            if (extension_loaded('zip')) {

                // Checking files are selected
                $zip = new ZipArchive(); // Load zip library 
                $zip_name = $file_folder . $nombre; // Zip name
                if ($zip->open($zip_name, ZIPARCHIVE::CREATE) !== TRUE) {
                    // Opening zip file to load files
                    $error .= "* Sorry ZIP creation failed at this time";
                }


                $directorio = opendir($file_folder); //ruta actual
                while ($archivo = readdir($directorio)) { //obtenemos un archivo y luego otro sucesivamente
                    if (is_dir($archivo)) {//verificamos si es o no un directorio
                        echo "[" . $archivo . "]<br />"; //de ser un directorio lo envolvemos entre corchetes
                    } else {
                        $zip->addFile($file_folder . $archivo); // Adding files into zip
                        echo $archivo . "<br />";
                    }
                }
//                foreach ($post['files'] as $file) {
//                $zip->addFile($file_folder . "c1.xls"); // Adding files into zip
//                $zip->addFile($file_folder . "c2.xls"); // Adding files into zip
//                }
                $zip->close();
                ob_clean();//Para problemas del windows - 20220411

                if (file_exists($zip_name)) {
                    // push to download the zip
                    header('Content-type: application/zip');
                    header('Content-Disposition: attachment; filename="' . $nombre . '"');
                    readfile($zip_name);
                    // remove zip file is exists in temp path
                    unlink($zip_name);
                }
            } else {
                $error .= "You dont have ZIP extension ";
                echo "GenerarArchivoZip - " . $error;
                die();
            }
        }
    }

}
