Imprimir automaticamente as encomendas PrestaShop numa impressora térmica

O PrestaShop dispara um hook em cada mudança de estado da encomenda. Ligue-lhe uma chamada de impressão e os talões saem sozinhos: módulo ou vinte linhas de PHP.

O PrestaShop dá-lhe documentos de encomenda e um botão Imprimir no navegador. O que não lhe dá é um talão a aparecer nas traseiras no momento em que o cliente paga: isso exige ligar o ciclo de vida da encomenda a uma impressora acessível pela internet.

Resposta curta: ligue-se ao actionOrderStatusPostUpdate, confirme que o novo estado significa "pago", construa o talão e faça um POST. Um módulo já feito resolve isto com definições em vez de código; um pequeno módulo próprio fá-lo exatamente à sua maneira. Nenhum dos dois precisa de um computador ligado na loja.

Dois caminhos

Módulo Hook próprio
Arranque Instalar e configurar Cerca de 20 linhas de PHP
Controlo da paginação Definições do template Total
Multiloja Resolvido A seu cargo
Melhor para A maioria das lojas Encaminhamento ou lógica específicos

O conector PrestaShop cobre o primeiro caminho; a documentação do módulo percorre a instalação e as definições do talão.

O caminho do hook

O PrestaShop dispara actionOrderStatusPostUpdate depois de o estado da encomenda ter mudado e ter sido persistido. É o momento certo: o anterior actionOrderStatusUpdate dispara antes de a alteração estar confirmada.

public function hookActionOrderStatusPostUpdate($params)
{
    /** @var OrderState $newStatus */
    $newStatus = $params['newOrderStatus'];
    $order = new Order((int) $params['id_order']);

    // Imprimir apenas com o pagamento aceite; `paid` cobre os estados padrão.
    if (!$newStatus->paid) {
        return;
    }

    $linhas = [
        'ENCOMENDA ' . $order->reference,
        date('d/m/Y H:i'),
        '',
    ];

    foreach ($order->getProducts() as $product) {
        $linhas[] = (int) $product['product_quantity'] . 'x ' . $product['product_name'];
    }

    $linhas[] = '';
    $linhas[] = 'TOTAL: ' . number_format($order->total_paid, 2) . ' ' . $this->context->currency->iso_code;

    $ch = curl_init('https://www.expedy.fr/api/v2/printers/' . Configuration::get('MYMOD_PRINTER_UID') . '/print');
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 5,
        CURLOPT_HTTPHEADER => [
            'Authorization: ' . Configuration::get('MYMOD_API_SID') . ':' . Configuration::get('MYMOD_API_TOKEN'),
            'Content-Type: application/json',
        ],
        CURLOPT_POSTFIELDS => json_encode([
            'printer_msg' => implode("\n", $linhas),
            'origin' => 'ps-' . $order->id,
        ]),
    ]);
    curl_exec($ch);
    curl_close($ch);
}

Armadilhas próprias do PrestaShop

As mudanças de estado não são únicas. Um módulo de pagamento pode definir o mesmo estado pago duas vezes, e um comerciante pode reaplicá-lo à mão a partir do back office. Guarde uma marca (uma linha de meta na encomenda ou uma tabela dedicada), e saia cedo se a encomenda já foi impressa. Sem isso, cada nova gravação é mais um talão.

newOrderStatus->paid é o teste fiável. Fixar ids de estado no código parte no dia em que alguém acrescenta um estado personalizado ou você instala numa loja configurada de outra forma. A marca paid é o que os módulos de pagamento definem de facto.

Multiloja precisa de uma impressora por loja. Numa instalação multiloja, leia o id da impressora a partir do contexto de loja em vez de um único valor global de configuração, ou todas as lojas imprimem na mesma máquina.

Os timeouts bloqueiam o cliente. O hook corre dentro do pedido que confirma a encomenda. Um CURLOPT_TIMEOUT de cinco segundos é um tecto para o tempo que um comprador pode esperar se a API estiver inacessível: mantenha-o baixo, e trate as falhas de entrega de forma assíncrona em vez de fazer o checkout depender de uma impressora.

Os nomes de produto trazem tudo. Os caracteres acentuados não são problema; emoji e símbolos invulgares são. Translitere antes de construir o talão: é a causa mais comum de uma impressora que "para sem razão".

Paginação do talão

Cabeçalhos a negrito, um logótipo, um código QR para a encomenda, um código de barras, corte automático: é tudo marcação dentro de printer_msg. Veja a referência de paginação e, para um talão em estilo de fatura europeia, os códigos de barras EAN-13.

Comece por um talão de teste

Antes sequer de tocar no PrestaShop, crie uma conta gratuita e imprima um talão com um curl simples. Verificar a cadeia de impressão de forma independente significa que, quando mais tarde algo correr mal, já sabe se deve olhar para o PrestaShop ou para a impressora.

A ler também: Shopify e WooCommerce seguem o mesmo padrão com hooks diferentes.

FAQ

Que hook do PrestaShop devo usar para imprimir uma encomenda?

actionOrderStatusPostUpdate, que dispara depois de a mudança de estado ter sido persistida. Teste newOrderStatus->paid em vez de fixar ids de estado no código, para que estados personalizados e lojas configuradas de outra forma continuem a funcionar.

Porque é que a mesma encomenda é impressa duas vezes?

Os módulos de pagamento podem aplicar o mesmo estado pago mais do que uma vez, e os comerciantes podem reaplicá-lo à mão. Guarde uma marca de impresso na encomenda e saia quando já estiver definida.

Funciona com uma instalação multiloja?

Sim, mas leia o id da impressora a partir do contexto de loja em vez de um único valor global de configuração, caso contrário todas as lojas imprimem na mesma máquina.

Preciso de um computador na loja?

Não. Uma impressora na nuvem liga-se sozinha por 4G, Wi-Fi ou Ethernet, e uma impressora USB já existente é alcançada através de um adaptador Raspberry Pi.