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

class certificadosFiiModelo extends Modelo
{
    private $atIdUsuario;

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

    public function metValidarCertificadoByFecha($empleado, $desde, $hasta, $cedula, $dependencia, $funcionario, $email, $cargo){
        $sql = "
        SELECT
            count(*) as cantidad 
        FROM
            fe_c008_certificadosfii 
        WHERE
            fk_rhb001_num_empleado = :empleado AND 
            ( 
                STR_TO_DATE(:desde, '%d-%m-%Y %H:%i:%s') BETWEEN DATE(fec_valido_desde) AND DATE(fec_valido_hasta) OR 
                STR_TO_DATE(:hasta, '%d-%m-%Y %H:%i:%s') BETWEEN DATE(fec_valido_desde) AND DATE(fec_valido_hasta) 
            )
            AND ind_cedula = :cedula
            AND ind_dependencia = :dependencia
            AND ind_funcionario = :funcionario
            AND ind_email = :email
            AND ind_cargo = :cargo
    ";

        $stmt = $this->_db->prepare($sql);
        $stmt->execute([
            ':empleado' => $empleado,
            ':desde' => $desde,
            ':hasta' => $hasta,
            ':cedula' => $cedula,
            ':dependencia' => $dependencia,
            ':funcionario' => $funcionario,
            ':email' => $email,
            ':cargo' => $cargo
        ]);

        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        return $result['cantidad'];
    }

    public function metListarCertificados($empleado)
    {

        if($empleado){
            $filtro = ' WHERE fe_c008_certificados.fk_rhb001_num_empleado = $empleado';
        }else{ $filtro = ''; }

        $cert = $this->_db->query("
            SELECT
            IF
	            ( fec_valido_hasta < NOW( ), 'Vencido', IF ( DATEDIFF( fe_c008_certificadosfii.fec_valido_hasta, CURDATE( ) ) <= 15 , 'Proximo a Vencer', 'Vigente' ) ) AS estatus_cert,
                fe_c008_certificadosfii.pk_num_certificadofii,
                fe_c008_certificadosfii.fec_valido_desde,
                fe_c008_certificadosfii.fec_valido_hasta,
                fe_c008_certificadosfii.ind_cedula,
                fe_c008_certificadosfii.num_estatus,
                fe_c008_certificadosfii.fec_ultima_modificacion,
                fe_c008_certificadosfii.fk_a018_num_seguridad_usuario,
                fe_c008_certificadosfii.ind_funcionario,
                a003_persona.ind_foto
            FROM
                fe_c008_certificadosfii
            INNER JOIN rh_b001_empleado ON rh_b001_empleado.pk_num_empleado = fe_c008_certificadosfii.fk_rhb001_num_empleado
            INNER JOIN a003_persona ON rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona
                $filtro
        ");
        $cert->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $cert->fetchAll();
        return $consulta;

    }

    public function metMostrarCertificado($idcert)
    {

        $this->_db->query("SET lc_time_names = 'es_ES'");

        $cert = $this->_db->query("
            SELECT
            IF
	            ( fec_valido_hasta < NOW( ), 'Vencido', IF ( DATEDIFF( fe_c008_certificadosfii.fec_valido_hasta, CURDATE( ) ) <= 15 , 'Proximo a Vencer', 'Vigente' ) ) AS estatus_cert,
                fe_c008_certificadosfii.pk_num_certificadofii,
                fe_c008_certificadosfii.fk_rhb001_num_empleado,
                fe_c008_certificadosfii.fec_valido_desde,
                fe_c008_certificadosfii.fec_valido_hasta,
                DATE_FORMAT(fe_c008_certificadosfii.fec_valido_desde,'%W, %e de %M, %Y %H:%i %p') as fec_valido_desde_format,
	            DATE_FORMAT(fe_c008_certificadosfii.fec_valido_hasta,'%W, %e de %M, %Y %H:%i %p') as fec_valido_hasta_format,  
                fe_c008_certificadosfii.ind_cedula,
                fe_c008_certificadosfii.num_estatus,
                fe_c008_certificadosfii.ind_funcionario,
                fe_c008_certificadosfii.ind_certificado,
                fe_c008_certificadosfii.ind_organismo,
                fe_c008_certificadosfii.ind_dependencia,
                fe_c008_certificadosfii.ind_email,
                fe_c008_certificadosfii.ind_cargo,
                a003_persona.ind_foto
            FROM
                fe_c008_certificadosfii
            INNER JOIN rh_b001_empleado ON rh_b001_empleado.pk_num_empleado = fe_c008_certificadosfii.fk_rhb001_num_empleado
            INNER JOIN a003_persona ON rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona
            WHERE fe_c008_certificadosfii.pk_num_certificadofii=$idcert
        ");
        $cert->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $cert->fetch();
        return $consulta;

    }

    public function metConsultarCertificado($cedula = false)
    {

        if($cedula){
            $filtro = ' WHERE a003_persona.ind_cedula_documento = "'.$cedula.'"';
        }else{ $filtro = ''; }

        $this->_db->query("SET lc_time_names = 'es_ES'");

        $cert = $this->_db->query("
            SELECT
            IF
	            ( fec_valido_hasta < NOW( ), 'Vencido', IF ( DATEDIFF( fe_c008_certificadosfii.fec_valido_hasta, CURDATE( ) ) <= 15 , 'Proximo a Vencer', 'Vigente' ) ) AS estatus_cert,
                fe_c008_certificadosfii.pk_num_certificadofii,
                fe_c008_certificadosfii.fk_rhb001_num_empleado,
                fe_c008_certificadosfii.fec_valido_desde,
                fe_c008_certificadosfii.fec_valido_hasta,
                DATE_FORMAT(fe_c008_certificadosfii.fec_valido_desde,'%W, %e de %M, %Y %H:%i %p') as fec_valido_desde_format,
	            DATE_FORMAT(fe_c008_certificadosfii.fec_valido_hasta,'%W, %e de %M, %Y %H:%i %p') as fec_valido_hasta_format,  
                fe_c008_certificadosfii.ind_cedula,
                fe_c008_certificadosfii.num_estatus,
                fe_c008_certificadosfii.ind_funcionario,
                fe_c008_certificadosfii.ind_certificado,
                a003_persona.ind_foto
            FROM
                fe_c008_certificadosfii
            INNER JOIN rh_b001_empleado ON rh_b001_empleado.pk_num_empleado = fe_c008_certificadosfii.fk_rhb001_num_empleado
            INNER JOIN a003_persona ON rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona
                $filtro
        ");
        $cert->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $cert->fetchAll();
        return $consulta;

    }

    public function metConsultarCertificadosFuncionarios($idEmpleado)
    {
        $cert = $this->_db->query("
            SELECT
                COUNT(*) as total
            FROM
                fe_c008_certificadosfii
                INNER JOIN rh_b001_empleado ON rh_b001_empleado.pk_num_empleado = fe_c008_certificadosfii.fk_rhb001_num_empleado
                INNER JOIN a003_persona ON rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona 
            WHERE
                fe_c008_certificadosfii.fk_rhb001_num_empleado = $idEmpleado
                AND IF
                (
                    fec_valido_hasta < NOW( ),
                    'Vencido',
                IF
                    ( DATEDIFF( fe_c008_certificadosfii.fec_valido_hasta, CURDATE( ) ) <= 15, 'Proximo a Vencer', 'Vigente' ) 
                ) = 'Vencido' AND fe_c008_certificadosfii.num_estatus = 1
        ");
        $cert->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $cert->fetch();
        return $consulta['total'];
    }

    public function metConsultarCertificadosFuncionariosVencidos($idEmpleado)
    {
        $cert = $this->_db->query("
            SELECT
                pk_num_certificadofii
            FROM
                fe_c008_certificadosfii
                INNER JOIN rh_b001_empleado ON rh_b001_empleado.pk_num_empleado = fe_c008_certificadosfii.fk_rhb001_num_empleado
                INNER JOIN a003_persona ON rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona 
            WHERE
                fe_c008_certificadosfii.fk_rhb001_num_empleado = $idEmpleado AND fe_c008_certificadosfii.num_estatus = 1
                AND IF
                (
                    fec_valido_hasta < NOW( ),
                    'Vencido',
                IF
                    ( DATEDIFF( fe_c008_certificadosfii.fec_valido_hasta, CURDATE( ) ) <= 15, 'Proximo a Vencer', 'Vigente' ) 
                ) = 'Vencido'
        ");
        $cert->setFetchMode(PDO::FETCH_ASSOC);
        $consulta = $cert->fetchAll();
        return $consulta;
    }


    public function metBuscarIdEmpleado($cedula)
    {
        $consulta = $this->_db->query("
            SELECT
                pk_num_empleado 
            FROM
                rh_b001_empleado
                INNER JOIN a003_persona ON rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona 
            WHERE
                a003_persona.ind_cedula_documento = '$cedula'
        ");
        $consulta->setFetchMode(PDO::FETCH_ASSOC);
        $r = $consulta->fetch();
        return $r['pk_num_empleado'];
    }

    public function metBuscarFotoEmpleado($cedula)
    {
        $consulta = $this->_db->query("
            SELECT
                a003_persona.ind_foto
            FROM
                rh_b001_empleado
                INNER JOIN a003_persona ON rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona 
            WHERE
                a003_persona.ind_cedula_documento = '$cedula'
        ");
        $consulta->setFetchMode(PDO::FETCH_ASSOC);
        $r = $consulta->fetch();
        return $r['ind_foto'];
    }



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

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

        $insert = $this->_db->prepare("
        INSERT INTO
            fe_c008_certificadosfii
        SET 
            fec_valido_desde = :fec_valido_desde,
            fec_valido_hasta = :fec_valido_hasta,
            ind_password=:ind_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,
            ind_certificado = :ind_certificado,
            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' => $data['pass'],
            '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'],
            'ind_certificado' => $data['ind_certificado']
        ));
        $error1 = $insert->errorInfo();
        $idCert = $this->_db->lastInsertId();
        if(!empty($error1[1]) && !empty($error1[2])){
            $this->_db->rollBack();
            return $error1;
        }else{


            if($data['data_certificado']){

                $archivos = $data['data_certificado'];

                if(file_exists($RUTA) || @mkdir($RUTA)) {
                    move_uploaded_file($archivos['tmp_name'], $RUTA.$archivos['name']);
                }else {
                    mkdir($RUTA, 0777, true);
                    system('chmod 777 '.$RUTA);
                    move_uploaded_file($archivos['tmp_name'], $RUTA.$archivos['name']);
                }

                $this->_db->commit();
                return $idCert;

            }

        }

    }

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

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

        $insert = $this->_db->prepare("
        INSERT INTO
            fe_c008_certificadosfii
        SET 
            fec_valido_desde = :fec_valido_desde,
            fec_valido_hasta = :fec_valido_hasta,
            ind_password=:ind_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,
            ind_certificado = :ind_certificado,
            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' => $data['pass'],
            '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'],
            'ind_certificado' => $data['ind_certificado']
        ));
        $error1 = $insert->errorInfo();
        $idCert = $this->_db->lastInsertId();
        if(!empty($error1[1]) && !empty($error1[2])){
            $this->_db->rollBack();
            return $error1;
        }else{


            if($data['data_certificado']){

                $archivos = $data['data_certificado'];

                if(file_exists($RUTA) || @mkdir($RUTA)) {
                    move_uploaded_file($archivos['tmp_name'], $RUTA.$archivos['name']);
                }else {
                    mkdir($RUTA, 0777, true);
                    system('chmod 777 '.$RUTA);
                    move_uploaded_file($archivos['tmp_name'], $RUTA.$archivos['name']);
                }

                //consultamos los certificacdos viejos vencidos
                $consulta = $this->metConsultarCertificadosFuncionariosVencidos($data['fk_rhb001_num_empleado']);
                $update = $this->_db->prepare("
                    UPDATE
                        fe_c008_certificadosfii
                    SET 
                        num_estatus = 0,
                        fec_ultima_modificacion = NOW(),
                        fk_a018_num_seguridad_usuario = '$this->atIdUsuario'   
                    WHERE pk_num_certificadofii = :pk_num_certificadofii                   
                ");
                foreach ($consulta as $cert){
                    $update->execute(array(
                        ':pk_num_certificadofii' => $cert['pk_num_certificadofii']
                        )
                    );
                }
                $error = $update->errorInfo();
                if(!empty($error[1]) && !empty($error[2])){
                    $this->_db->rollBack();
                    return $error;
                }else{
                    $this->_db->commit();
                    return $idCert;
                }
            }
        }
    }


    public function metModificarCertificadoFii($idCert,$estatus)
    {
        $this->_db->beginTransaction();

        $update = $this->_db->prepare("
        UPDATE
            fe_c008_certificadosfii
        SET 
            num_estatus = $estatus,
            fec_ultima_modificacion = NOW(),
            fk_a018_num_seguridad_usuario = '$this->atIdUsuario'   
        WHERE pk_num_certificadofii = $idCert                    
        ");

        $update->execute();

        $error = $update->errorInfo();

        if(!empty($error[1]) && !empty($error[2])){
            $this->_db->rollBack();
            return $error;
        }else{
            $this->_db->commit();
            return $idCert;
        }

    }

    public function metListarDependencias()
    {
        $dependencias = $this->_db->query("
                SELECT
                  dependencia.*
                FROM
                  a004_dependencia AS dependencia
                INNER JOIN
                  a019_seguridad_dependencia AS seguridad ON seguridad.fk_a004_num_dependencia = dependencia.pk_num_dependencia
                LEFT JOIN
                  rh_c076_empleado_organizacion AS organizacion ON dependencia.pk_num_dependencia = organizacion.fk_a004_num_dependencia
                WHERE 
                  (
                  seguridad.fk_a018_num_seguridad_usuario = '$this->atIdUsuario' 
                  AND seguridad.fk_a015_num_seguridad_aplicacion = '21'
                  ) 
                  OR dependencia.pk_num_dependencia = organizacion.fk_a004_num_dependencia
                  GROUP BY dependencia.pk_num_dependencia
                ");
        $dependencias->setFetchMode(PDO::FETCH_ASSOC);
        return $dependencias->fetchAll();
    }


    public function metVerificarPassword($pass,$idcrt)
    {
        $pass = Hash::metObtenerHash($pass);

        $consulta = $this->_db->prepare("
            SELECT
                pk_num_certificadofii
            FROM
                fe_c008_certificadosfii
            WHERE
                ind_password = '$pass' and pk_num_certificadofii = '$idcrt'
        ");
        $consulta->execute();
        $n = $consulta->rowCount();
        return $n;


    }

}
