public void Devo_Conseguir_Validar_CNPJ_De_Uma_Empresa_Nova_Se_Nao_Houver_Outra_Empresa_Cadastrada()
        {
            Empresa novaEmpresa = this._empresaPadrao;
            novaEmpresa.AdicionaDocumento(new CNPJ("12345678901234"));

            ValidadorEmpresa validador = new ValidadorEmpresa(null);
            validador.ValidarDuplicidadeCNPJDeNovaEmpresa(novaEmpresa);
        }
        public void Nao_Devo_Conseguir_Validar_Uma_Nova_Empresa_Com_CNPJ_Cadastrado_Para_Outra_Empresa()
        {
            Empresa novaEmpresa = this._empresaPadrao;
            novaEmpresa.AdicionaDocumento(new CNPJ("12345678901234"));

            Empresa empresaCadastradaNoBancoDeDados = EmpresaStub.GetInstance(1, "UENP Universidade", DateTime.Now);
            empresaCadastradaNoBancoDeDados.AdicionaDocumento(new CNPJ("12345678901234"));

            ValidadorEmpresa validador = new ValidadorEmpresa(empresaCadastradaNoBancoDeDados);
            validador.ValidarDuplicidadeCNPJDeNovaEmpresa(novaEmpresa);
        }
        public Boolean Gravar(DTOPessoa dtoEmpresaQueVaiSerPersistida)
        {
            if (dtoEmpresaQueVaiSerPersistida == null)
                return false;

            Pessoa pessoa = this._repositorio.Obter(dtoEmpresaQueVaiSerPersistida.ID);

            if (pessoa == null)
                pessoa = new Empresa(dtoEmpresaQueVaiSerPersistida.Nome, dtoEmpresaQueVaiSerPersistida.DtNascimento);
            else
            {
                pessoa.Nome = dtoEmpresaQueVaiSerPersistida.Nome;
                pessoa.DtNascimento = dtoEmpresaQueVaiSerPersistida.DtNascimento;
            }

            pessoa.LimparColecoes();
            foreach (DTODocumento dto in dtoEmpresaQueVaiSerPersistida.Documentos)
                pessoa.AdicionaDocumento(dto.ConverteDTOParaDocumento());

            foreach (DTOTelefone dto in dtoEmpresaQueVaiSerPersistida.Telefones)
                pessoa.AdicionaTelefone(dto.ConverteDTOParaTelefone());

            foreach (DTOEndereco dto in dtoEmpresaQueVaiSerPersistida.Enderecos)
                pessoa.AdicionaEndereco(dto.ConverteDTOParaEndereco(x => this._repositorioCidade.Obter(x.ID)));

            DTODocumento dtoDocumento = dtoEmpresaQueVaiSerPersistida.Documentos.SingleOrDefault(d => (d.TipoDocumento.Equals(TipoDocumento.CNPJ)));
            CNPJ cnpj;

            try
            {
                cnpj = dtoDocumento.ValorDocumento;
            }
            catch (NullReferenceException)
            {
                cnpj = null;
            }

            Pessoa pessoaComOMesmoCNPJ = this._repositorio.ObterPorDocumento(cnpj);
            Empresa empresaEncontradaNoBD;

            if (pessoaComOMesmoCNPJ != null)
                empresaEncontradaNoBD = (Empresa)pessoaComOMesmoCNPJ;
            else
                empresaEncontradaNoBD = null;

            // Efetuando as validações
            ValidadorEmpresa validador = new ValidadorEmpresa(empresaEncontradaNoBD);

            Empresa empresaQueVaiSerPersistida = (Empresa)pessoa;
            validador.ValidarCamposObrigatorios(empresaQueVaiSerPersistida);

            if (dtoEmpresaQueVaiSerPersistida.IsNovo())
                validador.ValidarDuplicidadeCNPJDeNovaEmpresa(empresaQueVaiSerPersistida);
            else
                validador.ValidarDuplicidadeCNPJDeEmpresaEmAlteracao(empresaQueVaiSerPersistida);

            this._repositorio.Salvar(pessoa);
            dtoEmpresaQueVaiSerPersistida.ID = pessoa.Id; ;

            return true;
        }