diff --git a/src/MPWAR/Module/Economy/Application/Service/TransactionProcessor.php b/src/MPWAR/Module/Economy/Application/Service/TransactionProcessor.php new file mode 100644 index 0000000..18212cd --- /dev/null +++ b/src/MPWAR/Module/Economy/Application/Service/TransactionProcessor.php @@ -0,0 +1,26 @@ +repository = $repository; + } + + public function __invoke(AccountOwner $owner, VirtualMoney $money) + { + $account = $this->repository->search($owner); + + $account->add($money); + + $this->repository->save($account); + } +} diff --git a/src/MPWAR/Module/Economy/Contract/Exception/VirtualMoneyOperationWithDifferentCurrenciesNotAllowedException.php b/src/MPWAR/Module/Economy/Contract/Exception/VirtualMoneyOperationWithDifferentCurrenciesNotAllowedException.php new file mode 100644 index 0000000..1528b87 --- /dev/null +++ b/src/MPWAR/Module/Economy/Contract/Exception/VirtualMoneyOperationWithDifferentCurrenciesNotAllowedException.php @@ -0,0 +1,15 @@ +code = 'economy_virtual_money_operation_not_valid'; + } +} diff --git a/src/MPWAR/Module/Economy/Domain/Account.php b/src/MPWAR/Module/Economy/Domain/Account.php index 25864f1..3e617d2 100644 --- a/src/MPWAR/Module/Economy/Domain/Account.php +++ b/src/MPWAR/Module/Economy/Domain/Account.php @@ -20,6 +20,15 @@ public function __construct(AccountOwner $owner, VirtualMoney $balance) $this->balance = $balance; } + public static function open(AccountOwner $owner) + { + $account = new self($owner, VirtualMoney::coins(0)); + + $account->record(new AccountOpened($owner->value(), new DateTimeImmutable())); + + return $account; + } + public function owner() { return $this->owner; @@ -30,12 +39,8 @@ public function balance() return $this->balance; } - public static function open(AccountOwner $owner) + public function add(VirtualMoney $money) { - $account = new self($owner, VirtualMoney::coins(0)); - - $account->record(new AccountOpened($owner->value(), new DateTimeImmutable())); - - return $account; + $this->balance = $this->balance()->add($money); } } diff --git a/src/MPWAR/Module/Economy/Domain/VirtualCurrency.php b/src/MPWAR/Module/Economy/Domain/VirtualCurrency.php index 29b66bb..730f05b 100644 --- a/src/MPWAR/Module/Economy/Domain/VirtualCurrency.php +++ b/src/MPWAR/Module/Economy/Domain/VirtualCurrency.php @@ -26,6 +26,11 @@ public function value() return $this->value; } + public function equals(VirtualCurrency $other) + { + return $this->value === $other->value; + } + private function guard($value) { if (!in_array($value, self::$allowed)) { diff --git a/src/MPWAR/Module/Economy/Domain/VirtualMoney.php b/src/MPWAR/Module/Economy/Domain/VirtualMoney.php index 5db5516..b640a36 100644 --- a/src/MPWAR/Module/Economy/Domain/VirtualMoney.php +++ b/src/MPWAR/Module/Economy/Domain/VirtualMoney.php @@ -3,6 +3,7 @@ namespace MPWAR\Module\Economy\Domain; use MPWAR\Module\Economy\Contract\Exception\VirtualMoneyNotValidException; +use MPWAR\Module\Economy\Contract\Exception\VirtualMoneyOperationWithDifferentCurrenciesNotAllowedException; final class VirtualMoney { @@ -22,10 +23,24 @@ public static function coins($amount) return new self($amount, VirtualCurrency::coin()); } + public function add(VirtualMoney $other) + { + $this->guardCurrency($other->currency); + + return new self($this->amount + $other->amount, $this->currency); + } + private function guard($amount) { if (!is_int($amount) || 0 > $amount) { throw new VirtualMoneyNotValidException($amount); } } + + private function guardCurrency(VirtualCurrency $other) + { + if (!$this->currency->equals($other)) { + throw new VirtualMoneyOperationWithDifferentCurrenciesNotAllowedException(); + } + } }