Обзор системы
HELLOWORLD — веб‑платформа для генерации пакета кредитных документов ОАО «Капитал Банк Центральной Азии». Заменяет десктопныйdoc_generator.py, но с учётом хранения истории, статистики и командной работы.
По каждому клиенту система формирует до 5 PDF-файлов:
- Кредитный договор —
work1.docx(обычный) илиwork1_target.docx(целевой), 10 страниц, все реквизиты, подпись директора + печать + подпись заёмщика на последней стр. - Заявка на конверсию KGS→RUB —
work3.docx, 1 страница, с курсом, счетами клиента, ролями сотрудников и подписями (клиент / операционное управление / казначейство). - Кассовый ордер —
work2.pdf, 1 страница, overlay текста PyMuPDF: сумма RUB, счёт клиента, прописью, паспорт, дата, контролёр / бухгалтер / кассир. - Агентский договор Аска-Тоо —
agency.docx, включается галкой «Сгенерировать вместе с пакетом». Аска-Тоо (Агент) конвертирует RUB → USD и оплачивает поставщика техники. - Commercial Invoice поставщика (CLAAS / John Deere / AGCO Fendt) — PDF, реквизиты и модель зависят от выбранного «Поставщик техники» в форме.
Правила для агента (чек-лист перед работой)
Этот раздел — основной справочник для ИИ-агента. Перед созданием пакета, регенерацией, отправкой в Telegram или любым автоматическим действием агент обязан свериться с этой инструкцией. Если каких-то данных не хватает — ОСТАНАВЛИВАЕТСЯ и спрашивает у пользователя, а не подставляет заглушки и не оставляет пустые поля.
Обязательные поля клиента (без них не создавать пакет)
| Поле API (PackCreate) | Поле в БД (packs) | Где используется | Пример |
|---|---|---|---|
| full_name | client_name | все документы | Эмилбек Уулу Шумкар |
| inn | inn | кредит, конверсия | 20806200150208 |
| passport_id ⚠ | passport | кредит, ордер | 1012030 |
| passport_prefix | passport_prefix | кредит, ордер | ID / AN |
| address | address | кредит, конверсия | г. Бишкек, ул. Чуй 128, кв. 47 |
| mkk_number | mkk_number | кредит, ордер | 214071 |
| mkk_date | mkk_date | кредит | 31.12.2018 |
| contract_number | contract_number | кредит, № договора | 5810 |
| contract_date | contract_date | кредит | 2026-02-25 |
| credit_type | credit_type | выбор шаблона | целевой (default) |
| credit_purpose | credit_purpose | кредит | сельхозтехника (default) |
| credit_amount | credit_amount_kgs | кредит, ордер | 11500000 |
| credit_term_months | credit_term_months | кредит | 12 |
| account_suffix | account_suffix | все документы | 2809535 |
| conversion_rate | conversion_rate | конверсия | 1.1385 |
| signature_name (auto) | signature_name | кредит (подпись) | Эмилбек у. Ш. |
| borrower_sign_choice | borrower_sign_choice | картинка подписи | Рандом / имя файла |
PackCreate использует passport_id, в БД поле называется passport. Если отправить в API ключ passport — pydantic его молча проигнорирует, и в PDF будет пусто. То же с credit_amount (неcredit_amount_kgs).Обязательные поля агентского договора
| Поле | Где используется | Пример |
|---|---|---|
| generate_agency | включает генерацию агентского+инвойс | true |
| dob | агентский (данные принципала) | 2001-06-08 |
| phone | агентский | +996 (555) 815-882 |
| агентский | [email protected] | |
| agency_contract_number | агентский | 5810 |
| agency_contract_date | агентский | 2026-08-07 |
| transfer_date | поручение принципала | 2026-08-07 |
| transfer_amount_rub | агентский, инвойс, поручение | 7000000 |
| usd_rate | инвойс, расчёты | 82,6500 |
| claas_invoice_number | инвойс, акт | CLA-0494/26 |
| claas_invoice_date | инвойс, агентский | 2026-06-29 |
| act_date | акт-отчёт | 2026-08-21 |
| supplier | выбор поставщика | claas / john_deere / agco_fendt |
Правило: если данных не хватает — СПРОСИ
- Если у клиента нет паспорта (пустой
passport) — спросить у пользователя серию/номер. Не подставлять «0000000», не оставлять пустым. - Если нет МКК (
mkk_number/mkk_date) — спросить, а не генерировать случайные. - Если нет адреса — спросить (или использовать «🎲 бишкекский адрес» из справочника, но только с явного разрешения пользователя).
- Если нет подписи клиента в
/assets/podpisi_CLIENTSпод ФИО — спросить, приложит ли пользователь. Не подставлять чужую подпись как «свою». - Если нет даты одного из документов — рассчитать по правилам «Хронология дат» ниже и показать пользователю рассчитанные даты для подтвержденияперед генерацией.
- Если несколько сценариев одинаково валидны — предложить пользователю выбор через инструмент AskQuestion, а не выбирать самому.
Правило: signature_name (короткая форма ФИО в подписи)
Автоматически формируется бэкендом функцией _short_fio_ru() в app/core/generator.py из full_name, если поле пустое. Формат:
Курманбеков Шамил Курманбекович→Курманбеков Ш. К.Эмилбек Уулу Шумкар→Эмилбек у. Ш.Мирлан кызы Бегайым→Мирлан к. Б.Калмаматов Расул(2 слова) →Калмаматов Р.Абыгазиев(1 слово) →Абыгазиев
/generate — если оставить signature_name пустым, бэкенд сам подставит инициалы по этой формуле. Явное значение всегда имеет приоритет.Правило: отправка в Telegram (5 файлов на клиента)
Стандартный пакет для отправки — ровно 5 PDF + сообщение с ФИО в конце:
- Кредитный договор (_scanned.pdf)
- Заявка на конверсию (_scanned.pdf)
- Кассовый ордер (_scanned.pdf)
- Агентский договор без скана
- Commercial Invoice без скана
- → следом коротким сообщением:
ФИО клиента
Правило: 2-й раунд (повторное поручение)
Если клиент делает ещё один перевод — не создавать новый пакет ине трогать оригинальный кредитный/агентский договор. Использовать кнопку «Новое поручение» в карточке пакета или API POST /api/packs/{pack_id}/rounds. Round-2 генерирует только: Поручение принципала, Акт-отчёт, Commercial Invoice. Даты нового раунда: не раньше, чем через 2–3 недели после акта предыдущего.
Правило: кредит на сельхозтехнику (по умолчанию)
- credit_type: «целевой» (значение
целевой) → шаблонwork1.docx— договор на сельхозтехнику. - credit_purpose: «сельхозтехника» — базовое значение по умолчанию, если пользователь не указал другое.
- Другой тип (
обычный) →work1_target.docx— используем только если пользователь явно попросил «потребительский».
Аудит: как проверить, что все поля заполнены
Перед отправкой в Telegram открыть сгенерированный кредитный PDF и визуально проверить последнюю страницу (реквизиты сторон):
Паспорт ID <номер>— должен быть номер, не пустоВыдан МКК <номер> от <дата> г.— оба значения на местеАдрес регистрации: <полный адрес>— не только «г. Бишкек»- Строка подписи заёмщика:
<Фамилия И.О.>__________— не пустая линия
А также в первом абзаце договора: «Эмилбек Уулу Шумкар (Паспорт ID 1012030, выдан МКК 214071 от 31.12.2018 г.), зарегистрированный по адресу:<полный адрес>». Если какое-либо значение пропущено — вернуться к созданию, спросить у пользователя, обновить БД, регенерировать.
Хронология дат документов
Обязательная последовательность и ориентировочные разрывы между датамидля одного клиента. Если даты ставятся вручную — соблюдай эту логику. Если поля пустые — система заполняет их автоматически согласно этим правилам.
Эталонный пример (по одному клиенту)
| # | Документ | Пример даты | Разрыв от предыдущего | Поле в системе |
|---|---|---|---|---|
| 1 | Кредитный договор | 20.02.2026 | — базовая дата | contract_date |
| 2 | Заявка на конверсию | 25.02.2026 | +3…6 рабочих дней от кредита | operation_date |
| 3 | Кассовый ордер (снятие RUB) | 26.02.2026 | +1 рабочий день от конверсии | cash_order_date |
| 4 | Commercial Invoice поставщика | 25.06.2026 | ~4 месяца после ордера (техника заказана) | claas_invoice_date |
| 5 | Агентский договор Аска-Тоо | 28.07.2026 | ~1 месяц после инвойса | agency_contract_date |
| 6 | Поручение принципала (заявление на перевод) | 02.08.2026 | +3…7 дней от агентского | transfer_date |
| 7 | Акт-отчёт агента | 15.08.2026 | +10…14 дней от поручения | act_date |
Правила ± допусков и запреты
- Кредит → Конверсия: строго +3…6 рабочих дней. Никогда не в тот же день. Если выпадает на сб/вс — сдвиг на понедельник.
- Конверсия → Кассовый ордер: обязательно +1 рабочий день. Кассовый ордер не может быть тем же днём, что и заявка на конверсию («конверсия в один день, снятие — на следующий»).
- Ордер → Инвойс поставщика: ориентир ~3–4 месяца — техника заказывается заранее.
- Инвойс → Агентский договор: ориентир ~3–6 недель. Агентский договор всегда после инвойса, не раньше.
- Агентский → Поручение принципала: обычно 3–10 дней. Поручение = момент, когда клиент даёт агенту распоряжение перевести RUB.
- Поручение → Акт-отчёт: 10–14 календарных дней — банковский процесс конверсии, отправки и подтверждения поставщика.
- Пересечение договоров запрещено: у одного клиента даты кредитного и агентского договоров не должны совпадать или идти «внахлёст» (агентский всегда сильно позже, минимум через несколько месяцев).
- Раунды (повторные поручения): следующий раунд поручения возможен не раньше, чем через 2–3 недели после акта предыдущего раунда.
Что делает система автоматически
- Если
operation_dateне задана — берётсяcontract_date + 3..6 рабочих дней(без сб/вс). - Если
cash_order_dateне задана — берётсяoperation_date + 1 рабочий день(без сб/вс). - Если
transfer_date(агентский) не задана — берётсяagency_contract_date + N дней(см. модульagency.py). - Если
act_dateне задана — считается от даты поручения по стандартному банковскому расписанию. - Все сдвиги пропускают выходные (сб/вс). Праздники не учитываются — проверяй визуально.
Главная — Dashboard
Страница / — сводная витрина: KPI, разбивки, график активности.
Активность за период
- Сегодня / Вчера — количество новых пакетов и сумма переводов ₽
- 7 дней / 30 дней — накопительно
- Всего — с момента запуска системы
Разбивки
- По статусам (Новый / В работе / Использован / Оплачен / Отменён)
- По банкам‑получателям (агрегируется из блока «Переводы»)
- По дням за последние 30 суток — на графике
Создание пакета
Страница /generate. Форма разбита на 6 блоков:
① Клиент
- ФИОПолное имя. Если в справочнике «Подписи по клиентам» лежит PNG с этим именем — он автоматически возьмётся при выборе подписи «Рандом».
- ИНН (14 цифр)Реальный ИНН клиента. Кнопка рандома удалена намеренно — сюда только реальные данные.
- ПаспортСелектор ID/AN (90 px) + номер (7–8 цифр). Кнопка рандома удалена.
- Адрес🎲 подставит случайный бишкекский адрес (реальные улицы/микрорайоны из справочника).
- МКК: № / датаКем и когда выдан паспорт. Например: 600044 / 26.02.2022.
② Кредит
- Тип договораОбычный/Потребительский → шаблон work1_target.docx. Целевой (сельхозтехника) → work1.docx.
- № договора4-значный номер, генерируется рандомом (🎲) или вводится вручную. Полный номер формируется как ГО-<номер>-<год>-П/К.
- Дата договораДень подписания договора клиентом.
- Сумма (KGS)Сумма кредита в сомах. 🎲 подставляет между 8.5–10.0 млн ₽ округлённо.
- Цель кредитаВыбор из справочника /settings/purposes или свободный ввод. ⚙ рядом — открывает справочник.
- Срок (мес.)6, 12, 24, 48 и т.д. — от этого зависит дата окончания в договоре.
③ Счёт клиента
Один 7-значный суффикс → 3 счёта клиента (KGS, RUB, ссудный). Формат:1030162002XXXXXXX для KGS-счёта.
④ Конверсия KGS → RUB
- Курс KGS/RUBКурс НБКР на дату операции. Кнопка «Курс НБКР» открывает официальный сайт на нужную дату.
- Дата операцииПусто = автоматически «дата договора + 1–3 рабочих дня». Кнопка «Курс на день» открывает НБКР на эту дату.
⑤ Подписи
- Инициалы клиентаНапример «Ж. Кудайбердиева» — что будет напечатано в подписной линии. Если пусто — берётся из ФИО.
- Картинка подписиВыбор из общего пула. «Рандом» = если у клиента есть персональная (по ФИО), возьмётся она; иначе случайная из пула /assets/podpisi_ZAEMSHIK.
⑥ Файлы и опции
- Генерировать заявкуСоздать work3 (заявку на конверсию) + ордер в RUB.
- Делать ч/б сканыСоздать «_scanned.pdf» — визуально ксерокопии.
- Плоская схема имёнВсе файлы в одну папку с датой в имени. Иначе — вложенная структура.
- Сотрудники банка⚙ открывает справочник /settings/staff.
История пакетов
Страница /packs — таблица всех сгенерированных пакетов.
Фильтры
- Поиск — по ФИО, № договора, ИНН.
- Статус — Новый / В работе / Использован / Оплачен / Отменён.
- Банк — фильтр по банку-получателю из переводов.
- Переводы — только с переводами / только без.
- Период — пресеты (Сегодня, Вчера, 7 дней, 30 дней, Всё время) + выбор поля («по дате договора» или «по дате создания») + произвольные даты.
Колонки
- КлиентФИО, кликается — переход в карточку. ⏳ = генерация в процессе. ✗ = ошибка (наведи для деталей).
- № договора4-значный номер из формы.
- ДатаДата договора.
- Сумма KGSОсновная сумма из формы.
- Переводы ₽Сумма всех переводов клиента + в скобках количество. Кликается на карточку.
- АудитСоотношение проверок (например 19/19).
- СтатусСелектор, меняется на месте — сохраняется автоматически.
- КомментарийИнлайн-редактирование, кнопка 💾 появляется при изменении.
Действия
Массовые операции
- Чекбокс в шапке — выделить всё на текущей странице.
- Чекбокс в строке — выбрать конкретный пакет.
- Кнопка «Скачать выбранные (N)» — один ZIP с папками по каждому клиенту.
Карточка клиента (пакет)
Страница /packs/[id] — детальная карточка одного пакета.
Верх — метаданные и кнопки
- ЗаголовокФИО клиента + № договора + дата + сумма KGS.
- Скачать ZIPВсе PDF пакета одним архивом.
- Изменить данныеОткрывает /generate?from=<id> с заполненной формой для правки и перегенерации.
- ПерегенерироватьПересобирает PDF без изменения данных. Удаляет старые файлы, аудит перезапускается.
- УдалитьПолностью удаляет пакет из БД и файловой системы.
Блок «Статус пакета»
Селектор статуса + свободный комментарий. Сохранение по кнопке «Сохранить» (пишется в аудит-журнал).
Блок «Переводы клиента»
Учёт денежных переводов от клиента. Один клиент = много переводов.
- Форма добавления — Сумма ₽ / Банк / Дата / Заметка → «+ Добавить».
- Таблица — все переводы клиента, отсортированы по дате (новые сверху).
- Итого — сумма всех переводов внизу таблицы.
- Удаление — крестик в правой колонке (с подтверждением).
- Автообновление — суммы и статистика пересчитываются мгновенно.
Реквизиты
Сводка ключевых полей пакета: ИНН, паспорт, тип кредита, цель, курс, сумма RUB, аудит, статус. Читаемая копия для просмотра.
Файлы
Список PDF-файлов пакета с размером. По каждому файлу: — открыть в новой вкладке, — скачать.
Учёт переводов клиента
Что это. В системе хранится история денежных переводов, приходящих от клиента (за товар, за кредит и т.п.), с разбивкой по банкам и датам. Каждый пакет может иметь множество записей о переводах.
Пример учёта
Клиент James Bond внёс двумя платежами:
- 29.07 — 500 000 ₽ через ВТБ (комментарий: «на карту»)
- 04.08 — 200 000 ₽ через Сбербанк (комментарий: «остаток»)
В карточке клиента:
Дата Банк Сумма ₽ Заметка
2026-08-04 Сбербанк 200 000 остаток
2026-07-29 ВТБ 500 000 на карту
─────────
700 000 ₽Где отражается
- В списке
/packs— колонка «Переводы ₽» с суммой и (кол-во). - На главной — виджеты «Активность» суммируют переводы за период.
- На главной — «Топ банков» показывает разбивку сумм по банкам.
- Фильтр «Только с переводами / Без переводов» на
/packs. - Фильтр «Банк = ВТБ» и т.п. — тоже на
/packs.
Настройки
Страница /settings — четыре раздела со справочниками.
Цели кредита
/settings/purposes — редактируемый список целей. Появляется в подсказках при вводе «Цель кредита» и в кнопке 🎲 (случайная цель).
Сотрудники банка
/settings/staff — ФИО сотрудников с распределением по ролям:
- Контролер / Бухгалтер / Кассир — используются в кассовом ордере (work2).
- Операционное управление / Казначейство — в заявке на конверсию (work3).
- При генерации по каждой роли выбирается случайное ФИО из списка (без дублей).
Подписи и штампы
/settings/signatures — 3 бакета PNG-файлов. Подробнее — ниже.
Telegram-бот
/settings/telegram — привязка вашего Telegram (chat_id) к учётной записи, чтобы отправлять PDF пакета одной кнопкой из карточки клиента. Инструкция по привязке — на самой странице.
Подписи и штампы
Страница /settings/signatures с тремя вкладками. Каждая вкладка = отдельная папка на сервере.
Пул заёмщиков
Случайная подпись для клиента, если у него нет персональной.
Имя файла: Любое имя файла (не пересекается).
По клиентам
Персональная подпись конкретного клиента. Берётся автоматически при совпадении ФИО.
Имя файла: Имя файла = точное ФИО клиента.
По сотрудникам
Подпись сотрудника банка, ляжет рядом с его ФИО в кассовом ордере и заявке на конверсию.
Имя файла: Имя файла = точное ФИО сотрудника.
Как это работает при генерации
- Для клиента: сначала ищется PNG в «По клиентам» по ФИО. Если нет — случайная из «Пул заёмщиков».
- Для сотрудников: подпись фамилии, выбранной по роли, ищется в «По сотрудникам». Если персональной нет — берётся случайная (уникальная в рамках документа) из того же бакета «По сотрудникам», не из пула заёмщиков.
- Для штампа банка + подписи директора на стр. 10 договора — берётся случайная из
/assets/shtampiи/assets/podpisi(общий пул).
Типовые сценарии
1. Создать пакет для нового клиента
- Открой /generate (кнопка «Создать» в меню).
- Заполни блоки Клиент / Кредит / Счёт / Конверсия / Подписи / Опции.
- Нажми «⚡ Сгенерировать пакет».
- После генерации откроется карточка клиента с 3 PDF-файлами.
2. Отметить перевод от клиента
- В карточке клиента найди блок «Переводы клиента».
- Введи сумму ₽, выбери банк, дату, при желании — заметку.
- Нажми «+ Добавить». Сумма моментально появится в списке /packs и на главной.
3. Массовая выгрузка
- На /packs включи нужные фильтры (например: за 7 дней, только с переводами).
- Отметь пакеты чекбоксами (или «выбрать все» в шапке таблицы).
- Нажми «Скачать выбранные (N)» — получишь один ZIP.
4. Поправить опечатку и перегенерировать
- В карточке клиента нажми «📝 Изменить данные».
- Форма /generate откроется с данными этого пакета.
- Внеси правки и нажми «💾 Сохранить и перегенерировать».
- Старые PDF удалятся, новые пересоберутся, аудит перезапустится.
- Если галка «Сгенерировать агентский» включена — агентский и инвойс тоже пересоберутся.
5. Собрать агентский договор + инвойс поставщика
- В форме /generate заполни блок «⑦ Агентский договор + инвойс».
- Выбери поставщика (CLAAS / John Deere / AGCO Fendt) — от него зависят реквизиты инвойса и модель техники.
- Заполни: дату рождения клиента, № и дату инвойса, сумму ₽, курс USD/RUB, дату перевода клиента.
- Включи галку «Сгенерировать сразу вместе с пакетом» и нажми «⚡ Сгенерировать пакет».
- В карточке клиента появится отдельный блок «Агентский договор + инвойс» с двумя PDF.
6. Отправить PDF пакета в Telegram
- Один раз привяжи свой Telegram на /settings/telegram (см. FAQ).
- В списке /packs или в карточке клиента нажми «В Telegram» (📤).
- Все PDF пакета уйдут тебе в личку. Ссылку/файлы можно переслать в рабочий чат.
5. Проверить сколько прошло через ВТБ
- Открой /packs.
- В фильтре «Все банки» выбери «ВТБ».
- Внизу — общий счётчик пакетов, а на главной — «Топ банков‑получателей» покажет сумму.
FAQ
PDF не генерируется, статус «error»развернуть
В договоре пусто в блоке «ЗАЕМЩИК»развернуть
Штамп не накрыл «Исаканова Э.С.» на последней страницеразвернуть
/assets/shtampi и /assets/podpisi. Загрузи их через /settings/signatures (или дай ссылку админу, он разложит).У клиента должна быть его личная подпись, а не случайнаяразвернуть
Как посмотреть курс НБКР на конкретную дату?развернуть
/generate рядом с полями «Курс KGS/RUB» и «Дата операции» есть кнопки Курс НБКР — они открывают официальный сайт НБКР с параметрами выбранной даты.Пакет создан по ошибке, как удалить?развернуть
/packs — кнопка удалить в строке.Как быстро внести 10 переводов подряд?развернуть
Можно ли сгенерировать без сканов и заявки?развернуть
/generate в блоке «⑥ Файлы и опции» сними галки: «Генерировать заявку на конверсию» и «Сразу делать ч/б сканы». Тогда получишь только договор + кассовый ордер.Как отправить пакет PDF в Telegram?развернуть
/settings/telegram: напиши боту /start, скопируй chat_id в поле и нажми «Привязать» — бот отправит тебе тестовое сообщение. После этого в списке пакетов и в карточке клиента появится кнопка «В Telegram» (значок 📤) — она отправит все PDF пакета тебе в личку. Если статус пакета «⏳ генерация», кнопка неактивна.