Pengamat untuk Abandonment of Cart

8

Saya butuh bantuan!!!

Saya membuat modul yang terintegrasi dengan platform lain melalui API. Saya sudah mendapatkan Observer atau Acara untuk pendaftaran pelanggan ( customer_register_success ), pembelian selesai ( checkout_onepage_controller_success_action ).

Bantuan yang saya butuhkan adalah bagaimana saya bisa mendapatkan Pengamat ke gerobak yang ditinggalkan ?, atau apa metode terbaik untuk mendapatkan informasi itu dan mengirimkannya melalui API.

Knaimero
sumber
2
apa definisi Anda tentang gerobak berabad-abad?
Philipp Sander
Ketika pelanggan menambahkan produk ke mobil dan tidak melakukan pembelian
Knaimero
3
Tidak melakukan pembelian dalam waktu 2 menit, 10 menit, satu jam atau sehari? Bagaimanapun, kapan pun Anda memilih definisi Anda, Anda dapat mengamati peristiwa yang terjadi, dan bukan sesuatu yang tidak terjadi. Menurut pendapat saya untuk usecase Anda konsep terbaik akan menjadi cronjob yang memeriksa kutipan aktif dengan interaksi terakhir lebih dari x menit / jam / hari.
HelgeB
Terima kasih. Magento ketika Anda melakukan pembelian dan menutup e-commerce, secara otomatis membuat catatan yang dapat Anda lihat di admin -> laporan -> Keranjang yang ditinggalkan. Pertanyaan saya ada, adakah cara untuk mendapatkan informasi itu?
Knaimero
Tidak ada acara seperti itu untuk mendapatkannya, Anda bisa mendapatkan koleksi kutipan yang tidak dipesan antara waktu tertentu
Ketan Borada

Jawaban:

3
  • Tidak ada acara untuk mendapatkan gerobak yang ditinggalkan, Anda harus membuatnya khusus.
  • Saya punya ide untuk mengatasi ini, Anda harus membuat cron yang berjalan setiap waktu tertentu dan mengumpulkan semua penawaran yang tidak dipesan dan antara waktu yang Anda tentukan (perbedaan antara waktu penawaran dibuat dan diperbarui). Anda hanya perlu mengelola updatedAtFromdanupdatedAtTo
  • Dengan melakukan ini, Anda akan mengumpulkan semua data penawaran dan dalam koleksi itu Anda dapat mengirim acara dan meneruskan semua data penawaran dan data pelanggan ke acara tersebut dalam satu acara atau memisahkan semua kutipan dan meneruskan data itu ke API dari pengamat.

Saya telah membuat Skrip yang dapat Anda terapkan dalam fungsi Blok Anda. Saya menggunakan skrip yang berfungsi untuk mengirim item keranjang melalui pos kepada pelanggan saya setelah mereka pergi tanpa pesanan.

<?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
        }

?>

Kueri yang dihasilkan dari skrip di atas adalah:

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
sumber