# Calendar Weekly LLM Payload

Ten dokument opisuje v1 tygodniowego payloadu z sekcją `calendar_context`, przygotowanego pod późniejsze łączenie z innymi źródłami:

- ads
- product
- sales
- pricing
- search
- supply

Na tym etapie payload:

- nie zawiera summary tekstowych
- nie wywołuje LLM
- przechowuje tylko fakty i sygnały rule-based

## Top-Level Schema

```json
{
  "market": "PL",
  "summary_scope": "week_market",
  "input_version": "weekly_llm_payload_v1",
  "schema_version": "weekly_calendar_context_v1",
  "generated_at": "2026-04-03T00:00:00Z",
  "week_iso": "2026-W14",
  "date_from": "2026-03-30",
  "date_to": "2026-04-05",
  "calendar_context": {},
  "commercial_calendar_context": null,
  "ads_context": null,
  "product_context": null,
  "sales_context": null,
  "pricing_context": null,
  "search_context": null,
  "supply_context": null,
  "confidence_inputs": {},
  "llm_constraints": {}
}
```

## `calendar_context`

Sekcja zawiera:

- `events_inside_week`
- `events_affecting_from_past`
- `events_affecting_upcoming`
- `calendar_density`
- `week_flags`
- `time_off_summary`
- `priority_events`
- `aggregated_impacts`
- `dominant_patterns`

## `commercial_calendar_context`

Opcjonalna sekcja na sygnały kalendarza komercyjnego, które nie są świętami ani school break.

Na teraz:

- dla `GB` builder zawsze dodaje `payday`
- dla innych rynków sekcja jest `null`

Alias:

- `UK` jest akceptowane jako alias wejściowy, ale payload normalizuje market do `GB`

Przykład:

```json
{
  "payday": {
    "enabled": true,
    "market_rule": "uk_last_business_day_of_month_v1",
    "reference_payday_date": "2026-04-30",
    "days_from_range_midpoint": -2,
    "window": "payday_window",
    "products_supported": ["flights", "travel"],
    "travel_signal": {
      "direction": "positive",
      "strength_label": "medium",
      "strength_score": 0.55
    },
    "flights_signal": {
      "direction": "positive",
      "strength_label": "medium",
      "strength_score": 0.42
    }
  }
}
```

## Event Shape

Każdy event w `events_inside_week`, `events_affecting_from_past`, `events_affecting_upcoming` ma kształt:

```json
{
  "event_id": "PL_2026-04-05_easter_sunday",
  "canonical_name": "Wielkanoc",
  "event_category": "public_holiday",
  "holiday_subtype": "public",
  "school_break_type": null,
  "scope": "national",
  "is_nationwide": true,
  "regions": [],
  "week_relation": "inside_week",
  "timing_phase_for_this_week": "event_week",
  "time_off": {
    "days_off_in_row": 6,
    "official_working_days_lost": 1,
    "bridge_potential": "none",
    "bridge_days_used": 0,
    "off_day_pattern": "weekend_holiday",
    "travel_window": {
      "from": "2026-04-02",
      "to": "2026-04-07",
      "type": "holiday_window"
    }
  },
  "travel_signal": {
    "coverage": "nationwide",
    "intensity_band": "high",
    "travel_relevance_score": 0.88,
    "tags": ["family", "vfr", "leisure", "business_negative"]
  },
  "product_impact": {
    "flights": {
      "direction": "positive",
      "strength_label": "high",
      "strength_score": 0.82,
      "drivers": ["easter", "family_travel", "return_travel"]
    },
    "holiday_packages": {
      "direction": "positive",
      "strength_label": "high",
      "strength_score": 0.79,
      "drivers": ["family_travel", "holiday_window", "longer_stays"]
    }
  },
  "timing_effects": {
    "previous_week": {},
    "event_week": {},
    "next_week": {}
  }
}
```

## `confidence_inputs`

Opcjonalny blok techniczny, bez summary:

```json
{
  "calendar_signal_strength": 0.81,
  "event_overlap_complexity": "medium",
  "data_completeness": "high"
}
```

## Store

Payload może być zapisany do:

- `data/calendar/weekly_llm_inputs/{MARKET}/{YEAR}/{WEEK_ISO}.json`

## UI

Preview:

- `/calendar/merged/weekly-contexts.php?market=PL&year=2026&week_iso=2026-W14`

## Implementacja

Builder:

- [weekly_calendar_context.php](/var/www/news.netkam.online/calendar/merged/lib/calendar/summary/weekly_calendar_context.php)

Widok:

- [weekly-contexts.php](/var/www/news.netkam.online/calendar/merged/weekly-contexts.php)
