diff --git a/src/entity/procurement/procurement_payment_request.ts b/src/entity/procurement/procurement_payment_request.ts new file mode 100644 index 0000000..1f5c868 --- /dev/null +++ b/src/entity/procurement/procurement_payment_request.ts @@ -0,0 +1,216 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, ManyToOne, JoinColumn } from "typeorm"; + +import { ProcurementPurchaseOrder } from "./procurement_purchase_order"; +import { ProcurementVendor } from "./procurement_vendor"; +import { FinancePurchaseRequest } from "../finance/finance_purchase_requests"; +import { FinanceCpv } from "../finance/finance_cpvs"; +import { HrmsEmployee } from "../hrms/hrms_employee"; +import { ProcurementPRCStatus } from "../../types/procurement"; + +@Entity("procurement_payment_request", { schema: "procurement" }) +export class ProcurementPaymentRequest { + @PrimaryGeneratedColumn("uuid") + id: string; + + // ========================= + // HEADER + // ========================= + + @Column({ type: "varchar", length: 50, unique: true }) + code: string; // PRC Code Automaticaly + + @Column({ type: "varchar", length: 50, unique: true }) + prc_number: string; // Payment Request Number (2025-0177) + + @Column({ type: "date" }) + prc_date: Date; // Payment Request Date + + @Column({ type: "varchar", length: 150, nullable: true }) + to: string; // To (Director Finance) + + @Column({ type: "varchar", length: 150, nullable: true }) + from: string; // From (Procurement Unit) + + @Column({ type: "varchar", length: 100, nullable: true }) + payment_type: string; // Payment for Procurement + + @Column({ type: "varchar", length: 50, nullable: true }) + status: ProcurementPRCStatus; // Draft / Received / Approved / Rejected + + // ========================= + // REFERENCES + // ========================= + + @ManyToOne(() => FinanceCpv, { nullable: true, onDelete: "NO ACTION" }) + @JoinColumn() + cpv: FinanceCpv; // CPV Number + + @Column({ type: "float8", nullable: true }) + cpv_amount_usd: number; + + @ManyToOne(() => ProcurementPurchaseOrder, { nullable: true, onDelete: "NO ACTION" }) + @JoinColumn() + po: ProcurementPurchaseOrder; // PO Number + + @Column({ type: "float8", nullable: true }) + po_amount_usd: number; + + @ManyToOne(() => FinancePurchaseRequest, { nullable: true, onDelete: "NO ACTION" }) + @JoinColumn() + pr: FinancePurchaseRequest; // PR Number + + @Column({ type: "float8", nullable: true }) + pr_amount_usd: number; + + @Column({ type: "varchar", length: 100, nullable: true }) + contract_number: string; // Contract Number + + @Column({ type: "date", nullable: true }) + contract_date: Date; + + // ========================= + // PAYMENT REQUEST DETAIL + // ========================= + + @Column({ type: "text", nullable: true }) + payment_description: string; // Payment Request Description + + @ManyToOne(() => ProcurementVendor, { nullable: true }) + @JoinColumn() + vendor: ProcurementVendor; // Supplier / Contractor + + @Column({ type: "varchar", length: 100, nullable: true }) + invoice_number: string; + + @Column({ type: "date", nullable: true }) + invoice_date: Date; + + @Column({ type: "varchar", length: 20, nullable: true }) + currency: string; // USD + + @Column({ type: "float8", nullable: true }) + amount_claimed: number; + + // ========================= + // DEDUCTIONS + // ========================= + + @Column({ type: "float8", nullable: true }) + advance_payment_percent: number; + + @Column({ type: "float8", nullable: true }) + advance_payment_amount: number; + + @Column({ type: "float8", nullable: true }) + retention_percent: number; + + @Column({ type: "float8", nullable: true }) + retention_amount: number; + + @Column({ type: "float8", nullable: true }) + deduction_tax_percent: number; + + @Column({ type: "float8", nullable: true }) + deduction_tax_amount: number; + + @Column({ type: "float8", nullable: true }) + deduction_penalty_percent: number; + + @Column({ type: "float8", nullable: true }) + deduction_penalty_amount: number; + + @Column({ type: "float8", nullable: true }) + net_amount_paid: number; // NET TO BE PAID + + // ========================= + // PAYMENT STATUS + // ========================= + + @Column({ type: "boolean", default: false }) + is_partial: boolean; // Partial (YES/NO) + + @Column({ type: "boolean", default: false }) + is_final: boolean; // Final (YES/NO) + + @Column({ type: "float8", nullable: true }) + balance_remaining: number; // Balance excluding outstanding PRC + + // ========================= + // BANKING DETAILS + // ========================= + + @Column({ type: "varchar", length: 150, nullable: true }) + bank_name: string; + + @Column({ type: "varchar", length: 100, nullable: true }) + bank_swift_aba_bsb: string; + + @Column({ type: "text", nullable: true }) + bank_account_name: string; + + @Column({ type: "varchar", length: 150, nullable: true }) + bank_account_number: string; + + // ========================= + // DEDUCTION ACCOUNT + // ========================= + + @Column({ type: "varchar", length: 150, nullable: true }) + deduction_bank_name: string; + + @Column({ type: "text", nullable: true }) + deduction_bank_address: string; + + @Column({ type: "varchar", length: 50, nullable: true }) + deduction_account_no: string; + + @Column({ type: "varchar", length: 150, nullable: true }) + deduction_account_name: string; + + // ========================= + // APPROVAL FLOW + // ========================= + + @ManyToOne(() => HrmsEmployee, { nullable: true }) + @JoinColumn() + prepared_by: HrmsEmployee; + + @Column({ type: "varchar", length: 150, nullable: true }) + prepared_by_position: string; + + @ManyToOne(() => HrmsEmployee, { nullable: true }) + @JoinColumn() + verified_by: HrmsEmployee; + + @Column({ type: "varchar", length: 150, nullable: true }) + verified_by_position: string; + + @ManyToOne(() => HrmsEmployee, { nullable: true }) + @JoinColumn() + certified_by: HrmsEmployee; + + @Column({ type: "varchar", length: 150, nullable: true }) + certified_by_position: string; + + // ========================= + // AUDIT + // ========================= + + @CreateDateColumn() + created_at: Date; + + @Column({ nullable: true }) + created_by: string; + + @UpdateDateColumn({ nullable: true }) + updated_at: Date; + + @Column({ nullable: true }) + updated_by: string; + + @DeleteDateColumn({ nullable: true }) + deleted_at: Date; + + @Column({ nullable: true }) + deleted_by: string; +} diff --git a/src/schema/procurement.ts b/src/schema/procurement.ts index 3922a13..7347adc 100644 --- a/src/schema/procurement.ts +++ b/src/schema/procurement.ts @@ -8,5 +8,6 @@ export * from "../entity/procurement/procurement_checklist_payment_document"; export * from "../entity/procurement/procurement_checklist_payment_approval"; export * from "../entity/procurement/procurement_purchase_order"; export * from "../entity/procurement/procurement_purchase_order_item"; +export * from "../entity/procurement/procurement_payment_request"; export * from "../types/procurement"; diff --git a/src/types/procurement.ts b/src/types/procurement.ts index 1c4cd03..ef75323 100644 --- a/src/types/procurement.ts +++ b/src/types/procurement.ts @@ -68,4 +68,11 @@ export enum ProcurementPOStatus { APPROVED = "APPROVED", REJECTED = "REJECTED", PENDING = "PENDING", +} + +export enum ProcurementPRCStatus { + DRAFT = "DRAFT", + APPROVED = "APPROVED", + REJECTED = "REJECTED", + RECEIVED = "RECEIVED", } \ No newline at end of file