public CadastroPessoaResposta processaCadastroPessoa(CadastroPessoaEnvio envio) {
        DaoPessoa daoPessoa = new DaoPessoa();

        CadastroPessoaResposta resposta = CadastroPessoaResposta.Factory.newInstance();
        addMsgRetorno(envio.getCpfCnpj() == null, resposta, "0", B.getString("cpf.ou.cnpj.nullo"), B.getString("cpf.ou.cnpj.nullo.correcao"));
        addMsgRetorno(!CpfCnpj.isValid(envio.getCpfCnpj()), resposta, "1", B.getString("cpf.cnpj.invalido", envio.getCpfCnpj()), B.getString("cpf.cnpj.invalido.correcao"));
        addMsgRetorno(envio.getPessoa() == null, resposta, "2", B.getString("dado.pessoa.nullo"), B.getString("dado.pessoa.nullo.correcao"));
        String cc1 = envio.getCpfCnpj();
        String cc2 = envio.getPessoa().getIdentificacao().getCpfCnpj().getCpfCnpj();
        addMsgRetorno(!cc1.equals(cc2), resposta, "4", B.getString("cpf.cnpj.validacao.nao.conferem", cc1, cc2), B.getString("cpf.cnpj.validacao.nao.conferem.correcao"));

        TcDados dados = envio.getPessoa();

        Pessoa pessoa = null;

        if (dados != null) {
            try {
                CpfCnpj cc = new CpfCnpj(envio.getCpfCnpj());
                pessoa = daoPessoa.getPessoaPorDocumento(cc.getCpfCnpj());
                if (pessoa == null) {
                    pessoa = cc.isCpf() ? new PessoaFisica() : new PessoaJuridica();
                }
                pessoa.fromXmlObject(dados);
            } catch (Exception e) {
                addMsgRetorno(true, resposta, "3", B.getString(e.getMessage()), B.getString("erro.sistema"));
            }
        }
        
        if (resposta.isSetListaMensagemRetorno()) {
            log.debug("retornando sequencia de divergencias que impedem a persistencia");
            return resposta;
        }

        log.debug("persistindo a entidade {0}.", pessoa);
        daoPessoa.persist(pessoa);
        resposta.setDataRecebimento(Calendar.getInstance());
        resposta.setStatus(B.getString("pessoa.cadastrada.sucesso", envio.getCpfCnpj()));
        
        String protocolo = NFSeUtils.getNewProtocolNumber(1l);
        log.info("Sucesso! Operação referente ao protocolo: {0}", protocolo);
        resposta.setProtocolo(protocolo);
        
        return resposta;
    }