setTable('transactions');
$this->setDisplayField('id');
$this->setPrimaryKey('id');
$this->belongsTo('StateGroups', [
'foreignKey' => 'state_group_id',
'joinType' => 'INNER'
]);
$this->belongsTo('TransactionTypes', [
'foreignKey' => 'transaction_type_id',
'joinType' => 'INNER'
]);
$this->belongsTo('BlockchainTypes', [
'foreignKey' => 'blockchain_type_id',
'joinType' => 'INNER'
]);
$this->hasMany('StateCreated', [
'foreignKey' => 'transaction_id'
]);
$this->hasOne('TransactionCreations', [
'foreignKey' => 'transaction_id'
]);
$this->hasOne('TransactionGroupAddaddress', [
'foreignKey' => 'transaction_id'
]);
$this->hasOne('TransactionGroupAllowtrades', [
'foreignKey' => 'transaction_id'
]);
$this->hasOne('TransactionGroupCreates', [
'foreignKey' => 'transaction_id'
]);
$this->hasOne('TransactionSendCoins', [
'foreignKey' => 'transaction_id'
]);
$this->hasMany('TransactionSignatures', [
'foreignKey' => 'transaction_id'
]);
$this->hasMany('StateUserTransactions', [
'foreignKey' => 'transaction_id'
]);
}
/**
* Default validation rules.
*
* @param \Cake\Validation\Validator $validator Validator instance.
* @return \Cake\Validation\Validator
*/
public function validationDefault(Validator $validator)
{
$validator
->allowEmptyString('id', null, 'create');
$validator
//->requirePresence('tx_hash', 'create')
->allowEmptyString('tx_hash', null, 'create');
$validator
->allowEmptyString('memo', null, 'create');
$validator
->dateTime('received')
->notEmptyDateTime('received');
return $validator;
}
/**
* Returns a rules checker object that will be used for validating
* application integrity.
*
* @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
* @return \Cake\ORM\RulesChecker
*/
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->existsIn(['state_group_id'], 'StateGroups'));
$rules->add($rules->existsIn(['transaction_type_id'], 'TransactionTypes'));
$rules->add($rules->existsIn(['blockchain_type_id'], 'BlockchainTypes'));
return $rules;
}
public function sortTransactions($a, $b)
{
if ($a['date'] == $b['date']) {
return 0;
}
return ($a['date'] > $b['date']) ? -1 : 1;
}
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 = [];
$stateUserTransactionsCount = 0;
foreach($stateUserTransactions as $su_transaction) {
$transaction_ids[] = $su_transaction->transaction_id;
$involved_user_ids[] = $su_transaction->state_user_id;
$stateUserTransactionsCount++;
}
$involved_users = $stateUsersTable->getUsersIndiced($involved_user_ids);
$transactions = $this
->find()
->where(['Transactions.id IN' => $transaction_ids])
->contain(['TransactionSendCoins', 'TransactionCreations'])
;
$transaction_indiced = [];
foreach($transactions as $tr) {
$transaction_indiced[$tr->id] = $tr;
}
$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_date = $stateBalancesTable->getDecayStartDateCached();
$decay_start_time = 0;
if($decay_start_date) {
$decay_start_time = $decay_start_date->getTimestamp();
}
foreach($stateUserTransactions as $i => $su_transaction)
{
// sender or receiver when user has sended money
// group name if creation
// type: gesendet / empfangen / geschöpft
// transaktion nr / id
// date
// balance
$transaction = $transaction_indiced[$su_transaction->transaction_id];
$final_transaction = [
'transaction_id' => $transaction->id,
'date' => $transaction->received,
'memo' => $transaction->memo
];
$prev = null;
if($i > 0 ) {
$prev = $stateUserTransactions[$i-1];
}
if($prev)
{
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)
{
$final_transaction['decay'] = [
'balance' => $balance,
'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($decay_start_time && $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']. "