Calculando fretes em SEDEX com ASP.NET

Walter Amorim (e-mail) é programador em ASP.net e VB.net desde 2003. Atualmente trabalha como Programador Web na agência AM4, em Barra Mansa/RJ. É cursando de Engenharia da Computação do Centro Universitário de Barra Mansa, unidade Cicuta (UBM-Cicuta).

Olá pessoal ! Neste artigo iremos tratar sobre o cálculo de tarifas do SEDEX dos Correios, utilizado ASP.NET.

Os Correios disponibilizam em seu site um serviço para cálculo de tarifas. Tente acessar http://www.correios.com.br/encomendas/precos/ e confira como funciona o cálculo. Todo nosso cálculo será dinâmico, utilizando esse serviço.

Nem preciso explicar a importância desse tipo de ferramenta quando trabalhamos com e-Commerce, tendo em vista que a maioria dos comércios eletrônicos trabalham com Sedex, devido à sua agilidade e segurança.

O cálculo da tarifa depende, principalmente, dos CEPs de origem e destino e, claro, do peso do pacote.

Pois bem. Comecemos à programar!

Criaremos uma função que irá se conectar ao serviço de cálculo dos Correios:

Public Function CalculaSedex(ByVal cepOrigem As String, ByVal cepDestino As String, _
                           ByVal peso As Decimal, ByVal MaoPropria As Boolean, _
                           ByVal avisoRecebimento As Boolean, _
                           Optional ByVal valorDeclarado As Decimal = 0.0) As Decimal
'Cria uma requisição ao service dos correios, com os dados informados
Dim Req As Net.WebRequest = Net.WebRequest.Create( _
      "http://www.correios.com.br/encomendas/precos/calculo.cfm?" & _
       "cepOrigem=" & cepOrigem & "&cepDestino=" & cepDestino & _
       "&peso=" & peso.ToString.Replace(",", ".") & "&resposta=xml")
     Dim Resp As Net.WebResponse = Req.GetResponse()
     Dim sr As New IO.StreamReader(Resp.GetResponseStream(), Text.Encoding.UTF7)
     Dim ds As New Data.DataSet
     'Coloca os dados recebidos em um DataSet
     ds.ReadXml(sr)
     sr.Close()
     Resp.Close()
     If ds.Tables("erro").Rows(0).Item("codigo") <> 0 Then
        Throw (New Exception(ds.Tables("erro").Rows(0).Item("descricao").ToString))
     Else
        CalculaSedex = _  ds.Tables("Dados_Postais").Rows(0).Item("preco_postal").ToString.Replace(".", ",")
     End If
End Function

Essa função, apesar de parecer assustadora, é bem simples. Ela recebe os seguintes parâmetros:

1 - cepOrigem: O CEP de origem da encomenda (ex. CEP da loja)
2 – cepDestino: O CEP de destino da encomenda (CEP do cliente)
3 – peso: Peso da encomenda em quilos. (ex. 0.5 para meio quilo)
4 – MaoPropria: Especifica se a encomenda deverá ser obrigatoriamente entregue ao destinatário (true/false)
5 – avisoRecebimento: Especifica se a loja deseja receber um comprovante de
que a mercadoria foi entregue (true/false)
6 – valorDeclarado: Opcional. Define o valor da mercadoria. O padrão é R$0,00.
                                  
Ela envia as informações através de uma requisição a uma página dos Correios que devolve, em XML, o preço do Sedex. Esse XML é passado à um dataset, de onde recuperamos os dados.

A função também gera uma exceção, caso ocorra algum erro ao fazer o cálculo (por exemplo, o cliente digitar um CEP inválido).

Poderíamos, por exemplo, chamá-la assim: CalculaSedex("27330680", "28110330", 2.4, False, True, 120.5)

Essa chamada iria nos retornar a tarifa de R$11,50.

Veja como fica a página completa:

<%@ Page Language="VB" Culture="pt-BR"%>
<Script language="VB" runat="server">
Private Sub cmdCalcular_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        'Iremos calcular o preço do SEDEX aqui.
        'Supondo que o CEP da loja seja 27330680,
        'que o peso do produto é de 1 quilo e 230 gramas,
        'que voce é pão duro e não quer usar o serviço de Mão Própria,
        'que você deseja receber um aviso de entrega da mercadoria,
        'e que a mercadoria vale R$120,40.
        Try
          Dim preco As Decimal = CalculaSedex("27330680", txtCEPDestino.Text, 1.23, _
    False, True, 120.5)
            lblResultado.Text = "O valor do frete é " & FormatCurrency(preco)
        Catch ex As Exception
            lblResultado.Text = ex.Message
        End Try
End Sub

Public Function CalculaSedex(ByVal cepOrigem As String, ByVal cepDestino As String, _
                         ByVal peso As Decimal, ByVal MaoPropria As Boolean, _
                         ByVal avisoRecebimento As Boolean, _
                         Optional ByVal valorDeclarado As Decimal = 0.0) As Decimal
        'Cria uma requisição ao service dos correios, com os dados informados
        Dim Req As Net.WebRequest = Net.WebRequest.Create( _
        "http://www.correios.com.br/encomendas/precos/calculo.cfm?" & _
        "cepOrigem=" & cepOrigem & "&cepDestino=" & cepDestino & _
        "&peso=" & peso.ToString.Replace(",", ".") & "&resposta=xml")
        Dim Resp As Net.WebResponse = Req.GetResponse()
        Dim sr As New IO.StreamReader(Resp.GetResponseStream(), Text.Encoding.UTF7)
        Dim ds As New Data.DataSet
        'Coloca os dados recebidos em um DataSet
        ds.ReadXml(sr)
        sr.Close()
        Resp.Close()
        If ds.Tables("erro").Rows(0).Item("codigo") <> 0 Then
           Throw (New Exception(ds.Tables("erro").Rows(0).Item("descricao").ToString))
        Else
           CalculaSedex = _ ds.Tables("Dados_Postais").Rows(0).Item("preco_postal").ToString.Replace(".", ",")
        End If
End Function
</Script>
<html><head><title>SEDEX</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form runat="server" id="frm">
    Calcular Frete:<br /><br />
    Informe no campo abaixo o seu CEP e clique no botão Calcular:
    <br />
    <asp:TextBox ID="txtCEPDestino" runat="server" Width="69px" MaxLength="8"
OnTextChanged="cmdCalcular_Click"></asp:TextBox>
    <asp:Button ID="cmdCalcular" runat="server" OnClick="cmdCalcular_Click"
Text="Calcular" /><br /><br />
    <asp:Label ID="lblResultado" runat="server" Font-Bold="True"></asp:Label>
</form></body></html>

Você pode ver o exemplo rodando neste link. Caso queira baixar o exemplo completo, clique aqui.

É isso pessoal. Caso você tenha alguma dúvida, entre em contato comigo pelo e-mail nao.faca.spam@walteram.com.br. Irei ajudá-lo com a maior alegria.