Sites e aplicações

Alterar o estado de uma encomenda consoante o método de pagamento no PrestaShop

Revisto a 7 min de leitura encomendas PrestaShop

No PrestaShop, cada módulo de pagamento decide que estado recebe a encomenda ao ser confirmada. Por exemplo, com pagamento contra reembolso fica em «A aguardar validação do pagamento contra reembolso» e com transferência em «A aguardar pagamento por transferência bancária». Se quiser que entre com outro estado, é preciso alterar o segundo argumento da chamada a validateOrder() no módulo de pagamento.

Se só quiser alterar o nome, a cor ou o e-mail que é enviado, não é preciso mexer no código: edite o estado em Orders > Statuses.

Onde se define o estado

Está no ficheiro controllers/front/validation.php de cada módulo de pagamento:

Módulo Ficheiro Estado que atribui
Contra reembolso modules/ps_cashondelivery/controllers/front/validation.php PS_OS_COD_VALIDATION (nas versões 1.x do módulo, PS_OS_PREPARATION)
Transferência bancária modules/ps_wirepayment/controllers/front/validation.php PS_OS_BANKWIRE
Cheque modules/ps_checkpayment/controllers/front/validation.php PS_OS_CHEQUE

Lá dentro verá uma chamada como esta (módulo de contra reembolso 2.x e 3.x):

$this->module->validateOrder(
    (int) $this->context->cart->id,
    (int) Configuration::getGlobalValue(Ps_Cashondelivery::CONFIG_OS_CASH_ON_DELIVERY),
    (float) $this->context->cart->getOrderTotal(true, Cart::BOTH),
    $this->module->displayName,
    null,
    [],
    (int) $this->context->currency->id,
    false,
    $customer->secure_key
);

O segundo argumento é o estado. CONFIG_OS_CASH_ON_DELIVERY equivale a PS_OS_COD_VALIDATION. Para que a encomenda entre, por exemplo, como «Preparação em curso», esse argumento deve ser (int) Configuration::get('PS_OS_PREPARATION').

Estes são os estados que o PrestaShop traz:

Chave Estado
PS_OS_CHEQUE A aguardar pagamento por cheque
PS_OS_PAYMENT Pagamento aceite
PS_OS_PREPARATION Preparação em curso
PS_OS_SHIPPING Enviada
PS_OS_DELIVERED Entregue
PS_OS_CANCELED Cancelada
PS_OS_REFUND Reembolsada
PS_OS_ERROR Erro no pagamento
PS_OS_OUTOFSTOCK_PAID (ou PS_OS_OUTOFSTOCK) Encomenda pendente por falta de stock (paga)
PS_OS_OUTOFSTOCK_UNPAID Encomenda pendente por falta de stock (não paga)
PS_OS_BANKWIRE A aguardar pagamento por transferência bancária
PS_OS_WS_PAYMENT Pagamento remoto aceite
PS_OS_COD_VALIDATION A aguardar validação do pagamento contra reembolso

Tenha em conta que um estado marcado como pago (por exemplo PS_OS_PAYMENT) faz com que o PrestaShop gere a fatura e o conte como cobrado. Para contra reembolso ou transferência, o normal é usar PS_OS_PREPARATION ou um estado próprio.

Se criou um estado próprio em Orders > Statuses, use o seu número, que aparece na coluna ID da lista: por exemplo (int) 15.

Alterá-lo com um override (recomendado)

Se editar diretamente o ficheiro do módulo, a alteração perde-se da próxima vez que atualizar o módulo. A partir do PrestaShop 1.7, pode substituir o controlador do módulo com um override, que fica fora da pasta do módulo.

Para o módulo de contra reembolso, crie o ficheiro override/modules/ps_cashondelivery/controllers/front/validation.php com este conteúdo:

<?php

class Ps_CashondeliveryValidationModuleFrontControllerOverride extends Ps_CashondeliveryValidationModuleFrontController
{
    public function postProcess()
    {
        $cart = $this->context->cart;
        $orderStep1 = $this->context->link->getPageLink('order', true, (int) $this->context->language->id, ['step' => 1]);

        if (!Validate::isLoadedObject($cart) || !$cart->id_customer || !$cart->id_address_delivery || !$cart->id_address_invoice || $cart->isVirtualCart()) {
            Tools::redirect($orderStep1);
        }

        $customer = new Customer($cart->id_customer);
        if (!Validate::isLoadedObject($customer)) {
            Tools::redirect($orderStep1);
        }

        $this->module->validateOrder(
            (int) $cart->id,
            (int) Configuration::get('PS_OS_PREPARATION'), // Estado com que a encomenda entra
            (float) $cart->getOrderTotal(true, Cart::BOTH),
            $this->module->displayName,
            null,
            [],
            (int) $this->context->currency->id,
            false,
            $customer->secure_key
        );

        Tools::redirect($this->context->link->getPageLink('order-confirmation', true, (int) $this->context->language->id, [
            'id_cart' => (int) $cart->id,
            'id_module' => (int) $this->module->id,
            'id_order' => (int) $this->module->currentOrder,
            'key' => $customer->secure_key,
        ]));
    }
}

Substitua PS_OS_PREPARATION pela chave do estado que pretende. Depois:

  1. Verifique se, em Advanced Parameters > Performance, a opção Disable all overrides está em No.
  2. Apague o ficheiro var/cache/prod/class_index.php (no PrestaShop 1.6, cache/class_index.php) ou clique em Clear cache nesse mesmo ecrã, para que o PrestaShop detete o override.

Para transferência ou cheque, o procedimento é o mesmo: copie o validation.php do módulo para override/modules/<módulo>/controllers/front/validation.php, mude o nome da classe acrescentando Override no fim e faça com que estenda a original. Altere apenas o estado na chamada a validateOrder(). Se o controlador original usar métodos private, copie-os também para a sua classe, porque não podem ser chamados a partir do override.

No PrestaShop 1.6

Na 1.6, os overrides de controladores de módulo não existem. Edite diretamente modules/cashondelivery/controllers/front/validation.php (ou o do módulo de pagamento que usar) e altere o segundo argumento de validateOrder(), que no módulo de contra reembolso é Configuration::get('PS_OS_PREPARATION'). Anote a alteração: terá de a repetir se atualizar o módulo.

Verificar que funciona

Faça uma encomenda de teste com esse método de pagamento e abra-a em Orders > Orders: no histórico deve aparecer o estado novo como primeiro estado. Se continuar a aparecer o anterior, volte a apagar a cache do passo 2.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.