Sites e aplicações
Alterar o estado de uma encomenda consoante o método de pagamento no 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:
- Verifique se, em Advanced Parameters > Performance, a opção Disable all overrides está em No.
- 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
- Configurar o PrestaShop para enviar correio por SMTP Faça com que os e-mails do PrestaShop (encomendas, registo, palavras-passe) saiam por SMTP autentica...
- Mail Alerts: receber avisos de encomendas, stock e devoluções no PrestaShop Instale e configure o módulo Mail Alerts do PrestaShop para receber um e-mail a cada encomenda nova,...
- Mostrar a imagem e o preço nas pesquisas instantâneas do PrestaShop 1.6, 1.7, 8 e 9 Código para que a pesquisa instantânea (AJAX) do PrestaShop mostre a imagem e o preço de cada produt...
- Mudar para espanhol o idioma da loja e da administração do PrestaShop Coloque o PrestaShop em espanhol: importe o pacote de localização de Espanha, escolha o espanhol com...
Algo não bate certo ou mudou? Diga-nos e revemos.