From 68a72efaedd4492d0105311b5bc4a79b3edbe92b Mon Sep 17 00:00:00 2001 From: fadlydev Date: Sun, 2 Feb 2025 19:43:08 +0700 Subject: [PATCH] update relation submission and request order --- src/entity/request_orders.ts | 87 ++++++++------------------ src/entity/request_submission.ts | 49 +++++---------- src/entity/request_submission_recap.ts | 59 +++++------------ 3 files changed, 57 insertions(+), 138 deletions(-) diff --git a/src/entity/request_orders.ts b/src/entity/request_orders.ts index 8f1103e..5bb8e72 100644 --- a/src/entity/request_orders.ts +++ b/src/entity/request_orders.ts @@ -5,7 +5,10 @@ import { CreateDateColumn, UpdateDateColumn, DeleteDateColumn, + OneToMany, } from 'typeorm'; +import { Goods } from './goods'; +import { RequestSubmission } from './request_submission'; enum ApprovalStatus { PENDING = 'PENDING', @@ -25,100 +28,62 @@ export class RequestOrder { @PrimaryGeneratedColumn('uuid') id: string; - @Column({ - nullable: false, - length: 128, - unique: true, - }) + @Column({ nullable: false, length: 128, unique: true }) order_number: string; - @Column({ - nullable: false, - }) + @Column({ type: 'timestamp', nullable: false }) // Ensuring timestamp type for date storage order_date: Date; - @Column({ - type: 'decimal', - precision: 10, - scale: 2, - nullable: false, - }) + @Column({ type: 'decimal', precision: 10, scale: 2, nullable: false }) total_amount: number; - @Column({ - type: 'varchar', - nullable: false, - }) + @Column({ type: 'varchar', nullable: false }) requested_by: string; - @Column({ - type: 'varchar', - nullable: false, - }) + @Column({ type: 'varchar', nullable: false }) department: string; - @Column({ - type: 'text', - nullable: true, - }) + @Column({ type: 'text', nullable: true }) remarks: string | null; - @Column({ - type: 'enum', - enum: RequestOrderStatus, - nullable: false, - }) + @Column({ type: 'enum', enum: RequestOrderStatus, nullable: false }) status: RequestOrderStatus; - @Column({ - length: 2, - nullable: false, - }) + @Column({ length: 2, nullable: false }) purchasing_method: string; // Supervisor Approval - @Column({ - type: 'uuid', - nullable: true, - }) + @Column({ type: 'uuid', nullable: true }) approved_by_spv: string | null; - @Column({ - type: 'timestamp', - nullable: true, - }) + @Column({ type: 'timestamp', nullable: true }) spv_approval_date: Date | null; - @Column({ - type: 'enum', - enum: ApprovalStatus, - default: ApprovalStatus.PENDING, - }) + @Column({ type: 'enum', enum: ApprovalStatus, default: ApprovalStatus.PENDING }) spv_approval_status: ApprovalStatus; // General Manager Approval - @Column({ - type: 'uuid', - nullable: true, - }) + @Column({ type: 'uuid', nullable: true }) approved_by_gm: string | null; - @Column({ - type: 'timestamp', - nullable: true, - }) + @Column({ type: 'timestamp', nullable: true }) gm_approval_date: Date | null; - @Column({ - type: 'enum', - enum: ApprovalStatus, - default: ApprovalStatus.PENDING, - }) + @Column({ type: 'enum', enum: ApprovalStatus, default: ApprovalStatus.PENDING }) gm_approval_status: ApprovalStatus; + // Relationship with Goods + @OneToMany(() => Goods, (goods) => goods.id) + goods: Goods[]; + + // Storing related goods UUIDs as an array @Column('uuid', { array: true, nullable: true }) goods_ids: string[]; + @OneToMany(() => RequestSubmission, (submission) => submission.request_order, { cascade: true }) + submissions: RequestSubmission[]; + + @CreateDateColumn() created_at: Date; diff --git a/src/entity/request_submission.ts b/src/entity/request_submission.ts index 2985194..68a6c21 100644 --- a/src/entity/request_submission.ts +++ b/src/entity/request_submission.ts @@ -8,29 +8,24 @@ import { ManyToOne, JoinColumn } from 'typeorm'; +import { SubmissionRecap } from './request_submission_recap'; import { RequestOrder } from './request_orders'; -enum ApprovalStatus { - PENDING = 'PENDING', - APPROVED = 'APPROVED', - REJECTED = 'REJECTED', -} - -enum SubmissionStatus { - DRAFT = 'DRAFT', - SUBMITTED = 'SUBMITTED', - APPROVED = 'APPROVED', - REJECTED = 'REJECTED', -} - @Entity('request_submissions') export class RequestSubmission { @PrimaryGeneratedColumn('uuid') id: string; - @ManyToOne(() => RequestOrder, { nullable: false }) - @JoinColumn({ name: 'request_order_id' }) + + @ManyToOne(() => SubmissionRecap, (recap) => recap.submissions, { nullable: true, onDelete: "SET NULL" }) + @JoinColumn({ name: 'submission_recap_id' }) + recap: SubmissionRecap; + + + @ManyToOne(() => RequestOrder, (order) => order.submissions, { nullable: false, onDelete: "CASCADE" }) + @JoinColumn({ name: 'request_order_id' }) request_order: RequestOrder; + @Column({ type: 'varchar', nullable: false, unique: true }) code_id: string; @@ -39,29 +34,19 @@ export class RequestSubmission { submission_date: Date; @Column({ type: 'text', nullable: true }) - remarks: string | null; + remarks: string; @Column({ type: 'varchar', nullable: true }) - department: string | null; + department: string; - @Column({ type: 'enum', enum: SubmissionStatus, nullable: false, default: SubmissionStatus.DRAFT }) - status: SubmissionStatus; + @Column({ length: 64, nullable: false }) + status: string; - // General Manager Approval - @Column({ type: 'uuid', nullable: true }) - approved_by_gm: string | null; - - @Column({ type: 'timestamptz', nullable: true }) - gm_approval_date: Date | null; - - @Column({ type: 'enum', enum: ApprovalStatus, default: ApprovalStatus.PENDING }) - gm_approval_status: ApprovalStatus; - - @Column({ type: 'varchar', nullable: false }) + @Column({ type: 'varchar', nullable: true }) created_by: string; @Column({ type: 'varchar', nullable: true }) - updated_by: string | null; + updated_by: string; @Column({ type: 'int', nullable: false, default: 0 }) quantity: number; @@ -79,5 +64,5 @@ export class RequestSubmission { updated_at: Date; @DeleteDateColumn({ nullable: true }) - deleted_at: Date | null; + deleted_at: Date; } diff --git a/src/entity/request_submission_recap.ts b/src/entity/request_submission_recap.ts index d079730..331a8af 100644 --- a/src/entity/request_submission_recap.ts +++ b/src/entity/request_submission_recap.ts @@ -5,79 +5,48 @@ import { CreateDateColumn, UpdateDateColumn, DeleteDateColumn, + OneToMany } from 'typeorm'; +import { RequestSubmission } from './request_submission'; @Entity('submission_recap') export class SubmissionRecap { @PrimaryGeneratedColumn('uuid') id: string; - @Column({ - nullable: false, - type: 'date', - }) + @Column({ type: 'date', nullable: false }) recap_date: Date; - @Column({ - nullable: false, - type: 'int', - }) + @Column({ type: 'int', nullable: false }) total_requests: number; - @Column({ - nullable: false, - type: 'int', - }) + @Column({ type: 'int', nullable: false }) total_approved: number; - @Column({ - nullable: false, - type: 'int', - }) + @Column({ type: 'int', nullable: false }) total_rejected: number; - @Column({ - nullable: false, - type: 'int', - }) + @Column({ type: 'int', nullable: false }) total_pending: number; - @Column({ - nullable: false, - type: 'decimal', - precision: 12, - scale: 2, - }) + @Column({ type: 'decimal', precision: 12, scale: 2, nullable: false }) total_budget: number; - @Column({ - nullable: true, - type: 'text', - }) + @Column({ type: 'text', nullable: true }) remarks: string; - // Store multiple submissions IDs - @Column('uuid', { array: true, nullable: true }) - submissions_ids: string[]; - - @Column({ - nullable: true, - type: 'varchar', - }) - journal_id: string; - - @Column({ nullable: true }) + @OneToMany(() => RequestSubmission, (submission) => submission.recap, { cascade: true }) + submissions: RequestSubmission[]; + + @Column({ type: 'varchar', nullable: true }) created_by: string; - @Column() @CreateDateColumn() created_at: Date; - @Column({ nullable: true }) @UpdateDateColumn() updated_at: Date; - @Column({ nullable: true }) - @DeleteDateColumn() + @DeleteDateColumn({ nullable: true }) deleted_at: Date; }