Разработать консольное приложение, реализующее функционал формирования чека в магазине.
-
В данном задании важно показать понимание ООП, умение строить модели (выделять классы,
интерфейсы, их связи), разделять функционал между ними, а также знать синтаксис самого языка.
Обязательно применение паттернов проектирования (Factory, Builder, Decorator).
Обратить внимание на устойчивость к изменениям в логике и избегать копипаста. -
Использовать Java 17, gradle 7.5.
-
Приложение запускается java RunnerClassName <набор_параметров>, где набор параметров в формате
itemId-quantity (itemId - идентификатор товара, quantity - его количество.
Например: java CheckRunner 3-1 2-5 5-1 card-1234 должен сформировать и вывести в консоль чек,
содержащий в себе наименование товара с id=3 в количестве 1 шт, то же самое с id=2 в количестве 5 штук,
id=5 - одна штука и т. д. Card-1234 означает, что была предъявлена скидочная карта с номером 1234.
Необходимо вывести в консоль сформированный чек (вариант на рисунке), содержащий в себе список
товаров и их количество с ценой, а также рассчитанную сумму с учётом скидки по предъявленной карте
(если она есть). -
Среди товаров предусмотреть акционные. Если их в чеке больше пяти, то сделать скидку 10% по этой позиции.
Данную информацию отразить в чеке. -
Набор товаров и скидочных карт может задаваться прямо в коде, массивом или коллекцией объектов.
Их количество и номенклатура имеет тестовый характер, поэтому наименование и количество свободные. -
Реализовать обработку исключений (например, товара с id или файла не существует и т. д.).
-
Реализовать вывод чека в файл.
-
Описать README.md файл (используемый стек, инструкцию по запуску, описание эндпоинтов, если есть).
-
Использовать сборщик проекта gradle.
-
Исходники разместить в любом из публичных репозиториев (bitbucket, github, gitlab).
-
Организовать чтение исходных данных (товары и скидочные карты, формат тот же) из файлов
(в таком случае можно передавать имя файла в набор параметров команды java). -
Покрыть функционал юнит-тестами (не менее 70%).
-
* Замена хранения исходных данных (п.11) в файлах на PostgreSQL; сделать 2 таблицы (product и discount_card);
DDL операции должны храниться в src/main/resources в файле с расширением *.sql; настройки подключения к БД
хранить в application.properties. -
** Реализовать RESTFUL - интерфейс (например, получать чек по GET
http://localhost:8080/check?itemId=1&itemId=1). Реализация на выбор (Servlet, Spring). UI реализовывать не нужно. -
*** Развернуть приложение и PostgreSQL в Docker.
-
**** Расширить функционал на свое усмотрение.
“*” - Необязательно, но будет существенным плюсом. К этим пунктам лучше приступать после качественного решения
базовых задач с применением принципов SOLID, декларативных подходов, оптимальных алгоритмов.
