58 Commits

Author SHA1 Message Date
Andrey Epifancev
6ee1d0e1cb drawer: рабочий стол консолидации, переключатель «Все документы организации», загрузка только в версии в работе (#26)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-10 00:55:28 +04:00
Andrey Epifancev
79278589d6 api: загрузка и список файлов по маршрутам консолидации (#26)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-10 00:53:59 +04:00
Andrey Epifancev
5b7b02a3f2 store: консолидация открытой версии и подпись консолидации у файла (#26)
Чистые функции findCurrentConsolidation, isInWork, consolidationLabel и хук
useCurrentConsolidation; FileOut.consolidation_id; тесты vitest.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-10 00:52:33 +04:00
Andrey Epifancev
490113cb06 plan: demo-prepare.sh — загрузка через маршрут консолидации (#26)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 23:47:18 +04:00
Andrey Epifancev
6fb3d5d41a openspec+plan: console-files — панель файлов в контексте консолидации (#26)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 23:39:35 +04:00
aep
fc75edfded Merge pull request 'Обратный поток из контура: vitest 3.1.4 и форма dev-входа в production-сборке (#24)' (#25) from feat/24-contour-dev-login into test
Reviewed-on: #25
2026-10-09 20:38:22 +03:00
Andrey Epifancev
822f758571 fix(auth): обратный поток из контура — vitest 3.1.4, форма dev-входа в любой сборке (#24)
Зеркало arm-core #92: vitest зафиксирован на 3.1.4 (в зеркале npm банка нет 3.2.x); DevLogin
не зависит от NODE_ENV — форма входа по email показывается всегда, заглушка «Вход выполняется
через РАИСА» появляется после 404 «Not Found» от бэкенда (dev-эмитент выключен). Признак вынесен
в isDevIssuerDisabled и покрыт тестами. CLAUDE.md: описание DevLogin обновлено.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 20:29:42 +04:00
aep
a3d3154f6f Merge pull request 'Legacy-сборка pdf.js: «Не удалось открыть PDF» в Яндекс Браузере (#22)' (#23) from feat/22-pdfjs-legacy into test
Reviewed-on: #23
2026-10-09 18:50:19 +03:00
Andrey Epifancev
0aa73f2289 fix(review): legacy-сборка pdf.js — «Не удалось открыть PDF» в Яндекс Браузере (#22)
Обычная сборка pdfjs-dist 5.7 в воркере вызывает Uint8Array.prototype.toHex (отпечаток документа) —
метод есть только в Chromium 140+, в Яндекс Браузере getDocument падает «a.toHex is not a function».
PdfPages берёт модуль и воркер из pdfjs-dist/legacy/build (с полифиллами core-js) через новый
widgets/DocumentReview/pdfjs.ts; регрессионный тест открывает PDF без Uint8Array.prototype.toHex.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 19:41:16 +04:00
Andrey Epifancev
2f3f3087db openspec: архив statement-template-lines (#19)
Спека document-review-ui обновлена дельтой change'а; change перенесён в
openspec/changes/archive/2026-10-09-statement-template-lines/. Реализация — PR #20.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:56:25 +04:00
aep
77a7987f36 Merge pull request 'Шаблонные строки ББ/ОФР и выделение «БАЛАНС» (#19)' (#20) from feat/19-statement-template-lines into test
Reviewed-on: #20
2026-10-09 11:53:48 +03:00
Andrey Epifancev
9e89b9fde7 feat(review): шаблонные строки ББ/ОФР и выделение строк «БАЛАНС» (#19)
Фронт к RSHB/arm-core#80. Строки и ячейки с id = null (достроены сервером)
редактируются; правка уходит в PATCH по line_code, строки из БД — по line_id.
Ключ достроенной строки code-<код> (R-10). Строки 1600/1700 формы BALANCE
выделены фоном #f9f0ff и жирным (R-7). OpenSpec change statement-template-lines.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 12:18:44 +04:00
aep
e3a24a4fe1 Merge pull request 'Сводная ОСВ: ячейка ИНН по макету — «Указать» только без ИНН, пересопоставление (#17)' (#18) from feat/17-osv-inn-cell into test
Reviewed-on: #18
2026-10-08 22:02:24 +03:00
Andrey Epifancev
0f7a101161 feat(osv): ячейка ИНН по макету — «Указать» только без ИНН, ИНН сопоставленного ЮЛ с пересопоставлением (#17)
Решения владельца 08.10.2026 (arm-core #74, отмена П-1):
- ИНН из файла — просто текстом, без «Указать», даже если ЮЛ не найдено;
- строка сопоставлена без ИНН в файле — «таблетка» с `counterparty_entity_inn`, клик открывает выбор организации,
  у текущего ЮЛ — неактивное «Связано» (закрывает D-1 из #16);
- нет ни ЮЛ, ни ИНН — «Указать» на подсвеченной ячейке.
Колонка ИНН — моноширинный шрифт по центру, воронка фильтра `unmapped`; баннер и кнопка «Показать ЮЛ без ИНН» —
цвета `osv-mapping-alert` макета. Спека consolidated-osv-ui и README (1381 → 1260) обновлены.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019qoydUVv8g1qHxc123u2RR
2026-10-08 19:59:21 +04:00
aep
3bd8a22e33 Merge pull request 'Сводная ОСВ: сопоставление контрагента «Указать» → «Связать» по макету [32] (#14)' (#15) from feat/14-osv-map-counterparty into test
Reviewed-on: #15
2026-10-08 17:08:51 +03:00
Andrey Epifancev
1249e2ff3b feat(osv): сопоставление контрагента в сводной ОСВ — «Указать» → «Связать» по макету [32] (#14)
- ИНН-ячейка строк без сопоставления подсвечена, ссылка «Указать» рядом с ИНН из файла [32-osv-no-inn].
- Модалка «Выбор организации для связи с …» [32-osv-map-counterparty]: поиск с паузой 300 мс,
  scope group / весь справочник (от 3 символов), блок «Рекомендуемые», «Связать».
- POST …/osv/entries/{последняя entry_id}/counterparty; 409 ALIAS_TAKEN → перенос алиаса (move_alias),
  LOCK_REQUIRED → «Взять версию в работу?» → POST …/lock → повтор, LOCKED_BY_OTHER → имя держателя.
- После успеха перечитываются строки и сводка («Осталось N»).
- Чистые функции counterpartyMapping.ts + тесты; спека consolidated-osv-ui.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-08 17:39:23 +04:00
aep
403f086bb1 Merge pull request 'Просмотр ОСВ: плоская таблица вместо дерева (#12)' (#13) from feat/12-osv-flat-table into test
Reviewed-on: #13
2026-10-08 15:23:28 +03:00
Andrey Epifancev
c3fcac2efd feat(osv): «Просмотр ОСВ» — плоская таблица вместо дерева (#12)
- Строка = аналитика нижнего уровня (контрагент, объект ОС); строки счетов и
  субсчетов не показываются, договоры (CONTRACT) — в строке контрагента, как в
  сводной ОСВ (§3); субсчёт/подразделение без нижних строк с суммами — строкой с
  пустой аналитикой.
- Колонки: Субсчёт · Подразделение (если уровень есть в файле) · Контрагент /
  аналитика · ИНН · 6 сумм; закреплённая строка «Итого по документу» = сумма
  корневых строк счёта (= «Итого» файла 1С).
- Поиск по контрагенту/ИНН, фильтр по субсчёту, «Строк: N» — на клиенте.
- flattenEntries (osvRows.ts) и точное sumAmounts (копейками, BigInt) с тестами;
  EntryOut.group_type — как в схеме arm-core; entryTree удалён.
- Пустой документ: «В документе нет строк» вместо «No data».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 16:22:16 +04:00
aep
08971736b1 Merge pull request 'Сводная ОСВ: колонка «Тип контрагента» по макету [30] (#8)' (#9) from feat/8-osv-counterparty-type into test
Reviewed-on: #9
2026-10-08 11:03:09 +03:00
Andrey Epifancev
519061e859 feat(osv): колонка «Тип контрагента» в сводной ОСВ по макету [30] (#8)
- Последняя колонка — бейдж ГСК (синий) / ГК (зелёный) / Внешний (серый), цвета из
  osv-type-badge макета; чистая функция counterpartyTypeBadge с тестом.
- Фильтр признака перенесён из «Контрагенты» на колонку «Тип контрагента» (одно
  значение: API принимает один counterparty_type); «Контрагенты» — только поиск.
- «Применить» / «Сбросить» и Enter закрывают окно фильтра (close из antd).
- Спека consolidated-osv-ui: колонка и фильтры по макету, «способ сопоставления»
  убран из колонок (в макете [30] его нет).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:56:12 +04:00
Andrey Epifancev
acab285539 docs(openspec): Purpose для спек arm-web после архива demo-prototype (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 11:00:25 +04:00
Andrey Epifancev
c00f750ad7 docs(openspec): архив demo-prototype — спеки consolidation-setup, primary-files-ui, document-review-ui, consolidated-osv-ui (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 11:00:00 +04:00
aep
7727cb3ec4 Merge pull request 'Демо-прототип: от создания консолидации до сводной ОСВ' (#4) from feat/3-demo-prototype into test
Reviewed-on: #4
2026-10-08 09:58:37 +03:00
Andrey Epifancev
34ad6ef081 feat: шапка формы ББ/ОФР как в старом АРМ — только ИНН / Дата отчёта / Единица измерения с подсветкой уверенности (H-5, #3)
Макет [41] рисует бумажную шапку с ОКПО/ОКОПФ/ОКФС/адресом, которых распознавание не отдаёт
(arm-scan-gateway#15) — вместо пустых рамок показываем то, что извлекается надёжно.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 10:49:17 +04:00
Andrey Epifancev
9d4fc20c7f feat: форма ББ/ОФР как в макете [41] — разделы, порядок формы, жирные итоги, ИНН в рамке кодов, ОКУД, отчётность за период (#3)
Сервер отдаёт строки по коду и без заголовков разделов (§12, OQ-36): порядок и разделы восстанавливаются
по соотношениям §7 только при показе; приклеенные OCR заголовки срезаются, полное имя — в подсказке.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 10:45:52 +04:00
Andrey Epifancev
f756aff6ee feat: [34] панель «Организации» — Ответственный / Утверждён в РФ / Верифицирован в ГО, «Скачать чек-лист» (CSV), подсветка выбранной версии (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 03:44:03 +04:00
Andrey Epifancev
35e52aaa29 fix: ОСВ за 1 квартал нарастающим итогом показывается «2024 К1», как в макете [39] (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 03:31:27 +04:00
Andrey Epifancev
c0dfe7c6c0 fix: панель документов — крестик справа, плашка без обрезки; даты по Москве; заголовки колонок формы и высота списка нарушений; решения R-7…R-12 в design.md (H-2, #3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 03:16:20 +04:00
Andrey Epifancev
6f8f04a707 feat: экраны по макету — панель документов [39]/[40], сводная ОСВ [30], проверка распознавания [41]/[41-02], консолидации [34], группы [03], логотип, модалка [42] (H-2, #3)
- [39] таблица документов: формат, период, проверка Период/Контрагент, статус плашкой; шапка с ЮЛ и ИНН
- [30] шапка «ГК — год Кn» со статусом, вкладки (только ОСВ), баннер «Осталось N» с фильтром
  несопоставленных, колонки и двухуровневые заголовки макета, фильтры в заголовках, «—» для нуля
- [41] карточки «Исходный документ» / «Результат распознавания», режим просмотра и «Редактировать»,
  форма как бумажный документ, суммы без копеек
- [34] Дата создания, Дата верификации (—, в API нет), ГСК (—, П-3), квартал «К3»
- [03] Основной РФ — название филиала, а не UUID
- логотип АРМ КА, заголовок вкладки, «Отчётность»; [42] члены ГСК наверху списка

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 03:10:34 +04:00
Andrey Epifancev
6d8998988e feat: формат сумм как в макете (запятая, «—» для нуля, без копеек в формах), подписи К3 и «9 мес.», крошки « › » и слот справа в PageTitle (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 03:06:42 +04:00
Andrey Epifancev
977a0efeaf fix: «К отчётности» не переходил на свод — клик всплывал до onRow строки (H-1, #3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 03:02:40 +04:00
Andrey Epifancev
11e78c67a8 docs(openspec): решения контроллера без обсуждения (demo-prototype, #3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:57:27 +04:00
Andrey Epifancev
67bc2c801b docs: демо-сценарий под данные стенда, CLAUDE.md; удалены неиспользуемые css-классы Sidebar (I-2, M-1, M-2, M-6)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:54:43 +04:00
Andrey Epifancev
0f734e3bf8 fix: версия в URL, ошибки списка, подпись квартала, Назад по прямой ссылке, код ошибки не в заголовке (I-1, M-3, M-4, M-6, T7.M7, T7.M4)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:54:37 +04:00
Andrey Epifancev
384301ecbd fix: make start запускает dev с REACT_APP_ROOT_PATH=/ — нет белого экрана (C-1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:54:37 +04:00
Andrey Epifancev
ebae9edd74 docs: README с демо-сценарием, скрипт подготовки данных, CLAUDE.md и ARCHITECTURE.md (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:36:54 +04:00
Andrey Epifancev
2c7bdf19b0 feat: экран сводной ОСВ — сводка, пробелы, фильтры, экспорт xlsx (#3)
Заодно: отложенный revokeObjectURL в saveBlob (ревью Task 3).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:30:32 +04:00
Andrey Epifancev
65c3dc2de7 fix: форма ББ/ОФР — onChanged после сохранения и акцепта, черновик без no-op правок, акцепт блокируется при несохранённом (I-1, M-1, M-2)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:27:36 +04:00
Andrey Epifancev
615201c925 feat: проверка формы ББ/ОФР — скан PDF, правка ячеек и шапки, проверки, подтверждение (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:23:57 +04:00
Andrey Epifancev
edaa2b6d58 fix: дерево ОСВ устойчиво к самоссылке, циклам и дублям id; key документа (I-1, M-1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:19:17 +04:00
Andrey Epifancev
5d1c28d0de feat: экран документа и просмотр ОСВ-документа с подтверждением (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:16:37 +04:00
Andrey Epifancev
64d64d3b0a fix: опрос файлов ЮЛ — без спама ошибок, сброс при смене ЮЛ, уникальные key (I-1, I-2, M-1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:11:15 +04:00
Andrey Epifancev
c7867277d8 feat: панель файлов ЮЛ — загрузка с итогом, документы, опрос до окончания распознавания (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:09:34 +04:00
Andrey Epifancev
c11ef663e9 fix: смена ГК отменяет запрос состава ГСК (I-1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:07:46 +04:00
Andrey Epifancev
fec179b747 feat: модалка консолидации — предотметка ГСК, все ЮЛ, ошибки, переход к версии (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:05:57 +04:00
Andrey Epifancev
27828219c9 fix: fetchCompanyGroups читает все страницы (C1 критерий)
GET /directories/company-groups возвращает Page[CompanyGroupOut], но раньше типизировался как ICompanyGroup[].
Реализована пагинация: fetchCompanyGroups теперь читает все страницы по 200 и возвращает полный массив ICompanyGroup[].
Это позволяет thunk/slice получать честный массив с правильным total_groups = payload.length.

Исправлено:
- fetchCompanyGroups: async функция с циклом по total (как fetchAllLegalEntities)
- types.ts / companyGroupsSlice.ts / thunks.ts: типы честные (без приведений)
- потребители (NewConsoleModal, CompanyGroupsTable, Sidebar): используют raw_rows как массив

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 01:03:12 +04:00
Andrey Epifancev
4424a2b8e8 feat: типы DTO и сервисы API для файлов, документов, форм и свода (#3)
- Дополнены типы в src/types/api.ts (Page, UploadResult, FileOut, DocumentOut, StatementOut, ConsolidatedRowOut, etc.)
- Реализованы сервисы: uploadFiles, listLegalEntityFiles, fetchFileContent, getDocument, getStatement, getAllEntries, buildOsvQuery, getConsolidatedOsv, getOsvSummary, exportOsv
- Переписаны consolidations.ts (getVersionCard вместо getVersionData) и company_groups.ts (fetchRelatedGroups, fetchAllLegalEntities)
- Обновлены вызовы функций в компонентах и slices
- Добавлены unit-тесты files.test.ts и osv.test.ts (11 тестов, все PASSED)
- Типизация strict, без any, все тесты и сборка зелёные

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 00:59:20 +04:00
Andrey Epifancev
e593236eed feat: apiFetchBlob, деньги строками, подписи статусов, dev-proxy (#3)
- Клиент API: ApiError.body, apiFetchBlob для бинарных ответов с автоматическим разбором ошибок
- Деньги: formatAmount (строка Decimal → форматированная с пробелами), parseAmountInput (ввод → нормализация)
- Подписи: documentTypeLabel, documentStatusLabel, fileStatusLabel, periodLabel для UI
- Dev-proxy: /api → localhost:8000 (CORS-free, Content-Disposition читается)
- Типы: Quarter, DocumentType, DocumentStatus, FileStatus в src/types/api.ts
- Удалён smoke.test.ts

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 00:51:47 +04:00
Andrey Epifancev
841299b12b chore: убрано наследие старого АРМ, vitest, зелёный make check (#3)
Удалены экраны и моки старого АРМ (FileViewer, FilesList, FileUploaderModel,
PDFResultViewer, mocks.ts), рендер PDF перенесён в widgets/DocumentReview/PdfPages.tsx.
Подключён vitest (npm test, make test, в make check). Исправлены все ошибки tsc и biome:
типизированы ответы api.get, слайсы и thunks, убраны console.log и пустые catch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 00:45:53 +04:00
Andrey Epifancev
da86d47f6d docs: план реализации демо-прототипа (#3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-08 00:34:30 +04:00