<?php

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

    /**
     * Metodo del servicio list - consulta archivo contaduria
     *
     * @param sfWebRequest $request
     */
    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");
        }
        $this->logMessage("--------------------------------------------------");
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");


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


        //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 = ' ';
        }



        /*
         * 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
        $cen_op = 'null';
        if (isset($request['id_cen_op'])) {
            $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 = 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 . "'";



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

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

        $records = array();



        /*
         * sql que trae el resultado para totalizar las filas
         * 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
         */
        //sentencia sql
        $sql = <<<EOD
select count(*) as count from (

select 

rownum as rn,
tabb.* from(

    select 
    
    
    tab.digitos || tab.aux_dir as digitos,
    sum(tab.debito) as debito,
    sum(tab.credito) as credito,
    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,
        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
    
    order by 
    tab.digitos,
    tab.tipo
    
)tabb
                
where
tabb.debito != 0
or tabb.credito != 0


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

        //sentencia sql
        $sql = <<<EOD

SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

select 

rownum as rn,
tabb.* from(

    select 
    
    
    tab.digitos || tab.aux_dir as digitos,
    sum(tab.debito) as debito,
    sum(tab.credito) as credito,
    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,
        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
    
    order by 
    tab.digitos,
    tab.tipo
    
)tabb
                
where
tabb.debito != 0
or tabb.credito != 0

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

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

        /*
         * Valida si se obtuvo valores en la consulta
         */
        if (count($records) > 0) {

            /*
             * registro de consulta en tabla de log
             */
            //validar que solo sea al entrar 1 vez - click boton filtrar
            if ($request['_startRow'] == 0) {
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion);
            }

            //array de filas de consulta para uso del template
            $this->list_data = $records;
        } else {
            $this->list_data = array();
        }

        //totales de filas y de consulta
        $this->logMessage('record_count = ' . count($records));
        $this->logMessage('total_record_count = ' . $total_record_count);

        //datos de cabecera del JSON
        $this->totalRows = $total_record_count;
        $this->startRow = $request['_startRow'];
        $this->endRow = $this->startRow + count($records);
    }

}
