/**
  * Processa o submit do cadastro de pessoa [ajax]
  */
 public function cadastroSalvarAction()
 {
     $aDados = $this->getRequest()->getPost();
     $oForm = new Administrativo_Form_CadastroPessoa();
     $oForm->carregarCidades($aDados['estado'], $aDados['cidade']);
     // Verifica se deve validar o combo ou campo texto para o bairro e endereço
     if (isset($aDados['cod_bairro']) && !empty($aDados['cod_bairro'])) {
         $oForm->getElement('bairro')->setRequired(FALSE);
         $oForm->carregarBairros($aDados['cidade']);
         $oForm->carregarEnderecos($aDados['cod_bairro']);
     }
     if (isset($aDados['bairro']) && !empty($aDados['bairro'])) {
         $oForm->getElement('cod_bairro')->setRequired(FALSE);
     }
     // Popula o formulario
     $oForm->populate($aDados);
     // Valida o formulario
     if ($oForm->isValid($aDados)) {
         $oCadastro = new Administrativo_Model_Cadastro();
         $oCadastro->persist($aDados);
         $aRetornoJson['status'] = TRUE;
         $aRetornoJson['success'] = 'Requisição de emissão de DMS enviada.';
     } else {
         $aRetornoJson['status'] = FALSE;
         $aRetornoJson['fields'] = array_keys($oForm->getMessages());
         $aRetornoJson['error'][] = 'Preencha os dados corretamente.';
     }
     // Retorna um json com mensagens de erro ou sucesso
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }
 /**
  * Método para persistir os dados do cadastro eventual [Json]
  *
  * @return void
  */
 public function salvarAction()
 {
     $aDados = $this->getAllParams();
     $oForm = new Administrativo_Form_CadastroPessoa();
     // Carrega a lista de cidade e seta os selecionados
     if (!empty($aDados['estado']) && !empty($aDados['cidade'])) {
         $oForm->carregarCidades($aDados['estado'], $aDados['cidade']);
     }
     // Se informado o bairro pelo combo, retira a validação do campo texto
     if (isset($aDados['cod_bairro']) && !empty($aDados['cod_bairro'])) {
         $oForm->getElement('bairro')->setRequired(FALSE);
         $oForm->carregarBairros($aDados['cidade']);
     }
     // Se informado o bairro pelo campo texto, retira a validação do combo
     if (isset($aDados['bairro']) && !empty($aDados['bairro'])) {
         $oForm->getElement('cod_bairro')->setRequired(FALSE);
     }
     // Se informado o bairro pelo combo, retira a validação do campo texto
     if (isset($aDados['cod_endereco']) && !empty($aDados['cod_endereco'])) {
         $oForm->getElement('endereco')->setRequired(FALSE);
         $oForm->carregarEnderecos($aDados['cod_endereco']);
     }
     // Se informado o bairro pelo campo texto, retira a validação do combo
     if (isset($aDados['endereco']) && !empty($aDados['endereco'])) {
         $oForm->getElement('cod_endereco')->setRequired(FALSE);
     }
     if ($aDados['id_perfil'] == 6) {
         $oForm->getElement('cnpjcpf')->removeDecorator('DBSeller_Validator_CpfCnpj');
         $oForm->getElement('cnpjcpf')->addValidator(new DBSeller_Validator_Cnpj());
     } else {
         $oForm->getElement('cnpjcpf')->addValidator(new DBSeller_Validator_CpfCnpj());
     }
     // Popula o formulario
     $oForm->populate($aDados);
     // Valida o formulario
     if ($oForm->isValid($aDados)) {
         // Recupera os parametros, limpando as máscaras com filters do form
         $aDados = $oForm->getValues();
         // Recupera as configurações do doctrine e inicia a transação
         $oDoctrine = Zend_Registry::get('em');
         $oDoctrine->getConnection()->beginTransaction();
         try {
             $aUsuarioEmail = Administrativo_Model_Usuario::getByAttribute('email', $aDados['email']);
             if (count($aUsuarioEmail) > 0) {
                 $sUrl = '<a href="' . $this->view->serverUrl('/auth/login/esqueci-minha-senha/') . '">Clique Aqui</a>';
                 $sMensagemErro = 'Já encontramos um cadastro com este email.<br>';
                 $sMensagemErro .= "Caso tenha esquecido sua senha. {$sUrl}";
                 throw new Exception($this->translate->_($sMensagemErro));
             }
             $aUsuarioSistema = Administrativo_Model_Usuario::getByAttribute('login', $aDados['cnpjcpf']);
             if (count($aUsuarioSistema) > 0) {
                 $sMensagemErro = 'Já encontramos um cadastro com essas informações.<br>';
                 $sMensagemErro .= 'Entre em contato com a prefeitura para maiores informações.';
                 throw new Exception($this->translate->_($sMensagemErro));
             }
             $sHash = NULL;
             $oParametosPrefeitura = Administrativo_Model_Prefeitura::getDadosPrefeituraBase();
             if (!$oParametosPrefeitura->getVerificaAutocadastro()) {
                 $sHash = hash('whirlpool', $aDados['cnpjcpf'] . time() . $aDados['email']);
                 $aDados['tipo_liberacao'] = Contribuinte_Model_CadastroPessoa::TIPO_LIBERACAO_USUARIO_CGM;
             }
             $aDados['hash'] = $sHash;
             $oCadastro = new Contribuinte_Model_CadastroPessoa();
             $oCadastro->setDadosEventual($aDados);
             $oCadastro->persist();
             if ($oParametosPrefeitura->getVerificaAutocadastro()) {
                 $sTextoEmail = $this->view->render('cadastro-eventual/email-aviso-fiscal.phtml');
                 $aUsuariosFiscais = Administrativo_Model_Usuario::getByAttribute('perfil', 5);
                 // Cria um array, mesmo quando for somente um objeto
                 if (is_object($aUsuariosFiscais)) {
                     $aUsuariosFiscais = array($aUsuariosFiscais);
                 }
                 if (is_array($aUsuariosFiscais)) {
                     foreach ($aUsuariosFiscais as $oUsuarioFiscal) {
                         // Envia email apenas para os fiscais habilitados
                         if ($oUsuarioFiscal->getHabilitado()) {
                             DBSeller_Helper_Mail_Mail::send($oUsuarioFiscal->getEmail(), $this->translate->_('ECidadeOnline2 - Solicitação de Contribuinte Eventual'), $sTextoEmail);
                         }
                     }
                 }
                 // Envio do email para o contribuinte, avisando da  espera do envio do email
                 $sTextoEmail = $this->view->render('cadastro-eventual/email-aviso-espera-liberacao-contribuinte.phtml');
                 DBSeller_Helper_Mail_Mail::send($aDados['email'], $this->translate->_('ECidadeOnline2 - Solicitação de Cadastro'), $sTextoEmail);
             } else {
                 //link base do sistema + caminho para geração de senha
                 $this->view->sLinkSenha = $this->view->serverUrl("/default/cadastro-eventual/verificacao/hash/{$sHash}");
                 $sTextoEmail = $this->view->render('cadastro-eventual/email-aviso-contribuinte.phtml');
                 $lEmail = DBSeller_Helper_Mail_Mail::send($aDados['email'], $this->translate->_('ECidadeOnline2 - Confirmação de Cadastro'), $sTextoEmail);
                 if (!$lEmail) {
                     throw new Exception($this->translate->_('Email não enviado. Favor contate o suporte da prefeitura.'));
                 }
             }
             $sMensagemErro = 'Cadastro efetuado com sucesso.<br>';
             $sMensagemErro .= 'Siga as instruções enviadas para o seu email para continuar o cadastro.';
             $aRetornoJson['status'] = TRUE;
             $aRetornoJson['url'] = $this->view->serverUrl();
             $aRetornoJson['success'] = $this->translate->_($sMensagemErro);
             $oDoctrine->getConnection()->commit();
         } catch (Exception $oErro) {
             $oDoctrine->getConnection()->rollback();
             $aRetornoJson['status'] = FALSE;
             $aRetornoJson['error'][] = $oErro->getMessage();
         }
     } else {
         $aRetornoJson['status'] = FALSE;
         $aRetornoJson['fields'] = array_keys($oForm->getMessages());
         $aRetornoJson['error'][] = $this->translate->_('Preencha os dados corretamente.');
     }
     // Retorna um json com mensagens de erro ou sucesso
     echo $this->getHelper('json')->sendJson($aRetornoJson);
 }