Новости
This content is not available in your language yet.
2.8.2 — 2026-10-02
heading.anchorLabel2.8.2
heading.anchorLabelСпрямо 2.8.1.
Комити (3)
heading.anchorLabel5dc4a92fix: надбавката за наложен платеж влиза в реда „Доставка“ на описа14efb66fix: описът се закръгля с пренос, за да е равен на наложения платеж
Бележки
heading.anchorLabel- Описът (packingList) е точно равен на наложения платеж. Отстъпката (купон, точки лоялност) идва по редовете с 4 знака, а всеки ред се закръгляше поотделно — aptekanove 000089738: опис 61.45 срещу НП 61.43 → HTTP 517 „Сумата на наложения платеж е различна от сумата по описа“. Сега — закръгляне с пренос.
- Надбавката за наложен платеж (Webcode_Surcharge) е в реда „Доставка“, доколкото е в наложения платеж (доставка + надбавка = една сума). Диалогът: сумата на реда следва избрания платец.
При деплой
heading.anchorLabelНищо специално. Диалогът за ръчна товарителница изисква webcode/module-carrier ≥ 2.14.6 за същото закръгляне.
2.8.1 — 2026-09-30
heading.anchorLabel2.8.1
heading.anchorLabelСпрямо 2.8.0.
Комити (1)
heading.anchorLabelef2cd6dfix: taxonomy:sync обявява само поддържаните типове (econt-2)
Бележки
heading.anchorLabelecont:taxonomy:syncобявява само поддържаните типове (econt-2): помощта изброявашеstateиcomplex, street, block, POI, които командата отказва с „Invalid Data Type“. Сега:country,cityилиoffice. Поведението на синхронизацията не е променено.
При деплой
heading.anchorLabel- Без промени в базата, DI или статичното съдържание.
2.8.0 — 2026-09-25
heading.anchorLabel2.8.0
heading.anchorLabelСпрямо 2.7.2.
Внимание при деплой
heading.anchorLabel- Конструктор: сменена сигнатура на
__construct— при деплоя се чистиgenerated/. - Зависимости:
requireвcomposer.json:webcode/module-carrier:^2.10→^2.12.
Комити (2)
heading.anchorLabelb5c6515Release 2.8.03916ea6feat(admin): searchable sender office picker
Бележки
heading.anchorLabel- „Choose office“ в конфигурацията на куриера е поле с търсене (UI Select от Webcode_Carrier 2.12.0) вместо
<select>с всички офиси: търсене по град, име, адрес или номер, подредба по град и име, етикет[номер] ГРАД — име, адрес. Model\Config\Source\Officeе изтрит — оттам идва сигналът „Конструктор“ горе; нов конструктор няма. Запазената стойност (office_id) не се променя.- Важи и за „Office“ при наложен платеж (
money_transfer_office_id). Старият source model показваше само офисите в един град (зашитcity_id 602).
При деплой
heading.anchorLabel- Изисква
webcode/module-carrier^2.12. Чистиgenerated/и пусниsetup:static-content:deployза adminhtml (заради JS-а в Carrier).
2.7.2 — 2026-09-24
heading.anchorLabel2.7.2
heading.anchorLabelСпрямо 2.7.1.
Внимание при деплой
heading.anchorLabel- Конструктор: сменена сигнатура на
__construct— при деплоя се чистиgenerated/. - Setup: data/schema patch — изпълнява се срещу жива база при
setup:upgrade.
Комити (1)
heading.anchorLabel7cec449fix: записът на куриера се възстановява сам (RecurringData), patch-ът е идемпотентен
Бележки
heading.anchorLabel- Записът на куриера в
webcode_carrier_entityсе възстановява сам. Ако таблицата е празна, а отметката наAddEcontCarrierEntityPatchе останала вpatch_list(модулът е бил изключван и таблицата е създадена наново), куриерът досега оставаше без запис, докато някой не махне отметката на ръка. Сега новиятSetup\RecurringDataсъздава липсващия запис при всекиsetup:upgrade: неактивен, както и при първа инсталация. AddEcontCarrierEntityPatch::apply()е идемпотентен. При махната отметка и съществуващ запис вече не гърми на уникалнияcode.
При деплой
heading.anchorLabel- Уточнение към автоматичните предупреждения: никоя съществуваща сигнатура не е сменена.
__constructе на новия класSetup\RecurringData. В production mode е нуженsetup:di:compileзаради новия клас. - Съществуващият data patch не се пуска наново.
RecurringDataпри всекиsetup:upgradeчете записа поcodeи създава нов само ако липсва. Съществуващ запис, вкл.is_active, не се пипа.
2.7.1 — 2026-09-24
heading.anchorLabel2.7.1
heading.anchorLabelСпрямо 2.7.0.
Комити (4)
heading.anchorLabel80479b3Merge branch ‘rate-skip-empty-city’ into ‘master’24ffc49test: set readonly deps via ReflectionProperty (PHPStan)e6884c1fix(rates): don’t ask Econt for a door rate without a receiver city45bbadachore: post-release bump to 2.7.1
2.6.6 — 2026-09-24
heading.anchorLabel2.6.6
heading.anchorLabelСпрямо 2.6.5. Линия 2.6 (Carrier ^2.9.2) — за магазини без Carrier 2.10.
Комити (3)
heading.anchorLabela1053f1Release 2.6.63d12753test: set readonly deps via ReflectionProperty (PHPStan)960cc34fix(rates): don’t ask Econt for a door rate without a receiver city
2.7.0 — 2026-09-19
heading.anchorLabel2.7.0
heading.anchorLabelСпрямо 2.6.5.
Внимание при деплой
heading.anchorLabel- Зависимости:
requireвcomposer.json:webcode/module-carrier:^2.9.2→^2.10.
Комити (3)
heading.anchorLabelf26ce10Release 2.7.0d97c026chore(carrier-11): изисквай webcode/module-carrier ^2.10e6524affeat(carrier-11): отказ на товарителница при отказ на поръчка
Бележки
heading.anchorLabelМодулът вече може да анулира товарителницата при отказ на поръчка.
Празният stub ShippingLabel::delete() (без аргументи) става истински: LabelService.deleteLabels.
⚠️ Еконт е единственият куриер в стека, който съобщава провала със статус HTTP 200 — причината стои в results[].error за всяка товарителница поотделно. Затова тук отговорът се разчита, а не се съди по това дали заявката е хвърлила; липсващ ред за товарителницата се брои за провал, не за успех. Копие на шаблона от другите куриери би оставяло жива товарителница при отказана поръчка, без нито един признак.
Включва се от Магазини → Конфигурация → 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.6.5 — 2026-09-18
heading.anchorLabel2.6.5
heading.anchorLabelСпрямо 2.6.4.
Комити (1)
heading.anchorLabel62237b9диалогът за товарителница: не сваляй избрания тип на „до адрес“
2.6.4 — 2026-09-18
heading.anchorLabel2.6.4
heading.anchorLabelСпрямо 2.6.3.
Комити (1)
heading.anchorLabeld98f2f7опис: price е единична цена, не ред-тотал
2.6.3 — 2026-09-16
heading.anchorLabel- fix(label): непразен inventoryNum на всеки ред от описа
2.6.2 — 2026-09-15
heading.anchorLabel2.6.2
heading.anchorLabel- Опис от поръчката при масово генериране (!32). С включено „Use Itemized Contents“ (
use_items_list) товарителниците без диалог вече носятpackingListот редовете на поръчката плюс доставката (освен ако я плаща получателят). Без него споразумение за НП по департамент се отхвърляше: HTTP 517 „Необходимо е да въведете данни за фактура или опис за споразумение по департамент.“ - E-fiscal = опис (!33). Мъртвата настройка „E-Fiscal Cash Receipt“ (
fiscal_reciept) отпада; коментарът наuse_items_listказва, че описът е и електронният фискален бон — както при Speedy. - Споразумението за НП без
validate-number(!33). Кодът е във видаCD164850; валидацията пречеше на записа на секцията в админа.
Изключено use_items_list (по подразбиране) → заявката към Еконт е като в 2.6.1.
2.5.2 — 2026-09-09
heading.anchorLabelТоварителницата на Econt за подател юридическо лице пада с HTTP 517 ExInvalidParam: подател: За юридическо лице, задължително се попълва упълномощено лице., защото заявката не носи senderAgent. 2.5.1 прочете това като липсващ senderClient.molName и затова не лекуваше нищо: профилът от getClientProfiles() обикновено вече носи МОЛ-а, а Econt пак отказва.
Мерено срещу живото API в mode=validate (не създава пратка), с профил, който ВЕЧЕ носи molName:
адрес, без senderAgent → 517 За юридическо лице, задължително се попълва упълномощено лице.адрес, + senderAgent → приетаофис, без senderAgent → 517 същотоофис, + senderAgent → приетаEcont го иска независимо откъде тръгва пратката — за офис твърдението обратното дойде от проба с празен senderOfficeCode, който сам по себе си е невалиден (ExInvalidCity).
Какво влиза
senderAgentсе подава като собствен ключ: име от профила (molName) или отcarriers/econt/sender_mol_name, връзка от телефоните на профила (резерваcontact_telephone), иначе е-пощата.- Решаващо е има ли име и връзка, а не какво пише в
juridicalEntity— профил на фирма, който не обявява полето, иначе оставаше без упълномощено лице и товарителницата пак падаше. - Юридическо лице без упълномощено лице никъде спира преди заявката, с указание кое поле да се попълни, вместо да получи 517 без посока.
- Подател физическо лице не се пипа.
Test/Integrationстъб с юридическо лице, МОЛ и телефон — дотогава случаят не се изпитваше изобщо.
MR-и: !26, !29 (!27 и !28 са дубликати, писани паралелно, затворени).
2.5.1 — 2026-09-09
heading.anchorLabelПоправя econt-4: Econt отказваше създаването на товарителница за подател юридическо лице с HTTP 517 — подател: За юридическо лице, задължително се попълва упълномощено лице.
resolveSenderClient() подаваше профила от getClientProfiles() дословно, а той не носи molName. До 2.x модулът го слагаше хардкоднат в кода, заедно с името и клиентския номер на конкретна фирма — тоест всеки друг магазин пращаше чужди данни като подател. С рефактора хардкодът падна без заместник.
Ново поле: Authorised person (MOL) — carriers/econt/sender_mol_name, до избора на клиент.
- профил, който сам носи
molName, печели пред конфигурацията - липсва ли и на двете места, а профилът е юридическо лице → ясна грешка кое поле да се попълни, вместо 517 от Econt
- подател физическо лице минава без промяна
Четири нови теста, единият отрицателна контрола. Стубът дотогава връщаше профил само с id и name — случаят не се е изпитвал изобщо.
2.4.1 — 2026-08-25
heading.anchorLabelRegister carriers/econt/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-19
heading.anchorLabelПоправено
heading.anchorLabelТеглото на пратката идва от поръчката, не от конфигурацията.
buildContent() подаваше default_weight винаги, когато няма override — тоест
при масово генериране и при автоматичното създаване на товарителница. Реалното
тегло на поръчката се игнорираше и куриерът дотаксуваше.
Мерено на bilki.bg (Speedy, 30 дни, същият дефект): средно 1.41 кг, максимум
44.13 кг, а 764 от 1756 поръчки (43%) са над 1 кг при default_weight = 1.
Редът на приоритет става override → тегло на поръчката → default_weight,
по модела на BoxNow, който единствен от петте куриера го правеше правилно.
2.3.0 — 2026-07-28
heading.anchorLabelPopulate webcode_directory_city.region_id during Econt city taxonomy sync via Webcode Carrier RegionResolver, on create and as self-heal for existing rows. Requires carrier ^2.6.
2.2.0 — 2026-07-28
heading.anchorLabelUses the shared resolvePackagesCount() from Webcode\Carrier\Model\AbstractCarrier (min-1 package-count invariant); drops the private copy. Requires webcode/module-carrier ^2.5. Fixes Econt rejecting sub-1kg carts with “Невалиден брой пакети.” and returning no rate methods.
2.1.0 — 2026-07-25
heading.anchorLabelDelivery Methods config cleanup:
- API base URL default живее в etc/config.xml (carriers/econt/api_url), не като PHP const; ShippingLabel::downloadPdf() минава през getConfigValue(api_url) без инлайн fallback.
- Креденшълите (username/password) вече не са 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. - Removed the per-carrier
vat_rateconfig: VAT is now reconciled centrally with the store Shipping Prices setting via the sharedShippingPriceTaxAdjuster(module-carrier). Econt returns the raw with-VAT API price.
Changes
heading.anchorLabel- Econt shipment tracking added; removed the CSS logo class in favour of the shared logo.
money_transfer_methodusesMoneyTransferMethod::OFFICEconstant instead of a string literal.- Namespace refactor;
currency_codetaken fromgetQuoteCurrencyCode.
Chore
heading.anchorLabel- Proprietary/EULA copyright headers standardized across the module.
- Uses
webcode/module-basefor the shared Console command.