diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 14551d7a5..416838c1c 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -212,95 +212,80 @@ export class AdminResolver { async function getUserCreations(id: number): Promise { const dateNextMonth = moment().add(1, 'month').format('YYYY-MM') + '-01' - const dateMonth = moment().format('YYYY-MM') + '-01' - const dateLastMonth = moment().subtract(1, 'month').format('YYYY-MM') + '-01' const dateBeforeLastMonth = moment().subtract(2, 'month').format('YYYY-MM') + '-01' + const beforeLastMonthNumber = moment().subtract(2, 'month').format('M') + const lastMonthNumber = moment().subtract(1, 'month').format('M') + const currentMonthNumber = moment().format('M') const transactionCreationRepository = getCustomRepository(TransactionCreationRepository) - const createdAmountBeforeLastMonth = await transactionCreationRepository + const createdAmountsQuery = await transactionCreationRepository .createQueryBuilder('transaction_creations') - .select('SUM(transaction_creations.amount)', 'sum') + .select('MONTH(transaction_creations.target_date)', 'target_month') + .addSelect('SUM(transaction_creations.amount)', 'sum') .where('transaction_creations.state_user_id = :id', { id }) .andWhere({ - targetDate: Raw((alias) => `${alias} >= :date and ${alias} < :enddate`, { + targetDate: Raw((alias) => `${alias} >= :date and ${alias} < :endDate`, { date: dateBeforeLastMonth, - enddate: dateLastMonth, + endDate: dateNextMonth, }), }) - .getRawOne() - - const createdAmountLastMonth = await transactionCreationRepository - .createQueryBuilder('transaction_creations') - .select('SUM(transaction_creations.amount)', 'sum') - .where('transaction_creations.state_user_id = :id', { id }) - .andWhere({ - targetDate: Raw((alias) => `${alias} >= :date and ${alias} < :enddate`, { - date: dateLastMonth, - enddate: dateMonth, - }), - }) - .getRawOne() - - const createdAmountMonth = await transactionCreationRepository - .createQueryBuilder('transaction_creations') - .select('SUM(transaction_creations.amount)', 'sum') - .where('transaction_creations.state_user_id = :id', { id }) - .andWhere({ - targetDate: Raw((alias) => `${alias} >= :date and ${alias} < :enddate`, { - date: dateMonth, - enddate: dateNextMonth, - }), - }) - .getRawOne() + .groupBy('target_month') + .orderBy('target_month', 'ASC') + .getRawMany() const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) - const pendingAmountMounth = await loginPendingTasksAdminRepository + const pendingAmountsQuery = await loginPendingTasksAdminRepository .createQueryBuilder('login_pending_tasks_admin') - .select('SUM(login_pending_tasks_admin.amount)', 'sum') + .select('MONTH(login_pending_tasks_admin.date)', 'target_month') + .addSelect('SUM(login_pending_tasks_admin.amount)', 'sum') .where('login_pending_tasks_admin.userId = :id', { id }) .andWhere({ - date: Raw((alias) => `${alias} >= :date and ${alias} < :enddate`, { - date: dateMonth, - enddate: dateNextMonth, - }), - }) - .getRawOne() - - const pendingAmountLastMounth = await loginPendingTasksAdminRepository - .createQueryBuilder('login_pending_tasks_admin') - .select('SUM(login_pending_tasks_admin.amount)', 'sum') - .where('login_pending_tasks_admin.userId = :id', { id }) - .andWhere({ - date: Raw((alias) => `${alias} >= :date and ${alias} < :enddate`, { - date: dateLastMonth, - enddate: dateMonth, - }), - }) - .getRawOne() - - const pendingAmountBeforeLastMounth = await loginPendingTasksAdminRepository - .createQueryBuilder('login_pending_tasks_admin') - .select('SUM(login_pending_tasks_admin.amount)', 'sum') - .where('login_pending_tasks_admin.userId = :id', { id }) - .andWhere({ - date: Raw((alias) => `${alias} >= :date and ${alias} < :enddate`, { + date: Raw((alias) => `${alias} >= :date and ${alias} < :endDate`, { date: dateBeforeLastMonth, - enddate: dateLastMonth, + endDate: dateNextMonth, }), }) - .getRawOne() + .groupBy('target_month') + .orderBy('target_month', 'ASC') + .getRawMany() + + const map = new Map() + if (Array.isArray(createdAmountsQuery) && createdAmountsQuery.length > 0) { + createdAmountsQuery.forEach((createdAmount) => { + if (!map.has(createdAmount.target_month)) { + map.set(createdAmount.target_month, createdAmount.sum) + } else { + const store = map.get(createdAmount.target_month) + map.set(createdAmount.target_month, Number(store) + Number(createdAmount.sum)) + } + }) + } + + if (Array.isArray(pendingAmountsQuery) && pendingAmountsQuery.length > 0) { + pendingAmountsQuery.forEach((pendingAmount) => { + if (!map.has(pendingAmount.target_month)) { + map.set(pendingAmount.target_month, pendingAmount.sum) + } else { + const store = map.get(pendingAmount.target_month) + map.set(pendingAmount.target_month, Number(store) + Number(pendingAmount.sum)) + } + }) + } + const usedCreationBeforeLastMonth = map.get(Number(beforeLastMonthNumber)) + ? Number(map.get(Number(beforeLastMonthNumber))) / 10000 + : 0 + const usedCreationLastMonth = map.get(Number(lastMonthNumber)) + ? Number(map.get(Number(lastMonthNumber))) / 10000 + : 0 + + const usedCreationCurrentMonth = map.get(Number(currentMonthNumber)) + ? Number(map.get(Number(currentMonthNumber))) / 10000 + : 0 - // COUNT amount from 2 tables - const usedCreationBeforeLastMonth = - (Number(createdAmountBeforeLastMonth.sum) + Number(pendingAmountBeforeLastMounth.sum)) / 10000 - const usedCreationLastMonth = - (Number(createdAmountLastMonth.sum) + Number(pendingAmountLastMounth.sum)) / 10000 - const usedCreationMonth = - (Number(createdAmountMonth.sum) + Number(pendingAmountMounth.sum)) / 10000 return [ 1000 - usedCreationBeforeLastMonth, 1000 - usedCreationLastMonth, - 1000 - usedCreationMonth, + 1000 - usedCreationCurrentMonth, ] } diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 59cd60f00..a3aeb14a2 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -45,9 +45,11 @@ }, "error": { "change-password": "Fehler beim Ändern des Passworts", + "empty-transactionlist": "Es gab einen Fehler mit der Übermittlung der Anzahl deiner Transaktionen.", "error": "Fehler", "no-account": "Leider konnten wir keinen Account finden mit diesen Daten!", "no-email-verify": "Die Email wurde noch nicht bestätigt, bitte überprüfe deine Emails und klicke auf den Aktivierungslink!", + "no-transactionlist": "Es gab leider einen Fehler. Es wurden keine Transaktionen vom Server übermittelt", "session-expired": "Die Sitzung wurde aus Sicherheitsgründen beendet." }, "form": { @@ -55,6 +57,7 @@ "at": "am", "cancel": "Abbrechen", "close": "schließen", + "current_balance": "aktueller Kontostand", "date": "Datum", "description": "Beschreibung", "edit": "bearbeiten", @@ -64,6 +67,7 @@ "lastname": "Nachname", "memo": "Nachricht", "message": "Nachricht", + "new_balance": "neuer Kontostand nach Bestätigung", "password": "Passwort", "passwordRepeat": "Passwort wiederholen", "password_new": "neues Passwort", @@ -88,7 +92,8 @@ "is-not": "Du kannst dir selbst keine Gradidos überweisen", "usernmae-regex": "Der Username muss mit einem Buchstaben beginnen auf den mindestens zwei alfanumerische Zeichen folgen müssen.", "usernmae-unique": "Der Username ist bereits vergeben." - } + }, + "your_amount": "Dein Betrag" }, "gdt": { "action": "Aktion", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 21a4f4ef9..5ccdfc63b 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -45,9 +45,11 @@ }, "error": { "change-password": "Error while changing password", + "empty-transactionlist": "There was an error with the transmission of the number of your transactions.", "error": "Error", "no-account": "Unfortunately we could not find an account to the given data!", "no-email-verify": "Your email is not activated yet, please check your emails and click the activation link!", + "no-transactionlist": "Unfortunately, there was an error. No transactions have been sent from the server.", "session-expired": "The session was closed for security reasons." }, "form": { @@ -55,6 +57,7 @@ "at": "at", "cancel": "Cancel", "close": "Close", + "current_balance": "current balance", "date": "Date", "description": "Description", "edit": "Edit", @@ -64,6 +67,7 @@ "lastname": "Lastname", "memo": "Message", "message": "Message", + "new_balance": "account balance after confirmation", "password": "Password", "passwordRepeat": "Repeat password", "password_new": "New password", @@ -88,7 +92,8 @@ "is-not": "You cannot send Gradidos to yourself", "usernmae-regex": "The username must start with a letter, followed by at least two alphanumeric characters.", "usernmae-unique": "The username is already taken." - } + }, + "your_amount": "Your amount" }, "gdt": { "action": "Action", diff --git a/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js b/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js index faf1375fb..55f65bee6 100644 --- a/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js +++ b/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js @@ -36,9 +36,42 @@ describe('GddTransactionList', () => { expect(wrapper.find('div.gdd-transaction-list').exists()).toBeTruthy() }) + describe('no transactions from server', () => { + beforeEach(async () => { + await wrapper.setProps({ + transactions: false, + }) + }) + it('shows error no transaction list', () => { + expect(wrapper.find('div.test-no-transactionlist').text()).toContain( + 'error.no-transactionlist', + ) + }) + }) + describe('0 transactions from server', () => { + beforeEach(async () => { + await wrapper.setProps({ + transactions: [], + transactionCount: 0, + }) + }) + it('Transactions Array is empty, 0 transactions', () => { + expect(wrapper.find('div.test-empty-transactionlist').text()).toContain( + 'error.empty-transactionlist', + ) + }) + }) + describe('without any properties', () => { - it('renders text saying that there are no transactions', () => { - expect(wrapper.find('div.gdd-transaction-list').text()).toBe('transaction.nullTransactions') + it('renders text saying that there are error.empty-transactionlist ', () => { + expect(wrapper.find('div.gdd-transaction-list').text()).toContain( + 'error.empty-transactionlist', + ) + }) + it('renders text saying that there are no transaction.nullTransactions', () => { + expect(wrapper.find('div.gdd-transaction-list').text()).toContain( + 'transaction.nullTransactions', + ) }) }) diff --git a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue index 1e24c14d0..955a6adc1 100644 --- a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue +++ b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue @@ -1,6 +1,16 @@