<?php

class Sistema_Model_Corretores extends Agro_Db_Table_Abstract {
    const ID_STATUS_AGUARDANDO_PENDENCIA = 266;
    const ID_STATUS_ATUALIZACAO_CADASTRO = 268;
    const ID_STATUS_CADASTRO_INICIAL = 263;
    const ID_STATUS_CONCLUIDO_FINALIZADO = 267;
    const ID_STATUS_EM_ANALISE = 265;
    const ID_STATUS_EM_ANDAMENTO = 264;

	protected $_schema = 'sistema';
	protected $_name = 'corretores';
	protected $_view = 'sistema.v_corretores';
	protected $_primary = 'id';
	protected $_rowClass = 'Sistema_Model_Row_Corretor';
	public $_order = array('ds_nome_fantasia');

	public $_columnExcel = array(
		'id' => 'Cod.',
		'ds_nome_fantasia' => 'Corretor',
	    'ds_nome_abreviado' => 'Abreviado',
	    'id_usuario' => 'Id. Usuario',
		'ds_nome_usuario' => 'Usuario',
	    'ds_nome_municipio' => 'Município',
	    'ds_sigla' => 'UF',
	    'ds_nome_responsavel' => 'Contato',
	    'telefones_lista' => 'Telefones',
	    'ds_email' => 'Email',
	    'ativo' => 'Ativo'
	   	);

	 protected $_referenceMap    = array (
		'Sistema_Model_Prepostos' => array (
			'columns'           => array('id'),
			'refTableClass'     => 'Sistema_Model_Prepostos',
			'refColumns'        => array('id_corretor')
		)
    );

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

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

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

			if ($idUser) {

                $data['id_usuario'] = $idUser;
			    $row = $this->salvarCorretor($data);

				if (is_array($data['permissoes']) && $data['id']) {
					if (!$ExcecaoUsuario->save($data['permissoes'], $data['id_usuario'])) {
						return false;
					}
				}

				$CapacidadeUsuario = new Produto_Model_ValidacoesCapacidadeUsuarios();
				$CapacidadeUsuario->addCorretorPreposto($idUser);

				$modelRelatorioUsuarioSenha = new Sistema_Model_RelatorioUsuarioSenha;
				$modelRelatorioUsuarioSenha->save($data);

				$this->getDefaultAdapter()->commit();
				return $row->id;
			}

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

	/**
	 *
	 */
	public function beforeDelete($id) {
		$Corretor = $this->getRow($id);

		$Model = new Sistema_Model_CorretoresEnderecos();
		$Model->delete($id, 'id_corretor');

		$Model = new Sistema_Model_CorretoresComercial();
		$Model->delete($id, 'id_corretor');

		$Model = new Sistema_Model_InformacoesBancariasCorretores();
		$Model->delete($id, 'id_corretor');

		$Model = new Sistema_Model_Telefones();
		$Model->delete($Corretor->id_usuario, 'id_usuario');

		/*
		$Model = new Sistema_Model_Usuarios();
		$Model->delete($Corretor->id_usuario, 'id');
		*/
	}

	/**
	 * Insere os endereços do Corretor
	 *
	 * @param int $idUsuario
	 * @param array $enderecos
	 */
	public function setEnderecoCorretor($idUsuario, $enderecos) {
		$this->query("delete from sistema.telefone where id_usuario = $idUsuario");

		if (is_array($enderecos)) {
			foreach ($enderecos as $endereco) {
				$endereco['id_usuario'] = $idUsuario;
				$this->save($endereco);
			}
		}
	}

	/**
	 * Busca corretores e monta combo com "id_usuario" como indice
	 *
	 * @return array
	 */
	public function getComboUsuario($first = true, $retornarIdCorretor = false) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('c' => 'sistema.corretores'), array('id', 'id_usuario', "CASE WHEN c.ds_nome_abreviado <> '' THEN  c.ds_nome_abreviado ELSE c.ds_nome_fantasia END AS ds_nome_corretor"));
		$select->where('c.fl_ativo = true');
		$select->where('c.fl_treinado = true');
		$select->order('ds_nome_corretor');

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

		if ($Rs) {
			if ($first) $options[] = '';

			if (!$retornarIdCorretor) {
                foreach ($Rs as $row) {
                    $options[$row['id_usuario']] =  $row['ds_nome_corretor'];
                }
            } else {
                foreach ($Rs as $row) {
                    $options[$row['id_usuario']] = [
                      'id' => $row['id'],
                      'nome' =>  $row['ds_nome_corretor']
                    ];
                }
            }

			return $options;
		} else {
			return array();
		}
	}

	/**
	 * Busca corretores e monta combo com "id_usuario" como indice
	 *
	 * @return array
	 */
	public function getComboUsuarioComercialVinculado($first=true, $idComercial) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('c' => 'sistema.corretores'), array('id_usuario','ds_nome_fantasia','ds_nome_abreviado'));
		$select->where('c.fl_ativo = true');
		$select->where('c.id_comercial = '.$idComercial.' OR '.$idComercial.' in (select id_comercial from sistema.prepostos where id_corretor=c.id)');
		$select->order('c.ds_nome_abreviado');
		$Rs = $this->fetchAll($select);

		if ($Rs) {
			if ($first) $options[] = '';
			foreach ($Rs as $row) {
				if ($row['ds_nome_fantasia'] != '') {
					$options[$row['id_usuario']] = $row['ds_nome_abreviado'];
				} else {
					$options[$row['id_usuario']] = $row['ds_nome_fantasia'];
				}
			}

			return $options;
		} else {
			return array();
		}
	}

    /**
     * Busca corretores e monta combo com "id_usuario" como indice filtrando pelo Comercial Responsavel
     * @param bool $first
     * @param int $id_comercial
     * @return array
     */
    public function getComboUsuarioComercial(bool $first = true, int $id_comercial)
    {
        $campos = ['id_usuario', 'ds_nome_fantasia', 'ds_nome_abreviado'];

        $select1 = $this->select();
        $select1->setIntegrityCheck(false);
        $select1->from(['c' => "{$this->_schema}.{$this->_name}"], $campos);
        $select1->where("c.id_comercial = {$id_comercial}");
        $select1->where('c.fl_ativo = true');

        $select2 = $this->select();
        $select2->setIntegrityCheck(false);
        $select2->from(['cc' => 'sistema.corretores_comercial'], false);
        $select2->join(['c' => "{$this->_schema}.{$this->_name}"], 'cc.id_corretor = c.id', $campos);
        $select2->where("cc.id_comercial = {$id_comercial}");
        $select2->where('cc.fl_ativo = true');
        $select2->where('c.fl_ativo = true');

        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->union([$select1, $select2], Zend_Db_Select::SQL_UNION_ALL);
        $select->order('ds_nome_abreviado');

        $rs = $this->fetchAll($select);
        $options = [];

        if ($rs->count()) {
            if ($first) {
                $options[] = '';
            }

            foreach ($rs as $row) {
                $options[$row['id_usuario']] = $row['ds_nome_fantasia'];

                if ($row['ds_nome_fantasia'] != '') {
                    $options[$row['id_usuario']] = $row['ds_nome_abreviado'];
                }
            }
        }

        return $options;
    }

	/**
	 * Busca as contas do Corretor
	 *
	 * @param int $corretor
	 * @return object
	 */
	public function getInformacoesBancarias($corretor) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('ib' => 'sistema.informacoes_bancarias'), array('id','ds_agencia', 'ds_conta', 'ds_observacao', 'ds_tipo_conta'));
		$select->join(array('ibc' => 'sistema.informacoes_bancarias_corretores'), 'ib.id = ibc.id_informacoes_bancarias', null);
		$select->join(array('b' => 'sistema.bancos'), 'ib.id_banco = b.id and b.fl_ativo', 'ds_nome_banco');
		$select->where("ibc.id_corretor = $corretor");
		$select->where("ib.fl_ativo = true");

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

	/**
	 * Busca os prepostos de um corretor
	 *
	 * @param int $corretor
	 * @return object
	 */
	public function getPrepostos($corretor) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('p' => 'sistema.prepostos'), array('id','ds_nome_preposto','fl_ativo','p.id_usuario'));
		$select->join(array('u' => 'sistema.usuarios'), 'u.id = p.id_usuario', 'ds_nome_usuario');
		$select->where("p.id_corretor = $corretor and p.fl_ativo = true");

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

	/**
	 * Busca nome dos usuários
	 */
	public function getUsuarioCriacaoAlteracao($where = '') {
		$select = $this->getData($where);
		$select->setIntegrityCheck(false);
		
		return $this->fetchRow($select);
	}

	/**
	 * Busca os prepostos de um usuario do corretor
	 *
	 * @param int $corretor
	 * @return object
	 */
	public function getPrepostosUsuario($corretor, bool $somenteAtivos = true) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'sistema.prepostos'), array('id_usuario','ds_nome_preposto'));
		$select->join(array('c' => 'sistema.corretores'), 'c.id = p.id_corretor', null);
		$select->where("c.id_usuario = ?", $corretor);

        if ($somenteAtivos) {
            $select->where("p.fl_ativo = true");
        }

		$select->order("ds_nome_preposto");

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

	/**
	 * Busca os enderecos de um corretor
	 *
	 * @param int $corretor
	 * @return object
	 */
	public function getEnderecos($corretor) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('e' => 'sistema.corretores_enderecos'), array('id', 'ds_endereco_rua', 'ds_endereco_nro', 'ds_endereco_bairro', 'ds_endereco_cep', 'ds_endereco_complemento', 'fl_principal'));
		$select->join(array('m' => 'sistema.municipios'), 'e.id_municipio = m.id and e.fl_ativo = true', 'ds_nome_municipio');
		$select->join(array('u' => 'sistema.estados'), 'm.id_estado = u.id and m.fl_ativo = true', 'ds_nome_estado');
		$select->where("e.id_corretor = $corretor and u.fl_ativo = true");

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

	/**
	 * Busca os telefones de um corretor
	 *
	 * @param int $corretor
	 * @return object
	 */
	public function getTelefones($corretor) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('t' => 'sistema.telefone'), array('id', 'ds_numero', 'ds_ramal'));
		$select->join(array('tt' => 'sistema.tipo_telefone'), 't.id_tipo_telefone = tt.id and t.fl_ativo = true', 'tp_telefone');
		$select->where("t.id_usuario = $corretor and tt.fl_ativo = true");

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

	/**
	 * Monta a lista de hierarquia dos corretores/Prepostos
	 *
	 * @return array
	 */
	public function getCheckUsuarios() {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('co'=>'sistema.corretores'),array('id','id_usuario','ds_nome_fantasia'));
		$select->where('co.fl_ativo = true');
		$select->order('co.ds_nome_fantasia');
		$corretores = $this->fetchAll($select);

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('pre'=>'sistema.prepostos'),array('id_corretor','id_usuario','ds_nome_preposto'));
		$select->where('pre.fl_ativo = true');
		$select->order('pre.ds_nome_preposto');
		$prepostos = $this->fetchAll($select);

		// Insere corretores no array
		$usuarios = array();
		foreach($corretores as $corretor){
			$usuarios[$corretor['id']]['ds_nome_fantasia'] = strtoupper($corretor['ds_nome_fantasia']);
			$usuarios[$corretor['id']]['id_usuario'] = $corretor['id_usuario'];
		}

		//Insere prepostos no array de seus respectivos corretores
		foreach($prepostos as $preposto){
			$index = isset($usuarios[$preposto['id_corretor']]['prepostos']) ? count($usuarios[$preposto['id_corretor']]['prepostos']) : 0;
			$usuarios[$preposto['id_corretor']]['prepostos'][$index]['id_usuario'] = $preposto['id_usuario'];
			$usuarios[$preposto['id_corretor']]['prepostos'][$index]['ds_nome_preposto'] = strtoupper($preposto['ds_nome_preposto']);
		}

		return $usuarios;
	}

	public function getCheckCorretores() {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('co'=>'sistema.corretores'),array('id','id_usuario','ds_nome_fantasia'));
		$select->where('co.fl_ativo = true');
		$select->order('co.ds_nome_fantasia');
		$corretores = $this->fetchAll($select);

		// Insere corretores no array
		$usuarios = array();
		foreach($corretores as $corretor){
			$usuarios[$corretor['id']]['ds_nome_fantasia'] = strtoupper($corretor['ds_nome_fantasia']);
			$usuarios[$corretor['id']]['id_usuario'] = $corretor['id_usuario'];
		}

		return $usuarios;
	}

	/**
	 * Busca o Corretor pelo ID do Usuario
	 *
	 */
	public function findByUser($user) {
		$select = $this->select();
		$select->where('id_usuario = ?', $user);

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

	public function getData($where) {
		$select = $this->select()->distinct(true);
		$select->setIntegrityCheck(false);
		$select->from(array('c'=>'sistema.v_corretores'), array('id', 'id_usuario', 'ds_nome_responsavel', 'ds_nome_fantasia', 'ds_nome_corretor', 'ds_email', 'fl_ativo', 'telefones', 'telefones_lista', 'ds_nome_contato','ds_nome_abreviado', 'ativo', 'ds_nome_usuario_criacao', 'ds_nome_usuario_alteracao', 'ds_telefone_contato_seguro_agricola', 'ds_contato_seguro_agricola', 'id_comercial'));
		$select->join(array('u'=>'sistema.usuarios'), 'c.id_usuario = u.id', array('ds_nome_usuario', 'id as id_usuario'));
		$select->joinLeft(array('f'=>'sistema.funcionarios'), 'c.id_comercial = f.id_usuario', array('ds_nome_funcionario as comercial'));
		$select->joinLeft(array('ce'=>'sistema.corretores_enderecos'), 'c.id = ce.id_corretor AND ce.fl_principal = true', false);
		$select->joinLeft(array('m'=>'sistema.municipios'), 'ce.id_municipio = m.id', 'ds_nome_municipio');
		$select->joinLeft(array('e'=>'sistema.estados'), 'm.id_estado = e.id', 'ds_sigla');
		$select->join(array('cor'=>"{$this->_schema}.{$this->_name}"), 'cor.id = c.id', false);
		$select->join(array('s'=>'sistema.status'), 's.id = cor.id_status', 'ds_status');

		if (is_array($where)) {
			foreach ($where as $clause) {
				if (is_array($clause)) {
					$field = $clause['field'];
					$operator = $clause['operator'];
					$value = $clause['value'];

					$select->where("$field $operator ?", $value);
				} else {
					$select->where($clause, '');
				}
			}
		} elseif ($where != '') {
			$select->where($where);
		}

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

		return $select;
	}


	public function getComerciais($id_corretor) {
		$sql = "select id_comercial from sistema.corretores where id = $id_corretor";

		$Rs = $this->_db->fetchAll($sql);
		$ret = array();
		foreach($Rs as $id) {
			$ret[] = $id['id_comercial'];
		}

		return $ret;

	}

	/*
	 * busca os id dos corretores com os comerciais passados como argumento (array)
	 * retorna uma string com os ids dos corretores separados por virgula
	 */
	public function getCorretorComercial($id_comerciais) {
		$ids = implode(',', $id_comerciais);
		$sql = "SELECT
			        id
		        FROM
		            sistema.corretores
		        where
		            id_comercial in ($ids)";
		$Rs = $this->_db->fetchAll($sql);
		$dados = array();
		foreach($Rs as $arr) {
			$dados[] = $arr['id'];
		}

		return $dados;
	}

	public function salvarCorretor(array $data)
    {
        $row = $this->getRow($data['id']);

        $row->id_usuario = $data['id_usuario'] ?? $row->id_usuario;
        $row->nr_susep = $data['nr_susep'] ?? $row->nr_susep;
        $row->tp_pessoa = $data['tp_pessoa'] ?? $row->tp_pessoa;
        $row->cpf_cnpj = $data['cpf_cnpj'] ?? $row->cpf_cnpj;
        $row->ds_nome_corretor = $data['ds_nome_corretor'] ?? $row->ds_nome_corretor;
        $row->ds_nome_fantasia = $data['ds_nome_fantasia'] ?? $row->ds_nome_fantasia;
        $row->ds_nome_responsavel = $data['ds_nome_responsavel'] ?? $row->ds_nome_responsavel;
        $row->ds_email = $data['ds_email'] ?? $row->ds_email;
        $row->ds_email_2 = $data['ds_email_2'] ?? $row->ds_email_2;
        $row->ds_homepage = $data['ds_homepage'] ?? $row->ds_homepage;
        $row->ds_usuario_msn = $data['ds_usuario_msn'] ?? $row->ds_usuario_msn;
        $row->ds_usuario_skype = $data['ds_usuario_skype'] ?? $row->ds_usuario_skype;
        $row->ds_nome_contato = $data['ds_nome_contato'] ?? $row->ds_nome_contato;
        $row->ds_observacao = $data['ds_observacao'] ?? $row->ds_observacao;
        $row->ds_nome_abreviado = $data['ds_nome_abreviado'] ?? $row->ds_nome_abreviado;
        $row->ds_email_responsavel = $data['ds_email_responsavel'] ?? $row->ds_email_responsavel;
        $row->ds_telefone_responsavel = $data['ds_telefone_responsavel'] ?? $row->ds_telefone_responsavel;
        $row->ds_contato_seguro_agricola = $data['ds_contato_seguro_agricola'] ?? $row->ds_contato_seguro_agricola;
        $row->ds_telefone_contato_seguro_agricola = $data['ds_telefone_contato_seguro_agricola'] ?? $row->ds_telefone_contato_seguro_agricola;
        $row->ds_contato_outros = $data['ds_contato_outros'] ?? $row->ds_contato_outros;
        $row->ds_email_contato_outros = $data['ds_email_contato_outros'] ?? $row->ds_email_contato_outros;
        $row->ds_telefone_contato_outros = $data['ds_telefone_contato_outros'] ?? $row->ds_telefone_contato_outros;
        $row->ds_contato_outros_2 = $data['ds_contato_outros_2'] ?? $row->ds_contato_outros_2;
        $row->ds_email_contato_outros_2 = $data['ds_email_contato_outros_2'] ?? $row->ds_email_contato_outros_2;
        $row->ds_telefone_contato_outros_2 = $data['ds_telefone_contato_outros_2'] ?? $row->ds_telefone_contato_outros_2;
        $row->dt_url_cadastro = $data['dt_url_cadastro'] ?? $row->dt_url_cadastro;
        $row->ds_url_cadastro = $data['ds_url_cadastro'] ?? $row->ds_url_cadastro;
        $row->ds_observacao_status = $data['ds_observacao_status'] ?? $row->ds_observacao_status;
		$row->cpf_contato_seguro_agricola = $data['cpf_contato_seguro_agricola'] ?? $row->cpf_contato_seguro_agricola;
		$row->cpf_responsavel = $data['cpf_responsavel'] ?? $row->cpf_responsavel;

        if (!empty($data['cd_corretor_seguradora'])) {
            $row->cd_corretor_seguradora = $data['cd_corretor_seguradora'];
        }

        if (!empty($data['id_comercial'])) {
            $row->id_comercial = $data['id_comercial'];
        }

        if (!empty($data['id_status'])) {
            $row->id_status = $data['id_status'];
        }

        if (!empty($data['fl_treinado'])) {
            $row->fl_treinado = $data['fl_treinado'];
        }

        if (!empty($data['fl_ativo'])) {
            $row->fl_ativo = $data['fl_ativo'];
        }

        $row->fl_permite_reduzir_comissao = $data['fl_permite_reduzir_comissao'];

        // ao cadastrar um novo corretor o mesmo deve entrar inativo
        if(!$data['id']){
            $row->fl_ativo = '0';
        }

        if (array_key_exists('fl_permite_alterar_comissao', $data)) {
            $row->fl_permite_alterar_comissao = $data['fl_permite_alterar_comissao'];
        }

        $row->save();

        return $row;
    }

    public function getDadosCorretorByHash(string $hash)
    {
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('c'=>'sistema.corretores'), '*');
        $select->where('ds_url_cadastro = ?', $hash);

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

	public function getCheckLogins() {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('co'=>'sistema.corretores'),array('id','id_usuario','ds_nome_fantasia'));
		$select->where('co.fl_ativo = true');
		$select->order('co.ds_nome_fantasia');
		$corretores = $this->fetchAll($select);

		// Insere corretores no array
		$logins = array(0 => 'Selecione um Corretor');
		foreach($corretores as $corretor){
			$logins[$corretor['id_usuario']] = strtoupper($corretor['ds_nome_fantasia']);
		}
		return $logins;
	}

	public function getCorretoresPessoaJuridicaAtivos(): Zend_Db_Table_Rowset
	{
		return $this->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->from(['sc' => 'sistema.corretores'], ['id_usuario', 'ds_email', 'cpf_cnpj'])
				->join(['su' => 'sistema.usuarios'], 'su.id = sc.id_usuario', false)
				->where('sc.fl_ativo IS TRUE')
				->where('su.fl_ativo IS TRUE')
				->where("sc.tp_pessoa = 'J'")
				->where('sc.id_status = '. Sistema_Model_Corretores::ID_STATUS_CONCLUIDO_FINALIZADO)
				->where('su.fl_bloqueio_inatividade IS FALSE')
		);
	}
}
