feat: add invoice lifecycle schema

This commit is contained in:
2026-06-25 11:40:05 +01:00
parent b71bb98389
commit 3373762d97
5 changed files with 2128 additions and 1 deletions
+4
View File
@@ -1,9 +1,13 @@
import { z } from 'zod';
import { moneyGbp, optionalText, requiredText } from './shared.schema';
export const invoiceStatusValues = ['draft', 'sent', 'paid', 'void'] as const;
export const invoiceStatusSchema = z.enum(invoiceStatusValues);
export const invoiceCreateSchema = z.object({
clientId: requiredText('Client'),
invoiceNumber: requiredText('Invoice number', 80),
status: invoiceStatusSchema.default('draft'),
issueDate: requiredText('Issue date', 40),
dueDate: requiredText('Due date', 40),
subtotalGbp: moneyGbp,
+7 -1
View File
@@ -1,8 +1,10 @@
import { index, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';
import { index, integer, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';
import { clients } from './clients.schema';
import { organizations } from './organizations.schema';
import { timestamps } from './shared.schema';
export const invoiceStatusValues = ['draft', 'sent', 'paid', 'void'] as const;
export const invoices = sqliteTable(
'invoices',
{
@@ -16,6 +18,10 @@ export const invoices = sqliteTable(
.notNull()
.references(() => clients.id, { onDelete: 'restrict' }),
invoiceNumber: text('invoice_number').notNull().unique(),
status: text('status', { enum: invoiceStatusValues }).notNull().default('draft'),
sentAt: integer('sent_at', { mode: 'timestamp_ms' }),
paidAt: integer('paid_at', { mode: 'timestamp_ms' }),
voidedAt: integer('voided_at', { mode: 'timestamp_ms' }),
issueDate: text('issue_date').notNull(),
dueDate: text('due_date').notNull(),
subtotalGbp: real('subtotal_gbp').notNull().default(0),