public Boolean AlterarStatus(DTOPessoa dtoSelecionado)
        {
            Pessoa cliente = this._repositorio.Obter(dtoSelecionado.ID);
            cliente.AlteraStatus();

            return true;
        }
        protected DTOPessoa ConverteEntidadeParaDTO(Pessoa entidade)
        {
            DTOPessoa dto = null;

            if (entidade != null)
            {
                dto = new DTOPessoa();
                dto.ID = entidade.Id;
                dto.DtNascimento = entidade.DtNascimento;
                dto.Nome = entidade.Nome;
                dto.Status = entidade.Status;

                foreach (Documento doc in entidade.Documentos)
                {
                    DTODocumento dtoDoc = new DTODocumento();
                    dtoDoc.ValorDocumento = doc.ToStringFormatado();
                    dtoDoc.TipoDocumento = doc.TipoDocumento;

                    dto.AdicionarDocumento(dtoDoc);
                }

                foreach (Telefone tel in entidade.Telefones)
                {
                    DTOTelefone dtoTel = new DTOTelefone();
                    dtoTel.Telefone = tel.ToStringFormatado();
                    dtoTel.Tipo = tel.Tipo;

                    dto.AdicionarTelefone(dtoTel);
                }

                foreach (Endereco end in entidade.Enderecos)
                {
                    DTOEndereco dtoEnd = new DTOEndereco();
                    dtoEnd.Logradouro = end.Logradouro;
                    dtoEnd.Numero = end.Numero;
                    dtoEnd.TipoEndereco = end.TipoEndereco;
                    dtoEnd.Cep = end.Cep;
                    DTOCidade dtoCidade = _fachadaCidade.Obter(end.Cidade.Id);
                    dtoEnd.Cidade = dtoCidade;

                    dto.AdicionarEndereco(dtoEnd);
                }
            }

            return dto;
        }
        public Boolean Gravar(DTOPessoa dtoClienteQueVaiSerPersistido)
        {
            if (dtoClienteQueVaiSerPersistido == null)
                return false;

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

            if (pessoa == null)
                pessoa = new Cliente(dtoClienteQueVaiSerPersistido.Nome, dtoClienteQueVaiSerPersistido.DtNascimento);
            else
            {
                pessoa.Nome = dtoClienteQueVaiSerPersistido.Nome;
                pessoa.DtNascimento = dtoClienteQueVaiSerPersistido.DtNascimento;
            }

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

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

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

            DTODocumento dtoDocumento = dtoClienteQueVaiSerPersistido.Documentos.SingleOrDefault(d => (d.TipoDocumento.Equals(TipoDocumento.CPF)));
            CPF cpf;

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

            Pessoa pessoaComOMesmoCPF = this._repositorio.ObterPorDocumento(cpf);
            Cliente clienteEncontradoNoBD;

            try
            {
                if (pessoaComOMesmoCPF != null)
                    clienteEncontradoNoBD = (Cliente)pessoaComOMesmoCPF;
                else
                    clienteEncontradoNoBD = null;
            }
            catch (InvalidCastException)
            {
                clienteEncontradoNoBD = null;
            }

            // Efetuando as validações
            ValidadorCliente validador = new ValidadorCliente(clienteEncontradoNoBD);

            Cliente clienteQueVaiSerPersistido = (Cliente)pessoa;
            validador.ValidarCamposObrigatorios(clienteQueVaiSerPersistido);

            if (dtoClienteQueVaiSerPersistido.IsNovo())
                validador.ValidarDuplicidadeCPFDeNovoCliente(clienteQueVaiSerPersistido);
            else
                validador.ValidarDuplicidadeCPFDeClienteEmAlteracao(clienteQueVaiSerPersistido);

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

            return true;
        }
        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;
        }