Backend:
- numbers.ts — per-org per-doctype per-year sequential numbering (ДГ-2026/001, СЧ-2026/001…)
- money.ts — line totals + Russian rubInWords helper
- documents/routes.ts — CRUD with transactional lines bulk-replace, status changes, history endpoint for client-line autocomplete
- templates/routes.ts — CRUD + instantiate (clones template body into new draft document)
- shared/render/toHtml.ts — block→HTML renderer with placeholder substitution ({{customer.inn}}, {{contract.number}}, {{today}}…)
- documents/pdf.ts — Puppeteer-based PDF rendering with auto-detected Chromium executable
- documents/pdf.routes.ts — GET /:id/preview (HTML) and GET /:id/pdf
- Dockerfile.api — added apk chromium + cyrillic fonts
Web:
- api.ts — Document, DocumentTemplate, Block, LineHistoryItem types
- BlocksEditor — generic block list with reorder/add/remove and per-block forms (heading, party, services_table, totals, terms, signatures, custom_text, page_break)
- LinesEditor — services rows with auto sumCents, "from catalog" picker, "from history by client" panel
- ClientPicker — reusable client dropdown
- pages: Documents list, DocumentEdit (new+existing), Templates list, TemplateEdit
- richtext.ts — plain↔TipTap-JSON conversion (no TipTap yet, just keeps the format compatible)
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