Для выполнения теста нужно fork-нуть себе данный репозиторий и реализовать функционал описанный ниже.
Корректным результатом выполнение тестового является прохождение всех тестов написанных под него.
Для начала работы также стоит выполнить команду для инициализации vendor-а и autoload-а зависимостей:
composer install
Реализовать с помощью PHP схему просчёта цен и скидок.
Есть 4 сущности :
Категория
Продукт
Цена
Скидка
У каждой категории есть название и уникальный идентификатор
У каждого продукта: название, цена, категория и уникальный идентификатор.
У цены есть свойства: сумма и валюта(4 типа : UAH, USD, EUR, RUB).
У скидок есть 2 типа : абсолютная скидка(-100грн) и относительная(-15%).
Так же скидка может быть применима как к самому продукту, так и ко всей категории продуктов. В случае, если существует скидка на товар и на категорию одновременно — должна выбраться бОльшая из них.
Реализацию стоит начинать с src/ProductAggregator.php
файла, который используется в тестах. В него попадает имя файла(data.json
, из корня проекта) откуда берутся товары, категории, скидки и курсы валют. Стоит прочитать этот файл, после чего грамотно агрегировать данные и вернуть результат json строкой.
Нужно сделать выгрузку продуктов и агрегирования всех свойств связанных с ним.
Валюта в которой стоит выгружать должна зависеть от переданного параметра в агрегатор/сервис.
Перевод валют должен происходить после просчета скидки. Сначала считаем цену в UAH(стандартная валюта), после чего с помощью курса валют в data.json
файле переводим UAH -> USD|EUR|RUB. Округление цены должно происходить всегда вверх(29.272 = 29.28) и до 2 знака после запятой.
{
"items" : [
{
"id": "unique-product-hash-1",
"title": "iPhone X",
"category": {
"id": "unique-category-hash-1",
"title": "Apple"
},
"price": {
"amount": 200.0,
"discounted_price": 183.0,
"currency": "UAH",
"discount": {
"type": "absolute",
"value": 17,
"relation": "product"
}
}
},
{
"id": "unique-product-hash-2",
"title": "Samsung Galaxy S10",
"category": {
"id": "unique-category-hash-2",
"title": "Samsung"
},
"price": {
"amount": 100.0,
"discounted_price": 90.0,
"currency": "UAH",
"discount": {
"type": "percent",
"value": 10,
"relation": "category"
}
}
},
{
"id": "unique-product-hash-2",
"title": "Samsung Galaxy A20",
"category": {
"id": "unique-category-hash-2",
"title": "Samsung"
},
"price": {
"amount": 80.0,
"discounted_price": 72.0,
"currency": "UAH",
"discount": {
"type": "percent",
"value": 10,
"relation": "category"
}
}
}
],
"perPage": 20,
"pages": 10,
"page" : 1
}
Не нужно делать : серверную часть, endpoint-ы. Достаточно одного PHP и PHPUnit для тестов
Использовать можно : composer для зависимостей/тестирования
Использовать нужно : OOP(все должно быть покрыто reusable классами придерживаясь 3 принципов ООП), SOLID, DRY, PHPUnit
Использовать нельзя : фреймворки, готовые решения
Предварительно убедитесь, что у вас установлен PHP и PHPUnit нужной версии.
Для запуска тестов достаточно ввести консольную команду:
composer test
Реализовать +1 тип скидок "оптовый" (цена уменьшается в зависимости от кол-ва товаров). Должна быть настраиваемая (от 10 товаров, от 100 товаров, от 1000 товаров и тд). И так же покрыть функционал скидки отдельными тестами.