public void ReenviarEmailDeAbertura(int idProcessoCotacao, int idFornecedorParticipante) { ProcessoDeCotacao processoDeCotacao = _processosDeCotacao.BuscaPorId(idProcessoCotacao).Single(); FornecedorParticipante fornecedorParticipante = processoDeCotacao.FornecedoresParticipantes.First(x => x.Id == idProcessoCotacao); _geradorDeEmail.GerarEmail(fornecedorParticipante); }
public MensagemDeEmail AberturaDoProcessoDeCotacaoDeMaterial(ProcessoDeCotacao processoDeCotacao) { string mensagem = "Prezado Fornecedor. " + Environment.NewLine + "A BSBIOS convida a participar do nosso processo de cotação para o Produto/Serviço " + "conforme informações descritas abaixo. " + Environment.NewLine + "Caso tenha interesse em participar favor acessar o Portal de Cotações (http://bsnet.bsbios.com/)." + Environment.NewLine + Environment.NewLine; for (int i = 0; i < processoDeCotacao.Itens.Count; i++) { var item = processoDeCotacao.Itens[i]; mensagem += "Item " + Convert.ToString(i + 1) + Environment.NewLine + "Material: " + item.Produto.Descricao + Environment.NewLine + "Quantidade: " + item.Quantidade + Environment.NewLine + "Unidade de Medida: " + item.UnidadeDeMedida.Descricao + Environment.NewLine + SeparadorDeItems + Environment.NewLine; } mensagem += "Data Limite de Retorno: " + (processoDeCotacao.DataLimiteDeRetorno.HasValue ? processoDeCotacao.DataLimiteDeRetorno.Value.ToShortDateString() : "") + Environment.NewLine + "Requisitos: " + processoDeCotacao.Requisitos + Environment.NewLine + SeparadorDeItems + Environment.NewLine + "Comprador" + Environment.NewLine + "Nome: " + processoDeCotacao.Comprador.Nome + Environment.NewLine + "E-mail: " + processoDeCotacao.Comprador.Email; return(new MensagemDeEmail("Cotação de Material", mensagem)); }
public void QuandoQuantidadeTotalForMaiorQueAQuantidadeDoProcessoNaoSuperouQuantidadeDoProcesso() { //retorna processo com quantidade 1000 ProcessoDeCotacao processoDeCotacao = DefaultObjects.ObtemProcessoDeCotacaoDeMaterialNaoIniciado(); //Assert.IsTrue(processoDeCotacao.SuperouQuantidadeSolicitada(1001)); var item = (ProcessoDeCotacaoDeMaterialItem)processoDeCotacao.Itens.First(); Assert.IsTrue(item.SuperouQuantidadeSolicitada(1001)); }
public void GerarEmail(ProcessoDeCotacao processoDeCotacao) { MensagemDeEmail mensagemDeEmail = _geradorDeMensagemDeEmail.AberturaDoProcessoDeCotacaoDeFrete(processoDeCotacao); foreach (var fornecedorParticipante in processoDeCotacao.FornecedoresParticipantes) { _emailService.Enviar(fornecedorParticipante.Fornecedor.Email, mensagemDeEmail); } }
public ApiResponseMessage EfetuarComunicacao(ProcessoDeCotacao processo) { return(new ApiResponseMessage { Retorno = new Retorno { Codigo = "200", Texto = "S" } }); }
public IList <CotacaoMaterialSelecionarVm> CotacoesDosFornecedores(int idProcessoCotacao, int idProcessoCotacaoItem) { var retorno = new List <CotacaoMaterialSelecionarVm>(); ProcessoDeCotacao processoDeCotacao = _processosDeCotacao.BuscaPorId(idProcessoCotacao).Single(); foreach (var fornecedorParticipante in processoDeCotacao.FornecedoresParticipantes) { var cotacaoSelecionarVm = new CotacaoMaterialSelecionarVm { CodigoFornecedor = fornecedorParticipante.Fornecedor.Codigo, Fornecedor = fornecedorParticipante.Fornecedor.Nome }; retorno.Add(cotacaoSelecionarVm); if (fornecedorParticipante.Cotacao == null) { continue; } var cotacao = (CotacaoMaterial)fornecedorParticipante.Cotacao.CastEntity(); cotacaoSelecionarVm.IdCotacao = cotacao.Id; cotacaoSelecionarVm.CondicaoDePagamento = cotacao.CondicaoDePagamento.Descricao; cotacaoSelecionarVm.Incoterm = cotacao.Incoterm.Descricao; var cotacaoItem = (CotacaoMaterialItem)cotacao.Itens.SingleOrDefault(x => x.ProcessoDeCotacaoItem.Id == idProcessoCotacaoItem); if (cotacaoItem == null) { continue; } cotacaoSelecionarVm.QuantidadeAdquirida = cotacaoItem.QuantidadeAdquirida; cotacaoSelecionarVm.CodigoIva = cotacaoItem.Iva != null ? cotacaoItem.Iva.Codigo : null; cotacaoSelecionarVm.Preco = cotacaoItem.Preco; cotacaoSelecionarVm.ValorComImpostos = cotacaoItem.ValorComImpostos; cotacaoSelecionarVm.Custo = cotacaoItem.Custo; cotacaoSelecionarVm.Selecionada = cotacaoItem.Selecionada; Imposto imposto = cotacaoItem.Imposto(Enumeradores.TipoDeImposto.Icms); cotacaoSelecionarVm.ValorIcms = imposto != null ? imposto.Valor : (decimal?)null; imposto = cotacaoItem.Imposto(Enumeradores.TipoDeImposto.IcmsSubstituicao); cotacaoSelecionarVm.ValorIcmsSt = imposto != null ? imposto.Valor : (decimal?)null; imposto = cotacaoItem.Imposto(Enumeradores.TipoDeImposto.Ipi); cotacaoSelecionarVm.ValorIpi = imposto != null ? imposto.Valor : (decimal?)null; imposto = cotacaoItem.Imposto(Enumeradores.TipoDeImposto.PisCofins); cotacaoSelecionarVm.ValorPisCofins = imposto != null ? imposto.Valor : (decimal?)null;; } return(retorno); }
//public ComunicacaoFechamentoProcessoCotacaoFrete(CredencialSap credencialSap) //{ // _comunicacaoSap = new ComunicacaoSap<ListaProcessoDeCotacaoDeFreteFechamento>(credencialSap); //} public ApiResponseMessage EfetuarComunicacao(ProcessoDeCotacao processo) { ProcessoDeCotacaoItem item = processo.Itens.First(); if (item.Produto.NaoEstocavel) { //Cotações de frete para empresas do grupo que não utilizam o SAP deverão ser realizadas com material NLAG //(Material não estocável). Para este tipo de material a cotação não deverá ser enviada para o SAP; return(new ApiResponseMessage { Retorno = new Retorno { Codigo = "200", Texto = "S" } }); } var mensagemParaEnviar = new ListaProcessoDeCotacaoDeFreteFechamento(); var processoAuxiliar = (ProcessoDeCotacaoDeFrete)processo.CastEntity(); foreach (var fornecedorParticipante in processoAuxiliar.FornecedoresParticipantes) { if (fornecedorParticipante.Cotacao != null && fornecedorParticipante.Cotacao.Itens.First().Selecionada) { CotacaoItem itemDaCotacao = fornecedorParticipante.Cotacao.Itens.First(); mensagemParaEnviar.Add(new ProcessoDeCotacaoDeFreteFechamentoComunicacaoSapVm { CodigoTransportadora = fornecedorParticipante.Fornecedor.Codigo, //CodigoMaterial = processoAuxiliar.Produto.Codigo, CodigoMaterial = item.Produto.Codigo, //CodigoUnidadeMedida = processoAuxiliar.UnidadeDeMedida.CodigoInterno, CodigoUnidadeMedida = item.UnidadeDeMedida.CodigoInterno, CodigoItinerario = processoAuxiliar.Itinerario.Codigo, DataDeValidadeInicial = processoAuxiliar.DataDeValidadeInicial.ToString("yyyyMMdd"), DataDeValidaFinal = processoAuxiliar.DataDeValidadeFinal.ToString("yyyyMMdd"), NumeroDoContrato = processoAuxiliar.NumeroDoContrato ?? "", Valor = itemDaCotacao.ValorComImpostos }); } } ApiResponseMessage apiResponseMessage = _comunicacaoSap.EnviarMensagem( "/HttpAdapter/HttpMessageServlet?senderParty=PORTAL&senderService=HTTP&interfaceNamespace=http://portal.bsbios.com.br/&interface=si_cotacaoFreteFechamento_portal&qos=be" , mensagemParaEnviar); if (apiResponseMessage.Retorno.Codigo == "E") { throw new ComunicacaoSapException("json", "Ocorreu um erro ao comunicar o fechamento do Processo de Cotação de Frete para o SAP. Detalhes: " + apiResponseMessage.Retorno.Texto); } return(apiResponseMessage); }
public void GerarEmail(ProcessoDeCotacao processoDeCotacao) { MensagemDeEmail mensagemDeEmail = _geradorDeMensagemDeEmail.AberturaDoProcessoDeCotacaoDeMaterial(processoDeCotacao); foreach (var fornecedorParticipante in processoDeCotacao.FornecedoresParticipantes) { if (string.IsNullOrEmpty(fornecedorParticipante.Fornecedor.Email)) { throw new UsuarioSemEmailException(fornecedorParticipante.Fornecedor.Nome); } _emailService.Enviar(fornecedorParticipante.Fornecedor.Email, mensagemDeEmail); } }
public void QuandoAdicionaIteracaoDeUsuarioOcorrePersistencia() { ProcessoDeCotacao processoDeCotacao = DefaultObjects.ObtemProcessoDeCotacaoDeFrete(); IList <FornecedorParticipante> fornecedoresParticipantes = new List <FornecedorParticipante>(); fornecedoresParticipantes.Add(processoDeCotacao.AdicionarFornecedor(DefaultObjects.ObtemFornecedorPadrao())); fornecedoresParticipantes.Add(processoDeCotacao.AdicionarFornecedor(DefaultObjects.ObtemFornecedorPadrao())); _atualizadorDeIteracaoDoUsuario.Adicionar(fornecedoresParticipantes); _processoCotacaoIteracoesUsuarioMock.Verify(x => x.Save(It.IsAny <ProcessoCotacaoIteracaoUsuario>()), Times.Exactly(fornecedoresParticipantes.Count)); CommonVerifications.VerificaCommitDeTransacao(_unitOfWorkMock); }
public ApiResponseMessage EfetuarComunicacao(ProcessoDeCotacao processo) { //seleciona os participantes que preencheram a cotação (cotacaoMaterial != null) //e que ainda não possuem número da cotação. O esperado é que nenhuma das cotações possuem NumeroDaCotacao. //Isto acontecerá apenas se ocorrer erro na comunicação com o sap em para uns dos fornecedores do processo //e antes deste fornecedor, a comunicação tenha sido realizada com sucesso para outro fornecedor. //Neste cenário o fornecedor anterior já tem um número de cotação e não deve ser mais enviado para o SAP, //pois isto faria com que fosse criado duas cotações para o mesmo fornecedor e item de requisição, o que é errado. var participantesSemCotacaoNoSap = (from fp in processo.FornecedoresParticipantes let cotacaoMaterial = (CotacaoMaterial)fp.Cotacao.CastEntity() where string.IsNullOrEmpty(fp.NumeroDaCotacao) select fp); foreach (var fornecedorParticipante in participantesSemCotacaoNoSap) { var itens = new ListaProcessoDeCotacaoDeMaterialAberturaItemVm(); itens.AddRange(from ProcessoDeCotacaoDeMaterialItem item in processo.Itens select new ProcessoDeCotacaoDeMaterialAberturaItemVm { NumeroRequisicao = item.RequisicaoDeCompra.Numero, NumeroItem = item.RequisicaoDeCompra.NumeroItem }); var vm = new ProcessoDeCotacaoDeMaterialAberturaComunicacaoSapVm { IdProcessoCotacao = processo.Id, CodigoFornecedor = fornecedorParticipante.Fornecedor.Codigo, DataLimiteRetorno = processo.DataLimiteDeRetorno.Value.ToString("dd.MM.yyyy"), Itens = itens }; //comentado enquanto o serviço do SAP não é implementado ApiResponseMessage resposta = _comunicacaoSap.EnviarMensagem("/HttpAdapter/HttpMessageServlet?senderParty=PORTAL&senderService=HTTP&interfaceNamespace=http://portal.bsbios.com.br/&interface=si_cadCotacaoAbertura_portal&qos=be", vm); if (resposta.Retorno.Codigo.Equals("200") && !string.IsNullOrEmpty(resposta.Retorno.Texto)) { fornecedorParticipante.AtualizarNumeroDaCotacao(resposta.Retorno.Texto); } else { throw new Exception("Ocorreu um erro ao enviar os dados do Processo de Cotação para o SAP."); } } return(new ApiResponseMessage() { Retorno = new Retorno() { Codigo = "200", Texto = "OK" } }); }
public void ConsigoPersistirUmProcessoDeCotacaoDeFreteEConsultarPosteriormente() { ProcessoDeCotacaoDeFrete processo = DefaultObjects.ObtemProcessoDeCotacaoDeFrete(); DefaultPersistedObjects.PersistirProcessoDeCotacaoDeFrete(processo); UnitOfWorkNh.Session.Clear(); var processosDeCotacao = ObjectFactory.GetInstance <IProcessosDeCotacao>(); ProcessoDeCotacao processoConsultado = processosDeCotacao.BuscaPorId(processo.Id).Single(); Assert.IsNotNull(processoConsultado); Assert.AreEqual(1, processoConsultado.Itens.Count); }
public void GerarEmail(ProcessoDeCotacao processoDeCotacao) { foreach (var fornecedorParticipante in processoDeCotacao.FornecedoresParticipantes) { var cotacao = fornecedorParticipante.Cotacao; if (cotacao == null) { continue; } MensagemDeEmail mensagemDeEmail = cotacao.Itens.Any(item => item.Selecionada) ? _geradorDeMensagemDeEmail.FornecedoresSelecionadosNoProcessoDeCotacao(processoDeCotacao, cotacao) : _geradorDeMensagemDeEmail.FornecedoresNaoSelecionadosNoProcessoDeCotacao(cotacao); _emailService.Enviar(fornecedorParticipante.Fornecedor.Email, mensagemDeEmail); } }
public MensagemDeEmail AberturaDoProcessoDeCotacaoDeFrete(ProcessoDeCotacao processoDeCotacao) { ProcessoDeCotacaoItem item = processoDeCotacao.Itens.First(); var processoDeCotacaoDeFrete = (ProcessoDeCotacaoDeFrete)processoDeCotacao; string mensagem = "Prezado Fornecedor. " + Environment.NewLine + "A BSBIOS convida a participar do nosso processo de cotação para o Produto/Serviço " + "conforme informações descritas abaixo. " + Environment.NewLine + "Caso tenha interesse em participar favor acessar o Portal de Cotações (http://bsnet.bsbios.com/)." + Environment.NewLine + Environment.NewLine + "Material: " + item.Produto.Descricao + Environment.NewLine + "Quantidade: " + item.Quantidade + Environment.NewLine + "Itinerário: " + processoDeCotacaoDeFrete.Itinerario.Descricao + Environment.NewLine + "Unidade de Medida: " + item.UnidadeDeMedida.Descricao + Environment.NewLine + "Data Limite de Retorno: " + (processoDeCotacaoDeFrete.DataLimiteDeRetorno.HasValue ? processoDeCotacaoDeFrete.DataLimiteDeRetorno.Value.ToShortDateString() : "") + Environment.NewLine + "Requisitos: " + processoDeCotacaoDeFrete.Requisitos + Environment.NewLine; return(new MensagemDeEmail("Cotação de Frete", mensagem)); }
public void Executar(int idProcessoCotacao) { try { _unitOfWork.BeginTransaction(); ProcessoDeCotacao processoDeCotacao = _processosDeCotacao.BuscaPorId(idProcessoCotacao).Single(); processoDeCotacao.Fechar(); _comunicacaoSap.EfetuarComunicacao(processoDeCotacao); _geradorDeEmail.GerarEmail(processoDeCotacao); _processosDeCotacao.Save(processoDeCotacao); _unitOfWork.Commit(); } catch (Exception) { _unitOfWork.RollBack(); throw; } }
public void Executar(int idProcessoCotacao) { try { _unitOfWork.BeginTransaction(); ProcessoDeCotacao processoDeCotacao = _processosDeCotacao.BuscaPorId(idProcessoCotacao).Single(); Usuario usuarioComprador = _usuarios.UsuarioConectado(); processoDeCotacao.Abrir(usuarioComprador); _comunicacaoSap.EfetuarComunicacao(processoDeCotacao); _gerenciadorUsuario.CriarSenhaParaUsuariosSemSenha(processoDeCotacao.FornecedoresParticipantes.Select(x => x.Fornecedor.Codigo).ToArray()); _geradorDeEmailDeProcessoDeAberturaDeCotacao.GerarEmail(processoDeCotacao); _processosDeCotacao.Save(processoDeCotacao); _unitOfWork.Commit(); } catch (Exception) { _unitOfWork.RollBack(); throw; } }
public MensagemDeEmail FornecedoresSelecionadosNoProcessoDeCotacao(ProcessoDeCotacao processoDeCotacao, Cotacao cotacao) { string mensagem = "Prezado Fornecedor." + Environment.NewLine + "Estamos confirmando o fechamento da negociação referente ao Processo de Cotação " + processoDeCotacao.Id + "." + Environment.NewLine + "Segue nosso Pedido de Compras." + Environment.NewLine + Environment.NewLine; IList <CotacaoItem> itensDaCotacao = cotacao.Itens.Where(item => item.Selecionada).ToList(); for (int i = 0; i < itensDaCotacao.Count; i++) { var item = itensDaCotacao[i]; mensagem += "Item " + Convert.ToString(i + 1) + Environment.NewLine + "Material: " + item.ProcessoDeCotacaoItem.Produto.Descricao + Environment.NewLine + "Quantidade: " + item.QuantidadeAdquirida + Environment.NewLine + "Unidade de Medida: " + item.ProcessoDeCotacaoItem.UnidadeDeMedida.Descricao + Environment.NewLine + SeparadorDeItems + Environment.NewLine; } mensagem += " Para maiores esclarecimentos, favor entrar em contato através com o comprador."; return(new MensagemDeEmail("Fechamento do Processo de Cotacão", mensagem)); }
public void QuandoOcorreErroAoAdicionarIteracaoDeUsuarioFazRollback() { _processoCotacaoIteracoesUsuarioMock.Setup(x => x.Save(It.IsAny <ProcessoCotacaoIteracaoUsuario>())) .Throws(new ExcecaoDeTeste("Erro")); IList <FornecedorParticipante> fornecedoresParticipantes = new List <FornecedorParticipante>(); try { ProcessoDeCotacao processoDeCotacao = DefaultObjects.ObtemProcessoDeCotacaoDeFrete(); fornecedoresParticipantes.Add(processoDeCotacao.AdicionarFornecedor(DefaultObjects.ObtemFornecedorPadrao())); fornecedoresParticipantes.Add(processoDeCotacao.AdicionarFornecedor(DefaultObjects.ObtemFornecedorPadrao())); _atualizadorDeIteracaoDoUsuario.Adicionar(fornecedoresParticipantes); Assert.Fail("Deveria ter gerado exceção."); } catch (ExcecaoDeTeste) { _processoCotacaoIteracoesUsuarioMock.Verify(x => x.Save(It.IsAny <ProcessoCotacaoIteracaoUsuario>()), Times.Once()); CommonVerifications.VerificaRollBackDeTransacao(_unitOfWorkMock); } }
public AtualizadorDeCotacaoTests() { _unitOfWorkMock = CommonMocks.DefaultUnitOfWorkMock(); _processoDeCotacao = DefaultObjects.ObtemProcessoDeCotacaoDeMaterialComCotacaoDoFornecedor(); _processosDeCotacaoMock = new Mock <IProcessosDeCotacao>(MockBehavior.Strict); _processosDeCotacaoMock.Setup(x => x.Save(It.IsAny <ProcessoDeCotacao>())) .Callback( (ProcessoDeCotacao processoDeCotacao) => { _unitOfWorkMock.Verify(x => x.BeginTransaction(), Times.Once()); _unitOfWorkMock.Verify(x => x.Commit(), Times.Never()); Assert.IsNotNull(processoDeCotacao); foreach (var fornecedorParticipante in processoDeCotacao.FornecedoresParticipantes) { Assert.IsNotNull(fornecedorParticipante); } }); _processosDeCotacaoMock.Setup(x => x.BuscaPorId(It.IsAny <int>())) .Returns(_processosDeCotacaoMock.Object) .Callback((int id) => { _unitOfWorkMock.Verify(x => x.BeginTransaction(), Times.Once()); _unitOfWorkMock.Verify(x => x.Commit(), Times.Never()); }); _processosDeCotacaoMock.Setup(x => x.Single()) .Returns(_processoDeCotacao); _incotermsMock = new Mock <IIncoterms>(MockBehavior.Strict); _incotermsMock.Setup(x => x.BuscaPeloCodigo(It.IsAny <string>())) .Returns(_incotermsMock.Object) .Callback((string codigo) => { _unitOfWorkMock.Verify(x => x.BeginTransaction(), Times.Once()); _unitOfWorkMock.Verify(x => x.Commit(), Times.Never()); _incotermRetorno = Incoterm.Codigo == codigo ? Incoterm : null; }); _incotermsMock.Setup(x => x.Single()) .Returns(() => _incotermRetorno); _condicoesDePagamentoMock = new Mock <ICondicoesDePagamento>(MockBehavior.Strict); _condicoesDePagamentoMock.Setup(x => x.BuscaPeloCodigo(It.IsAny <string>())) .Returns((string codigo) => codigo == CondicaoDePagamento.Codigo ? CondicaoDePagamento : null) .Callback((string codigo) => { _unitOfWorkMock.Verify(x => x.BeginTransaction(), Times.Once()); _unitOfWorkMock.Verify(x => x.Commit(), Times.Never()); }); _atualizadorDeCotacao = new AtualizadorDeCotacaoDeMaterial(_unitOfWorkMock.Object, _processosDeCotacaoMock.Object, _incotermsMock.Object, _condicoesDePagamentoMock.Object); _cotacaoAtualizarVm = new CotacaoMaterialInformarVm() { IdProcessoCotacao = _processoDeCotacao.Id, CodigoFornecedor = _processoDeCotacao.FornecedoresParticipantes.First().Fornecedor.Codigo, CodigoCondicaoPagamento = CondicaoDePagamento.Codigo, CodigoIncoterm = Incoterm.Codigo, DescricaoIncoterm = "Desc Incoterm", }; _cotacaoItemAtualizarVm = new CotacaoMaterialItemInformarVm { IdProcessoCotacao = _processoDeCotacao.Id, IdCotacao = 0, IdProcessoCotacaoItem = _processoDeCotacao.Itens.First().Id, Preco = 110, Mva = 0, QuantidadeDisponivel = 150, Impostos = new CotacaoImpostosVm { IcmsAliquota = 17, IcmsValor = 12, IcmsStAliquota = 0, IcmsStValor = 0, IpiAliquota = 5, IpiValor = 4, PisCofinsAliquota = 3 }, ObservacoesDoFornecedor = "observações do fornecedor", PrazoDeEntrega = DateTime.Today.AddDays(15).ToShortDateString() }; }