cp .env.example .env
# заполнить .env своими значениями
python3 -m venv .venv
./.venv/bin/python -m pip install -r requirements.txt
./run.shEXPORTUM — Telegram-бот для агропромышленной платформы, объединяющий фермеров, экспортёров, логистов и экспедиторов для эффективной организации поставок зерна.
- Создание и управление пулами зерна
- Поиск и подбор партий
- Организация логистики и экспедирования
- Управление сделками и доставками
- Административная панель для мониторинга и управления
- Создание партий зерна (культура, объём, цена, качество)
- Присоединение к пулам экспортёров
- Просмотр доступных пулов и совпадений
- Управление своими партиями
- Создание пулов (культура, объём, порт, цена FOB)
- Выбор логистов и экспедиторов
- Управление пулами (закрытие, завершение)
- Просмотр участников и статистики
- Создание карточки логиста (транспорт, маршруты, цены)
- Просмотр доступных заявок на логистику
- Подача предложений по доставке
- Управление своими перевозками
- Создание карточки экспедитора (услуги, порты, опыт)
- Просмотр доступных сделок
- Подача предложений по экспедированию
- Управление своими заявками
- Статистика системы
- Аналитика (регионы, культуры, порты)
- Экспорт данных (CSV, JSON)
- Управление пользователями
- Рассылка сообщений
{
user_id: {
"id": int,
"role": str, # "farmer", "exporter", "logistic", "expeditor"
"name": str,
"phone": str,
"email": str,
"region": str,
"inn": str,
"ogrn": str,
"company_name": str,
"company_details": str,
"registered_at": str,
...
}
}{
pool_id: {
"id": int,
"exporter_id": int,
"culture": str,
"target_volume": float,
"current_volume": float,
"price": float,
"port": str,
"status": str, # "active", "filled", "closed", "completed"
"selected_logistic_id": int | None,
"selected_expeditor_id": int | None,
"batch_ids": list[int],
"farmer_ids": list[int],
"created_at": str,
"completed_at": str | None,
...
}
}{
farmer_id: [
{
"id": int,
"culture": str,
"volume": float,
"price": float,
"status": str, # "Активна", "Зарезервирована", "sold"
"region": str,
"moisture": float,
"impurity": float,
"quality_class": str,
"pool_id": int | None,
...
}
]
}{
user_id: {
"vehicle_type": str, # "truck", "grain", "wagon"
"capacity": float,
"regions": list[str],
"ports": list[str],
"price_per_km": float,
"description": str,
...
}
}{
user_id: {
"services": str,
"dt_price": float,
"ports": list[str],
"experience": str,
...
}
}- Регистрация →
/start→ Выбор роли "Фермер" → Заполнение данных - Создание партии → "➕ Добавить партию" → Ввод данных (культура, объём, цена, качество)
- Поиск пулов → "🔍 Найти пулы" → Просмотр доступных пулов → Присоединение к пулу
- Управление партиями → "📦 Мои партии" → Просмотр/редактирование/удаление
- Регистрация →
/start→ Выбор роли "Экспортёр" → Заполнение данных - Создание пула → "➕ Создать пул" → Ввод данных (культура, объём, порт, цена) → Выбор типа документов
- Выбор логиста → Просмотр карточек логистов → Выбор логиста → Уведомление логисту
- Выбор экспедитора → Просмотр карточек экспедиторов → Выбор экспедитора → Уведомление экспедитору
- Завершение пула → "🎉 Завершить пул" → Подтверждение → Уведомления всем участникам
- Регистрация →
/start→ Выбор роли "Логист" → Заполнение данных - Создание карточки → "💳 Моя карточка" → "➕ Создать карточку" → Ввод данных (транспорт, маршруты, цены)
- Просмотр заявок → "📋 Доступные заявки" → Просмотр заявок → Подача предложения
- Управление перевозками → "🚚 Мои перевозки" → Просмотр активных доставок
- Регистрация →
/start→ Выбор роли "Экспедитор" → Заполнение данных - Создание карточки → "💳 Моя карточка" → "➕ Создать карточку" → Ввод данных (услуги, порты, опыт)
- Просмотр сделок → "📋 Доступные сделки" → Просмотр доступных пулов → Подача предложения
- Вход →
/admin→ Проверка прав → Админ-панель - Статистика → "📊 Статистика" → Просмотр общей статистики системы
- Аналитика → "📈 Аналитика" → Просмотр аналитики (регионы, культуры, порты)
- Экспорт данных → "📤 Экспорт данных" → Выбор типа данных → Скачивание файла
- Управление пользователями → "👥 Пользователи" → Просмотр списка → Детали пользователя
- Рассылка → "📢 Рассылка" → Ввод сообщения → Подтверждение → Отправка всем пользователям
/start— начало работы, регистрация/вход/admin— вход в админ-панель (только для администратора)
- Кнопки главного меню (зависят от роли)
- Callback-кнопки для переходов между разделами
- Кнопки "Назад" для возврата в предыдущее меню
BOT_TOKEN— токен Telegram-бота (обязательно)ADMIN_ID— Telegram ID администратора (обязательно)DATA_DIR— директория для хранения данных (по умолчанию:data/)
users.pkl— пользователиpools.pkl— пулыbatches.pkl— партииlogistics_cards.pkl— карточки логистовexpeditor_cards.pkl— карточки экспедиторовshipping_requests.pkl— заявки на доставкуlogistic_offers.pkl— предложения логистовexpeditor_pool_offers.pkl— предложения экспедиторов по пуламexpeditor_request_offers.pkl— предложения экспедиторов по заявкам
- Импорты библиотек
- Константы и настройки
- Инициализация бота и диспетчера
users,pools,batcheslogistics_cards,expeditor_cardsshipping_requests,logistic_offers,expeditor_offers
RegistrationStatesGroupCreatePoolStatesGroupJoinPoolStatesGroupEditProfileStatesBroadcastStates- И другие...
- Валидация данных
- Форматирование сообщений
- Построение клавиатур
- Функции уведомлений
- Функции экспорта данных
- Admin handlers (строки 4500-6500)
- Registration handlers (строки 6700-8000)
- Pool handlers (строки 10000-13000)
- Batch handlers (строки 10000-12000)
- Logistic handlers (строки 25000-28000)
- Expeditor handlers (строки 18000-20000)
- Notification handlers (строки 3500-4000)
save_data()— сохранение всех данныхload_data()— загрузка всех данныхsave_*_to_pickle()— сохранение отдельных структур
parse_price()— не используетсяget_all_pools_with_format()— не используетсяtranslate_pool_status()— не используетсяparse_join_pool_callback()— не используетсяvalidate_batch_volume()— не используетсяmigrate_all_existing_pools()— одноразовая миграцияmigrate_old_pools()— одноразовая миграция
- Добавить больше валидации при создании пулов/партий
- Улучшить обработку ошибок Telegram API
- Добавить rate limiting для массовых операций
- Оптимизировать работу с большими объёмами данных
- Все данные хранятся в памяти и периодически сохраняются в pickle-файлы
- Для работы с Google Sheets требуется настройка
gsобъекта - Логирование ведётся через стандартный модуль
logging - Все функции соответствуют принципам КОНТЕКСТ7 (полный код, обработка ошибок, логирование, docstring)
docs/README.md— индекс документацииdocs/reports_2026-02-16.tar.gz— архив отчётов аудита и тестирования