Se expede com a Correos Express e trabalha com o Odoo, tem dois caminhos: instalar o módulo delivery_correos_express da OCA, gratuito e sob AGPL-3.0, ou pagar por um conector mantido. Aqui compara-se código: o do módulo OCA no ramo 19.0 do repositório OCA/delivery-carrier e o do conector próprio da FlexigoTech, campo a campo e chamada a chamada.
Resumo: para uma loja própria com um contrato, um produto fixo e entrega ao domicílio, o módulo OCA serve. Deixa de servir quando precisa de recolha programada, entrega em ponto de conveniência, peso declarado por volume ou que um erro temporário da API não lhe deixe a guia validada e sem etiqueta.
O que precisa antes de começar
Três coisas, e nenhuma lha dá o módulo. São idênticas qualquer que seja o caminho que escolha.
- Contrato com a Correos Express. Os dois módulos falam com as suas credenciais e com a sua tarifa; nenhum revende transporte.
- Quatro dados. Utilizador, palavra-passe, código de cliente e código de solicitante. No módulo OCA são os campos
correos_express_username,correos_express_password,correos_express_customer_codeecorreos_express_sender_code. O de solicitante segue emsolicitanteao registar o envio; o de cliente, emcodRtee emkeyCliao pedir a etiqueta. - Dependências. O módulo OCA não funciona sozinho: precisa de
delivery_package_numberedelivery_state, do mesmo repositório, e da biblioteca Pythonunidecode. No Odoo.sh,unidecodevai norequirements.txtdo repositório ou a instalação falha.
E um detalhe de rotas: o módulo OCA escolhe o ambiente com a flag prod_environment padrão de delivery.carrier e aponta para www.test.cexpr.es/wsps/ em testes e para www.cexpr.es/wspsc/ em produção. O prefixo não é o mesmo nos dois ambientes. O nosso conector usa /wspsc/ nos dois. Os dois prefixos respondem no host de testes, por isso, se algo falhar aí, comece pelo certificado e pelas credenciais.
Funcionalidade a funcionalidade: o que faz cada um
Cada linha sai de ler os dois módulos, não de um folheto. Quando a resposta é «nenhum dos dois», também está escrito.
| Funcionalidade | Módulo OCA delivery_correos_express | Conector próprio FlexigoTech |
|---|---|---|
| Licença e custo | AGPL-3.0, sem custo de licença | OPL-1, módulo pago |
| Versões do Odoo | Ramos 14.0 a 19.0 do repositório | 17, 18, 19 e 20 |
| Dependências | delivery_package_number, delivery_state e unidecode | delivery, stock, sale, sale_stock (tudo do Odoo) |
| Formato da etiqueta | PDF e ZPL (tipos 1 e 2 da API) | PDF (tipo 5, térmica) e ZPL; o menu pendente oferece também EPL, que segue com o mesmo tipo que o ZPL |
| Multivolume | Envia numBultos a partir de number_of_packages, mas a lista de volumes segue com quilos e medidas em branco | Quilos por volume e altura, comprimento e largura quando o pacote os tem |
| Cobrança à entrega | Não: o campo reembolso é enviado vazio | Também não: é enviado vazio da mesma forma |
| Recolha programada | Não a chama | Registar, modificar, anular, hora de corte e seguimento de recolha, mais creaRecogida ao registar o envio |
| Ponto de conveniência (PUDO) | Não: codDirecDestino segue sempre vazio e não há consulta de pontos | Consulta de pontos por raio e produto B-PACK com idPuntoExterno obrigatório |
| Manifesto / fecho do dia | Não o gera | Também não como documento; há métodos contra lista de envios e geração de relatórios, mas o fecho continua a fazer-se no portal |
| Anulação do envio | Escreve uma mensagem no chatter a dizer que não há método para anular | Chama o serviço de parar entrega e, se o contrato não o tiver, regista a anulação como manual |
| Tracking de retorno | Sim: escreve estado e histórico na guia, com o cron diário de delivery_state | Sim: cron próprio a cada 30 minutos e janela de dias configurável, 21 por predefinição |
| Nova tentativa perante erro da API | Não: qualquer falha sobe como UserError e fica por aí | Cron a cada 5 minutos, espera crescente de 5 a 240 minutos e um máximo de 6 tentativas por guia |
| Cálculo de tarifa | A API não o fornece: devolve o preço de lista do produto de transporte e avisa por escrito | Também não: devolve o preço fixo configurado na transportadora e escreve zero no preço exato do envio |
| Chamadas distintas à API | 3: registo de envio, etiqueta e seguimento | 21 endpoints declarados: registo, etiqueta e 19 serviços mais, seguimento incluído |
| Testes dentro do módulo | 18 | 54 |
Duas linhas costumam surpreender. A primeira é a cobrança à entrega: nenhum dos dois a envia, por isso, se cobra contra entrega, hoje isso gere-se fora do Odoo com os dois módulos. A segunda é a tarifa: a API da Correos Express não cota envios, e por isso nenhum dos dois calcula nada. O OCA devolve o preço de lista do produto de transporte e deixa o aviso por escrito; o conector próprio devolve o preço fixo da transportadora. Se precisa que o carrinho calcule o transporte, isso resolve-se com regras de preço no Odoo ou com o módulo OCA delivery_price_method, não com o conector.
Onde o módulo OCA é suficiente
Loja própria, um contrato, entrega ao domicílio
Vende no seu site, tudo sai com o mesmo produto contratado e não oferece entrega em ponto. Imprime numa Zebra com ZPL ou numa laser com PDF. Esse fluxo é coberto inteiramente pelo módulo OCA: registo de envio, número de seguimento na guia, etiqueta anexada no chatter e estado atualizado pelo cron. Aqui um módulo pago não vai fazer nada melhor.
Odoo 14, 15 ou 16
Nós mantemos 17, 18, 19 e 20 e não vamos fingir o contrário. O repositório da OCA tem ramo para 14.0, 15.0 e 16.0. Se o seu Odoo é dessas versões, o módulo OCA não é a opção barata: é a opção.
Multivolume em que todos os volumes são iguais
Se lhe faturam pelo peso total do envio, que a lista de volumes vá com os quilos em branco não lhe muda nada: o peso total segue. O problema só aparece quando alguém precisa do peso volume a volume.
Tem alguém que mexe em código
O módulo OCA é curto e legível: umas 450 linhas entre transportadora, pedidos e guia. Se em casa há quem leia Python, corrigir um campo ou portar o ramo é trabalho de uma tarde e o controlo é seu.
Onde fica aquém e o que lhe custa em trabalho manual
Aqui não há opinião: é o que o código não faz e, portanto, o que alguém faz à mão.
- A recolha pede-se fora. O módulo OCA não chama nenhum serviço de recolha: o aviso diário à transportadora sai do portal, do telefone ou de uma rota fixa já combinada.
- Não pode vender entrega em ponto a partir do Odoo. O campo do ponto de destino é enviado vazio e não há consulta de pontos, por isso uma encomenda com entrega em ponto de conveniência sai do fluxo da guia.
- A anulação é uma mensagem, não uma ação. O módulo escreve no chatter que a Correos Express não oferece método para anular um envio registado. É verdade para o registo do envio; o serviço de parar entrega existe à parte e tem de estar habilitado no contrato.
- Um corte da API deixa a guia a meio. Qualquer exceção sobe como erro de utilizador e não há nova tentativa. Com poucos envios por dia, alguém volta a carregar no botão; quando são centenas, alguém tem de os ir procurar um a um.
- O botão de reimprimir etiqueta só aparece com a guia validada. Está condicionado a que o estado seja hecho e a que haja número de seguimento. Se o seu armazém imprime antes de validar, esse botão não está onde o procuram.
O certificado de testes: o incidente que mais se repete
Antes de mudar de módulo por um erro de ligação, verifique isto. Ao chamar o ambiente de testes www.test.cexpr.es, o Python falha com CERTIFICATE_VERIFY_FAILED. Não é o módulo. Esse host serve a cadeia inteira, mas emitida pela CA própria dos Correos: o certificado de servidor é assinado por AC SUB 2 CORREOS e essa assinatura sobe até AC RAIZ CORREOS, uma raiz autoassinada que não está no repositório de CA públicas. O Python só confia nesse repositório e corta aí. A produção, www.cexpr.es, valida contra CA públicas sem tocar em nada.
Pode verificá-lo em dez segundos com openssl s_client -connect www.test.cexpr.es:443: a cadeia que devolve termina numa raiz autoassinada dos Correos. A saída rápida é pôr verify=False, e é má ideia: enfraquece todas as chamadas HTTPS dessa instância. O correto é montar um bundle PEM com essa raiz e passá-lo como verify apenas nas chamadas dessa transportadora, para que a produção e as restantes integrações continuem a verificar contra o repositório predefinido. Tem o passo a passo em o erro SSL da Correos Express no Odoo.
Como se verifica que funciona de verdade
O teste não é que o módulo instale. É gerar uma etiqueta real contra o contrato e ver o número escrito na guia. Quatro coisas têm de estar lá:
- O número de expedição no campo de seguimento da guia, não só no PDF.
- A etiqueta guardada como anexo, com o número no nome do ficheiro.
- A ligação pública de seguimento a resolver com esse mesmo número.
- Os códigos de volume, um por cada pacote que declarou.

CENT/OUT/00136 após o registo: estado de fluxo «Etiqueta OK», número de expedição 1823059046850141, código de volume e o PDF da etiqueta anexado. Se o seu teste não acabar num ecrã assim, não está a funcionar: está a compilar.Veredicto
Comece pelo módulo OCA. É gratuito, está no ramo da sua versão e o cenário que cobre é o da maioria das lojas que expedem com a Correos Express. Instale-o, tire uma etiqueta real e trabalhe com ele umas semanas.
Passado esse tempo, escreva a lista do que continua a fazer fora do Odoo. Se nessa lista houver pedir recolha, oferecer ponto de conveniência, perseguir guias sem etiqueta ou declarar peso por volume, é aí que um módulo pago se justifica: não por ter mais botões, mas por eliminar essa lista. Se a lista estiver vazia, já terminou e não tem de comprar nada.
Quem o monta é outra conversa: instalação, credenciais e bundle do certificado custam o mesmo com o módulo gratuito que com o pago. Tratamos disso em implementação de módulos OCA e em logística no Odoo.
Para continuar
Perguntas frequentes
Existe um módulo da Correos Express para Odoo gratuito?
Sim: delivery_correos_express, no repositório OCA/delivery-carrier sob AGPL-3.0 e com ramo da 14.0 à 19.0. Cobre registo de envio, etiqueta em PDF ou ZPL e atualização de estado.
O módulo OCA tira etiquetas para impressora térmica?
Sim, em ZPL. O tipo de etiqueta é um menu pendente com duas opções, PDF e ZPL, que são os tipos 1 e 2 da API da Correos Express. Se a sua impressora fala outra linguagem, aí o módulo não chega.
Posso oferecer entrega em ponto de conveniência com o módulo OCA?
Não a partir do Odoo. O campo do ponto de destino é sempre enviado vazio e o módulo não inclui nenhuma consulta de pontos, por isso a encomenda com entrega em ponto gere-se fora da guia.
Porque é que o envio me aparece a 0 € na encomenda?
Porque a API da Correos Express não cota envios. O módulo OCA di-lo com todas as letras e devolve o preço de lista do produto de transporte; o conector próprio devolve o preço fixo da transportadora e escreve zero no preço exato do envio. O transporte define-se com regras de preço no Odoo ou com o módulo OCA delivery_price_method.
É possível anular um envio já registado?
O registo de envio não tem anulação: o módulo OCA escreve-o no chatter e fica por aí. Existe um serviço à parte de parar entrega, que tem de estar habilitado no contrato, e que o conector próprio chama.
O que fazemos sobre isto
Quer que alguém veja o seu caso concreto?
Contrato, versão do Odoo, volume e o que faz hoje fora do ERP. Com isso sabe-se se o módulo OCA lhe chega ou não, e dizemo-lo mesmo que a resposta seja que lhe chega.

