diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index abe600c99..d5e2cc7ce 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -27,6 +27,9 @@ export enum RIGHTS { GDT_BALANCE = 'GDT_BALANCE', CREATE_CONTRIBUTION = 'CREATE_CONTRIBUTION', DELETE_CONTRIBUTION = 'DELETE_CONTRIBUTION', + LIST_CONTRIBUTIONS = 'LIST_CONTRIBUTIONS', + LIST_ALL_CONTRIBUTIONS = 'LIST_ALL_CONTRIBUTIONS', + UPDATE_CONTRIBUTION = 'UPDATE_CONTRIBUTION', // Admin SEARCH_USERS = 'SEARCH_USERS', SET_USER_ROLE = 'SET_USER_ROLE', diff --git a/backend/src/auth/ROLES.ts b/backend/src/auth/ROLES.ts index 539158986..9dcba0a4b 100644 --- a/backend/src/auth/ROLES.ts +++ b/backend/src/auth/ROLES.ts @@ -25,6 +25,9 @@ export const ROLE_USER = new Role('user', [ RIGHTS.GDT_BALANCE, RIGHTS.CREATE_CONTRIBUTION, RIGHTS.DELETE_CONTRIBUTION, + RIGHTS.LIST_CONTRIBUTIONS, + RIGHTS.LIST_ALL_CONTRIBUTIONS, + RIGHTS.UPDATE_CONTRIBUTION, ]) export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index aa4197a43..8b84c059d 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0040-add_contribution_link_id_to_user', + DB_VERSION: '0042-update_transactions_for_blockchain', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info diff --git a/backend/src/graphql/model/Contribution.ts b/backend/src/graphql/model/Contribution.ts new file mode 100644 index 000000000..34bffd6d7 --- /dev/null +++ b/backend/src/graphql/model/Contribution.ts @@ -0,0 +1,60 @@ +import { ObjectType, Field, Int } from 'type-graphql' +import Decimal from 'decimal.js-light' +import { Contribution as dbContribution } from '@entity/Contribution' +import { User } from './User' + +@ObjectType() +export class Contribution { + constructor(contribution: dbContribution, user: User) { + this.id = contribution.id + this.firstName = user ? user.firstName : null + this.lastName = user ? user.lastName : null + this.amount = contribution.amount + this.memo = contribution.memo + this.createdAt = contribution.createdAt + this.deletedAt = contribution.deletedAt + this.confirmedAt = contribution.confirmedAt + this.confirmedBy = contribution.confirmedBy + } + + @Field(() => Number) + id: number + + @Field(() => String, { nullable: true }) + firstName: string | null + + @Field(() => String, { nullable: true }) + lastName: string | null + + @Field(() => Decimal) + amount: Decimal + + @Field(() => String) + memo: string + + @Field(() => Date) + createdAt: Date + + @Field(() => Date, { nullable: true }) + deletedAt: Date | null + + @Field(() => Date, { nullable: true }) + confirmedAt: Date | null + + @Field(() => Number, { nullable: true }) + confirmedBy: number | null +} + +@ObjectType() +export class ContributionListResult { + constructor(count: number, list: Contribution[]) { + this.linkCount = count + this.linkList = list + } + + @Field(() => Int) + linkCount: number + + @Field(() => [Contribution]) + linkList: Contribution[] +} diff --git a/backend/src/graphql/model/User.ts b/backend/src/graphql/model/User.ts index 86c56312f..0642be630 100644 --- a/backend/src/graphql/model/User.ts +++ b/backend/src/graphql/model/User.ts @@ -1,10 +1,12 @@ import { ObjectType, Field } from 'type-graphql' import { KlickTipp } from './KlickTipp' import { User as dbUser } from '@entity/User' +import Decimal from 'decimal.js-light' +import { FULL_CREATION_AVAILABLE } from '../resolver/const/const' @ObjectType() export class User { - constructor(user: dbUser) { + constructor(user: dbUser, creation: Decimal[] = FULL_CREATION_AVAILABLE) { this.id = user.id this.email = user.email this.firstName = user.firstName @@ -17,6 +19,7 @@ export class User { this.isAdmin = user.isAdmin this.klickTipp = null this.hasElopage = null + this.creation = creation } @Field(() => Number) @@ -64,4 +67,7 @@ export class User { @Field(() => Boolean, { nullable: true }) hasElopage: boolean | null + + @Field(() => [Decimal]) + creation: Decimal[] } diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 75175edc2..12cad529c 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -47,11 +47,11 @@ import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' import { transactionLinkCode as contributionLinkCode } from './TransactionLinkResolver' import CONFIG from '@/config' import { - getCreationIndex, getUserCreation, getUserCreations, validateContribution, isStartEndDateValid, + updateCreations, } from './util/creations' import { CONTRIBUTIONLINK_MEMO_MAX_CHARS, @@ -321,6 +321,10 @@ export class AdminResolver { throw new Error('user of the pending contribution and send user does not correspond') } + if (contributionToUpdate.moderatorId === null) { + throw new Error('An admin is not allowed to update a user contribution.') + } + const creationDateObj = new Date(creationDate) let creations = await getUserCreation(user.id) if (contributionToUpdate.contributionDate.getMonth() === creationDateObj.getMonth()) { @@ -688,13 +692,3 @@ export class AdminResolver { return new ContributionLink(dbContributionLink) } } - -function updateCreations(creations: Decimal[], contribution: Contribution): Decimal[] { - const index = getCreationIndex(contribution.contributionDate.getMonth()) - - if (index < 0) { - throw new Error('You cannot create GDD for a month older than the last three months.') - } - creations[index] = creations[index].plus(contribution.amount.toString()) - return creations -} diff --git a/backend/src/graphql/resolver/ContributionResolver.test.ts b/backend/src/graphql/resolver/ContributionResolver.test.ts index 01e9b123e..e6478ffc2 100644 --- a/backend/src/graphql/resolver/ContributionResolver.test.ts +++ b/backend/src/graphql/resolver/ContributionResolver.test.ts @@ -2,14 +2,22 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' -import { createContribution } from '@/seeds/graphql/mutations' -import { login } from '@/seeds/graphql/queries' +import { + adminUpdateContribution, + createContribution, + updateContribution, +} from '@/seeds/graphql/mutations' +import { listAllContributions, listContributions, login } from '@/seeds/graphql/queries' import { cleanDB, resetToken, testEnvironment } from '@test/helpers' import { GraphQLError } from 'graphql' import { userFactory } from '@/seeds/factory/user' +import { creationFactory } from '@/seeds/factory/creation' +import { creations } from '@/seeds/creation/index' +import { peterLustig } from '@/seeds/users/peter-lustig' let mutate: any, query: any, con: any let testEnv: any +let result: any beforeAll(async () => { testEnv = await testEnvironment() @@ -111,6 +119,7 @@ describe('ContributionResolver', () => { expect.objectContaining({ data: { createContribution: { + id: expect.any(Number), amount: '100', memo: 'Test env contribution', }, @@ -121,4 +130,390 @@ describe('ContributionResolver', () => { }) }) }) + + describe('listContributions', () => { + describe('unauthenticated', () => { + it('returns an error', async () => { + await expect( + query({ + query: listContributions, + variables: { + currentPage: 1, + pageSize: 25, + order: 'DESC', + filterConfirmed: false, + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('authenticated', () => { + beforeAll(async () => { + await userFactory(testEnv, bibiBloxberg) + await userFactory(testEnv, peterLustig) + const bibisCreation = creations.find((creation) => creation.email === 'bibi@bloxberg.de') + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await creationFactory(testEnv, bibisCreation!) + await query({ + query: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + await mutate({ + mutation: createContribution, + variables: { + amount: 100.0, + memo: 'Test env contribution', + creationDate: new Date().toString(), + }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + describe('filter confirmed is false', () => { + it('returns creations', async () => { + await expect( + query({ + query: listContributions, + variables: { + currentPage: 1, + pageSize: 25, + order: 'DESC', + filterConfirmed: false, + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + listContributions: expect.arrayContaining([ + expect.objectContaining({ + id: expect.any(Number), + memo: 'Herzlich Willkommen bei Gradido!', + amount: '1000', + }), + expect.objectContaining({ + id: expect.any(Number), + memo: 'Test env contribution', + amount: '100', + }), + ]), + }, + }), + ) + }) + }) + + describe('filter confirmed is true', () => { + it('returns only unconfirmed creations', async () => { + await expect( + query({ + query: listContributions, + variables: { + currentPage: 1, + pageSize: 25, + order: 'DESC', + filterConfirmed: true, + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + listContributions: expect.arrayContaining([ + expect.objectContaining({ + id: expect.any(Number), + memo: 'Test env contribution', + amount: '100', + }), + ]), + }, + }), + ) + }) + }) + }) + }) + + describe('updateContribution', () => { + describe('unauthenticated', () => { + it('returns an error', async () => { + await expect( + mutate({ + mutation: updateContribution, + variables: { + contributionId: 1, + amount: 100.0, + memo: 'Test Contribution', + creationDate: 'not-valid', + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('authenticated', () => { + beforeAll(async () => { + await userFactory(testEnv, peterLustig) + await userFactory(testEnv, bibiBloxberg) + await query({ + query: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + result = await mutate({ + mutation: createContribution, + variables: { + amount: 100.0, + memo: 'Test env contribution', + creationDate: new Date().toString(), + }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + describe('wrong contribution id', () => { + it('throws an error', async () => { + await expect( + mutate({ + mutation: updateContribution, + variables: { + contributionId: -1, + amount: 100.0, + memo: 'Test env contribution', + creationDate: new Date().toString(), + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('No contribution found to given id.')], + }), + ) + }) + }) + + describe('wrong user tries to update the contribution', () => { + beforeAll(async () => { + await query({ + query: login, + variables: { email: 'peter@lustig.de', password: 'Aa12345_' }, + }) + }) + + it('throws an error', async () => { + await expect( + mutate({ + mutation: updateContribution, + variables: { + contributionId: result.data.createContribution.id, + amount: 10.0, + memo: 'Test env contribution', + creationDate: new Date().toString(), + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [ + new GraphQLError( + 'user of the pending contribution and send user does not correspond', + ), + ], + }), + ) + }) + }) + + describe('admin tries to update a user contribution', () => { + it('throws an error', async () => { + await expect( + mutate({ + mutation: adminUpdateContribution, + variables: { + id: result.data.createContribution.id, + email: 'bibi@bloxberg.de', + amount: 10.0, + memo: 'Test env contribution', + creationDate: new Date().toString(), + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('An admin is not allowed to update a user contribution.')], + }), + ) + }) + }) + + describe('update too much so that the limit is exceeded', () => { + beforeAll(async () => { + await query({ + query: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + }) + + it('throws an error', async () => { + await expect( + mutate({ + mutation: updateContribution, + variables: { + contributionId: result.data.createContribution.id, + amount: 1019.0, + memo: 'Test env contribution', + creationDate: new Date().toString(), + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [ + new GraphQLError( + 'The amount (1019 GDD) to be created exceeds the amount (1000 GDD) still available for this month.', + ), + ], + }), + ) + }) + }) + + describe('update creation to a date that is older than 3 months', () => { + it('throws an error', async () => { + const date = new Date() + await expect( + mutate({ + mutation: updateContribution, + variables: { + contributionId: result.data.createContribution.id, + amount: 10.0, + memo: 'Test env contribution', + creationDate: date.setMonth(date.getMonth() - 3).toString(), + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [ + new GraphQLError('No information for available creations for the given date'), + ], + }), + ) + }) + }) + + describe('valid input', () => { + it('updates contribution', async () => { + await expect( + mutate({ + mutation: updateContribution, + variables: { + contributionId: result.data.createContribution.id, + amount: 10.0, + memo: 'Test contribution', + creationDate: new Date().toString(), + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + updateContribution: { + id: result.data.createContribution.id, + amount: '10', + memo: 'Test contribution', + }, + }, + }), + ) + }) + }) + }) + }) + + describe('listAllContribution', () => { + describe('unauthenticated', () => { + it('returns an error', async () => { + await expect( + query({ + query: listAllContributions, + variables: { + currentPage: 1, + pageSize: 25, + order: 'DESC', + filterConfirmed: false, + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('authenticated', () => { + beforeAll(async () => { + await userFactory(testEnv, bibiBloxberg) + await userFactory(testEnv, peterLustig) + const bibisCreation = creations.find((creation) => creation.email === 'bibi@bloxberg.de') + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await creationFactory(testEnv, bibisCreation!) + await query({ + query: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + await mutate({ + mutation: createContribution, + variables: { + amount: 100.0, + memo: 'Test env contribution', + creationDate: new Date().toString(), + }, + }) + }) + + it('returns allCreation', async () => { + await expect( + query({ + query: listAllContributions, + variables: { + currentPage: 1, + pageSize: 25, + order: 'DESC', + filterConfirmed: false, + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + listAllContributions: { + linkCount: 2, + linkList: expect.arrayContaining([ + expect.objectContaining({ + id: expect.any(Number), + memo: 'Herzlich Willkommen bei Gradido!', + amount: '1000', + }), + expect.objectContaining({ + id: expect.any(Number), + memo: 'Test env contribution', + amount: '100', + }), + ]), + }, + }, + }), + ) + }) + }) + }) }) diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index f84b03598..20eeaa199 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -1,11 +1,24 @@ import { RIGHTS } from '@/auth/RIGHTS' import { Context, getUser } from '@/server/context' import { backendLogger as logger } from '@/server/logger' +<<<<<<< HEAD import { Contribution } from '@entity/Contribution' import { Arg, Args, Authorized, Ctx, Int, Mutation, Resolver } from 'type-graphql' import ContributionArgs from '../arg/ContributionArgs' import { UnconfirmedContribution } from '../model/UnconfirmedContribution' import { validateContribution, getUserCreation } from './util/creations' +======= +import { Contribution as dbContribution } from '@entity/Contribution' +import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql' +import { FindOperator, IsNull } from '@dbTools/typeorm' +import ContributionArgs from '@arg/ContributionArgs' +import Paginated from '@arg/Paginated' +import { Order } from '@enum/Order' +import { Contribution, ContributionListResult } from '@model/Contribution' +import { UnconfirmedContribution } from '@model/UnconfirmedContribution' +import { User } from '@model/User' +import { validateContribution, getUserCreation, updateCreations } from './util/creations' +>>>>>>> master @Resolver() export class ContributionResolver { @@ -21,7 +34,7 @@ export class ContributionResolver { const creationDateObj = new Date(creationDate) validateContribution(creations, amount, creationDateObj) - const contribution = Contribution.create() + const contribution = dbContribution.create() contribution.userId = user.id contribution.amount = amount contribution.createdAt = new Date() @@ -29,10 +42,11 @@ export class ContributionResolver { contribution.memo = memo logger.trace('contribution to save', contribution) - await Contribution.save(contribution) + await dbContribution.save(contribution) return new UnconfirmedContribution(contribution, user, creations) } +<<<<<<< HEAD @Authorized([RIGHTS.DELETE_CONTRIBUTION]) @Mutation(() => Boolean) async adminDeleteContribution( @@ -49,5 +63,90 @@ export class ContributionResolver { } const res = await contribution.softRemove() return !!res +======= + @Authorized([RIGHTS.LIST_CONTRIBUTIONS]) + @Query(() => [Contribution]) + async listContributions( + @Args() + { currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated, + @Arg('filterConfirmed', () => Boolean) + filterConfirmed: boolean | null, + @Ctx() context: Context, + ): Promise { + const user = getUser(context) + const where: { + userId: number + confirmedBy?: FindOperator | null + } = { userId: user.id } + if (filterConfirmed) where.confirmedBy = IsNull() + const contributions = await dbContribution.find({ + where, + order: { + createdAt: order, + }, + withDeleted: true, + skip: (currentPage - 1) * pageSize, + take: pageSize, + }) + return contributions.map((contribution) => new Contribution(contribution, new User(user))) + } + + @Authorized([RIGHTS.LIST_ALL_CONTRIBUTIONS]) + @Query(() => ContributionListResult) + async listAllContributions( + @Args() + { currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated, + ): Promise { + const [dbContributions, count] = await dbContribution.findAndCount({ + relations: ['user'], + order: { + createdAt: order, + }, + skip: (currentPage - 1) * pageSize, + take: pageSize, + }) + return new ContributionListResult( + count, + dbContributions.map( + (contribution) => new Contribution(contribution, new User(contribution.user)), + ), + ) + } + + @Authorized([RIGHTS.UPDATE_CONTRIBUTION]) + @Mutation(() => UnconfirmedContribution) + async updateContribution( + @Arg('contributionId', () => Int) + contributionId: number, + @Args() { amount, memo, creationDate }: ContributionArgs, + @Ctx() context: Context, + ): Promise { + const user = getUser(context) + + const contributionToUpdate = await dbContribution.findOne({ + where: { id: contributionId, confirmedAt: IsNull() }, + }) + if (!contributionToUpdate) { + throw new Error('No contribution found to given id.') + } + if (contributionToUpdate.userId !== user.id) { + throw new Error('user of the pending contribution and send user does not correspond') + } + + const creationDateObj = new Date(creationDate) + let creations = await getUserCreation(user.id) + if (contributionToUpdate.contributionDate.getMonth() === creationDateObj.getMonth()) { + creations = updateCreations(creations, contributionToUpdate) + } + + // all possible cases not to be true are thrown in this function + validateContribution(creations, amount, creationDateObj) + contributionToUpdate.amount = amount + contributionToUpdate.memo = memo + contributionToUpdate.contributionDate = new Date(creationDate) + dbContribution.save(contributionToUpdate) + + return new UnconfirmedContribution(contributionToUpdate, user, creations) +>>>>>>> master } } diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 0bde22ae6..5b824b38f 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -23,6 +23,7 @@ import { sendAccountMultiRegistrationEmail } from '@/mailer/sendAccountMultiRegi import { klicktippSignIn } from '@/apis/KlicktippController' import { RIGHTS } from '@/auth/RIGHTS' import { hasElopageBuys } from '@/util/hasElopageBuys' +import { getUserCreation } from './util/creations' // eslint-disable-next-line @typescript-eslint/no-var-requires const sodium = require('sodium-native') @@ -224,7 +225,7 @@ export class UserResolver { logger.info('verifyLogin...') // TODO refactor and do not have duplicate code with login(see below) const userEntity = getUser(context) - const user = new User(userEntity) + const user = new User(userEntity, await getUserCreation(userEntity.id)) // user.pubkey = userEntity.pubKey.toString('hex') // Elopage Status & Stored PublisherId user.hasElopage = await this.hasElopage(context) @@ -274,7 +275,7 @@ export class UserResolver { logger.addContext('user', dbUser.id) logger.debug('login credentials valid...') - const user = new User(dbUser) + const user = new User(dbUser, await getUserCreation(dbUser.id)) logger.debug('user=' + user) // Elopage Status & Stored PublisherId diff --git a/backend/src/graphql/resolver/util/creations.ts b/backend/src/graphql/resolver/util/creations.ts index dcdce2bfa..ad15ebec6 100644 --- a/backend/src/graphql/resolver/util/creations.ts +++ b/backend/src/graphql/resolver/util/creations.ts @@ -1,6 +1,7 @@ import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' import { backendLogger as logger } from '@/server/logger' import { getConnection } from '@dbTools/typeorm' +import { Contribution } from '@entity/Contribution' import Decimal from 'decimal.js-light' import { FULL_CREATION_AVAILABLE, MAX_CREATION_AMOUNT } from '../const/const' @@ -117,3 +118,13 @@ export const isStartEndDateValid = ( throw new Error(`The value of validFrom must before or equals the validTo!`) } } + +export const updateCreations = (creations: Decimal[], contribution: Contribution): Decimal[] => { + const index = getCreationIndex(contribution.contributionDate.getMonth()) + + if (index < 0) { + throw new Error('You cannot create GDD for a month older than the last three months.') + } + creations[index] = creations[index].plus(contribution.amount.toString()) + return creations +} diff --git a/backend/src/seeds/graphql/mutations.ts b/backend/src/seeds/graphql/mutations.ts index 4926f706f..4e7fa8a90 100644 --- a/backend/src/seeds/graphql/mutations.ts +++ b/backend/src/seeds/graphql/mutations.ts @@ -234,6 +234,22 @@ export const deleteContributionLink = gql` export const createContribution = gql` mutation ($amount: Decimal!, $memo: String!, $creationDate: String!) { createContribution(amount: $amount, memo: $memo, creationDate: $creationDate) { + id + amount + memo + } + } +` + +export const updateContribution = gql` + mutation ($contributionId: Int!, $amount: Decimal!, $memo: String!, $creationDate: String!) { + updateContribution( + contributionId: $contributionId + amount: $amount + memo: $memo + creationDate: $creationDate + ) { + id amount memo } diff --git a/backend/src/seeds/graphql/queries.ts b/backend/src/seeds/graphql/queries.ts index 531aebf0f..deae5f97b 100644 --- a/backend/src/seeds/graphql/queries.ts +++ b/backend/src/seeds/graphql/queries.ts @@ -172,6 +172,43 @@ export const queryTransactionLink = gql` } ` +export const listContributions = gql` + query ( + $currentPage: Int = 1 + $pageSize: Int = 5 + $order: Order + $filterConfirmed: Boolean = false + ) { + listContributions( + currentPage: $currentPage + pageSize: $pageSize + order: $order + filterConfirmed: $filterConfirmed + ) { + id + amount + memo + } + } +` + +export const listAllContributions = ` +query ($currentPage: Int = 1, $pageSize: Int = 5, $order: Order = DESC) { + listAllContributions(currentPage: $currentPage, pageSize: $pageSize, order: $order) { + linkCount + linkList { + id + firstName + lastName + amount + memo + createdAt + confirmedAt + confirmedBy + } + } +} +` // from admin interface export const listUnconfirmedContributions = gql` diff --git a/backend/src/server/plugins.ts b/backend/src/server/plugins.ts index 1972bc1c8..24df45baa 100644 --- a/backend/src/server/plugins.ts +++ b/backend/src/server/plugins.ts @@ -31,20 +31,24 @@ const filterVariables = (variables: any) => { const logPlugin = { requestDidStart(requestContext: any) { const { logger } = requestContext - const { query, mutation, variables } = requestContext.request - logger.info(`Request: + const { query, mutation, variables, operationName } = requestContext.request + if (operationName !== 'IntrospectionQuery') { + logger.info(`Request: ${mutation || query}variables: ${JSON.stringify(filterVariables(variables), null, 2)}`) + } return { willSendResponse(requestContext: any) { - if (requestContext.context.user) logger.info(`User ID: ${requestContext.context.user.id}`) - if (requestContext.response.data) { - logger.info('Response Success!') - logger.trace(`Response-Data: + if (operationName !== 'IntrospectionQuery') { + if (requestContext.context.user) logger.info(`User ID: ${requestContext.context.user.id}`) + if (requestContext.response.data) { + logger.info('Response Success!') + logger.trace(`Response-Data: ${JSON.stringify(requestContext.response.data, null, 2)}`) - } - if (requestContext.response.errors) - logger.error(`Response-Errors: + } + if (requestContext.response.errors) + logger.error(`Response-Errors: ${JSON.stringify(requestContext.response.errors, null, 2)}`) + } return requestContext }, } diff --git a/database/entity/0039-contributions_table/Contribution.ts b/database/entity/0039-contributions_table/Contribution.ts index 6c7358f90..b5e6ac0e0 100644 --- a/database/entity/0039-contributions_table/Contribution.ts +++ b/database/entity/0039-contributions_table/Contribution.ts @@ -1,6 +1,15 @@ import Decimal from 'decimal.js-light' -import { BaseEntity, Column, Entity, PrimaryGeneratedColumn, DeleteDateColumn } from 'typeorm' +import { + BaseEntity, + Column, + Entity, + PrimaryGeneratedColumn, + DeleteDateColumn, + JoinColumn, + ManyToOne, +} from 'typeorm' import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' +import { User } from '../User' @Entity('contributions') export class Contribution extends BaseEntity { @@ -10,6 +19,10 @@ export class Contribution extends BaseEntity { @Column({ unsigned: true, nullable: false, name: 'user_id' }) userId: number + @ManyToOne(() => User, (user) => user.contributions) + @JoinColumn({ name: 'user_id' }) + user: User + @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP', name: 'created_at' }) createdAt: Date diff --git a/database/entity/0040-add_contribution_link_id_to_user/User.ts b/database/entity/0040-add_contribution_link_id_to_user/User.ts index 9bf76e5f5..56047345a 100644 --- a/database/entity/0040-add_contribution_link_id_to_user/User.ts +++ b/database/entity/0040-add_contribution_link_id_to_user/User.ts @@ -1,4 +1,13 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from 'typeorm' +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + DeleteDateColumn, + OneToMany, + JoinColumn, +} from 'typeorm' +import { Contribution } from '../Contribution' @Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class User extends BaseEntity { @@ -76,4 +85,8 @@ export class User extends BaseEntity { default: null, }) passphrase: string + + @OneToMany(() => Contribution, (contribution) => contribution.user) + @JoinColumn({ name: 'user_id' }) + contributions?: Contribution[] } diff --git a/database/migrations/0041-move_users_creation_date.ts b/database/migrations/0041-move_users_creation_date.ts new file mode 100644 index 000000000..27353a5b4 --- /dev/null +++ b/database/migrations/0041-move_users_creation_date.ts @@ -0,0 +1,130 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/* +Move forward the creation date of the users by 1 or 2 hours, +for which there are transactions created before their account creation. + +Because of a error by importing data from old db format into new, all older transactions balance_date +are 1 or 2 hours off + +*/ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + /* generate raw mysql queries + const usersToMove = await queryFn( + ` + SELECT u.id, u.created, t.balance_date + FROM \`users\` as u + LEFT JOIN \`transactions\` as t + ON t.user_id = u.id where t.balance_date < u.created + order by id + ` + ) + let downgradeQueries = '' + for(const id in usersToMove) { + const user = usersToMove[id] + const diff = (user.created - user.balance_date) / 1000 + const correcture = diff < 3600 ? 1: 2 + const correctedDate = new Date(user.created) + correctedDate.setHours(correctedDate.getHours() - correcture) + //console.log("%d, %s, %s, %s, %d", user.id, user.created, user.balance_date, diff, correcture) + console.log('await queryFn(`UPDATE \\`users\\` SET \\`created\\` = \'%s\' WHERE \\`id\\` = %d`)', + correctedDate.toISOString().slice(0, 19).replace('T', ' '), + user.id + ) + downgradeQueries += 'await queryFn(`UPDATE \\`users\\` SET \\`created\\` = \'' + downgradeQueries += user.created.toISOString().slice(0, 19).replace('T', ' ') + downgradeQueries += '\' WHERE \\`id\\` = ' + downgradeQueries += user.id + downgradeQueries += '`)\n' + } + console.log('downgrade: \n%s', downgradeQueries) + */ + + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-01-25 08:01:52' WHERE \`id\` = 179`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-05-26 10:21:57' WHERE \`id\` = 443`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-06-08 17:04:41' WHERE \`id\` = 490`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-06-12 20:07:17' WHERE \`id\` = 508`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-07-17 19:20:36' WHERE \`id\` = 621`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-11-22 16:31:48' WHERE \`id\` = 788`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-12-17 20:09:16' WHERE \`id\` = 825`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-01-26 13:09:35' WHERE \`id\` = 949`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-03-20 16:55:46' WHERE \`id\` = 1057`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 15:59:30' WHERE \`id\` = 1228`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 17:38:47' WHERE \`id\` = 1229`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 17:38:47' WHERE \`id\` = 1229`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 17:38:47' WHERE \`id\` = 1229`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 17:58:15' WHERE \`id\` = 1230`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 17:58:15' WHERE \`id\` = 1230`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-14 14:27:49' WHERE \`id\` = 1231`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-14 14:27:49' WHERE \`id\` = 1231`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-14 14:27:49' WHERE \`id\` = 1231`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-14 14:27:49' WHERE \`id\` = 1231`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-17 22:51:19' WHERE \`id\` = 1239`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-03 07:23:28' WHERE \`id\` = 1273`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-09 06:16:18' WHERE \`id\` = 1287`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-17 11:26:41' WHERE \`id\` = 1298`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-30 15:56:27' WHERE \`id\` = 1315`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-30 15:56:27' WHERE \`id\` = 1315`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-30 15:56:27' WHERE \`id\` = 1315`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-07-08 07:24:57' WHERE \`id\` = 1326`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-07-08 07:24:57' WHERE \`id\` = 1326`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-07-13 12:07:29' WHERE \`id\` = 1342`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-07-16 15:32:48' WHERE \`id\` = 1348`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-09-30 14:06:40' WHERE \`id\` = 1470`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-10-15 14:35:37' WHERE \`id\` = 1490`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-10-16 06:42:00' WHERE \`id\` = 1492`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-10-16 06:42:00' WHERE \`id\` = 1492`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-11-22 09:45:15' WHERE \`id\` = 1576`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-11-23 13:55:37' WHERE \`id\` = 1582`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2022-01-11 14:58:12' WHERE \`id\` = 1729`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2022-01-11 18:03:10' WHERE \`id\` = 1732`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2022-01-19 15:00:38' WHERE \`id\` = 1756`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2022-01-19 20:01:58' WHERE \`id\` = 1757`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2022-01-21 15:58:48' WHERE \`id\` = 1762`) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-01-25 09:01:52' WHERE \`id\` = 179`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-05-26 11:21:57' WHERE \`id\` = 443`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-06-08 19:04:41' WHERE \`id\` = 490`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-06-12 22:07:17' WHERE \`id\` = 508`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-07-17 21:20:36' WHERE \`id\` = 621`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-11-22 17:31:48' WHERE \`id\` = 788`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2020-12-17 21:09:16' WHERE \`id\` = 825`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-01-26 14:09:35' WHERE \`id\` = 949`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-03-20 17:55:46' WHERE \`id\` = 1057`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 17:59:30' WHERE \`id\` = 1228`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 19:38:47' WHERE \`id\` = 1229`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 19:38:47' WHERE \`id\` = 1229`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 19:38:47' WHERE \`id\` = 1229`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 19:58:15' WHERE \`id\` = 1230`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-13 19:58:15' WHERE \`id\` = 1230`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-14 16:27:49' WHERE \`id\` = 1231`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-14 16:27:49' WHERE \`id\` = 1231`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-14 16:27:49' WHERE \`id\` = 1231`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-14 16:27:49' WHERE \`id\` = 1231`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-05-18 00:51:19' WHERE \`id\` = 1239`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-03 09:23:28' WHERE \`id\` = 1273`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-09 08:16:18' WHERE \`id\` = 1287`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-17 13:26:41' WHERE \`id\` = 1298`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-30 17:56:27' WHERE \`id\` = 1315`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-30 17:56:27' WHERE \`id\` = 1315`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-06-30 17:56:27' WHERE \`id\` = 1315`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-07-08 09:24:57' WHERE \`id\` = 1326`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-07-08 09:24:57' WHERE \`id\` = 1326`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-07-13 14:07:29' WHERE \`id\` = 1342`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-07-16 16:32:48' WHERE \`id\` = 1348`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-09-30 16:06:40' WHERE \`id\` = 1470`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-10-15 16:35:37' WHERE \`id\` = 1490`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-10-16 08:42:00' WHERE \`id\` = 1492`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-10-16 08:42:00' WHERE \`id\` = 1492`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-11-22 10:45:15' WHERE \`id\` = 1576`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2021-11-23 14:55:37' WHERE \`id\` = 1582`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2022-01-11 15:58:12' WHERE \`id\` = 1729`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2022-01-11 19:03:10' WHERE \`id\` = 1732`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2022-01-19 16:00:38' WHERE \`id\` = 1756`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2022-01-19 21:01:58' WHERE \`id\` = 1757`) + await queryFn(`UPDATE \`users\` SET \`created\` = '2022-01-21 16:58:48' WHERE \`id\` = 1762`) +} diff --git a/database/migrations/0042-update_transactions_for_blockchain.ts b/database/migrations/0042-update_transactions_for_blockchain.ts new file mode 100644 index 000000000..d7b26abbd --- /dev/null +++ b/database/migrations/0042-update_transactions_for_blockchain.ts @@ -0,0 +1,1917 @@ +/* MIGRATION for updating transactions from the past to follow the blockchain rules */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // split creation transaction with 3000 GDD created in one transaction what isn't allowed + const transactionMemos: string[] = [ + 'Aktives Grundeinkommen für GL. Dez', + 'Aktives Grundeinkommen für GL. Jan', + 'Aktives Grundeinkommen für GL. Feb', + ] + const creationDate = new Date('2020-03-30 06:59:55') + + await queryFn( + `UPDATE \`transactions\` set \`amount\` = 1000, \`balance\` = 1000, \`memo\` = ? WHERE \`id\` = 150`, + [transactionMemos[0]], + ) + + // [ RowDataPacket { 'MAX(`id`)': 6828 } ] + const lastTransactionId = (await queryFn(`SELECT MAX(\`id\`) as max_id from \`transactions\``))[0] + .max_id + // dummy id to insert two transactions before this (previous has an index on it) + await queryFn(`UPDATE \`transactions\` set \`previous\` = ? WHERE \`id\` = 278`, [ + lastTransactionId + 30, + ]) + + await queryFn( + `INSERT INTO \`transactions\`( + \`user_id\`, \`previous\`, \`type_id\`, \`amount\`, \`balance\`, + \`balance_date\`, \`decay\`, \`memo\`, \`creation_date\` + ) VALUES( + 275, 150, 1, 1000, 2000, + ?, 0, ?, ? + )`, + [ + creationDate, + transactionMemos[1], + new Date(creationDate.getFullYear(), creationDate.getMonth() - 1, 1), + ], + ) + await queryFn( + `INSERT INTO \`transactions\`( + \`user_id\`, \`previous\`, \`type_id\`, \`amount\`, \`balance\`, + \`balance_date\`, \`decay\`, \`memo\`, \`creation_date\` + ) VALUES( + 275, LAST_INSERT_ID(), 1, 1000, 3000, + ?, 0, ?, ? + )`, + [ + creationDate, + transactionMemos[2], + new Date(creationDate.getFullYear(), creationDate.getMonth() - 2, 1), + ], + ) + await queryFn(`UPDATE \`transactions\` set \`previous\` = LAST_INSERT_ID() WHERE \`id\` = 278`) + + // ---------------------------------------------------------------------------------------------- + // update creation_date for transactions with creation_date == balance_date + /* js code for generating mysql raw queries + // print mysql raw querys + interface ReplaceSet { + monthName: RegExp + monthValue: number + } + // js month starting with 0 for Jan + const replaceSets: ReplaceSet[] = [ + { monthName: new RegExp('.*Dez.*'), monthValue: -1}, + { monthName: new RegExp('.*Jan.*'), monthValue: 0 }, + { monthName: new RegExp('.*Feb.*'), monthValue: 1 }, + { monthName: new RegExp('.*M.rz.*'), monthValue: 2 }, + { monthName: new RegExp('.*April.*'), monthValue: 3 }, + ] + const transaction_ids = await queryFn(` + SELECT id, balance_date, creation_date, memo + FROM \`transactions\` + WHERE \`balance_date\` = \`creation_date\` + AND \`type_id\` = 1 + `) + let downgradeQueries = '' + for(let id in transaction_ids) { + const transaction = transaction_ids[id] + let updatedCreationDate: Date | null = null + // determine correct creation date + for(const replaceSet of replaceSets) { + // check if target creation can be determine which help of the memo + if(transaction.memo.match(replaceSet.monthName)) { + const oldCreationDate = transaction.creation_date + updatedCreationDate = new Date(oldCreationDate) + updatedCreationDate.setMonth(replaceSet.monthValue) + break + } + } + // couldn't find info in memo, simply set date 1 month back + if(updatedCreationDate === null) { + //date.setMonth(date.getMonth() - numOfMonths); + updatedCreationDate = new Date(transaction.creation_date) + updatedCreationDate.setMonth(transaction.creation_date.getMonth() - 1) + } + if(updatedCreationDate.getMonth() == 1) { + // only 28 februars exist so let us fix it + if(updatedCreationDate.getDate() > 28) { + updatedCreationDate.setDate(28) + } + } + console.log('// %s, original creation date: %s\nawait queryFn(`UPDATE \\`transactions\\` SET creation_date = \'%s\' WHERE \\`id\\` = %d`)\n', + transaction.memo, + transaction.creation_date.toISOString().slice(0, 19).replace('T', ' '), + updatedCreationDate.toISOString().slice(0, 19).replace('T', ' '), + transaction.id + ) + downgradeQueries += 'await queryFn(`UPDATE \\`transactions\\` SET creation_date = \'' + downgradeQueries += transaction.creation_date.toISOString().slice(0, 19).replace('T', ' ') + downgradeQueries += '\' WHERE \\`id\\` = ' + downgradeQueries += transaction.id + downgradeQueries += '`)\n' + } + console.log("downgrade: \n%s", downgradeQueries) + console.log("transactions count: %d", transaction_ids.length) // 224 +*/ + + // Erste Schöpfung, viel Spaß damit ;), original creation date: 2019-12-17 13:06:13 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-11-17 13:06:13' WHERE \`id\` = 1`, + ) + + // Erste Schöpfung, viel Spaß damit ;), original creation date: 2019-12-17 13:06:16 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-11-17 13:06:16' WHERE \`id\` = 2`, + ) + + // Erste Schöpfung, viel Spaß damit ;), original creation date: 2019-12-17 13:06:19 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-11-17 13:06:19' WHERE \`id\` = 3`, + ) + + // Erste Schöpfung, viel Spaß damit ;), original creation date: 2019-12-17 13:06:21 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-11-17 13:06:21' WHERE \`id\` = 4`, + ) + + // Test1 , original creation date: 2019-12-17 13:07:01 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-11-17 13:07:01' WHERE \`id\` = 5`, + ) + + // EIn bisschen Nachschub für dich ;), original creation date: 2019-12-19 17:35:16 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-11-19 17:35:16' WHERE \`id\` = 6`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-08 10:34:40 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-08 10:34:40' WHERE \`id\` = 7`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-08 11:02:41 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-08 11:02:41' WHERE \`id\` = 8`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-08 11:06:42 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-08 11:06:42' WHERE \`id\` = 9`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-08 11:16:11 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-08 11:16:11' WHERE \`id\` = 10`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-08 11:16:15 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-08 11:16:15' WHERE \`id\` = 11`, + ) + + // Für deine tolle Arbeit ;), original creation date: 2020-01-08 13:24:29 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-08 13:24:29' WHERE \`id\` = 12`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-09 12:02:48 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-09 12:02:48' WHERE \`id\` = 13`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-09 12:02:52 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-09 12:02:52' WHERE \`id\` = 14`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-09 12:02:54 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-09 12:02:54' WHERE \`id\` = 15`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-09 12:09:08 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-09 12:09:08' WHERE \`id\` = 16`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-11 11:10:55 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-11 11:10:55' WHERE \`id\` = 17`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-11 11:11:24 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-11 11:11:24' WHERE \`id\` = 18`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-11 11:12:09 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-11 11:12:09' WHERE \`id\` = 19`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-11 11:31:20 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-11 11:31:20' WHERE \`id\` = 20`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-11 11:37:13 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-11 11:37:13' WHERE \`id\` = 21`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-11 11:37:42 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-11 11:37:42' WHERE \`id\` = 22`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-11 19:01:06 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-11 19:01:06' WHERE \`id\` = 23`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-13 16:27:07 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-13 16:27:07' WHERE \`id\` = 24`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-13 16:28:05 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-13 16:28:05' WHERE \`id\` = 25`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-13 16:28:57 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-13 16:28:57' WHERE \`id\` = 26`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-13 16:29:45 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-13 16:29:45' WHERE \`id\` = 27`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-17 13:47:28 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-17 13:47:28' WHERE \`id\` = 28`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-17 13:48:52 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-17 13:48:52' WHERE \`id\` = 29`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-17 13:49:21 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-17 13:49:21' WHERE \`id\` = 30`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-23 13:08:44 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-23 13:08:44' WHERE \`id\` = 31`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-27 08:12:16 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-27 08:12:16' WHERE \`id\` = 32`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 14:49:58 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 14:49:58' WHERE \`id\` = 33`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 14:50:35 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 14:50:35' WHERE \`id\` = 34`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 14:50:55 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 14:50:55' WHERE \`id\` = 35`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 14:52:03 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 14:52:03' WHERE \`id\` = 36`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 14:52:33 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 14:52:33' WHERE \`id\` = 37`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 14:52:53 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 14:52:53' WHERE \`id\` = 38`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 14:53:45 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 14:53:45' WHERE \`id\` = 39`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 14:54:13 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 14:54:13' WHERE \`id\` = 40`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 14:54:50 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 14:54:50' WHERE \`id\` = 41`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 15:03:26 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 15:03:26' WHERE \`id\` = 42`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 15:10:39 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 15:10:39' WHERE \`id\` = 43`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 15:13:10 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 15:13:10' WHERE \`id\` = 44`, + ) + + // AGE Dezember 2019, original creation date: 2020-01-30 15:26:45 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 15:26:45' WHERE \`id\` = 45`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:54:31 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:54:31' WHERE \`id\` = 46`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:30 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:30' WHERE \`id\` = 47`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:33 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:33' WHERE \`id\` = 48`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:36 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:36' WHERE \`id\` = 49`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:39 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:39' WHERE \`id\` = 50`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:43 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:43' WHERE \`id\` = 51`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:46 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:46' WHERE \`id\` = 52`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:48 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:48' WHERE \`id\` = 53`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:50 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:50' WHERE \`id\` = 54`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:52 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:52' WHERE \`id\` = 55`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:54 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:54' WHERE \`id\` = 56`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:56 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:56' WHERE \`id\` = 57`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:55:59 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:55:59' WHERE \`id\` = 58`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:02 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:02' WHERE \`id\` = 59`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:05 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:05' WHERE \`id\` = 60`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:07 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:07' WHERE \`id\` = 61`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:10 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:10' WHERE \`id\` = 62`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:12 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:12' WHERE \`id\` = 63`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:14 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:14' WHERE \`id\` = 64`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:21 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:21' WHERE \`id\` = 65`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:24 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:24' WHERE \`id\` = 66`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:26 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:26' WHERE \`id\` = 67`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:28 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:28' WHERE \`id\` = 68`, + ) + + // Grundeinkommen für Gemeinschaftsleistungen Jan. 2020, original creation date: 2020-02-19 08:56:31 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-19 08:56:31' WHERE \`id\` = 69`, + ) + + // Grundeinkommen rückwirkend Dezember, original creation date: 2020-02-20 06:40:36 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-20 06:40:36' WHERE \`id\` = 70`, + ) + + // Grundeinkommen für GLJanuar 2020, original creation date: 2020-02-20 06:43:41 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-20 06:43:41' WHERE \`id\` = 71`, + ) + + // Grundeinkommen für GLJanuar 2020, original creation date: 2020-02-20 06:43:43 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-20 06:43:43' WHERE \`id\` = 72`, + ) + + // Grundeinkommen für GLJanuar 2020, original creation date: 2020-02-20 06:43:45 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-20 06:43:45' WHERE \`id\` = 73`, + ) + + // Grundeinkommen für GLJanuar 2020, original creation date: 2020-02-20 06:43:47 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-20 06:43:47' WHERE \`id\` = 74`, + ) + + // Grundeinkommen, original creation date: 2020-02-20 07:09:05 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-20 07:09:05' WHERE \`id\` = 75`, + ) + + // Grundeinkommen für GLJanuar 2020, original creation date: 2020-02-20 08:03:31 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-20 08:03:31' WHERE \`id\` = 76`, + ) + + // AGE für Gemeinschaftsleistungen Januar 2020, original creation date: 2020-02-29 16:17:24 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-29 16:17:24' WHERE \`id\` = 77`, + ) + + // AGE für Gemeinschaftsleistungen Januar 2020, original creation date: 2020-02-29 16:17:35 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-29 16:17:35' WHERE \`id\` = 78`, + ) + + // AGE für Gemeinschaftsleistungen Januar 2020, original creation date: 2020-02-29 16:17:42 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-29 16:17:42' WHERE \`id\` = 79`, + ) + + // AGE für Gemeinschaftsleistungen Januar 2020, original creation date: 2020-02-29 16:29:47 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-29 16:29:47' WHERE \`id\` = 80`, + ) + + // AGE für Gemeinschaftsleistungen Januar 2020, original creation date: 2020-02-29 16:29:48 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-29 16:29:48' WHERE \`id\` = 81`, + ) + + // AGE für Gemeinschaftsleistungen Januar 2020, original creation date: 2020-02-29 16:29:55 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-29 16:29:55' WHERE \`id\` = 82`, + ) + + // AGE rückwirkend für Januar 2020, original creation date: 2020-03-04 09:08:54 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-04 09:08:54' WHERE \`id\` = 83`, + ) + + // AGE für Gemeinschaftsleitungen Januar, original creation date: 2020-03-07 07:59:42 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-07 07:59:42' WHERE \`id\` = 84`, + ) + + // AGE für Gemeinschaftsleitungen Januar, original creation date: 2020-03-07 07:59:51 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-07 07:59:51' WHERE \`id\` = 85`, + ) + + // AGE für Gemeinschaftsleitungen Januar, original creation date: 2020-03-07 07:59:54 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-07 07:59:54' WHERE \`id\` = 86`, + ) + + // AGE für Gemeinschaftsleitungen Januar, original creation date: 2020-03-07 07:59:57 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-07 07:59:57' WHERE \`id\` = 87`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:15:48 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:15:48' WHERE \`id\` = 88`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:15:53 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:15:53' WHERE \`id\` = 89`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:15:56 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:15:56' WHERE \`id\` = 90`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:15:59 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:15:59' WHERE \`id\` = 91`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:16:01 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:16:01' WHERE \`id\` = 92`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:16:05 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:16:05' WHERE \`id\` = 93`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:16:07 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:16:07' WHERE \`id\` = 94`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:16:10 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:16:10' WHERE \`id\` = 95`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:17:00 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:17:00' WHERE \`id\` = 96`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:17:03 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:17:03' WHERE \`id\` = 97`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:17:05 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:17:05' WHERE \`id\` = 98`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:17:07 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:17:07' WHERE \`id\` = 99`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:17:09 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:17:09' WHERE \`id\` = 100`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:17:11 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:17:11' WHERE \`id\` = 101`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:17:13 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:17:13' WHERE \`id\` = 102`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:17:21 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:17:21' WHERE \`id\` = 103`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:17:25 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:17:25' WHERE \`id\` = 104`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-07 08:17:28 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:17:28' WHERE \`id\` = 105`, + ) + + // AGE für Gemeinschaftsleistungen Februar, original creation date: 2020-03-07 08:19:15 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-07 08:19:15' WHERE \`id\` = 106`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 geschöpft und gutgeschrieben., original creation date: 2020-03-08 18:00:20 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-08 18:00:20' WHERE \`id\` = 107`, + ) + + // AGE für Februar, original creation date: 2020-03-09 11:43:30 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-09 11:43:30' WHERE \`id\` = 108`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-09 17:48:34 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-09 17:48:34' WHERE \`id\` = 109`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-09 17:48:36 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-09 17:48:36' WHERE \`id\` = 110`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-09 17:48:38 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-09 17:48:38' WHERE \`id\` = 111`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-09 17:48:40 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-09 17:48:40' WHERE \`id\` = 112`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020, original creation date: 2020-03-09 17:48:43 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-09 17:48:43' WHERE \`id\` = 113`, + ) + + // AGE für Gemeinschaftsleistungen rückwirkend für Januar 2020 , original creation date: 2020-03-11 21:11:03 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-11 21:11:03' WHERE \`id\` = 114`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-11 21:17:22 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-11 21:17:22' WHERE \`id\` = 115`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-11 21:17:26 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-11 21:17:26' WHERE \`id\` = 116`, + ) + + // AGE für Gemeinschaftsleistungen rückwirkend für Januar, original creation date: 2020-03-18 15:44:07 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-18 15:44:07' WHERE \`id\` = 117`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-18 15:54:59 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-18 15:54:59' WHERE \`id\` = 118`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-18 15:55:32 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-18 15:55:32' WHERE \`id\` = 119`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-18 15:56:32 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-18 15:56:32' WHERE \`id\` = 120`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-18 15:56:48 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-18 15:56:48' WHERE \`id\` = 121`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-18 15:57:14 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-18 15:57:14' WHERE \`id\` = 122`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-18 15:58:41 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-18 15:58:41' WHERE \`id\` = 123`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-18 15:59:03 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-18 15:59:03' WHERE \`id\` = 124`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-18 15:59:26 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-18 15:59:26' WHERE \`id\` = 125`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-18 16:00:05 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-18 16:00:05' WHERE \`id\` = 126`, + ) + + // AGE für Gemeinschaftsleistungen Februar 2020 , original creation date: 2020-03-18 16:00:12 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-18 16:00:12' WHERE \`id\` = 127`, + ) + + // Aktives Grundeinkommen, original creation date: 2020-03-23 07:35:35 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-23 07:35:35' WHERE \`id\` = 128`, + ) + + // Aktives Grundeinkommen, original creation date: 2020-03-23 07:35:38 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-23 07:35:38' WHERE \`id\` = 129`, + ) + + // Aktives Grundeinkommen, original creation date: 2020-03-23 07:35:42 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-23 07:35:42' WHERE \`id\` = 130`, + ) + + // Aktives Grundeinkommen Januar , original creation date: 2020-03-24 17:00:05 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-24 17:00:05' WHERE \`id\` = 131`, + ) + + // Aktives Grundeinkommen Februar, original creation date: 2020-03-24 17:06:50 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-24 17:06:50' WHERE \`id\` = 132`, + ) + + // Aktives Grundeinkommen Februar, original creation date: 2020-03-24 17:06:54 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-24 17:06:54' WHERE \`id\` = 133`, + ) + + // Aktives Grundeinkommen März, original creation date: 2020-03-24 17:14:21 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:14:21' WHERE \`id\` = 134`, + ) + + // Aktives Grundeinkommen März, original creation date: 2020-03-24 17:14:27 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:14:27' WHERE \`id\` = 135`, + ) + + // Aktives Grundeinkommen März, original creation date: 2020-03-24 17:14:28 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:14:28' WHERE \`id\` = 136`, + ) + + // Aktives Grundeinkommen März, original creation date: 2020-03-24 17:14:30 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:14:30' WHERE \`id\` = 137`, + ) + + // Aktives Grundeinkommen geschöpft , original creation date: 2020-03-27 09:06:16 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-27 09:06:16' WHERE \`id\` = 138`, + ) + + // Aktives Grundeinkommen für GL Februar, original creation date: 2020-03-27 09:44:27 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-27 09:44:27' WHERE \`id\` = 139`, + ) + + // Aktives Grundeinkommen für GL Februar, original creation date: 2020-03-27 09:44:29 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-27 09:44:29' WHERE \`id\` = 140`, + ) + + // Aktives Grundeinkommen für GL Februar, original creation date: 2020-03-27 09:44:30 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-27 09:44:30' WHERE \`id\` = 141`, + ) + + // Aktives Grundeinkommen für GL Februar, original creation date: 2020-03-27 09:44:35 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-27 09:44:35' WHERE \`id\` = 142`, + ) + + // Aktives Grundeinkommen für GL Februar, original creation date: 2020-03-27 09:44:36 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-27 09:44:36' WHERE \`id\` = 143`, + ) + + // Aktives Grundeinkommen für GL Februar, original creation date: 2020-03-27 09:44:40 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-27 09:44:40' WHERE \`id\` = 144`, + ) + + // Aktives Grundeinkommen für GL Februar, original creation date: 2020-03-27 09:44:42 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-27 09:44:42' WHERE \`id\` = 145`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-03-28 09:28:24 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-28 09:28:24' WHERE \`id\` = 146`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-03-28 09:34:30 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-28 09:34:30' WHERE \`id\` = 147`, + ) + + // , original creation date: 2020-03-29 17:21:33 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-28 17:21:33' WHERE \`id\` = 148`, + ) + + // , original creation date: 2020-03-29 17:21:35 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-28 17:21:35' WHERE \`id\` = 149`, + ) + + // Aktives Grundeinkommen für GL. Dez, original creation date: 2020-03-30 06:59:55 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 06:59:55' WHERE \`id\` = 150`, + ) + + // Aktives Grundeinkommen für GL. Dez 2019, original creation date: 2020-03-30 07:05:14 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-30 07:05:14' WHERE \`id\` = 151`, + ) + + // Aktives Grundeinkommen für GL. Jan 2020, original creation date: 2020-03-30 07:09:52 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 07:09:52' WHERE \`id\` = 152`, + ) + + // Aktives Grundeinkommen für GL. Februar 2020, original creation date: 2020-03-30 07:15:43 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-01 07:15:43' WHERE \`id\` = 153`, + ) + + // Aktives Grundeinkommen für GL., original creation date: 2020-03-30 07:16:33 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-01 07:16:33' WHERE \`id\` = 154`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-03-30 07:21:07 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 07:21:07' WHERE \`id\` = 155`, + ) + + // Aktives Grundeinkommen für GL. Feb. 2020, original creation date: 2020-03-30 11:47:55 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-01 11:47:55' WHERE \`id\` = 156`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-01 06:56:20 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-01 06:56:20' WHERE \`id\` = 157`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-01 06:56:26 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-01 06:56:26' WHERE \`id\` = 158`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-01 06:56:29 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-01 06:56:29' WHERE \`id\` = 159`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-01 06:56:31 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-01 06:56:31' WHERE \`id\` = 160`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-01 06:58:10 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-01 06:58:10' WHERE \`id\` = 161`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-07 14:09:26 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 14:09:26' WHERE \`id\` = 162`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-07 14:09:28 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 14:09:28' WHERE \`id\` = 163`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-07 14:09:29 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 14:09:29' WHERE \`id\` = 164`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-07 14:09:32 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 14:09:32' WHERE \`id\` = 165`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-08 18:41:17 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-08 18:41:17' WHERE \`id\` = 166`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-08 18:41:20 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-08 18:41:20' WHERE \`id\` = 167`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-08 18:41:21 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-08 18:41:21' WHERE \`id\` = 168`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-08 18:41:23 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-08 18:41:23' WHERE \`id\` = 169`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-08 18:41:27 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-08 18:41:27' WHERE \`id\` = 170`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-08 18:58:15 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-08 18:58:15' WHERE \`id\` = 171`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-15 16:10:54 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-15 16:10:54' WHERE \`id\` = 172`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-15 16:10:56 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-15 16:10:56' WHERE \`id\` = 173`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-15 16:10:58 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-15 16:10:58' WHERE \`id\` = 174`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-15 16:11:01 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-15 16:11:01' WHERE \`id\` = 175`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-15 16:11:02 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-15 16:11:02' WHERE \`id\` = 176`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-15 16:11:04 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-15 16:11:04' WHERE \`id\` = 177`, + ) + + // Aktives Grundeinkommen für GL. März, original creation date: 2020-04-15 16:11:07 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-15 16:11:07' WHERE \`id\` = 178`, + ) + + // Aktives Grundeinkommen für GL.März 2020, original creation date: 2020-04-17 16:54:39 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-17 16:54:39' WHERE \`id\` = 179`, + ) + + // Aktives Grundeinkommen für GL.März 2020, original creation date: 2020-04-17 16:54:40 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-17 16:54:40' WHERE \`id\` = 180`, + ) + + // Aktives Grundeinkommen für GL.März 2020, original creation date: 2020-04-17 16:54:42 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-17 16:54:42' WHERE \`id\` = 181`, + ) + + // Aktives Grundeinkommen für GL.März 2020, original creation date: 2020-04-17 16:54:44 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-17 16:54:44' WHERE \`id\` = 182`, + ) + + // Aktives Grundeinkommen geschöpft und gutgeschrieben. + // Tausend Dank, weil Du bei uns bist und gemeinsam mit uns das Lebensgeld der Zukunft erschaffst!, original creation date: 2020-04-18 08:58:42 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 08:58:42' WHERE \`id\` = 183`, + ) + + // Aktives Grundeinkommen geschöpft und gutgeschrieben. + // Tausend Dank, weil Du bei uns bist und gemeinsam mit uns das Lebensgeld der Zukunft erschaffst!, original creation date: 2020-04-18 08:58:44 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 08:58:44' WHERE \`id\` = 184`, + ) + + // Aktives Grundeinkommen für GL.März 2020, original creation date: 2020-04-20 17:44:36 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-20 17:44:36' WHERE \`id\` = 185`, + ) + + // Aktives Grundeinkommen für GL.März 2020, original creation date: 2020-04-20 17:44:38 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-20 17:44:38' WHERE \`id\` = 186`, + ) + + // Aktives Grundeinkommen für GL.März 2020, original creation date: 2020-04-20 17:44:40 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-20 17:44:40' WHERE \`id\` = 187`, + ) + + // Aktives Grundeinkommen für GL.März 2020, original creation date: 2020-04-20 17:44:43 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-20 17:44:43' WHERE \`id\` = 188`, + ) + + // Aktives Grundeinkommen für GL März 2020, original creation date: 2020-04-25 06:30:13 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-25 06:30:13' WHERE \`id\` = 189`, + ) + + // Aktives Grundeinkommen für GL März 2020, original creation date: 2020-04-25 06:30:19 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-25 06:30:19' WHERE \`id\` = 190`, + ) + + // Aktives Grundeinkommen für GL März 2020, original creation date: 2020-04-25 06:30:21 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-25 06:30:21' WHERE \`id\` = 191`, + ) + + // Aktives Grundeinkommen für GL März 2020, original creation date: 2020-04-25 06:30:23 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-25 06:30:23' WHERE \`id\` = 192`, + ) + + // Aktives Grundeinkommen für GL März 2020, original creation date: 2020-04-25 06:30:24 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-25 06:30:24' WHERE \`id\` = 193`, + ) + + // Aktives Grundeinkommen für GL März 2020, original creation date: 2020-04-25 06:30:26 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-25 06:30:26' WHERE \`id\` = 194`, + ) + + // Aktives Grundeinkommen für G März 2020, original creation date: 2020-04-25 18:41:55 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-25 18:41:55' WHERE \`id\` = 195`, + ) + + // Aktives Grundeinkommen für G März 2020, original creation date: 2020-04-25 18:42:25 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-25 18:42:25' WHERE \`id\` = 196`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-04-25 18:46:01 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-25 18:46:01' WHERE \`id\` = 197`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-04-30 06:40:39 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 06:40:39' WHERE \`id\` = 198`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-04-30 06:40:41 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 06:40:41' WHERE \`id\` = 199`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-04-30 06:40:42 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 06:40:42' WHERE \`id\` = 200`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-04-30 06:40:45 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 06:40:45' WHERE \`id\` = 201`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-04-30 06:40:46 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 06:40:46' WHERE \`id\` = 202`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-04-30 06:40:50 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 06:40:50' WHERE \`id\` = 203`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-05-02 08:25:27 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-02 08:25:27' WHERE \`id\` = 204`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-05-02 08:25:29 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-02 08:25:29' WHERE \`id\` = 205`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-05-02 08:25:32 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-02 08:25:32' WHERE \`id\` = 206`, + ) + + // Aktives Grundeinkommen für März 2020, original creation date: 2020-05-02 08:28:14 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-02 08:28:14' WHERE \`id\` = 207`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:43:49 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:43:49' WHERE \`id\` = 208`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:43:51 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:43:51' WHERE \`id\` = 209`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:43:54 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:43:54' WHERE \`id\` = 210`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:43:56 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:43:56' WHERE \`id\` = 211`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:43:57 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:43:57' WHERE \`id\` = 212`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:43:59 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:43:59' WHERE \`id\` = 213`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:44:01 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:44:01' WHERE \`id\` = 214`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:44:02 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:44:02' WHERE \`id\` = 215`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:44:05 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:44:05' WHERE \`id\` = 216`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:44:10 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:44:10' WHERE \`id\` = 217`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:44:12 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:44:12' WHERE \`id\` = 218`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:44:14 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:44:14' WHERE \`id\` = 219`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-02 08:44:17 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-02 08:44:17' WHERE \`id\` = 220`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-03 09:00:04 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-03 09:00:04' WHERE \`id\` = 221`, + ) + + // Aktives Grundeinkommen für April 2020, original creation date: 2020-05-03 09:00:07 + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-03 09:00:07' WHERE \`id\` = 222`, + ) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // reverse creation date changes + + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-17 13:06:13' WHERE \`id\` = 1`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-17 13:06:16' WHERE \`id\` = 2`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-17 13:06:19' WHERE \`id\` = 3`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-17 13:06:21' WHERE \`id\` = 4`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-17 13:07:01' WHERE \`id\` = 5`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2019-12-19 17:35:16' WHERE \`id\` = 6`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-08 10:34:40' WHERE \`id\` = 7`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-08 11:02:41' WHERE \`id\` = 8`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-08 11:06:42' WHERE \`id\` = 9`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-08 11:16:11' WHERE \`id\` = 10`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-08 11:16:15' WHERE \`id\` = 11`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-08 13:24:29' WHERE \`id\` = 12`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-09 12:02:48' WHERE \`id\` = 13`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-09 12:02:52' WHERE \`id\` = 14`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-09 12:02:54' WHERE \`id\` = 15`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-09 12:09:08' WHERE \`id\` = 16`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-11 11:10:55' WHERE \`id\` = 17`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-11 11:11:24' WHERE \`id\` = 18`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-11 11:12:09' WHERE \`id\` = 19`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-11 11:31:20' WHERE \`id\` = 20`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-11 11:37:13' WHERE \`id\` = 21`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-11 11:37:42' WHERE \`id\` = 22`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-11 19:01:06' WHERE \`id\` = 23`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-13 16:27:07' WHERE \`id\` = 24`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-13 16:28:05' WHERE \`id\` = 25`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-13 16:28:57' WHERE \`id\` = 26`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-13 16:29:45' WHERE \`id\` = 27`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-17 13:47:28' WHERE \`id\` = 28`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-17 13:48:52' WHERE \`id\` = 29`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-17 13:49:21' WHERE \`id\` = 30`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-23 13:08:44' WHERE \`id\` = 31`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-27 08:12:16' WHERE \`id\` = 32`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 14:49:58' WHERE \`id\` = 33`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 14:50:35' WHERE \`id\` = 34`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 14:50:55' WHERE \`id\` = 35`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 14:52:03' WHERE \`id\` = 36`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 14:52:33' WHERE \`id\` = 37`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 14:52:53' WHERE \`id\` = 38`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 14:53:45' WHERE \`id\` = 39`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 14:54:13' WHERE \`id\` = 40`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 14:54:50' WHERE \`id\` = 41`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 15:03:26' WHERE \`id\` = 42`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 15:10:39' WHERE \`id\` = 43`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 15:13:10' WHERE \`id\` = 44`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-01-30 15:26:45' WHERE \`id\` = 45`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:54:31' WHERE \`id\` = 46`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:30' WHERE \`id\` = 47`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:33' WHERE \`id\` = 48`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:36' WHERE \`id\` = 49`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:39' WHERE \`id\` = 50`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:43' WHERE \`id\` = 51`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:46' WHERE \`id\` = 52`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:48' WHERE \`id\` = 53`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:50' WHERE \`id\` = 54`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:52' WHERE \`id\` = 55`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:54' WHERE \`id\` = 56`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:56' WHERE \`id\` = 57`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:55:59' WHERE \`id\` = 58`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:02' WHERE \`id\` = 59`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:05' WHERE \`id\` = 60`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:07' WHERE \`id\` = 61`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:10' WHERE \`id\` = 62`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:12' WHERE \`id\` = 63`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:14' WHERE \`id\` = 64`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:21' WHERE \`id\` = 65`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:24' WHERE \`id\` = 66`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:26' WHERE \`id\` = 67`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:28' WHERE \`id\` = 68`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-19 08:56:31' WHERE \`id\` = 69`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-20 06:40:36' WHERE \`id\` = 70`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-20 06:43:41' WHERE \`id\` = 71`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-20 06:43:43' WHERE \`id\` = 72`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-20 06:43:45' WHERE \`id\` = 73`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-20 06:43:47' WHERE \`id\` = 74`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-20 07:09:05' WHERE \`id\` = 75`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-20 08:03:31' WHERE \`id\` = 76`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-29 16:17:24' WHERE \`id\` = 77`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-29 16:17:35' WHERE \`id\` = 78`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-29 16:17:42' WHERE \`id\` = 79`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-29 16:29:47' WHERE \`id\` = 80`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-29 16:29:48' WHERE \`id\` = 81`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-02-29 16:29:55' WHERE \`id\` = 82`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-04 09:08:54' WHERE \`id\` = 83`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 07:59:42' WHERE \`id\` = 84`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 07:59:51' WHERE \`id\` = 85`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 07:59:54' WHERE \`id\` = 86`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 07:59:57' WHERE \`id\` = 87`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:15:48' WHERE \`id\` = 88`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:15:53' WHERE \`id\` = 89`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:15:56' WHERE \`id\` = 90`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:15:59' WHERE \`id\` = 91`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:16:01' WHERE \`id\` = 92`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:16:05' WHERE \`id\` = 93`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:16:07' WHERE \`id\` = 94`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:16:10' WHERE \`id\` = 95`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:17:00' WHERE \`id\` = 96`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:17:03' WHERE \`id\` = 97`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:17:05' WHERE \`id\` = 98`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:17:07' WHERE \`id\` = 99`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:17:09' WHERE \`id\` = 100`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:17:11' WHERE \`id\` = 101`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:17:13' WHERE \`id\` = 102`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:17:21' WHERE \`id\` = 103`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:17:25' WHERE \`id\` = 104`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:17:28' WHERE \`id\` = 105`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-07 08:19:15' WHERE \`id\` = 106`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-08 18:00:20' WHERE \`id\` = 107`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-09 11:43:30' WHERE \`id\` = 108`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-09 17:48:34' WHERE \`id\` = 109`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-09 17:48:36' WHERE \`id\` = 110`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-09 17:48:38' WHERE \`id\` = 111`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-09 17:48:40' WHERE \`id\` = 112`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-09 17:48:43' WHERE \`id\` = 113`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-11 21:11:03' WHERE \`id\` = 114`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-11 21:17:22' WHERE \`id\` = 115`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-11 21:17:26' WHERE \`id\` = 116`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 15:44:07' WHERE \`id\` = 117`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 15:54:59' WHERE \`id\` = 118`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 15:55:32' WHERE \`id\` = 119`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 15:56:32' WHERE \`id\` = 120`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 15:56:48' WHERE \`id\` = 121`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 15:57:14' WHERE \`id\` = 122`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 15:58:41' WHERE \`id\` = 123`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 15:59:03' WHERE \`id\` = 124`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 15:59:26' WHERE \`id\` = 125`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 16:00:05' WHERE \`id\` = 126`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-18 16:00:12' WHERE \`id\` = 127`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-23 07:35:35' WHERE \`id\` = 128`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-23 07:35:38' WHERE \`id\` = 129`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-23 07:35:42' WHERE \`id\` = 130`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:00:05' WHERE \`id\` = 131`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:06:50' WHERE \`id\` = 132`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:06:54' WHERE \`id\` = 133`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:14:21' WHERE \`id\` = 134`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:14:27' WHERE \`id\` = 135`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:14:28' WHERE \`id\` = 136`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-24 17:14:30' WHERE \`id\` = 137`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-27 09:06:16' WHERE \`id\` = 138`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-27 09:44:27' WHERE \`id\` = 139`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-27 09:44:29' WHERE \`id\` = 140`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-27 09:44:30' WHERE \`id\` = 141`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-27 09:44:35' WHERE \`id\` = 142`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-27 09:44:36' WHERE \`id\` = 143`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-27 09:44:40' WHERE \`id\` = 144`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-27 09:44:42' WHERE \`id\` = 145`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-28 09:28:24' WHERE \`id\` = 146`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-28 09:34:30' WHERE \`id\` = 147`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-29 17:21:33' WHERE \`id\` = 148`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-29 17:21:35' WHERE \`id\` = 149`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 06:59:55' WHERE \`id\` = 150`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 07:05:14' WHERE \`id\` = 151`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 07:09:52' WHERE \`id\` = 152`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 07:15:43' WHERE \`id\` = 153`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 07:16:33' WHERE \`id\` = 154`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 07:21:07' WHERE \`id\` = 155`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-03-30 11:47:55' WHERE \`id\` = 156`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-01 06:56:20' WHERE \`id\` = 157`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-01 06:56:26' WHERE \`id\` = 158`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-01 06:56:29' WHERE \`id\` = 159`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-01 06:56:31' WHERE \`id\` = 160`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-01 06:58:10' WHERE \`id\` = 161`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-07 14:09:26' WHERE \`id\` = 162`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-07 14:09:28' WHERE \`id\` = 163`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-07 14:09:29' WHERE \`id\` = 164`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-07 14:09:32' WHERE \`id\` = 165`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-08 18:41:17' WHERE \`id\` = 166`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-08 18:41:20' WHERE \`id\` = 167`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-08 18:41:21' WHERE \`id\` = 168`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-08 18:41:23' WHERE \`id\` = 169`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-08 18:41:27' WHERE \`id\` = 170`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-08 18:58:15' WHERE \`id\` = 171`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-15 16:10:54' WHERE \`id\` = 172`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-15 16:10:56' WHERE \`id\` = 173`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-15 16:10:58' WHERE \`id\` = 174`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-15 16:11:01' WHERE \`id\` = 175`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-15 16:11:02' WHERE \`id\` = 176`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-15 16:11:04' WHERE \`id\` = 177`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-15 16:11:07' WHERE \`id\` = 178`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-17 16:54:39' WHERE \`id\` = 179`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-17 16:54:40' WHERE \`id\` = 180`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-17 16:54:42' WHERE \`id\` = 181`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-17 16:54:44' WHERE \`id\` = 182`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-18 08:58:42' WHERE \`id\` = 183`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-18 08:58:44' WHERE \`id\` = 184`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-20 17:44:36' WHERE \`id\` = 185`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-20 17:44:38' WHERE \`id\` = 186`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-20 17:44:40' WHERE \`id\` = 187`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-20 17:44:43' WHERE \`id\` = 188`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-25 06:30:13' WHERE \`id\` = 189`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-25 06:30:19' WHERE \`id\` = 190`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-25 06:30:21' WHERE \`id\` = 191`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-25 06:30:23' WHERE \`id\` = 192`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-25 06:30:24' WHERE \`id\` = 193`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-25 06:30:26' WHERE \`id\` = 194`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-25 18:41:55' WHERE \`id\` = 195`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-25 18:42:25' WHERE \`id\` = 196`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-25 18:46:01' WHERE \`id\` = 197`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-30 06:40:39' WHERE \`id\` = 198`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-30 06:40:41' WHERE \`id\` = 199`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-30 06:40:42' WHERE \`id\` = 200`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-30 06:40:45' WHERE \`id\` = 201`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-30 06:40:46' WHERE \`id\` = 202`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-04-30 06:40:50' WHERE \`id\` = 203`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:25:27' WHERE \`id\` = 204`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:25:29' WHERE \`id\` = 205`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:25:32' WHERE \`id\` = 206`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:28:14' WHERE \`id\` = 207`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:43:49' WHERE \`id\` = 208`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:43:51' WHERE \`id\` = 209`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:43:54' WHERE \`id\` = 210`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:43:56' WHERE \`id\` = 211`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:43:57' WHERE \`id\` = 212`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:43:59' WHERE \`id\` = 213`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:44:01' WHERE \`id\` = 214`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:44:02' WHERE \`id\` = 215`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:44:05' WHERE \`id\` = 216`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:44:10' WHERE \`id\` = 217`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:44:12' WHERE \`id\` = 218`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:44:14' WHERE \`id\` = 219`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-02 08:44:17' WHERE \`id\` = 220`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-03 09:00:04' WHERE \`id\` = 221`, + ) + await queryFn( + `UPDATE \`transactions\` SET creation_date = '2020-05-03 09:00:07' WHERE \`id\` = 222`, + ) + + // remove added transaction + await queryFn( + `DELETE FROM \`transactions\` + WHERE \`user_id\` = 275 AND \`balance\` IN (2000, 3000) AND \`amount\` = 1000`, + ) + + // rewind transaction to split + await queryFn( + `UPDATE \`transactions\` set \`amount\` = 3000, \`memo\` = 'Aktives Grundeinkommen für GL. Dez, Jan, Feb' + WHERE \`id\` = 150`, + ) + + await queryFn(`UPDATE \`transactions\` set \`previous\` = 150 WHERE \`id\` = 278`) +} diff --git a/frontend/src/components/Auth/AuthMobileStart.vue b/frontend/src/components/Auth/AuthMobileStart.vue index 09985dd77..690b8f895 100644 --- a/frontend/src/components/Auth/AuthMobileStart.vue +++ b/frontend/src/components/Auth/AuthMobileStart.vue @@ -6,7 +6,7 @@ {{ $t('auth.left.gratitude') }}
- {{ $t('auth.left.newCurrency') }} + {{ $t('auth.left.oneGratitude') }}
{ }) }) - describe('token is expired', () => { + describe('token is expired for several seconds', () => { beforeEach(() => { mocks.$store.state.tokenTime = setTokenTime(-60) wrapper = Wrapper() }) + it('has value for remaining seconds equal 0', () => { + expect(wrapper.tokenExpiresInSeconds === 0) + }) + it('emits logout', () => { expect(wrapper.emitted('logout')).toBeTruthy() }) diff --git a/frontend/src/components/SessionLogoutTimeout.vue b/frontend/src/components/SessionLogoutTimeout.vue index 1e5a27998..1ebff752a 100644 --- a/frontend/src/components/SessionLogoutTimeout.vue +++ b/frontend/src/components/SessionLogoutTimeout.vue @@ -65,7 +65,7 @@ export default { this.$timer.restart('tokenExpires') this.$bvModal.show('modalSessionTimeOut') } - if (this.tokenExpiresInSeconds <= 0) { + if (this.tokenExpiresInSeconds === 0) { this.$timer.stop('tokenExpires') this.$emit('logout') } @@ -90,7 +90,10 @@ export default { }, computed: { tokenExpiresInSeconds() { - return Math.floor((new Date(this.$store.state.tokenTime * 1000).getTime() - this.now) / 1000) + const remainingSecs = Math.floor( + (new Date(this.$store.state.tokenTime * 1000).getTime() - this.now) / 1000, + ) + return remainingSecs <= 0 ? 0 : remainingSecs }, }, beforeDestroy() { diff --git a/frontend/src/components/TransactionLinks/TransactionLink.spec.js b/frontend/src/components/TransactionLinks/TransactionLink.spec.js index 13aaea900..d06f0f726 100644 --- a/frontend/src/components/TransactionLinks/TransactionLink.spec.js +++ b/frontend/src/components/TransactionLinks/TransactionLink.spec.js @@ -9,15 +9,16 @@ const mockAPIcall = jest.fn() const navigatorClipboardMock = jest.fn() const mocks = { - $i18n: { - locale: 'en', - }, $t: jest.fn((t) => t), $d: jest.fn((d) => d), - $tc: jest.fn((tc) => tc), $apollo: { mutate: mockAPIcall, }, + $store: { + state: { + firstName: 'Testy', + }, + }, } const propsData = { @@ -77,7 +78,7 @@ describe('TransactionLink', () => { navigator.clipboard = navigatorClipboard }) - describe('copy with success', () => { + describe('copy link with success', () => { beforeEach(async () => { navigatorClipboardMock.mockResolvedValue() await wrapper.find('.test-copy-link .dropdown-item').trigger('click') @@ -93,7 +94,26 @@ describe('TransactionLink', () => { }) }) - describe('copy with error', () => { + describe('copy link and text with success', () => { + beforeEach(async () => { + navigatorClipboardMock.mockResolvedValue() + await wrapper.find('.test-copy-text .dropdown-item').trigger('click') + }) + + it('should call clipboard.writeText', () => { + expect(navigator.clipboard.writeText).toHaveBeenCalledWith( + 'http://localhost/redeem/c00000000c000000c0000\n' + + 'Testy transaction-link.send_you 75 Gradido.\n' + + '"Katzenauge, Eulenschrei, was verschwunden komm herbei!"\n' + + 'gdd_per_link.credit-your-gradido gdd_per_link.validUntilDate', + ) + }) + it('toasts success message', () => { + expect(toastSuccessSpy).toBeCalledWith('gdd_per_link.link-and-text-copied') + }) + }) + + describe('copy link with error', () => { beforeEach(async () => { navigatorClipboardMock.mockRejectedValue() await wrapper.find('.test-copy-link .dropdown-item').trigger('click') @@ -103,6 +123,17 @@ describe('TransactionLink', () => { expect(toastErrorSpy).toBeCalledWith('gdd_per_link.not-copied') }) }) + + describe('copy link and text with error', () => { + beforeEach(async () => { + navigatorClipboardMock.mockRejectedValue() + await wrapper.find('.test-copy-text .dropdown-item').trigger('click') + }) + + it('toasts an error', () => { + expect(toastErrorSpy).toBeCalledWith('gdd_per_link.not-copied') + }) + }) }) describe('qr code modal', () => { diff --git a/frontend/src/components/TransactionLinks/TransactionLink.vue b/frontend/src/components/TransactionLinks/TransactionLink.vue index c7b7682ec..5618c8696 100644 --- a/frontend/src/components/TransactionLinks/TransactionLink.vue +++ b/frontend/src/components/TransactionLinks/TransactionLink.vue @@ -22,6 +22,14 @@ {{ $t('gdd_per_link.copy') }} + + + {{ $t('gdd_per_link.copy-with-text') }} + { + this.toastSuccess(this.$t('gdd_per_link.link-and-text-copied')) + }) + .catch(() => { + this.$bvModal.show('modalPopoverCopyError' + this.id) + this.toastError(this.$t('gdd_per_link.not-copied')) + }) + }, deleteLink() { this.$bvModal.msgBoxConfirm(this.$t('gdd_per_link.delete-the-link')).then(async (value) => { if (value) diff --git a/frontend/src/graphql/queries.js b/frontend/src/graphql/queries.js index adcd653a4..27e63d568 100644 --- a/frontend/src/graphql/queries.js +++ b/frontend/src/graphql/queries.js @@ -13,6 +13,7 @@ export const login = gql` hasElopage publisherId isAdmin + creation } } ` @@ -30,6 +31,7 @@ export const verifyLogin = gql` hasElopage publisherId isAdmin + creation } } ` diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 99122a218..378dcc919 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -12,10 +12,9 @@ "hasAccount": "Du hast schon einen Account?", "hereLogin": "Hier Anmelden", "learnMore": "Erfahre mehr …", - "newCurrency": "Die neue Währung", "oneDignity": "Wir schenken einander und danken mit Gradido.", "oneDonation": "Du bist ein Geschenk für die Gemeinschaft. 1000 Dank, weil du bei uns bist.", - "oneGratitude": "Die neue Währung. Für einander, für alle Menschen, für die Natur." + "oneGratitude": "Für einander, für alle Menschen, für die Natur." }, "navbar": { "aboutGradido": "Über Gradido" @@ -125,7 +124,9 @@ "gdd_per_link": { "choose-amount": "Wähle einen Betrag aus, welchen du per Link versenden möchtest. Du kannst auch noch eine Nachricht eintragen. Beim Klick „Jetzt generieren“ wird ein Link erstellt, den du versenden kannst.", "copy": "kopieren", + "copy-with-text": "Link und Text kopieren", "created": "Der Link wurde erstellt!", + "credit-your-gradido": "Damit die Gradido gutgeschrieben werden können, klicke auf den Link!", "decay-14-day": "Vergänglichkeit für 14 Tage", "delete-the-link": "Den Link löschen?", "deleted": "Der Link wurde gelöscht!", @@ -133,6 +134,7 @@ "has-account": "Du besitzt bereits ein Gradido Konto?", "header": "Gradidos versenden per Link", "isFree": "Gradido ist weltweit kostenfrei.", + "link-and-text-copied": "Der Link und deine Nachricht wurden in die Zwischenablage kopiert. Du kannst ihn jetzt in eine E-Mail oder Nachricht einfügen.", "link-copied": "Link wurde in die Zwischenablage kopiert. Du kannst ihn jetzt in eine E-Mail oder Nachricht einfügen.", "link-deleted": "Der Link wurde am {date} gelöscht.", "link-expired": "Der Link ist nicht mehr gültig. Die Gültigkeit ist am {date} abgelaufen.", @@ -149,7 +151,8 @@ "redeemed-title": "eingelöst", "to-login": "Log dich ein", "to-register": "Registriere ein neues Konto.", - "validUntil": "Gültig bis" + "validUntil": "Gültig bis", + "validUntilDate": "Der Link ist bis zum {date} gültig." }, "gdt": { "calculation": "Berechnung der Gradido Transform", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 63e285a75..0bfde65ed 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -12,10 +12,9 @@ "hasAccount": "You already have an account?", "hereLogin": "Log in here", "learnMore": "Learn more …", - "newCurrency": "The new currency", "oneDignity": "We gift to each other and give thanks with Gradido.", "oneDonation": "You are a gift for the community. 1000 thanks because you are with us.", - "oneGratitude": "The new currency. For each other, for all people, for nature." + "oneGratitude": "For each other, for all people, for nature." }, "navbar": { "aboutGradido": "About Gradido" @@ -125,7 +124,9 @@ "gdd_per_link": { "choose-amount": "Select an amount that you would like to send via link. You can also enter a message. Click 'Generate now' to create a link that you can share.", "copy": "copy", + "copy-with-text": "Copy link and text", "created": "Link was created!", + "credit-your-gradido": "For the Gradido to be credited, click on the link!", "decay-14-day": "Decay for 14 days", "delete-the-link": "Delete the link?", "deleted": "The link was deleted!", @@ -133,6 +134,7 @@ "has-account": "You already have a Gradido account?", "header": "Send Gradidos via link", "isFree": "Gradido is free of charge worldwide.", + "link-and-text-copied": "The link and your message have been copied to the clipboard. You can now include it in an email or message.", "link-copied": "Link has been copied to the clipboard. You can now paste it into an email or message.", "link-deleted": "The link was deleted on {date}.", "link-expired": "The link is no longer valid. The validity expired on {date}.", @@ -149,7 +151,8 @@ "redeemed-title": "redeemed", "to-login": "Log in", "to-register": "Register a new account.", - "validUntil": "Valid until" + "validUntil": "Valid until", + "validUntilDate": "The link is valid until {date}." }, "gdt": { "calculation": "Calculation of Gradido Transform", diff --git a/frontend/src/store/store.js b/frontend/src/store/store.js index e95eec7b9..8fdbc519e 100644 --- a/frontend/src/store/store.js +++ b/frontend/src/store/store.js @@ -47,6 +47,9 @@ export const mutations = { hasElopage: (state, hasElopage) => { state.hasElopage = hasElopage }, + creation: (state, creation) => { + state.creation = creation + }, } export const actions = { @@ -60,6 +63,7 @@ export const actions = { commit('hasElopage', data.hasElopage) commit('publisherId', data.publisherId) commit('isAdmin', data.isAdmin) + commit('creation', data.creation) }, logout: ({ commit, state }) => { commit('token', null) @@ -71,6 +75,7 @@ export const actions = { commit('hasElopage', false) commit('publisherId', null) commit('isAdmin', false) + commit('creation', null) localStorage.clear() }, } @@ -96,6 +101,7 @@ try { newsletterState: null, hasElopage: false, publisherId: null, + creation: null, }, getters: {}, // Syncronous mutation of the state diff --git a/frontend/src/store/store.test.js b/frontend/src/store/store.test.js index 3f942fa35..651a3ccc5 100644 --- a/frontend/src/store/store.test.js +++ b/frontend/src/store/store.test.js @@ -30,6 +30,7 @@ const { publisherId, isAdmin, hasElopage, + creation, } = mutations const { login, logout } = actions @@ -139,6 +140,14 @@ describe('Vuex store', () => { expect(state.hasElopage).toBeTruthy() }) }) + + describe('creation', () => { + it('sets the state of creation', () => { + const state = { creation: null } + creation(state, true) + expect(state.creation).toEqual(true) + }) + }) }) describe('actions', () => { @@ -156,11 +165,12 @@ describe('Vuex store', () => { hasElopage: false, publisherId: 1234, isAdmin: true, + creation: ['1000', '1000', '1000'], } it('calls nine commits', () => { login({ commit, state }, commitedData) - expect(commit).toHaveBeenCalledTimes(8) + expect(commit).toHaveBeenCalledTimes(9) }) it('commits email', () => { @@ -202,6 +212,11 @@ describe('Vuex store', () => { login({ commit, state }, commitedData) expect(commit).toHaveBeenNthCalledWith(8, 'isAdmin', true) }) + + it('commits creation', () => { + login({ commit, state }, commitedData) + expect(commit).toHaveBeenNthCalledWith(9, 'creation', ['1000', '1000', '1000']) + }) }) describe('logout', () => { @@ -210,7 +225,7 @@ describe('Vuex store', () => { it('calls nine commits', () => { logout({ commit, state }) - expect(commit).toHaveBeenCalledTimes(8) + expect(commit).toHaveBeenCalledTimes(9) }) it('commits token', () => { @@ -253,6 +268,11 @@ describe('Vuex store', () => { expect(commit).toHaveBeenNthCalledWith(8, 'isAdmin', false) }) + it('commits creation', () => { + logout({ commit, state }) + expect(commit).toHaveBeenNthCalledWith(9, 'creation', null) + }) + // how to get this working? it.skip('calls localStorage.clear()', () => { const clearStorageMock = jest.fn()