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.
+
+