Jump to content

Création de module pour les changements de status automatique


Recommended Posts

Bonjour,

Je me permets de vous contacter concernant un défi technique sur PrestaShop 1.7.8.7. Bien que n'étant pas développeur PHP, mes compétences en Python et dans le domaine de la data sont avancées. Je rencontre actuellement des difficultés avec un module que je développe, lequel ne produit pas les résultats attendus.

L'objectif de ce module est d'améliorer la gestion des commandes pour les clients bénéficiant de conditions de paiement particulières, telles que des délais de 30 ou 60 jours. Nous avons créé un statut "En attente de virement | Expédition avant paiement" qui nécessite actuellement une mise à jour manuelle. Cette méthode provoque des désynchronisations avec notre logistique et engendre une perte de temps considérable.

Le module envisagé automatise le changement de statut pour une liste spécifique de clients ayant droit à ces facilités de paiement. Après inscription de l'ID client dans une liste blanche, le statut de ses commandes passées en virement bancaire s'actualise automatiquement au statut spécifique mentionné plus haut. Cependant, malgré sa simplicité apparente, le module réinitialise le statut à "En attente de virement bancaire", sans raison apparente. Cela suggère l'existence d'un autre hook nécessaire à l'opération, que je n'ai pas encore identifié.

Malgré plusieurs tests avec différents hooks, le problème persiste : le statut se réinitialise immédiatement après avoir été correctement mis à jour. J'espère que vous pourrez m'offrir des conseils ou des solutions pour surmonter ce problème.

Je vous remercie sincèrement pour l'attention portée à ma demande.

Cordialement, Morgan

Voici le code

    public function install()
    {
        Configuration::updateValue('ORDER_STATUS_LIVE_MODE', false);

        return parent::install() &&
            $this->registerHook('header') &&
            $this->registerHook('displayBackOfficeHeader') &&
            // $this->registerHook('actionOrderStatusUpdate');
            // $this->registerHook('actionValidateOrder');
            $this->registerHook('actionOrderStatusPostUpdate'); // Enregistrement du nouveau hook
        }

----------------------------------------------

    protected function getConfigForm()
    {
        return array(
            'form' => array(
                'legend' => array(
                'title' => $this->l('Settings'),
                'icon' => 'icon-cogs',
                ),
                'input' => array(
                    array(
                        'type' => 'switch',
                        'label' => $this->l('Live mode'),
                        'name' => 'ORDER_STATUS_LIVE_MODE',
                        'is_bool' => true,
                        'desc' => $this->l('Use this module in live mode'),
                        'values' => array(
                            array(
                                'id' => 'active_on',
                                'value' => true,
                                'label' => $this->l('Enabled')
                            ),
                            array(
                                'id' => 'active_off',
                                'value' => false,
                                'label' => $this->l('Disabled')
                            ),
                        ),
                    ),
                    array(
                        'type' => 'textarea',
                        'label' => $this->l('Whitelist Client IDs'),
                        'name' => 'ORDER_STATUS_WHITELIST_DISPLAY',
                        'desc' => $this->l('Currently whitelisted client IDs (read-only)'),
                        'readonly' => true,
                    ),
                    array(
                        'col' => 3,
                        'type' => 'text',
                        'name' => 'ORDER_STATUS_WHITELIST',
                        'label' => $this->l('Whitelist Client IDs'),
                        'desc' => $this->l('Enter the customer IDs to whitelist, separated by commas.'),
                    ),
                ),
                'submit' => array(
                    'title' => $this->l('Save'),
                ),
            ),
        );
    }

--------------------------------------

    protected function getConfigFormValues()
    {
        return array(
            'ORDER_STATUS_LIVE_MODE' => Configuration::get('ORDER_STATUS_LIVE_MODE', true),
            'ORDER_STATUS_WHITELIST' => Configuration::get('ORDER_STATUS_WHITELIST', ''),
        );
    }

-----------------------------------------


    protected function postProcess()
    {
        $form_values = $this->getConfigFormValues();

        foreach (array_keys($form_values) as $key) {
            Configuration::updateValue($key, Tools::getValue($key));
        }
        Configuration::updateValue('ORDER_STATUS_WHITELIST', Tools::getValue('ORDER_STATUS_WHITELIST'));
    }

---------------------------------------


    public function hookActionOrderStatusPostUpdate($params)
    {
        static $alreadyRun = false;

        if ($alreadyRun) {
            return;
        }

        $orderId = $params['id_order'];
        $order = new Order($orderId);
        $customer = new Customer($order->id_customer);

        $customStatusId = 20;
        $whitelist = explode(',', Configuration::get('ORDER_STATUS_WHITELIST'));

        // Vérifiez si le client est dans la whitelist et que le statut actuel est "En Attente de Virement"
        if (in_array($customer->id, $whitelist) && $order->current_state == Configuration::get('PS_OS_BANKWIRE')) {
            if ($order->module == 'ps_wirepayment') {
                $this->logToFile("Commande {$orderId} de client whitelisté, mise à jour du statut à {$customStatusId}");
                $order->setCurrentState($customStatusId);
                $order->save();
                $alreadyRun = true;
            }
        }
    }

    private function logToFile($message)
    {
        $logPath = $this->local_path . 'log/order_status_debug_5.log';
        $date = new DateTime();
        $timestamp = $date->format('Y-m-d H:i:s');
        $logEntry = "[$timestamp] $message\n";
        if (!is_dir(dirname($logPath))) {
            mkdir(dirname($logPath), 0755, true);
        }
        file_put_contents($logPath, $logEntry, FILE_APPEND);
    }

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...