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/Ecommerce/Http/Controllers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/job-board.corals.io/Corals/modules/Ecommerce/Http/Controllers/SKUBulkController.php
<?php

namespace Corals\Modules\Ecommerce\Http\Controllers;

use Corals\Foundation\Http\Controllers\BaseController;
use Corals\Modules\Ecommerce\Classes\Ecommerce;
use Corals\Modules\Ecommerce\Http\Requests\SKUBulkRequest;
use Corals\Modules\Ecommerce\Http\Requests\SKURequest;
use Corals\Modules\Ecommerce\Models\Attribute;
use Corals\Modules\Ecommerce\Models\Product;
use Corals\Modules\Ecommerce\Models\SKU;
use Faker\Provider\Uuid;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;

class SKUBulkController extends BaseController
{

    public function __construct()
    {
        $this->resource_url = route(
            config('ecommerce.models.sku.resource_route'),
            ['product' => request()->route('product') ?: '_']
        );

        $this->title = 'Ecommerce::module.sku.title';
        $this->title_singular = 'Ecommerce::module.sku.title_singular';

        parent::__construct();
    }

    protected function setTitle($product)
    {
        $this->setViewSharedData([
            'title' => trans('Ecommerce::labels.sku.index_title', ['name' => $product->name, 'title' => $this->title])
        ]);
    }

    /**
     * @param SKURequest $request
     * @param Product $product
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function getBulkGenerateForm(SKUBulkRequest $request, Product $product)
    {
        $this->setTitle($product);

        return view('Ecommerce::sku.bulk.bulk_form', compact('product'));
    }

    /**
     * @param Request $request
     * @param Product $product
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     * @throws \Illuminate\Auth\Access\AuthorizationException
     * @throws \Illuminate\Validation\ValidationException
     */
    public function generateSKUs(SKUBulkRequest $request, Product $product)
    {
        $this->validate($request, ['options' => 'required']);
        
        $bulkCode = $this->generate($request->all(), $product);

        $generate_option = $request->get('generate_option', 'apply_unique') ?? 'apply_unique';

        if ($generate_option === 'skip') {
            return redirectTo($this->resource_url);
        }

        return redirectTo($this->resource_url . '/bulk-edit?generate_option=' . $generate_option . '&bulk=' . $bulkCode);
    }

    public function getBulkEditForm(Request $request, Product $product)
    {
        $this->setTitle($product);

        $generate_option = $request->get('generate_option', 'apply_unique') ?? 'apply_unique';

        $isFromBulk = !!$request->get('bulk');

        if ($isFromBulk) {
            $skus = $product
                ->sku()
                ->whereRaw("JSON_EXTRACT(ecommerce_sku.properties,'$.bulk_code') = ?", [$request->get('bulk')])
                ->get();
        } else {
            $skus = $product->sku;
        }

        return view('Ecommerce::sku.bulk.bulk_edit', compact('product', 'generate_option', 'skus', 'isFromBulk'));
    }

    /**
     * @param $data
     * @param $product
     * @return string
     */
    protected function generate($data, $product)
    {
        $attributes = Attribute::query()
            ->whereIn('id', array_keys(data_get($data, 'options')))
            ->orderBy('required', 'desc')
            ->get();

        $result = $this->get_all_options_combinations(data_get($data, 'options'));

        $bulkCode = Uuid::uuid();


        foreach ($result as $row) {
            $options = [];
            $skuCode = [$product->product_code];

            foreach ($row as $option) {
                [$optionId, $value] = explode(':', $option);

                $attribute = $attributes->where('id', $optionId)->first();

                switch ($attribute->type) {
                    case 'checkboxes':
                    case 'multi_values':
                        $options[$optionId] = [$value];
                        break;
                    default:
                        $options[$optionId] = $value;
                }

                switch ($attribute->type) {
                    case 'checkboxes':
                    case 'multi_values':
                    case 'select':
                    case 'radio':
                        $attributeOption = $attribute->options()->where('ecommerce_attribute_options.id',
                            $value)->first();

                        $skuCode[] = $attributeOption->option_value;
                        break;
                    default:
                        $skuCode[] = $value;
                }
            }

            $skuCode[] = Str::random(3);

            $data = [
                'code' => strtolower(join('-', $skuCode)),
                'regular_price' => 0,
                'status' => 'inactive',
                'product_id' => $product->id,
                'shipping' => $product->shipping,
                'inventory' => 'bucket',
                'inventory_value' => 'in_stock',
                'properties' => [
                    'bulk_code' => $bulkCode
                ],
                'options' => $options
            ];

            $this->createSKUFromBulk($data);
        }

        return $bulkCode;
    }

    /**
     * @param $arrays
     * @return array|array[]
     */
    protected function get_all_options_combinations($arrays)
    {
        $result = [[]];

        foreach ($arrays as $property => $property_values) {
            $tmp = [];

            foreach ($result as $result_item) {
                foreach (Arr::wrap($property_values) as $property_value) {
                    $tmp[] = array_merge($result_item, [$property . ':' . $property_value]);
                }
            }

            $result = $tmp;
        }

        return $result;
    }

    public function postBulkEdit(SKUBulkRequest $request, Product $product)
    {
        try {
            $skus = $request->get('sku', []) ?? [];

            $generate_option = $request->get('generate_option', 'apply_unique') ?? 'apply_unique';

            if ($generate_option === 'apply_single') {
                $commonData = $request->only(['regular_price', 'sale_price', 'inventory_value', 'inventory', 'status']);
            } else {
                $commonData = [];
            }

            $image = null;

            foreach ($skus as $id => $skuData) {
                $sku = SKU::query()->find($id);

                if (data_get($skuData, 'delete') == 1) {
                    $this->destroySKU($sku);
                    continue;
                }

                $skuData = array_merge($commonData, $skuData);

                if (!$sku) {
                    continue;
                }

                $sku->update(Arr::only($skuData,
                    ['code', 'regular_price', 'sale_price', 'inventory_value', 'inventory', 'shipping', 'status']
                ));

                if ($request->has("sku.$id.clear") || $request->hasFile("sku.$id.image")) {
                    $sku->clearMediaCollection('ecommerce-sku-image');
                }

                if ($request->hasFile("sku.$id.image") && !$request->has("sku.$id.clear")) {
                    $sku->addMedia($request->file("sku.$id.image"))
                        ->withCustomProperties(['root' => 'user_' . user()->hashed_id])
                        ->toMediaCollection('ecommerce-sku-image');
                }

                if ($generate_option === 'apply_single' && $request->hasFile("image")) {
                    $sku->clearMediaCollection('ecommerce-sku-image');

                    if (!$image) {
                        $image = $sku->addMedia($request->file("image"))
                            ->withCustomProperties(['root' => 'user_' . user()->hashed_id])
                            ->toMediaCollection('ecommerce-sku-image');
                    } else {
                        $sku->addMedia($image->getPath(), $image->disk)
                            ->preservingOriginal()
                            ->setName($image->name)
                            ->withCustomProperties($image->custom_properties ?? [])
                            ->toMediaCollection('ecommerce-sku-image');
                    }
                }
            }

            $message = [
                'level' => 'success',
                'message' => trans('Corals::messages.success.updated', ['item' => $this->title]),
                'action' => 'redirectTo',
                'url' => url($this->resource_url)
            ];
        } catch (\Exception $exception) {
            log_exception($exception, SKUBulkController::class, 'postBulkEdit');
            $message = ['level' => 'error', 'message' => $exception->getMessage()];
        }

        return response()->json($message);
    }

    /**
     * @param $sku
     * @throws \Exception
     */
    protected function destroySKU($sku)
    {
        $gateways = \Payments::getAvailableGateways();

        foreach ($gateways as $gateway => $gateway_title) {
            $Ecommerce = new Ecommerce($gateway);
            if (!$Ecommerce->gateway->getConfig('manage_remote_sku')) {
                continue;
            }
            $Ecommerce->deleteSKU($sku);
            $sku->setGatewayStatus($this->gateway->getName(), 'DELETED', null);
        }

        $sku->clearMediaCollection('ecommerce-sku-image');
        $sku->delete();
    }

    /**
     * @param $data
     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model
     */
    public function createSKUFromBulk($data)
    {
        $skuData = Arr::except($data, 'options');

        $sku = SKU::query()->create($skuData);

        $this->createOptions(data_get($data, 'options', []), $sku);

        return $sku;
    }

    /**
     * @param $optionsList
     * @param $sku
     */
    public function createOptions($optionsList, $sku)
    {
        $sku->options()->delete();

        $options = [];

        if (isset($optionsList)) {
            foreach ($optionsList as $key => $value) {
                if (is_array($value)) {
                    foreach ($value as $value_option) {
                        $options[] = [
                            'attribute_id' => $key,
                            'value' => $value_option
                        ];
                    }
                } else {
                    $options[] = [
                        'attribute_id' => $key,
                        'value' => $value
                    ];
                }
            }

            $sku->options()->createMany($options);
        }
    }
}

Spamworldpro Mini