c8f0306abb
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>