<?php

//
///** Incluir la libreria PHPExcel */
//require_once '../lib/PHPExcel/Classes/PHPExcel.php';
//require_once '../lib/PHPExcel/Classes/PHPExcel/IOFactory.php';
//require_once '../lib/PHPExcel/Classes/PHPExcel/Reader/Excel2007.php';
//NO ACTUALIZAR LA ANM hasta el cambio de base de contab NICSP - 20180911

/**
 * archivo_siif actions.
 *
 * @package    Sofhouse
 * @subpackage archivo_siif
 * @author     Software House
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class archivo_siifActions extends sfQuery {

    /**
     * Servicio de list
     * lista los datos del informe
     * SUBSTR(tabb.digitos,0,6) para las cuentas con el auxiliar unido - 20180305
     *
     * @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++;
                }
            }
        }


        //tomar variables del request
        $cia = $request['id_cia'];
        $id_vigencia = $request['id_vigencia'];
        $id_periodo_contable = $request['id_periodo_contable'];
        $mes_texto = $request['mes_texto'];
        $id_tipo_comprobante = $request['id_tipo_comprobante'];
        $di_ini = $request['di_ini'];
        $di_fin = $request['di_fin'];
        $tipo = $request['tipo'];
        $filtro = $request['filtro'];

        //Nuevo formato SPGR - 20210609
        if (isset($request['formato']) && $request['formato'] == "true") {
            $request['formato_val'] = 1;
            $formato_tex = "_SPGR";
        } else {
            $request['formato_val'] = 0;
            $formato_tex = "";
        }
        $formato_val = $request['formato_val'];


        /*
         * Variables globales
         */
        $modulo = sfConfig::get('app_modulo');
        $usuarioERP = sfConfig::get('app_usuarioERP');
        $claveERP = sfConfig::get('app_claveERP');
        $usuarioERPContab = sfConfig::get('app_usuarioERPContab');
        $claveERPContab = sfConfig::get('app_claveERPContab');


        /*
         * variables por defecto para el registro de log
         */
        $id_tabla = 'null';

        //validar vigencia
        $id_vigencia = 'null';
        if (isset($request['id_vigencia'])) {
            $id_vigencia = $request['id_vigencia'];
        }

        //validar centro de operacion
        $id_cen_op = 'null';
        if (isset($request['id_cen_op'])) {
            $id_cen_op = $request['id_cen_op'];
        }

        $id_cia = 'null';
        if (isset($request['id_cia'])) {
            $id_cia = $request['id_cia'];
        }

        //id maestro tabla - para consulta informes no es necesario
        $id_mae_bd = 'null';

        //1 - indica operacion de consulta
        $id_ope_bd = 1;

        //id del maestro tercero
        $id_mae_ter = 1;
        if (isset($request['id_username'])) {
            $id_mae_ter = $request['id_username'];
        }
        $usuario = 'admin';
        if (isset($request['username'])) {
            if (!is_null($request['username']) && $request['username'] != '') {
                $usuario = $request['username'];
            }
        }
        $comando = 'sin comando';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }

        /*
         * construir observacion
         */
        $informe = 'sin especificar';

        //sentencia sql
        $sql = <<<EOD
select * from CREDENCIAL
where ID_MOD = $modulo
and comando = '$comando'
EOD;

        //ejecuta y obtiene el resultado del sql
        $resultado = null;
        //$resultado = CN_TABLE::executeOCI_SQL_List($sql, $usuarioERP, $claveERP);

        if (count($resultado) > 0) {
            $informe = $resultado[0]['NOMBRE'];
        }

        //observacion para el log
        $observacion = "'Se consulto informe: " . $informe . " desde la funcionalidad: " . $comando . "'";

        /*
         * registro de consulta en tabla de log
         */
        //$sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion);



        /**
         * Si es detallado recorre dia por dia
         */
        //tipo de consulta Consolidado - Detallado
        if ($filtro == 1) {
            $this->generarArchivoSiif($request, $di_ini, $di_fin);
        } else {

            /*
             * Dividir fecha formato yyyy-mm-dd
             * Posicion 0 anho
             * Posicion 1 mes
             * Posicion 2 dia
             */
            $fecha_ini = explode('-', $di_ini);
            $fecha_fin = explode('-', $di_fin);


            while ($fecha_ini[2] <= $fecha_fin[2]) {

                //echo "Dia: " . str_pad($fecha_ini[2], 2, "0", STR_PAD_LEFT);
                //echo " <br>";

                $di_ini = $fecha_ini[0] . "-" . $fecha_ini[1] . "-" . str_pad($fecha_ini[2], 2, "0", STR_PAD_LEFT);
                $di_fin = $fecha_fin[0] . "-" . $fecha_fin[1] . "-" . str_pad($fecha_fin[2], 2, "0", STR_PAD_LEFT);

                $this->generarArchivoSiif($request, $di_ini, $di_ini);

                $fecha_ini[2] += 1;
            }
        }



        /**
         * Generar el archivo .ZIP
         */
        $ruta = "uploads/archivos_siif/";
        //tipo de consulta Consolidado - Detallado
        if ($filtro == 1) {
            $nombre = "archivos_siif_consol$formato_tex.zip";
        } else {
            $nombre = "archivos_siif_deta$formato_tex.zip";
        }
        $this->generarArchivoZip($ruta, $nombre);


        echo "Terminado";
        die();
    }

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

        //tomar variables del request
        $cia = $request['id_cia'];
        $id_vigencia = $request['id_vigencia'];
        $id_periodo_contable = $request['id_periodo_contable'];
        $mes_texto = $request['mes_texto'];
        $id_tipo_comprobante = $request['id_tipo_comprobante'];
//        $di_ini = $request['di_ini'];
//        $di_fin = $request['di_fin'];
        $tipo = $request['tipo'];
        $filtro = $request['filtro'];
        $type = $request['type'];
        $formato_val = $request['formato_val'];


        //tipo de comprobante
        if (isset($request['id_tipo_comprobante'])) {
            $whereTipComp = " and cad.id_tipo_comprobante = " . $request['id_tipo_comprobante'];
        } else {
            $whereTipComp = " ";
        }
        /*
         * validar si es por centro de operacion
         */
        if (isset($request['id_cen_op'])) {
            $whereCenOp = 'and mov.id_cen_op = ' . $request['id_cen_op'];
        } else {
            $whereCenOp = ' ';
        }


        //sentencia sql
        $sql = <<<EOD
select * from cn_tipo_comprobante
WHERE ID_TIPO_COMPROBANTE = $id_tipo_comprobante                 
EOD;
        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);

        $cod_tipcomp = $records[0]['nom_corto'];


        //sentencia sql
        $sql = <<<EOD
select * from cn_cia where id_cia = $cia 
EOD;
        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);

        $codigo_siif = $records[0]['codigo_siif'];

        if ($formato_val == 1) {
            $codigo_siif = $records[0]['codigo_spgr'];
        }

        /**
         * Generar archivo tipo 1
         * CONSECUTI;FECHA_CON;TIPO_DOC;NUMERO_DOC;DESCRIPCIO
         */
        if ($formato_val == 1) {
            $records1 = array(
                "tipo1" => array(
                    "CONSECUTI" => "1",
                    "FECHA_CON" => $di_fin,
                    "TIPO_DOC" => "1",
                    "NUMERO_DOC" => "",
                    "DESCRIPCIO" => "REGISTRO MOVIMIENTOS MANUALES " . strtoupper($mes_texto) . " DE " . $id_vigencia
                )
            );
        } else {
            $records1 = array(
                "tipo1" => array(
                    "CONSECUTI" => "1",
                    "FECHA_CON" => $di_fin,
                    "TIPO_DOC" => "",
                    "NUMERO_DOC" => "",
                    "DESCRIPCIO" => "REGISTRO MOVIMIENTOS MANUALES " . strtoupper($mes_texto) . " DE " . $id_vigencia
                )
            );
        }

        /**
         * Consulta archivo tipo 2
         * SI tiene registro de aux en elmovimiento, coloca el del movimietno - 20180618
         * SI en la tabla de CN_AUX_SIIF no tiene registro de aux, coloca null segun a nivel de cuenta - 20180705
         * Se cambia COD_AUX, para tener encuenta la parametrizacion segun:
         * -Si tiene cuenta y auxiliar y Si auxdir, coloca el aux_dir
         * -No tiene auxiliar y no aux_dir, coloca el del movimiento
         * -No tiene auxiliar y Si aux_dir, coloca el del aux_dir
         * -Si tiene auxiliar y no aux_dir, coloca el del movimiento
         * -Si tiene auxiliar y Si aux_dir, coloca el del aux_dir - 20181116
         * Se adiciona tabla para cuenta con rubro, tipo 3 - 20181123
         * Se coloca orden primero tipo C y luego por cuenta - 20190702
         */
        $text_select2 = "1 as con,";
        $text_select2_rub = ",
auxrubro.rubro";
        if ($formato_val == 1) {
            $text_select2 = "";
            $text_select2_rub = "";
        }
        $sql = <<<EOD
select 

$text_select2
rownum as rn,
tab.*

from(
                
select                
tabb.digitos,             
tabb.debito,             
tabb.credito$text_select2_rub

from(

    select 
    
    tab.digitos || tab.aux_dir as digitos,
    sum(tab.debito) as debito,
    sum(tab.credito) as credito,
    tab.id_cia,
    tab.tipo
    
    
    from(
        
        select 
        
        rownum as rnn,
        cad.id_tipo_comprobante,
        cad.fecha_cad,
        mov.id_cia,
        mov.id_catalogo,
        mov.id_cuenta_mayor,
        mov.id_grupo_cuenta,
        mov.id_clase_cuenta,
        mov.id_auxiliar,
        mov.debito,
        mov.credito,
        case when mov.debito != 0 then 'D' else 'C' end as tipo,
        subc.digitos,
        aux.aux_dir,
        aux.identi_aux
        
        
        from cn_movimiento_vigper mov
        
        join cn_control_cad cad
        on mov.id_cad = cad.id_cad
        and mov.id_cen_op = cad.id_cen_op
        and mov.id_cia = cad.id_cia
        and mov.id_vigencia = cad.id_vigencia
        
        join cn_subc_digitos subc
        on mov.id_cia = subc.id_cia
        and mov.id_catalogo = subc.id_catalogo
        and mov.id_cuenta_mayor = subc.id_cuenta_mayor
        and mov.id_grupo_cuenta = subc.id_grupo_cuenta
        and mov.id_clase_cuenta = subc.id_clase_cuenta
        
        
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.id_catalogo, aut.id_auxiliar
            ORDER BY aut.id_catalogo, aut.id_auxiliar, aut.aux_dir asc
           ) AS rn
          from cn_aux_siif aut
        )aux
        on mov.id_cia = aux.id_cia
        --and mov.id_auxiliar = aux.id_auxiliar
        and mov.id_catalogo = aux.id_catalogo
        and mov.id_cuenta_mayor = aux.id_cuenta_mayor
        and mov.id_grupo_cuenta = aux.id_grupo_cuenta
        and mov.id_clase_cuenta = aux.id_clase_cuenta
        and aux.rn = 1
        
        /*
        left join cn_aux_siif aux
        on mov.id_cia = aux.id_cia
        --and mov.id_auxiliar = aux.id_auxiliar
        and mov.id_catalogo = aux.id_catalogo
        and mov.id_cuenta_mayor = aux.id_cuenta_mayor
        and mov.id_grupo_cuenta = aux.id_grupo_cuenta
        and mov.id_clase_cuenta = aux.id_clase_cuenta
        */
        
        where
        mov.id_cia = $cia        
        and mov.fecha_cad between to_date('$di_ini','yyyy-mm-dd') and to_date('$di_fin','yyyy-mm-dd')
        and mov.id_auxiliar is  /*not*/ null
        $whereTipComp         
        $whereCenOp     
        
        union
        
        
        
        select 
        
        rownum as rnn,
        cad.id_tipo_comprobante,
        cad.fecha_cad,
        mov.id_cia,
        mov.id_catalogo,
        mov.id_cuenta_mayor,
        mov.id_grupo_cuenta,
        mov.id_clase_cuenta,
        mov.id_auxiliar,
        mov.debito,
        mov.credito,
        case when mov.debito != 0 then 'D' else 'C' end as tipo,
        subc.digitos,
        /*Se debe actualizar la conulta de insert en la tabla de cn_archivo_siif para el registro del Tipo 3*/    
        case when auxcue.id_aux_siif is null and aux.id_aux_siif is null then null
        
             when auxcue.id_aux_siif is not null and aux.id_aux_siif is null and auxcue.aux_dir is not null then auxcue.aux_dir 
             
             when auxcue.id_aux_siif is not null and aux.id_auxiliar is null and aux.aux_dir is null then SUBCAUX.COD_AUX
             when auxcue.id_aux_siif is not null and aux.id_auxiliar is null and aux.aux_dir is not null then aux.aux_dir 
             when auxcue.id_aux_siif is not null and aux.id_auxiliar is not null and aux.aux_dir is null then SUBCAUX.COD_AUX  
             when auxcue.id_aux_siif is not null and aux.id_auxiliar is not null and aux.aux_dir is not null then aux.aux_dir        
             /*when aux.aux_dir is not null then aux.aux_dir 
             when auxcue.id_aux_siif is not null and auxcue.aux_dir is null and auxcue.identi_aux is null then null
             else SUBCAUX.COD_AUX end */
        else null end as aux_dir,
        aux.identi_aux
        
        
        from cn_movimiento_vigper mov
        
        join cn_control_cad cad
        on mov.id_cad = cad.id_cad
        and mov.id_cen_op = cad.id_cen_op
        and mov.id_cia = cad.id_cia
        and mov.id_vigencia = cad.id_vigencia
        
        join cn_subc_digitos subc
        on mov.id_cia = subc.id_cia
        and mov.id_catalogo = subc.id_catalogo
        and mov.id_cuenta_mayor = subc.id_cuenta_mayor
        and mov.id_grupo_cuenta = subc.id_grupo_cuenta
        and mov.id_clase_cuenta = subc.id_clase_cuenta
        
        left join cn_subc_digitos_aux subcaux
        on mov.id_cia = subcaux.id_cia
        and mov.id_auxiliar = subcaux.id_auxiliar
        and mov.id_catalogo = subcaux.id_catalogo
        and mov.id_cuenta_mayor = subcaux.id_cuenta_mayor
        and mov.id_grupo_cuenta = subcaux.id_grupo_cuenta
        and mov.id_clase_cuenta = subcaux.id_clase_cuenta        
        
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.id_catalogo, aut.id_auxiliar
            ORDER BY aut.id_catalogo, aut.id_auxiliar, aut.aux_dir asc
           ) AS rn
          from cn_aux_siif aut
        )aux
        on mov.id_cia = aux.id_cia
        and mov.id_auxiliar = aux.id_auxiliar
        and mov.id_catalogo = aux.id_catalogo
        and mov.id_cuenta_mayor = aux.id_cuenta_mayor
        and mov.id_grupo_cuenta = aux.id_grupo_cuenta
        and mov.id_clase_cuenta = aux.id_clase_cuenta
        and aux.rn = 1
        
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.id_catalogo, aut.id_auxiliar
            ORDER BY aut.id_catalogo, aut.id_auxiliar, aut.aux_dir asc
           ) AS rn
          from cn_aux_siif aut
        )auxcue
        on mov.id_cia = auxcue.id_cia
        --and mov.id_auxiliar = auxcue.id_auxiliar
        and mov.id_catalogo = auxcue.id_catalogo
        and mov.id_cuenta_mayor = auxcue.id_cuenta_mayor
        and mov.id_grupo_cuenta = auxcue.id_grupo_cuenta
        and mov.id_clase_cuenta = auxcue.id_clase_cuenta
        and auxcue.rn = 1
        
        /*
        left join cn_aux_siif aux
        on mov.id_cia = aux.id_cia
        --and mov.id_auxiliar = aux.id_auxiliar
        and mov.id_catalogo = aux.id_catalogo
        and mov.id_cuenta_mayor = aux.id_cuenta_mayor
        and mov.id_grupo_cuenta = aux.id_grupo_cuenta
        and mov.id_clase_cuenta = aux.id_clase_cuenta
        */
        
        where 
        mov.id_cia = $cia        
        and mov.fecha_cad between to_date('$di_ini','yyyy-mm-dd') and to_date('$di_fin','yyyy-mm-dd')
        and mov.id_auxiliar is not null
        $whereTipComp         
        $whereCenOp   
    
    )tab
    
    group by
    tab.id_cia,
    tab.digitos,
    tab.aux_dir,
    tab.tipo
    
    order by 
    tab.digitos,
    tab.tipo
    
)tabb

left join (
  SELECT
   aut.*,
   ROW_NUMBER() OVER (
    partition by aut.id_cia, aut.cuenta
    ORDER BY aut.id_cia, aut.cuenta asc
   ) AS rn
  from cn_aux_siif_rubro aut
)auxrubro
on auxrubro.cuenta = tabb.digitos
and auxrubro.id_cia = tabb.id_cia
and auxrubro.rn = 1
                
where
tabb.debito != 0
or tabb.credito != 0

order by
tabb.tipo desc, 
tabb.digitos 
                
)tab                 
EOD;
        //ejecutar sql
        $records2 = CN_TABLE::executeSQL($sql);


        /*
         * Borrar registros de cn_archivo_siif
         */
        //sentencia sql
        $sql = <<<EOD
delete from cn_archivo_siif              
EOD;
        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);

        /**
         * Generar datos de cn_archivo_siif
         * SI tiene registro de auzx en elmovimiento, coloca el del movimietno - 20180618
         * SI en la tabla de CN_AUX_SIIF no tiene registro de aux, coloca null segun a nivel de cuenta - 20180705
         */
        //sentencia sql
        $sql = <<<EOD
insert into cn_archivo_siif
 
 select 
    
    
    tab.digitos || tab.aux_dir as digitos,
    sum(tab.debito) as debito,
    sum(tab.credito) as credito,
    tab.tipo,
    tab.id_mae_ter,
    tab.id_auxiliar
    
    
    from(
        
        select 
        
        rownum as rnn,
        cad.id_tipo_comprobante,
        cad.fecha_cad,
        mov.id_cia,
        mov.id_catalogo,
        mov.id_cuenta_mayor,
        mov.id_grupo_cuenta,
        mov.id_clase_cuenta,
        mov.id_auxiliar,
        mov.id_mae_ter,
        mov.debito,
        mov.credito,
        case when mov.debito != 0 then 'D' else 'C' end as tipo,
        subc.digitos,
        aux.aux_dir,
        aux.identi_aux
        
        
        from cn_movimiento_vigper mov
        
        join cn_control_cad cad
        on mov.id_cad = cad.id_cad
        and mov.id_cen_op = cad.id_cen_op
        and mov.id_cia = cad.id_cia
        and mov.id_vigencia = cad.id_vigencia
        
        join cn_subc_digitos subc
        on mov.id_cia = subc.id_cia
        and mov.id_catalogo = subc.id_catalogo
        and mov.id_cuenta_mayor = subc.id_cuenta_mayor
        and mov.id_grupo_cuenta = subc.id_grupo_cuenta
        and mov.id_clase_cuenta = subc.id_clase_cuenta
        
        
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.id_catalogo, aut.id_auxiliar
            ORDER BY aut.id_catalogo, aut.id_auxiliar, aut.aux_dir asc
           ) AS rn
          from cn_aux_siif aut
        )aux
        on mov.id_cia = aux.id_cia
        --and mov.id_auxiliar = aux.id_auxiliar
        and mov.id_catalogo = aux.id_catalogo
        and mov.id_cuenta_mayor = aux.id_cuenta_mayor
        and mov.id_grupo_cuenta = aux.id_grupo_cuenta
        and mov.id_clase_cuenta = aux.id_clase_cuenta
        and aux.rn = 1
        
        /*
        left join cn_aux_siif aux
        on mov.id_cia = aux.id_cia
        --and mov.id_auxiliar = aux.id_auxiliar
        and mov.id_catalogo = aux.id_catalogo
        and mov.id_cuenta_mayor = aux.id_cuenta_mayor
        and mov.id_grupo_cuenta = aux.id_grupo_cuenta
        and mov.id_clase_cuenta = aux.id_clase_cuenta
        */
        
        where 
        mov.id_cia = $cia        
        and mov.fecha_cad between to_date('$di_ini','yyyy-mm-dd') and to_date('$di_fin','yyyy-mm-dd')
        and mov.id_auxiliar is  /*not*/ null
        $whereTipComp         
        $whereCenOp     
        
        union
        
        
        
        select 
        
        rownum as rnn,
        cad.id_tipo_comprobante,
        cad.fecha_cad,
        mov.id_cia,
        mov.id_catalogo,
        mov.id_cuenta_mayor,
        mov.id_grupo_cuenta,
        mov.id_clase_cuenta,
        mov.id_auxiliar,
        mov.id_mae_ter,
        mov.debito,
        mov.credito,
        case when mov.debito != 0 then 'D' else 'C' end as tipo,
        subc.digitos,
        case when auxcue.id_aux_siif is null and aux.id_aux_siif is null then null
        
             when auxcue.id_aux_siif is not null and aux.id_aux_siif is null and auxcue.aux_dir is not null then auxcue.aux_dir 
             
             when auxcue.id_aux_siif is not null and aux.id_auxiliar is null and aux.aux_dir is null then SUBCAUX.COD_AUX
             when auxcue.id_aux_siif is not null and aux.id_auxiliar is null and aux.aux_dir is not null then aux.aux_dir 
             when auxcue.id_aux_siif is not null and aux.id_auxiliar is not null and aux.aux_dir is null then SUBCAUX.COD_AUX  
             when auxcue.id_aux_siif is not null and aux.id_auxiliar is not null and aux.aux_dir is not null then aux.aux_dir        
             /*when aux.aux_dir is not null then aux.aux_dir 
             when auxcue.id_aux_siif is not null and auxcue.aux_dir is null and auxcue.identi_aux is null then null
             else SUBCAUX.COD_AUX end */
        else null end as aux_dir,
        aux.identi_aux
        
        
        from cn_movimiento_vigper mov
        
        join cn_control_cad cad
        on mov.id_cad = cad.id_cad
        and mov.id_cen_op = cad.id_cen_op
        and mov.id_cia = cad.id_cia
        and mov.id_vigencia = cad.id_vigencia
        
        join cn_subc_digitos subc
        on mov.id_cia = subc.id_cia
        and mov.id_catalogo = subc.id_catalogo
        and mov.id_cuenta_mayor = subc.id_cuenta_mayor
        and mov.id_grupo_cuenta = subc.id_grupo_cuenta
        and mov.id_clase_cuenta = subc.id_clase_cuenta
        
        left join cn_subc_digitos_aux subcaux
        on mov.id_cia = subcaux.id_cia
        and mov.id_auxiliar = subcaux.id_auxiliar
        and mov.id_catalogo = subcaux.id_catalogo
        and mov.id_cuenta_mayor = subcaux.id_cuenta_mayor
        and mov.id_grupo_cuenta = subcaux.id_grupo_cuenta
        and mov.id_clase_cuenta = subcaux.id_clase_cuenta        
        
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.id_catalogo, aut.id_auxiliar
            ORDER BY aut.id_catalogo, aut.id_auxiliar, aut.aux_dir asc
           ) AS rn
          from cn_aux_siif aut
        )aux
        on mov.id_cia = aux.id_cia
        and mov.id_auxiliar = aux.id_auxiliar
        and mov.id_catalogo = aux.id_catalogo
        and mov.id_cuenta_mayor = aux.id_cuenta_mayor
        and mov.id_grupo_cuenta = aux.id_grupo_cuenta
        and mov.id_clase_cuenta = aux.id_clase_cuenta
        and aux.rn = 1
        
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.id_catalogo, aut.id_auxiliar
            ORDER BY aut.id_catalogo, aut.id_auxiliar, aut.aux_dir asc
           ) AS rn
          from cn_aux_siif aut
        )auxcue
        on mov.id_cia = auxcue.id_cia
        --and mov.id_auxiliar = auxcue.id_auxiliar
        and mov.id_catalogo = auxcue.id_catalogo
        and mov.id_cuenta_mayor = auxcue.id_cuenta_mayor
        and mov.id_grupo_cuenta = auxcue.id_grupo_cuenta
        and mov.id_clase_cuenta = auxcue.id_clase_cuenta
        and auxcue.rn = 1
        
        /*
        left join cn_aux_siif aux
        on mov.id_cia = aux.id_cia
        --and mov.id_auxiliar = aux.id_auxiliar
        and mov.id_catalogo = aux.id_catalogo
        and mov.id_cuenta_mayor = aux.id_cuenta_mayor
        and mov.id_grupo_cuenta = aux.id_grupo_cuenta
        and mov.id_clase_cuenta = aux.id_clase_cuenta
        */
        
        where 
        mov.id_cia = $cia        
        and mov.fecha_cad between to_date('$di_ini','yyyy-mm-dd') and to_date('$di_fin','yyyy-mm-dd')
        and mov.id_auxiliar is not null
        $whereTipComp         
        $whereCenOp   
    
    )tab
    
    group by
    tab.digitos,
    tab.aux_dir,
    tab.tipo,
    tab.id_mae_ter,
    tab.id_auxiliar
                
    HAVING
    sum(tab.debito)  != 0
    or sum(tab.credito)  != 0
    
    order by 
    tab.digitos,
    tab.tipo,
    tab.id_mae_ter               
EOD;
        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);



        /**
         * Consulta archivo tipo 3
         */
        $records3 = array();

        /**
         * BUSCA   SIGLA EN ARCHIVO Y   TOMA TIPAUX,   CODAUX
         */
        //sentencia sql
        $sql = <<<EOD
select * from cn_sigla_aux_siif 
WHERE sigla = 'PCIC'               
EOD;
        //ejecutar sql
        $records = CN_TABLE::executeSQL($sql);

        $id_tipo_aux_siif_1 = $records[0]['id_tipo_aux_siif'];
        $cod_sigla_1 = $records[0]['cod_sigla'];

        //POR CADA REGISTRO TIPO 2
        $i = 1;
        foreach ($records2 as $rec2) {//fila


            /**
             * GENERA  UN PRIMER REGISTRO EN  ARCHIVO 3,  ESTE ES OBLIGATORIO  Y VA UNO POR CADA REGISTRO TIPO 2. 

              SIGLA=PCIC,
              BUSCA   SIGLA EN ARCHIVO SFAUXCON    Y   TOMA SFAUXCON.TIPAUX,   SFAUXCON.CODAUX

              LLENA EL REGISTRO ASI:
              CONSECUTI  =  CONSECUTI  DEL REGISTRO 2
              TIPO_AUXI=  SFAUXCON.TIPAUX
              AUXILIAR=SFAUXCON.CODAUX
              IDENTIFICA=  SIGLA
              VALOR= CNMOV02.VALOR_DEB+CNMOV02.VALOR_CRE
             */
            if ($formato_val == 1) {
                $records3 ["fila" . $i] = array(
                    "CONSECUTI" => $rec2['rn'],
                    "TIPO_AUXIL" => $id_tipo_aux_siif_1,
                    "AUXILIAR" => $cod_sigla_1,
                    "IDENTIFICA" => $codigo_siif,
                    "VALOR" => $rec2['debito'] + $rec2['credito']
                );
            } else {
                $records3 ["fila" . $i] = array(
                    "CONSECUTI" => $rec2['rn'],
                    "TIPO_AUXIL" => $id_tipo_aux_siif_1,
                    "AUXILIAR" => $cod_sigla_1,
                    "IDENTIFICA" => $codigo_siif,
                    "VALOR" => $rec2['debito'] + $rec2['credito']
                );
            }
            /*
             * contador filas
             */
            $i++;


            /**
             * Se adiciona tabla para cuenta con rubro, tipo 3 - 20181123
             */
            if (strlen($rec2['rubro']) > 0) {

                /**
                 * BUSCA SIGLA EN ARCHIVO Y   TOMA TIPAUX,   CODAUX
                 */
                //sentencia sql
                $sql = <<<EOD
select * from cn_sigla_aux_siif 
WHERE sigla = 'CATGAS'               
EOD;
                //ejecutar sql
                $records = CN_TABLE::executeSQL($sql);

                $id_tipo_aux_siif_rubro = $records[0]['id_tipo_aux_siif'];
                $cod_sigla_rubro = $records[0]['cod_sigla'];

                if ($formato_val == 1) {
                    $records3 ["fila" . $i] = array(
                        "CONSECUTI" => $rec2['rn'],
                        "TIPO_AUXIL" => $id_tipo_aux_siif_rubro,
                        "AUXILIAR" => $cod_sigla_rubro,
                        "IDENTIFICA" => $codigo_siif,
                        "VALOR" => $rec2['debito'] + $rec2['credito']
                    );
                } else {
                    $records3 ["fila" . $i] = array(
                        "CONSECUTI" => $rec2['rn'],
                        "TIPO_AUXIL" => $id_tipo_aux_siif_rubro,
                        "AUXILIAR" => $cod_sigla_rubro,
                        "IDENTIFICA" => $rec2['rubro'],
                        "VALOR" => $rec2['debito'] + $rec2['credito']
                    );
                }
                /*
                 * contador filas
                 */
                $i++;
            }


            /**
             * Buscar caracteristicas de los digitos-cuenta de siif
             */
            $digitos = $rec2['digitos'];
            $deb = $rec2['debito'];
            if ($deb > 0) {
                $tipo_siif = 'D';
            } else {
                $tipo_siif = 'C';
            }
            //sentencia sql
            $sql = <<<EOD
select * from cn_aux_siif_carac
WHERE cuenta =  $digitos             
EOD;
            //ejecutar sql
            $records = CN_TABLE::executeSQL($sql);

            //validar registro que existe en la tabla
            $ter = 0;
            $ctaban = 0;
            $maq = 0;
            $ecc = 0;
            $ett = 0;
            $ecdh = 0;
            $mye = 0;
            $emc = 0;
            $edi = 0;
            $rlc = 0;
            $pdt = 0;
            $trr = 0;
            $inv = 0;
            $pvb = 0;
            $pps = 0;
            $pss = 0;
            $sem = 0;
            $pla = 0;
            if (count($records) > 0) {
                $ter = $records[0]['ter'];
                $ctaban = $records[0]['ctaban'];
                $maq = $records[0]['maq'];
                $ecc = $records[0]['ecc'];
                $ett = $records[0]['ett'];
                $ecdh = $records[0]['ecdh'];
                $mye = $records[0]['mye'];
                $emc = $records[0]['emc'];
                $edi = $records[0]['edi'];
                $rlc = $records[0]['rlc'];
                $pdt = $records[0]['pdt'];
                $trr = $records[0]['trr'];
                $inv = $records[0]['inv'];
                $pvb = $records[0]['pvb'];
                $pps = $records[0]['pps'];
                $pss = $records[0]['pss'];
                $sem = $records[0]['sem'];
                $pla = $records[0]['pla'];
            }


            /**
             * -  SI   SFTCN06.TER='SI'

              SIGLA='TER'
              BUSCA   SIGLA EN ARCHIVO SFAUXCON    Y   TOMA SFAUXCON.TIPAUX,   SFAUXCON.CODAUX

              LLENA EL REGISTRO ASI:
              TIPONIT+NIT=  1-NIT      CUANDO ES NIT
              TIPONIT+NIT=  3-NIT      CUANDO NO ES NIT

              CONSECUTI  =  CONSECUTI  DEL REGISTRO 2
              TIPO_AUXI=  SFAUXCON.TIPAUX
              AUXILIAR=SFAUXCON.CODAUX
              IDENTIFICA=  TIPONIT+NIT
              VALOR= CONSOLIDADO POR CUENTA TERCERO.DEBITO+CREDITO
             */
            if ($ter == 1) {

                $this->logMessage("TERCERO - SFTCN06.TER='SI'");

                /**
                 * BUSCA   SIGLA EN ARCHIVO Y   TOMA TIPAUX,   CODAUX
                 */
                //sentencia sql
                $sql = <<<EOD
select * from cn_sigla_aux_siif
WHERE sigla = 'TER'               
EOD;
                //ejecutar sql
                $records = CN_TABLE::executeSQL($sql);

                $id_tipo_aux_siif = $records[0]['id_tipo_aux_siif'];
                $cod_sigla = $records[0]['cod_sigla'];


                //sentencia sql
                /**
                 * Verificar si podemos identificar en el tipo de tercero si es Extranjero

                  Si el numero de identificvacion es de extranjero  el digito que se debe anteponer en el registro 3  es el (2-).

                  Un ejemplo es el numero de identificacion  444444041   del registro 3 comprobante 40 de julio.
                  Otra fiorma de identificarlos  puede ser que el numero de identificacion inicie con 444444  (6 cuatros)
                 */
                $sql = <<<EOD


select 

tabb.*,
nvl(ter.nitocc,'999999999') as nitocc,
substr(ter.nitocc,0, 6),
case when substr(ter.nitocc,0, 6) = '444444' then '2' when nvl(ter.nitocc,'999999999') > 800000000 and nvl(ter.nitocc,'999999999') <= 999999999 then '1' else '3' end as tipnit,
ter.nombre 

from(

    select 
    
    
    tab.digitos as digitos,
    sum(tab.debito) as debito,
    sum(tab.credito) as credito,
    tab.tipo,
    tab.id_mae_ter
    
    
    from(

    select * from cn_archivo_siif
    
    )tab
    
    group by
    tab.digitos,
    tab.tipo,
    tab.id_mae_ter
    
)tabb

left join cn_mae_ter ter
on ter.id_mae_ter = tabb.id_mae_ter

where 
tabb.digitos = '$digitos'                        
and tabb.tipo = '$tipo_siif'
             
order by 
tabb.digitos,
tabb.tipo,
ter.nitocc
                  
EOD;
                //ejecutar sql
                $records = CN_TABLE::executeSQL($sql);

                foreach ($records as $rec) {

                    $this->logMessage($i . ". TERCERO - " . $rec['tipnit'] . "-" . $rec['nitocc']);

                    /*
                     * validar valor mayor que cero
                     */
                    if (($rec['debito'] + $rec['credito']) > 0) {
                        if ($formato_val == 1) {
                            $records3 ["fila" . $i] = array(
                                "CONSECUTI" => $rec2['rn'],
                                "TIPO_AUXIL" => $id_tipo_aux_siif,
                                "AUXILIAR" => $cod_sigla,
                                "IDENTIFICA" => $codigo_siif,
                                "VALOR" => $rec['debito'] + $rec['credito']
                            );
                        } else {
                            $records3 ["fila" . $i] = array(
                                "CONSECUTI" => $rec2['rn'],
                                "TIPO_AUXIL" => $id_tipo_aux_siif,
                                "AUXILIAR" => $cod_sigla,
                                "IDENTIFICA" => $rec['tipnit'] . "-" . $rec['nitocc'],
                                "VALOR" => $rec['debito'] + $rec['credito']
                            );
                        }
                    }

                    /*
                     * contador filas
                     */
                    $i++;
                }
            }




            /**
             * -  SI   SFTCN06.CTABAN='SI'

              SIGLA='CTABAN'
              BUSCA   SIGLA EN ARCHIVO SFAUXCON    Y   TOMA SFAUXCON.TIPAUX,   SFAUXCON.CODAUX

              LLENA EL REGISTRO ASI:

              POR CADA CONSOLIDADO DE   CUENTA+AUXILIAR   SEGUN EL COMPROBANTE QUE SE ESTE GENERANDO:
              CONSECUTI  =  CONSECUTI  DEL REGISTRO 2
              TIPO_AUXI=  SFAUXCON.TIPAUX
              AUXILIAR=SFAUXCON.CODAUX
              IDENTIFICA=  CATALOGO_AUXILIAR.DESAUXILIAR   DESCRIPCION AUXILIAR
              VALOR= CONSOLIDADO POR CUENTA+AUXILIAR.DEBITO+CREDITO
             */
            if ($ctaban == 1) {

                /**
                 * BUSCA   SIGLA EN ARCHIVO Y   TOMA TIPAUX,   CODAUX
                 */
                //sentencia sql
                $sql = <<<EOD
select * from cn_sigla_aux_siif
WHERE sigla = 'CTABAN'               
EOD;
                //ejecutar sql
                $records = CN_TABLE::executeSQL($sql);

                $id_tipo_aux_siif = $records[0]['id_tipo_aux_siif'];
                $cod_sigla = $records[0]['cod_sigla'];


                //sentencia sql
                $sql = <<<EOD

select 

tabb.*,
aux.nom_aux

from(

    select 
    
    
    tab.digitos as digitos,
    sum(tab.debito) as debito,
    sum(tab.credito) as credito,
    tab.tipo,
    tab.id_auxiliar
    
    
    from(

    select * from cn_archivo_siif
    
    )tab
    
    group by
    tab.digitos,
    tab.tipo,
    tab.id_auxiliar
    
)tabb

left join cn_subc_digitos_aux aux
on aux.digitos = SUBSTR(tabb.digitos,0,6)
and aux.id_auxiliar = tabb.id_auxiliar

where 
tabb.digitos = '$digitos'                        
and tabb.tipo = '$tipo_siif'

order by 
tabb.digitos,
tabb.tipo,
aux.nom_aux
                  
EOD;
                //ejecutar sql
                $records = CN_TABLE::executeSQL($sql);

                foreach ($records as $rec) {


                    /*
                     * validar valor mayor que cero
                     */
                    if (($rec['debito'] + $rec['credito']) > 0) {
                        if ($formato_val == 1) {
                            $records3 ["fila" . $i] = array(
                                "CONSECUTI" => $rec2['rn'],
                                "TIPO_AUXIL" => $id_tipo_aux_siif,
                                "AUXILIAR" => $cod_sigla,
                                "IDENTIFICA" => $codigo_siif,
                                "VALOR" => $rec['debito'] + $rec['credito']
                            );
                        } else {
                            $records3 ["fila" . $i] = array(
                                "CONSECUTI" => $rec2['rn'],
                                "TIPO_AUXIL" => $id_tipo_aux_siif,
                                "AUXILIAR" => $cod_sigla,
                                "IDENTIFICA" => $rec['nom_aux'],
                                "VALOR" => $rec['debito'] + $rec['credito']
                            );
                        }
                    }

                    /*
                     * contador filas
                     */
                    $i++;
                }
            }


            /**
             * 
              4. REGISTRO SEGÚN  LOS SIGUIENTES CAMPOS:
              a. MAQ=X        SIGLA=MAQ
              b. ECC=X        SIGLA=ECC
              c. ETT=X        SIGLA=ETT
              d. ECDC=X     SIGLA=ECDC
              e. MYE=X       SIGLA=MYE
              f. EMC=X       SIGLA=EMC
              g. EDI=X         SIGLA=EDI
              h. RLC=X        SIGLA=RLC
              i. PDT=X        SIGLA=PDT
              j. TRR=X        SIGLA=TRR
              k. INV=X        SIGLA=INV
              l. PVB=X       SIGLA=PVB
              m. PPS=X        SIGLA=PPS
              n. PSS=X        SIGLA=PSS
              o. SEM=X      SIGLA=SEM
              p. PLA=X        SIGLA=PLA
             * 
             * SIGLA =  SEGÚN LA SIGLA IDENTIFICADA
              BUSCAR EN EL ARCHIVO SFAUXCON   Y TOMAR  SFAUXCON.TIPAUX  Y SFAUXCON.CODAUX
              BUSCAR EN EL ARCHIVO  sal2011   por cada CUENTA+AUXILIAR  DEL MOVIMIENTO  CONSOLIDADO  Y TOMAR LOS CAMPOS AUX_DIR   E  IDENTI_AUX.
              SI LA CUENTA EN EL MIVMIENTO CONTABLE NO USA AUXILIAR    SE DEBE VBUSCAR UNICAMENTE POR LA CUENTA  Y TOMAR LA PRIMERA ENCONTRADA.

              LLENAR EL REGISTRO ASÍ:
              CONSECUTI=  CONSECUTI DEL REGISTRO TIPO2
              TIPO_AUXI=SFAUXCON.TIPAUX
              AUXILIAR=SFAUXCON.CODAUX
              IDENTIFICA= SAL2011.IDENTI_AUX
              VALOR= DEBITO+CREDITO  DEL MOVIMENTO
             */
            if (($maq + $ecc + $ett + $ecdh + $mye + $emc + $edi + $rlc + $pdt + $trr + $inv + $pvb + $pps + $pss + $sem + $pla) >= 1) {

                $sigla = 'PCIC';

                if ($maq == 1) {

                    $sigla = 'MAQ';
                } elseif ($ecc == 1) {

                    $sigla = 'ECC';
                } elseif ($ett == 1) {

                    $sigla = 'ETT';
                } elseif ($ecdh == 1) {

                    $sigla = 'ECDH';
                } elseif ($mye == 1) {

                    $sigla = 'MYE';
                } elseif ($emc == 1) {

                    $sigla = 'EMC';
                } elseif ($edi == 1) {

                    $sigla = 'EDI';
                } elseif ($rlc == 1) {

                    $sigla = 'RLC';
                } elseif ($pdt == 1) {

                    $sigla = 'PDT';
                } elseif ($trr == 1) {

                    $sigla = 'TRR';
                } elseif ($inv == 1) {

                    $sigla = 'INV';
                } elseif ($pvb == 1) {

                    $sigla = 'PVB';
                } elseif ($pps == 1) {

                    $sigla = 'PPS';
                } elseif ($pss == 1) {

                    $sigla = 'PSS';
                } elseif ($sem == 1) {

                    $sigla = 'SEM';
                } elseif ($pla == 1) {

                    $sigla = 'PLA';
                }


                /**
                 * BUSCA   SIGLA EN ARCHIVO Y   TOMA TIPAUX,   CODAUX
                 */
                //sentencia sql
                $sql = <<<EOD
select * from cn_sigla_aux_siif
WHERE sigla = '$sigla'               
EOD;
                //ejecutar sql
                $records = CN_TABLE::executeSQL($sql);

                $id_tipo_aux_siif = $records[0]['id_tipo_aux_siif'];
                $cod_sigla = $records[0]['cod_sigla'];

                //sentencia sql
                $sql = <<<EOD

select 

tabb.*,
aux.identi_aux as identi_aux

from(

    select 
    
    
    tab.digitos as digitos,
    sum(tab.debito) as debito,
    sum(tab.credito) as credito,
    tab.tipo
    
    
    from(

    select * from cn_archivo_siif
    
    )tab
    
    group by
    tab.digitos,
    tab.tipo,
    tab.id_auxiliar
    
)tabb
        
join cn_subc_digitos subc
on SUBSTR(tabb.digitos,0,6) = subc.digitos
        
        
left join (
  SELECT
   aut.*,
   ROW_NUMBER() OVER (
    partition by aut.id_catalogo, aut.id_auxiliar
    ORDER BY aut.id_catalogo, aut.id_auxiliar, aut.aux_dir asc
   ) AS rn
  from cn_aux_siif aut
)aux
on subc.id_cia = aux.id_cia
and subc.id_catalogo = aux.id_catalogo
and subc.id_cuenta_mayor = aux.id_cuenta_mayor
and subc.id_grupo_cuenta = aux.id_grupo_cuenta
and subc.id_clase_cuenta = aux.id_clase_cuenta
and aux.rn = 1


where 
tabb.digitos = '$digitos'                        
and tabb.tipo = '$tipo_siif'

order by 
tabb.digitos,
tabb.tipo
                  
EOD;
                //ejecutar sql
                $records = CN_TABLE::executeSQL($sql);

                foreach ($records as $rec) {

                    /*
                     * validar valor mayor que cero
                     */
                    if (($rec['debito'] + $rec['credito']) > 0) {
                        if ($formato_val == 1) {
                            $records3 ["fila" . $i] = array(
                                "CONSECUTI" => $rec2['rn'],
                                "TIPO_AUXIL" => $id_tipo_aux_siif,
                                "AUXILIAR" => $cod_sigla,
                                "IDENTIFICA" => $codigo_siif,
                                "VALOR" => $rec['debito'] + $rec['credito']
                            );
                        } else {
                            $records3 ["fila" . $i] = array(
                                "CONSECUTI" => $rec2['rn'],
                                "TIPO_AUXIL" => $id_tipo_aux_siif,
                                "AUXILIAR" => $cod_sigla,
                                "IDENTIFICA" => $rec['identi_aux'],
                                "VALOR" => $rec['debito'] + $rec['credito']
                            );
                        }
                    }

                    /*
                     * 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
         */
        $html_sp = ";";
        if ($formato_val == 1) {
            $cabecera1 = "CONSECUTI" . $html_sp . "FECHA_CON" . $html_sp . "TIPO_DOC" . $html_sp . "NUMERO_DOC" . $html_sp . "DESCRIPCIO" . $salto_linea;
            $cabecera2 = "CONSECUTI" . $html_sp . "CODIGO_CON" . $html_sp . "VALOR_DEB" . $html_sp . "VALOR_CRE" . $salto_linea;
            $cabecera3 = "CONSECUTI" . $html_sp . "TIPO_AUXIL" . $html_sp . "AUXILIAR" . $html_sp . "IDENTIFICA" . $html_sp . "VALOR" . $salto_linea;
        } else {
            $cabecera1 = "CONSECUTI" . $html_sp . "FECHA_CON" . $html_sp . "TIPO_DOC" . $html_sp . "NUMERO_DOC" . $html_sp . "DESCRIPCIO" . $salto_linea;
            $cabecera2 = "CON1" . $html_sp . "CONSECUTI" . $html_sp . "CODIGO_CON" . $html_sp . "VALOR_DEB" . $html_sp . "VALOR_CRE" . $salto_linea;
            $cabecera3 = "CONSECUTI" . $html_sp . "TIPO_AUXIL" . $html_sp . "AUXILIAR" . $html_sp . "IDENTIFICA" . $html_sp . "VALOR" . $salto_linea;
        }

        //tipo de consulta Consolidado - Detallado
        if ($filtro == 1) {

            $nombre = "consol1_" . $cod_tipcomp . "_" . substr($di_fin, 8, 2) . str_pad($id_periodo_contable, 2, "0", STR_PAD_LEFT) . $id_vigencia;
            if ($type == 'xls') {
                $this->archivoExcelHtml($nombre, $records1, $cabecera1, $type);
            } else {
                $this->archivoExcel($nombre, $records1, $cabecera1, $type);
            }


            $nombre = "consol2_" . $cod_tipcomp . "_" . substr($di_fin, 8, 2) . str_pad($id_periodo_contable, 2, "0", STR_PAD_LEFT) . $id_vigencia;
            if ($type == 'xls') {
                $this->archivoExcelHtml($nombre, $records2, $cabecera2, $type);
            } else {
                $this->archivoExcel($nombre, $records2, $cabecera2, $type);
            }

            $nombre = "consol3_" . $cod_tipcomp . "_" . substr($di_fin, 8, 2) . str_pad($id_periodo_contable, 2, "0", STR_PAD_LEFT) . $id_vigencia;
            if ($type == 'xls') {
                $this->archivoExcelHtml($nombre, $records3, $cabecera3, $type);
            } else {
                $this->archivoExcel($nombre, $records3, $cabecera3, $type);
            }
        } else {

            /**
             * El proceso de generación archivos SIIF,  en la selección DIARIO,  
             * está generando archjvos para todos los días del rango de fechas seleccionado.  
             * Debe generar únicamente para los días que tengas movimiento contable. - 20140903
             */
            if (count($records2) > 0) {

                $nombre = "deta1_" . $cod_tipcomp . "_" . substr($di_fin, 8, 2) . str_pad($id_periodo_contable, 2, "0", STR_PAD_LEFT) . $id_vigencia;
                if ($type == 'xls') {
                    $this->archivoExcelHtml($nombre, $records1, $cabecera1, $type);
                } else {
                    $this->archivoExcel($nombre, $records1, $cabecera1, $type);
                }
                $nombre = "deta2_" . $cod_tipcomp . "_" . substr($di_fin, 8, 2) . str_pad($id_periodo_contable, 2, "0", STR_PAD_LEFT) . $id_vigencia;
                if ($type == 'xls') {
                    $this->archivoExcelHtml($nombre, $records2, $cabecera2, $type);
                } else {
                    $this->archivoExcel($nombre, $records2, $cabecera2, $type);
                }

                $nombre = "deta3_" . $cod_tipcomp . "_" . substr($di_fin, 8, 2) . str_pad($id_periodo_contable, 2, "0", STR_PAD_LEFT) . $id_vigencia;
                if ($type == 'xls') {
                    $this->archivoExcelHtml($nombre, $records3, $cabecera3, $type);
                } else {
                    $this->archivoExcel($nombre, $records3, $cabecera3, $type);
                }
            }
        }
    }

    /**
     * Generacion de archivo en excel CSV
     * 
     * @param type $nombre
     * @param type $records
     * @param type $cabecera
     */

    /**
     * los archivos en el formato final .txt  para subir a SIIF.

      Básicamente:
      1. Le quitan la primera fila de nombre de campo
      2. Quitan espacios en blanco
      3. Ponen separador decimal (.)
      4. Ponen separador de campo (|)


      Podemos adicionar un boton para descarlarlos en este formato  y dejar activo el de excel.
     */
    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 = "|";
        }


        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 > 5) {
                        break;
                    }
                }
                //echo " <br>";
                $shtml .= $salto_linea;
            }

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

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

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

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

        try {

            $objPHPExcel = new PHPExcel();
            $objPHPExcel->getProperties()->setTitle("Titulo");
            $objPHPExcel->getActiveSheetIndex(0);
//             $objPHPExcel->getActiveSheet->setCellValue('A1','texto');
            $objPHPExcel->getActiveSheet()->setTitle("Nombre hoja");


            $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
            $objWriter->save('uploads/archivos_siif/' . $nombre . '.xls'); //ruta del archivo a generar
            //$objWriter->save("uploads/archivos_siif/" . $nombre . ".xls"); //ruta del archivo a generar
        } catch (Exception $exc) {

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

    /**
     * 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
            //$cabecera1 = "CONSECUTI" . $html_sp . "FECHA_CON" . $html_sp . "TIPO_DOC" . $html_sp . "NUMERO_DOC" . $html_sp . "DESCRIPCIO" . $salto_linea;
            //$cabecera2 = "CON1" . $html_sp . "CONSECUTI" . $html_sp . "CODIGO_CON" . $html_sp . "VALOR_DEB" . $html_sp . "VALOR_CRE" . $salto_linea;
            //$cabecera3 = "CONSECUTI" . $html_sp . "TIPO_AUXIL" . $html_sp . "AUXILIAR" . $html_sp . "IDENTIFICA" . $html_sp . "VALOR" . $salto_linea;

            $cabecera = explode(';', $cabecera);

            $shtml = "<table><tr>";
            $shtml .= "<td>" . $cabecera[0] . "</td>";
            $shtml .= "<td>" . $cabecera[1] . "</td>";
            $shtml .= "<td>" . $cabecera[2] . "</td>";
            $shtml .= "<td>" . $cabecera[3] . "</td>";
            $shtml .= "<td>" . $cabecera[4] . "</td>";
            $shtml .= "</tr>";



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

                $cont_fila = 1;

                foreach ($rec as $key => $value) {//campo
                    if ($key == 'IDENTIFICA' || $key == 'FECHA_CON' || $key == 'CODIGO_CON' || $key == 'digitos') {
                        $shtml .= "<td style='mso-number-format:\@'>" . $value . "</td>"; //formato de texto
                    } else if ($key == 'VALOR' || $key == 'VALOR_DEB' || $key == 'VALOR_CRE' || $key == 'debito' || $key == 'credito') {
                        $shtml .= "<td>" . str_replace('.', ',', $value) . "</td>";
                    } else {
                        $shtml .= "<td>" . $value . "</td>";
                    }

                    $cont_fila++;

                    if ($cont_fila > 5) {
                        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>";


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

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

}
