Merge pull request 'feature/#32-Membership-statistics' (#47) from feature/#32-Membership-statistics into main
Reviewed-on: #47
This commit is contained in:
commit
c621c46a44
10 changed files with 192 additions and 36 deletions
|
@ -90,6 +90,19 @@ export async function getMemberById(req: Request, res: Response): Promise<any> {
|
||||||
res.json(MemberFactory.mapToSingle(member));
|
res.json(MemberFactory.mapToSingle(member));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description get member statistics by id
|
||||||
|
* @param req {Request} Express req object
|
||||||
|
* @param res {Response} Express res object
|
||||||
|
* @returns {Promise<*>}
|
||||||
|
*/
|
||||||
|
export async function getMemberStatisticsById(req: Request, res: Response): Promise<any> {
|
||||||
|
const memberId = parseInt(req.params.id);
|
||||||
|
let member = await MemberService.getStatisticsById(memberId);
|
||||||
|
|
||||||
|
res.json(MemberFactory.mapToMemberStatistic(member));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description get memberships by member
|
* @description get memberships by member
|
||||||
* @param req {Request} Express req object
|
* @param req {Request} Express req object
|
||||||
|
@ -103,6 +116,19 @@ export async function getMembershipsByMember(req: Request, res: Response): Promi
|
||||||
res.json(MembershipFactory.mapToBase(memberships));
|
res.json(MembershipFactory.mapToBase(memberships));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description get member statistics by id
|
||||||
|
* @param req {Request} Express req object
|
||||||
|
* @param res {Response} Express res object
|
||||||
|
* @returns {Promise<*>}
|
||||||
|
*/
|
||||||
|
export async function getMembershipStatisticsById(req: Request, res: Response): Promise<any> {
|
||||||
|
const memberId = parseInt(req.params.memberId);
|
||||||
|
let member = await MembershipService.getStatisticsById(memberId);
|
||||||
|
|
||||||
|
res.json(MembershipFactory.mapToBaseStatistics(member));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description get membership by member and record
|
* @description get membership by member and record
|
||||||
* @param req {Request} Express req object
|
* @param req {Request} Express req object
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { member } from "../../../../entity/club/member/member";
|
import { member } from "../../../../entity/club/member/member";
|
||||||
import { MemberViewModel } from "../../../../viewmodel/admin/club/member/member.models";
|
import { MemberStatisticsViewModel, MemberViewModel } from "../../../../viewmodel/admin/club/member/member.models";
|
||||||
|
import { memberView } from "../../../../views/memberView";
|
||||||
import CommunicationFactory from "./communication";
|
import CommunicationFactory from "./communication";
|
||||||
import MembershipFactory from "./membership";
|
import MembershipFactory from "./membership";
|
||||||
|
|
||||||
|
@ -40,4 +41,23 @@ export default abstract class MemberFactory {
|
||||||
public static mapToBase(records: Array<member>): Array<MemberViewModel> {
|
public static mapToBase(records: Array<member>): Array<MemberViewModel> {
|
||||||
return records.map((r) => this.mapToSingle(r));
|
return records.map((r) => this.mapToSingle(r));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description map view record to MemberMembershipStatisticsViewModel
|
||||||
|
* @param {memberView} record
|
||||||
|
* @returns {MemberStatisticsViewModel}
|
||||||
|
*/
|
||||||
|
public static mapToMemberStatistic(record: memberView): MemberStatisticsViewModel {
|
||||||
|
return {
|
||||||
|
id: record.id,
|
||||||
|
salutation: record.salutation,
|
||||||
|
firstname: record.firstname,
|
||||||
|
lastname: record.lastname,
|
||||||
|
nameaffix: record.nameaffix,
|
||||||
|
birthdate: record.birthdate,
|
||||||
|
todayAge: record.todayAge,
|
||||||
|
ageThisYear: record.ageThisYear,
|
||||||
|
exactAge: record.exactAge,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
import { membership } from "../../../../entity/club/member/membership";
|
import { membership } from "../../../../entity/club/member/membership";
|
||||||
import { MembershipViewModel } from "../../../../viewmodel/admin/club/member/membership.models";
|
import {
|
||||||
|
MembershipStatisticsViewModel,
|
||||||
|
MembershipViewModel,
|
||||||
|
} from "../../../../viewmodel/admin/club/member/membership.models";
|
||||||
|
import { membershipView } from "../../../../views/membershipsView";
|
||||||
|
|
||||||
export default abstract class MembershipFactory {
|
export default abstract class MembershipFactory {
|
||||||
/**
|
/**
|
||||||
|
@ -26,4 +30,33 @@ export default abstract class MembershipFactory {
|
||||||
public static mapToBase(records: Array<membership>): Array<MembershipViewModel> {
|
public static mapToBase(records: Array<membership>): Array<MembershipViewModel> {
|
||||||
return records.map((r) => this.mapToSingle(r));
|
return records.map((r) => this.mapToSingle(r));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description map view record to MembershipStatisticsViewModel
|
||||||
|
* @param {membershipView} record
|
||||||
|
* @returns {MembershipStatisticsViewModel}
|
||||||
|
*/
|
||||||
|
public static mapToSingleStatistic(record: membershipView): MembershipStatisticsViewModel {
|
||||||
|
return {
|
||||||
|
durationInDays: record.durationInDays,
|
||||||
|
durationInYears: record.durationInYears,
|
||||||
|
status: record.status,
|
||||||
|
statusId: record.statusId,
|
||||||
|
memberId: record.memberId,
|
||||||
|
memberSalutation: record.memberSalutation,
|
||||||
|
memberFirstname: record.memberFirstname,
|
||||||
|
memberLastname: record.memberLastname,
|
||||||
|
memberNameaffix: record.memberNameaffix,
|
||||||
|
memberBirthdate: record.memberBirthdate,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description map records to MembershipStatisticsViewModel
|
||||||
|
* @param {Array<membershipView>} records
|
||||||
|
* @returns {Array<MembershipStatisticsViewModel>}
|
||||||
|
*/
|
||||||
|
public static mapToBaseStatistics(records: Array<membershipView>): Array<MembershipStatisticsViewModel> {
|
||||||
|
return records.map((r) => this.mapToSingleStatistic(r));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,8 @@ import {
|
||||||
getMemberById,
|
getMemberById,
|
||||||
getMembershipByMemberAndRecord,
|
getMembershipByMemberAndRecord,
|
||||||
getMembershipsByMember,
|
getMembershipsByMember,
|
||||||
|
getMembershipStatisticsById,
|
||||||
|
getMemberStatisticsById,
|
||||||
getQualificationByMemberAndRecord,
|
getQualificationByMemberAndRecord,
|
||||||
getQualificationsByMember,
|
getQualificationsByMember,
|
||||||
updateAwardOfMember,
|
updateAwardOfMember,
|
||||||
|
@ -44,6 +46,10 @@ router.get("/:id", async (req: Request, res: Response) => {
|
||||||
await getMemberById(req, res);
|
await getMemberById(req, res);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
router.get("/:id/statistics", async (req: Request, res: Response) => {
|
||||||
|
await getMemberStatisticsById(req, res);
|
||||||
|
});
|
||||||
|
|
||||||
router.get("/print/namelist", async (req: Request, res: Response) => {
|
router.get("/print/namelist", async (req: Request, res: Response) => {
|
||||||
await createMemberPrintoutList(req, res);
|
await createMemberPrintoutList(req, res);
|
||||||
});
|
});
|
||||||
|
@ -52,6 +58,10 @@ router.get("/:memberId/memberships", async (req: Request, res: Response) => {
|
||||||
await getMembershipsByMember(req, res);
|
await getMembershipsByMember(req, res);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
router.get("/:memberId/memberships/statistics", async (req: Request, res: Response) => {
|
||||||
|
await getMembershipStatisticsById(req, res);
|
||||||
|
});
|
||||||
|
|
||||||
router.get("/:memberId/membership/:id", async (req: Request, res: Response) => {
|
router.get("/:memberId/membership/:id", async (req: Request, res: Response) => {
|
||||||
await getMembershipByMemberAndRecord(req, res);
|
await getMembershipByMemberAndRecord(req, res);
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { dataSource } from "../../../data-source";
|
||||||
import { member } from "../../../entity/club/member/member";
|
import { member } from "../../../entity/club/member/member";
|
||||||
import { membership } from "../../../entity/club/member/membership";
|
import { membership } from "../../../entity/club/member/membership";
|
||||||
import InternalException from "../../../exceptions/internalException";
|
import InternalException from "../../../exceptions/internalException";
|
||||||
|
import { memberView } from "../../../views/memberView";
|
||||||
|
|
||||||
export default abstract class MemberService {
|
export default abstract class MemberService {
|
||||||
/**
|
/**
|
||||||
|
@ -132,6 +133,25 @@ export default abstract class MemberService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description get member statistics by id
|
||||||
|
* @param {number} id
|
||||||
|
* @returns {Promise<memberView>}
|
||||||
|
*/
|
||||||
|
static async getStatisticsById(id: number): Promise<memberView> {
|
||||||
|
return await dataSource
|
||||||
|
.getRepository(memberView)
|
||||||
|
.createQueryBuilder("memberView")
|
||||||
|
.where("memberView.id = :id", { id: id })
|
||||||
|
.getOneOrFail()
|
||||||
|
.then((res) => {
|
||||||
|
return res;
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
throw new InternalException("memberView not found by id", err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description get members where membership is setz
|
* @description get members where membership is setz
|
||||||
* @returns {Promise<member>}
|
* @returns {Promise<member>}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { dataSource } from "../../../data-source";
|
import { dataSource } from "../../../data-source";
|
||||||
import { membership } from "../../../entity/club/member/membership";
|
import { membership } from "../../../entity/club/member/membership";
|
||||||
import InternalException from "../../../exceptions/internalException";
|
import InternalException from "../../../exceptions/internalException";
|
||||||
|
import { membershipView } from "../../../views/membershipsView";
|
||||||
|
|
||||||
export default abstract class MembershipService {
|
export default abstract class MembershipService {
|
||||||
/**
|
/**
|
||||||
|
@ -45,4 +46,23 @@ export default abstract class MembershipService {
|
||||||
throw new InternalException("member membership not found by id", err);
|
throw new InternalException("member membership not found by id", err);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description get membership statistics by memberId
|
||||||
|
* @param {number} memberId
|
||||||
|
* @returns {Promise<Array<membershipView>>}
|
||||||
|
*/
|
||||||
|
static async getStatisticsById(memberId: number): Promise<Array<membershipView>> {
|
||||||
|
return await dataSource
|
||||||
|
.getRepository(membershipView)
|
||||||
|
.createQueryBuilder("membershipView")
|
||||||
|
.where("membershipView.memberId = :memberId", { memberId: memberId })
|
||||||
|
.getMany()
|
||||||
|
.then((res) => {
|
||||||
|
return res;
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
throw new InternalException("membershipView not found by id", err);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,3 +16,15 @@ export interface MemberViewModel {
|
||||||
smsAlarming?: Array<CommunicationViewModel>;
|
smsAlarming?: Array<CommunicationViewModel>;
|
||||||
preferredCommunication?: Array<CommunicationViewModel>;
|
preferredCommunication?: Array<CommunicationViewModel>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface MemberStatisticsViewModel {
|
||||||
|
id: number;
|
||||||
|
salutation: Salutation;
|
||||||
|
firstname: string;
|
||||||
|
lastname: string;
|
||||||
|
nameaffix: string;
|
||||||
|
birthdate: Date;
|
||||||
|
todayAge: number;
|
||||||
|
ageThisYear: number;
|
||||||
|
exactAge: string;
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import { Salutation } from "../../../../enums/salutation";
|
||||||
|
|
||||||
export interface MembershipViewModel {
|
export interface MembershipViewModel {
|
||||||
id: number;
|
id: number;
|
||||||
start: Date;
|
start: Date;
|
||||||
|
@ -6,3 +8,16 @@ export interface MembershipViewModel {
|
||||||
status: string;
|
status: string;
|
||||||
statusId: number;
|
statusId: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface MembershipStatisticsViewModel {
|
||||||
|
durationInDays: number;
|
||||||
|
durationInYears: string;
|
||||||
|
status: string;
|
||||||
|
statusId: number;
|
||||||
|
memberId: number;
|
||||||
|
memberSalutation: Salutation;
|
||||||
|
memberFirstname: string;
|
||||||
|
memberLastname: string;
|
||||||
|
memberNameaffix: string;
|
||||||
|
memberBirthdate: Date;
|
||||||
|
}
|
||||||
|
|
|
@ -43,5 +43,5 @@ export class memberView {
|
||||||
ageThisYear: number;
|
ageThisYear: number;
|
||||||
|
|
||||||
@ViewColumn()
|
@ViewColumn()
|
||||||
exactAge: Date;
|
exactAge: string;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ export class membershipView {
|
||||||
durationInDays: number;
|
durationInDays: number;
|
||||||
|
|
||||||
@ViewColumn()
|
@ViewColumn()
|
||||||
durationInYears: Date;
|
durationInYears: string;
|
||||||
|
|
||||||
@ViewColumn()
|
@ViewColumn()
|
||||||
status: string;
|
status: string;
|
||||||
|
|
Loading…
Reference in a new issue