diff --git a/src/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTO.php b/src/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTO.php index 50b7f4cf..47d8ac69 100644 --- a/src/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTO.php +++ b/src/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTO.php @@ -22,24 +22,41 @@ declare(strict_types=1); namespace App\Services\InfoProviderSystem\DTOs; +use App\Services\InfoProviderSystem\Providers\InfoProviderInterface; + /** * Represents a mapping between a part field and the info providers that should search in that field. */ readonly class BulkSearchFieldMappingDTO { + /** @var string[] $providers Array of provider keys to search with (e.g., ['digikey', 'farnell']) */ + public array $providers; + /** * @param string $field The field to search in (e.g., 'mpn', 'name', or supplier-specific fields like 'digikey_spn') - * @param string[] $providers Array of provider keys to search with (e.g., ['digikey', 'farnell']) + * @param string[]|InfoProviderInterface[] $providers Array of provider keys to search with (e.g., ['digikey', 'farnell']) * @param int $priority Priority for this field mapping (1-10, lower numbers = higher priority) */ public function __construct( public string $field, - public array $providers, + array $providers = [], public int $priority = 1 ) { if ($priority < 1 || $priority > 10) { throw new \InvalidArgumentException('Priority must be between 1 and 10'); } + + //Ensure that providers are provided as keys + foreach ($providers as &$provider) { + if ($provider instanceof InfoProviderInterface) { + $provider = $provider->getProviderKey(); + } + if (!is_string($provider)) { + throw new \InvalidArgumentException('Providers must be provided as strings or InfoProviderInterface instances'); + } + } + unset($provider); + $this->providers = $providers; } /** diff --git a/src/Settings/MiscSettings/IpnSuggestSettings.php b/src/Settings/MiscSettings/IpnSuggestSettings.php index 16face21..2c2cb21a 100644 --- a/src/Settings/MiscSettings/IpnSuggestSettings.php +++ b/src/Settings/MiscSettings/IpnSuggestSettings.php @@ -35,7 +35,7 @@ use Symfony\Component\Translation\TranslatableMessage as TM; use Symfony\Component\Validator\Constraints as Assert; #[Settings(label: new TM("settings.misc.ipn_suggest"))] -#[SettingsIcon("fa-list")] +#[SettingsIcon("fa-arrow-up-1-9")] class IpnSuggestSettings { use SettingsTrait; @@ -91,14 +91,14 @@ class IpnSuggestSettings description: new TM("settings.misc.ipn_suggest.numberSeparator.help"), options: ['type' => StringType::class], )] - public ?string $numberSeparator = '-'; + public string $numberSeparator = '-'; #[SettingsParameter( label: new TM("settings.misc.ipn_suggest.categorySeparator"), description: new TM("settings.misc.ipn_suggest.categorySeparator.help"), options: ['type' => StringType::class], )] - public ?string $categorySeparator = '-'; + public string $categorySeparator = '-'; #[SettingsParameter( label: new TM("settings.misc.ipn_suggest.globalPrefix"), diff --git a/tests/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTOTest.php b/tests/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTOTest.php index a2101938..e300e2bf 100644 --- a/tests/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTOTest.php +++ b/tests/Services/InfoProviderSystem/DTOs/BulkSearchFieldMappingDTOTest.php @@ -26,6 +26,15 @@ use PHPUnit\Framework\TestCase; class BulkSearchFieldMappingDTOTest extends TestCase { + public function testProviderInstanceNormalization(): void + { + $mockProvider = $this->createMock(\App\Services\InfoProviderSystem\Providers\InfoProviderInterface::class); + $mockProvider->method('getProviderKey')->willReturn('mock_provider'); + + $fieldMapping = new BulkSearchFieldMappingDTO(field: 'mpn', providers: ['provider1', $mockProvider], priority: 5); + $this->assertSame(['provider1', 'mock_provider'], $fieldMapping->providers); + } + public function testIsSupplierPartNumberField(): void { $fieldMapping = new BulkSearchFieldMappingDTO(field: 'reichelt_spn', providers: ['provider1'], priority: 1); diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 5b7749e1..d6092f03 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -14484,5 +14484,53 @@ Please note that this system is currently experimental, and the synonyms defined The global IPN prefix, common across all parts + + + settings.misc.ipn_suggest.fallbackPrefix + Fallback prefix + + + + + settings.misc.ipn_suggest.fallbackPrefix.help + The IPN prefix that should be used, if a category has no prefix defined. + + + + + settings.misc.ipn_suggest.numberSeparator + Number separator + + + + + settings.misc.ipn_suggest.numberSeparator.help + The separator character used to separate the IPN number from the prefix. + + + + + settings.misc.ipn_suggest.categorySeparator + Category separator + + + + + settings.misc.ipn_suggest.categorySeparator.help + The separator character used to separate different levels of category prefixes. + + + + + settings.misc.ipn_suggest.globalPrefix + Global prefix + + + + + settings.misc.ipn_suggest.globalPrefix.help + If enabled, an option for to generate IPN with this global prefix, shared across parts in all categories. + +