Внутренний Django-сервис для учета товаров, поставок, остатков и продаж через OZON и свободные продажи. Приложение умеет импортировать Excel/CSV-файлы, синхронизироваться с OZON API, вести FIFO-себестоимость партий и формировать XLSX-отчеты по продажам и остаткам.
- загрузка поставок из Excel/CSV;
- загрузка свободных продаж и OZON-продаж из Excel/CSV;
- синхронизация товаров, остатков, отправлений и финансовых начислений OZON;
- раздельный учет остатков на складе и на OZON;
- FIFO-расчет себестоимости на момент продажи;
- расчет прибыли с учетом расходов OZON;
- экспорт отчета продаж и отчета остатков в XLSX;
- страница статистики по продажам и остаткам.
- Python 3
- Django
- SQLite для локальной разработки
- MySQL или PostgreSQL для альтернативного окружения
- pandas и openpyxl для импорта и экспорта таблиц
- OZON Seller API
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install -r requirements.txt
Copy-Item .env.example .env
python manage.py migrate
python manage.py runserverПосле запуска приложение доступно по адресу:
http://127.0.0.1:8000/
Если PowerShell запрещает запуск скриптов активации, можно использовать Python из venv напрямую:
.\venv\Scripts\python.exe manage.py runserverОсновные настройки берутся из .env. Для локального запуска достаточно скопировать .env.example.
DEBUG=True
LOCAL=True
SECRET_KEY=
ALLOWED_HOSTS=127.0.0.1,localhost
DB_ENGINE=sqlite
SQLITE_PATH=
OZON_CLIENT_ID=
OZON_API_KEY=В production обязательно задайте:
DEBUG=FalseSECRET_KEYALLOWED_HOSTSCSRF_TRUSTED_ORIGINSSTATIC_ROOTOZON_CLIENT_IDOZON_API_KEY
Для SQLite можно оставить DB_ENGINE=sqlite. Для MySQL или PostgreSQL задайте:
DB_ENGINE=mysql
DB_NAME=
DB_USER=
DB_PASSWORD=
DB_HOST=localhost
DB_PORT=3306или:
DB_ENGINE=postgres
DB_NAME=
DB_USER=
DB_PASSWORD=
DB_HOST=localhost
DB_PORT=5432Применить миграции:
.\venv\Scripts\python.exe manage.py migrateСоздать администратора:
.\venv\Scripts\python.exe manage.py createsuperuserЗапустить сервер:
.\venv\Scripts\python.exe manage.py runserverЗапустить тесты:
.\venv\Scripts\python.exe manage.py test webСинхронизировать OZON из командной строки:
.\venv\Scripts\python.exe manage.py sync_ozon/products/- список товаров, остатков и продаж;/upload/supply/- загрузка поставки;/upload/sales/- загрузка продаж;/statistics/- статистика;/reports/sales/- выбор периода отчета продаж;/exports/sales-report/- экспорт отчета продаж;/exports/stock-balance/- экспорт отчета остатков.
Минимальные колонки:
Артикул | Название | Стоимость в закупке | Доставка | Себестоимость | Количество
Себестоимость хранится как Стоимость в закупке + Доставка. При повторной поставке того же артикула создается новая партия, чтобы продажи могли списывать себестоимость по FIFO.
Минимальные колонки:
Артикул | Название | Доход | Количество
Количество можно не указывать, тогда считается одна продажа. При загрузке продаж остаток на складе уменьшается, а себестоимость берется из ближайшей доступной партии.
У товара есть два независимых остатка:
quantity- количество на складе;ozon_quantity- количество на OZON.
Статусы товара:
in_stock_warehouse- в наличии на складе;in_stock_ozon- в наличии на OZON, но не в продаже;in_sale- в продаже;sold- продан.
Поставки сохраняются как партии. Для каждой продажи фиксируется cost_price на момент продажи. Это защищает старые продажи от изменения текущей себестоимости товара.
Для OZON-продаж приложение использует финансовые начисления:
gross_price- цена продажи;deductions_total- расходы OZON;net_income- чистый доход после расходов OZON;services/items- детализация начислений.
Прибыль в отчете продаж считается как:
Чистый доход - Себестоимость
Если финансовых данных OZON еще нет, чистый доход временно равен цене продажи. После синхронизации начислений отчет использует обновленные данные без необходимости менять старые записи вручную.
XLSX-отчет содержит:
- артикул;
- название;
- состояние;
- себестоимость;
- цену продажи;
- расходы OZON;
- чистый доход;
- прибыль;
- дату продажи;
- дату начисления;
- ID начисления.
XLSX-отчет содержит закупочную стоимость, доставку, себестоимость, остаток на складе, остаток на OZON и общий остаток.
Encounting/ Django project settings
web/ основное приложение
web/models.py модели товаров, партий и продаж
web/views.py views, импорт, экспорт, статистика
web/services/inventory.py FIFO и учет партий
web/services/ozon_sync.py синхронизация OZON
web/services/ozon_client.py клиент OZON API
web/templates/ HTML-шаблоны
web/static/ CSS и JS
deploy/ примеры deploy-конфигурации
Перед отправкой изменений желательно выполнить:
.\venv\Scripts\python.exe manage.py test web
git status --shortЕсли меняется импорт, экспорт или расчет прибыли, добавляйте тесты в web/tests.py. Для отчетов лучше проверять не только наличие файла, но и конкретные значения в XLSX через openpyxl.
Примеры конфигурации находятся в deploy/. Основной сценарий описан в:
deploy/DEPLOY_BEGET.md
Перед deploy проверьте production .env, миграции, сбор статики и доступность OZON API-ключей.