509 lines
12 KiB
JSON
509 lines
12 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://example.invalid/schemas/report-payload.schema.json",
|
|
"title": "Monthly Report Render Payload",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"report": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"report_version": {
|
|
"type": "string",
|
|
"pattern": "^[0-9]+\\.[0-9]+$"
|
|
},
|
|
"prompt_version": {
|
|
"type": "string",
|
|
"pattern": "^[0-9]+\\.[0-9]+$"
|
|
},
|
|
"template_version": {
|
|
"type": "string",
|
|
"pattern": "^[0-9]+\\.[0-9]+$"
|
|
},
|
|
"generated_at": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"publisher": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 120
|
|
},
|
|
"period": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"year": {
|
|
"type": "integer",
|
|
"minimum": 2020,
|
|
"maximum": 2100
|
|
},
|
|
"month": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 12
|
|
},
|
|
"label": {
|
|
"type": "string",
|
|
"minLength": 4,
|
|
"maxLength": 40
|
|
},
|
|
"comparison_label": {
|
|
"type": "string",
|
|
"minLength": 4,
|
|
"maxLength": 60
|
|
}
|
|
},
|
|
"required": [
|
|
"year",
|
|
"month",
|
|
"label",
|
|
"comparison_label"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"report_version",
|
|
"prompt_version",
|
|
"template_version",
|
|
"generated_at",
|
|
"publisher",
|
|
"period"
|
|
]
|
|
},
|
|
"customer": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"pattern": "^[a-zA-Z0-9_-]{2,64}$"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 160
|
|
},
|
|
"property_name": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 160
|
|
},
|
|
"location": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 160
|
|
},
|
|
"contact_line": {
|
|
"type": "string",
|
|
"minLength": 0,
|
|
"maxLength": 180
|
|
},
|
|
"logo_data_uri": {
|
|
"type": "string",
|
|
"pattern": "^data:image/(png|jpeg|svg\\+xml);base64,"
|
|
},
|
|
"logo_text": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 5
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"name",
|
|
"property_name",
|
|
"location",
|
|
"contact_line",
|
|
"logo_text"
|
|
]
|
|
},
|
|
"design": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"theme": {
|
|
"type": "string",
|
|
"enum": [
|
|
"alpine-sage",
|
|
"classic",
|
|
"editorial-ink",
|
|
"editorial-ivory",
|
|
"editorial-rose",
|
|
"executive-blue",
|
|
"executive-burgundy",
|
|
"executive-charcoal",
|
|
"forest-lodge",
|
|
"ledger-blue",
|
|
"ledger-green",
|
|
"ledger-sepia",
|
|
"magazine-citrus",
|
|
"magazine-cobalt",
|
|
"magazine-plum",
|
|
"midnight-gold",
|
|
"modern",
|
|
"nordic-light",
|
|
"nordic-night",
|
|
"ocean-breeze",
|
|
"poster-mono",
|
|
"poster-red",
|
|
"poster-yellow",
|
|
"soft-lavender",
|
|
"split-teal",
|
|
"split-terracotta",
|
|
"split-violet",
|
|
"sunset-coral"
|
|
]
|
|
},
|
|
"primary_color": {
|
|
"type": "string",
|
|
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
},
|
|
"secondary_color": {
|
|
"type": "string",
|
|
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
},
|
|
"accent_color": {
|
|
"type": "string",
|
|
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
},
|
|
"text_color": {
|
|
"type": "string",
|
|
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
},
|
|
"muted_color": {
|
|
"type": "string",
|
|
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
},
|
|
"surface_color": {
|
|
"type": "string",
|
|
"pattern": "^#[0-9A-Fa-f]{6}$"
|
|
},
|
|
"font_family": {
|
|
"type": "string",
|
|
"minLength": 3,
|
|
"maxLength": 100,
|
|
"pattern": "^[A-Za-z0-9 _,-]+$"
|
|
},
|
|
"palette_mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"theme",
|
|
"custom"
|
|
],
|
|
"description": "theme nutzt die feste Theme-Palette; custom nutzt die mitgelieferten Designfarben."
|
|
}
|
|
},
|
|
"required": [
|
|
"theme",
|
|
"primary_color",
|
|
"secondary_color",
|
|
"accent_color",
|
|
"text_color",
|
|
"muted_color",
|
|
"surface_color",
|
|
"font_family"
|
|
]
|
|
},
|
|
"metrics": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"currency": {
|
|
"type": "string",
|
|
"enum": [
|
|
"EUR",
|
|
"USD",
|
|
"GBP"
|
|
]
|
|
},
|
|
"revenue": {
|
|
"type": "number",
|
|
"minimum": 0
|
|
},
|
|
"occupancy_rate": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 100
|
|
},
|
|
"adr": {
|
|
"type": "number",
|
|
"minimum": 0
|
|
},
|
|
"revpar": {
|
|
"type": "number",
|
|
"minimum": 0
|
|
},
|
|
"bookings": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"nights_sold": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"average_stay": {
|
|
"type": "number",
|
|
"minimum": 0
|
|
},
|
|
"cancellation_rate": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 100
|
|
},
|
|
"comparison": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"revenue_delta_pct": {
|
|
"type": "number",
|
|
"minimum": -1000,
|
|
"maximum": 1000
|
|
},
|
|
"occupancy_delta_pp": {
|
|
"type": "number",
|
|
"minimum": -100,
|
|
"maximum": 100
|
|
},
|
|
"adr_delta_pct": {
|
|
"type": "number",
|
|
"minimum": -1000,
|
|
"maximum": 1000
|
|
},
|
|
"bookings_delta": {
|
|
"type": "integer",
|
|
"minimum": -100000,
|
|
"maximum": 100000
|
|
}
|
|
},
|
|
"required": [
|
|
"revenue_delta_pct",
|
|
"occupancy_delta_pp",
|
|
"adr_delta_pct",
|
|
"bookings_delta"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"currency",
|
|
"revenue",
|
|
"occupancy_rate",
|
|
"adr",
|
|
"revpar",
|
|
"bookings",
|
|
"nights_sold",
|
|
"average_stay",
|
|
"cancellation_rate",
|
|
"comparison"
|
|
]
|
|
},
|
|
"trends": {
|
|
"type": "array",
|
|
"minItems": 2,
|
|
"maxItems": 12,
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"label": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 20
|
|
},
|
|
"revenue": {
|
|
"type": "number",
|
|
"minimum": 0
|
|
},
|
|
"occupancy_rate": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 100
|
|
},
|
|
"adr": {
|
|
"type": "number",
|
|
"minimum": 0
|
|
}
|
|
},
|
|
"required": [
|
|
"label",
|
|
"revenue",
|
|
"occupancy_rate",
|
|
"adr"
|
|
]
|
|
}
|
|
},
|
|
"content": {
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://example.invalid/schemas/claude-output.schema.json",
|
|
"title": "Claude Monthly Report Content",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"summary": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"headline": {
|
|
"type": "string",
|
|
"minLength": 8,
|
|
"maxLength": 110
|
|
},
|
|
"text": {
|
|
"type": "string",
|
|
"minLength": 80,
|
|
"maxLength": 900
|
|
},
|
|
"rating": {
|
|
"type": "string",
|
|
"enum": [
|
|
"positive",
|
|
"neutral",
|
|
"watch"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"headline",
|
|
"text",
|
|
"rating"
|
|
]
|
|
},
|
|
"developments": {
|
|
"type": "array",
|
|
"minItems": 2,
|
|
"maxItems": 4,
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"minLength": 4,
|
|
"maxLength": 80
|
|
},
|
|
"text": {
|
|
"type": "string",
|
|
"minLength": 40,
|
|
"maxLength": 450
|
|
},
|
|
"impact": {
|
|
"type": "string",
|
|
"enum": [
|
|
"positive",
|
|
"neutral",
|
|
"negative"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"title",
|
|
"text",
|
|
"impact"
|
|
]
|
|
}
|
|
},
|
|
"recommendations": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"maxItems": 3,
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"priority": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 3
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"minLength": 3,
|
|
"maxLength": 80
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"minLength": 5,
|
|
"maxLength": 100
|
|
},
|
|
"reason": {
|
|
"type": "string",
|
|
"minLength": 40,
|
|
"maxLength": 450
|
|
},
|
|
"action": {
|
|
"type": "string",
|
|
"minLength": 30,
|
|
"maxLength": 450
|
|
},
|
|
"expected_effect": {
|
|
"type": "string",
|
|
"minLength": 20,
|
|
"maxLength": 300
|
|
}
|
|
},
|
|
"required": [
|
|
"priority",
|
|
"category",
|
|
"title",
|
|
"reason",
|
|
"action",
|
|
"expected_effect"
|
|
]
|
|
}
|
|
},
|
|
"outlook": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"headline": {
|
|
"type": "string",
|
|
"minLength": 5,
|
|
"maxLength": 100
|
|
},
|
|
"text": {
|
|
"type": "string",
|
|
"minLength": 60,
|
|
"maxLength": 700
|
|
}
|
|
},
|
|
"required": [
|
|
"headline",
|
|
"text"
|
|
]
|
|
},
|
|
"data_quality_notes": {
|
|
"type": "array",
|
|
"maxItems": 4,
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 5,
|
|
"maxLength": 240
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"summary",
|
|
"developments",
|
|
"recommendations",
|
|
"outlook",
|
|
"data_quality_notes"
|
|
]
|
|
},
|
|
"legal_note": {
|
|
"type": "string",
|
|
"minLength": 10,
|
|
"maxLength": 500
|
|
}
|
|
},
|
|
"required": [
|
|
"report",
|
|
"customer",
|
|
"design",
|
|
"metrics",
|
|
"trends",
|
|
"content",
|
|
"legal_note"
|
|
]
|
|
}
|