Quando temos produtos físicos que devem ser enviados ao cliente, precisamos permitir que ele visualize as informações de frete de seu pedido, como prazo de entrega e o valor que deve pagar. Para que possamos exibir as informações de frete no nopCommerce, precisamos de um plugin de cálculo de frete (Correios, FedEx, DHL, etc) e é isso que vamos aprender a criar hoje em nosso tutorial.

Plugins de frete no nop também são chamados de métodos de cálculo de frete (shipping rate computation method). Antes de seguir, nós recomendamos que você leia a primeira parte de nosso tutorial de criação de plugins. Nesse tutorial iremos explicar os passos necessários para você criar seu plugin de cálculo de frete.

Para criar um plugin de frete, nós precisamos implementar a interface IShippingRateComputationMethod (disponível na namespace Nop.Services.Shipping). Portanto, crie um novo projeto do tipo class library na solution do nopCommerce e vamos começar.

Controllers, views, models

Crie um controller e nele adicione um método Configure, que será usado para fazer a configuração de seu plugin. Não se esqueça de criar uma view de configuração. É através da view e do método Configure que o administrador da loja irá visualizar e alterar as configurações de seu plugin através do painel de administração da loja (System > Configuration > Shipping > Shipping rate computation methods).

Plugin de frete

Configuração de plugin de frete

Ao completar essa etapa, já podemos começar a adicionar as regras de negócio de nosso plugin.

Obtendo informações de envio

Agora você precisa criar a classe que implementa a interface IShippingRateComputationMethod. Essa é a classe que irá fazer o trabalho do cálculo do valor do frete, e do prazo em dias para entrega da mercadoria. Quando o nopCommerce calcula o valor do frente ou precisa obter a lista de opções de frete disponíveis (por exemplo: Sedex, PAX, Sedex 10) os métodos GetShippingOptions ou GetFixedRate de sua classe serão chamados. Veja como a classe UPSComputationMethod (UPS method) é declarada:

public class UPSComputationMethod : BasePlugin, IShippingRateComputationMethod

A interface IShippingRateComputationMethod possui uma série de métodos e propriedades que devem ser implementados:

  • ShippingRateComputationMethodType: essa propriedade indica como o seu plugin funciona. Ela pode ter os valores Offline ou Realtime. Um plugin do tipo Offline não utiliza nenhum outro site ou integração para obter os valores e prazos (por exemplo os plugins “Shipping by weight” e “Fixed Rate Shipping”), sendo que todas as informações necessárias para o cálculo estão disponíveis localmente. Plugins Realtime usam algum outro site ou possuem alguma integração externa para obter os valores e prazos (por exemplo os plugins “UPS” e “Correios”).
  • GetShippingOptions: esse método é sempre chamado quando o cliente escolhe uma opção de frete durante o processo de checkout. O que você precisa fazer nesse método é retornar uma lista de objetos do tipo ShippingOption. Cada objeto contém informação sobre as opções de entrega, como o nome (exemplo: PAC ou Sedex) e seus valores (por exemplo R$ 15,00). Coloque toda sua lógica de negócios aqui, seja ir buscar no banco de dados os valores de frete, ou fazer uma requisição para o webservice dos Correios.
  • GetFixedRate: como você já sabe, o método GetShippingOptions é usado para obter as opções de frete durante o processo de checkout. Mas as vezes, você precisa exibir um valor antes que uma opção de frete seja escolhida (normalmente usado na página do carrinho de compras). Nesses casos, você pode voltar um valor fixo. Por exemplo, se o seu plugin de frete retornar apenas uma opção de envio, e não há necessidade de esperar o cliente escolher qual opção de envio ele deseja. Se você não deseja ou não pode exibir uma informação fixa para o valor do frete, então esse método deve retornar null. Nesses casos o nop irá exibir a mensagem “Calculated during checkout” (cálculo durante o checkout) na página de carrinho.
  • GetConfigurationRoute: como você deve se lembrar, nós criamos um controller no início desse tutorial, e este método retorna a informação de rota de seu método de configuração. Por exemplo:
public void GetConfigurationRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues)
{
	actionName = "Configure";
	controllerName = "ShippingUPS";
	routeValues = new RouteValueDictionary() { { "Namespaces", "Nop.Plugin.Shipping.UPS.Controllers" }, { "area", null } };
}