HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/shop.komma.nl/app/Products/Product/Transfer/ProductCsvImportService.php
<?php


namespace App\Products\Product\Transfer;


use Komma\KMS\Core\AbstractTranslatableModel;
use Komma\KMS\Core\AbstractTranslationModel;
use Komma\KMS\Transfer\AbstractCsvImportService;
use Komma\KMS\Transfer\ColumnMap;
use Komma\KMS\Globalization\Languages\Models\Language;
use App\Discounts\DiscountServiceInterface;
use App\Products\Product\Product;
use App\Products\Product\ProductModelService;
use App\Products\Product\ProductTranslation;

class ProductCsvImportService extends AbstractCsvImportService
{
    use ProductColumnMapsTrait;

    /** @var ProductModelService $productService */
    private $productService;

    /** @var DiscountServiceInterface $discountService */
    private $discountService;


    public function __construct(ProductModelService $productService, DiscountServiceInterface $discountService)
    {
        $this->productService = $productService;
        $this->discountService = $discountService;
    }

    /**
     * Imports the row into the database
     *i
     * @param array $row
     * @param int $lineNumber
     * @return string A success or fail message
     */
    public function import(array $row, int $lineNumber): string
    {
        $columnMaps = $this->getColumnMaps();

        $languages = Language::whereIn('iso_2', ['nl', 'en', 'de'])->get();

        //Get the model FQCN and retrieve or create a new non-saved model
        $modelFQCN = Product::class;

        $productDataColumnMaps = $columnMaps['productData']; /** @var ColumnMap $productDataColumnMaps */

        $idColumnMap = null;
        foreach($productDataColumnMaps as $columnMap) { /** @var ColumnMap $columnMap */
            if($columnMap->getModelAttributeName() == 'stock_keeping_unit') $idColumnMap = $columnMap;
        }
        $model = $modelFQCN::firstOrNew([['stock_keeping_unit', '=', $row[$idColumnMap->getColumnNumber()]]]); /** @var AbstractTranslatableModel $model */
        $exists = $model->exists;

        /** @var ColumnMap $columnMap */
        foreach($productDataColumnMaps as $columnMap) {
            $value = $row[$columnMap->getColumnNumber()];
            $attributeName = $columnMap->getModelAttributeName();

            if($columnMap->getModelAttributeName() == 'active') $value = (int) $value;

            $model->$attributeName = $value;
        }

        $model->save();

        //Create or get the translations and save them
        $languages->each(function(Language $language) use ($columnMaps, $model, $row) {
            if(!isset($columnMaps['translationData'][$language->iso_2])) throw new \RuntimeException('Please define translation data for the language with iso-2 (iso 639-1) code "'.$language->iso_2.'"');
            $currentTranslationColumnMaps = $columnMaps['translationData'][$language->iso_2];

            /** @var AbstractTranslationModel $translation */
            $translationModelFQCN = ProductTranslation::class;
            $translation = $translationModelFQCN::firstOrNew(['product_id' => $model->id, 'language_id' => $language->id]);

            $translation->language()->associate($language);

            /** @var ColumnMap $columnMap */
            foreach($currentTranslationColumnMaps as $columnMap)
            {
                $attributeName = $columnMap->getModelAttributeName();
                $translation->$attributeName = $row[$columnMap->getColumnNumber()];
            }

            if(!$translation->isEmpty()) $model->translations()->save($translation);
        });

        //Process discounts
        /** @var ColumnMap $discountColumnMap */
        $discountColumnMap = $columnMaps['discountData'];
        $discountValue = explode('/' , $row[$discountColumnMap->getColumnNumber()]);

        if(count($discountValue) == 2) {
            $quantity = $discountValue[0];
            $absoluteDiscountValue = $discountValue[1];
            $this->discountService->manageQuantityDiscountForASpecificProductable($model, $quantity, $absoluteDiscountValue);
        }

        //Return ok message string
        return __('kms/transfer.import_row_ok', [
            'sign' => ($exists) ? __('kms/transfer.updated_sign') : __('kms/transfer.imported_sign'),
            'row_number' => $lineNumber,
            'sku' => $row[$idColumnMap->getColumnNumber()],
            'imported_or_updated' => ($exists) ? __('kms/transfer.updated') : __('kms/transfer.imported'),
        ]);
    }
}