d2d.emegrendeles.hu/app/Support/NameNormalizer.php
E98Developer c0888db4a2 FIX EV3-357 gyártó duplikációk megelőzése az árlista importban
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>
2026-08-27 07:56:30 +02:00

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);
}
}