OpenChart
Free Desktop charting with Claude or Codex. Describe alerts, research chart moves, and choose your data providers.
Трансграничное финансирование между юрлицами: заявка, предложения кредиторов, сравнение по полной стоимости и сделка под контролем оператора.
Translation pending
FinanceGitHub @284917OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Цифровая площадка трансграничного финансирования между юрлицами: российские компании публикуют заявки на ликвидность, проверенные зарубежные кредиторы присылают предложения, платформа сравнивает их по полной стоимости и ведёт сделку до статуса «Согласовано».
Демо: https://sber-delta.vercel.app · на странице входа в демо-режиме есть кнопки входа в любую роль.
| Требование | Реализация |
|---|---|
| Регистрация юрлиц с ролями, KYC/AML через администратора | Заёмщик (РФ, ИНН из 10 цифр) или кредитор (страна + рег. номер). Пакет документов PDF, решение администратора по всему пакету: одобрение или отказ с причиной, которую видит компания |
| Заявка: сумма и валюта, юрисдикция, назначение, срок, способ передачи, модерация | Все поля, способы передачи SWIFT / СПФС / CIPS / платёжный агент. Модерация автоматическая: правила проверяют сумму, срок, назначение и стоп-слова и публикуют заявку сразу. Оператору уходят только первая заявка компании и суммы выше порога; опубликованную заявку оператор снимает по жалобе кредитора |
| Отклики кредиторов с фильтрами по стране, сумме и сроку | Фильтры страна / валюта / сумма от–до / срок до. Предложение: сумма к выдаче, ставка, комиссия за организацию, дополнительные условия |
| Статусная модель, принятие/отклонение, чат, «В работе» / «Согласовано», архив и история | Шкала этапов Проверка → Публикация → Предложения → Сделка → Договор → Согласовано; предложение видно заёмщику сразу после автопроверки, оператор показывает или скрывает только отмеченные правилом; заёмщик принимает или отклоняет; чат и документы сделки; журнал событий каждой заявки; архив согласованных сделок |
| Аналитика: количество заявок, средний размер, топ-страны по спросу и предложению | Средний размер — отдельно по каждой валюте; спрос — страны получения средств; предложение — страны кредиторов; доля заявок, дошедших до сделки |
Сверх задания.
/creditors/{id}): завершённые сделки, средняя ставка и комиссия, скорость ответа, доля принятых предложений. Рейтинг из 5 появляется после первой сделки или трёх решений заёмщиков. Профиль видят заёмщики, которым показали предложение, сам кредитор и сотрудники.services/screening.py, пороги в config.py). Жёсткие правила отклоняют сразу с понятной причиной: сумма заявки, длина назначения, стоп-слова, ставка до 50%, комиссия кредитора до 10%, минимум 10% суммы. Мягкие правила отправляют оператору: первая заявка компании, сумма выше порога, ставка дальше 5 п. п. от рыночной (медиана показанных предложений в валюте). Кредиторы могут пожаловаться на опубликованную заявку./deal/{id}/contract-draft.pdf): стороны, сумма, ставка, комиссия, срок и график подставлены из сделки./admin/export.xlsx): аналитика, сделки, заявки, предложения./security): как проверяются участники, кто что видит, перечень документов KYC, сроки.DADATA_API_KEY, без неё выключено).Сравнение предложений. Для каждого оффера: проценты за срок заявки, комиссия в деньгах, переплата и полная стоимость в % годовых = ставка + комиссия × 12 / срок. Экономия лучшего предложения считается на сумму заявки, чтобы офферы с разной суммой к выдаче сравнивались честно.
main.py точка входа (Vercel / uvicorn ищут здесь app)
liquidity/
config.py переменные окружения и справочники (валюты, страны, статусы, документы KYC)
database.py подключение к БД, миграции новых колонок
models.py ORM: users, applications, offers, documents, messages, application_events, stored_files
security.py пароли (bcrypt), сессия (JWT в httpOnly-cookie со сроком), роли, CSRF
web.py шаблоны Jinja2, форматирование сумм и процентов
services/ бизнес-логика без HTTP
accounts.py регистрация, вход, сотрудники
kyc.py пакет документов и решение администратора
applications.py заявки, модерация, поиск с фильтрами, этапы
offers.py предложения, проверка оператором, решение заёмщика
deals.py доступ к сделке, чат, договор, подтверждение
costs.py полная стоимость и сравнение предложений
analytics.py аналитика и архив
files.py безопасная загрузка и выдача файлов
events.py история заявки
demo.py демо-данные
routers/ HTTP-слой по ролям: auth, borrower, creditor, kyc, deals, operator, admin
app.py сборка FastAPI: middleware, обработчики ошибок, роутеры
templates/ base.html (каркас и меню по ролям), _ui.html (общие элементы), экраны
static/css/app.css дизайн-система без внешних CDN
tests/ pytest: сквозной сценарий, сервисы, безопасность
Роутеры только принимают форму, проверяют роль (require_role) и вызывают сервис; сервисы бросают доменные исключения NotFound / Forbidden / Invalid, которые app.py превращает в ответы 404 / 403 / 400.
require_role на каждом маршруте; самостоятельно можно зарегистрироваться только заёмщиком или кредитором.httpOnly, SameSite=Lax, Secure на HTTPS, срок жизни SESSION_HOURS (8 ч).X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy.Интерфейс серверный (HTML-формы). Полная схема — /docs (Swagger) и /openapi.json.
| Метод и путь | Роль | Назначение |
|---|---|---|
GET / · POST /login · GET /logout | все | вход и выход |
GET/POST /register | гость | регистрация юрлица |
GET /dashboard | все | кабинет по роли |
GET /kyc · POST /kyc/upload · POST /kyc/submit | заёмщик, кредитор | пакет документов KYC |
POST /create_application | заёмщик | заявка (автопроверка; подозрительные — оператору) |
POST /applications/{id}/complain | кредитор | жалоба на опубликованную заявку |
GET /applications/{id}/offers | заёмщик | карточка заявки: этапы, сравнение, история |
POST /accept_offer/{id} · POST /reject_offer/{id} | заёмщик | решение по предложению |
POST /create_offer/{app_id} | кредитор | предложение по опубликованной заявке |
GET /operator/offers · POST /operator/offer/{id}/show · /hide | оператор, админ | предложения, отмеченные автопроверкой |
GET /operator/deals · GET /operator/deal/{id} · POST /operator/deal/{id}/confirm | оператор, админ | проверка и подтверждение сделки |
GET /deal/{id} · POST /deal/{id}/send · /upload_contract · /call_operator | участники, сотрудники | комната сделки |
GET /uploads/{file} | владелец, участники, сотрудники | скачать документ |
GET /admin · POST /admin/application/{id}/moderate · POST /admin/complaint/{id}/dismiss | админ, оператор | аналитика, архив, ручная проверка заявок, жалобы |
POST /admin/kyc/approve_user/{id} · /reject_user/{id} | админ |
pip install -r requirements.txt
cp .env.example .env # заполните DATABASE_URL, SECRET_KEY, ADMIN_EMAIL, ADMIN_PASSWORD
uvicorn main:app --reload
Для быстрого старта без PostgreSQL: DATABASE_URL=sqlite:///./local.db DEMO_MODE=1 uvicorn main:app.
| Переменная | Назначение |
|---|---|
DATABASE_URL | PostgreSQL (на Vercel подставляется интеграцией Neon) или SQLite |
SECRET_KEY | подпись сессий — длинная случайная строка |
ADMIN_EMAIL, ADMIN_PASSWORD | первый администратор, создаётся при старте |
DEMO_MODE=1 | демо-данные и вход в роли одной кнопкой |
SESSION_HOURS | срок жизни сессии, по умолчанию 8 |
DADATA_API_KEY | необязательно: автозаполнение компании по ИНН при регистрации (бесплатный ключ на dadata.ru) |
Vercel сам распознаёт FastAPI в main.py; каждый push в main выкатывается автоматически, для других веток — превью-ссылка.
SECRET_KEY, ADMIN_EMAIL, ADMIN_PASSWORD, для презентации — DEMO_MODE=1.Таблицы и новые колонки создаются при старте. Файлы хранятся в БД (у Vercel нет постоянного диска), лимит файла — 4 МБ.
pip install -r requirements.txt -r requirements-dev.txt
pytest -q
tests/test_flow.py — сквозной сценарий из задания: регистрация → KYC с отказом и повторной подачей → модерация → фильтры → предложения → оператор → отклонение и принятие → договор → «Согласовано» → архив и аналитика; доступ к файлам.tests/test_services.py — расчёт полной стоимости и сравнение, этапы, аналитика по валютам, валидация регистрации, демо-данные (сброс не трогает реальные данные).tests/test_autocheck.py — автоматическая проверка: публикация сразу, флаги для оператора, ставка далеко от рынка, стоп-слова, жалобы кредиторов.tests/test_feedback.py — KYC и чат без перезагрузки, удаление договора, главный администратор, модерация оператором, снятие заявки, подсказки к терминам.tests/test_extras.py — калькулятор, профиль и рейтинг кредитора, сроки ответа, проект договора, выгрузка в Excel, сохранённые фильтры, страница безопасности.tests/test_more.py — частичное финансирование и синдикат, встречная ставка, сроки действия, журнал, отпечаток договора, валютный риск, ИНН, графики, английская версия, PWA.tests/test_security.py — CSRF, флаги и срок сессии, поддельный и истёкший токен, ролевая модель, экранирование HTML, заголовки, демо-режим.Тесты запускаются на GitHub Actions при каждом push (.github/workflows/tests.yml).
Python 3.12, FastAPI, SQLAlchemy 2, PostgreSQL (Neon), Jinja2, python-jose, passlib/bcrypt · собственная дизайн-система на CSS · Vercel.
liquidity/i18n_en.py, русские шаблоны не меняются.| решение по KYC |
POST /admin/create_user | админ | сотрудник (оператор или админ) |
POST /demo/login/{role} · POST /demo/reset | демо-режим | вход в роль, пересоздание демо-данных |
GET /health | все | состояние БД и переменных окружения |