Stampare automaticamente gli ordini PrestaShop su una stampante termica

PrestaShop lancia un hook a ogni cambio di stato dell'ordine. Agganciateci una chiamata di stampa e gli scontrini escono da soli: modulo o venti righe di PHP.

PrestaShop vi dà i documenti dell'ordine e un pulsante Stampa nel browser. Quello che non vi dà è uno scontrino che compare nel retro nel momento in cui il cliente paga: questo richiede di collegare il ciclo di vita dell'ordine a una stampante raggiungibile via internet.

Risposta breve: agganciate actionOrderStatusPostUpdate, verificate che il nuovo stato significhi "pagato", costruite lo scontrino e fate una POST. Un modulo già pronto fa questo con le impostazioni invece che con il codice; un piccolo modulo su misura lo fa esattamente a modo vostro. Nessuno dei due richiede un computer acceso in negozio.

Due strade

Modulo Hook su misura
Messa in opera Installare e configurare Circa 20 righe di PHP
Controllo sull'impaginazione Impostazioni del template Totale
Multinegozio Gestito A vostro carico
Ideale per La maggior parte dei negozi Instradamento o logica specifici

Il connettore PrestaShop copre la prima strada; la documentazione del modulo illustra installazione e impostazioni dello scontrino.

La strada dell'hook

PrestaShop lancia actionOrderStatusPostUpdate dopo che lo stato dell'ordine è cambiato ed è stato salvato. È il momento giusto: il precedente actionOrderStatusUpdate scatta prima che la modifica sia confermata.

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

    // Stampare solo a pagamento accettato; `paid` copre gli stati standard.
    if (!$newStatus->paid) {
        return;
    }

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

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

    $righe[] = '';
    $righe[] = 'TOTALE: ' . 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", $righe),
            'origin' => 'ps-' . $order->id,
        ]),
    ]);
    curl_exec($ch);
    curl_close($ch);
}

Trappole specifiche di PrestaShop

I cambi di stato non sono unici. Un modulo di pagamento può impostare due volte lo stesso stato pagato, e un commerciante può riapplicarlo a mano dal back office. Salvate un flag (una riga di meta sull'ordine o una tabella dedicata), e uscite subito se l'ordine è già stato stampato. Senza, ogni nuovo salvataggio è un altro scontrino.

newOrderStatus->paid è il test affidabile. Cablare gli id di stato si rompe il giorno in cui qualcuno aggiunge uno stato personalizzato o installate su un negozio configurato diversamente. Il flag paid è ciò che i moduli di pagamento impostano davvero.

Il multinegozio richiede una stampante per negozio. In un'installazione multinegozio, leggete l'id della stampante dal contesto del negozio invece che da un unico valore globale di configurazione, altrimenti tutti i negozi stampano sulla stessa macchina.

I timeout bloccano il cliente. L'hook gira dentro la richiesta che conferma l'ordine. Un CURLOPT_TIMEOUT di cinque secondi è un tetto a quanto un acquirente potrebbe aspettare se l'API non risponde: tenetelo basso, e trattate i fallimenti di consegna in modo asincrono invece di far dipendere il checkout da una stampante.

I nomi dei prodotti contengono di tutto. I caratteri accentati vanno bene; emoji e simboli insoliti no. Traslitterate prima di costruire lo scontrino: è la causa più comune di una stampante che "si ferma senza motivo".

Impaginazione dello scontrino

Intestazioni in grassetto, un logo, un QR code verso l'ordine, un codice a barre, taglio automatico: è tutto markup dentro printer_msg. Vedete il riferimento di impaginazione e, per uno scontrino in stile fattura europea, i codici a barre EAN-13.

Partite da uno scontrino di prova

Prima ancora di toccare PrestaShop, aprite un account gratuito e stampate uno scontrino con un semplice curl. Verificare la catena di stampa in modo indipendente significa che, quando più avanti qualcosa non va, sapete già se guardare in PrestaShop o alla stampante.

Da leggere anche: Shopify e WooCommerce seguono lo stesso schema con hook diversi.

FAQ

Quale hook di PrestaShop devo usare per stampare un ordine?

actionOrderStatusPostUpdate, che scatta dopo che il cambio di stato è stato salvato. Verificate newOrderStatus->paid invece di cablare gli id di stato, così stati personalizzati e negozi configurati diversamente continuano a funzionare.

Perché lo stesso ordine viene stampato due volte?

I moduli di pagamento possono applicare più volte lo stesso stato pagato, e i commercianti possono riapplicarlo a mano. Salvate un flag di stampa sull'ordine e uscite quando è già impostato.

Funziona con un'installazione multinegozio?

Sì, ma leggete l'id della stampante dal contesto del negozio invece che da un unico valore globale di configurazione, altrimenti tutti i negozi stampano sulla stessa macchina.

Serve un computer in negozio?

No. Una stampante cloud si collega da sola via 4G, Wi-Fi o Ethernet, e una stampante USB già presente si raggiunge con un adattatore Raspberry Pi.