Observateur de l'abandon de la charrette

8

J'ai besoin d'aide!!!

Je crée un module qui s'intègre à une autre plateforme via l'API. J'ai déjà reçu l'observateur ou l'événement pour l'inscription du client ( customer_register_success ), achat terminé ( checkout_onepage_controller_success_action ).

L'aide dont j'ai besoin est de savoir comment amener l'Observer dans des paniers abandonnés?, Ou quelle serait la meilleure méthode pour obtenir ces informations et les envoyer via l'API.

Knaimero
la source
2
Quelle est votre définition des chariots abandonnés?
Philipp Sander
Lorsque le client a ajouté des produits à la voiture et n'a pas effectué l'achat
Knaimero
3
Vous n'avez pas effectué l'achat dans les 2 minutes, 10 minutes, une heure ou une journée? Quoi qu'il en soit, quelle que soit l'heure que vous choisissez pour votre définition, vous pouvez observer un événement qui se produit, et non quelque chose qui ne se produit pas. À mon avis, pour votre cas d'utilisation, le meilleur concept serait un cronjob qui vérifie les devis actifs avec la dernière interaction plus ancienne que x minutes / heures / jours.
HelgeB
Je vous remercie. Magento lorsque vous effectuez un achat et fermez le commerce électronique, crée automatiquement un enregistrement que vous pouvez voir dans l'administrateur -> rapports -> Chariots abandonnés. Ma question existe. Existe-t-il un moyen d'obtenir ces informations?
Knaimero
Il n'y a pas un tel événement pour l'obtenir, vous pouvez obtenir une collecte de devis qui n'est pas commandée entre une heure spécifique
Ketan Borada

Réponses:

3
  • Il n'y a pas un tel événement pour obtenir des chariots abandonnés, vous devez le créer sur mesure.
  • J'ai l'idée de surmonter cela, vous devez créer un cron qui s'exécute à chaque heure spécifique et collecter tous les devis qui ne sont pas commandés et entre l'heure que vous définissez (différence entre l'heure de création et la mise à jour du devis). vous devez simplement gérer updatedAtFrometupdatedAtTo
  • En faisant cela, vous collecterez toutes les données de devis et dans cette collection, vous pouvez envoyer un événement et transmettre toutes les données de devis et les données client à cet événement dans un seul événement ou réduire pour tous les devis et transmettre ces données à l'API à partir de l'observateur.

J'ai créé un script que vous pouvez appliquer dans votre fonction de blocage.J'utilise ce script de travail pour envoyer un article du panier par courrier à mon client après son départ sans commande.

<?php 
ob_start();
use Magento\Framework\App\Bootstrap;
include('app/bootstrap.php');
$bootstrap = Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
ini_set('memory_limit', '1024M');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$resource = $objectManager->create('Magento\Framework\App\ResourceConnection');
$updatedAtFrom = '2019-06-19 19:00:00'; //Add current time
$updatedAtTo   = '2019-06-19 20:30:00';  // $updatedAtFrom  + 90 minutes ,add 90 minutes in current time to abondened cart

        $connection = $resource->getConnection();


        $select = $connection->select()
            ->from(
                ['q' => $resource->getTableName('quote')],
                [
                    'store_id'    => 'q.store_id',
                    'quote_id'    => 'q.entity_id',
                    'customer_id' => 'q.customer_id',
                    'updated_at'  => 'q.updated_at',
                    'created_at'  => 'q.created_at',
                ]
            )
            ->joinLeft(
                ['qa' => $resource->getTableName('quote_address')],
                'q.entity_id = qa.quote_id AND qa.address_type = "billing"',
                [
                    'customer_email'     => new \Zend_Db_Expr('IFNULL(q.customer_email, qa.email)'),
                    'customer_firstname' => new \Zend_Db_Expr('IFNULL(q.customer_firstname, qa.firstname)'),
                    'customer_lastname'  => new \Zend_Db_Expr('IFNULL(q.customer_lastname, qa.lastname)'),
                ]
            )
            ->joinInner(
                ['qi' => $resource->getTableName('quote_item')],
                'q.entity_id = qi.quote_id',
                [
                    'i_created_at' => new \Zend_Db_Expr('MAX(qi.created_at)'),
                ]
            )
            ->joinLeft(array('order' => $resource->getTableName('sales_order')),
                'order.quote_id = q.entity_id',
                array()
            )
            ->where('order.entity_id IS NULL')
            ->where('q.is_active = 1')
            ->where('q.items_count > 0')
            ->where('q.customer_email IS NOT NULL OR qa.email IS NOT NULL')
            ->where('qi.parent_item_id IS NULL')
            ->group('q.entity_id')
            ->having(
                '(q.created_at > ? OR MAX(qi.created_at) > ?)',
                $updatedAtFrom
            )
            ->having(
                '(q.created_at < ? OR MAX(qi.created_at) < ?)',
                $updatedAtTo
            )
            ->order('q.updated_at');

        $quotes = $connection->fetchAll($select);


        foreach ($quotes as $quote) {

            $params = [

                'store_id'       => $quote['store_id'],
                'quote_id'              => $quote['quote_id'],
                'customer_id'           => $quote['customer_id'],
                'customer_email' => $quote['customer_email'],
                'customer_tname'  => $quote['customer_firstname'] . ' ' . $quote['customer_lastname'],
                'created_at'     => max($quote['created_at'], $quote['i_created_at']),
            ];

            echo $quote['quote_id'];

            /*$this->eventdispatch->register(
                'quote_abandoned',
                [$params['quote_id']],
                $params
            );*/ 
            // Dispatch Event here and writelogic in that event which you want
        }

?>

La requête résultante du script ci-dessus est:

SELECT `q`.`store_id`, `q`.`entity_id` AS `quote_id`, `q`.`customer_id`, `q`.`updated_at`, `q`.`created_at`, IFNULL(q.customer_email, qa.email) AS `customer_email`, IFNULL(q.customer_firstname, qa.firstname) AS `customer_firstname`, IFNULL(q.customer_lastname, qa.lastname) AS `customer_lastname`, MAX(qi.created_at) AS `i_created_at` FROM `quote` AS `q` LEFT JOIN `quote_address` AS `qa` ON q.entity_id = qa.quote_id AND qa.address_type = "billing" INNER JOIN `quote_item` AS `qi` ON q.entity_id = qi.quote_id LEFT JOIN `sales_order` AS `order` ON order.quote_id = q.entity_id WHERE (order.entity_id IS NULL) AND (q.is_active = 1) AND (q.items_count > 0) AND (q.customer_email IS NOT NULL OR qa.email IS NOT NULL) AND (qi.parent_item_id IS NULL) GROUP BY `q`.`entity_id` HAVING ((q.created_at > '2019-06-19 19:00:00' OR MAX(qi.created_at) > '2019-06-19 19:00:00')) AND ((q.created_at < '2019-06-19 20:30:00' OR MAX(qi.created_at) < '2019-06-19 20:30:00')) ORDER BY `q`.`updated_at` ASC 
Ketan Borada
la source