Initial commit

This commit is contained in:
tkachenko committed 2026-10-09 01:45:17 +00:00
commit 41d230d524
163 files changed
+11500

No files matched your search

@@ -0,0 +1,41 @@
# Модуль: Ресурсы компаний
**Ответственность**: читает публичные данные `.template/companies/`, нормализует JSON, создаёт устойчивые Typst paths и применяет явные overrides подписи и печати.
**Расположение**: `.template/lib/infrastructure/company-assets.typ`
## Публичный интерфейс
| Символ | Тип | Описание |
|--------|-----|----------|
| `load-company()` | функция | Загружает профиль по разрешённому id и принимает `logo`, `signature`, `stamp` overrides |
| `available-companies()` | функция | Возвращает детерминированный список встроенных ids |
| `merge-resources()` | чистая функция | Применяет только явно переданные resource overrides |
## Зависимости
| Модуль | Что использует |
|--------|----------------|
| `.template/lib/domain/company.typ` | `company-profile()` и `validate-company()` |
| `.template/companies/*/data.json` | Публичные реквизиты организаций |
| `.template/companies/*/logo.*` | Публичные логотипы |
| `.template/lib/assets/placeholders/` | Безопасные круг и крест |
## Инварианты
- Адаптер не сканирует `assets/` или `.private/`.
- Относительные внутренние paths создаются в infrastructure-файле.
- Private paths организаций создаются адаптером сотрудников из явной настройки и передаются как готовые `path`.
- Идентификатор компании выбирается из явного registry.
- Публичные JSON не содержат путей к реальным подписям и печатям.
- `none` сохраняется как отсутствие ресурса и обрабатывается media policy.
- Указанный override не подменяется placeholder при ошибке загрузки.
## Намеренно НЕ обрабатывает
- Layout логотипа, подписи или печати.
- Поиск файлов по имени.
- Сетевую загрузку реквизитов.
## Заметки для агента
> Typst `path` сохраняет контекст файла, в котором создан. Public company paths создавайте здесь, а absolute `.private/` paths — только в private/employee adapter. Значения `auto` и `none` должны различаться: `auto` означает взять публичное значение профиля, `none` — осознанно применить media policy.