<?php

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

    /**
     * Obtener log especificos
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------*  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");



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

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

        //ordenar consulta
        if (isset($request['_sortBy'])) {
            $sortBy = " Order by " . $request['_sortBy'];
        } else {
            $sortBy = '';
        }


        //solo imprime log la primera vez de consulta
        if ($rowStart == 0) {
            /*
             * variables por defecto para el registro de log
             */
            $id_tabla = 'null';
            $id_vigencia = 'null';
            $id_cen_op = 'null';

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

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('CA_LOG');

            //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
            $observacion = "'Se consulto log especifico la funcionalidad: " . $comando . "'";

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

            /*
             * 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, $id_punto_venta_log);
        }

        /*
         * Manejo de errores
         */
        try {

            //sentencia sql
            $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
            //ejecuta y obtiene el resultado del sql
            CN_TABLE::executeSQL($sql);

            //Obtener sql de log especifico segun parametro
            $sql_log = $this->sql_log($request);

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            $sql = <<<EOD

select count(*) as count from(

$sql_log

)

EOD;

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


            //validar si hay registros
            if ($total_record_count > 0) {

                //sentencia sql del informe
                $sql = <<<EOD

SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
                
$sql_log               
                
) row_ WHERE ROWNUM <=  $rowEnd  $sortBy ) where rownum_ >  $rowStart

EOD;


                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql);


                $this->totalRows = $total_record_count;
                $this->startRow = 0;
                $this->endRow = count($records);
                $this->list_data = $records;
                $this->logMessage("[LOG ESPECIFICO] Consulta exitosa.");
            } else {

                $mensaje = "[LOG ESPECIFICO] No hay registros de consulta.";
                $this->status = 1;
                $this->totalRows = 0;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            $this->status = 1;
            $this->totalRows = 0;
            $this->mensajeError = "ERROR!!!";
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

    /*
     * SQL de consulta log especificos
     */

    public function sql_log($request) {

        /*
         * Obtener variables y filtros segun log especifico
         */
        switch ($request['tipo']) {
            case 'Consulta de log Débito'://log especifico debito

                $tabla = 'CA_DEBITO';

                //parametros
                $parametros = <<<EOD
/* Datos especificos id_tabla */
deb.id_debito,
deb.id_anhos,
deb.id_tipo_debito,
deb.id_tip_mon,
deb.sec_debito,
deb.fecha_proceso,
deb.dias_pago,
deb.valor_total,
deb.observaciones,
deb.estado    AS estado_deb,
deb.fecha_anu AS fecha_anu_deb,
deb.motivo_anu as motivo_anu_deb,
deb.periodo_ini,
deb.periodo_fin,
tipdeb.desc_corta as desc_corta_tipdeb,
tipdeb.descripcion as descripcion_tipdeb
EOD;

                //joins
                $joins = <<<EOD
left join ca_debito deb
on deb.id_debito = logs.id_tabla

left join ca_tipo_debito tipdeb
on tipdeb.id_tipo_debito = deb.id_tipo_debito
EOD;

                /*
                 * Verificar los filtros
                 */
                if (isset($request['id_tipo_debito'])) {
                    $whereTipoDebito = "AND deb.id_tipo_debito = " . $request['id_tipo_debito'];
                } else {
                    $whereTipoDebito = '';
                }
                //to_char(logs.fecha_log, 'YYYY-MM-DD') BETWEEN '$fecha_ini' AND '$fecha_fin' 
                if (isset($request['fecha_ini_deb']) && isset($request['fecha_fin_deb'])) {
                    $whereFechaDebito = "AND to_char(deb.fecha_proceso, 'YYYY-MM-DD') BETWEEN '" . $request['fecha_ini_deb'] . "' AND '" . $request['fecha_fin_deb'] . "' ";
                } else {
                    $whereFechaDebito = '';
                }

                //filtros
                $filtros = <<<EOD
$whereTipoDebito $whereFechaDebito
EOD;

                break;

            case 'Consulta de log Crédito'://log especifico credito

                $tabla = 'CA_CREDITO';

                //parametros
                $parametros = <<<EOD
/* Datos especificos id_tabla */
cre.id_credito,
cre.id_anhos,
cre.id_tipo_credito,
cre.sec_credito,
cre.id_con_credito,
cre.fecha_proceso  AS fecha_proceso_cre,
cre.id_bn,
cre.id_cb,
cre.num_doc as num_doc_cre,
cre.oficina,
cre.valor,
cre.observaciones,
cre.estado    AS estado_cre,
cre.fecha_anu AS fecha_anu_cre,
cre.motivo_anu as motivo_anu_cre,
cre.fecha,
cre.id_ts_td,
Cre.Usuariolog,
concre.desc_corta as desc_corta_concre,
concre.descripcion as descripcion_concre,
tipcre.desc_corta as desc_corta_tipcre,
tipcre.descripcion as descripcion_tipcre
EOD;

                //joins
                $joins = <<<EOD
left join ca_credito cre
on cre.id_credito = logs.id_tabla

left join ca_con_credito concre
on concre.id_con_credito = cre.id_con_credito

left join ca_tipo_credito tipcre
on tipcre.id_tipo_credito = cre.id_tipo_credito
EOD;

                /*
                 * Verificar los filtros
                 */
                if (isset($request['id_tipo_credito'])) {
                    $whereTipoCredito = "AND cre.id_tipo_credito = " . $request['id_tipo_credito'];
                } else {
                    $whereTipoCredito = '';
                }
                if (isset($request['id_con_credito'])) {
                    $whereConceptoCredito = "AND cre.id_con_credito = " . $request['id_con_credito'];
                } else {
                    $whereConceptoCredito = '';
                }
                //to_char(logs.fecha_log, 'YYYY-MM-DD') BETWEEN '$fecha_ini' AND '$fecha_fin' 
                if (isset($request['fecha_ini_cre']) && isset($request['fecha_fin_cre'])) {
                    $whereFechaCredito = "AND to_char(cre.fecha_proceso_cre, 'YYYY-MM-DD') BETWEEN '" . $request['fecha_ini_cre'] . "' AND '" . $request['fecha_fin_cre'] . "' ";
                } else {
                    $whereFechaCredito = '';
                }

                //filtros
                $filtros = <<<EOD
$whereTipoCredito $whereConceptoCredito $whereFechaCredito             
EOD;

                break;


            case 'Consulta de log Novedad Cartera'://log especifico novedad cartera

                $tabla = 'CA_NOVEDAD_CARTERA';

                //parametros
                $parametros = <<<EOD
/* Datos especificos id_tabla */
nov.id_novedad_cartera,
nov.id_debito,
nov.id_vencimiento,
nov.fecha_novedad,
nov.num_doc as num_doc_nov,
nov.observaciones,
nov.abierto,
nov.anulado,
nov.id_tipo_novedad,
nov.id_ts_td,
nov.motivo_ce,
nov.fecha_ce,
tipnov.desc_corta as desc_corta_tipnov,
tipnov.descripcion as descripcion_tipnov,
td.documento,
td.descripcion as descipcion_td
EOD;

                //joins
                $joins = <<<EOD
left join ca_novedad_cartera nov
on nov.id_novedad_cartera = logs.id_tabla

left join ca_tipo_novedad tipnov
on tipnov.id_tipo_novedad = nov.id_tipo_novedad

left join ts_td td
on td.id = nov.id_ts_td
EOD;

                /*
                 * Verificar los filtros
                 */
                if (isset($request['id_tipo_novedad'])) {
                    $whereTipoNovedad = "AND nov.id_tipo_novedad = " . $request['id_tipo_novedad'];
                } else {
                    $whereTipoNovedad = '';
                }
                if (isset($request['id_ts_td'])) {
                    $whereTipoDocumento = "AND nov.id_ts_td = " . $request['id_ts_td'];
                } else {
                    $whereTipoDocumento = '';
                }
                //to_char(logs.fecha_log, 'YYYY-MM-DD') BETWEEN '$fecha_ini' AND '$fecha_fin' 
                if (isset($request['fecha_ini_nov']) && isset($request['fecha_fin_nov'])) {
                    $whereFechaNovedad = "AND to_char(nov.fecha_novedad, 'YYYY-MM-DD') BETWEEN '" . $request['fecha_ini_nov'] . "' AND '" . $request['fecha_fin_nov'] . "' ";
                } else {
                    $whereFechaNovedad = '';
                }

                //filtros
                $filtros = <<<EOD
$whereTipoNovedad  $whereTipoDocumento $whereFechaNovedad
EOD;

                break;

            default:

                $parametros = 'null as boton';
                $joins = '';
                $filtros = '';
                if (isset($request['noRegistro'])) {
                    $whereIdTabla = "AND logs.id_tabla = " . $request['noRegistro'];
                } else {
                    $whereIdTabla = '';
                }
                $tabla = '';

                break;
        }

        /*
         * Variables de filtro de log general
         */
        if (isset($request['fecha_ini'])) {
            $fecha_ini = $request['fecha_ini'];
        } else {
            $fecha_ini = '';
        }
        if (isset($request['fecha_fin'])) {
            $fecha_fin = $request['fecha_fin'];
        } else {
            $fecha_fin = '';
        }

        //AND tab0.id_tabla = '12'
        if (isset($request['noRegistro'])) {
            $whereIdTabla = "AND logs.id_tabla = " . $request['noRegistro'];
        } else {
            $whereIdTabla = '';
        }
        //AND tab0.id_ope_bd = '3'
        if (isset($request['id_ope_bd'])) {
            $whereOpeBd = "AND logs.id_ope_bd = " . $request['id_ope_bd'];
        } else {
            $whereOpeBd = '';
        }
        //AND tab0.id_mae_ter = '606'
        if (isset($request['id_mae_ter'])) {
            $whereTercero = "AND logs.id_mae_ter = " . $request['id_mae_ter'];
        } else {
            $whereTercero = '';
        }
        //AND tab0.id_punto_venta = '6'
        if (isset($request['id_punto_venta'])) {
            $wherePuntoVenta = "AND logs.id_punto_venta = " . $request['id_punto_venta'];
        } else {
            $wherePuntoVenta = '';
        }



        //sentencia sql
        $sql = <<<EOD
   
 
select 
/* Datos de log */
logs.Id_Log  AS Id_Log,
logs.Id_Tabla     AS Id_Tabla,
logs.Id_Anho  AS Id_Anho,
logs.Id_Mae_Bd    AS Id_Mae_Bd,
logs.Id_Ope_Bd    AS Id_Ope_Bd,
logs.Id_Mae_Ter   AS Id_Mae_Ter,
logs.Usuario      AS Usuario,
to_char(logs.Fecha_Log, 'YYYY-MM-DD HH24:MI:SS')    AS Fecha_Log,
logs.Comando      AS Comando,
logs.Observacion  AS Observacion,
logs.id_punto_venta as id_punto_venta,
/* Datos anexos al log */
mae.des_mae_bd as des_mae_bd, 
ope.des_ope_bd as des_ope_bd, 
ter.razon_soc as razon_soc, 
ter.num_doc as num_doc, 
cred.nombre as funcionalidad,
pv.nombre as nombre_pv, 
pv.descripcion as descripcion_pv, 
/* Datos especificos id_tabla */
$parametros

from ca_log logs

JOIN ca_Mae_Bd mae
ON logs.Id_Mae_Bd   = mae.Id_Mae_Bd
AND mae.Des_Mae_Bd = '$tabla'

LEFT JOIN CA_OPE_BD ope 
ON ope.id_ope_bd = logs.id_ope_bd 

LEFT JOIN INTERCEROS ter 
ON ter.id_mae_ter = logs.id_mae_ter 

LEFT JOIN CREDENCIAL cred 
ON cred.comando = logs.comando 

LEFT JOIN CA_PUNTO_VENTA pv 
ON pv.id_punto_venta = logs.id_punto_venta 

$joins

where
to_char(logs.fecha_log, 'YYYY-MM-DD') BETWEEN '$fecha_ini' AND '$fecha_fin' 
$whereIdTabla $whereOpeBd $whereTercero $wherePuntoVenta       
        
$filtros

ORDER BY 
logs.Id_Log
 
   
EOD;

        /*
         * Sql para log
         */
        return $sql;
    }

}
