Compare commits

..

No commits in common. "b55d0554e44e49f81a911ce53c9674dee375ebe6" and "ff651b7d8f3b665eda94a77a8adf402e6fa9f8f7" have entirely different histories.

21 changed files with 256 additions and 581 deletions

View file

@ -1,5 +1,7 @@
import { Salutation } from "../../../enums/salutation";
export interface CreateMemberCommand { export interface CreateMemberCommand {
salutationId: number; salutation: Salutation;
firstname: string; firstname: string;
lastname: string; lastname: string;
nameaffix: string; nameaffix: string;
@ -9,7 +11,7 @@ export interface CreateMemberCommand {
export interface UpdateMemberCommand { export interface UpdateMemberCommand {
id: number; id: number;
salutationId: number; salutation: Salutation;
firstname: string; firstname: string;
lastname: string; lastname: string;
nameaffix: string; nameaffix: string;

View file

@ -21,7 +21,7 @@ export default abstract class MemberCommandHandler {
.insert() .insert()
.into(member) .into(member)
.values({ .values({
salutationId: createMember.salutationId, salutation: createMember.salutation,
firstname: createMember.firstname, firstname: createMember.firstname,
lastname: createMember.lastname, lastname: createMember.lastname,
nameaffix: createMember.nameaffix, nameaffix: createMember.nameaffix,
@ -50,7 +50,7 @@ export default abstract class MemberCommandHandler {
.createQueryBuilder() .createQueryBuilder()
.update(member) .update(member)
.set({ .set({
salutationId: updateMember.salutationId, salutation: updateMember.salutation,
firstname: updateMember.firstname, firstname: updateMember.firstname,
lastname: updateMember.lastname, lastname: updateMember.lastname,
nameaffix: updateMember.nameaffix, nameaffix: updateMember.nameaffix,

View file

@ -285,7 +285,7 @@ export async function createMemberPrintoutList(req: Request, res: Response): Pro
* @returns {Promise<*>} * @returns {Promise<*>}
*/ */
export async function createMember(req: Request, res: Response): Promise<any> { export async function createMember(req: Request, res: Response): Promise<any> {
const salutationId = req.body.salutationId; const salutation = req.body.salutation;
const firstname = req.body.firstname; const firstname = req.body.firstname;
const lastname = req.body.lastname; const lastname = req.body.lastname;
const nameaffix = req.body.nameaffix; const nameaffix = req.body.nameaffix;
@ -293,7 +293,7 @@ export async function createMember(req: Request, res: Response): Promise<any> {
const internalId = req.body.internalId; const internalId = req.body.internalId;
let createMember: CreateMemberCommand = { let createMember: CreateMemberCommand = {
salutationId, salutation,
firstname, firstname,
lastname, lastname,
nameaffix, nameaffix,
@ -453,7 +453,7 @@ export async function addCommunicationToMember(req: Request, res: Response): Pro
*/ */
export async function updateMemberById(req: Request, res: Response): Promise<any> { export async function updateMemberById(req: Request, res: Response): Promise<any> {
const memberId = parseInt(req.params.id); const memberId = parseInt(req.params.id);
const salutationId = req.body.salutationId; const salutation = req.body.salutation;
const firstname = req.body.firstname; const firstname = req.body.firstname;
const lastname = req.body.lastname; const lastname = req.body.lastname;
const nameaffix = req.body.nameaffix; const nameaffix = req.body.nameaffix;
@ -462,7 +462,7 @@ export async function updateMemberById(req: Request, res: Response): Promise<any
let updateMember: UpdateMemberCommand = { let updateMember: UpdateMemberCommand = {
id: memberId, id: memberId,
salutationId, salutation,
firstname, firstname,
lastname, lastname,
nameaffix, nameaffix,

View file

@ -21,6 +21,7 @@ import UserService from "../../../service/user/userService";
import { TemplateHelper } from "../../../helpers/templateHelper"; import { TemplateHelper } from "../../../helpers/templateHelper";
import MailHelper from "../../../helpers/mailHelper"; import MailHelper from "../../../helpers/mailHelper";
import { NewsletterEventType, NewsletterHelper } from "../../../helpers/newsletterHelper"; import { NewsletterEventType, NewsletterHelper } from "../../../helpers/newsletterHelper";
import { Salutation } from "../../../enums/salutation";
/** /**
* @description get all newsletters * @description get all newsletters
@ -141,7 +142,7 @@ export async function createNewsletterPrintoutPreviewById(req: Request, res: Res
data.recipient = { data.recipient = {
firstname: recipient.firstname, firstname: recipient.firstname,
lastname: recipient.lastname, lastname: recipient.lastname,
salutation: "Anrede", salutation: Salutation.none,
nameaffix: "", nameaffix: "",
street: "Straße", street: "Straße",
streetNumber: "Hausnummer", streetNumber: "Hausnummer",
@ -247,7 +248,7 @@ export async function createNewsletterMailPreviewById(req: Request, res: Respons
data.recipient = { data.recipient = {
firstname: recipient.firstname, firstname: recipient.firstname,
lastname: recipient.lastname, lastname: recipient.lastname,
salutation: "Anrede", salutation: Salutation.none,
nameaffix: "", nameaffix: "",
street: "Straße", street: "Straße",
streetNumber: "Hausnummer", streetNumber: "Hausnummer",

View file

@ -71,9 +71,6 @@ import { ProtocolPresenceExcuse1737287798828 } from "./migrations/1737287798828-
import { webapi } from "./entity/user/webapi"; import { webapi } from "./entity/user/webapi";
import { webapiPermission } from "./entity/user/webapi_permission"; import { webapiPermission } from "./entity/user/webapi_permission";
import { AddWebapiTokens1737453096674 } from "./migrations/1737453096674-addwebapiTokens"; import { AddWebapiTokens1737453096674 } from "./migrations/1737453096674-addwebapiTokens";
import { salutation } from "./entity/settings/salutation";
import { SalutationAsTable1737796878058 } from "./migrations/1737796878058-salutationAsTable";
import { UpdateViews1737800468938 } from "./migrations/1737800468938-updateViews";
const dataSource = new DataSource({ const dataSource = new DataSource({
type: DB_TYPE as any, type: DB_TYPE as any,
@ -99,7 +96,6 @@ const dataSource = new DataSource({
executivePosition, executivePosition,
membershipStatus, membershipStatus,
qualification, qualification,
salutation,
member, member,
memberAwards, memberAwards,
memberExecutivePositions, memberExecutivePositions,
@ -156,8 +152,6 @@ const dataSource = new DataSource({
FinishInternalIdTransfer1736505324488, FinishInternalIdTransfer1736505324488,
ProtocolPresenceExcuse1737287798828, ProtocolPresenceExcuse1737287798828,
AddWebapiTokens1737453096674, AddWebapiTokens1737453096674,
SalutationAsTable1737796878058,
UpdateViews1737800468938,
], ],
migrationsRun: true, migrationsRun: true,
migrationsTransactionMode: "each", migrationsTransactionMode: "each",

View file

@ -1,5 +1,6 @@
import { calendar } from "../entity/club/calendar"; import { calendar } from "../entity/club/calendar";
import { member } from "../entity/club/member/member"; import { member } from "../entity/club/member/member";
import { Salutation } from "../enums/salutation";
export const newsletterDemoData: { export const newsletterDemoData: {
title: string; title: string;
@ -17,9 +18,7 @@ export const newsletterDemoData: {
} }
> >
>; >;
recipient: Partial< recipient: Partial<member & { street: string; streetNumber: string; streetNumberAdd: string }>;
Omit<member, "salutation"> & { salutation: string; street: string; streetNumber: string; streetNumberAdd: string }
>;
} = { } = {
title: "Beispiel Newsletter Daten", title: "Beispiel Newsletter Daten",
description: "Zusammenfassung der Demodaten.", description: "Zusammenfassung der Demodaten.",
@ -64,7 +63,7 @@ export const newsletterDemoData: {
recipient: { recipient: {
firstname: "Julian", firstname: "Julian",
lastname: "Krauser", lastname: "Krauser",
salutation: "Herr", salutation: Salutation.sir,
nameaffix: "", nameaffix: "",
street: "Straße", street: "Straße",
streetNumber: "Hausnummer", streetNumber: "Hausnummer",

View file

@ -1,16 +1,32 @@
import { Column, Entity, JoinColumn, ManyToOne, OneToMany, OneToOne, PrimaryColumn } from "typeorm"; import { Column, Entity, JoinColumn, ManyToOne, OneToMany, OneToOne, PrimaryColumn } from "typeorm";
import { Salutation } from "../../../enums/salutation";
import { membership } from "./membership"; import { membership } from "./membership";
import { memberAwards } from "./memberAwards"; import { memberAwards } from "./memberAwards";
import { memberQualifications } from "./memberQualifications"; import { memberQualifications } from "./memberQualifications";
import { memberExecutivePositions } from "./memberExecutivePositions"; import { memberExecutivePositions } from "./memberExecutivePositions";
import { communication } from "./communication"; import { communication } from "./communication";
import { salutation } from "../../settings/salutation"; import { CommunicationViewModel } from "../../../viewmodel/admin/club/member/communication.models";
@Entity() @Entity()
export class member { export class member {
@PrimaryColumn({ generated: "increment", type: "int" }) @PrimaryColumn({ generated: "increment", type: "int" })
id: number; 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 }) @Column({ type: "varchar", length: 255 })
firstname: string; firstname: string;
@ -26,9 +42,6 @@ export class member {
@Column({ type: "varchar", length: 255, unique: true, nullable: true }) @Column({ type: "varchar", length: 255, unique: true, nullable: true })
internalId?: string; internalId?: string;
@Column()
salutationId: number;
@OneToMany(() => communication, (communications) => communications.member) @OneToMany(() => communication, (communications) => communications.member)
communications: communication[]; communications: communication[];
@ -40,9 +53,6 @@ export class member {
@JoinColumn() @JoinColumn()
sendNewsletter?: communication; sendNewsletter?: communication;
@ManyToOne(() => salutation, (salutation) => salutation.members)
salutation: salutation;
@OneToMany(() => membership, (membership) => membership.member) @OneToMany(() => membership, (membership) => membership.member)
memberships: membership[]; memberships: membership[];

View file

@ -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[];
}

6
src/enums/salutation.ts Normal file
View file

@ -0,0 +1,6 @@
export enum Salutation {
sir = "sir",
madam = "madam",
other = "other",
none = "none",
}

View file

@ -100,7 +100,7 @@ export abstract class NewsletterHelper {
recipient: { recipient: {
firstname: recipient.firstname, firstname: recipient.firstname,
lastname: recipient.lastname, lastname: recipient.lastname,
salutation: recipient.salutation.salutation, salutation: recipient.salutation,
nameaffix: recipient.nameaffix, nameaffix: recipient.nameaffix,
...(showAdress ...(showAdress
? { ? {

View file

@ -8,105 +8,105 @@ export class MemberDataViews1734520998539 implements MigrationInterface {
name = "MemberDataViews1734520998539"; name = "MemberDataViews1734520998539";
public async up(queryRunner: QueryRunner): Promise<void> { public async up(queryRunner: QueryRunner): Promise<void> {
// await queryRunner.createView( await queryRunner.createView(
// new View({ new View({
// name: "member_view", name: "member_view",
// expression: (datasource: DataSource) => expression: (datasource: DataSource) =>
// datasource datasource
// .getRepository(member) .getRepository(member)
// .createQueryBuilder("member") .createQueryBuilder("member")
// .select("member.id", "id") .select("member.id", "id")
// .addSelect("member.salutation", "salutation") .addSelect("member.salutation", "salutation")
// .addSelect("member.firstname", "firstname") .addSelect("member.firstname", "firstname")
// .addSelect("member.lastname", "lastname") .addSelect("member.lastname", "lastname")
// .addSelect("member.nameaffix", "nameaffix") .addSelect("member.nameaffix", "nameaffix")
// .addSelect("member.birthdate", "birthdate") .addSelect("member.birthdate", "birthdate")
// .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge")
// .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"), .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"),
// }), }),
// true true
// ); );
// await queryRunner.createView( await queryRunner.createView(
// new View({ new View({
// name: "member_executive_positions_view", name: "member_executive_positions_view",
// expression: (datasource: DataSource) => expression: (datasource: DataSource) =>
// datasource datasource
// .getRepository(memberExecutivePositions) .getRepository(memberExecutivePositions)
// .createQueryBuilder("memberExecutivePositions") .createQueryBuilder("memberExecutivePositions")
// .select("executivePosition.id", "positionId") .select("executivePosition.id", "positionId")
// .addSelect("executivePosition.position", "position") .addSelect("executivePosition.position", "position")
// .addSelect("member.id", "memberId") .addSelect("member.id", "memberId")
// .addSelect("member.salutation", "memberSalutation") .addSelect("member.salutation", "memberSalutation")
// .addSelect("member.firstname", "memberFirstname") .addSelect("member.firstname", "memberFirstname")
// .addSelect("member.lastname", "memberLastname") .addSelect("member.lastname", "memberLastname")
// .addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.nameaffix", "memberNameaffix")
// .addSelect("member.birthdate", "memberBirthdate") .addSelect("member.birthdate", "memberBirthdate")
// .addSelect( .addSelect(
// "SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))", "SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))",
// "durationInDays" "durationInDays"
// ) )
// .leftJoin("memberExecutivePositions.executivePosition", "executivePosition") .leftJoin("memberExecutivePositions.executivePosition", "executivePosition")
// .leftJoin("memberExecutivePositions.member", "member") .leftJoin("memberExecutivePositions.member", "member")
// .groupBy("executivePosition.id"), .groupBy("executivePosition.id"),
// }), }),
// true true
// ); );
// await queryRunner.createView( await queryRunner.createView(
// new View({ new View({
// name: "member_qualifications_view", name: "member_qualifications_view",
// expression: (datasource: DataSource) => expression: (datasource: DataSource) =>
// datasource datasource
// .getRepository(memberQualifications) .getRepository(memberQualifications)
// .createQueryBuilder("memberQualifications") .createQueryBuilder("memberQualifications")
// .select("qualification.id", "qualificationId") .select("qualification.id", "qualificationId")
// .addSelect("qualification.qualification", "qualification") .addSelect("qualification.qualification", "qualification")
// .addSelect("member.id", "memberId") .addSelect("member.id", "memberId")
// .addSelect("member.salutation", "memberSalutation") .addSelect("member.salutation", "memberSalutation")
// .addSelect("member.firstname", "memberFirstname") .addSelect("member.firstname", "memberFirstname")
// .addSelect("member.lastname", "memberLastname") .addSelect("member.lastname", "memberLastname")
// .addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.nameaffix", "memberNameaffix")
// .addSelect("member.birthdate", "memberBirthdate") .addSelect("member.birthdate", "memberBirthdate")
// .addSelect( .addSelect(
// "SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))", "SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))",
// "durationInDays" "durationInDays"
// ) )
// .leftJoin("memberQualifications.qualification", "qualification") .leftJoin("memberQualifications.qualification", "qualification")
// .leftJoin("memberQualifications.member", "member") .leftJoin("memberQualifications.member", "member")
// .groupBy("qualification.id"), .groupBy("qualification.id"),
// }), }),
// true true
// ); );
// await queryRunner.createView( await queryRunner.createView(
// new View({ new View({
// name: "membership_view", name: "membership_view",
// expression: (datasource: DataSource) => expression: (datasource: DataSource) =>
// datasource datasource
// .getRepository(membership) .getRepository(membership)
// .createQueryBuilder("membership") .createQueryBuilder("membership")
// .select("status.id", "statusId") .select("status.id", "statusId")
// .addSelect("status.status", "status") .addSelect("status.status", "status")
// .addSelect("member.id", "memberId") .addSelect("member.id", "memberId")
// .addSelect("member.salutation", "memberSalutation") .addSelect("member.salutation", "memberSalutation")
// .addSelect("member.firstname", "memberFirstname") .addSelect("member.firstname", "memberFirstname")
// .addSelect("member.lastname", "memberLastname") .addSelect("member.lastname", "memberLastname")
// .addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.nameaffix", "memberNameaffix")
// .addSelect("member.birthdate", "memberBirthdate") .addSelect("member.birthdate", "memberBirthdate")
// .addSelect( .addSelect(
// "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))",
// "durationInDays" "durationInDays"
// ) )
// .leftJoin("membership.status", "status") .leftJoin("membership.status", "status")
// .leftJoin("membership.member", "member") .leftJoin("membership.member", "member")
// .groupBy("status.id"), .groupBy("status.id"),
// }), }),
// true true
// ); );
} }
public async down(queryRunner: QueryRunner): Promise<void> { public async down(queryRunner: QueryRunner): Promise<void> {
// await queryRunner.dropView("membership_view"); await queryRunner.dropView("membership_view");
// await queryRunner.dropView("member_qualifications_view"); await queryRunner.dropView("member_qualifications_view");
// await queryRunner.dropView("member_executive_positions_view"); await queryRunner.dropView("member_executive_positions_view");
// await queryRunner.dropView("member_view"); await queryRunner.dropView("member_view");
} }
} }

View file

@ -8,104 +8,106 @@ export class ExtendViewValues1736084198860 implements MigrationInterface {
name = "ExtendViewValues1736084198860"; name = "ExtendViewValues1736084198860";
public async up(queryRunner: QueryRunner): Promise<void> { public async up(queryRunner: QueryRunner): Promise<void> {
// await queryRunner.dropView("membership_view"); await queryRunner.dropView("membership_view");
// await queryRunner.dropView("member_view"); await queryRunner.dropView("member_view");
// await queryRunner.createView(
// new View({ await queryRunner.createView(
// name: "member_view", new View({
// expression: (datasource: DataSource) => name: "member_view",
// datasource expression: (datasource: DataSource) =>
// .getRepository(member) datasource
// .createQueryBuilder("member") .getRepository(member)
// .select("member.id", "id") .createQueryBuilder("member")
// .addSelect("member.salutation", "salutation") .select("member.id", "id")
// .addSelect("member.firstname", "firstname") .addSelect("member.salutation", "salutation")
// .addSelect("member.lastname", "lastname") .addSelect("member.firstname", "firstname")
// .addSelect("member.nameaffix", "nameaffix") .addSelect("member.lastname", "lastname")
// .addSelect("member.birthdate", "birthdate") .addSelect("member.nameaffix", "nameaffix")
// .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") .addSelect("member.birthdate", "birthdate")
// .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear") .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge")
// .addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge"), .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear")
// }), .addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge"),
// true }),
// ); true
// await queryRunner.createView( );
// new View({ await queryRunner.createView(
// name: "membership_view", new View({
// expression: (datasource: DataSource) => name: "membership_view",
// datasource expression: (datasource: DataSource) =>
// .getRepository(membership) datasource
// .createQueryBuilder("membership") .getRepository(membership)
// .select("status.id", "statusId") .createQueryBuilder("membership")
// .addSelect("status.status", "status") .select("status.id", "statusId")
// .addSelect("member.id", "memberId") .addSelect("status.status", "status")
// .addSelect("member.salutation", "memberSalutation") .addSelect("member.id", "memberId")
// .addSelect("member.firstname", "memberFirstname") .addSelect("member.salutation", "memberSalutation")
// .addSelect("member.lastname", "memberLastname") .addSelect("member.firstname", "memberFirstname")
// .addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.lastname", "memberLastname")
// .addSelect("member.birthdate", "memberBirthdate") .addSelect("member.nameaffix", "memberNameaffix")
// .addSelect( .addSelect("member.birthdate", "memberBirthdate")
// "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", .addSelect(
// "durationInDays" "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)))))", .addSelect(
// "durationInYears" "CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))",
// ) "durationInYears"
// .leftJoin("membership.status", "status") )
// .leftJoin("membership.member", "member") .leftJoin("membership.status", "status")
// .groupBy("status.id") .leftJoin("membership.member", "member")
// .addGroupBy("member.id"), .groupBy("status.id")
// }), .addGroupBy("member.id"),
// true }),
// ); true
);
} }
public async down(queryRunner: QueryRunner): Promise<void> { public async down(queryRunner: QueryRunner): Promise<void> {
// await queryRunner.dropView("membership_view"); await queryRunner.dropView("membership_view");
// await queryRunner.dropView("member_view"); await queryRunner.dropView("member_view");
// await queryRunner.createView(
// new View({ await queryRunner.createView(
// name: "member_view", new View({
// expression: (datasource: DataSource) => name: "member_view",
// datasource expression: (datasource: DataSource) =>
// .getRepository(member) datasource
// .createQueryBuilder("member") .getRepository(member)
// .select("member.id", "id") .createQueryBuilder("member")
// .addSelect("member.salutation", "salutation") .select("member.id", "id")
// .addSelect("member.firstname", "firstname") .addSelect("member.salutation", "salutation")
// .addSelect("member.lastname", "lastname") .addSelect("member.firstname", "firstname")
// .addSelect("member.nameaffix", "nameaffix") .addSelect("member.lastname", "lastname")
// .addSelect("member.birthdate", "birthdate") .addSelect("member.nameaffix", "nameaffix")
// .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") .addSelect("member.birthdate", "birthdate")
// .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"), .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge")
// }), .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"),
// true }),
// ); true
// await queryRunner.createView( );
// new View({ await queryRunner.createView(
// name: "membership_view", new View({
// expression: (datasource: DataSource) => name: "membership_view",
// datasource expression: (datasource: DataSource) =>
// .getRepository(membership) datasource
// .createQueryBuilder("membership") .getRepository(membership)
// .select("status.id", "statusId") .createQueryBuilder("membership")
// .addSelect("status.status", "status") .select("status.id", "statusId")
// .addSelect("member.id", "memberId") .addSelect("status.status", "status")
// .addSelect("member.salutation", "memberSalutation") .addSelect("member.id", "memberId")
// .addSelect("member.firstname", "memberFirstname") .addSelect("member.salutation", "memberSalutation")
// .addSelect("member.lastname", "memberLastname") .addSelect("member.firstname", "memberFirstname")
// .addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.lastname", "memberLastname")
// .addSelect("member.birthdate", "memberBirthdate") .addSelect("member.nameaffix", "memberNameaffix")
// .addSelect( .addSelect("member.birthdate", "memberBirthdate")
// "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", .addSelect(
// "durationInDays" "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))",
// ) "durationInDays"
// .leftJoin("membership.status", "status") )
// .leftJoin("membership.member", "member") .leftJoin("membership.status", "status")
// .groupBy("status.id"), .leftJoin("membership.member", "member")
// }), .groupBy("status.id"),
// true }),
// ); true
);
} }
} }

View file

@ -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<void> {
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<string>) {
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<void> {
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");
}
}

View file

@ -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<void> {
// 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<void> {
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
);
}
}

View file

@ -1,10 +1,10 @@
import { SalutationViewModel } from "../../settings/salutation.models"; import { Salutation } from "../../../../enums/salutation";
import { CommunicationViewModel } from "./communication.models"; import { CommunicationViewModel } from "./communication.models";
import { MembershipViewModel } from "./membership.models"; import { MembershipViewModel } from "./membership.models";
export interface MemberViewModel { export interface MemberViewModel {
id: number; id: number;
salutation: SalutationViewModel; salutation: Salutation;
firstname: string; firstname: string;
lastname: string; lastname: string;
nameaffix: string; nameaffix: string;
@ -19,7 +19,7 @@ export interface MemberViewModel {
export interface MemberStatisticsViewModel { export interface MemberStatisticsViewModel {
id: number; id: number;
salutation: string; salutation: Salutation;
firstname: string; firstname: string;
lastname: string; lastname: string;
nameaffix: string; nameaffix: string;

View file

@ -1,3 +1,5 @@
import { Salutation } from "../../../../enums/salutation";
export interface MembershipViewModel { export interface MembershipViewModel {
id: number; id: number;
start: Date; start: Date;
@ -13,7 +15,7 @@ export interface MembershipStatisticsViewModel {
status: string; status: string;
statusId: number; statusId: number;
memberId: number; memberId: number;
memberSalutation: string; memberSalutation: Salutation;
memberFirstname: string; memberFirstname: string;
memberLastname: string; memberLastname: string;
memberNameaffix: string; memberNameaffix: string;

View file

@ -1,4 +0,0 @@
export interface SalutationViewModel {
id: number;
salutation: string;
}

View file

@ -1,5 +1,6 @@
import { DataSource, ViewColumn, ViewEntity } from "typeorm"; import { DataSource, ViewColumn, ViewEntity } from "typeorm";
import { memberExecutivePositions } from "../entity/club/member/memberExecutivePositions"; import { memberExecutivePositions } from "../entity/club/member/memberExecutivePositions";
import { Salutation } from "../enums/salutation";
@ViewEntity({ @ViewEntity({
expression: (datasource: DataSource) => expression: (datasource: DataSource) =>
@ -9,20 +10,18 @@ import { memberExecutivePositions } from "../entity/club/member/memberExecutiveP
.select("executivePosition.id", "positionId") .select("executivePosition.id", "positionId")
.addSelect("executivePosition.position", "position") .addSelect("executivePosition.position", "position")
.addSelect("member.id", "memberId") .addSelect("member.id", "memberId")
.addSelect("member.salutation", "memberSalutation")
.addSelect("member.firstname", "memberFirstname") .addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname") .addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate") .addSelect("member.birthdate", "memberBirthdate")
.addSelect("salutation.salutation", "memberSalutation")
.addSelect( .addSelect(
"SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))", "SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))",
"durationInDays" "durationInDays"
) )
.leftJoin("memberExecutivePositions.executivePosition", "executivePosition") .leftJoin("memberExecutivePositions.executivePosition", "executivePosition")
.leftJoin("memberExecutivePositions.member", "member") .leftJoin("memberExecutivePositions.member", "member")
.leftJoin("member.salutation", "salutation") .groupBy("executivePosition.id"),
.groupBy("executivePosition.id")
.addGroupBy("member.id"),
}) })
export class memberExecutivePositionsView { export class memberExecutivePositionsView {
@ViewColumn() @ViewColumn()
@ -38,7 +37,7 @@ export class memberExecutivePositionsView {
memberId: number; memberId: number;
@ViewColumn() @ViewColumn()
memberSalutation: string; memberSalutation: Salutation;
@ViewColumn() @ViewColumn()
memberFirstname: string; memberFirstname: string;

View file

@ -1,5 +1,6 @@
import { DataSource, ViewColumn, ViewEntity } from "typeorm"; import { DataSource, ViewColumn, ViewEntity } from "typeorm";
import { memberQualifications } from "../entity/club/member/memberQualifications"; import { memberQualifications } from "../entity/club/member/memberQualifications";
import { Salutation } from "../enums/salutation";
@ViewEntity({ @ViewEntity({
expression: (datasource: DataSource) => expression: (datasource: DataSource) =>
@ -9,20 +10,18 @@ import { memberQualifications } from "../entity/club/member/memberQualifications
.select("qualification.id", "qualificationId") .select("qualification.id", "qualificationId")
.addSelect("qualification.qualification", "qualification") .addSelect("qualification.qualification", "qualification")
.addSelect("member.id", "memberId") .addSelect("member.id", "memberId")
.addSelect("member.salutation", "memberSalutation")
.addSelect("member.firstname", "memberFirstname") .addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname") .addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate") .addSelect("member.birthdate", "memberBirthdate")
.addSelect("salutation.salutation", "memberSalutation")
.addSelect( .addSelect(
"SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))", "SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))",
"durationInDays" "durationInDays"
) )
.leftJoin("memberQualifications.qualification", "qualification") .leftJoin("memberQualifications.qualification", "qualification")
.leftJoin("memberQualifications.member", "member") .leftJoin("memberQualifications.member", "member")
.leftJoin("member.salutation", "salutation") .groupBy("qualification.id"),
.groupBy("qualification.id")
.addGroupBy("member.id"),
}) })
export class memberQualificationsView { export class memberQualificationsView {
@ViewColumn() @ViewColumn()
@ -38,7 +37,7 @@ export class memberQualificationsView {
memberId: number; memberId: number;
@ViewColumn() @ViewColumn()
memberSalutation: string; memberSalutation: Salutation;
@ViewColumn() @ViewColumn()
memberFirstname: string; memberFirstname: string;

View file

@ -1,5 +1,6 @@
import { DataSource, ViewColumn, ViewEntity } from "typeorm"; import { DataSource, ViewColumn, ViewEntity } from "typeorm";
import { member } from "../entity/club/member/member"; import { member } from "../entity/club/member/member";
import { Salutation } from "../enums/salutation";
@ViewEntity({ @ViewEntity({
expression: (datasource: DataSource) => expression: (datasource: DataSource) =>
@ -7,22 +8,21 @@ import { member } from "../entity/club/member/member";
.getRepository(member) .getRepository(member)
.createQueryBuilder("member") .createQueryBuilder("member")
.select("member.id", "id") .select("member.id", "id")
.addSelect("member.salutation", "salutation")
.addSelect("member.firstname", "firstname") .addSelect("member.firstname", "firstname")
.addSelect("member.lastname", "lastname") .addSelect("member.lastname", "lastname")
.addSelect("member.nameaffix", "nameaffix") .addSelect("member.nameaffix", "nameaffix")
.addSelect("member.birthdate", "birthdate") .addSelect("member.birthdate", "birthdate")
.addSelect("salutation.salutation", "salutation")
.addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge")
.addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear") .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear")
.addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge") .addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge"),
.leftJoin("member.salutation", "salutation"),
}) })
export class memberView { export class memberView {
@ViewColumn() @ViewColumn()
id: number; id: number;
@ViewColumn() @ViewColumn()
salutation: string; salutation: Salutation;
@ViewColumn() @ViewColumn()
firstname: string; firstname: string;

View file

@ -1,5 +1,6 @@
import { DataSource, ViewColumn, ViewEntity } from "typeorm"; import { DataSource, ViewColumn, ViewEntity } from "typeorm";
import { membership } from "../entity/club/member/membership"; import { membership } from "../entity/club/member/membership";
import { Salutation } from "../enums/salutation";
@ViewEntity({ @ViewEntity({
expression: (datasource: DataSource) => expression: (datasource: DataSource) =>
@ -9,11 +10,11 @@ import { membership } from "../entity/club/member/membership";
.select("status.id", "statusId") .select("status.id", "statusId")
.addSelect("status.status", "status") .addSelect("status.status", "status")
.addSelect("member.id", "memberId") .addSelect("member.id", "memberId")
.addSelect("member.salutation", "memberSalutation")
.addSelect("member.firstname", "memberFirstname") .addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname") .addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix") .addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate") .addSelect("member.birthdate", "memberBirthdate")
.addSelect("salutation.salutation", "memberSalutation")
.addSelect("SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", "durationInDays") .addSelect("SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", "durationInDays")
.addSelect( .addSelect(
"CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))", "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.status", "status")
.leftJoin("membership.member", "member") .leftJoin("membership.member", "member")
.leftJoin("member.salutation", "salutation")
.groupBy("status.id") .groupBy("status.id")
.addGroupBy("member.id"), .addGroupBy("member.id"),
}) })
@ -42,7 +42,7 @@ export class membershipView {
memberId: number; memberId: number;
@ViewColumn() @ViewColumn()
memberSalutation: string; memberSalutation: Salutation;
@ViewColumn() @ViewColumn()
memberFirstname: string; memberFirstname: string;