From 0ba6403817c04eb2c2ac5a285e6a6593be33386d Mon Sep 17 00:00:00 2001 From: Dario Rekowski on RockPI Date: Thu, 15 Apr 2021 11:54:02 +0000 Subject: [PATCH] update transaction deliver code for new decay calculation --- .../src/Model/Transactions/TransactionBase.php | 15 +++++++++++++-- .../Model/Transactions/TransactionCreation.php | 13 +++++-------- .../Model/Transactions/TransactionTransfer.php | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/community_server/src/Model/Transactions/TransactionBase.php b/community_server/src/Model/Transactions/TransactionBase.php index 3102d2341..a688daf02 100644 --- a/community_server/src/Model/Transactions/TransactionBase.php +++ b/community_server/src/Model/Transactions/TransactionBase.php @@ -63,7 +63,6 @@ class TransactionBase { protected function updateStateBalance($stateUserId, $addAmountCent, $recordDate) { - $finalBalance = 0; $stateBalancesTable = self::getTable('stateBalances'); $stateBalanceQuery = $stateBalancesTable ->find('all') @@ -92,7 +91,7 @@ class TransactionBase { return $finalBalance; } - protected function addStateUserTransaction($stateUserId, $transactionId, $transactionTypeId, $balance) { + protected function addStateUserTransaction($stateUserId, $transactionId, $transactionTypeId, $balance, $balance_date) { $stateUserTransactionTable = self::getTable('state_user_transactions'); $stateUserTransactions = $stateUserTransactionTable ->find('all') @@ -116,12 +115,24 @@ class TransactionBase { $entity->transaction_id = $transactionId; $entity->transaction_type_id = $transactionTypeId; $entity->balance = $balance; + $entity->balance_date = $balance_date; if(!$stateUserTransactionTable->save($entity)) { $errors = $entity->getErrors(); $this->addError('TransactionBase::addStateUserTransaction', 'error saving state user balance with: ' . json_encode($errors)); return false; } + // set balance from all state_user_transactions which came after (sorted by balance_date) to 0 + // because creation transaction can be added before other transaction which already happend + $state_user_transactions = $stateUserTransactionTable + ->find() + ->select(['id', 'balance']) + ->where(['state_user_id' => $stateUserId, 'balance_date >' => $balance_date]) + ; + foreach($state_user_transactions as $t) { + $t->balance = 0; + } + $stateUserTransactionTable->saveMany($state_user_transactions); return true; } } \ No newline at end of file diff --git a/community_server/src/Model/Transactions/TransactionCreation.php b/community_server/src/Model/Transactions/TransactionCreation.php index 54a87e1cb..6aeddd955 100644 --- a/community_server/src/Model/Transactions/TransactionCreation.php +++ b/community_server/src/Model/Transactions/TransactionCreation.php @@ -7,6 +7,7 @@ namespace Model\Transactions; use Cake\ORM\TableRegistry; use Cake\Core\Configure; use Cake\Mailer\Email; +use Cake\I18n\FrozenTime; use Cake\I18n\FrozenDate; @@ -153,24 +154,20 @@ class TransactionCreation extends TransactionBase { $transactionCreationEntity->state_user_id = $receiverUserId; $transactionCreationEntity->amount = $this->getAmount(); $transactionCreationEntity->target_date = $this->protoTransactionCreation->getTargetDate()->getSeconds(); - + $target_date = new FrozenTime($transactionCreationEntity->target_date); if(!$this->transactionCreationsTable->save($transactionCreationEntity)) { $this->addError('TransactionCreation::save', 'error saving transactionCreation with errors: ' . json_encode($transactionCreationEntity->getErrors())); return false; } // update state balance - $final_balance = $this->updateStateBalance($receiverUserId, $this->getAmount(), $transactionCreationEntity->target_date); + $final_balance = $this->updateStateBalance($receiverUserId, $this->getAmount(), $target_date); if(false === $final_balance) { return false; } - $target_date = new FrozenDate($transactionCreationEntity->target_date); - $stateBalancesTable = self::getTable('stateBalances'); - $state_balance = $stateBalancesTable->newEntity(); - $state_balance->amount = $this->getAmount(); - $state_balance->record_date = $target_date; + // decay is a virtual field which is calculated from amount and now() - record_date - if(!$this->addStateUserTransaction($receiverUserId, $transaction_id, 1, $state_balance->decay)) { + if(!$this->addStateUserTransaction($receiverUserId, $transaction_id, 1, $this->getAmount(), $target_date)) { return false; } diff --git a/community_server/src/Model/Transactions/TransactionTransfer.php b/community_server/src/Model/Transactions/TransactionTransfer.php index c8e9e7973..0dbcf4be9 100644 --- a/community_server/src/Model/Transactions/TransactionTransfer.php +++ b/community_server/src/Model/Transactions/TransactionTransfer.php @@ -164,10 +164,10 @@ class TransactionTransfer extends TransactionBase { return false; } - if(!$this->addStateUserTransaction($senderUserId, $transaction_id, 2, $senderAmount->getAmount())) { + if(!$this->addStateUserTransaction($senderUserId, $transaction_id, 2, $senderAmount->getAmount(), $received)) { return false; } - if(!$this->addStateUserTransaction($receiverUserId, $transaction_id, 2, -$senderAmount->getAmount())) { + if(!$this->addStateUserTransaction($receiverUserId, $transaction_id, 2, -$senderAmount->getAmount(), $received)) { return false; }