<?php

class Sistema_Model_Funcionarios extends Agro_Db_Table_Abstract {
	protected $_rowClass = 'Sistema_Model_Row_Funcionario';
	protected $_schema = 'sistema';
	protected $_name = 'funcionarios';
	protected $_view = 'v_funcionarios';
	protected $_primary = 'id';
	public $_order = array('ds_nome_funcionario', 'ds_nome_departamento');

	public $_columnExcel = array(
		'id' => 'Cod.',
		'ds_nome_fantasia' => 'Empresa',
		'ds_nome_departamento' => 'Departamento',
		'ds_nome_funcionario' => 'Funcionário',
		'id_usuario' => 'Usuário ID',
		'fl_ativo' => 'Ativo?',
	);

	public function active($id) {
		$Row = $this->find($id)->current();
		$Row->fl_ativo = ($Row->fl_ativo ? 0 : 1);

		if ($Row->save()) {
			$Usuarios = new Sistema_Model_Usuarios();

			$User = $Usuarios->find($Row->id_usuario)->current();
			$User->fl_ativo = $Row->fl_ativo;
			$User->save();
		}

		return $Row->fl_ativo;
	}

	public function treinado($id, $bo) {
		$Row = $this->find($id)->current();
		$Row->fl_treinado = ($bo ? 1 : 0);
		$Row->save();
		return $Row->fl_treinado;
	}

	/**
	 * Salva um funcionario no banco
	 *
	 * @param array $data
	 * @return boolean
	 */
	public function save(array $data) {
		$Usuarios = new Sistema_Model_Usuarios();

		$this->getDefaultAdapter()->beginTransaction();

		try {
			$idUser = $Usuarios->save($data);

			if ($idUser) {
				$Row = $this->getRow($data['id']);

				$Row->id_usuario = $idUser;
				$Row->id_municipio = !empty($data['id_municipio']) ? $data['id_municipio'] : null;
				$Row->id_empresa = $data['id_empresa'];
				$Row->id_departamento = $data['id_departamento'];
				$Row->cpf_cnpj = $data['cpf_cnpj'];
				$Row->ds_nome_funcionario = $data['ds_nome_funcionario'];
				$Row->ds_nome_guerra = $data['ds_nome_guerra'];
				$Row->dt_nascimento = ($data['dt_nascimento'] ? Agro_Util::formatDate($data['dt_nascimento'], Zend_Date::W3C) : null);
				$Row->ds_email = $data['ds_email'];
				$Row->ds_usuario_msn = $data['ds_usuario_msn'];
				$Row->ds_usuario_skype = $data['ds_usuario_skype'];
				$Row->ds_endereco_rua = $data['ds_endereco_rua'];
				$Row->ds_endereco_nro = $data['ds_endereco_nro'];
				$Row->ds_endereco_bairro = $data['ds_endereco_bairro'];
				$Row->ds_endereco_cep = $data['ds_endereco_cep'];
				$Row->ds_endereco_complemento = $data['ds_endereco_complemento'];
				$Row->ds_observacao = $data['ds_observacao'];
				$Row->fl_responsavel_empresa = ($data['fl_responsavel_empresa'] ? 1 : 0);
				$Row->ds_crea = $data['ds_crea'];
				$Row->fl_usuario_tagh = ($data['fl_usuario_tagh'] ? 1 : 0);
				$Row->id_tipo_carteira_profissional = $data['id_tipo_carteira_profissional'];
				$Row->fl_agronomo = ($data['fl_agronomo'] ? 1 : 0);

				$Row->save();

                $data['id'] = $Row->id;

                if(!(new Log_Model_LogAlteracoesCadastroFuncionarios())->save(['id_funcionario' => $Row->id, 'ds_alteracoes' => $data['dadosAlterados']])) {
                    throw new Exception('Erro ao salvar os dados.');
                }

                /**
                 * Parâmetro existente apenas para determinados cadastro de vistoriadores
                 */
                if (isset($data['statusNaoConferido'])) {
                    $status = $data['tp_usuario'] === Sistema_Model_Usuarios::TIPO_USUARIO_VISTORIADOR ? Sistema_Model_VistoriadoresStatus::DS_CHAVE_NAO_CONFERIDO : Sistema_Model_VistoriadoresStatus::DS_CHAVE_CONFERIDO;

                    if (!(new Sistema_Model_VistoriadoresStatus())->save([
                        'id_funcionario' => $data['id'],
                        'id_status' => $this->getIdStatus($status, Sistema_Model_Tipostatus::DS_CHAVE_CADASTRO_VISTORIADORES),
                        'ds_observacao' => $data['observacaoStatus'] ?? '',
                        'fl_cadastro_inicial' => $data['fl_cadastro_inicial'] ? 1 : 0,
                    ])) {
                        throw new Exception('Erro ao salvar o status.');
                    }
                }

				$this->getDefaultAdapter()->commit();

                return $Row;
			} else {
				$this->setMessage($Usuarios->getMessages());
				$this->getDefaultAdapter()->rollBack();
				return false;

			}

		} catch (Exception $e) {
			$this->getDefaultAdapter()->rollBack();
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	public function getData($where=false) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('f' => 'sistema.funcionarios'), array('ds_nome_funcionario', 'id_usuario', 'fl_ativo', 'id', 'fl_treinado', 'ds_crea, (select exists(select distinct 1 from sistema.treinamento_vistorias where id_funcionario = f.id and fl_ministrante is false)) as fl_possui_treinamento'));
		$Select->join(array('e' => 'sistema.empresas'), 'e.id = f.id_empresa', array('ds_nome_fantasia','id as id_empresa', 'cpf_cnpj as cnpj_empresa'));
		$Select->join(array('d' => 'sistema.departamentos'), 'd.id = f.id_departamento', array('ds_nome_departamento'));
		$Select->joinLeft(array('m' => 'sistema.municipios'), 'm.id = f.id_municipio', array('ds_nome_municipio'));
		$Select->joinLeft(array('es' => 'sistema.estados'), 'es.id = m.id_estado', array('ds_sigla'));
		$Select->join(array('us' => 'sistema.usuarios'),'us.id = id_usuario', array('fl_liberado_tablet_previa','tp_usuario', 'deviceid', 'fl_liberado_tablet_sinistro', 'deviceid_sinistro'));
		$this->getWhere($Select, $where);

		if ($this->_order) {
			$Select->order($this->_order);
		}

		//retira da lista os administradores caso o usuário logado não seja administrador
		if (Zend_Auth::getInstance()->getIdentity()->ds_chave != 'ADMIN') {
			$Select->join(array('r' => 'sistema.roles'),'us.id_role = r.id',false);
			$Select->where('r.ds_chave != ?', 'ADMIN');
		}

		return $Select;
	}

	public function getTelefones($id) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('t' => 'sistema.telefone'));
		$select->join(array('tt' => 'sistema.tipo_telefone'),'t.id_tipo_telefone = tt.id', 'tp_telefone');
		$select->where("t.id_usuario=?", $id);


		return $this->fetchAll($select);
	}

	public function getVistoriadores($idEmpresa=null,$hasCrea=false){

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('f' => 'sistema.funcionarios'),array('id','ds_nome_funcionario','e.ds_nome_fantasia'));
		$select->join(array('e' => 'sistema.empresas'), 'f.id_empresa = e.id and e.fl_ativo = true', false);
		$select->join(array('u' => 'sistema.usuarios'),'f.id_usuario = u.id and u.fl_ativo = true', 'id as id_usuario');
		$select->where("f.fl_ativo = true");
		$select->where('f.fl_treinado = true');

		if ($hasCrea) { //validação de obrigatoriedade de CREA na prévia
			$select->where("trim(f.ds_crea) <> ''");
		}
		//$select->order('e.ds_nome_fantasia');

		$User = Zend_Auth::getInstance()->getIdentity();
		$nomeUsuario = $User->ds_nome_usuario;

		if($idEmpresa && $idEmpresa != 20) {
			$select->where("e.id = $idEmpresa");
		}

		$select->order(array('e.ds_nome_fantasia','f.ds_nome_funcionario'));

		$vist = array();
		$rs = $this->fetchAll($select);
		if ($rs) {
			$vist = $rs->toArray();
		}

		return $vist;
	}

	public function getVistoriadoresEmpresa($idEmpresa=null, $hasCrea=false) {

		$Rs = $this->getVistoriadores($idEmpresa,$hasCrea);
		$options = array();
		$options[''] = '';
		//se a empresa é 20(agrobrasil) mostra funcionário -- empresa
		if(!$idEmpresa){
			foreach ($Rs as $row) {
				$nomeFuncionario = substr($row['ds_nome_funcionario'],0,34);
				$options[$row['id']] = $row['ds_nome_fantasia'].' - '.$nomeFuncionario;
			}
		}else{
			foreach ($Rs as $row) {
				$options[$row['id']] = $row['ds_nome_funcionario'];
			}
		}
		return $options;
	}

	public function getEmpresaByIdUsuario($idUsuario){
		if ($idUsuario) {
			$select = $this->select()->setIntegrityCheck(false);
			$select->from(array('f' => 'sistema.funcionarios'),false);
			$select->join(array('e' => 'sistema.empresas'), 'f.id_empresa = e.id and e.fl_ativo = true', 'e.*');
			$select->where('f.id_usuario = ?',$idUsuario);
			$select->where('f.fl_ativo = true');

			$Row = $this->fetchRow($select);
			return $Row->ds_nome_fantasia;
		}

		return;
	}

	/**
	 * Verifica se a empresa já foi cadastrada na TAGH através de XML.
	*/
	public function verificaExistenciaEmpresaTagh($idFuncionario){
		if ($idFuncionario) {
			$select = $this->select()->setIntegrityCheck(false);
			$select->from(array('f' => 'sistema.funcionarios'),false);
			$select->join(array('e' => 'sistema.empresas'), 'f.id_empresa = e.id and e.fl_ativo = true', 'e.*');
			$select->where('f.id = ?',$idFuncionario);
			$select->where('f.fl_ativo = true');

			$Row = $this->fetchRow($select);

			if (!empty($Row->id_tagh)) {
				return true;
			}
		}

		return false;
	}

    public function getCategoriaEmpresaByidUsuario($idUsuario) {
        if ($idUsuario) {
            $select = $this->select()->setIntegrityCheck(false);
            $select->from(array('f' => 'sistema.funcionarios'),false);
            $select->join(array('e' => 'sistema.empresas'), 'f.id_empresa = e.id and e.fl_ativo = true', null);
            $select->join(array('c' => 'sistema.categorias'), 'e.id_categoria = c.id and e.fl_ativo = true', 'c.*');
            $select->where('f.id_usuario = ?',$idUsuario);
            $select->where('f.fl_ativo = true');

            return $this->fetchRow($select);
        }
    }

	public function getNomeUsuarioByIdUsuario($idUsuario){
		if ($idUsuario) {
			$select = $this->select()->setIntegrityCheck(false);
			$select->from(array('f' => 'sistema.funcionarios'),'ds_nome_funcionario');
			$select->where('f.id_usuario = ?',$idUsuario);

			$Row = $this->fetchRow($select);
			return $Row->ds_nome_funcionario;
		}

		return;
	}

	public function getFuncionarioByIdUsuario($idUsuario){
		if ($idUsuario) {
			$select = $this->select()->setIntegrityCheck(false);
			$select->from(array('f' => 'sistema.funcionarios'),'*');
			$select->where('f.id_usuario = ?',$idUsuario);

			$Row = $this->fetchRow($select);
			return $Row;
		}

		return;
	}

	public function getIdEmpresaByIdUsuario($idUsuario){
		$data = array();

		if($idUsuario){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('f' => 'sistema.funcionarios'),false);
			$select->join(array('e' => 'sistema.empresas'), 'f.id_empresa = e.id and e.fl_ativo = true', 'e.id');
			$select->where($this->getAdapter()->quoteInto('f.id_usuario = ?',$idUsuario));
			$select->where('f.fl_ativo = true');

			$data = $this->_db->fetchOne($select);
		}

		return $data;
	}

	public function getComboVistoriadores() {
		$idEmpresa = '';

		// Obtém o id da empresa do usuário, caso ele seja um vistoriador
		$User = Zend_Auth::getInstance()->getIdentity();

		// Se nao for um funcionario
		if($User->tp_usuario != 'F'){
			$empresa = $this->getEmpresaByIdUsuario($User->id);
			$idEmpresa = $empresa['id'];
		}

		// Busca os funcionarios
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('f' => 'sistema.funcionarios'),array('id','ds_nome_funcionario'));
		$select->join(array('e' => 'sistema.empresas'),'f.id_empresa = e.id and e.fl_ativo = true', false);
		$select->join(array('u' => 'sistema.usuarios'),'f.id_usuario = u.id and u.fl_ativo = true', false);
		$select->where("u.tp_usuario = 'V' and f.fl_ativo = true");
		$select->order("ds_nome_funcionario");

		// Se tiver o idEmpresa adiciona o join
		if ($idEmpresa) {
			$select->where("e.id = $idEmpresa");
		}

		$Rs = $this->fetchAll($select);

		if ($Rs->count()) {
			$options[''] = '';
			foreach ($Rs as $row) {
				$options[$row['id']] = $row['ds_nome_funcionario'];
			}

			return $options;
		} else {
			return false;
		}
	}

	public function getComboVistoriadoresByProcesso($idProcesso, $apresentarNomeEmpresa = false) {

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('f' => 'sistema.funcionarios'),array('id','ds_nome_funcionario'));
		$select->join(array('e' => 'sistema.empresas'),'f.id_empresa = e.id and e.fl_ativo = true', ['ds_nome_fantasia']);
		$select->join(array('pe' => 'sinistro.processos_empresas'),'pe.id_empresa = e.id and pe.fl_ativo = true', false);
		$select->join(array('u' => 'sistema.usuarios'),'f.id_usuario = u.id and u.fl_ativo = true', false);
		$select->where("f.fl_ativo = true");
		$select->where("pe.id_processo = ?", $idProcesso);
		$select->where("u.tp_usuario <> ?", Sistema_Model_Usuarios::TIPO_USUARIO_HELPER);
		$select->where('exists (?)', new Zend_Db_Expr($this->getDefaultAdapter()->quoteInto($this->whereVistoriadoresTreinamentos(), null)));
        $select->where("exists (?)", new Zend_Db_Expr($this->getDefaultAdapter()->quoteInto($this->whereVistoriadoresConferidos(), null)));

		$select->order('f.ds_nome_funcionario');

		$Rs = $this->fetchAll($select);

		if ($Rs->count()) {
			$options[''] = '';
			foreach ($Rs as $row) {
				$option = $row['ds_nome_funcionario'];

				if ($apresentarNomeEmpresa) {
					$option = $row['ds_nome_fantasia'] . " - " . $row['ds_nome_funcionario'];
				}
				$options[$row['id']] = $option;
			}

			return $options;
		} else {
			return [];
		}
	}

	/**
	 * Retorna todos os vistoriadores ativos de uma ou mais empresas
	 * 
	 * @param array $empresas ID das empresas
	 * @return array
	 */
	public function getComboVistoriadoresByEmpresas(array $empresas, bool $ignoraAuxiliarAdministrativo = false): array {

		$options = [];

		if (empty($empresas)) {
			return $options;
		}

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('f' => 'sistema.funcionarios'),array('id','ds_nome_funcionario'));
		$select->join(array('e' => 'sistema.empresas'),'f.id_empresa = e.id and e.fl_ativo = true', false);
		
		if ($ignoraAuxiliarAdministrativo) {
			$select->join(array('u' => 'sistema.usuarios'), 'u.id = f.id_usuario', false);
			$select->where("u.tp_usuario <> 'M'");
		}
		
		$select->where("f.fl_ativo = true");
		$select->where("e.id in (?)", $empresas);
        $select->where("exists (?)", new Zend_Db_Expr($this->getDefaultAdapter()->quoteInto($this->whereVistoriadoresConferidos(), null)));
		$select->order('f.ds_nome_funcionario');
		
		$Rs = $this->fetchAll($select);
		foreach ($Rs as $row) {
			$options[$row['id']] = $row['ds_nome_funcionario'];
		}

		return $options;
	}

	public function getListVistoriadores($idProcesso) {

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('f' => 'sistema.funcionarios'),array('id','ds_nome_funcionario'));
		$select->join(array('e' => 'sistema.empresas'),'f.id_empresa = e.id and e.fl_ativo = true', false);
		$select->join(array('pe' => 'sinistro.processos_empresas'),'pe.id_empresa = e.id and pe.fl_ativo = true', false);
		$select->join(array('u' => 'sistema.usuarios'),'f.id_usuario = u.id and u.fl_ativo = true', false);
		$select->where("f.fl_ativo = true");
		$select->where("pe.id_processo = ?", $idProcesso);

		$select->order('f.ds_nome_funcionario');

		return $this->fetchAll($select);
	}

	public function getCombofuncionarios($idDepartamento, $field='id') {
		return $this->getDefaultAdapter()->fetchPairs("select $field, ds_nome_funcionario from sistema.funcionarios where fl_ativo = true and id_departamento = $idDepartamento order by ds_nome_funcionario");
	}

	public function getComboAgroBrasil($first = '', $ignorarFerias = false) {
		$return = array('');

		$Sql = $this->select()->setIntegrityCheck(false);
		$Sql->from(array('f' => 'sistema.funcionarios'), false);
		$Sql->join(array('e' => 'sistema.empresas'), 'e.id = f.id_empresa', false);
		$Sql->join(array('u' => 'sistema.usuarios'), 'u.id = f.id_usuario', array('id','ds_nome_usuario'));
		$Sql->where('e.cpf_cnpj = ?', '03.486.745/0001-09');

		if (!$ignorarFerias) {
			$Sql->where('u.fl_ativo is true');
			$Sql->where('f.fl_ativo is true');
		}
		
		$Sql->order('u.ds_nome_usuario');
		$combo = $this->getDefaultAdapter()->fetchPairs($Sql);

		if($first){
			$return[0] = '';
			$return[1] = 'Sem Executor';
		}
		foreach ($combo as $index => $text) {
			$return[$index] = $text;
		}

		return $return;
	}

	public function getCombofuncionariosUsuarios($id, $empty=false) {
		$Rs = $this->fetchAll('fl_ativo = true and id_departamento = ' . $id , 'ds_nome_funcionario')->toArray();

		if ($empty) {
			$options = array(0 => '');
		} else {
			$options = array();
		}

		if (is_array($Rs)) {


			$field = $field ? $field : $this->_order;
			foreach ($Rs as $row) {
				$options[$row['id_usuario']] = $row['ds_nome_funcionario'];
			}

			return $options;
		} else {
			return false;
		}
	}

	public function getArrayVistoriadoresByEmpresa($idEmpresa, array $tiposUsuario = null, bool $somenteAtivos = true) {
        $whereTipoUsuario = "u.tp_usuario <> 'H'";

        if (!empty($tiposUsuario)) {
            $whereTipoUsuario = "u.id_role in (" . implode(', ', $tiposUsuario) . ')';
        }

		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('f' => $this->_schema.'.'.$this->_name),array('id','ds_nome_funcionario'));
		$select->join(array('u' => 'sistema.usuarios'), 'f.id_usuario = u.id', false);
		$select->where('id_empresa = ?', $idEmpresa);

        if ($somenteAtivos) {
		    $select->where('f.fl_ativo = true');
            $select->where("exists (?)", new Zend_Db_Expr($this->getDefaultAdapter()->quoteInto($this->whereVistoriadoresConferidos(), null)));
        }

		$select->where($whereTipoUsuario);
		$select->order('ds_nome_funcionario');

		$Vistoriadores = array();

		$Rows = $this->fetchAll($select)->toArray();
		foreach ($Rows as $Row) {
		    $Vistoriadores[$Row['id']] = $Row['ds_nome_funcionario'];
		}

		return $Vistoriadores;
	}

	public function getArrayAuxiliaresByEmpresa($idEmpresa) {
		$select = $this->select()->setIntegrityCheck(false)
			->from(array('f' => $this->_schema.'.'.$this->_name),array('id','ds_nome_funcionario'))
			->join(array('u' => 'sistema.usuarios'), 'f.id_usuario = u.id', false)
			->where('id_empresa = ?', $idEmpresa)
			->where('f.fl_ativo = true')
			->where('f.fl_del = false')
			->where("tp_usuario = 'H'")
			->order('ds_nome_funcionario');

		$Auxiliares = array();

		$Rows = $this->fetchAll($select)->toArray();
		foreach ($Rows as $Row) {
			$Auxiliares[$Row['id']] = $Row['ds_nome_funcionario'];
		}

		return $Auxiliares;
	}

	public function getIdByTagh($idTagh) {
		if ($idTagh) {
			$select = $this->select()->setIntegrityCheck(false);
			$select->from(array('f' => 'sistema.funcionarios'),'id');
			$select->where('f.id_tagh = ?',$idTagh);

			$Row = $this->fetchRow($select);
			return $Row->id;
		}

		return;
	}

    public function getComboFuncionariosAgronomos() : array
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['sf' => "{$this->_schema}.{$this->_name}"], ['id', 'ds_nome_funcionario']);
        $select->where('fl_ativo is true');
        $select->where('fl_agronomo is true');
        $select->order('ds_nome_funcionario asc');

        $rows = $this->fetchAll($select)->toArray();
        $funcionarios = ['' => ''];

        foreach ($rows as $row) {
            $funcionarios[$row['id']] = strtoupper($row['ds_nome_funcionario']);
        }

        return $funcionarios;
    }

    public function dicionarioDados(string $campo)
    {
        if (strstr($campo, 'tipo_telefone') !== false) {
            $campo = 'tipo_telefone';
        }

        if (strstr($campo, 'numero_telefone') !== false) {
            $campo = 'numero_telefone';
        }

        if (strstr($campo, 'ramal_telefone') !== false) {
            $campo = 'ramal_telefone';
        }

        $dePara = [
            'ds_nome_funcionario' => 'Nome',
            'ds_nome_guerra' => 'Nome Social',
            'cpf_cnpj' => 'CPF',
            'dt_nascimento' => 'Data de Nascimento',
            'ds_endereco_cep' => 'CEP',
            'ds_nome_estado' => 'UF',
            'ds_nome_municipio' => 'Município',
            'ds_endereco_bairro' => 'Bairro',
            'ds_endereco_rua' => 'Endereço',
            'ds_endereco_nro' => 'Número',
            'ds_endereco_complemento' => 'Complemento',
            'ds_email' => 'E-mail',
            'tipo_telefone' => 'Tipo de Telefone',
            'numero_telefone' => 'Número do Telefone',
            'ramal_telefone' => 'Ramal do Telefone',
            'ds_nome_usuario' => 'Login',
            'ds_crea' => 'CREA/CFTA',
            'ds_observacao' => 'Observações',
            'deviceid' => 'Dispositivo Vinculado',
            'nome_empresa' => 'Empresa',
            'nome_departamento' => 'Departamento',
            'ds_tipo_carteira_profissional' => 'Tipo de Carteira Profissional',
            'ds_tipo_usuario' => 'Tipo',
            'ds_perfil' => 'Perfil',
        ];

        return !empty($dePara[$campo]) ? $dePara[$campo] : '';
    }

    public function getFuncionariosByDepartamento(int $idDepartamento)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['sf' => "{$this->_schema}.{$this->_name}"]);
        $select->where('sf.id_departamento = ?', $idDepartamento);

        return $this->fetchAll($select);
    }

    public function getByCpf(string $cpf, bool $somenteVistoriadoresAuxiliares = true) : array
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['sf' => "{$this->_schema}.{$this->_name}"]);

        if ($somenteVistoriadoresAuxiliares) {
            $select->join(['su' => 'sistema.usuarios'], 'su.id = sf.id_usuario', false);
            $select->where('su.tp_usuario <> ?', Sistema_Model_Usuarios::TIPO_USUARIO_FUNCIONARIO);
        }

        $select->where('sf.cpf_cnpj = ?', $cpf);
        $select->where('sf.fl_ativo is true');

        return $this->fetchAll($select)->toArray();
    }

    private function whereVistoriadoresConferidos()
    {
        $sqlExists = "SELECT 1 ";
        $sqlExists .= " FROM sistema.vistoriadores_status svs ";
        $sqlExists .= "WHERE svs.id_funcionario = f.id ";
        $sqlExists .= "  AND svs.id_status = " . Sistema_Model_VistoriadoresStatus::ID_STATUS_CONFERIDO;

        return $sqlExists;
    }

	/**
	 * Monta o where para verificar se o vistoriador possui algum treinamento cadastrado
	 * @return string
	 */
	private function whereVistoriadoresTreinamentos(): string
	{
		$sqlExists = "SELECT 1 ";
		$sqlExists .= " FROM sistema.treinamento_vistorias tv ";
		$sqlExists .= "WHERE tv.id_funcionario = f.id ";
		$sqlExists .= "  AND tv.fl_ministrante is false";

		return $sqlExists;
	}

    /**
     * @param array $idsEmpresas
     * @return Zend_Db_Table_Rowset
     */
    public function getFuncionariosTreinamentosByEmpresa(array $idsEmpresas) : Zend_Db_Table_Rowset
    {
        $campos = [
            'sf.id as id_funcionario',
            'stv.id_treinamento',
            'sttv.id_tipo_vistoria',
        ];

        $select = $this->select()
            ->setIntegrityCheck(false)
            ->from(['sf' => "{$this->_schema}.{$this->_name}"], $campos)
            ->join(['stv' => 'sistema.treinamento_vistorias'], 'stv.id_funcionario = sf.id', false)
            ->join(['sttv' => 'sistema.treinamentos_tipos_vistoria'], 'sttv.id_treinamento = stv.id_treinamento', false)
            ->where('sf.fl_ativo is true')
            ->where('sf.id_empresa in (?)', $idsEmpresas);

        return $this->fetchAll($select);
    }

}
