Новости
This content is not available in your language yet.
2.3.3 — 2026-09-29
heading.anchorLabel2.3.3
heading.anchorLabelСпрямо 2.3.2.
Внимание при деплой
heading.anchorLabel- Зависимости:
requireвcomposer.json: добавенbrick/phonenumber(*); добавенwebcode/module-telephone-validation(^2.0.2).
Комити (3)
heading.anchorLabela1d4d78Release 2.3.377e3051composer.json: версията остава 2.3.2591f842телефонът към BoxNow е E.164 по държавата на адреса
Бележки
heading.anchorLabel- Телефонът към BOX NOW (получател и подател) се подава E.164 чрез libphonenumber по държавата на адреса / магазина, вместо „+359“ + номера без първия знак. Досега
359898875230отиваше като+35959898875230,898875230—+35998875230, а0898/875 230— с наклонената вътре (Hub carrier-20). Невалиден номер се подава само изчистен — видим отказ от BOX NOW вместо тихо сменен номер. - Комитът „версията остава 2.3.2“ е остатък от MR-а, писан преди 2.3.2 да излезе от друг клон; версията на този релийз е 2.3.3.
При деплой
heading.anchorLabelgenerated/се чисти —ShipmentRequestBuilderима нов аргумент в конструктора (TelephoneNormalizer).- Нужен е
webcode/module-telephone-validation≥ 2.0.2 (препоръчително 2.1.0 — записва телефона в национален вид).
2.3.2 — 2026-09-29
heading.anchorLabel2.3.2
heading.anchorLabelСпрямо 2.3.1.
Внимание при деплой
heading.anchorLabel- Схема: нова таблица
webcode_boxnow_apm_seen— създава се отsetup:upgrade. - Конструктор: сменена сигнатура на
Service\Taxonomy\APM::__construct— при деплоя се чистиgenerated/. - Конфигурация: ново поле Keep a Missing APM Active For (hours) (
carriers/boxnow/apm_missing_grace_hours, по подразбиране 48) в Services & Pricing. - Първият синк след деплоя не изключва нито един автомат — гратисът на непроследените започва тогава.
Комити (2)
heading.anchorLabeldb1fcb2fix: синкът на автоматите разпознава града и с латинска буква в името (!24)4ea3725fix: автомат, изпаднал от фийда, не спира товарителницата и не се гаси веднага (!25)
Бележки
heading.anchorLabel- Фийдът
destinationsизброява само автоматите, достъпни в момента, и те мигат през деня. Синкът вече не гаси всички и не включва наново само видяните. Изключва се само автомат, който липсва по-дълго от гратиса. Автомат във фийда с неразпознат град се брои за видян. - Товарителницата ползва записания автомат на BoxNow и когато при нас е изключен — решава BoxNow. Резервата към най-близкия отворен офис за BoxNow не се пуска, за да не пренасочи пратката тихо.
- Градове с латинска буква-двойник във фийда („Габровo“, „Варнa“) вече се разпознават.
- Street fallback-ът разпознава и кирилския префикс („Автомат: [8124] …“).
2.3.1 — 2026-09-24
heading.anchorLabel2.3.1
heading.anchorLabelСпрямо 2.3.0.
Внимание при деплой
heading.anchorLabel- Конструктор: сменена сигнатура на
__construct— при деплоя се чистиgenerated/. - Setup: data/schema patch — изпълнява се срещу жива база при
setup:upgrade.
Комити (1)
heading.anchorLabela2c67dbfix: записът на куриера се възстановява сам (RecurringData), patch-ът е идемпотентен
Бележки
heading.anchorLabel- Записът на куриера в
webcode_carrier_entityсе възстановява сам. Ако таблицата е празна, а отметката наAddBoxNowCarrierEntityPatchе останала вpatch_list(модулът е бил изключван и таблицата е създадена наново), куриерът досега оставаше без запис, докато някой не махне отметката на ръка. Сега новиятSetup\RecurringDataсъздава липсващия запис при всекиsetup:upgrade: неактивен, както и при първа инсталация. AddBoxNowCarrierEntityPatch::apply()е идемпотентен. При махната отметка и съществуващ запис вече не гърми на уникалнияcode.
При деплой
heading.anchorLabel- Уточнение към автоматичните предупреждения: никоя съществуваща сигнатура не е сменена.
__constructе на новия класSetup\RecurringData. В production mode е нуженsetup:di:compileзаради новия клас. - Съществуващият data patch не се пуска наново.
RecurringDataпри всекиsetup:upgradeчете записа поcodeи създава нов само ако липсва. Съществуващ запис, вкл.is_active, не се пипа.
2.3.0 — 2026-09-19
heading.anchorLabel2.3.0
heading.anchorLabelСпрямо 2.2.2.
Внимание при деплой
heading.anchorLabel- Зависимости:
requireвcomposer.json:webcode/module-carrier:^2.0→^2.10.
Комити (3)
heading.anchorLabel6feb8f7Release 2.3.0d5d27e0chore(carrier-11): изисквай webcode/module-carrier ^2.10c25898ffeat(carrier-11): отказ на товарителница при отказ на поръчка
Бележки
heading.anchorLabelМодулът вече може да анулира товарителницата при отказ на поръчка.
Нов ShippingLabel::cancel() — POST parcels/<id>:cancel. Анулирането е идемпотентно по документация, но работи само докато статусът на пратката е „New“; иначе куриерът вали с P420 и в поръчката влиза бележка.
Включва се от Магазини → Конфигурация → Webcode Solutions → Delivery Methods → Товарителници. Настройката е обща за всички куриери и е изключена по подразбиране — това издание не променя нищо от само себе си.
Отказ от куриера никога не блокира отказа на поръчката; причината влиза в коментарите на поръчката и в лога.
Внимание при деплой
heading.anchorLabel- Изисква webcode/module-carrier ^2.10 — констрейнтът е стегнат в това издание, защото модулът вече ползва
LabelCancellationInterface, който идва с carrier 2.10.0. Деплой без него би дал фатал при зареждане на класа. - Нужен е
cache:flush(заради новия observer и конфигурация в carrier 2.10.0). - Няма промени по схема и по static content.
Известен проблем
heading.anchorLabelНе е минат реален отказ на жива товарителница при куриера (DoD т. 2–3) — покритието е unit. Първият жив отказ да се наблюдава.
2.2.1 — 2026-08-25
heading.anchorLabelRegister carriers/boxnow/api_url as a hidden system.xml field, so the API base URL is manageable per environment via bin/magento config:set / env.php (no merchant UI; default stays in config.xml).
2.1.1 — 2026-08-19
heading.anchorLabelПоправено
heading.anchorLabelПроследяването на пратки не работеше.
getTracking() викаше endpoint parcel:track. Като ОТНОСИТЕЛЕН URI първият
сегмент не може да съдържа двоеточие — по RFC 3986 парсерът чете parcel: като
схема, base URI-то отпада и Guzzle пада с:
The scheme ‘parcel’ is not supported.
Регресия от миграцията към споделения label pipeline (7c4e756): преди нея
пътят беше parcels?parcelId=<id> и се резолвваше нормално. Мерено на bilki.bg
— шест такива събития само на 19.08.2026.
Фиксът е ./parcel:track; endpoint-ът остава същият.
| подаден път | резолвира се до |
|---|---|
parcel:track |
parcel:track ← base URI-то се губи |
./parcel:track |
https://api-production.boxnow.bg/api/v1/parcel:track |
Нов ShippingLabelTest покрива и трите извиквания и проверява КЪДЕ сочи всяка
заявка след резолюцията, не самия низ — така лови и бъдещ endpoint с двоеточие
в първия сегмент.
2.1.0 — 2026-07-28
heading.anchorLabelDelivery Methods config cleanup:
- API base URL default живее в etc/config.xml (carriers/boxnow/api_url), не като PHP const; override през config:set / env.php / DB.
- Креденшълите вече не са required за Save на секцията; валидацията е бутонът Login & Configure.
2.0.0 — 2026-07-22
heading.anchorLabelMajor release — moves onto the shared Webcode_Carrier label pipeline.
⚠ Breaking
heading.anchorLabel- Requires
webcode/module-carrier ^2.0.
Changes
heading.anchorLabel- Rate price reconciled with the store Shipping Prices setting via the shared adjuster (module-carrier).
Known / deferred
heading.anchorLabel- Multi-box shipments: each box gets its own BoxNow parcel number, but only the first parcel’s label is printed today. Per-parcel labels are marked as a TODO in
LabelProvider::createLabelfor a follow-up (the packages split and per-parcel tracking are already in place).
Chore
heading.anchorLabel- Proprietary/EULA copyright headers standardized across the module.
- Uses
webcode/module-basefor the shared Console command.