65 lines
1.3 KiB
TypeScript
65 lines
1.3 KiB
TypeScript
|
|
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
|
||
|
|
|
||
|
|
@Entity('invoices')
|
||
|
|
export class Invoice {
|
||
|
|
@PrimaryGeneratedColumn('uuid')
|
||
|
|
id: string;
|
||
|
|
|
||
|
|
@Column({ unique: true })
|
||
|
|
invoiceNumber: string;
|
||
|
|
|
||
|
|
@Column({ type: 'date' })
|
||
|
|
date: string;
|
||
|
|
|
||
|
|
@Column({ type: 'date' })
|
||
|
|
dueDate: string;
|
||
|
|
|
||
|
|
@Column({ default: 'draft' })
|
||
|
|
status: 'draft' | 'sent' | 'paid' | 'overdue';
|
||
|
|
|
||
|
|
// Kunde
|
||
|
|
@Column()
|
||
|
|
customerName: string;
|
||
|
|
|
||
|
|
@Column({ nullable: true })
|
||
|
|
customerEmail: string;
|
||
|
|
|
||
|
|
@Column({ nullable: true })
|
||
|
|
customerAddress: string;
|
||
|
|
|
||
|
|
@Column({ nullable: true })
|
||
|
|
customerCity: string;
|
||
|
|
|
||
|
|
@Column({ nullable: true })
|
||
|
|
customerZip: string;
|
||
|
|
|
||
|
|
// Positionen als JSON
|
||
|
|
@Column({ type: 'json' })
|
||
|
|
items: {
|
||
|
|
id: string;
|
||
|
|
description: string;
|
||
|
|
quantity: number;
|
||
|
|
unit: string;
|
||
|
|
unitPrice: number;
|
||
|
|
}[];
|
||
|
|
|
||
|
|
@Column({ type: 'decimal', precision: 5, scale: 2, default: 19 })
|
||
|
|
taxRate: number;
|
||
|
|
|
||
|
|
@Column({ type: 'text', nullable: true })
|
||
|
|
notes: string;
|
||
|
|
|
||
|
|
// Berechnete Werte für einfache Queries
|
||
|
|
@Column({ type: 'decimal', precision: 10, scale: 2, default: 0 })
|
||
|
|
totalNet: number;
|
||
|
|
|
||
|
|
@Column({ type: 'decimal', precision: 10, scale: 2, default: 0 })
|
||
|
|
totalGross: number;
|
||
|
|
|
||
|
|
@CreateDateColumn()
|
||
|
|
createdAt: Date;
|
||
|
|
|
||
|
|
@UpdateDateColumn()
|
||
|
|
updatedAt: Date;
|
||
|
|
}
|