<%@ page class="CheckTransactionPage" %> <%@ page baseClass="SessionHTTPRequestHandler" %> <%@ page ctorArg="Session*" %> <%@ header include="HTTPInterface/SessionHTTPRequestHandler.h" %> <%@ page form="true" %> <%! #include "SingletonManager/SessionManager.h" #include "SingletonManager/SingletonTaskObserver.h" #include "SingletonManager/EmailManager.h" #include "SingletonManager/PendingTasksManager.h" #include "model/gradido/TransactionCreation.h" #include "model/gradido/TransactionTransfer.h" #include "lib/DataTypeConverter.h" #include "Poco/Thread.h" enum PageState { PAGE_TRANSACTION_CREATION, PAGE_TRANSACTION_TRANSFER, PAGE_TRANSACTION_GROUP_ADD_MEMBER, PAGE_NO_TRANSACTIONS, PAGE_USER_DATA_CORRUPTED }; %> <%% const char* pageName = gettext("Überprüfe Transaktion"); auto account_user = mSession->getNewUser(); auto user = account_user; auto user_model = account_user->getModel(); auto em = EmailManager::getInstance(); auto pt = PendingTasksManager::getInstance(); auto userBalance = account_user->getBalance(); std::string memo = ""; bool hasErrors = false; bool enableLogout = true; bool enableSign = true; int skip_count = 0; int pending_task_id = 0; std::string community_server_base_path = ServerConfig::g_php_serverPath; if(user_model->getGroupId() != 0) { community_server_base_path = user->getGroupBaseUrl(); } PageState state = PAGE_NO_TRANSACTIONS; Poco::AutoPtr transaction; Poco::AutoPtr transaction_body; if(!form.empty()) { auto ok = form.get("ok", ""); auto abort = form.get("abort", ""); auto skip = form.get("skip", ""); auto skip_count_str = form.get("skip-count", "0"); auto pending_task_id_string = form.get("pending-task-id", ""); DataTypeConverter::strToInt(skip_count_str, skip_count); if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(pending_task_id_string, pending_task_id)) { // load transaction from pending task manager transaction = pt->getPendingGradidoTransaction(pending_task_id); if(!transaction.isNull()) { if(transaction->hasSigned(account_user)) { transaction = nullptr; } else { transaction_body = transaction->getTransactionBody(); } if(abort != "") { //mSession->finalizeTransaction(false, true); // if(!transaction.isNull() && (transaction_body->isCreation() || transaction->getModel()->getUserId() == user_model->getID())) { if(pt->removeTask(transaction)) { transaction->deleteFromDB(); } transaction = nullptr; } } else if(ok != "") { if(!account_user->hasPassword()) { auto pwd = form.get("sign-password", ""); auto loginResult = account_user->login(pwd); switch(loginResult) { case 0: addError(new Error(gettext("Passwort"), gettext("Das Passwort stimmt nicht. Bitte verwende dein Passwort von der Registrierung"))); hasErrors = true; break; case -1: case -2: addError(new Error(gettext("Passwort"), gettext("Gespeicherte Daten sind korrupt!"))); hasErrors = true; state = PAGE_USER_DATA_CORRUPTED; enableSign = false; break; case -3: addError(new Error(gettext("Passwort"), gettext("Passwortprüfung läuft schon, bitte versuche es in 1-2 Minuten erneut."))); hasErrors = true; break; } } if(!hasErrors) { //mSession->finalizeTransaction(true, false); if(!transaction.isNull() && transaction->sign(account_user)) { transaction = nullptr; } } } else if(skip != "") { skip_count++; transaction = nullptr; } } else { addError(new Error(gettext("Input Error"), gettext("Task no found"))); } } else { addError(new Error(gettext("Form Error"), gettext("error with field"))); } } auto transactions_user_must_sign = pt->getTransactionsUserMustSign(account_user); std::vector> transactions_someone_must_sign; // TODO: work with community server roles if(user_model->getRole() == model::table::ROLE_ADMIN) { transactions_someone_must_sign = pt->getTransactionSomeoneMustSign(account_user); } std::vector> transactions_to_sign; bool transaction_removeable = false; int transaction_to_sign_index = 0; if(transaction.isNull()) { if(transactions_user_must_sign.size() > skip_count) { transactions_to_sign = transactions_user_must_sign; transaction_to_sign_index = skip_count; } else if(transactions_someone_must_sign.size() > (skip_count - transactions_user_must_sign.size())) { transactions_to_sign = transactions_someone_must_sign; transaction_to_sign_index = skip_count - transactions_user_must_sign.size(); } if(transactions_to_sign.size() > transaction_to_sign_index) { transaction = transactions_to_sign[transaction_to_sign_index]; transaction_body = transaction->getTransactionBody(); // user can only delete there own transactions // TODO: Auto timeout for community transactions if(transaction_body->isCreation() || transaction->getModel()->getUserId() == user_model->getID()) { transaction_removeable = true; } } } size_t sumTransactions = transactions_user_must_sign.size() + transactions_someone_must_sign.size(); if(sumTransactions == 0) { auto lastExternReferer = mSession->getLastReferer(); auto callerUri = mSession->getCallerUri(); //lastExternReferer = ""; account_user->reload(); if(callerUri != "") { response.redirect(callerUri); } else if(lastExternReferer != "" && lastExternReferer.find("transaction-send-coins") == std::string::npos) { response.redirect(lastExternReferer); } else if(!account_user->getModel()->getGroupId()) { response.redirect(getBaseUrl() + "/userUpdateGroup"); } else { response.redirect(account_user->getGroupBaseUrl() + "/state-balances/overview"); } return; } if(transactions_user_must_sign.size() > 0) { enableLogout = false; } if(PAGE_NO_TRANSACTIONS == state && !transaction.isNull() && !transaction_body.isNull()) { auto transactionType = transaction_body->getType(); memo = transaction_body->getMemo(); switch(transactionType) { case model::gradido::TRANSACTION_CREATION: state = PAGE_TRANSACTION_CREATION; break; case model::gradido::TRANSACTION_TRANSFER: state = PAGE_TRANSACTION_TRANSFER; break; case model::gradido::TRANSACTION_GROUP_MEMBER_UPDATE: state = PAGE_TRANSACTION_GROUP_ADD_MEMBER; //community_server_base_path break; } if(model::gradido::TRANSACTION_GROUP_MEMBER_UPDATE != transactionType) { if(!user_model->isEmailChecked()) { addError(new Error(gettext("E-Mail Aktivierung"), gettext("E-Mail wurde noch nicht aktiviert, du kannst leider noch keine Transaktionen ausführen!"))); hasErrors = true; enableSign = false; } } } %><%@ include file="include/header_navi_chr.cpsp" %> <%= getErrorsHtml() %>
<% if(sumTransactions == 0) { %> <%= gettext("Es gibt zurzeit keine Transaktionen zum bestätigen") %> <% } else { %>

<%= sumTransactions %> <%= gettext("Transaktionen warten darauf bestätigt zu werden.") %>

<% if(skip_count > 0) { %>

<%= skip_count %> <%= gettext("Transaktionen übersprungen.") %>

<% } %> <% } %>

<%= gettext("Transaktion Unterzeichnen") %>

<% if(state == PAGE_TRANSACTION_TRANSFER) { auto transferTransaction = transaction_body->getTransferTransaction(); %>

<%= gettext("Überweisung") %>

<%= gettext("Konto") %> <%= gettext("Gradido") %>
<% for(int i = 0; i < transferTransaction->getKontoTableSize(); i++) { %> <% if((i+1) % 2 == 0) { %>
<% } else { %>
<% } %> <%= transferTransaction->getKontoNameCell(i) %> <% if(((i+1) % 2) == 0 && transferTransaction->getTargetGroupAlias() != "") { %> (<%= transferTransaction->getTargetGroupAlias() %>) <% } %> <%= transferTransaction->getAmountCell(i) %>
<% } %>
<% } else if(PAGE_TRANSACTION_CREATION == state) { auto creationTransaction = transaction_body->getCreationTransaction(); auto transactionUser = creationTransaction->getUser(); %>

<%= gettext("Schöpfung") %>

<%= gettext("Konto") %> <%= gettext("Zieldatum") %> <%= gettext("Gradido") %>
<% if(!transactionUser.isNull()) { auto user_model = transactionUser->getModel(); %> <%= user_model->getFirstName() %> <%= user_model->getLastName() %> <<%= user_model->getEmail() %>> <% } else { %> 0x<%= creationTransaction->getPublicHex() %> <% } %> <%= creationTransaction->getTargetDateString() %> <%= creationTransaction->getAmountString() %> GDD
<% } else if(PAGE_TRANSACTION_GROUP_ADD_MEMBER == state) { auto groupMemberUpdateTransaction = transaction_body->getGroupMemberUpdate(); auto groups = controller::Group::load(groupMemberUpdateTransaction->getTargetGroupAlias()); Poco::AutoPtr group_model; Poco::AutoPtr user; if(groups.size() == 1 && !groups[0].isNull()) group_model = groups[0]->getModel(); auto user_id = transaction->getModel()->getUserId(); if(user_id == user_model->getID()) { user = account_user; } else { user = controller::User::sload(user_id); } %>

<%= gettext("Benutzer zu einer Gruppe hinzufügen") %>

<% if(!user.isNull()) { %> Benutzer: <%= user->getEmailWithNames() %> <% } else { %> Account public key: <%= groupMemberUpdateTransaction->getPublicKeyHex() %> <% } %>

<% if(!group_model.isNull()) { %>

<%= gettext("Gruppe") %>:

  • <%= gettext("Name") %>: <%= group_model->getName() %>
  • <%= gettext("Alias") %>: <%= group_model->getAlias() %>
  • <%= gettext("Url") %>: <%= group_model->getUrl() %>
  • <%= group_model->getDescription() %>
<% } else { %> <%= gettext("Unbekannte Gruppe") %> <% } %> <%= gettext("Es haben bereits ") %><%= std::to_string(transaction->getSignCount()) %><%= gettext(" unterzeichnet") %>
<% } else if(PAGE_USER_DATA_CORRUPTED == state) { %>

<%= gettext("Es gibt ein Problem mit deinen gespeicherten Daten, bitte wende dich an den")%><%=gettext("Support") %>

<% } %> <% if(PAGE_NO_TRANSACTIONS == state) { %> <%= gettext("Zurück") %> <% } else { %>
Aktives Konto
<%= user_model->getNameWithEmailHtml() %>
Verwendungszweck
<%= memo %>
<% if(!transaction.isNull()) { %> <% } %> <% if(!account_user->hasPassword()) {%>
">
<% } %> <% if(enableSign && !hasErrors) { %> <% } %> <% if(transaction_removeable) { %> <% } %>
<% } %>
<%@ include file="include/footer_chr.cpsp" %>