diff --git a/src/command/club/member/memberCommand.ts b/src/command/club/member/memberCommand.ts index 126b87d..a05e284 100644 --- a/src/command/club/member/memberCommand.ts +++ b/src/command/club/member/memberCommand.ts @@ -1,5 +1,7 @@ +import { Salutation } from "../../../enums/salutation"; + export interface CreateMemberCommand { - salutationId: number; + salutation: Salutation; firstname: string; lastname: string; nameaffix: string; @@ -9,7 +11,7 @@ export interface CreateMemberCommand { export interface UpdateMemberCommand { id: number; - salutationId: number; + salutation: Salutation; firstname: string; lastname: string; nameaffix: string; diff --git a/src/command/club/member/memberCommandHandler.ts b/src/command/club/member/memberCommandHandler.ts index 569e835..2bea5b5 100644 --- a/src/command/club/member/memberCommandHandler.ts +++ b/src/command/club/member/memberCommandHandler.ts @@ -21,7 +21,7 @@ export default abstract class MemberCommandHandler { .insert() .into(member) .values({ - salutationId: createMember.salutationId, + salutation: createMember.salutation, firstname: createMember.firstname, lastname: createMember.lastname, nameaffix: createMember.nameaffix, @@ -50,7 +50,7 @@ export default abstract class MemberCommandHandler { .createQueryBuilder() .update(member) .set({ - salutationId: updateMember.salutationId, + salutation: updateMember.salutation, firstname: updateMember.firstname, lastname: updateMember.lastname, nameaffix: updateMember.nameaffix, diff --git a/src/controller/admin/club/memberController.ts b/src/controller/admin/club/memberController.ts index c313b27..4970ead 100644 --- a/src/controller/admin/club/memberController.ts +++ b/src/controller/admin/club/memberController.ts @@ -285,7 +285,7 @@ export async function createMemberPrintoutList(req: Request, res: Response): Pro * @returns {Promise<*>} */ export async function createMember(req: Request, res: Response): Promise { - const salutationId = req.body.salutationId; + const salutation = req.body.salutation; const firstname = req.body.firstname; const lastname = req.body.lastname; const nameaffix = req.body.nameaffix; @@ -293,7 +293,7 @@ export async function createMember(req: Request, res: Response): Promise { const internalId = req.body.internalId; let createMember: CreateMemberCommand = { - salutationId, + salutation, firstname, lastname, nameaffix, @@ -453,7 +453,7 @@ export async function addCommunicationToMember(req: Request, res: Response): Pro */ export async function updateMemberById(req: Request, res: Response): Promise { const memberId = parseInt(req.params.id); - const salutationId = req.body.salutationId; + const salutation = req.body.salutation; const firstname = req.body.firstname; const lastname = req.body.lastname; const nameaffix = req.body.nameaffix; @@ -462,7 +462,7 @@ export async function updateMemberById(req: Request, res: Response): Promise >; - recipient: Partial< - Omit & { salutation: string; street: string; streetNumber: string; streetNumberAdd: string } - >; + recipient: Partial; } = { title: "Beispiel Newsletter Daten", description: "Zusammenfassung der Demodaten.", @@ -64,7 +63,7 @@ export const newsletterDemoData: { recipient: { firstname: "Julian", lastname: "Krauser", - salutation: "Herr", + salutation: Salutation.sir, nameaffix: "", street: "Straße", streetNumber: "Hausnummer", diff --git a/src/entity/club/member/member.ts b/src/entity/club/member/member.ts index e5b27c2..1defb1f 100644 --- a/src/entity/club/member/member.ts +++ b/src/entity/club/member/member.ts @@ -1,16 +1,32 @@ import { Column, Entity, JoinColumn, ManyToOne, OneToMany, OneToOne, PrimaryColumn } from "typeorm"; +import { Salutation } from "../../../enums/salutation"; import { membership } from "./membership"; import { memberAwards } from "./memberAwards"; import { memberQualifications } from "./memberQualifications"; import { memberExecutivePositions } from "./memberExecutivePositions"; import { communication } from "./communication"; -import { salutation } from "../../settings/salutation"; +import { CommunicationViewModel } from "../../../viewmodel/admin/club/member/communication.models"; @Entity() export class member { @PrimaryColumn({ generated: "increment", type: "int" }) id: number; + @Column({ + type: "varchar", + length: "255", + default: Salutation.none.toString(), + transformer: { + to(value: Salutation) { + return value.toString(); + }, + from(value: string) { + return Salutation[value as keyof typeof Salutation]; + }, + }, + }) + salutation: Salutation; + @Column({ type: "varchar", length: 255 }) firstname: string; @@ -26,9 +42,6 @@ export class member { @Column({ type: "varchar", length: 255, unique: true, nullable: true }) internalId?: string; - @Column() - salutationId: number; - @OneToMany(() => communication, (communications) => communications.member) communications: communication[]; @@ -40,9 +53,6 @@ export class member { @JoinColumn() sendNewsletter?: communication; - @ManyToOne(() => salutation, (salutation) => salutation.members) - salutation: salutation; - @OneToMany(() => membership, (membership) => membership.member) memberships: membership[]; diff --git a/src/entity/settings/salutation.ts b/src/entity/settings/salutation.ts deleted file mode 100644 index 634921b..0000000 --- a/src/entity/settings/salutation.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Column, Entity, OneToMany, PrimaryColumn } from "typeorm"; -import { memberAwards } from "../club/member/memberAwards"; -import { member } from "../club/member/member"; - -@Entity() -export class salutation { - @PrimaryColumn({ generated: "increment", type: "int" }) - id: number; - - @Column({ type: "varchar", length: 255, unique: true }) - salutation: string; - - @OneToMany(() => member, (member) => member.salutation) - members: member[]; -} diff --git a/src/enums/salutation.ts b/src/enums/salutation.ts new file mode 100644 index 0000000..ba2fce4 --- /dev/null +++ b/src/enums/salutation.ts @@ -0,0 +1,6 @@ +export enum Salutation { + sir = "sir", + madam = "madam", + other = "other", + none = "none", +} diff --git a/src/helpers/newsletterHelper.ts b/src/helpers/newsletterHelper.ts index 1e458c1..cfdeb76 100644 --- a/src/helpers/newsletterHelper.ts +++ b/src/helpers/newsletterHelper.ts @@ -100,7 +100,7 @@ export abstract class NewsletterHelper { recipient: { firstname: recipient.firstname, lastname: recipient.lastname, - salutation: recipient.salutation.salutation, + salutation: recipient.salutation, nameaffix: recipient.nameaffix, ...(showAdress ? { diff --git a/src/migrations/1734520998539-memberDataViews.ts b/src/migrations/1734520998539-memberDataViews.ts index b29b3e2..4e0df38 100644 --- a/src/migrations/1734520998539-memberDataViews.ts +++ b/src/migrations/1734520998539-memberDataViews.ts @@ -8,105 +8,105 @@ export class MemberDataViews1734520998539 implements MigrationInterface { name = "MemberDataViews1734520998539"; public async up(queryRunner: QueryRunner): Promise { - // await queryRunner.createView( - // new View({ - // name: "member_view", - // expression: (datasource: DataSource) => - // datasource - // .getRepository(member) - // .createQueryBuilder("member") - // .select("member.id", "id") - // .addSelect("member.salutation", "salutation") - // .addSelect("member.firstname", "firstname") - // .addSelect("member.lastname", "lastname") - // .addSelect("member.nameaffix", "nameaffix") - // .addSelect("member.birthdate", "birthdate") - // .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") - // .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"), - // }), - // true - // ); - // await queryRunner.createView( - // new View({ - // name: "member_executive_positions_view", - // expression: (datasource: DataSource) => - // datasource - // .getRepository(memberExecutivePositions) - // .createQueryBuilder("memberExecutivePositions") - // .select("executivePosition.id", "positionId") - // .addSelect("executivePosition.position", "position") - // .addSelect("member.id", "memberId") - // .addSelect("member.salutation", "memberSalutation") - // .addSelect("member.firstname", "memberFirstname") - // .addSelect("member.lastname", "memberLastname") - // .addSelect("member.nameaffix", "memberNameaffix") - // .addSelect("member.birthdate", "memberBirthdate") - // .addSelect( - // "SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))", - // "durationInDays" - // ) - // .leftJoin("memberExecutivePositions.executivePosition", "executivePosition") - // .leftJoin("memberExecutivePositions.member", "member") - // .groupBy("executivePosition.id"), - // }), - // true - // ); - // await queryRunner.createView( - // new View({ - // name: "member_qualifications_view", - // expression: (datasource: DataSource) => - // datasource - // .getRepository(memberQualifications) - // .createQueryBuilder("memberQualifications") - // .select("qualification.id", "qualificationId") - // .addSelect("qualification.qualification", "qualification") - // .addSelect("member.id", "memberId") - // .addSelect("member.salutation", "memberSalutation") - // .addSelect("member.firstname", "memberFirstname") - // .addSelect("member.lastname", "memberLastname") - // .addSelect("member.nameaffix", "memberNameaffix") - // .addSelect("member.birthdate", "memberBirthdate") - // .addSelect( - // "SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))", - // "durationInDays" - // ) - // .leftJoin("memberQualifications.qualification", "qualification") - // .leftJoin("memberQualifications.member", "member") - // .groupBy("qualification.id"), - // }), - // true - // ); - // await queryRunner.createView( - // new View({ - // name: "membership_view", - // expression: (datasource: DataSource) => - // datasource - // .getRepository(membership) - // .createQueryBuilder("membership") - // .select("status.id", "statusId") - // .addSelect("status.status", "status") - // .addSelect("member.id", "memberId") - // .addSelect("member.salutation", "memberSalutation") - // .addSelect("member.firstname", "memberFirstname") - // .addSelect("member.lastname", "memberLastname") - // .addSelect("member.nameaffix", "memberNameaffix") - // .addSelect("member.birthdate", "memberBirthdate") - // .addSelect( - // "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", - // "durationInDays" - // ) - // .leftJoin("membership.status", "status") - // .leftJoin("membership.member", "member") - // .groupBy("status.id"), - // }), - // true - // ); + await queryRunner.createView( + new View({ + name: "member_view", + expression: (datasource: DataSource) => + datasource + .getRepository(member) + .createQueryBuilder("member") + .select("member.id", "id") + .addSelect("member.salutation", "salutation") + .addSelect("member.firstname", "firstname") + .addSelect("member.lastname", "lastname") + .addSelect("member.nameaffix", "nameaffix") + .addSelect("member.birthdate", "birthdate") + .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") + .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"), + }), + true + ); + await queryRunner.createView( + new View({ + name: "member_executive_positions_view", + expression: (datasource: DataSource) => + datasource + .getRepository(memberExecutivePositions) + .createQueryBuilder("memberExecutivePositions") + .select("executivePosition.id", "positionId") + .addSelect("executivePosition.position", "position") + .addSelect("member.id", "memberId") + .addSelect("member.salutation", "memberSalutation") + .addSelect("member.firstname", "memberFirstname") + .addSelect("member.lastname", "memberLastname") + .addSelect("member.nameaffix", "memberNameaffix") + .addSelect("member.birthdate", "memberBirthdate") + .addSelect( + "SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))", + "durationInDays" + ) + .leftJoin("memberExecutivePositions.executivePosition", "executivePosition") + .leftJoin("memberExecutivePositions.member", "member") + .groupBy("executivePosition.id"), + }), + true + ); + await queryRunner.createView( + new View({ + name: "member_qualifications_view", + expression: (datasource: DataSource) => + datasource + .getRepository(memberQualifications) + .createQueryBuilder("memberQualifications") + .select("qualification.id", "qualificationId") + .addSelect("qualification.qualification", "qualification") + .addSelect("member.id", "memberId") + .addSelect("member.salutation", "memberSalutation") + .addSelect("member.firstname", "memberFirstname") + .addSelect("member.lastname", "memberLastname") + .addSelect("member.nameaffix", "memberNameaffix") + .addSelect("member.birthdate", "memberBirthdate") + .addSelect( + "SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))", + "durationInDays" + ) + .leftJoin("memberQualifications.qualification", "qualification") + .leftJoin("memberQualifications.member", "member") + .groupBy("qualification.id"), + }), + true + ); + await queryRunner.createView( + new View({ + name: "membership_view", + expression: (datasource: DataSource) => + datasource + .getRepository(membership) + .createQueryBuilder("membership") + .select("status.id", "statusId") + .addSelect("status.status", "status") + .addSelect("member.id", "memberId") + .addSelect("member.salutation", "memberSalutation") + .addSelect("member.firstname", "memberFirstname") + .addSelect("member.lastname", "memberLastname") + .addSelect("member.nameaffix", "memberNameaffix") + .addSelect("member.birthdate", "memberBirthdate") + .addSelect( + "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", + "durationInDays" + ) + .leftJoin("membership.status", "status") + .leftJoin("membership.member", "member") + .groupBy("status.id"), + }), + true + ); } public async down(queryRunner: QueryRunner): Promise { - // await queryRunner.dropView("membership_view"); - // await queryRunner.dropView("member_qualifications_view"); - // await queryRunner.dropView("member_executive_positions_view"); - // await queryRunner.dropView("member_view"); + await queryRunner.dropView("membership_view"); + await queryRunner.dropView("member_qualifications_view"); + await queryRunner.dropView("member_executive_positions_view"); + await queryRunner.dropView("member_view"); } } diff --git a/src/migrations/1736084198860-extendViewValues.ts b/src/migrations/1736084198860-extendViewValues.ts index 4a024c9..9816a83 100644 --- a/src/migrations/1736084198860-extendViewValues.ts +++ b/src/migrations/1736084198860-extendViewValues.ts @@ -8,104 +8,106 @@ export class ExtendViewValues1736084198860 implements MigrationInterface { name = "ExtendViewValues1736084198860"; public async up(queryRunner: QueryRunner): Promise { - // await queryRunner.dropView("membership_view"); - // await queryRunner.dropView("member_view"); - // await queryRunner.createView( - // new View({ - // name: "member_view", - // expression: (datasource: DataSource) => - // datasource - // .getRepository(member) - // .createQueryBuilder("member") - // .select("member.id", "id") - // .addSelect("member.salutation", "salutation") - // .addSelect("member.firstname", "firstname") - // .addSelect("member.lastname", "lastname") - // .addSelect("member.nameaffix", "nameaffix") - // .addSelect("member.birthdate", "birthdate") - // .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") - // .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear") - // .addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge"), - // }), - // true - // ); - // await queryRunner.createView( - // new View({ - // name: "membership_view", - // expression: (datasource: DataSource) => - // datasource - // .getRepository(membership) - // .createQueryBuilder("membership") - // .select("status.id", "statusId") - // .addSelect("status.status", "status") - // .addSelect("member.id", "memberId") - // .addSelect("member.salutation", "memberSalutation") - // .addSelect("member.firstname", "memberFirstname") - // .addSelect("member.lastname", "memberLastname") - // .addSelect("member.nameaffix", "memberNameaffix") - // .addSelect("member.birthdate", "memberBirthdate") - // .addSelect( - // "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", - // "durationInDays" - // ) - // .addSelect( - // "CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))", - // "durationInYears" - // ) - // .leftJoin("membership.status", "status") - // .leftJoin("membership.member", "member") - // .groupBy("status.id") - // .addGroupBy("member.id"), - // }), - // true - // ); + await queryRunner.dropView("membership_view"); + await queryRunner.dropView("member_view"); + + await queryRunner.createView( + new View({ + name: "member_view", + expression: (datasource: DataSource) => + datasource + .getRepository(member) + .createQueryBuilder("member") + .select("member.id", "id") + .addSelect("member.salutation", "salutation") + .addSelect("member.firstname", "firstname") + .addSelect("member.lastname", "lastname") + .addSelect("member.nameaffix", "nameaffix") + .addSelect("member.birthdate", "birthdate") + .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") + .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear") + .addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge"), + }), + true + ); + await queryRunner.createView( + new View({ + name: "membership_view", + expression: (datasource: DataSource) => + datasource + .getRepository(membership) + .createQueryBuilder("membership") + .select("status.id", "statusId") + .addSelect("status.status", "status") + .addSelect("member.id", "memberId") + .addSelect("member.salutation", "memberSalutation") + .addSelect("member.firstname", "memberFirstname") + .addSelect("member.lastname", "memberLastname") + .addSelect("member.nameaffix", "memberNameaffix") + .addSelect("member.birthdate", "memberBirthdate") + .addSelect( + "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", + "durationInDays" + ) + .addSelect( + "CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))", + "durationInYears" + ) + .leftJoin("membership.status", "status") + .leftJoin("membership.member", "member") + .groupBy("status.id") + .addGroupBy("member.id"), + }), + true + ); } public async down(queryRunner: QueryRunner): Promise { - // await queryRunner.dropView("membership_view"); - // await queryRunner.dropView("member_view"); - // await queryRunner.createView( - // new View({ - // name: "member_view", - // expression: (datasource: DataSource) => - // datasource - // .getRepository(member) - // .createQueryBuilder("member") - // .select("member.id", "id") - // .addSelect("member.salutation", "salutation") - // .addSelect("member.firstname", "firstname") - // .addSelect("member.lastname", "lastname") - // .addSelect("member.nameaffix", "nameaffix") - // .addSelect("member.birthdate", "birthdate") - // .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") - // .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"), - // }), - // true - // ); - // await queryRunner.createView( - // new View({ - // name: "membership_view", - // expression: (datasource: DataSource) => - // datasource - // .getRepository(membership) - // .createQueryBuilder("membership") - // .select("status.id", "statusId") - // .addSelect("status.status", "status") - // .addSelect("member.id", "memberId") - // .addSelect("member.salutation", "memberSalutation") - // .addSelect("member.firstname", "memberFirstname") - // .addSelect("member.lastname", "memberLastname") - // .addSelect("member.nameaffix", "memberNameaffix") - // .addSelect("member.birthdate", "memberBirthdate") - // .addSelect( - // "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", - // "durationInDays" - // ) - // .leftJoin("membership.status", "status") - // .leftJoin("membership.member", "member") - // .groupBy("status.id"), - // }), - // true - // ); + await queryRunner.dropView("membership_view"); + await queryRunner.dropView("member_view"); + + await queryRunner.createView( + new View({ + name: "member_view", + expression: (datasource: DataSource) => + datasource + .getRepository(member) + .createQueryBuilder("member") + .select("member.id", "id") + .addSelect("member.salutation", "salutation") + .addSelect("member.firstname", "firstname") + .addSelect("member.lastname", "lastname") + .addSelect("member.nameaffix", "nameaffix") + .addSelect("member.birthdate", "birthdate") + .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") + .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"), + }), + true + ); + await queryRunner.createView( + new View({ + name: "membership_view", + expression: (datasource: DataSource) => + datasource + .getRepository(membership) + .createQueryBuilder("membership") + .select("status.id", "statusId") + .addSelect("status.status", "status") + .addSelect("member.id", "memberId") + .addSelect("member.salutation", "memberSalutation") + .addSelect("member.firstname", "memberFirstname") + .addSelect("member.lastname", "memberLastname") + .addSelect("member.nameaffix", "memberNameaffix") + .addSelect("member.birthdate", "memberBirthdate") + .addSelect( + "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", + "durationInDays" + ) + .leftJoin("membership.status", "status") + .leftJoin("membership.member", "member") + .groupBy("status.id"), + }), + true + ); } } diff --git a/src/migrations/1737796878058-salutationAsTable.ts b/src/migrations/1737796878058-salutationAsTable.ts deleted file mode 100644 index df84a91..0000000 --- a/src/migrations/1737796878058-salutationAsTable.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableForeignKey } from "typeorm"; -import { DB_TYPE } from "../env.defaults"; -import { member } from "../entity/club/member/member"; -import { salutation } from "../entity/settings/salutation"; - -export class SalutationAsTable1737796878058 implements MigrationInterface { - name = "SalutationAsTable1737796878058"; - - public async up(queryRunner: QueryRunner): Promise { - const variableType_int = DB_TYPE == "mysql" ? "int" : "integer"; - - await queryRunner.createTable( - new Table({ - name: "salutation", - columns: [ - { name: "id", type: variableType_int, isPrimary: true, isGenerated: true, generationStrategy: "increment" }, - { name: "salutation", type: "varchar", length: "255", isUnique: true, isNullable: false }, - ], - }), - true - ); - - // ! has to be sql. Else the column would be dropped and created - resulting in data loss. - await queryRunner.query( - `ALTER TABLE \`member\` CHANGE \`salutation\` \`salutationId\` varchar(255) NOT NULL DEFAULT ''` - ); - - // ! has to be sql. Else no data is returned. - const existing_salutations = await queryRunner.query( - "SELECT DISTINCT salutationId FROM `member` `member` GROUP BY salutationId" - ); - - for (let s of existing_salutations.map((s: any) => s.salutationId) as Array) { - await queryRunner.manager.getRepository(salutation).save({ salutation: s }); - } - - const salutations = await queryRunner.manager.getRepository(salutation).find(); - - for (let salutation of salutations) { - await queryRunner.manager - .getRepository(member) - .createQueryBuilder("member") - .update({ salutationId: salutation.id }) - .where({ salutationId: salutation.salutation }) - .execute(); - } - - await queryRunner.query( - `ALTER TABLE \`member\` CHANGE \`salutationId\` \`salutationId\` ${variableType_int} NOT NULL` - ); - - await queryRunner.createForeignKey( - "member", - new TableForeignKey({ - columnNames: ["salutationId"], - referencedColumnNames: ["id"], - referencedTableName: "salutation", - onDelete: "RESTRICT", - onUpdate: "RESTRICT", - }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - const table = await queryRunner.getTable("member"); - const foreignKey = table.foreignKeys.find((fk) => fk.columnNames.indexOf("salutationId") !== -1); - await queryRunner.dropForeignKey("member", foreignKey); - - // ! has to be sql. Else the column would be dropped and created - resulting in data loss. - await queryRunner.query( - `ALTER TABLE \`member\` CHANGE \`salutationId\` \`salutationId\` varchar(255) NOT NULL DEFAULT ''` - ); - - const salutations = await queryRunner.manager.getRepository(salutation).find(); - - for (let salutation of salutations) { - await queryRunner.manager - .getRepository(member) - .createQueryBuilder("member") - .update({ salutationId: salutation.salutation as unknown as number }) - .where({ salutationId: salutation.id }) - .execute(); - } - - await queryRunner.query( - `ALTER TABLE \`member\` CHANGE \`salutationId\` \`salutation\` varchar(255) NOT NULL DEFAULT 'none'` - ); - - await queryRunner.dropTable("webapi"); - } -} diff --git a/src/migrations/1737800468938-updateViews.ts b/src/migrations/1737800468938-updateViews.ts deleted file mode 100644 index 64587af..0000000 --- a/src/migrations/1737800468938-updateViews.ts +++ /dev/null @@ -1,229 +0,0 @@ -import { DataSource, MigrationInterface, QueryRunner, View } from "typeorm"; -import { member } from "../entity/club/member/member"; -import { memberExecutivePositions } from "../entity/club/member/memberExecutivePositions"; -import { memberQualifications } from "../entity/club/member/memberQualifications"; -import { membership } from "../entity/club/member/membership"; - -export class UpdateViews1737800468938 implements MigrationInterface { - name = "UpdateViews1737800468938"; - - public async up(queryRunner: QueryRunner): Promise { - // await queryRunner.dropView("membership_view"); - // await queryRunner.dropView("member_executive_positions_view"); - // await queryRunner.dropView("member_qualifications_view"); - // await queryRunner.dropView("member_view"); - - await queryRunner.createView( - new View({ - name: "member_view", - expression: (datasource: DataSource) => - datasource - .getRepository(member) - .createQueryBuilder("member") - .select("member.id", "id") - .addSelect("member.firstname", "firstname") - .addSelect("member.lastname", "lastname") - .addSelect("member.nameaffix", "nameaffix") - .addSelect("member.birthdate", "birthdate") - .addSelect("salutation.salutation", "salutation") - .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") - .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear") - .addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge") - .leftJoin("member.salutation", "salutation"), - }), - true - ); - await queryRunner.createView( - new View({ - name: "member_executive_positions_view", - expression: (datasource: DataSource) => - datasource - .getRepository(memberExecutivePositions) - .createQueryBuilder("memberExecutivePositions") - .select("executivePosition.id", "positionId") - .addSelect("executivePosition.position", "position") - .addSelect("member.id", "memberId") - .addSelect("member.firstname", "memberFirstname") - .addSelect("member.lastname", "memberLastname") - .addSelect("member.nameaffix", "memberNameaffix") - .addSelect("member.birthdate", "memberBirthdate") - .addSelect("salutation.salutation", "memberSalutation") - .addSelect( - "SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))", - "durationInDays" - ) - .leftJoin("memberExecutivePositions.executivePosition", "executivePosition") - .leftJoin("memberExecutivePositions.member", "member") - .leftJoin("member.salutation", "salutation") - .groupBy("executivePosition.id") - .addGroupBy("member.id"), - }), - true - ); - await queryRunner.createView( - new View({ - name: "member_qualifications_view", - expression: (datasource: DataSource) => - datasource - .getRepository(memberQualifications) - .createQueryBuilder("memberQualifications") - .select("qualification.id", "qualificationId") - .addSelect("qualification.qualification", "qualification") - .addSelect("member.id", "memberId") - .addSelect("member.firstname", "memberFirstname") - .addSelect("member.lastname", "memberLastname") - .addSelect("member.nameaffix", "memberNameaffix") - .addSelect("member.birthdate", "memberBirthdate") - .addSelect("salutation.salutation", "memberSalutation") - .addSelect( - "SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))", - "durationInDays" - ) - .leftJoin("memberQualifications.qualification", "qualification") - .leftJoin("memberQualifications.member", "member") - .leftJoin("member.salutation", "salutation") - .groupBy("qualification.id") - .addGroupBy("member.id"), - }), - true - ); - await queryRunner.createView( - new View({ - name: "membership_view", - expression: (datasource: DataSource) => - datasource - .getRepository(membership) - .createQueryBuilder("membership") - .select("status.id", "statusId") - .addSelect("status.status", "status") - .addSelect("member.id", "memberId") - .addSelect("member.firstname", "memberFirstname") - .addSelect("member.lastname", "memberLastname") - .addSelect("member.nameaffix", "memberNameaffix") - .addSelect("member.birthdate", "memberBirthdate") - .addSelect("salutation.salutation", "memberSalutation") - .addSelect( - "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", - "durationInDays" - ) - .addSelect( - "CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))", - "durationInYears" - ) - .leftJoin("membership.status", "status") - .leftJoin("membership.member", "member") - .leftJoin("member.salutation", "salutation") - .groupBy("status.id") - .addGroupBy("member.id"), - }), - true - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropView("membership_view"); - await queryRunner.dropView("member_executive_positions_view"); - await queryRunner.dropView("member_qualifications_view"); - await queryRunner.dropView("member_view"); - - await queryRunner.createView( - new View({ - name: "member_view", - expression: (datasource: DataSource) => - datasource - .getRepository(member) - .createQueryBuilder("member") - .select("member.id", "id") - .addSelect("member.salutation", "salutation") - .addSelect("member.firstname", "firstname") - .addSelect("member.lastname", "lastname") - .addSelect("member.nameaffix", "nameaffix") - .addSelect("member.birthdate", "birthdate") - .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") - .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear") - .addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge"), - }), - true - ); - await queryRunner.createView( - new View({ - name: "member_executive_positions_view", - expression: (datasource: DataSource) => - datasource - .getRepository(memberExecutivePositions) - .createQueryBuilder("memberExecutivePositions") - .select("executivePosition.id", "positionId") - .addSelect("executivePosition.position", "position") - .addSelect("member.id", "memberId") - .addSelect("member.salutation", "memberSalutation") - .addSelect("member.firstname", "memberFirstname") - .addSelect("member.lastname", "memberLastname") - .addSelect("member.nameaffix", "memberNameaffix") - .addSelect("member.birthdate", "memberBirthdate") - .addSelect( - "SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))", - "durationInDays" - ) - .leftJoin("memberExecutivePositions.executivePosition", "executivePosition") - .leftJoin("memberExecutivePositions.member", "member") - .groupBy("executivePosition.id"), - }), - true - ); - await queryRunner.createView( - new View({ - name: "member_qualifications_view", - expression: (datasource: DataSource) => - datasource - .getRepository(memberQualifications) - .createQueryBuilder("memberQualifications") - .select("qualification.id", "qualificationId") - .addSelect("qualification.qualification", "qualification") - .addSelect("member.id", "memberId") - .addSelect("member.salutation", "memberSalutation") - .addSelect("member.firstname", "memberFirstname") - .addSelect("member.lastname", "memberLastname") - .addSelect("member.nameaffix", "memberNameaffix") - .addSelect("member.birthdate", "memberBirthdate") - .addSelect( - "SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))", - "durationInDays" - ) - .leftJoin("memberQualifications.qualification", "qualification") - .leftJoin("memberQualifications.member", "member") - .groupBy("qualification.id"), - }), - true - ); - await queryRunner.createView( - new View({ - name: "membership_view", - expression: (datasource: DataSource) => - datasource - .getRepository(membership) - .createQueryBuilder("membership") - .select("status.id", "statusId") - .addSelect("status.status", "status") - .addSelect("member.id", "memberId") - .addSelect("member.salutation", "memberSalutation") - .addSelect("member.firstname", "memberFirstname") - .addSelect("member.lastname", "memberLastname") - .addSelect("member.nameaffix", "memberNameaffix") - .addSelect("member.birthdate", "memberBirthdate") - .addSelect( - "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", - "durationInDays" - ) - .addSelect( - "CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))", - "durationInYears" - ) - .leftJoin("membership.status", "status") - .leftJoin("membership.member", "member") - .groupBy("status.id") - .addGroupBy("member.id"), - }), - true - ); - } -} diff --git a/src/viewmodel/admin/club/member/member.models.ts b/src/viewmodel/admin/club/member/member.models.ts index 2254d68..c28ed73 100644 --- a/src/viewmodel/admin/club/member/member.models.ts +++ b/src/viewmodel/admin/club/member/member.models.ts @@ -1,10 +1,10 @@ -import { SalutationViewModel } from "../../settings/salutation.models"; +import { Salutation } from "../../../../enums/salutation"; import { CommunicationViewModel } from "./communication.models"; import { MembershipViewModel } from "./membership.models"; export interface MemberViewModel { id: number; - salutation: SalutationViewModel; + salutation: Salutation; firstname: string; lastname: string; nameaffix: string; @@ -19,7 +19,7 @@ export interface MemberViewModel { export interface MemberStatisticsViewModel { id: number; - salutation: string; + salutation: Salutation; firstname: string; lastname: string; nameaffix: string; diff --git a/src/viewmodel/admin/club/member/membership.models.ts b/src/viewmodel/admin/club/member/membership.models.ts index 1db540a..da8bffa 100644 --- a/src/viewmodel/admin/club/member/membership.models.ts +++ b/src/viewmodel/admin/club/member/membership.models.ts @@ -1,3 +1,5 @@ +import { Salutation } from "../../../../enums/salutation"; + export interface MembershipViewModel { id: number; start: Date; @@ -13,7 +15,7 @@ export interface MembershipStatisticsViewModel { status: string; statusId: number; memberId: number; - memberSalutation: string; + memberSalutation: Salutation; memberFirstname: string; memberLastname: string; memberNameaffix: string; diff --git a/src/viewmodel/admin/settings/salutation.models.ts b/src/viewmodel/admin/settings/salutation.models.ts deleted file mode 100644 index 18531f5..0000000 --- a/src/viewmodel/admin/settings/salutation.models.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface SalutationViewModel { - id: number; - salutation: string; -} diff --git a/src/views/memberExecutivePositionView.ts b/src/views/memberExecutivePositionView.ts index c1df465..23722cb 100644 --- a/src/views/memberExecutivePositionView.ts +++ b/src/views/memberExecutivePositionView.ts @@ -1,5 +1,6 @@ import { DataSource, ViewColumn, ViewEntity } from "typeorm"; import { memberExecutivePositions } from "../entity/club/member/memberExecutivePositions"; +import { Salutation } from "../enums/salutation"; @ViewEntity({ expression: (datasource: DataSource) => @@ -9,20 +10,18 @@ import { memberExecutivePositions } from "../entity/club/member/memberExecutiveP .select("executivePosition.id", "positionId") .addSelect("executivePosition.position", "position") .addSelect("member.id", "memberId") + .addSelect("member.salutation", "memberSalutation") .addSelect("member.firstname", "memberFirstname") .addSelect("member.lastname", "memberLastname") .addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.birthdate", "memberBirthdate") - .addSelect("salutation.salutation", "memberSalutation") .addSelect( "SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))", "durationInDays" ) .leftJoin("memberExecutivePositions.executivePosition", "executivePosition") .leftJoin("memberExecutivePositions.member", "member") - .leftJoin("member.salutation", "salutation") - .groupBy("executivePosition.id") - .addGroupBy("member.id"), + .groupBy("executivePosition.id"), }) export class memberExecutivePositionsView { @ViewColumn() @@ -38,7 +37,7 @@ export class memberExecutivePositionsView { memberId: number; @ViewColumn() - memberSalutation: string; + memberSalutation: Salutation; @ViewColumn() memberFirstname: string; diff --git a/src/views/memberQualificationsView.ts b/src/views/memberQualificationsView.ts index b22e05e..4ae436d 100644 --- a/src/views/memberQualificationsView.ts +++ b/src/views/memberQualificationsView.ts @@ -1,5 +1,6 @@ import { DataSource, ViewColumn, ViewEntity } from "typeorm"; import { memberQualifications } from "../entity/club/member/memberQualifications"; +import { Salutation } from "../enums/salutation"; @ViewEntity({ expression: (datasource: DataSource) => @@ -9,20 +10,18 @@ import { memberQualifications } from "../entity/club/member/memberQualifications .select("qualification.id", "qualificationId") .addSelect("qualification.qualification", "qualification") .addSelect("member.id", "memberId") + .addSelect("member.salutation", "memberSalutation") .addSelect("member.firstname", "memberFirstname") .addSelect("member.lastname", "memberLastname") .addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.birthdate", "memberBirthdate") - .addSelect("salutation.salutation", "memberSalutation") .addSelect( "SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))", "durationInDays" ) .leftJoin("memberQualifications.qualification", "qualification") .leftJoin("memberQualifications.member", "member") - .leftJoin("member.salutation", "salutation") - .groupBy("qualification.id") - .addGroupBy("member.id"), + .groupBy("qualification.id"), }) export class memberQualificationsView { @ViewColumn() @@ -38,7 +37,7 @@ export class memberQualificationsView { memberId: number; @ViewColumn() - memberSalutation: string; + memberSalutation: Salutation; @ViewColumn() memberFirstname: string; diff --git a/src/views/memberView.ts b/src/views/memberView.ts index 90debc3..6a980f0 100644 --- a/src/views/memberView.ts +++ b/src/views/memberView.ts @@ -1,5 +1,6 @@ import { DataSource, ViewColumn, ViewEntity } from "typeorm"; import { member } from "../entity/club/member/member"; +import { Salutation } from "../enums/salutation"; @ViewEntity({ expression: (datasource: DataSource) => @@ -7,22 +8,21 @@ import { member } from "../entity/club/member/member"; .getRepository(member) .createQueryBuilder("member") .select("member.id", "id") + .addSelect("member.salutation", "salutation") .addSelect("member.firstname", "firstname") .addSelect("member.lastname", "lastname") .addSelect("member.nameaffix", "nameaffix") .addSelect("member.birthdate", "birthdate") - .addSelect("salutation.salutation", "salutation") .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear") - .addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge") - .leftJoin("member.salutation", "salutation"), + .addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge"), }) export class memberView { @ViewColumn() id: number; @ViewColumn() - salutation: string; + salutation: Salutation; @ViewColumn() firstname: string; diff --git a/src/views/membershipsView.ts b/src/views/membershipsView.ts index 1c764bf..1e40209 100644 --- a/src/views/membershipsView.ts +++ b/src/views/membershipsView.ts @@ -1,5 +1,6 @@ import { DataSource, ViewColumn, ViewEntity } from "typeorm"; import { membership } from "../entity/club/member/membership"; +import { Salutation } from "../enums/salutation"; @ViewEntity({ expression: (datasource: DataSource) => @@ -9,11 +10,11 @@ import { membership } from "../entity/club/member/membership"; .select("status.id", "statusId") .addSelect("status.status", "status") .addSelect("member.id", "memberId") + .addSelect("member.salutation", "memberSalutation") .addSelect("member.firstname", "memberFirstname") .addSelect("member.lastname", "memberLastname") .addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.birthdate", "memberBirthdate") - .addSelect("salutation.salutation", "memberSalutation") .addSelect("SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", "durationInDays") .addSelect( "CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))", @@ -21,7 +22,6 @@ import { membership } from "../entity/club/member/membership"; ) .leftJoin("membership.status", "status") .leftJoin("membership.member", "member") - .leftJoin("member.salutation", "salutation") .groupBy("status.id") .addGroupBy("member.id"), }) @@ -42,7 +42,7 @@ export class membershipView { memberId: number; @ViewColumn() - memberSalutation: string; + memberSalutation: Salutation; @ViewColumn() memberFirstname: string;