diff --git a/composer.json b/composer.json index 806298b..40e8e25 100644 --- a/composer.json +++ b/composer.json @@ -22,16 +22,16 @@ "ext-bcmath": "*", "doctrine/dbal": "^4", "moneyphp/money": "^4.0.3", - "thecodingmachine/safe": "^1.3|^2" + "thecodingmachine/safe": "^3.0" }, "require-dev": { "doctrine/coding-standard": "^12.0", - "phpstan/phpstan": "^1.12", + "phpstan/phpstan": "^2.1", "phpunit/phpunit": "^10.5", "roave/no-floaters": "^1.11", "squizlabs/php_codesniffer": "^3.10", - "thecodingmachine/phpstan-safe-rule": "^1.1|^1.2", - "vimeo/psalm": "^5.26" + "thecodingmachine/phpstan-safe-rule": "^1.4", + "vimeo/psalm": "^6.15" }, "minimum-stability": "stable", "config": { diff --git a/src/Bitcoin.php b/src/Bitcoin.php index 4a939a5..9eadf12 100644 --- a/src/Bitcoin.php +++ b/src/Bitcoin.php @@ -6,19 +6,23 @@ use Money\Currencies; use Money\Currencies\BitcoinCurrencies; +use Override; -class Bitcoin extends BaseMoney +final class Bitcoin extends BaseMoney { + #[Override] public static function humanReadableName(): string { return 'Bitcoin'; } + #[Override] protected static function classSubunits(): int { return 8; } + #[Override] protected static function getAllowedCurrencies(): Currencies { return new BitcoinCurrencies(); diff --git a/src/Currency.php b/src/Currency.php index a610030..b70e5c5 100644 --- a/src/Currency.php +++ b/src/Currency.php @@ -7,36 +7,37 @@ use Money\Currencies; use Money\Currency as LibCurrency; +/** @psalm-api */ class Currency { /** @psalm-param non-empty-string $code */ - final private function __construct(private string $code) + final protected function __construct(private string $code) { } /** @psalm-param non-empty-string $code */ - final public static function create(string $code): self + public static function create(string $code): self { return new static($code); } /** @psalm-return non-empty-string */ - final public function getCode(): string + public function getCode(): string { return $this->getLibCurrency()->getCode(); } - final public function equals(self $other): bool + public function equals(self $other): bool { return $this->getLibCurrency()->equals($other->getLibCurrency()); } - final public function isAvailableWithin(Currencies $currencies): bool + public function isAvailableWithin(Currencies $currencies): bool { return $currencies->contains($this->getLibCurrency()); } - final public function jsonSerialize(): string + public function jsonSerialize(): string { return $this->getLibCurrency()->jsonSerialize(); } diff --git a/src/GaapMoney.php b/src/GaapMoney.php index b286742..e4a60ee 100644 --- a/src/GaapMoney.php +++ b/src/GaapMoney.php @@ -6,14 +6,17 @@ use Money\Currencies; use Money\Currencies\ISOCurrencies; +use Override; -class GaapMoney extends BaseMoney +final class GaapMoney extends BaseMoney { + #[Override] protected static function classSubunits(): int { return 4; } + #[Override] protected static function getAllowedCurrencies(): Currencies { return new ISOCurrencies(); diff --git a/src/Money.php b/src/Money.php index 0fc617d..8b262d3 100644 --- a/src/Money.php +++ b/src/Money.php @@ -7,16 +7,20 @@ use Money\Currencies; use Money\Currencies\CurrencyList; use Money\Currencies\ISOCurrencies; +use Override; +/** @psalm-api */ class Money extends BaseMoney { private static Currencies|null $currencies = null; + #[Override] protected static function classSubunits(): int { return 2; } + #[Override] protected static function getAllowedCurrencies(): Currencies { if (self::$currencies !== null) { @@ -41,7 +45,7 @@ private static function initializeCurrencies(): Currencies $twoOrLessSubUnitCurrencies[$currency->getCode()] = $subUnit; } - /** @psalm-var array $twoOrLessSubUnitCurrencies */ + /** @psalm-var array> $twoOrLessSubUnitCurrencies */ $currencies = new CurrencyList($twoOrLessSubUnitCurrencies); self::$currencies = $currencies; diff --git a/src/Type/BTCMoneyType.php b/src/Type/BTCMoneyType.php index bee6dae..c99c9dd 100644 --- a/src/Type/BTCMoneyType.php +++ b/src/Type/BTCMoneyType.php @@ -6,16 +6,18 @@ use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\Type; +use Override; use function array_merge; use function bcdiv; use function bcmul; -class BTCMoneyType extends Type +final class BTCMoneyType extends Type { public const TYPE_NAME = 'btc_money'; /** @param mixed[] $column */ + #[Override] public function getSQLDeclaration(array $column, AbstractPlatform $platform): string { return $platform->getDecimalTypeDeclarationSQL( @@ -29,6 +31,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform): st ); } + #[Override] public function convertToPHPValue(mixed $value, AbstractPlatform $platform): string|null { if ($value === null) { @@ -41,6 +44,7 @@ public function convertToPHPValue(mixed $value, AbstractPlatform $platform): str return bcmul($value, '100000000', 0); } + #[Override] public function convertToDatabaseValue(mixed $value, AbstractPlatform $platform): string|null { if ($value === null) { diff --git a/src/Type/CurrencyType.php b/src/Type/CurrencyType.php index eac596a..efe5041 100644 --- a/src/Type/CurrencyType.php +++ b/src/Type/CurrencyType.php @@ -6,14 +6,16 @@ use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\Type; +use Override; use function array_merge; -class CurrencyType extends Type +final class CurrencyType extends Type { public const TYPE_NAME = 'currency'; /** @param mixed[] $column */ + #[Override] public function getSQLDeclaration(array $column, AbstractPlatform $platform): string { return $platform->getStringTypeDeclarationSQL( diff --git a/src/Type/GaapMoneyType.php b/src/Type/GaapMoneyType.php index 419b7cc..d666d5e 100644 --- a/src/Type/GaapMoneyType.php +++ b/src/Type/GaapMoneyType.php @@ -6,16 +6,18 @@ use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\Type; +use Override; use function array_merge; use function bcdiv; use function bcmul; -class GaapMoneyType extends Type +final class GaapMoneyType extends Type { public const TYPE_NAME = 'gaap_money'; /** @param mixed[] $column */ + #[Override] public function getSQLDeclaration(array $column, AbstractPlatform $platform): string { return $platform->getDecimalTypeDeclarationSQL( @@ -29,6 +31,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform): st ); } + #[Override] public function convertToPHPValue(mixed $value, AbstractPlatform $platform): string|null { if ($value === null) { @@ -41,6 +44,7 @@ public function convertToPHPValue(mixed $value, AbstractPlatform $platform): str return bcmul($value, '10000', 0); } + #[Override] public function convertToDatabaseValue(mixed $value, AbstractPlatform $platform): string|null { if ($value === null) { diff --git a/src/Type/MoneyType.php b/src/Type/MoneyType.php index cc5120e..5a7cd75 100644 --- a/src/Type/MoneyType.php +++ b/src/Type/MoneyType.php @@ -6,16 +6,18 @@ use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\Type; +use Override; use function array_merge; use function bcdiv; use function bcmul; -class MoneyType extends Type +final class MoneyType extends Type { public const TYPE_NAME = 'money'; /** @param mixed[] $column */ + #[Override] public function getSQLDeclaration(array $column, AbstractPlatform $platform): string { return $platform->getDecimalTypeDeclarationSQL( @@ -29,6 +31,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform): st ); } + #[Override] public function convertToPHPValue(mixed $value, AbstractPlatform $platform): string|null { if ($value === null) { @@ -41,6 +44,7 @@ public function convertToPHPValue(mixed $value, AbstractPlatform $platform): str return bcmul($value, '100', 0); } + #[Override] public function convertToDatabaseValue(mixed $value, AbstractPlatform $platform): string|null { if ($value === null) {