change salutation to separate table

This commit is contained in:
Julian Krauser 2025-01-25 10:20:57 +01:00
parent ff651b7d8f
commit 21cf811a56
17 changed files with 64 additions and 61 deletions

View file

@ -1,7 +1,5 @@
import { Salutation } from "../../../enums/salutation";
export interface CreateMemberCommand { export interface CreateMemberCommand {
salutation: Salutation; salutationId: number;
firstname: string; firstname: string;
lastname: string; lastname: string;
nameaffix: string; nameaffix: string;
@ -11,7 +9,7 @@ export interface CreateMemberCommand {
export interface UpdateMemberCommand { export interface UpdateMemberCommand {
id: number; id: number;
salutation: Salutation; salutationId: number;
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({
salutation: createMember.salutation, salutationId: createMember.salutationId,
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({
salutation: updateMember.salutation, salutationId: updateMember.salutationId,
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 salutation = req.body.salutation; const salutationId = req.body.salutationId;
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 = {
salutation, salutationId,
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 salutation = req.body.salutation; const salutationId = req.body.salutationId;
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,
salutation, salutationId,
firstname, firstname,
lastname, lastname,
nameaffix, nameaffix,

View file

@ -21,7 +21,6 @@ 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
@ -142,7 +141,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: Salutation.none, salutation: "Anrede",
nameaffix: "", nameaffix: "",
street: "Straße", street: "Straße",
streetNumber: "Hausnummer", streetNumber: "Hausnummer",
@ -248,7 +247,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: Salutation.none, salutation: "Anrede",
nameaffix: "", nameaffix: "",
street: "Straße", street: "Straße",
streetNumber: "Hausnummer", streetNumber: "Hausnummer",

View file

@ -71,6 +71,7 @@ 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";
const dataSource = new DataSource({ const dataSource = new DataSource({
type: DB_TYPE as any, type: DB_TYPE as any,
@ -96,6 +97,7 @@ const dataSource = new DataSource({
executivePosition, executivePosition,
membershipStatus, membershipStatus,
qualification, qualification,
salutation,
member, member,
memberAwards, memberAwards,
memberExecutivePositions, memberExecutivePositions,

View file

@ -1,6 +1,5 @@
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;
@ -18,7 +17,9 @@ export const newsletterDemoData: {
} }
> >
>; >;
recipient: Partial<member & { street: string; streetNumber: string; streetNumberAdd: string }>; recipient: Partial<
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.",
@ -63,7 +64,7 @@ export const newsletterDemoData: {
recipient: { recipient: {
firstname: "Julian", firstname: "Julian",
lastname: "Krauser", lastname: "Krauser",
salutation: Salutation.sir, salutation: "Herr",
nameaffix: "", nameaffix: "",
street: "Straße", street: "Straße",
streetNumber: "Hausnummer", streetNumber: "Hausnummer",

View file

@ -1,32 +1,16 @@
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 { CommunicationViewModel } from "../../../viewmodel/admin/club/member/communication.models"; import { salutation } from "../../settings/salutation";
@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;
@ -42,6 +26,9 @@ 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[];
@ -53,6 +40,9 @@ 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

@ -0,0 +1,15 @@
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[];
}

View file

@ -1,6 +0,0 @@
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: recipient.salutation.salutation,
nameaffix: recipient.nameaffix, nameaffix: recipient.nameaffix,
...(showAdress ...(showAdress
? { ? {

View file

@ -1,10 +1,10 @@
import { Salutation } from "../../../../enums/salutation"; import { SalutationViewModel } from "../../settings/salutation.models";
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: Salutation; salutation: SalutationViewModel;
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: Salutation; salutation: string;
firstname: string; firstname: string;
lastname: string; lastname: string;
nameaffix: string; nameaffix: string;

View file

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

View file

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

View file

@ -1,6 +1,5 @@
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) =>
@ -10,18 +9,20 @@ import { Salutation } from "../enums/salutation";
.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")
.groupBy("executivePosition.id"), .leftJoin("member.salutation", "salutation")
.groupBy("executivePosition.id")
.addGroupBy("member.id"),
}) })
export class memberExecutivePositionsView { export class memberExecutivePositionsView {
@ViewColumn() @ViewColumn()
@ -37,7 +38,7 @@ export class memberExecutivePositionsView {
memberId: number; memberId: number;
@ViewColumn() @ViewColumn()
memberSalutation: Salutation; memberSalutation: string;
@ViewColumn() @ViewColumn()
memberFirstname: string; memberFirstname: string;

View file

@ -1,6 +1,5 @@
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) =>
@ -10,18 +9,20 @@ import { Salutation } from "../enums/salutation";
.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")
.groupBy("qualification.id"), .leftJoin("member.salutation", "salutation")
.groupBy("qualification.id")
.addGroupBy("member.id"),
}) })
export class memberQualificationsView { export class memberQualificationsView {
@ViewColumn() @ViewColumn()
@ -37,7 +38,7 @@ export class memberQualificationsView {
memberId: number; memberId: number;
@ViewColumn() @ViewColumn()
memberSalutation: Salutation; memberSalutation: string;
@ViewColumn() @ViewColumn()
memberFirstname: string; memberFirstname: string;

View file

@ -1,6 +1,5 @@
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) =>
@ -8,21 +7,22 @@ import { Salutation } from "../enums/salutation";
.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: Salutation; salutation: string;
@ViewColumn() @ViewColumn()
firstname: string; firstname: string;

View file

@ -1,6 +1,5 @@
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) =>
@ -10,11 +9,11 @@ import { Salutation } from "../enums/salutation";
.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)))))",
@ -22,6 +21,7 @@ import { Salutation } from "../enums/salutation";
) )
.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: Salutation; memberSalutation: string;
@ViewColumn() @ViewColumn()
memberFirstname: string; memberFirstname: string;