Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/job-board.corals.io/Corals/modules/Amazon/Console/Commands/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/job-board.corals.io/Corals/modules/Amazon/Console/Commands/RunImports.php
<?php namespace Corals\Modules\Amazon\Console\Commands;


use Corals\Modules\Amazon\Models\Import;
use Corals\Modules\Marketplace\Models\Store;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Config;

class RunImports extends Command
{
    protected $signature = 'import:run';
    protected $description = 'Execute Pending Imports to import products';

    public function handle()
    {
        return $this->processImports();
    }


    public function processImports()
    {

        $running_import = Import::where('status', 'in_progress')->first();
        if ($running_import) {
            $this->info("There is already running import process ");
            return false;
        }

        $import = Import::pending()->orderBy('created_at', 'asc')->first();
        if (!$import) {
            $this->info("There is no Pending imports");
            return true;
        }


        try {
            $this->info("Running Import: " . $import->title);

            $categories = \ImportCategory::whereNotNull('external_id')->pluck('id', 'external_id')->toArray();
            $brands = \ImportBrand::all()->pluck('id', 'name')->toArray();
            $tags = \ImportTag::all()->pluck('id', 'name')->toArray();

            //$import->status = 'in_progress';
            $import->notes = '';
            $import->save();

            if ($import->keywords) {
                $keywords = implode(', ', $import->keywords);

            } else {
                $keywords = "";
            }

            $associate_tag = "";
            if ($import->store_id) {
                $store = Store::find($import->store_id);

                $config = [
                    'api_key' => $store->getSettingValue('amazon_api_access_key', ''),
                    'api_secret_key' => $store->getSettingValue('amazon_api_access_secret', ''),
                    'host' => 'webservices.amazon.' . $store->getSettingValue('amazon_api_country', 'com'),
                    'region' => $store->getSettingValue('amazon_api_region', '')
                ];
                $associate_tag = $store->getSettingValue('amazon_api_associate_tag', '');


            } else {
                $config = [
                    'api_key' => \Settings::get('amazon_api_access_key', ''),
                    'api_secret_key' => \Settings::get('amazon_api_access_secret', ''),
                    'associate_tag' => \Settings::get('amazon_api_associate_tag', ''),
                    'host' => 'webservices.amazon.' . \Settings::get('amazon_api_country', 'com'),
                    'region' => \Settings::get('amazon_api_region', '')
                ];
                $associate_tag = \Settings::get('amazon_api_associate_tag', '');
            }

            \AmazonProduct::reconfig($config);

            Config::set('amazon-product.associate_tag', $associate_tag);
            $scan_pages = $import->max_result_pages ?? 1000;


            if ($import->categories->count() > 0) {

                foreach ($import->categories as $import_category) {

                    for ($i = 1; $i <= $scan_pages; $i++) {

                        $response = \AmazonProduct::search($import_category->name, $keywords, $i);
                        $this->parseResponse($response, $categories, $tags, $import, $brands);

                    }
                }
            } else {

                for ($i = 1; $i <= $scan_pages; $i++) {
                    $response = \AmazonProduct::search('All', $keywords, $i);
                    $this->parseResponse($response, $categories, $tags, $import, $brands);
                }
            }
            $this->info("Finishing Import: " . $import->title);

            $import->status = 'completed';
            $import->save();
        } catch (\Exception $exception) {
            $errors = [];

            if (!empty($errors)) {
                $error = implode("\n", $errors);
            } else {
                $error = $exception->getMessage();
            }
            dd($exception);

            $this->error("Error while importing : " . $error);
            $import->notes = $exception->getMessage();
            //$import->status = 'failed';
            $import->save();
            log_exception($exception, Import::class, 'import');

        }

    }

    function parseResponse($response, $categories, $tags, $import, $brands)
    {

        foreach ($response['SearchResult']['Items'] as $item) {
            $title = $item['ItemInfo']['Title']['DisplayValue'];

            if (isset($item['ItemInfo']['ByLineInfo']) && isset($item['ItemInfo']['ByLineInfo']['Brand'])) {
                $brand = $item['ItemInfo']['ByLineInfo']['Brand']['DisplayValue'];;

            } else {
                $brand = "";
            }
            $asin = $item['ASIN'];

            $features = [];
            if (isset($item['ItemInfo']['Features'])) {
                foreach ($item['ItemInfo']['Features']['DisplayValues'] as $key => $feature) {
                    array_push($features, $feature);
                }
            }
            if (isset($item['Offers'])) {
                $price = $item['Offers']['Listings'][0]['Price']['Amount'];
            } else {
                $price = 0.0;
            }
            $max_images = $import->image_count ? $import->image_count : 1000;
            $image_urls = $this->getItemImages($item, $max_images);
            $amazonUrl = $item['DetailPageURL'];
            $product = [
                'title' => $title,
                'asin' => $asin,
                'features' => $features,
                'price' => $price,
                'amazon_url' => $amazonUrl,
                'image_urls' => $image_urls,
                'brand' => $brand
            ];
            if ($import->store_id) {
                $product['store_id'] = $import->store_id;
            }


            $sku_exists = \ImportSKU::where('code', $product['asin'])->first();
            if ($sku_exists) {
                $import_product = $sku_exists->product;
            } else {
                $import_product = new \ImportProduct();
            }

            if ($product['brand']) {
                list($brand_id, $brands) = $this->createMissingBrand($product['brand'], $brands);

            }

            $import_product->name = $product['title'];
            $import_product->type = 'simple';
            $import_product->description = '<br>' . implode(', ', $product['features']);
            $import_product->name = $product['title'];
            $import_product->status = 'active';

            $import_product->save();


            $import_product->brand_id = $brand_id;
            $import_product->external_url = $product['amazon_url'];
            $import_product->save();

            $import_product->clearMediaCollection('ecommerce-product-gallery');

            $sku_data = ['regular_price' => $product['price'], 'code' => $product['asin'], 'inventory' => 'infinite'];

            \ImportSKU::where('code', $product['asin'])->delete();
            $sku = $import_product->sku()->create($sku_data);

            $first = true;
            $sku_image_url = "";
            foreach ($product['image_urls'] as $image_url) {
                if ($first) {
                    $import_product->addMediaFromUrl($image_url)->withCustomProperties(['root' => 'amazon_media_import', 'featured' => true])->toMediaCollection('ecommerce-product-gallery');
                    $sku_image_url = $image_url;
                } else {
                    $import_product->addMediaFromUrl($image_url)->withCustomProperties(['root' => 'amazon_media_import'])->toMediaCollection('ecommerce-product-gallery');

                }
                $first = false;

            }
            if ($sku_image_url) {
                //$import_product->copyFirstMediatoSKU($sku);
                $sku->addMediaFromUrl($sku_image_url)->withCustomProperties(['root' => 'amazon_media_import'])->toMediaCollection('ecommerce-sku-image');
            }


            $import->products()->sync($import_product, false);

            $item_categories = $this->getItemCategories($item);
            if ($item_categories) {
                list($categories, $product_categories) = $this->createMissingCategories($categories, [array_pop($item_categories)]);
                $import_product->categories()->sync($product_categories, []);
            }


        }
        return [$categories, $brands, $tags];
    }

    function getItemImages($item, $image_count)
    {
        $imageUrls = [];
        if ($item['Images']['Primary']) {
            $imageUrls[] = $item['Images']['Primary']['Large']['URL'];
            if (count($imageUrls) >= $image_count) {
                return $imageUrls;
            }

        }
        if (isset($item['Images']['Variants'])) {
            foreach ($item['Images']['Variants'] as $image) {
                $imageUrls[] = $image['Large']['URL'];
                if (count($imageUrls) >= $image_count) {
                    return $imageUrls;
                }
            }
        }
        return $imageUrls;
    }


    function createMissingCategories($categories, $item_categories)
    {
        $product_categories = [];
        foreach ($item_categories as $item_category) {
            if (!array_key_exists($item_category['id'], $categories) && !in_array($item_category['name'], $categories)) {
                $category = new \ImportCategory();
                $category->external_id = $item_category['id'];
                $category->name = $item_category['name'];
                $category->is_featured = false;
                $category->slug = \Str::slug($item_category['name']);
                $category->save();
                $categories[$item_category['id']] = $category->id;
                $product_categories[] = $category->id;
            } else {
                if (array_key_exists($item_category['id'], $categories)) {
                    $product_categories[] = $categories[$item_category['id']];
                } else {
                    $product_categories[] = array_search($item_category['name'], $categories);

                }

            }
        }

        return [$categories, $product_categories];
    }


    function createMissingBrand($brand_name, $brands)
    {

        if (!array_key_exists($brand_name, $brands)) {
            $brand = new \ImportBrand();
            $brand->name = $brand_name;
            $brand->slug = \Str::slug($brand_name);
            $brand->save();
            $brands[$brand_name] = $brand->id;
            return [$brand->id, $brands];
        } else {
            return [$brands[$brand_name], $brands];

        }


    }


    function getItemCategories($item)
    {
        $categories = [];
        if ($item['BrowseNodeInfo']) {
            foreach ($item['BrowseNodeInfo']['BrowseNodes'] as $node) {

                $categories[] = ['name' => $node['Ancestor']['Ancestor']['DisplayName'], 'id' => $node['Ancestor']['Ancestor']['Id']];

            };


        }

        return $categories;
    }


}

Spamworldpro Mini