Backend:
- lib/crypto.ts — AES-256-GCM encrypt/decrypt for secret storage (TOCHKA_JWT_KEY)
- modules/tochka/client.ts — typed HTTP client with sandbox/prod baseURL,
auto Bearer auth from decrypted JWT, 30s timeout
endpoints: getCustomers, getAccounts, createInvoice, getInvoicePaymentStatus, getInvoicePdf
- modules/tochka/routes.ts — credentials CRUD + GET test-connection (lists customers)
JWT never returned in responses
- modules/tochka/issue.routes.ts:
- POST /api/documents/:id/issue-tochka — creates invoice in Tochka, saves
documentId+environment, advances status draft→issued
- GET /api/documents/:id/tochka/status — payment status check
- GET /api/documents/:id/tochka/pdf — proxy bank's PDF
Selects credential prod-first, falls back to sandbox
Frontend:
- api.ts: TochkaEnv, TochkaCredential, TochkaCustomer types
- CompanyEdit > Integrations tab: full UI — list creds, add for sandbox/prod,
«Проверить» button calls test-connection (validates JWT works), update token
/ archive, paste-friendly defaults (sandbox.jwt.token preset for sandbox)
- DocumentEdit (when docType=invoice): tochka-panel
- if not issued: «🏦 Выставить через Точку» button
- if issued: shows env+documentId, «PDF из банка» and «Статус оплаты» buttons
Sandbox flow: create sandbox credential with token «sandbox.jwt.token» and
any customerCode/accountCode → test connection → issue invoice.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Doc_manager
Сервис создания договоров, счетов и актов/УПД с интеграцией банка Точка. Часть экосистемы Queo.
Стек
- Backend — Node.js 20+ / Fastify / Prisma / PostgreSQL (TypeScript, ESM).
- Frontend — React + Vite + TipTap (TypeScript).
- Auth — SSO через
auth.queo.ru(RS256 JWT в cookieq_at, JWKS-валидация). - Bank — Точка API: счета и акты/УПД создаются на стороне банка, договоры — наши.
Структура
apps/
api/ # Fastify + Prisma
web/ # React + Vite
packages/
shared/ # zod-схемы и типы (DocBody, Tochka DTOs)
docker/
docker-compose.yml
Caddyfile
Подготовка перед разработкой
- Node.js ≥ 20 — установлен.
- PostgreSQL — локально или через Docker (
docker compose up postgres). - Auth_server должен принимать редиректы на
doc.queo.ru— добавить вC:\project\Auth_server\.env:ALLOWED_RETURN_TO_HOSTS=auth.queo.ru,hall.queo.ru,cloud.queo.ru,doc.queo.ru
Быстрый старт «пощупать прямо сейчас»
Нет Postgres / Docker / доступа к auth.queo.ru — всё равно работает:
npm install
npm run dev:demo
Что делает dev:demo:
- Запускает встроенный Postgres из
node_modules(первый раз скачает ~80MB binaries вdata/embedded-pg/). - Накатывает схему через
prisma db push. - Сидит организацию
DEFAULT_ORGANIZATION_ID. - Поднимает API на
:3030и web на:5173параллельно. - В API включает
DEV_BYPASS_AUTH=1— фейковый admin без auth.queo.ru.
Открыть http://localhost:5173/ — попадаешь сразу в шелл (без логина), можно ходить:
/organization— реквизиты компании,/clients— клиенты,/services— каталог услуг,- остальное — заглушки до M3+.
Данные между перезапусками сохраняются в data/embedded-pg/. Чтобы начать с нуля — удалить эту папку.
⚠️ Безопасность: DEV_BYPASS_AUTH=1 обходит JWT. API hard-checks: при NODE_ENV=production с этим флагом процесс отказывается стартовать.
Полная установка (с реальным auth.queo.ru)
npm install
cp apps/api/.env.example apps/api/.env
# отредактировать DATABASE_URL, оставить DEV_BYPASS_AUTH=0
npm run prisma:migrate
npm run -w @doc-manager/api prisma:seed
npm run dev # api+web с настоящей SSO-авторизацией
API на http://localhost:3030, web — на http://localhost:5173. Перед этим добавить doc.queo.ru в ALLOWED_RETURN_TO_HOSTS в C:\project\Auth_server\.env.
Тесты M1 (smoke)
GET http://localhost:3030/health→{ ok: true }- Открыть
http://localhost:5173без cookieq_at→ редирект наhttps://auth.queo.ru/auth/login?return_to=.... - С валидной cookie от auth.queo.ru —
/api/meотдаёт payload JWT.
Тесты M2 (организация, клиенты, услуги)
С Postgres и применённой миграцией:
- Поднять БД и применить миграцию:
docker compose -f docker/docker-compose.yml up -d postgres npm run prisma:migrate # создаст первую миграцию npm run -w @doc-manager/api prisma:seed # сидит DEFAULT_ORGANIZATION_ID GET /api/organization→ возвращает запись организации (после сида).GET /api/clients?q=...— поиск по name/inn/email.GET /api/services?includeArchived=1— каталог + архив.- В UI:
/organization— заполнить реквизиты;/clients— добавить клиента;/services— добавить услугу с ценой и НДС.
SQL-предпросмотр миграции без БД: apps/api/prisma/init.sql.preview (генерируется через prisma migrate diff).
План реализации
См. C:\Users\VVMedia\.claude\plans\floofy-baking-jellyfish.md. Этапы M1–M7.
Деплой (домашний сервер)
ssh -i ~/.ssh/id_sat vmv@192.168.0.158
cd ~/Doc-manager
git pull && docker compose build && docker compose up -d