# Книги INUM: фрагменты, цены и ЮKassa

Версия 0.1.0 · 20 сентября 2026. Владелец поручил использовать ЮKassa и самостоятельно предложить цены. Полный текст продаётся отдельно от подписки на ИИ.

## Каталог и ценовая гипотеза

| SKU | Издание | Объём исходного PDF | Полный PDF + EPUB |
|---|---|---|---|
| inum | ИНУМ — концепция системы решений | 579 страниц | 790 ₽ |
| materik | Материк. Полное издание — история решений и последствий | 2149 страниц | 1490 ₽ |
| bundle | Оба полных издания | Две книги | 1990 ₽ |

Комплект экономит 290 ₽ относительно суммы отдельных изданий. Это стартовая ценовая гипотеза прямой продажи, а не измеренная рыночная медиана. Цена не привязана автоматически к валютному курсу.

Международные ориентиры, проверенные 20.09.2026:

- [Amazon KDP](https://kdp.amazon.com/en_US/help/topic/G200634560): диапазон для опции роялти 70% на Amazon.com с 07.07.2026 — $2.99–$12.99. Это условие платформы, а не статистика средней цены.
- [Verso, Planet on Fire](https://www.versobooks.com/products/984-planet-on-fire): электронное издание $9.99 на момент проверки. Это один сопоставимый пример общественно-политической нон-фикшн книги, не достаточная выборка для утверждений обо всём рынке.

Предложение учитывает умеренную цену входа, значительно больший объём полного «Материка» и выгоду комплекта. Для будущей англоязычной редакции можно проверить отдельную гипотезу $9.99 / $19.99 / $24.99; это **не действующие валютные цены**, не курс конвертации и не обещание английского перевода.

## Бесплатный доступ

Оба фрагмента — ровно первые 30 физических страниц PDF, включая обложку, с исходной вёрсткой. Файлы: `/books/inum-preview.pdf` и `/books/materik-preview.pdf`. Аннотации-ссылки исключены при извлечении, вложений нет. Полные PDF и EPUB физически исключены из новой статической сборки. Оригиналы остаются в авторском рабочем каталоге вне сайта.

Полные книги не прячутся CSS или JavaScript. Их нельзя выдавать из статического каталога после оплаты: необходим серверный контроль права доступа. Ранее скачанные экземпляры отозвать невозможно; старые приватные версии и история исходников этим выпуском не переписываются.

## Что реализовано

- Двуязычная витрина, выбор издания/комплекта, цены, два бесплатных фрагмента. Оплата на витрине явно неактивна.
- Каталог цен на сервере Elixir. Клиент передаёт SKU, email для чека и UUID request_key; сумма берётся с сервера.
- Заказ привязан к организации и пользователю. Изоляция PostgreSQL RLS и фильтр автора. Состав заказа и хэш email фиксируются; повтор с другим составом или email отклоняется.
- Один idempotence key на заказ, при неопределённом ответе повтор использует тот же ключ. Через 23 часа повтор создания неразрешённого заказа блокируется.
- Req обращается только к `https://api.yookassa.ru/v3`, без автоматических перенаправлений. Секреты берутся только из серверного окружения.
- Проверка оплаты читает объект платежа из API ЮKassa и сверяет ID, магазин, заказ, сумму, RUB и тестовый режим. Возврат с return_url сам по себе права не даёт.
- Тестовый успешный платёж получает `test_succeeded` и **не открывает полную книгу**. Для выдачи нужен реальный `succeeded`, `paid=true` и совпадение всех полей.
- Перед скачиванием сервер вновь проверяет провайдера; любой зафиксированный возврат закрывает выдачу. Устаревший успешный ответ не отменяет зафиксированный возврат. Это консервативная политика полного ограничения доступа при частичном возврате; отдельная модель частичных возвратов пока не реализована.
- Путь к файлу берётся из серверного allowlist по книге и формату, а не из пользовательского пути. Кэширование выдачи запрещено.

API: публичный `GET /api/v1/books`; с Bearer-сессией — `POST /api/v1/book-orders`, `GET /api/v1/book-orders/:id`, `POST /api/v1/book-orders/:id/refresh`, `GET /api/v1/book-orders/:id/files/:book/:format`.

Документация: [процесс платежа ЮKassa](https://yookassa.ru/developers/payment-acceptance/getting-started/payment-process), [проверка уведомлений](https://yookassa.ru/developers/using-api/webhooks). Текущий этап использует явную серверную сверку API. Webhook-обработчик, фоновая сверка и автоматическое письмо покупателю пока не подключены.

## Что необходимо для реального запуска

1. Магазин ЮKassa, shop ID, секретный ключ через хранилище секретов; не через чат и не через исходный код.
2. Подтверждённые параметры чека, НДС и предмета расчёта для конкретного продавца. Они не выбраны произвольно.
3. HTTPS-сервер платформы, авторизованный кабинет покупателя, условия продажи/возврата и данные продавца.
4. Частное хранилище полного текста, настройка надёжной выдачи и резервирования, тест покупки/отмены/возврата в тестовом магазине.
5. Отдельное включение продаж `INUM_BOOK_SALES_ENABLED=true`. Для live-создания платежа код дополнительно требует наличие всех четырёх файлов. Текущая публичная витрина не подключена к API и не принимает оплату.

Переменные: `INUM_YOOKASSA_SHOP_ID`, `INUM_YOOKASSA_SECRET`, `INUM_YOOKASSA_MODE=test|live`, `INUM_YOOKASSA_RETURN_URL`, `INUM_YOOKASSA_VAT_CODE`, `INUM_YOOKASSA_PAYMENT_SUBJECT`, `INUM_PRIVATE_BOOK_DIRECTORY`. В частном каталоге: `inum.pdf`, `inum.epub`, `materik.pdf`, `materik.epub`. Его нельзя размещать в публичных статических путях.

## Границы проверки

Проверки адаптера используют подставной провайдер без настоящих платежей. Прохождение этих тестов не означает приёмку настоящего магазина ЮKassa, выпуска чеков или международного эквайринга. Активация требует серверных реквизитов и отдельного интеграционного прогона.
