Към съдържанието

Новости

3.2.1 — 2026-07-28

heading.anchorLabel

Fix: a product carrying an attribute that is required in its set but never present in the supplier feed (e.g. a cosmetic second colour) can now be added from Pending and keeps syncing price/stock on later runs. While the sync itself saves, only the required-empty validation errors are dropped (field stays genuinely empty, no placeholder); admin/API saves still enforce required fields. Covered by an integration test.

3.1.0 — 2026-07-24

heading.anchorLabel

⚠️ Upgrade steps. Constructors changed in Service/Processor/ProductProcessor, Console/Command/Synchronize, Cron/Synchronize/Product/AbstractSynchronize and the Price Comparison grid, so a deploy needs setup:di:compile — a stale interceptor breaks all of bin/magento. The three price screens moved under a new Imports → Prices parent, so roles need the new Webcode_Sync::prices ACL resource granted or the screens disappear from their menu.

  • categories datatype and a weekly job. Nothing ever refreshed a supplier’s category tree — every crontab.xml fetched products and nothing else — while category-based providers resolve their products through that mapping, so a category added by a supplier after the first seed stayed unreachable, and a fresh install imported 0 products in about a second with no error. Service/Processor/CategoryProcessor is the datatype; Cron/Fetch/Categories (webcode_sync_fetch_categories, Monday 00:30, half an hour before the daily full product fetch) walks every provider that registers it. ProductProcessor::fetch() also seeds on an empty mapping and re-reads on a full run. Seeded rows arrive inactive on purpose, so a run now says “no active category mapping — this fetch will import 0 products” instead of reporting an empty success.
  • “Ask before changing a price by more than X%” (strategies/manual_review_percent, 0 = off, the shipped default). A condition on top of whatever strategy resolves, not a strategy of its own: over that much movement the sync leaves the price alone and marks price = review in sync_attribute_sources — a third provenance value, because nobody has decided anything yet. The row is listed in Price Comparison with both figures and the gap in € and %; Approve supplier price applies it and hands the product back to the feed, and the mark clears itself once the supplier’s price is back inside tolerance.
  • lowest_dealer price strategy. Distributors quote the same RRP — only 14 of 66 multi-supplier products differ on the sell price while all 66 differ on the dealer price — so the margin is the only thing that can actually choose a supplier.
  • “Return to sync” mass action, and the 🔒 marker that makes an admin-held price visible at all. Once an attribute was admin-sourced nothing could ever clear the mark, and nothing showed it.
  • Imports → Prices menu group (Price Rules / Price Comparison / Price Change Log) with its own ACL resource, matching how Products and Mapping are already grouped.
  • ProviderProcessorInterface::supports().
  • One synchronize implementation. AbstractDataProcessor::synchronize() was an empty stub and every provider registers a processor, so webcode:sync:synchronize products <provider> reported a clean run that had synchronized nothing; the only working implementation was the cron’s, with a second copy in the console command. All three now call Service/Synchronize/ProductRunner.
  • Prices obey provenance. updatePrices() had no admin-source check at all, so the module’s own Apply button produced a price the next sync deleted. Apply records admin as it writes (a resource-level updateAttributes() cannot fire the observer that normally does) and updatePrices() honours it — which also gives the “freeze just this product’s price” that was missing.
  • A held price is listed again once it drifts from its closest supplier, single-supplier products included. Freezing a price also freezes it while the suppliers’ keep moving, and the grid only ever showed rows where the suppliers disagreed with each other.
  • Priority ties break on price. Every provider ships priority 10, so “equal” is the normal case and row order was deciding it — KW9-00632 applied 186.78 over 130.49.
  • A reseller_price of 0 means the provider sent none, not that the goods are free. vali (5724 rows) and xcom (2066) send none at all, and read as a number they won every comparison. Excluded from lowest_dealer and from the grid’s spread filter (NULLIF).
  • An unknown datatype is no longer a silent no-op: “this provider does not do orders”, “typo in the datatype” and “di is not compiled” used to look identical.
  • The price rule form’s buttons point at Webcode_Base — the Webcode\Core blocks they named no longer exist.
  • PriceRuleEngine’s final rounding had never executed anywhere (no environment had a price rule, so the no-rules fast path always won); it is now covered by tests.

2.15.0 — 2026-07-21

heading.anchorLabel

webcode/module-sync-core 2.15.0 — Deprecation / transition bridge

heading.anchorLabel

⚠️ Пакетът е преименуван на webcode/module-sync. Този релийз е транзишън мост от 2.14.0.

Промени

heading.anchorLabel
  • Маркиран като deprecated (виж description) — новото име е webcode/module-sync.
  • composer.json replace: добавено "webcode/module-sync": "3.0.0".

Съществуваща инсталация на webcode/module-sync-core 2.15.0 вече предоставя webcode/module-sync 3.0.0, така че зависимости, изискващи новото име (webcode/module-sync ^3.0.0), се удовлетворяват без отделен пакет — връзката се запазва по време на прехода.

Кодът е идентичен с 2.14.0; сменен е само composer manifest-ът.

2.5.6 — 2021-11-27

heading.anchorLabel

2.5.4 — 2021-11-23

heading.anchorLabel

2.5.3 — 2021-09-16

heading.anchorLabel

2.5.2 — 2021-09-16

heading.anchorLabel

2.5.1 — 2021-08-20

heading.anchorLabel

2.5.0 — 2021-08-20

heading.anchorLabel

2.4.1 — 2021-08-19

heading.anchorLabel

2.4.0 — 2021-08-19

heading.anchorLabel

2.3.13 — 2021-08-09

heading.anchorLabel

2.3.12 — 2021-08-02

heading.anchorLabel

2.3.11 — 2021-07-26

heading.anchorLabel

2.3.10 — 2021-07-26

heading.anchorLabel

2.3.9 — 2021-07-26

heading.anchorLabel

2.3.8 — 2021-07-25

heading.anchorLabel

2.3.7 — 2021-07-24

heading.anchorLabel

2.3.6 — 2021-07-20

heading.anchorLabel

2.3.5 — 2021-07-19

heading.anchorLabel

2.3.4 — 2021-07-19

heading.anchorLabel

2.3.3 — 2021-07-19

heading.anchorLabel

2.3.2 — 2021-07-19

heading.anchorLabel

2.3.1 — 2021-07-13

heading.anchorLabel

Categories and Attribute Sets Mapping Added — 2021-07-13

heading.anchorLabel

2.2.2 — 2021-07-06

heading.anchorLabel

2.2.1 — 2021-07-06

heading.anchorLabel

2.2.0 — 2021-07-05

heading.anchorLabel

2.1.1 — 2021-06-15

heading.anchorLabel

2.1.0 — 2021-06-14

heading.anchorLabel

2.0.7 — 2021-05-13

heading.anchorLabel

2.0.6 — 2021-04-02

heading.anchorLabel

2.0.5 — 2021-04-02

heading.anchorLabel

2.0.4 — 2020-12-09

heading.anchorLabel

2.0.3 — 2020-12-09

heading.anchorLabel

2.0.2 — 2020-11-30

heading.anchorLabel

2.0.1 — 2020-09-24

heading.anchorLabel

2.0.0 — 2020-09-24

heading.anchorLabel