Download the PHP package v.chetkov/money without Composer
On this page you can find all versions of the php package v.chetkov/money. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download v.chetkov/money
More information about v.chetkov/money
Files in v.chetkov/money
Package money
Short Description Библиотека для упрощения работы с денежными значениями
License MIT
Informations about the package money
Описание:
Пакет реализован для упрощения работы с денежными значениями.
Предоставляет возможность:
- сложения, вычетания, умножения денежных значений;
- равномерного распределения денежного значения на N частей;
- пропорционального распределения денежного значения в соответствии с заданным соотношением;
- конвертации валют;
- сравнения деннежных значений между собой (с возможностью указать допустимый процент отклонения)
- выполнения всех выше перечисленных операций для денежных значений в разных валютах;
Установка:
Конфигурация
example.config.php
Если параметер 'use_currency_conversation' => false
, то при выполнении операций с экземплярами Money в разных валютах будет выброшено исключение OperationWithDifferentCurrenciesException.
В противном случае работа будет передана обменнику (о них чуть-чуть позже) для приведения второго операнда к валюте первого.
Хранением и предоставлением обменнику курсов валют занимаются классы поставщики, реализующие ExchangeRatesProviderInterface.
Использование
Далее необходимо загрузить описанный выше конфиг в PackageConfig, это необходимо для понимания: 1) включена-ли автоматическая конвертация валют 2) какой обменник за это отвечает 3) какой поставщик предоставляет ему данные
после чего можем выполнять различные операции:
Exchange:
Add:
Subtract:
Multiply:
AllocateEvenly:
Вы можете передать точность округления (опционально):
AllocateProportionally:
LessThan
MoreThan
Equals
Или кросс-валютная проверка на равенство/относительное равенство.
- $isCrossCurrenciesComparison - флаг кросс-валютного сравнения (bool)
- $allowableDeviationPercent - допустимый процент отклонения (float: 0.0 .. 100.0)
Обменники
Вы можете использовать существующие классы обменников:
1 - SimpleExchanger
- получает курсы валют от поставщика;
- осуществляет поиск нужной валютной пары (в случае отсутствия в списке бросает исключение ExchangeRateWasNotFoundException);
- выполняет обмен и возвращает новый экземпляр Money;
2 - GraphRatesSearchingExchangerDecorator
- декорирует любой другой класс обменника;
- сперва делегирует работу декорируемому объекту и ловит исключение ExchangeRateWasNotFoundException;
- если тот справился с задачей самостоятельно, возвращает полученное значение;
- в противном случае строит граф из имеющихся валютных пар и пытается найти путь обмена через другие валюты, по сути 2-ой, 3-ой ... n-ый обмен (если безуспешно, бросает исключение ExchangeRateWasNotFoundException);
Или воплотить в жизнь собственные реализации.
Поставщики курсов валют
1 - SimpleExchangeRatesProvider
- реализует шаблон Singleton;
- принимает массив с курсами валют;
- предоставляет метод установки курсов для новых валютных пар;
Самый примитивный пример: Инстанциировать и выполнить загрузку курсов валют в bootstrap файле Вашего приложения.
Вы можете единожды загрузить курсы из вашей БД. Можете сделать механизм получения курсов со стороннего ресурса (допустим с валютной биржи). Можете обновлять данные с заданым интервалом в ваших воркерах. Как всегда это зависит от ситуации, решение за Вами ;)
2 - CbrExchangeRatesProvider
- ходит в API ЦБ за курсами на указанную дату;
3 - ExchangeRatesProviderCacheDecorator
- декорирует любой другой класс постващика;
- может работать с разными стратегиями кэширования (стратегия должна реализовывать Psr\SimpleCache\CacheInterface)
- следит за TTL и регулирует процесс актуализации списка;
или так:
Аналогично обменникам Вы можете делать собственные реализации поставщиков.
PS:
Пока на этом всё, но я думаю в скором времени пакет увидит еще множество доработок. По мере развития буду стараться поддерживать README в актуальном состоянии.
PPS:
Идея была взята из книги Мартина Фаулера: "Шаблоны корпоративных приложений".