コード例 #1
0
        //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 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"
                }
            });
        }