diff --git a/community_server/src/Controller/AppRequestsController.php b/community_server/src/Controller/AppRequestsController.php
index 9d8459ddf..12ea77d0b 100644
--- a/community_server/src/Controller/AppRequestsController.php
+++ b/community_server/src/Controller/AppRequestsController.php
@@ -323,23 +323,33 @@ class AppRequestsController extends AppController
$this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id'] ? $user['id'] : 0);
}
+ $stateUserTransactions_total = $stateUserTransactionsTable
+ ->find()
+ ->select(['id'])
+ ->where(['state_user_id' => $user['id']])
+ ->contain([]);
$stateUserTransactionsQuery = $stateUserTransactionsTable
->find()
->where(['state_user_id' => $user['id']])
- ->order(['balance_date' => 'ASC'])
+ ->order(['balance_date' => $orderDirection])
->contain([])
->limit($count)
->page($page)
;
$decay = true;
$transactions = [];
+ $transactions_from_db = $stateUserTransactionsQuery->toArray();
if($stateUserTransactionsQuery->count() > 0) {
- $transactions = $transactionsTable->listTransactionsHumanReadable($stateUserTransactionsQuery->toArray(), $user, $decay);
-
+ if($orderDirection == 'DESC') {
+ $transactions_from_db = array_reverse($transactions_from_db);
+ }
+ $transactions = $transactionsTable->listTransactionsHumanReadable($transactions_from_db, $user, $decay);
+
if($orderDirection == 'DESC') {
$transactions = array_reverse($transactions);
}
+
}
$state_balance = $stateBalancesTable->find()->where(['state_user_id' => $user['id']])->first();
@@ -348,7 +358,7 @@ class AppRequestsController extends AppController
'state' => 'success',
'transactions' => $transactions,
'transactionExecutingCount' => $session->read('Transactions.executing'),
- 'count' => count($transactions),
+ 'count' => $stateUserTransactions_total->count(),
'gdtSum' => $gdtSum,
'timeUsed' => microtime(true) - $startTime
];
diff --git a/community_server/src/Controller/JsonRequestHandlerController.php b/community_server/src/Controller/JsonRequestHandlerController.php
index ba68f2b5a..12e03be8d 100644
--- a/community_server/src/Controller/JsonRequestHandlerController.php
+++ b/community_server/src/Controller/JsonRequestHandlerController.php
@@ -4,9 +4,9 @@ namespace App\Controller;
use App\Controller\AppController;
use Cake\ORM\TableRegistry;
-use Cake\Routing\Router;
use Cake\Http\Client;
use Cake\Core\Configure;
+use Cake\Mailer\Email;
use Model\Transactions\TransactionTransfer;
use Model\Transactions\Transaction;
@@ -332,33 +332,72 @@ class JsonRequestHandlerController extends AppController {
}
return $this->returnJson(['state' => 'success']);
}
+
+ private function sendEMailTransactionFailed($transaction, $reason_type)
+ {
+ $disable_email = Configure::read('disableEmail', false);
+ if($disable_email) {
+ return;
+ }
+ $transaction_body = $transaction->getTransactionBody();
+ $transaction_type_name = $transaction_body->getTransactionTypeName();
+ $senderUser = null;
+ if($transaction_type_name === 'transfer') {
+ $senderUser = $transaction_body->getSpecificTransaction()->getSenderUser();
+ } else if($transaction_type_name === 'creation') {
+ $senderUser = $transaction->getFirstSigningUser();
+ }
+ // send notification email
+ $noReplyEmail = Configure::read('noReplyEmail');
+ if($senderUser) {
+ try {
+ $email = new Email();
+ $emailViewBuilder = $email->viewBuilder();
+ $emailViewBuilder->setTemplate('notificationTransactionFailed')
+ ->setVars(['user' => $senderUser, 'transaction' => $transaction, 'reason' => $reason_type]);
+ $receiverNames = $senderUser->getNames();
+ if($receiverNames == '' || $senderUser->email == '') {
+ $this->addError('TransactionCreation::sendNotificationEmail', 'to email is empty for user: ' . $senderUser->id);
+ return false;
+ }
+ $email->setFrom([$noReplyEmail => 'Gradido (nicht antworten)'])
+ ->setTo([$senderUser->email => $senderUser->getNames()])
+ ->setSubject(__('Gradido Transaktion fehlgeschlagen!'))
+ ->send();
+ } catch(Exception $e) {
+ $this->addAdminError('JsonRequestController', 'sendEMailTransactionFailed', [$e->getMessage(), $reason_type], $senderUser->id);
+
+ }
+ }
+ }
private function putTransaction($transactionBase64) {
$transaction = new Transaction($transactionBase64);
//echo "after new transaction
";
if($transaction->hasErrors()) {
+ $this->sendEMailTransactionFailed($transaction, 'parse');
return $this->returnJson(['state' => 'error', 'msg' => 'error parsing transaction', 'details' => $transaction->getErrors()]);
}
//echo "after check on errors
";
if(!$transaction->validate()) {
+ //$transaction_details
+ $this->sendEMailTransactionFailed($transaction, 'validate');
return $this->returnJsonSaveError($transaction, ['state' => 'error', 'msg' => 'error validate transaction', 'details' => $transaction->getErrors()]);
}
//echo "after validate
";
if ($transaction->save()) {
-
-
// success
return $this->returnJson(['state' => 'success']);
} else {
+
+ $this->sendEMailTransactionFailed($transaction, 'save');
return $this->returnJsonSaveError($transaction, [
'state' => 'error',
'msg' => 'error saving transaction in db',
'details' => json_encode($transaction->getErrors())
]);
}
-
- return $this->returnJson(['state' => 'success']);
}
private function moveTransaction($pubkeys, $memo, $session_id) {
diff --git a/community_server/src/Model/Transactions/Transaction.php b/community_server/src/Model/Transactions/Transaction.php
index 21beb1d31..40be13cd3 100644
--- a/community_server/src/Model/Transactions/Transaction.php
+++ b/community_server/src/Model/Transactions/Transaction.php
@@ -98,6 +98,11 @@ class Transaction extends TransactionBase {
return $sigPairs[0]->getPubKey();
}
+ public function getFirstSigningUser()
+ {
+ return $this->getStateUserFromPublickey($this->getFirstPublic());
+ }
+
public function getId() {
return $this->mProtoTransaction->getId();
}
diff --git a/community_server/src/Model/Transactions/TransactionBase.php b/community_server/src/Model/Transactions/TransactionBase.php
index 1f80cc687..607903d8d 100644
--- a/community_server/src/Model/Transactions/TransactionBase.php
+++ b/community_server/src/Model/Transactions/TransactionBase.php
@@ -60,6 +60,16 @@ class TransactionBase {
return NULL;
}
+
+ protected function getStateUserFromPublickey($publicKey) {
+ $stateUsersTable = self::getTable('state_users');
+ $stateUser = $stateUsersTable->find('all')->where(['public_key' => $publicKey])->first();
+ if($stateUser) {
+ return $stateUser;
+ }
+
+ return NULL;
+ }
protected function updateStateBalance($stateUserId, $addAmountCent, $recordDate) {
diff --git a/community_server/src/Model/Transactions/TransactionCreation.php b/community_server/src/Model/Transactions/TransactionCreation.php
index 63b886a3f..f9b3c7657 100644
--- a/community_server/src/Model/Transactions/TransactionCreation.php
+++ b/community_server/src/Model/Transactions/TransactionCreation.php
@@ -72,7 +72,12 @@ class TransactionCreation extends TransactionBase {
return $this->protoTransactionCreation->getReceiver()->getPubkey();
}
-
+ public function getReceiverUser() {
+ return $this->getStateUserFromPublickey($this->getReceiverPublic());
+ }
+ public function getTargetDate() {
+ return new FrozenDate($this->protoTransactionCreation->getTargetDate()->getSeconds());
+ }
public function validate($sigPairs) {
// check if receiver public is not in signature list
diff --git a/community_server/src/Model/Transactions/TransactionTransfer.php b/community_server/src/Model/Transactions/TransactionTransfer.php
index 3156e2cae..4f3f4e88c 100644
--- a/community_server/src/Model/Transactions/TransactionTransfer.php
+++ b/community_server/src/Model/Transactions/TransactionTransfer.php
@@ -186,11 +186,9 @@ class TransactionTransfer extends TransactionBase {
$local_transfer = $this->protoTransactionTransfer->getLocal();
$sender = $local_transfer->getSender();
$senderAmount = $sender->getAmount();
- $senderUserId = $this->getStateUserId($sender->getPubkey());
- $receiverUserId = $this->getStateUserId($local_transfer->getReceiver());
+ $senderUser = $this->getStateUserFromPublickey($sender->getPubkey());
+ $receiverUser = $this->getStateUserFromPublickey($local_transfer->getReceiver());
- $receiverUser = $this->getStateUser($receiverUserId);
- $senderUser = $this->getStateUser($senderUserId);
$serverAdminEmail = Configure::read('ServerAdminEmail');
try {
@@ -218,6 +216,25 @@ class TransactionTransfer extends TransactionBase {
return true;
}
+ public function getSenderUser()
+ {
+ $local_transfer = $this->protoTransactionTransfer->getLocal();
+ return $this->getStateUserFromPublickey($local_transfer->getSender()->getPubkey());
+ }
+
+ public function getReceiverUser()
+ {
+ $local_transfer = $this->protoTransactionTransfer->getLocal();
+ return $this->getStateUserFromPublickey($local_transfer->getReceiver());
+ }
+
+ public function getAmount()
+ {
+ $local_transfer = $this->protoTransactionTransfer->getLocal();
+ $sender = $local_transfer->getSender();
+ return $sender->getAmount();
+ }
+
static public function fromEntity($transactionTransferEntity)
{
$protoTransfer = new \Proto\Gradido\GradidoTransfer();
diff --git a/community_server/src/Template/Email/text/notification_transaction_failed.ctp b/community_server/src/Template/Email/text/notification_transaction_failed.ctp
new file mode 100644
index 000000000..975848e58
--- /dev/null
+++ b/community_server/src/Template/Email/text/notification_transaction_failed.ctp
@@ -0,0 +1,50 @@
+assign('title', __('Gradido Transaktion fehlgeschlagen'));
+
+$transaction_body = $transaction->getTransactionBody();
+$specific_transaction = $transaction_body->getSpecificTransaction();
+$transaction_type_name = $transaction_body->getTransactionTypeName();
+
+?>= __('Hallo') ?> = $user->first_name ?> = $user->last_name ?>,
+
+= __('Deine letzte Transaktion ist leider fehlgeschlagen.') ?>
+
+
+= __('Du wolltest {0} für {1} schöpfen.',
+ $this->element('printGradido', ['number' => $specific_transaction->getAmount(), 'raw' => true]),
+ $specific_transaction->getReceiverUser()->getEmailWithName()) ?>
+
+= __('Das Zieldatum war: ') . $specific_transaction->getTargetDate()->format('d.m.Y') ?>
+
+= __('Du wolltest {0} an {1} senden.',
+ $this->element('printGradido', ['number' => $specific_transaction->getAmount(), 'raw' => true]),
+ $specific_transaction->getReceiverUser()->getEmailWithName()) ?>
+
+
+
+= __('Das ist schief gelaufen: ') ?>
+
+getErrors();
+ foreach($errors as $error) {
+ //echo "\t".json_encode($error);
+ echo "\n\t".$error[array_keys($error)[0]]."\n";
+ }
+}?>
+
+
+= __('Bitte antworte nicht auf diese E-Mail!'); ?>
+
+
+= __('Mit freundlichen Grüßen'); ?>
+Gradido Community Server
\ No newline at end of file