]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/log
erp24_rep/yii-erp24/.git
6 weeks agochore: trigger MR creation origin/feature_filippov_ERP-257_heic_already_readable
Aleksey Filippov [Mon, 16 Mar 2026 13:25:26 +0000 (16:25 +0300)]
chore: trigger MR creation

6 weeks agofix(ERP-257): graceful fallback для HEIC-файлов, которые уже являются JPEG
Aleksey Filippov [Mon, 16 Mar 2026 13:17:43 +0000 (16:17 +0300)]
fix(ERP-257): graceful fallback для HEIC-файлов, которые уже являются JPEG

iPhone иногда сохраняет JPEG с расширением .HEIC. Библиотека heic2any
бросала ERR_USER вместо того, чтобы пропустить файл. Теперь при ошибке
"already browser readable" файл передаётся как есть с корректным расширением.

7 weeks agoMerge branch 'feature_filippov_ERP-256_cabinet_last_month_button' into 'develop'
Aleksey Filippov [Fri, 13 Mar 2026 13:21:39 +0000 (13:21 +0000)]
Merge branch 'feature_filippov_ERP-256_cabinet_last_month_button' into 'develop'

feat(ERP-256): добавлена кнопка «за прошлый месяц» на странице ошибки смен

See merge request gitlab-instance/yii-erp24!1137

7 weeks agofeat(ERP-256): добавлена кнопка «за прошлый месяц» на странице ошибки смен origin/feature_filippov_ERP-256_cabinet_last_month_button
Aleksey Filippov [Fri, 13 Mar 2026 13:16:13 +0000 (16:16 +0300)]
feat(ERP-256): добавлена кнопка «за прошлый месяц» на странице ошибки смен

Добавлен $buttonParams2 с диапазоном дат прошлого месяца.
Кнопка отображается рядом с «за неделю» при ошибке cs1.

7 weeks agoMerge branch 'feature_filippov_ERP-254_fix_close_shift_null_fact' into 'develop'
Aleksey Filippov [Sat, 7 Mar 2026 17:59:55 +0000 (17:59 +0000)]
Merge branch 'feature_filippov_ERP-254_fix_close_shift_null_fact' into 'develop'

fix(ERP-254): throw 404 when no open shift found on close

See merge request gitlab-instance/yii-erp24!1135

7 weeks agofix(ERP-254): throw 404 when no open shift found on close origin/feature_filippov_ERP-254_fix_close_shift_null_fact
Aleksey Filippov [Sat, 7 Mar 2026 17:48:54 +0000 (20:48 +0300)]
fix(ERP-254): throw 404 when no open shift found on close

TimetableFactModel::getLast() returns null if no open fact exists
for the admin on the current/previous date. Accessing checkin_start_id
on null caused PHP Warning and 500 response. Now returns proper 404.

7 weeks agoMerge branch 'feature_filippov_20260307_fix_mp_telegram_429' into 'develop'
Aleksey Filippov [Sat, 7 Mar 2026 17:31:11 +0000 (17:31 +0000)]
Merge branch 'feature_filippov_20260307_fix_mp_telegram_429' into 'develop'

fix(marketplace): aggregate missing MarketplaceStore errors before Telegram send

See merge request gitlab-instance/yii-erp24!1134

7 weeks agofix(marketplace): aggregate missing MarketplaceStore errors before Telegram send origin/feature_filippov_20260307_fix_mp_telegram_429
Aleksey Filippov [Sat, 7 Mar 2026 17:18:17 +0000 (20:18 +0300)]
fix(marketplace): aggregate missing MarketplaceStore errors before Telegram send

Instead of sending one Telegram message per order with missing store
inside processOrders() loop, collect unique warehouse GUIDs and send
a single aggregated message after the loop to avoid Telegram 429.

7 weeks agoMerge branch 'feature_fomichev_2026-03-06_TO8-22_promobonuses' into 'develop'
Aleksey Filippov [Fri, 6 Mar 2026 22:53:35 +0000 (22:53 +0000)]
Merge branch 'feature_fomichev_2026-03-06_TO8-22_promobonuses' into 'develop'

fix(TO8-22): is_promo_balance boolean validation in Promocode model

See merge request gitlab-instance/yii-erp24!1133

7 weeks agofix(TO8-22): is_promo_balance boolean validation in Promocode model feature_fomichev_2026-03-06_TO8-22_promobonuses origin/feature_fomichev_2026-03-06_TO8-22_promobonuses
Aleksey Filippov [Fri, 6 Mar 2026 22:52:31 +0000 (01:52 +0300)]
fix(TO8-22): is_promo_balance boolean validation in Promocode model

Колонка is_promo_balance в PostgreSQL — boolean, а валидатор был integer.
PDO возвращает PHP false → IntegerValidator падает: "должно быть целым числом".

7 weeks agoMerge branch 'feature_fomichev_2026-03-06_TO8-22_promobonuses' into 'develop'
Aleksey Filippov [Fri, 6 Mar 2026 15:46:43 +0000 (15:46 +0000)]
Merge branch 'feature_fomichev_2026-03-06_TO8-22_promobonuses' into 'develop'

feat(TO8-22): промокоды БЛАГО — активация и промо-списание бонусов

See merge request gitlab-instance/yii-erp24!1132

7 weeks agoдубликаты
Vladimir Fomichev [Fri, 6 Mar 2026 14:57:12 +0000 (17:57 +0300)]
дубликаты

7 weeks agoблокирование строки
Vladimir Fomichev [Fri, 6 Mar 2026 14:26:51 +0000 (17:26 +0300)]
блокирование строки

7 weeks agoлогирование
Vladimir Fomichev [Fri, 6 Mar 2026 14:23:17 +0000 (17:23 +0300)]
логирование

7 weeks agofix(TO8-22): skip Yii validation on UsersBonus save in activatePromocode
VVF [Fri, 6 Mar 2026 14:18:44 +0000 (17:18 +0300)]
fix(TO8-22): skip Yii validation on UsersBonus save in activatePromocode

Множество полей БД (dell, status, check_id и др.) не имеют дефолтов
на уровне модели. save(false) пропускает валидацию Yii — аналогично
actionSale() строка 902.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
7 weeks agoMerge remote-tracking branch 'origin/feature_fomichev_2026-03-06_TO8-22_promobonuses...
Vladimir Fomichev [Fri, 6 Mar 2026 14:01:16 +0000 (17:01 +0300)]
Merge remote-tracking branch 'origin/feature_fomichev_2026-03-06_TO8-22_promobonuses' into feature_fomichev_2026-03-06_TO8-22_promobonuses

8 weeks agofix(TO8-22): нормализация окончаний строк CRLF→LF
VVF [Fri, 6 Mar 2026 13:45:41 +0000 (16:45 +0300)]
fix(TO8-22): нормализация окончаний строк CRLF→LF

Файлы были сохранены с CRLF из-за WSL, конвертированы в LF
для чистого diff в MR.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoудаление
Vladimir Fomichev [Fri, 6 Mar 2026 12:57:46 +0000 (15:57 +0300)]
удаление

8 weeks agoудаление
Vladimir Fomichev [Fri, 6 Mar 2026 12:57:46 +0000 (15:57 +0300)]
удаление

8 weeks agofix(TO8-22): критические исправления промо-списания БЛАГО по код-ревью
VVF [Fri, 6 Mar 2026 12:46:54 +0000 (15:46 +0300)]
fix(TO8-22): критические исправления промо-списания БЛАГО по код-ревью

Исправлены баги, выявленные при ревью:

1. Race condition: SELECT FOR UPDATE в actionActivatePromocode
2. burn_balans не трогается при промо-списании (только обычные бонусы)
3. user_balans_new не уменьшается при промо (списываются промо-бонусы)
4. writeOffAlready проверяет tip_sale='promobonus' для промо-дедупликации
5. date_end фильтр на promoPlusSum (просроченные промо не учитываются)
6. Обновление полей пользователя на промо early-return пути
7. Использование promocode.duration вместо YEAR_PERIOD в активации
8. attributeLabels для activated_by/activated_at в Promocode
9. Убран file_put_contents с промо-пути
10. Тесты обновлены: добавлены проверки баланса, исправлена формула

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agofeat(TO8-22): промокоды БЛАГО — активация и промо-списание бонусов
VVF [Fri, 6 Mar 2026 11:11:42 +0000 (14:11 +0300)]
feat(TO8-22): промокоды БЛАГО — активация и промо-списание бонусов

- Миграция: добавлены поля activated_by, activated_at в таблицу promocode
- Модель Promocode: константа TIP_SALE_PROMOBONUS, метод isActivatable()
- API endpoint actionActivatePromocode(): начисление 350 промо-бонусов с tip_sale='promobonus'
- Модификация actionSale(): автоматический выбор промо-списания vs стандартного, без кэшбека при промо
- Unit-тесты: 15 тестов (isActivatable + алгоритм промо-списания)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_20260304_fix_start_shift_step3_bigint' into 'develop'
Aleksey Filippov [Wed, 4 Mar 2026 17:39:30 +0000 (17:39 +0000)]
Merge branch 'feature_filippov_20260304_fix_start_shift_step3_bigint' into 'develop'

fix(timetable): guard admin_checkin query against empty bigint fields

See merge request gitlab-instance/yii-erp24!1131

8 weeks agofix(timetable): guard admin_checkin query against empty bigint fields origin/feature_filippov_20260304_fix_start_shift_step3_bigint
Aleksey Filippov [Wed, 4 Mar 2026 17:37:33 +0000 (20:37 +0300)]
fix(timetable): guard admin_checkin query against empty bigint fields

Prevent PDO exception when StartForm fields are empty strings — add null
check before querying admin_checkin to avoid PostgreSQL bigint cast error.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_TO8-48_force_readyto_1c_timeout' into 'develop'
Aleksey Filippov [Wed, 4 Mar 2026 17:32:45 +0000 (17:32 +0000)]
Merge branch 'feature_filippov_TO8-48_force_readyto_1c_timeout' into 'develop'

fix(TO8-48): increase session timeout to 4h, add JS keep-alive ping

See merge request gitlab-instance/yii-erp24!1130

8 weeks agofix(TO8-48): increase session timeout to 4h, add JS keep-alive ping origin/feature_filippov_TO8-48_force_readyto_1c_timeout
Aleksey Filippov [Wed, 4 Mar 2026 17:31:25 +0000 (20:31 +0300)]
fix(TO8-48): increase session timeout to 4h, add JS keep-alive ping

Prevent BadRequestHttpException (Unable to verify your data submission)
in WriteOffsErpController caused by PHP session expiry during long form filling.

- erp24/config/web.php: add session component, timeout=14400 (4 hours)
- SiteController: add actionKeepAlive() endpoint for JS ping
- session-keep-alive.js: ping /site/keep-alive every 15 min, pause on hidden tab, skip during upload
- main.php: register session-keep-alive.js globally

8 weeks agoMerge branch 'feature_filippov_TO8-48_force_readyto_1c_timeout' into 'develop'
Aleksey Filippov [Wed, 4 Mar 2026 08:31:06 +0000 (08:31 +0000)]
Merge branch 'feature_filippov_TO8-48_force_readyto_1c_timeout' into 'develop'

fix(TO8-48): send one summary Telegram message instead of per-order

See merge request gitlab-instance/yii-erp24!1129

8 weeks agofix(TO8-48): send one summary Telegram message instead of per-order
Aleksey Filippov [Wed, 4 Mar 2026 08:28:00 +0000 (11:28 +0300)]
fix(TO8-48): send one summary Telegram message instead of per-order

8 weeks agoMerge branch 'feature_filippov_TO8-48_force_readyto_1c_timeout' into 'develop'
Aleksey Filippov [Wed, 4 Mar 2026 08:07:05 +0000 (08:07 +0000)]
Merge branch 'feature_filippov_TO8-48_force_readyto_1c_timeout' into 'develop'

fix(TO8-48): fix PHPDoc syntax error, */5 closes block comment

See merge request gitlab-instance/yii-erp24!1128

8 weeks agofix(TO8-48): fix PHPDoc syntax error, */5 closes block comment
Aleksey Filippov [Wed, 4 Mar 2026 07:59:29 +0000 (10:59 +0300)]
fix(TO8-48): fix PHPDoc syntax error, */5 closes block comment

8 weeks agoMerge branch 'feature_filippov_TO8-48_force_readyto_1c_timeout' into 'develop'
Aleksey Filippov [Wed, 4 Mar 2026 07:23:49 +0000 (07:23 +0000)]
Merge branch 'feature_filippov_TO8-48_force_readyto_1c_timeout' into 'develop'

fix(TO8-48): fix readyto_1c strict comparison, add cron-based timeout check

See merge request gitlab-instance/yii-erp24!1127

8 weeks agofix(TO8-48): fix readyto_1c strict comparison, add cron-based timeout check
Aleksey Filippov [Wed, 4 Mar 2026 07:09:54 +0000 (10:09 +0300)]
fix(TO8-48): fix readyto_1c strict comparison, add cron-based timeout check

- Fix `checkAndSetReadyTo1c()`: cast `readyto_1c` to int before strict
  comparison — PostgreSQL returns string "0", so `!== 0` always skipped
- Add `forceReadyTo1cByTimeout()`: batch-marks orders older than 15 min
  as ready for 1C export, independent of incoming FlowWow emails
- Add console action `marketplace/check-ready-to-1c` for cron (*/5)
- Add unit tests for both string and int readyto_1c values

8 weeks agoMerge branch 'feature_filippov_20260303_fix_delivery_house_length' into 'develop'
Aleksey Filippov [Tue, 3 Mar 2026 19:43:59 +0000 (19:43 +0000)]
Merge branch 'feature_filippov_20260303_fix_delivery_house_length' into 'develop'

fix: widen delivery text cleanup regex, cap house to 16 chars

See merge request gitlab-instance/yii-erp24!1126

8 weeks agofix: widen delivery text cleanup regex, cap house to 16 chars origin/feature_filippov_20260303_fix_delivery_house_length
Aleksey Filippov [Tue, 3 Mar 2026 19:42:33 +0000 (22:42 +0300)]
fix: widen delivery text cleanup regex, cap house to 16 chars

- Change regex from matching only "Уточните адрес доставки" to
  "Уточните \S+ доставки" to catch "время", "дату", etc.
- Add mb_substr guard: house field capped at 16 characters (DB limit)
- Fixes: "house should contain at most 16 characters" validation error

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_ERP-252_fix_delivery_street_parsing' into 'develop'
Aleksey Filippov [Mon, 2 Mar 2026 21:03:01 +0000 (21:03 +0000)]
Merge branch 'feature_filippov_ERP-252_fix_delivery_street_parsing' into 'develop'

fix(ERP-252): safe serialization of deliveryText in logs (array to string fix)

See merge request gitlab-instance/yii-erp24!1125

8 weeks agofix(ERP-252): use district as street fallback, add prod data fixtures origin/feature_filippov_ERP-252_fix_delivery_street_parsing
Aleksey Filippov [Mon, 2 Mar 2026 20:53:47 +0000 (23:53 +0300)]
fix(ERP-252): use district as street fallback, add prod data fixtures

YM API often returns address without street but with district
(e.g., "микрорайон Красногорка"). Now uses district as street fallback.

Added 6 test cases based on real production data:
- #4497: no street, has district (Бор, микрорайон Красногорка)
- #3519: has street (улица Генерала Зимина)
- #4328: district only (микрорайон Щербинки-1)
- #4297: no street, no district (деревня Анкудиновка)
- STRING format with "Уточните время"
- NULL delivery in raw_data

26 tests, 133 assertions — all passing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agofix(ERP-252): extract fillDeliveryAddressFallback method, eliminate duplication
Aleksey Filippov [Mon, 2 Mar 2026 20:45:48 +0000 (23:45 +0300)]
fix(ERP-252): extract fillDeliveryAddressFallback method, eliminate duplication

- New method fillDeliveryAddressFallback() handles 3 raw_data formats:
  1) string (FlowWow text) → parseAddressFromDeliveryText()
  2) array with address (YM API JSON) → extract structured fields
  3) null/missing → defaults "Уточняется"
- Replaced 3 inline fallback blocks with single method call
- Fixed surprise-delivery parsing ("Отправим смс получателю...")
- 20 unit tests, 115 assertions — all passing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agofix(ERP-252): add delivery parsing tests and fix surprise-delivery pattern
Aleksey Filippov [Mon, 2 Mar 2026 20:30:48 +0000 (23:30 +0300)]
fix(ERP-252): add delivery parsing tests and fix surprise-delivery pattern

12 unit tests for parseAddressFromDeliveryText() covering:
- Full address (city/street/house)
- "Уточните адрес у получателя" pattern
- Surprise SMS delivery ("Отправим смс получателю...")
- Empty strings, prefix-only, unknown cities
- GPS coordinates for known cities
- Pickup delivery, two-word cities
- Result structure validation (all keys, no nulls)

Fixed parser: added filters for surprise-delivery phrases
that were incorrectly parsed as street names.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agofix(ERP-252): safe serialization of deliveryText in logs (array to string fix)
Aleksey Filippov [Mon, 2 Mar 2026 20:25:19 +0000 (23:25 +0300)]
fix(ERP-252): safe serialization of deliveryText in logs (array to string fix)

$rawData['delivery'] can be array (JSON object), not just string.
Use json_encode for non-string values in log messages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_ERP-252_fix_delivery_street_parsing' into 'develop'
Aleksey Filippov [Mon, 2 Mar 2026 20:20:33 +0000 (20:20 +0000)]
Merge branch 'feature_filippov_ERP-252_fix_delivery_street_parsing' into 'develop'

fix(ERP-252): fallback when address object exists but street is empty

See merge request gitlab-instance/yii-erp24!1124

8 weeks agofix(ERP-252): fallback when address object exists but street is empty
Aleksey Filippov [Mon, 2 Mar 2026 20:17:24 +0000 (23:17 +0300)]
fix(ERP-252): fallback when address object exists but street is empty

$delivery->getAddress() returns non-null object with empty street field.
Changed from if/else to unconditional check: if street is still empty
after structured address fill, apply parseAddressFromDeliveryText()
or "Уточняется" defaults. Markers updated to [ERP-252-v3].

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_ERP-252_fix_delivery_street_parsing' into 'develop'
Aleksey Filippov [Mon, 2 Mar 2026 20:06:00 +0000 (20:06 +0000)]
Merge branch 'feature_filippov_ERP-252_fix_delivery_street_parsing' into 'develop'

fix(ERP-252): add [ERP-252-v2] markers to verify deployment

See merge request gitlab-instance/yii-erp24!1123

8 weeks agofix(ERP-252): add unique markers [DELIVERY-SAVE-1/2/3] to each error location
Aleksey Filippov [Mon, 2 Mar 2026 20:02:37 +0000 (23:02 +0300)]
fix(ERP-252): add unique markers [DELIVERY-SAVE-1/2/3] to each error location

8 weeks agofix(ERP-252): add [ERP-252-v2] markers to verify deployment
Aleksey Filippov [Mon, 2 Mar 2026 20:00:05 +0000 (23:00 +0300)]
fix(ERP-252): add [ERP-252-v2] markers to verify deployment

Temporary logging to confirm new code is running on production.
Search for "[ERP-252-v2]" in logs to verify.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_ERP-252_fix_delivery_street_parsing' into 'develop'
Aleksey Filippov [Mon, 2 Mar 2026 19:44:38 +0000 (19:44 +0000)]
Merge branch 'feature_filippov_ERP-252_fix_delivery_street_parsing' into 'develop'

fix(ERP-252): parse delivery address from text when API returns no structured address

See merge request gitlab-instance/yii-erp24!1122

8 weeks agofix(ERP-251): parse delivery address from text when API returns no structured address
Aleksey Filippov [Mon, 2 Mar 2026 19:16:55 +0000 (22:16 +0300)]
fix(ERP-251): parse delivery address from text when API returns no structured address

Some orders (FlowWow) have delivery info as free text in raw_data
instead of structured address fields. When $delivery->getAddress()
returns null, fallback to parseAddressFromDeliveryText() to extract
city/street/house from the text. Applied in all 3 delivery creation
points in processOrders().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_ERP-251_fix_delivery_house_length' into 'develop'
Aleksey Filippov [Mon, 2 Mar 2026 15:50:25 +0000 (15:50 +0000)]
Merge branch 'feature_filippov_ERP-251_fix_delivery_house_length' into 'develop'

fix(20260302): cast time() to string for request_id in LogService calls

See merge request gitlab-instance/yii-erp24!1121

8 weeks agofix(20260302): cast time() to string for request_id in LogService calls
Aleksey Filippov [Mon, 2 Mar 2026 15:46:50 +0000 (18:46 +0300)]
fix(20260302): cast time() to string for request_id in LogService calls

ApiLogs.request_id validates as string, but time() returns int causing
"Значение «Request ID» должно быть строкой" validation error on every request.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_ERP-251_fix_delivery_house_length' into 'develop'
Aleksey Filippov [Mon, 2 Mar 2026 15:27:12 +0000 (15:27 +0000)]
Merge branch 'feature_filippov_ERP-251_fix_delivery_house_length' into 'develop'

fix(ERP-251): replace file_put_contents with Yii logging in DataBuhController

See merge request gitlab-instance/yii-erp24!1120

8 weeks agofix(ERP-251): replace file_put_contents with Yii logging in DataBuhController
Aleksey Filippov [Mon, 2 Mar 2026 15:14:27 +0000 (18:14 +0300)]
fix(ERP-251): replace file_put_contents with Yii logging in DataBuhController

Hardcoded path /var/www/erp24/api2/json_buh does not exist on deploy
server (/var/www/erp24_deploy/), causing file_put_contents errors.
Replace debug file dumps with Yii::info/Yii::error under 'buh.upload'
category. Request data is already persisted via ApiCronBuh model.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_ERP-251_fix_delivery_house_length' into 'develop'
Aleksey Filippov [Mon, 2 Mar 2026 15:07:35 +0000 (15:07 +0000)]
Merge branch 'feature_filippov_ERP-251_fix_delivery_house_length' into 'develop'

fix(ERP-251): improve delivery address parsing from FlowWow emails

See merge request gitlab-instance/yii-erp24!1119

8 weeks agofix(ERP-251): improve delivery address parsing from FlowWow emails
Aleksey Filippov [Mon, 2 Mar 2026 15:01:39 +0000 (18:01 +0300)]
fix(ERP-251): improve delivery address parsing from FlowWow emails

parseAddressFromDeliveryText() did a naive comma-split on raw
deliveryText, treating date/time fragments and instructions like
"Уточните адрес доставки у получателя" as address fields. This caused
house field to exceed the 16-char DB column limit.

Now strips delivery type prefix, date/time patterns, and non-address
phrases before splitting. Handles 1-2 part addresses gracefully
instead of requiring 3+ comma-separated parts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_ERP-251_fix_bonus_log_permission' into 'develop'
Aleksey Filippov [Mon, 2 Mar 2026 12:28:35 +0000 (12:28 +0000)]
Merge branch 'feature_filippov_ERP-251_fix_bonus_log_permission' into 'develop'

fix(ERP-251): replace file_put_contents with Yii::info() in BonusController

See merge request gitlab-instance/yii-erp24!1118

8 weeks agofix(ERP-251): replace file_put_contents with Yii::info() in BonusController origin/feature_filippov_ERP-251_fix_bonus_log_permission
Aleksey Filippov [Mon, 2 Mar 2026 10:25:36 +0000 (13:25 +0300)]
fix(ERP-251): replace file_put_contents with Yii::info() in BonusController

Replace USERS_AUTH_CALL_LOG2 file writes that caused permission denied
errors on production with standard Yii::info() logging under
'bonus.auth' category. Remove unused $LOG and $USERS_AUTH_CALL_LOG2
static properties.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_ERP-250_fix_writeoffs_null_check' into 'develop'
Aleksey Filippov [Mon, 2 Mar 2026 08:18:32 +0000 (08:18 +0000)]
Merge branch 'feature_filippov_ERP-250_fix_writeoffs_null_check' into 'develop'

fix(ERP-250): add null check for WriteOffsErp model in actionUpdate

See merge request gitlab-instance/yii-erp24!1117

8 weeks agofix(ERP-250): add null check for WriteOffsErp model in actionUpdate origin/feature_filippov_ERP-250_fix_writeoffs_null_check
Aleksey Filippov [Mon, 2 Mar 2026 08:16:52 +0000 (11:16 +0300)]
fix(ERP-250): add null check for WriteOffsErp model in actionUpdate

$query->one() can return null when the record is deleted, sent to 1C,
or the user has no store access. Without the check, line 1076 crashes
with "Call to a member function getRelation() on null".

Now throws NotFoundHttpException (404) as documented in the PHPDoc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8 weeks agoMerge branch 'feature_filippov_ERP-248_fix_store_scope' into 'develop'
Aleksey Filippov [Sun, 1 Mar 2026 19:54:24 +0000 (19:54 +0000)]
Merge branch 'feature_filippov_ERP-248_fix_store_scope' into 'develop'

fix(ERP-248): move $store lookup before if/else to fix undefined variable

See merge request gitlab-instance/yii-erp24!1116

8 weeks agofix(ERP-248): move $store lookup before if/else to fix undefined variable origin/feature_filippov_ERP-248_fix_store_scope
Aleksey Filippov [Sun, 1 Mar 2026 19:52:15 +0000 (22:52 +0300)]
fix(ERP-248): move $store lookup before if/else to fix undefined variable

$store was defined only inside the "new order" block (line 1252), but
referenced in 5 places inside the "existing order" else-block (lines
1692, 1735, 1770, 1828, 2017), causing "Undefined variable $store"
on production.

Moved $warehouseGuid and $store assignment before the if/else split
so both branches share the same variable scope.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-248_fix_subsidy_fallback' into 'develop'
Aleksey Filippov [Sat, 28 Feb 2026 21:25:16 +0000 (00:25 +0300)]
Merge branch 'feature_filippov_ERP-248_fix_subsidy_fallback' into 'develop'

2 months agofix(ERP-248): add partner_warehouse_id field to marketplace-store form origin/feature_filippov_ERP-248_fix_subsidy_fallback
Aleksey Filippov [Sat, 28 Feb 2026 21:20:37 +0000 (00:20 +0300)]
fix(ERP-248): add partner_warehouse_id field to marketplace-store form

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agofix(ERP-248): use marketplace_store.partner_warehouse_id as fallback for DBS orders
Aleksey Filippov [Sat, 28 Feb 2026 21:15:10 +0000 (00:15 +0300)]
fix(ERP-248): use marketplace_store.partner_warehouse_id as fallback for DBS orders

Add partner_warehouse_id column to marketplace_store table for storing
the physical YM warehouse ID (e.g. 206008) separate from warehouse_guid
(campaign ID 142743530). Use it as fallback when getPartnerWarehouseId()
returns null for DBS orders instead of the incorrect warehouse_guid.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agofix(ERP-248): fallback subsidy from subsidies[] when getSubsidy() returns null
Aleksey Filippov [Sat, 28 Feb 2026 20:52:41 +0000 (23:52 +0300)]
fix(ERP-248): fallback subsidy from subsidies[] when getSubsidy() returns null

YandexMarket deprecated the item-level `subsidy` field and stopped sending
it for some order types (DBS). Instead, subsidy is now in `subsidies[]`.

When getSubsidy() returns null:
- sum amounts from getSubsidies() array
- log Yii::warning with calculated value

When getPartnerWarehouseId() returns null:
- fall back to marketplace_order.warehouse_guid (valid for DBS orders)
- only Yii::error if warehouse_guid is also null

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_fix_write_offs_erp_delete_video_csrf' into 'develop'
Aleksey Filippov [Sat, 28 Feb 2026 20:35:55 +0000 (20:35 +0000)]
Merge branch 'feature_filippov_fix_write_offs_erp_delete_video_csrf' into 'develop'

fix: add _csrf token to delete-video AJAX in write_offs_erp form

See merge request gitlab-instance/yii-erp24!1115

2 months agofix: add _csrf token to delete-video AJAX in write_offs_erp form origin/feature_filippov_fix_write_offs_erp_delete_video_csrf
Aleksey Filippov [Sat, 28 Feb 2026 20:34:13 +0000 (23:34 +0300)]
fix: add _csrf token to delete-video AJAX in write_offs_erp form

POST request to write-offs-erp/delete-video was missing _csrf token,
causing 400 BadRequestHttpException on every video removal.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-247_add_delivery_logging' into 'develop'
Aleksey Filippov [Sat, 28 Feb 2026 20:02:05 +0000 (20:02 +0000)]
Merge branch 'feature_filippov_ERP-247_add_delivery_logging' into 'develop'

fix(ERP-247): remove debug Yii::error срок доставки logs from MarketplaceService

See merge request gitlab-instance/yii-erp24!1114

2 months agofix(ERP-247): skip item save on null subsidy/partner_warehouse_id, log Yii::error origin/feature_filippov_ERP-247_add_delivery_logging
Aleksey Filippov [Sat, 28 Feb 2026 19:56:56 +0000 (22:56 +0300)]
fix(ERP-247): skip item save on null subsidy/partner_warehouse_id, log Yii::error

When getSubsidy() or getPartnerWarehouseId() returns null — log error with
orderId + shopSku and skip saving the item (continue) instead of writing
invalid fallback values (0 / 'N/A') to DB.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agofix(ERP-247): change срок доставки log level from info to warning for Loki visibility
Aleksey Filippov [Sat, 28 Feb 2026 19:44:02 +0000 (22:44 +0300)]
fix(ERP-247): change срок доставки log level from info to warning for Loki visibility

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agofix(ERP-247): add warning logs for null subsidy/partner_warehouse_id, restore deliver...
Aleksey Filippov [Sat, 28 Feb 2026 19:35:06 +0000 (22:35 +0300)]
fix(ERP-247): add warning logs for null subsidy/partner_warehouse_id, restore delivery info as Yii::info

- Extract getSubsidy() and getPartnerWarehouseId() to local vars in all 6 item-saving blocks
- Log Yii::warning with orderId + shopSku when either returns null
- Restore срок доставки shipments loop (was removed as debug, actually informational)
- Change level from Yii::error to Yii::info for shipment delivery time logging

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agofix(ERP-247): remove debug Yii::error срок доставки logs from MarketplaceService
Aleksey Filippov [Sat, 28 Feb 2026 19:15:29 +0000 (22:15 +0300)]
fix(ERP-247): remove debug Yii::error срок доставки logs from MarketplaceService

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-247_add_delivery_logging' into 'develop'
Aleksey Filippov [Sat, 28 Feb 2026 19:08:16 +0000 (19:08 +0000)]
Merge branch 'feature_filippov_ERP-247_add_delivery_logging' into 'develop'

fix(ERP-247): improve delivery save error logging in MarketplaceService

See merge request gitlab-instance/yii-erp24!1113

2 months agofix(ERP-247): improve delivery save error logging in MarketplaceService
Aleksey Filippov [Sat, 28 Feb 2026 18:57:39 +0000 (21:57 +0300)]
fix(ERP-247): improve delivery save error logging in MarketplaceService

- Log deliveryText when type not recognized (was silent return false)
- Log delivery model errors + deliveryText when model.save() fails
  (previously logged wrong model's errors - marketplaceOrder instead)
- Fix callers to log order id instead of empty marketplaceOrder.getErrors()

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_fix_write_offs_erp_csrf' into 'develop'
Aleksey Filippov [Sat, 28 Feb 2026 18:08:21 +0000 (18:08 +0000)]
Merge branch 'feature_filippov_fix_write_offs_erp_csrf' into 'develop'

fix(ERP-247): add CSRF token to AJAX calls in WriteOffsErp view

See merge request gitlab-instance/yii-erp24!1111

2 months agofix(ERP-247): add CSRF token to AJAX calls in WriteOffsErp view origin/feature_filippov_fix_write_offs_erp_csrf
Aleksey Filippov [Sat, 28 Feb 2026 17:23:29 +0000 (20:23 +0300)]
fix(ERP-247): add CSRF token to AJAX calls in WriteOffsErp view

$.ajax() calls for confirm-write-off and re-send-write-off were posting
without _csrf token, causing BadRequestHttpException 400 on every request.
Added yii.getCsrfToken() to data payload of both calls.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'chore/update-claude-skills' into 'develop'
Aleksey Filippov [Sat, 28 Feb 2026 15:56:53 +0000 (15:56 +0000)]
Merge branch 'chore/update-claude-skills' into 'develop'

chore: update .claude/skills — refactor to <500 lines + references/assets

See merge request gitlab-instance/yii-erp24!1110

2 months agochore: update .claude/skills — refactor to <500 lines + references/assets origin/chore/update-claude-skills
Aleksey Filippov [Sat, 28 Feb 2026 15:52:59 +0000 (18:52 +0300)]
chore: update .claude/skills — refactor to <500 lines + references/assets

- Extracted detailed content from 21 skills into references/ and assets/
- Each SKILL.md now acts as a hub (<500 lines) with JiT-loaded references
- Added new skills: code-review-expert
- Added references/ dirs for: jira-*, github-*, swarm-*, sparc-*, pair-programming, etc.
- Added assets/ dirs for: agentdb-optimization, flow-nexus-platform, github-*, etc.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-246_fix_api1_site_view' into 'develop'
Aleksey Filippov [Sat, 28 Feb 2026 15:25:14 +0000 (15:25 +0000)]
Merge branch 'feature_filippov_ERP-246_fix_api1_site_view' into 'develop'

fix(ERP-246): add missing api1/views/site/index.php to fix ViewNotFoundException

See merge request gitlab-instance/yii-erp24!1109

2 months agofix(ERP-246): replace hardcoded OUT_DIR with relative path in UploadService origin/feature_filippov_ERP-246_fix_api1_site_view
Aleksey Filippov [Sat, 28 Feb 2026 12:02:39 +0000 (15:02 +0300)]
fix(ERP-246): replace hardcoded OUT_DIR with relative path in UploadService

Hardcoded path /var/www/erp24/api2/json caused Permission denied errors
on production when log files were owned by non-www-data users.
Using __DIR__ . '/../api2/json' makes the path deployment-agnostic.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agofix(ERP-246): add missing api1/views/site/index.php to fix ViewNotFoundException
Aleksey Filippov [Sat, 28 Feb 2026 12:01:27 +0000 (15:01 +0300)]
fix(ERP-246): add missing api1/views/site/index.php to fix ViewNotFoundException

api1 and main app share namespace app\controllers, so SiteController
from the main app is accessible via api1. When GET / hits api1, Yii2
routes to SiteController::actionIndex() which calls render('index'),
but api1/views/site/index.php did not exist → ViewNotFoundException (500).

Added empty view file to stop the error. api1 is a REST API (FORMAT_JSON)
so the rendered empty string is JSON-encoded as "".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-245_fix_domru_cams_type_error' into 'develop'
Aleksey Filippov [Sat, 28 Feb 2026 10:42:41 +0000 (10:42 +0000)]
Merge branch 'feature_filippov_ERP-245_fix_domru_cams_type_error' into 'develop'

[ERP-245]: separate broken-file marker from image src URL

See merge request gitlab-instance/yii-erp24!1108

2 months agofix(ERP-245): separate broken-file marker from image src URL origin/feature_filippov_ERP-245_fix_domru_cams_type_error
Aleksey Filippov [Sat, 28 Feb 2026 08:17:53 +0000 (11:17 +0300)]
fix(ERP-245): separate broken-file marker from image src URL

- WriteOffsErp::getImagesList() previously set $imageThumbRow='broken_file-error'
  as sentinel, then built src="/broken_file-error" causing Yii2 to try routing
  it as a controller action → repeated 404 errors in production logs
- Separated marker (kept in $relaFileName for alt/debug) from URL (now points
  to valid static placeholder /images/no-image.svg)
- Added erp24/web/images/no-image.svg: lightweight SVG fallback served by nginx

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-245_fix_domru_cams_type_error' into 'develop'
Aleksey Filippov [Fri, 27 Feb 2026 22:09:33 +0000 (22:09 +0000)]
Merge branch 'feature_filippov_ERP-245_fix_domru_cams_type_error' into 'develop'

fix(ERP-245): add is_array check to second foreach in domru-cams

See merge request gitlab-instance/yii-erp24!1107

2 months agofix(ERP-245): add is_array check to second foreach in domru-cams
Aleksey Filippov [Fri, 27 Feb 2026 22:06:19 +0000 (01:06 +0300)]
fix(ERP-245): add is_array check to second foreach in domru-cams

Same TypeError fix for the second foreach loop that inserts data
into store_visitors table.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-245_fix_domru_cams_type_error' into 'develop'
Aleksey Filippov [Fri, 27 Feb 2026 21:42:36 +0000 (21:42 +0000)]
Merge branch 'feature_filippov_ERP-245_fix_domru_cams_type_error' into 'develop'

[ERP-245]: prevent TypeError when Domru XML has single count element

See merge request gitlab-instance/yii-erp24!1106

2 months agofix(ERP-245): prevent TypeError when Domru XML has single count element
Aleksey Filippov [Fri, 27 Feb 2026 21:38:15 +0000 (00:38 +0300)]
fix(ERP-245): prevent TypeError when Domru XML has single count element

When XML response contains only one count element, json_decode(json_encode($xml))
produces a flat array instead of nested, causing $arr to be a string.
Skip non-array entries to avoid "Cannot access offset of type string on string".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-244_fix_shift_reminder_csrf' into 'develop'
Aleksey Filippov [Fri, 27 Feb 2026 17:28:13 +0000 (17:28 +0000)]
Merge branch 'feature_filippov_ERP-244_fix_shift_reminder_csrf' into 'develop'

[ERP-244]: fix CSRF validation error in ShiftReminderController

See merge request gitlab-instance/yii-erp24!1105

2 months agofix(ERP-244): fix CSRF validation error in ShiftReminderController origin/feature_filippov_ERP-244_fix_shift_reminder_csrf
Aleksey Filippov [Fri, 27 Feb 2026 15:06:41 +0000 (18:06 +0300)]
fix(ERP-244): fix CSRF validation error in ShiftReminderController

- Disable CSRF validation on ShiftReminderController: endpoint is
  protected by session authentication (AccessControl, roles=['@']).
  CSRF cookies may be absent in browsers with strict privacy settings,
  causing false 400 errors for legitimate authenticated users.
- Stop retrying on 400/401/403 responses in shift-reminder.js to prevent
  cascading error floods in logs when auth/validation fails.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-242_fix_domru_xml_validation' into 'develop'
Aleksey Filippov [Thu, 26 Feb 2026 20:17:01 +0000 (20:17 +0000)]
Merge branch 'feature_filippov_ERP-242_fix_domru_xml_validation' into 'develop'

fix(ERP-242): validate XML response from Domru API before parsing

See merge request gitlab-instance/yii-erp24!1104

2 months agoMerge branch 'feature_filippov_ERP-243_fix_timetable_transaction' into 'develop'
Aleksey Filippov [Thu, 26 Feb 2026 20:04:33 +0000 (20:04 +0000)]
Merge branch 'feature_filippov_ERP-243_fix_timetable_transaction' into 'develop'

fix(ERP-243): catch all exceptions in TimetableService transaction rollback

See merge request gitlab-instance/yii-erp24!1103

2 months agofix(ERP-243): catch all exceptions in TimetableService transaction rollback origin/feature_filippov_ERP-243_fix_timetable_transaction
Aleksey Filippov [Thu, 26 Feb 2026 19:58:14 +0000 (22:58 +0300)]
fix(ERP-243): catch all exceptions in TimetableService transaction rollback

catch (Exception) only caught yii\db\Exception, missing
InvalidArgumentException from validation/upload errors. This left
orphaned timetable records with tabel=1 but no timetable_fact entry,
blocking shift reopening.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2 months agofix(ERP-242): validate XML response from Domru API before parsing origin/feature_filippov_ERP-242_fix_domru_xml_validation
Aleksey Filippov [Thu, 26 Feb 2026 18:19:45 +0000 (21:19 +0300)]
fix(ERP-242): validate XML response from Domru API before parsing

- Skip iteration on empty curl response instead of writing empty file
- Use libxml_use_internal_errors to catch invalid XML gracefully
- Auto-create log/text/ directory if missing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_2026-02-26_fix_bubble_png_path' into 'develop'
Aleksey Filippov [Thu, 26 Feb 2026 16:45:28 +0000 (16:45 +0000)]
Merge branch 'feature_filippov_2026-02-26_fix_bubble_png_path' into 'develop'

fix: correct bubble.png path in minified CSS

See merge request gitlab-instance/yii-erp24!1102

2 months agofix: correct bubble.png path in minified CSS origin/feature_filippov_2026-02-26_fix_bubble_png_path
Aleksey Filippov [Thu, 26 Feb 2026 16:43:48 +0000 (19:43 +0300)]
fix: correct bubble.png path in minified CSS

Minified CSS in web/min/ referenced ../images/png/bubble.png which
resolved to a non-existent web/images/png/ directory, causing 404.
Fixed to ../azea/assets/images/png/bubble.png where the file actually exists.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-241_fix_api3_timetable_exception' into 'develop'
Aleksey Filippov [Thu, 26 Feb 2026 15:54:02 +0000 (15:54 +0000)]
Merge branch 'feature_filippov_ERP-241_fix_api3_timetable_exception' into 'develop'

fix(ERP-241): use InvalidArgumentException in TimetableService for proper error display

See merge request gitlab-instance/yii-erp24!1101

2 months agofix(ERP-241): use InvalidArgumentException in TimetableService for proper error display origin/feature_filippov_ERP-241_fix_api3_timetable_exception
Aleksey Filippov [Thu, 26 Feb 2026 15:47:41 +0000 (18:47 +0300)]
fix(ERP-241): use InvalidArgumentException in TimetableService for proper error display

TimetableService threw generic \Exception which EventBehavior couldn't
handle, causing "Произошла неизвестная ошибка" in mobile app instead of
actual validation messages. Changed to InvalidArgumentException (matching
pattern used by all other api3 services) and switched from Json::encode
to firstErrors[0] for human-readable messages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-240_remove_large_files' into 'develop'
Aleksey Filippov [Wed, 25 Feb 2026 13:40:22 +0000 (13:40 +0000)]
Merge branch 'feature_filippov_ERP-240_remove_large_files' into 'develop'

chore(ERP-240): remove large log and csv files from repository

See merge request gitlab-instance/yii-erp24!1100

2 months agochore(ERP-240): remove large log and csv files from repository origin/feature_filippov_ERP-240_remove_large_files
Aleksey Filippov [Wed, 25 Feb 2026 13:18:47 +0000 (16:18 +0300)]
chore(ERP-240): remove large log and csv files from repository

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-236_add_video_player' into 'develop'
Aleksey Filippov [Wed, 25 Feb 2026 12:51:42 +0000 (12:51 +0000)]
Merge branch 'feature_filippov_ERP-236_add_video_player' into 'develop'

feat(ERP-236): refine ConvertVideoController — entity filter, min-age window, proc_open fix

See merge request gitlab-instance/yii-erp24!1099

2 months agofeat(ERP-236): refine ConvertVideoController — entity filter, min-age window, proc_op... feature_filippov_ERP-236_add_video_player origin/feature_filippov_ERP-236_add_video_player
Aleksey Filippov [Wed, 25 Feb 2026 11:23:38 +0000 (14:23 +0300)]
feat(ERP-236): refine ConvertVideoController — entity filter, min-age window, proc_open fix

- Filter by entity=write_offs_products_erp_video (only write-off videos, not all files)
- Add --min-age=2h param: skip files younger than 2h (queue still processing)
- Reduce default --days from 10 to 2 (cron safety net for queue failures)
- Fix PHP hanging: switch from exec/system to proc_open with /dev/null pipes
- Fix timeout: raise from 600s to 1800s for large files
- Update actionStatus: show write-off video stats only (MOV+AVI / MP4)
- Update WriteOffsErp: change border date from -2 month to -1 month
- Add WriteOffsAttachmentsController: sync border_date comment
- Add erp24/docs/diagrams/convert-video-controller.html

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 months agoMerge branch 'feature_filippov_ERP-236_add_video_player' into 'develop'
Aleksey Filippov [Tue, 24 Feb 2026 21:51:08 +0000 (21:51 +0000)]
Merge branch 'feature_filippov_ERP-236_add_video_player' into 'develop'

Изменение формирования списка файлов на удаление до одного месяца. Старше...

See merge request gitlab-instance/yii-erp24!1098

2 months agoИзменение формирования списка файлов на удаление до одного месяца. Старше одного...
Aleksey Filippov [Tue, 24 Feb 2026 21:50:37 +0000 (00:50 +0300)]
Изменение формирования списка файлов на удаление до одного месяца. Старше одного месяца файлы удаляются.

2 months agoMerge branch 'feature_filippov_ERP-236_add_video_player' into 'develop'
Aleksey Filippov [Tue, 24 Feb 2026 20:27:09 +0000 (20:27 +0000)]
Merge branch 'feature_filippov_ERP-236_add_video_player' into 'develop'

auto-claude: subtask-1-1 - Создать FileServiceVideoTest.php с тестами для convertToMp4()

See merge request gitlab-instance/yii-erp24!1097