# Модуль: Деловое письмо **Ответственность**: формирует исходящее деловое письмо с адресатом, регистрационными данными, темой, основным текстом и подписанием. **Расположение**: `.template/lib/presentation/profiles/letter.typ` ## Публичный интерфейс | Символ | Тип | Описание | |--------|-----|----------| | `letter-profile()` | конструктор `DocumentProfile` | Принимает дату, исходящий номер, адресата, тему и signing options | | `render-letter()` | renderer-функция | Собирает фирменную шапку, body, подпись и footer | | `letter-metadata()` | чистая функция | Нормализует регистрационные поля и тему | | `letter-validators()` | массив functions | Проверяет адресата, дату и подписанта | ## Зависимости | Модуль | Что использует | |--------|----------------| | `.template/lib/domain/document.typ` | `DocumentProfile` и render options | | `.template/lib/domain/parties.typ` | Recipient и Signer | | `.template/lib/domain/attachments.typ` | Перечень приложений к письму | | `.template/lib/presentation/foundation.typ` | Общие tokens и media policy | | `.template/lib/presentation/components.typ` | Letter header, company footer, attachment list, signature block | ## Инварианты - Letter profile не содержит коммерческой стоимости, графика работ или offer validity. - Recipient может быть частично заполнен, но validator требует хотя бы организацию или ФИО. - Исходящий номер и дата отображаются единым регистрационным блоком. - Footer включается profile option и не исчезает из-за состояния приложения другого документа. - Подпись, печать и место для ручного подписания obey media policy. - Renderer не импортирует report или commercial-offer profile. ## Намеренно НЕ обрабатывает - Коммерческие условия ТКП. - Титул и содержание отчёта. - Разделы договора. - Регистрацию письма во внешней системе. ## Заметки для агента > Внешний проект TKP содержит полезный визуальный референс шапки и footer, но его global `comp-data` и `in-appendix` не переносятся. Состояние footer, если оно понадобится, должно принадлежать только текущему renderer и сбрасываться внутри него. Общая геометрия письма выносится в components, чтобы ТКП переиспользовал её без импорта `render-letter()`.