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(); + +?> first_name ?> last_name ?>, + + + + +element('printGradido', ['number' => $specific_transaction->getAmount(), 'raw' => true]), + $specific_transaction->getReceiverUser()->getEmailWithName()) ?> + +getTargetDate()->format('d.m.Y') ?> + +element('printGradido', ['number' => $specific_transaction->getAmount(), 'raw' => true]), + $specific_transaction->getReceiverUser()->getEmailWithName()) ?> + + + + + +getErrors(); + foreach($errors as $error) { + //echo "\t".json_encode($error); + echo "\n\t".$error[array_keys($error)[0]]."\n"; + } +}?> + + + + + + +Gradido Community Server \ No newline at end of file