import { DataSource, ViewColumn, ViewEntity } from "typeorm"; import { memberQualifications } from "../entity/club/member/memberQualifications"; import { DB_TYPE } from "../env.defaults"; let durationInDays: string; let durationInYears: string; let exactDuration: string; if (DB_TYPE == "postgres") { durationInDays = `SUM(COALESCE("memberQualifications"."end", CURRENT_DATE) - "memberQualifications"."start") `; durationInYears = `SUM(EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM member.birthdate))`; exactDuration = `SUM(AGE(COALESCE("memberQualifications"."end", CURRENT_DATE), "memberQualifications"."start"))`; } else if (DB_TYPE == "mysql") { durationInDays = `SUM(DATEDIFF(COALESCE(memberQualifications.end, CURDATE()), memberQualifications.start))`; durationInYears = `SUM(TIMESTAMPDIFF(YEAR, memberQualifications.start, COALESCE(memberQualifications.end, CURDATE())))`; exactDuration = ` CONCAT( SUM(FLOOR(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURDATE())) / 365.25)), ' years ', SUM(FLOOR(MOD(TIMESTAMPDIFF(MONTH, memberQualifications.start, COALESCE(memberQualifications.end, CURDATE())), 12))), ' months ', SUM(FLOOR(MOD(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURDATE())), 30))), ' days' ) `; } else if (DB_TYPE == "sqlite") { durationInDays = `SUM(JULIANDAY(COALESCE(memberQualifications.end, DATE('now'))) - JULIANDAY(memberQualifications.start))`; durationInYears = `SUM(FLOOR((JULIANDAY(COALESCE(memberQualifications.end, DATE('now'))) - JULIANDAY(memberQualifications.start)) / 365.25))`; exactDuration = ` SUM((strftime('%Y', COALESCE(memberQualifications.end, DATE('now'))) - strftime('%Y', memberQualifications.start))) || ' years ' || SUM((strftime('%m', COALESCE(memberQualifications.end, DATE('now'))) - strftime('%m', memberQualifications.start))) || ' months ' || SUM((strftime('%d', COALESCE(memberQualifications.end, DATE('now'))) - strftime('%d', memberQualifications.start))) || ' days' `; } @ViewEntity({ 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(durationInDays, "durationInDays") .addSelect(durationInYears, "durationInYears") .addSelect(exactDuration, "exactDuration") .leftJoin("memberQualifications.qualification", "qualification") .leftJoin("memberQualifications.member", "member") .leftJoin("member.salutation", "salutation") .groupBy("qualification.id") .addGroupBy("member.id") .addGroupBy("salutation.id"), }) export class memberQualificationsView { @ViewColumn() durationInDays: number; @ViewColumn() durationInYears: number; @ViewColumn() exactDuration: string; @ViewColumn() qualification: string; @ViewColumn() qualificationId: number; @ViewColumn() memberId: string; @ViewColumn() memberSalutation: string; @ViewColumn() memberFirstname: string; @ViewColumn() memberLastname: string; @ViewColumn() memberNameaffix: string; @ViewColumn() memberBirthdate: Date; }