https://github.com/systemeio/test-for-candidates
docker-compose up -d
docker-compose exec php bash
- (внутри контейнера)
composer install
- (внутри контейнера)
php bin/console doctrine:migrations:migrate
- (внутри контейнера)
php bin/console doctrine:fixtures:load
- Необходимо создать класс, реализующий интерфейс
App\Payment\PaymentProcessorInterface
- Вписать этот класс в services.yaml в конфигурации сервиса
App\Payment\PaymentService
services.yaml:
services:
App\Payment\PaymentService:
arguments:
$paymentProcessors:
- '@App\Payment\PaypalPaymentProcessor'
- '@App\Payment\StripePaymentProcessor'
В этом решении нет использования форм, вместо них - ValueResolver'ы и DTO (App\RequestDto
).
Для добавления новых шаблонов tax-номеров необходимо прописать их в service.yaml. Там же доступна настройка налогов.
services.yaml:
parameters:
app.tax_patterns:
- '/^DE[0-9]{9}$/'
- '/^IT[0-9]{11}$/'
- '/^FR[A-Z]{2}[0-9]{9}$/'
- '/^GR[0-9]{9}$/'
app.countries_tax:
DE: 0.19
IT: 0.22
FR: 0.19
GR: 0.24
services:
App\Validator\IsTaxNumberValidator:
arguments:
$countriesTaxPatterns: '%app.tax_patterns%'
App\Tax\TaxCalculator:
arguments:
$taxMap: '%app.countries_tax%'
Я решил хранить деньги (и производить расчеты) в центах. Пользователь этого не видит: роут /v1/get-price
возвращает значение в евро. В БД же все значения в центах.
1 евро = 100 евроцентов.
Запрос:
POST /v1/get-price
Content-Type: application/json
Accept: application/json
{
"product": 1,
"taxNumber": "DE123456789",
"couponCode": "F15"
}
Результат:
HTTP/1.1 200 OK
Content-Type: application/json
{
"price": 101.15
}
Запрос:
POST {{host}}/v1/buy
Content-Type: application/json
Accept: application/json
{
"product": 1,
"taxNumber": "DE123456789",
"couponCode": "F15",
"paymentProcessor": "stripe"
}
Результат:
HTTP/1.1 200 OK
Content-Type: application/json
{
"status": "ok"
}