<?php

/**
 * lista_comisiones_form_pago actions.
 *
 * @package    radicacionVirtualCuentas
 * @subpackage lista_comisiones_form_pago
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class lista_comisiones_form_pagoActions 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 " . $request['_sortBy'];
        } else {
            $sortBy = ' order by tab0.vigencia desc, tab0.sgr desc, tab0.id_rp_comis desc ';
        }


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

            /*
             * Variables opcionales
             */
            //id_formato_pago - Para traer asi ya este en el archivo asociado - 20181101
            if (isset($request['id_formato_pago'])) {
                $whereIdFormatoPago = " AND tab0.id_formato_pago = " . $request['id_formato_pago'];
                $tag_FormatoPago = "or comfor.id_formato_pago = " . $request['id_formato_pago'];
            } else {
                $whereIdFormatoPago = ' ';
                $tag_FormatoPago = ' ';
            }
            //id_contratista
            if (isset($request['id_contratista'])) {
                $whereIdContratista = " AND tab0.id_contratista = " . $request['id_contratista'];
            } else {
                $whereIdContratista = ' ';
            }
            //id_contrato
            if (isset($request['id_contrato'])) {

                $id_contrato = $request['id_contrato'];
                $whereIdContrato = " AND tab0.id_contrato = " . $request['id_contrato'];

                //Validacion para solo formato de pago final segun fecha de contrato - 20181101
                $sql = <<<EOD
SELECT

*

FROM rvc_contrato
where
id_contrato = $id_contrato
and to_date('$fecha_fin','YYYY-MM-DD') = fecha_fin 
EOD;
                //ejecuta y obtiene el resultado del sql
                $resultado_contrato = CN_TABLE::executeSQL($sql);

                if (count($resultado_contrato) > 0) {
                    $tag_contrato_ini = 'last_day(';
                    $tag_contrato_fin = ')';
                } else {
                    $tag_contrato_ini = '';
                    $tag_contrato_fin = '';
                }
            } else {
                $whereIdContrato = ' ';
                $tag_contrato_ini = '';
                $tag_contrato_fin = '';
            }

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

            /**
             * 
             * 1. De acuerdo a fecha de llegada de la comisión, el contratista tiene tres (3) días hábiles para la Radicacion de los 
             * documentos de legalización, pasado este tiempo, el sistema no debe permitir al momento de la elaboración de la cuenta.

             * 2. Si la comisión ya se encuentra asociada a un Formato de pago que se encuentre en estado Aprobado, 
             * no se debe mostrar mas esta comisión para legalizar.

             * 3. Se deben mostrar las comisiones que se encuentren en estado "RADICADO" 
             * Puede estar cerrado - 20180808
             * id_tipo_nov_comis in (28,29)

             * 4. Una vez hecha la revisión de los documentos de la legalización, y de quedar en estado "BLOQUEADA", 
             * el sistema no debe permitir al momento de la elaboración de la siguiente cuenta hasta que el comisionada (o) haya la respectiva subsanación.

             * Recurso: 0-ANM 1-SGR
             * 
             * Se cambia a fecha inicial del cumplido y no de fin - 20180810
             * Incidente #9843,Que la fecha de la comisión seleccionada Fecha de terminación 
             * de la comisión más 3 días habiles legales para legalizar, sea menor a la 
             * Fecha de terminación de la cuenta que estén programando.
             * Se toma valor legalizado id 32,82, estado=1 - 20180827
             * Incidente #9895, menor o igual - 20180831
             * Incidente #10083, filtro de vigencia y valor de taxis - 20180925
             * Incidente #10247, solo si el valor del RP es mayor a 0 - 20181012
             * Se coloca id-32 en tipo nov comis para validar en estado reintegro tesoreria - 20181120
             */
            $consulta_sql = <<<EOD
SELECT
tab0.*
FROM (

    SELECT distinct

    0 as sgr,
    rp.id as id_rp_comis,
    rp.id_vigencia,
    rp.vigencia,
    rp.fecha,
    res.resolucion,
    res.id_comision,
    tab5.id_tipo_nov_comis,
    tipo.descripcion as estado_text,
    nvl(prleg.val_sum,0) as valor,

    avanc.fecha_ini_comi,
    avanc.fecha_fin_comi

    FROM pr_rp_comis rp

    join pr_resol_comis res
    on rp.no_acto_admin = res.id
    and rp.id_vigencia = res.id_vigencia
    and rp.vigencia = res.vigencia

    LEFT JOIN PR_AVANCES_COMISIONES avanc 
    ON rp.id = avanc.id_rp_comis 
    and rp.vigencia = avanc.vigencia 
    and rp.ID_VIGENCIA = avanc.id_vigencia 

    join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.id_rp_comis
        ORDER BY aut.id_rp_comis desc, aut.vigencia desc, aut.fecha_sys desc, aut.id_cierre_comision desc
       ) AS rn
      from pr_cierre_comision aut
    )tab5
    ON rp.ID = tab5.id_rp_comis 
    and rp.id_vigencia=tab5.id_vigencia 
    and rp.vigencia=tab5.vigencia
    and tab5.rn = 1

    left join pr_tipo_nov_comis tipo
    on tipo.id_tipo_nov_comis = tab5.id_tipo_nov_comis

    JOIN ( 
        SELECT 
        prrpc.ID,prrpc.id_vigencia,prrpc.vigencia, 
        /*SUM(prrpcomp.VALOR) AS val_sum*/
        SUM(comobj.viaticos) + SUM(comobj.taxis) AS val_sum
        
        
        FROM PR_RP_COMIS prrpc 
        JOIN PR_RP_COMPROMISO prrpcomp ON prrpc.ID = prrpcomp.ID_RP 
        AND prrpc.ID_VIGENCIA = prrpcomp.ID_VIGENCIA AND prrpc.VIGENCIA = prrpcomp.VIGENCIA 

        join pr_resol_comis res
        on prrpc.no_acto_admin = res.id
        and prrpc.id_vigencia = res.id_vigencia
        and prrpc.vigencia = res.vigencia

        left join comisionados_objs comobj
        on comobj.id_comision = res.id_comision
        and comobj.vigencia = prrpc.vigencia
        and comobj.nitocc = prrpc.id_tercero
        
        GROUP BY prrpc.ID ,prrpc.id_vigencia,prrpc.vigencia,prrpc.id_cdp
    ) prrpc2 
    ON rp.ID = prrpc2.ID 
    and rp.id_vigencia=prrpc2.id_vigencia 
    and rp.vigencia=prrpc2.vigencia

    left JOIN ( 
        SELECT 
        prrpc.ID,prrpc.id_vigencia,prrpc.vigencia, 
        /*SUM(prrpcomp.VALOR) AS val_sum*/
        SUM(prleg.v_neto) AS val_sum
        
        
        FROM PR_RP_COMIS prrpc 
        
        JOIN pr_legalizacion_comis prleg 
        ON prrpc.ID = prleg.id_rp_comis 
        AND prrpc.ID_VIGENCIA = prleg.ID_VIGENCIA 
        AND prrpc.VIGENCIA = prleg.VIGENCIA 
        
        where
        prleg.id_elementos_gasto in (32,82,35,36,38)
        
        GROUP BY 
        prrpc.ID ,
        prrpc.id_vigencia,
        prrpc.vigencia,
        prrpc.id_cdp
    ) prleg 
    ON rp.ID = prleg.ID 
    and rp.id_vigencia=prleg.id_vigencia 
    and rp.vigencia=prleg.vigencia
    
    left join (    
        select 
        comfor.* 
        from rvc_comision_form_pago comfor
    
        left join rvc_formato_pago_v forpag
        on forpag.id_formato_pago = comfor.id_formato_pago
    
        where
        comfor.sgr = 0
        and forpag.estado = 1
    ) comfor   
    on comfor.id_rp_comis = rp.ID
    and comfor.id_vigencia = rp.id_vigencia
    and comfor.vigencia = rp.vigencia
    
    join pr_cierre_comision cierre
    ON rp.ID = cierre.id_rp_comis 
    and rp.id_vigencia = cierre.id_vigencia 
    and rp.vigencia = cierre.vigencia
    and cierre.id_tipo_nov_comis in (28,29,32)

    where
    rp.id_tercero = '$nitocc'
    and rp.estado=1
    and (
        dias_habiles(avanc.fecha_fin_comi,3) <= $tag_contrato_ini to_date('$fecha_fin','YYYY-MM-DD') $tag_contrato_fin
    )
    and ( comfor.id_comision_form_pago is null $tag_FormatoPago ) 
    and rp.vigencia = EXTRACT(YEAR FROM sysdate)
        
    union

    SELECT distinct

    1 as sgr,
    rp.id as id_rp_comis,
    rp.id_vigencia,
    rp.vigencia,
    rp.fecha,
    res.resolucion,
    res.id_comision,
    tab5.id_tipo_nov_comis,
    tipo.descripcion as estado_text,
    nvl(prleg.val_sum,0) as valor,

    avanc.fecha_ini_comi,
    avanc.fecha_fin_comi

    FROM pr_rp_comis@SGR.ANM.LOCAL rp

    join pr_resol_comis@SGR.ANM.LOCAL res
    on rp.no_acto_admin = res.id
    and rp.id_vigencia = res.id_vigencia
    and rp.vigencia = res.vigencia

    LEFT JOIN PR_AVANCES_COMISIONES@SGR.ANM.LOCAL avanc 
    ON rp.id = avanc.id_rp_comis 
    and rp.vigencia = avanc.vigencia 
    and rp.ID_VIGENCIA = avanc.id_vigencia 

    join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.id_rp_comis
        ORDER BY aut.id_rp_comis desc, aut.vigencia desc, aut.fecha_sys desc, aut.id_cierre_comision desc
       ) AS rn
      from pr_cierre_comision@SGR.ANM.LOCAL aut
    )tab5
    ON rp.ID = tab5.id_rp_comis 
    and rp.id_vigencia=tab5.id_vigencia 
    and rp.vigencia=tab5.vigencia
    and tab5.rn = 1

    left join pr_tipo_nov_comis@SGR.ANM.LOCAL tipo
    on tipo.id_tipo_nov_comis = tab5.id_tipo_nov_comis

    JOIN ( 
        SELECT 
        prrpc.ID,prrpc.id_vigencia,prrpc.vigencia, 
        /*SUM(prrpcomp.VALOR) AS val_sum*/
        SUM(comobj.viaticos) + SUM(comobj.taxis) AS val_sum
        
        FROM PR_RP_COMIS@SGR.ANM.LOCAL prrpc 
        JOIN PR_RP_COMPROMISO@SGR.ANM.LOCAL prrpcomp ON prrpc.ID = prrpcomp.ID_RP 
        AND prrpc.ID_VIGENCIA = prrpcomp.ID_VIGENCIA AND prrpc.VIGENCIA = prrpcomp.VIGENCIA 

        join pr_resol_comis@SGR.ANM.LOCAL res
        on prrpc.no_acto_admin = res.id
        and prrpc.id_vigencia = res.id_vigencia
        and prrpc.vigencia = res.vigencia

        left join comisionados_objs@SGR.ANM.LOCAL comobj
        on comobj.id_comision = res.id_comision
        and comobj.vigencia = prrpc.vigencia
        and comobj.nitocc = prrpc.id_tercero
        
        GROUP BY prrpc.ID ,prrpc.id_vigencia,prrpc.vigencia,prrpc.id_cdp
    ) prrpc2 
    ON rp.ID = prrpc2.ID 
    and rp.id_vigencia=prrpc2.id_vigencia 
    and rp.vigencia=prrpc2.vigencia

    left JOIN ( 
        SELECT 
        prrpc.ID,prrpc.id_vigencia,prrpc.vigencia, 
        /*SUM(prrpcomp.VALOR) AS val_sum*/
        SUM(prleg.v_neto) AS val_sum
        
        
        FROM PR_RP_COMIS@SGR.ANM.LOCAL prrpc 
        
        JOIN pr_legalizacion_comis@SGR.ANM.LOCAL prleg 
        ON prrpc.ID = prleg.id_rp_comis 
        AND prrpc.ID_VIGENCIA = prleg.ID_VIGENCIA 
        AND prrpc.VIGENCIA = prleg.VIGENCIA 
        
        where
        prleg.id_elementos_gasto in (32,82,35,36,38)
        
        GROUP BY 
        prrpc.ID ,
        prrpc.id_vigencia,
        prrpc.vigencia,
        prrpc.id_cdp
    ) prleg 
    ON rp.ID = prleg.ID 
    and rp.id_vigencia=prleg.id_vigencia 
    and rp.vigencia=prleg.vigencia
    
    left join (    
        select 
        comfor.* 
        from rvc_comision_form_pago comfor
    
        left join rvc_formato_pago_v forpag
        on forpag.id_formato_pago = comfor.id_formato_pago
    
        where
        comfor.sgr = 1
        and forpag.estado = 1
    ) comfor   
    on comfor.id_rp_comis = rp.ID
    and comfor.id_vigencia = rp.id_vigencia
    and comfor.vigencia = rp.vigencia
    
    join pr_cierre_comision@SGR.ANM.LOCAL cierre
    ON rp.ID = cierre.id_rp_comis 
    and rp.id_vigencia = cierre.id_vigencia 
    and rp.vigencia = cierre.vigencia
    and cierre.id_tipo_nov_comis in (28,29,32)

    where
    rp.id_tercero = '$nitocc'
    and rp.estado=1
    and (
        dias_habiles(avanc.fecha_fin_comi,3) <= $tag_contrato_ini to_date('$fecha_fin','YYYY-MM-DD') $tag_contrato_fin
    )
    and ( comfor.id_comision_form_pago is null $tag_FormatoPago )
    and rp.vigencia > 2017
    and rp.vigencia = EXTRACT(YEAR FROM sysdate)
        
)tab0 
                    
where
tab0.valor > 0    
EOD;

            /**
             * "Tiene pendiente de Legalizar la comisión No. xxxx RP No: yyyyyy No se permite programar el pago" - 20180827
             * Se cambia a fecha de salida comision - 20180903
             * Se coloca id-32 en tipo nov comis para validar en estado reintegro tesoreria - 20181120
             */
            //$nitocc = '1085263640';
            $sql_val = <<<EOD
SELECT
tab0.*
FROM (

    SELECT distinct

    0 as sgr,
    rp.id as id_rp_comis,
    rp.id_vigencia,
    rp.vigencia,
    rp.id_tercero,
    rp.fecha,
    res.resolucion,
    res.id_comision,
    --cierre.ID_TIPO_NOV_COMIS,
    nvl(res.fecha_funcionario,res.fecha_comisionado) as fecha_resol

    FROM pr_rp_comis rp

    join pr_resol_comis res
    on rp.no_acto_admin = res.id
    and rp.id_vigencia = res.id_vigencia
    and rp.vigencia = res.vigencia
    
    left join pr_cierre_comision cierre
    ON rp.ID = cierre.id_rp_comis 
    and rp.id_vigencia = cierre.id_vigencia 
    and rp.vigencia = cierre.vigencia
    and cierre.id_tipo_nov_comis in (28,29,32)
    
    left join(
        SELECT
        tab0.*
        FROM comisionados_planta tab0
        union
        SELECT
        tab0.*
        FROM comisionados_contrato tab0    
    )comis
    on comis.vigencia = res.vigencia
    and comis.id_comision = res.id_comision
    and comis.nitocc = rp.id_tercero

    where
    rp.id_tercero = '$nitocc'
    and rp.estado = 1
    and cierre.id_tipo_nov_comis is null
    and (
        dias_habiles(comis.fecha_salida,3) <= to_date('$fecha_fin','YYYY-MM-DD')
    )
    and rp.vigencia = EXTRACT(YEAR FROM sysdate)
    
    union
    
    SELECT distinct

    1 as sgr,
    rp.id as id_rp_comis,
    rp.id_vigencia,
    rp.vigencia,
    rp.id_tercero,
    rp.fecha,
    res.resolucion,
    res.id_comision,
    --cierre.ID_TIPO_NOV_COMIS,
    nvl(res.fecha_funcionario,res.fecha_comisionado) as fecha_resol

    FROM pr_rp_comis@SGR.ANM.LOCAL rp

    join pr_resol_comis@SGR.ANM.LOCAL res
    on rp.no_acto_admin = res.id
    and rp.id_vigencia = res.id_vigencia
    and rp.vigencia = res.vigencia
    
    left join pr_cierre_comision@SGR.ANM.LOCAL cierre
    ON rp.ID = cierre.id_rp_comis 
    and rp.id_vigencia = cierre.id_vigencia 
    and rp.vigencia = cierre.vigencia
    and cierre.id_tipo_nov_comis in (28,29,32)
    
    left join(
        SELECT
        tab0.*
        FROM comisionados_planta@SGR.ANM.LOCAL tab0
        union
        SELECT
        tab0.*
        FROM comisionados_contrato@SGR.ANM.LOCAL tab0    
    )comis
    on comis.vigencia = res.vigencia
    and comis.id_comision = res.id_comision
    and comis.nitocc = rp.id_tercero

    where
    rp.id_tercero = '$nitocc'
    and rp.estado = 1
    and cierre.id_tipo_nov_comis is null
    and (
        dias_habiles(comis.fecha_salida,3) <= to_date('$fecha_fin','YYYY-MM-DD')
    )
    and rp.vigencia > 2017
    and rp.vigencia = EXTRACT(YEAR FROM sysdate)
        
)tab0 

order by tab0.vigencia desc, tab0.sgr desc, tab0.id_rp_comis desc
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado_val = CN_TABLE::executeSQL($sql_val);

            if (count($resultado_val) > 0) {

                $id_comis = $resultado_val[0]['id_comision'];
                $id_rp_comis = $resultado_val[0]['id_rp_comis'];

                $mensaje = "Tiene pendiente de Legalizar la comisión No. $id_comis RP No: $id_rp_comis No se permite programar el pago.";

                $this->status = 1;
                $this->totalRows = 0;
                $this->startRow = 0;
                $this->endRow = 0;
                $this->list_data = array();
                $this->mensajeError = $mensaje;
                $this->logMessage("[lista_comisiones_form_pago] ERROR!");
                $this->logMessage($mensaje);
            } else {

                /*
                 * 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->status = 0;
                $this->totalRows = $total_record_count;
                $this->startRow = $rowStart;
                $this->endRow = $rowStart + count($resultado);
                $this->list_data = $resultado;
                $this->logMessage("[lista_comisiones_form_pago] 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());
        }
    }

}
