import { Table, TableForeignKey, View } from "typeorm"; import { getTypeByORM } from "../ormHelper"; export const salutation_table = new Table({ name: "salutation", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "salutation", type: getTypeByORM("varchar"), length: "255", isUnique: true, isNullable: false }, ], }); export const award_table = new Table({ name: "award", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "award", type: getTypeByORM("varchar"), length: "255", isUnique: true, isNullable: false }, ], }); export const communication_type_table = new Table({ name: "communication_type", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "type", type: getTypeByORM("varchar"), length: "255", isUnique: true, isNullable: false }, { name: "useColumns", type: getTypeByORM("varchar"), length: "255", isNullable: false, default: "''" }, ], }); export const executive_position_table = new Table({ name: "executive_position", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "position", type: getTypeByORM("varchar"), length: "255", isUnique: true, isNullable: false }, ], }); export const membership_status_table = new Table({ name: "membership_status", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "status", type: getTypeByORM("varchar"), length: "255", isUnique: true, isNullable: false }, ], }); export const qualification_table = new Table({ name: "qualification", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "qualification", type: getTypeByORM("varchar"), length: "255", isUnique: true, isNullable: false }, { name: "description", type: getTypeByORM("varchar"), length: "255", isNullable: true }, ], }); /** member and relations */ export const member_table = new Table({ name: "member", columns: [ { name: "id", type: getTypeByORM("varchar"), length: "36", isPrimary: true, isGenerated: true, generationStrategy: "uuid", }, { name: "salutationId", type: getTypeByORM("int"), isNullable: false }, { name: "internalId", type: getTypeByORM("varchar"), length: "255", default: null, isNullable: true, isUnique: true, }, { name: "firstname", type: getTypeByORM("varchar"), length: "255", isNullable: false }, { name: "lastname", type: getTypeByORM("varchar"), length: "255", isNullable: false }, { name: "nameaffix", type: getTypeByORM("varchar"), length: "255", isNullable: false }, { name: "birthdate", type: getTypeByORM("date"), isNullable: false }, ], foreignKeys: [ new TableForeignKey({ columnNames: ["salutationId"], referencedColumnNames: ["id"], referencedTableName: "salutation", onDelete: "RESTRICT", onUpdate: "RESTRICT", }), ], }); export const membership_table = new Table({ name: "membership", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "start", type: getTypeByORM("date"), isNullable: false }, { name: "end", type: getTypeByORM("date"), isNullable: true }, { name: "terminationReason", type: getTypeByORM("varchar"), length: "255", isNullable: true }, { name: "memberId", type: getTypeByORM("varchar"), isNullable: false }, { name: "statusId", type: getTypeByORM("int"), isNullable: false }, ], foreignKeys: [ new TableForeignKey({ columnNames: ["memberId"], referencedTableName: "member", referencedColumnNames: ["id"], onDelete: "CASCADE", onUpdate: "RESTRICT", }), new TableForeignKey({ columnNames: ["statusId"], referencedTableName: "membership_status", referencedColumnNames: ["id"], onDelete: "RESTRICT", onUpdate: "RESTRICT", }), ], }); export const member_qualifications_table = new Table({ name: "member_qualifications", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "note", type: getTypeByORM("varchar"), length: "255", isNullable: true }, { name: "start", type: getTypeByORM("date"), isNullable: false }, { name: "end", type: getTypeByORM("date"), isNullable: true }, { name: "terminationReason", type: getTypeByORM("varchar"), length: "255", isNullable: true }, { name: "memberId", type: getTypeByORM("varchar"), isNullable: false }, { name: "qualificationId", type: getTypeByORM("int"), isNullable: false }, ], foreignKeys: [ new TableForeignKey({ columnNames: ["memberId"], referencedTableName: "member", referencedColumnNames: ["id"], onDelete: "CASCADE", onUpdate: "RESTRICT", }), new TableForeignKey({ columnNames: ["qualificationId"], referencedTableName: "qualification", referencedColumnNames: ["id"], onDelete: "RESTRICT", onUpdate: "RESTRICT", }), ], }); export const member_executive_positions_table = new Table({ name: "member_executive_positions", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "note", type: getTypeByORM("varchar"), length: "255", isNullable: true }, { name: "start", type: getTypeByORM("date"), isNullable: false }, { name: "end", type: getTypeByORM("date"), isNullable: true }, { name: "memberId", type: getTypeByORM("varchar"), isNullable: false }, { name: "executivePositionId", type: getTypeByORM("int"), isNullable: false }, ], foreignKeys: [ new TableForeignKey({ columnNames: ["memberId"], referencedTableName: "member", referencedColumnNames: ["id"], onDelete: "CASCADE", onUpdate: "RESTRICT", }), new TableForeignKey({ columnNames: ["executivePositionId"], referencedTableName: "executive_position", referencedColumnNames: ["id"], onDelete: "RESTRICT", onUpdate: "RESTRICT", }), ], }); export const member_awards_table = new Table({ name: "member_awards", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "given", type: getTypeByORM("boolean"), default: false, isNullable: false }, { name: "note", type: getTypeByORM("varchar"), length: "255", isNullable: true }, { name: "date", type: getTypeByORM("date"), isNullable: false }, { name: "memberId", type: getTypeByORM("varchar"), isNullable: false }, { name: "awardId", type: getTypeByORM("int"), isNullable: false }, ], foreignKeys: [ new TableForeignKey({ columnNames: ["memberId"], referencedTableName: "member", referencedColumnNames: ["id"], onDelete: "CASCADE", onUpdate: "RESTRICT", }), new TableForeignKey({ columnNames: ["awardId"], referencedTableName: "award", referencedColumnNames: ["id"], onDelete: "RESTRICT", onUpdate: "RESTRICT", }), ], }); export const member_communication_table = new Table({ name: "communication", columns: [ { name: "id", type: getTypeByORM("int"), isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "preferred", type: getTypeByORM("boolean"), isNullable: false, default: false }, { name: "isSendNewsletter", type: getTypeByORM("boolean"), isNullable: false, default: false }, { name: "isSMSAlarming", type: getTypeByORM("boolean"), isNullable: false, default: false }, { name: "mobile", type: getTypeByORM("varchar"), length: "255", isNullable: true }, { name: "email", type: getTypeByORM("varchar"), length: "255", isNullable: true }, { name: "postalCode", type: getTypeByORM("varchar"), length: "255", default: null, isNullable: true }, { name: "city", type: getTypeByORM("varchar"), length: "255", isNullable: true }, { name: "street", type: getTypeByORM("varchar"), length: "255", isNullable: true }, { name: "streetNumber", type: getTypeByORM("int"), isNullable: true }, { name: "streetNumberAddition", type: getTypeByORM("varchar"), length: "255", isNullable: true }, { name: "memberId", type: getTypeByORM("varchar"), isNullable: false }, { name: "typeId", type: getTypeByORM("int"), isNullable: false }, ], foreignKeys: [ new TableForeignKey({ columnNames: ["memberId"], referencedTableName: "member", referencedColumnNames: ["id"], onDelete: "CASCADE", onUpdate: "RESTRICT", }), new TableForeignKey({ columnNames: ["typeId"], referencedColumnNames: ["id"], referencedTableName: "communication_type", onDelete: "RESTRICT", onUpdate: "RESTRICT", }), ], }); /** views */ export const member_view = new View({ name: "member_view", expression: ` SELECT \`member\`.\`id\` AS \`id\`, \`member\`.\`firstname\` AS \`firstname\`, \`member\`.\`lastname\` AS \`lastname\`, \`member\`.\`nameaffix\` AS \`nameaffix\`, \`member\`.\`birthdate\` AS \`birthdate\`, \`salutation\`.\`salutation\` AS \`salutation\`, TIMESTAMPDIFF(YEAR, \`member\`.\`birthdate\`, CURDATE()) AS \`todayAge\`, YEAR(CURDATE()) - YEAR(\`member\`.\`birthdate\`) AS \`ageThisYear\`, CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, \`member\`.\`birthdate\`, CURDATE()))) AS \`exactAge\` FROM \`member\` \`member\` LEFT JOIN \`salutation\` \`salutation\` ON \`salutation\`.\`id\`=\`member\`.\`salutationId\` `, }); export const member_executive_positions_view = new View({ name: "member_executive_positions_view", expression: ` SELECT \`executivePosition\`.\`id\` AS \`positionId\`, \`executivePosition\`.\`position\` AS \`position\`, \`member\`.\`id\` AS \`memberId\`, \`member\`.\`firstname\` AS \`memberFirstname\`, \`member\`.\`lastname\` AS \`memberLastname\`, \`member\`.\`nameaffix\` AS \`memberNameaffix\`, \`member\`.\`birthdate\` AS \`memberBirthdate\`, \`salutation\`.\`salutation\` AS \`memberSalutation\`, SUM(TIMESTAMPDIFF(DAY, \`memberExecutivePositions\`.\`start\`, COALESCE(\`memberExecutivePositions\`.\`end\`, CURRENT_DATE))) AS \`durationInDays\` FROM \`member_executive_positions\` \`memberExecutivePositions\` LEFT JOIN \`executive_position\` \`executivePosition\` ON \`executivePosition\`.\`id\`=\`memberExecutivePositions\`.\`executivePositionId\` LEFT JOIN \`member\` \`member\` ON \`member\`.\`id\`=\`memberExecutivePositions\`.\`memberId\` LEFT JOIN \`salutation\` \`salutation\` ON \`salutation\`.\`id\`=\`member\`.\`salutationId\` GROUP BY \`executivePosition\`.\`id\`, \`member\`.\`id\` `, }); export const member_qualifications_view = new View({ name: "member_qualifications_view", expression: ` SELECT \`qualification\`.\`id\` AS \`qualificationId\`, \`qualification\`.\`qualification\` AS \`qualification\`, \`member\`.\`id\` AS \`memberId\`, \`member\`.\`firstname\` AS \`memberFirstname\`, \`member\`.\`lastname\` AS \`memberLastname\`, \`member\`.\`nameaffix\` AS \`memberNameaffix\`, \`member\`.\`birthdate\` AS \`memberBirthdate\`, \`salutation\`.\`salutation\` AS \`memberSalutation\`, SUM(TIMESTAMPDIFF(DAY, \`memberQualifications\`.\`start\`, COALESCE(\`memberQualifications\`.\`end\`, CURRENT_DATE))) AS \`durationInDays\` FROM \`member_qualifications\` \`memberQualifications\` LEFT JOIN \`qualification\` \`qualification\` ON \`qualification\`.\`id\`=\`memberQualifications\`.\`qualificationId\` LEFT JOIN \`member\` \`member\` ON \`member\`.\`id\`=\`memberQualifications\`.\`memberId\` LEFT JOIN \`salutation\` \`salutation\` ON \`salutation\`.\`id\`=\`member\`.\`salutationId\` GROUP BY \`qualification\`.\`id\`, \`member\`.\`id\` `, }); export const membership_view = new View({ name: "membership_view", expression: ` SELECT \`status\`.\`id\` AS \`statusId\`, \`status\`.\`status\` AS \`status\`, \`member\`.\`id\` AS \`memberId\`, \`member\`.\`firstname\` AS \`memberFirstname\`, \`member\`.\`lastname\` AS \`memberLastname\`, \`member\`.\`nameaffix\` AS \`memberNameaffix\`, \`member\`.\`birthdate\` AS \`memberBirthdate\`, \`salutation\`.\`salutation\` AS \`memberSalutation\`, SUM(TIMESTAMPDIFF(DAY, \`membership\`.\`start\`, COALESCE(\`membership\`.\`end\`, CURRENT_DATE))) AS \`durationInDays\`, CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, \`membership\`.\`start\`, COALESCE(\`membership\`.\`end\`, CURRENT_DATE))))) AS \`durationInYears\` FROM \`membership\` \`membership\` LEFT JOIN \`membership_status\` \`status\` ON \`status\`.\`id\`=\`membership\`.\`statusId\` LEFT JOIN \`member\` \`member\` ON \`member\`.\`id\`=\`membership\`.\`memberId\` LEFT JOIN \`salutation\` \`salutation\` ON \`salutation\`.\`id\`=\`member\`.\`salutationId\` GROUP BY \`status\`.\`id\`, \`member\`.\`id\` `, });