Новости
This content is not available in your language yet.
2.8.4 — 2026-09-30
heading.anchorLabel2.8.4
heading.anchorLabelСпрямо 2.8.3.
Комити (2)
heading.anchorLabeld1a0040fix: настройките за товарителницата се четат по store-а на поръчкатаf8c5460chore: post-release bump to 2.8.4
Бележки
heading.anchorLabel- Настройките за товарителницата се четат по store-а на поръчката. Диалогът ги четеше по store-а на поръчката, а
ShipmentRequestBuilderсамо от Default. Масовото генериране от грида минава само през builder-а, така че настройка на ниво website или store view (платец, надбавка, подател, опции преди плащане, застраховка, разрешени услуги…) важеше в диалога, но не и там. Сега и двата пътя дават еднаква товарителница. - Scope-ът се задава при
build()иgetDefaultCodAmount()и се връща след това, защото builder-ът е споделен между поръчките при масовото генериране.
При деплой
heading.anchorLabel- ⚠️ Стойности на ниво website или store view под
carriers/speedy/*, досега игнорирани при масовото генериране, започват да важат. Провери преди деплой:Празна (SELECT scope, scope_id, path, value FROM core_config_dataWHERE path LIKE 'carriers/speedy/%' AND scope <> 'default';NULL) стойност на store ниво отменя наследената. На isd-bg.com такъв ред заaccept_optionsна store 2 беше изтрит преди деплоя (30.09.2026). - Няма нови зависимости в конструктора, промени в схемата, шаблоните или статичните файлове:
cache:flush.
2.8.3 — 2026-09-29
heading.anchorLabel2.8.3
heading.anchorLabelСпрямо 2.8.2.
Комити (2)
heading.anchorLabelced0c7cfix: извън България без опции преди плащане (ОПП)363a06cchore: post-release bump to 2.8.3
Бележки
heading.anchorLabel- Извън България товарителницата е без опции преди плащане. Speedy отказва пратката с „Детайли за ОПП: Опциите преди плащане/получаване не са позволени за държавата на получателя“ (поръчка до Гърция, isd-bg.com, 29.09.2026). Както при доставка до автомат,
obpdотпада изцяло: и конфигурираният default (accept_options), и ръчно избраната в диалога опция. - Диалогът за товарителница не предлага опция извън BG. В България нищо не се променя.
- ⚠️ Не е проверено с реална товарителница до чужбина (създаване и отказ).
При деплой
heading.anchorLabel- Няма нови зависимости в конструктора, промени в схемата, шаблоните или статичните файлове:
cache:flush.
2.8.2 — 2026-09-29
heading.anchorLabel2.8.2
heading.anchorLabelСпрямо 2.8.1.
Комити (2)
heading.anchorLabelaf0198ffix: извън България куриерът е за сметка на търговеца80ff7efchore: post-release bump to 2.8.2
Бележки
heading.anchorLabel- Извън България куриерът е за сметка на търговеца. Speedy не позволява платец получател за международните услуги и отказва пратката с „Платец: Избраният платец не е позволен за избраната услуга“ (поръчка до Гърция, isd-bg.com, 29.09.2026). При адрес или офис извън BG
RECIPIENTставаSENDER, и от настройката, и от диалога.THIRD_PARTYне се пипа. - С платец подателя наложеният платеж е пълната сума на поръчката (стока + доставка + надбавка за наложен платеж), така че клиентът плаща доставката през наложения платеж.
- Диалогът за товарителница предлага
SENDERпо същото правило. Нов публичен методShipmentRequestBuilder::isCrossBorder(). - ⚠️ Не е проверено с реална товарителница до чужбина (създаване и отказ).
При деплой
heading.anchorLabel- Няма нови зависимости в конструктора, промени в схемата, шаблоните или статичните файлове:
cache:flush.
2.8.1 — 2026-09-29
heading.anchorLabel2.8.1
heading.anchorLabelСпрямо 2.8.0.
Комити (2)
heading.anchorLabeledaeb11fix: адрес извън BG/RO се подава с addressLine1, не с addressNoteeba9a62chore: post-release bump to 2.8.1
Бележки
heading.anchorLabel- Адрес извън България и Румъния се подава с
addressLine1. Speedy води по номенклатура само BG и RO адресите. За всички останали държави иска адресни редове и безaddressLine1отказва пратката с „Получател Адрес 1: Изисква се адрес“ (поръчка до Гърция, isd-bg.com, 29.09.2026). Досега модулът пращаше улицата само вaddressNote. - За BG/RO няма промяна: улицата остава в
addressNote, защото Speedy губеше номера, когато сам разчитаaddressLine1. - Улица над 50 знака се пренася в
addressLine2, като се реже между думи. Улицата, въведена ръчно в диалога за товарителница, минава по същия път. - ⚠️ Не е проверено с реална товарителница до чужбина (създаване и отказ). Лимитът от 50 знака е по документацията на Speedy.
При деплой
heading.anchorLabel- Няма нови зависимости в конструктора, промени в схемата, шаблоните или статичните файлове:
cache:flush.
2.8.0 — 2026-09-26
heading.anchorLabel2.8.0
heading.anchorLabelСпрямо 2.7.0.
Комити (2)
heading.anchorLabel836125fRelease 2.8.059b6451feat: при цени от таблица услугата за товарителницата се избира по дестинация
Бележки
heading.anchorLabel- Услугата за товарителница по дестинация при цени от таблица (
custom_prices). Методът тогава е тип доставка (speedy_address), не услуга. Досега товарителницата взимаше винаги първата разрешена услуга, тоест 505 и за чужбина, и операторът я сменяше на ръка в диалога. Сега услугата е първата разрешена (по реда наallowed_methods), която Speedy връща отservices/destinationза получателя. Пример сallowed_methods= 505,202,302,…: Гърция и Румъния → 202 (CEE Economy), България → 505. Палетните услуги (412, 432, 442…) не се избират, докато са по-назад в реда. - Ако Speedy не отговори или няма съвпадение, остава първата разрешена, както досега. Услугата, избрана в диалога, и услугата в метода (
speedy_505, при API цени) печелят и не питатservices/destination. - Нов клас
Service\DestinationServices. Праща само местоположението на получателя (държава, населено място, пощенски код или офис) и подателя (clientId/dropoffOfficeId).
При деплой
heading.anchorLabel- Конструктор:
ShipmentRequestBuilderима нова зависимост (DestinationServices). Трябваsetup:di:compileи изчистенgenerated/. Автоматичният сигнал отгоре не го хваща. - Няма промени в схемата, в шаблоните и в статичните файлове:
cache:flush.
2.7.0 — 2026-09-25
heading.anchorLabel2.7.0
heading.anchorLabelСпрямо 2.6.1.
Внимание при деплой
heading.anchorLabel- Конструктор: сменена сигнатура на
__construct— при деплоя се чистиgenerated/. - Зависимости:
requireвcomposer.json:webcode/module-carrier:^2.10→^2.12.
Комити (2)
heading.anchorLabel933bf73Release 2.7.0976f519feat(admin): searchable sender office picker
Бележки
heading.anchorLabel- „Choose office“ в конфигурацията на куриера е поле с търсене (UI Select от Webcode_Carrier 2.12.0) вместо
<select>с всички офиси: търсене по град, име, адрес или номер, подредба по град и име, етикет[номер] ГРАД — име, адрес. Model\Config\Source\Officeе изтрит — оттам идва сигналът „Конструктор“ горе; нов конструктор няма. Запазената стойност (office_id) не се променя.- Старият source model викаше живото API на Speedy при всяко отваряне на страницата с настройки.
При деплой
heading.anchorLabel- Изисква
webcode/module-carrier^2.12. Чистиgenerated/и пусниsetup:static-content:deployза adminhtml (заради JS-а в Carrier).
2.6.1 — 2026-09-24
heading.anchorLabel2.6.1
heading.anchorLabelСпрямо 2.6.0.
Внимание при деплой
heading.anchorLabel- Конструктор: сменена сигнатура на
__construct— при деплоя се чистиgenerated/. - Setup: data/schema patch — изпълнява се срещу жива база при
setup:upgrade.
Комити (1)
heading.anchorLabel5275289fix: записът на куриера се възстановява сам (RecurringData), patch-ът е идемпотентен
Бележки
heading.anchorLabel- Записът на куриера в
webcode_carrier_entityсе възстановява сам. Ако таблицата е празна, а отметката наAddSpeedyCarrierEntityPatchе останала вpatch_list(модулът е бил изключван и таблицата е създадена наново), куриерът досега оставаше без запис, докато някой не махне отметката на ръка. Сега новиятSetup\RecurringDataсъздава липсващия запис при всекиsetup:upgrade: неактивен, както и при първа инсталация. AddSpeedyCarrierEntityPatch::apply()е идемпотентен. При махната отметка и съществуващ запис вече не гърми на уникалнияcode.
При деплой
heading.anchorLabel- Уточнение към автоматичните предупреждения: никоя съществуваща сигнатура не е сменена.
__constructе на новия класSetup\RecurringData. В production mode е нуженsetup:di:compileзаради новия клас. - Съществуващият data patch не се пуска наново.
RecurringDataпри всекиsetup:upgradeчете записа поcodeи създава нов само ако липсва. Съществуващ запис, вкл.is_active, не се пипа.
2.6.0 — 2026-09-19
heading.anchorLabel2.6.0
heading.anchorLabelСпрямо 2.5.4.
Внимание при деплой
heading.anchorLabel- Зависимости:
requireвcomposer.json:webcode/module-carrier:^2.9.2→^2.10.
Комити (3)
heading.anchorLabel2380056Release 2.6.04ec04c5chore(carrier-11): изисквай webcode/module-carrier ^2.10890b3f3feat(carrier-11): отказ на товарителница при отказ на поръчка
Бележки
heading.anchorLabelМодулът вече може да анулира товарителницата при отказ на поръчка.
Закача вече съществуващия ShippingLabel::delete() (shipment/cancel), който до момента нямаше нито един извикващ — тоест кодът стоеше, но никога не се изпълняваше.
Включва се от Магазини → Конфигурация → 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.5.4 — 2026-09-18
heading.anchorLabel2.5.4
heading.anchorLabelСпрямо 2.5.3.
Комити (1)
heading.anchorLabel2e01140диалогът за товарителница: не сваляй избрания тип на „до адрес“
2.5.3 — 2026-09-17
heading.anchorLabelfix(address): доставка до адрес вече резолва населеното място вместо да пада в обслужващия офис.
- countryId се маппва от ISO кода на поръчката през CarrierCountryRepository (BG→100), не 0 (Speedy отхвърляше 0 → офис).
- siteName се чисти от префикса “гр.”/“с.” (иначе location/site връщаше празен списък → офис).
Засягаше ВСЯКА Speedy доставка до адрес. Изисква module-carrier ^2.9.2.
2.5.2 — 2026-09-16
heading.anchorLabelfix(address): улицата с номера отива в addressNote вместо addressLine1. Speedy печата адреса дословно, тъй че номерът винаги стига до куриера; рутиране по siteId + пощенски код. Поправя доставка до адрес без номер на товарителницата.
2.5.0 — къде принадлежи надбавката и какво пише в съдържанието — 2026-09-09
heading.anchorLabelИзисква webcode/module-carrier ^2.9.0
heading.anchorLabelresolveContents() и isSurchargePartOfDelivery() са нови в базата. Старият constraint (^2.8.1) допускаше 2.8.x и билдът щеше да пада с undefined method.
Cash-on-Delivery Surcharge (carriers/speedy/surcharge_scope)
- Part of the delivery — по подразбиране. Клиентът дължи наложен платеж за стоката; доставката с надбавката ѝ се събира от куриера.
- Part of the order — надбавката остава в сумата, за търговец, който иска разбивката на цената на доставка да се вижда.
Действа само при платец получателя — иначе няма плащане на гише, което да следва.
⚠️ Промяна в поведението. Магазин с Webcode_Surcharge и платец получателя ще започне да издава товарителници с по-нисък наложен платеж. За 000020909: 98.06 → 96.90.
Parcel Contents (carriers/speedy/contents_template) — какво декларира товарителницата като съдържание. {increment_id} става номерът на поръчката (Поръчка 000020909); празно оставя списъка с артикулите, както досега.
Решение, което си струва да се знае
heading.anchorLabelПроверката е за изричното order, не за delivery, тъй че подразбиращото се живее в кода, а etc/config.xml само го документира. Обратното би направило сумата, която куриерът събира от клиента, зависима от това дали конфигът се е заредил.
2.4.2 — 2026-09-05
heading.anchorLabelПоправено
heading.anchorLabel- Колоната Location в tracking popup-а вече не е празна.
Carrier::getTrackingInfo()пълнешеdeliverylocationотcomment— свободен текст, който Speedy не връща за повечето операции, тъй че колоната излизаше празна практически винаги. Правилното поле еplace— единственото вTrackedParcelOperation, което носи място (https://api.speedy.bg/v1/schema). Добавен регресионен тест. bin/magento config:set carriers/speedy/senderвече работи. Групата вsystem.xmlсе казвашеsender, колкото и пътят на полетоclient_id. Magento резолвира по структурен път и попадаше в ГРУПАТА вместо в поле, тъй че полето беше недостижимо от CLI — за deploy скриптове и за всяка настройка извън админ формата. В админа работеше, затова дефектът беше невидим. Групата е преименувана; и шестте полета носят изриченconfig_path, тъй че нито една съхранена стойност не се осиротява.
Тестове
heading.anchorLabelTest/Unit: 58 теста, 165 assertions. PHPCS Magento2: 0 errors.
2.4.1 — 2026-08-31
heading.anchorLabelПоправено
heading.anchorLabelActiveGuardчетеше подателя от грешния config-leaf. Проверката „има ли попълнен подател“ гледаше не там, където полето пази стойността си, тъй че gate-ът при пускане в експлоатация съдеше по празно. Сега четеsender.
2.4.0 — 2026-08-28
heading.anchorLabel- Магазинът избира кой плаща доставката. Payer политиката е споделена с останалите куриери през
module-carrier(вече изисква^2.8) и се подава при заявка за товарителница; изборът стои и в диалога „Create Shipping Label“. - Полетата на подателя са задължителни при пускане в експлоатация. Нов
Model/Config/Backend/ActiveGuardне дава Speedy да се включи с празен подател, вместо конфигурацията да мине и заявките да падат по-късно. - Вход в Speedy със запазените креденшъли от админ контролера, без повторно въвеждане.
2.3.2 — 2026-08-25
heading.anchorLabelRegister carriers/speedy/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.3.1 — 2026-08-21
heading.anchorLabelSpeedy 2.3.1
heading.anchorLabel- Етикетът на метода в checkout вече показва само бранда и типа доставка (напр. „Speedy - До офис на куриер“), без името на услугата от API-то („СТАНДАРТ 24 ЧАСА“). Клиентите четяха услугата като срок за доставка и си търсеха пратката „след 24 часа“.
- Махната неизползваната вече зависимост
CarrierServiceотModel\Carrier.
Инвариантът „carrierTitle = конфигурираното заглавие“ живее в
Webcode_Carrier (2.7.1) и важи за всички куриери; тук е само cleanup-ът.
2.2.4 — 2026-08-19
heading.anchorLabelПоправено
heading.anchorLabelSpeedy отхвърляше товарителниците за частни лица.
Получател Лице за контакт: Не се очаква име на контакт
Второ затягане на валидацията за един ден. Сутринта API-то поиска име на
получателя (2.2.3 добави clientName), а следобед започна да отхвърля
contactName при privatePerson — частното лице Е получателят, лице за
контакт не се очаква.
Затова името се подава единствено като clientName. Това удовлетворява и
двете правила.
sender.contactName остава непроменен — той е за подателя и е друго поле.
Как се разпозна
heading.anchorLabelМерено на bilki.bg 19.08.2026, при непроменен код и payload:
| 6 успешни товарителници | 14:53 … 15:21 |
| 2 провала | 15:25, 15:28 |
Разграничителят е времето, не поръчката и не офисът — проверено, че трите payload-а са структурно еднакви.
Тестове
heading.anchorLabeltestRecipientCarriesClientNameAlongsideContactName е преработен:
clientName присъства, contactName отсъства (assertArrayNotHasKey).
2.2.3 — 2026-08-19
heading.anchorLabelПоправено
heading.anchorLabelТеглото на пратката идва от поръчката, не от конфигурацията
heading.anchorLabelbuildContent() подаваше default_weight винаги, когато няма override — тоест
при масово генериране и при автоматичното създаване. Реалното тегло на поръчката
се игнорираше и куриерът дотаксуваше. Дефектът е невидим: нищо не гърми, нищо не
влиза в лог, товарителницата просто тръгва лека.
Мерено на bilki.bg, поръчки със Speedy за 30 дни: средно 1.41 кг, максимум
44.13 кг, а 764 от 1756 (43%) над 1 кг при default_weight = 1.
Редът става override → тегло на поръчката → default_weight, по модела на
BoxNow — единственият от петте куриера, който го правеше правилно. Същата
поправка влезе и в Econt 2.3.1, Evropat и PostOne.
Идентичност на получателя — clientName
heading.anchorLabelВлезе с 2.2.2 (!23) и се пренася тук: Speedy отказваше всяка товарителница с
„Получател: Необходимо е да бъде подадено или id или име на получател“, след като
на 19.08.2026 затегна валидацията. contactName е лице за контакт и не
удовлетворява идентичността.
Кой трябва да я вземе
heading.anchorLabelВсяка инсталация на 2.x — при 1.0.x ShippingLabel::create() няма извикващ, тоест
товарителници оттам не се генерират.
2.2.2 — 2026-08-19
heading.anchorLabelПоправено
heading.anchorLabelSpeedy отказваше всяка товарителница. От 19.08.2026 API-то вали с
Получател: Необходимо е да бъде подадено или id или име на получател
при непроменен наш код. По Speedy ClientDTO идентичността на получателя е
clientId или clientName; contactName е лице за контакт и вече не я
удовлетворява. buildRecipient() сега подава и двете полета с една и съща
стойност, с непроменения fallback към firstname + lastname.
Доказано срещу живото API: същата поръчка отказана без полето и приета с него.
Засяга всяка инсталация на 2.x — при 1.0.x ShippingLabel::create() няма
извикващ, тоест товарителници оттам не са се генерирали.
2.2.0 — 2026-07-28
heading.anchorLabelPopulate webcode_directory_city.region_id during Speedy city taxonomy sync via Webcode Carrier RegionResolver, on create and as self-heal for existing rows. Requires carrier ^2.6.
2.1.0 — 2026-07-28
heading.anchorLabelDelivery Methods config cleanup:
- API base URL default живее в etc/config.xml (carriers/speedy/api_url), не като PHP const; override през config:set / env.php / DB.
- Креденшълите (username/password) вече не са required за Save на секцията; валидацията е бутонът Login & Configure.
2.0.1 — 2026-07-24
heading.anchorLabelSpeedy checkout place-order integration test matrix: 2 pricing modes x guest/customer x address/office/aps + COD + rival-carrier + estimate-preserves-choice regression. SpeedyApiStub (no live API).