diff --git a/community_server/skeema/gradido_community/transactions.sql b/community_server/skeema/gradido_community/transactions.sql index 8641f0057..e6009608e 100644 --- a/community_server/skeema/gradido_community/transactions.sql +++ b/community_server/skeema/gradido_community/transactions.sql @@ -4,7 +4,7 @@ CREATE TABLE `transactions` ( `transaction_type_id` int(10) unsigned NOT NULL, `tx_hash` binary(48) DEFAULT NULL, `memo` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `received` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `received` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `blockchain_type_id` bigint(20) unsigned NOT NULL DEFAULT 1, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/src/Controller/StateBalancesController.php b/community_server/src/Controller/StateBalancesController.php index c89dce8db..cfd341135 100644 --- a/community_server/src/Controller/StateBalancesController.php +++ b/community_server/src/Controller/StateBalancesController.php @@ -42,20 +42,21 @@ class StateBalancesController extends AppController $this->set(compact('stateBalances')); } - private function updateBalance($stateUserId) + private function updateBalances($stateUserId) { + echo "stateUserId: $stateUserId\n"; $stateUserTransactionsTable = TableRegistry::getTableLocator()->get('StateUserTransactions'); $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); // info: cakephp use lazy loading, query will be executed later only if needed $state_balances = $this->StateBalances->find('all')->where(['state_user_id' => $stateUserId]); $state_user_transactions = $stateUserTransactionsTable - ->find('all') + ->find() ->where(['state_user_id' => $stateUserId]) ->order(['transaction_id ASC']) - ->contain(false); - + //->contain(false); + ; + if(!$state_user_transactions || !$state_user_transactions->count()) { - //debug($state_user_transactions); return true; } @@ -66,10 +67,12 @@ class StateBalancesController extends AppController $update_state_balance = false; if($state_balances->count() == 0) { $create_state_balance = true; + $recalculate_state_user_transactions_balance = true; } if($state_balances->count() > 1) { $clear_state_balance = true; $create_state_balance = true; + $recalculate_state_user_transactions_balance = true; } if($state_balances->count() == 1) { if($state_user_transactions->count() == 0){ @@ -125,6 +128,7 @@ class StateBalancesController extends AppController $transaction_ids = []; if($recalculate_state_user_transactions_balance) { + echo "recalculate state user transaction balances \n"; $state_user_transactions_array = $state_user_transactions->toArray(); foreach($state_user_transactions_array as $i => $state_user_transaction) { $transaction_ids[$state_user_transaction->transaction_id] = $i; @@ -144,17 +148,23 @@ class StateBalancesController extends AppController $amount_date = null; $amount = 0; - if($transaction->transaction_type_id == 1) { + if($transaction->transaction_type_id == 1) { // creation + echo "creation\n"; $temp = $transaction->transaction_creations[0]; - + echo "creation amount: " . $temp->amount . "\n"; + echo "target date: " . $temp->target_date . "\n"; $balance_temp = $this->StateBalances->newEntity(); $balance_temp->amount = $temp->amount; $balance_temp->record_date = $temp->target_date; $amount = $balance_temp->partDecay($transaction->received); $amount_date = $transaction->received; + echo "amount in state_user_transactions: $amount\n"; + echo "date in state_user_transactions: $amount_date\n"; + echo "diff: " . ($temp->amount - $amount) . "\n"; //$amount_date = - } else if($transaction->transaction_type_id == 2) { + } else if($transaction->transaction_type_id == 2) { // transfer + echo "send coins\n"; $temp = $transaction->transaction_send_coins[0]; $amount = intval($temp->amount); // reverse if sender @@ -162,18 +172,23 @@ class StateBalancesController extends AppController $amount *= -1.0; } $amount_date = $transaction->received; + echo "amount: " . $amount . "\n"; + echo "date: " . $amount_date . "\n"; } if($i == 0) { $balance_cursor->amount = $amount; } else { $balance_cursor->amount = $balance_cursor->partDecay($amount_date) + $amount; } + echo "balance cursor amount: " . $balance_cursor->amount . "\n"; $balance_cursor->record_date = $amount_date; $state_user_transaction_index = $transaction_ids[$transaction->id]; $state_user_transactions_array[$state_user_transaction_index]->balance = $balance_cursor->amount; $state_user_transactions_array[$state_user_transaction_index]->balance_date = $balance_cursor->record_date; $i++; + echo "##########################\n"; } + $results = $stateUserTransactionsTable->saveMany($state_user_transactions_array); $errors = []; foreach($results as $i => $result) { @@ -446,13 +461,29 @@ class StateBalancesController extends AppController } $session = $this->getRequest()->getSession(); $user = $session->read('StateUser'); + $this->updateBalances($user['id']); + + echo "try to unhex: ". $user['public_hex'] . "\n"; $public_key_bin = hex2bin($user['public_hex']); + //var_dump($public_key_bin); $stateUserQuery = $this->StateBalances->StateUsers ->find('all') - ->where(['public_key' => $public_key_bin]) - ->contain(['StateBalances']); + //->where(['public_key' => $public_key_bin]) + ->where(['id' => $user['id']]) + //->contain(['StateBalances']) + ; + $hex_from_db = bin2hex(stream_get_contents($stateUserQuery->first()->public_key)); + echo "hex from db: $hex_from_db\n"; + echo "state user query array: \n"; + var_dump($stateUserQuery->toArray()); + echo "\n"; + + $state_balance = $this->StateBalances->find()->where(['state_user_id' => $user['id']]); + echo "state balance:\n"; + var_dump($state_balance->toArray()); + echo "\n"; $result_user_count = $stateUserQuery->count(); if($result_user_count < 1) { @@ -465,16 +496,13 @@ class StateBalancesController extends AppController 'details' => ['public_key' => $user['public_hex'], 'entry_count' => $result_count] ]); } - $state_balances = $stateUserQuery->first()->state_balances; - $state_balances_count = count($state_balances); - if($state_balances_count > 1) { - return $this->returnJson(['state' => 'error', 'msg' => 'state balances count isn\'t as expected, expect 1 or 0', 'details' => $state_balances_count]); - } - if(!$state_balances_count) { + //$state_balance = $stateUserQuery->first()->state_balances; + + if(!$state_balance) { return $this->returnJson(['state' => 'success', 'balance' => 0]); } - return $this->returnJson(['state' => 'success', 'balance' => $state_balances[0]->amount]); + return $this->returnJson(['state' => 'success', 'balance' => $state_balance->amount]); } diff --git a/community_server/src/Model/Entity/StateBalance.php b/community_server/src/Model/Entity/StateBalance.php index a93a0a4b1..8e0d42942 100644 --- a/community_server/src/Model/Entity/StateBalance.php +++ b/community_server/src/Model/Entity/StateBalance.php @@ -44,7 +44,7 @@ class StateBalance extends Entity return $dateOrTime->i18nFormat(Time::UNIX_TIMESTAMP_FORMAT); } else { var_dump($dateOrTime); - debug_print_backtrace(0, 4); + debug_print_backtrace(0, 6); die("date or time unexpected object"); } } diff --git a/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php index 2901015cf..256688d17 100644 --- a/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php +++ b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php @@ -22,6 +22,7 @@ class StateBalancesControllerTest extends TestCase 'app.TransactionCreations', 'app.Transactions', 'app.StateUsers', + 'app.StateUserTransactions', 'app.StateErrors', 'app.TransactionSignatures', 'app.TransactionSendCoins', @@ -73,7 +74,7 @@ class StateBalancesControllerTest extends TestCase 'StateUser' => [ 'id' => 1, 'email_checked' => 1, - 'public_hex' => '8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d' + 'public_hex' => 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f' ] ]); //echo "balance: $balance"; diff --git a/community_server/tests/TestCase/Model/Table/StateBalancesTableTest.php b/community_server/tests/TestCase/Model/Table/StateBalancesTableTest.php index 9ab6d30f0..68049de34 100644 --- a/community_server/tests/TestCase/Model/Table/StateBalancesTableTest.php +++ b/community_server/tests/TestCase/Model/Table/StateBalancesTableTest.php @@ -120,14 +120,5 @@ class StateBalancesTableTest extends TestCase { $this->markTestIncomplete('Not implemented yet.'); } - /* - * calculate balance at end of month - * work only if state balance at begin of month exist - * use transaction_send_coins and transaction_creations - */ - //public function updateLastStateBalanceOfMonth($month, $year, $state_user_id) - public function testUpdateLastStateBalanceOfMonth() - { - - } + }