Назначение и границы
Клиент должен получить воспроизводимую итоговую цену, а ошибочный налоговый код, товар или купон — понятный отказ.
API расчёта цены и тестовой оплаты с интерактивным разбором суммы. Исправлены модель товара, миграции, валидация и арифметика скидок.
- Налоги и купоны — учебные справочники; это не налоговая консультация.
- PayPal/Stripe заменены детерминированными моками; внешних списаний нет.
- Каталог read-only, история десяти запросов живёт в памяти вкладки.
Архитектура и схемы
- Сначала рассчитывается налог, затем скидка; итог ограничен снизу нулём.
- Внутренняя арифметика использует целые центы и округление half-up.
- Покупка заново рассчитывает сумму на сервере, не доверяя результату из браузера.
Code-map: от функции к коду
Карта привязана к версии 3b826a6f1ff4. Она помогает проследить изменение через интерфейс, API, модуль, данные и проверку.
| Функция | Экран / API | Модуль | Данные / проверка |
|---|---|---|---|
| Каталог | demo.html / demo/catalog | ApiController, Product | product; readiness, UI |
| Расчёт | demo/quote, calculate-price | ApiValidationService, TaxCodeValidator, PriceCalculator | country, coupon, product; PriceCalculatorTest, HTTP |
| Оплата | purchase | PaymentService | чтение каталога; success / decline / invalid |
| Миграции и seed | CLI | migrations, FillCommand | три справочника; migrate, repeat seed |
Как работать с картой
- Перед изменением найти функцию и пройти связи до API, состояния и хранилища.
- Проверить входы, ошибки, повторные события и зависимые сценарии.
- После изменения обновить карту и затронутые схемы вместе с кодом.
- Выполнить связанные проверки и привязать новые материалы к версии исходников.
Сценарии и API
- Рассчитайте цену с налогом и процентным купоном: пример даёт 116,56 €.
- Проверьте фиксированную скидку и разбивку суммы.
- Введите неправильный код, неизвестный купон или товар.
- Выполните успешную тестовую оплату и отклонённый платёж 402.
Проверка опубликованной версии
- Пять unit-тестов калькулятора и 12 production-состояний; старый общий ApiControllerTest не заявляется пройденным.
- Original calculation 11656 cents
- Fixed and empty coupons
- IT validation
- Invalid tax 400
- Unknown coupon 422
- Missing product 404
- Invalid field types 400
- Mock payment success and decline 402
- Reset and mobile overflow
- Подтверждённого GitHub CI для этого SHA нет; перечислены выполненные локальные проверки и сценарии опубликованной версии. Исторические CI-ссылки, если есть, отмечены отдельно.
Результаты описывают проверенные сценарии и конкретную версию. Они не являются оценкой коммерческого успеха или качества моделей на независимой выборке.
Измерения
- Сохранено 12 содержательных кадров фактического интерфейса.
- Дата, сценарий и версия указаны у каждого кадра.
- Максимум RAM контейнеров в коротком тесте: 41.34 MiB. Общие службы учитываются отдельно; магазин включает свою БД.
- Измерено 6 повторений сценария; медиана 306.0 мс, максимум 2364 мс. Время включает браузер и HTTPS; методика и ограничения приложены.
Запуск и эксплуатация
Исходный API сохранён: POST /calculate-price возвращает число, /demo/quote — подробный разбор. POST /purchase выполняет повторный серверный расчёт.
Сборка Dockerfile.portfolio вне VPS использует закреплённый PHP base и composer.lock. Запуск миграций: php bin/console doctrine:migrations:migrate --no-interaction, seed: php bin/console app:fill.
Nginx проксирует localhost:18401 на Apache. БД symfony имеет отдельного пользователя в общем MySQL. /healthz проверяет приложение. Пять unit-тестов покрывают округление, скидки и отрицательный ввод; HTTP QA проверяет реальные статусы ошибок.
Общие правила эксплуатации: готовые файлы и закреплённые образы собираются вне VPS; секреты не входят в артефакты. Общесерверный docker prune не применяется. Логи backend ограничены ротацией, изменения log options требуют пересоздания контейнера.
Перед изменением пройти code-map от функции к экрану/API, модулю и данным. После изменения обновить карту и схемы, выполнить связанные сценарии, включая ошибку, повтор и сброс. Источник истины — конкретная версия кода, а не старая диаграмма.
Откат проверен 2026-09-07T01:00:08.238865+00:00: 20260907-verified → 20260907b → 20260907-verified. После каждого переключения подтверждены HTTPS, readiness и SHA. Это проверка конфигурации и артефактов на одном проверенном SHA; обратная миграция БД не выполнялась.
Стек
| Symfony Validator | Проверка DTO, налогового кода и контрактов. |
|---|---|
| PHP / PriceCalculator | Целочисленный расчёт, округление и ограничение скидки. |
| Doctrine / MySQL | Товары, страны, купоны, миграции и воспроизводимый seed. |
Материалы и исходники
Исходное тестовое задание: сентябрь 2023. Обновление и демо: 7 сентября 2026.