<?php class model_users extends CI_Model{

	private $table_name	= 'sec_usuarios';			// user accounts

	public function can_log_in()
	{
	
	$this->db->where('username',$this->input->post('username'));
	$this->db->where('activo',1);
	$this->db->where('bloqueado',0);
	$this->db->where('fecha_vencimiento_password>=now()');
	
	$query=$this->db->get($this->table_name);
	if($query->num_rows()==1){
		$row = $query->row();
		$passdec = $this->encrypt->decode($row->password);
		if ($passdec == $this->input->post('password')){
			$data = array( 
			'fecha_acceso' => date("Y-m-d H:i:s"), 
			'ip_acceso' => $this->session->userdata('ip_address')
			);
			$this->db->where('id', $row->id);
			$this->db->update($this->table_name, $data);			
			return true;	
		}else{
			return false;
		}	
	}else{
		return false;
	}
	} 

	public function can_access($id,$controler,$action)
	{
		$this->db->where('u.id',$id);
		$this->db->where('controlador',$controler);		
		$this->db->where('accion',$action);		
		$this->db->where('p.activo',1);
		$from = 'sec_usuarios u left join sec_usuarios_perfiles up on u.id = up.id_usuario ';
		$from.= ' left join sec_perfiles_permisos pp on up.id_perfil = pp.id_perfil left join sec_permisos p on pp.id_permiso = p.id';
		$this->db->from($from);
		$query=$this->db->get();
		if ($query->num_rows() > 0){ 
			return true;   // Tiene Acceso
		} else {
			return false;
		}
	} 	
	
	function get_username ($id)
	{
		$this->db->where('id', $id);
		$query = $this->db->get($this->table_name);
		$row = $query->row();
		if ($query->num_rows() == 1) return $row->username;
		return NULL;
	}


	function get_user_by_username ($username)
	{
		$txtSelect = "*, (select lenguaje from sec_idioma where idioma = sec_idioma.nombre)as lenguaje";
		$txtSelect .= ", (select printable_name from countries where id_pais = id_country)as pais";		
		$txtSelect .= ",(select GROUP_CONCAT(tipo ORDER BY tipo SEPARATOR ', ') FROM usuarios_eap ue where ue.id_usuario = sec_usuarios.id) as usuario_tipos_id";
		$this->db->select($txtSelect,FALSE);
		$this->db->where('LOWER(username)=', strtolower($username));
		$query = $this->db->get($this->table_name);
		if ($query->num_rows() == 1) return $query->row();
		return NULL;
	}

	function get_user_by_username_email ($user)
	{
		$txtSelect = "*, (select lenguaje from sec_idioma where idioma = sec_idioma.nombre)as lenguaje";
		$txtSelect .= ", (select printable_name from countries where id_pais = id_country)as pais";		
		$txtSelect .= ",(select GROUP_CONCAT(tipo ORDER BY tipo SEPARATOR ', ') FROM usuarios_eap ue where ue.id_usuario = sec_usuarios.id) as usuario_tipos_id";
		$this->db->select($txtSelect,FALSE);
		$this->db->where('LOWER(username)=', strtolower($user));
		$this->db->or_where('LOWER(email)=', strtolower($user));
		$query = $this->db->get($this->table_name);
		if ($query->num_rows() == 1) return $query->row();
		return NULL;
	}
	
	function set_password ($id, $password, $change)
	{
		if(isset($id) & isset($password)){
			$this->load->library('encrypt');
			$data = array( 
			'password' => $this->encrypt->encode($password),
			'fecha_modificacion' => date("Y-m-d H:i:s"), 
			'fecha_vencimiento_password' => date("Y-m-d H:i:s", strtotime("+3 Months")),
			'cambio_password' => $change,
			'id_usuario_modificacion' => $this->session->userdata('usuario_id')
			);
			$this->db->where('id', $id);
			$this->db->update($this->table_name, $data);	
		
			// Guarda en LOG
			$historial = "Password@@??@@NUEVA||";
			$historial .= "Fecha Vencimiento@@@@".date("Y-m-d H:i:s", strtotime("+3 Months"))."||";
			$historial .= "Cambio Password@@??@@".($change==1?"SI":"NO")."||";
			$data_log = array(
				'id_usuario' => $id,
				'fecha' => date("Y-m-d H:i:s"), 
				'modificador' => $this->session->userdata('usuario_nombre_apellido'),	
				'modificaciones' => $historial);		
			$this->set_user_log($data_log);
					
			return true;
		} else {
			return false;
		}
	}
	
	
	function update_login_info ($id)
	{
		$data = array( 
		'fecha_acceso' => date("Y-m-d H:i:s"), 
		'ip_acceso' => $this->session->userdata('ip_address')
		);
		$this->db->where('id', $id);
		$this->db->update($this->table_name, $data);			

	}
	
	function active_user ($id)
	{
		$data = array( 
		'activo' => true,
		'fecha_modificacion' => date("Y-m-d H:i:s"), 
		'id_usuario_modificacion' => $this->session->userdata('usuario_id')		
		);
		$this->db->where('id', $id);
		$this->db->update($this->table_name, $data);			
		$resultado = ($this->db->affected_rows() >0);
		// Set Estado2 de usuarios_eap
		$this->active_usereap_by_type($id);
		// Guarda en LOG
		$historial = "Estado@@INACTIVO@@ACTIVO||";
		$data_log = array(
			'id_usuario' => $id,
			'fecha' => date("Y-m-d H:i:s"), 
			'modificador' => $this->session->userdata('usuario_nombre_apellido'),	
			'modificaciones' => $historial);		
		$this->set_user_log($data_log);

		return $resultado;

		
	}

	function inactive_user ($id)
	{
		$data = array( 
		'activo' => false,
		'fecha_modificacion' => date("Y-m-d H:i:s"), 
		'id_usuario_modificacion' => $this->session->userdata('usuario_id')		
		);
		$this->db->where('id', $id);
		$this->db->update($this->table_name, $data);			
		$resultado = ($this->db->affected_rows() >0);
		// Set Estado2 de usuarios_eap
		$this->inactive_usereap_by_type($id);
		// Guarda en LOG
		$historial = "Estado@@ACTIVO@@INACTIVO||";
		$data_log = array(
			'id_usuario' => $id,
			'fecha' => date("Y-m-d H:i:s"), 
			'modificador' => $this->session->userdata('usuario_nombre_apellido'),	
			'modificaciones' => $historial);		
		$this->set_user_log($data_log);
		return $resultado;
		
	}

	function lock_user ($id,$motivo="Wrong_Password")
	{
		$data = array( 
		'bloqueado' => true
		);
		$this->db->where('id', $id);
		$this->db->update($this->table_name, $data);			
		$resultado = ($this->db->affected_rows() >0);
		// Guarda en LOG
		$historial = "Bloqueado@@?@@SI||";
		$data_log = array(
			'id_usuario' => $id,
			'fecha' => date("Y-m-d H:i:s"), 
			'modificador' => "LOGIN",	
			'modificaciones' => $historial);		
		$this->set_user_log($data_log);
		return $resultado;
	}

	function unlock_user ($id)
	{
		$data = array( 
		'bloqueado' => false,
		'fecha_modificacion' => date("Y-m-d H:i:s"), 
		'id_usuario_modificacion' => $this->session->userdata('usuario_id')
		);
		$this->db->where('id', $id);
		$this->db->update($this->table_name, $data);			
		$resultado = ($this->db->affected_rows() >0);
		// Guarda en LOG
		$historial = "Bloqueado@@SI@@NO||";
		$data_log = array(
			'id_usuario' => $id,
			'fecha' => date("Y-m-d H:i:s"), 
			'modificador' => $this->session->userdata('usuario_nombre_apellido'),	
			'modificaciones' => $historial);		
		$this->set_user_log($data_log);
		return $resultado;
	}

	
	public function get_users($limit=100,$start=0,$filtro,$data_f, $count=false)
	{
		// FILTROS		
		if ($filtro){
			if ($data_f['nombre'] != '') {
				$txtWhere = "(nombre like '%".$this->db->escape_like_str($data_f['nombre'])."%' or apellido like '%".$this->db->escape_like_str($data_f['nombre'])."%')";
				$this->db->where($txtWhere,null);
				}		
			if ($data_f['username'] != '') {$this->db->where('username', $data_f['username']);}		
			if ($data_f['email'] != '') {$this->db->where('email', $data_f['email']);}	
			if ($data_f['id_usuario_tipo'] != '') {
				$txtWhere = 'EXISTS (select * from usuarios_eap where tipo = '.$data_f['id_usuario_tipo'].' and id_usuario = sec_usuarios.id)';
				$this->db->where($txtWhere,null, false);
				}
			if ($data_f['id_perfil'] != '') {
				$txtWhere = 'EXISTS (select * from sec_usuarios_perfiles where id_perfil = '.$data_f['id_perfil'].' and id_usuario = sec_usuarios.id)';
				$this->db->where($txtWhere,null, false);
				}				
			if ($data_f['activo'] != '') {$this->db->where('activo', $data_f['activo']);}	
			if ($data_f['bloqueado'] != '') {$this->db->where('bloqueado', $data_f['bloqueado']);}	
			if ($data_f['vencido'] == '1') {$this->db->where('fecha_vencimiento_password < now()');}	
			if ($data_f['vencido'] == '0') {$this->db->where('fecha_vencimiento_password >= now()');}	
			if ($data_f['id_pais'] != '') {$this->db->where('id_pais', $data_f['id_pais']);}	
			
		}
		// $start = $this->input->post('pagina');
		if ($count) {
			return $this->db->count_all_results($this->table_name);
		} else {
			$txtSelect = "*";
			$txtSelect = $txtSelect.",(select GROUP_CONCAT(t.NOMBRE ORDER BY t.NOMBRE SEPARATOR ', ') FROM usuarios_eap ue left join usuarios_tipo t on ue.tipo = t.id where ue.id_usuario = sec_usuarios.id) as usuario_tipos";
			$txtSelect = $txtSelect.", (select GROUP_CONCAT(NOMBRE ORDER BY NOMBRE SEPARATOR ', ') FROM sec_usuarios_perfiles up left join sec_perfiles p on up.id_perfil = p.id where up.id_usuario = sec_usuarios.id) as usuario_perfiles
";
			$this->db->limit($limit,$start);
			$this->db->select($txtSelect, FALSE);
			$this->db->from($this->table_name);
			$this->db->order_by('nombre');
			$query=$this->db->get();
			return $query->result_array();
		}
	} 
	
	
	public function get_user($id)
	{

		$txtSelect = "*, (select username from sec_usuarios u where u.id=sec_usuarios.id_usuario_creacion) as nombre_usuario_creacion";
		$txtSelect = $txtSelect.", (select username from sec_usuarios u where u.id=sec_usuarios.id_usuario_modificacion) as nombre_usuario_modificacion";
		$txtSelect = $txtSelect.",(select GROUP_CONCAT(t.NOMBRE ORDER BY t.NOMBRE SEPARATOR ', ') FROM usuarios_eap ue left join usuarios_tipo t on ue.tipo = t.id where ue.id_usuario = sec_usuarios.id) as usuario_tipos";
		$txtSelect = $txtSelect.",(select GROUP_CONCAT(tipo ORDER BY tipo SEPARATOR ', ') FROM usuarios_eap ue where ue.id_usuario = sec_usuarios.id) as usuario_tipos_id";
		$txtSelect = $txtSelect.", (select GROUP_CONCAT(NOMBRE ORDER BY NOMBRE SEPARATOR ', ') FROM sec_usuarios_perfiles up left join sec_perfiles p on up.id_perfil = p.id where up.id_usuario = sec_usuarios.id) as usuario_perfiles";
		$txtSelect = $txtSelect.", (select GROUP_CONCAT(id_perfil) FROM sec_usuarios_perfiles where id_usuario = sec_usuarios.id) as usuario_perfiles_id";
		$txtSelect = $txtSelect.", (select printable_name from countries where id_pais = id_country)as pais";		
		
		$this->db->select($txtSelect, FALSE);
		$this->db->from($this->table_name);
		$this->db->where('id', $id);		
		$query=$this->db->get();
		return $query->row_array();
		
	}

	public function set_user($id,$data,$mode=null)
	{
		if ($mode == 'insert') {
			$this->db->insert($this->table_name, $data);
			return $this->db->insert_id();
		}else{
			$this->db->where('id', $id);
			return $this->db->update($this->table_name, $data);
		}
	}

	public function set_user_profiles($id,$data)
	{
		$this->db->where('id_usuario', $id);
		$this->db->delete('sec_usuarios_perfiles'); 

		$resultado = true;
		if (!empty($data)) {
			foreach($data as $d) :
				$this->db->set('id_usuario', $id);
				$this->db->set('id_perfil', $d);
				$this->db->insert('sec_usuarios_perfiles');
				$resultado = $resultado &&($this->db->affected_rows() >0); 				
			endforeach;
		}
		return $resultado;
		
	}

	public function get_users_by_type($limit=100,$start=0,$filtro,$data_f, $count=false)
	{
		// FILTROS		
		if ($filtro){
			if ($data_f['nombre'] != '') {
				$txtWhere = "(u.nombre like '%".$this->db->escape_like_str($data_f['nombre'])."%' or u.apellido like '%".$this->db->escape_like_str($data_f['nombre'])."%')";
				$this->db->where($txtWhere,null);
				}		
			if ($data_f['username'] != '') {$this->db->where('username', $data_f['username']);}		
			if ($data_f['email'] != '') {$this->db->where('u.email', $data_f['email']);}	
			if ($data_f['activo'] != '') {$this->db->where('activo', $data_f['activo']);}	
			if ($data_f['zonasdecobertura'] != '') {
				$txtWhere = "zonasdecobertura like '%".$this->db->escape_like_str($data_f['zonasdecobertura'])."%'";
				$this->db->where($txtWhere,null);
				}
			if ($data_f['especialidad'] != '') {$this->db->where('especialidad', $data_f['especialidad']);}
			if ($data_f['id_usuario_tipo'] != '') {$this->db->where('tipo', $data_f['id_usuario_tipo']);}			
			if ($data_f['id_pais'] != '') {$this->db->where('id_pais', $data_f['id_pais']);}	
		}
		// $start = $this->input->post('pagina');
		if ($count) {
			return $this->db->count_all_results("usuarios_eap ue left join sec_usuarios u on ue.id_usuario = u.id");
		} else {
			$txtSelect = "*";
			$txtSelect .= ", (select nombre from especialidades where especialidad = id_especialidades) as especialidad_nombre";
			$txtSelect .= ", (select printable_name from countries where id_country = id_pais) as pais_nombre, (select iso from countries where id_country = id_pais) as pais_iso";			
			$this->db->limit($limit,$start);
			$this->db->select($txtSelect, FALSE);
			$this->db->from("usuarios_eap ue left join sec_usuarios u on ue.id_usuario = u.id");
			
			switch ($data_f['orden']) {
				case "1":
					$this->db->order_by('u.nombre');
					break;
				case "2":
					$this->db->order_by('u.nombre desc');
					break;
				case "3":
					$this->db->order_by('especialidad_nombre');
					break;
				case "4":
					$this->db->order_by('especialidad_nombre desc');
					break;					
				case "5":
					$this->db->order_by('zonasdecobertura');
					break;
				case "6":
					$this->db->order_by('zonasdecobertura desc');
					break;
				default:
					$this->db->order_by('u.nombre');
			}

			$this->db->order_by('u.nombre');
			$query=$this->db->get();
			return $query->result_array();
		}
	}
	
	public function get_usereap_by_type($id,$type,$estado = null)
	{

		$txtSelect = "*";
		$txtSelect.= ",if(fechah1='0000-00-00','',fechah1) as fechah1";
		$txtSelect.= ",if(fechah2='0000-00-00','',fechah2) as fechah2";
		$txtSelect.= ",if(fechah3='0000-00-00','',fechah3) as fechah3";
		$txtSelect.= ",if(fechah4='0000-00-00','',fechah4) as fechah4";
		$txtSelect.= ",if(fechah5='0000-00-00','',fechah5) as fechah5";
		$txtSelect.= ",if(fechah6='0000-00-00','',fechah6) as fechah6";
		$txtSelect.= ",if(fechah7='0000-00-00','',fechah7) as fechah7";

		$this->db->select($txtSelect,FALSE);
		$this->db->from('usuarios_eap left join usuarios_eap_configuracion uec on usuarios_eap.id_usuarios_eap = uec.id_usuarios_eap ');
		$this->db->where('id_usuario', $id);
		$this->db->where('tipo', $type);
		if (!is_null($estado)) {$this->db->where('estado2', $estado);}	
		$query=$this->db->get();
		return $query->row_array();
		
	}	

	public function set_usereap_by_type($id,$type,$data,$data_c=null,$mode=null)
	{
		if ($mode=='insert') {
			// INSERT
			if (count($data)>0){ 
				$this->db->insert("usuarios_eap", $data);
				$id_eap = $this->db->insert_id();
				if (count($data_c)>0 && is_numeric($id_eap)){ 
					$data_c['id_usuarios_eap'] = $id_eap;
					return $this->db->insert("usuarios_eap_configuracion", $data_c);
				}
				if (is_numeric($id_eap)) {return true;} else {return false;}
			}
			
		} else {
			// UPDATE
			if (count($data)>0){
				$this->db->where('id_usuario', $id);
				$this->db->where('tipo', $type);		
				$ret = $this->db->update("usuarios_eap", $data);
			}
			
			if (count($data_c)>0){
				$this->db->where('id_usuario', $id);
				$this->db->where('tipo', $type);		
				$ret2 = $this->db->update("usuarios_eap_configuracion join usuarios_eap on usuarios_eap_configuracion.id_usuarios_eap = usuarios_eap.id_usuarios_eap", $data_c);		
			}

			return true;
		}
	}	
	
	public function exists_usereap_by_type($id,$type,$estado = null)
	{

		$txtSelect = '*';
		$this->db->select($txtSelect);
		$this->db->from('usuarios_eap left join usuarios_eap_configuracion uec on usuarios_eap.id_usuarios_eap = uec.id_usuarios_eap ');
		$this->db->where('id_usuario', $id);
		$this->db->where('tipo', $type);
		if (!is_null($estado)) {$this->db->where('estado2', $estado);}	
		$query=$this->db->get();
		return ($this->db->affected_rows() >0);
	}	

	function active_usereap_by_type ($id,$type=null)
	{
		$data = array( 
		'estado2' => "Activo"
		);
		$this->db->where('id_usuario', $id);
		if($type != null) {$this->db->where('tipo', $type);}
		$this->db->update('usuarios_eap', $data);			
		return ($this->db->affected_rows() >0);
	}

	function inactive_usereap_by_type($id,$type=null)
	{
		$data = array( 
		'estado2' => "Inactivo"
		);
		$this->db->where('id_usuario', $id);
		if($type != null) {$this->db->where('tipo', $type);}
		$this->db->update('usuarios_eap', $data);			
		return ($this->db->affected_rows() >0);
	}
	
	public function get_user_log($id)
	{
		$txtSelect = '*';
		$this->db->select($txtSelect);
		$this->db->from('sec_usuarios_log');
		$this->db->where('id_usuario', $id);
		$this->db->order_by('fecha','desc');
		$query=$this->db->get();
		return $query->result_array();
		
	}	

	public function set_user_log($data)
	{
		return $this->db->insert('sec_usuarios_log', $data);
	}

		public function set_user_profile($data)
	{
		return $this->db->insert('sec_usuarios_perfiles', $data);
	}
	
	public function get_users_type()
	{
		$this->db->from('usuarios_tipo');
		$this->db->order_by('nombre');
		$query=$this->db->get();
		return $query->result_array();
	}

	public function get_specialities()
	{
		$this->db->from('especialidades');
		$this->db->order_by('nombre');		
		$query=$this->db->get();
		return $query->result_array();
	}	

	public function get_users_count()
	{
		return $this->db->count_all($this->table_name);
	} 
	
	public function is_unique($id,$field,$value)
	{
		$this->db->from($this->table_name);
		$this->db->where('id !=', $id);
		$this->db->where($field, $value);				
		$query=$this->db->get();
		if ($query->num_rows()>0) {return false;}else { return true;}
	}	
	 
	 
	public function pass_init($update=false)
	{
	$this->load->library('encrypt');	
	$query=$this->db->get($this->table_name);
	echo '<br>UPDATE ? =>'.$update;
	foreach ($query->result() as $row)
		{
		echo '<br>'.$row->username;
		echo '==>'.$row->password;
		$id = $row->id;
		if(!$update){
			$decpass = $this->encrypt->decode($row->password);
			echo '<br>Decode==>'.$decpass;
			echo '<br>';
		} else {
			$newpass = $this->encrypt->encode($row->password);
			echo '==>'.$newpass;
			echo '<br>';
			$data = array('password' => $newpass);
			$this->db->where('id', $id);
			$this->db->update('sec_usuarios', $data);
		}
}		
	return true;
	
	} 
	 
 
}
