<?php

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

    /**
     * Executes list action
     *
     * @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 tab0." . $request['_sortBy'];
        } else {
            $sortBy = ' order by tab0.id_anhos, tab0.num_contrato, tab0.id_contrato  ';
        }
        //$sortBy = ' ';

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


            /*
             * 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 Supervisor
            if (isset($request['id_supervisor'])) {
                $whereIdSupervisor = " AND tab0.id_supervisor = " . $request['id_supervisor'];
            } else {
                $whereIdSupervisor = ' ';
            }
            //Id Apoyo Supervisor
            if (isset($request['id_apoyo_supervisor'])) {
                $whereIdApoyoSupervisor = " AND tab0.id_apoyo_supervisor = " . $request['id_apoyo_supervisor'];
            } else {
                $whereIdApoyoSupervisor = ' ';
            }
            //Area
            if (isset($request['id_area'])) {
                $whereArea = " AND tab0.id_ea = " . $request['id_area'];
            } else {
                $whereArea = ' ';
            }

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

            /**
             * 
             */
            $consulta_sql = <<<EOD
select
tab0.*
from(
    
    select distinct
        
    cont.id_contrato,
    cont.id_contratista,
    cont.tipo_recurso,
    cont.num_contrato,
    cont.id_anhos,
    cont.fecha_contrato,
    cont.estado,
    
    anmrps.rp_detalles as rp_anm,
    sgrrps.rp_detalles as rp_sgr,
    cont.valor_anm,
    cont.valor_sgr,
    cont.dependencia,
    cont.meses_plazo,
    cont.dias_plazo,
    cont.fecha_plazo,
    cont.id_supervisor,
    cont.id_apoyo_supervisor,
    cont.fecha_ini,
    cont.fecha_fin,
    cont.numero_pago,
    cont.valor_mensualizado,
    cont.id_area,
    cont.id_tipo_contrato,
    
    cont.id_mae_ter_sup,
    cont.num_doc_sup,
    cont.razon_soc_sup,
    cont.estado_sup,
    cont.id_mae_ter_apo,
    cont.num_doc_apo,
    cont.razon_soc_apo,
    cont.estado_apo,
    
    cont.descripcion_tipcon,
    cont.abreviatura_tipcon,
    cont.codigo_area,
    cont.descripcion_area,
    cont.sigla_area,
    cont.id_co_contrato,
    cont.valor_mensual,
    cont.valor_primer_pago,
    
    contra.num_doc,
    contra.razon_social,
    
    valcont.sum_rp_detalles as valor_contrato,
    
    nvl(cant.cant_pago_pagado,0) as cant_pago_pagado,
    nvl(cant.valor_neto_pagado,0) as valor_neto_pagado,
    
    case when no_pago_vencido < 0 then 0 else no_pago_vencido end as no_pago_vencido,
    case when ( cont.valor_mensualizado * (case when no_pago_vencido < 0 then 0 else no_pago_vencido end) ) < valcont.sum_rp_detalles - nvl(cant.valor_neto_pagado,0) 
        then ( cont.valor_mensualizado * (case when no_pago_vencido < 0 then 0 else no_pago_vencido end) ) 
        else valcont.sum_rp_detalles - nvl(cant.valor_neto_pagado,0) 
    end as valor_pago_vencido,
                    
    nvl(cantproc.no_pago_proceso,0) as no_pago_proceso,
    cantproc.estado_pago_proceso as estado_pago_proceso,
    
    valcont.sum_rp_detalles - nvl(cant.valor_neto_pagado,0) as saldo
    
    from rvc_contrato_v cont
    
    left join rvc_contratista contra
    on contra.id_contratista = cont.id_contratista

    LEFT JOIN RVC_CONTRATO_COMAS_RPS_V anmrps ON cont.id_contrato=anmrps.id_contrato and anmrps.tipo_recurso=0
    
    LEFT JOIN RVC_CONTRATO_COMAS_RPS_V sgrrps ON cont.id_contrato=sgrrps.id_contrato and sgrrps.tipo_recurso=1
    
    left join RVC_CONTRATO_RPS_SUM_V valcont
    on cont.id_contrato = valcont.id_contrato
    
    left join(
        select
        cont.num_contrato,
        cont.id_anhos,
        max(cont.numero_pago) as numero_pago,
        max(formt.fecha_ini_pago) as fecha_ini_pago,
        max(formt.fecha_fin_pago) as fecha_fin_pago,
        max(formt.id_numero_pago) as max_no_pago, 
        case when max(formt.id_numero_pago) >= max(cont.numero_pago) 
        then 0
        else months_between( to_date('01/'|| extract(month from (case when max(cont.fecha_fin) < sysdate then max(cont.fecha_fin) else sysdate end)) || '/' || extract(year from (case when max(cont.fecha_fin) < sysdate then max(cont.fecha_fin) else sysdate end)),'dd/mm/yyyy') , 
            to_date('01/'|| extract(month from max(formt.fecha_fin_pago)) || '/' || extract(year from max(formt.fecha_fin_pago)),'dd/mm/yyyy') ) - 1 
        end as no_pago_vencido,
        count(formt.id_formato_pago) as cant_pago_pagado,
        sum(formt.valor_ingresos) as valor_neto_pagado,
        LISTAGG(formt.desc_estado_general, ',') WITHIN GROUP (ORDER BY id_formato_pago DESC) as estado_pago_proceso
        
        from rvc_formato_pago_v formt
        
        left join rvc_contrato cont
        on cont.id_contrato = formt.id_contrato
        
        where
        formt.estado = 1
        and formt.estado_general in (7,6)
        
        group by
        cont.num_contrato,
        cont.id_anhos
    )cant
    on cant.num_contrato = cont.num_contrato
    and cant.id_anhos = cont.id_anhos
    
    left join(
        select
        cont.num_contrato,
        cont.id_anhos,
        max(cont.numero_pago) as numero_pago,
        count(formt.id_formato_pago) as no_pago_proceso,
        sum(formt.valor_ingresos) as valor_pago_proceso,
        LISTAGG(formt.desc_estado_general, ',') WITHIN GROUP (ORDER BY id_formato_pago DESC) as estado_pago_proceso
        
        from rvc_formato_pago_v formt
        
        left join rvc_contrato cont
        on cont.id_contrato = formt.id_contrato
        
        where
        formt.estado = 1
        and formt.estado_general not in (7,6)
        
        group by
        cont.num_contrato,
        cont.id_anhos
    )cantproc
    on cantproc.num_contrato = cont.num_contrato
    and cantproc.id_anhos = cont.id_anhos
        
    where
    1 = 1
    and cont.estado = 1
    and trunc(cont.fecha_contrato) between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd')
                    
)tab0

where
1 = 1
$whereIdContratista
$whereIdContrato   
$whereIdSupervisor                    
$whereIdApoyoSupervisor                    
$whereArea                    
EOD;

            /*
             * Sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            $sql = <<<EOD
select count(*) as count from (
                    
    $consulta_sql    
                    
)
EOD;


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


            //obtener el listado de recaudos
            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

    $consulta_sql

    $sortBy
          
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);


            $this->totalRows = $total_record_count;
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($resultado);
            $this->list_data = $resultado;
            $this->logMessage("[inf_gen_ejecu_cont] Consulta exitosa.");
        } catch (Exception $e) {

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

}
