У сети ресторанов доставки "ФорФар" есть множество точек, на которых готовятся заказы для клиентов. Каждый клиент хочет вместе с заказом получить чек, содержащий детальную информацию о заказе. Сотрудники кухни также хотят чек, чтобы в процессе готовки и упаковки заказа не забыть положить всё что нужно. Наша задача помочь и тем и другим, написав сервис для генерации чеков.
- Сервис получает информацию о новом заказа, создаёт в БД чеки для всех принтеров точки указанной в заказе и ставит асинхронные задачи на генерацию PDF-файлов для этих чеков. Если у точки нет ни одного принтера - возвращает ошибку. Если чеки для данного заказа уже были созданы - возвращает ошибку.
- Асинхронный воркер с помощью wkhtmltopdf генерируют PDF-файл из HTML-шаблон. Имя файла должно иметь следущий вид <ID заказа>_<тип чека>.pdf (123456_client.pdf). Файлы должны хранится в папке media/pdf в корне проекта.
- Приложение опрашивает сервис на наличие новых чеков. Опрос происходит по следующему пути: сначала запрашивается список чеков которые уже сгенерированы для конкретного принтера, после скачивается PDF-файл для каждого чека и отправляется на печать.
- Сервис должен быть написан на python и Django
- База данных - PostgreSQL v9.6
- Для асинхронных задач использовать django_rq
- Все инфраструктурные вещи необходимые для сервиса (PostgreSQL, Redis, wkhtmltopdf) запускать в docker с помощью docker-compose, сам проект не нужно оборачивать в docker
- Помимо API, должна быть админка для обеих моделей, с возможностью фильтровать чеки по принтеру, типу и статусу
- Вёрстка HTML-шаблонов для чеков лежит в репозитории в папке templates
- Для простоты работы с wkhtmltopdf стоит использовать docker-контейнер wkhtmltopdf
- Во время написания сервиса не стоит изобретать велосипеды, лучше взять что-то существующие
- Принтер (Printer). Каждый принтер печатает только свой тип чеков. Поле api_key принимает уникальные значения, по нему однозначно определяется принтер. Для этой модели должны быть fixtures (принтеры для обоих типов чеков для нескольких точек).
Поле | Тип | Значение | Описание |
---|---|---|---|
name | CharField | название принтера | |
api_key | CharField | ключ доступа к API | |
check_type | CharField | kitchen|client | тип чека которые печатает принтер |
point_id | IntegerField | точка к которой привязан принтер |
- Чек (Check). Информация о заказе для каждого чека хранится в JSON, нет необходимости делать отдельные модели.
Поле | Тип | Значение | Описание |
---|---|---|---|
printer_id | ForeignKey | принтер | |
type | CharField | kitchen|client | тип чека |
order | JSONField | информация о заказе | |
status | CharField | new|rendered|printed | статус чека |
pdf_file | FileField | ссылка на созданный PDF-файл |
Описание доступных методов находится в файле api.yml (swagger-спецификация). Можно отрендерить через онлайн редактор или через соответствующий плагин для PyCharm или VSCode