<?php
/****************************************************************************************
 * DEV: CONTRALORIA DEL ESTADO.
 * MODULO: Prueba
 * PROGRAMADORES.________________________________________________________________________
 * | # | NOMBRE.              | CORREO.                              | TELEFONO.
 * | 1 | Fernando Mendoza     | dt.ait.programador1@cgesucre.gob.ve  | 0424-8942068
 * | 2 |
 * |_____________________________________________________________________________________
 *****************************************************************************************/

class certificadosModelo extends Modelo
{
    private $atIdUsuario;

    public function __construct() 
    {
        parent::__construct();
        $this->atIdUsuario = Session::metObtener('idUsuario');
    }


    public function metListarCertificados($empleado)
    {

        $cert = $this->_db->query("
            SELECT
                fe_c005_certificados.pk_num_certificado,
                fe_c005_certificados.fec_valido_desde,
                fe_c005_certificados.fec_valido_hasta,
                fe_c005_certificados.num_flag_password,
                fe_c005_certificados.ind_cedula,
                fe_c005_certificados.num_estatus,
                fe_c005_certificados.fec_ultima_modificacion,
                fe_c005_certificados.fk_a018_num_seguridad_usuario,
                fe_c005_certificados.ind_funcionario,
                a003_persona.ind_foto
            FROM
                fe_c005_certificados
            INNER JOIN rh_b001_empleado ON rh_b001_empleado.pk_num_empleado = fe_c005_certificados.fk_rhb001_num_empleado
            INNER JOIN a003_persona ON rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona
            WHERE
                fe_c005_certificados.fk_rhb001_num_empleado = $empleado
        ");
        $cert->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $cert->fetchAll();
        return $consulta;

    }

    public function metListarFirmas($idEmpleado)
    {
        $firmas = $this->_db->query("
            SELECT
                *
            FROM
                fe_c006_firmas
            WHERE
                fk_rhb001_num_empleado = $idEmpleado
        ");
        $firmas->setFetchMode(PDO::FETCH_ASSOC);
        return $firmas->fetchAll();
    }

    public function metDatosFirma($idFirma)
    {
        $firmas = $this->_db->query("
            SELECT
                *
            FROM
                vl_fe_datos_firmas
            WHERE
                pk_num_firma = $idFirma
        ");
        $firmas->setFetchMode(PDO::FETCH_ASSOC);
        return $firmas->fetch();

    }

    public function metVerificarAccesoFirma($idEmpleado,$estatus)
    {
        $acceso = $this->_db->query("
            SELECT
                num_flag_password
            FROM
                fe_c005_certificados
            WHERE
                fk_rhb001_num_empleado = $idEmpleado and num_estatus = $estatus
        ");
        $acceso->setFetchMode(PDO::FETCH_ASSOC);
        $resultado = $acceso->fetch();
        return $resultado['num_flag_password'];
    }

    public function metDatoscrt($idEmpleado,$estatus)
    {
        $acceso = $this->_db->query("
            SELECT
                ind_crt,ind_email
            FROM
                fe_c005_certificados
            WHERE
                fk_rhb001_num_empleado = $idEmpleado and num_estatus = $estatus
        ");
        $acceso->setFetchMode(PDO::FETCH_ASSOC);
        $resultado = $acceso->fetch();
        return $resultado;
    }    


    public function metRegistrarCertificado($data)
    {
        $this->_db->beginTransaction();

        $RUTA = "/home/certificados/".$data['fk_rhb001_num_empleado']."/";

        //var_dump($data['archivo']);
        //var_dump($data['data_certificado']);

        $insert = $this->_db->prepare("
        INSERT INTO
            fe_c005_certificados
        SET 
            fec_valido_desde = :fec_valido_desde,
            fec_valido_hasta = :fec_valido_hasta,
            ind_password=:ind_password,
            num_flag_password = :num_flag_password,
            fk_rhb001_num_empleado = :fk_rhb001_num_empleado,
            ind_cedula = :ind_cedula,
            ind_organismo = :ind_organismo,
            ind_dependencia = :ind_dependencia,
            ind_funcionario = :ind_funcionario,
            ind_email = :ind_email,
            ind_cargo = :ind_cargo,
            num_estatus = :num_estatus,
            fec_ultima_modificacion = NOW(),
            fk_a018_num_seguridad_usuario = '$this->atIdUsuario'                   
        ");

        $f1 = new DateTime($data['fec_valido_desde']);
        $f2 = new DateTime($data['fec_valido_hasta']);
        
        

        $insert->execute(array(
            'fec_valido_desde' => $f1->format('Y-m-d H:i:s'),
            'fec_valido_hasta' => $f2->format('Y-m-d H:i:s'),
            'ind_password' => Hash::metObtenerHash($data['pass']),
            'num_flag_password' => $data['num_flag_password'],
            'fk_rhb001_num_empleado' => $data['fk_rhb001_num_empleado'],
            'ind_cedula' => $data['ind_cedula'],
            'ind_organismo' => $data['ind_organismo'],
            'ind_dependencia' => $data['ind_dependencia'],
            'ind_email' => $data['ind_email'],
            'ind_cargo' => $data['ind_cargo'],
            'num_estatus' => $data['num_estatus'],
            'ind_funcionario' => $data['ind_funcionario']
        ));
        $error1 = $insert->errorInfo();
        $idCert = $this->_db->lastInsertId();
        if(!empty($error1[1]) && !empty($error1[2])){
            $this->_db->rollBack();
            return $error1;
        }else{

            //registro las firmas del funcionario
            $firma = $this->_db->prepare("
            INSERT INTO
                fe_c006_firmas
            SET 
                ind_firma = :ind_firma,
                ind_razon = :ind_razon,
                ind_ubicacion = :ind_ubicacion,
                ind_imagen = :ind_imagen,
                fk_rhb001_num_empleado = :fk_rhb001_num_empleado,
                fec_ultima_modificacion = NOW(),
                fk_a018_num_seguridad_usuario = '$this->atIdUsuario'                   
            ");

            if($data['archivo']){

                //imagen de la firma
                for ($i = 0; $i < count($data['archivo']['name']); $i++) {

                    $archivos = $data['archivo'];

                    $firma->execute(array(
                        'ind_firma' => $data['nombre_f'][$i],
                        'ind_razon' => $data['razon_f'][$i],
                        'ind_ubicacion' => $data['ubicacion_f'][$i],
                        'ind_imagen' => $archivos['name'][$i],
                        'fk_rhb001_num_empleado' => $data['fk_rhb001_num_empleado']
                    ));
                    
                    if(file_exists($RUTA) || @mkdir($RUTA)) {
                        move_uploaded_file($archivos['tmp_name'][$i], $RUTA.$archivos['name'][$i]);
                    }else {
                        mkdir($RUTA, 0777, true);
                        system('chmod 777 '.$RUTA);
                        move_uploaded_file($archivos['tmp_name'][$i], $RUTA.$archivos['name'][$i]);
                   }                 

                }   

                $error2 = $firma->errorInfo();
                if(!empty($error2[1]) && !empty($error2[2])){
                    $this->_db->rollBack();
                    return $error2;
                }else{   

                    //se procesa el archivo de la firma electronica
                    $actual   = date('Y');
                    $empleado = $data['fk_rhb001_num_empleado'];
                    $nombrecrt= $empleado."-".$actual.".crt";
                    $nombre_crt_p12 = $data['data_certificado']['name'];
                    move_uploaded_file($data['data_certificado']['tmp_name'], $RUTA.$data['data_certificado']['name']);
                    system('chmod 777 '.$RUTA.$data['data_certificado']['name']);
                    system('openssl pkcs12 -in '.$RUTA.$data['data_certificado']['name'].' -out '.$RUTA.$nombrecrt.' -nodes -passin pass:'.$data['pass'].'');                    
                    system('chmod 777 '.$RUTA.$nombrecrt);

                    $actualizar = $this->_db->prepare("
                            UPDATE 
                                fe_c005_certificados
                            SET 
                                ind_firma_p12='$nombre_crt_p12',
                                ind_crt='$nombrecrt'
                            WHERE
                                pk_num_certificado=$idCert     

                        ");
                    $actualizar->execute();
                    $error3 = $actualizar->errorInfo();
                    if(!empty($error3[1]) && !empty($error3[2])){
                        $this->_db->rollBack();
                        return $error3;
                    }else{                         
                        $this->_db->commit();
                        return $idCert;
                    }

                }          

            }

        }

    }

    public function metConsultarUltimoProcedimiento()
    {
        $id_procedimiento = $this->_db->query("
            SELECT MAX(pk_num_procedimiento) AS pk_num_procedimiento 
            FROM fe_b001_procedimiento
        ");
        $id_procedimiento->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $id_procedimiento->fetch();
        return $consulta['pk_num_procedimiento'];
    }

    public function metConsultarUltimoCodigoProcedimiento($pk_num_procedimiento)
    {
        $cod_procedimiento = $this->_db->query("
            SELECT ind_codigo_procedimiento            
            FROM fe_b001_procedimiento AS procedimiento            
            WHERE procedimiento.pk_num_procedimiento = $pk_num_procedimiento
        ");
        $cod_procedimiento->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $cod_procedimiento->fetch();
        return $consulta['ind_codigo_procedimiento'];
    }

    public function metConsultarUltimoCodigo()
    {
        $cod_procedimiento = $this->_db->query("
            SELECT ind_codigo_procedimiento            
            FROM fe_b001_procedimiento AS procedimiento order by ind_codigo_procedimiento desc        
            
        ");
        $cod_procedimiento->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $cod_procedimiento->fetch();
        return $consulta['ind_codigo_procedimiento'];
    }


    public function metConsultarDependencia($idEmpleado){

        $id_dependencia = $this->_db->query("
            SELECT pk_num_dependencia FROM a004_dependencia AS dependencia
            INNER JOIN rh_c076_empleado_organizacion AS organizacion
            ON organizacion.fk_a004_num_dependencia = dependencia.pk_num_dependencia            
            INNER JOIN rh_b001_empleado AS empleado
            ON empleado.pk_num_empleado = organizacion.fk_rhb001_num_empleado            
            WHERE empleado.pk_num_empleado = $idEmpleado
       ");

        $id_dependencia->setFetchMode(PDO::FETCH_ASSOC);
        $consulta =  $id_dependencia->fetch();
        return $consulta['pk_num_dependencia'];
    }




    public function metMostrarProcedimiento($idProcedimiento)
    {

        $con = $this->_db->query("
                  SELECT
                    *
                    FROM
                    fe_b001_procedimiento
                    WHERE  pk_num_procedimiento='$idProcedimiento'"
        );

        $con->setFetchMode(PDO::FETCH_ASSOC);
        return $con->fetch();
    }
    
    
    public function metMostrarMiscelaneo($idDetalle)
    {
        $con = $this->_db->query("
              SELECT ind_nombre_detalle from a006_miscelaneo_detalle where pk_num_miscelaneo_detalle = '$idDetalle'                 
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetch();
        return $consulta['ind_nombre_detalle'];

    }

    public function metTotalConversacionProcedimiento($idProcedimiento)
    {
        $con = $this->_db->query("
              SELECT
                    count(0) as total
              FROM
                    (
                        `fe_c001_conversacion`
                        JOIN `fe_b001_procedimiento` ON (
                            (
                                `fe_b001_procedimiento`.`pk_num_procedimiento` = `fe_c001_conversacion`.`fk_fe_b001_num_procedimiento`
                            )
                        )
                    )
              where fk_fe_b001_num_procedimiento=$idProcedimiento               
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetch();
        return $consulta['total'];
    }

    public function metVerificarConversacionProcedimiento($idProcedimiento)
    {
        $con = $this->_db->query("
              SELECT
                    pk_num_conversacion
              FROM
                    
                        fe_c001_conversacion
                        JOIN `fe_b001_procedimiento` ON (
                            (
                                `fe_b001_procedimiento`.`pk_num_procedimiento` = `fe_c001_conversacion`.`fk_feb001_num_procedimiento`
                            )
                        )
                    
              where fk_feb001_num_procedimiento=$idProcedimiento and ind_estado = 'PR'            
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetch();
        return $consulta['pk_num_conversacion'];
    }

    #PERMITE OBTENER TODAS LAS CONVERSACIONES DE UN PROCEDIMIENTO
    public function metObtenerConversacionesProcedimiento($idProcedimiento)
    {
        $con = $this->_db->query("
              SELECT
                vl_fe_conversaciones.pk_num_conversacion,
                vl_fe_conversaciones.pk_num_procedimiento,
                vl_fe_conversaciones.ind_codigo_procedimiento,
                vl_fe_conversaciones.ind_anio_procedimiento,
                vl_fe_conversaciones.ind_mes_procedimiento,
                vl_fe_conversaciones.ind_tipo_procedimiento,
                vl_fe_conversaciones.ind_descripcion_procedimiento,
                vl_fe_conversaciones.ind_estado,
                vl_fe_conversaciones.fec_inicio_conversacion,
                vl_fe_conversaciones.nombre_inicio
                FROM
                vl_fe_conversaciones
                    
              where pk_num_procedimiento = $idProcedimiento           
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetchAll();
        return $consulta;
    }    


    #PERMITE OBTENER LOS MENSAJES DE UNA CONVERSACION
    public function metObtenerMensajesConversacion($idConversacion)
    {
        $con = $this->_db->query("
             SELECT
                vl_fe_mensajes.pk_num_mensaje,
                vl_fe_mensajes.pk_num_conversacion,
                vl_fe_mensajes.fec_mensaje,
                vl_fe_mensajes.ind_asunto_mensaje,
                vl_fe_mensajes.num_secuencia,
                vl_fe_mensajes.nombre_emisor,
                vl_fe_mensajes.ind_foto,
	            vl_fe_mensajes.fk_b001_num_empleado_emisor,
	            vl_fe_mensajes.ind_prioridad,
	            vl_fe_mensajes.ind_mensaje
            FROM
                vl_fe_mensajes                   
            where pk_num_conversacion= $idConversacion           
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetchAll();
        return $consulta;
    }


    #PERMITE OBTENER LOS MENSAJES DEL PROCEDIMIENTO
    public function metObtenerMensajesProcedimiento($idProcedimiento)
    {
        $con = $this->_db->query("
             SELECT
                vl_fe_mensajes.pk_num_mensaje,
                vl_fe_mensajes.pk_num_procedimiento,
                vl_fe_mensajes.fec_mensaje,
                vl_fe_mensajes.ind_asunto_mensaje,
                vl_fe_mensajes.num_secuencia,
                vl_fe_mensajes.nombre_emisor,
                vl_fe_mensajes.ind_foto,
	            vl_fe_mensajes.fk_b001_num_empleado_emisor,
	            vl_fe_mensajes.ind_prioridad,
	            vl_fe_mensajes.ind_mensaje,
	            vl_fe_mensajes.ind_dependencia
            FROM
                vl_fe_mensajes                   
            where pk_num_procedimiento= $idProcedimiento order by pk_num_mensaje desc     
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetchAll();
        return $consulta;
    }

    
    #PERMITE OBTENER LOS MENSAJES
    public function metObtenerMensajesSinLeer($idEmpleado)
    {
        $con = $this->_db->query("
             SELECT 
                COUNT(*) as num_mensajes_sin_leer
             from fe_c004_mensaje_leido
             WHERE num_leido = 0 and fk_b001_num_empleado_receptor=$idEmpleado             
            
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetch();
        return $consulta;
    }

    #PERMITE OBTENER LOS MENSAJES
    public function metObtenerMensajesSinLeerProcedimiento($idEmpleado,$idProcedimiento)
    {
        $con = $this->_db->query("
             SELECT
                num_mensajes_sin_leer
            FROM
                vl_fe_mensajes_sin_leer                 
            where fk_b001_num_empleado_receptor= $idEmpleado and fk_feb001_num_procedimiento= $idProcedimiento        
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetch();
        return $consulta;
    }

    #PERMITE OBTENER LOS MENSAJES
    public function metObtenerMensajesSinLeerImportantes($idEmpleado)
    {
        $con = $this->_db->query("
            SELECT
                count(0) AS `num_mensajes_sin_leer_importantes`
            FROM
                (
                    `fe_c001_mensajes`
                    JOIN `fe_c004_mensaje_leido` ON (
                        (
                            `fe_c001_mensajes`.`pk_num_mensaje` = `fe_c004_mensaje_leido`.`fk_fec001_num_mensaje`
                        )
                    )
                )
            WHERE
                (
                    (
                        `fe_c004_mensaje_leido`.`num_leido` = 0
                    )
                    AND (
                        `fe_c001_mensajes`.`ind_prioridad` = 'IM'
                    )
                    AND (
                        `fe_c004_mensaje_leido`.`fk_b001_num_empleado_receptor` = $idEmpleado
                    )
                )          
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetch();
        return $consulta;
    }

    #CODIGO DEL PROCEDIMIENTO
    public function metCodigoProcedimiento($idProcedimiento)
    {
        $con = $this->_db->query("
             SELECT
                CONCAT_WS(
                    '-',
                    fe_b001_procedimiento.ind_codigo_procedimiento,
                    fe_b001_procedimiento.ind_anio_procedimiento,
                    fe_b001_procedimiento.ind_mes_procedimiento
                ) AS codigo_procedimiento,
                fe_b001_procedimiento.cod_procedimiento
            FROM
                fe_b001_procedimiento
            WHERE
                pk_num_procedimiento = $idProcedimiento        
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetch();
        return $consulta['cod_procedimiento'];
    }

    public function metObtenerCodigoProcedimientoMensaje($idMensaje)
    {
        $con = $this->_db->query("
             SELECT
                CONCAT_WS(
                    '-',
                    fe_b001_procedimiento.ind_codigo_procedimiento,
                    fe_b001_procedimiento.ind_anio_procedimiento,
                    fe_b001_procedimiento.ind_mes_procedimiento
                ) AS codigo_procedimiento
            FROM
                fe_b001_procedimiento
            INNER JOIN fe_c001_conversacion ON fe_c001_conversacion.fk_feb001_num_procedimiento = fe_b001_procedimiento.pk_num_procedimiento
            INNER JOIN fe_c002_mensajes ON fe_c002_mensajes.fk_c001_num_conversacion = fe_c001_conversacion.pk_num_conversacion
            WHERE fe_c002_mensajes.pk_num_mensaje = $idMensaje      
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetch();
        return $consulta['codigo_procedimiento'];
    }

    public function metUltimaSecuenciaMensaje($idProcedimiento)
    {
        $con = $this->_db->query("
             SELECT
                MAX(num_secuencia) AS secuencia
            FROM
                fe_c001_mensajes
            WHERE
	            fk_feb001_num_procedimiento = $idProcedimiento   
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $con->fetch();
        return $consulta['secuencia'];
    }

    #PERMITE REGISTRAR UN MENSAJE
    public function metEnviarMensaje($data,$archivos=false)
    {
        #beginTransaction — Inicia una transacción
        $this->_db->beginTransaction();

        //ruta raiz para guardar archivos
        $RUTA = "/home/archivos_firma/";

        /*$conversaciones = $this->metVerificarConversacionProcedimiento($data['idProcedimiento']);
        if($conversaciones > 0){
            //obtengo el id conversacion que esta en proceso

        }else{
            //registro conversacion
            $r_conversacion = $this->_db->prepare(
                "
                INSERT INTO
                  fe_c001_conversacion
                SET 
                  fk_feb001_num_procedimiento = :fk_feb001_num_procedimiento,
                  fk_rhb001_empleado_inicio=:fk_rhb001_empleado_inicio,
                  ind_estado = :ind_estado,
                  fec_inicio_conversacion=NOW(),
                  fec_ultima_modificacion=NOW(),
                  fk_a018_num_seguridad_usuario='$this->atIdUsuario'
                  ");

            $r_conversacion->execute(array(
                'fk_feb001_num_procedimiento' => $data['idProcedimiento'],
                'ind_estado' => 'PR',
                'fk_rhb001_empleado_inicio' => $data['idEmpleadoEmisor']
            ));
            $error = $r_conversacion->errorInfo();
            if(!empty($error[1]) && !empty($error[2])){
                $this->_db->rollBack();
                return $error;
            }else{*/
                
                $secuencia = $this->metUltimaSecuenciaMensaje($data['idProcedimiento']);
                $secuencia = $secuencia + 1;
                $r_mensaje = $this->_db->prepare("
                    INSERT INTO
                        fe_c001_mensajes
                    SET 
                        fk_feb001_num_procedimiento = :fk_feb001_num_procedimiento,
                        fec_mensaje = :fec_mensaje,
                        fk_b001_num_empleado_emisor = :fk_b001_num_empleado_emisor,
                        fk_a004_num_dependencia_emisor = :fk_a004_num_dependencia_emisor,
                        ind_asunto_mensaje = :ind_asunto_mensaje,
                        ind_mensaje = :ind_mensaje,
                        ind_estado = :ind_estado,
                        num_secuencia = :num_secuencia,
                        ind_prioridad = :ind_prioridad,
                        fec_ultima_modificacion = NOW(),
                        fk_a018_num_seguridad_usuario = '$this->atIdUsuario'                   
                ");
                $r_mensaje->execute(array(
                        'fk_feb001_num_procedimiento' => $data['idProcedimiento'],
                        'fec_mensaje' => $data['fec_mensaje'],
                        'fk_b001_num_empleado_emisor' => $data['idEmpleadoEmisor'],
                        'fk_a004_num_dependencia_emisor' => $data['idDependenciaEmisor'],
                        'ind_asunto_mensaje' => mb_strtoupper($data['ind_asunto_mensaje'],'utf8'),
                        'ind_mensaje' => $data['ind_mensaje'],
                        'ind_estado' => $data['ind_estado'],
                        'ind_prioridad' => $data['ind_prioridad'],
                        'num_secuencia' => $secuencia
                ));
                $error1 = $r_mensaje->errorInfo();
                if(!empty($error1[1]) && !empty($error1[2])){
                    $this->_db->rollBack();
                    return $error1;
                }else{
                    $idMensaje= $this->_db->lastInsertId();
                    $r_destinatarios = $this->_db->prepare(
                        "INSERT INTO
                                      fe_c002_destinatarios
                                    SET 
                                      fk_c001_num_mensaje = :fk_c001_num_mensaje,
                                      fk_b001_num_empleado_receptor = :fk_b001_num_empleado_receptor,
                                      fk_a004_num_dependencia_receptor = :fk_a004_num_dependencia_receptor
                                    "
                    );
                    //cargo relacion mensajes leidos
                    $r_mensaje_leido = $this->_db->prepare(
                        "INSERT INTO
                                          fe_c004_mensaje_leido
                                        SET 
                                          fk_fec001_num_mensaje = :fk_fec001_num_mensaje,
                                          fk_b001_num_empleado_receptor = :fk_b001_num_empleado_receptor
                                        "
                    );
                    for ($i = 0; $i < count($data['fk_b001_num_empleado_receptor']); $i++) {
                        $r_destinatarios->execute(array(
                            'fk_c001_num_mensaje' => $idMensaje,
                            'fk_b001_num_empleado_receptor' => $data['fk_b001_num_empleado_receptor'][$i],
                            'fk_a004_num_dependencia_receptor' => $this->metConsultarDependencia($data['fk_b001_num_empleado_receptor'][$i])
                        ));
                        $r_mensaje_leido->execute(array(
                            'fk_fec001_num_mensaje' => $idMensaje,
                            'fk_b001_num_empleado_receptor' => $data['fk_b001_num_empleado_receptor'][$i],
                        ));
                    }

                    $error2 = $r_destinatarios->errorInfo();
                    if(!empty($error2[1]) && !empty($error2[2])){
                        $this->_db->rollBack();
                        return $error2;
                    }else{

                        //actualizo estatus del procedimiento a IN
                        $r_up_procedimiento = $this->_db->prepare(
                            "
                            UPDATE
                              fe_b001_procedimiento
                            SET 
                              ind_estado_procedimiento = 'IN',
                              fec_ultima_modificacion=NOW(),
                              fk_a018_num_seguridad_usuario='$this->atIdUsuario'
                            WHERE pk_num_procedimiento = $data[idProcedimiento]
                              ");
                        $r_up_procedimiento->execute();
                        $error3 = $r_up_procedimiento->errorInfo(); 
                        if(!empty($error3[1]) && !empty($error3[2])){
                            $this->_db->rollBack();
                            return $error3;
                        }else{

                            //registro en bd los archivos y guardo en carpeta
                            if($archivos){
                                //sql para registrar archivos
                                $registrar_archivos = $this->_db->prepare(
                        "INSERT INTO
                                      fe_c003_archivos
                                   SET 
                                      fk_c001_num_mensaje= $idMensaje,
                                      ind_nombre_archivo=:ind_nombre_archivo,
                                      num_peso_archivo=:num_peso_archivo,
                                      ind_ruta_archivo=:ind_ruta_archivo,
                                      ind_tipo_archivo=:ind_tipo_archivo,
                                      ind_extension_archivo=NULL,
                                      ind_nombre_descarga=:ind_nombre_descarga,
                                      ind_estado='EV',
                                      fec_ultima_modificacion=NOW(),
                                      fk_a018_num_seguridad_usuario='$this->atIdUsuario'                                                     
                                   "
                                );
                                $codigoProcedimiento = $this->metCodigoProcedimiento($data['idProcedimiento']);
                                $RUTA_CARPETA = $RUTA.$codigoProcedimiento."/".$idMensaje."/";

                                for ($i = 0; $i < count($archivos); $i++) {
                                    $registrar_archivos->execute(array(
                                        'ind_nombre_archivo' => $archivos[$i]['NOMBRE'],
                                        'num_peso_archivo' => $archivos[$i]['SIZE'],
                                        'ind_ruta_archivo' => $RUTA_CARPETA,
                                        'ind_tipo_archivo' => $archivos[$i]['TIPO'],
                                        'ind_nombre_descarga' => $archivos[$i]['RUTA']
                                    ));
                                    if(file_exists($RUTA_CARPETA) || @mkdir($RUTA_CARPETA)) {
                                        move_uploaded_file($archivos[$i]['RUTA'], $RUTA_CARPETA.$archivos[$i]['NOMBRE']);
                                    }else {
                                        mkdir($RUTA_CARPETA, 0777, true);
                                        move_uploaded_file($archivos[$i]['RUTA'], $RUTA_CARPETA.$archivos[$i]['NOMBRE']);
                                    }
                                }
                                $error4 = $registrar_archivos->errorInfo();
                                if(!empty($error4[1]) && !empty($error4[2])){
                                    $this->_db->rollBack();
                                    return $error4;
                                }else{
                                    //muevo los archivos
                                    /*$codigoProcedimiento = $this->metCodigoProcedimiento($data['idProcedimiento']);
                                    $RUTA_CARPETA = $RUTA.$codigoProcedimiento."/".$idMensaje."/";
                                    if(file_exists($RUTA_CARPETA) || @mkdir($RUTA_CARPETA)) {
                                        for ($i = 0; $i < count($archivos); $i++) {
                                            if(move_uploaded_file($archivos[$i]['RUTA'], $RUTA_CARPETA.$archivos[$i]['NOMBRE'])){
                                                //echo "ARCHVIVOS SUBIDOS";
                                            }else{
                                                //echo "No se pudieron moverlos archivos";
                                            }
                                        }
                                    }else {
                                        mkdir($RUTA_CARPETA, 0777, true);
                                        for ($i = 0; $i < count($archivos); $i++) {
                                            if(move_uploaded_file($archivos[$i]['RUTA'], $RUTA_CARPETA.$archivos[$i]['NOMBRE'])){
                                                //echo "ARCHVIVOS SUBIDOS";
                                            }else{
                                                //echo "No se pudieron moverlos archivos";
                                            }
                                        }
                                        $this->_db->commit();
                                        return $data['idProcedimiento'];
                                    }*/
                                    $this->_db->commit();
                                    return $data['idProcedimiento'];

                                }

                            }

                        }

                    }

                }

            //}
            
        //}

    }


    public function metResponderMensajeEnviar($data,$archivos=false)
    {
        #beginTransaction — Inicia una transacción
        $this->_db->beginTransaction();

        //ruta raiz para guardar archivos
        $RUTA = "/home/archivos_firma/";

        $secuencia = $this->metUltimaSecuenciaMensaje($data['idProcedimiento']);
        $secuencia = $secuencia + 1;
        $r_mensaje = $this->_db->prepare("
                    INSERT INTO
                        fe_c001_mensajes
                    SET 
                        fk_feb001_num_procedimiento = :fk_feb001_num_procedimiento,
                        fec_mensaje = :fec_mensaje,
                        fk_b001_num_empleado_emisor = :fk_b001_num_empleado_emisor,
                        fk_a004_num_dependencia_emisor = :fk_a004_num_dependencia_emisor,
                        ind_asunto_mensaje = :ind_asunto_mensaje,
                        ind_mensaje = :ind_mensaje,
                        ind_estado = :ind_estado,
                        num_secuencia = :num_secuencia,
                        ind_prioridad = :ind_prioridad,
                        fec_ultima_modificacion = NOW(),
                        fk_a018_num_seguridad_usuario = '$this->atIdUsuario'                   
                ");
        $r_mensaje->execute(array(
            'fk_feb001_num_procedimiento' => $data['idProcedimiento'],
            'fec_mensaje' => $data['fec_mensaje'],
            'fk_b001_num_empleado_emisor' => $data['idEmpleadoEmisor'],
            'fk_a004_num_dependencia_emisor' => $data['idDependenciaEmisor'],
            'ind_asunto_mensaje' => mb_strtoupper($data['ind_asunto_mensaje'],'utf8'),
            'ind_mensaje' => $data['ind_mensaje'],
            'ind_estado' => $data['ind_estado'],
            'ind_prioridad' => $data['ind_prioridad'],
            'num_secuencia' => $secuencia
        ));
        $error1 = $r_mensaje->errorInfo();
        if(!empty($error1[1]) && !empty($error1[2])){
            $this->_db->rollBack();
            return $error1;
        }else{
            $idMensaje= $this->_db->lastInsertId();
            $r_destinatarios = $this->_db->prepare(
                "INSERT INTO
                                      fe_c002_destinatarios
                                    SET 
                                      fk_c001_num_mensaje = :fk_c001_num_mensaje,
                                      fk_b001_num_empleado_receptor = :fk_b001_num_empleado_receptor,
                                      fk_a004_num_dependencia_receptor = :fk_a004_num_dependencia_receptor
                                    "
            );
            //cargo relacion mensajes leidos
            $r_mensaje_leido = $this->_db->prepare(
                "INSERT INTO
                                          fe_c004_mensaje_leido
                                        SET 
                                          fk_fec001_num_mensaje = :fk_fec001_num_mensaje,
                                          fk_b001_num_empleado_receptor = :fk_b001_num_empleado_receptor
                                        "
            );
            for ($i = 0; $i < count($data['fk_b001_num_empleado_receptor']); $i++) {
                $r_destinatarios->execute(array(
                    'fk_c001_num_mensaje' => $idMensaje,
                    'fk_b001_num_empleado_receptor' => $data['fk_b001_num_empleado_receptor'][$i],
                    'fk_a004_num_dependencia_receptor' => $this->metConsultarDependencia($data['fk_b001_num_empleado_receptor'][$i])
                ));
                $r_mensaje_leido->execute(array(
                    'fk_fec001_num_mensaje' => $idMensaje,
                    'fk_b001_num_empleado_receptor' => $data['fk_b001_num_empleado_receptor'][$i],
                ));
            }

            $error2 = $r_destinatarios->errorInfo();
            if(!empty($error2[1]) && !empty($error2[2])){
                $this->_db->rollBack();
                return $error2;
            }else{


                //registro en bd los archivos y guardo en carpeta
                if($archivos){
                    //sql para registrar archivos
                    $registrar_archivos = $this->_db->prepare(
                        "INSERT INTO
                                  fe_c003_archivos
                               SET 
                                  fk_c001_num_mensaje= $idMensaje,
                                  ind_nombre_archivo=:ind_nombre_archivo,
                                  num_peso_archivo=:num_peso_archivo,
                                  ind_ruta_archivo=:ind_ruta_archivo,
                                  ind_tipo_archivo=:ind_tipo_archivo,
                                  ind_extension_archivo=NULL,
                                  ind_nombre_descarga=:ind_nombre_descarga,
                                  ind_estado='EV',
                                  fec_ultima_modificacion=NOW(),
                                  fk_a018_num_seguridad_usuario='$this->atIdUsuario'                                                     
                               "
                    );
                    $codigoProcedimiento = $this->metCodigoProcedimiento($data['idProcedimiento']);
                    $RUTA_CARPETA = $RUTA.$codigoProcedimiento."/".$idMensaje."/";

                    for ($i = 0; $i < count($archivos); $i++) {
                        $registrar_archivos->execute(array(
                            'ind_nombre_archivo' => $archivos[$i]['NOMBRE'],
                            'num_peso_archivo' => $archivos[$i]['SIZE'],
                            'ind_ruta_archivo' => $RUTA_CARPETA,
                            'ind_tipo_archivo' => $archivos[$i]['TIPO'],
                            'ind_nombre_descarga' => $archivos[$i]['RUTA']
                        ));
                        if(file_exists($RUTA_CARPETA) || @mkdir($RUTA_CARPETA)) {
                            move_uploaded_file($archivos[$i]['RUTA'], $RUTA_CARPETA.$archivos[$i]['NOMBRE']);
                        }else {
                            mkdir($RUTA_CARPETA, 0777, true);
                            move_uploaded_file($archivos[$i]['RUTA'], $RUTA_CARPETA.$archivos[$i]['NOMBRE']);
                        }
                    }
                    $error4 = $registrar_archivos->errorInfo();
                    if(!empty($error4[1]) && !empty($error4[2])){
                        $this->_db->rollBack();
                        return $error4;
                    }else{
                        //guardo observaciones de los archivos anteriores
                        if($data['archivosR']){
                            $update = $this->_db->prepare(
                                "
                                    UPDATE 
                                          fe_c003_archivos
                                    SET
                                          ind_estado=:ind_estado,
                                          ind_comentario_archivo=:ind_comentario_archivo,
                                          fec_ultima_modificacion=NOW(),
                                          fk_a018_num_seguridad_usuario=$this->atIdUsuario    
                                     WHERE pk_num_archivo = :pk_num_archivo       
                                
                            ");

                            for ($i = 0; $i < count($data['archivosR']); $i++) {
                                if($data['a'][$i]==1){ $estado='AP'; }
                                if($data['r'][$i]==1){ $estado='RE'; }
                                $update->execute(array(
                                    ':ind_estado' => $estado,
                                    ':ind_comentario_archivo' => $data['comentario'][$i],
                                    ':pk_num_archivo' => $data['archivosR'][$i]
                                ));
                            }
                            $error5 = $update->errorInfo();
                            if(!empty($error5[1]) && !empty($error5[2])){
                                $this->_db->rollBack();
                                return $error5;
                            }else{
                                //actualizo el estatus del mensaje y procedimiento segun sea el caso
                                if($data['rechazar_mensaje']==1){ $ind_estado = 'RE'; }
                                if($data['aprobar_mensaje']==1){ $ind_estado = 'AP'; }
                                if($data['aprobar_completar']==1){ $ind_estado_p = 'CO'; $id_estado = 'AP'; }
                                $update_m = $this->_db->prepare(
                                    "
                                        UPDATE 
                                              fe_c001_mensajes
                                        SET
                                              ind_estado=:ind_estado,
                                              fec_ultima_modificacion=NOW(),
                                              fk_a018_num_seguridad_usuario=$this->atIdUsuario    
                                         WHERE pk_num_mensaje = :pk_num_mensaje       
                                    
                                    ");    
                                $update_p = $this->_db->prepare(
                                    "
                                        UPDATE 
                                              fe_b001_procedimiento
                                        SET
                                              ind_estado_procedimiento=:ind_estado_procedimiento,
                                              fec_ultima_modificacion=NOW(),
                                              fk_a018_num_seguridad_usuario=$this->atIdUsuario    
                                         WHERE pk_num_procedimiento = :pk_num_procedimiento       
                                    
                                    "); 

                                if($data['rechazar_mensaje']==1){
                                    $update_m->execute(array(
                                        ':ind_estado' => $ind_estado,
                                        ':pk_num_mensaje' => $data['idMensajeResponder']
                                    ));
                                }
                                elseif($data['aprobar_mensaje']==1){
                                    $update_m->execute(array(
                                        ':ind_estado' => $ind_estado,
                                        ':pk_num_mensaje' => $data['idMensajeResponder']
                                    ));
                                }
                                elseif($data['aprobar_completar']==1){
                                    $update_m->execute(array(
                                        ':ind_estado' => $ind_estado,
                                        ':pk_num_mensaje' => $data['idMensajeResponder']
                                    ));
                                    $update_p->execute(array(
                                        ':ind_estado_procedimiento' => $ind_estado_p,
                                        ':pk_num_procedimiento' => $data['idProcedimiento']
                                    ));                                    
                                }

                                $this->_db->commit();
                                return $data['idProcedimiento'];

                            }

                        }

                    }

                }else{

                     //actualizo el estatus del mensaje y procedimiento segun sea el caso
                    if($data['rechazar_mensaje']==1){ $ind_estado = 'RE'; }
                    if($data['aprobar_mensaje']==1){ $ind_estado = 'AP'; }
                    if($data['aprobar_completar']==1){ $ind_estado_p = 'CO'; $ind_estado = 'AP'; }
                    $update_m = $this->_db->prepare(
                        "
                            UPDATE 
                                  fe_c001_mensajes
                            SET
                                  ind_estado=:ind_estado,
                                  fec_ultima_modificacion=NOW(),
                                  fk_a018_num_seguridad_usuario=$this->atIdUsuario    
                             WHERE pk_num_mensaje = :pk_num_mensaje       
                        
                        ");    
                    $update_p = $this->_db->prepare(
                        "
                            UPDATE 
                                  fe_b001_procedimiento
                            SET
                                  ind_estado_procedimiento=:ind_estado_procedimiento,
                                  fec_ultima_modificacion=NOW(),
                                  fk_a018_num_seguridad_usuario=$this->atIdUsuario    
                             WHERE pk_num_procedimiento = :pk_num_procedimiento       
                        
                        "); 

                    if($data['rechazar_mensaje']==1){
                        $update_m->execute(array(
                            ':ind_estado' => $ind_estado,
                            ':pk_num_mensaje' => $data['idMensajeResponder']
                        ));
                    }
                    elseif($data['aprobar_mensaje']==1){
                        $update_m->execute(array(
                            ':ind_estado' => $ind_estado,
                            ':pk_num_mensaje' => $data['idMensajeResponder']
                        ));
                    }
                    elseif($data['aprobar_completar']==1){
                        $update_m->execute(array(
                            ':ind_estado' => $ind_estado,
                            ':pk_num_mensaje' => $data['idMensajeResponder']
                        ));
                        $update_p->execute(array(
                            ':ind_estado_procedimiento' => $ind_estado_p,
                            ':pk_num_procedimiento' => $data['idProcedimiento']
                        ));                                    
                    }

                    $this->_db->commit();
                    return $data['idProcedimiento'];

                }

            }

        }

    }


    public function metBuscarArchivosMensaje($idMensaje)
    {
        $con = $this->_db->query("
             SELECT
                *
             FROM
                vl_fe_archivos_mensaje
             WHERE
                fk_c001_num_mensaje = $idMensaje       
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        return $con->fetchAll();
    }


    public function metBuscarContenidoMensaje($idMensaje)
    {
        $con = $this->_db->query("
             SELECT
                ind_mensaje
             FROM
                fe_c001_mensajes
             WHERE
                pk_num_mensaje = $idMensaje       
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        return $con->fetch();
    }
    
    
    public function metBuscarDestinariosMensaje($idMensaje,$idReceptor)
    {
        $con = $this->_db->query("
                SELECT
                    fe_c002_destinatarios.fk_c001_num_mensaje,
                    fe_c002_destinatarios.fk_b001_num_empleado_receptor,
                    a003_persona.ind_cedula_documento,
                    CONCAT_WS(' ',a003_persona.ind_nombre1,a003_persona.ind_apellido1) AS nombre_receptor,
                    fe_c004_mensaje_leido.num_leido,
                    fe_c004_mensaje_leido.fec_leido
                FROM
                  fe_c002_destinatarios
                INNER JOIN rh_b001_empleado ON fe_c002_destinatarios.fk_b001_num_empleado_receptor = rh_b001_empleado.pk_num_empleado
                INNER JOIN a003_persona ON rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona
                INNER JOIN fe_c004_mensaje_leido ON fe_c002_destinatarios.fk_c001_num_mensaje = fe_c004_mensaje_leido.fk_fec001_num_mensaje
                WHERE
                    fe_c002_destinatarios.fk_c001_num_mensaje = $idMensaje   and fe_c002_destinatarios.fk_b001_num_empleado_receptor = $idReceptor
                GROUP BY fe_c002_destinatarios.fk_b001_num_empleado_receptor
    
           "
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        return $con->fetch();
    }


    public function metMarcarLeido($mensaje,$empleado)
    {
        $this->_db->beginTransaction();
        $consulta= $this->_db->prepare(
            "
            UPDATE
              fe_c004_mensaje_leido
            SET 
              num_leido = 1,
              fec_leido = NOW()
            WHERE fk_fec001_num_mensaje = $mensaje and fk_b001_num_empleado_receptor=$empleado
              ");
        $consulta->execute();
        $error1 = $consulta->errorInfo();
        if(!empty($error1[1]) && !empty($error1[2])){
            $this->_db->rollBack();
            return $error1;
        }else{
            $this->_db->commit();
            return 1;
        }
    }


}
