From 6ea1c02a4492e1ce3bfd779c305af6a9cb9dfbe1 Mon Sep 17 00:00:00 2001 From: Narul Hidayah Date: Fri, 2 Jan 2026 03:33:21 +0700 Subject: [PATCH] leave --- src/entity/hrms/hrms_leave.ts | 70 ++++++++++++++++++++++++++ src/entity/hrms/hrms_leave_approval.ts | 64 +++++++++++++++++++++++ src/entity/hrms/hrms_leave_document.ts | 29 +++++++++++ src/schema/hrms.ts | 3 ++ 4 files changed, 166 insertions(+) create mode 100644 src/entity/hrms/hrms_leave.ts create mode 100644 src/entity/hrms/hrms_leave_approval.ts create mode 100644 src/entity/hrms/hrms_leave_document.ts diff --git a/src/entity/hrms/hrms_leave.ts b/src/entity/hrms/hrms_leave.ts new file mode 100644 index 0000000..b20024a --- /dev/null +++ b/src/entity/hrms/hrms_leave.ts @@ -0,0 +1,70 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + DeleteDateColumn, + ManyToOne, + JoinColumn, + OneToMany, +} from "typeorm"; +import { Status } from "../../types/status"; +import { HrmsEmployee } from "./hrms_employee"; +import { HrmsLeaveType } from "./hrms_leave_type"; +import { HrmsLeaveApproval } from "./hrms_leave_approval"; +import { HrmsLeaveDocument } from "./hrms_leave_document"; + +@Entity("hrms_leaves", { schema: "hrms" }) +export class HrmsLeave { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => HrmsEmployee, { onDelete: "RESTRICT", nullable: false }) + @JoinColumn({ name: "employee_id" }) + employee: HrmsEmployee; + + @ManyToOne(() => HrmsLeaveType, { onDelete: "RESTRICT", nullable: false }) + @JoinColumn({ name: "leave_type_id" }) + leave_type: HrmsLeaveType; + + @Column({ type: "date", nullable: false }) + start_date: Date; + + @Column({ type: "date", nullable: false }) + end_date: Date; + + @Column({ type: "int", nullable: false }) + duration_days: number; + + @Column({ length: 512, nullable: true }) + reason: string; + + @Column({ length: 64, nullable: false }) + status: Status; + + @OneToMany(() => HrmsLeaveApproval, approval => approval.leave, { cascade: true }) + approvals: HrmsLeaveApproval[]; + + @OneToMany(() => HrmsLeaveDocument, document => document.leave, { cascade: true }) + documents: HrmsLeaveDocument[]; + + @CreateDateColumn() + created_at: Date; + + @Column({ nullable: true, length: 256 }) + created_by: string; + + @UpdateDateColumn({ nullable: true }) + updated_at: Date; + + @Column({ nullable: true, length: 256 }) + updated_by: string; + + @DeleteDateColumn({ nullable: true }) + deleted_at: Date; + + @Column({ nullable: true, length: 256 }) + deleted_by: string; +} + diff --git a/src/entity/hrms/hrms_leave_approval.ts b/src/entity/hrms/hrms_leave_approval.ts new file mode 100644 index 0000000..9c4110d --- /dev/null +++ b/src/entity/hrms/hrms_leave_approval.ts @@ -0,0 +1,64 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + ManyToOne, + JoinColumn, +} from "typeorm"; +import { HrmsLeave } from "./hrms_leave"; +import { HrmsEmployee } from "./hrms_employee"; + +export enum ApprovalType { + SPV = "SPV", + HR = "HR", +} + +export enum ApprovalStatus { + PENDING = "PENDING", + APPROVED = "APPROVED", + REJECTED = "REJECTED", +} + +@Entity("hrms_leave_approvals", { schema: "hrms" }) +export class HrmsLeaveApproval { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => HrmsLeave, leave => leave.approvals, { onDelete: "CASCADE", nullable: false }) + @JoinColumn({ name: "leave_id" }) + leave: HrmsLeave; + + @Column({ + type: "enum", + enum: ApprovalType, + nullable: false, + }) + approval_type: ApprovalType; + + @ManyToOne(() => HrmsEmployee, { onDelete: "RESTRICT", nullable: false }) + @JoinColumn({ name: "approver_id" }) + approver: HrmsEmployee; + + @Column({ + type: "enum", + enum: ApprovalStatus, + default: ApprovalStatus.PENDING, + nullable: false, + }) + status: ApprovalStatus; + + @Column({ type: "timestamp", nullable: true }) + approved_at: Date; + + @Column({ length: 512, nullable: true }) + notes: string; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn({ nullable: true }) + updated_at: Date; +} + diff --git a/src/entity/hrms/hrms_leave_document.ts b/src/entity/hrms/hrms_leave_document.ts new file mode 100644 index 0000000..70cfc99 --- /dev/null +++ b/src/entity/hrms/hrms_leave_document.ts @@ -0,0 +1,29 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + ManyToOne, + JoinColumn, +} from "typeorm"; +import { HrmsLeave } from "./hrms_leave"; + +@Entity("hrms_leave_documents", { schema: "hrms" }) +export class HrmsLeaveDocument { + @PrimaryGeneratedColumn("uuid") + id: string; + + @ManyToOne(() => HrmsLeave, leave => leave.documents, { onDelete: "CASCADE", nullable: false }) + @JoinColumn({ name: "leave_id" }) + leave: HrmsLeave; + + @Column({ length: 256, nullable: false }) + document_name: string; + + @Column({ length: 512, nullable: false }) + document_url: string; + + @CreateDateColumn() + created_at: Date; +} + diff --git a/src/schema/hrms.ts b/src/schema/hrms.ts index e30ea55..13d4b1b 100644 --- a/src/schema/hrms.ts +++ b/src/schema/hrms.ts @@ -11,5 +11,8 @@ export * from "../entity/hrms/hrms_training_participant"; export * from "../entity/hrms/hrms_bank"; export * from "../entity/hrms/hrms_payroll"; export * from "../entity/hrms/hrms_payroll_monthly"; +export * from "../entity/hrms/hrms_leave"; +export * from "../entity/hrms/hrms_leave_approval"; +export * from "../entity/hrms/hrms_leave_document"; export * from "../types/hrms";