<?php
/****************************************************************************************
 * DEV: CONTRALORIA DEL ESTADO.
 * MODULO: Prueba
 * PROGRAMADORES.________________________________________________________________________
 * | # | NOMBRE.              | CORREO.                              | TELEFONO.
 * | 1 | Fernando Mendoza     | dt.ait.programador1@cgesucre.gob.ve  | 0424-8942068
 * | 2 |
 * |_____________________________________________________________________________________
 * VERSION
 *
 * |          PROGRAMADOR                  |          FECHA          |       VERSION      |
 * |               #1                      |        02-02-2016       |         1.0        |
 * |                                       |                         |                    |
 * |_______________________________________|_________________________|____________________|
 *****************************************************************************************/


class controlAsistenciaModelo extends Modelo
{
    private $atIdUsuario;

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

    }

    #permite mostrar los datos de un biometrico
    public function metMostrarBiometrico($idBiometrico)
    {
        #ejecuto la consulta a la base de datos
        $con = $this->_db->query(
            "SELECT * FROM rh_c111_biometricos WHERE pk_num_biometrico=$idBiometrico"
        );
        #devuelvo la consulta para ser usada en php con formato json.
        #PDO::FETCH_ASSOC: devuelve un array indexado por los nombres de las columnas del conjunto de resultados.
        $con->setFetchMode(PDO::FETCH_ASSOC);
        return $con->fetch();
    }

    #permite consultar la ip del biometrico
    public function metConsultarIp($id)
    {
        #ejecuto la consulta a la base de datos
        $con = $this->_db->query(
            "SELECT ind_ip,ind_biometrico,ind_tipo FROM rh_c111_biometricos WHERE pk_num_biometrico=$id"
        );
        $con->setFetchMode(PDO::FETCH_ASSOC);
        return $con->fetch();
    }

    //registra el nuevo biometrico
    public function metRegistrarBiometrico($ip,$biometrico,$serial,$tipo,$estatus)
    {
        #beginTransaction — Inicia una transacción
        $this->_db->beginTransaction();

        $sth = $this->_db->prepare("SELECT ind_ip FROM rh_c111_biometricos WHERE ind_ip= :cond");
        $sth->bindParam(':cond',$ip, PDO::PARAM_STR);
        $sth->execute();

        if ($sth->rowCount() > 0) {

            return 2;

        } else {

            #prepare — Prepara una sentencia para su ejecución y devuelve un objeto sentencia
            $NuevoRegistro = $this->_db->prepare(
                "INSERT INTO
                rh_c111_biometricos
                (ind_biometrico,ind_serial,ind_ip,ind_tipo,num_estatus,fec_ultima_modificacion,fk_a018_num_seguridad_usuario)
                VALUES
                (:ind_biometrico, :ind_serial, :ind_ip,:ind_tipo,:num_estatus,NOW(),'$this->atIdUsuario')
              ");

            #execute — Ejecuta una sentencia preparada
            $NuevoRegistro->execute(array(
                ':ind_biometrico' => $biometrico,
                ':ind_serial' => $serial,
                ':ind_ip' => $ip,
                ':ind_tipo' => $tipo,
                ':num_estatus' => $estatus
            ));

            $error = $NuevoRegistro->errorInfo();

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

        }

    }
 
    public function metConsultarUltimo($pk){
        $consulta = $this->_db->query(
            "SELECT * FROM rh_c112_marcas_asistencias WHERE fk_rhc111_num_biometrico = '$pk' ORDER BY fec_fecha DESC, fec_hora DESC LIMIT 1;"
        );

        $consulta->setFetchMode(PDO::FETCH_ASSOC);
        return $consulta->fetch();
    }

    public function metRegistrarMarcas($marcas,$biometrico,$tipo,$id)
    {
       $this->_db->beginTransaction();

        foreach ($marcas as $attItem) {

            $cedula = $attItem['id'];
            $fecha  = date("Y-m-d",strtotime($attItem['timestamp']));
            $hora   = date("H:i:s",strtotime($attItem['timestamp']));
          
            $Registro = $this->_db->prepare(
                "INSERT INTO
                        rh_c112_marcas_asistencias
                        (ind_cedula,fec_fecha,fec_hora,ind_biometrico,ind_tipo,fec_ultima_modificacion,fk_a004_num_dependencia,fk_rhc111_num_biometrico)
                        VALUES
                        (:ind_cedula, :fec_fecha, :fec_hora,:ind_biometrico,:ind_tipo,NOW(),
                        (SELECT fk_a004_num_dependencia FROM vl_rh_persona_empleado_datos_laborales WHERE ind_cedula_documento=$cedula),
                        :fk_rhc111_num_biometrico)
                        ");

            
            $Registro->execute(array(
                ':ind_cedula' => $cedula,
                ':fec_fecha' => $fecha,
                ':fec_hora' => $hora,
                ':ind_biometrico' => $biometrico,
                ':ind_tipo' => $tipo,
                ':fk_rhc111_num_biometrico' => $id
            ));
            $error = $Registro->errorInfo();
        }
        if(!empty($error[1]) && !empty($error[2])){
            $this->_db->rollBack();
            return $error;
        }else{
            $this->_db->commit();
            return 1;
        }
    } 
        
   
    public function metModificarBiometrico($idBiometrico,$ip,$biometrico,$serial,$tipo,$estatus)
    {
        #beginTransaction — Inicia una transacción
        $this->_db->beginTransaction();

        #prepare — Prepara una sentencia para su ejecución y devuelve un objeto sentencia
        $ModRegistro=$this->_db->prepare(
            "UPDATE
              rh_c111_biometricos
            SET
              ind_biometrico=:ind_biometrico,
              ind_serial=:ind_serial,
              ind_ip=:ind_ip,
              ind_tipo=:ind_tipo,
              num_estatus=:num_estatus,              
              fec_ultima_modificacion=NOW(),
              fk_a018_num_seguridad_usuario='$this->atIdUsuario'
            WHERE
            pk_num_biometrico='$idBiometrico'
            "
        );

        #execute — Ejecuta una sentencia preparada
        $ModRegistro->execute(array(
            ':ind_biometrico' => $biometrico,
            ':ind_serial' => $serial,
            ':ind_ip' => $ip,
            ':ind_tipo' => $tipo,
            ':num_estatus' => $estatus
        ));

        $error = $ModRegistro->errorInfo();

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

    public function metListarBiometricos()
    {
        #ejecuto la consulta a la base de datos
        $con = $this->_db->query(
            "SELECT * FROM rh_c111_biometricos WHERE num_estatus=1"
        );
        #devuelvo la consulta para ser usada en php con formato json.
        #PDO::FETCH_ASSOC: devuelve un array indexado por los nombres de las columnas del conjunto de resultados.
        $con->setFetchMode(PDO::FETCH_ASSOC);
        return $con->fetchAll();
    }

    public function metConsultarCedulas($array)
    {
        $consulta = $this->_db->query(
            "select ind_cedula_documento from vl_rh_persona_empleado where pk_num_empleado IN ($array)"
        );
        $consulta->setFetchMode(PDO::FETCH_ASSOC);
        return $consulta->fetchAll();
    }

    public function metConsultarMarcas($cedula=false,$fecha_ini,$fecha_fin,$dependencia=false,$tipo)
    {
        if($tipo==1){
            $consulta = $this->_db->query(
                "select * from vl_rh_asistencias where ind_cedula = '$cedula' and fec_fecha >= '$fecha_ini' and fec_fecha <= '$fecha_fin' and visible=1"
            );
            $consulta->setFetchMode(PDO::FETCH_ASSOC);
            return $consulta->fetchAll();
        }
        else if($tipo==2){
            $consulta = $this->_db->query(
                "select * from vl_rh_asistencias where fec_fecha >= '$fecha_ini' and fec_fecha <= '$fecha_fin' and visible=1"
            );
            $consulta->setFetchMode(PDO::FETCH_ASSOC);
            return $consulta->fetchAll();
        }
        else if($tipo==3){
            $consulta = $this->_db->query(
                "select * from vl_rh_asistencias where fec_fecha >= '$fecha_ini' and fec_fecha <= '$fecha_fin' and pk_num_dependencia=$dependencia and visible=1"
            );
            $consulta->setFetchMode(PDO::FETCH_ASSOC);
            return $consulta->fetchAll();
        }
        if($tipo==4){
            $consulta = $this->_db->query(
                "select * from vl_rh_asistencias where ind_cedula = '$cedula' and fec_fecha >= '$fecha_ini' and fec_fecha <= '$fecha_fin' and pk_num_dependencia=$dependencia and visible=1"
            );
            $consulta->setFetchMode(PDO::FETCH_ASSOC);
            return $consulta->fetchAll();
        }

    }

    public function metConsultaNombreDep($dep)
    {
        $consulta = $this->_db->query(
            "select ind_dependencia from a004_dependencia where pk_num_dependencia=$dep"
        );
        $consulta->setFetchMode(PDO::FETCH_ASSOC);
        $data = $consulta->fetch();
        return $data['ind_dependencia'];
    }

    #permite transferir los eventos del archivo Excel Ods a la base de datos para procesarlos
    public function metTransferirEventos($eventos)
    {

        $this->_db->beginTransaction();
        #inserto eventos
        $registro = $this->_db->prepare(
            "INSERT INTO
                rh_c104_transferencia_eventos
             SET
                fec_fecha=:fec_fecha,
                fec_hora=:fec_hora,
                ind_evento=:ind_evento,
                ind_cedula_empleado=:ind_cedula_empleado
            "
        );

        foreach($eventos as $registros){

            $fecha = explode("/",$registros['fecha']);

            $registro->execute(array(
                'fec_fecha' => $fecha[2]."-".$fecha[1]."-".$fecha[0],
                'fec_hora' => $registros['hora'],
                'ind_evento' => $registros['evento'],
                'ind_cedula_empleado' => $registros['cedula']
            ));

        }
        $error = $registro->errorInfo();

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


    }

    #permite leer los datos transferidos y almacenarlos relacionados a cada empleado
    public function metControlAsistencia()
    {

        $this->_db->beginTransaction();

        #consulto empleados
        $con =  $this->_db->query("
            SELECT
                me.pk_num_empleado,
                mp.pk_num_persona,
                mp.ind_cedula_documento,
                CONCAT_WS(' ',mp.ind_nombre1,mp.ind_nombre2,mp.ind_apellido1,mp.ind_apellido2) AS nombre_empleado,
                d.pk_num_dependencia,
                d.ind_dependencia,
                rh_c063_puestos.ind_descripcion_cargo
            FROM
                rh_b001_empleado AS me
            INNER JOIN a003_persona AS mp ON mp.pk_num_persona = me.fk_a003_num_persona
            INNER JOIN rh_c076_empleado_organizacion AS mo ON me.pk_num_empleado = mo.fk_rhb001_num_empleado
            INNER JOIN a004_dependencia AS d ON d.pk_num_dependencia = mo.fk_a004_num_dependencia
            INNER JOIN rh_c005_empleado_laboral ON me.pk_num_empleado = rh_c005_empleado_laboral.fk_rhb001_num_empleado
            INNER JOIN rh_c063_puestos ON rh_c063_puestos.pk_num_puestos = rh_c005_empleado_laboral.fk_rhc063_num_puestos_cargo
            WHERE me.num_estatus =1
        ");

        $con->setFetchMode(PDO::FETCH_ASSOC);
        $resultado = $con->fetchAll();

        #ciclo de empleados para verificar y procesar los eventos transferidos
        foreach($resultado as $registros){

            $empleado = $registros['pk_num_empleado'];
            $cedula   = $registros['ind_cedula_documento'];

            $consulta = $this->_db->query("
                select * from rh_c104_transferencia_eventos WHERE ind_cedula_empleado = '$registros[ind_cedula_documento]'
            ");
            $consulta->setFetchMode(PDO::FETCH_ASSOC);
            $resultado2 = $consulta->fetchAll();

            $hora='';

            $registro = $this->_db->prepare(
                "INSERT INTO
                    rh_c105_controlasistencia
                 SET
                    fk_rhb001_num_empleado=:fk_rhb001_num_empleado,
                    ind_cedula_empleado=:ind_cedula_empleado,
                    fec_fecha=:fec_fecha,
                    fec_hora=:fec_hora,
                    fec_fecha_format=:fec_fecha_format,
                    fec_hora_format=:fec_hora_format,
                    ind_evento=:ind_evento,
                    ind_estado=:ind_estado,
                    fec_ultima_modificacion=NOW(),
                    fk_a018_num_seguridad_usuario='$this->atIdUsuario'
                "
                );

            foreach($resultado2 as $registros2){

                    $auxf = explode("-",$registros2['fec_fecha']);
                    $auxh = $registros2['fec_hora'];

                    $fec_fecha = $auxf[2]."-".$auxf[1]."-".$auxf[0];
                    $fec_hora  = strftime('%I:%M:%S %P',strtotime($auxh));
                    $fec_fecha_format = $registros2['fec_fecha'];
                    $fec_hora_format  = $registros2['fec_hora'];
                    $evento = $registros2['ind_evento'];
                    $estado = 'S';

                    $registro->execute(array(
                        'fk_rhb001_num_empleado' => $registros['pk_num_empleado'],
                        'ind_cedula_empleado' => $registros['ind_cedula_documento'],
                        'fec_fecha' => $fec_fecha,
                        'fec_hora' => $fec_hora,
                        'fec_fecha_format' => $fec_fecha_format,
                        'fec_hora_format' => $fec_hora_format,
                        'ind_evento' => $evento,
                        'ind_estado' => $estado
                    ));

            }//fin foreach

            $error = $registro->errorInfo();

        }//fin foreach

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

    }

    #permite listar los eventos pendientes por procesar
    public function metEventosPorProcesar($sql)
    {
        $con =  $this->_db->query($sql);

        $con->setFetchMode(PDO::FETCH_ASSOC);

        return $con->fetchAll();
    }


    #procesar los eventos
    public function metProcesarEventos()
    {

        $this->_db->beginTransaction();

        $procesar = $this->_db->prepare(
            "UPDATE
                    rh_c105_controlasistencia
                 SET
                    ind_estado=:ind_estado,
                    fec_ultima_modificacion=NOW(),
                    fk_a018_num_seguridad_usuario='$this->atIdUsuario'
                 WHERE ind_estado='S'
            "
        );

        $procesar->execute(array(
            'ind_estado' => 'P'
        ));

        $error = $procesar->errorInfo();

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

            $vaciar = $this->_db->prepare(
                "TRUNCATE TABLE rh_c104_transferencia_eventos"
            );
            $vaciar->execute();

            return 1;
        }

    }



}//fin clase
