# Current Contracts

Этот документ фиксирует текущие внешние contracts desktop-приложения до глубокой переработки.
Цель: иметь baseline перед декомпозицией UI и введением profile/license layers.

## Sorting Pipeline

### Вход
- Источник бланков: список изображений, выбранных в `MainWindow`.
- Источник фотографий: индекс из `worker.resolver.build_source_index()`.
- Настройки: `worker.schemas.AppSettings`.
- Шаблон распознавания: `config/template.json`.

### Основной поток
1. `worker.scan.scan_page()` распознаёт один бланк и возвращает `PageResult`.
2. `worker.resolver.get_all_frame_numbers()` собирает номера кадров из страниц.
3. `worker.resolver.resolve_frames()` сопоставляет кадры с исходными файлами.
4. `worker.pricing.build_order_items()` строит `OrderItem[]`.
5. `worker.pricing.apply_page_child_names()` применяет имена детей к digital-позициям.
6. `worker.pricing.calculate_summary()` строит `OrderSummary`.
7. `worker.sorter.sort_files()` копирует/линкует файлы в папку результата.
8. `worker.report_pdf.generate_report()` формирует `report.pdf`.

### Выход
- `PipelineResult.pages`: распознанные страницы.
- `PipelineResult.summary`: агрегированный summary по товарам/страницам.
- `SortingResult`: число скопированных/пропущенных файлов и список ошибок.
- `report.pdf` в папке результата.

### Зависимости и допущения
- Товар определяется через `OrderMark.product_key`.
- Каталог товаров берётся из `AppSettings.products`.
- Привязка строки к товару задаётся через `template.json -> row_to_product`.
- Имена детей влияют на итоговую структуру для digital-заказов.

## Control Sheets Pipeline

### Вход
- Папка исходных фотографий.
- Папка результата.

### Основной поток
1. `worker.blanks_generator.export_control_sheets_from_folder()` читает изображения из папки.
2. Внутри генератора фото группируются по заказам и листам.
3. На каждый лист собирается JPEG через `_generate_landscape_sheet()`.

### Выход
- `SheetsExportResult`:
  - `files`
  - `total_images`
  - `total_orders`
  - `total_sheets`
- JPEG-листы в папке результата.

### Зависимости и допущения
- Генерация контрольных листов сейчас живёт отдельно от sorting pipeline.
- Внутри `worker.blanks_generator` зашита собственная матрица товаров/цен.
- Control sheets пока не используют `AppSettings.products` и не разделяют source of truth со sorting.

## UI Orchestration Boundary

До этого рефакторинга orchestration находилась в:
- `app/main_window.py`
  - `_rebuild_items()`
  - `_on_sort()`
  - `_on_gen_pdf()`
- `app/blanks_window.py`
  - `GeneratorWorker`
  - `ProgressDialog`
  - `_on_generate()`

Текущее изменение выносит orchestration в application services, но не меняет low-level pipeline.

