<?php

/**
 * genera_version actions.
 *
 * @package    contratacion
 * @subpackage genera_version
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
require_once 'HTMLPurifier.auto.php';
require 'HTMLPurifier.autoload.php';

class genera_versionActions extends sfQuery {

    /**
     * Executes index action
     *
     * @param sfRequest $request A request object
     */
    protected $table_names = array(
        'CO_ESTUDIOS_PREVIOS',
        'INTERCEROS',
        'CO_ABOGADO',
        'INTERCEROS_V',
        'CO_MODALIDAD_SEL'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'INTERCEROS' =>
        array(
            'responsable-id_mae_ter' => 'CO_ESTUDIOS_PREVIOS'
        ),
        'CO_MODALIDAD_SEL' =>
        array(
            'id_modalidad_sel' => 'CO_ESTUDIOS_PREVIOS'
        ),
        'CO_ABOGADO' =>
        array(
            'id_abogado' => 'CO_ESTUDIOS_PREVIOS'
        ),
        'INTERCEROS_V' =>
        array(
            'id_mae_ter-id_mae_ter' => 'CO_ABOGADO'
        ),
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CO_ESTUDIOS_PREVIOS' =>
        array(
            'id_estudios_previos' => 'id_estudios_previos',
            'no_proceso' => 'no_proceso',
            'responsable' => 'responsable',
            'id_abogado' => 'id_abogado',
            'id_supervisor' => 'id_supervisor',
            'fecha_creacion' => 'fecha_creacion',
            'id_modalidad_sel' => 'id_modalidad_sel',
            'estado' => 'estado',
            'activo' => 'activo',
            'fecha_anu' => 'fecha_anu',
            'motivo_anu' => 'motivo_anu',
            'id_cen_op' => 'id_cen_op',
            'id_anhos' => 'id_anhos',
            'version' => 'version',
            'id_area' => 'id_area',
            'valor' => 'valor',
            'observacion_version' => 'observacion_version'
        ),
        'INTERCEROS_V' =>
        array(
            'num_doc' => 'num_doc_abogado',
            'razon_soc' => 'razon_soc_abogado'
        ),
        'INTERCEROS' =>
        array(
            'num_doc' => 'num_doc_resp',
            'pnombre,||,  ,||,papellido' => 'razon_soc_resp'
        ),
        'CO_MODALIDAD_SEL' =>
        array(
            'descripcion' => 'descripcion_modal',
            'prefijo' => 'prefijo_modal'
        )
    ); //por cada tabla especificar los campos del select

    /*
     * OPCIONES DE FILTRO:
     *
     * LIKEALLPLUS- busqueda comparativa de la cadena dividida por los espacios en blanco en cualquier posición
     * LIKEALL - busqueda comparativa de la cadena en cualquier posición
     * LIKE - busqueda en la cadena que inicie por la variable de filtro
     *
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'CO_ESTUDIOS_PREVIOS' => array(
            'id_estudios_previos,a' => array('!=' => array(-1)),
            'id_estudios_previos,b' => array('=' => array('id_estudios_previos')),
            'id_modalidad_sel' => array('=' => array('id_modalidad_sel')),
            'responsable' => array('=' => array('responsable')),
            'id_abogado' => array('=' => array('id_abogado')),
            'id_supervisor' => array('=' => array('id_supervisor')),
            'id_area' => array('=' => array('id_abogado')),
            'valor' => array('=' => array('id_abogado')),
            'no_proceso' => array('=' => array('no_proceso')),
            'estado' => array('=' => array('estado')),
            'activo' => array('=' => array('activo')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $table_field_or_conditions = array(); // filtros de condicion or
    protected $fields_orderBy = array(
        'no_proceso'
    ); //campos para el ordenamiento de la consulta
//    protected $table_field_obligatory = array('id_debito'); //campos obligatorios de filtro - estan en el request

    /*
     * Variables manejo de log
     */
//true - consulta de administracion
    protected $is_admin = true;
//si es servicio para filtro agregar campo
//    protected $filtro = 'Area';
//true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;


    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_estudios_previos'; //identificador de la tabla
    protected $id_names = array('id_estudios_previos'); //llave primaria
    protected $field_names = array('no_proceso', 'responsable', 'id_abogado', 'id_supervisor', 'fecha_creacion', 'id_modalidad_sel', 'estado', 'activo',
        'fecha_anu', 'motivo_anu', 'id_cen_op', 'id_anhos', 'version', 'id_area', 'valor', 'descripcion', 'observacion_version', 'codigopaa', 'estado_general', 'fecha_aprobado', 'estado_objeto_iguales',
        'fec_est_obj_igu_pen', 'fec_est_obj_igu_vob', 'fec_est_obj_igu_apr', 'fec_est_obj_igu_rec', 'estado_ep_general', 'fec_est_ep_gen_pen', 'fec_est_ep_gen_vob',
        'fec_est_ep_gen_aut', 'fec_est_ep_gen_rec', 'tipobolsa'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'CO_ESTUDIOS_PREVIOS'; //tabla en la cual se aplican los cambios
    protected $has_activo = true; //si posee campo en la tabla de nombre activo ---- ESTADO PARA REGALIAS - CARTERA
    protected $has_vigencia = false; //si posee vigencia
    protected $has_cen_op = false; //si posee centro de operacion
    protected $has_id_cia = false; //si posee compañia
    protected $has_secuencia = false; //si posee secuencia la tabla - true si es por tabla, false - trigger
//    protected $en_mayuscula = true; // si se pone, se puede poner en mayucula con true y en minuscula con false, de lo contrario la pone tal cual la BD
    protected $campo_fecha_sistema = array();


    /*
     * Manejo de registro log
     */
    protected $id_unico = 'id_estudios_previos'; //identificador unico de la tabla
//false - Registrar log para list - consultar
    protected $log_list = false;
//false - Registrar log para add - update - remove
    protected $log_crud = false;

    /**
     * Construccion de observacion perzonalizada
     * 
     * Toda variable para tomarla del request con el formato:
     * &request-variable&
     * 
     * false - observacion por defecto
     *
     * @var string 
     */
    protected $observacion_list = false;
    protected $observacion_add = false;
    protected $observacion_update = false;
    protected $observacion_remove = false;

// Validate

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Add
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateAdd(sfWebRequest $request) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a validateAdd");

        //valor por defecto
        $errors = null;

        $id_estudios_previos = $request['id_estudios_previos'];
        $id_modalidad_sel = $request['id_modalidad_sel'];
        $version = $request['version'];
        $id_abogado = $request['id_abogado'];
        $valor = $request['valor'];
        $responsable = $request['responsable'];

        /*
         *  Validar la operación, ya sea por SQL
         */
        /**
         * Verificar que el estudio previo este estado = 1 y que no este repetido en una version para los datos del estudio previo - 20160517
         */
        $sql = <<<EOD
select * from co_estudios_previos where id_estudios_previos = $id_estudios_previos and estado = 0 
EOD;
        $records = CN_TABLE::executeSQL($sql);

        if (count($records) > 0) {

            $errors['mensaje'] = "El estudio previo se encuentra anulado, favor verificar nueva versión.";
            $errors['servicio'] = "genera_version";

            $logger->info("Entro - " . $errors['mensaje']);
        }

        if ($version == 2) {

            if ($id_abogado == "") {

                $errors['mensaje'] = "No puede registrar la version no 2 si no ha sido asignado el abogado. Favor verificar.";
                $errors['servicio'] = "co_genera_version";

                $logger->info("Entro - " . $errors['mensaje']);
            }
        }

        $sql = <<<EOD
        select tab0.* from co_campo_obliga tab0
                where tab0.id_modalidad_sel = $id_modalidad_sel and tab0.obligatorio=1
EOD;
        $records = CN_TABLE::executeSQL($sql);

        foreach ($records as $records) {

            $id_campo_ep = $records['id_campo_ep'];
            //20170912 Se agrega Validacion de minimo 5 caracteres para los campos obligatorios ticket #6952
            $sql = <<<EOD
        select count(*) cantidad 
        from co_detalle_ep tab0
        where tab0.id_estudios_previos = $id_estudios_previos and tab0.id_campo_ep = $id_campo_ep and tab0.valor IS NOT NULL 
        AND length(tab0.valor) >=5
EOD;
            $records = CN_TABLE::executeSQL($sql);

            $cantidad = $records[0]['cantidad'];

            if ($cantidad == 0) {

                $logger->info("Entro id_campo_ep :: " . $id_campo_ep);

                $errors['mensaje'] = "No ha realizado el registro de los campos minimos para generar una nueva version o los campos minimos no cuentan con al menos cinco(5) caracteres.";
                $errors['servicio'] = "co_genera_version";
            }
        }


        $sql = <<<EOD
        select count(*) cantidad from co_garantia_ep tab0
                where tab0.id_estudios_previos = $id_estudios_previos
EOD;
        $records = CN_TABLE::executeSQL($sql);

        $cantidad = $records[0]['cantidad'];

        if ($cantidad == 0) {

            $errors['mensaje'] = "No ha realizado el registro de las garantias para generar una nueva version.";
            $errors['servicio'] = "co_genera_version";

            $logger->info("Entro - " . $errors['mensaje']);
        }

        //Actualizacion 9 de Octubre de 2015
        //Se adiciona validacion para no permitir generar una nueva version si el proceso ya tiene registrado contrato.
        //Inicio Paso 1. Generación del PDF de Comunicacion Interna

        $sql = <<<EOD
select count(*) cantidad

from co_contrato tab0
join co_seleccion_ep tab1 ON tab1.id_seleccion_ep = tab0.id_seleccion_ep
join co_estudios_previos tab2 ON tab2.id_estudios_previos = tab1.id_estudios_previos

where tab2.id_estudios_previos = $id_estudios_previos
EOD;


        $records = CN_TABLE::executeSQL($sql);

        $cantidad = $records[0]['cantidad'];

        if ($cantidad > 0) {

            $errors['mensaje'] = "Este proceso ya tiene registrado Contrato por consiguiente no se puede generar nueva version. Favor verificar.";
            $errors['servicio'] = "co_campo_obliga";

            $logger->info("Entro - " . $errors['mensaje']);
        }


        //Actualización: 4 de Noviembre de 2015
        //Adicionar validacion para que no permita generar la version 1 si no ha registrado proyectos

        $sql = <<<EOD
        select count(*) cantidad from co_proyecto_ep tab0
                where tab0.id_estudios_previos = $id_estudios_previos
EOD;
        $records = CN_TABLE::executeSQL($sql);

        $cantidad = $records[0]['cantidad'];

        if ($cantidad == 0) {

            $errors['mensaje'] = "No ha realizado el registro de los proyectos de afectacion para generar una nueva version.";
            $errors['servicio'] = "co_campo_obliga";

            $logger->info("Entro - " . $errors['mensaje']);
        }

        $descripcion = "";
        if (isset($request['descripcion'])) {
            //Reemplzao de ' para el SQL - 20160926
            $descripcion = str_replace("'", "'||CHR(39)||'", $request['descripcion']);
        }

        $sql = <<<EOD
select * from co_estudios_previos 
    where version = $version and responsable = $responsable 
        and id_modalidad_sel = $id_modalidad_sel and valor = $valor and activo = 1 and estado = 1
        and descripcion = '$descripcion'            
EOD;
        $records = CN_TABLE::executeSQL($sql);

        if (count($records) > 0) {

            $errors['mensaje'] = "Ya se encuentra creado una versión posterior para este estudio previo, favor verificar.";
            $errors['servicio'] = "genera_version";

            $logger->info("Entro - " . $errors['mensaje']);
        }

        //return $errors;
        //}


        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Update
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateUpdate(sfWebRequest $request) {

//valor por defecto

        $errors = null;

        $id_estudios_previos = $request['id_estudios_previos'];
        $id_modalidad_sel = $request['id_modalidad_sel'];

        $sql = <<<EOD
        select count(*) as cantidad from co_paso_ep tab0
                join co_paso_modalidad tab1 ON tab1.id_paso_modalidad = tab0.id_paso_modalidad and tab1.estado =1
                where id_estudios_previos = $id_estudios_previos
EOD;
        $records = CN_TABLE::executeSQL($sql);

        $pasos_ep = $records[0]['cantidad'];


        $sql = <<<EOD
        select count(*) as cantidad from co_paso_modalidad
                where id_modalidad_sel = $id_modalidad_sel and estado = 1
EOD;
        $records = CN_TABLE::executeSQL($sql);

        $pasos_modalidad = $records[0]['cantidad'];

        if ($pasos_ep != $pasos_modalidad) {

            $errors['mensaje'] = "No ha realizado el seguimiento a todos los Pasos del Proceso";
            $errors['servicio'] = "co_estudios_previos";
        }

        $sql = <<<EOD
        select count(*) as cantidad from co_documento_ep tab0
                join co_docum_modalidad tab1 ON tab1.id_docum_modalidad = tab0.id_docum_modalidad and tab1.estado =1
                where id_estudios_previos = $id_estudios_previos
EOD;
        $records = CN_TABLE::executeSQL($sql);

        $documentos_ep = $records[0]['cantidad'];

        // 20220427 Valida solo los documentos obligatorios (no opcionales)
        $sql = <<<EOD
        select count(*) as cantidad from co_docum_modalidad
                where id_modalidad_sel = $id_modalidad_sel and estado = 1 and opcional = 0
EOD;
        $records = CN_TABLE::executeSQL($sql);

        $documentos_mod = $records[0]['cantidad'];

        if ($documentos_ep < $documentos_mod) {

            $errors['mensaje'] = "No ha realizado el registro de todos los documentos del Proceso";
            $errors['servicio'] = "co_estudios_previos";
        }

        /*
         *  Validar la operación, ya sea por SQL
         */


        /*
         *  Generar errores en $errors
         */


        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Remove
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateRemove(sfWebRequest $request) {

//valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Acciones anteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function preprocessRequest($Action, sfWebRequest $request) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a preprocessRequest");

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            $logger->info("Valor del versionamiento " . $request['versionamiento']);
            if ($request['versionamiento'] == "true") {
                $logger->info("Ingresa a versionamiento");

                $id_estudios_previos = $request['id_estudios_previos'];
                $request['id_estudios_previos_padre'] = $id_estudios_previos;
                $request['id_estudios_previos'] = "";

                $sql = <<<EOD
update co_estudios_previos set estado = 0, fecha_anu=sysdate, motivo_anu='GENERA NUEVA VERSION' 
    where id_estudios_previos = $id_estudios_previos
EOD;
                //20200625 Se cambia el metodo de anular al postprecess 
                //estas lineas pueden ser borradas luego de varias pruebas
                //CN_TABLE::executeSQL($sql);
            }
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

    /**
     * Acciones posteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function postprocessRequest($Action, sfWebRequest $request, $list_data_post) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a postprocessRequest - " . $list_data_post);
        //Obtenemos la entidad
        $array = sfYaml::load(dirname(__FILE__) . '/../../../../api/config/app-gwt.yml');
        $int = 0;
        $serviceHtml_url = "";
        foreach ($array as $routeName => $routeData) {
            //echo $routeName . "\n";
            if ('serviceHtml_url' == $routeName) {
                foreach ($routeData as $key => $value) {
                    if ($key == 'value') {
                        $serviceHtml_url = $value;
                        $this->service_url = $serviceHtml_url;
                    }
                }
            }
            if ('entidad_cliente' == $routeName) {
                foreach ($routeData as $key => $value) {
                    //echo $value . "\n";
                    if ($key == 'value') {
                        $entidadCliente = $value;
                    }
                }
            }
            $int++;
        }
        $config = HTMLPurifier_Config::createDefault();
        $purifier = new HTMLPurifier($config);

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {

            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();

            $id_estudios_previos = $list_data_post[0]['id_estudios_previos'];
            $id_estudios_previos_padre = $request['id_estudios_previos_padre'];

            try {
                /*
                 * Inserta solo un registro por id_campo_ep.
                 * Se deja para que se cree el detalle de la nueva version al crear la verison en estudio previo - 20160519
                 */
                $sql = <<<EOD
insert into co_detalle_ep 
select 
id_detalle_ep,
id_estudios_previos,
id_campo_ep,
valor,
comentario
from (

    select 
    null as id_detalle_ep,
    $id_estudios_previos as id_estudios_previos,
    id_campo_ep,
    valor,
    comentario,
    row_number() over (
      partition by id_campo_ep
      order by id_detalle_ep desc
    ) as rn
    from co_detalle_ep
    where 
    id_estudios_previos = $id_estudios_previos_padre 

)
where
rn = 1

order by
id_campo_ep 
EOD;
                $this->conn->execute($sql);
                /*
                 * Anulamos estudio previo padre
                 */
                $sql = <<<EOD
update co_estudios_previos set estado = 0, fecha_anu=sysdate, motivo_anu='GENERA NUEVA VERSION' 
    where id_estudios_previos = $id_estudios_previos_padre
EOD;
                $this->conn->execute($sql);
                /*
                 * Creamos Versionamiento
                 */
                $id_mae_ter = $request['id_username'];
                $sql = <<<EOD
insert into CO_VERSIONES_EP(id_version_padre,id_version_hijo,fecha_creacion,id_maeter)
values($id_estudios_previos_padre,$id_estudios_previos,SYSDATE,$id_mae_ter )
EOD;
                $this->conn->execute($sql);
                /* copiamos DOcumentos */
                $sql = <<<EOD
insert into co_documento_ep(ID_ESTUDIOS_PREVIOS,
ID_DOCUM_MODALIDAD,
FECHA_REGISTRO,
OBSERVACIONES,
ADJUNTO,
APROBADO,
ID_USUARIO_APROBADO,
FECHA_APROBADO) (select $id_estudios_previos,ID_DOCUM_MODALIDAD,
FECHA_REGISTRO,
OBSERVACIONES,
ADJUNTO,
APROBADO,
ID_USUARIO_APROBADO,
FECHA_APROBADO
from co_documento_ep where ID_ESTUDIOS_PREVIOS = $id_estudios_previos_padre )
EOD;
                $this->conn->execute($sql);
                //COPIAMOS REQUISITO
                $sql = <<<EOD
insert into co_requisito_ep(ID_ESTUDIOS_PREVIOS,
ID_REQUISITO) (select $id_estudios_previos,ID_REQUISITO
from co_requisito_ep where ID_ESTUDIOS_PREVIOS = $id_estudios_previos_padre )
EOD;
                $this->conn->execute($sql);
                //COMPIAMOS GARANTIAS
                $sql = <<<EOD
insert into co_garantia_ep(ID_ESTUDIOS_PREVIOS,
ID_GARANTIA,
PORCENTAJE,
VALOR)
(select $id_estudios_previos,ID_GARANTIA,
PORCENTAJE,
VALOR from co_garantia_ep where ID_ESTUDIOS_PREVIOS = $id_estudios_previos_padre )
EOD;
                $this->conn->execute($sql);
                //COPIAMOS PASOS
                $sql = <<<EOD
insert into co_paso_ep(ID_ESTUDIOS_PREVIOS,
ID_PASO_MODALIDAD,
FECHA_INICIO,
FECHA_FIN,
OBSERVACIONES,
ADJUNTO) (select $id_estudios_previos,
ID_PASO_MODALIDAD,
FECHA_INICIO,
FECHA_FIN,
OBSERVACIONES,
ADJUNTO                    
from co_paso_ep where ID_ESTUDIOS_PREVIOS = $id_estudios_previos_padre )
EOD;
                $this->conn->execute($sql);
                //COPIAMOS FIRMA
                $sql = <<<EOD
insert into co_firma_ep(ID_ESTUDIOS_PREVIOS,
DESCRIPCION,
CARGO,
ID_MAE_TER)
(select $id_estudios_previos,DESCRIPCION,
CARGO,
ID_MAE_TER from co_firma_ep where ID_ESTUDIOS_PREVIOS = $id_estudios_previos_padre )
EOD;
                $this->conn->execute($sql);
                //COPIAMOS PROYECTO
                $sql = <<<EOD
insert into co_proyecto_ep(ID_ESTUDIOS_PREVIOS,
ID_CPO,
VALOR,
SGR)
(select $id_estudios_previos,ID_CPO,
VALOR,
SGR from co_proyecto_ep where ID_ESTUDIOS_PREVIOS = $id_estudios_previos_padre )
EOD;
                $this->conn->execute($sql);

                //COPIAMOS CDPS
                //Se coloca que tome el proyecto que acaba de crear, y no siempre el original - 20210510::LAVILA
                $sql = <<<EOD
insert into co_cdps_ep(
ID_ESTUDIOS_PREVIOS,
ID_CPO_EP,
ID_CDP,
VALOR,
SGR
)

(

select 
$id_estudios_previos,
( SELECT max(id_proyecto_ep) FROM co_proyecto_ep where ID_ESTUDIOS_PREVIOS = $id_estudios_previos ) as ID_CPO_EP,
ID_CDP,
VALOR,
SGR
from co_cdps_ep where ID_ESTUDIOS_PREVIOS = $id_estudios_previos_padre 

)
EOD;
                $this->conn->execute($sql);

                //Crear lineas y objetos iguales
                $sql = <<<EOD
insert into co_codigopaa_ep(
ID_ESTUDIOS_PREVIOS,
CODIGOPAA,
NOMBREDEPENDENCIA,
VALORVIGENCIA,
MODALIDADCONTRATACION,
MESINICIO,
PLAZOESTIMADOEJECUCIONENDIAS,
VALORVIGENCIAFUTURA,
CODIGOSUNSPSC,
IDSISGESTIONMODALIDAD,
IDSISGESTIONDEPENDENCIA,
IDOBJETOIGUAL,
TIPOBOLSA
)
(
select 
$id_estudios_previos,
CODIGOPAA,
NOMBREDEPENDENCIA,
VALORVIGENCIA,
MODALIDADCONTRATACION,
MESINICIO,
PLAZOESTIMADOEJECUCIONENDIAS,
VALORVIGENCIAFUTURA,
CODIGOSUNSPSC,
IDSISGESTIONMODALIDAD,
IDSISGESTIONDEPENDENCIA,
IDOBJETOIGUAL,
TIPOBOLSA
from co_codigopaa_ep
where ID_ESTUDIOS_PREVIOS = $id_estudios_previos_padre 
)

EOD;
                $this->conn->execute($sql);
                $sql = <<<EOD
insert into co_ep_objetos_iguales(
ID_CO_EP,
ID_ESTUDIOS_PREVIOS,
VALOR_TEXTO,
IDOBJETOIGUAL,
VIGENCIA,
CANTIDAD
)
(
select 
null as ID_CO_EP,
$id_estudios_previos,
VALOR_TEXTO,
IDOBJETOIGUAL,
VIGENCIA,
CANTIDAD
from co_ep_objetos_iguales
where ID_ESTUDIOS_PREVIOS = $id_estudios_previos_padre 
) 
EOD;
                $this->conn->execute($sql);
                // ubicamos regsitro objetos iguales para registrar contratistas objetos iguales
                $sql = <<<EOD
INSERT INTO CO_CONTR_CERT_OBJ(ID_CO_EP,ID_ESTUDIOS_PREVIOS,ID_CONTRATISTA)
(select (select min(id_co_ep) as id from CO_EP_OBJETOS_IGUALES WHERE ID_estudios_previos = $id_estudios_previos) as ID_CO_EP, $id_estudios_previos as id_estudios_previos, tab0.id_contratista
from CO_CONTR_CERT_OBJ tab0
where id_estudios_previos = $id_estudios_previos_padre)                        
EOD;

                $this->conn->execute($sql);

                /**
                 * Campos nuevos de EP - 20200911
                 */
                $sql = <<<EOD
UPDATE co_estudios_previos 
SET 
codigopaa = (select codigopaa from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
estado_general = (select estado_general from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
fecha_aprobado = (select fecha_aprobado from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
estado_objeto_iguales = (select estado_objeto_iguales from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
fec_est_obj_igu_pen = (select fec_est_obj_igu_pen from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
fec_est_obj_igu_vob = (select fec_est_obj_igu_vob from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
fec_est_obj_igu_apr = (select fec_est_obj_igu_apr from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
fec_est_obj_igu_rec = (select fec_est_obj_igu_rec from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
estado_ep_general = (select estado_ep_general from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
fec_est_ep_gen_pen = (select fec_est_ep_gen_pen from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
fec_est_ep_gen_vob = (select fec_est_ep_gen_vob from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
fec_est_ep_gen_aut = (select fec_est_ep_gen_aut from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
fec_est_ep_gen_rec = (select fec_est_ep_gen_rec from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
autorizado_extra = (select autorizado_extra from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
fec_est_ep_gen_autextra = (select fec_est_ep_gen_autextra from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
tipobolsa = (select tipobolsa from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
usuario_est_obj_igu_pen = (select usuario_est_obj_igu_pen from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
usuario_est_obj_igu_vob = (select usuario_est_obj_igu_vob from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
usuario_est_obj_igu_apr = (select usuario_est_obj_igu_apr from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre),
usuario_est_obj_igu_rec = (select usuario_est_obj_igu_rec from co_estudios_previos where id_estudios_previos = $id_estudios_previos_padre)

where
id_estudios_previos  = $id_estudios_previos
EOD;
                $this->conn->execute($sql);

                //Finalizo de generar version del estudio previo correctamente
                $this->conn->commit();
            } catch (Exception $e) {
                //Fallo se elimina regresa la transaccion y se elimina el estudio previo creado
                $this->conn->rollback();
                $this->conn->beginTransaction();
                $sql = <<<EOD
delete from CO_ESTUDIOS_PREVIOS where ID_ESTUDIOS_PREVIOS = $id_estudios_previos
EOD;
                $this->conn->execute($sql);
                /* $sql = <<<EOD
                  update co_estudios_previos set estado = 1, fecha_anu=null, motivo_anu=null
                  where id_estudios_previos = $id_estudios_previos_padre
                  EOD; */
                //$this->conn->execute($sql);
                $this->conn->commit();
                $this->status = 1;
                $this->mensajeError = "[genera_version] Ocurrio un error: " . $e->getMessage();
                $this->list_data = array();
                $this->logMessage("[genera_version] ERROR!");
                $this->logMessage($e->getMessage());
            }
            if ($this->status != 1) {
                //ENVIO DE CORREO

                $sql = "
            SELECT tab0.dia_sistema||' de '||tab0.mes_sistema||' del '||anho_sistema AS FECHA_SISTEMA
               from(
                select LPAD(to_char(sysdate,'dd'),2,'0') as dia_sistema,
                trim(initcap(to_char(sysdate,'MONTH','nls_date_language=spanish'))) as mes_sistema,
                TO_CHAR(sysdate,'yyyy') as anho_sistema
                from dual
            )tab0
            ";

                $records = CN_TABLE::executeSQL($sql);
                $fecha_creacion = $records[0]['fecha_sistema'];


                $sql = <<<EOD
select tab0.*  from co_estudios_previos_v tab0 where tab0.id_estudios_previos = $id_estudios_previos
EOD;

                $records = CN_TABLE::executeSQL($sql);

                $responsable = $records[0]['nombre_responsable'];
                $id_responsable = $records[0]['responsable'];
                $area = $records[0]['area'];
                $valor = $records[0]['valor'];
                $valor = number_format($valor);
                $modalidad = $records[0]['modalidad'];
                $version = $records[0]['version'];
                $abogado = $records[0]['abogado'];
                $objeto = $this->htmlClear($records[0]['objeto']);
                $observacion_version = $records[0]['observacion_version'];
                //Obtenemos el objeto dependiendo de la entidad
                switch ($entidadCliente) {
                    CASE "1"://SGC
                        $objeto = $this->htmlClear($records[0]['objeto']);
                        break;
                    default:
                        //Se ubica el objeto por le campo del estudio previo que en su codigo tenga la palabra objeto
                        //OBTENEMOS LOS CAMPOS QUE VIENEN DESDE EL ESTUDIO PREVIO
                        $sql = <<<EOD
                select 
tab2.campo_ep.id_campo_ep as id_campo_ep,
tab2.campo_ep.codigo as codigo,
tab2.campo_ep.descripcion AS descripcion,                     
tab2.campo_ep.estado as estado,
tab2.campo_ep.tipo_campo as tipo_campo,
case when tab7.valor is null then tab2.default_value else tab7.valor end as valor,  
tab2.campo_ep.fase_ep.orden as HOJA,
tab2.orden
from co_estudios_previos tab0
join co_modalidad_sel tab1 on tab0.id_modalidad_sel=tab1.id_modalidad_sel
left join co_campo_modalidad tab2 on tab1.id_modalidad_sel=tab2.id_modalidad_sel
left join co_detalle_ep tab7 on tab0.id_estudios_previos=tab7.id_estudios_previos and tab2.campo_ep.id_campo_ep=tab7.id_campo_ep
left join co_campo_obliga tab8 ON tab8.id_modalidad_sel = tab0.id_modalidad_sel and tab8.id_campo_ep = tab2.campo_ep.id_campo_ep    
where
1=1  
and tab0.ID_ESTUDIOS_PREVIOS = $id_estudios_previos
order by tab2.campo_ep.fase_ep.orden,tab2.orden  
EOD;
                        $campos = CN_TABLE::executeSQL($sql);
                        $obj = "";
                        foreach ($campos as $rec) {
                            $codigo = $rec['CODIGO'];
                            $valorcampo = $rec['VALOR'];
                            $valorcampo = $this->htmlClear($purifier->purify($valorcampo));
                            if (stristr(strtoupper($codigo), 'OBJETO') !== FALSE) {
                                $obj = $valorcampo;
                            }
                        }
                        $objeto = $this->htmlClear($obj);
                        break;
                }

                if ($version == 1) {

                    //ENVIO CORREO 1 - Solicitud de Reparto
                    //PARAMETROS GENERALES

                    $subject = "Solicitud de Reparto";
                    //Email Envio
                    if (!isset($request["email_envio"])) {


                        //Obtenemos la entidad
                        $array = sfYaml::load(dirname(__FILE__) . '/../../../../api/config/app-gwt.yml');
                        $int = 0;
                        foreach ($array as $routeName => $routeData) {
                            //echo $routeName . "\n";
                            if ('correoEnvio' == $routeName) {
                                foreach ($routeData as $key => $value) {
                                    //echo $value . "\n";
                                    if ($key == 'value') {
                                        $email_envio = $value;
                                    }
                                }
                            }
                            $int++;
                        }

                        $request["email_envio"] = $email_envio;
                    }
                    $adjunto = false;
                    $ruta = "";

                    /*
                     * Variable Memcache
                     */
                    $progress_key = $request['progress_key'] . $request['username'];
                    $this->logMessage("Valor de progress_key: " . $progress_key);

                    $array_adjuntos = array();

                    //1. Se realiza Consulta a la tabla de administracion alarmas para saber a quien van dirigidos los correos

                    $sql = <<<EOD
select tab2.num_doc, tab2.id_tipo_doc, tab2.razon_soc, nvl(tab3.mail,'mesadeayuda@sgc.gov.co') email, tab4.descripcion as rol
from co_administra_alarma tab0
join co_rol_proceso_v tab1 ON tab1.id_rol = tab0.id_rol and tab1.id_estudios_previos = $id_estudios_previos
join interceros_v tab2 ON tab2.id_mae_ter = tab1.id_mae_ter
join interceros_du_dir_v tab3 ON tab3.id_mae_ter = tab2.id_mae_ter
join co_rol tab4 ON tab4.id_rol = tab0.id_rol                        
where tab0.id_alarma = 1 and tab1.id_mae_ter is not null
EOD;

                    $records = CN_TABLE::executeSQL($sql);

                    foreach ($records as $correos) {

                        $documento = $correos['num_doc'];
                        $tipo_doc = $correos['id_tipo_doc'];
                        $nombre = $correos['razon_soc'];
                        $email = $correos['email'];
                        $rol = $correos['rol'];

                        $parametros = $documento . ";$tipo_doc;" . $email . ";" . $nombre . ";Envio notificacion";

                        $datos_usuario = array();

                        if ($parametros != "") {
                            $datos_usuario = explode('/', $parametros);
                        }

                        //CUERPO DEL MENSAJE

                        $body = "<html><body> </body></html>";
                        //Body
                        $body = <<<EOD
                <html><body> 
                <br/>
                Bogotá, $fecha_creacion
                <br/>
                <br/>
                Señor(a)<br/>
                $nombre<br/>
                $rol
                <br/><br/>
                Por medio de la presente se notifica la <b>Solicitud de Reparto</b> al Grupo de Contratos y Convenios del proceso de estudios previos detallado a continuación:<br/><br/>
                <b>Estudio previo:</b> $id_estudios_previos<br/><br/> 
                <b>Area:</b> $area<br/><br/>
                <b>Modalidad de Seleccion:</b> $modalidad<br/><br/>
                <b>Valor:</b> $valor<br/><br/>
                <b>Responsable:</b> $responsable<br/><br/>
                <b>Objeto:</b> $objeto<br/><br/>
                <br/><br/>
                
                </body></html>
EOD;


                        $currentUri = "";

                        CN_TABLE::envioCorreo($request, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $body);
                    }
                } else {

                    //ENVIO CORREO 23 - Notificacion de Correcciones de Abogado
                    //PARAMETROS GENERALES
                    if ($request['id_username'] == $id_responsable) {
                        $subject = "Notificacion de Revision de Estudios Previos $id_estudios_previos";
                        //Email Envio
                        if (!isset($request["email_envio"])) {
                            $request["email_envio"] = "modulocontratacion@sgc.gov.co";
                        }
                        $adjunto = false;
                        $ruta = "";

                        /*
                         * Variable Memcache
                         */
                        $progress_key = $request['progress_key'] . $request['username'];
                        $this->logMessage("Valor de progress_key: " . $progress_key);
                        $this->logMessage("id_username=" . $request['id_username']);
                        $array_adjuntos = array();

                        //1. Se realiza Consulta a la tabla de administracion alarmas para saber a quien van dirigidos los correos

                        $sql = <<<EOD
select tab2.num_doc, tab2.id_tipo_doc, tab2.razon_soc, nvl(tab3.mail,'mesadeayuda@sgc.gov.co') email, tab4.descripcion as rol
from co_administra_alarma tab0
join co_rol_proceso_v tab1 ON tab1.id_rol = tab0.id_rol and tab1.id_estudios_previos = $id_estudios_previos
join interceros_v tab2 ON tab2.id_mae_ter = tab1.id_mae_ter
join interceros_du_dir_v tab3 ON tab3.id_mae_ter = tab2.id_mae_ter
join co_rol tab4 ON tab4.id_rol = tab0.id_rol                        
where tab0.id_alarma = 42 and tab1.id_mae_ter is not null
EOD;


                        $records = CN_TABLE::executeSQL($sql);

                        $this->logMessage("Tamaño consulta" . count($records));


                        foreach ($records as $correos) {



                            $documento = $correos['num_doc'];
                            $tipo_doc = $correos['id_tipo_doc'];
                            $nombre = $correos['razon_soc'];
                            $email = $correos['email'];
                            $rol = $correos['rol'];

                            $parametros = $documento . ";$tipo_doc;" . $email . ";" . $nombre . ";Envio notificacion";

                            $datos_usuario = array();

                            if ($parametros != "") {
                                $datos_usuario = explode('/', $parametros);
                            }

                            //CUERPO DEL MENSAJE

                            $body = "<html><body> </body></html>";
                            //Body
                            $body = <<<EOD
                <html><body> 
                <br/>
                Bogotá, $fecha_creacion
                <br/>
                <br/>
                Señor(a)<br/>
                $nombre<br/>
                $rol
                <br/><br/> Se ha procedido a la revision del documento de Estudios Previos por parte del Responsable y generado la version No $version para el proceso detallado a continuacion: <br/><br/>
                                    <b>Estudio previo:</b> $id_estudios_previos<br/><br/> 
                <b>Area:</b> $area<br/><br/>
                <b>Modalidad de Seleccion:</b> $modalidad<br/><br/>
                <b>Valor:</b> $valor<br/><br/>
                <b>Responsable:</b> $responsable<br/><br/>
		<b>Abogado: </b>$abogado</br><br/>
                <b>Objeto:</b> $objeto<br/><br/>
                <b>Observación Versión:</b> $observacion_version<br/><br/>    
                <br/><br/>
                
                </body></html>
EOD;

                            $this->logMessage($body);

                            $currentUri = "";
                            // Generamos y Adjuntamos archivo DEtalle EP con Comentarios
                            $url_gen_contrato = $serviceHtml_url . "co_pdf_ep/pdf_comentario?id_estudios_previos=$id_estudios_previos&savefile=true";
                            $params["id_estudios_previos"] = $id_estudios_previos;
                            $params["savefile"] = "true";
                            CN_TABLE::curlPostAsync($url_gen_contrato, $params);
                            $ruta = $_SERVER['DOCUMENT_ROOT'] . "/contratacion/web/uploads/";
                            $array_adjuntos = array(
                                "detalle_estudios_previos_$id_estudios_previos.pdf" => "tmp/detalle_estudios_previos_$id_estudios_previos.pdf"
                            );

                            CN_TABLE::envioCorreo($request, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $body);
                        }
                    } else {


                        $subject = "Notificacion de Revision de Estudios Previos $id_estudios_previos";
                        //Email Envio
                        if (!isset($request["email_envio"])) {
                            $request["email_envio"] = "modulocontratacion@sgc.gov.co";
                        }
                        $adjunto = false;
                        $ruta = "";

                        /*
                         * Variable Memcache
                         */
                        $progress_key = $request['progress_key'] . $request['username'];
                        $this->logMessage("Valor de progress_key: " . $progress_key);
                        $this->logMessage("id_username=" . $request['id_username']);
                        $array_adjuntos = array();

                        //1. Se realiza Consulta a la tabla de administracion alarmas para saber a quien van dirigidos los correos

                        $sql = <<<EOD
select tab2.num_doc, tab2.id_tipo_doc, tab2.razon_soc, nvl(tab3.mail,'mesadeayuda@sgc.gov.co') email, tab4.descripcion as rol
from co_administra_alarma tab0
join co_rol_proceso_v tab1 ON tab1.id_rol = tab0.id_rol and tab1.id_estudios_previos = $id_estudios_previos
join interceros_v tab2 ON tab2.id_mae_ter = tab1.id_mae_ter
join interceros_du_dir_v tab3 ON tab3.id_mae_ter = tab2.id_mae_ter
join co_rol tab4 ON tab4.id_rol = tab0.id_rol                        
where tab0.id_alarma = 41 and tab1.id_mae_ter is not null
EOD;


                        $records = CN_TABLE::executeSQL($sql);

                        $this->logMessage("Tamaño consulta" . count($records));


                        foreach ($records as $correos) {



                            $documento = $correos['num_doc'];
                            $tipo_doc = $correos['id_tipo_doc'];
                            $nombre = $correos['razon_soc'];
                            $email = $correos['email'];
                            $rol = $correos['rol'];

                            $parametros = $documento . ";$tipo_doc;" . $email . ";" . $nombre . ";Envio notificacion";

                            $datos_usuario = array();

                            if ($parametros != "") {
                                $datos_usuario = explode('/', $parametros);
                            }

                            //CUERPO DEL MENSAJE

                            $body = "<html><body> </body></html>";
                            //Body
                            $body = <<<EOD
                <html><body> 
                <br/>
                Bogotá, $fecha_creacion
                <br/>
                <br/>
                Señor(a)<br/>
                $nombre<br/>
                $rol
                <br/><br/> Se ha procedido a la revision del documento de Estudios Previos por parte del Abogado y generado la version No $version para el proceso detallado a continuacion: <br/><br/>
                <b>Estudio previo:</b> $id_estudios_previos<br/><br/>                    
                <b>Area:</b> $area<br/><br/>
                <b>Modalidad de Seleccion:</b> $modalidad<br/><br/>
                <b>Valor:</b> $valor<br/><br/>
                <b>Responsable:</b> $responsable<br/><br/>
		<b>Abogado: </b>$abogado</br><br/>
                <b>Objeto:</b> $objeto<br/><br/>
                <b>Observación Versión:</b> $observacion_version<br/><br/> 
                <br/><br/>
                
                </body></html>
EOD;

                            $this->logMessage($body);

                            $currentUri = "";

                            CN_TABLE::envioCorreo($request, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $body);
                        }
                    }
                }
            }
            //$this->conn->commit();
            $logger->info("[ADD] FIN ADD POSTPROCESS.");
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

    private function htmlClear($string) {

        $string = str_replace('<p>', '<p align="justify">', $string);
        $string = str_replace('<br>', '<br/>', $string);
        $string = str_replace('class=', '', $string);
        $string = str_replace('<img', '', $string);
        $string = str_replace('<td>X</td>', '<td align="center">X</td>', $string);
        //$string = str_replace('<td align="top">', '<td align="justify">', $string);
        //$string = str_replace('<td align="justify">X</td>', '<td align="center">X</td>', $string);
        $string = str_replace('<td rowspan="2">', '<td rowspan="2" align="justify">', $string);

        $string = str_replace('<font size="2">', '<font size="10">', $string);
        $string = str_replace('<font size="3">', '<font size="12">', $string);
        $string = str_replace('<font size="4">', '<font size="14">', $string);
        $string = str_replace('<font size="5">', '<font size="18">', $string);
        $string = str_replace('<font size="6">', '<font size="24">', $string);
        $string = str_replace('<font size="7">', '<font size="36">', $string);
        $string = str_replace('<table ', '<center><table ', $string);
        $string = str_replace('</table> ', '</table></center>', $string);
        $string = str_replace('<table ', '<table border="1"', $string);

        $string = str_replace('size="2"', 'size="10"', $string);
        $string = str_replace('size="3"', 'size="12"', $string);
        $string = str_replace('size="4"', 'size="14"', $string);
        $string = str_replace('size="5"', 'size="18"', $string);
        $string = str_replace('size="6"', 'size="24"', $string);
        $string = str_replace('size="7"', 'size="36"', $string);

        $string = str_replace('border="0"', 'border="1"', $string);


        $string = str_replace('<div>', '<div align="justify">', $string);
        $string = str_replace('&amp;amp;amp;amp;amp;nbsp;', ' ', $string);
        $string = str_replace('&amp;amp;amp;amp;nbsp;', ' ', $string);
        $string = str_replace('&amp;amp;amp;nbsp;', ' ', $string);
        $string = str_replace('&amp;amp;nbsp;', '', $string);
        $string = str_replace('&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;', '', $string);
        $string = str_replace('<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 0); line-height: 100%; text-align: justify; widows: 2; orphans: 2; }P.western { font-family: "Tahoma",sans-serif; font-size: 11pt; }P.cjk { font-family: "Times New Roman",serif; font-size: 11pt; }P.ctl { font-family: "Tahoma",sans-serif; font-size: 11pt; }A:link { color: rgb(0, 0, 255); }</style>', ' ', $string);

        $string = str_replace('<td colspan="2">', '<td colspan="2" align="justify">', $string);
        $string = str_replace('<td rowspan="3">', '<td rowspan="3" align="justify">', $string);
        $string = str_replace('<td colspan="3">', '<td colspan="3" align="justify">', $string);
        $string = str_replace('<td rowspan="4">', '<td rowspan="4" align="justify">', $string);
        $string = str_replace('<td colspan="4">', '<td colspan="4" align="justify">', $string);
        $string = str_replace('  ', ' ', $string);
        $string = str_replace('   ', ' ', $string);
        $string = str_replace('    ', ' ', $string);
        $string = str_replace('	    ', ' ', $string);
        $string = str_replace('		    ', ' ', $string);
        //$string = str_replace('<span lang="ES-TRAD">', '<span>', $string);
        $string = str_replace('<span lang="ES-COL">', '<span>', $string);
        $string = str_replace('<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } -->', '', $string);
        $string = str_replace('<p lang="es-MX" align="justify">', '', $string);
        //$string = str_replace('<span>', '', $string);
        //$string = str_replace('</span>', '', $string); #Este es el que MAS jode :::::::::::::::::
        $string = str_replace('valign', 'align', $string);
        ;
        $string = str_replace('width=', '', $string);
        //    $string = str_replace('&nbsp;', '', $string);
        //      $string = str_replace('cellspacing=', '', $string);
        //      $string = str_replace('cellpadding=', '', $string);
        $string = str_replace('bordercolor=', '', $string);
        $string = str_replace('<td>', '<td align="justify">', $string);
        $string = str_replace('<li>', '<li align="justify">', $string);
        $string = str_replace('style=', '', $string);
        $string = str_replace('<br clear="all">', '', $string);
        return trim($string);
    }

}
