From 01637999ea97bb02759994b3bdc68f3d2fff9add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 28 Jun 2026 09:51:58 +0400 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20?= =?UTF-8?q?Opus=20=E2=80=94=20=D0=B4=D0=B5=D0=B4=D1=83=D0=BF=D0=BB=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=B8=20=D0=BF=D0=BE=D0=B7?= =?UTF-8?q?=D0=B8=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- History/opus-dedup-2026-06-28.md | 47 ++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 History/opus-dedup-2026-06-28.md diff --git a/History/opus-dedup-2026-06-28.md b/History/opus-dedup-2026-06-28.md new file mode 100644 index 0000000..4e2a66e --- /dev/null +++ b/History/opus-dedup-2026-06-28.md @@ -0,0 +1,47 @@ +# Запрос Opus — логика дедупликации в пайплайне + +Дата: 28.06.2026 + +## Проблема + +Сейчас: + +1. **Загрузка:** дубликат файла определяется только по имени (`filename`). Тот же файл с другим именем → новый документ. +2. **Сравнение (ADD):** при добавлении строки в `spec_current` не проверяется `name_hash`. Одна и та же услуга добавится дважды если пришла из двух разных допников с одинаковым содержанием. +3. **Позиции:** `name_hash = md5(нормализованное_имя || date_start)`. Хеш есть, но используется только для UPDATE (поиск target_hash). При ADD — не проверяется. + +## Вопросы + +### 1. Дедупликация документов при загрузке + +Сейчас: `delete_by_document(contract_id, filename)` — только по совпадению имени. + +**Нужно ли:** +- Сравнивать по хешу содержимого (sha256 original_bytes)? +- Сравнивать по `elements_json`? +- Или только по имени + предупреждение? + +### 2. Дедупликация строк в spec_current (ADD → UPSERT) + +Сейчас: ADD всегда INSERT. Если та же услуга приходит из другого допника — будет дубликат. + +**Предложение:** перед INSERT проверять `name_hash`: +``` +есть name_hash? → UPDATE (как обычный UPDATE) +нет → INSERT +``` + +**Вопросы:** +- Правильно ли это? В каких случаях ADD должен ОСТАТЬСЯ INSERT даже при совпадении name_hash? +- Как обрабатывать если ADD и UPDATE приходят в одном наборе ops и пересекаются по name_hash? + +### 3. Связанные краевые случаи + +- Два допника с одинаковым содержанием, разные имена → сейчас: две обработки, возможны дубликаты. Как надо? +- Один допник добавляет услугу X, другой её же удаляет. Порядок имеет значение? Как обеспечить? +- ZIP содержит файлы с теми же именами что уже загружены. Перезаписывать? Пропускать? Спрашивать? +- Два одинаковых договора (разные имена) в одном батче. Как группировать? + +## Ожидаемый ответ + +На каждый сценарий: **как ДОЛЖНО быть** и **как проще всего реализовать сейчас** (MVP). Приоритет: не сломать существующее поведение.