admin e768d30fb6 feat: import DOCX/PDF/scanned templates via DeepSeek recognition
Backend pipeline:
- POST /api/templates/import (multipart, max 25 MB)
- extract.ts: DOCX→mammoth, PDF→pdf-parse, fallback to OCR via tesseract+poppler-utils
  (pdftoppm renders pages to PNG, tesseract reads with rus+eng)
- deepseek.ts: chat completions client with strict JSON response_format
- recognize.ts: structured prompt that produces simplified DocBody (string text),
  postprocessor wraps text in TipTap-compatible JSON, validates with zod schema
- prompt enforces placeholder substitution: {{customer.*}}, {{executor.*}},
  {{contract.number}}, {{contract.date}}, {{today}}
- error codes: NO_OCR / NO_DEEPSEEK_KEY / UNSUPPORTED_MIME / INVALID_DOC_BODY

Dockerfile: apk add tesseract-ocr (+rus +eng data), poppler-utils, imagemagick

Frontend:
- Templates page: ⤴ Загрузить документ → file picker (.docx,.pdf,.png,.jpg)
- doc type selector (contract/invoice/act/upd)
- import-banner with spinner shows uploading→analyzing stages
- on success navigates to /templates/:id (TemplateEdit) for review

Reuses DEEPSEEK_API_KEY pattern from Hall-planer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 11:40:28 +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 599 KiB
Languages
TypeScript 95.6%
CSS 4.1%
Vim Snippet 0.2%
HTML 0.1%