87 lines
2.0 KiB
PHP
87 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Import;
|
|
|
|
use App\Models\ImportEntity;
|
|
use App\Services\Import\Contracts\EntityHandlerInterface;
|
|
use Illuminate\Support\Facades\Validator;
|
|
|
|
abstract class BaseEntityHandler implements EntityHandlerInterface
|
|
{
|
|
protected ?ImportEntity $entityConfig;
|
|
|
|
public function __construct(?ImportEntity $entityConfig = null)
|
|
{
|
|
$this->entityConfig = $entityConfig;
|
|
}
|
|
|
|
/**
|
|
* Validate mapped data using configuration rules.
|
|
*/
|
|
public function validate(array $mapped): array
|
|
{
|
|
$rules = $this->entityConfig?->validation_rules ?? [];
|
|
|
|
if (empty($rules)) {
|
|
return ['valid' => true, 'errors' => []];
|
|
}
|
|
|
|
$validator = Validator::make($mapped, $rules);
|
|
|
|
if ($validator->fails()) {
|
|
return [
|
|
'valid' => false,
|
|
'errors' => $validator->errors()->all(),
|
|
];
|
|
}
|
|
|
|
return ['valid' => true, 'errors' => []];
|
|
}
|
|
|
|
/**
|
|
* Get processing options from config.
|
|
*/
|
|
protected function getOption(string $key, mixed $default = null): mixed
|
|
{
|
|
return $this->entityConfig?->processing_options[$key] ?? $default;
|
|
}
|
|
|
|
/**
|
|
* Determine if a field has changed.
|
|
*/
|
|
protected function hasChanged($model, string $field, mixed $newValue): bool
|
|
{
|
|
$current = $model->{$field};
|
|
|
|
if (is_null($newValue) && is_null($current)) {
|
|
return false;
|
|
}
|
|
|
|
return $current != $newValue;
|
|
}
|
|
|
|
/**
|
|
* Track which fields were applied/changed.
|
|
*/
|
|
protected function trackAppliedFields($model, array $payload): array
|
|
{
|
|
$applied = [];
|
|
|
|
foreach ($payload as $field => $value) {
|
|
if ($this->hasChanged($model, $field, $value)) {
|
|
$applied[] = $field;
|
|
}
|
|
}
|
|
|
|
return $applied;
|
|
}
|
|
|
|
/**
|
|
* Default implementation returns null - override in specific handlers.
|
|
*/
|
|
public function resolve(array $mapped, array $context = []): mixed
|
|
{
|
|
return null;
|
|
}
|
|
}
|