A rendszerben 70 duplikált gyártónév halmozódott fel (146 rekord, 1166-ból), mert a legacy import karakterre pontos egyezést követelt: a "Danone " nem találta meg a meglévő "Danone"-t, és felvett egy újat - a nyers, trimmeletlen Excel-értékkel. Gyártóhoz nincs admin felület, ez az egyetlen keletkezési út. Következménye kettős: az árlista feldolgozó valódi változás nélkül is módosulást jelez (a vizsgált fájlban 126 "Módosult" sorból 103 emiatt), a Termék mennyiség statisztika pedig egy gyártóra szűrve a másik ID alá könyvelt tételeket kihagyja a riportból. - új App\Support\NameNormalizer: a normalizálás egyetlen definíciója. Három független pont használja (legacy import, új feldolgozó, jövőbeli összevonó parancs); ha ezek elcsúsznak, az újra duplikált törzsadatot szül. - PriceListService::getProducerByName(): a karakterre pontos találat továbbra is elsőbbséget élvez, de ha nincs, jön a normalizált egyeztetés. Duplikátum esetén a legrégebbi rekordot adja vissza - a termékek arra mutatnak. - PriceListService::addNewProducer(): trimmel mentés előtt - getProducerLookupMap(): kihagyja az archive/deleted státuszú gyártókat. Enélkül a beolvasztott rekord visszakerülne a feloldásba, és a takarítás hatástalan lenne. Ma nem változtat semmin, csak felkészít. Az új feldolgozó lookupjának tie-breakjéhez SZÁNDÉKOSAN nem nyúltam: egy sorral eltüntetné a hamis "Módosult" jelzéseket, de az a funkcióban fedné el az adathibát. A javulás a tényleges adattakarításból jöjjön. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
45 lines
1.5 KiB
PHP
45 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace App\Support;
|
|
|
|
/**
|
|
* Nevek egységesítése összehasonlításhoz.
|
|
*
|
|
* Egy helyen van definiálva, mert három független ponton kell UGYANAZT a szabályt
|
|
* alkalmazni, és ha ezek elcsúsznak egymástól, az duplikált törzsadatot szül:
|
|
*
|
|
* - a legacy árlista import gyártó-párosítása (`PriceListService`),
|
|
* - az új árlista feldolgozó gyártó- és termékcsoport-feloldása
|
|
* (`PricelistFileProcessService`),
|
|
* - a gyártó-összevonó karbantartás.
|
|
*
|
|
* Pontosan ennek a hiánya okozta, hogy a `products` mellé 70 duplikált gyártónév
|
|
* keletkezett: a legacy import nyers, karakterre pontos egyezést követelt, ezért a
|
|
* "Danone " nem találta meg a meglévő "Danone"-t, és felvett egy újat.
|
|
*/
|
|
class NameNormalizer
|
|
{
|
|
/**
|
|
* Kis/nagybetű-érzéketlen, a `/` és `_` szeparátorokat szóközzé alakító,
|
|
* a többszörös szóközöket összevonó, körülvágott alak.
|
|
*/
|
|
public static function normalize(?string $text): string
|
|
{
|
|
$text = mb_strtoupper(trim((string) $text), 'UTF-8');
|
|
$text = str_replace(['/', '_'], ' ', $text);
|
|
$text = preg_replace('/\s+/u', ' ', $text) ?? $text;
|
|
|
|
return trim($text);
|
|
}
|
|
|
|
/**
|
|
* Egyeznek-e a nevek a fenti szabály szerint.
|
|
*/
|
|
public static function matches(?string $a, ?string $b): bool
|
|
{
|
|
$normalizedA = self::normalize($a);
|
|
|
|
return $normalizedA !== '' && $normalizedA === self::normalize($b);
|
|
}
|
|
}
|