Files
dsc-api/src/modules/invoices/entities/invoice.entity.ts
T

82 lines
2.7 KiB
TypeScript
Executable File

import Decimal from "decimal.js";
import { Column, Entity, ManyToOne, OneToMany } from "typeorm";
import { InvoiceItem } from "./invoice-item.entity";
import { BaseEntity } from "../../../common/entities/base.entity";
import { DecimalTransformer } from "../../../common/transformers/decimal.transformer";
import { Discount } from "../../discounts/entities/discount.entity";
import { User } from "../../users/entities/user.entity";
import { RecurringPeriodEnum } from "../enums/invoice-recurring-period.enum";
import { InvoiceStatus } from "../enums/invoice-status.enum";
import { InvoicePurpose } from "../interfaces/external-invoice.interface";
@Entity()
export class Invoice extends BaseEntity {
@Column({ type: "int", generated: "identity", insert: false })
numericId: number;
@ManyToOne(() => User, (user) => user.invoices, { nullable: true, onDelete: "SET NULL" })
user: User;
@Column({ type: "decimal", precision: 16, scale: 2, nullable: false, transformer: new DecimalTransformer() })
totalPrice: Decimal;
@Column({ type: "decimal", precision: 16, scale: 2, nullable: true, transformer: new DecimalTransformer() })
originalPrice?: Decimal;
@Column({ type: "enum", enum: InvoiceStatus, default: InvoiceStatus.PENDING })
status: InvoiceStatus;
@Column({ type: "timestamptz", nullable: false })
dueDate: Date;
@Column({ type: "timestamptz", nullable: true })
paidAt?: Date;
@Column({ type: "decimal", precision: 16, scale: 2, nullable: false, transformer: new DecimalTransformer() })
tax: Decimal;
@Column({ type: "decimal", precision: 16, scale: 2, nullable: true, transformer: new DecimalTransformer() })
lateFee: Decimal | null;
@Column({ type: "boolean", default: false })
isRecurring: boolean;
@Column({ type: "enum", enum: RecurringPeriodEnum, nullable: true })
recurringPeriod?: RecurringPeriodEnum;
@Column({ type: "int", default: 0 })
maxRecurringCycles: number;
@Column({ type: "int", default: 0 })
currentRecurringCycle: number;
//---------------------------------------------
@Column({ type: "boolean", default: false })
isExternal: boolean;
@Column({ type: "varchar", length: 250, nullable: true })
externalBusinessId: string | null;
//---------------------------------------------
@OneToMany(() => InvoiceItem, (invoiceItem) => invoiceItem.invoice, { cascade: true })
items: InvoiceItem[];
@ManyToOne(() => Discount, (discount) => discount.invoices, { nullable: true, onDelete: "RESTRICT" })
discount: Discount | null;
@Column({
type: 'enum',
enum: InvoicePurpose,
nullable: false,
})
purpose: InvoicePurpose;
get isOverdue(): boolean {
return this.status === InvoiceStatus.PENDING && new Date() > this.dueDate;
}
}