# Brick\Money: точные суммы в PHP

Девять настоящих PHP-опытов, CLI-корзина, пример PDO SQLite и статическая мастерская. Версии: Brick\Money 0.15.2, brick/math 1.0.0, PHP 8.2+, Bootstrap 5.3.8. `composer.lock` и `package-lock.json` включены.

## Что выполняется

- `src/Experiments.php` запускает библиотеку PHP и получает девять результатов.
- `public/experiments.json` — сохранённый вывод этих запусков. `composer verify` повторяет их и сравнивает байты.
- `public/model.js` — отдельная учебная BigInt-модель сложения, округления, распределения и корзины. Это не PHP и не Brick\Money. Экспорт явно содержит `phpExecuted: false`.
- `bin/cart.php` — настоящий серверный/консольный расчёт корзины по JSON.
- `bin/storage.php` — демонстрация хранения minor units строкой в отдельной SQLite.

Данные примеров вымышленные. Коэффициент обмена 91.2345 — фиксированное учебное значение, а не актуальный курс. Здесь нет налогового расчёта, оплаты, банковского подключения или выбора правил расчёта вместо вашего приложения.

## Быстрый запуск Windows (PowerShell)

Нужны PHP CLI 8.2+, Composer 2 и расширения `intl`, `PDO`, `pdo_sqlite`. BCMath или GMP ускоряют арифметику, но не обязательны для Brick\Math. Официальные установщики: https://windows.php.net/download/ и https://getcomposer.org/download/ . Для Node-части установите поддерживаемый Node.js LTS; проект проверяется на Node 24.

```powershell
Expand-Archive -LiteralPath .\money-project.zip -DestinationPath .\money-demo
Set-Location .\money-demo\money-project
php --version
php --ini
php -m
composer install --no-interaction --no-plugins --no-scripts --prefer-dist
composer check-platform-reqs
composer test
composer verify
php .\bin\cart.php .\fixtures\cart.json
php .\bin\storage.php
```

CLI и PHP веб-сервера могут читать разные `php.ini`. При ошибке `ext-intl` или `pdo_sqlite` исправляйте конфигурацию того CLI, который показывает `php --ini`, затем проверяйте `php -m`. Не переключайте PHP работающего сайта ради лаборатории.

## Linux: Ubuntu 24.04 / Debian-подобная система

На Ubuntu 24.04 доступны пакеты PHP 8.3. На другом дистрибутиве сначала уточните имена и поддерживаемую версию. Composer 2 установите отдельно по официальной инструкции с проверкой подписи; не запускайте Composer от root.

```bash
sudo apt update
sudo apt install php8.3-cli php8.3-intl php8.3-sqlite3 php8.3-bcmath unzip
unzip money-project.zip -d money-demo
cd money-demo/money-project
php --version
php -m
composer install --no-interaction --no-plugins --no-scripts --prefer-dist
composer check-platform-reqs
composer test
composer verify
php bin/cart.php fixtures/cart.json
php bin/storage.php
```

На VPS расчёт запускается тем же CLI. Код и `vendor/` разместите вне публичного каталога, например `/opt/aen-money`. Приложению нужна запись только в отдельный runtime, а не во все исходники. Для реального сайта библиотека подключается через `vendor/autoload.php` в существующем PHP-приложении. Готового публичного HTTP API для произвольных денежных операций здесь нет.

## Открыть мастерскую локально

Готовая `public/` уже лежит в ZIP; npm нужен для пересборки CSS и копий исходников, а Node — для локального статического сервера и тестов модели.

```bash
npm ci --ignore-scripts
npm run build
npm test
npm run serve
```

Откройте http://127.0.0.1:8182/ . Сервер слушает только localhost. Из другого терминала на своём компьютере можно открыть SSH-туннель к VPS:

```bash
ssh -L 8182:127.0.0.1:8182 user@example.com
```

На VPS запустите `npm run serve` отдельной сессией, затем откройте тот же локальный адрес. Публичный просмотр обслуживается обычным HTTPS-сервером только из `public/`; ZIP лежит на уровне выше `public/`. Во время локального запуска ссылка «Скачать весь проект» может быть недоступна, поскольку сервер намеренно не раздаёт файлы выше public. Сам проект у вас уже распакован.

Без Node готовую мастерскую можно открыть встроенным PHP-сервером только для локальной разработки:

```bash
php -S 127.0.0.1:8182 -t public
```

## Изменить корзину

`fixtures/cart.json` принимает 1–50 позиций. Валюты учебной корзины: RUB, USD, EUR. Цена — строка, количество — целое 1–1000, скидка — целое 0–10000 базисных пунктов; 750 означает 7,5%. Цена и доставка ограничены диапазоном 0–1000000. Строка `"19.99"` правильная, JSON-число `19.99`, запятая, экспонента или пробелы отклоняются.

Вычисление: сумма строк → одна скидка на подытог с HalfUp → доставка → итог. Это правило примера, которое нужно заменить согласованным правилом вашего сервиса. В настоящем заказе сервер берёт цены и допустимость скидки из доверенного каталога. Нельзя использовать присланный браузером итог как основание списания.

```bash
php bin/cart.php fixtures/cart.json
```

Успех пишет JSON в stdout и завершается кодом 0. Ошибка пишет тип/сообщение в stderr и завершается кодом 1. Перенаправление в новый файл: в Bash `php bin/cart.php > result.json`; в современном PowerShell `php .\bin\cart.php | Set-Content -Encoding utf8 .\result.json`.

Скачанный из мастерской `money-recipe.php` поместите в корень этого проекта, рядом с `vendor/`, и выполните `php money-recipe.php`. Он не отправляет деньги и не пишет в БД.

## Хранение в SQLite

`php bin/storage.php` создаёт только `runtime/money-demo.sqlite`, таблицу `demo_prices` и одну демонстрационную запись. Повторный запуск обновляет тот же SKU. В колонке `amount_minor TEXT` остаётся строка `9007199254740993`, валюта хранится отдельно; восстановление выполняется через `Money::ofMinor()`.

Это демонстрация без бухгалтерского журнала, idempotency платежей, разграничения пользователей и модели возвратов. Текстовая колонка сохраняет цифры, но сортируется лексикографически: для числовых отчётов потребуется подходящая схема и типизированная стратегия. SQL SUM над TEXT или приведение к REAL могут потерять точность; не переносите эти операции в пример без отдельной проверки.

## Проверки и пересборка

```bash
composer test
composer verify
npm test
composer audit
npm audit --audit-level=low
```

PHP проверяет реальную арифметику, знаки округления, режимы allocation, исключения, корзину, границы входа, валюты, локализацию и PDO-хранение. Node отдельно проверяет модель и её совпадение с записанными PHP-результатами. Эти тесты не заменяют проверку вашей бизнес-политики или финансовой системы.

После намеренного изменения PHP-опытов: `composer build`, затем `composer test`, `composer verify`, `npm run build`, `npm test`. Локализация зависит от ICU; в записи заменяются только NBSP и narrow NBSP на обычный пробел, чтобы результаты сравнивались между Windows и Linux. Денежные числа при этом не меняются.

## Структура

```text
bin/                 PHP CLI: опыты, корзина, SQLite
src/                 расчёт и девять экспериментов
fixtures/cart.json   учебная корзина
tests/               PHP и BigInt-model проверки
public/              готовая статическая мастерская
tools/               подготовка статики, localhost-сервер
deploy/              пример запуска CLI на Linux
runtime/             создаётся только локальным storage.php, в ZIP не входит
```

## Лицензии и источники

Собственный код — MIT. Тексты лицензий сторонних библиотек приложены в `THIRD-PARTY-LICENSES.txt`. PHP vendor и node_modules не входят в архив: они восстанавливаются из lock-файлов.

- https://github.com/brick/money/tree/0.15.2
- https://github.com/brick/math/tree/1.0.0
- https://packagist.org/packages/brick/money
- https://www.php.net/manual/en/language.types.float.php
- https://www.php.net/manual/en/ref.pdo-sqlite.php
