diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 8f7c2db05..bed7e4030 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -261,7 +261,7 @@ jobs:
report_name: Coverage Frontend
type: lcov
result_path: ./coverage/lcov.info
- min_coverage: 32
+ min_coverage: 46
token: ${{ github.token }}
##############################################################################
diff --git a/community_server/src/Controller/AppRequestsController.php b/community_server/src/Controller/AppRequestsController.php
index ff3314e94..4b81b8ac9 100644
--- a/community_server/src/Controller/AppRequestsController.php
+++ b/community_server/src/Controller/AppRequestsController.php
@@ -25,7 +25,7 @@ class AppRequestsController extends AppController
$this->loadComponent('GradidoNumber');
//$this->loadComponent('JsonRpcRequestClient');
//$this->Auth->allow(['add', 'edit']);
- $this->Auth->allow(['index', 'sendCoins', 'createCoins', 'getBalance', 'listTransactions']);
+ $this->Auth->allow(['index', 'sendCoins', 'createCoins', 'getBalance', 'listTransactions', 'getDecayStartBlock']);
}
@@ -333,16 +333,37 @@ class AppRequestsController extends AppController
$this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id'] ? $user['id'] : 0);
}
+ $limit = $count;
+ $offset = 0;
+ $skip_first_transaction = false;
+ if($page == 1) {
+ $limit--;
+ } else {
+ $offset = (( $page - 1 ) * $count) - 1;
+ }
+ if($offset && $orderDirection == 'ASC') {
+ // move cursor one step backwards to able to load one transaction previous last which will be shown for decay calculation
+ $offset--;
+ $limit++;
+ $skip_first_transaction = true;
+ } else if($orderDirection == 'DESC') {
+ $limit++;
+ $skip_first_transaction = true;
+ }
$stateUserTransactionsQuery = $stateUserTransactionsTable
->find()
->where(['state_user_id' => $user['id']])
->order(['balance_date' => $orderDirection])
->contain([])
- ->limit($count)
- ->page($page)
+ ->limit($limit)
+ //->page($page)
+ ->offset($offset)
;
$decay = true;
+ if($page > 1) {
+ $decay = false;
+ }
$transactions = [];
$transactions_from_db = $stateUserTransactionsQuery->toArray();
@@ -351,7 +372,7 @@ class AppRequestsController extends AppController
$transactions_from_db = array_reverse($transactions_from_db);
}
- $transactions = $transactionsTable->listTransactionsHumanReadable($transactions_from_db, $user, $decay);
+ $transactions = $transactionsTable->listTransactionsHumanReadable($transactions_from_db, $user, $decay, $skip_first_transaction);
if($orderDirection == 'DESC') {
$transactions = array_reverse($transactions);
@@ -382,6 +403,16 @@ class AppRequestsController extends AppController
$this->set('body', $body);
}
+ public function getDecayStartBlock()
+ {
+ $transactionsTable = TableRegistry::getTableLocator()->get('Transactions');
+ $decayStartBlock = $transactionsTable->find()->where(['transaction_type_id' => 9]);
+ if(!$decayStartBlock->count()) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'not found']);
+ }
+ return $this->returnJson(['state' => 'success', 'decay_start' => $decayStartBlock->first()->received]);
+ }
+
private function acquireAccessToken($session_id)
{
diff --git a/community_server/src/Model/Table/StateBalancesTable.php b/community_server/src/Model/Table/StateBalancesTable.php
index 25d588f30..ff7a0aca2 100644
--- a/community_server/src/Model/Table/StateBalancesTable.php
+++ b/community_server/src/Model/Table/StateBalancesTable.php
@@ -98,7 +98,12 @@ class StateBalancesTable extends AppTable
// if start date for decay is after enddate, we also just return input
if($decayStartDate === null || $decayStartDate >= $endDate) {
if($withInterval) {
- return ['balance' => $startBalance, 'interval' => new \DateInterval('PT0S')];
+ return [
+ 'balance' => $startBalance,
+ 'interval' => new \DateInterval('PT0S'),
+ 'start_date' => $startDate->getTimestamp(),
+ 'end_date' => $startDate->getTimestamp()
+ ];
} else {
return $startBalance;
}
@@ -118,7 +123,12 @@ class StateBalancesTable extends AppTable
}
$decay = $state_balance->partDecay($endDate);
if($withInterval) {
- return ['balance' => $decay, 'interval' => $interval];
+ return [
+ 'balance' => $decay,
+ 'interval' => $interval,
+ 'start_date' => $state_balance->record_date->getTimestamp(),
+ 'end_date' => $endDate->getTimestamp()
+ ];
} else {
return $decay;
}
diff --git a/community_server/src/Model/Table/TransactionsTable.php b/community_server/src/Model/Table/TransactionsTable.php
index 301e9b70b..925f6f31e 100644
--- a/community_server/src/Model/Table/TransactionsTable.php
+++ b/community_server/src/Model/Table/TransactionsTable.php
@@ -133,11 +133,12 @@ class TransactionsTable extends Table
}
- public function listTransactionsHumanReadable($stateUserTransactions, array $user, $decay = true)
+ public function listTransactionsHumanReadable($stateUserTransactions, array $user, $decay = true, $skip_first_transaction = false)
{
$stateUsersTable = TableRegistry::getTableLocator()->get('StateUsers');
$stateBalancesTable = TableRegistry::getTableLocator()->get('StateBalances');
+ $transactionsTable = TableRegistry::getTableLocator()->get('Transactions');
$transaction_ids = [];
$involved_user_ids = [];
@@ -162,11 +163,15 @@ class TransactionsTable extends Table
$state_balance = $stateBalancesTable->newEntity();
$final_transactions = [];
+ $decay_start_transaction = $transactionsTable->find()->where(['transaction_type_id' => 9]);
+ $decay_start_transaction_id = 0;
+ if($decay_start_transaction->count()) {
+ $decay_start_transaction_id = $decay_start_transaction->first()->id;
+ }
+ $decay_start_time = $stateBalancesTable->getDecayStartDateCached()->getTimestamp();
foreach($stateUserTransactions as $i => $su_transaction)
{
-
-
// sender or receiver when user has sended money
// group name if creation
// type: gesendet / empfangen / geschöpft
@@ -185,19 +190,34 @@ class TransactionsTable extends Table
if($i > 0 ) {
$prev = $stateUserTransactions[$i-1];
}
- if($prev && $decay == true)
+ if($prev)
{
- if($prev->balance > 0) {
+ if($prev->balance > 0)
+ {
$current = $su_transaction;
$calculated_decay = $stateBalancesTable->calculateDecay($prev->balance, $prev->balance_date, $current->balance_date, true);
$balance = floatval($prev->balance - $calculated_decay['balance']);
- if($balance > 100)
+ if($balance)
{
- $final_transactions['decay'] = [
+ $final_transaction['decay'] = [
'balance' => $balance,
- 'decay_duration' => $calculated_decay['interval']->format('%a days, %H hours, %I minutes, %S seconds')
- ];
+ 'decay_duration' => $calculated_decay['interval']->format('%a days, %H hours, %I minutes, %S seconds'),
+ 'decay_start' => $calculated_decay['start_date'],
+ 'decay_end' => $calculated_decay['end_date']
+ ];
+ if($prev->transaction_id < $decay_start_transaction_id &&
+ $current->transaction_id > $decay_start_transaction_id) {
+ $final_transaction['decay']['decay_start_block'] = $decay_start_time;
+ }
+ // hint: use transaction id
+ /*if($calculated_decay['start_date'] < $decay_start_time && $calculated_decay['end_date'] > $decay_start_time) {
+ $final_transaction['decay']['decay_start_block'] = $decay_start_time;
+ } else {
+ echo "start block: " . $decay_start_time . "
";
+ echo "start date: " . $calculated_decay['start_date'] . "
";
+ echo "end date: " . $calculated_decay['end_date']. "
{{ currentPage }} / {{ totalPages }}