# Модуль: Стороны **Ответственность**: моделирует адресатов, стороны договора, представителей, подписантов и блоки утверждения независимо от их размещения. **Расположение**: `.template/lib/domain/parties.typ` ## Публичный интерфейс | Символ | Тип | Описание | |--------|-----|----------| | `party()` | конструктор dictionary | Создаёт организацию или физическое лицо в роли стороны документа | | `recipient()` | конструктор dictionary | Создаёт адресата делового письма или ТКП | | `signer()` | конструктор dictionary | Создаёт подписанта с должностью, ФИО, основанием и ресурсом подписи | | `approval()` | конструктор dictionary | Создаёт данные блока утверждения отчёта | | `validate-parties()` | функция | Проверяет уникальность ролей и профильные обязательные поля | ## Зависимости | Модуль | Что использует | |--------|----------------| | `.template/lib/domain/company.typ` | Может принять нормализованный `CompanyProfile` как сторону, не загружая его | ## Инварианты - Каждая сторона имеет уникальный `id` внутри документа и непустую `role`. - Recipient допускает отдельно организацию, должность и имя; пустые строки нормализуются в `none`. - Signer хранит семантические данные и ресурс, но не layout offsets. - Contract-party содержит реквизиты либо ссылку на `CompanyProfile`, но не оба источника с конфликтующими значениями. - Approval date и document date являются разными полями и не подменяют друг друга. - Обязательность подписи определяется профилем и режимом выпуска, а не самим `Signer`. ## Намеренно НЕ обрабатывает - Координаты и размеры изображений подписи. - Текст преамбулы договора. - Склонение ФИО и должностей. - Загрузку реквизитов из файлов. ## Заметки для агента > Письмо, ТКП и договор должны использовать одинаковые базовые Party/Signer, но разные validators. Не добавляйте коммерческие поля в recipient и report-specific approval в party. Если понадобится склонение, создайте отдельный domain service, а не набор условий внутри renderer.