admin c2fcdec85d feat(orders): Site/Order/OrderItem + S2S incoming endpoint + Tochka webhook receiver
Schema:
- Site (organizationId, name, slug, domain, apiKey, defaultOfferTemplateId)
- Order (full customer fields, status enum, totalCents/vatCents, projectId link, rawPayload)
- OrderItem (orderId, position, name, serviceId, qty, unit, price, vat, eventDate)
- Migration 3_orders + OrderStatus enum

API:
- /api/sites — CRUD with apiKey shown only on create/regenerate
- /api/orders — list/get/convert-to-project (creates project + matches/creates client by INN)
- POST /api/incoming/orders — S2S, X-Site-Key header → resolves Site → creates Order
- POST /webhooks/tochka/<secret> — receives raw, dedupes, parses paymentId+purpose,
  matches by document number regex, creates Payment, updates Document status
  (paid/partially_paid), propagates Order.status=paid when fully covered

Web:
- /sites page: list + add site (paste-friendly modal with API key + curl example
  shown once after create/regenerate)
- /orders page: filterable list, link to project
- /orders/🆔 view with items + "Перевести в проект" button (creates project,
  upserts client by INN, links project<-order)
- Nav: «Заявки» and «Сайты» added

Manual demo flow:
1. /sites → add «Голосования» slug=voting → save the apiKey
2. curl POST /api/incoming/orders with X-Site-Key → order appears in /orders
3. Open order → «Перевести в проект» → project created with client+default
4. Create invoice document in project → «Выставить через Точку»
5. Webhook from sandbox/prod → document.status=paid → order.status=paid

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-16 15:00:24 +03:00

Doc_manager

Сервис создания договоров, счетов и актов/УПД с интеграцией банка Точка. Часть экосистемы Queo.

Стек

  • Backend — Node.js 20+ / Fastify / Prisma / PostgreSQL (TypeScript, ESM).
  • Frontend — React + Vite + TipTap (TypeScript).
  • Auth — SSO через auth.queo.ru (RS256 JWT в cookie q_at, JWKS-валидация).
  • Bank — Точка API: счета и акты/УПД создаются на стороне банка, договоры — наши.

Структура

apps/
  api/           # Fastify + Prisma
  web/           # React + Vite
packages/
  shared/        # zod-схемы и типы (DocBody, Tochka DTOs)
docker/
  docker-compose.yml
  Caddyfile

Подготовка перед разработкой

  1. Node.js ≥ 20 — установлен.
  2. PostgreSQL — локально или через Docker (docker compose up postgres).
  3. 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 без cookie q_at → редирект на https://auth.queo.ru/auth/login?return_to=....
  • С валидной cookie от auth.queo.ru — /api/me отдаёт payload JWT.

Тесты M2 (организация, клиенты, услуги)

С Postgres и применённой миграцией:

  1. Поднять БД и применить миграцию:
    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
    
  2. GET /api/organization → возвращает запись организации (после сида).
  3. GET /api/clients?q=... — поиск по name/inn/email.
  4. GET /api/services?includeArchived=1 — каталог + архив.
  5. В UI: /organization — заполнить реквизиты; /clients — добавить клиента; /services — добавить услугу с ценой и НДС.

SQL-предпросмотр миграции без БД: apps/api/prisma/init.sql.preview (генерируется через prisma migrate diff).

План реализации

См. C:\Users\VVMedia\.claude\plans\floofy-baking-jellyfish.md. Этапы M1M7.

Деплой (домашний сервер)

ssh -i ~/.ssh/id_sat vmv@192.168.0.158
cd ~/Doc-manager
git pull && docker compose build && docker compose up -d
S
Description
Doc_manager: ���������, �����, ���� + ���������� � ������. ����� Queo event OS.
Readme 647 KiB
Languages
TypeScript 96.1%
CSS 3.6%
Vim Snippet 0.2%
HTML 0.1%