Запуск сервисов

  • Чтобы запустить сервисы выполните команду docker compose -f docker-compose.yml -f docker-compose.test.yml up -d
  • Приложение доступно по адресу localhost:8080

Данные из ТЗ уже загружены в базу.

Endpoints

  • Расчет цены - /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

УСЛОВИЯ ЗАДАЧИ

Написать symfony REST приложение для рассчета цены продукта и проведения оплаты

Необходимо написать 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 принципов
  • реализация задания в несколько коммитов приветствуется