Commit Graph

165 Commits

Author SHA1 Message Date
E98Developer
f376a820a2 ADD EV3-432 beszállító megjegyzése "Mentés és új létrehozása" esetén
A profitcenter ütemezés felvételi űrlapján a Beszállító mező eddig minden
"Mentés és új létrehozása" után kiürült, pedig a felhasználó tipikusan
ugyanahhoz a beszállítóhoz vesz fel egymás után több ütemezést különböző
profit center / szállítási sablon kombinációval.

A Filament CreateRecord erre kész horgot ad
(preserveFormDataWhenCreatingAnother()): a Beszállító mostantól megmarad a
következő üres űrlapon, a Profit Center és a Szállítási sablon továbbra is
ürül.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 17:03:49 +02:00
E98Developer
d26ba5e5e6 FIX EV3-466 hétvégi szállítási napok engedélyezése a heti sablonból
A DeliveryCalendarService 4. prioritása a WorkCalendarService::isWorkDay()-t
hívta, ami a naptárban nem szereplő napoknál a hétvégére esett vissza. Így egy
hétvégét is tartalmazó sablon szombat/vasárnap mezőit sosem érte el a
kiértékelés (5. prioritás), és csak egyedi felülbírálással lehetett hétvégi
szállítást engedni.

- WorkCalendarService: új isHoliday(), ami csak a work_calendars ünnepnap
  rekordjaira ad true-t, a naptári hétvégére nem. Az isWorkDay() változatlan.
- DeliveryCalendarService: a 4. prioritás mostantól isHoliday()-t használ, így
  a hétvégéről a heti sablon dönt. Ünnepnap továbbra is tilt.
- NextDeliveryDateCalculatorService: a szállítási nap keresése kikerült az
  isWorkDay() blokkból, különben a hétvége a következő szállítási nap
  számításánál továbbra is kimaradt volna. Az átfutási időbe az új
  countsTowardLeadTime() szerint a sablon hétvégi napjai is beleszámítanak,
  a H-P sablonok viselkedése változatlan.
- DeliveryCalendarWidget: a szürke "inaktív" festés csak a nem szállítási
  hétvégékre megy rá. Mellékesen a szállítási napok ciklusa $date->addDay()-jel
  mutálta a kollekció Carbon objektumait, ez copy()-ra javítva.

7 új teszt, köztük a H-P sablon regresszió-őre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 15:59:59 +02:00
E98Developer
3cfaa6c9d5 FIX EV3-357 rich text cellák kezelése az árlista beolvasásban
A d2d-n a megrendelő fájljának megnyitásakor a sorok táblája eltört:
TextColumn::getDescriptionBelow(): Return value must be of type
Htmlable|string|null, array returned.

Nem UI-hiba volt, hanem adatvesztés. Ha egy cellán belül több formázású
szövegrész van (pl. a terméknév egy része félkövér), a PhpSpreadsheet
getValue()-ja RichText objektumot ad vissza. A json_encode ezt ÜRESRE
serializálja (a szövegrészek protected propertyben vannak), így a payloadba
{} kerül, ami visszaolvasva üres tömb - a cella tartalma nyomtalanul eltűnt,
a felület pedig tömböt kapott string helyett.

- normalizeCellValue(): a cella értéke a payloadba kerülés ELŐTT skalárrá
  alakul (RichText -> getPlainText, dátum -> szöveg, tömb -> összefűzött
  szöveg, __toString-es objektum -> string)
- LinesRelationManager::payloadText(): a MÁR ELMENTETT rekordokban maradt
  tömbök nem törhetik el a nézetet - a beolvasási javítás azokat
  visszamenőleg nem gyógyítja meg
- isBlankPayloadValue(): a kötelező mező ellenőrzése is_string() alapú volt,
  ezért az üres tömböt KITÖLTÖTTNEK látta - egy elveszett terméknév némán
  átment a validáláson. Ugyanez a védelem a Hooreyca-blokk vizsgálatában és a
  végrehajtás mezőkonverziójában is (utóbbi különben szó szerint "Array"
  néven hozta volna létre a terméket).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 13:51:11 +02:00
E98Developer
11a18eb1a6 ADD CLAUDE.md a fejlesztői munkafolyamat rögzítésére
A teszt-optimalizálás során több olyan szabály és csapda derült ki, ami a kódból
nem olvasható ki, és amit egy új session vagy a jövőbeli önmagunk könnyen
elrontana:

- A teljes suite --parallel-lel fut, EGY tesztre viszont ne: ott a hat processz
  bootja tiszta veszteség.
- A tests/TestCase.php DB-név mintáját nem szabad str_starts_with($db, 'd2d')-re
  lazítani, mert az átengedné az éles adatbázist.
- A ParallelTesting::callSetUpTestCaseCallbacks() hívás nem felesleges: enélkül
  a processzenkénti adatbázis sosem jön létre.
- A mysql kliens PATH-on léte nélkül az egész suite elszáll, nem csak lassabb.
- A bootstrap/cache/blade-icons.php adja a boot idejének a felét.
- Új migráció után schema:dump kell, --prune viszont soha.
- A deployment tesztek fájljai ne nőjenek 35 mp fölé.

A deploy szakasz azért került bele, mert a kézi fájlmásolás egyszer valódi éles
incidenst okozott, és a queue worker újraindításának sorrendje sem magától
értetődő.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 12:22:18 +02:00
E98Developer
98cf955354 FIX DeploymentPackageTest felbontása hat fájlra a párhuzamos futtatáshoz
A paratest FÁJLONKÉNT osztja szét a munkát, ezért egyetlen 28 tesztes fájlból
nem tudott párhuzamosítani: egy processz vitte a teljes 137 mp-et, a másik öt
üresjáratban állt. A --parallel emiatt korábban egyenesen lassabb volt
(136 -> 143 mp), a teljes suite-on pedig csak 11%-ot hozott.

A felosztás témák szerint történt, de mért időkre kalibrálva, hogy egyik fájl
se domináljon (a leghosszabb a Builder, ~35 mp):

  AccessTest    6 teszt  ~7 mp   jogosultság, feature flag, 403
  GitTest       5 teszt ~18 mp   GitRepository, ChangeSetAnalyzer
  BuilderTest   9 teszt ~35 mp   csomagépítés, _TEENDOK, _torles.sh, verzió
  PageTest      4 teszt ~21 mp   commitlista, keresés, kiválasztás
  CreationTest  2 teszt ~32 mp   felületről indított csomagolás, kirakottnak jelölés
  DownloadTest  2 teszt ~25 mp   naplóbejegyzés, ZIP letöltés, útvonal-ellenőrzés

A két legdrágább teszt (21,7 és 20,4 mp) szándékosan külön fájlba került,
együtt hagyva ők adnák a padlót.

A közös segédfüggvények a DeploymentTestHelpers.php-ba kerültek. Ez nem
*Test.php, ezért a phpunit nem szedi fel teszt-fájlként. A minta-repót takarító
afterAll() helyére register_shutdown_function lépett: az afterAll fájlonként
futna le, és a következő fájl alól húzná ki a mintát.

Mért eredmény (6 mag): ezek a tesztek sorosan 137,00 mp, párhuzamosan
67,88 mp. Teljes suite párhuzamosan 149,78 -> 77,52 mp.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 10:48:31 +02:00
E98Developer
a9758e8da7 ADD Séma dump a 103 migráció kiváltására a teszteknél
A migrate:fresh eddig 103 migrációt futtatott le minden teszt-futásnál. A dump
egyetlen SQL fájlként tölti be ugyanazt a 48 táblát: migrate:fresh 21,09 ->
12,07 mp, egy teszt --filter-rel 27,80 -> 20,88 mp.

A dumpot a Laravel csak akkor tölti be, ha a migrations tábla ÜRES
(MigrateCommand::prepareDatabase), tehát az e2e/d2d környezetek - ahol már
vannak lefutott migrációk - változatlanul inkrementálisan migrálnak. Ezért
--prune NÉLKÜL készült: a 103 migrációs fájl a helyén marad.

Karbantartás: minden új migráció után újra kell generálni (php artisan
schema:dump). Ha elmarad, az nem törik el semmit, csak a dump utáni
migrációkat egyenként futtatja le.

A betöltéshez a mysql kliens kell a PATH-on
(C:\www\envkit\services\mysql\11.8.2\bin).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 10:34:26 +02:00
E98Developer
947eccff90 FIX Teszt párhuzamos futtatás processzenkénti adatbázissal
A --parallel eddig két okból nem működött volna:

1. A setUp() a parent::setUp() ELŐTT hívja a refreshApplication()-t, hogy a DB
   nevét a RefreshDatabase előtt ellenőrizhesse. A Laravel viszont a
   ParallelTesting::callSetUpTestCaseCallbacks()-ot csak az "if (! $this->app)"
   ágban futtatja (InteractsWithTestCaseLifecycle), ami így kimaradt - a
   processzenkénti adatbázis sosem jött létre, minden processz a közös
   d2dTest-et migrálta volna egyszerre. A callbacket most magunk hívjuk meg;
   nem párhuzamos futásnál no-op.

2. A névellenőrzés pontos "d2dtest" egyezést várt, és eltérésnél nem hibát
   dobott, hanem VISSZAÍRTA a configot d2dTest-re - vagyis csendben közös
   adatbázisra terelte volna a processzeket.

A név mostantól a /^d2dtest(_test_\d+)?$/ mintát követi, ami a Laravel
TestDatabases::testDatabase() elnevezését fedi le. Szándékosan nem
str_starts_with($db, 'd2d'): az átengedné az éles adatbázist is. Az éles d2d
elleni azonnali exit(1) változatlan.

Ellenőrizve: tiszta lapról a párhuzamos futás létrehozta a d2dtest_test_1..6
adatbázisokat, a sima futás változatlanul működik.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 10:34:13 +02:00
E98Developer
11918b608d FIX DeploymentPackageTest git fixture újrahasznosítás és temp takarítás
A temp git repó eddig tesztenként épült újra 12 git processzel, ami Windowson
önmagában ~4 mp volt tesztenként. Mostantól futásonként EGYSZER épül fel, a
tesztek pedig másolatot kapnak róla (0,138 mp másolás + 0,177 mp takarítás).
Minden teszt saját, írható példányon dolgozik, így a "working tree elrontása"
és a builder-tesztek továbbra is írhatnak a repóba.

Mérés a teljes fájlon, azonos gépen, 28/28 zölddel: 384,05 mp -> 268,38 mp.

A régi deploymentCleanup a Windows read-only .git/objects fájljain elbukott és
a hibát csendben elnyelte, ezért árva mappákat hagyott a temp-ben (164 gyűlt
össze). Az új, facade nélküli deploymentDeleteDirectory nem hagy maga után
semmit, és az afterAll a booteolt alkalmazáson kívül is tud takarítani.

A minta útvonalában getmypid() van, hogy a tervezett --parallel futásnál is
processzenként külön mintát használjunk.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 08:45:05 +02:00
E98Developer
2965f231ce ADD Deployment csomagoló queue worker és scheduler újraindítás a teendők közé
A 2026-08-17-i eset általánosítása: a d2d/e2e Docker Swarmban ugyanazt a kódot több
service futtatja közös volume-ról, és a queue:work hosszan futó folyamat a betöltött
osztályokat a memóriájában tartja. A fájlmásolás után a worker RÉGI kóddal dolgozta fel
a jobot - a felület jónak látszott, a háttérfeladat némán a régi viselkedést hozta.

- config: 'runtime' minta (app/, config/, database/, routes/, bootstrap/, composer.lock),
  mert a restart nem csak a jobok változásakor kell; targetenként a service nevek és a
  Swarm manager elérése
- a felületen figyelmeztetés, a teendőkben a konkrét ssh + docker service update parancs
- a restart szándékosan a cache ürítés UTÁN: a frissen induló worker különben a régi,
  cache-elt konfigot töltené be
- a d2d schedulernél jelezzük, hogy 0 replikán fut (a restart üresjárat lehet), a t2t-nél
  pedig azt, hogy queue service még nincs, de a névkonvenció alapján t2t_queue lesz

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 06:41:19 +02:00
E98Developer
4bb89ae6a1 FIX Deployment csomagoló d2d alapértelmezés és automatikus környezet-állapot
- A célkörnyezet alapértelmezése a d2d (azt frissítjük sűrűbben). A config targets
  tömbjének sorrendje adja az alapértelmezést, ezért csak a sorrend cserélődött.
- A "Környezetek állapota" panel betöltéskor magától lekérdezi a deploy-version.json-t,
  percenkénti cache-sel (a hibás választ is cache-eljük, hogy egy nem válaszoló
  környezet ne lassítsa minden kattintásnál a felületet). A Frissítés gomb kényszerít.
- A panel tömörebb, és valóban két hasábos: a md:grid-cols-2 nincs benne a lefordított
  CSS-ben, ezért saját, media query-s stílussal oldjuk meg - így build nélkül is működik.
- A commitlistában a hash mellett jelöljük, melyik környezet áll azon a commiton:
  zöld a szervertől lekérdezett, szürke a napló szerinti állapot.

Teszt: a beforeEach Http::fake() catch-all stubja minden URL-re illeszkedik és a factory
az első találatot adja vissza, ezért a konkrét választ váró teszt új factory-t kap.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 22:48:09 +02:00
E98Developer
c8d5e01490 ADD Deployment csomagoló seeder-felismerés a teendők közé
Éles használat közben derült ki: a csomagba került egy seeder, de a _TEENDOK.md nem
szólt róla. A seeder felmásolása önmagában nem csinál semmit, tehát csendben kimaradt
egy lépés - pont az a hibatípus, ami ellen az egész eszköz készült.

- config: új attention csoport a database/seeders/* útvonalakra
- a felületen figyelmeztetés, a teendőkben a konkrét osztálynévvel:
  php artisan db:seed --class=<Osztály>
- mellé egy feltételes cache-lépés: a Pennant purge Eloquent mentésnél NEM kell (a
  FeatureFlagObserver::saved() elvégzi), csak query builderes írás után; a laratrust
  cache pedig csak szerepkör/jogosultság hozzárendelés változásakor, mert a saját
  cache-ét a felhasználóhoz kötve tárolja

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 22:23:11 +02:00
E98Developer
9bc723bd83 FIX Deployment csomagoló a gombok és badge-ek Filament komponensekre cserélése
A "Csomag készítése" gomb a felületen láthatatlan volt: a text-white benne van a
lefordított CSS-ben, a bg-primary-600 viszont nincs, így fehér szöveg került fehér
kártyára. Ugyanezért jelentek meg a státusz-badge-ek is színtelen szövegként.

Ok: egy új blade fájlban használt Tailwind utility class csak npm run build után kerül
be a bundle-be (a theme.css scanneli a resources/views/filament mappát, de a CSS-t
nem generálja újra magától). Ezért a kézzel stílusozott elemek helyett a Filament saját
button/badge komponenseit használjuk, amiknek a stílusa már a lefordított CSS-ben van -
így a felület build nélkül is helyesen jelenik meg.

A színes figyelmeztető dobozok maradtak nyers utility class-okkal: azok build hiányában
is olvashatók (keretes doboz), csak a színüket kapják meg npm run build után.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 08:23:43 +02:00
E98Developer
b8fd71ed23 FIX Deployment csomagoló a 403-teszt valódi HTTP kérésre váltása
A Livewire::test() a HttpException-t válasszá alakítja és nem dobja tovább
(RequestBroker: withoutExceptionHandling([HttpException::class])), ezért a toThrow()
sosem teljesült volna. A jogosultság-ellenőrzés valódi belépési pontja az oldal URL-je,
így a teszt most GET-tel kéri le és assertForbidden()-nel ellenőriz.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 07:34:29 +02:00
E98Developer
bfc1484611 ADD Deployment csomagoló phase3 napló, környezetkövetés, ZIP letöltés és törlő szkript
A csomagolás mostantól nyomot hagy: melyik környezetre mi készült, mi lett kirakva, és
mennyi a lemaradás - ez az, ami a "melyik verzió fut az e2e-n" kérdést kiveszi a fejből.

- deployment_packages tábla + modell (BaseAuditable): target, tartomány, darabszámok,
  mappa/ZIP útvonal, deployed_at. A csomagolás és a tényleges kirakás két külön esemény.
- Targetenkénti előtöltés: a kezdő commit az adott környezetre utoljára kirakottként
  megjelölt csomag to_commit-je. Rebase után nem létező hash esetén inkább üres marad,
  mint hogy hamis tartományt mutasson.
- "Környezetek állapota" panel: napló szerinti állapot + commit-lemaradás
  (git rev-list --count), és gombra a szerver deploy-version.json-jának lekérdezése.
  Ha a kettő eltér, az elmaradt vagy félbemaradt feltöltés jele. Szándékosan gombra fut,
  nem minden rendereléskor: így nem indul kimenő kérés magától.
- ZIP a kész mappából (a fájllista a zip létrejötte előtt készül, így nem csomagolja
  magát), letöltés a naplóból. A DB-ből jövő útvonalat kiírás előtt a kimeneti mappához
  kötjük, hogy egy módosított rekord se tehessen letölthetővé tetszőleges fájlt.
- _torles.sh: alapból dry run, --confirm kell a törléshez, app-gyökér ellenőrzéssel,
  abszolút útvonal és .. kiszűrésével, LF sorvéggel és BOM nélkül. Lefuttatva ellenőrizve.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 07:20:34 +02:00
E98Developer
7ad9c6fea8 ADD Deployment csomagoló phase2 csomag előállítása (mappa, manifest, törlendők, verziójelölő)
A kijelölt tartományból elkészül a feltölthető mappa: deploy_<target>_<időbélyeg>, benne
a fájlok eredeti relatív útvonalon, hogy a feltöltés mappa-összeolvasztás legyen.

- GitRepository::archiveTo(): git archive --format=zip + ZipArchive kicsomagolás, ~100
  fájlonként darabolva a parancssor-limit miatt. A tartalom a git objektumtárból jön, nem a
  working tree-ből: így nem szivárog ki commitolatlan módosítás, és a .gitattributes eol=lf
  miatt LF sorvéggel kerül a Linux célgépre. Üres pathspec esetén nem hívunk gitet, mert az
  a TELJES fát csomagolná.
- DeploymentPackageBuilder: _MANIFEST.json/.txt (sha1 + méret fájlonként), _TORLENDO.txt a
  törölt és az átnevezett fájlok régi útvonalával, _TEENDOK.md a diffből származó lépésekkel
  (migrate, composer install, asset-figyelmeztetés, verzió-ellenőrzés), és public/
  deploy-version.json a kirakott commit hashével.
- A git archive által kihagyott fájlok (pl. .gitattributes export-ignore) külön "missing"
  listára kerülnek - csendben hiányzó fájl a manuális deploynál a legrosszabb hiba.
- Felületen fájlonkénti kézi kivétel, megerősítéses csomagolás gomb, eredmény-kártya.
- DeploymentGuard::ensureEnvironmentAllowed(): a builder felhasználó nélkül is ellenőrzi az
  env kapcsolót és a stage whitelistet, így konzolról indítva sem fut le egy szerveren.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 07:09:05 +02:00
E98Developer
6027511585 FIX Deployment csomagoló phase1 git ikon és a commit törzsére kiterjesztett keresés
- a topbar menüpont a most bemásolt git ikont használja; a fájl ico_gitpng néven
  érkezett, átnevezve ico_git.png-re, hogy illeszkedjen az ico_*.png konvencióhoz,
  amiből a nav az útvonalat építi
- a git log a törzset (%b) is elkéri, és a keresés a tárgysor mellett ebben is keres:
  a hash-re ritkán keres ember, az érdemi leírás viszont gyakran a törzsben van
- a --shortstat sora a törzs után érkezik, ezért a parse leválasztja róla, különben
  a "N files changed" szöveg a törzsbe és a keresésbe is beszivárogna

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 06:59:04 +02:00
E98Developer
09eed3eeb3 ADD Deployment csomagoló phase1 védelem, git olvasó és read-only commit/diff felület
Két commit közötti fájlok összegyűjtését előkészítő felület első fázisa: célkörnyezet
választás (e2e/d2d), commitlista, diff-előnézet figyelmeztetésekkel. Ez a fázis még
semmit nem ír a fájlrendszerre, a csomagolás a phase2-ben érkezik.

- DeploymentGuard: .env kapcsoló + hardkódolt stage whitelist + developer szerep +
  feature flag; a flag szándékosan nem biztonsági réteg, csak láthatóság-vezérlés
- GitRepository: csak olvasó wrapper, argumentum-tömbös Symfony Process (nincs shell),
  hash- és referencia-validáció, core.quotePath=false az ékezetes útvonalakhoz
- ChangeSetAnalyzer: kizárási lista, törlendő/másolandó szétválasztás (átnevezésnél
  mindkettő), figyelmeztetések migrációra, composer.lock-ra és a nem verziókövetett
  fordított assetekre

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 06:45:09 +02:00
E98Developer
8bcfeba0f9 ADD EV3-357 Árlista feldolgozás phase5/5 beszállítói blokkolás (PricelistGuard)
Egy beszállítóhoz egyszerre legfeljebb egy nyitott végrehajtás tartozhat: egy
execution_failed fájl után a termékek félig frissített állapotban vannak, egy új
import erre a kevert alapra rétegződne rá (és a validálás is ehhez számolná a
diffeket); két párhuzamos végrehajtás pedig nem determinisztikus eredményt adna.

- új PricelistGuard service: egyetlen igazságforrás a blokkoláshoz
- mind a NÉGY belépési pont véd: modern Filament create, régebbi
  PriceListProcessor oldal, legacy Admin\PriceListController import, konzol
  parancs. A legacy import a legfontosabb - az közvetlenül ír a products
  táblába, megkerülve a modult, és a beszállítókat ma még nagyrészt ott kezelik.
- az `inprogress` önmagában nem blokkol: az előfeldolgozás és a validálás
  egyetlen terméket sem ír, csak a már elindult végrehajtás számít
- a beszállító nem tűnik el a select listából, hanem konkrét magyarázatot kap a
  felhasználó arról, melyik fájl blokkol és miért
- blokkolt beszállítónál másik fájl jóváhagyása sem indítható

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 06:46:40 +02:00
E98Developer
e338f68ee8 ADD EV3-357 Árlista feldolgozás phase5/4 visszavonás, elakadás-észlelés, kényszerlezárás
- PricelistExecutionJob + új PricelistRevertJob: $tries=1, $timeout, failed()
  hook. A service catch ága csak PHP exceptiont fog el; worker timeout vagy
  memórialimit esetén a fájl inprogress-ben ragadna, döntési gomb nélkül.
- heartbeat backstop a kill -9 esetére, ahol a failed() sem fut: minden chunk ír
  a rekordba, így az updated_at a szívverés (isExecutionStuck). Ezzel garantált,
  hogy minden kísérlet véges időn belül terminális állapotba jut - enélkül a
  kényszerlezárás sem nyílna ki soha.
- kompenzáló visszaállítás R1-R4: árak törlése, termékek visszaállítása a
  snapshotból, létrehozott termékek kivonása (soft delete, NEM fizikai törlés,
  mert lehet rájuk hivatkozás), árlista + fájl lezárása
- konfliktuskezelés: a végrehajtás óta kézzel módosított terméket kihagyjuk és
  jelentjük, nem írjuk felül vakon
- FIX phase5/3: a snapshot csak az írás ELŐTTI updated_at-et tárolta, amihez
  képest a termék a végrehajtás után mindig eltér - a konfliktus-ellenőrzés így
  minden sort kihagyott volna. Most a saját írásunk utáni updated_at is bekerül.
- kényszerlezárás: csak legalább egy terminális hibába futott visszaállítási
  kísérlet után, flag + developer szerepkör mögött, kötelező indoklással
- döntéstámogató panel: mi történt már meg az importból, hogy a felhasználó ne
  vakon válasszon a Folytatás és a Visszavonás között

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 06:36:21 +02:00
E98Developer
93111ef2e0 ADD EV3-357 Árlista feldolgozás phase5/3 chunkolt végrehajtás (E1-E6)
A sleep(1) szimuláció helyén valódi import: árlista fejrekord -> új gyártók ->
új termékek -> termékfrissítés -> árak -> lezárás.

- szándékosan nincs egyetlen átfogó tranzakció: fázisonként/chunkonként
  tranzakciózunk, az atomicitást az adja, hogy az árlista E6-ig draft marad,
  tehát félbeszakadáskor sem kerül ki félkész ár a felhasználók felé
- minden fázis idempotencia-jelölője az az artefaktum, amit maga hoz létre
  (price_list_id / producer_id / product_id / applied_snapshot / pivot sor),
  így a megszakadt futás folytatható, nem kezd elölről
- E4 a termék TÉNYLEGES, írás előtti állapotát menti az applied_snapshot-ba,
  ugyanabban a tranzakcióban - ebből áll majd vissza a Visszavonás
- új EXECUTION_FIELD_MAP: a PRODUCT_FIELD_MAP csak a diff-számításhoz kellett,
  az import a legacy importPriceList()-tel azonos, bővebb mezőkört ír
- hiányzó opcionális oszlop (pl. Akció) nem írja felül a termék meglévő értékét
- updateStepStatus: az Execution lépés 'failed' státusza execution_failed
  fájlstátuszra képződik le, a többi lépésé marad fail

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 15:19:50 +02:00
E98Developer
eee27aa659 ADD EV3-357 Árlista feldolgozás phase5/2 jóváhagyás/elutasítás akció
- PricelistFile::canBeApproved() / hasExecutionStarted(): a jóváhagyás feltételei
  egy helyen, hogy a felületi gomb és a service ugyanazt ellenőrizze
- approve(): a státusz MÉG A DISPATCH ELŐTT billen át, különben a queue-latency
  alatt a gomb látszana és egy második kattintás párhuzamos importot indítana
- reject(): új 'rejected' lépésstátusz - nem 'failed', mert azt az
  updateStepStatus fail fájlstátuszra fordítaná, az elutasítás viszont closed
- a döntés (ki, mikor, milyen indokkal) a file_meta.approval-ba kerül, mert a
  BaseAuditable a nevével ellentétben nem naplóz
- Edit gomb szűkítése hasExecutionStarted()-tel három helyen, köztük az
  EditPricelistFile::afterSave()-ben, ami a teljes láncot újraindítja

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 15:00:33 +02:00
E98Developer
5bf2f83092 ADD EV3-357 Árlista feldolgozás phase5/1 PricelistExecution feature flag + migrációk
- új PricelistExecution Pennant flag (enabled + roles=[developer]) a jóváhagyás,
  végrehajtás és visszavonás rollout-kapujaként
- új execution_failed fájlstátusz: a validálásig tartó szakasz fail státuszától
  szándékosan elkülönítve, mert itt már történhettek termék- és árírások
- PricelistFileStatusEnum::color(): a badge-színek eddig két helyen, kimerítő
  match-ben voltak duplikálva, amit az új case eltört volna
- pricelist_file_lines.applied_snapshot + executed_at a chunkolt, idempotens
  végrehajtáshoz és a kompenzáló visszaállításhoz

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 14:19:28 +02:00
E98Developer
cbda830c5b ADD EV3-431 Profitcenter - betűkód phase2/4 fix speedButtonNavBar.blade.php to include SupplierCustomerCodes and FeatureFlagSeeder 2026-08-10 07:10:50 +02:00
E98Developer
e5933d0639 ADD EV3-431 Profitcenter - betűkód phase2/3 add modern supplier-customer-codes 2026-08-09 18:02:50 +02:00
E98Developer
1f1254c818 ADD EV3-431 Profitcenter - betűkód phase2/2 add hasCusetomer code switch to supplier administration 2026-08-09 10:46:46 +02:00
E98Developer
41758a81c4 ADD EV3-431 Profitcenter - betűkód phase2/1 add feature flag 2026-08-09 10:10:45 +02:00
E98Developer
e20a7a6a9d ADD EV3-431 Profitcenter - betűkód phase2/1 add feature flag 2026-08-09 10:10:24 +02:00
E98Developer
75ba62b1e1 ADD EV3-431 Profitcenter - betűkód phase2/1 add ProfitCenterSupplierCode data model 2026-08-09 09:41:07 +02:00
E98Developer
856b61da88 MOD change env call to config call in project 2026-08-09 07:15:37 +02:00
E98Developer
a6b11d2178 ADD EV3-431 Profitcenter - betűkód phase3 addd feature flag seeder 2026-08-09 06:44:25 +02:00
E98Developer
259df71c7b ADD EV3-431 Profitcenter - betűkód phase1 addd feature flag override relation manager 2026-08-08 16:46:34 +02:00
E98Developer
d6c6f0af1c EV3-431 Profitcenter - betűkód phase1 addd feature flag with laravel pennant 2026-08-08 16:09:54 +02:00
E98Developer
af6c02ad2e EV3-357 Árlista feltöltés és feldolgzás újra gondolása phase4 fejléc adatok akciós lehetőség bővítése 2026-08-08 12:37:51 +02:00
E98Developer
d3486cb699 ADD EV3-444 Hibás számítás Hooreyca adatok - add log analisator command 2026-08-04 10:50:14 +02:00
E98Developer
b28a224e8e FIX EV3-459 PC árlista admin view 2026-08-04 08:20:45 +02:00
E98Developer
a30aa2dd51 EV3-357 Árlista feltöltés és feldolgzás újra gondolása phase4 fejléc adatok akciós lehetőség bővítése 2026-08-03 12:09:41 +02:00
E98Developer
e49b7515e0 EV3-357 Árlista feltöltés és feldolgzás újra gondolása phase3 fejlec adatok cseréje 2026-07-22 12:37:24 +02:00
E98Developer
5477b953a8 mod EV3-442 Profitcenter ütemezés 2. 2026-07-16 08:53:09 +02:00
E98Developer
558a99970a FIX EV3-445 Termékmodul- egy termék keresése, latinise null problem 2026-07-14 14:30:23 +02:00
E98Developer
50ebbbbd74 EV3-445 Termékmodul- egy termék keresése part 1 2026-07-14 10:09:38 +02:00
E98Developer
6758317599 EV3-428 Statisztika 2026-07-07 19:07:34 +02:00
E98Developer
e119c4ae4a ADD EV3-358 statisztika modul bővítése aktuális ár megjelenítéssel phase 7 test pdf create 2026-07-06 22:04:28 +02:00
E98Developer
834f64a011 ADD EV3-358 statisztika modul bővítése aktuális ár megjelenítéssel phase 6 excel export function 2026-07-06 09:45:19 +02:00
E98Developer
4f11e59fce ADD EV3-358 statisztika modul bővítése aktuális ár megjelenítéssel phase 5 kereszbe ható szűrők. 2026-07-06 07:53:41 +02:00
E98Developer
e0876e4f25 ADD EV3-358 statisztika modul bővítése aktuális ár megjelenítéssel phase 4 egymásra ható szűrők. 2026-07-06 07:24:36 +02:00
E98Developer
c408e02054 ADD EV3-358 statisztika modul bővítése aktuális ár megjelenítéssel phase 3 fix layout problem 2026-07-06 06:59:38 +02:00
E98Developer
bef61a15c5 EV3-377 Egy ternék belistázása 2026-07-05 06:37:45 +02:00
E98Developer
0e3a901ac2 MOD EV3-448 Megrendelés melléklet 2026-07-05 06:01:11 +02:00
E98Developer
bacfbbce88 EV3-387 Verziováltott teszt - Statisztika 2026-07-03 06:59:50 +02:00
E98Developer
0b1240f972 ADD EV3-358 statisztika modul bővítése aktuális ár megjelenítéssel phase 2 layout problem 2026-07-01 19:56:01 +02:00