_user_id = (string)$request['user_id']; else $this->_user_id = (string)$this->di->getUser()->id; // $this->_user_id = '60dace0ec5cc1e356830d073'; $this->_user_details = $this->di->getObjectManager()->get('\App\Core\Models\User\Details'); // if (isset($request['shop_id'])) { // $this->_shop_id = (string)$request['shop_id']; // $shop = $this->_user_details->getShop($this->_shop_id, $this->_user_id); // } else { // $shop = $this->_user_details->getDataByUserID($this->_user_id, 'amazon'); // $this->_shop_id = $shop['_id']; // } // $this->_remote_shop_id = $shop['remote_shop_id']; // $this->_site_id = $shop['warehouses'][0]['seller_id']; $this->_baseMongo = $this->di->getObjectManager()->get('\App\Core\Models\BaseMongo'); return $this; } public function saveReport($report) { $report = json_decode($report, true); if (isset($report['response']) && count($report['response'])) { foreach ($report['response'] as $amzReport) { // if ($amzReport['status']) { if (!isset($amzReport['GeneratedReportId']) || empty($amzReport['GeneratedReportId']) || $amzReport['GeneratedReportId'] == 0) { $this->processQueue(); } $preparedReport = $this->moldReport($amzReport, $report['specifics'], $report['queued_task_id'] ?? ""); $mongo = $this->di->getObjectManager()->create('\App\Core\Models\BaseMongo'); $collection = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::REPORT_CONTAINER); $reportData = $collection->findOne(['ReportRequestId' => $preparedReport['ReportRequestId']]); if ($reportData && count($reportData)) { foreach ($reportData as $key => $value) { if (!isset($reportData[$key])) { $reportData[$key] = $value; } } $collection->updateOne(['ReportRequestId' => $preparedReport['ReportRequestId']], ['$set' => $preparedReport]); } else { // $preparedReport['_id'] = $this->_baseMongo->getCounter('report_id', $this->_user_id); $collection->insertOne($preparedReport); } // } } } return true; } public function moldReport($amzReport, $specifics, $queued_task_id) { $bulkOpArray = []; $preparedReport = $amzReport; $preparedReport['user_id'] = $this->_user_id; $preparedReport['shop_id'] = $specifics['shop_id']; if (!isset($preparedReport['GeneratedReportId'])) { $preparedReport['GeneratedReportId'] = 0; } if (isset($preparedReport['report_content'])) { $reportContent = base64_decode($preparedReport['report_content']); $delimiter = "\n"; $splitContents = explode($delimiter, $reportContent); $first = true; $heading = []; $products = []; $batchSize = 500; $counter = 1; $bulkInsertArray = []; $mongo = $this->di->getObjectManager()->create('\App\Core\Models\BaseMongo'); $amazonCollection = $mongo->setSource(\App\Amazon\Components\Common\Helper::AMAZON_LISTING)->getPhpCollection(); $response = $amazonCollection->deleteMany([ 'user_id' => $this->_user_id, 'shop_id' => $specifics['shop_id'] ], ['w' => true]); // $this->di->getLog()->logContent('userId = '. $this->_user_id.' '.$response->getDeletedCount().' items deleted successfully.', 'info', 'report_data.log'); foreach ($splitContents as $line) { $bits = explode("\t", $line); if ($first) { $heading = $bits; $first = false; continue; } else { if (count($bits) == count($heading)) { $product = []; foreach ($heading as $i => $key) { $bits[$i] = iconv('UTF-8', 'UTF-8//IGNORE', $bits[$i]); $product[$key] = $bits[$i]; } $copy_product = $product; if (isset($product['卖家 SKU'])) { $copy_product['seller-sku'] = $product['卖家 SKU']; } if (isset($product['ASIN1'])) { $copy_product['asin1'] = $product['ASIN1']; } if (isset($product['状态'])) { $copy_product['status'] = $product['状态']; } $copy_product['user_id'] = $preparedReport['user_id']; $copy_product['shop_id'] = $preparedReport['shop_id']; $bulkInsertArray[] = $copy_product; $counter++; if ($counter == $batchSize) { $amazonCollection->insertMany($bulkInsertArray); $counter = 1; $bulkInsertArray = []; } $products[] = $product; } } } if (!empty($bulkInsertArray)) { $amazonCollection->insertMany($bulkInsertArray); } // $this->di->getLog()->logContent('userId = '.$this->_user_id.' '.'Report Data count = ' . count($products), 'info', 'report_data.log'); // $preparedReport['products'] = $products; $count = count($products); if ($count) { $handlerData = [ 'type' => 'full_class', 'class_name' => '\App\Amazon\Components\Cron\Route\Requestcontrol', 'method' => 'matchProductFromAmazon', 'queue_name' => $this->di->getObjectManager()->get('\App\Amazon\Components\Cron\Helper')->getMatchProductQueueName(), 'user_id' => $this->_user_id, 'shop_id' => $preparedReport['shop_id'], 'limit' => 20, 'queued_task_id' => $queued_task_id, 'page' => 0 ]; $handlerData['individual_weight'] = round((100 / ceil($count / $handlerData['limit'])), 2); $helper = $this->di->getObjectManager()->get('\App\Rmq\Components\Helper'); $helper->createQueue($handlerData['queue_name'], $handlerData); } else { //removing notification $mongo = $this->di->getObjectManager()->create('\App\Core\Models\BaseMongo'); $queuedTasks = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::QUEUED_TASKS); $queuedTasks->deleteOne(['user_id' => $this->_user_id, 'shop_id' => (string)$specifics['shop_id'], 'type' => 'default_amazon_product_match']); } unset($preparedReport['report_content']); } if (!empty($queued_task_id) && !isset($preparedReport['queued_task_id'])) { $preparedReport['queued_task_id'] = $queued_task_id; } return $preparedReport; } /*public function moldReport($amzReport, $specifics) { $bulkOpArray = []; $preparedReport = $amzReport; $preparedReport['user_id'] = $this->_user_id; $preparedReport['shop_id'] = $specifics['shop_id']; if (!isset($preparedReport['GeneratedReportId'])) { $preparedReport['GeneratedReportId'] = 0; } if (isset($preparedReport['report_content'])) { $reportContent = base64_decode($preparedReport['report_content']); $delimiter = "\n"; $splitContents = explode($delimiter, $reportContent); $first = true; $heading = []; $products = []; $mongo = $this->di->getObjectManager()->create('\App\Core\Models\BaseMongo'); $amazonCollection = $mongo->setSource(\App\Amazon\Components\Common\Helper::AMAZON_LISTING)->getPhpCollection(); foreach ($splitContents as $line) { $bits = explode("\t", $line); if ($first) { $heading = $bits; $first = false; continue; } else { if (count($bits) == count($heading)) { $product = []; foreach ($heading as $i => $key) { // if (!in_array($key, ['seller-sku', 'asin1', 'price', 'quantity', 'status'])) { // continue; // } $bits[$i] = iconv('UTF-8', 'UTF-8//IGNORE', $bits[$i]); $product[$key] = $bits[$i]; } $copy_product = $product; if (isset($product['卖家 SKU'])) { $copy_product['seller-sku'] = $product['卖家 SKU']; } if (isset($product['ASIN1'])) { $copy_product['asin1'] = $product['ASIN1']; } if (isset($product['状态'])) { $copy_product['status'] = $product['状态']; } // if ($this->_user_id == '60dace0ec5cc1e356830d073') { // $this->di->getLog()->logContent('userId = ' . $this->_user_id, 'info', 'report_data.log'); // $this->di->getLog()->logContent('Report Data = ' . json_encode($copy_product), 'info', 'report_data.log'); // } $copy_product['user_id'] = $preparedReport['user_id']; $copy_product['shop_id'] = $preparedReport['shop_id']; $filter = ['seller-sku' => (string)$copy_product['seller-sku'], 'shop_id' => (string)$preparedReport['shop_id'], 'user_id' => (string)$preparedReport['user_id']]; $queryData = [ '$set' => $copy_product ]; $bulkOpArray[] = [ 'updateOne' => [ $filter, $queryData, ['upsert' => true], ], ]; // $amazonData = $amazonCollection->findOne(['seller-sku' => $product['seller-sku'], 'shop_id' => $preparedReport['shop_id'], 'user_id' => $preparedReport['user_id']]); // if ($amazonData && count($amazonData)) { // $amazonCollection->updateOne(['seller-sku' => $copy_product['seller-sku'], 'shop_id' => $preparedReport['shop_id'], 'user_id' => $preparedReport['user_id']], ['$set' => $copy_product]); // } else { // // $copy_product['_id'] = $this->_baseMongo->getCounter('amazon_listing_id', $this->_user_id); // $amazonCollection->insertOne($copy_product); // } // $product = $this->match($product, $preparedReport); $products[] = $product; } } } // if ($this->_user_id == '60dace0ec5cc1e356830d073') { $this->di->getLog()->logContent('userId = ' . $this->_user_id, 'info', 'report_data.log'); $this->di->getLog()->logContent('Report Data count = ' . count($products), 'info', 'report_data.log'); // } if (!empty($bulkOpArray)) { $amazonCollection->BulkWrite($bulkOpArray, ['w' => 1]); } $preparedReport['products'] = $products; if (count($products)) { $handlerData = [ 'type' => 'full_class', 'class_name' => '\App\Amazon\Components\Cron\Route\Requestcontrol', 'method' => 'matchProductFromAmazon', 'queue_name' => $this->di->getObjectManager()->get('\App\Amazon\Components\Cron\Helper')->getMatchProductQueueName(), 'user_id' => $this->_user_id, 'shop_id' => $preparedReport['shop_id'], 'limit' => 100, 'page' => 0 ]; $helper = $this->di->getObjectManager()->get('\App\Rmq\Components\Helper'); $helper->createQueue($handlerData['queue_name'], $handlerData); } else { //removing notification $mongo = $this->di->getObjectManager()->create('\App\Core\Models\BaseMongo'); $queuedTasks = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::QUEUED_TASKS); $queuedTasks->deleteOne(['user_id' => $this->_user_id, 'shop_id' => (string)$specifics['shop_id'], 'type' => 'default_amazon_product_match']); } unset($preparedReport['report_content']); } // $this->di->getLog()->logContent('Report Data to be saved = ' . json_encode($preparedReport), 'info', 'report_data.log'); return $preparedReport; }*/ public function getRequestedReportIds($shopId) { $reportList = []; $mongo = $this->di->getObjectManager()->create('\App\Core\Models\BaseMongo'); $collection = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::REPORT_CONTAINER); $reportData = $collection->findOne(['user_id' => $this->_user_id, 'ReportProcessingStatus' => ['$in' => ['_SUBMITTED_', '_IN_PROGRESS_']]], ["typeMap" => ['root' => 'array', 'document' => 'array']]); if ($reportData && isset($reportData['shop_id'], $reportData['ReportRequestId'])) { $reportList[$reportData['shop_id']][] = $reportData; } // print '
';
        //        print_r($reportList);
        //        die();
        //        $reportData = $reportData->toArray();
        //        if ($reportData && count($reportData)) {
        //            foreach ($reportData as $key => $value) {
        //                $reportList[$value['shop_id']][] = $value;
        //            }
        //        }

        return $reportList;
    }

    public function requestReport()
    {
        $reportGenerated = 0;
        $shops = $this->di->getObjectManager()->get('\App\Amazon\Components\Common\Helper')->getAllAmazonShops($this->_user_id);
        foreach ($shops as $shop) {
            if (isset($shop['warehouses'][0]['status']) && $shop['warehouses'][0]['status'] == 'active') {

                $queueData = [
                    'user_id' => $this->_user_id,
                    'message' => 'Product Match from Amazon in progress',
                    'type' => 'amazon_product_match',
                    'progress' => 0.00,
                    'shop_id' => (string)$shop['_id'],
                    'created_at' => date('c'),
                ];

                $queuedTask = new \App\Connector\Models\QueuedTasks;
                $queuedTaskId = $queuedTask->setQueuedTask($this->_user_id, $queueData);


                if (!$queuedTaskId) {
                    return ['success' => false, 'message' => 'Product match from Amazon process is already under progress. Please check notification for updates.'];
                }


                $params = ['shop_id' => $shop['remote_shop_id'], 'type' => '_GET_MERCHANT_LISTINGS_ALL_DATA_', 'home_shop_id' => $shop['_id']];

                $commonHelper = $this->di->getObjectManager()
                    ->get(Helper::class);
                $response = $commonHelper->sendRequestToAmazon('report-request', $params, 'GET');
                if (isset($response['success']) && $response['success'] && isset($response['response'])) {
                    $response['queued_task_id'] = $queuedTaskId;
                    $createReport = $this->saveReport(json_encode($response));
                    $reportGenerated = $reportGenerated + 1;
                } else {
                    //removing notification
                    $mongo = $this->di->getObjectManager()->create('\App\Core\Models\BaseMongo');
                    $queuedTasks = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::QUEUED_TASKS);
                    $queuedTasks->deleteOne(['user_id' => $this->_user_id, 'shop_id' => (string)$shop['_id'], 'type' => 'default_amazon_product_match']);
                }
            }
        }
        if ($reportGenerated > 0) {
            $response = ['success' => true, 'message' => 'Match initiated. If matched, status of main product will be visible in the listing grid. This may take approx. 20 min.'];
        } else {
            $response = ['success' => false, 'message' => 'No report requested, please check amazon account status.'];
        }
        return $response;
    }

    public function getReport()
    {
        try {
            $this->init();
            $reportRequests = $this->getRequestedReportIds($this->_user_id);
            if (!empty($reportRequests)) {
                foreach ($reportRequests as $homeShopId => $requests) {
                    $remoteShop = $this->_user_details->getShop($homeShopId, $this->_user_id);
                    $params = ['shop_id' => $remoteShop['remote_shop_id'], 'home_shop_id' => $homeShopId, 'requests' => $requests];
                    $commonHelper = $this->di->getObjectManager()
                        ->get(Helper::class);
                    $response = $commonHelper->sendRequestToAmazon('report-fetch', $params, 'GET');
                    if (isset($response['success']) && $response['success'] && isset($response['response'])) {

                        //                        //removing notification
                        //                        $mongo = $this->di->getObjectManager()->create('\App\Core\Models\BaseMongo');
                        //                        $queuedTasks = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::QUEUED_TASKS);
                        //                        $queuedTasks->deleteOne(['user_id' => $this->_user_id, 'shop_id' => (string)$homeShopId, 'type' => 'default_amazon_product_match']);
                        if (isset($requests[0]['queued_task_id'])) {
                            $response['queued_task_id'] = $requests[0]['queued_task_id'];
                        }
                        $createReport = $this->saveReport(json_encode($response));
                    }
                }
            }
            $response = ['success' => true, 'message' => 'Report fetched successfully.'];
        } catch (\Exception $e) {
            $response = ['success' => false, 'message' => $e->getMessage()];
        }
        return $response;
    }
    public function processQueue()
    {
        $time = 35;
        $handlerData = [
            'type' => 'full_class',
            'class_name' => '\App\Amazon\Components\Report\Report',
            'method' => 'getReport',
            'queue_name' => $this->di->getObjectManager()->get('\App\Amazon\Components\Cron\Helper')->getReportQueueName(),
            'user_id' => $this->_user_id,
            'DelaySeconds' => $time,
            'run_after' => $time,
            'delay' => $time,
        ];
        $helper = $this->di->getObjectManager()->get('\App\Rmq\Components\Helper');

        $helper->createQueue($handlerData['queue_name'], $handlerData);
    }
    public function match($product, $preparedReport)
    {
        $mongo = $this->di->getObjectManager()->create('\App\Core\Models\BaseMongo');
        $productCollection = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::PRODUCT_CONTAINER);
        $amazonProductCollection = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::AMAZON_PRODUCT_CONTAINER);
        $amazonCollection = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::AMAZON_LISTING);
        $shop = $this->_user_details->getShop($preparedReport['shop_id'], $this->_user_id);
        $seller_id = $shop['warehouses'][0]['seller_id'];
        $shopifyAttribute = 'sku';
        $amazonAttribute = 'seller-sku';

        // $productData = $productCollection->findOne(['user_id' => $this->_user_id, $shopifyAttribute => new \MongoDB\BSON\Regex('^' . preg_quote((string)$product[$amazonAttribute]) . '$', "i")], ["typeMap" => ['root' => 'array', 'document' => 'array']]);
        $productData = $productCollection->findOne(['user_id' => $this->_user_id, 'low_sku' => strtolower($product[$amazonAttribute])], ["typeMap" => ['root' => 'array', 'document' => 'array']]);
        if ($productData) {
            $saveArray = [];
            $amazonData = [];
            $amazonCollection->updateOne(['_id' => $product['_id']], ['$set' => ['matched' => true]]);
            if (isset($productData['marketplace']['amazon']) && is_array($productData['marketplace']['amazon'])) {
                foreach ($productData['marketplace']['amazon'] as $key => $amazonShops) {
                    if (isset($amazonShops['shop_id']) && $amazonShops['shop_id'] == $preparedReport['shop_id']) {
                        $saveArray = $amazonShops;
                        $saveArray['status'] = $product['status'];
                        $saveArray['seller_id'] = $seller_id;
                        // $amazonData = $productData['marketplace']['amazon'];

                        if (!isset($amazonShops['status']) || $amazonShops['status'] != $product['status'] || !isset($amazonShops['seller_id']) || $amazonShops['seller_id'] != $seller_id) {
                            $query = ['_id'  => $productData['_id'], 'marketplace.amazon.shop_id' => (string)$amazonShops['shop_id']];
                            $productCollection->updateOne($query, ['$set' => ['marketplace.amazon.$.status' => $product['status'], 'marketplace.amazon.$.seller_id' => $seller_id]]);

                            // $productCollection->updateOne([$shopifyAttribute => new \MongoDB\BSON\Regex('^'.preg_quote((string)$product[$amazonAttribute]).'$',"i"), 'marketplace.amazon.shop_id' => (string)$amazonShops['shop_id'], 'user_id' => $this->_user_id],
                            //     ['$set' => ['marketplace.amazon.$.status' => $product['status'], 'marketplace.amazon.$.seller_id' => $seller_id]]);
                        }
                        break;
                    }
                }

                if (empty($saveArray)) {
                    $saveArray['shop_id'] = (string)$preparedReport['shop_id'];
                    $saveArray['status'] = $product['status'];
                    $saveArray['seller_id'] = $seller_id;
                    //  $amazonData['marketplace']['amazon'][] = $saveArray

                    $query = ['_id'  => $productData['_id']];
                    $productCollection->updateOne($query, ['$push' => ['marketplace.amazon' => $saveArray]]);
                    // $productCollection->updateOne([$shopifyAttribute => new \MongoDB\BSON\Regex('^'.preg_quote((string)$product[$amazonAttribute]).'$',"i"), 'user_id' => $this->_user_id], ['$push' => ['marketplace.amazon' => $saveArray]]);
                }
            }

            if (empty($saveArray)) {
                $saveArray['shop_id'] = (string)$preparedReport['shop_id'];
                $saveArray['status'] = $product['status'];
                $saveArray['seller_id'] = $seller_id;
                $amazonData['marketplace']['amazon'][] = $saveArray;

                $query = ['_id'  => $productData['_id']];
                $productCollection->updateOne($query, ['$set' => $amazonData]);
                // $productCollection->updateOne([$shopifyAttribute => new \MongoDB\BSON\Regex('^'.preg_quote((string)$product[$amazonAttribute]).'$',"i"), 'user_id' => $this->_user_id], ['$set' => $amazonData]);
            }

            // $amazonData['marketplace']['amazon'][$preparedReport['shop_id']]['shop_id'] = $preparedReport['shop_id'];
            // $amazonData['marketplace']['amazon'][$preparedReport['shop_id']]['status'] = $product['status'];
            // $amazonData['marketplace']['amazon'][$preparedReport['shop_id']]['asin'] = $product['asin1'];
            // $amazonData['marketplace']['amazon'][$preparedReport['shop_id']]['seller_id'] = $seller_id;

            // $productCollection->updateOne([$shopifyAttribute => $product[$amazonAttribute]], ['$set' => $amazonData]);


            $sourceProductId = $productData['source_product_id'];
            $amazonProduct =  $amazonProductCollection->findOne(['user_id' => $this->_user_id, 'source_product_id' => $sourceProductId]);
            if ($amazonProduct) {
                if (!isset($amazonProduct['asin']) || $amazonProduct['asin'] != $product['asin1']) {
                    $query = ['_id'  => new \MongoDB\BSON\ObjectId($amazonProduct['_id'])];
                }
            } else {
                $insertData = ['source_product_id' => (string)$sourceProductId, 'container_id' => (string)$productData['container_id'], 'user_id' => $this->_user_id, 'asin' => $product['asin1']];
                if (isset($productData['group_id'])) {
                    $insertData['group_id'] = (string)$productData['group_id'];
                }

                $amazonProductCollection->insert($insertData);
            }

            if (isset($productData['group_id']) && $productData['group_id']) {
                $amazonData['shop_id'] = $preparedReport['shop_id'];
                // $this->matchParent($productData, $amazonData);
            }
            $sourceVariantId = $productData['source_product_id'];
            $sourceProductId = $productData['container_id'];
            $product['source_variant_id'] = $sourceVariantId;
            $product['source_product_id'] = $sourceProductId;
        } else {
            // $amazonProductData = $amazonProductCollection->findOne(['user_id' => $this->_user_id, $shopifyAttribute => new \MongoDB\BSON\Regex('^' . preg_quote((string)$product[$amazonAttribute]) . '$', "i")], ["typeMap" => ['root' => 'array', 'document' => 'array']]);
            $amazonProductData = $amazonProductCollection->findOne(['user_id' => $this->_user_id, $shopifyAttribute => (string)$product[$amazonAttribute]], ["typeMap" => ['root' => 'array', 'document' => 'array']]);

            //            if (!$amazonProductData) {
            //                $amazonProductData = $amazonProductCollection->findOne(['user_id' => $this->_user_id, 'parent_sku' => new \MongoDB\BSON\Regex('^'.preg_quote((string)$product[$amazonAttribute]).'$',"i")], ["typeMap" => ['root' => 'array', 'document' => 'array']]);
            //            }


            if ($amazonProductData && isset($amazonProductData['source_product_id'])) {
                $amazonCollection->updateOne(['_id' => $product['_id']], ['$set' => ['matched' => true]]);
                $productData = $productCollection->findOne(['user_id' => $this->_user_id, 'source_product_id' => $amazonProductData['source_product_id']], ["typeMap" => ['root' => 'array', 'document' => 'array']]);

                if ($productData) {
                    $saveArray = [];
                    $amazonData = [];

                    if (isset($productData['marketplace']['amazon']) && is_array($productData['marketplace']['amazon'])) {
                        foreach ($productData['marketplace']['amazon'] as $amazonShops) {
                            if (isset($amazonShops['shop_id']) && $amazonShops['shop_id'] == $preparedReport['shop_id']) {
                                $saveArray = $amazonShops;
                                $saveArray['status'] = $product['status'];
                                $saveArray['seller_id'] = $seller_id;

                                if (!isset($amazonShops['status']) || $amazonShops['status'] != $product['status'] || !isset($amazonShops['seller_id']) || $amazonShops['seller_id'] != $seller_id) {
                                    $query = ['_id'  => $productData['_id'], 'marketplace.amazon.shop_id' => (string)$amazonShops['shop_id']];
                                    $productCollection->updateOne($query, ['$set' => ['marketplace.amazon.$.status' => $product['status'], 'marketplace.amazon.$.seller_id' => $seller_id]]);

                                    // $productCollection->updateOne(['source_product_id' => $amazonProductData['source_product_id'], 'marketplace.amazon.shop_id' => (string)$amazonShops['shop_id'], 'user_id' => $this->_user_id],
                                    //     ['$set' => ['marketplace.amazon.$.status' => $product['status'], 'marketplace.amazon.$.seller_id' => $seller_id]]);
                                }
                                break;
                            }
                        }

                        if (empty($saveArray)) {
                            $saveArray['shop_id'] = (string)$preparedReport['shop_id'];
                            $saveArray['status'] = $product['status'];
                            $saveArray['seller_id'] = $seller_id;
                            //  $amazonData['marketplace']['amazon'][] = $saveArray

                            $query = ['_id'  => $productData['_id']];
                            $productCollection->updateOne($query, ['$push' => ['marketplace.amazon' => $saveArray]]);
                            // $productCollection->updateOne(['source_product_id' => $amazonProductData['source_product_id'], 'user_id' => $this->_user_id], ['$push' => ['marketplace.amazon' => $saveArray]]);
                        }
                    }

                    if (empty($saveArray)) {
                        $saveArray['shop_id'] = (string)$preparedReport['shop_id'];
                        $saveArray['status'] = $product['status'];
                        $saveArray['seller_id'] = $seller_id;
                        $amazonData['marketplace']['amazon'][] = $saveArray;

                        $query = ['_id'  => $productData['_id']];
                        $productCollection->updateOne($query, ['$set' => $amazonData]);
                        // $productCollection->updateOne(['source_product_id' => $amazonProductData['source_product_id'], 'user_id' => $this->_user_id], ['$set' => $amazonData]);
                    }

                    // $amazonData['marketplace']['amazon'][$preparedReport['shop_id']]['shop_id'] = $preparedReport['shop_id'];
                    // $amazonData['marketplace']['amazon'][$preparedReport['shop_id']]['status'] = $product['status'];
                    // $amazonData['marketplace']['amazon'][$preparedReport['shop_id']]['asin'] = $product['asin1'];
                    // $amazonData['marketplace']['amazon'][$preparedReport['shop_id']]['seller_id'] = $seller_id;
                    // $productCollection->updateOne(['source_product_id' => $amazonProductData['source_product_id'], 'user_id' => $this->_user_id], ['$set' => $amazonData]);

                    if (!isset($amazonProductData['asin']) || $amazonProductData['asin'] != $product['asin1']) {
                        $query = ['_id'  => new \MongoDB\BSON\ObjectId($amazonProductData['_id'])];
                        $amazonProductCollection->updateOne($query, ['$set' => ['asin' => $product['asin1']]]);
                        // $amazonProductCollection->updateOne(['source_product_id' => $amazonProductData['source_product_id'], 'user_id' => $this->_user_id], ['$set' => ['asin' => $product['asin1']]]);
                    }

                    if (isset($productData['group_id']) && $productData['group_id']) {
                        $amazonData['shop_id'] = $preparedReport['shop_id'];
                        // $this->matchParent($productData, $amazonData);
                    }
                    $sourceVariantId = $productData['source_product_id'];
                    $sourceProductId = $productData['container_id'];
                    $product['source_variant_id'] = $sourceVariantId;
                    $product['source_product_id'] = $sourceProductId;
                }
            } else {
                $amazonCollection->updateOne(['_id' => $product['_id']], ['$set' => ['matched' => false]]);
            }
        }
        return $product;
    }

    public function matchParent($productData, $amazonData)
    {
        $mongo = $this->di->getObjectManager()->create('\App\Core\Models\BaseMongo');
        $homeShopId = $amazonData['shop_id'];
        $shop = $this->_user_details->getShop($homeShopId, $this->_user_id);
        $remoteShopId = $shop['remote_shop_id'];
        $asin = $amazonData['marketplace']['amazon'][$homeShopId]['asin'];
        $specifics['id'] = [$asin];
        $specifics['shop_id'] = $remoteShopId;
        $specifics['home_shop_id'] = $homeShopId;
        $commonHelper = $this->di->getObjectManager()->get(Helper::class);
        //get Parent Asin from Amazon
        $response = $commonHelper->sendRequestToAmazon('product-relationship', $specifics, 'GET');
        if (isset($response['success']) && $response['success']) {
            if (isset($response['response']) && is_array($response['response'])) {
                foreach ($response['response'] as $barcode => $asin) {
                    $amazonListing = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::AMAZON_LISTING);
                    // search asin and seller-sku from amazon_listing
                    $amazonReportProduct = $amazonListing->findOne(['user_id' => $this->_user_id, 'shop_id' => $homeShopId, 'asin1' => $asin]);
                    if ($amazonReportProduct) {
                        $sellerSku = $amazonReportProduct['seller-sku'];
                        $status = $amazonReportProduct['status'];
                        $productCollection = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::PRODUCT_CONTAINER);
                        $shop = $this->_user_details->getShop($homeShopId, $this->_user_id);
                        $seller_id = $shop['warehouses'][0]['seller_id'];
                        $parentProduct = $productCollection->findOne(['source_product_id' => $productData['group_id']]);
                        if ($parentProduct) {
                            // save asin, status in product_container
                            //                            $amazonData['marketplace']['amazon'][$homeShopId]['shop_id'] = $homeShopId;
                            //                            $amazonData['marketplace']['amazon'][$homeShopId]['status'] = $status;
                            //                            $amazonData['marketplace']['amazon'][$homeShopId]['asin'] = $asin;
                            //                            $amazonData['marketplace']['amazon'][$homeShopId]['seller_id'] = $seller_id;
                            //                            $productCollection->updateOne(['source_product_id' => $productData['group_id']], ['$set' => $amazonData]);

                            $saveArray = [];
                            $amazonData = [];
                            if (isset($productData['marketplace']['amazon']) && is_array($productData['marketplace']['amazon'])) {
                                foreach ($productData['marketplace']['amazon'] as $amazonShops) {
                                    if (isset($amazonShops['shop_id']) && $amazonShops['shop_id'] == $homeShopId) {
                                        $saveArray = $amazonShops;
                                        $saveArray['status'] = $status;
                                        $saveArray['seller_id'] = $seller_id;
                                        $productCollection->updateOne(['source_product_id' => $productData['group_id']], ['$push' => ['marketplace' => ['amazon' => $saveArray]]]);
                                        break;
                                    } else {
                                        $saveArray['shop_id'] = $homeShopId;
                                        $saveArray['status'] = $status;
                                        $saveArray['seller_id'] = $seller_id;
                                        $productCollection->updateOne(['source_product_id' => $productData['group_id']], ['$push' => ['marketplace' => ['amazon' => $saveArray]]]);
                                        break;
                                    }
                                }
                            }

                            if (empty($saveArray)) {
                                $saveArray['shop_id'] = $homeShopId;
                                $saveArray['status'] = $status;
                                $saveArray['seller_id'] = $seller_id;
                                $amazonData['marketplace']['amazon'][] = $saveArray;
                                $productCollection->updateOne(['source_product_id' => $productData['group_id']], ['$set' => $amazonData]);
                            }

                            $amazonProductContainer = $mongo->getCollectionForTable(\App\Amazon\Components\Common\Helper::AMAZON_PRODUCT_CONTAINER);
                            // search that parent product in amazon_product
                            $amazonProduct = $amazonProductContainer->findOne(['source_product_id' => $productData['group_id'], 'user_id' => $this->_user_id]);
                            $amazonSku['parent_sku'] = $sellerSku;
                            if ($amazonProduct) {
                                // update amazon sku in amazon_product
                                $amazonProductContainer->UpdateOne(['source_product_id' => $productData['group_id'], 'user_id' => $this->_user_id], ['$set' => $amazonSku]);
                            } else {
                                // save parent product and its amazon sku in amazon_product
                                //  $amazonSku['_id'] = $this->_baseMongo->getCounter('amazon_product_id', $this->_user_id);
                                $amazonSku['source_product_id'] = $productData['group_id'];
                                $amazonSku['user_id'] = $this->_user_id;
                                $amazonProductContainer->insertOne($amazonSku);
                            }
                        }
                    }
                }
            }
        }
    }
}