- Чтобы запустить сервисы выполните команду
docker compose -f docker-compose.yml -f docker-compose.test.yml up -d
- Приложение доступно по адресу localhost:8080
Данные из ТЗ уже загружены в базу.
- Расчет цены -
/get-price
c GET параметрами'productId*', 'taxNumber*', 'couponCode'
- Оплата -
/pay
c POST json
{
"product": "1",
"taxNumber": "DE123456789",
"couponCode": "D15",
"paymentProcessor": "paypal"
}
Для запуска тестов выполните команду docker compose exec backend make tests
Необходимо написать 2 эндпоинта:
- POST: для расчёта цены
- POST: для выполнения покупки
Пример json тела запроса:
{
"product": "1",
"taxNumber": "DE123456789",
"couponCode": "D15",
"paymentProcessor": "paypal"
}
При успешном выполнении запроса вернуть HTTP ответ с кодом 200
При неверных входных данных или ошибках оплаты вернуть HTTP ответ с кодом 400 и json объект с ошибками
- Iphone (100 евро)
- Наушники (20 евро)
- Чехол (10 евро)
При наличии купона покупатель может применить его к покупке Купон может быть двух типов:
- фиксированная сумма скидки
- процент от суммы покупки
При покупке продукта получатель сверх цены продукта должен уплатить налог, относительно страны налогового номера:
- Германии - 19%
- Италии - 22%
- Греции - 24%
В итоге для покупателя Iphone из Греции цена составляет 124 евро (цена продукта 100 евро + налог 24%). Если у покупателя есть купон на 4% скидку на покупку, то цена будет 116.56 евро (цена продукта 100 евро - 4% скидка + налог 24%)
DEXXXXXXXXX - для жителей Германии
ITXXXXXXXXXXX - для жителей Италии
GRXXXXXXXXX - для жителей Греции,
FRYYXXXXXXXXX - для жителей Франции
где:
- первые два символа - это код страны
- X - любая цифра от 0 до 9,
- Y - любая буква
Обратите внимание, что длина налогового номера разная для разных стран. Форматы налоговых номеров могут меняться, что случается редко (Это зависит от законодательства)
При выполнении задания нужно:
- проверить корректность tax номера,
- рассчитать итоговую цену покупки вместе с купоном (если указан) и налогом,
- для проведения платежа используйте
PaypalPaymentProcessor::pay
илиStripePaymentProcessor::processPayment
Оба класса прилагаются, скопируйте их себе в проект. Для простоты представьте, что эти два класса входят в два разных сторонних SDK, и у вас нет возможности править эти классы или какую-либо логику внутри них.
Необходимо учесть возможность добавления новых PaymentProcessors.
- использовать контейнеризацию для php, nginx, postgres/mysql
- PHP Unit test
- применение SOLID принципов
- реализация задания в несколько коммитов приветствуется