feat(recurring): carry dimension bags on recurring invoice schedules (#1272)
Schedules and their template items now store {sie_dim_no: code} bags
(default_dimensions / dimensions), and the cron generator copies them
onto every spawned invoice + item, so recurring invoices book with the
same projekt/kostnadsstalle tags a manual invoice would. Wired through
the web CRUD routes, the staged-operation executors, and the MCP
create/update/list schedule tools (resolve-don't-select, resolutions
echoed in the preview).
Migration 20260728090000 adds the two jsonb columns (same shape+CHECK
as invoices/invoice_items, PR7 producer parity).
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
65c6d4c178
commit
951b33363b
@@ -707,6 +707,9 @@ export const RecurringScheduleItemSchema = z.object({
|
||||
.union([z.literal(0), z.literal(6), z.literal(12), z.literal(25)])
|
||||
.nullable()
|
||||
.optional(),
|
||||
// Copied onto the generated invoice_items.dimensions; merges over the
|
||||
// schedule's default_dimensions on that item's revenue line.
|
||||
dimensions: DimensionsBagSchema.optional(),
|
||||
})
|
||||
|
||||
export const CreateRecurringScheduleSchema = z.object({
|
||||
@@ -721,6 +724,8 @@ export const CreateRecurringScheduleSchema = z.object({
|
||||
our_reference: z.string().optional(),
|
||||
notes: z.string().optional(),
|
||||
auto_send: z.boolean().default(false),
|
||||
// Copied onto invoices.default_dimensions for every generated invoice.
|
||||
default_dimensions: DimensionsBagSchema.optional(),
|
||||
// Optional: when to first run. Defaults to next occurrence of day_of_month
|
||||
// (today if day_of_month === today, otherwise next month).
|
||||
start_date: isoDate.optional(),
|
||||
@@ -739,6 +744,8 @@ export const UpdateRecurringScheduleSchema = z.object({
|
||||
notes: z.string().nullable().optional(),
|
||||
auto_send: z.boolean().optional(),
|
||||
status: z.enum(['active', 'paused']).optional(),
|
||||
// Replaces the whole bag if provided ({} clears all tags). Omit to keep.
|
||||
default_dimensions: DimensionsBagSchema.optional(),
|
||||
// Replace all items if provided. Omit to keep existing items unchanged.
|
||||
items: z.array(RecurringScheduleItemSchema).min(1).optional(),
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user