<?php

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

    /**
     * Generar matriz para el informe - 20181010
     *
     * @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");

        $records = array();


        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Formato de fecha
         */
        //Sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        try {

            /*
             * Variables de filtro
             */
            $id_anhos = $request['id_anhos'];

            //Log de barra - progress_key
            $progress_key = $request['progress_key'] . $request['username'];
            $logPath = sfConfig::get('sf_log_dir') . '/generacion.log';
            $custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));

            /*
             *  Borrar datos anteriores Periodo-Funcionario
             */
            //Sql
            $sql = <<<EOD
DELETE FROM co_informe_matriz tab0 
WHERE tab0.id_anhos = $id_anhos                     
EOD;
            //Ejecutar SQL
            CN_TABLE::executeSQL($sql);

            /*
             * Insert de informe matriz
             * Incidente #10345, datos por defecto - 20181114
             */
            $sql = <<<EOD
insert into co_informe_matriz 

SELECT 

matriz.id_registros_matriz AS id_registros_matriz,
co.id_anhos,
co.id_tipo_convenio,
co.id_tipo_contrato,
co.id_contratista,
co.id_contrato AS id_contrato,
co.carta_aceptacion AS carta_aceptacion,
ep.id_supervisor,

matriz.TIPO_ID AS TIPO_ID,
regest.desc_ESTADO_PROCESO,

/*Datos de cada campo del excel*/
co.NO_CONTRATO AS NO_CONTRATO,
matriz.no_radicado AS NO_RADICADO,
tipopro.DESCRIPCION AS TIPO_PROCESO,
modsel.DESCRIPCION AS TIPO_CONTRATO,
modsel.DESCRIPCION AS CAUSAL_SECOP,
matriz.FECHA_RADICACION AS FECHA_RADICACION,
coabog.FECHA_MODIFICACION AS FECHA_ENTREGA_ABOGADO,
co.objeto AS OBJETO_CONTRATO,
oblicontra.valor AS OBLIGACIONES_CONTRATISTA,

case when cocdp.SGR=0 then cocdp.ID_CDP else NULL end AS CDP_PGN,
case when cocdp.SGR=0 then cocdp.VALOR else 0 end AS PRESUPUESTO_PGN, 
case when cocdp.SGR=0 then cocdp.CODIGO else NULL end AS COD_ACTIVIDAD_PGN,
--case when cocdp.SGR=0 then objgastocontra.VALOR else NULL end AS OBJETO_GASTO_PGN,
case when cocdp.proyecto_text is not null then cocdp.proyecto_text else ' ' end || ' ' || 
case when cocdpsgr.proyecto_text is not null then cocdpsgr.proyecto_text else ' ' end AS OBJETO_GASTO_PGN,
                    
case when cocdpsgr.SGR=1 then cocdpsgr.ID_CDP else NULL end AS CDP_SGR,
case when cocdpsgr.SGR=1 then cocdpsgr.VALOR else 0 end AS PRESUPUESTO_SGR,
case when cocdpsgr.SGR=1 then cocdpsgr.CODIGO else NULL end AS COD_ACTIVIDAD_SGR,
--case when cocdpsgr.SGR=1 then '' else NULL end AS OBJETO_GASTO_SGR,
case when cocdpsgr.proyecto_text is not null then cocdpsgr.proyecto_text else ' ' end AS OBJETO_GASTO_SGR,

--matriz.PRESUP_VIGENCIA_FUTURA AS PRESUP_VIGENCIA_FUTURA,
-- Ticket 17322 vigencia futura desde tabla
vigenciafut.valor AS PRESUP_VIGENCIA_FUTURA,           
totalcdp.total AS PRESUP_OFICIAL_TOTAL,
respon.RAZON_SOC AS ENCARGADO_PROCESO,
ep.NO_PROCESO as NO_PROCESO,
matriz.ESTADO_PROCESO AS ESTADO_PROCESO,
matriz.OBS_ULT_PUBLICACION AS OBS_ULT_PUBLICACION,
matriz.FECHA_POSIBLE_REG_PRESUP AS FECHA_POSIBLE_REG_PRESUP,
coaprucomite.FECHA_APRUEBA as FECHA_APROB_COMITE,
coaprucomite.no_comite as NO_COMITE,

matriz.FECHA_PROYECTO_PLIEGOS AS FECHA_PROYECTO_PLIEGOS,
matriz.FECHA_RESOL_APERTURA AS FECHA_RESOL_APERTURA,
matriz.FECHA_PUBLI_PLIEGOS_INV AS FECHA_PUBLI_PLIEGOS_INV,
matriz.FECHA_CIERRE AS FECHA_CIERRE,
matriz.HORA AS HORA,
--matriz.HORA AS HORA_SEL,
matriz.NO_PROPUESTAS_ALLEGADAS AS NO_PROPUESTAS_ALLEGADAS,
matriz.FECHA_INF_EVAL AS FECHA_INF_EVAL,
matriz.FECHA_AUD_SUBASTA AS FECHA_AUD_SUBASTA,
matriz.ADJUDICACION AS ADJUDICACION,
co.FECHA_CONTRATO AS FECHA_SUSCRIP_CONTRATO,

case when matriz.NO_RP is null then to_char(rp.rp) else matriz.NO_RP end AS NO_RP,
case when matriz.NO_RP is null then rp.fecha else matriz.RP_FECHA end AS RP_FECHA,
case when matriz.FECHA_POLIZA is null then leg.fecha_inicio else matriz.FECHA_POLIZA end AS FECHA_POLIZA,
case when matriz.FECHA_APROB_POLIZA is null then leg.FECHA_APRUEBA_POLIZA else matriz.FECHA_APROB_POLIZA end AS FECHA_APROB_POLIZA,
leg.fecha_inicio AS FECHA_INI_CONTRATO,
matriz.FECHA_PUBLI_SECOP AS FECHA_PUBLI_SECOP,
nvl(matriz.NO_CONST_SECOP,'SECOP 2') AS NO_CONST_SECOP,
matriz.OBSERVACIONES AS OBSERVACIONES,
contratista.NOMBRE_RAZON as CONTRATISTA,
case when matriz.VALOR_ADJUDICADO != 0 then matriz.VALOR_ADJUDICADO else nvl(co.VALOR,0) end AS VALOR_ADJUDICADO,
nvl(matriz.VALOR_AHORRO, (nvl(cocdp.VALOR,0)+nvl(cocdpsgr.VALOR,0)-nvl(co.VALOR,0)) ) AS VALOR_AHORRO,

supe.RAZON_SOC AS SUPERVISOR,
AREA.DESCRIPCION AS AREA_SUP,
AREA.DESCRIPCION as DIR_CARGO,
AREA.DESCRIPCION AS AREA,
nvl(matriz.LUGAR_EJECUCION,lugarejecu.valor) AS LUGAR_EJECUCION,
matriz.PUBLIC_SECOP AS PUBLIC_SECOP,
matriz.REGIMEN_SIMPLICADO AS REGIMEN_SIMPLICADO,
case when matriz.REGIMEN_SIMPLICADO is null then '' when matriz.REGIMEN_SIMPLICADO = 1 then 'SI' else 'NO' end AS REGIMEN_SIMPLICADO_TEXT,
matriz.REGIMEN_COMUN AS REGIMEN_COMUN,
case when matriz.REGIMEN_COMUN is null then '' when matriz.REGIMEN_COMUN = 1 then 'SI' else 'NO' end AS REGIMEN_COMUN_TEXT,

tipiden.descripcion AS DESCRIPCION_TIPIDEN,
nvl(matriz.FACTOR_RH,contratista.factor_rh) AS FACTOR_RH,
nvl(matriz.NO_ID,contratista.num_doc) AS NO_ID,
nvl(matriz.DIGITO_VERIFICACION,contratista.dv) AS DIGITO_VERIFICACION,
nvl(matriz.FECHA_NACIMIENTO,contratista.fecha_nacimiento) AS FECHA_NACIMIENTO,
nvl(matriz.DIRECCION_RESIDENCIA,contratista.direccion) AS DIRECCION_RESIDENCIA,
nvl(matriz.CIUDAD_RESIDENCIA,contratista.ciudad) AS CIUDAD_RESIDENCIA,
nvl(matriz.EMAIL,contratista.email) AS EMAIL,
nvl(matriz.TELEFONO,contratista.telefono) as TELEFONO,
matriz.PROFESION AS PROFESION,
matriz.NO_TARJ_PROF as NO_TARJ_PROF,
cat.DESCRIPCION AS CATEGORIA,
matriz.FECHA_FIN AS FECHA_FIN,
case when matriz.PLAZO_DIAS is null or matriz.PLAZO_DIAS = 0 then (nvl(matriz.FECHA_TERMINACION_INI,leg.fecha_terminacion)-leg.fecha_inicio) else matriz.PLAZO_DIAS end AS PLAZO_DIAS,

nvl(matriz.FECHA_TERMINACION_INI,leg.fecha_terminacion) AS FECHA_TERMINACION_INI,
matriz.AMPAROS AS AMPAROS,
matriz.COMPANIA_ASEGURADORA AS COMPANIA_ASEGURADORA,
matriz.fecha_audiencia_adjudica AS FECHA_AUDIENCIA_ADJUDICA,
case when presentanov.cant_nov is null then 'NO' else 'SI' end AS NOVEDADES,
novcesion.fecha_suscrip_cesion AS FECHA_SUSCRIP_CESION,
novcesion.FECHA_INI_CESION AS FECHA_INI_CESION,

novcesion.NOMBRE_CESIONARIO as NOMBRE_CESIONARIO,
'' AS TIPO_ID_CESIONARIO,
novcesion.NUM_DOC_CESIONARIO as NO_ID_CESIONARIO,
'' AS DIGITO_VERIFICACION_CESIONARIO,
to_date('01/01/2001','dd/mm/yyyy') AS FECHA_NACIMIENTO_CESIONARIO,
'' AS DIRECCION_RESI_CESIONARIO,
'' AS CIUDAD_RESI_CESIONARIO,
'' AS EMAIL_CESIONARIO,
'' as TELEFONO_CESIONARIO,
'' AS PROFESION_CESIONARIO,
'' as NO_TARJ_PROF_CESIONARIO,
'' AS CATEGORIA_CESIONARIO,
novmod.fecha_solicitud_mod AS FECHA_SUSCRIP_MODIF,
novmod.OBS_NOV_MODIFICACION AS OBSERVACIONES_MODIF,

novsuspen.fecha_suscrip_suspen AS FECHA_SUSCRIP_SUSPEN,
novsuspen.FECHA_INI_SUSPEN AS FECHA_INICIO_SUSPEN,
novsuspen.fecha_fin_suspen AS FECHA_FIN_SUSPEN,
novsuspen.DIAS_SUSPENSION AS DIAS_SUSPENSION,
null AS FECHA_FIN_CONTRATO_POST_SUSPEN,
novter.fecha_suscrip_termina AS FECHA_SUSCRIP_TERMINA,
novter.fecha_terminacion AS FECHA_TERMINA,

novadicion.fecha_suscrip_adicion AS FECHA_SUSCRIP_ADICION,
novadicion.VALOR_ADICION AS VALOR_ADICION,
novadicion.CDP_PGN_ADICION AS CDP_PGN_ADICION,
null AS PRESUPUESTO_PGN_ADICION,
null AS CDP_SGR_ADICION,
null AS PRESUPUESTO_SGR_ADICION,
novadicion.NO_RP_PGN_ADICION AS RP_PGN_ADICION,
rpadicion.fecha AS FECHA_RP_PGN_ADICION,
null AS RP_SGR_ADICION,
null AS FECHA_RP_SGR_ADICION,

novprorroga.fecha_suscrip_prorr AS FECHA_SUSCRIP_PRORROGA,
novprorroga.DIAS_PRORROGA AS DIAS_PRORROGA,
novprorroga.FECHA_TERMINACION_PRORR AS FECHA_TERMINA_PRORROGA,
co.VALOR AS VALOR_TOTAl_CONTRATO,
leg.FECHA_TERMINACION AS FECHA_TERMINA_DEFINITIVA,
leg.fecha_liquidacion AS FECHA_LIQUIDA_CONTRATO,
ep.id_abogado as ID_ABOGADO,
inter.razon_soc as NOMBRE_ABOGADO       

FROM co_contrato_v co

LEFT JOIN co_legaliza_contrato leg ON leg.id_contrato=co.id_contrato

LEFT JOIN co_seleccion_ep selep ON co.id_seleccion_ep=selep.ID_SELECCION_EP

LEFT JOIN co_estudios_previos ep ON ep.ID_ESTUDIOS_PREVIOS=selep.ID_ESTUDIOS_PREVIOS

LEFT JOIN co_modalidad_sel modsel ON modsel.ID_MODALIDAD_SEL=ep.ID_MODALIDAD_SEL

LEFT JOIN co_tipo_proceso tipopro ON tipopro.ID_TIPO_PROCESO=modsel.ID_TIPO_PROCESO

LEFT JOIN rps_v rp ON rp.id = leg.id_rp

LEFT JOIN (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.ID_ESTUDIOS_PREVIOS
        ORDER BY aut.ID_ESTUDIOS_PREVIOS, aut.fecha_modificacion desc
       ) AS rn
      from co_actualiza_abogado aut
)coabog
ON coabog.ID_ESTUDIOS_PREVIOS=ep.ID_ESTUDIOS_PREVIOS
and coabog.rn = 1

LEFT JOIN co_abogado abog ON abog.ID_ABOGADO=coabog.ID_ABOGADO_NUEVO 

LEFT JOIN INTERCEROS inter ON inter.ID_MAE_TER=abog.ID_MAE_TER 

left join CO_DETALLE_EP oblicontra  
    on oblicontra.ID_ESTUDIOS_PREVIOS=ep.ID_ESTUDIOS_PREVIOS and oblicontra.ID_CAMPO_EP=16 
                    
left join CO_DETALLE_EP lugarejecu  
    on lugarejecu.ID_ESTUDIOS_PREVIOS=ep.ID_ESTUDIOS_PREVIOS and lugarejecu.ID_CAMPO_EP=148                     

/*
left join CO_CDPS_EP cocdp on cocdp.ID_ESTUDIOS_PREVIOS=ep.ID_ESTUDIOS_PREVIOS 
left join CO_PROYECTO_EP proy on proy.ID_PROYECTO_EP=cocdp.ID_CPO_EP 
left join CO_PROYECTOS_ALL_V proyall on proy.ID_CPO=proyall.ID and proy.SGR=proyall.SGR
*/left join (
    SELECT
    cocdp.ID_ESTUDIOS_PREVIOS,
    cocdp.sgr,
    LISTAGG(cocdp.ID_CDP, ', ') WITHIN GROUP (ORDER BY cocdp.ID_CDP)  as ID_CDP,
    sum(cocdp.VALOR)  as VALOR,
    LISTAGG(proyall.codigo, ', ') WITHIN GROUP (ORDER BY cocdp.ID_CDP)  as CODIGO,
    LISTAGG(proyall.codigo || '-' || proyall.descripcion, ', ') WITHIN GROUP (ORDER BY cocdp.ID_CDP)  as proyecto_text
    from CO_CDPS_EP cocdp 
    left join CO_PROYECTO_EP proy on proy.ID_PROYECTO_EP=cocdp.ID_CPO_EP 
    left join CO_PROYECTOS_ALL_V proyall on proy.ID_CPO=proyall.ID and proy.SGR=proyall.SGR
    where
    cocdp.sgr = 0
    group by
    cocdp.ID_ESTUDIOS_PREVIOS,
    cocdp.sgr
)cocdp
on cocdp.ID_ESTUDIOS_PREVIOS=ep.ID_ESTUDIOS_PREVIOS 

left join (
    SELECT
    cocdp.ID_ESTUDIOS_PREVIOS,
    cocdp.sgr,
    LISTAGG(cocdp.ID_CDP, ', ') WITHIN GROUP (ORDER BY cocdp.ID_CDP)  as ID_CDP,
    sum(cocdp.VALOR)  as VALOR,
    LISTAGG(proyall.codigo, ', ') WITHIN GROUP (ORDER BY cocdp.ID_CDP)  as CODIGO,
    LISTAGG(proyall.codigo || '-' || proyall.descripcion, ', ') WITHIN GROUP (ORDER BY cocdp.ID_CDP)  as proyecto_text
    from CO_CDPS_EP cocdp 
    left join CO_PROYECTO_EP proy on proy.ID_PROYECTO_EP=cocdp.ID_CPO_EP 
    left join CO_PROYECTOS_ALL_V proyall on proy.ID_CPO=proyall.ID and proy.SGR=proyall.SGR
    where
    cocdp.sgr = 1
    group by
    cocdp.ID_ESTUDIOS_PREVIOS,
    cocdp.sgr
)cocdpsgr
on cocdpsgr.ID_ESTUDIOS_PREVIOS=ep.ID_ESTUDIOS_PREVIOS 

left join (
        select 
        CO_CDPS_EP.id_estudios_previos
        ,sum(CO_CDPS_EP.valor) as total 
        from CO_CDPS_EP 
        group by CO_CDPS_EP.ID_ESTUDIOS_PREVIOS
) totalcdp on totalcdp.id_estudios_previos=ep.ID_ESTUDIOS_PREVIOS 

--tabla de objeto
left join CO_DETALLE_EP objgastocontra on objgastocontra.ID_ESTUDIOS_PREVIOS=ep.ID_ESTUDIOS_PREVIOS and objgastocontra.ID_CAMPO_EP=4 

--Responsable
LEFT JOIN INTERCEROS respon ON respon.ID_MAE_TER=ep.RESPONSABLE 

--APROBCION COMITE 
LEFT JOIN CO_APRUEBA_COMITE coaprucomite on coaprucomite.ID_ESTUDIOS_PREVIOS=ep.ID_ESTUDIOS_PREVIOS

-- SUPERVISOR O INTERVENTOR
--LEFT JOIN CO_SUPERVISOR sup on sup.id_supervisor=ep.id_supervisor 
LEFT JOIN INTERCEROS supe on ep.id_supervisor =supe.ID_MAE_TER 

--AREA 
LEFT JOIN AREA on AREA.ID_AREA=ep.ID_AREA

--Contratista
LEFT JOIN CO_CONTRATISTA contratista on contratista.ID_CONTRATISTA=co.id_CONTRATISTA 

--categoria
left join CO_CATEGORIA cat on cat.id_categoria=co.id_categoria

--Para saber si presenta novedades
left join (
    select 
    nov.id_contrato,
    count(nov.id_contrato) as cant_nov 
    from(
        SELECT sa.id_contrato
        FROM co_solicitud_adicion sa
        INNER JOIN CO_ADICION_CONTRATO ac
        ON sa.ID_SOLICITUD_ADICION=ac.ID_SOLICITUD_ADICION 
        union
        SELECT sa.id_contrato
        FROM co_solicitud_prorroga sa
        INNER JOIN CO_prorroga_CONTRATO ac
        ON sa.ID_SOLICITUD_prorroga=ac.ID_SOLICITUD_prorroga 
        union
        SELECT sa.id_contrato
        FROM co_solicitud_modificacion sa
        INNER JOIN CO_modificacion_CONTRATO ac
        ON sa.ID_SOLICITUD_modificacion=ac.ID_SOLICITUD_modificacion 
        union
        SELECT sa.id_contrato
        FROM co_solicitud_terminacion sa
        INNER JOIN CO_termina_CONTRATO ac
        ON sa.ID_SOLICITUD_terminacion=ac.ID_SOLICITUD_terminacion 
        union
        SELECT sa.id_contrato
        FROM co_solicitud_cesion sa
        INNER JOIN CO_cesion_CONTRATO ac
        ON sa.ID_SOLICITUD_cesion=ac.ID_SOLICITUD_cesion 
    )nov group by nov.id_contrato
) presentanov 
on presentanov.id_contrato=co.id_contrato 

--relacion con matriz de registros varios
left join CO_REGISTROS_MATRIZ matriz on matriz.id_contrato=co.id_contrato 

--realcion con tipo de identificacion
left join co_tipo_iden tipiden on nvl(matriz.TIPO_ID,contratista.id_tipo_iden)=tipiden.id_tipo_iden 

--Relacion Cesion
left join(
  SELECT 
  sa.id_contrato,sa.NOMBRE_CESIONARIO,sa.NUM_DOC_CESIONARIO,
  sa.FECHA_SOLICITUD as fecha_suscrip_cesion,
  ac.FECHA_APROBACION_POLIZA as FECHA_INI_CESION
  FROM co_solicitud_cesion sa
  INNER JOIN CO_cesion_CONTRATO ac
  ON sa.ID_SOLICITUD_cesion=ac.ID_SOLICITUD_cesion
)novcesion on novcesion.id_contrato=co.id_contrato 

--Novedad Modificacion
left join(
  SELECT 
  sa.id_contrato,sa.FECHA_SOLICITUD as fecha_solicitud_mod,
  sa.JUSTIFICACION as OBS_NOV_MODIFICACION
  FROM co_solicitud_modificacion sa
  INNER JOIN CO_modificacion_CONTRATO ac
  ON sa.ID_SOLICITUD_modificacion=ac.ID_SOLICITUD_modificacion 
)novmod on novmod.id_contrato=co.id_contrato 

--Novedad Suspension
left join(
    SELECT sa.id_contrato,
    sa.FECHA_SOLICITUD AS fecha_suscrip_suspen,
    ac.FECHA_APROBACION_POLIZA AS FECHA_INI_SUSPEN,
    sa.DIAS_SUSPENSION,
    sa.FECHA_TERMINACION AS fecha_fin_suspen
    FROM co_solicitud_suspension sa
    INNER JOIN CO_suspension_CONTRATO ac
    ON sa.ID_SOLICITUD_suspension=ac.ID_SOLICITUD_suspension 
)novsuspen on novsuspen.id_contrato=co.id_contrato 

--NOVEDAD TERMINACION
left join(
    SELECT sa.id_contrato,
    sa.FECHA_SOLICITUD AS fecha_suscrip_termina,
    sa.FECHA_TERMINACION AS FECHA_TERMINACION
    FROM co_solicitud_terminacion sa
    INNER JOIN CO_termina_CONTRATO ac
    ON sa.ID_SOLICITUD_terminacion=ac.ID_SOLICITUD_terminacion 
)novter on novter.id_contrato=co.id_contrato 

--NOVEDAD de ADICION
left join(
    SELECT sa.id_contrato,
    sa.FECHA_SOLICITUD AS fecha_suscrip_adicion,
    sa.VALOR AS valor_adicion,
    sa.ID_CDP as CDP_PGN_ADICION,
    ac.ID_RP as NO_RP_PGN_ADICION
    FROM co_solicitud_adicion sa
    left JOIN CO_adicion_CONTRATO ac
    ON sa.ID_SOLICITUD_adicion=ac.ID_SOLICITUD_ADICION 
)novadicion on novadicion.id_contrato=co.id_contrato 
LEFT JOIN rps_v rpadicion ON rpadicion.id = novadicion.NO_RP_PGN_ADICION

--NOVEDAD PRORROGA
left join(
    SELECT sa.id_contrato,
    sa.FECHA_SOLICITUD AS fecha_suscrip_prorr,
    sa.DIAS_PRORROGA AS DIAS_PRORROGA,
    sa.PLAZO_TERMINACION as FECHA_TERMINACION_PRORR
    FROM co_solicitud_PRORROGA sa
    INNER JOIN CO_PRORROGA_CONTRATO ac
    ON sa.ID_SOLICITUD_PRORROGA=ac.ID_SOLICITUD_PRORROGA 
)novprorroga on novprorroga.id_contrato=co.id_contrato
                    
--VIGENCIA FUTURA
left join (
select id_estudios_previos,sum(valor) as valor  
from co_vigencia_futura
group by id_estudios_previos
   )vigenciafut on vigenciafut.id_estudios_previos = ep.id_estudios_previos

left join(
    select
    regest.ID_REGISTROS_MATRIZ,
    LISTAGG(regest.ID_ESTADO_PROCESO, ', ')
         WITHIN GROUP (ORDER BY regest.ID_ESTADO_PROCESO)  as ID_ESTADO_PROCESO,
    LISTAGG(est.codigo || ' - ' || est.descripcion , ', ')
         WITHIN GROUP (ORDER BY regest.ID_ESTADO_PROCESO)  as desc_ESTADO_PROCESO
    from co_regis_matriz_est_pro regest
    left join co_estado_proceso est
    on est.ID_ESTADO_PROCESO = regest.ID_ESTADO_PROCESO
    group by
    regest.ID_REGISTROS_MATRIZ
)regest
on regest.ID_REGISTROS_MATRIZ = matriz.ID_REGISTROS_MATRIZ 
                    
where
co.id_anhos = $id_anhos                     
EOD;
            $this->conn->execute($sql);

            /**
             * Recorre cada registro y actualiza campos incompletos - 20181011
             */
            $sql = <<<EOD
select 
tab1.id_seleccion_ep,
tab2.id_estudios_previos,
tab0.* 
from co_informe_matriz tab0

join co_contrato tab1
on tab1.id_contrato = tab0.id_contrato

join co_seleccion_ep tab2
on tab2.id_seleccion_ep = tab1.id_seleccion_ep
                    
where
tab0.id_anhos = $id_anhos    
--and tab0.id_contrato = 2712                 
EOD;

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

            //Barra progreso - 20181011
            $i_barra = 1;
            $cant_a_procesar = count($records);

            //Antes de inicar el proceso largo
            $brecha = 1;
            if ($cant_a_procesar > 100) {
                $brecha = $cant_a_procesar - (0.99 * $cant_a_procesar);
            }

            //Log de barra
            $this->logMessage("[co_informe_matriz] Total cant_a_procesar: " . $cant_a_procesar);

            //Inicio memcache
            MemcacheHandler::getInstance()->set($progress_key, 0);
            $custom_logger->info(MemcacheHandler::getInstance()->get($progress_key) . " - Inicio Mencache.\n");

            /**
             * For de registros
             */
            foreach ($records as $value) {

                // Guardar un valor en el proceso largo
                if ($i_barra % $brecha == 0) {
                    //validar que no sobrepase el 100 porciento - 20151007
                    if ((round(($i_barra / $cant_a_procesar) * 100)) < 100) {
                        MemcacheHandler::getInstance()->set($progress_key, round(($i_barra / $cant_a_procesar) * 100, 0));
                    }
                }

                $id_registros_matriz = $value['id_registros_matriz'];
                $id_contrato = $value['id_contrato'];
                $id_anhos = $value['id_anhos'];
                $id_contratista = $value['id_contratista'];
                $id_seleccion_ep = $value['id_seleccion_ep'];
                $id_estudios_previos = $value['id_estudios_previos'];

                $custom_logger->info(MemcacheHandler::getInstance()->get($progress_key) . " - Procesado $i_barra de $cant_a_procesar contratos. Contrato: " . $id_contrato . "\n");
                $i_barra++;

                //Fecha de abogado ultima
                $sql = <<<EOD
select 
--tab0.id_estudios_previos,
max(tab0.fecha_modificacion) as fecha_modificacion
from(
    --obtenemos todas las versiones hacia abajo
    select 
    tab0.id_versiones_ep,tab0.id_maeter as tercero_version,to_char(tab0.fecha_creacion,'dd/mm/yyyy') as fecha_version,tab0.id_version_padre,
    tab5.fecha_modificacion, tab1.*,
    nvl(tab2.razon_soc,tab2.pnombre||' '||tab2.snombre||' '||tab2.papellido||' '||tab2.sapellido) as nombre_tercero_ver,
    nvl(tab3.razon_soc,tab3.pnombre||' '||tab3.snombre||' '||tab3.papellido||' '||tab3.sapellido) as nombre_responsable,
    tab4.descripcion as MODALIDAD
    from co_versiones_ep tab0 
    join CO_ESTUDIOS_PREVIOS tab1 on tab0.id_version_hijo=id_estudios_previos
    left join INTERCEROS tab2 on tab2.id_mae_ter=tab0.id_maeter
    left join INTERCEROS tab3 on tab3.id_mae_ter=tab1.responsable
    left join CO_MODALIDAD_SEL tab4 on tab4.id_modalidad_sel=tab1.id_modalidad_sel 
    left join co_actualiza_abogado tab5 on tab5.id_estudios_previos = tab1.id_estudios_previos
    start with ID_VERSION_HIJO=$id_estudios_previos
    connect by ID_VERSION_HIJO=prior ID_VERSION_PADRE
    union
    --obtenemos todas las versiones hacia arriba
    select 
    tab0.id_versiones_ep,tab0.id_maeter as tercero_version,to_char(tab0.fecha_creacion,'dd/mm/yyyy') as fecha_version,tab0.id_version_padre,
    tab5.fecha_modificacion, tab1.*,
    nvl(tab2.razon_soc,tab2.pnombre||' '||tab2.snombre||' '||tab2.papellido||' '||tab2.sapellido) as nombre_tercero_ver,
    nvl(tab3.razon_soc,tab3.pnombre||' '||tab3.snombre||' '||tab3.papellido||' '||tab3.sapellido) as nombre_responsable,
    tab4.descripcion as MODALIDAD
    from co_versiones_ep tab0 
    join CO_ESTUDIOS_PREVIOS tab1 on tab0.id_version_hijo=id_estudios_previos
    left join INTERCEROS tab2 on tab2.id_mae_ter=tab0.id_maeter
    left join INTERCEROS tab3 on tab3.id_mae_ter=tab1.responsable
    left join CO_MODALIDAD_SEL tab4 on tab4.id_modalidad_sel=tab1.id_modalidad_sel 
    left join co_actualiza_abogado tab5 on tab5.id_estudios_previos = tab1.id_estudios_previos
    start with ID_VERSION_HIJO=$id_estudios_previos
    connect by prior ID_VERSION_HIJO= ID_VERSION_PADRE
    --agregamos la version 0 como un registro
    union
    select 
    0 as id_versiones_ep,tab0.id_maeter as tercero_version,to_char(tab0.fecha_creacion,'dd/mm/yyyy') as fecha_version,0 as ID_version_padre,
    tab5.fecha_modificacion, tab1.*,
    nvl(tab2.razon_soc,tab2.pnombre||' '||tab2.snombre||' '||tab2.papellido||' '||tab2.sapellido) as nombre_tercero_ver,
    nvl(tab3.razon_soc,tab3.pnombre||' '||tab3.snombre||' '||tab3.papellido||' '||tab3.sapellido) as nombre_responsable,
    tab4.descripcion as MODALIDAD
    from co_versiones_ep tab0 
    join CO_ESTUDIOS_PREVIOS tab1 on tab0.id_version_padre=tab1.id_estudios_previos
    left join INTERCEROS tab2 on tab2.id_mae_ter=tab0.id_maeter
    left join INTERCEROS tab3 on tab3.id_mae_ter=tab1.responsable
    left join CO_MODALIDAD_SEL tab4 on tab4.id_modalidad_sel=tab1.id_modalidad_sel 
    left join co_actualiza_abogado tab5 on tab5.id_estudios_previos = tab1.id_estudios_previos
    where id_versiones_ep =(select min(ID_versiones_ep) 
    from co_versiones_ep 
    start with ID_VERSION_HIJO=$id_estudios_previos
    connect by ID_VERSION_HIJO=prior ID_VERSION_PADRE)
) tab0
order by version                    
EOD;

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

                $fecha_entrega_abogado = '';
                if (count($records_fecha) > 0) {
                    $fecha_entrega_abogado = $records_fecha[0]['fecha_modificacion'];
                }

                //Se limpia campos CLOB, limite 4000 caracteres 
                $objeto_contrato = $value['objeto_contrato'];
                $objeto_contrato = strip_tags($objeto_contrato);
                $objeto_contrato = str_replace("'", "", $objeto_contrato);
                $objeto_contrato = str_replace("&nbsp;", " ", $objeto_contrato);
                $objeto_contrato = substr($objeto_contrato, 0, 3990);
                $objeto_contrato = trim($objeto_contrato);

                $obligaciones_contratista = $value['obligaciones_contratista'];
                $obligaciones_contratista = strip_tags($obligaciones_contratista);
                $obligaciones_contratista = str_replace("'", "", $obligaciones_contratista);
                $obligaciones_contratista = str_replace("&nbsp;", " ", $obligaciones_contratista);
                $obligaciones_contratista = substr($obligaciones_contratista, 0, 3500);
                $obligaciones_contratista = trim($obligaciones_contratista);
                //$obligaciones_contratista = utf8_encode($obligaciones_contratista);
                $obligaciones_contratista = utf8_decode($obligaciones_contratista);
                $obligaciones_contratista = utf8_encode($obligaciones_contratista);
                //$obligaciones_contratista = iconv("ISO-8859-1", "UTF-8", $obligaciones_contratista);

                //Actualizacion de informe
                //, obligaciones_contratista = REPLACE( '$obligaciones_contratista', chr(92)||'C2', '')
                //Se valida si no viene id_contratista - 20190606
                $sql = <<<EOD
update co_informe_matriz 
    set fecha_entrega_abogado = TO_DATE('$fecha_entrega_abogado', 'yyyy-mm-dd')
    , objeto_contrato = '$objeto_contrato'
    , obligaciones_contratista = '$obligaciones_contratista' 
where
id_anhos = $id_anhos
and id_contrato = $id_contrato
and nvl(id_contratista,0) = nvl('$id_contratista',0)  
and nvl(id_registros_matriz,0) = nvl('$id_registros_matriz',0) 
EOD;
                $this->conn->execute($sql);
            }

            MemcacheHandler::getInstance()->set($progress_key, 100);
            $custom_logger->info(MemcacheHandler::getInstance()->get($progress_key) . " - Termino Mencache.\n");


            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[co_informe_matriz] Generación exitosa");
        } catch (Exception $e) {

            $custom_logger->info("Ocurrio un error - Termino Mencache.\n");
            MemcacheHandler::getInstance()->set($progress_key, 100);

            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "[co_informe_matriz] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[co_informe_matriz] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

}
