update transaction deliver code for new decay calculation

This commit is contained in:
Dario Rekowski on RockPI 2021-04-15 11:54:02 +00:00
parent 25d05ab539
commit 0ba6403817
3 changed files with 20 additions and 12 deletions

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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;
}