]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/log
erp24_rep/yii-erp24/.git
5 weeks agoMerge branch 'fix_filippov_batch_sync_pdo_binding' into 'develop'
Aleksey Filippov [Tue, 24 Mar 2026 17:04:00 +0000 (17:04 +0000)]
Merge branch 'fix_filippov_batch_sync_pdo_binding' into 'develop'

fix: BatchSyncService PDO binding — $N плейсхолдеры → :pN

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

5 weeks agofix: BatchSyncService PDO binding — $N плейсхолдеры → :pN origin/fix_filippov_batch_sync_pdo_binding
Aleksey Filippov [Tue, 24 Mar 2026 16:46:06 +0000 (19:46 +0300)]
fix: BatchSyncService PDO binding — $N плейсхолдеры → :pN

PDO::bindValue() требует индекс ≥ 1, а $params был 0-индексированным
массивом с PostgreSQL-нативными $1,$2,$3 плейсхолдерами. Это вызывало:

  PDOStatement::bindValue(): Argument #1 ($param) must be >= 1

Результат на проде: Balances::deleteAll() удалял данные магазина,
BatchSyncService->upsertBalances() падал → магазин терял ВСЕ строки.

Fix: именованные :p1,:p2,:p3 плейсхолдеры вместо $1,$2,$3.
Проверено на реальной БД: 5 магазинов (419-499 товаров) + characteristics.

5 weeks agoMerge branch 'feature_filippov_ERP-33_stock_state_scd2' into 'develop'
Aleksey Filippov [Tue, 24 Mar 2026 14:19:31 +0000 (14:19 +0000)]
Merge branch 'feature_filippov_ERP-33_stock_state_scd2' into 'develop'

Feature filippov erp 33 stock state scd2

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

5 weeks agofix(ERP-33): SendTelegramMessageJob namespace app\jobs, не yii_app\jobs origin/feature_filippov_ERP-33_stock_state_scd2
Aleksey Filippov [Tue, 24 Mar 2026 14:16:52 +0000 (17:16 +0300)]
fix(ERP-33): SendTelegramMessageJob namespace app\jobs, не yii_app\jobs

5 weeks agoMerge branch 'task-JIRA-ERP-33-20260324070448' into 'develop'
Aleksey Filippov [Tue, 24 Mar 2026 13:59:46 +0000 (13:59 +0000)]
Merge branch 'task-JIRA-ERP-33-20260324070448' into 'develop'

Task jira erp 33 20260324070448

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

5 weeks agoMerge branch 'develop' into 'task-JIRA-ERP-33-20260324070448'
Aleksey Filippov [Tue, 24 Mar 2026 13:59:15 +0000 (13:59 +0000)]
Merge branch 'develop' into 'task-JIRA-ERP-33-20260324070448'

# Conflicts:
#   erp24/services/StockStateService.php

5 weeks agofix(ERP-33): safe cast components — пустые строки и NULL в products_1c
Aleksey Filippov [Tue, 24 Mar 2026 13:41:41 +0000 (16:41 +0300)]
fix(ERP-33): safe cast components — пустые строки и NULL в products_1c

5 weeks agofix(ERP-33): safe cast components — пустые строки и NULL в products_1c
Aleksey Filippov [Tue, 24 Mar 2026 13:41:41 +0000 (16:41 +0300)]
fix(ERP-33): safe cast components — пустые строки и NULL в products_1c

5 weeks agoMerge branch 'feature_filippov_ERP-33_stock_state_scd2' into 'develop'
Aleksey Filippov [Tue, 24 Mar 2026 13:39:32 +0000 (13:39 +0000)]
Merge branch 'feature_filippov_ERP-33_stock_state_scd2' into 'develop'

[ERP-33]: cast components::jsonb + TelegramTarget multiline fix

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

5 weeks agofix(ERP-33): cast components::jsonb + TelegramTarget multiline fix
Aleksey Filippov [Tue, 24 Mar 2026 13:36:36 +0000 (16:36 +0300)]
fix(ERP-33): cast components::jsonb + TelegramTarget multiline fix

1. StockStateService: pp.components::jsonb cast — products_1c хранит
   components как text, stock_state ожидает JSONB
2. TelegramTarget: экранировать \n при записи в error_tracking.log —
   многострочные ошибки ломали формат файла и спамили stderr

5 weeks agofix(ERP-33): cast pp.components::jsonb в INSERT для совместимости с products_1c
Aleksey Filippov [Tue, 24 Mar 2026 13:26:39 +0000 (16:26 +0300)]
fix(ERP-33): cast pp.components::jsonb в INSERT для совместимости с products_1c

5 weeks agoMerge branch 'task-JIRA-ERP-33-20260324070448' into 'develop'
Aleksey Filippov [Tue, 24 Mar 2026 13:15:10 +0000 (13:15 +0000)]
Merge branch 'task-JIRA-ERP-33-20260324070448' into 'develop'

fix(ERP-33): TelegramTarget — экранировать \n в error_tracking.log

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

5 weeks agorefactor(ERP-33): убрать actionCleanup — очистка не нужна
Aleksey Filippov [Tue, 24 Mar 2026 11:57:09 +0000 (14:57 +0300)]
refactor(ERP-33): убрать actionCleanup — очистка не нужна

5 weeks agofix(ERP-33): TelegramTarget — экранировать \n в error_tracking.log
Aleksey Filippov [Tue, 24 Mar 2026 11:49:26 +0000 (14:49 +0300)]
fix(ERP-33): TelegramTarget — экранировать \n в error_tracking.log

Многострочные ошибки (содержащие $_SERVER dump) ломали формат
файла error_tracking.log: file() разбивала одну запись на
множество строк, каждая выводилась как "Некорректная строка".

Фикс: str_replace \n → \\n при записи, убран error_log спам.

5 weeks agoMerge branch 'task-JIRA-ERP-33-20260324070448' into 'develop'
Aleksey Filippov [Tue, 24 Mar 2026 11:42:53 +0000 (11:42 +0000)]
Merge branch 'task-JIRA-ERP-33-20260324070448' into 'develop'

fix(ERP-33): namespace app\ → yii_app\ для совместимости с продом

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

5 weeks agofix(ERP-33): namespace app\ → yii_app\ для совместимости с продом
Aleksey Filippov [Tue, 24 Mar 2026 11:38:04 +0000 (14:38 +0300)]
fix(ERP-33): namespace app\ → yii_app\ для совместимости с продом

5 weeks agoMerge branch 'task-JIRA-ERP-33-20260324070448' into 'develop'
Aleksey Filippov [Tue, 24 Mar 2026 10:01:19 +0000 (10:01 +0000)]
Merge branch 'task-JIRA-ERP-33-20260324070448' into 'develop'

[ERP-33]: add unit tests for StockHistoryService (11 tests)

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

5 weeks agofeat(ERP-33): заменить StockHistory (snapshot) на StockState (SCD-2)
Aleksey Filippov [Tue, 24 Mar 2026 09:48:40 +0000 (12:48 +0300)]
feat(ERP-33): заменить StockHistory (snapshot) на StockState (SCD-2)

Полная переделка подхода хранения остатков:
- StockHistory (полные снимки 11400 INSERT/запуск) → StockState (SCD-2, 2 SQL)
- Без партиций — одна таблица с valid_from/valid_to (TIMESTAMP)
- valid_to = '2100-01-01 00:00:00' для активных, закрытие на секунду раньше
- is_active boolean для быстрой фильтрации
- batch_ts — единый timestamp пакета на запуск
- Экономия ~78% объёма (660 MB vs 3 GB за 2 года)
- 10 unit-тестов, 29 assertions

5 weeks agofeat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день
Auto-Claude Orchestrator [Tue, 24 Mar 2026 08:04:06 +0000 (08:04 +0000)]
feat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день

5 weeks agofeat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день
Auto-Claude Orchestrator [Tue, 24 Mar 2026 08:02:44 +0000 (08:02 +0000)]
feat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день

5 weeks agofeat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день
Auto-Claude Orchestrator [Tue, 24 Mar 2026 08:00:24 +0000 (08:00 +0000)]
feat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день

5 weeks agofeat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день
Auto-Claude Orchestrator [Tue, 24 Mar 2026 07:38:26 +0000 (07:38 +0000)]
feat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день

5 weeks agofeat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день
Auto-Claude Orchestrator [Tue, 24 Mar 2026 07:36:00 +0000 (07:36 +0000)]
feat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день

5 weeks agofeat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день
Auto-Claude Orchestrator [Tue, 24 Mar 2026 07:30:52 +0000 (07:30 +0000)]
feat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день

5 weeks agofeat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день
Auto-Claude Orchestrator [Tue, 24 Mar 2026 07:28:15 +0000 (07:28 +0000)]
feat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день

5 weeks agofeat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день
Auto-Claude Orchestrator [Tue, 24 Mar 2026 07:22:01 +0000 (07:22 +0000)]
feat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день

5 weeks agofeat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день
Auto-Claude Orchestrator [Tue, 24 Mar 2026 07:18:45 +0000 (07:18 +0000)]
feat(task-JIRA-ERP-33-20260324070448): Сбор данных по остаткам на день

6 weeks agoMerge branch 'feature_filippov_ERP-237_missing_indexes' into 'develop'
Aleksey Filippov [Thu, 19 Mar 2026 13:57:44 +0000 (13:57 +0000)]
Merge branch 'feature_filippov_ERP-237_missing_indexes' into 'develop'

feat(ERP-237): 6 индексов для устранения медленных запросов

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

6 weeks agofeat(ERP-237): 6 индексов для устранения медленных запросов из pg_stat_statements origin/feature_filippov_ERP-237_missing_indexes
Aleksey Filippov [Thu, 19 Mar 2026 13:31:35 +0000 (16:31 +0300)]
feat(ERP-237): 6 индексов для устранения медленных запросов из pg_stat_statements

export_import_table(entity, export_id, export_val) — 2.3M запросов, 511s
marketplace_orders(guid) — 247K запросов, 412s
marketplace_flowwow_emails(subject, from, date) — 253K запросов, 409s
marketplace_order_items(order_id) — 376K запросов, 307s
timetable_fact(admin_id, date, is_opening) — 52K запросов, 298s
admin_payroll_days(admin_id, date) — 27K запросов, 278s

6 weeks agoMerge branch 'feature_filippov_ERP-218-J_fix_db_long_request' into 'develop'
Aleksey Filippov [Thu, 19 Mar 2026 13:20:42 +0000 (13:20 +0000)]
Merge branch 'feature_filippov_ERP-218-J_fix_db_long_request' into 'develop'

feat(ERP-218-J): интеграция BatchSyncService и ProductPropTypeCacheService в UploadService

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

6 weeks agofeat(ERP-218-J): интеграция BatchSyncService и ProductPropTypeCacheService в UploadSe... feature_filippov_ERP-218-J_fix_db_long_request origin/feature_filippov_ERP-218-J_fix_db_long_request
Aleksey Filippov [Thu, 19 Mar 2026 13:11:17 +0000 (16:11 +0300)]
feat(ERP-218-J): интеграция BatchSyncService и ProductPropTypeCacheService в UploadService

- Исправлена миграция: indexExists() через pg_indexes вместо $schema->indexes
- ProductPropTypeCacheService: null-safe обращение к Yii::$app->cache
- UploadService: Products1cPropType::findOne() заменён на ProductPropTypeCacheService (10M→1 запрос)
- UploadService: balances INSERT в цикле заменён на BatchSyncService::upsertBalances (6M→2k запросов)
- UploadService: characteristics INSERT/UPDATE заменён на BatchSyncService::upsertProductCharacteristics (11M→1.2k)
- 20 unit-тестов: BatchSyncServiceTest (9) + ProductPropTypeCacheServiceTest (11)

6 weeks agoMerge branch 'feature_filippov_ERP-255_fix_marketplace_concurrency' into 'develop'
Aleksey Filippov [Thu, 19 Mar 2026 12:40:35 +0000 (12:40 +0000)]
Merge branch 'feature_filippov_ERP-255_fix_marketplace_concurrency' into 'develop'

fix(ERP-255): защита от гонки процессов в маркетплейс-командах

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

6 weeks agotest(ERP-255): unit-тесты для mutex-защиты cron-команд и null-check в SendBonusInfoTo... feature_filippov_ERP-255_fix_marketplace_concurrency origin/feature_filippov_ERP-255_fix_marketplace_concurrency
Aleksey Filippov [Thu, 19 Mar 2026 11:38:08 +0000 (14:38 +0300)]
test(ERP-255): unit-тесты для mutex-защиты cron-команд и null-check в SendBonusInfoToSiteJob

MarketplaceControllerMutexTest — 7 тестов: пропуск при занятом mutex,
release в finally, уникальность ключей.
SendBonusInfoToSiteJobTest — 5 тестов: null-check, детерминированность hash.

6 weeks agoMerge branch 'feature_filippov_ERP-258_telegram_429_fix' into 'develop'
Aleksey Filippov [Tue, 17 Mar 2026 08:36:09 +0000 (08:36 +0000)]
Merge branch 'feature_filippov_ERP-258_telegram_429_fix' into 'develop'

fix(ERP-258): агрегация сообщений и дедупликация в TelegramTarget

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

6 weeks agofix(ERP-258): агрегация сообщений и дедупликация в TelegramTarget origin/feature_filippov_ERP-258_telegram_429_fix
Aleksey Filippov [Tue, 17 Mar 2026 06:46:45 +0000 (09:46 +0300)]
fix(ERP-258): агрегация сообщений и дедупликация в TelegramTarget

- Обработка всех сообщений буфера вместо только первого
- Включён shouldSendMessage() для дедупликации (1 раз в день на ошибку)
- Лимит 800 символов на сообщение, 4000 итого
- disableNotification только если нет ERROR-уровня

6 weeks agoMerge branch 'feature_filippov_ERP-257_heic_already_readable' into 'develop'
Aleksey Filippov [Mon, 16 Mar 2026 13:26:53 +0000 (13:26 +0000)]
Merge branch 'feature_filippov_ERP-257_heic_already_readable' into 'develop'

fix(ERP-257): graceful fallback для HEIC-файлов, которые уже являются JPEG

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

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 agofix(ERP-255): защита от гонки процессов в маркетплейс-командах
Aleksey Filippov [Sat, 7 Mar 2026 21:36:28 +0000 (00:36 +0300)]
fix(ERP-255): защита от гонки процессов в маркетплейс-командах

- Добавлен компонент PgsqlMutex в console.php для advisory locks
- Обёрнуты 4 action MarketplaceController в мьютекс (yandex-orders,
  flowwow-orders, flowwow-retry, check-ready-to-1c) — повторный запуск
  cron пропускается без ошибок
- Добавлен try-catch IntegrityException в processOrders() вокруг
  save() нового заказа — дубликат marketplace_order_id при гонке
  теперь логируется как warning, а не падает в ошибку
- Исправлен NPE в SendBonusInfoToSiteJob: добавлена проверка на null
  перед обращением к ->status++ (Fatal Error при отсутствии записи)
- Добавлен layout => false в api1.config.php

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>