<?php

class Sistema_VistoriadoresauxiliaresController extends Agro_Controller_Action
{
    protected $_paginator = false;

    public function init()
    {
        $this->view->title = 'Sistema » Cadastro » Vistoriadores e Auxiliares';
    }

    public function setBack()
    {
        $this->view->back = '/sistema/vistoriadoresauxiliares';
    }

    public function getForm()
    {
        return new Sistema_Form_VistoriadoresAuxiliares();
    }

    public function getModel()
    {
        return new Sistema_Model_VistoriadoresAuxiliares();
    }

    public function activeAction()
    {
        $this->isAjax();
        $result = array('status' => false);

        if ($this->getRequest()->getParam('id')) {
            $rowFuncionario = $this->getModel()->getRow($this->getRequest()->getParam('id'));
            $rowUsuario = (new Sistema_Model_Usuarios())->find($rowFuncionario->id_usuario)->current();
            $ativo = $rowFuncionario->fl_ativo ? 0 : 1;
            $rolesValidas = [Sistema_Model_Roles::ID_VISTORIADOR, Sistema_Model_Roles::ID_VISTORIADOR_RESP];

            if ($rowUsuario->tp_usuario === Sistema_Model_Usuarios::TIPO_USUARIO_VISTORIADOR
                && in_array($rowUsuario->id_role, $rolesValidas)) {
                (new Sistema_Model_VistoriadoresStatus())->save([
                    'id_funcionario' => $rowFuncionario->id,
                    'id_status' => $this->getModel()->getIdStatus(Sistema_Model_VistoriadoresStatus::DS_CHAVE_NAO_CONFERIDO, Sistema_Model_Tipostatus::DS_CHAVE_CADASTRO_VISTORIADORES),
                    'ds_observacao' => $ativo ? 'Cadastro do vistoriador ativado.' : 'Cadastro do vistoriador inativado.'
                ]);
            }

            $rowFuncionario->fl_ativo = $ativo;
            $rowFuncionario->save();

            $rowUsuario->fl_ativo = $ativo;
            $rowUsuario->save();

            $result['ativo'] = $ativo;

            $this->getResponse()->setBody(Zend_Json::encode($result));
        }
    }

    public function resetAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

        $idUsuario = $this->getRequest()->getParam('id');

        if ($idUsuario) {
            $Model = new Sistema_Model_UsuarioAcao();
            $clear = $Model->clear($idUsuario);

            if ($clear) {
                /**
                 * Se o usuário for preposto, verifica se tem restrições configuradas para que estas sejam mantidas
                 */
                $modelPrepostos = new Sistema_Model_Prepostos();
                $rowPreposto = $modelPrepostos->findByUser($idUsuario);

                if (!empty($rowPreposto) && !empty($rowPreposto['ds_excecoes'])) {
                    $excecoes = explode(',', $rowPreposto['ds_excecoes']);
                    $acoesExcecao = ['id_acao' => ['nao_permitido' => []], 'id_usuario' => $idUsuario];

                    foreach ($excecoes as $excecao) {
                        if ($excecao === '2') {
                            continue;
                        }

                        $acoesExcecao['id_acao']['nao_permitido'] = array_merge(
                            $acoesExcecao['id_acao']['nao_permitido'], Sistema_Model_ExcecaoUsuario::$_RESTRICOES_PREPOSTO[trim($excecao)]
                        );
                    }

                    $modelExcecaoUsuario = new Sistema_Model_ExcecaoUsuario();
                    $modelExcecaoUsuario->setBloqueioAcao($acoesExcecao);
                }

                $this->getResponse()->setBody("alert('Exceções removidas com sucesso.')");
            } else {
                $this->getResponse()->setBody("alert('Não foi possível realizar o procedimento.')");
            }
        }
    }

    public function getFilter()
    {
        $where = [];
        $where[] = [
            'field' => 'us.tp_usuario',
            'operator' => '<>',
            'value' => 'F'
        ];

        $usuarioLogado = Zend_Auth::getInstance()->getIdentity();

        if (!Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro()) {
            if ($usuarioLogado->fl_responsavel_empresa) {
                $where[] = [
                    'field' => 'f.id_empresa',
                    'operator' => '=',
                    'value' => $usuarioLogado->id_empresa
                ];
            }
        }

        if ($this->getRequest()->getParam('ds_nome_funcionario')) {
            $where[] = array(
                'field' => 'ds_nome_funcionario',
                'operator' => 'ilike',
                'value' => '%' . $this->getRequest()->getParam('ds_nome_funcionario') . '%'
            );
        }

        if ($this->getRequest()->getParam('id_empresa')) {
            $where[] = array(
                'field' => 'f.id_empresa',
                'operator' => '=',
                'value' => $this->getRequest()->getParam('id_empresa')
            );
        }

        if ($this->getRequest()->getParam('id_departamento')) {
            $where[] = array(
                'field' => 'id_departamento',
                'operator' => '=',
                'value' => $this->getRequest()->getParam('id_departamento')
            );
        }

        if ($this->getRequest()->getParam('fl_ativo')) {
            $where[] = array(
                'field' => 'f.fl_ativo',
                'operator' => '=',
                'value' => $this->getRequest()->getParam('fl_ativo')
            );
        }

        if ($this->getRequest()->getParam('id_categoria')) {
            $where[] = array(
                'field' => 'e.id_categoria',
                'operator' => '=',
                'value' => $this->getRequest()->getParam('id_categoria')
            );
        }

        if ($this->getRequest()->getParam('id_status')) {
            $where[] = array(
                'field' => 'svs.id_status',
                'operator' => '=',
                'value' => $this->getRequest()->getParam('id_status')
            );
        }

        if ($this->getRequest()->getParam('cpf_search')) {
            $where[] = array(
                'field' => 'f.cpf_cnpj',
                'operator' => '=',
                'value' => $this->getRequest()->getParam('cpf_search')
            );
        }
        
        return $where;
    }

    public function listAction()
    {
        $this->getHelper('layout')->disableLayout();

        $Module = $this->getRequest()->getModuleName();
        $Controller = $this->getRequest()->getControllerName();

        $Session = new Zend_Session_Namespace('filtro');
        $Session->{$Module}->{$Controller} = $this->getRequest()->getParams();

        $Where = $this->getFilter();
        $Model = $this->getModel();
        $Select = $Model->getData($Where);
        $aux = $Model->getPaginator($Select, $this->getRequest()->getParam('page'), 20);
        $this->view->paginator = $aux;
    }

    public function excelAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

        ini_set('memory_limit', '4096M');
        ini_set('max_execution_time', 360);

        $where = $this->getFilter();

        $Module = $this->getRequest()->getModuleName();
        $Controller = $this->getRequest()->getControllerName();
        $Model = $this->getModel();

        if ($this->getRequest()->getParam("o")) {
            $Model->_order = trim($this->getRequest()->getParam("o") . ' ' . $this->getRequest()->getParam("s"));
        }

        $Rs = $Model->fetchAllPaginator($where);
        foreach ($Rs as $key => $value) {
            $value->fl_liberado_tablet_previa = $value->fl_liberado_tablet_previa ? 'Sim' : 'Não';
            $value->fl_ativo = $value->fl_ativo ? 'Sim' : 'Não';
        }

        if ($Model->_columnExcel) {
            $Csv = new Agro_Plugin_Rs2Csv();
            $Csv->setTitles($Model->_columnExcel);
            $Csv->setRecordSet($Rs);
            $Csv->setType("application/octet-stream");
            $Csv->setFileName("pesquisa.csv");
            $Csv->setDisposition("attachment");
            $Csv->setSeparator(";");
            $Csv->getCsv();
        } else {
            $Csv = new Agro_Plugin_Rs2Csv();
            $Csv->setTitles($Model->_columnExcel);
            $Csv->setRecordSet(array('Excel não configurado'));
            $Csv->setType("application/octet-stream");
            $Csv->setFileName("notfound.csv");
            $Csv->setDisposition("attachment");
            $Csv->setSeparator(";");
            $Csv->getCsv();
        }
    }

    public function formAction()
    {
        $this->_backAfterSave = false;
        $this->view->ocultarMenu = false;
        $this->setBack();
        
        parent::formAction();

        $form = $this->view->form;
        
        if ($this->getRequest()->has('ocultarMenu')) {
            $this->view->ocultarMenu = true;
            $this->view->back = '';
        }

        $this->view->bloquearCadastro = false;
        $this->view->statusAtual = null;
        $this->view->statusCadastroVistoriador = (new Sistema_Model_Status())
            ->getListStatus(Sistema_Model_Tipostatus::DS_CHAVE_CADASTRO_VISTORIADORES)
            ->toArray();

        $id = !empty($form->id) ? (int) $form->id->getValue() : null;

        if ($id !== null) {
            $vistoriadoresStatusModel = new Sistema_Model_VistoriadoresStatus();
            $vistoriadorModel = (new Sistema_Model_Funcionarios())->getRow($id);
            
            $this->view->statusAtual = $vistoriadoresStatusModel
                ->getStatusVistoriador($id)
                ->current();
            
            if (!empty($this->view->statusAtual)) {
                if ($this->view->statusAtual['ds_chave'] !== Sistema_Model_VistoriadoresStatus::DS_CHAVE_CONFERIDO) {
                    if (
                        $form->tp_usuario->getValue() === Sistema_Model_Usuarios::TIPO_USUARIO_VISTORIADOR
                        && !Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro()
                        && Zend_Auth::getInstance()->getIdentity()->id === $form->id_usuario->getValue()
                    ) {
                        $this->view->ocultarMenu = true;
                        $this->view->back = '';
                    }
                    
                    /**
                     * empty($this->getRequest()->getParam('id')): para bloquear após VISTORIADOR editar cadastro no primeiro acesso
                     * !empty($vistoriadorModel->id_usuario_alteracao): caso VISTORIADOR já houver editado seu cadastro
                     */
                    if (
                        $this->view->statusAtual['ds_chave'] === Sistema_Model_VistoriadoresStatus::DS_CHAVE_NAO_CONFERIDO
                        && (
                            (bool) $this->getRequest()->getParam('fl_cadastro_inicial') === false
                            || !empty($vistoriadorModel->id_usuario_alteracao)
                            || empty($this->getRequest()->getParam('id'))
                        )
                    ) {
                        $this->view->bloquearCadastro = true;
                    }
                }
            }
        } else {
            $this->view->form->populate([]);
        }
    }
    
    public function beforeSave()
    {
        $modelFuncionarios = $this->getModel();
        $parametros = $this->getRequest()->getParams();
        $usuarioLogado = Zend_Auth::getInstance()->getIdentity();

        if (!empty($parametros['cpf_cnpj'])) {
            $dadosVistoriador = current($modelFuncionarios->getByCpf($parametros['cpf_cnpj']));

            if (!empty($dadosVistoriador) && (empty($parametros['id']) || (int) $dadosVistoriador['id'] !== (int) $parametros['id'])) {
                $mensagemErro = "O CPF informado já possui cadastro ativo no AgroNet.";
                $mensagemErro .= "<br>Por gentileza realize contato com a equipe de Sinistro para mais informações.";
                $mensagemErro .= "<br>E-mail: cobranca.vistorias@agrobrasilseguros.com.br";
                $mensagemErro .= "<br>Telefone: (51) 3383-5100";

                throw new Exception($mensagemErro, 403);
            }
        }

        if ($parametros['fl_responsavel_empresa_hidden']) {
            $where = [
                "id_empresa = {$parametros['id_empresa']}",
                "fl_responsavel_empresa is true",
            ];

            if (!empty($parametros['id_usuario'])) {
                $where[] = "id_usuario <> {$parametros['id_usuario']}";
            }

            $row = $modelFuncionarios->fetchAll($where)->current();

            if (!empty($row)) {
                throw new Exception("Perito '{$row['ds_nome_funcionario']}' já encontra-se cadastrado como responsável da empresa.", 403);
            }
        }

        $this->getRequest()->setParam('fl_responsavel_empresa', (int)$parametros['fl_responsavel_empresa_hidden']);

        if ($usuarioLogado->tp_usuario === Sistema_Model_Usuarios::TIPO_USUARIO_VISTORIADOR
            && (int)$parametros['id_usuario'] === (int)$usuarioLogado->id
        ) {
            $camposObrigatoriosVistoriador = [
                $parametros['ds_endereco_cep'],
                $parametros['ds_endereco_bairro'],
                $parametros['ds_endereco_rua'],
                $parametros['ds_endereco_nro'],
                $parametros['id_municipio'],
                $parametros['id_estado'],
                $parametros['ds_endereco_nro'],
                $parametros['ds_crea'],
            ];

            $camposObrigatoriosVistoriadorVazio = array_filter($camposObrigatoriosVistoriador, function ($valor) {
                return empty($valor);
            });

            if (!empty($camposObrigatoriosVistoriadorVazio)) {
                $mensagem = "É obrigatório o preenchimento dos seguintes campos:";
                $mensagem .= "<br>- CEP";
                $mensagem .= "<br>- UF";
                $mensagem .= "<br>- Município";
                $mensagem .= "<br>- Bairro";
                $mensagem .= "<br>- Endereço";
                $mensagem .= "<br>- Número";
                $mensagem .= "<br>- CREA/CFTA";

                throw new \Exception($mensagem, 403);
            }
        }

        $this->validarUsuario($parametros);

        if (empty($parametros['id'])) {
            $novaSenha = (new Agro_Senha())->gerarNovaSenha();

            $this->getRequest()->setParam('ds_senha', $novaSenha);
            $this->getRequest()->setParam('ds_senha2', $novaSenha);

            if (!Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro() && $usuarioLogado->fl_responsavel_empresa) {
                if (!$this->getRequest()->has('ds_nome_funcionario')) {
                    $this->getRequest()->setParam('ds_nome_funcionario', '');
                }

                if (!$this->getRequest()->has('ds_nome_guerra')) {
                    $this->getRequest()->setParam('ds_nome_guerra', '');
                }
            }

            if ($this->alterarStatus($parametros, [])) {
                $this->getRequest()->setParam('statusNaoConferido', true);
                $this->getRequest()->setParam('fl_cadastro_inicial', true);
                $this->getRequest()->setParam('observacaoStatus', 'Cadastro inicial.');
            }
        }

        if (!empty($parametros['id'])) {
            if (!Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro() && (int)$usuarioLogado->id === (int)$parametros['id_usuario']) {
                $rowsTelefones = (new Sistema_Model_Telefones())->getTelefoneUsuario($parametros['id_usuario'])->toArray();
                $celularParticular = array_filter($rowsTelefones, function($telefone) {
                   return (int) $telefone['id_tipo_telefone'] === Sistema_Model_Telefones::ID_CELULAR_PARTICULAR;
                });

                $mensagem = "É obrigatório que seja informado um número de telefone do tipo 'Celular Particular'.";
                $whatsApp = true;

                if ($parametros['tp_usuario'] === Sistema_Model_Usuarios::TIPO_USUARIO_VISTORIADOR) {
                    $mensagem = "É obrigatório que seja informado um número de telefone do tipo 'Celular Particular' e um número de telefone do tipo 'WhatsApp'.";

                    $whatsApp = array_filter($rowsTelefones, function ($telefone) {
                        return (int)$telefone['id_tipo_telefone'] === Sistema_Model_Telefones::ID_WHATSAPP;
                    });
                }

                if (empty($celularParticular) || empty($whatsApp)) {
                    throw new \Exception($mensagem, 403);
                }
            }

            $rowEmpresa = (new Sistema_Model_Empresas())->getRow($parametros['id_empresa']);

            if (!$parametros['fl_responsavel_empresa'] && !$parametros['fl_responsavel_empresa_hidden']) {
                if (
                    trim($parametros['ds_endereco_cep']) === trim($rowEmpresa['ds_endereco_cep'])
                    && strtolower(Agro_Util::removeAcentos(trim($parametros['ds_endereco_rua']))) === strtolower(Agro_Util::removeAcentos(trim($rowEmpresa['ds_endereco_rua'])))
                    && (int)$parametros['id_municipio'] === (int)$rowEmpresa['id_municipio']
                    && trim($parametros['ds_endereco_nro']) === trim($rowEmpresa['ds_endereco_nro'])
                ) {
                    throw new \Exception("O endereço informado é o mesmo endereço cadastrado para sua empresa. Por favor, informe seu endereço residencial.", 403);
                }
            
                if (trim($parametros['ds_email']) === trim($rowEmpresa['ds_email'])) {
                    throw new \Exception("O endereço de e-mail informado é o mesmo cadastrado para sua empresa. Por favor, informe um outro e-mail válido.", 403);
                }
            }

            if (empty($this->getRequest()->getParam('ds_nome_funcionario'))) {
                $this->getRequest()->setParam('ds_nome_funcionario', null);
            }

            $rowFuncionario = (new Sistema_Model_Funcionarios())->find($parametros['id'])->current()->toArray();
            
            if ($this->getRequest()->has('ocultarMenu')) {
                $this->getRequest()->setParam('enviarEmailAtualizacaoCadastral', true);
            }

            if (
                $this->alterarStatus($parametros, $rowFuncionario)
                && (int)$usuarioLogado->id === (int)$parametros['id_usuario']
            ) {
                $this->getRequest()->setParam('statusNaoConferido', true);
                $this->getRequest()->setParam('fl_cadastro_inicial', false);
                $this->getRequest()->setParam('observacaoStatus', 'Atualização de dados cadastrais.');
            
                $this->_backAfterSave = false;
            }

            if ($parametros['tp_usuario'] === Sistema_Model_Usuarios::TIPO_USUARIO_VISTORIADOR) {
                $vistoriadorStatus = (new Sistema_Model_VistoriadoresStatus())->getStatusVistoriador((int)$parametros['id'])->current();

                if ($vistoriadorStatus['ds_chave'] === Sistema_Model_VistoriadoresStatus::DS_CHAVE_CONFERIDO) {
                    $this->_backAfterSave = false;
                }
            }

            $camposAlterados = $this->validarCamposAlterados($parametros);

            $this->validaNomeCpfDataNascimento($camposAlterados, $rowFuncionario);

            $this->getRequest()->setParam('dadosAlterados', $camposAlterados);
        }

        if (!empty(trim($this->getRequest()->getParam('ds_senha')))) {
            $this->getRequest()->setParam('validarSenha', true);
        }
    }

    private function validaNomeCpfDataNascimento(
        array $camposAlterados,
        ?array $rowFuncionario
    ): void {
        $usuarioLogado = Zend_Auth::getInstance()->getIdentity();

        if (
            empty($rowFuncionario)
            || Sistema_Model_Usuarios::isTipoUsuarioIgnoraStatusConferido($usuarioLogado->tp_usuario)
        ) {
            return;
        }

        $jaFoiConferido = (new Sistema_Model_VistoriadoresStatus())
                ->hasStatusConferido((int)$this->getRequest()->getParam('id'));
        $lancaErro = false;
        $isTipoUsuarioVistoriador = Sistema_Model_Usuarios::isTipoUsuarioVistoriador($usuarioLogado->tp_usuario);

        if (
            array_key_exists('ds_nome_funcionario', $camposAlterados)
            || array_key_exists('cpf_cnpj', $camposAlterados)
            || array_key_exists('dt_nascimento', $camposAlterados)
        ) {
            if (
                $jaFoiConferido
                && $isTipoUsuarioVistoriador
            ) {
                $lancaErro = true;
            } elseif(
                !$jaFoiConferido 
                && (
                    !$isTipoUsuarioVistoriador
                    || (
                        $isTipoUsuarioVistoriador
                        && !empty($rowFuncionario['id_usuario_alteracao'])
                    )
                )
            ) {
                $lancaErro = true;
            }
        }

        if ($lancaErro) {
            throw new \Exception(
                "Os seguintes campos não podem ser alterados caso seu status alguma vez tenha sido atualizado para Conferido:\n" 
                . 'CPF, Data de Nascimento e Nome Completo',
                403
            );
        }
    }

    public function indexAction()
    {
        $usuarioLogado = Zend_Auth::getInstance()->getIdentity();

        if (!Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro() && !$usuarioLogado->fl_responsavel_empresa) {
            $rowFuncionario = (new Sistema_Model_Funcionarios())->getFuncionarioByIdUsuario($usuarioLogado->id);

            if (!empty($rowFuncionario)) {
                $this->view->back = '';
                $this->_redirect("/sistema/vistoriadoresauxiliares/form/id/{$rowFuncionario['id']}");
            }
        }

        parent::indexAction();
    }

    public function afterSave()
    {
        $parametros = $this->getRequest()->getParams();
        $enviarEmailAtualizacaoCadastral = $this->getRequest()->has('enviarEmailAtualizacaoCadastral');

        if (empty($parametros['id']) || $enviarEmailAtualizacaoCadastral) {
            try {
                $usuario = (new Sistema_Model_Usuarios())->fetchRow("ds_nome_usuario = '{$parametros['ds_nome_usuario']}'");

                if (empty($usuario)) {
                    throw new Exception('Usuário inválido.');
                }

                if (!$usuario->fl_ativo) {
                    throw new Exception('Usuário bloqueado.');
                }

                $hash = (new Agro_Senha())->gerarHash();
                $usuario->ds_url_senha = $hash;
                $usuario->dt_expiracao_url_senha = date('Y-m-d H:i:s');
                $usuario->nr_solicitacoes_troca_senha = (int)$usuario->nr_solicitacoes_troca_senha + 1;

                if (!$usuario->save()) {
                    throw new Exception('Erro ao atualizar informações do usuário.');
                }

                $this->view->cadastroInicial = !$enviarEmailAtualizacaoCadastral;
                $this->view->usuario = $parametros['ds_nome_usuario'];
                $this->view->link = "{$this->protocoloUrlNovaSenha}{$this->urlNovaSenha}{$this->parametrosUrlNovaSenha}";
                $this->view->link .= $hash;

                $agroMail = new Agro_Mail();
                $agroMail->addTo($parametros['ds_email']);
                $agroMail->setSubject("Cadastro AgroNet® 2.0");
                $agroMail->setBody($this->view->render('vistoriadoresauxiliares/emailcadastro.phtml'));
                $agroMail->send();
            } catch (Exception $erro) {
                throw new Exception($erro->getMessage(), 403);
            }
        }
    }

    /**
     * @return void
     * @throws Exception
     */
    public function salvarstatusvistoriadorAction()
    {
        $this->isAjax();
        $parametros = $this->getRequest()->getParams();
        $retorno = ['erro' => false, 'mensagem' => 'Status salvo com sucesso.'];
        
        if (empty($parametros['id_funcionario']) || empty($parametros['id_status'])) {
            throw new Exception('É necessário informar o funcionário e selecionar o status');
        }

        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        try {
            $adapter->beginTransaction();

            $idStatus = (int)$parametros['id_status'];

            $idVistoriadorStatus = (new Sistema_Model_VistoriadoresStatus())->save($parametros);
            if (!$idVistoriadorStatus) {
                throw new Exception('Erro ao salvar o status.');
            }

            if ($idStatus === $this->getModel()->getIdStatus(Sistema_Model_VistoriadoresStatus::DS_CHAVE_PENDENTE, Sistema_Model_Tipostatus::DS_CHAVE_CADASTRO_VISTORIADORES)) {
                $agroMail = new Agro_Mail();
                $agroMail->addTo($parametros['ds_email']);
                $agroMail->setSubject("Pendências - AgroNet® 2.0");
                $agroMail->setBody($this->view->render('vistoriadoresauxiliares/emailpendencias.phtml'));
                $agroMail->send();
            }

            if ($idStatus === $this->getModel()->getIdStatus(Sistema_Model_VistoriadoresStatus::DS_CHAVE_CONFERIDO, Sistema_Model_Tipostatus::DS_CHAVE_CADASTRO_VISTORIADORES)) {
                $modelTreinamentoVistorias = new Sistema_Model_TreinamentoVistorias();
                $modelTreinamentoVistorias->migrarTreinamentos($parametros['id_funcionario']);

                $agroMail = new Agro_Mail();
                $agroMail->addTo($parametros['ds_email']);
                $agroMail->setSubject("Cadastro Conferido - AgroNet® 2.0");
                $agroMail->setBody($this->view->render('vistoriadoresauxiliares/emailconferido.phtml'));
                $agroMail->send();

                (new Sistema_Service_VistoriadorAuxiliar((int)$parametros['id_funcionario']))
                    ->enviarEmailAgronomosResponsaveis($idStatus, $idVistoriadorStatus);
            }

            $adapter->commit();
        } catch (Exception $erro) {
            $adapter->rollback();
            $retorno['erro'] = true;
            $retorno['mensagem'] = $erro->getMessage();
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    public function historicostatusAction()
    {
        $this->isAjax();

        return $this->getResponse()->setBody(Zend_Json::encode(
            (new Sistema_Model_VistoriadoresStatus())->getStatusVistoriador((int)$this->getRequest()->getParam('idFuncionario'))->toArray())
        );
    }

    /**
     * @param array $parametros
     * @param array $rowFuncionario
     * @return bool
     */
    private function alterarStatus(array $parametros, array $rowFuncionario): bool
    {
        $rolesValidas = [Sistema_Model_Roles::ID_VISTORIADOR, Sistema_Model_Roles::ID_VISTORIADOR_RESP];

        if (empty($rowFuncionario)) {
            return true;
        }

        $rowUsuario = (new Sistema_Model_Usuarios())->find($parametros['id_usuario'])->current()->toArray();

        if ($parametros['ds_crea'] !== $rowFuncionario['ds_crea']) {
            return true;
        }

        if ((int)$parametros['id_tipo_carteira_profissional'] !== (int)$rowFuncionario['id_tipo_carteira_profissional']) {
            return true;
        }

        if ($parametros['tp_usuario'] !== $rowUsuario['tp_usuario']
            && $parametros['tp_usuario'] === Sistema_Model_Usuarios::TIPO_USUARIO_VISTORIADOR
            && in_array($parametros['id_role'], $rolesValidas)
        ) {
            return true;
        }

        if ($parametros['tp_usuario'] === Sistema_Model_Usuarios::TIPO_USUARIO_VISTORIADOR
            && (int)$parametros['id_role'] !== (int)$rowUsuario['id_role']
            && in_array($parametros['id_role'], $rolesValidas)
        ) {
            return true;
        }

        return false;
    }

    private function validarCamposAlterados(array $parametros)
    {
        $dadosAntesAlteracao = json_decode($parametros['dadosSerializados']);
        $dadosAlterados = [];

        foreach ($dadosAntesAlteracao as $campo) {
            if ($campo->name === 'dadosSerializados') {
                continue;
            }

            if (isset($parametros[$campo->name]) && $parametros[$campo->name] !== $campo->value) {
                $dadosAlterados[$campo->name] = $campo->value;
            }
        }

        return $dadosAlterados;
    }

    public function redirecionamentocadastroAction()
    {
        $vistoriador = $this->getModel()->getFuncionarioByIdUsuario(Zend_Auth::getInstance()->getIdentity()->id);
        $this->_redirect("/sistema/vistoriadoresauxiliares/form/id/{$vistoriador['id']}");
    }

    public function deleteAction()
    {
        $this->isAjax();
		$result = array();

        try {
            $params = $this->getRequest()->getParams();

            if (empty($params['id'])) {
                throw new Exception("ID do vistoriador/auxiliar não informado.");
            }
    
            if (!filter_var($params['id'], FILTER_VALIDATE_INT)) {
                throw new Exception("ID do vistoriador/auxiliar inválido.");
            }
            
            $idFuncionario = (int) $params['id'];

            $modelVistoriadoresStatus = new Sistema_Model_VistoriadoresStatus();
            $model = $this->getModel();
            $model->getAdapter()->beginTransaction();
            
            $hasStatusConferido = $modelVistoriadoresStatus->hasStatusConferido($idFuncionario);
            if (!$hasStatusConferido){
                
                $funcionario = (new Sistema_Model_Funcionarios)->find($idFuncionario)->current();

                if (!empty($funcionario)) {

                    $modelTelefones = new Sistema_Model_Telefones();
                    $modelUsuarioHistoricoSenha = new Sistema_Model_UsuarioHistoricoSenha();
                    $modelManualUsuarios = new Manual_Model_ManualUsuarios();
                    $modelUsuarios = new Sistema_Model_Usuarios();
                    $modelLogAlteracoesCadastroFuncionarios = new Log_Model_LogAlteracoesCadastroFuncionarios();
                    $modelTreinamentoVistorias = new Sistema_Model_TreinamentoVistorias();

                    $modelTelefones->delete($funcionario['id_usuario'], 'id_usuario');
                    $modelUsuarioHistoricoSenha->delete($funcionario['id_usuario'], 'id_usuario');
                    $modelManualUsuarios->delete($funcionario['id_usuario'], 'id_usuario');
                    $modelUsuarios->delete($funcionario['id_usuario']);

                    $modelVistoriadoresStatus->delete($idFuncionario, 'id_funcionario');
                    $modelLogAlteracoesCadastroFuncionarios->delete($idFuncionario, 'id_funcionario');
                    $modelTreinamentoVistorias->delete($idFuncionario, 'id_funcionario');
                }
            }
            
			if ($model->delete($idFuncionario)) {
				$result['execute'] = $model->executeJsAfterDelete;
				$result['executeValue'] = $model->executeJsValueAfterDelete;
				$result['message'] = MSG_SUCCESS;
				$result['status'] = true;

				$model->getAdapter()->commit();
			} else {
				$result['message'] = MSG_ERROR;
				$result['status'] = false;

				$model->getAdapter()->rollBack();
			}
        } catch (\Throwable $th) {
            $model->getAdapter()->rollback();
            
            $result['status'] = false;
            $result['message'] = $this->view->escape($th->getMessage());

			if ($th->getCode() == 23503) {
                $result['message'] = $this->view->escape(MSG_DELETE_FK_ERROR);
			}

			Agro_Util::informaErroAgronet($th->getMessage());
        }
        
        $this->getResponse()->setBody(Zend_Json::encode($result));
    }
}
