⚡ Работает в production 3+ года
CoinCounter создавался для небольших ИП и собственников бизнеса, которые не имеют возможности нанять экономиста или платить дорогие подписки за популярные финансовые сервисы.
Проблема: Ручной учёт транзакций отнимает 2-3 часа каждую неделю, а бесплатные решения не дают нужной аналитики.
Решение: Полностью автоматизированная система с AI/NLP-категоризацией, работающая на вашем сервере. Все данные под контролем, никаких подписок.
- 📊 Автоматическая категоризация транзакций (99.6% точность)
- 🧠 Продвинутый NLP-алгоритм (подробнее)
- 🔍 Multi-query + Lemmatization + Synonyms + Vector Search
- 🚀 Три источника: по ИНН, по ключевым словам, через AI embeddings
- 📱 Telegram-уведомления в реальном времени
- 📑 Экспорт в Google Sheets для совместной работы
- 📈 Интерактивный Dashboard с аналитикой и графиками
- 🔗 Интеграция с Битрикс24 для анализа воронки продаж
- 🎛️ Django Admin для удобного управления данными
- 💾 Доступ к данным: SQLite + Django Admin (интерфейс для всех операций)
Работает на реальных данных малого бизнеса 3+ года без проблем
- 🤖 NLP-алгоритм категоризации
- 📸 Примеры интерфейсов
- ⚡ Производительность
- 🛠 Технологии
- 📁 Структура проекта
- 🚀 Установка и запуск
- ⚙️ Настройка категоризации
- 🔑 Получение API-ключей
- 🧭 Roadmap
- 📬 Контакты
Система использует продвинутый многоуровневый NLP-алгоритм для автоматической категоризации транзакций:
- Multi-Query: разбиение сложных назначений платежей на смысловые единицы
- Лемматизация (pymorphy2): приведение слов к начальной форме
- Синонимы (RuWordNet): расширение поиска через семантически близкие слова
- Vector Search: косинусное расстояние между embedding-векторами (OpenAI API)
- Smart Boosting: бонусы за точное совпадение, лемму и синонимы
final_score = base_embedding_similarity
+ (0.25 if exact_match else 0)
+ (0.15 if lemma_match else 0)
+ (0.10 if synonym_match else 0)- 99.6% (3021/3033 транзакций на реальных данных)
- Время обработки: 5-15ms на транзакцию (с кэшем)
📖 Подробное описание алгоритма: NLP_ALGORITHM.md
![]() |
![]() |
![]() |
|
Возможности:
- 📈 Графики выручки и себестоимости по месяцам
- 💰 KPI карточки (выручка, расходы, прибыль, маржинальность)
- 📊 Детальные метрики по месяцам
- 🏷️ Расходы по категориям
- 📅 Фильтрация по годам
![]() |
![]() |
![]() |
Возможности:
- ✅ Итоги загрузки транзакций
- 💵 Выручка по контрагентам
- 📉 Расходы по категориям
- 🤖 Статистика NLP-категоризации
⚠️ Неразнесённые транзакции
Важно: это примеры и в проекте их нет. Но вы всегда можете собрать такие сводные таблички и диаграммы самостоятельно.
![]() |
![]() |
Возможности:
- 📊 Автоматический экспорт новых транзакций
- 🔄 Синхронизация с существующими таблицами
- 📈 Базовая аналитика и сводные таблицы (вы настраиваете самостоятельно)
- 👥 Совместный доступ для команды
Оптимизация 2026: Добавлено 10 индексов БД для быстрых запросов
| Операция | До | После | Улучшение |
|---|---|---|---|
| Запросы по году/месяцу | Полное сканирование | Индекс | 10-100x |
| Запросы по batch_id | Медленно | Индекс | 50-100x |
| Фильтрация по статусам | Медленно | Индекс | 10-50x |
| NLP категоризация | 50-150ms | 5-15ms | 10x (с кэшем) |
- Django 5.2.3 - основа проекта, ORM, админ-панель
- Celery + Redis - асинхронные задачи для обработки транзакций
- SQLite - хранилище данных (рекомендуется PostgreSQL для продакшена)
- pymorphy2 - морфологический анализ русского языка
- RuWordNet - русская версия WordNet для синонимов
- OpenAI Embeddings API - векторное представление текста
- LRU кэширование - оптимизация производительности
- Telegram Bot API (aiogram) - уведомления и взаимодействие
- Google Sheets API (gspread) - экспорт данных
- Bitrix24 REST API - анализ сделок и лидов
- Tochka Bank API - автоматическое получение выписок
- Ubuntu 22.04 - production сервер
- HTTPS (Let's Encrypt) - SSL-сертификат
- tmux - фоновый запуск сервисов
- python-dotenv - управление конфигурацией
CoinCounter/
├── 📄 README.md # Этот файл
├── 📄 NLP_ALGORITHM.md # Описание NLP-алгоритма
├── 📄 env.example # Шаблон для .env (НАЧНИ ОТСЮДА!)
├── 📄 requirements.txt # Зависимости проекта
├── 📄 manage.py # Django management
│
├── 📁 coin_counter/ # Основные настройки Django
│ ├── settings.py # Конфигурация + валидация
│ ├── celery.py # Настройки Celery
│ ├── urls.py # URL-маршруты
│ └── wsgi.py
│
├── 📁 coin_desk/ # Главное приложение
│ ├── models.py # Модели БД (с индексами!)
│ ├── views.py # Webhook'и Битрикс24
│ ├── tasks.py # Celery-задачи
│ ├── admin.py # Админ-панель
│ │
│ ├── 📁 management/commands/ # Django команды
│ │ ├── fetch_bank_data.py # Получение выписок
│ │ ├── export_transactions_to_sheets.py # Экспорт в Sheets
│ │ ├── notify_about_new_transactions.py # Уведомления
│ │ └── run_telegram_bot.py # Запуск бота
│ │
│ ├── 📁 scripts/ # Бизнес-логика
│ │ ├── bank_fetch.py # Работа с банковским API
│ │ └── keywords.py # Ключевые слова для категоризации
│ │
│ ├── 📁 telegram_bot/ # Telegram интеграция
│ │ ├── bot.py # Инициализация бота
│ │ ├── handlers.py # Обработчики команд
│ │ └── utils.py # Утилиты для уведомлений
│ │
│ ├── 📁 utils/ # NLP утилиты
│ │ ├── nlp_processor.py # Основной NLP-процессор
│ │ ├── embedding.py # AI embeddings
│ │ └── embedding_cache.py # Кэш embeddings
│ │
│ └── 📁 migrations/ # Миграции БД
│
├── 📁 dashboard/ # Dashboard приложение
│ ├── dashboard_transactions.py # Логика формирования данных
│ ├── views.py # Views для дашборда
│ └── 📁 templates/dashboard/ # HTML шаблоны
│
├── 📁 config/ # Конфигурация
│ └── *.json # Google Sheets credentials
│
├── 📁 examples/ # Скриншоты интерфейсов
│
└── 📁 staticfiles/ # Статика Django (создаётся автоматически)
- Python 3.11+
- Redis (для Celery)
- SQLite (в разработке) или PostgreSQL (продакшен)
git clone https://github.com/OlgaKalinina101/CoinCounter
cd CoinCounterpython3.11 -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windowspip install -r requirements.txt# Ubuntu/Debian
sudo apt install redis-server
# macOS
brew install redis
# Windows
# Используйте WSL или DockerВАЖНО: Используйте env.example как шаблон!
cp env.example .envМинимальная конфигурация для разработки:
# Django (обязательно!)
SECRET_KEY=your-secret-key-here-generate-with-python-manage-py-shell
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1
CURRENT_YEAR=2026
# Timezone
TIMEZONE=Europe/Moscow
# Database
SQLITE_PATH=db.sqlite3
# Static files
STATIC_URL=static/📖 Как получить остальные ключи, читайте в разделе Получение API-ключей
python manage.py migratepython manage.py collectstatic --noinputpython manage.py createsuperuserВариант 1: Только Django (для начала)
python manage.py runserverВариант 2: С Celery (полный функционал)
# Терминал 1: Django
python manage.py runserver
# Терминал 2: Redis
redis-server
# Терминал 3: Celery Worker
celery -A coin_counter worker -l info
# Терминал 4: Celery Beat (опционально, для расписания)
celery -A coin_counter beat -l infoВариант 3: С APScheduler (альтернатива Celery Beat)
Если вы не хотите использовать Celery Beat для расписания задач, можно использовать automation_scheduler.py с APScheduler:
# Терминал 1: Django
python manage.py runserver
# Терминал 2: Automation Scheduler
python automation_scheduler.pyЧто делает automation_scheduler.py:
- 📅 Автоматическая загрузка банковских транзакций (два раза в день, или как настроите)
- 📊 Экспорт новых транзакций в Google Sheets (два раза в день, или как настроите)
- 📱 Отправка уведомлений в Telegram (два раза в день, или как настроите)
💡 Преимущества APScheduler:
- Не требует Redis
- Проще в настройке
- Работает в одном процессе
- Идеален для небольших проектов
⚠️ Важно: Используйте либо Celery Beat, либо APScheduler, но не оба одновременно!
- Админка: http://localhost:8000/admin/
- Dashboard: http://localhost:8000/dashboard/
✅ Готово!
Все категории управляются через Django Admin:
- Откройте http://localhost:8000/admin/
- Перейдите в Expense Categories (Категории расходов)
- Нажмите Add Expense Category
- Заполните:
- Name: Название категории (например, "Расходы на маркетинг")
- PL Entry: Статья отчета о прибылях и убытках
Вы можете настроить автоматическую категоризацию по ИНН контрагента:
- Откройте http://localhost:8000/admin/
- Перейдите в Contractor Expense Mappings (Привязка контрагентов)
- Нажмите Add Contractor Expense Mapping
- Заполните:
- Contractor: Выберите контрагента из списка
- Expense Category: Выберите категорию
- Description: Описание (опционально)
Пример: Все транзакции от ООО "Яндекс" (ИНН: 7736207543) автоматически попадут в категорию "Расходы на рекламу".
Ключевые слова для автоматической категоризации хранятся в файле:
coin_desk/scripts/keywords.py
Структура файла:
CATEGORY_KEYWORDS = {
"Название категории": [
"ключевое слово 1",
"ключевое словосочетание 2",
"фраза для поиска 3"
],
"Аренда офиса": [
"за аренду",
"по договору аренды",
"арендная плата"
],
"Расходы на рекламу": [
"рекламные услуги",
"продвижение в яндекс",
"контекстная реклама"
]
}Как добавить новые ключевые слова:
- Откройте файл
coin_desk/scripts/keywords.py - Найдите нужную категорию или создайте новую
- Добавьте ключевые слова/фразы в список
- Сохраните файл
- Перезапустите Django сервер
Советы:
- 💡 Используйте фразы из реальных назначений платежей
- 💡 Добавляйте частичные совпадения (например, "за аренду" вместо "оплата за аренду помещения")
- 💡 NLP алгоритм автоматически учитывает словоформы ("аренда", "аренды", "аренде")
- 💡 Регистр не важен (система приводит всё к нижнему регистру)
Пример реального назначения платежа:
"Оплата за аренду офисного помещения по договору №123 от 01.01.2025"
Ключевое слово:
"за аренду" # ✅ Найдёт совпадениеСистема использует три метода категоризации в следующем порядке:
-
По ИНН контрагента (самый приоритетный)
- Если у контрагента есть маппинг в
Contractor Expense Mappings
- Если у контрагента есть маппинг в
-
По ключевым словам + NLP
- Поиск по
keywords.pyс учетом:- Точного совпадения слов
- Лемматизации (словоформ)
- Синонимов из RuWordNet
- Semantic similarity через embeddings
- Поиск по
-
По умолчанию
- Если ничего не найдено, категория остается пустой (
None)
- Если ничего не найдено, категория остается пустой (
Проверка категоризации:
После добавления ключевых слов протестируйте на реальных транзакциях:
# Загрузите новые транзакции
python manage.py fetch_bank_data
# Проверьте логи
tail -f debug.log | grep "CATEGORY-NLP"В логах вы увидите:
[CATEGORY-NLP][batch-uuid] Категория определена: Аренда офиса (score=0.950) [boosts: exact, lemma]
Зачем: Для отправки уведомлений о новых транзакциях
Как получить:
- Откройте Telegram, найдите @BotFather
- Отправьте команду
/newbot - Следуйте инструкциям (придумайте имя и username бота)
- Скопируйте токен вида
123456789:ABCdefGHIjklMNOpqrsTUVwxyz
Добавьте в .env:
TELEGRAM_BOT_TOKEN=your-telegram-bot-tokenКак узнать свой Chat ID:
- Откройте https://t.me/userinfobot
- Отправьте боту
/start - Скопируйте ваш ID (число)
Добавьте в .env:
TELEGRAM_CHAT_IDS=123456789,987654321 # Можно несколько через запятуюЗачем: Для экспорта транзакций в Google Таблицы
Как получить:
- Откройте https://console.cloud.google.com/
- Создайте новый проект (или выберите существующий)
- Перейдите в APIs & Services → Enable APIs and Services
- Найдите и включите Google Sheets API
- Найдите и включите Google Drive API
- Перейдите в APIs & Services → Credentials
- Нажмите Create Credentials → Service Account
- Заполните форму (имя, описание)
- Нажмите Create and Continue
- Пропустите опциональные шаги
- Найдите созданный Service Account в списке
- Нажмите на него → вкладка Keys
- Add Key → Create New Key → JSON
- Скачайте файл (например,
credentials.json)
- Создайте папку
configв корне проекта:mkdir config
- Переместите скачанный JSON в
config/credentials.json - Откройте JSON, найдите поле
client_email(например,your-service@project.iam.gserviceaccount.com) - Создайте новую Google Таблицу
- Нажмите Share → добавьте этот email с правами Editor
- Скопируйте ID таблицы из URL:
https://docs.google.com/spreadsheets/d/[ВОТ_ЭТОТ_ID]/edit
Добавьте в .env:
GOOGLE_SHEETS_CREDENTIALS=config/credentials.json
GOOGLE_SHEET_ID=your-google-sheet-idЗачем: Для автоматического получения банковских выписок
Важно: Проект работает с банком Точка. Если у вас другой банк, адаптируйте coin_desk/scripts/bank_fetch.py.
Как получить:
- Откройте личный кабинет банка Точка
- Перейдите в раздел API или Интеграции
- Создайте API-ключ или JWT-токен
- Скопируйте Client ID и токен
- Найдите номера счетов и БИК банка
Добавьте в .env:
CLIENT_ID=your-bank-client-id
JWT_TOKEN=your-bank-jwt-token
BANK_ACCOUNTS=account1,account2,account3 # Через запятую
BANK_BIC=bank-bic-codeЗачем: Для интеграции с CRM и анализа сделок/лидов
Как получить:
- Откройте ваш портал Bitrix24
- Перейдите в Настройки → Настройки портала → Вебхуки
- Нажмите Создать вебхук
- Выберите нужные права (например,
crmдля сделок и лидов) - Скопируйте URL вида
https://your-domain.bitrix24.ru/rest/1/your-token/ - Токен - это часть после
/rest/1/
Добавьте в .env:
WEBHOOK_TOKEN=your-deals-webhook-token
WEBHOOK_TOKEN_2=your-leads-webhook-tokenЗачем: Для AI-категоризации транзакций через embeddings
Как получить:
- Откройте https://platform.openai.com/ (требует VPN).
- Зарегистрируйтесь или войдите
- Перейдите в API Keys
- Нажмите Create new secret key
- Скопируйте ключ (показывается один раз!)
Добавьте в .env:
OPENAI_API_KEY=sk-your-openai-api-key
LLM_API_KEY=sk-your-openai-api-key # Можно использовать тот же ключ
⚠️ Внимание: Использование OpenAI API платное (~~три копейки, за три года не сьел даже доллар). Проверьте тарифы на https://openai.com/pricing
В проекте сознательно отсутствует эмбеддинг модель с hugging face, так как целевая аудитория не имеет возможности купить себе хороший ноутбук.
Путь: db.sqlite3 (в корне проекта)
Инструменты для просмотра:
- DB Browser for SQLite - графический интерфейс
- SQLite CLI - командная строка
- DBeaver - универсальный клиент БД
Пример запроса:
sqlite3 db.sqlite3
SELECT * FROM coin_desk_transaction ORDER BY date DESC LIMIT 10;URL: http://localhost:8000/admin/
Возможности:
- ✏️ CRUD операции для всех моделей
- 🔍 Поиск и фильтрация
- 📊 Экспорт в CSV
- 🎨 Удобный веб-интерфейс
- Сервер: Ubuntu 22.04
- HTTPS: SSL-сертификат через Let's Encrypt
- Процесс-менеджер: tmux (3+ года без проблем)
- База: SQLite (рекомендуется PostgreSQL для масштабирования)
# Сессия 1: Django
tmux new -s django
python manage.py runserver 0.0.0.0:8000
# Сессия 2: Celery Worker
tmux new -s celery
celery -A coin_counter worker -l info
# Сессия 3: Telegram Bot
tmux new -s telegram
python manage.py run_telegram_bot- ✅ Использовать PostgreSQL вместо SQLite
- ✅ Настроить systemd вместо tmux
- ✅ Подключить Sentry для мониторинга ошибок
- ✅ Настроить автоматические бэкапы БД
- ✅ Использовать nginx + gunicorn вместо
runserver - ✅ Настроить firewall и fail2ban
-
Улучшение Dashboard
- Drill-down: провал в детали любой ячейки таблицы
- Экспорт графиков в PDF
- Кастомные фильтры и отчёты
-
Расширение функционала
- Ввод наличных операций (эквайринг)
- Подотчётные расходы сотрудников
- Планирование бюджета
-
ML улучшения
- Fine-tuning эмбеддинг-модели на доменных данных
- Обучение на ручных корректировках
- Предсказание категорий с учётом истории
-
Интеграции
- Поддержка других банков
- Интеграция с 1С
- REST API для внешних систем
- 99.6% точность (3021/3033 транзакций)
- Проверено на вручную размеченных данных за 3 года
- Три метода: ИНН маппинг, AI embeddings, правила по умолчанию
- ✅ Модульная архитектура
- ✅ 10 индексов БД для производительности
- ✅ DRY principle (без дублирования)
- ✅ Полное логирование (debug.log)
- ✅ Валидация всех входных данных
- ✅ PEP8 compliance
Разработчик: Ольга Калинина
- 💼 GitHub: @OlgaKalinina101
- 📧 Email: kalinina.olgarbc@gmail.com
- 💬 Issues: https://github.com/OlgaKalinina101/CoinCounter/issues
MIT License - используйте свободно в коммерческих и личных проектах








