Новости
3.2.1 — 2026-07-28
heading.anchorLabelFix: 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.
Added
heading.anchorLabelcategoriesdatatype and a weekly job. Nothing ever refreshed a supplier’s category tree — everycrontab.xmlfetched 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/CategoryProcessoris 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 marksprice = reviewinsync_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_dealerprice 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().
Changed
heading.anchorLabel- One synchronize implementation.
AbstractDataProcessor::synchronize()was an empty stub and every provider registers a processor, sowebcode: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 callService/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 recordsadminas it writes (a resource-levelupdateAttributes()cannot fire the observer that normally does) andupdatePrices()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_priceof 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 fromlowest_dealerand 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— theWebcode\Coreblocks they named no longer exist.
Fixed
heading.anchorLabelPriceRuleEngine’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.anchorLabelwebcode/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.jsonreplace: добавено"webcode/module-sync": "3.0.0".
Ефект
heading.anchorLabelСъществуваща инсталация на 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—