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'),
]);
}
}