From a2420ed692c8cf9b95f2ddf7916483d78dd8e736 Mon Sep 17 00:00:00 2001 From: Robert Helewka Date: Wed, 20 May 2026 22:28:12 -0400 Subject: [PATCH] refactor: restructure repo into core/app modules with per-study folders Reorganize Palladium codebase into a modular architecture with `core/` shared logic and `app/` Streamlit UI, separating per-study assets into `studies/YYYYMM_/` folders containing notebooks, seed data, and configuration. Update README to reflect new structure, add `.gitignore` entries for `.env` and study exports, and refresh component documentation. --- .env.example | 10 + .gitignore | 5 + README.md | 288 +- app/__init__.py | 0 app/components/__init__.py | 0 app/components/charts.py | 32 + app/components/tables.py | 106 + app/main.py | 138 + app/pages/__init__.py | 0 app/pages/_helpers.py | 28 + app/pages/benefits.py | 46 + app/pages/costs.py | 46 + app/pages/summary.py | 104 + app/pages/versions.py | 117 + core/__init__.py | 3 + core/calculations/__init__.py | 31 + core/calculations/npv.py | 78 + core/calculations/payback.py | 63 + core/calculations/roi.py | 27 + core/calculations/scenarios.py | 128 + core/cli/__init__.py | 1 + core/cli/main.py | 229 + core/export/__init__.py | 5 + core/export/report_data.py | 224 + core/notebook_helpers/__init__.py | 5 + core/notebook_helpers/charts.py | 193 + core/notebook_helpers/display.py | 141 + core/notebook_helpers/tables.py | 127 + core/tei_client/__init__.py | 13 + core/tei_client/client.py | 563 + core/tei_client/models.py | 194 + docs/Athena API.yaml | 30709 ++++++++++++++++ palladium/__init__.py | 7 + palladium/__main__.py | 6 + pyproject.toml | 49 + requirements.txt | 9 + studies/202602_AmazonConnect/README.md | 71 + studies/202602_AmazonConnect/__init__.py | 0 studies/202602_AmazonConnect/config.py | 39 + .../docs/202602_TEI Report Amazon Connect.pdf | Bin 0 -> 1393856 bytes studies/202602_AmazonConnect/exports/.gitkeep | 0 .../notebooks/01_benefits.ipynb | 269 + .../notebooks/02_costs.ipynb | 213 + .../notebooks/03_business_case.ipynb | 221 + .../notebooks/04_export.ipynb | 195 + studies/202602_AmazonConnect/seed_data.py | 162 + studies/__init__.py | 0 tests/__init__.py | 0 tests/conftest.py | 32 + tests/test_calculations.py | 206 + tests/test_client.py | 174 + tests/test_export.py | 98 + 52 files changed, 35300 insertions(+), 105 deletions(-) create mode 100644 .env.example create mode 100644 app/__init__.py create mode 100644 app/components/__init__.py create mode 100644 app/components/charts.py create mode 100644 app/components/tables.py create mode 100644 app/main.py create mode 100644 app/pages/__init__.py create mode 100644 app/pages/_helpers.py create mode 100644 app/pages/benefits.py create mode 100644 app/pages/costs.py create mode 100644 app/pages/summary.py create mode 100644 app/pages/versions.py create mode 100644 core/__init__.py create mode 100644 core/calculations/__init__.py create mode 100644 core/calculations/npv.py create mode 100644 core/calculations/payback.py create mode 100644 core/calculations/roi.py create mode 100644 core/calculations/scenarios.py create mode 100644 core/cli/__init__.py create mode 100644 core/cli/main.py create mode 100644 core/export/__init__.py create mode 100644 core/export/report_data.py create mode 100644 core/notebook_helpers/__init__.py create mode 100644 core/notebook_helpers/charts.py create mode 100644 core/notebook_helpers/display.py create mode 100644 core/notebook_helpers/tables.py create mode 100644 core/tei_client/__init__.py create mode 100644 core/tei_client/client.py create mode 100644 core/tei_client/models.py create mode 100644 docs/Athena API.yaml create mode 100644 palladium/__init__.py create mode 100644 palladium/__main__.py create mode 100644 pyproject.toml create mode 100644 requirements.txt create mode 100644 studies/202602_AmazonConnect/README.md create mode 100644 studies/202602_AmazonConnect/__init__.py create mode 100644 studies/202602_AmazonConnect/config.py create mode 100644 studies/202602_AmazonConnect/docs/202602_TEI Report Amazon Connect.pdf create mode 100644 studies/202602_AmazonConnect/exports/.gitkeep create mode 100644 studies/202602_AmazonConnect/notebooks/01_benefits.ipynb create mode 100644 studies/202602_AmazonConnect/notebooks/02_costs.ipynb create mode 100644 studies/202602_AmazonConnect/notebooks/03_business_case.ipynb create mode 100644 studies/202602_AmazonConnect/notebooks/04_export.ipynb create mode 100644 studies/202602_AmazonConnect/seed_data.py create mode 100644 studies/__init__.py create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/test_calculations.py create mode 100644 tests/test_client.py create mode 100644 tests/test_export.py diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..de6fe15 --- /dev/null +++ b/.env.example @@ -0,0 +1,10 @@ +# Athena API +ATHENA_BASE_URL=https://athena.nttdata.com +ATHENA_API_KEY=your-api-key-here + +# Optional — pre-set the active study + tool so notebooks/CLI pick them up +# without editing config.py. +# +# PALLADIUM_REPORT_PUBLIC_ID= +# PALLADIUM_TOOL_PUBLIC_ID= +# PALLADIUM_PROPOSAL_ID= diff --git a/.gitignore b/.gitignore index 0c8bc9a..55b56d4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,11 @@ .ipynb_checkpoints */.ipynb_checkpoints/* +# Palladium-specific +.env +studies/*/exports/* +!studies/*/exports/.gitkeep + # IPython profile_default/ ipython_config.py diff --git a/README.md b/README.md index 826fcce..9056c25 100644 --- a/README.md +++ b/README.md @@ -2,45 +2,47 @@ **TEI (Total Economic Impact) Calculator** — The strategic artifact that protects the business case. -Palladium is a Jupyter notebook-based calculator and Streamlit application for building Total Economic Impact analyses. It connects to [Athena](https://athena.nttdata.com) for data persistence, performs financial calculations (NPV, ROI, payback period), and exports structured data for the report generation pipeline. +Palladium is a Jupyter notebook + Streamlit toolkit for building Total Economic Impact analyses. It connects to [Athena](https://athena.nttdata.com) for data persistence, performs financial calculations (NPV, ROI, payback period), and exports structured data for the report generation pipeline. > *In Greek mythology, the Palladium was a sacred artifact of Athena that protected Troy. Whoever possessed it held strategic advantage. In our ecosystem, Palladium protects the deal — transforming discovery inputs into a financial case no CFO can ignore.* ## Architecture ``` -┌─────────────────────────────────────────────────────────┐ -│ Palladium │ -│ │ -│ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │ -│ │ Notebooks │ │ Streamlit │ │ Export │ │ -│ │ (Analysis) │ │ (Data Entry)│ │ (Report) │ │ -│ └──────┬───────┘ └──────┬───────┘ └─────┬─────┘ │ -│ │ │ │ │ -│ └───────────┬───────┘ │ │ -│ ▼ │ │ -│ ┌──────────────────┐ │ │ -│ │ TEI Client │ │ │ -│ │ (API Layer) │──────────────────┘ │ -│ └────────┬─────────┘ │ -└────────────────────┼────────────────────────────────────┘ - │ - ▼ - ┌─────────────┐ ┌──────────────────┐ - │ Athena │ │ Report Pipeline │ - │ (API) │ │ (html2docx) │ - └─────────────┘ └──────────────────┘ +┌──────────────────────────────────────────────────────────────────┐ +│ Palladium │ +│ │ +│ studies/202602_AmazonConnect/ ← one folder per TEI study │ +│ studies/YYYYMM_/ │ +│ ├─ notebooks/ ─┐ │ +│ ├─ seed_data.py │ │ +│ └─ config.py │ │ +│ ▼ │ +│ ┌──────────────┐ ┌──────────────┐ │ +│ │ core/ │ ←─ │ app/ │ │ +│ │ shared logic │ │ Streamlit │ │ +│ └──────┬───────┘ └──────┬───────┘ │ +│ │ │ │ +│ ▼ ▼ │ +│ tei_client → ───────────────────► Athena API │ +│ calculations │ +│ export ──────────────────────────► export.json │ +│ notebook_helpers │ +│ cli │ +└──────────────────────────────────────────────────────────────────┘ ``` ### Components | Component | Purpose | |-----------|---------| -| **TEI Client** | Python API client for Athena's TEI endpoints | -| **Calculations** | Financial logic — NPV, ROI, payback, risk adjustment | -| **Notebooks** | Interactive analysis — benefits, costs, business case | -| **Streamlit App** | Data entry UI with version management | -| **Export** | Structured JSON for the LLM report generation pipeline | +| **`core/tei_client`** | Python API client for Athena's TEI endpoints | +| **`core/calculations`** | Financial logic — NPV, ROI, payback, risk adjustment, scenarios | +| **`core/export`** | Builds the structured JSON envelope consumed by the report pipeline | +| **`core/notebook_helpers`** | Pandas tables, Plotly charts, IPython display widgets | +| **`core/cli`** | `python -m palladium` command-line interface | +| **`app/`** | Streamlit data-entry UI with version management — *study-agnostic* | +| **`studies/`** | One folder per TEI engagement (notebooks, seed data, config, source PDF) | --- @@ -82,26 +84,26 @@ ATHENA_API_KEY=your-api-key-here python -m palladium test ``` -Or in a notebook: +Or in Python: ```python -from tei_client import TEIClient +from core.tei_client import TEIClient client = TEIClient() -result = client.test_connection() -print(result) # {'status': 'ok', 'authenticated': True, ...} +print(client.test_connection()) # {'status': 'ok', 'authenticated': True, ...} ``` --- ## Usage -### Jupyter Notebooks +### Run a study end-to-end -The primary workflow for TEI analysis: +Each study lives in `studies//`. The reference study is the +February 2026 Forrester *Total Economic Impact™ Of Amazon Connect*: ```bash -jupyter lab notebooks/ +jupyter lab studies/202602_AmazonConnect/notebooks/ ``` | Notebook | Purpose | @@ -109,11 +111,15 @@ jupyter lab notebooks/ | `01_benefits.ipynb` | Quantify and risk-adjust benefit categories | | `02_costs.ipynb` | Document implementation and ongoing costs | | `03_business_case.ipynb` | Financial summary, scenario analysis, visualizations | -| `04_export.ipynb` | Generate report-ready JSON for html2docx pipeline | +| `04_export.ipynb` | Generate report-ready JSON for the html2docx pipeline | -### Streamlit Application +The Amazon Connect notebooks reproduce the published study totals within +rounding: **NPV $78.7M • ROI 342% • Payback <6 months**. -Interactive UI for data entry and version management: +### Streamlit application (study-agnostic) + +Interactive UI for data entry and version management. Works for any TEI +study because field definitions come from Athena at runtime: ```bash streamlit run app/main.py @@ -125,21 +131,56 @@ streamlit run app/main.py # Test connection python -m palladium test -# List TEI instances +# List TEI tool instances python -m palladium list -# Show financial summary +# List available report templates +python -m palladium reports + +# Show financial summary for a tool python -m palladium summary -# Export for report pipeline +# Trigger server-side recalculation +python -m palladium calculate + +# Export for the report pipeline python -m palladium export -o export.json ``` +### Tests + +```bash +pytest tests/ -v +``` + +50 tests cover the API client (mocked HTTP), the financial math, and the +export envelope shape. The Amazon Connect seed data is asserted against +the published Forrester totals. + +--- + +## Adding a new study + +```bash +cp -r studies/202602_AmazonConnect studies/202612_GenesysCloud +cd studies/202612_GenesysCloud +``` + +1. **`README.md`** — update the title, source citation, key numbers. +2. **`seed_data.py`** — replace `BENEFITS` and `COSTS` with the new study's rows. +3. **`config.py`** — set `STUDY_SLUG`, leave `TOOL_PUBLIC_ID` blank until provisioned. +4. **`docs/`** — drop the source PDF here. +5. Open the notebooks; the imports (`core.calculations`, `core.notebook_helpers`, + `core.tei_client`) are study-agnostic. Update the markdown narrative. + +The shared `core/` package and the `app/` Streamlit UI need no changes — +they introspect the TEI Report template via the API. + --- ## TEI Methodology -Palladium implements the Forrester TEI™ framework [1]: +Palladium implements the Forrester TEI™ framework. ### Benefit Categories @@ -154,25 +195,32 @@ Benefits are quantified across categories, risk-adjusted, and discounted to pres ### Risk Adjustment -Each benefit carries a risk adjustment factor (0–50%) reflecting implementation uncertainty. A 20% risk adjustment on a $10M benefit yields a risk-adjusted value of $8M. +Each benefit carries a risk-adjustment factor (0–50%) reflecting implementation uncertainty. +A 20% risk adjustment on a $10M benefit yields a risk-adjusted value of $8M. +**Costs** are risk-adjusted **upward** by the same factor (higher risk → higher modelled cost). ### Financial Metrics | Metric | Description | |--------|-------------| | **NPV** | Net Present Value — total risk-adjusted benefits minus costs, discounted | -| **ROI** | Return on Investment — (benefits - costs) / costs × 100 | +| **ROI** | Return on Investment — `(benefits − costs) / costs × 100` | | **Payback** | Months until cumulative benefits exceed cumulative costs | +The initial investment (year 0) is **not** discounted. Year-N cashflows are +discounted at the end of the year: `PV = CF_n / (1 + r)^n`. This matches +the Forrester methodology used in the published studies. + ### Scenario Analysis -Three scenarios model uncertainty in adoption and realization: +Three scenarios model uncertainty in adoption and realization +(see `core.calculations.SCENARIOS`): -| Scenario | Approach | -|----------|----------| -| Conservative | Higher risk adjustments, lower adoption rates | -| Moderate | Balanced assumptions (base case) | -| Aggressive | Lower risk adjustments, faster adoption | +| Scenario | Adoption | Risk delta | Effect | +|----------|----------|------------|--------| +| Conservative | 80% | +10pp on benefits | Lower benefits, higher modelled cost | +| Moderate | 100% | 0 | Base case (= published study) | +| Aggressive | 115% | –5pp on benefits | Higher benefits, lower padding on cost | --- @@ -180,40 +228,48 @@ Three scenarios model uncertainty in adoption and realization: ``` palladium/ -├── app/ # Streamlit application -│ ├── main.py # App entry point -│ ├── pages/ -│ │ ├── benefits.py # Benefits data entry -│ │ ├── costs.py # Costs data entry -│ │ ├── summary.py # Financial summary dashboard -│ │ └── versions.py # Version history & comparison -│ └── components/ -│ ├── charts.py # Visualization components -│ └── tables.py # Data table components -├── notebooks/ # Jupyter analysis notebooks -│ ├── 01_benefits.ipynb -│ ├── 02_costs.ipynb -│ ├── 03_business_case.ipynb -│ └── 04_export.ipynb -├── tei_client/ # Athena API client -│ ├── __init__.py -│ ├── client.py # HTTP client with auth -│ └── models.py # Response data models -├── calculations/ # Financial calculation engine -│ ├── __init__.py -│ ├── npv.py # Net present value -│ ├── roi.py # Return on investment -│ ├── payback.py # Payback period -│ └── scenarios.py # Scenario multipliers -├── export/ # Report pipeline export -│ ├── __init__.py -│ └── report_data.py # JSON export for html2docx -├── tests/ +├── core/ # Shared, study-agnostic Python package +│ ├── tei_client/ # Athena API client +│ │ ├── client.py # TEIClient with all /api/v1/tei/ methods +│ │ └── models.py # Optional dataclasses for typed access +│ ├── calculations/ # Pure-python financial math +│ │ ├── npv.py +│ │ ├── roi.py +│ │ ├── payback.py +│ │ └── scenarios.py +│ ├── export/ +│ │ └── report_data.py # JSON envelope for the report pipeline +│ ├── notebook_helpers/ +│ │ ├── tables.py # Pandas dataframe builders +│ │ ├── charts.py # Plotly figures +│ │ └── display.py # IPython KPI cards, alerts +│ └── cli/ +│ └── main.py # `python -m palladium ...` +├── palladium/ # CLI shim (just exposes `python -m palladium`) +│ └── __main__.py +├── app/ # Streamlit UI — works with any TEI study +│ ├── main.py # entry point +│ ├── pages/ # benefits, costs, summary, versions +│ └── components/ # tables, charts +├── studies/ # One folder per TEI engagement +│ └── 202602_AmazonConnect/ +│ ├── README.md +│ ├── config.py # TOOL_PUBLIC_ID, REPORT_PUBLIC_ID +│ ├── seed_data.py # 5 benefits + 3 costs from the PDF +│ ├── notebooks/ +│ │ ├── 01_benefits.ipynb +│ │ ├── 02_costs.ipynb +│ │ ├── 03_business_case.ipynb +│ │ └── 04_export.ipynb +│ ├── exports/ # generated; .gitignored +│ └── docs/ +│ └── 202602_TEI Report Amazon Connect.pdf +├── tests/ # 50 tests for core/ │ ├── test_client.py │ ├── test_calculations.py │ └── test_export.py +├── Athena API.yaml # OpenAPI reference ├── .env.example -├── .gitignore ├── requirements.txt ├── pyproject.toml └── README.md @@ -227,18 +283,36 @@ Palladium connects to Athena's TEI module for data persistence and cross-tool re ### API Endpoints Used +All endpoints are under `/api/v1/tei/` and require `Authorization: Api-Key {key}`. + | Endpoint | Purpose | |----------|---------| -| `GET /forge/api/tei/reports/` | List available TEI model templates | -| `GET /forge/api/tei/reports/{id}/fields/` | Get field definitions for a model | -| `POST /forge/api/tei/tools/` | Create new TEI instance | -| `GET /forge/api/tei/tools/{public_id}/` | Get instance metadata | -| `GET /forge/api/tei/tools/{public_id}/values/` | Get current field values | -| `PUT /forge/api/tei/tools/{public_id}/values/` | Bulk update values | -| `POST /forge/api/tei/tools/{public_id}/calculate/` | Trigger calculation | -| `GET /forge/api/tei/tools/{public_id}/summary/` | Get financial summary | -| `POST /forge/api/tei/tools/{public_id}/versions/` | Save version snapshot | -| `GET /forge/api/tei/tools/{public_id}/export/` | Export for report pipeline | +| `GET /api/v1/tei/reports/` | List available TEI report templates | +| `GET /api/v1/tei/reports/{public_id}/` | Get a report template | +| `GET /api/v1/tei/reports/{public_id}/fields/` | Get field definitions for a template | +| `POST /api/v1/tei/tools/` | Create a new TEI tool instance | +| `GET /api/v1/tei/tools/{public_id}/` | Get instance metadata | +| `PATCH /api/v1/tei/tools/{public_id}/` | Update name/status | +| `GET /api/v1/tei/tools/{public_id}/values/` | Get current field values | +| `PUT /api/v1/tei/tools/{public_id}/values/` | Bulk-update values | +| `PATCH /api/v1/tei/tools/{public_id}/values/{field_key}/` | Patch a single value | +| `POST /api/v1/tei/tools/{public_id}/calculate/` | Trigger calculation | +| `GET /api/v1/tei/tools/{public_id}/summary/` | Get financial summary | +| `GET /api/v1/tei/tools/{public_id}/versions/` | List version snapshots | +| `POST /api/v1/tei/tools/{public_id}/versions/` | Save a new version | +| `GET /api/v1/tei/tools/{public_id}/versions/{n}/` | Get a specific version | +| `GET /api/v1/tei/tools/{public_id}/export/` | Export for the report pipeline | +| `GET /api/v1/tei/summary/` | Aggregate NPV across all tools | + +### Object model + +| Athena object | Notes | +|---|---| +| **Opportunity** | Top-level sales record. Owns one or more **Proposals**. | +| **Proposal** | A specific bid/offer to a client. **A TEI tool is linked to a Proposal.** | +| **Engagement** | Optional — for active client engagements. A TEI tool may also link here. | +| **TEIReport** | Template (e.g. *Amazon Connect 2026*) — defines fields, discount rate, analysis horizon. | +| **TEITool** | Instance of a Report bound to a Proposal — holds values, summaries, versions. | ### Authentication @@ -258,7 +332,7 @@ Palladium's export produces structured JSON consumed by the LLM report generatio Palladium Export (JSON) │ ▼ -LLM generates HTML (following HTML_DOCUMENT_FORMAT.md) +Peitho — LLM generates HTML (following HTML_DOCUMENT_FORMAT.md) │ ▼ html2docx converts to native Word @@ -267,23 +341,23 @@ html2docx converts to native Word Professional TEI Report (.docx) ``` -The export JSON includes: +The export envelope (`core.export.build_report_data`) includes: - All benefit categories with risk-adjusted values -- All cost categories with yearly breakdown -- Financial summary (NPV, ROI, payback) -- Yearly cash flow data (for waterfall/bar charts) -- Scenario analysis results (conservative/moderate/aggressive) -- Metadata (client, opportunity, analysis period, discount rate) +- All cost categories with yearly breakdown (and Initial column) +- Financial summary (NPV, ROI, payback, yearly cashflow) +- Conservative / moderate / aggressive scenario analysis +- Metadata (study slug, proposal, engagement, generator stamp) +- The raw Athena `/export/` payload for reference --- ## Version Management -Palladium manages version history through the Streamlit UI: +Palladium manages version history through both the API and the Streamlit UI: -1. **Save Version** — Snapshots current values + financial summary with a descriptive note -2. **View History** — See all versions with headline metrics (NPV, ROI) -3. **Compare Versions** — Side-by-side diff showing what changed between any two versions +1. **Save Version** — Snapshots current values + summary with a descriptive note +2. **View History** — All versions with headline metrics (NPV, ROI) +3. **Compare Versions** — Side-by-side diff of value changes between any two versions 4. **Restore Version** — Load a previous version's values as the current state Version notes should capture: @@ -302,6 +376,10 @@ Version notes should capture: pytest tests/ -v ``` +Tests are designed to run without an Athena connection — HTTP is mocked +and the calculation suite uses the Amazon Connect seed data to verify the +Forrester numbers reproduce within rounding. + ### Code Style ```bash @@ -311,10 +389,11 @@ ruff format . ### Adding a New Benefit Category -1. Define the field in Athena's TEI Model admin (field name, type, category, defaults) -2. The field automatically appears in Palladium via the API -3. Update notebook analysis if category-specific logic is needed -4. Update export mapping if the report template expects specific structure +1. Define the field in Athena's TEI Report admin (field name, type, category, defaults) +2. The field automatically appears in Palladium via the API — no client changes +3. Update notebook prose if category-specific commentary is needed +4. If the report template exposes a new structure, extend the envelope in + `core/export/report_data.py` --- @@ -341,4 +420,3 @@ ruff format . | **Athena** | Platform API — data persistence, cross-tool reporting | | **Peitho** | Document generation — consumes Palladium's export JSON | | **html2docx** | Converts LLM-generated HTML to native Word documents | - diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/components/__init__.py b/app/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/components/charts.py b/app/components/charts.py new file mode 100644 index 0000000..e278fc5 --- /dev/null +++ b/app/components/charts.py @@ -0,0 +1,32 @@ +"""Streamlit-friendly chart wrappers (delegate to core.notebook_helpers.charts).""" + +from __future__ import annotations + +import streamlit as st + +from core.notebook_helpers import charts as core_charts + + +def cashflow(yearly_breakdown, *, initial_cost: float = 0.0) -> None: + fig = core_charts.cashflow_chart(yearly_breakdown, initial_cost=initial_cost) + st.plotly_chart(fig, use_container_width=True) + + +def benefits_bar(items) -> None: + fig = core_charts.benefits_bar(items) + st.plotly_chart(fig, use_container_width=True) + + +def cost_pie(items) -> None: + fig = core_charts.cost_breakdown_pie(items) + st.plotly_chart(fig, use_container_width=True) + + +def scenario_bars(scenarios) -> None: + fig = core_charts.scenario_comparison(scenarios) + st.plotly_chart(fig, use_container_width=True) + + +def waterfall(values) -> None: + fig = core_charts.waterfall(values) + st.plotly_chart(fig, use_container_width=True) diff --git a/app/components/tables.py b/app/components/tables.py new file mode 100644 index 0000000..a687485 --- /dev/null +++ b/app/components/tables.py @@ -0,0 +1,106 @@ +"""Streamlit data-editor wrappers for benefit/cost rows.""" + +from __future__ import annotations + +import pandas as pd +import streamlit as st + + +def _years_for_table(fields: list[dict], analysis_years: int) -> list[int]: + """Years 1..N — taken from analysis_period_years on the report.""" + return list(range(1, max(int(analysis_years or 3), 1) + 1)) + + +def value_editor( + table: str, + fields: list[dict], + values: list[dict], + *, + analysis_years: int, + key: str, +) -> pd.DataFrame: + """ + Render an ``st.data_editor`` for benefit or cost values. + + The editor shows one row per field (filtered to ``table``), with year + columns, an ``initial`` column for costs, a risk_adjustment column, and + a notes column. Returns the edited DataFrame; the caller is responsible + for converting it back to value-row dicts and PUTting to Athena. + """ + fields = [f for f in fields if f.get("table") == table] + fields.sort(key=lambda f: int(f.get("sort_order") or 0)) + + by_key = {v.get("field_key"): v for v in values} + years = _years_for_table(fields, analysis_years) + + rows: list[dict] = [] + for f in fields: + v = by_key.get(f["field_key"], {}) or {} + yv = v.get("year_values") or {} + row = { + "field_key": f["field_key"], + "label": f.get("label", f["field_key"]), + "category": f.get("category", "") or "", + } + if table == "costs": + row["Initial"] = float(v.get("initial") or 0.0) + for y in years: + row[f"Year {y}"] = float(yv.get(str(y)) or 0.0) + row["risk_adj"] = float(v.get("risk_adjustment") or 0.0) + row["notes"] = v.get("notes", "") or "" + rows.append(row) + + df = pd.DataFrame(rows) + + column_config: dict = { + "field_key": st.column_config.TextColumn("Key", disabled=True, width="small"), + "label": st.column_config.TextColumn("Field", disabled=True), + "category": st.column_config.TextColumn("Category", disabled=True, width="small"), + "risk_adj": st.column_config.NumberColumn( + "Risk Adj.", min_value=0.0, max_value=1.0, step=0.05, format="%.2f" + ), + "notes": st.column_config.TextColumn("Notes", width="medium"), + } + if table == "costs": + column_config["Initial"] = st.column_config.NumberColumn( + "Initial", format="$%.0f" + ) + for y in years: + column_config[f"Year {y}"] = st.column_config.NumberColumn( + f"Year {y}", format="$%.0f" + ) + + edited = st.data_editor( + df, + column_config=column_config, + use_container_width=True, + num_rows="fixed", + hide_index=True, + key=key, + ) + return edited + + +def df_to_values(df: pd.DataFrame, table: str, analysis_years: int) -> list[dict]: + """Convert an edited DataFrame back to wire-format value rows.""" + out: list[dict] = [] + years = list(range(1, max(int(analysis_years or 3), 1) + 1)) + for _, row in df.iterrows(): + item: dict = {"field_key": row["field_key"], "table": table} + yv = {} + for y in years: + col = f"Year {y}" + if col in df.columns: + yv[str(y)] = float(row[col] or 0) + if yv: + item["year_values"] = yv + if table == "costs" and "Initial" in df.columns: + item["initial"] = float(row["Initial"] or 0) + ra = row.get("risk_adj") + if ra is not None and not pd.isna(ra): + item["risk_adjustment"] = float(ra) + notes = row.get("notes") + if isinstance(notes, str) and notes.strip(): + item["notes"] = notes.strip() + out.append(item) + return out diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..6313934 --- /dev/null +++ b/app/main.py @@ -0,0 +1,138 @@ +""" +Palladium Streamlit app — TEI data entry, calculation, versioning, export. + +Run from the project root:: + + streamlit run app/main.py + +The app picks a TEI tool by ``public_id`` (or creates one from a Report +template) and exposes Benefits, Costs, Summary, and Versions pages. It is +study-agnostic — the field set is loaded dynamically from Athena based on +the linked Report template. +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +# Allow `streamlit run app/main.py` from project root without `pip install -e .` +_ROOT = Path(__file__).resolve().parent.parent +if str(_ROOT) not in sys.path: + sys.path.insert(0, str(_ROOT)) + +import streamlit as st + +from core.tei_client import AthenaAPIError, TEIClient + +st.set_page_config( + page_title="Palladium — TEI Calculator", + page_icon="🛡️", + layout="wide", +) + + +@st.cache_resource(show_spinner=False) +def get_client() -> TEIClient: + return TEIClient() + + +def _safe_call(fn, *args, **kwargs): + """Run an API call, surfacing errors as Streamlit messages.""" + try: + return fn(*args, **kwargs) + except AthenaAPIError as e: + st.error(f"Athena API error {e.status_code}: {e.detail}") + except ValueError as e: + st.error(str(e)) + return None + + +def sidebar_tool_picker(client: TEIClient) -> dict | None: + """Sidebar: pick an existing TEI tool or create one from a report template.""" + st.sidebar.title("🛡️ Palladium") + st.sidebar.caption("TEI Calculator") + + tools = _safe_call(client.list_tools) or [] + if tools: + labels = { + f"{t.get('name', '(unnamed)')} — {t.get('id', '')[:8]}…": t for t in tools + } + choice = st.sidebar.selectbox("TEI Tool", list(labels.keys())) + tool = labels[choice] + else: + st.sidebar.info("No TEI tools yet. Create one below.") + tool = None + + with st.sidebar.expander("Create new tool"): + reports = _safe_call(client.list_reports) or [] + if not reports: + st.write("No report templates available.") + else: + report_labels = {f"{r['name']} ({r['vendor']} {r['version']})": r for r in reports} + r_choice = st.selectbox("Report template", list(report_labels.keys())) + new_name = st.text_input("Tool name (optional)", "") + proposal_id = st.number_input( + "Proposal ID (optional)", min_value=0, value=0, step=1 + ) + if st.button("Create"): + report = report_labels[r_choice] + created = _safe_call( + client.create_tool, + report_public_id=report["id"], + proposal=int(proposal_id) or None, + name=new_name or None, + ) + if created: + st.success(f"Created tool {created.get('id')}") + st.rerun() + + if tool: + st.sidebar.divider() + st.sidebar.markdown(f"**Public ID**: `{tool.get('id')}`") + st.sidebar.markdown(f"**Status**: {tool.get('status', '?')}") + st.sidebar.markdown(f"**Version**: {tool.get('current_version', 0)}") + if st.sidebar.button("🔄 Recalculate"): + _safe_call(client.calculate, tool["id"]) + st.toast("Recalculated.", icon="✅") + st.cache_data.clear() + return tool + + +def main() -> None: + st.title("Palladium — TEI Calculator") + try: + client = get_client() + except ValueError as e: + st.error(str(e)) + st.info("Set ATHENA_BASE_URL and ATHENA_API_KEY in your `.env` file.") + st.stop() + return + + tool = sidebar_tool_picker(client) + + if tool is None: + st.info("Pick or create a TEI tool from the sidebar to begin.") + return + + # Tab navigation — matches `app/pages/*` modules but kept as tabs so all + # views share the chosen tool/state without re-querying. + tabs = st.tabs(["📊 Summary", "💰 Benefits", "💸 Costs", "🕒 Versions"]) + + from app.pages import benefits as benefits_page + from app.pages import costs as costs_page + from app.pages import summary as summary_page + from app.pages import versions as versions_page + + with tabs[0]: + summary_page.render(client, tool) + with tabs[1]: + benefits_page.render(client, tool) + with tabs[2]: + costs_page.render(client, tool) + with tabs[3]: + versions_page.render(client, tool) + + +if __name__ == "__main__": + main() diff --git a/app/pages/__init__.py b/app/pages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/pages/_helpers.py b/app/pages/_helpers.py new file mode 100644 index 0000000..619de63 --- /dev/null +++ b/app/pages/_helpers.py @@ -0,0 +1,28 @@ +"""Common helpers shared by the page modules.""" + +from __future__ import annotations + +import streamlit as st + +from core.tei_client import AthenaAPIError, TEIClient + + +def report_meta(client: TEIClient, tool: dict) -> dict: + """Fetch the linked report (handles both nested-object and id-only forms).""" + report_obj = tool.get("report") + if isinstance(report_obj, dict): + return report_obj + if isinstance(report_obj, str): + try: + return client.get_report(report_obj) + except AthenaAPIError as e: + st.error(f"Failed to load report template: {e}") + return {} + + +def safe(fn, *args, **kwargs): + try: + return fn(*args, **kwargs) + except AthenaAPIError as e: + st.error(f"Athena API error {e.status_code}: {e.detail}") + return None diff --git a/app/pages/benefits.py b/app/pages/benefits.py new file mode 100644 index 0000000..255d0ac --- /dev/null +++ b/app/pages/benefits.py @@ -0,0 +1,46 @@ +"""Benefits data-entry tab.""" + +from __future__ import annotations + +import streamlit as st + +from app.components.tables import df_to_values, value_editor +from app.pages._helpers import report_meta, safe +from core.tei_client import TEIClient + + +def render(client: TEIClient, tool: dict) -> None: + st.header("💰 Benefits") + public_id = tool["id"] + report = report_meta(client, tool) + analysis_years = int(report.get("analysis_period_years") or 3) + + fields = safe(client.list_fields, report.get("id"), "benefits") or [] + values = [v for v in safe(client.get_values, public_id) or [] if v.get("table") == "benefits"] + + if not fields: + st.info("This report template has no benefit fields defined.") + return + + edited = value_editor( + "benefits", + fields, + values, + analysis_years=analysis_years, + key=f"benefits_editor_{public_id}", + ) + + col1, col2 = st.columns([1, 4]) + with col1: + if st.button("💾 Save benefits", use_container_width=True): + payload = df_to_values(edited, "benefits", analysis_years) + result = safe(client.update_values, public_id, payload) + if result is not None: + st.success(f"Saved {len(payload)} benefit values.") + st.cache_data.clear() + with col2: + st.caption( + "Values are saved as nominal annual amounts. Risk adjustments are " + "applied at calculate time. Use the Recalculate button in the " + "sidebar after saving to refresh the summary." + ) diff --git a/app/pages/costs.py b/app/pages/costs.py new file mode 100644 index 0000000..24e8185 --- /dev/null +++ b/app/pages/costs.py @@ -0,0 +1,46 @@ +"""Costs data-entry tab.""" + +from __future__ import annotations + +import streamlit as st + +from app.components.tables import df_to_values, value_editor +from app.pages._helpers import report_meta, safe +from core.tei_client import TEIClient + + +def render(client: TEIClient, tool: dict) -> None: + st.header("💸 Costs") + public_id = tool["id"] + report = report_meta(client, tool) + analysis_years = int(report.get("analysis_period_years") or 3) + + fields = safe(client.list_fields, report.get("id"), "costs") or [] + values = [v for v in safe(client.get_values, public_id) or [] if v.get("table") == "costs"] + + if not fields: + st.info("This report template has no cost fields defined.") + return + + edited = value_editor( + "costs", + fields, + values, + analysis_years=analysis_years, + key=f"costs_editor_{public_id}", + ) + + col1, col2 = st.columns([1, 4]) + with col1: + if st.button("💾 Save costs", use_container_width=True): + payload = df_to_values(edited, "costs", analysis_years) + result = safe(client.update_values, public_id, payload) + if result is not None: + st.success(f"Saved {len(payload)} cost values.") + st.cache_data.clear() + with col2: + st.caption( + "The Initial column is undiscounted year-0 spend. Year columns " + "are end-of-year cashflows. Costs are risk-adjusted upward " + "(higher risk → higher cost)." + ) diff --git a/app/pages/summary.py b/app/pages/summary.py new file mode 100644 index 0000000..4e7e767 --- /dev/null +++ b/app/pages/summary.py @@ -0,0 +1,104 @@ +"""Financial summary dashboard tab.""" + +from __future__ import annotations + +import streamlit as st + +from app.components import charts +from app.pages._helpers import report_meta, safe +from core.export import build_report_data +from core.tei_client import AthenaAPIError, TEIClient + + +def render(client: TEIClient, tool: dict) -> None: + st.header("📊 Financial Summary") + public_id = tool["id"] + report = report_meta(client, tool) + + try: + summary = client.get_summary(public_id) + except AthenaAPIError as e: + if e.status_code == 404: + st.info( + "No summary yet — click **Recalculate** in the sidebar after " + "filling in benefits and costs." + ) + return + st.error(f"Athena API error: {e.detail}") + return + + npv = float(summary.get("npv") or 0) + roi = float(summary.get("roi") or summary.get("roi_pct") or 0) + payback = summary.get("payback_months") + bpv = float(summary.get("total_benefits_pv") or 0) + cpv = float(summary.get("total_costs_pv") or 0) + + cols = st.columns(5) + cols[0].metric("NPV", f"${npv/1_000_000:,.1f}M") + cols[1].metric("ROI", f"{roi:,.0f}%") + cols[2].metric( + "Payback", + f"{float(payback):.1f} months" if payback is not None else "N/A", + ) + cols[3].metric("Benefits PV", f"${bpv/1_000_000:,.1f}M") + cols[4].metric("Costs PV", f"${cpv/1_000_000:,.1f}M") + + st.divider() + + yb = summary.get("yearly_breakdown") or [] + initial = float(summary.get("initial_costs") or 0) + if yb: + charts.cashflow(yb, initial_cost=initial) + with st.expander("Cash flow table"): + st.dataframe(yb, use_container_width=True, hide_index=True) + else: + st.caption("No yearly breakdown in this summary.") + + # Scenario comparison — computed locally from current values + with st.expander("Scenario analysis (conservative / moderate / aggressive)"): + envelope = safe( + build_report_data, + client, + public_id, + include_scenarios=True, + study_slug=report.get("name", ""), + ) + if envelope and envelope.get("scenarios"): + charts.scenario_bars(envelope["scenarios"]) + rows = [ + { + "Scenario": k, + "Benefits PV": float(v.get("total_benefits_pv") or 0), + "Costs PV": float(v.get("total_costs_pv") or 0), + "NPV": float(v.get("npv") or 0), + "ROI %": float(v.get("roi_pct") or 0), + "Payback (months)": ( + round(float(v.get("payback_months") or 0), 1) + if v.get("payback_months") is not None + else None + ), + } + for k, v in envelope["scenarios"].items() + ] + st.dataframe(rows, use_container_width=True, hide_index=True) + + # Export button + st.divider() + if st.button("📦 Build export envelope (JSON)"): + envelope = safe( + build_report_data, + client, + public_id, + include_scenarios=True, + study_slug=report.get("name", ""), + ) + if envelope: + import json + + data = json.dumps(envelope, indent=2, default=str) + st.download_button( + "Download export.json", + data=data, + file_name=f"{public_id}_export.json", + mime="application/json", + ) diff --git a/app/pages/versions.py b/app/pages/versions.py new file mode 100644 index 0000000..f05da77 --- /dev/null +++ b/app/pages/versions.py @@ -0,0 +1,117 @@ +"""Version history tab — list, diff, save, restore.""" + +from __future__ import annotations + +import streamlit as st + +from app.pages._helpers import safe +from core.tei_client import TEIClient + + +def _flatten_values(values: list[dict]) -> dict[str, dict]: + """Index a values list by field_key for easy diffing.""" + return {v.get("field_key", ""): v for v in values} + + +def _diff_rows(a: dict[str, dict], b: dict[str, dict]) -> list[dict]: + """Return one row per field with side-by-side year values.""" + keys = sorted(set(a.keys()) | set(b.keys())) + rows: list[dict] = [] + for k in keys: + av = a.get(k, {}) or {} + bv = b.get(k, {}) or {} + ay = av.get("year_values") or {} + by = bv.get("year_values") or {} + years = sorted(set(ay.keys()) | set(by.keys()), key=lambda x: int(x)) + for y in years: + a_val = float(ay.get(y) or 0) + b_val = float(by.get(y) or 0) + if abs(a_val - b_val) < 1e-9: + continue + rows.append( + { + "field_key": k, + "year": y, + "left": a_val, + "right": b_val, + "delta": b_val - a_val, + } + ) + return rows + + +def render(client: TEIClient, tool: dict) -> None: + st.header("🕒 Versions") + public_id = tool["id"] + + versions = safe(client.list_versions, public_id) or [] + versions = sorted( + versions, key=lambda v: int(v.get("version_number") or 0), reverse=True + ) + + # Save new version + with st.expander("➕ Save current state as a new version", expanded=not versions): + note = st.text_area( + "Version note", + placeholder=( + "What changed? E.g. 'CFO confirmed 1.8M contacts/month; " + "raised legacy license cost from $160 to $180/agent.'" + ), + ) + if st.button("💾 Save version", disabled=not note.strip()): + result = safe(client.save_version, public_id, note.strip()) + if result: + st.success( + f"Saved version {result.get('version_number', '?')}." + ) + st.rerun() + + if not versions: + st.info("No versions saved yet.") + return + + # Listing + st.subheader("History") + rows = [] + for v in versions: + snap = v.get("summary_snapshot") or v.get("summary") or {} + rows.append( + { + "Version": v.get("version_number"), + "Date": v.get("created_at") or v.get("date"), + "NPV": float(snap.get("npv") or 0), + "ROI %": float(snap.get("roi") or snap.get("roi_pct") or 0), + "Note": v.get("note", ""), + } + ) + st.dataframe(rows, use_container_width=True, hide_index=True) + + # Compare two versions + st.subheader("Compare") + if len(versions) < 2: + st.caption("Save two or more versions to compare.") + return + labels = {f"v{v['version_number']} — {v.get('note', '')[:40]}": v for v in versions} + keys = list(labels.keys()) + c1, c2 = st.columns(2) + with c1: + left_label = st.selectbox("Left (older)", keys, index=min(1, len(keys) - 1)) + with c2: + right_label = st.selectbox("Right (newer)", keys, index=0) + + if left_label == right_label: + st.caption("Pick two different versions to see a diff.") + return + + left = safe(client.get_version, public_id, labels[left_label]["version_number"]) + right = safe(client.get_version, public_id, labels[right_label]["version_number"]) + if not (left and right): + return + + a_values = left.get("values_snapshot") or left.get("values") or [] + b_values = right.get("values_snapshot") or right.get("values") or [] + diff = _diff_rows(_flatten_values(a_values), _flatten_values(b_values)) + if not diff: + st.success("No value differences between these versions.") + else: + st.dataframe(diff, use_container_width=True, hide_index=True) diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..e03e2ce --- /dev/null +++ b/core/__init__.py @@ -0,0 +1,3 @@ +"""Palladium core — shared TEI client, calculations, export, helpers.""" + +__version__ = "0.1.0" diff --git a/core/calculations/__init__.py b/core/calculations/__init__.py new file mode 100644 index 0000000..93678ee --- /dev/null +++ b/core/calculations/__init__.py @@ -0,0 +1,31 @@ +"""Pure-python TEI financial math.""" + +from core.calculations.npv import ( + discount_factor, + npv, + present_value, + present_value_series, +) +from core.calculations.payback import payback_months, payback_years +from core.calculations.roi import roi, roi_percentage +from core.calculations.scenarios import ( + SCENARIOS, + apply_scenario, + risk_adjust_benefit, + risk_adjust_cost, +) + +__all__ = [ + "SCENARIOS", + "apply_scenario", + "discount_factor", + "npv", + "payback_months", + "payback_years", + "present_value", + "present_value_series", + "risk_adjust_benefit", + "risk_adjust_cost", + "roi", + "roi_percentage", +] diff --git a/core/calculations/npv.py b/core/calculations/npv.py new file mode 100644 index 0000000..2b4fe1a --- /dev/null +++ b/core/calculations/npv.py @@ -0,0 +1,78 @@ +""" +Net Present Value and discounting. + +Convention (matches the Forrester TEI methodology used in the Amazon Connect +study): + +* The *Initial* investment (column "Initial" in TEI tables) is **not** + discounted — it occurs at time zero. +* Year-N cash flows are discounted at the end of the year: + ``PV = CF_n / (1 + r) ** n`` for ``n = 1, 2, …``. + +That matches the PDF note: *"The initial investment column contains costs +incurred at 'time 0' or at the beginning of Year 1 that are not discounted. +All other cash flows are discounted using the discount rate at the end of +the year."* +""" + +from __future__ import annotations + +from collections.abc import Iterable + + +def discount_factor(year: int, discount_rate: float) -> float: + """Return ``1 / (1 + r) ** year``. Year 0 → 1.0 (no discount).""" + if year < 0: + raise ValueError("year must be >= 0") + return 1.0 / ((1.0 + discount_rate) ** year) + + +def present_value(amount: float, year: int, discount_rate: float) -> float: + """Discount ``amount`` from end-of-year ``year`` to present.""" + return amount * discount_factor(year, discount_rate) + + +def present_value_series( + cashflows: Iterable[float], + discount_rate: float, + start_year: int = 1, +) -> float: + """ + Sum the present value of a stream of year-end cashflows. + + Args: + cashflows: iterable of year-N amounts (Y1, Y2, …). + discount_rate: e.g. 0.10 for 10%. + start_year: year of the first element. Default 1 (skip year-0). + """ + total = 0.0 + for offset, cf in enumerate(cashflows): + total += present_value(cf, start_year + offset, discount_rate) + return total + + +def npv( + cashflows: Iterable[float], + discount_rate: float, + initial: float = 0.0, +) -> float: + """ + Net Present Value. + + Args: + cashflows: year-end cashflows for Year 1, Year 2, … + discount_rate: e.g. 0.10 + initial: undiscounted year-0 cashflow (negative for a cost, + positive for a one-off benefit). + + Returns: + ``initial + Σ CF_n / (1 + r)^n`` for ``n = 1..len(cashflows)``. + + Example:: + + >>> # Amazon Connect total benefits PV ≈ $101.7M + >>> benefits = [27_279_019, 40_333_658, 57_983_794] + >>> round(npv(benefits, 0.10) / 1_000_000, 1) + 101.7 + """ + return initial + present_value_series(cashflows, discount_rate, start_year=1) diff --git a/core/calculations/payback.py b/core/calculations/payback.py new file mode 100644 index 0000000..087d59c --- /dev/null +++ b/core/calculations/payback.py @@ -0,0 +1,63 @@ +""" +Payback period. + +Linear interpolation within the crossing year: returns the moment when the +running net cashflow first turns non-negative. + +Inputs are *risk-adjusted, undiscounted* cashflows by convention (TEI shows +"<6 months" payback for the Amazon Connect composite using the risk-adjusted +nominal cashflows from the Cash Flow Analysis table). +""" + +from __future__ import annotations + +from collections.abc import Iterable + + +def payback_years( + initial_cost: float, + yearly_net_benefits: Iterable[float], +) -> float | None: + """ + Years until cumulative net benefits cover the initial cost. + + Args: + initial_cost: positive number — undiscounted year-0 outlay. + yearly_net_benefits: sequence of (benefits − costs) per year, Y1+. + + Returns: + Float number of years, or ``None`` if payback is never reached + within the supplied horizon. + + Example:: + + >>> # Amazon Connect: initial cost $1.196M, Y1 net $19.998M + >>> # → ~0.06 years ≈ 0.7 months — well under 6 months. + >>> round(payback_years(1_196_250, [19_997_953, 31_562_489, 47_443_905]), 3) + 0.06 + """ + remaining = float(initial_cost) + if remaining <= 0: + return 0.0 + cumulative_year = 0 + for cf in yearly_net_benefits: + cumulative_year += 1 + cf = float(cf) + if cf <= 0: + remaining += -cf # net loss this year increases the gap + continue + if cf >= remaining: + # Crossing happens partway through this year. + fraction = remaining / cf + return (cumulative_year - 1) + fraction + remaining -= cf + return None + + +def payback_months( + initial_cost: float, + yearly_net_benefits: Iterable[float], +) -> float | None: + """Same as :func:`payback_years`, expressed in months.""" + yrs = payback_years(initial_cost, yearly_net_benefits) + return yrs * 12.0 if yrs is not None else None diff --git a/core/calculations/roi.py b/core/calculations/roi.py new file mode 100644 index 0000000..9cd4b02 --- /dev/null +++ b/core/calculations/roi.py @@ -0,0 +1,27 @@ +"""Return on Investment.""" + +from __future__ import annotations + + +def roi(benefits_pv: float, costs_pv: float) -> float: + """ + Return on Investment as a fraction. + + ``ROI = (Benefits − Costs) / Costs`` + + Costs here are expressed as a positive present-value amount (the absolute + cost). Returns ``0.0`` when costs are zero (rather than dividing by zero). + + Example:: + + >>> round(roi(101_696_791, 22_983_076), 2) # Amazon Connect: 342% + 3.42 + """ + if costs_pv <= 0: + return 0.0 + return (benefits_pv - costs_pv) / costs_pv + + +def roi_percentage(benefits_pv: float, costs_pv: float) -> float: + """ROI as a percentage (e.g. 342.0 for 342%).""" + return roi(benefits_pv, costs_pv) * 100.0 diff --git a/core/calculations/scenarios.py b/core/calculations/scenarios.py new file mode 100644 index 0000000..a6ae49a --- /dev/null +++ b/core/calculations/scenarios.py @@ -0,0 +1,128 @@ +""" +Scenario modelling and risk adjustment. + +Forrester TEI applies a *downward* risk adjustment to benefits (subtract +``risk_factor × benefit``) and an *upward* adjustment to costs (add +``risk_factor × cost``). Scenarios scale both adoption (cashflow magnitude) +and uncertainty (risk factor). + +Default scenario multipliers are sensible starting points. Override per +study by editing the study's ``config.py`` and passing a custom dict to +:func:`apply_scenario`. +""" + +from __future__ import annotations + +from collections.abc import Iterable +from copy import deepcopy +from typing import Any + +#: Default scenario multipliers used by Palladium notebooks. +#: +#: * ``adoption`` scales nominal annual values up or down. +#: * ``risk_delta`` is *added* to the benefit's risk_adjustment factor and +#: *subtracted* from the cost's risk_adjustment factor (conservative +#: = more uncertainty on benefits, less padding on costs). +SCENARIOS: dict[str, dict[str, float]] = { + "conservative": {"adoption": 0.80, "risk_delta": 0.10}, + "moderate": {"adoption": 1.00, "risk_delta": 0.00}, + "aggressive": {"adoption": 1.15, "risk_delta": -0.05}, +} + + +def risk_adjust_benefit(amount: float, risk_factor: float) -> float: + """ + Apply a downward risk adjustment to a benefit. + + ``adjusted = amount × (1 − risk_factor)``. + + ``risk_factor`` is clamped to ``[0, 1]``. + """ + rf = max(0.0, min(1.0, float(risk_factor))) + return amount * (1.0 - rf) + + +def risk_adjust_cost(amount: float, risk_factor: float) -> float: + """ + Apply an upward risk adjustment to a cost. + + ``adjusted = amount × (1 + risk_factor)``. + + ``risk_factor`` is clamped to ``[0, 1]``. + """ + rf = max(0.0, min(1.0, float(risk_factor))) + return amount * (1.0 + rf) + + +def _scale_yearly(values: Iterable[float], factor: float) -> list[float]: + return [float(v) * factor for v in values] + + +def apply_scenario( + items: list[dict], + scenario: str = "moderate", + *, + multipliers: dict[str, dict[str, float]] | None = None, + table: str | None = None, +) -> list[dict]: + """ + Return a deep-copied list of value-rows with scenario adjustments applied. + + Each item is expected to have: + - ``table`` (``'benefits'`` or ``'costs'``) — required for sign of + risk_delta. If absent, defaults to ``benefits`` unless ``table=`` + is passed explicitly. + - ``year_values`` (dict of year-string → float) **or** a scalar + ``value``. + - ``risk_adjustment`` (optional float). + - ``initial`` (optional, costs only) — scaled by adoption. + + Args: + items: rows shaped like the ``_normalize_value`` output of + :class:`core.tei_client.TEIClient`. + scenario: key into ``multipliers`` (default ``SCENARIOS``). + multipliers: override map. Same shape as ``SCENARIOS``. + table: force a table when items lack one. + + Returns: + A new list — original items are not mutated. + """ + cfg = (multipliers or SCENARIOS).get(scenario) + if cfg is None: + raise KeyError(f"Unknown scenario: {scenario!r}") + adoption = float(cfg.get("adoption", 1.0)) + risk_delta = float(cfg.get("risk_delta", 0.0)) + + out: list[dict] = [] + for raw in items: + item: dict[str, Any] = deepcopy(raw) + item_table = item.get("table") or table or "benefits" + item["table"] = item_table + + # Adoption scaling + if "year_values" in item and isinstance(item["year_values"], dict): + item["year_values"] = { + k: float(v) * adoption for k, v in item["year_values"].items() + } + if "value" in item and item["value"] is not None: + try: + item["value"] = float(item["value"]) * adoption + except (TypeError, ValueError): + pass + if "initial" in item and item["initial"] is not None: + try: + item["initial"] = float(item["initial"]) * adoption + except (TypeError, ValueError): + pass + + # Risk adjustment delta + ra = item.get("risk_adjustment") + if ra is None: + ra = 0.0 + if item_table == "benefits": + new_ra = float(ra) + risk_delta + else: # costs: adverse scenario should *raise* costs less, so subtract + new_ra = float(ra) - risk_delta + item["risk_adjustment"] = max(0.0, min(1.0, new_ra)) + out.append(item) + return out diff --git a/core/cli/__init__.py b/core/cli/__init__.py new file mode 100644 index 0000000..dc0266e --- /dev/null +++ b/core/cli/__init__.py @@ -0,0 +1 @@ +"""Palladium CLI package — invoked via ``python -m palladium``.""" diff --git a/core/cli/main.py b/core/cli/main.py new file mode 100644 index 0000000..6973643 --- /dev/null +++ b/core/cli/main.py @@ -0,0 +1,229 @@ +""" +Palladium CLI implementation. + +Subcommands:: + + palladium test # Verify Athena connectivity + palladium list # List TEI tool instances + palladium reports # List TEI report templates + palladium summary # Print a tool's financial summary + palladium calculate # Trigger /calculate + palladium export -o file # Save export envelope as JSON + +The CLI is invoked via ``python -m palladium`` (root shim) which calls +:func:`main` here. +""" + +from __future__ import annotations + +import argparse +import json +import logging +import sys +from collections.abc import Sequence + +from core.export import build_report_data, write_report_data +from core.tei_client import AthenaAPIError, TEIClient + + +def _configure_logging(verbosity: int) -> None: + level = logging.WARNING + if verbosity == 1: + level = logging.INFO + elif verbosity >= 2: + level = logging.DEBUG + logging.basicConfig( + level=level, format="%(asctime)s %(levelname)s %(name)s: %(message)s" + ) + + +def _build_parser() -> argparse.ArgumentParser: + p = argparse.ArgumentParser( + prog="palladium", + description="Palladium — TEI Calculator CLI for Athena.", + ) + p.add_argument("-v", "--verbose", action="count", default=0) + sub = p.add_subparsers(dest="command", required=True) + + sub.add_parser("test", help="Verify Athena API connectivity") + sub.add_parser("list", help="List TEI tool instances") + sub.add_parser("reports", help="List TEI report templates") + + s_summary = sub.add_parser("summary", help="Print a tool's financial summary") + s_summary.add_argument("public_id") + + s_calc = sub.add_parser("calculate", help="Trigger calculation for a tool") + s_calc.add_argument("public_id") + + s_export = sub.add_parser("export", help="Export a tool's report data as JSON") + s_export.add_argument("public_id") + s_export.add_argument( + "-o", + "--output", + default="-", + help="Output path (default: stdout)", + ) + s_export.add_argument( + "--no-scenarios", + action="store_true", + help="Skip computing conservative/moderate/aggressive scenarios.", + ) + s_export.add_argument( + "--study-slug", + default=None, + help="Optional study identifier to embed in metadata.", + ) + + return p + + +def _print_table(rows: list[dict], columns: list[tuple[str, str]]) -> None: + """Tiny pure-stdlib pretty-printer.""" + widths = [len(label) for _, label in columns] + formatted: list[list[str]] = [] + for r in rows: + rec = [str(r.get(key, "") or "") for key, _ in columns] + formatted.append(rec) + for i, val in enumerate(rec): + if len(val) > widths[i]: + widths[i] = len(val) + fmt = " ".join(f"{{:<{w}}}" for w in widths) + print(fmt.format(*[label for _, label in columns])) + print(fmt.format(*["-" * w for w in widths])) + for rec in formatted: + print(fmt.format(*rec)) + + +def cmd_test(client: TEIClient, args) -> int: + result = client.test_connection() + print(json.dumps(result, indent=2)) + return 0 if result.get("status") == "ok" else 1 + + +def cmd_list(client: TEIClient, args) -> int: + tools = client.list_tools() + if not tools: + print("(no TEI tools)") + return 0 + rows = [] + for t in tools: + report = t.get("report") + if isinstance(report, dict): + report_name = report.get("name", "") + else: + report_name = report or "" + rows.append( + { + "id": t.get("id", ""), + "name": t.get("name", ""), + "report": report_name, + "status": t.get("status", ""), + "version": t.get("current_version", ""), + "modified": t.get("modified_date", ""), + } + ) + _print_table( + rows, + [ + ("id", "PUBLIC_ID"), + ("name", "NAME"), + ("report", "REPORT"), + ("status", "STATUS"), + ("version", "VER"), + ("modified", "MODIFIED"), + ], + ) + return 0 + + +def cmd_reports(client: TEIClient, args) -> int: + reports = client.list_reports() + if not reports: + print("(no reports)") + return 0 + rows = [ + { + "id": r.get("id", ""), + "name": r.get("name", ""), + "vendor": r.get("vendor", ""), + "version": r.get("version", ""), + "fields": r.get("field_count", 0), + "instances": r.get("instance_count", 0), + "status": r.get("status", ""), + } + for r in reports + ] + _print_table( + rows, + [ + ("id", "PUBLIC_ID"), + ("name", "NAME"), + ("vendor", "VENDOR"), + ("version", "VER"), + ("fields", "FIELDS"), + ("instances", "TOOLS"), + ("status", "STATUS"), + ], + ) + return 0 + + +def cmd_summary(client: TEIClient, args) -> int: + client.print_summary(args.public_id) + return 0 + + +def cmd_calculate(client: TEIClient, args) -> int: + client.calculate(args.public_id) + print(f"Recalculated {args.public_id}.") + client.print_summary(args.public_id) + return 0 + + +def cmd_export(client: TEIClient, args) -> int: + envelope = build_report_data( + client, + args.public_id, + include_scenarios=not args.no_scenarios, + study_slug=args.study_slug, + ) + if args.output in ("-", ""): + json.dump(envelope, sys.stdout, indent=2, default=str) + sys.stdout.write("\n") + else: + path = write_report_data(envelope, args.output) + print(f"Wrote {path}") + return 0 + + +COMMANDS = { + "test": cmd_test, + "list": cmd_list, + "reports": cmd_reports, + "summary": cmd_summary, + "calculate": cmd_calculate, + "export": cmd_export, +} + + +def main(argv: Sequence[str] | None = None) -> int: + parser = _build_parser() + args = parser.parse_args(argv) + _configure_logging(args.verbose) + + try: + client = TEIClient() + except ValueError as e: + print(f"error: {e}", file=sys.stderr) + return 2 + + handler = COMMANDS[args.command] + try: + return handler(client, args) + except AthenaAPIError as e: + print(f"Athena API error {e.status_code}: {e.detail}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": # pragma: no cover + raise SystemExit(main()) diff --git a/core/export/__init__.py b/core/export/__init__.py new file mode 100644 index 0000000..041b097 --- /dev/null +++ b/core/export/__init__.py @@ -0,0 +1,5 @@ +"""Export utilities — build the LLM-ready JSON envelope.""" + +from core.export.report_data import build_report_data, write_report_data + +__all__ = ["build_report_data", "write_report_data"] diff --git a/core/export/report_data.py b/core/export/report_data.py new file mode 100644 index 0000000..a27a836 --- /dev/null +++ b/core/export/report_data.py @@ -0,0 +1,224 @@ +""" +Build the structured JSON consumed by the report pipeline. + +The Athena ``GET /tools/{public_id}/export/`` endpoint already returns most +of what we need; this module: + +1. Calls the export endpoint. +2. Optionally augments it with locally computed scenario analysis + (conservative / moderate / aggressive). +3. Stamps Palladium metadata (export timestamp, study slug, generator). +4. Serializes to a stable JSON file that html2docx / Peitho can consume. +""" + +from __future__ import annotations + +import json +from datetime import UTC, datetime +from pathlib import Path +from typing import Any + +from core import __version__ +from core.calculations import ( + apply_scenario, + npv, + payback_months, + risk_adjust_benefit, + risk_adjust_cost, + roi_percentage, +) + + +def _split_by_table(values: list[dict]) -> tuple[list[dict], list[dict]]: + benefits = [v for v in values if v.get("table") == "benefits"] + costs = [v for v in values if v.get("table") == "costs"] + return benefits, costs + + +def _yearly_totals(items: list[dict], analysis_years: int) -> list[float]: + totals = [0.0] * analysis_years + for it in items: + yv = it.get("year_values") or {} + for k, v in yv.items(): + try: + year = int(k) + except (TypeError, ValueError): + continue + if 1 <= year <= analysis_years: + totals[year - 1] += float(v or 0) + return totals + + +def _initial_total(items: list[dict]) -> float: + return sum(float(it.get("initial") or 0) for it in items) + + +def _risk_adjusted(items: list[dict], for_table: str) -> list[dict]: + out: list[dict] = [] + for it in items: + rf = float(it.get("risk_adjustment") or 0.0) + adj_year_values: dict[str, float] = {} + for k, v in (it.get("year_values") or {}).items(): + v = float(v or 0) + adj_year_values[str(k)] = ( + risk_adjust_benefit(v, rf) + if for_table == "benefits" + else risk_adjust_cost(v, rf) + ) + adj = dict(it) + adj["year_values"] = adj_year_values + if "initial" in adj and adj["initial"] is not None: + adj["initial"] = ( + risk_adjust_cost(float(adj["initial"]), rf) + if for_table == "costs" + else float(adj["initial"]) + ) + out.append(adj) + return out + + +def _compute_summary( + benefits: list[dict], + costs: list[dict], + discount_rate: float, + analysis_years: int, +) -> dict[str, Any]: + benefits_ra = _risk_adjusted(benefits, "benefits") + costs_ra = _risk_adjusted(costs, "costs") + + benefits_yr = _yearly_totals(benefits_ra, analysis_years) + costs_yr = _yearly_totals(costs_ra, analysis_years) + initial_costs = _initial_total(costs_ra) + + benefits_pv = npv(benefits_yr, discount_rate) + costs_pv = npv(costs_yr, discount_rate, initial=initial_costs) + nominal_benefits = sum(benefits_yr) + nominal_costs = sum(costs_yr) + initial_costs + + net_yearly = [b - c for b, c in zip(benefits_yr, costs_yr, strict=False)] + pb = payback_months(initial_costs, net_yearly) + + return { + "discount_rate": discount_rate, + "analysis_years": analysis_years, + "total_benefits_nominal": nominal_benefits, + "total_benefits_pv": benefits_pv, + "total_costs_nominal": nominal_costs, + "total_costs_pv": costs_pv, + "npv": benefits_pv - costs_pv, + "roi_pct": roi_percentage(benefits_pv, costs_pv), + "payback_months": pb, + "yearly_breakdown": [ + { + "year": idx + 1, + "benefits": benefits_yr[idx], + "costs": costs_yr[idx], + "net": net_yearly[idx], + "cumulative_net": sum(net_yearly[: idx + 1]) - initial_costs, + } + for idx in range(analysis_years) + ], + "initial_costs": initial_costs, + } + + +def build_report_data( + client, + public_id: str, + *, + include_scenarios: bool = True, + study_slug: str | None = None, +) -> dict[str, Any]: + """ + Build the full export envelope for a TEI tool. + + Args: + client: a :class:`core.tei_client.TEIClient` instance. + public_id: the TEI tool's public_id. + include_scenarios: if True, locally compute conservative / moderate / + aggressive summaries and attach them under ``scenarios``. + study_slug: optional human-friendly study identifier (e.g. + ``"202602_AmazonConnect"``) — written into ``metadata``. + + Returns: + A dict with keys:: + + { + "metadata": {...}, # client / opportunity / study / generator + "report": {...}, # report template echo + "values": {benefits, costs}, + "summary": {...}, # locally recomputed (mirrors Athena) + "athena_export": {...}, # raw payload from Athena (if available) + "scenarios": {...} # optional + } + """ + # Pull everything we need + bundle = client.get_tool_with_data(public_id) + tool = bundle["tool"] + fields = bundle["fields"] + values = bundle["values"] + + report_obj = tool.get("report") + if isinstance(report_obj, str): + report = client.get_report(report_obj) + elif isinstance(report_obj, dict): + report = report_obj + else: + report = {} + + discount_rate = float(report.get("discount_rate") or 0.10) + analysis_years = int(report.get("analysis_period_years") or 3) + + benefits, costs = _split_by_table(values) + summary = _compute_summary(benefits, costs, discount_rate, analysis_years) + + try: + athena_export = client.export(public_id) + except Exception as e: # pragma: no cover – best effort + athena_export = {"error": str(e)} + + envelope: dict[str, Any] = { + "metadata": { + "study_slug": study_slug or "", + "tool_public_id": public_id, + "tool_name": tool.get("name", ""), + "report_name": report.get("name", ""), + "report_vendor": report.get("vendor", ""), + "report_version": report.get("version", ""), + "report_public_id": report.get("id", ""), + "proposal": tool.get("proposal") or tool.get("opportunity"), + "engagement": tool.get("engagement"), + "generated_at": datetime.now(UTC).isoformat(), + "generator": f"palladium core {__version__}", + }, + "report": report, + "fields": fields, + "values": {"benefits": benefits, "costs": costs}, + "summary": summary, + "athena_export": athena_export, + } + + if include_scenarios: + scenario_results: dict[str, Any] = {} + for scenario_name in ("conservative", "moderate", "aggressive"): + sb = apply_scenario(benefits, scenario_name, table="benefits") + sc = apply_scenario(costs, scenario_name, table="costs") + scenario_results[scenario_name] = _compute_summary( + sb, sc, discount_rate, analysis_years + ) + envelope["scenarios"] = scenario_results + + return envelope + + +def write_report_data( + envelope: dict[str, Any], + output_path: str | Path, + *, + indent: int = 2, +) -> Path: + """Serialize ``envelope`` to ``output_path`` and return the Path.""" + path = Path(output_path) + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(envelope, indent=indent, default=str)) + return path diff --git a/core/notebook_helpers/__init__.py b/core/notebook_helpers/__init__.py new file mode 100644 index 0000000..0a4a282 --- /dev/null +++ b/core/notebook_helpers/__init__.py @@ -0,0 +1,5 @@ +"""Notebook helpers — pandas tables, plotly charts, IPython display.""" + +from core.notebook_helpers import charts, display, tables + +__all__ = ["charts", "display", "tables"] diff --git a/core/notebook_helpers/charts.py b/core/notebook_helpers/charts.py new file mode 100644 index 0000000..16c018a --- /dev/null +++ b/core/notebook_helpers/charts.py @@ -0,0 +1,193 @@ +""" +Plotly charts for TEI analyses. + +Each function returns a ``plotly.graph_objects.Figure`` so callers can +``.show()`` (notebook), pass to ``st.plotly_chart`` (Streamlit), or write to +HTML / image. No styling is hard-coded beyond a neutral default palette. +""" + +from __future__ import annotations + +from collections.abc import Iterable + +import plotly.graph_objects as go + +PALETTE = { + "benefits": "#2E7D32", # green + "costs": "#C62828", # red + "net_positive": "#1565C0", # blue + "net_negative": "#C62828", + "cumulative": "#616161", # grey +} + + +def cashflow_chart( + yearly_breakdown: list[dict], + *, + title: str = "Cash Flow Analysis (Risk-Adjusted)", + initial_cost: float = 0.0, +) -> go.Figure: + """ + Stacked bars of benefits & costs by year + cumulative net line. + + Mirrors the chart on page 25 of the Forrester Amazon Connect TEI study. + """ + if not yearly_breakdown: + return go.Figure(layout={"title": title}) + + years = ["Initial"] + [f"Year {row['year']}" for row in yearly_breakdown] + benefits = [0.0] + [float(row.get("benefits", 0)) for row in yearly_breakdown] + costs = [-float(initial_cost)] + [ + -float(row.get("costs", 0)) for row in yearly_breakdown + ] + # cumulative_net assumes initial cost has already been deducted + cumulative = [-float(initial_cost)] + [ + float(row.get("cumulative_net", 0)) for row in yearly_breakdown + ] + + fig = go.Figure() + fig.add_bar( + name="Total benefits", + x=years, + y=benefits, + marker_color=PALETTE["benefits"], + ) + fig.add_bar( + name="Total costs", + x=years, + y=costs, + marker_color=PALETTE["costs"], + ) + fig.add_scatter( + name="Cumulative net benefits", + x=years, + y=cumulative, + mode="lines+markers", + line={"color": PALETTE["cumulative"], "width": 3}, + ) + fig.update_layout( + title=title, + barmode="relative", + yaxis_tickformat="$,.0f", + legend={"orientation": "h", "y": -0.15}, + margin={"l": 40, "r": 20, "t": 60, "b": 40}, + ) + return fig + + +def benefits_bar(items: list[dict], *, title: str = "Benefits (Three-Year)") -> go.Figure: + """Horizontal bars of risk-adjusted three-year totals per benefit.""" + labels: list[str] = [] + totals: list[float] = [] + for it in items: + rf = float(it.get("risk_adjustment") or 0.0) + yv = it.get("year_values") or {} + ra_total = sum(float(v or 0) * (1.0 - rf) for v in yv.values()) + labels.append(it.get("label", "") or it.get("field_key", "")) + totals.append(ra_total) + + fig = go.Figure( + go.Bar( + x=totals, + y=labels, + orientation="h", + marker_color=PALETTE["benefits"], + text=[f"${t/1_000_000:,.1f}M" for t in totals], + textposition="auto", + ) + ) + fig.update_layout( + title=title, + xaxis_tickformat="$,.0f", + yaxis={"autorange": "reversed"}, + margin={"l": 40, "r": 20, "t": 60, "b": 40}, + ) + return fig + + +def cost_breakdown_pie( + items: list[dict], *, title: str = "Cost Breakdown (Three-Year, Risk-Adjusted)" +) -> go.Figure: + """Pie chart of risk-adjusted costs by category/label.""" + labels: list[str] = [] + values: list[float] = [] + for it in items: + rf = float(it.get("risk_adjustment") or 0.0) + yv = it.get("year_values") or {} + initial = float(it.get("initial") or 0.0) + ra_total = ( + initial * (1.0 + rf) + + sum(float(v or 0) * (1.0 + rf) for v in yv.values()) + ) + labels.append(it.get("label", "") or it.get("field_key", "")) + values.append(ra_total) + + fig = go.Figure(go.Pie(labels=labels, values=values, hole=0.35)) + fig.update_layout(title=title, margin={"l": 40, "r": 20, "t": 60, "b": 40}) + return fig + + +def scenario_comparison(scenarios: dict) -> go.Figure: + """Grouped bars comparing NPV and Costs PV across scenarios.""" + keys: list[str] = list(scenarios.keys()) + if not keys: + return go.Figure() + benefits = [float(scenarios[k].get("total_benefits_pv") or 0) for k in keys] + costs = [float(scenarios[k].get("total_costs_pv") or 0) for k in keys] + npvs = [float(scenarios[k].get("npv") or 0) for k in keys] + + fig = go.Figure() + fig.add_bar(name="Benefits PV", x=keys, y=benefits, marker_color=PALETTE["benefits"]) + fig.add_bar(name="Costs PV", x=keys, y=costs, marker_color=PALETTE["costs"]) + fig.add_bar(name="NPV", x=keys, y=npvs, marker_color=PALETTE["net_positive"]) + fig.update_layout( + title="Scenario Comparison", + barmode="group", + yaxis_tickformat="$,.0f", + legend={"orientation": "h", "y": -0.15}, + ) + return fig + + +def cumulative_benefits_chart( + yearly_breakdown: list[dict], + *, + title: str = "Cumulative Net Benefits", +) -> go.Figure: + """Single-line cumulative net benefits trajectory.""" + if not yearly_breakdown: + return go.Figure(layout={"title": title}) + years = [f"Year {row['year']}" for row in yearly_breakdown] + cumulative = [float(row.get("cumulative_net", 0)) for row in yearly_breakdown] + fig = go.Figure( + go.Scatter( + x=years, + y=cumulative, + mode="lines+markers", + fill="tozeroy", + line={"color": PALETTE["net_positive"], "width": 3}, + ) + ) + fig.update_layout(title=title, yaxis_tickformat="$,.0f") + return fig + + +def waterfall(values: Iterable[tuple[str, float]], *, title: str = "TEI Waterfall") -> go.Figure: + """ + Generic waterfall (pass tuples of (label, value)). + + Used by 03_business_case to show: Benefits PV → Costs PV → NPV. + """ + labels, amounts = zip(*values, strict=True) if values else ([], []) + measures = ["relative"] * (len(labels) - 1) + ["total"] if labels else [] + fig = go.Figure( + go.Waterfall( + x=list(labels), + y=list(amounts), + measure=measures, + text=[f"${v/1_000_000:,.1f}M" for v in amounts], + textposition="outside", + ) + ) + fig.update_layout(title=title, yaxis_tickformat="$,.0f") + return fig diff --git a/core/notebook_helpers/display.py b/core/notebook_helpers/display.py new file mode 100644 index 0000000..f593ba0 --- /dev/null +++ b/core/notebook_helpers/display.py @@ -0,0 +1,141 @@ +""" +IPython display helpers — KPI cards, formatted summary blocks, alerts. + +Functions are notebook-safe: they fall back to plain ``print`` when running +outside Jupyter / when IPython is not available. +""" + +from __future__ import annotations + +from typing import Any + +try: # pragma: no cover – IPython is a soft dep + from IPython.display import HTML, display + + _IPY = True +except Exception: # pragma: no cover + _IPY = False + + +def _money(value: Any, default: str = "—") -> str: + try: + v = float(value) + except (TypeError, ValueError): + return default + if abs(v) >= 1_000_000_000: + return f"${v/1_000_000_000:,.1f}B" + if abs(v) >= 1_000_000: + return f"${v/1_000_000:,.1f}M" + if abs(v) >= 1_000: + return f"${v/1_000:,.1f}K" + return f"${v:,.0f}" + + +def _pct(value: Any, default: str = "—") -> str: + try: + v = float(value) + except (TypeError, ValueError): + return default + return f"{v:,.0f}%" + + +def _months(value: Any, default: str = "N/A") -> str: + if value is None: + return default + try: + v = float(value) + except (TypeError, ValueError): + return default + if v < 6: + return f"<6 months ({v:.1f})" + return f"{v:.1f} months" + + +def kpi_cards(summary: dict, *, title: str | None = None) -> Any: + """ + Render a row of KPI cards (NPV, ROI, Payback, Benefits PV). + + In notebooks, returns/displays inline HTML. Outside IPython, prints a + plain text version. + """ + npv = _money(summary.get("npv")) + roi = _pct(summary.get("roi") or summary.get("roi_pct")) + payback = _months(summary.get("payback_months")) + benefits_pv = _money(summary.get("total_benefits_pv")) + costs_pv = _money(summary.get("total_costs_pv")) + + if not _IPY: # pragma: no cover + print(title or "TEI Summary") + print(f" NPV: {npv} ROI: {roi} Payback: {payback}") + print(f" Benefits PV: {benefits_pv} Costs PV: {costs_pv}") + return None + + title_html = ( + f'
' + f"{title}
" + if title + else "" + ) + card_style = ( + "flex:1;min-width:140px;padding:14px 18px;margin:4px;border-radius:8px;" + "background:#f7f9fc;border:1px solid #e3e8ee;" + ) + label_style = "font-size:0.78em;color:#6b7480;text-transform:uppercase;letter-spacing:0.04em;" + value_style = "font-size:1.6em;font-weight:600;color:#1a2540;margin-top:4px;" + + cards = [ + ("NPV", npv), + ("ROI", roi), + ("Payback", payback), + ("Benefits PV", benefits_pv), + ("Costs PV", costs_pv), + ] + cards_html = "".join( + f'
' + f'
{label}
' + f'
{value}
' + f"
" + for label, value in cards + ) + html = ( + f'
{title_html}' + f'
{cards_html}
' + f"
" + ) + return display(HTML(html)) + + +def summary_panel(summary: dict, *, title: str = "TEI Financial Summary") -> None: + """Plain-text bordered summary block (mirrors the PDF Cash Flow Analysis).""" + width = 60 + print("═" * width) + print(f" {title}") + print("═" * width) + print(f" Benefits PV : {_money(summary.get('total_benefits_pv')):>20}") + print(f" Costs PV : {_money(summary.get('total_costs_pv')):>20}") + print("─" * width) + print(f" NPV : {_money(summary.get('npv')):>20}") + roi_val = summary.get("roi") or summary.get("roi_pct") + print(f" ROI : {_pct(roi_val):>20}") + print(f" Payback : {_months(summary.get('payback_months')):>20}") + print("═" * width) + + +def alert(text: str, kind: str = "info") -> Any: + """Coloured alert box for notebooks ('info', 'success', 'warning', 'error').""" + colors = { + "info": ("#0277bd", "#e1f5fe"), + "success": ("#2e7d32", "#e8f5e9"), + "warning": ("#ef6c00", "#fff3e0"), + "error": ("#c62828", "#ffebee"), + } + fg, bg = colors.get(kind, colors["info"]) + if not _IPY: # pragma: no cover + print(f"[{kind.upper()}] {text}") + return None + html = ( + f'
' + f"{text}
" + ) + return display(HTML(html)) diff --git a/core/notebook_helpers/tables.py b/core/notebook_helpers/tables.py new file mode 100644 index 0000000..7ffc30b --- /dev/null +++ b/core/notebook_helpers/tables.py @@ -0,0 +1,127 @@ +""" +Pandas dataframe builders for benefit / cost / summary tables. + +Each builder accepts the value-row dicts produced by +``core.tei_client.TEIClient._normalize_value`` and returns a +nicely-formatted DataFrame for display in notebooks. +""" + +from __future__ import annotations + +from collections.abc import Iterable +from typing import Any + +import pandas as pd + +from core.calculations import risk_adjust_benefit, risk_adjust_cost + + +def _years_in_data(items: Iterable[dict]) -> list[int]: + years: set[int] = set() + for it in items: + for k in (it.get("year_values") or {}): + try: + years.add(int(k)) + except (TypeError, ValueError): + continue + return sorted(years) + + +def benefits_table(items: list[dict]) -> pd.DataFrame: + """Tidy benefits dataframe with one row per benefit, year columns, totals.""" + if not items: + return pd.DataFrame( + columns=["field_key", "label", "category", "risk_adjustment"] + ) + years = _years_in_data(items) + rows: list[dict[str, Any]] = [] + for it in items: + rf = float(it.get("risk_adjustment") or 0.0) + yv = it.get("year_values") or {} + row = { + "field_key": it.get("field_key", ""), + "label": it.get("label", "") or it.get("field_key", ""), + "category": it.get("category", ""), + "risk_adjustment": rf, + } + nominal_total = 0.0 + ra_total = 0.0 + for y in years: + v = float(yv.get(str(y)) or 0.0) + ra = risk_adjust_benefit(v, rf) + row[f"Year {y}"] = v + row[f"Year {y} (RA)"] = ra + nominal_total += v + ra_total += ra + row["Total"] = nominal_total + row["Total (RA)"] = ra_total + rows.append(row) + return pd.DataFrame(rows) + + +def costs_table(items: list[dict]) -> pd.DataFrame: + """Tidy costs dataframe — adds an Initial column when present.""" + if not items: + return pd.DataFrame( + columns=["field_key", "label", "category", "risk_adjustment", "Initial"] + ) + years = _years_in_data(items) + rows: list[dict[str, Any]] = [] + for it in items: + rf = float(it.get("risk_adjustment") or 0.0) + yv = it.get("year_values") or {} + initial = float(it.get("initial") or 0.0) + row = { + "field_key": it.get("field_key", ""), + "label": it.get("label", "") or it.get("field_key", ""), + "category": it.get("category", ""), + "risk_adjustment": rf, + "Initial": initial, + "Initial (RA)": risk_adjust_cost(initial, rf), + } + nominal_total = initial + ra_total = risk_adjust_cost(initial, rf) + for y in years: + v = float(yv.get(str(y)) or 0.0) + ra = risk_adjust_cost(v, rf) + row[f"Year {y}"] = v + row[f"Year {y} (RA)"] = ra + nominal_total += v + ra_total += ra + row["Total"] = nominal_total + row["Total (RA)"] = ra_total + rows.append(row) + return pd.DataFrame(rows) + + +def summary_table(summary: dict) -> pd.DataFrame: + """Single-row summary dataframe of headline KPIs.""" + pb = summary.get("payback_months") + pb_str = f"{float(pb):.1f} months" if pb not in (None, "") else "N/A" + data = { + "NPV": [float(summary.get("npv") or 0)], + "ROI %": [float(summary.get("roi") or summary.get("roi_pct") or 0)], + "Payback": [pb_str], + "Benefits PV": [float(summary.get("total_benefits_pv") or 0)], + "Costs PV": [float(summary.get("total_costs_pv") or 0)], + "Discount rate": [float(summary.get("discount_rate") or 0)], + "Analysis years": [int(summary.get("analysis_years") or 0)], + } + return pd.DataFrame(data) + + +def cashflow_table(summary: dict) -> pd.DataFrame: + """Per-year cashflow dataframe from a summary's ``yearly_breakdown``.""" + yb = summary.get("yearly_breakdown") or [] + if not yb: + return pd.DataFrame(columns=["Year", "Benefits", "Costs", "Net", "Cumulative"]) + df = pd.DataFrame(yb) + rename = { + "year": "Year", + "benefits": "Benefits", + "costs": "Costs", + "net": "Net", + "cumulative_net": "Cumulative", + } + df = df.rename(columns=rename) + return df diff --git a/core/tei_client/__init__.py b/core/tei_client/__init__.py new file mode 100644 index 0000000..2c483c3 --- /dev/null +++ b/core/tei_client/__init__.py @@ -0,0 +1,13 @@ +"""TEI Client — Athena API wrapper for Palladium.""" + +from core.tei_client.client import AthenaAPIError, TEIClient +from core.tei_client.models import TEIField, TEIReport, TEISummary, TEIValue + +__all__ = [ + "AthenaAPIError", + "TEIClient", + "TEIField", + "TEIReport", + "TEISummary", + "TEIValue", +] diff --git a/core/tei_client/client.py b/core/tei_client/client.py new file mode 100644 index 0000000..65cad60 --- /dev/null +++ b/core/tei_client/client.py @@ -0,0 +1,563 @@ +""" +TEI Client — Athena API wrapper for Palladium. + +Endpoints (per Athena API.yaml, all under ``/api/v1/tei/``): + + Reports (templates) + GET /reports/ list_reports + GET /reports/{public_id}/ get_report + GET /reports/{public_id}/fields/ list_fields + PATCH /reports/{public_id}/fields/reorder/ reorder_fields + + Tools (instances) + GET /tools/ list_tools + POST /tools/ create_tool + GET /tools/{public_id}/ get_tool + PATCH /tools/{public_id}/ update_tool + DELETE /tools/{public_id}/ delete_tool + + Values (data entry) + GET /tools/{public_id}/values/ get_values + PUT /tools/{public_id}/values/ update_values (bulk) + PATCH /tools/{public_id}/values/{field_key}/ patch_value (single) + + Calculation & summary + POST /tools/{public_id}/calculate/ calculate + GET /tools/{public_id}/summary/ get_summary + GET /summary/ aggregate_summary + + Versions + GET /tools/{public_id}/versions/ list_versions + POST /tools/{public_id}/versions/ save_version + GET /tools/{public_id}/versions/{n}/ get_version + + Export + GET /tools/{public_id}/export/ export + +Authentication uses the ``Authorization: Api-Key {key}`` header. +""" + +from __future__ import annotations + +import json +import logging +import os +from datetime import datetime +from typing import Any + +import requests +from dotenv import load_dotenv + +load_dotenv() + +logger = logging.getLogger(__name__) + +API_PREFIX = "/api/v1/tei" + + +class AthenaAPIError(Exception): + """Raised when Athena returns a non-success response.""" + + def __init__(self, status_code: int, detail: str, url: str): + self.status_code = status_code + self.detail = detail + self.url = url + super().__init__(f"Athena API {status_code} at {url}: {detail}") + + +class TEIClient: + """ + Client for Athena's TEI Calculator API. + + Wraps every TEI endpoint and provides a few convenience helpers used by + the Palladium notebooks and Streamlit app. + + Environment variables (read via python-dotenv): + ATHENA_BASE_URL e.g. https://athena.nttdata.com + ATHENA_API_KEY Api-Key value (admin-issued) + + Example:: + + from core.tei_client import TEIClient + client = TEIClient() + client.test_connection() + for r in client.list_reports(): + print(r["name"]) + """ + + def __init__( + self, + base_url: str | None = None, + api_key: str | None = None, + timeout: int = 30, + ): + self.base_url = (base_url or os.getenv("ATHENA_BASE_URL", "")).rstrip("/") + self.api_key = api_key or os.getenv("ATHENA_API_KEY", "") + self.timeout = timeout + + if not self.base_url: + raise ValueError( + "ATHENA_BASE_URL is required. Set it in .env or pass base_url." + ) + if not self.api_key: + raise ValueError( + "ATHENA_API_KEY is required. Set it in .env or pass api_key." + ) + + self.session = requests.Session() + self.session.headers.update( + { + "Authorization": f"Api-Key {self.api_key}", + "Content-Type": "application/json", + "Accept": "application/json", + } + ) + + logger.info("TEIClient initialised for %s", self.base_url) + + # ───────────────────────────────────────────── + # Internal HTTP helpers + # ───────────────────────────────────────────── + + def _url(self, path: str) -> str: + if not path.startswith("/"): + path = f"/{path}" + return f"{self.base_url}{path}" + + def _request( + self, + method: str, + path: str, + params: dict | None = None, + json_data: Any | None = None, + ) -> Any: + url = self._url(path) + logger.debug("%s %s", method.upper(), url) + + try: + response = self.session.request( + method=method, + url=url, + params=params, + json=json_data, + timeout=self.timeout, + ) + except requests.ConnectionError as e: + raise AthenaAPIError(0, f"Connection failed: {e}", url) from e + except requests.Timeout as e: + raise AthenaAPIError(408, "Request timed out", url) from e + + if response.status_code >= 400: + try: + payload = response.json() + detail = payload.get("detail") or json.dumps(payload) + except (json.JSONDecodeError, ValueError, AttributeError): + detail = response.text + raise AthenaAPIError(response.status_code, detail, url) + + if response.status_code == 204 or not response.content: + return {} + return response.json() + + def _get(self, path: str, params: dict | None = None) -> Any: + return self._request("GET", path, params=params) + + def _post(self, path: str, data: Any | None = None) -> Any: + return self._request("POST", path, json_data=data) + + def _put(self, path: str, data: Any | None = None) -> Any: + return self._request("PUT", path, json_data=data) + + def _patch(self, path: str, data: Any | None = None) -> Any: + return self._request("PATCH", path, json_data=data) + + def _delete(self, path: str) -> Any: + return self._request("DELETE", path) + + def _paginated(self, path: str, params: dict | None = None) -> list[dict]: + """ + Fetch all pages of a paginated list endpoint. + + Athena uses the standard DRF page/results envelope:: + + {"count": N, "next": url|None, "previous": ..., "results": [...]} + """ + out: list[dict] = [] + result = self._get(path, params=params) + while True: + if isinstance(result, list): + out.extend(result) + return out + if not isinstance(result, dict): + return out + out.extend(result.get("results", []) or []) + next_url = result.get("next") + if not next_url: + return out + # Follow absolute next URL + try: + result = self.session.get(next_url, timeout=self.timeout).json() + except Exception: # pragma: no cover – defensive + return out + + # ───────────────────────────────────────────── + # Connection test + # ───────────────────────────────────────────── + + def test_connection(self) -> dict: + """Verify API connectivity and authentication.""" + try: + result = self._get(f"{API_PREFIX}/reports/") + count = ( + result.get("count", len(result.get("results", []))) + if isinstance(result, dict) + else len(result) + ) + return { + "status": "ok", + "base_url": self.base_url, + "authenticated": True, + "reports_found": count, + "timestamp": datetime.now().isoformat(), + } + except AthenaAPIError as e: + return { + "status": "error", + "base_url": self.base_url, + "authenticated": e.status_code != 401, + "error_code": e.status_code, + "detail": e.detail, + "timestamp": datetime.now().isoformat(), + } + + # ───────────────────────────────────────────── + # Reports (templates) + # ───────────────────────────────────────────── + + def list_reports(self) -> list[dict]: + """List all TEI report templates (auto-paginated).""" + return self._paginated(f"{API_PREFIX}/reports/") + + def get_report(self, public_id: str) -> dict: + """Get a TEI report template by its public_id.""" + return self._get(f"{API_PREFIX}/reports/{public_id}/") + + def list_fields( + self, + report_public_id: str, + table: str | None = None, + ) -> list[dict]: + """ + Get field definitions for a report. + + Args: + report_public_id: The report template's public_id (12-char short UUID). + table: Optional filter — ``'benefits'`` or ``'costs'``. + + Returns a list of field-definition dicts. See ``TEIField.from_dict`` + for the expected shape. + """ + params = {"table": table} if table else None + rows = self._paginated( + f"{API_PREFIX}/reports/{report_public_id}/fields/", params=params + ) + # Defensive — server-side filter may not be implemented; filter locally. + if table: + rows = [r for r in rows if r.get("table") == table] + rows.sort(key=lambda r: (r.get("table", ""), r.get("sort_order") or 0)) + return rows + + def create_field(self, report_public_id: str, field: dict) -> dict: + """Create a new field definition under a report (admin only).""" + return self._post( + f"{API_PREFIX}/reports/{report_public_id}/fields/", data=field + ) + + def update_field(self, report_public_id: str, field_id: int, **changes) -> dict: + """Patch one field definition by its integer id.""" + return self._patch( + f"{API_PREFIX}/reports/{report_public_id}/fields/{field_id}/", + data=changes, + ) + + def delete_field(self, report_public_id: str, field_id: int) -> dict: + return self._delete( + f"{API_PREFIX}/reports/{report_public_id}/fields/{field_id}/" + ) + + def reorder_fields(self, report_public_id: str, field_ids: list[int]) -> dict: + """Bulk-reorder fields. Spec: PATCH /reports/{id}/fields/reorder/.""" + return self._patch( + f"{API_PREFIX}/reports/{report_public_id}/fields/reorder/", + data={"field_ids": field_ids}, + ) + + # ───────────────────────────────────────────── + # Tools (instances) + # ───────────────────────────────────────────── + + def list_tools(self) -> list[dict]: + """List TEI tool instances owned by the current API key.""" + return self._paginated(f"{API_PREFIX}/tools/") + + def get_tool(self, public_id: str) -> dict: + """Get a TEI tool instance by public_id.""" + return self._get(f"{API_PREFIX}/tools/{public_id}/") + + def create_tool( + self, + report_public_id: str, + proposal: int | None = None, + engagement: int | None = None, + name: str | None = None, + status: str = "draft", + ) -> dict: + """ + Create a new TEI tool instance from a report template. + + Athena scopes a TEI tool to a *Proposal* (which itself belongs to an + Opportunity) and/or an *Engagement*. Pass the integer PK of either or + both to link the tool. + """ + data: dict[str, Any] = {"report": report_public_id, "status": status} + if proposal is not None: + data["proposal"] = proposal + if engagement is not None: + data["engagement"] = engagement + if name: + data["name"] = name + return self._post(f"{API_PREFIX}/tools/", data=data) + + def update_tool( + self, + public_id: str, + name: str | None = None, + status: str | None = None, + ) -> dict: + """Update tool metadata. Only ``name`` and ``status`` are mutable.""" + data: dict[str, Any] = {} + if name is not None: + data["name"] = name + if status is not None: + data["status"] = status + return self._patch(f"{API_PREFIX}/tools/{public_id}/", data=data) + + def delete_tool(self, public_id: str) -> dict: + return self._delete(f"{API_PREFIX}/tools/{public_id}/") + + # ───────────────────────────────────────────── + # Values (data entry) + # ───────────────────────────────────────────── + + @staticmethod + def _normalize_value(value: dict) -> dict: + """ + Normalize a value-row dict into the shape the API expects. + + Accepts any of the following input forms and produces a uniform + wire-format dict:: + + # annual fields + {"field_key": "A1", "year_1": 100, "year_2": 200, "year_3": 300, ...} + {"field_key": "A1", "year_values": {"1": 100, "2": 200, "3": 300}, ...} + + # non-annual scalars + {"field_key": "rate", "value": 0.10, ...} + + Returns a dict like:: + + {"field_key": "A1", + "year_values": {"1": 100.0, "2": 200.0, "3": 300.0}, + "risk_adjustment": 0.15, + "notes": "…"} + """ + out: dict[str, Any] = {} + if "field_key" in value: + out["field_key"] = value["field_key"] + elif "field" in value: + out["field_key"] = value["field"] + + # Collect annual year_N keys into year_values + year_values: dict[str, float] = {} + if "year_values" in value and isinstance(value["year_values"], dict): + for k, v in value["year_values"].items(): + year_values[str(k)] = float(v) if v is not None else 0.0 + for key, raw in value.items(): + if key.startswith("year_"): + try: + n = int(key.split("_", 1)[1]) + except ValueError: + continue + year_values[str(n)] = float(raw) if raw is not None else 0.0 + + if year_values: + out["year_values"] = year_values + if "value" in value and value["value"] is not None and not year_values: + out["value"] = value["value"] + if value.get("initial") is not None: + out["initial"] = float(value["initial"]) + if value.get("risk_adjustment") is not None: + out["risk_adjustment"] = float(value["risk_adjustment"]) + if value.get("notes"): + out["notes"] = str(value["notes"]) + return out + + def get_values(self, public_id: str) -> list[dict]: + """Get all current field values for a TEI tool instance.""" + result = self._get(f"{API_PREFIX}/tools/{public_id}/values/") + if isinstance(result, dict): + # Could be {"values": [...]} envelope, the TEITool wrapper, or a page + if "values" in result and isinstance(result["values"], list): + return result["values"] + if "results" in result and isinstance(result["results"], list): + return result["results"] + return [] + if isinstance(result, list): + return result + return [] + + def update_values(self, public_id: str, values: list[dict]) -> dict: + """ + Bulk-update field values. See ``_normalize_value`` for accepted shapes. + """ + payload = {"values": [self._normalize_value(v) for v in values]} + return self._put(f"{API_PREFIX}/tools/{public_id}/values/", data=payload) + + def patch_value(self, public_id: str, field_key: str, **changes) -> dict: + """ + Patch a single field value by its ``field_key``. + + Accepts the same shorthand as ``update_values`` (``year_1=…``, etc). + """ + body = self._normalize_value({"field_key": field_key, **changes}) + body.pop("field_key", None) # carried in URL + return self._patch( + f"{API_PREFIX}/tools/{public_id}/values/{field_key}/", data=body + ) + + # ───────────────────────────────────────────── + # Calculation & summary + # ───────────────────────────────────────────── + + def calculate(self, public_id: str) -> dict: + """Trigger server-side calculation; returns the updated summary.""" + return self._post(f"{API_PREFIX}/tools/{public_id}/calculate/") + + def get_summary(self, public_id: str) -> dict: + """Return the most-recent summary (404 if never calculated).""" + return self._get(f"{API_PREFIX}/tools/{public_id}/summary/") + + def aggregate_summary(self) -> dict: + """Aggregate NPV across all tools owned by the current API key.""" + return self._get(f"{API_PREFIX}/summary/") + + # ───────────────────────────────────────────── + # Versions + # ───────────────────────────────────────────── + + def list_versions(self, public_id: str) -> list[dict]: + """List all saved version snapshots for a TEI tool.""" + result = self._get(f"{API_PREFIX}/tools/{public_id}/versions/") + if isinstance(result, list): + return result + if isinstance(result, dict): + if "results" in result and isinstance(result["results"], list): + return result["results"] + if "versions" in result and isinstance(result["versions"], list): + return result["versions"] + return [] + + def save_version(self, public_id: str, note: str = "") -> dict: + """Snapshot current values + summary as a new version.""" + return self._post( + f"{API_PREFIX}/tools/{public_id}/versions/", + data={"note": note}, + ) + + def get_version(self, public_id: str, version_number: int) -> dict: + """Get a single version's full snapshot.""" + return self._get( + f"{API_PREFIX}/tools/{public_id}/versions/{int(version_number)}/" + ) + + # ───────────────────────────────────────────── + # Export + # ───────────────────────────────────────────── + + def export(self, public_id: str) -> dict: + """ + Return the LLM-ready export payload for the report pipeline. + + The shape is determined by Athena and consumed by Peitho / + html2docx; Palladium's ``core.export.report_data`` builds on this. + """ + return self._get(f"{API_PREFIX}/tools/{public_id}/export/") + + # ───────────────────────────────────────────── + # Convenience + # ───────────────────────────────────────────── + + def get_benefits(self, public_id: str) -> list[dict]: + """Return only benefit-table values (table='benefits').""" + return [v for v in self.get_values(public_id) if v.get("table") == "benefits"] + + def get_costs(self, public_id: str) -> list[dict]: + """Return only cost-table values (table='costs').""" + return [v for v in self.get_values(public_id) if v.get("table") == "costs"] + + def get_tool_with_data(self, public_id: str) -> dict: + """ + Bundle a tool, its field definitions, current values, and summary. + + Convenience for notebook initialisation. The summary is allowed to + 404 (returned as ``None``) when the tool has never been calculated. + """ + tool = self.get_tool(public_id) + report_pid = tool.get("report") + if isinstance(report_pid, dict): + report_pid = report_pid.get("id") or report_pid.get("public_id") + fields = self.list_fields(report_pid) if report_pid else [] + values = self.get_values(public_id) + try: + summary = self.get_summary(public_id) + except AthenaAPIError as e: + if e.status_code == 404: + summary = None + else: + raise + return { + "tool": tool, + "fields": fields, + "values": values, + "summary": summary, + } + + # ───────────────────────────────────────────── + # Display + # ───────────────────────────────────────────── + + def __repr__(self) -> str: # pragma: no cover + return f"TEIClient(base_url='{self.base_url}')" + + def print_summary(self, public_id: str) -> None: + """Pretty-print a financial summary block for notebooks/REPL.""" + s = self.get_summary(public_id) + + def _f(v: Any, default: float = 0.0) -> float: + try: + return float(v) if v is not None else default + except (TypeError, ValueError): + return default + + print("═" * 56) + print(" TEI Financial Summary") + print("═" * 56) + print(f" Total Benefits (PV): ${_f(s.get('total_benefits_pv')):>16,.0f}") + print(f" Total Costs (PV): ${_f(s.get('total_costs_pv')):>16,.0f}") + print("─" * 56) + print(f" Net Present Value: ${_f(s.get('npv')):>16,.0f}") + print(f" ROI: {_f(s.get('roi')):>15,.0f}%") + payback = s.get("payback_months") + payback_str = f"{_f(payback):.1f} months" if payback is not None else "N/A" + print(f" Payback: {payback_str:>17}") + print("═" * 56) diff --git a/core/tei_client/models.py b/core/tei_client/models.py new file mode 100644 index 0000000..34b07c9 --- /dev/null +++ b/core/tei_client/models.py @@ -0,0 +1,194 @@ +""" +Lightweight dataclasses for TEI API responses. + +These are *optional* — the client returns raw dicts. Use these when you want +attribute access or IDE help in notebooks. + + >>> from core.tei_client import TEIClient, TEIReport + >>> raw = TEIClient().get_report("abc123") + >>> report = TEIReport.from_dict(raw) + >>> report.discount_rate + 0.10 +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from decimal import Decimal +from typing import Any + + +def _as_float(value: Any, default: float = 0.0) -> float: + """Coerce Decimal/str/None into float.""" + if value is None or value == "": + return default + if isinstance(value, Decimal): + return float(value) + try: + return float(value) + except (TypeError, ValueError): + return default + + +@dataclass +class TEIReport: + """A TEI report template (model definition).""" + + id: str # public_id + name: str + vendor: str + version: str + description: str = "" + analysis_period_years: int = 3 + discount_rate: float = 0.10 + status: str = "active" + field_count: int = 0 + instance_count: int = 0 + created_at: str = "" + updated_at: str = "" + + @classmethod + def from_dict(cls, data: dict) -> TEIReport: + return cls( + id=str(data.get("id", "")), + name=data.get("name", ""), + vendor=data.get("vendor", ""), + version=data.get("version", ""), + description=data.get("description", "") or "", + analysis_period_years=int(data.get("analysis_period_years") or 3), + discount_rate=_as_float(data.get("discount_rate"), 0.10), + status=data.get("status", "active"), + field_count=int(data.get("field_count") or 0), + instance_count=int(data.get("instance_count") or 0), + created_at=data.get("created_at", "") or "", + updated_at=data.get("updated_at", "") or "", + ) + + +@dataclass +class TEIField: + """A field definition belonging to a TEI report template.""" + + id: int + table: str # 'benefits' | 'costs' + field_key: str + label: str + field_type: str # currency | percentage | integer | decimal | text + description: str = "" + category: str = "" + default_value: str = "" + is_annual: bool = True + risk_adjustment: float | None = None + sort_order: int = 0 + is_required: bool = False + source_notes: str = "" + + @classmethod + def from_dict(cls, data: dict) -> TEIField: + ra = data.get("risk_adjustment") + return cls( + id=int(data.get("id") or 0), + table=data.get("table", "benefits"), + field_key=data.get("field_key", ""), + label=data.get("label", ""), + field_type=data.get("field_type", "decimal"), + description=data.get("description", "") or "", + category=data.get("category", "") or "", + default_value=data.get("default_value", "") or "", + is_annual=bool(data.get("is_annual", True)), + risk_adjustment=_as_float(ra) if ra is not None else None, + sort_order=int(data.get("sort_order") or 0), + is_required=bool(data.get("is_required", False)), + source_notes=data.get("source_notes", "") or "", + ) + + +@dataclass +class TEIValue: + """ + A field value for a specific TEI tool instance. + + The exact wire format is not fully pinned in the OpenAPI spec; we use a + convention that the client `_normalize_value` helper builds: + + - annual fields: {field_key, year_values: {"1": ..., "2": ...}, + risk_adjustment, notes} + - non-annual scalar: {field_key, value, risk_adjustment, notes} + """ + + field_key: str + year_values: dict[str, float] = field(default_factory=dict) + value: float | None = None + risk_adjustment: float | None = None + notes: str = "" + + @classmethod + def from_dict(cls, data: dict) -> TEIValue: + ra = data.get("risk_adjustment") + yv_raw = data.get("year_values") or {} + year_values = {str(k): _as_float(v) for k, v in yv_raw.items()} + v = data.get("value") + return cls( + field_key=data.get("field_key", ""), + year_values=year_values, + value=_as_float(v) if v is not None else None, + risk_adjustment=_as_float(ra) if ra is not None else None, + notes=data.get("notes", "") or "", + ) + + def to_dict(self) -> dict: + out: dict[str, Any] = {"field_key": self.field_key} + if self.year_values: + out["year_values"] = self.year_values + if self.value is not None: + out["value"] = self.value + if self.risk_adjustment is not None: + out["risk_adjustment"] = self.risk_adjustment + if self.notes: + out["notes"] = self.notes + return out + + +@dataclass +class TEISummary: + """Calculated financial summary for a TEI tool instance.""" + + npv: float = 0.0 + roi: float = 0.0 + payback_months: float | None = None + discount_rate: float = 0.10 + analysis_years: int = 3 + total_benefits_nominal: float = 0.0 + total_benefits_risk_adjusted: float = 0.0 + total_benefits_pv: float = 0.0 + total_costs_nominal: float = 0.0 + total_costs_risk_adjusted: float = 0.0 + total_costs_pv: float = 0.0 + yearly_breakdown: list[dict] = field(default_factory=list) + category_breakdown: list[dict] = field(default_factory=list) + raw: dict = field(default_factory=dict) + + @classmethod + def from_dict(cls, data: dict) -> TEISummary: + return cls( + npv=_as_float(data.get("npv")), + roi=_as_float(data.get("roi")), + payback_months=( + _as_float(data.get("payback_months")) + if data.get("payback_months") is not None + else None + ), + discount_rate=_as_float(data.get("discount_rate"), 0.10), + analysis_years=int(data.get("analysis_years") or 3), + total_benefits_nominal=_as_float(data.get("total_benefits_nominal")), + total_benefits_risk_adjusted=_as_float( + data.get("total_benefits_risk_adjusted") + ), + total_benefits_pv=_as_float(data.get("total_benefits_pv")), + total_costs_nominal=_as_float(data.get("total_costs_nominal")), + total_costs_risk_adjusted=_as_float(data.get("total_costs_risk_adjusted")), + total_costs_pv=_as_float(data.get("total_costs_pv")), + yearly_breakdown=list(data.get("yearly_breakdown") or []), + category_breakdown=list(data.get("category_breakdown") or []), + raw=dict(data), + ) diff --git a/docs/Athena API.yaml b/docs/Athena API.yaml new file mode 100644 index 0000000..afce7a5 --- /dev/null +++ b/docs/Athena API.yaml @@ -0,0 +1,30709 @@ +openapi: 3.0.3 +info: + title: Athena API + version: 1.0.0 + description: "\n Comprehensive API for Athena advisory consulting platform.\n + \ \n ## Key Features\n \n - **Automatic Version Numbering**: Location + Tools use automatic sequential version numbering (1, 2, 3, etc.)\n - **RESTful + Design**: Standard HTTP methods and status codes\n - **JSON API**: All requests + and responses use JSON format\n - **API Key Authentication**: Secure access + with user-specific API keys\n - **Rate Limiting**: 1000 requests per hour per + API key\n - **Pagination**: Consistent pagination across all list endpoints\n + \ \n ## Location Tool Versioning\n \n The Location Tool implements + automatic version numbering to ensure data integrity:\n \n - Version numbers + are automatically assigned as sequential integers\n - No manual version input + is required or accepted\n - Concurrent version creation is handled safely\n + \ - All version numbers are stored as integers for proper sorting\n \n See + the Location Tools section for detailed examples and usage patterns.\n " +paths: + /api/v1/advisor/findings/: + get: + operationId: advisor_findings_list + description: Retrieve a list of findings across advisor tools owned by the current + user. + summary: List findings + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, impact_level, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search findings by name, description, or source detail + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedFindingList' + description: '' + post: + operationId: advisor_findings_create + description: Create a new finding within an advisor tool. + summary: Create finding + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/FindingRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/FindingRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/FindingRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Finding' + description: '' + /api/v1/advisor/findings/{id}/: + get: + operationId: advisor_findings_retrieve + description: Retrieve detailed information about a specific finding. + summary: Get finding details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this finding. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Finding' + description: '' + put: + operationId: advisor_findings_update + description: Update all fields of a finding. + summary: Update finding + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this finding. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/FindingRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/FindingRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/FindingRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Finding' + description: '' + patch: + operationId: advisor_findings_partial_update + description: Update specific fields of a finding. + summary: Partially update finding + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this finding. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedFindingRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedFindingRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedFindingRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Finding' + description: '' + delete: + operationId: advisor_findings_destroy + description: Delete a finding. + summary: Delete finding + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this finding. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/advisor/findings/by_impact/: + get: + operationId: advisor_findings_by_impact_retrieve + description: Filter findings by their impact level. + summary: Get findings by impact level + parameters: + - in: query + name: level + schema: + type: string + description: Impact level to filter by (e.g. High, Medium, Low) + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Finding' + description: '' + /api/v1/advisor/findings/by_source/: + get: + operationId: advisor_findings_by_source_retrieve + description: Filter findings by their source. + summary: Get findings by source + parameters: + - in: query + name: source + schema: + type: string + description: Source to filter findings by + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Finding' + description: '' + /api/v1/advisor/principles/: + get: + operationId: advisor_principles_list + description: Retrieve a list of principles across advisor tools owned by the + current user. + summary: List principles + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, weight, order, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search principles by name or description + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedPrincipleList' + description: '' + post: + operationId: advisor_principles_create + description: Create a new principle within an advisor tool. + summary: Create principle + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PrincipleRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PrincipleRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PrincipleRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Principle' + description: '' + /api/v1/advisor/principles/{id}/: + get: + operationId: advisor_principles_retrieve + description: Retrieve detailed information about a specific principle. + summary: Get principle details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this principle. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Principle' + description: '' + put: + operationId: advisor_principles_update + description: Update all fields of a principle. + summary: Update principle + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this principle. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PrincipleRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PrincipleRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PrincipleRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Principle' + description: '' + patch: + operationId: advisor_principles_partial_update + description: Update specific fields of a principle. + summary: Partially update principle + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this principle. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPrincipleRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPrincipleRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPrincipleRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Principle' + description: '' + delete: + operationId: advisor_principles_destroy + description: Delete a principle. + summary: Delete principle + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this principle. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/advisor/recommendations/: + get: + operationId: advisor_recommendations_list + description: Retrieve a list of recommendations across advisor tools owned by + the current user. + summary: List recommendations + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: title, cost, complexity, implementation_days, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search recommendations by title or description + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedRecommendationList' + description: '' + post: + operationId: advisor_recommendations_create + description: Create a new recommendation within an advisor tool. + summary: Create recommendation + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RecommendationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RecommendationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RecommendationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Recommendation' + description: '' + /api/v1/advisor/recommendations/{id}/: + get: + operationId: advisor_recommendations_retrieve + description: Retrieve detailed information about a specific recommendation. + summary: Get recommendation details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recommendation. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Recommendation' + description: '' + put: + operationId: advisor_recommendations_update + description: Update all fields of a recommendation. + summary: Update recommendation + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recommendation. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RecommendationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RecommendationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RecommendationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Recommendation' + description: '' + patch: + operationId: advisor_recommendations_partial_update + description: Update specific fields of a recommendation. + summary: Partially update recommendation + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recommendation. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedRecommendationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedRecommendationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedRecommendationRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Recommendation' + description: '' + delete: + operationId: advisor_recommendations_destroy + description: Delete a recommendation. + summary: Delete recommendation + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recommendation. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/advisor/recommendations/{id}/add_alignment/: + post: + operationId: advisor_recommendations_add_alignment_create + description: Add a principle alignment record to a recommendation. + summary: Add principle alignment to recommendation + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recommendation. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RecommendationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RecommendationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RecommendationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Recommendation' + description: '' + /api/v1/advisor/recommendations/{id}/add_impact/: + post: + operationId: advisor_recommendations_add_impact_create + description: Add an impact record to a recommendation. + summary: Add impact to recommendation + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this recommendation. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RecommendationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RecommendationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RecommendationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Recommendation' + description: '' + /api/v1/advisor/recommendations/by_complexity/: + get: + operationId: advisor_recommendations_by_complexity_retrieve + description: Filter recommendations by their implementation complexity. + summary: Get recommendations by complexity + parameters: + - in: query + name: complexity + schema: + type: string + description: Complexity level to filter by + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Recommendation' + description: '' + /api/v1/advisor/recommendations/by_timeframe/: + get: + operationId: advisor_recommendations_by_timeframe_retrieve + description: Filter recommendations by implementation timeframe. Short = ≤30 + days, Medium = 31–180 days, Long = >180 days. + summary: Get recommendations by timeframe + parameters: + - in: query + name: timeframe + schema: + type: string + description: 'Timeframe to filter by: Short, Medium, or Long' + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Recommendation' + description: '' + /api/v1/advisor/requirements/: + get: + operationId: advisor_requirements_list + description: Retrieve a list of requirements across advisor tools owned by the + current user. + summary: List requirements + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, type, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search requirements by name, description, or success measure + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedRequirementList' + description: '' + post: + operationId: advisor_requirements_create + description: Create a new requirement within an advisor tool. + summary: Create requirement + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RequirementRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RequirementRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RequirementRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Requirement' + description: '' + /api/v1/advisor/requirements/{id}/: + get: + operationId: advisor_requirements_retrieve + description: Retrieve detailed information about a specific requirement. + summary: Get requirement details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this requirement. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Requirement' + description: '' + put: + operationId: advisor_requirements_update + description: Update all fields of a requirement. + summary: Update requirement + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this requirement. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RequirementRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RequirementRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RequirementRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Requirement' + description: '' + patch: + operationId: advisor_requirements_partial_update + description: Update specific fields of a requirement. + summary: Partially update requirement + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this requirement. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedRequirementRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedRequirementRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedRequirementRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Requirement' + description: '' + delete: + operationId: advisor_requirements_destroy + description: Delete a requirement. + summary: Delete requirement + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this requirement. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/advisor/requirements/by_type/: + get: + operationId: advisor_requirements_by_type_retrieve + description: Filter requirements by their type. + summary: Get requirements by type + parameters: + - in: query + name: type + schema: + type: string + description: Requirement type to filter by + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Requirement' + description: '' + /api/v1/advisor/tools/: + get: + operationId: advisor_tools_list + description: Retrieve a list of advisor tools owned by the current user. + summary: List advisor tools + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search advisor tools by name or description + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedAdvisorToolList' + description: '' + post: + operationId: advisor_tools_create + description: Create a new advisor tool. + summary: Create advisor tool + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdvisorToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AdvisorToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AdvisorToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/AdvisorTool' + description: '' + /api/v1/advisor/tools/{id}/: + get: + operationId: advisor_tools_retrieve + description: Retrieve detailed information about a specific advisor tool. + summary: Get advisor tool details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Advisor Tool. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AdvisorTool' + description: '' + put: + operationId: advisor_tools_update + description: Update all fields of an advisor tool. + summary: Update advisor tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Advisor Tool. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdvisorToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AdvisorToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AdvisorToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AdvisorTool' + description: '' + patch: + operationId: advisor_tools_partial_update + description: Update specific fields of an advisor tool. + summary: Partially update advisor tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Advisor Tool. + required: true + tags: + - Advisor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedAdvisorToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedAdvisorToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedAdvisorToolRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AdvisorTool' + description: '' + delete: + operationId: advisor_tools_destroy + description: Delete an advisor tool and all associated data. + summary: Delete advisor tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Advisor Tool. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/advisor/tools/{id}/summary/: + get: + operationId: advisor_tools_summary_retrieve + description: Retrieve a comprehensive summary of the advisor tool including + all findings, requirements, principles, recommendations, and statistics. + summary: Get advisor tool summary + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Advisor Tool. + required: true + tags: + - Advisor + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AdvisorTool' + description: '' + /api/v1/bmc/canvases/: + get: + operationId: bmc_canvases_list + description: Retrieve a list of Business Model Canvases owned by the current + user. + summary: List BMC canvases + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedBMCList' + description: '' + post: + operationId: bmc_canvases_create + description: Create a new Business Model Canvas. The version number is automatically + assigned. + summary: Create BMC canvas + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BMCRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BMCRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BMCRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/BMC' + description: '' + /api/v1/bmc/canvases/{id}/: + get: + operationId: bmc_canvases_retrieve + description: Retrieve detailed information about a specific Business Model Canvas. + summary: Get BMC canvas details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Business Model Canvas. + required: true + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMC' + description: '' + put: + operationId: bmc_canvases_update + description: Update all fields of a Business Model Canvas. + summary: Update BMC canvas + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Business Model Canvas. + required: true + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BMCRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BMCRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BMCRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMC' + description: '' + patch: + operationId: bmc_canvases_partial_update + description: Update specific fields of a Business Model Canvas. + summary: Partially update BMC canvas + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Business Model Canvas. + required: true + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedBMCRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedBMCRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedBMCRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMC' + description: '' + delete: + operationId: bmc_canvases_destroy + description: Delete a Business Model Canvas. + summary: Delete BMC canvas + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Business Model Canvas. + required: true + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/bmc/canvases/{id}/create_version/: + post: + operationId: bmc_canvases_create_version_create + description: Create a new incremented version of the current Business Model + Canvas. + summary: Create new version of BMC + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Business Model Canvas. + required: true + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BMCRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BMCRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BMCRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMC' + description: '' + /api/v1/bmc/canvases/{id}/export_svg/: + get: + operationId: bmc_canvases_export_svg_retrieve + description: Export the Business Model Canvas as an SVG file download. + summary: Export BMC as SVG + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Business Model Canvas. + required: true + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + image/svg+xml: + schema: + type: string + format: binary + description: '' + /api/v1/bmc/canvases/{id}/save_as_template/: + post: + operationId: bmc_canvases_save_as_template_create + description: Save the current Business Model Canvas as a reusable template. + summary: Save BMC as template + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Business Model Canvas. + required: true + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BMCRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BMCRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BMCRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMC' + description: '' + /api/v1/bmc/canvases/{id}/save_to_gallery/: + post: + operationId: bmc_canvases_save_to_gallery_create + description: Render and save the Business Model Canvas to the media gallery. + summary: Save BMC to gallery + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Business Model Canvas. + required: true + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BMCRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BMCRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BMCRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMC' + description: '' + /api/v1/bmc/templates/: + get: + operationId: bmc_templates_list + description: Retrieve a list of active Business Model Canvas templates. + summary: List BMC templates + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedBMCTemplateList' + description: '' + post: + operationId: bmc_templates_create + description: Create a new Business Model Canvas template. + summary: Create BMC template + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BMCTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BMCTemplateRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTemplate' + description: '' + /api/v1/bmc/templates/{id}/: + get: + operationId: bmc_templates_retrieve + description: Retrieve detailed information about a specific BMC template. + summary: Get BMC template details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this bmc template. + required: true + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTemplate' + description: '' + put: + operationId: bmc_templates_update + description: Update all fields of a BMC template. + summary: Update BMC template + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this bmc template. + required: true + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BMCTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BMCTemplateRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTemplate' + description: '' + patch: + operationId: bmc_templates_partial_update + description: Update specific fields of a BMC template. + summary: Partially update BMC template + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this bmc template. + required: true + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedBMCTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedBMCTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedBMCTemplateRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTemplate' + description: '' + delete: + operationId: bmc_templates_destroy + description: Delete a BMC template. + summary: Delete BMC template + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this bmc template. + required: true + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/bmc/tools/: + get: + operationId: bmc_tools_list + description: Retrieve a list of Business Model Canvas tools owned by the current + user. + summary: List BMC tools + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedBMCToolList' + description: '' + post: + operationId: bmc_tools_create + description: Create a new Business Model Canvas tool. + summary: Create BMC tool + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BMCToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BMCToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BMCToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTool' + description: '' + /api/v1/bmc/tools/{id}/: + get: + operationId: bmc_tools_retrieve + description: Retrieve detailed information about a specific BMC tool. + summary: Get BMC tool details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this bmc tool. + required: true + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTool' + description: '' + put: + operationId: bmc_tools_update + description: Update all fields of a BMC tool. + summary: Update BMC tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this bmc tool. + required: true + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BMCToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BMCToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BMCToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTool' + description: '' + patch: + operationId: bmc_tools_partial_update + description: Update specific fields of a BMC tool. + summary: Partially update BMC tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this bmc tool. + required: true + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedBMCToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedBMCToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedBMCToolRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTool' + description: '' + delete: + operationId: bmc_tools_destroy + description: Delete a BMC tool and all associated canvases. + summary: Delete BMC tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this bmc tool. + required: true + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/bmc/tools/{id}/canvases/: + get: + operationId: bmc_tools_canvases_retrieve + description: Retrieve all canvas versions associated with a specific BMC tool, + ordered by version descending. + summary: List canvases for BMC tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this bmc tool. + required: true + tags: + - BMC + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTool' + description: '' + /api/v1/bmc/tools/{id}/create_canvas/: + post: + operationId: bmc_tools_create_canvas_create + description: Create a new canvas version for a specific BMC tool. The version + number is automatically incremented. + summary: Create canvas for BMC tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this bmc tool. + required: true + tags: + - BMC + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BMCToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BMCToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BMCToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BMCTool' + description: '' + /api/v1/calendar/events/: + get: + operationId: calendar_events_retrieve + description: Returns calendar events for the authenticated user within a specified + date range + summary: List calendar events + parameters: + - in: query + name: end + schema: + type: string + description: End date (ISO format) + - in: query + name: start + schema: + type: string + description: Start date (ISO format) + tags: + - calendar + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: List of calendar events + /api/v1/core/api-keys/: + get: + operationId: core_api_keys_list + description: Retrieve a list of API keys belonging to the current user. + summary: List user API keys + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedAPIKeyList' + description: '' + /api/v1/core/api-keys/{id}/: + get: + operationId: core_api_keys_retrieve + description: Retrieve detailed information about a specific API key. + summary: Get API key details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this api key. + required: true + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/APIKey' + description: '' + /api/v1/core/currencies/: + get: + operationId: core_currencies_list + description: Retrieve a list of all active currencies available in the system. + summary: List currencies + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedCurrencyList' + description: '' + /api/v1/core/currencies/{code}/: + get: + operationId: core_currencies_retrieve + description: Retrieve detailed information about a specific currency. + summary: Get currency details + parameters: + - in: path + name: code + schema: + type: string + description: A unique value identifying this currency. + required: true + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Currency' + description: '' + /api/v1/core/divisions/: + get: + operationId: core_divisions_list + description: Retrieve a list of divisions with optional filtering by organization. + summary: List organization divisions + parameters: + - in: query + name: organization + schema: + type: integer + description: Filter divisions by organization ID + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search divisions by name or abbreviation + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedOrganizationDivisionList' + description: '' + post: + operationId: core_divisions_create + description: Create a new organizational division. + summary: Create new division + tags: + - Core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDivisionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OrganizationDivisionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OrganizationDivisionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDivision' + description: '' + /api/v1/core/divisions/{id}/: + get: + operationId: core_divisions_retrieve + description: Retrieve detailed information about a specific division including + hierarchy and counts. + summary: Get division details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Organization Division. + required: true + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDivision' + description: '' + put: + operationId: core_divisions_update + description: Update an existing division's information. + summary: Update division + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Organization Division. + required: true + tags: + - Core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDivisionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OrganizationDivisionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OrganizationDivisionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDivision' + description: '' + patch: + operationId: core_divisions_partial_update + description: Partially update an existing division's information. + summary: Partially update division + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Organization Division. + required: true + tags: + - Core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedOrganizationDivisionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedOrganizationDivisionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedOrganizationDivisionRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDivision' + description: '' + delete: + operationId: core_divisions_destroy + description: Delete a division. Sub-divisions will have their parent cleared. + summary: Delete division + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Organization Division. + required: true + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/core/divisions/{id}/sub_divisions/: + get: + operationId: core_divisions_sub_divisions_list + description: Retrieve all sub-divisions of a division recursively. + summary: Get sub-divisions + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Organization Division. + required: true + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: search + required: false + in: query + description: A search term. + schema: + type: string + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedOrganizationDivisionList' + description: '' + /api/v1/core/fiscal-years/: + get: + operationId: core_fiscal_years_list + description: Retrieve a list of all fiscal years configured in the system. + summary: List fiscal years + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedFiscalYearList' + description: '' + /api/v1/core/fiscal-years/{id}/: + get: + operationId: core_fiscal_years_retrieve + description: Retrieve detailed information about a specific fiscal year including + quarters. + summary: Get fiscal year details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this fiscal year. + required: true + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/FiscalYear' + description: '' + /api/v1/core/organizations/: + get: + operationId: core_organizations_list + description: Retrieve a list of organizations with optional search by name. + summary: List organizations + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search organizations by name + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedOrganizationList' + description: '' + /api/v1/core/organizations/{id}/: + get: + operationId: core_organizations_retrieve + description: Retrieve detailed information about a specific organization. + summary: Get organization details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this organization. + required: true + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Organization' + description: '' + /api/v1/core/profile/: + get: + operationId: core_profile_retrieve + description: Retrieve the current user's profile settings including timezone, + date format, and theme preferences. + summary: Get user profile + tags: + - Core + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + description: '' + put: + operationId: core_profile_update + description: Update the current user's profile settings. + summary: Update user profile + tags: + - Core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfileRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/UserProfileRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/UserProfileRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + description: '' + patch: + operationId: core_profile_partial_update + description: Partially update the current user's profile settings. + summary: Partially update user profile + tags: + - Core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedUserProfileRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedUserProfileRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedUserProfileRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + description: '' + /api/v1/core/stats/: + get: + operationId: core_stats_retrieve + description: Get API usage statistics and metrics. + summary: API Statistics + tags: + - System + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + type: object + properties: + total_requests: + type: integer + active_users: + type: integer + endpoints_available: + type: integer + rate_limit_info: + type: object + properties: + limit: + type: integer + remaining: + type: integer + reset_time: + type: string + format: date-time + description: '' + /api/v1/deckcraft/decks/: + get: + operationId: deckcraft_decks_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDeckList' + description: '' + post: + operationId: deckcraft_decks_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + /api/v1/deckcraft/decks/{id}/: + get: + operationId: deckcraft_decks_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + put: + operationId: deckcraft_decks_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + patch: + operationId: deckcraft_decks_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedDeckRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedDeckRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedDeckRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + delete: + operationId: deckcraft_decks_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/deckcraft/decks/{id}/download/: + get: + operationId: deckcraft_decks_download_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + /api/v1/deckcraft/decks/{id}/generate/: + post: + operationId: deckcraft_decks_generate_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + /api/v1/deckcraft/presentations/: + get: + operationId: deckcraft_presentations_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedPresentationList' + description: '' + post: + operationId: deckcraft_presentations_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PresentationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PresentationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PresentationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Presentation' + description: '' + /api/v1/deckcraft/presentations/{id}/: + get: + operationId: deckcraft_presentations_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this presentation. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Presentation' + description: '' + put: + operationId: deckcraft_presentations_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this presentation. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PresentationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PresentationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PresentationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Presentation' + description: '' + patch: + operationId: deckcraft_presentations_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this presentation. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPresentationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPresentationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPresentationRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Presentation' + description: '' + delete: + operationId: deckcraft_presentations_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this presentation. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/deckcraft/slides/: + get: + operationId: deckcraft_slides_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDeckSlideList' + description: '' + post: + operationId: deckcraft_slides_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlide' + description: '' + /api/v1/deckcraft/slides/{id}/: + get: + operationId: deckcraft_slides_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck slide. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlide' + description: '' + put: + operationId: deckcraft_slides_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck slide. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlide' + description: '' + patch: + operationId: deckcraft_slides_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck slide. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedDeckSlideRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedDeckSlideRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedDeckSlideRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlide' + description: '' + delete: + operationId: deckcraft_slides_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck slide. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/deckcraft/slides/reorder/: + post: + operationId: deckcraft_slides_reorder_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlide' + description: '' + /api/v1/deckcraft/table-sources/: + get: + operationId: deckcraft_table_sources_list + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedTableSourceList' + description: '' + /api/v1/deckcraft/table-sources/{id}/: + get: + operationId: deckcraft_table_sources_retrieve + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TableSource' + description: '' + /api/v1/deckcraft/table-sources/{id}/data/: + get: + operationId: deckcraft_table_sources_data_retrieve + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TableSource' + description: '' + /api/v1/deckcraft/templates/: + get: + operationId: deckcraft_templates_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedPowerPointTemplateList' + description: '' + post: + operationId: deckcraft_templates_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + /api/v1/deckcraft/templates/{id}/: + get: + operationId: deckcraft_templates_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + put: + operationId: deckcraft_templates_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + patch: + operationId: deckcraft_templates_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPowerPointTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPowerPointTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPowerPointTemplateRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + delete: + operationId: deckcraft_templates_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/deckcraft/templates/{id}/layouts/: + get: + operationId: deckcraft_templates_layouts_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + /api/v1/deckcraft/templates/{id}/refresh/: + post: + operationId: deckcraft_templates_refresh_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + /api/v1/engagement/engagements/: + get: + operationId: engagement_engagements_list + description: Retrieve a paginated list of client engagements with summary information. + summary: List engagements + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, start_date, end_date, status, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search engagements by name, description, or client name + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedEngagementSummaryList' + description: '' + post: + operationId: engagement_engagements_create + description: Create a new client engagement. + summary: Create engagement + tags: + - Engagement + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EngagementRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/EngagementRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/EngagementRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Engagement' + description: '' + /api/v1/engagement/engagements/{id}/: + get: + operationId: engagement_engagements_retrieve + description: Retrieve detailed information about a specific engagement. + summary: Get engagement details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this engagement. + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Engagement' + description: '' + put: + operationId: engagement_engagements_update + description: Update all fields of an engagement record. + summary: Update engagement + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this engagement. + required: true + tags: + - Engagement + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EngagementRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/EngagementRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/EngagementRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Engagement' + description: '' + patch: + operationId: engagement_engagements_partial_update + description: Update specific fields of an engagement record. + summary: Partially update engagement + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this engagement. + required: true + tags: + - Engagement + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedEngagementRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedEngagementRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedEngagementRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Engagement' + description: '' + delete: + operationId: engagement_engagements_destroy + description: Delete an engagement record. + summary: Delete engagement + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this engagement. + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/engagement/engagements/{id}/summary/: + get: + operationId: engagement_engagements_summary_retrieve + description: Retrieve comprehensive engagement summary including interviews, + workshops, and statistics. + summary: Get engagement summary + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this engagement. + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + type: object + properties: + engagement: + type: object + description: Engagement details + interviews: + type: array + description: List of interviews + workshops: + type: array + description: List of workshops + statistics: + type: object + properties: + total_interviews: + type: integer + total_workshops: + type: integer + duration_days: + type: integer + description: '' + /api/v1/engagement/engagements/by_client/: + get: + operationId: engagement_engagements_by_client_retrieve + description: Filter engagements by a specific client. + summary: Get engagements by client + parameters: + - in: query + name: client_id + schema: + type: string + format: uuid + description: ID of the client to filter engagements by + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Engagement' + description: '' + /api/v1/engagement/engagements/by_status/: + get: + operationId: engagement_engagements_by_status_retrieve + description: Filter engagements by their current status. + summary: Get engagements by status + parameters: + - in: query + name: status + schema: + type: string + description: Status to filter engagements by + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Engagement' + description: '' + /api/v1/engagement/interviews/: + get: + operationId: engagement_interviews_list + description: Retrieve a list of interviews for engagements owned by the current + user. + summary: List interviews + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, date, time' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search interviews by name, notes, or contact name + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedInterviewList' + description: '' + post: + operationId: engagement_interviews_create + description: Create a new interview within an engagement. + summary: Create interview + tags: + - Engagement + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InterviewRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/InterviewRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/InterviewRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Interview' + description: '' + /api/v1/engagement/interviews/{id}/: + get: + operationId: engagement_interviews_retrieve + description: Retrieve detailed information about a specific interview. + summary: Get interview details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this interview. + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Interview' + description: '' + put: + operationId: engagement_interviews_update + description: Update all fields of an interview record. + summary: Update interview + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this interview. + required: true + tags: + - Engagement + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InterviewRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/InterviewRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/InterviewRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Interview' + description: '' + patch: + operationId: engagement_interviews_partial_update + description: Update specific fields of an interview record. + summary: Partially update interview + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this interview. + required: true + tags: + - Engagement + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedInterviewRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedInterviewRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedInterviewRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Interview' + description: '' + delete: + operationId: engagement_interviews_destroy + description: Delete an interview record. + summary: Delete interview + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this interview. + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/engagement/interviews/by_engagement/: + get: + operationId: engagement_interviews_by_engagement_retrieve + description: Retrieve all interviews for a specific engagement. + summary: Get interviews by engagement + parameters: + - in: query + name: engagement_id + schema: + type: string + format: uuid + description: ID of the engagement to filter interviews by + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Interview' + description: '' + /api/v1/engagement/workshops/: + get: + operationId: engagement_workshops_list + description: Retrieve a list of workshops for engagements owned by the current + user. + summary: List workshops + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, date, time, workshop_type' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search workshops by name, notes, or workshop type + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedWorkshopList' + description: '' + post: + operationId: engagement_workshops_create + description: Create a new workshop within an engagement. + summary: Create workshop + tags: + - Engagement + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WorkshopRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/WorkshopRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/WorkshopRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Workshop' + description: '' + /api/v1/engagement/workshops/{id}/: + get: + operationId: engagement_workshops_retrieve + description: Retrieve detailed information about a specific workshop. + summary: Get workshop details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this workshop. + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Workshop' + description: '' + put: + operationId: engagement_workshops_update + description: Update all fields of a workshop record. + summary: Update workshop + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this workshop. + required: true + tags: + - Engagement + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WorkshopRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/WorkshopRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/WorkshopRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Workshop' + description: '' + patch: + operationId: engagement_workshops_partial_update + description: Update specific fields of a workshop record. + summary: Partially update workshop + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this workshop. + required: true + tags: + - Engagement + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedWorkshopRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedWorkshopRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedWorkshopRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Workshop' + description: '' + delete: + operationId: engagement_workshops_destroy + description: Delete a workshop record. + summary: Delete workshop + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this workshop. + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/engagement/workshops/by_engagement/: + get: + operationId: engagement_workshops_by_engagement_retrieve + description: Retrieve all workshops for a specific engagement. + summary: Get workshops by engagement + parameters: + - in: query + name: engagement_id + schema: + type: string + format: uuid + description: ID of the engagement to filter workshops by + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Workshop' + description: '' + /api/v1/engagement/workshops/by_type/: + get: + operationId: engagement_workshops_by_type_retrieve + description: Filter workshops by workshop type. + summary: Get workshops by type + parameters: + - in: query + name: type + schema: + type: string + description: Workshop type to filter by + required: true + tags: + - Engagement + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Workshop' + description: '' + /api/v1/gallery/collections/: + get: + operationId: gallery_collections_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + schema: + type: integer + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedMediaCollectionList' + description: '' + post: + operationId: gallery_collections_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - gallery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MediaCollectionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MediaCollectionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MediaCollectionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/MediaCollection' + description: '' + /api/v1/gallery/collections/{id}/: + get: + operationId: gallery_collections_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this media collection. + required: true + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MediaCollection' + description: '' + put: + operationId: gallery_collections_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this media collection. + required: true + tags: + - gallery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MediaCollectionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MediaCollectionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MediaCollectionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MediaCollection' + description: '' + patch: + operationId: gallery_collections_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this media collection. + required: true + tags: + - gallery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedMediaCollectionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedMediaCollectionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedMediaCollectionRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MediaCollection' + description: '' + delete: + operationId: gallery_collections_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this media collection. + required: true + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/gallery/media/: + get: + operationId: gallery_media_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + schema: + type: integer + - name: search + required: false + in: query + description: A search term. + schema: + type: string + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedMediaItemList' + description: '' + post: + operationId: gallery_media_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - gallery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MediaItemRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MediaItemRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MediaItemRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/MediaItem' + description: '' + /api/v1/gallery/media/{id}/: + get: + operationId: gallery_media_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this media item. + required: true + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MediaItem' + description: '' + put: + operationId: gallery_media_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this media item. + required: true + tags: + - gallery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MediaItemRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MediaItemRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MediaItemRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MediaItem' + description: '' + patch: + operationId: gallery_media_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this media item. + required: true + tags: + - gallery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedMediaItemRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedMediaItemRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedMediaItemRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MediaItem' + description: '' + delete: + operationId: gallery_media_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this media item. + required: true + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/gallery/media/by_type/: + get: + operationId: gallery_media_by_type_retrieve + description: Get media items filtered by type + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: No response body + /api/v1/gallery/media/search/: + get: + operationId: gallery_media_search_retrieve + description: Search for media items with optional filtering + summary: Search media items + parameters: + - in: query + name: limit + schema: + type: integer + description: Maximum number of results + - in: query + name: q + schema: + type: string + description: Search query + - in: query + name: type + schema: + type: string + description: Filter by media type + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: Search results + /api/v1/gallery/search/: + get: + operationId: gallery_search_retrieve + description: Search for media items with optional filtering + summary: Search media items + parameters: + - in: query + name: limit + schema: + type: integer + description: Maximum number of results + - in: query + name: q + schema: + type: string + description: Search query + - in: query + name: type + schema: + type: string + description: Filter by media type + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: Search results + /api/v1/gallery/tags/: + get: + operationId: gallery_tags_list + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: page_size + required: false + in: query + description: Number of results to return per page. + schema: + type: integer + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedTagList' + description: '' + post: + operationId: gallery_tags_create + tags: + - gallery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TagRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TagRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TagRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Tag' + description: '' + /api/v1/gallery/tags/{id}/: + get: + operationId: gallery_tags_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this tag. + required: true + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Tag' + description: '' + put: + operationId: gallery_tags_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this tag. + required: true + tags: + - gallery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TagRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TagRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TagRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Tag' + description: '' + patch: + operationId: gallery_tags_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this tag. + required: true + tags: + - gallery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTagRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTagRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTagRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Tag' + description: '' + delete: + operationId: gallery_tags_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this tag. + required: true + tags: + - gallery + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/location-tool/location-sets/{location_set_pk}/csv/: + get: + operationId: location_tool_location_sets_csv_retrieve + description: Export all locations in a location set to CSV format. + summary: Export locations to CSV + parameters: + - in: path + name: location_set_pk + schema: + type: integer + required: true + tags: + - CSV Operations + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + type: string + format: binary + description: '' + post: + operationId: location_tool_location_sets_csv_create + description: Import location data from a CSV file with validation and error + reporting. + summary: Import locations from CSV + parameters: + - in: path + name: location_set_pk + schema: + type: integer + required: true + tags: + - CSV Operations + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/CSVImportRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CSVImportRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + type: object + description: '' + /api/v1/location-tool/table-sources/: + get: + operationId: location_tool_table_sources_list + description: Retrieve table source configurations for location tools. + summary: List table sources + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - Table Sources + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedLocationTableSourceList' + description: '' + post: + operationId: location_tool_table_sources_create + description: Create a new table source configuration for a location tool. + summary: Create table source + tags: + - Table Sources + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LocationTableSourceRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/LocationTableSourceRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/LocationTableSourceRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/LocationTableSource' + description: '' + /api/v1/location-tool/table-sources/{id}/: + get: + operationId: location_tool_table_sources_retrieve + description: Retrieve detailed information about a table source configuration. + summary: Get table source details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this location table source. + required: true + tags: + - Table Sources + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/LocationTableSource' + description: '' + put: + operationId: location_tool_table_sources_update + description: Update an existing table source configuration. + summary: Update table source + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this location table source. + required: true + tags: + - Table Sources + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LocationTableSourceRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/LocationTableSourceRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/LocationTableSourceRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/LocationTableSource' + description: '' + patch: + operationId: location_tool_table_sources_partial_update + description: |- + Location Table Source management endpoints. + + Provides CRUD access to table source configurations including: + - Field selection settings + - Schema generation + - Data access for other tools + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this location table source. + required: true + tags: + - location-tool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedLocationTableSourceRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedLocationTableSourceRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedLocationTableSourceRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/LocationTableSource' + description: '' + delete: + operationId: location_tool_table_sources_destroy + description: Delete a table source configuration. + summary: Delete table source + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this location table source. + required: true + tags: + - Table Sources + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/location-tool/table-sources/{id}/data/: + get: + operationId: location_tool_table_sources_data_retrieve + description: Retrieve the actual data from this table source. + summary: Get table source data + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this location table source. + required: true + tags: + - Table Sources + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + type: array + items: + type: object + description: '' + /api/v1/location-tool/tools/: + get: + operationId: location_tool_tools_list + description: Retrieve a list of client location tools owned by the current user. + summary: List client location tools + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: search + required: false + in: query + description: A search term. + schema: + type: string + tags: + - Location Tools + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedClientLocationToolList' + description: '' + post: + operationId: location_tool_tools_create + description: Create a new client location tool. + summary: Create location tool + tags: + - Location Tools + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClientLocationToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ClientLocationToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ClientLocationToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/ClientLocationTool' + description: '' + /api/v1/location-tool/tools/{id}/: + get: + operationId: location_tool_tools_retrieve + description: Retrieve detailed information about a specific client location + tool. + summary: Get location tool details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Client Location Tool. + required: true + tags: + - Location Tools + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ClientLocationTool' + description: '' + put: + operationId: location_tool_tools_update + description: Update an existing client location tool. + summary: Update location tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Client Location Tool. + required: true + tags: + - Location Tools + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClientLocationToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ClientLocationToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ClientLocationToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ClientLocationTool' + description: '' + patch: + operationId: location_tool_tools_partial_update + description: Partially update an existing client location tool. + summary: Partially update location tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Client Location Tool. + required: true + tags: + - Location Tools + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedClientLocationToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedClientLocationToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedClientLocationToolRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ClientLocationTool' + description: '' + delete: + operationId: location_tool_tools_destroy + description: Delete a client location tool and all associated data. + summary: Delete location tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Client Location Tool. + required: true + tags: + - Location Tools + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/location-tool/tools/{id}/create_version/: + post: + operationId: location_tool_tools_create_version_create + description: "\n Create a new version of the location tool with automatic + version numbering.\n \n This endpoint implements automatic version + numbering where:\n - Version numbers are automatically assigned as + sequential integers (1, 2, 3, etc.)\n - No version number should be + provided in the request\n - The system finds the highest existing version + and increments by 1\n - All data from the current version is copied + to the new version\n - The tool's current_version is updated to the + new version\n \n The response includes the automatically assigned + version number.\n \n Concurrent Safety:\n Multiple simultaneous + requests are handled safely using database constraints.\n If a conflict + occurs, an appropriate error message is returned.\n " + summary: Create new version + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Client Location Tool. + required: true + tags: + - Location Tools + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/LocationSet' + description: '' + '400': + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: Version creation failed due to duplicate version number. + This may be caused by concurrent version creation attempts. + description: '' + /api/v1/location-tool/tools/{id}/switch_version/: + post: + operationId: location_tool_tools_switch_version_create + description: "\n Switch the current active version of the location tool.\n + \ \n This endpoint allows switching between existing versions + of a location tool.\n The version parameter must be an integer corresponding + to an existing version.\n \n Version numbers are sequential + integers (1, 2, 3, etc.) that were automatically\n assigned when the + versions were created.\n " + summary: Switch version + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Client Location Tool. + required: true + - in: query + name: version + schema: + type: integer + description: Version number to switch to (integer, e.g., 1, 2, 3) + required: true + tags: + - Location Tools + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClientLocationToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ClientLocationToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ClientLocationToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ClientLocationTool' + description: '' + '400': + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: Version must be a valid integer + description: '' + '404': + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: Version 5 does not exist + description: '' + /api/v1/location-tool/tools/{tool_pk}/location-sets/: + get: + operationId: location_tool_tools_location_sets_list + description: Retrieve location sets for a specific tool. + summary: List location sets + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Location Sets + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedLocationSetList' + description: '' + post: + operationId: location_tool_tools_location_sets_create + description: Create a new location set for a tool. + summary: Create location set + parameters: + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Location Sets + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LocationSetRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/LocationSetRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/LocationSetRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/LocationSet' + description: '' + /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/custom-fields/: + get: + operationId: location_tool_tools_location_sets_custom_fields_list + description: Retrieve custom field definitions for a location set. + summary: List custom field definitions + parameters: + - in: path + name: location_set_pk + schema: + type: integer + required: true + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Custom Fields + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedCustomFieldDefinitionList' + description: '' + post: + operationId: location_tool_tools_location_sets_custom_fields_create + description: Create a new custom field definition for a location set. + summary: Create custom field definition + parameters: + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Custom Fields + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldDefinitionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CustomFieldDefinitionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CustomFieldDefinitionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldDefinition' + description: '' + /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/custom-fields/{id}/: + get: + operationId: location_tool_tools_location_sets_custom_fields_retrieve + description: Retrieve details about a specific custom field definition. + summary: Get custom field definition + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this custom field definition. + required: true + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Custom Fields + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldDefinition' + description: '' + put: + operationId: location_tool_tools_location_sets_custom_fields_update + description: Update an existing custom field definition. + summary: Update custom field definition + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this custom field definition. + required: true + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Custom Fields + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldDefinitionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CustomFieldDefinitionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CustomFieldDefinitionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldDefinition' + description: '' + patch: + operationId: location_tool_tools_location_sets_custom_fields_partial_update + description: |- + Custom Field Definition management endpoints. + + Provides CRUD access to custom field definitions including: + - Field type configuration + - Validation rules + - Default values and ordering + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this custom field definition. + required: true + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - location-tool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedCustomFieldDefinitionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedCustomFieldDefinitionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedCustomFieldDefinitionRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldDefinition' + description: '' + delete: + operationId: location_tool_tools_location_sets_custom_fields_destroy + description: Delete a custom field definition and all associated values. + summary: Delete custom field definition + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this custom field definition. + required: true + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Custom Fields + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/locations/: + get: + operationId: location_tool_tools_location_sets_locations_list + description: Retrieve locations in a specific location set with filtering and + search. + summary: List locations + parameters: + - in: query + name: client + schema: + type: integer + description: Filter by client ID + - in: query + name: country + schema: + type: string + description: Filter by country + - in: query + name: division + schema: + type: integer + description: Filter by division ID + - in: path + name: location_set_pk + schema: + type: integer + required: true + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search across site name and address + - in: query + name: state + schema: + type: string + description: Filter by state + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Locations + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedLocationList' + description: '' + post: + operationId: location_tool_tools_location_sets_locations_create + description: Create a new location in the location set. + summary: Create location + parameters: + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Locations + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LocationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/LocationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/LocationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + description: '' + /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/locations/{id}/: + get: + operationId: location_tool_tools_location_sets_locations_retrieve + description: Retrieve detailed information about a specific location. + summary: Get location details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this location. + required: true + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Locations + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + description: '' + put: + operationId: location_tool_tools_location_sets_locations_update + description: Update an existing location. + summary: Update location + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this location. + required: true + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Locations + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LocationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/LocationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/LocationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + description: '' + patch: + operationId: location_tool_tools_location_sets_locations_partial_update + description: Partially update an existing location. + summary: Partially update location + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this location. + required: true + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Locations + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedLocationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedLocationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedLocationRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + description: '' + delete: + operationId: location_tool_tools_location_sets_locations_destroy + description: Delete a location and all associated custom field values. + summary: Delete location + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this location. + required: true + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Locations + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/locations/{id}/set_custom_field/: + post: + operationId: location_tool_tools_location_sets_locations_set_custom_field_create + description: Update a custom field value for this location. + summary: Update custom field value + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this location. + required: true + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Locations + requestBody: + content: + application/json: + schema: + type: object + properties: + field_name: + type: string + value: + type: string + required: + - field_name + - value + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + description: '' + /api/v1/location-tool/tools/{tool_pk}/location-sets/{location_set_pk}/locations/bulk_operations/: + post: + operationId: location_tool_tools_location_sets_locations_bulk_operations_create + description: Perform bulk operations on multiple locations. + summary: Bulk operations + parameters: + - in: path + name: location_set_pk + schema: + type: integer + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Locations + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BulkLocationOperationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BulkLocationOperationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/BulkLocationOperationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + type: object + description: '' + /api/v1/location-tool/tools/{tool_pk}/location-sets/{id}/: + get: + operationId: location_tool_tools_location_sets_retrieve + description: Retrieve detailed information about a specific location set. + summary: Get location set details + parameters: + - in: path + name: id + schema: + type: string + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Location Sets + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/LocationSet' + description: '' + put: + operationId: location_tool_tools_location_sets_update + description: Update an existing location set. + summary: Update location set + parameters: + - in: path + name: id + schema: + type: string + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Location Sets + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LocationSetRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/LocationSetRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/LocationSetRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/LocationSet' + description: '' + patch: + operationId: location_tool_tools_location_sets_partial_update + description: |- + Location Set management endpoints. + + Provides CRUD access to location sets including: + - Version management + - Custom field definitions + - Location aggregations + parameters: + - in: path + name: id + schema: + type: string + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - location-tool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedLocationSetRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedLocationSetRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedLocationSetRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/LocationSet' + description: '' + delete: + operationId: location_tool_tools_location_sets_destroy + description: Delete a location set and all associated locations. + summary: Delete location set + parameters: + - in: path + name: id + schema: + type: string + required: true + - in: path + name: tool_pk + schema: + type: string + required: true + tags: + - Location Sets + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/orbit/calendar-events/: + get: + operationId: orbit_calendar_events_list + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedCalendarEventList' + description: '' + post: + operationId: orbit_calendar_events_create + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + /api/v1/orbit/calendar-events/{id}/: + get: + operationId: orbit_calendar_events_retrieve + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + put: + operationId: orbit_calendar_events_update + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + patch: + operationId: orbit_calendar_events_partial_update + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedCalendarEventRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedCalendarEventRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedCalendarEventRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + delete: + operationId: orbit_calendar_events_destroy + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/orbit/clients/: + get: + operationId: orbit_clients_list + description: Retrieve a paginated list of clients owned by the current user. + summary: List clients + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order results by: name, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search clients by name, legal name, or overview + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedClientList' + description: '' + post: + operationId: orbit_clients_create + description: Create a new client record. + summary: Create client + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClientRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ClientRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ClientRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + /api/v1/orbit/clients/{id}/: + get: + operationId: orbit_clients_retrieve + description: Retrieve detailed information about a specific client. + summary: Get client details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + put: + operationId: orbit_clients_update + description: Update all fields of a client record. + summary: Update client + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClientRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ClientRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ClientRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + patch: + operationId: orbit_clients_partial_update + description: Update specific fields of a client record. + summary: Partially update client + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedClientRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedClientRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedClientRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + delete: + operationId: orbit_clients_destroy + description: Delete a client record. + summary: Delete client + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/orbit/contacts/: + get: + operationId: orbit_contacts_list + description: Retrieve a paginated list of contacts from user's clients and vendors. + summary: List contacts + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search contacts by name, job title, or email + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedContactList' + description: '' + post: + operationId: orbit_contacts_create + description: Create a new contact record. + summary: Create contact + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + /api/v1/orbit/contacts/{id}/: + get: + operationId: orbit_contacts_retrieve + description: Retrieve detailed information about a specific contact. + summary: Get contact details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + put: + operationId: orbit_contacts_update + description: Update all fields of a contact record. + summary: Update contact + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + patch: + operationId: orbit_contacts_partial_update + description: Update specific fields of a contact record. + summary: Partially update contact + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedContactRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + delete: + operationId: orbit_contacts_destroy + description: Delete a contact record. + summary: Delete contact + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/orbit/contacts/search/: + get: + operationId: orbit_contacts_search_retrieve + description: Advanced contact search with organization type filtering. + summary: Search contacts + parameters: + - in: query + name: organization_type + schema: + type: string + description: 'Filter by organization type: client or vendor' + - in: query + name: search_term + schema: + type: string + description: Search term for name or job title + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + /api/v1/orbit/digital-contact-types/: + get: + operationId: orbit_digital_contact_types_list + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDigitalContactTypeList' + description: '' + /api/v1/orbit/digital-contact-types/{id}/: + get: + operationId: orbit_digital_contact_types_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact type. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContactType' + description: '' + /api/v1/orbit/digital-contacts/: + get: + operationId: orbit_digital_contacts_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDigitalContactList' + description: '' + post: + operationId: orbit_digital_contacts_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + /api/v1/orbit/digital-contacts/{id}/: + get: + operationId: orbit_digital_contacts_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + put: + operationId: orbit_digital_contacts_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + patch: + operationId: orbit_digital_contacts_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedDigitalContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedDigitalContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedDigitalContactRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + delete: + operationId: orbit_digital_contacts_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/orbit/opportunities/: + get: + operationId: orbit_opportunities_list + description: Retrieve a paginated list of sales opportunities. + summary: List opportunities + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, expected_close_date, value' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search opportunities by name or description + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedOpportunityList' + description: '' + post: + operationId: orbit_opportunities_create + description: Create a new sales opportunity. + summary: Create opportunity + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OpportunityRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OpportunityRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OpportunityRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + /api/v1/orbit/opportunities/{id}/: + get: + operationId: orbit_opportunities_retrieve + description: Retrieve detailed information about a specific opportunity. + summary: Get opportunity details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + put: + operationId: orbit_opportunities_update + description: Update all fields of an opportunity record. + summary: Update opportunity + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OpportunityRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OpportunityRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OpportunityRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + patch: + operationId: orbit_opportunities_partial_update + description: Update specific fields of an opportunity record. + summary: Partially update opportunity + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedOpportunityRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedOpportunityRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedOpportunityRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + delete: + operationId: orbit_opportunities_destroy + description: Delete an opportunity record. + summary: Delete opportunity + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/orbit/opportunities/by_status/: + get: + operationId: orbit_opportunities_by_status_retrieve + description: Retrieve opportunities filtered by status and optionally by client. + summary: Filter opportunities by status + parameters: + - in: query + name: client_id + schema: + type: integer + description: Filter by specific client ID + - in: query + name: status + schema: + type: string + description: 'Filter by opportunity status: active, won, lost, dropped' + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + /api/v1/orbit/proposals/: + get: + operationId: orbit_proposals_list + description: Retrieve a paginated list of proposals for opportunities owned + by the current user. + summary: List proposals + parameters: + - in: query + name: opportunity_id + schema: + type: integer + description: Filter by opportunity ID + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, due_date, submitted_date, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search proposals by name + - in: query + name: status + schema: + type: string + description: 'Filter by status: Draft, In Review, Final' + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedProposalList' + description: '' + post: + operationId: orbit_proposals_create + description: Create a new proposal record. + summary: Create proposal + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ProposalRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ProposalRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ProposalRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + /api/v1/orbit/proposals/{id}/: + get: + operationId: orbit_proposals_retrieve + description: Retrieve detailed information about a specific proposal. + summary: Get proposal details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + put: + operationId: orbit_proposals_update + description: Update all fields of a proposal record. + summary: Update proposal + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ProposalRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ProposalRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ProposalRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + patch: + operationId: orbit_proposals_partial_update + description: Update specific fields of a proposal record. + summary: Partially update proposal + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedProposalRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedProposalRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedProposalRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + delete: + operationId: orbit_proposals_destroy + description: Delete a proposal record. + summary: Delete proposal + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/orbit/stock/overview/{symbol}/: + get: + operationId: orbit_stock_overview_retrieve + description: Returns company overview data for a stock symbol + summary: Get company overview + parameters: + - in: path + name: symbol + schema: + type: string + description: Stock symbol + required: true + tags: + - stock + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: Company overview data + '403': + description: Access denied + '500': + description: Unable to fetch company data + /api/v1/orbit/stock/quote/{symbol}/: + get: + operationId: orbit_stock_quote_retrieve + description: Returns current stock quote data for a symbol + summary: Get stock quote + parameters: + - in: path + name: symbol + schema: + type: string + description: Stock symbol + required: true + tags: + - stock + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: Stock quote data + '403': + description: Access denied + '500': + description: Unable to fetch stock data + /api/v1/orbit/suggest-timezone/: + post: + operationId: orbit_suggest_timezone_create + description: Uses address components to suggest an appropriate timezone using + geocoding. + summary: Suggest timezone from address + tags: + - Orbit + requestBody: + content: + application/json: + schema: + type: object + properties: + street_address: + type: string + locality: + type: string + region: + type: string + postal_code: + type: string + country: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + type: object + properties: + timezone: + type: string + success: + type: boolean + method: + type: string + description: '' + '400': + content: + application/json: + schema: + type: object + properties: + error: + type: string + success: + type: boolean + description: '' + /api/v1/orbit/vendor-solutions/: + get: + operationId: orbit_vendor_solutions_list + description: Retrieve a paginated list of vendor solutions. + summary: List vendor solutions + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search solutions by name or description + - in: query + name: vendor + schema: + type: integer + description: Filter by vendor ID + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedVendorSolutionList' + description: '' + post: + operationId: orbit_vendor_solutions_create + description: Create a new vendor solution. + summary: Create vendor solution + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + /api/v1/orbit/vendor-solutions/{id}/: + get: + operationId: orbit_vendor_solutions_retrieve + description: Retrieve detailed information about a specific vendor solution. + summary: Get vendor solution details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + put: + operationId: orbit_vendor_solutions_update + description: Update all fields of a vendor solution record. + summary: Update vendor solution + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + patch: + operationId: orbit_vendor_solutions_partial_update + description: Update specific fields of a vendor solution record. + summary: Partially update vendor solution + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedVendorSolutionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedVendorSolutionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedVendorSolutionRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + delete: + operationId: orbit_vendor_solutions_destroy + description: Delete a vendor solution record. + summary: Delete vendor solution + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/orbit/vendors/: + get: + operationId: orbit_vendors_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: search + required: false + in: query + description: A search term. + schema: + type: string + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedVendorList' + description: '' + post: + operationId: orbit_vendors_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + /api/v1/orbit/vendors/{id}/: + get: + operationId: orbit_vendors_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + put: + operationId: orbit_vendors_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + patch: + operationId: orbit_vendors_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedVendorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedVendorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedVendorRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + delete: + operationId: orbit_vendors_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/pricing/line-items/: + get: + operationId: pricing_line_items_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedPriceLineItemList' + description: '' + post: + operationId: pricing_line_items_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - pricing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PriceLineItemRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PriceLineItemRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PriceLineItemRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/PriceLineItem' + description: '' + /api/v1/pricing/line-items/{id}/: + get: + operationId: pricing_line_items_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this price line item. + required: true + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PriceLineItem' + description: '' + put: + operationId: pricing_line_items_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this price line item. + required: true + tags: + - pricing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PriceLineItemRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PriceLineItemRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PriceLineItemRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PriceLineItem' + description: '' + patch: + operationId: pricing_line_items_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this price line item. + required: true + tags: + - pricing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPriceLineItemRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPriceLineItemRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPriceLineItemRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PriceLineItem' + description: '' + delete: + operationId: pricing_line_items_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this price line item. + required: true + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/pricing/tools/: + get: + operationId: pricing_tools_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedPricingToolList' + description: '' + post: + operationId: pricing_tools_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - pricing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PricingToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PricingToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PricingToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/PricingTool' + description: '' + /api/v1/pricing/tools/{id}/: + get: + operationId: pricing_tools_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this pricing tool. + required: true + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PricingTool' + description: '' + put: + operationId: pricing_tools_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this pricing tool. + required: true + tags: + - pricing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PricingToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PricingToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PricingToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PricingTool' + description: '' + patch: + operationId: pricing_tools_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this pricing tool. + required: true + tags: + - pricing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPricingToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPricingToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPricingToolRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PricingTool' + description: '' + delete: + operationId: pricing_tools_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this pricing tool. + required: true + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/pricing/tools/{id}/copy_version/: + post: + operationId: pricing_tools_copy_version_create + description: Copy an existing version + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this pricing tool. + required: true + tags: + - pricing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PricingToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PricingToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PricingToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PricingTool' + description: '' + /api/v1/pricing/tools/{id}/versions/: + get: + operationId: pricing_tools_versions_retrieve + description: Get all price versions for this tool + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this pricing tool. + required: true + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PricingTool' + description: '' + /api/v1/pricing/versions/: + get: + operationId: pricing_versions_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedPriceVersionList' + description: '' + post: + operationId: pricing_versions_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - pricing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PriceVersionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PriceVersionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PriceVersionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/PriceVersion' + description: '' + /api/v1/pricing/versions/{id}/: + get: + operationId: pricing_versions_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this price version. + required: true + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PriceVersion' + description: '' + put: + operationId: pricing_versions_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this price version. + required: true + tags: + - pricing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PriceVersionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PriceVersionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PriceVersionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PriceVersion' + description: '' + patch: + operationId: pricing_versions_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this price version. + required: true + tags: + - pricing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPriceVersionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPriceVersionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPriceVersionRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PriceVersion' + description: '' + delete: + operationId: pricing_versions_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this price version. + required: true + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/pricing/versions/{id}/pricing_table/: + get: + operationId: pricing_versions_pricing_table_retrieve + description: Get formatted pricing table data + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this price version. + required: true + tags: + - pricing + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PriceVersion' + description: '' + /api/v1/raid/assumptions/: + get: + operationId: raid_assumptions_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedAssumptionList' + description: '' + /api/v1/raid/assumptions/{id}/: + get: + operationId: raid_assumptions_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this assumption. + required: true + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Assumption' + description: '' + /api/v1/raid/dependencies/: + get: + operationId: raid_dependencies_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDependencyList' + description: '' + /api/v1/raid/dependencies/{id}/: + get: + operationId: raid_dependencies_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this dependency. + required: true + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Dependency' + description: '' + /api/v1/raid/issues/: + get: + operationId: raid_issues_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedIssueList' + description: '' + /api/v1/raid/issues/{id}/: + get: + operationId: raid_issues_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this issue. + required: true + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Issue' + description: '' + /api/v1/raid/risks/: + get: + operationId: raid_risks_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedRiskList' + description: '' + /api/v1/raid/risks/{id}/: + get: + operationId: raid_risks_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this risk. + required: true + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Risk' + description: '' + /api/v1/raid/tools/: + get: + operationId: raid_tools_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedRAIDToolList' + description: '' + /api/v1/raid/tools/{id}/: + get: + operationId: raid_tools_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this raid tool. + required: true + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RAIDTool' + description: '' + /api/v1/raid/tools/{id}/table_data/: + get: + operationId: raid_tools_table_data_retrieve + description: Return RAID data formatted for table display + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this raid tool. + required: true + tags: + - raid + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RAIDTool' + description: '' + /api/v1/requirements/requirements/: + get: + operationId: requirements_requirements_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - requirements + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedRequirementList' + description: '' + /api/v1/requirements/requirements/{id}/: + get: + operationId: requirements_requirements_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this requirement. + required: true + tags: + - requirements + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Requirement' + description: '' + /api/v1/requirements/tools/: + get: + operationId: requirements_tools_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - requirements + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedRequirementsToolList' + description: '' + /api/v1/requirements/tools/{id}/: + get: + operationId: requirements_tools_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this Requirements Tool. + required: true + tags: + - requirements + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RequirementsTool' + description: '' + /api/v1/stakeholder/org-charts/: + get: + operationId: stakeholder_org_charts_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedOrgChartList' + description: '' + post: + operationId: stakeholder_org_charts_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - stakeholder + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrgChartRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OrgChartRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OrgChartRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/OrgChart' + description: '' + /api/v1/stakeholder/org-charts/{id}/: + get: + operationId: stakeholder_org_charts_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this org chart. + required: true + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrgChart' + description: '' + put: + operationId: stakeholder_org_charts_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this org chart. + required: true + tags: + - stakeholder + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrgChartRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OrgChartRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OrgChartRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrgChart' + description: '' + patch: + operationId: stakeholder_org_charts_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this org chart. + required: true + tags: + - stakeholder + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedOrgChartRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedOrgChartRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedOrgChartRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrgChart' + description: '' + delete: + operationId: stakeholder_org_charts_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this org chart. + required: true + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/stakeholder/org-charts/{id}/levels/: + get: + operationId: stakeholder_org_charts_levels_retrieve + description: Get org chart data organized by levels + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this org chart. + required: true + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrgChart' + description: '' + /api/v1/stakeholder/stakeholders/: + get: + operationId: stakeholder_stakeholders_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedStakeholderList' + description: '' + post: + operationId: stakeholder_stakeholders_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - stakeholder + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/StakeholderRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/StakeholderRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/StakeholderRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Stakeholder' + description: '' + /api/v1/stakeholder/stakeholders/{id}/: + get: + operationId: stakeholder_stakeholders_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stakeholder. + required: true + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Stakeholder' + description: '' + put: + operationId: stakeholder_stakeholders_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stakeholder. + required: true + tags: + - stakeholder + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/StakeholderRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/StakeholderRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/StakeholderRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Stakeholder' + description: '' + patch: + operationId: stakeholder_stakeholders_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stakeholder. + required: true + tags: + - stakeholder + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedStakeholderRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedStakeholderRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedStakeholderRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Stakeholder' + description: '' + delete: + operationId: stakeholder_stakeholders_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stakeholder. + required: true + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/stakeholder/tools/: + get: + operationId: stakeholder_tools_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedStakeholderToolList' + description: '' + post: + operationId: stakeholder_tools_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - stakeholder + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/StakeholderToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/StakeholderToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/StakeholderToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/StakeholderTool' + description: '' + /api/v1/stakeholder/tools/{id}/: + get: + operationId: stakeholder_tools_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stakeholder tool. + required: true + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/StakeholderTool' + description: '' + put: + operationId: stakeholder_tools_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stakeholder tool. + required: true + tags: + - stakeholder + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/StakeholderToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/StakeholderToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/StakeholderToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/StakeholderTool' + description: '' + patch: + operationId: stakeholder_tools_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stakeholder tool. + required: true + tags: + - stakeholder + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedStakeholderToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedStakeholderToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedStakeholderToolRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/StakeholderTool' + description: '' + delete: + operationId: stakeholder_tools_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stakeholder tool. + required: true + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/stakeholder/tools/{id}/power_interest_matrix/: + get: + operationId: stakeholder_tools_power_interest_matrix_retrieve + description: Get stakeholders organized by power/interest matrix + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stakeholder tool. + required: true + tags: + - stakeholder + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/StakeholderTool' + description: '' + /api/v1/tei/reports/: + get: + operationId: tei_reports_list + description: CRUD for ``TEIReport``. Admin-only write side per spec §Permissions. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedTEIReportList' + description: '' + post: + operationId: tei_reports_create + description: CRUD for ``TEIReport``. Admin-only write side per spec §Permissions. + tags: + - tei + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReportRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TEIReportRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TEIReportRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReport' + description: '' + /api/v1/tei/reports/{public_id}/: + get: + operationId: tei_reports_retrieve + description: CRUD for ``TEIReport``. Admin-only write side per spec §Permissions. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReport' + description: '' + put: + operationId: tei_reports_update + description: CRUD for ``TEIReport``. Admin-only write side per spec §Permissions. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReportRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TEIReportRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TEIReportRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReport' + description: '' + patch: + operationId: tei_reports_partial_update + description: CRUD for ``TEIReport``. Admin-only write side per spec §Permissions. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTEIReportRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTEIReportRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTEIReportRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReport' + description: '' + delete: + operationId: tei_reports_destroy + description: CRUD for ``TEIReport``. Admin-only write side per spec §Permissions. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/tei/reports/{report_public_id}/fields/: + get: + operationId: tei_reports_fields_list + description: Nested field CRUD under ``/reports/{public_id}/fields/``. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: path + name: report_public_id + schema: + type: string + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedTEIReportFieldList' + description: '' + post: + operationId: tei_reports_fields_create + description: Nested field CRUD under ``/reports/{public_id}/fields/``. + parameters: + - in: path + name: report_public_id + schema: + type: string + required: true + tags: + - tei + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReportFieldRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TEIReportFieldRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TEIReportFieldRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReportField' + description: '' + /api/v1/tei/reports/{report_public_id}/fields/{id}/: + get: + operationId: tei_reports_fields_retrieve + description: Nested field CRUD under ``/reports/{public_id}/fields/``. + parameters: + - in: path + name: id + schema: + type: integer + required: true + - in: path + name: report_public_id + schema: + type: string + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReportField' + description: '' + put: + operationId: tei_reports_fields_update + description: Nested field CRUD under ``/reports/{public_id}/fields/``. + parameters: + - in: path + name: id + schema: + type: integer + required: true + - in: path + name: report_public_id + schema: + type: string + required: true + tags: + - tei + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReportFieldRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TEIReportFieldRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TEIReportFieldRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReportField' + description: '' + patch: + operationId: tei_reports_fields_partial_update + description: Nested field CRUD under ``/reports/{public_id}/fields/``. + parameters: + - in: path + name: id + schema: + type: integer + required: true + - in: path + name: report_public_id + schema: + type: string + required: true + tags: + - tei + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTEIReportFieldRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTEIReportFieldRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTEIReportFieldRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReportField' + description: '' + delete: + operationId: tei_reports_fields_destroy + description: Nested field CRUD under ``/reports/{public_id}/fields/``. + parameters: + - in: path + name: id + schema: + type: integer + required: true + - in: path + name: report_public_id + schema: + type: string + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/tei/reports/{report_public_id}/fields/reorder/: + patch: + operationId: tei_reports_fields_reorder_partial_update + description: Bulk-reorder fields via ``PATCH .../fields/reorder/``. + parameters: + - in: path + name: report_public_id + schema: + type: string + required: true + tags: + - tei + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTEIReportFieldRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTEIReportFieldRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTEIReportFieldRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIReportField' + description: '' + /api/v1/tei/summary/: + get: + operationId: tei_summary_retrieve + description: GET ``/api/v1/tei/summary/`` — aggregate NPV across all tools. + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: No response body + /api/v1/tei/tools/: + get: + operationId: tei_tools_list + description: CRUD for ``TEITool`` with custom calculate / export / version actions. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedTEIToolList' + description: '' + post: + operationId: tei_tools_create + description: CRUD for ``TEITool`` with custom calculate / export / version actions. + tags: + - tei + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TEIToolCreateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TEIToolCreateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TEIToolCreateRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIToolCreate' + description: '' + /api/v1/tei/tools/{public_id}/: + get: + operationId: tei_tools_retrieve + description: CRUD for ``TEITool`` with custom calculate / export / version actions. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEITool' + description: '' + put: + operationId: tei_tools_update + description: CRUD for ``TEITool`` with custom calculate / export / version actions. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TEIToolUpdateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TEIToolUpdateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TEIToolUpdateRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIToolUpdate' + description: '' + patch: + operationId: tei_tools_partial_update + description: CRUD for ``TEITool`` with custom calculate / export / version actions. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTEIToolUpdateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTEIToolUpdateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTEIToolUpdateRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEIToolUpdate' + description: '' + delete: + operationId: tei_tools_destroy + description: CRUD for ``TEITool`` with custom calculate / export / version actions. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/tei/tools/{public_id}/calculate/: + post: + operationId: tei_tools_calculate_create + description: Recalculate and persist the financial summary. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEITool' + description: '' + /api/v1/tei/tools/{public_id}/export/: + get: + operationId: tei_tools_export_retrieve + description: Return the LLM-ready export payload. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEITool' + description: '' + /api/v1/tei/tools/{public_id}/summary/: + get: + operationId: tei_tools_summary_retrieve + description: Return the stored summary (404 if never calculated). + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEITool' + description: '' + /api/v1/tei/tools/{public_id}/values/: + get: + operationId: tei_tools_values_retrieve + description: GET current values / PUT bulk update. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEITool' + description: '' + put: + operationId: tei_tools_values_update + description: GET current values / PUT bulk update. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEITool' + description: '' + /api/v1/tei/tools/{public_id}/values/{field_key}/: + patch: + operationId: tei_tools_values_partial_update + description: PATCH one value row. + parameters: + - in: path + name: field_key + schema: + type: string + pattern: ^[\w-]+$ + required: true + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEITool' + description: '' + /api/v1/tei/tools/{public_id}/versions/: + get: + operationId: tei_tools_versions_retrieve + description: GET version list / POST save new version. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEITool' + description: '' + post: + operationId: tei_tools_versions_create + description: GET version list / POST save new version. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEITool' + description: '' + /api/v1/tei/tools/{public_id}/versions/{version_number}/: + get: + operationId: tei_tools_versions_retrieve_2 + description: Return the full snapshot for one version. + parameters: + - in: path + name: public_id + schema: + type: string + description: 12-character short UUID used in public API URLs. + required: true + - in: path + name: version_number + schema: + type: string + pattern: ^\d+$ + required: true + tags: + - tei + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TEITool' + description: '' + /api/v1/timeline/milestones/: + get: + operationId: timeline_milestones_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedMilestoneList' + description: '' + post: + operationId: timeline_milestones_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MilestoneRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MilestoneRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MilestoneRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Milestone' + description: '' + /api/v1/timeline/milestones/{id}/: + get: + operationId: timeline_milestones_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this milestone. + required: true + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Milestone' + description: '' + put: + operationId: timeline_milestones_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this milestone. + required: true + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MilestoneRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MilestoneRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MilestoneRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Milestone' + description: '' + patch: + operationId: timeline_milestones_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this milestone. + required: true + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedMilestoneRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedMilestoneRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedMilestoneRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Milestone' + description: '' + delete: + operationId: timeline_milestones_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this milestone. + required: true + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/timeline/milestones/{id}/mark_completed/: + post: + operationId: timeline_milestones_mark_completed_create + description: Mark milestone as completed + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this milestone. + required: true + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MilestoneRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MilestoneRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MilestoneRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Milestone' + description: '' + /api/v1/timeline/milestones/upcoming/: + get: + operationId: timeline_milestones_upcoming_retrieve + description: Get upcoming milestones + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Milestone' + description: '' + /api/v1/timeline/stages/: + get: + operationId: timeline_stages_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedStageList' + description: '' + post: + operationId: timeline_stages_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/StageRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/StageRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/StageRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Stage' + description: '' + /api/v1/timeline/stages/{id}/: + get: + operationId: timeline_stages_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stage. + required: true + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Stage' + description: '' + put: + operationId: timeline_stages_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stage. + required: true + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/StageRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/StageRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/StageRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Stage' + description: '' + patch: + operationId: timeline_stages_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stage. + required: true + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedStageRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedStageRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedStageRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Stage' + description: '' + delete: + operationId: timeline_stages_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this stage. + required: true + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/timeline/timelines/: + get: + operationId: timeline_timelines_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedTimelineList' + description: '' + post: + operationId: timeline_timelines_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TimelineRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TimelineRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TimelineRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Timeline' + description: '' + /api/v1/timeline/timelines/{id}/: + get: + operationId: timeline_timelines_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this timeline. + required: true + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Timeline' + description: '' + put: + operationId: timeline_timelines_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this timeline. + required: true + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TimelineRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TimelineRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TimelineRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Timeline' + description: '' + patch: + operationId: timeline_timelines_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this timeline. + required: true + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTimelineRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTimelineRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTimelineRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Timeline' + description: '' + delete: + operationId: timeline_timelines_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this timeline. + required: true + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /api/v1/timeline/timelines/{id}/update_progress/: + post: + operationId: timeline_timelines_update_progress_create + description: Update timeline progress by updating milestone/stage statuses + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this timeline. + required: true + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TimelineRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TimelineRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TimelineRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Timeline' + description: '' + /api/v1/timeline/tools/: + get: + operationId: timeline_tools_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedTimelineToolList' + description: '' + post: + operationId: timeline_tools_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TimelineToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TimelineToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TimelineToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/TimelineTool' + description: '' + /api/v1/timeline/tools/{id}/: + get: + operationId: timeline_tools_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this timeline tool. + required: true + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TimelineTool' + description: '' + put: + operationId: timeline_tools_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this timeline tool. + required: true + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TimelineToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TimelineToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TimelineToolRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TimelineTool' + description: '' + patch: + operationId: timeline_tools_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this timeline tool. + required: true + tags: + - timeline + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTimelineToolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTimelineToolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTimelineToolRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TimelineTool' + description: '' + delete: + operationId: timeline_tools_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this timeline tool. + required: true + tags: + - timeline + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /deckcraft/api/decks/: + get: + operationId: deckcraft_api_decks_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDeckList' + description: '' + post: + operationId: deckcraft_api_decks_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + /deckcraft/api/decks/{id}/: + get: + operationId: deckcraft_api_decks_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + put: + operationId: deckcraft_api_decks_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + patch: + operationId: deckcraft_api_decks_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedDeckRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedDeckRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedDeckRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + delete: + operationId: deckcraft_api_decks_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /deckcraft/api/decks/{id}/download/: + get: + operationId: deckcraft_api_decks_download_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + /deckcraft/api/decks/{id}/generate/: + post: + operationId: deckcraft_api_decks_generate_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Deck' + description: '' + /deckcraft/api/presentations/: + get: + operationId: deckcraft_api_presentations_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedPresentationList' + description: '' + post: + operationId: deckcraft_api_presentations_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PresentationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PresentationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PresentationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Presentation' + description: '' + /deckcraft/api/presentations/{id}/: + get: + operationId: deckcraft_api_presentations_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this presentation. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Presentation' + description: '' + put: + operationId: deckcraft_api_presentations_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this presentation. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PresentationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PresentationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PresentationRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Presentation' + description: '' + patch: + operationId: deckcraft_api_presentations_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this presentation. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPresentationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPresentationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPresentationRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Presentation' + description: '' + delete: + operationId: deckcraft_api_presentations_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this presentation. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /deckcraft/api/slides/: + get: + operationId: deckcraft_api_slides_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDeckSlideList' + description: '' + post: + operationId: deckcraft_api_slides_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlide' + description: '' + /deckcraft/api/slides/{id}/: + get: + operationId: deckcraft_api_slides_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck slide. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlide' + description: '' + put: + operationId: deckcraft_api_slides_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck slide. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlide' + description: '' + patch: + operationId: deckcraft_api_slides_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck slide. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedDeckSlideRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedDeckSlideRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedDeckSlideRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlide' + description: '' + delete: + operationId: deckcraft_api_slides_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this deck slide. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /deckcraft/api/slides/reorder/: + post: + operationId: deckcraft_api_slides_reorder_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DeckSlideRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DeckSlide' + description: '' + /deckcraft/api/table-sources/: + get: + operationId: deckcraft_api_table_sources_list + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedTableSourceList' + description: '' + /deckcraft/api/table-sources/{id}/: + get: + operationId: deckcraft_api_table_sources_retrieve + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TableSource' + description: '' + /deckcraft/api/table-sources/{id}/data/: + get: + operationId: deckcraft_api_table_sources_data_retrieve + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TableSource' + description: '' + /deckcraft/api/templates/: + get: + operationId: deckcraft_api_templates_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedPowerPointTemplateList' + description: '' + post: + operationId: deckcraft_api_templates_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + /deckcraft/api/templates/{id}/: + get: + operationId: deckcraft_api_templates_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + put: + operationId: deckcraft_api_templates_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + patch: + operationId: deckcraft_api_templates_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPowerPointTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPowerPointTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPowerPointTemplateRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + delete: + operationId: deckcraft_api_templates_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /deckcraft/api/templates/{id}/layouts/: + get: + operationId: deckcraft_api_templates_layouts_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + /deckcraft/api/templates/{id}/refresh/: + post: + operationId: deckcraft_api_templates_refresh_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this power point template. + required: true + tags: + - deckcraft + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PowerPointTemplateRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PowerPointTemplate' + description: '' + /orbit/api/calendar-events/: + get: + operationId: orbit_api_calendar_events_list + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedCalendarEventList' + description: '' + post: + operationId: orbit_api_calendar_events_create + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + /orbit/api/calendar-events/{id}/: + get: + operationId: orbit_api_calendar_events_retrieve + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + put: + operationId: orbit_api_calendar_events_update + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + patch: + operationId: orbit_api_calendar_events_partial_update + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedCalendarEventRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedCalendarEventRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedCalendarEventRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + delete: + operationId: orbit_api_calendar_events_destroy + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/clients/: + get: + operationId: orbit_api_clients_list + description: Retrieve a paginated list of clients owned by the current user. + summary: List clients + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order results by: name, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search clients by name, legal name, or overview + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedClientList' + description: '' + post: + operationId: orbit_api_clients_create + description: Create a new client record. + summary: Create client + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClientRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ClientRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ClientRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + /orbit/api/clients/{id}/: + get: + operationId: orbit_api_clients_retrieve + description: Retrieve detailed information about a specific client. + summary: Get client details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + put: + operationId: orbit_api_clients_update + description: Update all fields of a client record. + summary: Update client + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClientRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ClientRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ClientRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + patch: + operationId: orbit_api_clients_partial_update + description: Update specific fields of a client record. + summary: Partially update client + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedClientRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedClientRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedClientRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + delete: + operationId: orbit_api_clients_destroy + description: Delete a client record. + summary: Delete client + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/contacts/: + get: + operationId: orbit_api_contacts_list + description: Retrieve a paginated list of contacts from user's clients and vendors. + summary: List contacts + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search contacts by name, job title, or email + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedContactList' + description: '' + post: + operationId: orbit_api_contacts_create + description: Create a new contact record. + summary: Create contact + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + /orbit/api/contacts/{id}/: + get: + operationId: orbit_api_contacts_retrieve + description: Retrieve detailed information about a specific contact. + summary: Get contact details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + put: + operationId: orbit_api_contacts_update + description: Update all fields of a contact record. + summary: Update contact + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + patch: + operationId: orbit_api_contacts_partial_update + description: Update specific fields of a contact record. + summary: Partially update contact + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedContactRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + delete: + operationId: orbit_api_contacts_destroy + description: Delete a contact record. + summary: Delete contact + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/contacts/search/: + get: + operationId: orbit_api_contacts_search_retrieve + description: Advanced contact search with organization type filtering. + summary: Search contacts + parameters: + - in: query + name: organization_type + schema: + type: string + description: 'Filter by organization type: client or vendor' + - in: query + name: search_term + schema: + type: string + description: Search term for name or job title + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + /orbit/api/digital-contact-types/: + get: + operationId: orbit_api_digital_contact_types_list + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDigitalContactTypeList' + description: '' + /orbit/api/digital-contact-types/{id}/: + get: + operationId: orbit_api_digital_contact_types_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact type. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContactType' + description: '' + /orbit/api/digital-contacts/: + get: + operationId: orbit_api_digital_contacts_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDigitalContactList' + description: '' + post: + operationId: orbit_api_digital_contacts_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + /orbit/api/digital-contacts/{id}/: + get: + operationId: orbit_api_digital_contacts_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + put: + operationId: orbit_api_digital_contacts_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + patch: + operationId: orbit_api_digital_contacts_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedDigitalContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedDigitalContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedDigitalContactRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + delete: + operationId: orbit_api_digital_contacts_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/opportunities/: + get: + operationId: orbit_api_opportunities_list + description: Retrieve a paginated list of sales opportunities. + summary: List opportunities + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, expected_close_date, value' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search opportunities by name or description + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedOpportunityList' + description: '' + post: + operationId: orbit_api_opportunities_create + description: Create a new sales opportunity. + summary: Create opportunity + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OpportunityRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OpportunityRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OpportunityRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + /orbit/api/opportunities/{id}/: + get: + operationId: orbit_api_opportunities_retrieve + description: Retrieve detailed information about a specific opportunity. + summary: Get opportunity details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + put: + operationId: orbit_api_opportunities_update + description: Update all fields of an opportunity record. + summary: Update opportunity + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OpportunityRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OpportunityRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OpportunityRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + patch: + operationId: orbit_api_opportunities_partial_update + description: Update specific fields of an opportunity record. + summary: Partially update opportunity + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedOpportunityRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedOpportunityRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedOpportunityRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + delete: + operationId: orbit_api_opportunities_destroy + description: Delete an opportunity record. + summary: Delete opportunity + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/opportunities/by_status/: + get: + operationId: orbit_api_opportunities_by_status_retrieve + description: Retrieve opportunities filtered by status and optionally by client. + summary: Filter opportunities by status + parameters: + - in: query + name: client_id + schema: + type: integer + description: Filter by specific client ID + - in: query + name: status + schema: + type: string + description: 'Filter by opportunity status: active, won, lost, dropped' + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + /orbit/api/proposals/: + get: + operationId: orbit_api_proposals_list + description: Retrieve a paginated list of proposals for opportunities owned + by the current user. + summary: List proposals + parameters: + - in: query + name: opportunity_id + schema: + type: integer + description: Filter by opportunity ID + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, due_date, submitted_date, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search proposals by name + - in: query + name: status + schema: + type: string + description: 'Filter by status: Draft, In Review, Final' + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedProposalList' + description: '' + post: + operationId: orbit_api_proposals_create + description: Create a new proposal record. + summary: Create proposal + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ProposalRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ProposalRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ProposalRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + /orbit/api/proposals/{id}/: + get: + operationId: orbit_api_proposals_retrieve + description: Retrieve detailed information about a specific proposal. + summary: Get proposal details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + put: + operationId: orbit_api_proposals_update + description: Update all fields of a proposal record. + summary: Update proposal + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ProposalRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ProposalRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ProposalRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + patch: + operationId: orbit_api_proposals_partial_update + description: Update specific fields of a proposal record. + summary: Partially update proposal + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedProposalRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedProposalRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedProposalRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + delete: + operationId: orbit_api_proposals_destroy + description: Delete a proposal record. + summary: Delete proposal + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/stock/overview/{symbol}/: + get: + operationId: orbit_api_stock_overview_retrieve + description: Returns company overview data for a stock symbol + summary: Get company overview + parameters: + - in: path + name: symbol + schema: + type: string + description: Stock symbol + required: true + tags: + - stock + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: Company overview data + '403': + description: Access denied + '500': + description: Unable to fetch company data + /orbit/api/stock/quote/{symbol}/: + get: + operationId: orbit_api_stock_quote_retrieve + description: Returns current stock quote data for a symbol + summary: Get stock quote + parameters: + - in: path + name: symbol + schema: + type: string + description: Stock symbol + required: true + tags: + - stock + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: Stock quote data + '403': + description: Access denied + '500': + description: Unable to fetch stock data + /orbit/api/suggest-timezone/: + post: + operationId: orbit_api_suggest_timezone_create + description: Uses address components to suggest an appropriate timezone using + geocoding. + summary: Suggest timezone from address + tags: + - Orbit + requestBody: + content: + application/json: + schema: + type: object + properties: + street_address: + type: string + locality: + type: string + region: + type: string + postal_code: + type: string + country: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + type: object + properties: + timezone: + type: string + success: + type: boolean + method: + type: string + description: '' + '400': + content: + application/json: + schema: + type: object + properties: + error: + type: string + success: + type: boolean + description: '' + /orbit/api/v1/calendar-events/: + get: + operationId: orbit_api_v1_calendar_events_list + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedCalendarEventList' + description: '' + post: + operationId: orbit_api_v1_calendar_events_create + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + /orbit/api/v1/calendar-events/{id}/: + get: + operationId: orbit_api_v1_calendar_events_retrieve + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + put: + operationId: orbit_api_v1_calendar_events_update + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CalendarEventRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + patch: + operationId: orbit_api_v1_calendar_events_partial_update + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedCalendarEventRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedCalendarEventRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedCalendarEventRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CalendarEvent' + description: '' + delete: + operationId: orbit_api_v1_calendar_events_destroy + parameters: + - in: path + name: id + schema: + type: string + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/v1/clients/: + get: + operationId: orbit_api_v1_clients_list + description: Retrieve a paginated list of clients owned by the current user. + summary: List clients + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order results by: name, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search clients by name, legal name, or overview + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedClientList' + description: '' + post: + operationId: orbit_api_v1_clients_create + description: Create a new client record. + summary: Create client + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClientRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ClientRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ClientRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + /orbit/api/v1/clients/{id}/: + get: + operationId: orbit_api_v1_clients_retrieve + description: Retrieve detailed information about a specific client. + summary: Get client details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + put: + operationId: orbit_api_v1_clients_update + description: Update all fields of a client record. + summary: Update client + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClientRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ClientRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ClientRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + patch: + operationId: orbit_api_v1_clients_partial_update + description: Update specific fields of a client record. + summary: Partially update client + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedClientRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedClientRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedClientRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Client' + description: '' + delete: + operationId: orbit_api_v1_clients_destroy + description: Delete a client record. + summary: Delete client + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this client. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/v1/contacts/: + get: + operationId: orbit_api_v1_contacts_list + description: Retrieve a paginated list of contacts from user's clients and vendors. + summary: List contacts + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search contacts by name, job title, or email + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedContactList' + description: '' + post: + operationId: orbit_api_v1_contacts_create + description: Create a new contact record. + summary: Create contact + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + /orbit/api/v1/contacts/{id}/: + get: + operationId: orbit_api_v1_contacts_retrieve + description: Retrieve detailed information about a specific contact. + summary: Get contact details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + put: + operationId: orbit_api_v1_contacts_update + description: Update all fields of a contact record. + summary: Update contact + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + patch: + operationId: orbit_api_v1_contacts_partial_update + description: Update specific fields of a contact record. + summary: Partially update contact + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedContactRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + delete: + operationId: orbit_api_v1_contacts_destroy + description: Delete a contact record. + summary: Delete contact + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this contact. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/v1/contacts/search/: + get: + operationId: orbit_api_v1_contacts_search_retrieve + description: Advanced contact search with organization type filtering. + summary: Search contacts + parameters: + - in: query + name: organization_type + schema: + type: string + description: 'Filter by organization type: client or vendor' + - in: query + name: search_term + schema: + type: string + description: Search term for name or job title + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + description: '' + /orbit/api/v1/digital-contact-types/: + get: + operationId: orbit_api_v1_digital_contact_types_list + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDigitalContactTypeList' + description: '' + /orbit/api/v1/digital-contact-types/{id}/: + get: + operationId: orbit_api_v1_digital_contact_types_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact type. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContactType' + description: '' + /orbit/api/v1/digital-contacts/: + get: + operationId: orbit_api_v1_digital_contacts_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedDigitalContactList' + description: '' + post: + operationId: orbit_api_v1_digital_contacts_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + /orbit/api/v1/digital-contacts/{id}/: + get: + operationId: orbit_api_v1_digital_contacts_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + put: + operationId: orbit_api_v1_digital_contacts_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/DigitalContactRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + patch: + operationId: orbit_api_v1_digital_contacts_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedDigitalContactRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedDigitalContactRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedDigitalContactRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DigitalContact' + description: '' + delete: + operationId: orbit_api_v1_digital_contacts_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this digital contact. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/v1/opportunities/: + get: + operationId: orbit_api_v1_opportunities_list + description: Retrieve a paginated list of sales opportunities. + summary: List opportunities + parameters: + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, expected_close_date, value' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search opportunities by name or description + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedOpportunityList' + description: '' + post: + operationId: orbit_api_v1_opportunities_create + description: Create a new sales opportunity. + summary: Create opportunity + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OpportunityRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OpportunityRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OpportunityRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + /orbit/api/v1/opportunities/{id}/: + get: + operationId: orbit_api_v1_opportunities_retrieve + description: Retrieve detailed information about a specific opportunity. + summary: Get opportunity details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + put: + operationId: orbit_api_v1_opportunities_update + description: Update all fields of an opportunity record. + summary: Update opportunity + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OpportunityRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OpportunityRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OpportunityRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + patch: + operationId: orbit_api_v1_opportunities_partial_update + description: Update specific fields of an opportunity record. + summary: Partially update opportunity + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedOpportunityRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedOpportunityRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedOpportunityRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + delete: + operationId: orbit_api_v1_opportunities_destroy + description: Delete an opportunity record. + summary: Delete opportunity + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this opportunity. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/v1/opportunities/by_status/: + get: + operationId: orbit_api_v1_opportunities_by_status_retrieve + description: Retrieve opportunities filtered by status and optionally by client. + summary: Filter opportunities by status + parameters: + - in: query + name: client_id + schema: + type: integer + description: Filter by specific client ID + - in: query + name: status + schema: + type: string + description: 'Filter by opportunity status: active, won, lost, dropped' + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Opportunity' + description: '' + /orbit/api/v1/proposals/: + get: + operationId: orbit_api_v1_proposals_list + description: Retrieve a paginated list of proposals for opportunities owned + by the current user. + summary: List proposals + parameters: + - in: query + name: opportunity_id + schema: + type: integer + description: Filter by opportunity ID + - in: query + name: ordering + schema: + type: string + description: 'Order by: name, due_date, submitted_date, created_date' + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search proposals by name + - in: query + name: status + schema: + type: string + description: 'Filter by status: Draft, In Review, Final' + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedProposalList' + description: '' + post: + operationId: orbit_api_v1_proposals_create + description: Create a new proposal record. + summary: Create proposal + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ProposalRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ProposalRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ProposalRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + /orbit/api/v1/proposals/{id}/: + get: + operationId: orbit_api_v1_proposals_retrieve + description: Retrieve detailed information about a specific proposal. + summary: Get proposal details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + put: + operationId: orbit_api_v1_proposals_update + description: Update all fields of a proposal record. + summary: Update proposal + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ProposalRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ProposalRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ProposalRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + patch: + operationId: orbit_api_v1_proposals_partial_update + description: Update specific fields of a proposal record. + summary: Partially update proposal + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedProposalRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedProposalRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedProposalRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Proposal' + description: '' + delete: + operationId: orbit_api_v1_proposals_destroy + description: Delete a proposal record. + summary: Delete proposal + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this proposal. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/v1/stock/overview/{symbol}/: + get: + operationId: orbit_api_v1_stock_overview_retrieve + description: Returns company overview data for a stock symbol + summary: Get company overview + parameters: + - in: path + name: symbol + schema: + type: string + description: Stock symbol + required: true + tags: + - stock + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: Company overview data + '403': + description: Access denied + '500': + description: Unable to fetch company data + /orbit/api/v1/stock/quote/{symbol}/: + get: + operationId: orbit_api_v1_stock_quote_retrieve + description: Returns current stock quote data for a symbol + summary: Get stock quote + parameters: + - in: path + name: symbol + schema: + type: string + description: Stock symbol + required: true + tags: + - stock + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + description: Stock quote data + '403': + description: Access denied + '500': + description: Unable to fetch stock data + /orbit/api/v1/suggest-timezone/: + post: + operationId: orbit_api_v1_suggest_timezone_create + description: Uses address components to suggest an appropriate timezone using + geocoding. + summary: Suggest timezone from address + tags: + - Orbit + requestBody: + content: + application/json: + schema: + type: object + properties: + street_address: + type: string + locality: + type: string + region: + type: string + postal_code: + type: string + country: + type: string + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + type: object + properties: + timezone: + type: string + success: + type: boolean + method: + type: string + description: '' + '400': + content: + application/json: + schema: + type: object + properties: + error: + type: string + success: + type: boolean + description: '' + /orbit/api/v1/vendor-solutions/: + get: + operationId: orbit_api_v1_vendor_solutions_list + description: Retrieve a paginated list of vendor solutions. + summary: List vendor solutions + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search solutions by name or description + - in: query + name: vendor + schema: + type: integer + description: Filter by vendor ID + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedVendorSolutionList' + description: '' + post: + operationId: orbit_api_v1_vendor_solutions_create + description: Create a new vendor solution. + summary: Create vendor solution + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + /orbit/api/v1/vendor-solutions/{id}/: + get: + operationId: orbit_api_v1_vendor_solutions_retrieve + description: Retrieve detailed information about a specific vendor solution. + summary: Get vendor solution details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + put: + operationId: orbit_api_v1_vendor_solutions_update + description: Update all fields of a vendor solution record. + summary: Update vendor solution + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + patch: + operationId: orbit_api_v1_vendor_solutions_partial_update + description: Update specific fields of a vendor solution record. + summary: Partially update vendor solution + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedVendorSolutionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedVendorSolutionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedVendorSolutionRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + delete: + operationId: orbit_api_v1_vendor_solutions_destroy + description: Delete a vendor solution record. + summary: Delete vendor solution + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/v1/vendors/: + get: + operationId: orbit_api_v1_vendors_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: search + required: false + in: query + description: A search term. + schema: + type: string + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedVendorList' + description: '' + post: + operationId: orbit_api_v1_vendors_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + /orbit/api/v1/vendors/{id}/: + get: + operationId: orbit_api_v1_vendors_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + put: + operationId: orbit_api_v1_vendors_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + patch: + operationId: orbit_api_v1_vendors_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedVendorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedVendorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedVendorRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + delete: + operationId: orbit_api_v1_vendors_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/vendor-solutions/: + get: + operationId: orbit_api_vendor_solutions_list + description: Retrieve a paginated list of vendor solutions. + summary: List vendor solutions + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - in: query + name: search + schema: + type: string + description: Search solutions by name or description + - in: query + name: vendor + schema: + type: integer + description: Filter by vendor ID + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedVendorSolutionList' + description: '' + post: + operationId: orbit_api_vendor_solutions_create + description: Create a new vendor solution. + summary: Create vendor solution + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + /orbit/api/vendor-solutions/{id}/: + get: + operationId: orbit_api_vendor_solutions_retrieve + description: Retrieve detailed information about a specific vendor solution. + summary: Get vendor solution details + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + put: + operationId: orbit_api_vendor_solutions_update + description: Update all fields of a vendor solution record. + summary: Update vendor solution + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorSolutionRequest' + required: true + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + patch: + operationId: orbit_api_vendor_solutions_partial_update + description: Update specific fields of a vendor solution record. + summary: Partially update vendor solution + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedVendorSolutionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedVendorSolutionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedVendorSolutionRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VendorSolution' + description: '' + delete: + operationId: orbit_api_vendor_solutions_destroy + description: Delete a vendor solution record. + summary: Delete vendor solution + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor solution. + required: true + tags: + - Orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body + /orbit/api/vendors/: + get: + operationId: orbit_api_vendors_list + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - name: ordering + required: false + in: query + description: Which field to use when ordering the results. + schema: + type: string + - name: page + required: false + in: query + description: A page number within the paginated result set. + schema: + type: integer + - name: search + required: false + in: query + description: A search term. + schema: + type: string + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PaginatedVendorList' + description: '' + post: + operationId: orbit_api_vendors_create + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + /orbit/api/vendors/{id}/: + get: + operationId: orbit_api_vendors_retrieve + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + put: + operationId: orbit_api_vendors_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VendorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VendorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VendorRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + patch: + operationId: orbit_api_vendors_partial_update + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedVendorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedVendorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedVendorRequest' + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Vendor' + description: '' + delete: + operationId: orbit_api_vendors_destroy + description: |- + Mixin that adds automatic tenant scoping to any DRF ViewSet. + + Attributes: + tenant_field (str): + The ORM lookup path from the model to the ``subscriber`` FK. + Defaults to ``'subscriber'`` for models with a direct FK. + Set to a longer path for child models, e.g. + ``'advisor_tool__subscriber'``. + + tenant_owner_field (str | None): + Optional. The field name for the ``owner`` / ``user`` FK on the + model. When set, queryset is *also* filtered by + ``request.user`` (preserving existing per-user isolation within + a tenant). Set to ``None`` to skip user-level filtering. + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this vendor. + required: true + tags: + - orbit + security: + - ApiKeyAuth: [] + - ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' + responses: + '204': + description: No response body +components: + schemas: + APIKey: + type: object + description: |- + API key information serializer. + + Provides API key metadata without exposing the actual key value: + - Key name and type + - Creation and usage timestamps + - Active status + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 100 + app_type: + $ref: '#/components/schemas/AppTypeEnum' + created_date: + type: string + format: date-time + readOnly: true + last_used: + type: string + format: date-time + readOnly: true + nullable: true + is_active: + type: boolean + days_since_created: + type: string + readOnly: true + days_since_used: + type: string + readOnly: true + required: + - app_type + - created_date + - days_since_created + - days_since_used + - id + - last_used + - name + AdvisorTool: + type: object + description: Serialize an AdvisorTool with computed counts and client/association + display fields. + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + categories: + description: Custom categories for findings and requirements + timeframe_short: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Short timeframe in days + timeframe_medium: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Medium timeframe in days + timeframe_long: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Long timeframe in days + client_name: + type: string + readOnly: true + association_display: + type: string + readOnly: true + findings_count: + type: string + readOnly: true + requirements_count: + type: string + readOnly: true + recommendations_count: + type: string + readOnly: true + principles_count: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - association_display + - client_name + - created_date + - description + - findings_count + - id + - modified_date + - name + - principles_count + - recommendations_count + - requirements_count + AdvisorToolRequest: + type: object + description: Serialize an AdvisorTool with computed counts and client/association + display fields. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + categories: + description: Custom categories for findings and requirements + timeframe_short: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Short timeframe in days + timeframe_medium: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Medium timeframe in days + timeframe_long: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Long timeframe in days + required: + - description + - name + AppTypeEnum: + enum: + - DAV + - API + - MCP + type: string + description: |- + * `DAV` - DAV Key (Calendar & Contacts) + * `API` - API Key (REST API) + * `MCP` - MCP Key (AI Assistant) + Assumption: + type: object + properties: + id: + type: integer + readOnly: true + title: + type: string + maxLength: 255 + description: + type: string + potential_impact: + $ref: '#/components/schemas/PotentialImpactEnum' + impact_details: + type: string + required: + - description + - id + - impact_details + - potential_impact + - title + BMC: + type: object + properties: + id: + type: integer + readOnly: true + version: + type: integer + maximum: 2147483647 + minimum: -2147483648 + customer_segments: + type: string + value_propositions: + type: string + channels: + type: string + customer_relationships: + type: string + revenue_streams: + type: string + key_resources: + type: string + key_activities: + type: string + key_partnerships: + type: string + cost_structure: + type: string + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - id + - modified_date + BMCRequest: + type: object + properties: + version: + type: integer + maximum: 2147483647 + minimum: -2147483648 + customer_segments: + type: string + value_propositions: + type: string + channels: + type: string + customer_relationships: + type: string + revenue_streams: + type: string + key_resources: + type: string + key_activities: + type: string + key_partnerships: + type: string + cost_structure: + type: string + BMCTemplate: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + customer_segments: + type: string + value_propositions: + type: string + channels: + type: string + customer_relationships: + type: string + revenue_streams: + type: string + key_resources: + type: string + key_activities: + type: string + key_partnerships: + type: string + cost_structure: + type: string + is_active: + type: boolean + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - id + - modified_date + - name + BMCTemplateRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + customer_segments: + type: string + value_propositions: + type: string + channels: + type: string + customer_relationships: + type: string + revenue_streams: + type: string + key_resources: + type: string + key_activities: + type: string + key_partnerships: + type: string + cost_structure: + type: string + is_active: + type: boolean + required: + - name + BMCTool: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + client_name: + type: string + readOnly: true + association_display: + type: string + readOnly: true + latest_bmc: + type: string + readOnly: true + bmc_count: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - association_display + - bmc_count + - client_name + - created_date + - description + - id + - latest_bmc + - modified_date + - name + BMCToolRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + required: + - description + - name + BillingCycleEnum: + enum: + - one_time + - monthly + - annual + type: string + description: |- + * `one_time` - One Time + * `monthly` - Monthly + * `annual` - Annual + BlankEnum: + enum: + - '' + BulkLocationOperationRequest: + type: object + description: |- + Bulk location operation serializer. + + Handles bulk operations on multiple locations. + properties: + operation: + $ref: '#/components/schemas/OperationEnum' + location_ids: + type: array + items: + type: integer + description: List of location IDs to operate on + minItems: 1 + parameters: + type: object + additionalProperties: {} + description: Operation-specific parameters + required: + - location_ids + - operation + CSVImportRequest: + type: object + description: |- + CSV import request serializer. + + Handles CSV file upload and import configuration. + properties: + csv_file: + type: string + format: binary + description: CSV file containing location data + required: + - csv_file + CalendarEvent: + type: object + properties: + id: + type: integer + readOnly: true + title: + type: string + maxLength: 255 + description: + type: string + start_time: + type: string + format: date-time + end_time: + type: string + format: date-time + location: + type: string + maxLength: 255 + event_type: + $ref: '#/components/schemas/EventTypeEnum' + required: + - end_time + - id + - start_time + - title + CalendarEventRequest: + type: object + properties: + title: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + start_time: + type: string + format: date-time + end_time: + type: string + format: date-time + location: + type: string + maxLength: 255 + event_type: + $ref: '#/components/schemas/EventTypeEnum' + required: + - end_time + - start_time + - title + Client: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + legal_name: + type: string + abbreviated_name: + type: string + overview: + type: string + history: + type: string + services_provided: + type: string + client_type: + type: string + vertical: + type: string + nullable: true + stock_exchange: + type: string + nullable: true + stock_symbol: + type: string + nullable: true + employee_count: + type: integer + nullable: true + revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + assets: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + fiscal_year_end: + type: string + format: date + nullable: true + contact_center_agent_count: + type: integer + nullable: true + service_desk_agent_count: + type: integer + nullable: true + supervisor_count: + type: integer + nullable: true + location_count: + type: integer + nullable: true + repository_url: + type: string + parent_organization: + type: string + readOnly: true + parent_relationship_type: + type: string + readOnly: true + is_multi_role_organization: + type: string + readOnly: true + child_organizations_count: + type: string + readOnly: true + required: + - child_organizations_count + - id + - is_multi_role_organization + - parent_organization + - parent_relationship_type + ClientLocationTool: + type: object + description: |- + Client Location Tool serializer with automatic version management. + + Provides tool information including: + - Basic tool metadata + - Current version number (automatically managed) + - All location sets with automatic version numbering + - Table source configuration + + Automatic Version Management: + - current_version field shows the active version number (integer) + - location_sets array shows all versions ordered by version number + - Version creation is handled by the create_version API endpoint + - Version switching is handled by the switch_version API endpoint + - All version numbers are automatically assigned and read-only + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + current_version: + type: integer + readOnly: true + description: Current active version number (automatically managed) + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + owner: + type: integer + readOnly: true + current_location_set: + allOf: + - $ref: '#/components/schemas/LocationSet' + readOnly: true + location_sets: + type: array + items: + $ref: '#/components/schemas/LocationSet' + readOnly: true + table_source: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - current_location_set + - current_version + - description + - id + - location_sets + - modified_date + - name + - owner + - table_source + ClientLocationToolRequest: + type: object + description: |- + Client Location Tool serializer with automatic version management. + + Provides tool information including: + - Basic tool metadata + - Current version number (automatically managed) + - All location sets with automatic version numbering + - Table source configuration + + Automatic Version Management: + - current_version field shows the active version number (integer) + - location_sets array shows all versions ordered by version number + - Version creation is handled by the create_version API endpoint + - Version switching is handled by the switch_version API endpoint + - All version numbers are automatically assigned and read-only + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + required: + - description + - name + ClientRequest: + type: object + properties: + name: + type: string + legal_name: + type: string + abbreviated_name: + type: string + overview: + type: string + history: + type: string + services_provided: + type: string + client_type: + type: string + vertical: + type: string + nullable: true + stock_exchange: + type: string + nullable: true + stock_symbol: + type: string + nullable: true + employee_count: + type: integer + nullable: true + revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + assets: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + fiscal_year_end: + type: string + format: date + nullable: true + contact_center_agent_count: + type: integer + nullable: true + service_desk_agent_count: + type: integer + nullable: true + supervisor_count: + type: integer + nullable: true + location_count: + type: integer + nullable: true + repository_url: + type: string + ComplexityEnum: + enum: + - High + - Medium + - Low + type: string + description: |- + * `High` - High + * `Medium` - Medium + * `Low` - Low + Contact: + type: object + properties: + id: + type: integer + readOnly: true + first_name: + type: string + maxLength: 100 + last_name: + type: string + maxLength: 100 + job_title: + type: string + maxLength: 100 + email: + type: string + format: email + maxLength: 254 + phones: + type: array + items: + $ref: '#/components/schemas/ContactPhone' + readOnly: true + preferred_phone: + type: string + readOnly: true + organization: + type: string + readOnly: true + reports_to: + type: integer + nullable: true + reports_to_name: + type: string + readOnly: true + direct_reports_count: + type: string + readOnly: true + is_client_contact: + type: string + readOnly: true + is_vendor_contact: + type: string + readOnly: true + is_multi_role_contact: + type: string + readOnly: true + organization_profiles: + type: string + readOnly: true + required: + - direct_reports_count + - first_name + - id + - is_client_contact + - is_multi_role_contact + - is_vendor_contact + - last_name + - organization + - organization_profiles + - phones + - preferred_phone + - reports_to_name + ContactPhone: + type: object + properties: + id: + type: integer + readOnly: true + number: + type: string + maxLength: 20 + type: + $ref: '#/components/schemas/ContactPhoneTypeEnum' + is_preferred: + type: boolean + required: + - id + - number + ContactPhoneRequest: + type: object + properties: + number: + type: string + minLength: 1 + maxLength: 20 + type: + $ref: '#/components/schemas/ContactPhoneTypeEnum' + is_preferred: + type: boolean + required: + - number + ContactPhoneTypeEnum: + enum: + - cell + - home + - work + - other + type: string + description: |- + * `cell` - Cell + * `home` - Home + * `work` - Work + * `other` - Other + ContactRequest: + type: object + properties: + first_name: + type: string + minLength: 1 + maxLength: 100 + last_name: + type: string + minLength: 1 + maxLength: 100 + job_title: + type: string + maxLength: 100 + email: + type: string + format: email + maxLength: 254 + organization_id: + type: integer + writeOnly: true + reports_to: + type: integer + nullable: true + required: + - first_name + - last_name + Content3TypeEnum: + enum: + - text + - image + - table + type: string + description: |- + * `text` - Text + * `image` - Image + * `table` - Table + Currency: + type: object + description: |- + Currency information serializer. + + Provides currency details including: + - ISO currency codes + - Display names and symbols + - Active status + properties: + code: + type: string + maxLength: 3 + name: + type: string + maxLength: 50 + symbol: + type: string + maxLength: 5 + is_active: + type: boolean + required: + - code + - name + - symbol + CustomFieldDefinition: + type: object + description: |- + Custom field definition serializer. + + Provides custom field schema information including: + - Field name, type, and description + - Validation rules and default values + - Display order + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 100 + field_type: + $ref: '#/components/schemas/CustomFieldDefinitionFieldTypeEnum' + description: + type: string + is_required: + type: boolean + default_value: + type: string + order: + type: integer + maximum: 2147483647 + minimum: 0 + required: + - field_type + - id + - name + CustomFieldDefinitionFieldTypeEnum: + enum: + - count + - boolean + - text + - rich_text + type: string + description: |- + * `count` - Count + * `boolean` - Boolean + * `text` - Text + * `rich_text` - Rich Text + CustomFieldDefinitionRequest: + type: object + description: |- + Custom field definition serializer. + + Provides custom field schema information including: + - Field name, type, and description + - Validation rules and default values + - Display order + properties: + name: + type: string + minLength: 1 + maxLength: 100 + field_type: + $ref: '#/components/schemas/CustomFieldDefinitionFieldTypeEnum' + description: + type: string + is_required: + type: boolean + default_value: + type: string + order: + type: integer + maximum: 2147483647 + minimum: 0 + required: + - field_type + - name + DateFormatEnum: + enum: + - YYYY-MM-DD + - DD/MM/YYYY + - MM/DD/YYYY + - DD.MM.YYYY + - DD-MM-YYYY + type: string + description: |- + * `YYYY-MM-DD` - 2024-12-25 + * `DD/MM/YYYY` - 25/12/2024 + * `MM/DD/YYYY` - 12/25/2024 + * `DD.MM.YYYY` - 25.12.2024 + * `DD-MM-YYYY` - 25-12-2024 + Deck: + type: object + properties: + id: + type: integer + readOnly: true + presentation: + type: integer + template: + type: integer + title: + type: string + maxLength: 255 + subtitle: + type: string + maxLength: 255 + presenter: + type: integer + nullable: true + status: + $ref: '#/components/schemas/DeckStatusEnum' + date: + type: string + format: date + slide_count: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - id + - modified_date + - presentation + - slide_count + - status + - template + DeckRequest: + type: object + properties: + presentation: + type: integer + template: + type: integer + title: + type: string + maxLength: 255 + subtitle: + type: string + maxLength: 255 + presenter: + type: integer + nullable: true + status: + $ref: '#/components/schemas/DeckStatusEnum' + date: + type: string + format: date + required: + - presentation + - status + - template + DeckSlide: + type: object + properties: + id: + type: integer + readOnly: true + deck: + type: integer + slide_type: + type: string + maxLength: 50 + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + content_mapping: {} + layout_name: + type: string + readOnly: true + content1_type: + $ref: '#/components/schemas/Content3TypeEnum' + content1_image: + type: integer + nullable: true + content1_table: + type: integer + nullable: true + content2_type: + $ref: '#/components/schemas/Content3TypeEnum' + content2_image: + type: integer + nullable: true + content2_table: + type: integer + nullable: true + content3_type: + $ref: '#/components/schemas/Content3TypeEnum' + content3_image: + type: integer + nullable: true + content3_table: + type: integer + nullable: true + required: + - deck + - id + - layout_name + - order + - slide_type + DeckSlideRequest: + type: object + properties: + deck: + type: integer + slide_type: + type: string + minLength: 1 + maxLength: 50 + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + content_mapping: {} + content1_type: + $ref: '#/components/schemas/Content3TypeEnum' + content1_image: + type: integer + nullable: true + content1_table: + type: integer + nullable: true + content2_type: + $ref: '#/components/schemas/Content3TypeEnum' + content2_image: + type: integer + nullable: true + content2_table: + type: integer + nullable: true + content3_type: + $ref: '#/components/schemas/Content3TypeEnum' + content3_image: + type: integer + nullable: true + content3_table: + type: integer + nullable: true + required: + - deck + - order + - slide_type + DeckStatusEnum: + enum: + - Draft + - Final + type: string + description: |- + * `Draft` - Draft + * `Final` - Final + Dependency: + type: object + properties: + id: + type: integer + readOnly: true + title: + type: string + maxLength: 255 + description: + type: string + potential_impact: + $ref: '#/components/schemas/PotentialImpactEnum' + owner: + type: integer + owner_name: + type: string + readOnly: true + priority: + $ref: '#/components/schemas/Priority758Enum' + external: + type: boolean + required: + - description + - id + - owner + - owner_name + - potential_impact + - priority + - title + DigitalContact: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 100 + contact_type: + allOf: + - $ref: '#/components/schemas/DigitalContactType' + readOnly: true + url: + type: string + maxLength: 500 + display_url: + type: string + readOnly: true + notes: + type: string + client: + type: integer + nullable: true + vendor: + type: integer + nullable: true + required: + - contact_type + - display_url + - id + - name + - url + DigitalContactRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 100 + contact_type_id: + type: integer + writeOnly: true + url: + type: string + minLength: 1 + maxLength: 500 + notes: + type: string + client: + type: integer + nullable: true + vendor: + type: integer + nullable: true + required: + - contact_type_id + - name + - url + DigitalContactType: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 50 + icon: + type: string + maxLength: 50 + required: + - id + - name + DigitalContactTypeRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 50 + icon: + type: string + maxLength: 50 + required: + - name + DurationEnum: + enum: + - 45 + - 60 + - 90 + type: integer + description: |- + * `45` - 45 minutes + * `60` - 60 minutes + * `90` - 90 minutes + Engagement: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + client: + allOf: + - $ref: '#/components/schemas/Client' + readOnly: true + start_date: + type: string + format: date + end_date: + type: string + format: date + status: + $ref: '#/components/schemas/Status557Enum' + description: + type: string + interviews: + type: array + items: + $ref: '#/components/schemas/Interview' + readOnly: true + workshops: + type: array + items: + $ref: '#/components/schemas/Workshop' + readOnly: true + interview_count: + type: string + readOnly: true + workshop_count: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - client + - created_date + - end_date + - id + - interview_count + - interviews + - modified_date + - name + - start_date + - workshop_count + - workshops + EngagementRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + client_id: + type: integer + writeOnly: true + opportunity_id: + type: integer + writeOnly: true + start_date: + type: string + format: date + end_date: + type: string + format: date + status: + $ref: '#/components/schemas/Status557Enum' + description: + type: string + required: + - client_id + - end_date + - name + - opportunity_id + - start_date + EngagementSummary: + type: object + description: Lightweight serializer for engagement summaries + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + client_name: + type: string + readOnly: true + status: + $ref: '#/components/schemas/Status557Enum' + start_date: + type: string + format: date + end_date: + type: string + format: date + interview_count: + type: string + readOnly: true + workshop_count: + type: string + readOnly: true + required: + - client_name + - end_date + - id + - interview_count + - name + - start_date + - workshop_count + EventTypeEnum: + enum: + - meeting + - deadline + - reminder + - opportunity + - birthday + type: string + description: |- + * `meeting` - Meeting + * `deadline` - Deadline + * `reminder` - Reminder + * `opportunity` - Opportunity + * `birthday` - Birthday + Finding: + type: object + description: Serialize all Finding fields for read and write. + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + source: + $ref: '#/components/schemas/SourceEnum' + source_detail: + type: string + maxLength: 255 + category: + type: string + maxLength: 100 + impact_level: + $ref: '#/components/schemas/ImpactLevelEnum' + impact_description: + type: string + created_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - description + - id + - impact_description + - impact_level + - name + - source + FindingRequest: + type: object + description: Serialize all Finding fields for read and write. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + source: + $ref: '#/components/schemas/SourceEnum' + source_detail: + type: string + maxLength: 255 + category: + type: string + maxLength: 100 + impact_level: + $ref: '#/components/schemas/ImpactLevelEnum' + impact_description: + type: string + minLength: 1 + required: + - description + - impact_description + - impact_level + - name + - source + FiscalYear: + type: object + description: |- + Fiscal year information serializer. + + Provides fiscal year details including: + - Year designation + - Start date and calculated quarters + - Fiscal year periods + properties: + fiscal_year: + type: integer + readOnly: true + nullable: true + fiscal_year_start: + type: string + format: date + fiscal_quarter_1: + type: string + readOnly: true + nullable: true + fiscal_quarter_2: + type: string + readOnly: true + nullable: true + fiscal_quarter_3: + type: string + readOnly: true + nullable: true + fiscal_quarter_4: + type: string + readOnly: true + nullable: true + required: + - fiscal_quarter_1 + - fiscal_quarter_2 + - fiscal_quarter_3 + - fiscal_quarter_4 + - fiscal_year + - fiscal_year_start + HomeTimezoneEnum: + enum: + - Africa/Abidjan + - Africa/Accra + - Africa/Addis_Ababa + - Africa/Algiers + - Africa/Asmara + - Africa/Bamako + - Africa/Bangui + - Africa/Banjul + - Africa/Bissau + - Africa/Blantyre + - Africa/Brazzaville + - Africa/Bujumbura + - Africa/Cairo + - Africa/Casablanca + - Africa/Ceuta + - Africa/Conakry + - Africa/Dakar + - Africa/Dar_es_Salaam + - Africa/Djibouti + - Africa/Douala + - Africa/El_Aaiun + - Africa/Freetown + - Africa/Gaborone + - Africa/Harare + - Africa/Johannesburg + - Africa/Juba + - Africa/Kampala + - Africa/Khartoum + - Africa/Kigali + - Africa/Kinshasa + - Africa/Lagos + - Africa/Libreville + - Africa/Lome + - Africa/Luanda + - Africa/Lubumbashi + - Africa/Lusaka + - Africa/Malabo + - Africa/Maputo + - Africa/Maseru + - Africa/Mbabane + - Africa/Mogadishu + - Africa/Monrovia + - Africa/Nairobi + - Africa/Ndjamena + - Africa/Niamey + - Africa/Nouakchott + - Africa/Ouagadougou + - Africa/Porto-Novo + - Africa/Sao_Tome + - Africa/Tripoli + - Africa/Tunis + - Africa/Windhoek + - America/Adak + - America/Anchorage + - America/Anguilla + - America/Antigua + - America/Araguaina + - America/Argentina/Buenos_Aires + - America/Argentina/Catamarca + - America/Argentina/Cordoba + - America/Argentina/Jujuy + - America/Argentina/La_Rioja + - America/Argentina/Mendoza + - America/Argentina/Rio_Gallegos + - America/Argentina/Salta + - America/Argentina/San_Juan + - America/Argentina/San_Luis + - America/Argentina/Tucuman + - America/Argentina/Ushuaia + - America/Aruba + - America/Asuncion + - America/Atikokan + - America/Bahia + - America/Bahia_Banderas + - America/Barbados + - America/Belem + - America/Belize + - America/Blanc-Sablon + - America/Boa_Vista + - America/Bogota + - America/Boise + - America/Cambridge_Bay + - America/Campo_Grande + - America/Cancun + - America/Caracas + - America/Cayenne + - America/Cayman + - America/Chicago + - America/Chihuahua + - America/Ciudad_Juarez + - America/Costa_Rica + - America/Coyhaique + - America/Creston + - America/Cuiaba + - America/Curacao + - America/Danmarkshavn + - America/Dawson + - America/Dawson_Creek + - America/Denver + - America/Detroit + - America/Dominica + - America/Edmonton + - America/Eirunepe + - America/El_Salvador + - America/Fort_Nelson + - America/Fortaleza + - America/Glace_Bay + - America/Goose_Bay + - America/Grand_Turk + - America/Grenada + - America/Guadeloupe + - America/Guatemala + - America/Guayaquil + - America/Guyana + - America/Halifax + - America/Havana + - America/Hermosillo + - America/Indiana/Indianapolis + - America/Indiana/Knox + - America/Indiana/Marengo + - America/Indiana/Petersburg + - America/Indiana/Tell_City + - America/Indiana/Vevay + - America/Indiana/Vincennes + - America/Indiana/Winamac + - America/Inuvik + - America/Iqaluit + - America/Jamaica + - America/Juneau + - America/Kentucky/Louisville + - America/Kentucky/Monticello + - America/Kralendijk + - America/La_Paz + - America/Lima + - America/Los_Angeles + - America/Lower_Princes + - America/Maceio + - America/Managua + - America/Manaus + - America/Marigot + - America/Martinique + - America/Matamoros + - America/Mazatlan + - America/Menominee + - America/Merida + - America/Metlakatla + - America/Mexico_City + - America/Miquelon + - America/Moncton + - America/Monterrey + - America/Montevideo + - America/Montserrat + - America/Nassau + - America/New_York + - America/Nome + - America/Noronha + - America/North_Dakota/Beulah + - America/North_Dakota/Center + - America/North_Dakota/New_Salem + - America/Nuuk + - America/Ojinaga + - America/Panama + - America/Paramaribo + - America/Phoenix + - America/Port-au-Prince + - America/Port_of_Spain + - America/Porto_Velho + - America/Puerto_Rico + - America/Punta_Arenas + - America/Rankin_Inlet + - America/Recife + - America/Regina + - America/Resolute + - America/Rio_Branco + - America/Santarem + - America/Santiago + - America/Santo_Domingo + - America/Sao_Paulo + - America/Scoresbysund + - America/Sitka + - America/St_Barthelemy + - America/St_Johns + - America/St_Kitts + - America/St_Lucia + - America/St_Thomas + - America/St_Vincent + - America/Swift_Current + - America/Tegucigalpa + - America/Thule + - America/Tijuana + - America/Toronto + - America/Tortola + - America/Vancouver + - America/Whitehorse + - America/Winnipeg + - America/Yakutat + - Antarctica/Casey + - Antarctica/Davis + - Antarctica/DumontDUrville + - Antarctica/Macquarie + - Antarctica/Mawson + - Antarctica/McMurdo + - Antarctica/Palmer + - Antarctica/Rothera + - Antarctica/Syowa + - Antarctica/Troll + - Antarctica/Vostok + - Arctic/Longyearbyen + - Asia/Aden + - Asia/Almaty + - Asia/Amman + - Asia/Anadyr + - Asia/Aqtau + - Asia/Aqtobe + - Asia/Ashgabat + - Asia/Atyrau + - Asia/Baghdad + - Asia/Bahrain + - Asia/Baku + - Asia/Bangkok + - Asia/Barnaul + - Asia/Beirut + - Asia/Bishkek + - Asia/Brunei + - Asia/Chita + - Asia/Colombo + - Asia/Damascus + - Asia/Dhaka + - Asia/Dili + - Asia/Dubai + - Asia/Dushanbe + - Asia/Famagusta + - Asia/Gaza + - Asia/Hebron + - Asia/Ho_Chi_Minh + - Asia/Hong_Kong + - Asia/Hovd + - Asia/Irkutsk + - Asia/Jakarta + - Asia/Jayapura + - Asia/Jerusalem + - Asia/Kabul + - Asia/Kamchatka + - Asia/Karachi + - Asia/Kathmandu + - Asia/Khandyga + - Asia/Kolkata + - Asia/Krasnoyarsk + - Asia/Kuala_Lumpur + - Asia/Kuching + - Asia/Kuwait + - Asia/Macau + - Asia/Magadan + - Asia/Makassar + - Asia/Manila + - Asia/Muscat + - Asia/Nicosia + - Asia/Novokuznetsk + - Asia/Novosibirsk + - Asia/Omsk + - Asia/Oral + - Asia/Phnom_Penh + - Asia/Pontianak + - Asia/Pyongyang + - Asia/Qatar + - Asia/Qostanay + - Asia/Qyzylorda + - Asia/Riyadh + - Asia/Sakhalin + - Asia/Samarkand + - Asia/Seoul + - Asia/Shanghai + - Asia/Singapore + - Asia/Srednekolymsk + - Asia/Taipei + - Asia/Tashkent + - Asia/Tbilisi + - Asia/Tehran + - Asia/Thimphu + - Asia/Tokyo + - Asia/Tomsk + - Asia/Ulaanbaatar + - Asia/Urumqi + - Asia/Ust-Nera + - Asia/Vientiane + - Asia/Vladivostok + - Asia/Yakutsk + - Asia/Yangon + - Asia/Yekaterinburg + - Asia/Yerevan + - Atlantic/Azores + - Atlantic/Bermuda + - Atlantic/Canary + - Atlantic/Cape_Verde + - Atlantic/Faroe + - Atlantic/Madeira + - Atlantic/Reykjavik + - Atlantic/South_Georgia + - Atlantic/St_Helena + - Atlantic/Stanley + - Australia/Adelaide + - Australia/Brisbane + - Australia/Broken_Hill + - Australia/Darwin + - Australia/Eucla + - Australia/Hobart + - Australia/Lindeman + - Australia/Lord_Howe + - Australia/Melbourne + - Australia/Perth + - Australia/Sydney + - Europe/Amsterdam + - Europe/Andorra + - Europe/Astrakhan + - Europe/Athens + - Europe/Belgrade + - Europe/Berlin + - Europe/Bratislava + - Europe/Brussels + - Europe/Bucharest + - Europe/Budapest + - Europe/Busingen + - Europe/Chisinau + - Europe/Copenhagen + - Europe/Dublin + - Europe/Gibraltar + - Europe/Guernsey + - Europe/Helsinki + - Europe/Isle_of_Man + - Europe/Istanbul + - Europe/Jersey + - Europe/Kaliningrad + - Europe/Kirov + - Europe/Kyiv + - Europe/Lisbon + - Europe/Ljubljana + - Europe/London + - Europe/Luxembourg + - Europe/Madrid + - Europe/Malta + - Europe/Mariehamn + - Europe/Minsk + - Europe/Monaco + - Europe/Moscow + - Europe/Oslo + - Europe/Paris + - Europe/Podgorica + - Europe/Prague + - Europe/Riga + - Europe/Rome + - Europe/Samara + - Europe/San_Marino + - Europe/Sarajevo + - Europe/Saratov + - Europe/Simferopol + - Europe/Skopje + - Europe/Sofia + - Europe/Stockholm + - Europe/Tallinn + - Europe/Tirane + - Europe/Ulyanovsk + - Europe/Vaduz + - Europe/Vatican + - Europe/Vienna + - Europe/Vilnius + - Europe/Volgograd + - Europe/Warsaw + - Europe/Zagreb + - Europe/Zurich + - GMT + - Indian/Antananarivo + - Indian/Chagos + - Indian/Christmas + - Indian/Cocos + - Indian/Comoro + - Indian/Kerguelen + - Indian/Mahe + - Indian/Maldives + - Indian/Mauritius + - Indian/Mayotte + - Indian/Reunion + - Pacific/Apia + - Pacific/Auckland + - Pacific/Bougainville + - Pacific/Chatham + - Pacific/Chuuk + - Pacific/Easter + - Pacific/Efate + - Pacific/Fakaofo + - Pacific/Fiji + - Pacific/Funafuti + - Pacific/Galapagos + - Pacific/Gambier + - Pacific/Guadalcanal + - Pacific/Guam + - Pacific/Honolulu + - Pacific/Kanton + - Pacific/Kiritimati + - Pacific/Kosrae + - Pacific/Kwajalein + - Pacific/Majuro + - Pacific/Marquesas + - Pacific/Midway + - Pacific/Nauru + - Pacific/Niue + - Pacific/Norfolk + - Pacific/Noumea + - Pacific/Pago_Pago + - Pacific/Palau + - Pacific/Pitcairn + - Pacific/Pohnpei + - Pacific/Port_Moresby + - Pacific/Rarotonga + - Pacific/Saipan + - Pacific/Tahiti + - Pacific/Tarawa + - Pacific/Tongatapu + - Pacific/Wake + - Pacific/Wallis + - UTC + type: string + description: |- + * `Africa/Abidjan` - Africa/Abidjan + * `Africa/Accra` - Africa/Accra + * `Africa/Addis_Ababa` - Africa/Addis_Ababa + * `Africa/Algiers` - Africa/Algiers + * `Africa/Asmara` - Africa/Asmara + * `Africa/Bamako` - Africa/Bamako + * `Africa/Bangui` - Africa/Bangui + * `Africa/Banjul` - Africa/Banjul + * `Africa/Bissau` - Africa/Bissau + * `Africa/Blantyre` - Africa/Blantyre + * `Africa/Brazzaville` - Africa/Brazzaville + * `Africa/Bujumbura` - Africa/Bujumbura + * `Africa/Cairo` - Africa/Cairo + * `Africa/Casablanca` - Africa/Casablanca + * `Africa/Ceuta` - Africa/Ceuta + * `Africa/Conakry` - Africa/Conakry + * `Africa/Dakar` - Africa/Dakar + * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam + * `Africa/Djibouti` - Africa/Djibouti + * `Africa/Douala` - Africa/Douala + * `Africa/El_Aaiun` - Africa/El_Aaiun + * `Africa/Freetown` - Africa/Freetown + * `Africa/Gaborone` - Africa/Gaborone + * `Africa/Harare` - Africa/Harare + * `Africa/Johannesburg` - Africa/Johannesburg + * `Africa/Juba` - Africa/Juba + * `Africa/Kampala` - Africa/Kampala + * `Africa/Khartoum` - Africa/Khartoum + * `Africa/Kigali` - Africa/Kigali + * `Africa/Kinshasa` - Africa/Kinshasa + * `Africa/Lagos` - Africa/Lagos + * `Africa/Libreville` - Africa/Libreville + * `Africa/Lome` - Africa/Lome + * `Africa/Luanda` - Africa/Luanda + * `Africa/Lubumbashi` - Africa/Lubumbashi + * `Africa/Lusaka` - Africa/Lusaka + * `Africa/Malabo` - Africa/Malabo + * `Africa/Maputo` - Africa/Maputo + * `Africa/Maseru` - Africa/Maseru + * `Africa/Mbabane` - Africa/Mbabane + * `Africa/Mogadishu` - Africa/Mogadishu + * `Africa/Monrovia` - Africa/Monrovia + * `Africa/Nairobi` - Africa/Nairobi + * `Africa/Ndjamena` - Africa/Ndjamena + * `Africa/Niamey` - Africa/Niamey + * `Africa/Nouakchott` - Africa/Nouakchott + * `Africa/Ouagadougou` - Africa/Ouagadougou + * `Africa/Porto-Novo` - Africa/Porto-Novo + * `Africa/Sao_Tome` - Africa/Sao_Tome + * `Africa/Tripoli` - Africa/Tripoli + * `Africa/Tunis` - Africa/Tunis + * `Africa/Windhoek` - Africa/Windhoek + * `America/Adak` - America/Adak + * `America/Anchorage` - America/Anchorage + * `America/Anguilla` - America/Anguilla + * `America/Antigua` - America/Antigua + * `America/Araguaina` - America/Araguaina + * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires + * `America/Argentina/Catamarca` - America/Argentina/Catamarca + * `America/Argentina/Cordoba` - America/Argentina/Cordoba + * `America/Argentina/Jujuy` - America/Argentina/Jujuy + * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja + * `America/Argentina/Mendoza` - America/Argentina/Mendoza + * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos + * `America/Argentina/Salta` - America/Argentina/Salta + * `America/Argentina/San_Juan` - America/Argentina/San_Juan + * `America/Argentina/San_Luis` - America/Argentina/San_Luis + * `America/Argentina/Tucuman` - America/Argentina/Tucuman + * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia + * `America/Aruba` - America/Aruba + * `America/Asuncion` - America/Asuncion + * `America/Atikokan` - America/Atikokan + * `America/Bahia` - America/Bahia + * `America/Bahia_Banderas` - America/Bahia_Banderas + * `America/Barbados` - America/Barbados + * `America/Belem` - America/Belem + * `America/Belize` - America/Belize + * `America/Blanc-Sablon` - America/Blanc-Sablon + * `America/Boa_Vista` - America/Boa_Vista + * `America/Bogota` - America/Bogota + * `America/Boise` - America/Boise + * `America/Cambridge_Bay` - America/Cambridge_Bay + * `America/Campo_Grande` - America/Campo_Grande + * `America/Cancun` - America/Cancun + * `America/Caracas` - America/Caracas + * `America/Cayenne` - America/Cayenne + * `America/Cayman` - America/Cayman + * `America/Chicago` - America/Chicago + * `America/Chihuahua` - America/Chihuahua + * `America/Ciudad_Juarez` - America/Ciudad_Juarez + * `America/Costa_Rica` - America/Costa_Rica + * `America/Coyhaique` - America/Coyhaique + * `America/Creston` - America/Creston + * `America/Cuiaba` - America/Cuiaba + * `America/Curacao` - America/Curacao + * `America/Danmarkshavn` - America/Danmarkshavn + * `America/Dawson` - America/Dawson + * `America/Dawson_Creek` - America/Dawson_Creek + * `America/Denver` - America/Denver + * `America/Detroit` - America/Detroit + * `America/Dominica` - America/Dominica + * `America/Edmonton` - America/Edmonton + * `America/Eirunepe` - America/Eirunepe + * `America/El_Salvador` - America/El_Salvador + * `America/Fort_Nelson` - America/Fort_Nelson + * `America/Fortaleza` - America/Fortaleza + * `America/Glace_Bay` - America/Glace_Bay + * `America/Goose_Bay` - America/Goose_Bay + * `America/Grand_Turk` - America/Grand_Turk + * `America/Grenada` - America/Grenada + * `America/Guadeloupe` - America/Guadeloupe + * `America/Guatemala` - America/Guatemala + * `America/Guayaquil` - America/Guayaquil + * `America/Guyana` - America/Guyana + * `America/Halifax` - America/Halifax + * `America/Havana` - America/Havana + * `America/Hermosillo` - America/Hermosillo + * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis + * `America/Indiana/Knox` - America/Indiana/Knox + * `America/Indiana/Marengo` - America/Indiana/Marengo + * `America/Indiana/Petersburg` - America/Indiana/Petersburg + * `America/Indiana/Tell_City` - America/Indiana/Tell_City + * `America/Indiana/Vevay` - America/Indiana/Vevay + * `America/Indiana/Vincennes` - America/Indiana/Vincennes + * `America/Indiana/Winamac` - America/Indiana/Winamac + * `America/Inuvik` - America/Inuvik + * `America/Iqaluit` - America/Iqaluit + * `America/Jamaica` - America/Jamaica + * `America/Juneau` - America/Juneau + * `America/Kentucky/Louisville` - America/Kentucky/Louisville + * `America/Kentucky/Monticello` - America/Kentucky/Monticello + * `America/Kralendijk` - America/Kralendijk + * `America/La_Paz` - America/La_Paz + * `America/Lima` - America/Lima + * `America/Los_Angeles` - America/Los_Angeles + * `America/Lower_Princes` - America/Lower_Princes + * `America/Maceio` - America/Maceio + * `America/Managua` - America/Managua + * `America/Manaus` - America/Manaus + * `America/Marigot` - America/Marigot + * `America/Martinique` - America/Martinique + * `America/Matamoros` - America/Matamoros + * `America/Mazatlan` - America/Mazatlan + * `America/Menominee` - America/Menominee + * `America/Merida` - America/Merida + * `America/Metlakatla` - America/Metlakatla + * `America/Mexico_City` - America/Mexico_City + * `America/Miquelon` - America/Miquelon + * `America/Moncton` - America/Moncton + * `America/Monterrey` - America/Monterrey + * `America/Montevideo` - America/Montevideo + * `America/Montserrat` - America/Montserrat + * `America/Nassau` - America/Nassau + * `America/New_York` - America/New_York + * `America/Nome` - America/Nome + * `America/Noronha` - America/Noronha + * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah + * `America/North_Dakota/Center` - America/North_Dakota/Center + * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem + * `America/Nuuk` - America/Nuuk + * `America/Ojinaga` - America/Ojinaga + * `America/Panama` - America/Panama + * `America/Paramaribo` - America/Paramaribo + * `America/Phoenix` - America/Phoenix + * `America/Port-au-Prince` - America/Port-au-Prince + * `America/Port_of_Spain` - America/Port_of_Spain + * `America/Porto_Velho` - America/Porto_Velho + * `America/Puerto_Rico` - America/Puerto_Rico + * `America/Punta_Arenas` - America/Punta_Arenas + * `America/Rankin_Inlet` - America/Rankin_Inlet + * `America/Recife` - America/Recife + * `America/Regina` - America/Regina + * `America/Resolute` - America/Resolute + * `America/Rio_Branco` - America/Rio_Branco + * `America/Santarem` - America/Santarem + * `America/Santiago` - America/Santiago + * `America/Santo_Domingo` - America/Santo_Domingo + * `America/Sao_Paulo` - America/Sao_Paulo + * `America/Scoresbysund` - America/Scoresbysund + * `America/Sitka` - America/Sitka + * `America/St_Barthelemy` - America/St_Barthelemy + * `America/St_Johns` - America/St_Johns + * `America/St_Kitts` - America/St_Kitts + * `America/St_Lucia` - America/St_Lucia + * `America/St_Thomas` - America/St_Thomas + * `America/St_Vincent` - America/St_Vincent + * `America/Swift_Current` - America/Swift_Current + * `America/Tegucigalpa` - America/Tegucigalpa + * `America/Thule` - America/Thule + * `America/Tijuana` - America/Tijuana + * `America/Toronto` - America/Toronto + * `America/Tortola` - America/Tortola + * `America/Vancouver` - America/Vancouver + * `America/Whitehorse` - America/Whitehorse + * `America/Winnipeg` - America/Winnipeg + * `America/Yakutat` - America/Yakutat + * `Antarctica/Casey` - Antarctica/Casey + * `Antarctica/Davis` - Antarctica/Davis + * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville + * `Antarctica/Macquarie` - Antarctica/Macquarie + * `Antarctica/Mawson` - Antarctica/Mawson + * `Antarctica/McMurdo` - Antarctica/McMurdo + * `Antarctica/Palmer` - Antarctica/Palmer + * `Antarctica/Rothera` - Antarctica/Rothera + * `Antarctica/Syowa` - Antarctica/Syowa + * `Antarctica/Troll` - Antarctica/Troll + * `Antarctica/Vostok` - Antarctica/Vostok + * `Arctic/Longyearbyen` - Arctic/Longyearbyen + * `Asia/Aden` - Asia/Aden + * `Asia/Almaty` - Asia/Almaty + * `Asia/Amman` - Asia/Amman + * `Asia/Anadyr` - Asia/Anadyr + * `Asia/Aqtau` - Asia/Aqtau + * `Asia/Aqtobe` - Asia/Aqtobe + * `Asia/Ashgabat` - Asia/Ashgabat + * `Asia/Atyrau` - Asia/Atyrau + * `Asia/Baghdad` - Asia/Baghdad + * `Asia/Bahrain` - Asia/Bahrain + * `Asia/Baku` - Asia/Baku + * `Asia/Bangkok` - Asia/Bangkok + * `Asia/Barnaul` - Asia/Barnaul + * `Asia/Beirut` - Asia/Beirut + * `Asia/Bishkek` - Asia/Bishkek + * `Asia/Brunei` - Asia/Brunei + * `Asia/Chita` - Asia/Chita + * `Asia/Colombo` - Asia/Colombo + * `Asia/Damascus` - Asia/Damascus + * `Asia/Dhaka` - Asia/Dhaka + * `Asia/Dili` - Asia/Dili + * `Asia/Dubai` - Asia/Dubai + * `Asia/Dushanbe` - Asia/Dushanbe + * `Asia/Famagusta` - Asia/Famagusta + * `Asia/Gaza` - Asia/Gaza + * `Asia/Hebron` - Asia/Hebron + * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh + * `Asia/Hong_Kong` - Asia/Hong_Kong + * `Asia/Hovd` - Asia/Hovd + * `Asia/Irkutsk` - Asia/Irkutsk + * `Asia/Jakarta` - Asia/Jakarta + * `Asia/Jayapura` - Asia/Jayapura + * `Asia/Jerusalem` - Asia/Jerusalem + * `Asia/Kabul` - Asia/Kabul + * `Asia/Kamchatka` - Asia/Kamchatka + * `Asia/Karachi` - Asia/Karachi + * `Asia/Kathmandu` - Asia/Kathmandu + * `Asia/Khandyga` - Asia/Khandyga + * `Asia/Kolkata` - Asia/Kolkata + * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk + * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur + * `Asia/Kuching` - Asia/Kuching + * `Asia/Kuwait` - Asia/Kuwait + * `Asia/Macau` - Asia/Macau + * `Asia/Magadan` - Asia/Magadan + * `Asia/Makassar` - Asia/Makassar + * `Asia/Manila` - Asia/Manila + * `Asia/Muscat` - Asia/Muscat + * `Asia/Nicosia` - Asia/Nicosia + * `Asia/Novokuznetsk` - Asia/Novokuznetsk + * `Asia/Novosibirsk` - Asia/Novosibirsk + * `Asia/Omsk` - Asia/Omsk + * `Asia/Oral` - Asia/Oral + * `Asia/Phnom_Penh` - Asia/Phnom_Penh + * `Asia/Pontianak` - Asia/Pontianak + * `Asia/Pyongyang` - Asia/Pyongyang + * `Asia/Qatar` - Asia/Qatar + * `Asia/Qostanay` - Asia/Qostanay + * `Asia/Qyzylorda` - Asia/Qyzylorda + * `Asia/Riyadh` - Asia/Riyadh + * `Asia/Sakhalin` - Asia/Sakhalin + * `Asia/Samarkand` - Asia/Samarkand + * `Asia/Seoul` - Asia/Seoul + * `Asia/Shanghai` - Asia/Shanghai + * `Asia/Singapore` - Asia/Singapore + * `Asia/Srednekolymsk` - Asia/Srednekolymsk + * `Asia/Taipei` - Asia/Taipei + * `Asia/Tashkent` - Asia/Tashkent + * `Asia/Tbilisi` - Asia/Tbilisi + * `Asia/Tehran` - Asia/Tehran + * `Asia/Thimphu` - Asia/Thimphu + * `Asia/Tokyo` - Asia/Tokyo + * `Asia/Tomsk` - Asia/Tomsk + * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar + * `Asia/Urumqi` - Asia/Urumqi + * `Asia/Ust-Nera` - Asia/Ust-Nera + * `Asia/Vientiane` - Asia/Vientiane + * `Asia/Vladivostok` - Asia/Vladivostok + * `Asia/Yakutsk` - Asia/Yakutsk + * `Asia/Yangon` - Asia/Yangon + * `Asia/Yekaterinburg` - Asia/Yekaterinburg + * `Asia/Yerevan` - Asia/Yerevan + * `Atlantic/Azores` - Atlantic/Azores + * `Atlantic/Bermuda` - Atlantic/Bermuda + * `Atlantic/Canary` - Atlantic/Canary + * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde + * `Atlantic/Faroe` - Atlantic/Faroe + * `Atlantic/Madeira` - Atlantic/Madeira + * `Atlantic/Reykjavik` - Atlantic/Reykjavik + * `Atlantic/South_Georgia` - Atlantic/South_Georgia + * `Atlantic/St_Helena` - Atlantic/St_Helena + * `Atlantic/Stanley` - Atlantic/Stanley + * `Australia/Adelaide` - Australia/Adelaide + * `Australia/Brisbane` - Australia/Brisbane + * `Australia/Broken_Hill` - Australia/Broken_Hill + * `Australia/Darwin` - Australia/Darwin + * `Australia/Eucla` - Australia/Eucla + * `Australia/Hobart` - Australia/Hobart + * `Australia/Lindeman` - Australia/Lindeman + * `Australia/Lord_Howe` - Australia/Lord_Howe + * `Australia/Melbourne` - Australia/Melbourne + * `Australia/Perth` - Australia/Perth + * `Australia/Sydney` - Australia/Sydney + * `Europe/Amsterdam` - Europe/Amsterdam + * `Europe/Andorra` - Europe/Andorra + * `Europe/Astrakhan` - Europe/Astrakhan + * `Europe/Athens` - Europe/Athens + * `Europe/Belgrade` - Europe/Belgrade + * `Europe/Berlin` - Europe/Berlin + * `Europe/Bratislava` - Europe/Bratislava + * `Europe/Brussels` - Europe/Brussels + * `Europe/Bucharest` - Europe/Bucharest + * `Europe/Budapest` - Europe/Budapest + * `Europe/Busingen` - Europe/Busingen + * `Europe/Chisinau` - Europe/Chisinau + * `Europe/Copenhagen` - Europe/Copenhagen + * `Europe/Dublin` - Europe/Dublin + * `Europe/Gibraltar` - Europe/Gibraltar + * `Europe/Guernsey` - Europe/Guernsey + * `Europe/Helsinki` - Europe/Helsinki + * `Europe/Isle_of_Man` - Europe/Isle_of_Man + * `Europe/Istanbul` - Europe/Istanbul + * `Europe/Jersey` - Europe/Jersey + * `Europe/Kaliningrad` - Europe/Kaliningrad + * `Europe/Kirov` - Europe/Kirov + * `Europe/Kyiv` - Europe/Kyiv + * `Europe/Lisbon` - Europe/Lisbon + * `Europe/Ljubljana` - Europe/Ljubljana + * `Europe/London` - Europe/London + * `Europe/Luxembourg` - Europe/Luxembourg + * `Europe/Madrid` - Europe/Madrid + * `Europe/Malta` - Europe/Malta + * `Europe/Mariehamn` - Europe/Mariehamn + * `Europe/Minsk` - Europe/Minsk + * `Europe/Monaco` - Europe/Monaco + * `Europe/Moscow` - Europe/Moscow + * `Europe/Oslo` - Europe/Oslo + * `Europe/Paris` - Europe/Paris + * `Europe/Podgorica` - Europe/Podgorica + * `Europe/Prague` - Europe/Prague + * `Europe/Riga` - Europe/Riga + * `Europe/Rome` - Europe/Rome + * `Europe/Samara` - Europe/Samara + * `Europe/San_Marino` - Europe/San_Marino + * `Europe/Sarajevo` - Europe/Sarajevo + * `Europe/Saratov` - Europe/Saratov + * `Europe/Simferopol` - Europe/Simferopol + * `Europe/Skopje` - Europe/Skopje + * `Europe/Sofia` - Europe/Sofia + * `Europe/Stockholm` - Europe/Stockholm + * `Europe/Tallinn` - Europe/Tallinn + * `Europe/Tirane` - Europe/Tirane + * `Europe/Ulyanovsk` - Europe/Ulyanovsk + * `Europe/Vaduz` - Europe/Vaduz + * `Europe/Vatican` - Europe/Vatican + * `Europe/Vienna` - Europe/Vienna + * `Europe/Vilnius` - Europe/Vilnius + * `Europe/Volgograd` - Europe/Volgograd + * `Europe/Warsaw` - Europe/Warsaw + * `Europe/Zagreb` - Europe/Zagreb + * `Europe/Zurich` - Europe/Zurich + * `GMT` - GMT + * `Indian/Antananarivo` - Indian/Antananarivo + * `Indian/Chagos` - Indian/Chagos + * `Indian/Christmas` - Indian/Christmas + * `Indian/Cocos` - Indian/Cocos + * `Indian/Comoro` - Indian/Comoro + * `Indian/Kerguelen` - Indian/Kerguelen + * `Indian/Mahe` - Indian/Mahe + * `Indian/Maldives` - Indian/Maldives + * `Indian/Mauritius` - Indian/Mauritius + * `Indian/Mayotte` - Indian/Mayotte + * `Indian/Reunion` - Indian/Reunion + * `Pacific/Apia` - Pacific/Apia + * `Pacific/Auckland` - Pacific/Auckland + * `Pacific/Bougainville` - Pacific/Bougainville + * `Pacific/Chatham` - Pacific/Chatham + * `Pacific/Chuuk` - Pacific/Chuuk + * `Pacific/Easter` - Pacific/Easter + * `Pacific/Efate` - Pacific/Efate + * `Pacific/Fakaofo` - Pacific/Fakaofo + * `Pacific/Fiji` - Pacific/Fiji + * `Pacific/Funafuti` - Pacific/Funafuti + * `Pacific/Galapagos` - Pacific/Galapagos + * `Pacific/Gambier` - Pacific/Gambier + * `Pacific/Guadalcanal` - Pacific/Guadalcanal + * `Pacific/Guam` - Pacific/Guam + * `Pacific/Honolulu` - Pacific/Honolulu + * `Pacific/Kanton` - Pacific/Kanton + * `Pacific/Kiritimati` - Pacific/Kiritimati + * `Pacific/Kosrae` - Pacific/Kosrae + * `Pacific/Kwajalein` - Pacific/Kwajalein + * `Pacific/Majuro` - Pacific/Majuro + * `Pacific/Marquesas` - Pacific/Marquesas + * `Pacific/Midway` - Pacific/Midway + * `Pacific/Nauru` - Pacific/Nauru + * `Pacific/Niue` - Pacific/Niue + * `Pacific/Norfolk` - Pacific/Norfolk + * `Pacific/Noumea` - Pacific/Noumea + * `Pacific/Pago_Pago` - Pacific/Pago_Pago + * `Pacific/Palau` - Pacific/Palau + * `Pacific/Pitcairn` - Pacific/Pitcairn + * `Pacific/Pohnpei` - Pacific/Pohnpei + * `Pacific/Port_Moresby` - Pacific/Port_Moresby + * `Pacific/Rarotonga` - Pacific/Rarotonga + * `Pacific/Saipan` - Pacific/Saipan + * `Pacific/Tahiti` - Pacific/Tahiti + * `Pacific/Tarawa` - Pacific/Tarawa + * `Pacific/Tongatapu` - Pacific/Tongatapu + * `Pacific/Wake` - Pacific/Wake + * `Pacific/Wallis` - Pacific/Wallis + * `UTC` - UTC + ImpactEnum: + enum: + - High + - Medium + - Low + type: string + description: |- + * `High` - High + * `Medium` - Medium + * `Low` - Low + ImpactLevelEnum: + enum: + - High + - Medium + - Low + type: string + description: |- + * `High` - High + * `Medium` - Medium + * `Low` - Low + ImpactTypeEnum: + enum: + - Revenue + - CX Improvement + - EX Improvement + - Cost Reduction + - Risk Reduction + type: string + description: |- + * `Revenue` - Revenue + * `CX Improvement` - CX Improvement + * `EX Improvement` - EX Improvement + * `Cost Reduction` - Cost Reduction + * `Risk Reduction` - Risk Reduction + InterestEnum: + enum: + - High + - Medium + - Low + type: string + description: |- + * `High` - High + * `Medium` - Medium + * `Low` - Low + Interview: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + contact: + allOf: + - $ref: '#/components/schemas/Contact' + readOnly: true + date: + type: string + format: date + time: + type: string + format: time + notes: + type: string + required: + - contact + - date + - id + - name + - time + InterviewRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + contact_id: + type: integer + writeOnly: true + date: + type: string + format: date + time: + type: string + format: time + notes: + type: string + required: + - contact_id + - date + - name + - time + Issue: + type: object + properties: + id: + type: integer + readOnly: true + title: + type: string + maxLength: 255 + description: + type: string + potential_impact: + $ref: '#/components/schemas/PotentialImpactEnum' + owner: + type: integer + owner_name: + type: string + readOnly: true + priority: + $ref: '#/components/schemas/Priority758Enum' + status: + $ref: '#/components/schemas/IssueStatusEnum' + due_date: + type: string + format: date + required: + - description + - due_date + - id + - owner + - owner_name + - potential_impact + - priority + - status + - title + IssueStatusEnum: + enum: + - Open + - In Progress + - Resolved + - Closed + type: string + description: |- + * `Open` - Open + * `In Progress` - In Progress + * `Resolved` - Resolved + * `Closed` - Closed + LocalTimezoneEnum: + enum: + - Africa/Abidjan + - Africa/Accra + - Africa/Addis_Ababa + - Africa/Algiers + - Africa/Asmara + - Africa/Bamako + - Africa/Bangui + - Africa/Banjul + - Africa/Bissau + - Africa/Blantyre + - Africa/Brazzaville + - Africa/Bujumbura + - Africa/Cairo + - Africa/Casablanca + - Africa/Ceuta + - Africa/Conakry + - Africa/Dakar + - Africa/Dar_es_Salaam + - Africa/Djibouti + - Africa/Douala + - Africa/El_Aaiun + - Africa/Freetown + - Africa/Gaborone + - Africa/Harare + - Africa/Johannesburg + - Africa/Juba + - Africa/Kampala + - Africa/Khartoum + - Africa/Kigali + - Africa/Kinshasa + - Africa/Lagos + - Africa/Libreville + - Africa/Lome + - Africa/Luanda + - Africa/Lubumbashi + - Africa/Lusaka + - Africa/Malabo + - Africa/Maputo + - Africa/Maseru + - Africa/Mbabane + - Africa/Mogadishu + - Africa/Monrovia + - Africa/Nairobi + - Africa/Ndjamena + - Africa/Niamey + - Africa/Nouakchott + - Africa/Ouagadougou + - Africa/Porto-Novo + - Africa/Sao_Tome + - Africa/Tripoli + - Africa/Tunis + - Africa/Windhoek + - America/Adak + - America/Anchorage + - America/Anguilla + - America/Antigua + - America/Araguaina + - America/Argentina/Buenos_Aires + - America/Argentina/Catamarca + - America/Argentina/Cordoba + - America/Argentina/Jujuy + - America/Argentina/La_Rioja + - America/Argentina/Mendoza + - America/Argentina/Rio_Gallegos + - America/Argentina/Salta + - America/Argentina/San_Juan + - America/Argentina/San_Luis + - America/Argentina/Tucuman + - America/Argentina/Ushuaia + - America/Aruba + - America/Asuncion + - America/Atikokan + - America/Bahia + - America/Bahia_Banderas + - America/Barbados + - America/Belem + - America/Belize + - America/Blanc-Sablon + - America/Boa_Vista + - America/Bogota + - America/Boise + - America/Cambridge_Bay + - America/Campo_Grande + - America/Cancun + - America/Caracas + - America/Cayenne + - America/Cayman + - America/Chicago + - America/Chihuahua + - America/Ciudad_Juarez + - America/Costa_Rica + - America/Coyhaique + - America/Creston + - America/Cuiaba + - America/Curacao + - America/Danmarkshavn + - America/Dawson + - America/Dawson_Creek + - America/Denver + - America/Detroit + - America/Dominica + - America/Edmonton + - America/Eirunepe + - America/El_Salvador + - America/Fort_Nelson + - America/Fortaleza + - America/Glace_Bay + - America/Goose_Bay + - America/Grand_Turk + - America/Grenada + - America/Guadeloupe + - America/Guatemala + - America/Guayaquil + - America/Guyana + - America/Halifax + - America/Havana + - America/Hermosillo + - America/Indiana/Indianapolis + - America/Indiana/Knox + - America/Indiana/Marengo + - America/Indiana/Petersburg + - America/Indiana/Tell_City + - America/Indiana/Vevay + - America/Indiana/Vincennes + - America/Indiana/Winamac + - America/Inuvik + - America/Iqaluit + - America/Jamaica + - America/Juneau + - America/Kentucky/Louisville + - America/Kentucky/Monticello + - America/Kralendijk + - America/La_Paz + - America/Lima + - America/Los_Angeles + - America/Lower_Princes + - America/Maceio + - America/Managua + - America/Manaus + - America/Marigot + - America/Martinique + - America/Matamoros + - America/Mazatlan + - America/Menominee + - America/Merida + - America/Metlakatla + - America/Mexico_City + - America/Miquelon + - America/Moncton + - America/Monterrey + - America/Montevideo + - America/Montserrat + - America/Nassau + - America/New_York + - America/Nome + - America/Noronha + - America/North_Dakota/Beulah + - America/North_Dakota/Center + - America/North_Dakota/New_Salem + - America/Nuuk + - America/Ojinaga + - America/Panama + - America/Paramaribo + - America/Phoenix + - America/Port-au-Prince + - America/Port_of_Spain + - America/Porto_Velho + - America/Puerto_Rico + - America/Punta_Arenas + - America/Rankin_Inlet + - America/Recife + - America/Regina + - America/Resolute + - America/Rio_Branco + - America/Santarem + - America/Santiago + - America/Santo_Domingo + - America/Sao_Paulo + - America/Scoresbysund + - America/Sitka + - America/St_Barthelemy + - America/St_Johns + - America/St_Kitts + - America/St_Lucia + - America/St_Thomas + - America/St_Vincent + - America/Swift_Current + - America/Tegucigalpa + - America/Thule + - America/Tijuana + - America/Toronto + - America/Tortola + - America/Vancouver + - America/Whitehorse + - America/Winnipeg + - America/Yakutat + - Antarctica/Casey + - Antarctica/Davis + - Antarctica/DumontDUrville + - Antarctica/Macquarie + - Antarctica/Mawson + - Antarctica/McMurdo + - Antarctica/Palmer + - Antarctica/Rothera + - Antarctica/Syowa + - Antarctica/Troll + - Antarctica/Vostok + - Arctic/Longyearbyen + - Asia/Aden + - Asia/Almaty + - Asia/Amman + - Asia/Anadyr + - Asia/Aqtau + - Asia/Aqtobe + - Asia/Ashgabat + - Asia/Atyrau + - Asia/Baghdad + - Asia/Bahrain + - Asia/Baku + - Asia/Bangkok + - Asia/Barnaul + - Asia/Beirut + - Asia/Bishkek + - Asia/Brunei + - Asia/Chita + - Asia/Colombo + - Asia/Damascus + - Asia/Dhaka + - Asia/Dili + - Asia/Dubai + - Asia/Dushanbe + - Asia/Famagusta + - Asia/Gaza + - Asia/Hebron + - Asia/Ho_Chi_Minh + - Asia/Hong_Kong + - Asia/Hovd + - Asia/Irkutsk + - Asia/Jakarta + - Asia/Jayapura + - Asia/Jerusalem + - Asia/Kabul + - Asia/Kamchatka + - Asia/Karachi + - Asia/Kathmandu + - Asia/Khandyga + - Asia/Kolkata + - Asia/Krasnoyarsk + - Asia/Kuala_Lumpur + - Asia/Kuching + - Asia/Kuwait + - Asia/Macau + - Asia/Magadan + - Asia/Makassar + - Asia/Manila + - Asia/Muscat + - Asia/Nicosia + - Asia/Novokuznetsk + - Asia/Novosibirsk + - Asia/Omsk + - Asia/Oral + - Asia/Phnom_Penh + - Asia/Pontianak + - Asia/Pyongyang + - Asia/Qatar + - Asia/Qostanay + - Asia/Qyzylorda + - Asia/Riyadh + - Asia/Sakhalin + - Asia/Samarkand + - Asia/Seoul + - Asia/Shanghai + - Asia/Singapore + - Asia/Srednekolymsk + - Asia/Taipei + - Asia/Tashkent + - Asia/Tbilisi + - Asia/Tehran + - Asia/Thimphu + - Asia/Tokyo + - Asia/Tomsk + - Asia/Ulaanbaatar + - Asia/Urumqi + - Asia/Ust-Nera + - Asia/Vientiane + - Asia/Vladivostok + - Asia/Yakutsk + - Asia/Yangon + - Asia/Yekaterinburg + - Asia/Yerevan + - Atlantic/Azores + - Atlantic/Bermuda + - Atlantic/Canary + - Atlantic/Cape_Verde + - Atlantic/Faroe + - Atlantic/Madeira + - Atlantic/Reykjavik + - Atlantic/South_Georgia + - Atlantic/St_Helena + - Atlantic/Stanley + - Australia/Adelaide + - Australia/Brisbane + - Australia/Broken_Hill + - Australia/Darwin + - Australia/Eucla + - Australia/Hobart + - Australia/Lindeman + - Australia/Lord_Howe + - Australia/Melbourne + - Australia/Perth + - Australia/Sydney + - Europe/Amsterdam + - Europe/Andorra + - Europe/Astrakhan + - Europe/Athens + - Europe/Belgrade + - Europe/Berlin + - Europe/Bratislava + - Europe/Brussels + - Europe/Bucharest + - Europe/Budapest + - Europe/Busingen + - Europe/Chisinau + - Europe/Copenhagen + - Europe/Dublin + - Europe/Gibraltar + - Europe/Guernsey + - Europe/Helsinki + - Europe/Isle_of_Man + - Europe/Istanbul + - Europe/Jersey + - Europe/Kaliningrad + - Europe/Kirov + - Europe/Kyiv + - Europe/Lisbon + - Europe/Ljubljana + - Europe/London + - Europe/Luxembourg + - Europe/Madrid + - Europe/Malta + - Europe/Mariehamn + - Europe/Minsk + - Europe/Monaco + - Europe/Moscow + - Europe/Oslo + - Europe/Paris + - Europe/Podgorica + - Europe/Prague + - Europe/Riga + - Europe/Rome + - Europe/Samara + - Europe/San_Marino + - Europe/Sarajevo + - Europe/Saratov + - Europe/Simferopol + - Europe/Skopje + - Europe/Sofia + - Europe/Stockholm + - Europe/Tallinn + - Europe/Tirane + - Europe/Ulyanovsk + - Europe/Vaduz + - Europe/Vatican + - Europe/Vienna + - Europe/Vilnius + - Europe/Volgograd + - Europe/Warsaw + - Europe/Zagreb + - Europe/Zurich + - GMT + - Indian/Antananarivo + - Indian/Chagos + - Indian/Christmas + - Indian/Cocos + - Indian/Comoro + - Indian/Kerguelen + - Indian/Mahe + - Indian/Maldives + - Indian/Mauritius + - Indian/Mayotte + - Indian/Reunion + - Pacific/Apia + - Pacific/Auckland + - Pacific/Bougainville + - Pacific/Chatham + - Pacific/Chuuk + - Pacific/Easter + - Pacific/Efate + - Pacific/Fakaofo + - Pacific/Fiji + - Pacific/Funafuti + - Pacific/Galapagos + - Pacific/Gambier + - Pacific/Guadalcanal + - Pacific/Guam + - Pacific/Honolulu + - Pacific/Kanton + - Pacific/Kiritimati + - Pacific/Kosrae + - Pacific/Kwajalein + - Pacific/Majuro + - Pacific/Marquesas + - Pacific/Midway + - Pacific/Nauru + - Pacific/Niue + - Pacific/Norfolk + - Pacific/Noumea + - Pacific/Pago_Pago + - Pacific/Palau + - Pacific/Pitcairn + - Pacific/Pohnpei + - Pacific/Port_Moresby + - Pacific/Rarotonga + - Pacific/Saipan + - Pacific/Tahiti + - Pacific/Tarawa + - Pacific/Tongatapu + - Pacific/Wake + - Pacific/Wallis + - UTC + type: string + description: |- + * `Africa/Abidjan` - Africa/Abidjan + * `Africa/Accra` - Africa/Accra + * `Africa/Addis_Ababa` - Africa/Addis_Ababa + * `Africa/Algiers` - Africa/Algiers + * `Africa/Asmara` - Africa/Asmara + * `Africa/Bamako` - Africa/Bamako + * `Africa/Bangui` - Africa/Bangui + * `Africa/Banjul` - Africa/Banjul + * `Africa/Bissau` - Africa/Bissau + * `Africa/Blantyre` - Africa/Blantyre + * `Africa/Brazzaville` - Africa/Brazzaville + * `Africa/Bujumbura` - Africa/Bujumbura + * `Africa/Cairo` - Africa/Cairo + * `Africa/Casablanca` - Africa/Casablanca + * `Africa/Ceuta` - Africa/Ceuta + * `Africa/Conakry` - Africa/Conakry + * `Africa/Dakar` - Africa/Dakar + * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam + * `Africa/Djibouti` - Africa/Djibouti + * `Africa/Douala` - Africa/Douala + * `Africa/El_Aaiun` - Africa/El_Aaiun + * `Africa/Freetown` - Africa/Freetown + * `Africa/Gaborone` - Africa/Gaborone + * `Africa/Harare` - Africa/Harare + * `Africa/Johannesburg` - Africa/Johannesburg + * `Africa/Juba` - Africa/Juba + * `Africa/Kampala` - Africa/Kampala + * `Africa/Khartoum` - Africa/Khartoum + * `Africa/Kigali` - Africa/Kigali + * `Africa/Kinshasa` - Africa/Kinshasa + * `Africa/Lagos` - Africa/Lagos + * `Africa/Libreville` - Africa/Libreville + * `Africa/Lome` - Africa/Lome + * `Africa/Luanda` - Africa/Luanda + * `Africa/Lubumbashi` - Africa/Lubumbashi + * `Africa/Lusaka` - Africa/Lusaka + * `Africa/Malabo` - Africa/Malabo + * `Africa/Maputo` - Africa/Maputo + * `Africa/Maseru` - Africa/Maseru + * `Africa/Mbabane` - Africa/Mbabane + * `Africa/Mogadishu` - Africa/Mogadishu + * `Africa/Monrovia` - Africa/Monrovia + * `Africa/Nairobi` - Africa/Nairobi + * `Africa/Ndjamena` - Africa/Ndjamena + * `Africa/Niamey` - Africa/Niamey + * `Africa/Nouakchott` - Africa/Nouakchott + * `Africa/Ouagadougou` - Africa/Ouagadougou + * `Africa/Porto-Novo` - Africa/Porto-Novo + * `Africa/Sao_Tome` - Africa/Sao_Tome + * `Africa/Tripoli` - Africa/Tripoli + * `Africa/Tunis` - Africa/Tunis + * `Africa/Windhoek` - Africa/Windhoek + * `America/Adak` - America/Adak + * `America/Anchorage` - America/Anchorage + * `America/Anguilla` - America/Anguilla + * `America/Antigua` - America/Antigua + * `America/Araguaina` - America/Araguaina + * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires + * `America/Argentina/Catamarca` - America/Argentina/Catamarca + * `America/Argentina/Cordoba` - America/Argentina/Cordoba + * `America/Argentina/Jujuy` - America/Argentina/Jujuy + * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja + * `America/Argentina/Mendoza` - America/Argentina/Mendoza + * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos + * `America/Argentina/Salta` - America/Argentina/Salta + * `America/Argentina/San_Juan` - America/Argentina/San_Juan + * `America/Argentina/San_Luis` - America/Argentina/San_Luis + * `America/Argentina/Tucuman` - America/Argentina/Tucuman + * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia + * `America/Aruba` - America/Aruba + * `America/Asuncion` - America/Asuncion + * `America/Atikokan` - America/Atikokan + * `America/Bahia` - America/Bahia + * `America/Bahia_Banderas` - America/Bahia_Banderas + * `America/Barbados` - America/Barbados + * `America/Belem` - America/Belem + * `America/Belize` - America/Belize + * `America/Blanc-Sablon` - America/Blanc-Sablon + * `America/Boa_Vista` - America/Boa_Vista + * `America/Bogota` - America/Bogota + * `America/Boise` - America/Boise + * `America/Cambridge_Bay` - America/Cambridge_Bay + * `America/Campo_Grande` - America/Campo_Grande + * `America/Cancun` - America/Cancun + * `America/Caracas` - America/Caracas + * `America/Cayenne` - America/Cayenne + * `America/Cayman` - America/Cayman + * `America/Chicago` - America/Chicago + * `America/Chihuahua` - America/Chihuahua + * `America/Ciudad_Juarez` - America/Ciudad_Juarez + * `America/Costa_Rica` - America/Costa_Rica + * `America/Coyhaique` - America/Coyhaique + * `America/Creston` - America/Creston + * `America/Cuiaba` - America/Cuiaba + * `America/Curacao` - America/Curacao + * `America/Danmarkshavn` - America/Danmarkshavn + * `America/Dawson` - America/Dawson + * `America/Dawson_Creek` - America/Dawson_Creek + * `America/Denver` - America/Denver + * `America/Detroit` - America/Detroit + * `America/Dominica` - America/Dominica + * `America/Edmonton` - America/Edmonton + * `America/Eirunepe` - America/Eirunepe + * `America/El_Salvador` - America/El_Salvador + * `America/Fort_Nelson` - America/Fort_Nelson + * `America/Fortaleza` - America/Fortaleza + * `America/Glace_Bay` - America/Glace_Bay + * `America/Goose_Bay` - America/Goose_Bay + * `America/Grand_Turk` - America/Grand_Turk + * `America/Grenada` - America/Grenada + * `America/Guadeloupe` - America/Guadeloupe + * `America/Guatemala` - America/Guatemala + * `America/Guayaquil` - America/Guayaquil + * `America/Guyana` - America/Guyana + * `America/Halifax` - America/Halifax + * `America/Havana` - America/Havana + * `America/Hermosillo` - America/Hermosillo + * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis + * `America/Indiana/Knox` - America/Indiana/Knox + * `America/Indiana/Marengo` - America/Indiana/Marengo + * `America/Indiana/Petersburg` - America/Indiana/Petersburg + * `America/Indiana/Tell_City` - America/Indiana/Tell_City + * `America/Indiana/Vevay` - America/Indiana/Vevay + * `America/Indiana/Vincennes` - America/Indiana/Vincennes + * `America/Indiana/Winamac` - America/Indiana/Winamac + * `America/Inuvik` - America/Inuvik + * `America/Iqaluit` - America/Iqaluit + * `America/Jamaica` - America/Jamaica + * `America/Juneau` - America/Juneau + * `America/Kentucky/Louisville` - America/Kentucky/Louisville + * `America/Kentucky/Monticello` - America/Kentucky/Monticello + * `America/Kralendijk` - America/Kralendijk + * `America/La_Paz` - America/La_Paz + * `America/Lima` - America/Lima + * `America/Los_Angeles` - America/Los_Angeles + * `America/Lower_Princes` - America/Lower_Princes + * `America/Maceio` - America/Maceio + * `America/Managua` - America/Managua + * `America/Manaus` - America/Manaus + * `America/Marigot` - America/Marigot + * `America/Martinique` - America/Martinique + * `America/Matamoros` - America/Matamoros + * `America/Mazatlan` - America/Mazatlan + * `America/Menominee` - America/Menominee + * `America/Merida` - America/Merida + * `America/Metlakatla` - America/Metlakatla + * `America/Mexico_City` - America/Mexico_City + * `America/Miquelon` - America/Miquelon + * `America/Moncton` - America/Moncton + * `America/Monterrey` - America/Monterrey + * `America/Montevideo` - America/Montevideo + * `America/Montserrat` - America/Montserrat + * `America/Nassau` - America/Nassau + * `America/New_York` - America/New_York + * `America/Nome` - America/Nome + * `America/Noronha` - America/Noronha + * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah + * `America/North_Dakota/Center` - America/North_Dakota/Center + * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem + * `America/Nuuk` - America/Nuuk + * `America/Ojinaga` - America/Ojinaga + * `America/Panama` - America/Panama + * `America/Paramaribo` - America/Paramaribo + * `America/Phoenix` - America/Phoenix + * `America/Port-au-Prince` - America/Port-au-Prince + * `America/Port_of_Spain` - America/Port_of_Spain + * `America/Porto_Velho` - America/Porto_Velho + * `America/Puerto_Rico` - America/Puerto_Rico + * `America/Punta_Arenas` - America/Punta_Arenas + * `America/Rankin_Inlet` - America/Rankin_Inlet + * `America/Recife` - America/Recife + * `America/Regina` - America/Regina + * `America/Resolute` - America/Resolute + * `America/Rio_Branco` - America/Rio_Branco + * `America/Santarem` - America/Santarem + * `America/Santiago` - America/Santiago + * `America/Santo_Domingo` - America/Santo_Domingo + * `America/Sao_Paulo` - America/Sao_Paulo + * `America/Scoresbysund` - America/Scoresbysund + * `America/Sitka` - America/Sitka + * `America/St_Barthelemy` - America/St_Barthelemy + * `America/St_Johns` - America/St_Johns + * `America/St_Kitts` - America/St_Kitts + * `America/St_Lucia` - America/St_Lucia + * `America/St_Thomas` - America/St_Thomas + * `America/St_Vincent` - America/St_Vincent + * `America/Swift_Current` - America/Swift_Current + * `America/Tegucigalpa` - America/Tegucigalpa + * `America/Thule` - America/Thule + * `America/Tijuana` - America/Tijuana + * `America/Toronto` - America/Toronto + * `America/Tortola` - America/Tortola + * `America/Vancouver` - America/Vancouver + * `America/Whitehorse` - America/Whitehorse + * `America/Winnipeg` - America/Winnipeg + * `America/Yakutat` - America/Yakutat + * `Antarctica/Casey` - Antarctica/Casey + * `Antarctica/Davis` - Antarctica/Davis + * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville + * `Antarctica/Macquarie` - Antarctica/Macquarie + * `Antarctica/Mawson` - Antarctica/Mawson + * `Antarctica/McMurdo` - Antarctica/McMurdo + * `Antarctica/Palmer` - Antarctica/Palmer + * `Antarctica/Rothera` - Antarctica/Rothera + * `Antarctica/Syowa` - Antarctica/Syowa + * `Antarctica/Troll` - Antarctica/Troll + * `Antarctica/Vostok` - Antarctica/Vostok + * `Arctic/Longyearbyen` - Arctic/Longyearbyen + * `Asia/Aden` - Asia/Aden + * `Asia/Almaty` - Asia/Almaty + * `Asia/Amman` - Asia/Amman + * `Asia/Anadyr` - Asia/Anadyr + * `Asia/Aqtau` - Asia/Aqtau + * `Asia/Aqtobe` - Asia/Aqtobe + * `Asia/Ashgabat` - Asia/Ashgabat + * `Asia/Atyrau` - Asia/Atyrau + * `Asia/Baghdad` - Asia/Baghdad + * `Asia/Bahrain` - Asia/Bahrain + * `Asia/Baku` - Asia/Baku + * `Asia/Bangkok` - Asia/Bangkok + * `Asia/Barnaul` - Asia/Barnaul + * `Asia/Beirut` - Asia/Beirut + * `Asia/Bishkek` - Asia/Bishkek + * `Asia/Brunei` - Asia/Brunei + * `Asia/Chita` - Asia/Chita + * `Asia/Colombo` - Asia/Colombo + * `Asia/Damascus` - Asia/Damascus + * `Asia/Dhaka` - Asia/Dhaka + * `Asia/Dili` - Asia/Dili + * `Asia/Dubai` - Asia/Dubai + * `Asia/Dushanbe` - Asia/Dushanbe + * `Asia/Famagusta` - Asia/Famagusta + * `Asia/Gaza` - Asia/Gaza + * `Asia/Hebron` - Asia/Hebron + * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh + * `Asia/Hong_Kong` - Asia/Hong_Kong + * `Asia/Hovd` - Asia/Hovd + * `Asia/Irkutsk` - Asia/Irkutsk + * `Asia/Jakarta` - Asia/Jakarta + * `Asia/Jayapura` - Asia/Jayapura + * `Asia/Jerusalem` - Asia/Jerusalem + * `Asia/Kabul` - Asia/Kabul + * `Asia/Kamchatka` - Asia/Kamchatka + * `Asia/Karachi` - Asia/Karachi + * `Asia/Kathmandu` - Asia/Kathmandu + * `Asia/Khandyga` - Asia/Khandyga + * `Asia/Kolkata` - Asia/Kolkata + * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk + * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur + * `Asia/Kuching` - Asia/Kuching + * `Asia/Kuwait` - Asia/Kuwait + * `Asia/Macau` - Asia/Macau + * `Asia/Magadan` - Asia/Magadan + * `Asia/Makassar` - Asia/Makassar + * `Asia/Manila` - Asia/Manila + * `Asia/Muscat` - Asia/Muscat + * `Asia/Nicosia` - Asia/Nicosia + * `Asia/Novokuznetsk` - Asia/Novokuznetsk + * `Asia/Novosibirsk` - Asia/Novosibirsk + * `Asia/Omsk` - Asia/Omsk + * `Asia/Oral` - Asia/Oral + * `Asia/Phnom_Penh` - Asia/Phnom_Penh + * `Asia/Pontianak` - Asia/Pontianak + * `Asia/Pyongyang` - Asia/Pyongyang + * `Asia/Qatar` - Asia/Qatar + * `Asia/Qostanay` - Asia/Qostanay + * `Asia/Qyzylorda` - Asia/Qyzylorda + * `Asia/Riyadh` - Asia/Riyadh + * `Asia/Sakhalin` - Asia/Sakhalin + * `Asia/Samarkand` - Asia/Samarkand + * `Asia/Seoul` - Asia/Seoul + * `Asia/Shanghai` - Asia/Shanghai + * `Asia/Singapore` - Asia/Singapore + * `Asia/Srednekolymsk` - Asia/Srednekolymsk + * `Asia/Taipei` - Asia/Taipei + * `Asia/Tashkent` - Asia/Tashkent + * `Asia/Tbilisi` - Asia/Tbilisi + * `Asia/Tehran` - Asia/Tehran + * `Asia/Thimphu` - Asia/Thimphu + * `Asia/Tokyo` - Asia/Tokyo + * `Asia/Tomsk` - Asia/Tomsk + * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar + * `Asia/Urumqi` - Asia/Urumqi + * `Asia/Ust-Nera` - Asia/Ust-Nera + * `Asia/Vientiane` - Asia/Vientiane + * `Asia/Vladivostok` - Asia/Vladivostok + * `Asia/Yakutsk` - Asia/Yakutsk + * `Asia/Yangon` - Asia/Yangon + * `Asia/Yekaterinburg` - Asia/Yekaterinburg + * `Asia/Yerevan` - Asia/Yerevan + * `Atlantic/Azores` - Atlantic/Azores + * `Atlantic/Bermuda` - Atlantic/Bermuda + * `Atlantic/Canary` - Atlantic/Canary + * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde + * `Atlantic/Faroe` - Atlantic/Faroe + * `Atlantic/Madeira` - Atlantic/Madeira + * `Atlantic/Reykjavik` - Atlantic/Reykjavik + * `Atlantic/South_Georgia` - Atlantic/South_Georgia + * `Atlantic/St_Helena` - Atlantic/St_Helena + * `Atlantic/Stanley` - Atlantic/Stanley + * `Australia/Adelaide` - Australia/Adelaide + * `Australia/Brisbane` - Australia/Brisbane + * `Australia/Broken_Hill` - Australia/Broken_Hill + * `Australia/Darwin` - Australia/Darwin + * `Australia/Eucla` - Australia/Eucla + * `Australia/Hobart` - Australia/Hobart + * `Australia/Lindeman` - Australia/Lindeman + * `Australia/Lord_Howe` - Australia/Lord_Howe + * `Australia/Melbourne` - Australia/Melbourne + * `Australia/Perth` - Australia/Perth + * `Australia/Sydney` - Australia/Sydney + * `Europe/Amsterdam` - Europe/Amsterdam + * `Europe/Andorra` - Europe/Andorra + * `Europe/Astrakhan` - Europe/Astrakhan + * `Europe/Athens` - Europe/Athens + * `Europe/Belgrade` - Europe/Belgrade + * `Europe/Berlin` - Europe/Berlin + * `Europe/Bratislava` - Europe/Bratislava + * `Europe/Brussels` - Europe/Brussels + * `Europe/Bucharest` - Europe/Bucharest + * `Europe/Budapest` - Europe/Budapest + * `Europe/Busingen` - Europe/Busingen + * `Europe/Chisinau` - Europe/Chisinau + * `Europe/Copenhagen` - Europe/Copenhagen + * `Europe/Dublin` - Europe/Dublin + * `Europe/Gibraltar` - Europe/Gibraltar + * `Europe/Guernsey` - Europe/Guernsey + * `Europe/Helsinki` - Europe/Helsinki + * `Europe/Isle_of_Man` - Europe/Isle_of_Man + * `Europe/Istanbul` - Europe/Istanbul + * `Europe/Jersey` - Europe/Jersey + * `Europe/Kaliningrad` - Europe/Kaliningrad + * `Europe/Kirov` - Europe/Kirov + * `Europe/Kyiv` - Europe/Kyiv + * `Europe/Lisbon` - Europe/Lisbon + * `Europe/Ljubljana` - Europe/Ljubljana + * `Europe/London` - Europe/London + * `Europe/Luxembourg` - Europe/Luxembourg + * `Europe/Madrid` - Europe/Madrid + * `Europe/Malta` - Europe/Malta + * `Europe/Mariehamn` - Europe/Mariehamn + * `Europe/Minsk` - Europe/Minsk + * `Europe/Monaco` - Europe/Monaco + * `Europe/Moscow` - Europe/Moscow + * `Europe/Oslo` - Europe/Oslo + * `Europe/Paris` - Europe/Paris + * `Europe/Podgorica` - Europe/Podgorica + * `Europe/Prague` - Europe/Prague + * `Europe/Riga` - Europe/Riga + * `Europe/Rome` - Europe/Rome + * `Europe/Samara` - Europe/Samara + * `Europe/San_Marino` - Europe/San_Marino + * `Europe/Sarajevo` - Europe/Sarajevo + * `Europe/Saratov` - Europe/Saratov + * `Europe/Simferopol` - Europe/Simferopol + * `Europe/Skopje` - Europe/Skopje + * `Europe/Sofia` - Europe/Sofia + * `Europe/Stockholm` - Europe/Stockholm + * `Europe/Tallinn` - Europe/Tallinn + * `Europe/Tirane` - Europe/Tirane + * `Europe/Ulyanovsk` - Europe/Ulyanovsk + * `Europe/Vaduz` - Europe/Vaduz + * `Europe/Vatican` - Europe/Vatican + * `Europe/Vienna` - Europe/Vienna + * `Europe/Vilnius` - Europe/Vilnius + * `Europe/Volgograd` - Europe/Volgograd + * `Europe/Warsaw` - Europe/Warsaw + * `Europe/Zagreb` - Europe/Zagreb + * `Europe/Zurich` - Europe/Zurich + * `GMT` - GMT + * `Indian/Antananarivo` - Indian/Antananarivo + * `Indian/Chagos` - Indian/Chagos + * `Indian/Christmas` - Indian/Christmas + * `Indian/Cocos` - Indian/Cocos + * `Indian/Comoro` - Indian/Comoro + * `Indian/Kerguelen` - Indian/Kerguelen + * `Indian/Mahe` - Indian/Mahe + * `Indian/Maldives` - Indian/Maldives + * `Indian/Mauritius` - Indian/Mauritius + * `Indian/Mayotte` - Indian/Mayotte + * `Indian/Reunion` - Indian/Reunion + * `Pacific/Apia` - Pacific/Apia + * `Pacific/Auckland` - Pacific/Auckland + * `Pacific/Bougainville` - Pacific/Bougainville + * `Pacific/Chatham` - Pacific/Chatham + * `Pacific/Chuuk` - Pacific/Chuuk + * `Pacific/Easter` - Pacific/Easter + * `Pacific/Efate` - Pacific/Efate + * `Pacific/Fakaofo` - Pacific/Fakaofo + * `Pacific/Fiji` - Pacific/Fiji + * `Pacific/Funafuti` - Pacific/Funafuti + * `Pacific/Galapagos` - Pacific/Galapagos + * `Pacific/Gambier` - Pacific/Gambier + * `Pacific/Guadalcanal` - Pacific/Guadalcanal + * `Pacific/Guam` - Pacific/Guam + * `Pacific/Honolulu` - Pacific/Honolulu + * `Pacific/Kanton` - Pacific/Kanton + * `Pacific/Kiritimati` - Pacific/Kiritimati + * `Pacific/Kosrae` - Pacific/Kosrae + * `Pacific/Kwajalein` - Pacific/Kwajalein + * `Pacific/Majuro` - Pacific/Majuro + * `Pacific/Marquesas` - Pacific/Marquesas + * `Pacific/Midway` - Pacific/Midway + * `Pacific/Nauru` - Pacific/Nauru + * `Pacific/Niue` - Pacific/Niue + * `Pacific/Norfolk` - Pacific/Norfolk + * `Pacific/Noumea` - Pacific/Noumea + * `Pacific/Pago_Pago` - Pacific/Pago_Pago + * `Pacific/Palau` - Pacific/Palau + * `Pacific/Pitcairn` - Pacific/Pitcairn + * `Pacific/Pohnpei` - Pacific/Pohnpei + * `Pacific/Port_Moresby` - Pacific/Port_Moresby + * `Pacific/Rarotonga` - Pacific/Rarotonga + * `Pacific/Saipan` - Pacific/Saipan + * `Pacific/Tahiti` - Pacific/Tahiti + * `Pacific/Tarawa` - Pacific/Tarawa + * `Pacific/Tongatapu` - Pacific/Tongatapu + * `Pacific/Wake` - Pacific/Wake + * `Pacific/Wallis` - Pacific/Wallis + * `UTC` - UTC + Location: + type: object + description: |- + Location information serializer. + + Provides location details including: + - Basic location information + - Client and division relationships + - Custom field values + properties: + id: + type: integer + readOnly: true + client: + type: integer + client_name: + type: string + readOnly: true + division: + type: integer + division_name: + type: string + readOnly: true + site_name: + type: string + maxLength: 255 + address: + type: string + state: + type: string + maxLength: 100 + country: + type: string + maxLength: 100 + custom_field_values: + type: array + items: + $ref: '#/components/schemas/LocationCustomFieldValue' + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - address + - client + - client_name + - country + - created_date + - custom_field_values + - division + - division_name + - id + - modified_date + - site_name + - state + LocationCustomFieldValue: + type: object + description: |- + Custom field value serializer. + + Provides dynamic field values with type-aware serialization. + properties: + field_name: + type: string + readOnly: true + field_type: + type: string + readOnly: true + value: + type: string + readOnly: true + required: + - field_name + - field_type + - value + LocationRequest: + type: object + description: |- + Location information serializer. + + Provides location details including: + - Basic location information + - Client and division relationships + - Custom field values + properties: + client: + type: integer + division: + type: integer + site_name: + type: string + minLength: 1 + maxLength: 255 + address: + type: string + minLength: 1 + state: + type: string + minLength: 1 + maxLength: 100 + country: + type: string + minLength: 1 + maxLength: 100 + required: + - address + - client + - country + - division + - site_name + - state + LocationSet: + type: object + description: |- + Location set information serializer with automatic version numbering. + + Provides location set details including: + - Automatically assigned version number (integer) + - Version metadata and creation date + - Custom field definitions + - Location count and aggregations + + Version Numbering: + - Version numbers are automatically assigned as sequential integers (1, 2, 3, etc.) + - Version field is read-only and cannot be manually set + - Versions are unique within each location tool + - Proper numerical sorting is supported (1, 2, 10 not 1, 10, 2) + properties: + id: + type: integer + readOnly: true + version: + type: integer + readOnly: true + description: Automatically assigned sequential version number (1, 2, 3, + etc.) + name: + type: string + description: Display name for this version (automatically generated) + maxLength: 255 + description: + type: string + description: Optional description of this version + is_active: + type: boolean + description: Whether this version is active + location_count: + type: string + readOnly: true + custom_field_definitions: + type: array + items: + $ref: '#/components/schemas/CustomFieldDefinition' + readOnly: true + count_field_aggregations: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + description: When this version was created + required: + - count_field_aggregations + - created_date + - custom_field_definitions + - id + - location_count + - name + - version + LocationSetRequest: + type: object + description: |- + Location set information serializer with automatic version numbering. + + Provides location set details including: + - Automatically assigned version number (integer) + - Version metadata and creation date + - Custom field definitions + - Location count and aggregations + + Version Numbering: + - Version numbers are automatically assigned as sequential integers (1, 2, 3, etc.) + - Version field is read-only and cannot be manually set + - Versions are unique within each location tool + - Proper numerical sorting is supported (1, 2, 10 not 1, 10, 2) + properties: + name: + type: string + minLength: 1 + description: Display name for this version (automatically generated) + maxLength: 255 + description: + type: string + description: Optional description of this version + is_active: + type: boolean + description: Whether this version is active + required: + - name + LocationTableSource: + type: object + description: |- + Location table source configuration serializer. + + Provides table source configuration including: + - Field selection settings + - Schema generation + - Data access information + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + include_client: + type: boolean + include_division: + type: boolean + include_site_name: + type: boolean + include_address: + type: boolean + include_state: + type: boolean + include_country: + type: boolean + selected_custom_fields: + type: array + items: + type: integer + schema: + type: string + readOnly: true + data_preview: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - data_preview + - id + - modified_date + - name + - schema + LocationTableSourceRequest: + type: object + description: |- + Location table source configuration serializer. + + Provides table source configuration including: + - Field selection settings + - Schema generation + - Data access information + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + include_client: + type: boolean + include_division: + type: boolean + include_site_name: + type: boolean + include_address: + type: boolean + include_state: + type: boolean + include_country: + type: boolean + selected_custom_fields: + type: array + items: + type: integer + required: + - name + MediaCollection: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + items: + type: array + items: + $ref: '#/components/schemas/MediaItem' + readOnly: true + item_count: + type: string + readOnly: true + required: + - id + - item_count + - items + - name + MediaCollectionRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + required: + - name + MediaItem: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + file: + type: string + format: uri + pattern: (?:jpg|jpeg|png|gif|svg|emf|pdf|docx|xlsx|pptx)$ + file_url: + type: string + readOnly: true + preview_url: + type: string + readOnly: true + file_size: + type: integer + readOnly: true + nullable: true + description: File size in bytes + size_mb: + type: string + readOnly: true + mime_type: + type: string + readOnly: true + type: + $ref: '#/components/schemas/MediaItemTypeEnum' + description: + type: string + tags: + type: string + description: Comma-separated tags for searching + maxLength: 500 + tag_list: + type: string + readOnly: true + rating: + type: integer + maximum: 5 + minimum: 0 + description: Star rating 0-5 + is_logo: + type: boolean + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - file + - file_size + - file_url + - id + - mime_type + - modified_date + - name + - preview_url + - size_mb + - tag_list + MediaItemRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + file: + type: string + format: binary + pattern: (?:jpg|jpeg|png|gif|svg|emf|pdf|docx|xlsx|pptx)$ + type: + $ref: '#/components/schemas/MediaItemTypeEnum' + description: + type: string + tags: + type: string + description: Comma-separated tags for searching + maxLength: 500 + rating: + type: integer + maximum: 5 + minimum: 0 + description: Star rating 0-5 + is_logo: + type: boolean + required: + - file + - name + MediaItemTypeEnum: + enum: + - image + - document + - presentation + - spreadsheet + - logo + - contact + type: string + description: |- + * `image` - Image + * `document` - Document + * `presentation` - Presentation + * `spreadsheet` - Spreadsheet + * `logo` - Logo + * `contact` - Contact + Milestone: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + date: + type: string + format: date + status: + $ref: '#/components/schemas/MilestoneStatusEnum' + milestone_type: + $ref: '#/components/schemas/MilestoneTypeEnum' + priority: + $ref: '#/components/schemas/MilestonePriorityEnum' + progress: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Completion percentage (0-100) + assignee: + type: integer + nullable: true + assignee_name: + type: string + readOnly: true + acceptance_criteria: + type: string + description: Define what needs to be completed for this milestone + weeks_from_reference: + type: integer + maximum: 2147483647 + minimum: -2147483648 + nullable: true + reference_milestone: + type: integer + nullable: true + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + is_completed: + type: string + readOnly: true + is_today: + type: string + readOnly: true + status_color: + type: string + readOnly: true + required: + - assignee_name + - date + - id + - is_completed + - is_today + - name + - order + - status_color + MilestonePriorityEnum: + enum: + - high + - medium + - low + type: string + description: |- + * `high` - High + * `medium` - Medium + * `low` - Low + MilestoneRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + date: + type: string + format: date + status: + $ref: '#/components/schemas/MilestoneStatusEnum' + milestone_type: + $ref: '#/components/schemas/MilestoneTypeEnum' + priority: + $ref: '#/components/schemas/MilestonePriorityEnum' + progress: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Completion percentage (0-100) + assignee: + type: integer + nullable: true + acceptance_criteria: + type: string + description: Define what needs to be completed for this milestone + weeks_from_reference: + type: integer + maximum: 2147483647 + minimum: -2147483648 + nullable: true + reference_milestone: + type: integer + nullable: true + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + required: + - date + - name + - order + MilestoneStatusEnum: + enum: + - not_started + - in_progress + - completed + - overdue + - on_hold + type: string + description: |- + * `not_started` - Not Started + * `in_progress` - In Progress + * `completed` - Completed + * `overdue` - Overdue + * `on_hold` - On Hold + MilestoneTypeEnum: + enum: + - deliverable + - review + - decision + - checkpoint + - other + type: string + description: |- + * `deliverable` - Deliverable + * `review` - Review + * `decision` - Decision Point + * `checkpoint` - Checkpoint + * `other` - Other + NullEnum: + enum: + - null + OperationEnum: + enum: + - delete + - update_state + - update_country + - export + type: string + description: |- + * `delete` - Delete + * `update_state` - Update State + * `update_country` - Update Country + * `export` - Export + Opportunity: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + notes: + type: string + description: Opportunity notes and details with URL support + stage: + $ref: '#/components/schemas/StageEnum' + status: + $ref: '#/components/schemas/OpportunityStatusEnum' + is_rfp: + type: boolean + title: Is this an RFP? + description: Check if this opportunity involves an RFP process + client: + allOf: + - $ref: '#/components/schemas/Client' + readOnly: true + competitors: + type: array + items: + $ref: '#/components/schemas/Vendor' + readOnly: true + incumbent_vendor: + allOf: + - $ref: '#/components/schemas/Vendor' + readOnly: true + one_time_revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + annual_revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + one_time_margin: + type: string + format: decimal + pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ + annual_margin: + type: string + format: decimal + pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ + term_years: + allOf: + - $ref: '#/components/schemas/TermYearsEnum' + description: |- + Contract term in years + + * `1` - 1 Year + * `2` - 2 Years + * `3` - 3 Years + * `4` - 4 Years + * `5` - 5 Years + minimum: -2147483648 + maximum: 2147483647 + currency: + type: string + readOnly: true + value: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + expected_close_date: + type: string + format: date + nullable: true + close_date: + type: string + format: date + nullable: true + deal_registered: + type: boolean + description: Has this deal been registered with the vendor? + registered_vendor: + allOf: + - $ref: '#/components/schemas/Vendor' + readOnly: true + deal_registration_name: + type: string + description: Deal registration identifier or name + maxLength: 255 + deal_registration_url: + type: string + format: uri + description: Link to deal registration portal or details + maxLength: 200 + deal_registration_date: + type: string + format: date + nullable: true + description: Date the deal was registered with vendor + deal_registration_expiry: + type: string + format: date + nullable: true + description: Expiration date for deal registration + deal_registration_amount: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + description: Monetary value of the deal registration + opportunity_identified_date: + type: string + format: date + nullable: true + description: Date when opportunity was first identified + rfp_release_date: + type: string + format: date + nullable: true + description: Date RFP was officially released + rfp_vendor_info_session_datetime: + type: string + format: date-time + nullable: true + description: RFP vendor information session date and time + rfp_vendor_questions_due_datetime: + type: string + format: date-time + nullable: true + description: Deadline for vendors to submit questions + rfp_due_datetime: + type: string + format: date-time + nullable: true + description: RFP submission deadline + rfp_presentation_datetime: + type: string + format: date-time + nullable: true + description: RFP presentation date and time + rfp_award_announcement_date: + type: string + format: date + nullable: true + description: Date RFP award will be announced + required: + - client + - competitors + - currency + - id + - incumbent_vendor + - name + - registered_vendor + - stage + - status + OpportunityRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + notes: + type: string + minLength: 1 + description: Opportunity notes and details with URL support + stage: + $ref: '#/components/schemas/StageEnum' + status: + $ref: '#/components/schemas/OpportunityStatusEnum' + is_rfp: + type: boolean + title: Is this an RFP? + description: Check if this opportunity involves an RFP process + client_id: + type: integer + writeOnly: true + primary_vendor_solution_id: + type: integer + writeOnly: true + competitor_ids: + type: array + items: + type: integer + writeOnly: true + description: List of competitor vendor IDs + incumbent_vendor_id: + type: integer + writeOnly: true + description: Incumbent vendor ID + one_time_revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + annual_revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + one_time_margin: + type: string + format: decimal + pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ + annual_margin: + type: string + format: decimal + pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ + term_years: + allOf: + - $ref: '#/components/schemas/TermYearsEnum' + description: |- + Contract term in years + + * `1` - 1 Year + * `2` - 2 Years + * `3` - 3 Years + * `4` - 4 Years + * `5` - 5 Years + minimum: -2147483648 + maximum: 2147483647 + currency_id: + type: string + writeOnly: true + minLength: 1 + description: Currency code (e.g., USD, EUR) + value: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + expected_close_date: + type: string + format: date + nullable: true + close_date: + type: string + format: date + nullable: true + deal_registered: + type: boolean + description: Has this deal been registered with the vendor? + registered_vendor_id: + type: integer + writeOnly: true + description: Registered vendor ID + deal_registration_name: + type: string + description: Deal registration identifier or name + maxLength: 255 + deal_registration_url: + type: string + format: uri + description: Link to deal registration portal or details + maxLength: 200 + deal_registration_date: + type: string + format: date + nullable: true + description: Date the deal was registered with vendor + deal_registration_expiry: + type: string + format: date + nullable: true + description: Expiration date for deal registration + deal_registration_amount: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + description: Monetary value of the deal registration + opportunity_identified_date: + type: string + format: date + nullable: true + description: Date when opportunity was first identified + rfp_release_date: + type: string + format: date + nullable: true + description: Date RFP was officially released + rfp_vendor_info_session_datetime: + type: string + format: date-time + nullable: true + description: RFP vendor information session date and time + rfp_vendor_questions_due_datetime: + type: string + format: date-time + nullable: true + description: Deadline for vendors to submit questions + rfp_due_datetime: + type: string + format: date-time + nullable: true + description: RFP submission deadline + rfp_presentation_datetime: + type: string + format: date-time + nullable: true + description: RFP presentation date and time + rfp_award_announcement_date: + type: string + format: date + nullable: true + description: Date RFP award will be announced + required: + - client_id + - name + - stage + - status + OpportunityStatusEnum: + enum: + - Active + - Won + - Lost + - Dropped + type: string + description: |- + * `Active` - Active + * `Won` - Won + * `Lost` - Lost + * `Dropped` - Dropped + OrgChart: + type: object + properties: + id: + type: integer + readOnly: true + root_contact: + type: integer + root_contact_name: + type: string + readOnly: true + depth: + type: integer + maximum: 2147483647 + minimum: -2147483648 + include_fields: {} + title: + type: string + maxLength: 255 + description: + type: string + chart_data: + type: string + readOnly: true + required: + - chart_data + - id + - root_contact + - root_contact_name + - title + OrgChartRequest: + type: object + properties: + root_contact: + type: integer + depth: + type: integer + maximum: 2147483647 + minimum: -2147483648 + include_fields: {} + title: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + required: + - root_contact + - title + Organization: + type: object + description: |- + Organization information serializer. + + Provides organization details including: + - Basic information (name, type, sector) + - Contact and location details + - Financial information + - Hierarchy relationships + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + legal_name: + type: string + maxLength: 255 + abbreviated_name: + type: string + maxLength: 50 + type: + $ref: '#/components/schemas/OrganizationTypeEnum' + sector: + nullable: true + oneOf: + - $ref: '#/components/schemas/SectorEnum' + - $ref: '#/components/schemas/BlankEnum' + - $ref: '#/components/schemas/NullEnum' + country: + type: string + maxLength: 100 + size: + $ref: '#/components/schemas/SizeEnum' + employee_count: + type: integer + maximum: 2147483647 + minimum: -2147483648 + nullable: true + revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + assets: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + stock_exchange: + type: string + nullable: true + stock_symbol: + type: string + nullable: true + maxLength: 10 + parent_organization: + type: integer + nullable: true + parent_relationship_type: + nullable: true + description: |- + Type of relationship with parent organization + + * `subsidiary` - True Subsidiary + * `controlled_affiliate` - Controlled Affiliate + * `wholly_owned` - Wholly-Owned Subsidiary + * `branch` - Branch + * `agency` - Agency + * `ministry` - Ministry/Department + * `executive_agency` - Executive Agency + * `regulatory_agency` - Regulatory Agency + * `soc` - State-Owned Company + * `gbe` - Government Business Enterprise + oneOf: + - $ref: '#/components/schemas/ParentRelationshipTypeEnum' + - $ref: '#/components/schemas/BlankEnum' + - $ref: '#/components/schemas/NullEnum' + has_client_profile: + type: string + readOnly: true + has_vendor_profile: + type: string + readOnly: true + legal_street_address: + type: string + maxLength: 255 + legal_city: + type: string + maxLength: 100 + legal_state: + type: string + maxLength: 100 + legal_country: + type: string + maxLength: 100 + legal_postal_code: + type: string + maxLength: 20 + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - country + - created_date + - has_client_profile + - has_vendor_profile + - id + - modified_date + - name + - size + - type + OrganizationDivision: + type: object + description: |- + Organization division information serializer. + + Provides division details including: + - Division name, abbreviation, and description + - Organizational hierarchy (parent division) + - Full hierarchical path + - Contact and opportunity counts + properties: + id: + type: integer + readOnly: true + name: + type: string + description: Division name (e.g., "IT Department", "Western Region Sales") + maxLength: 255 + abbreviation: + type: string + description: Short abbreviation for the division (e.g., "IT", "West") + maxLength: 50 + description: + type: string + description: Description of the division's purpose and scope + organization: + type: integer + description: Parent organization this division belongs to + organization_name: + type: string + readOnly: true + parent_division: + type: integer + nullable: true + description: Parent division for nested organizational structures + parent_division_name: + type: string + readOnly: true + nullable: true + full_path: + type: string + readOnly: true + hierarchy_level: + type: integer + readOnly: true + contact_count: + type: string + readOnly: true + opportunity_count: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - contact_count + - created_date + - full_path + - hierarchy_level + - id + - modified_date + - name + - opportunity_count + - organization + - organization_name + - parent_division_name + OrganizationDivisionRequest: + type: object + description: |- + Organization division information serializer. + + Provides division details including: + - Division name, abbreviation, and description + - Organizational hierarchy (parent division) + - Full hierarchical path + - Contact and opportunity counts + properties: + name: + type: string + minLength: 1 + description: Division name (e.g., "IT Department", "Western Region Sales") + maxLength: 255 + abbreviation: + type: string + description: Short abbreviation for the division (e.g., "IT", "West") + maxLength: 50 + description: + type: string + description: Description of the division's purpose and scope + organization: + type: integer + description: Parent organization this division belongs to + parent_division: + type: integer + nullable: true + description: Parent division for nested organizational structures + required: + - name + - organization + OrganizationTypeEnum: + enum: + - For-Profit + - Non-Profit + - Government + - NGO + - Educational + - Healthcare + - Cooperative + type: string + description: |- + * `For-Profit` - For-Profit + * `Non-Profit` - Non-Profit + * `Government` - Government + * `NGO` - NGO + * `Educational` - Educational + * `Healthcare` - Healthcare + * `Cooperative` - Cooperative + PaginatedAPIKeyList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/APIKey' + PaginatedAdvisorToolList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/AdvisorTool' + PaginatedAssumptionList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Assumption' + PaginatedBMCList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/BMC' + PaginatedBMCTemplateList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/BMCTemplate' + PaginatedBMCToolList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/BMCTool' + PaginatedCalendarEventList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/CalendarEvent' + PaginatedClientList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Client' + PaginatedClientLocationToolList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/ClientLocationTool' + PaginatedContactList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Contact' + PaginatedCurrencyList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Currency' + PaginatedCustomFieldDefinitionList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/CustomFieldDefinition' + PaginatedDeckList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Deck' + PaginatedDeckSlideList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/DeckSlide' + PaginatedDependencyList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Dependency' + PaginatedDigitalContactList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/DigitalContact' + PaginatedDigitalContactTypeList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/DigitalContactType' + PaginatedEngagementSummaryList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/EngagementSummary' + PaginatedFindingList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Finding' + PaginatedFiscalYearList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/FiscalYear' + PaginatedInterviewList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Interview' + PaginatedIssueList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Issue' + PaginatedLocationList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Location' + PaginatedLocationSetList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/LocationSet' + PaginatedLocationTableSourceList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/LocationTableSource' + PaginatedMediaCollectionList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/MediaCollection' + PaginatedMediaItemList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/MediaItem' + PaginatedMilestoneList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Milestone' + PaginatedOpportunityList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Opportunity' + PaginatedOrgChartList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/OrgChart' + PaginatedOrganizationDivisionList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/OrganizationDivision' + PaginatedOrganizationList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Organization' + PaginatedPowerPointTemplateList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/PowerPointTemplate' + PaginatedPresentationList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Presentation' + PaginatedPriceLineItemList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/PriceLineItem' + PaginatedPriceVersionList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/PriceVersion' + PaginatedPricingToolList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/PricingTool' + PaginatedPrincipleList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Principle' + PaginatedProposalList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Proposal' + PaginatedRAIDToolList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/RAIDTool' + PaginatedRecommendationList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Recommendation' + PaginatedRequirementList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Requirement' + PaginatedRequirementsToolList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/RequirementsTool' + PaginatedRiskList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Risk' + PaginatedStageList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Stage' + PaginatedStakeholderList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Stakeholder' + PaginatedStakeholderToolList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/StakeholderTool' + PaginatedTEIReportFieldList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/TEIReportField' + PaginatedTEIReportList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/TEIReport' + PaginatedTEIToolList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/TEITool' + PaginatedTableSourceList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/TableSource' + PaginatedTagList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Tag' + PaginatedTimelineList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Timeline' + PaginatedTimelineToolList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/TimelineTool' + PaginatedVendorList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Vendor' + PaginatedVendorSolutionList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/VendorSolution' + PaginatedWorkshopList: + type: object + required: + - count + - results + properties: + count: + type: integer + example: 123 + next: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=4 + previous: + type: string + nullable: true + format: uri + example: http://api.example.org/accounts/?page=2 + results: + type: array + items: + $ref: '#/components/schemas/Workshop' + ParentRelationshipTypeEnum: + enum: + - subsidiary + - controlled_affiliate + - wholly_owned + - branch + - agency + - ministry + - executive_agency + - regulatory_agency + - soc + - gbe + type: string + description: |- + * `subsidiary` - True Subsidiary + * `controlled_affiliate` - Controlled Affiliate + * `wholly_owned` - Wholly-Owned Subsidiary + * `branch` - Branch + * `agency` - Agency + * `ministry` - Ministry/Department + * `executive_agency` - Executive Agency + * `regulatory_agency` - Regulatory Agency + * `soc` - State-Owned Company + * `gbe` - Government Business Enterprise + PatchedAdvisorToolRequest: + type: object + description: Serialize an AdvisorTool with computed counts and client/association + display fields. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + categories: + description: Custom categories for findings and requirements + timeframe_short: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Short timeframe in days + timeframe_medium: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Medium timeframe in days + timeframe_long: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Long timeframe in days + PatchedBMCRequest: + type: object + properties: + version: + type: integer + maximum: 2147483647 + minimum: -2147483648 + customer_segments: + type: string + value_propositions: + type: string + channels: + type: string + customer_relationships: + type: string + revenue_streams: + type: string + key_resources: + type: string + key_activities: + type: string + key_partnerships: + type: string + cost_structure: + type: string + PatchedBMCTemplateRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + customer_segments: + type: string + value_propositions: + type: string + channels: + type: string + customer_relationships: + type: string + revenue_streams: + type: string + key_resources: + type: string + key_activities: + type: string + key_partnerships: + type: string + cost_structure: + type: string + is_active: + type: boolean + PatchedBMCToolRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + PatchedCalendarEventRequest: + type: object + properties: + title: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + start_time: + type: string + format: date-time + end_time: + type: string + format: date-time + location: + type: string + maxLength: 255 + event_type: + $ref: '#/components/schemas/EventTypeEnum' + PatchedClientLocationToolRequest: + type: object + description: |- + Client Location Tool serializer with automatic version management. + + Provides tool information including: + - Basic tool metadata + - Current version number (automatically managed) + - All location sets with automatic version numbering + - Table source configuration + + Automatic Version Management: + - current_version field shows the active version number (integer) + - location_sets array shows all versions ordered by version number + - Version creation is handled by the create_version API endpoint + - Version switching is handled by the switch_version API endpoint + - All version numbers are automatically assigned and read-only + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + PatchedClientRequest: + type: object + properties: + name: + type: string + legal_name: + type: string + abbreviated_name: + type: string + overview: + type: string + history: + type: string + services_provided: + type: string + client_type: + type: string + vertical: + type: string + nullable: true + stock_exchange: + type: string + nullable: true + stock_symbol: + type: string + nullable: true + employee_count: + type: integer + nullable: true + revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + assets: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + fiscal_year_end: + type: string + format: date + nullable: true + contact_center_agent_count: + type: integer + nullable: true + service_desk_agent_count: + type: integer + nullable: true + supervisor_count: + type: integer + nullable: true + location_count: + type: integer + nullable: true + repository_url: + type: string + PatchedContactRequest: + type: object + properties: + first_name: + type: string + minLength: 1 + maxLength: 100 + last_name: + type: string + minLength: 1 + maxLength: 100 + job_title: + type: string + maxLength: 100 + email: + type: string + format: email + maxLength: 254 + organization_id: + type: integer + writeOnly: true + reports_to: + type: integer + nullable: true + PatchedCustomFieldDefinitionRequest: + type: object + description: |- + Custom field definition serializer. + + Provides custom field schema information including: + - Field name, type, and description + - Validation rules and default values + - Display order + properties: + name: + type: string + minLength: 1 + maxLength: 100 + field_type: + $ref: '#/components/schemas/CustomFieldDefinitionFieldTypeEnum' + description: + type: string + is_required: + type: boolean + default_value: + type: string + order: + type: integer + maximum: 2147483647 + minimum: 0 + PatchedDeckRequest: + type: object + properties: + presentation: + type: integer + template: + type: integer + title: + type: string + maxLength: 255 + subtitle: + type: string + maxLength: 255 + presenter: + type: integer + nullable: true + status: + $ref: '#/components/schemas/DeckStatusEnum' + date: + type: string + format: date + PatchedDeckSlideRequest: + type: object + properties: + deck: + type: integer + slide_type: + type: string + minLength: 1 + maxLength: 50 + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + content_mapping: {} + content1_type: + $ref: '#/components/schemas/Content3TypeEnum' + content1_image: + type: integer + nullable: true + content1_table: + type: integer + nullable: true + content2_type: + $ref: '#/components/schemas/Content3TypeEnum' + content2_image: + type: integer + nullable: true + content2_table: + type: integer + nullable: true + content3_type: + $ref: '#/components/schemas/Content3TypeEnum' + content3_image: + type: integer + nullable: true + content3_table: + type: integer + nullable: true + PatchedDigitalContactRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 100 + contact_type_id: + type: integer + writeOnly: true + url: + type: string + minLength: 1 + maxLength: 500 + notes: + type: string + client: + type: integer + nullable: true + vendor: + type: integer + nullable: true + PatchedEngagementRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + client_id: + type: integer + writeOnly: true + opportunity_id: + type: integer + writeOnly: true + start_date: + type: string + format: date + end_date: + type: string + format: date + status: + $ref: '#/components/schemas/Status557Enum' + description: + type: string + PatchedFindingRequest: + type: object + description: Serialize all Finding fields for read and write. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + source: + $ref: '#/components/schemas/SourceEnum' + source_detail: + type: string + maxLength: 255 + category: + type: string + maxLength: 100 + impact_level: + $ref: '#/components/schemas/ImpactLevelEnum' + impact_description: + type: string + minLength: 1 + PatchedInterviewRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + contact_id: + type: integer + writeOnly: true + date: + type: string + format: date + time: + type: string + format: time + notes: + type: string + PatchedLocationRequest: + type: object + description: |- + Location information serializer. + + Provides location details including: + - Basic location information + - Client and division relationships + - Custom field values + properties: + client: + type: integer + division: + type: integer + site_name: + type: string + minLength: 1 + maxLength: 255 + address: + type: string + minLength: 1 + state: + type: string + minLength: 1 + maxLength: 100 + country: + type: string + minLength: 1 + maxLength: 100 + PatchedLocationSetRequest: + type: object + description: |- + Location set information serializer with automatic version numbering. + + Provides location set details including: + - Automatically assigned version number (integer) + - Version metadata and creation date + - Custom field definitions + - Location count and aggregations + + Version Numbering: + - Version numbers are automatically assigned as sequential integers (1, 2, 3, etc.) + - Version field is read-only and cannot be manually set + - Versions are unique within each location tool + - Proper numerical sorting is supported (1, 2, 10 not 1, 10, 2) + properties: + name: + type: string + minLength: 1 + description: Display name for this version (automatically generated) + maxLength: 255 + description: + type: string + description: Optional description of this version + is_active: + type: boolean + description: Whether this version is active + PatchedLocationTableSourceRequest: + type: object + description: |- + Location table source configuration serializer. + + Provides table source configuration including: + - Field selection settings + - Schema generation + - Data access information + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + include_client: + type: boolean + include_division: + type: boolean + include_site_name: + type: boolean + include_address: + type: boolean + include_state: + type: boolean + include_country: + type: boolean + selected_custom_fields: + type: array + items: + type: integer + PatchedMediaCollectionRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + PatchedMediaItemRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + file: + type: string + format: binary + pattern: (?:jpg|jpeg|png|gif|svg|emf|pdf|docx|xlsx|pptx)$ + type: + $ref: '#/components/schemas/MediaItemTypeEnum' + description: + type: string + tags: + type: string + description: Comma-separated tags for searching + maxLength: 500 + rating: + type: integer + maximum: 5 + minimum: 0 + description: Star rating 0-5 + is_logo: + type: boolean + PatchedMilestoneRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + date: + type: string + format: date + status: + $ref: '#/components/schemas/MilestoneStatusEnum' + milestone_type: + $ref: '#/components/schemas/MilestoneTypeEnum' + priority: + $ref: '#/components/schemas/MilestonePriorityEnum' + progress: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Completion percentage (0-100) + assignee: + type: integer + nullable: true + acceptance_criteria: + type: string + description: Define what needs to be completed for this milestone + weeks_from_reference: + type: integer + maximum: 2147483647 + minimum: -2147483648 + nullable: true + reference_milestone: + type: integer + nullable: true + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + PatchedOpportunityRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + notes: + type: string + minLength: 1 + description: Opportunity notes and details with URL support + stage: + $ref: '#/components/schemas/StageEnum' + status: + $ref: '#/components/schemas/OpportunityStatusEnum' + is_rfp: + type: boolean + title: Is this an RFP? + description: Check if this opportunity involves an RFP process + client_id: + type: integer + writeOnly: true + primary_vendor_solution_id: + type: integer + writeOnly: true + competitor_ids: + type: array + items: + type: integer + writeOnly: true + description: List of competitor vendor IDs + incumbent_vendor_id: + type: integer + writeOnly: true + description: Incumbent vendor ID + one_time_revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + annual_revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + one_time_margin: + type: string + format: decimal + pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ + annual_margin: + type: string + format: decimal + pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ + term_years: + allOf: + - $ref: '#/components/schemas/TermYearsEnum' + description: |- + Contract term in years + + * `1` - 1 Year + * `2` - 2 Years + * `3` - 3 Years + * `4` - 4 Years + * `5` - 5 Years + minimum: -2147483648 + maximum: 2147483647 + currency_id: + type: string + writeOnly: true + minLength: 1 + description: Currency code (e.g., USD, EUR) + value: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + expected_close_date: + type: string + format: date + nullable: true + close_date: + type: string + format: date + nullable: true + deal_registered: + type: boolean + description: Has this deal been registered with the vendor? + registered_vendor_id: + type: integer + writeOnly: true + description: Registered vendor ID + deal_registration_name: + type: string + description: Deal registration identifier or name + maxLength: 255 + deal_registration_url: + type: string + format: uri + description: Link to deal registration portal or details + maxLength: 200 + deal_registration_date: + type: string + format: date + nullable: true + description: Date the deal was registered with vendor + deal_registration_expiry: + type: string + format: date + nullable: true + description: Expiration date for deal registration + deal_registration_amount: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + description: Monetary value of the deal registration + opportunity_identified_date: + type: string + format: date + nullable: true + description: Date when opportunity was first identified + rfp_release_date: + type: string + format: date + nullable: true + description: Date RFP was officially released + rfp_vendor_info_session_datetime: + type: string + format: date-time + nullable: true + description: RFP vendor information session date and time + rfp_vendor_questions_due_datetime: + type: string + format: date-time + nullable: true + description: Deadline for vendors to submit questions + rfp_due_datetime: + type: string + format: date-time + nullable: true + description: RFP submission deadline + rfp_presentation_datetime: + type: string + format: date-time + nullable: true + description: RFP presentation date and time + rfp_award_announcement_date: + type: string + format: date + nullable: true + description: Date RFP award will be announced + PatchedOrgChartRequest: + type: object + properties: + root_contact: + type: integer + depth: + type: integer + maximum: 2147483647 + minimum: -2147483648 + include_fields: {} + title: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + PatchedOrganizationDivisionRequest: + type: object + description: |- + Organization division information serializer. + + Provides division details including: + - Division name, abbreviation, and description + - Organizational hierarchy (parent division) + - Full hierarchical path + - Contact and opportunity counts + properties: + name: + type: string + minLength: 1 + description: Division name (e.g., "IT Department", "Western Region Sales") + maxLength: 255 + abbreviation: + type: string + description: Short abbreviation for the division (e.g., "IT", "West") + maxLength: 50 + description: + type: string + description: Description of the division's purpose and scope + organization: + type: integer + description: Parent organization this division belongs to + parent_division: + type: integer + nullable: true + description: Parent division for nested organizational structures + PatchedPowerPointTemplateRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + is_active: + type: boolean + PatchedPresentationRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + source_type: + $ref: '#/components/schemas/SourceTypeEnum' + source_id: + type: integer + maximum: 2147483647 + minimum: -2147483648 + date: + type: string + format: date + presenter: + type: integer + nullable: true + PatchedPriceLineItemRequest: + type: object + properties: + vendor_solution: + type: integer + type: + $ref: '#/components/schemas/PriceLineItemTypeEnum' + billing_cycle: + $ref: '#/components/schemas/BillingCycleEnum' + quantity: + type: string + format: decimal + pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ + cost: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + margin: + type: string + format: decimal + pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + PatchedPriceVersionRequest: + type: object + properties: + title: + type: string + minLength: 1 + maxLength: 255 + currency: + type: string + minLength: 1 + version_number: + type: integer + maximum: 2147483647 + minimum: -2147483648 + notes: + type: string + PatchedPricingToolRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + PatchedPrincipleRequest: + type: object + description: Serialize all Principle fields. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + weight: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Importance (1-10) + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + PatchedProposalRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + opportunity_id: + type: integer + writeOnly: true + primary_contact_id: + type: integer + writeOnly: true + nullable: true + status: + $ref: '#/components/schemas/ProposalStatusEnum' + due_date: + type: string + format: date + nullable: true + submitted_date: + type: string + format: date + nullable: true + repository_url: + type: string + format: uri + maxLength: 200 + PatchedRecommendationRequest: + type: object + description: |- + Serialize a Recommendation with nested impacts, alignments, findings, and requirements. + + ``finding_ids`` and ``requirement_ids`` are write-only; on read the full nested + objects are returned under ``associated_findings`` / ``associated_requirements``. + ``timeframe`` is a computed read-only field (Short / Medium / Long) derived from + ``implementation_days`` against fixed 30- and 180-day thresholds. + properties: + title: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + implementation_days: + type: integer + maximum: 2147483647 + minimum: -2147483648 + finding_ids: + type: array + items: + type: integer + writeOnly: true + requirement_ids: + type: array + items: + type: integer + writeOnly: true + cost: + type: string + format: decimal + pattern: ^-?\d{0,10}(?:\.\d{0,2})?$ + currency: + type: string + minLength: 1 + complexity: + $ref: '#/components/schemas/ComplexityEnum' + PatchedRequirementRequest: + type: object + description: Serialize a Requirement with nested findings on read and a writable + ``related_finding_ids`` list on write. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + type: + $ref: '#/components/schemas/RequirementTypeEnum' + category: + type: string + maxLength: 100 + success_measure: + type: string + minLength: 1 + notes: + type: string + related_finding_ids: + type: array + items: + type: integer + writeOnly: true + PatchedStageRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + start_date: + type: string + format: date + end_date: + type: string + format: date + color: + type: integer + nullable: true + description: Stage color (editable in admin) + status: + $ref: '#/components/schemas/StageStatusEnum' + progress: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Completion percentage (0-100) + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + milestone: + type: integer + nullable: true + description: Optional milestone that marks the completion of this stage + PatchedStakeholderRequest: + type: object + properties: + contact_id: + type: integer + writeOnly: true + tenure: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Years in current role + solution_seek: + type: string + solution_avoid: + type: string + notes: + type: string + power: + $ref: '#/components/schemas/PowerEnum' + interest: + $ref: '#/components/schemas/InterestEnum' + PatchedStakeholderToolRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + PatchedTEIReportFieldRequest: + type: object + description: Field-definition serializer. + properties: + table: + $ref: '#/components/schemas/TableEnum' + field_key: + type: string + minLength: 1 + description: Machine identifier, unique within report. + maxLength: 64 + pattern: ^[-a-zA-Z0-9_]+$ + label: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + field_type: + $ref: '#/components/schemas/TEIReportFieldFieldTypeEnum' + category: + type: string + maxLength: 100 + default_value: + type: string + description: Pre-populated default (stored as string, cast by calculator). + maxLength: 255 + is_annual: + type: boolean + description: If True, value is collected per year (Y1..YN); if False, a + single value. + risk_adjustment: + type: string + format: decimal + pattern: ^-?\d{0,1}(?:\.\d{0,4})?$ + nullable: true + description: Default risk adjustment (0.0-1.0); only applied to benefit + fields. + sort_order: + type: integer + maximum: 2147483647 + minimum: 0 + is_required: + type: boolean + source_notes: + type: string + PatchedTEIReportRequest: + type: object + description: Report template serializer with counts and the spec-style ``id`` + alias. + properties: + name: + type: string + minLength: 1 + description: Display name (e.g., 'Amazon Connect 2026'). + maxLength: 255 + vendor: + type: string + minLength: 1 + description: Technology vendor (e.g., 'AWS', 'Genesys'). + maxLength: 255 + version: + type: string + minLength: 1 + description: Model version (e.g., '1.0', '2.1'). + maxLength: 50 + description: + type: string + analysis_period_years: + type: integer + maximum: 2147483647 + minimum: 0 + description: Number of years included in NPV/ROI (1-10). + discount_rate: + type: string + format: decimal + pattern: ^-?\d{0,2}(?:\.\d{0,4})?$ + description: Annual discount rate (e.g., 0.10 = 10%). + status: + $ref: '#/components/schemas/TEIReportStatusEnum' + PatchedTEIToolUpdateRequest: + type: object + description: Write serializer for ``PUT /tools/{id}/`` — only name/status are + mutable. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + status: + $ref: '#/components/schemas/Status49eEnum' + PatchedTagRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 50 + PatchedTimelineRequest: + type: object + properties: + title: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + start_date: + type: string + format: date + PatchedTimelineToolRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + PatchedUserProfileRequest: + type: object + description: |- + User profile serializer with preference settings. + + Provides access to user-specific configuration including: + - Date and time format preferences + - Timezone settings (home and local) + - UI theme customization + properties: + date_format: + allOf: + - $ref: '#/components/schemas/DateFormatEnum' + description: |- + Preferred date display format + + * `YYYY-MM-DD` - 2024-12-25 + * `DD/MM/YYYY` - 25/12/2024 + * `MM/DD/YYYY` - 12/25/2024 + * `DD.MM.YYYY` - 25.12.2024 + * `DD-MM-YYYY` - 25-12-2024 + time_format: + allOf: + - $ref: '#/components/schemas/TimeFormatEnum' + description: |- + 12-hour or 24-hour time format + + * `12-hour` - 12-hour (3:30 PM) + * `24-hour` - 24-hour (15:30) + home_timezone: + allOf: + - $ref: '#/components/schemas/HomeTimezoneEnum' + description: |- + User's home/permanent timezone + + * `Africa/Abidjan` - Africa/Abidjan + * `Africa/Accra` - Africa/Accra + * `Africa/Addis_Ababa` - Africa/Addis_Ababa + * `Africa/Algiers` - Africa/Algiers + * `Africa/Asmara` - Africa/Asmara + * `Africa/Bamako` - Africa/Bamako + * `Africa/Bangui` - Africa/Bangui + * `Africa/Banjul` - Africa/Banjul + * `Africa/Bissau` - Africa/Bissau + * `Africa/Blantyre` - Africa/Blantyre + * `Africa/Brazzaville` - Africa/Brazzaville + * `Africa/Bujumbura` - Africa/Bujumbura + * `Africa/Cairo` - Africa/Cairo + * `Africa/Casablanca` - Africa/Casablanca + * `Africa/Ceuta` - Africa/Ceuta + * `Africa/Conakry` - Africa/Conakry + * `Africa/Dakar` - Africa/Dakar + * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam + * `Africa/Djibouti` - Africa/Djibouti + * `Africa/Douala` - Africa/Douala + * `Africa/El_Aaiun` - Africa/El_Aaiun + * `Africa/Freetown` - Africa/Freetown + * `Africa/Gaborone` - Africa/Gaborone + * `Africa/Harare` - Africa/Harare + * `Africa/Johannesburg` - Africa/Johannesburg + * `Africa/Juba` - Africa/Juba + * `Africa/Kampala` - Africa/Kampala + * `Africa/Khartoum` - Africa/Khartoum + * `Africa/Kigali` - Africa/Kigali + * `Africa/Kinshasa` - Africa/Kinshasa + * `Africa/Lagos` - Africa/Lagos + * `Africa/Libreville` - Africa/Libreville + * `Africa/Lome` - Africa/Lome + * `Africa/Luanda` - Africa/Luanda + * `Africa/Lubumbashi` - Africa/Lubumbashi + * `Africa/Lusaka` - Africa/Lusaka + * `Africa/Malabo` - Africa/Malabo + * `Africa/Maputo` - Africa/Maputo + * `Africa/Maseru` - Africa/Maseru + * `Africa/Mbabane` - Africa/Mbabane + * `Africa/Mogadishu` - Africa/Mogadishu + * `Africa/Monrovia` - Africa/Monrovia + * `Africa/Nairobi` - Africa/Nairobi + * `Africa/Ndjamena` - Africa/Ndjamena + * `Africa/Niamey` - Africa/Niamey + * `Africa/Nouakchott` - Africa/Nouakchott + * `Africa/Ouagadougou` - Africa/Ouagadougou + * `Africa/Porto-Novo` - Africa/Porto-Novo + * `Africa/Sao_Tome` - Africa/Sao_Tome + * `Africa/Tripoli` - Africa/Tripoli + * `Africa/Tunis` - Africa/Tunis + * `Africa/Windhoek` - Africa/Windhoek + * `America/Adak` - America/Adak + * `America/Anchorage` - America/Anchorage + * `America/Anguilla` - America/Anguilla + * `America/Antigua` - America/Antigua + * `America/Araguaina` - America/Araguaina + * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires + * `America/Argentina/Catamarca` - America/Argentina/Catamarca + * `America/Argentina/Cordoba` - America/Argentina/Cordoba + * `America/Argentina/Jujuy` - America/Argentina/Jujuy + * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja + * `America/Argentina/Mendoza` - America/Argentina/Mendoza + * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos + * `America/Argentina/Salta` - America/Argentina/Salta + * `America/Argentina/San_Juan` - America/Argentina/San_Juan + * `America/Argentina/San_Luis` - America/Argentina/San_Luis + * `America/Argentina/Tucuman` - America/Argentina/Tucuman + * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia + * `America/Aruba` - America/Aruba + * `America/Asuncion` - America/Asuncion + * `America/Atikokan` - America/Atikokan + * `America/Bahia` - America/Bahia + * `America/Bahia_Banderas` - America/Bahia_Banderas + * `America/Barbados` - America/Barbados + * `America/Belem` - America/Belem + * `America/Belize` - America/Belize + * `America/Blanc-Sablon` - America/Blanc-Sablon + * `America/Boa_Vista` - America/Boa_Vista + * `America/Bogota` - America/Bogota + * `America/Boise` - America/Boise + * `America/Cambridge_Bay` - America/Cambridge_Bay + * `America/Campo_Grande` - America/Campo_Grande + * `America/Cancun` - America/Cancun + * `America/Caracas` - America/Caracas + * `America/Cayenne` - America/Cayenne + * `America/Cayman` - America/Cayman + * `America/Chicago` - America/Chicago + * `America/Chihuahua` - America/Chihuahua + * `America/Ciudad_Juarez` - America/Ciudad_Juarez + * `America/Costa_Rica` - America/Costa_Rica + * `America/Coyhaique` - America/Coyhaique + * `America/Creston` - America/Creston + * `America/Cuiaba` - America/Cuiaba + * `America/Curacao` - America/Curacao + * `America/Danmarkshavn` - America/Danmarkshavn + * `America/Dawson` - America/Dawson + * `America/Dawson_Creek` - America/Dawson_Creek + * `America/Denver` - America/Denver + * `America/Detroit` - America/Detroit + * `America/Dominica` - America/Dominica + * `America/Edmonton` - America/Edmonton + * `America/Eirunepe` - America/Eirunepe + * `America/El_Salvador` - America/El_Salvador + * `America/Fort_Nelson` - America/Fort_Nelson + * `America/Fortaleza` - America/Fortaleza + * `America/Glace_Bay` - America/Glace_Bay + * `America/Goose_Bay` - America/Goose_Bay + * `America/Grand_Turk` - America/Grand_Turk + * `America/Grenada` - America/Grenada + * `America/Guadeloupe` - America/Guadeloupe + * `America/Guatemala` - America/Guatemala + * `America/Guayaquil` - America/Guayaquil + * `America/Guyana` - America/Guyana + * `America/Halifax` - America/Halifax + * `America/Havana` - America/Havana + * `America/Hermosillo` - America/Hermosillo + * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis + * `America/Indiana/Knox` - America/Indiana/Knox + * `America/Indiana/Marengo` - America/Indiana/Marengo + * `America/Indiana/Petersburg` - America/Indiana/Petersburg + * `America/Indiana/Tell_City` - America/Indiana/Tell_City + * `America/Indiana/Vevay` - America/Indiana/Vevay + * `America/Indiana/Vincennes` - America/Indiana/Vincennes + * `America/Indiana/Winamac` - America/Indiana/Winamac + * `America/Inuvik` - America/Inuvik + * `America/Iqaluit` - America/Iqaluit + * `America/Jamaica` - America/Jamaica + * `America/Juneau` - America/Juneau + * `America/Kentucky/Louisville` - America/Kentucky/Louisville + * `America/Kentucky/Monticello` - America/Kentucky/Monticello + * `America/Kralendijk` - America/Kralendijk + * `America/La_Paz` - America/La_Paz + * `America/Lima` - America/Lima + * `America/Los_Angeles` - America/Los_Angeles + * `America/Lower_Princes` - America/Lower_Princes + * `America/Maceio` - America/Maceio + * `America/Managua` - America/Managua + * `America/Manaus` - America/Manaus + * `America/Marigot` - America/Marigot + * `America/Martinique` - America/Martinique + * `America/Matamoros` - America/Matamoros + * `America/Mazatlan` - America/Mazatlan + * `America/Menominee` - America/Menominee + * `America/Merida` - America/Merida + * `America/Metlakatla` - America/Metlakatla + * `America/Mexico_City` - America/Mexico_City + * `America/Miquelon` - America/Miquelon + * `America/Moncton` - America/Moncton + * `America/Monterrey` - America/Monterrey + * `America/Montevideo` - America/Montevideo + * `America/Montserrat` - America/Montserrat + * `America/Nassau` - America/Nassau + * `America/New_York` - America/New_York + * `America/Nome` - America/Nome + * `America/Noronha` - America/Noronha + * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah + * `America/North_Dakota/Center` - America/North_Dakota/Center + * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem + * `America/Nuuk` - America/Nuuk + * `America/Ojinaga` - America/Ojinaga + * `America/Panama` - America/Panama + * `America/Paramaribo` - America/Paramaribo + * `America/Phoenix` - America/Phoenix + * `America/Port-au-Prince` - America/Port-au-Prince + * `America/Port_of_Spain` - America/Port_of_Spain + * `America/Porto_Velho` - America/Porto_Velho + * `America/Puerto_Rico` - America/Puerto_Rico + * `America/Punta_Arenas` - America/Punta_Arenas + * `America/Rankin_Inlet` - America/Rankin_Inlet + * `America/Recife` - America/Recife + * `America/Regina` - America/Regina + * `America/Resolute` - America/Resolute + * `America/Rio_Branco` - America/Rio_Branco + * `America/Santarem` - America/Santarem + * `America/Santiago` - America/Santiago + * `America/Santo_Domingo` - America/Santo_Domingo + * `America/Sao_Paulo` - America/Sao_Paulo + * `America/Scoresbysund` - America/Scoresbysund + * `America/Sitka` - America/Sitka + * `America/St_Barthelemy` - America/St_Barthelemy + * `America/St_Johns` - America/St_Johns + * `America/St_Kitts` - America/St_Kitts + * `America/St_Lucia` - America/St_Lucia + * `America/St_Thomas` - America/St_Thomas + * `America/St_Vincent` - America/St_Vincent + * `America/Swift_Current` - America/Swift_Current + * `America/Tegucigalpa` - America/Tegucigalpa + * `America/Thule` - America/Thule + * `America/Tijuana` - America/Tijuana + * `America/Toronto` - America/Toronto + * `America/Tortola` - America/Tortola + * `America/Vancouver` - America/Vancouver + * `America/Whitehorse` - America/Whitehorse + * `America/Winnipeg` - America/Winnipeg + * `America/Yakutat` - America/Yakutat + * `Antarctica/Casey` - Antarctica/Casey + * `Antarctica/Davis` - Antarctica/Davis + * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville + * `Antarctica/Macquarie` - Antarctica/Macquarie + * `Antarctica/Mawson` - Antarctica/Mawson + * `Antarctica/McMurdo` - Antarctica/McMurdo + * `Antarctica/Palmer` - Antarctica/Palmer + * `Antarctica/Rothera` - Antarctica/Rothera + * `Antarctica/Syowa` - Antarctica/Syowa + * `Antarctica/Troll` - Antarctica/Troll + * `Antarctica/Vostok` - Antarctica/Vostok + * `Arctic/Longyearbyen` - Arctic/Longyearbyen + * `Asia/Aden` - Asia/Aden + * `Asia/Almaty` - Asia/Almaty + * `Asia/Amman` - Asia/Amman + * `Asia/Anadyr` - Asia/Anadyr + * `Asia/Aqtau` - Asia/Aqtau + * `Asia/Aqtobe` - Asia/Aqtobe + * `Asia/Ashgabat` - Asia/Ashgabat + * `Asia/Atyrau` - Asia/Atyrau + * `Asia/Baghdad` - Asia/Baghdad + * `Asia/Bahrain` - Asia/Bahrain + * `Asia/Baku` - Asia/Baku + * `Asia/Bangkok` - Asia/Bangkok + * `Asia/Barnaul` - Asia/Barnaul + * `Asia/Beirut` - Asia/Beirut + * `Asia/Bishkek` - Asia/Bishkek + * `Asia/Brunei` - Asia/Brunei + * `Asia/Chita` - Asia/Chita + * `Asia/Colombo` - Asia/Colombo + * `Asia/Damascus` - Asia/Damascus + * `Asia/Dhaka` - Asia/Dhaka + * `Asia/Dili` - Asia/Dili + * `Asia/Dubai` - Asia/Dubai + * `Asia/Dushanbe` - Asia/Dushanbe + * `Asia/Famagusta` - Asia/Famagusta + * `Asia/Gaza` - Asia/Gaza + * `Asia/Hebron` - Asia/Hebron + * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh + * `Asia/Hong_Kong` - Asia/Hong_Kong + * `Asia/Hovd` - Asia/Hovd + * `Asia/Irkutsk` - Asia/Irkutsk + * `Asia/Jakarta` - Asia/Jakarta + * `Asia/Jayapura` - Asia/Jayapura + * `Asia/Jerusalem` - Asia/Jerusalem + * `Asia/Kabul` - Asia/Kabul + * `Asia/Kamchatka` - Asia/Kamchatka + * `Asia/Karachi` - Asia/Karachi + * `Asia/Kathmandu` - Asia/Kathmandu + * `Asia/Khandyga` - Asia/Khandyga + * `Asia/Kolkata` - Asia/Kolkata + * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk + * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur + * `Asia/Kuching` - Asia/Kuching + * `Asia/Kuwait` - Asia/Kuwait + * `Asia/Macau` - Asia/Macau + * `Asia/Magadan` - Asia/Magadan + * `Asia/Makassar` - Asia/Makassar + * `Asia/Manila` - Asia/Manila + * `Asia/Muscat` - Asia/Muscat + * `Asia/Nicosia` - Asia/Nicosia + * `Asia/Novokuznetsk` - Asia/Novokuznetsk + * `Asia/Novosibirsk` - Asia/Novosibirsk + * `Asia/Omsk` - Asia/Omsk + * `Asia/Oral` - Asia/Oral + * `Asia/Phnom_Penh` - Asia/Phnom_Penh + * `Asia/Pontianak` - Asia/Pontianak + * `Asia/Pyongyang` - Asia/Pyongyang + * `Asia/Qatar` - Asia/Qatar + * `Asia/Qostanay` - Asia/Qostanay + * `Asia/Qyzylorda` - Asia/Qyzylorda + * `Asia/Riyadh` - Asia/Riyadh + * `Asia/Sakhalin` - Asia/Sakhalin + * `Asia/Samarkand` - Asia/Samarkand + * `Asia/Seoul` - Asia/Seoul + * `Asia/Shanghai` - Asia/Shanghai + * `Asia/Singapore` - Asia/Singapore + * `Asia/Srednekolymsk` - Asia/Srednekolymsk + * `Asia/Taipei` - Asia/Taipei + * `Asia/Tashkent` - Asia/Tashkent + * `Asia/Tbilisi` - Asia/Tbilisi + * `Asia/Tehran` - Asia/Tehran + * `Asia/Thimphu` - Asia/Thimphu + * `Asia/Tokyo` - Asia/Tokyo + * `Asia/Tomsk` - Asia/Tomsk + * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar + * `Asia/Urumqi` - Asia/Urumqi + * `Asia/Ust-Nera` - Asia/Ust-Nera + * `Asia/Vientiane` - Asia/Vientiane + * `Asia/Vladivostok` - Asia/Vladivostok + * `Asia/Yakutsk` - Asia/Yakutsk + * `Asia/Yangon` - Asia/Yangon + * `Asia/Yekaterinburg` - Asia/Yekaterinburg + * `Asia/Yerevan` - Asia/Yerevan + * `Atlantic/Azores` - Atlantic/Azores + * `Atlantic/Bermuda` - Atlantic/Bermuda + * `Atlantic/Canary` - Atlantic/Canary + * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde + * `Atlantic/Faroe` - Atlantic/Faroe + * `Atlantic/Madeira` - Atlantic/Madeira + * `Atlantic/Reykjavik` - Atlantic/Reykjavik + * `Atlantic/South_Georgia` - Atlantic/South_Georgia + * `Atlantic/St_Helena` - Atlantic/St_Helena + * `Atlantic/Stanley` - Atlantic/Stanley + * `Australia/Adelaide` - Australia/Adelaide + * `Australia/Brisbane` - Australia/Brisbane + * `Australia/Broken_Hill` - Australia/Broken_Hill + * `Australia/Darwin` - Australia/Darwin + * `Australia/Eucla` - Australia/Eucla + * `Australia/Hobart` - Australia/Hobart + * `Australia/Lindeman` - Australia/Lindeman + * `Australia/Lord_Howe` - Australia/Lord_Howe + * `Australia/Melbourne` - Australia/Melbourne + * `Australia/Perth` - Australia/Perth + * `Australia/Sydney` - Australia/Sydney + * `Europe/Amsterdam` - Europe/Amsterdam + * `Europe/Andorra` - Europe/Andorra + * `Europe/Astrakhan` - Europe/Astrakhan + * `Europe/Athens` - Europe/Athens + * `Europe/Belgrade` - Europe/Belgrade + * `Europe/Berlin` - Europe/Berlin + * `Europe/Bratislava` - Europe/Bratislava + * `Europe/Brussels` - Europe/Brussels + * `Europe/Bucharest` - Europe/Bucharest + * `Europe/Budapest` - Europe/Budapest + * `Europe/Busingen` - Europe/Busingen + * `Europe/Chisinau` - Europe/Chisinau + * `Europe/Copenhagen` - Europe/Copenhagen + * `Europe/Dublin` - Europe/Dublin + * `Europe/Gibraltar` - Europe/Gibraltar + * `Europe/Guernsey` - Europe/Guernsey + * `Europe/Helsinki` - Europe/Helsinki + * `Europe/Isle_of_Man` - Europe/Isle_of_Man + * `Europe/Istanbul` - Europe/Istanbul + * `Europe/Jersey` - Europe/Jersey + * `Europe/Kaliningrad` - Europe/Kaliningrad + * `Europe/Kirov` - Europe/Kirov + * `Europe/Kyiv` - Europe/Kyiv + * `Europe/Lisbon` - Europe/Lisbon + * `Europe/Ljubljana` - Europe/Ljubljana + * `Europe/London` - Europe/London + * `Europe/Luxembourg` - Europe/Luxembourg + * `Europe/Madrid` - Europe/Madrid + * `Europe/Malta` - Europe/Malta + * `Europe/Mariehamn` - Europe/Mariehamn + * `Europe/Minsk` - Europe/Minsk + * `Europe/Monaco` - Europe/Monaco + * `Europe/Moscow` - Europe/Moscow + * `Europe/Oslo` - Europe/Oslo + * `Europe/Paris` - Europe/Paris + * `Europe/Podgorica` - Europe/Podgorica + * `Europe/Prague` - Europe/Prague + * `Europe/Riga` - Europe/Riga + * `Europe/Rome` - Europe/Rome + * `Europe/Samara` - Europe/Samara + * `Europe/San_Marino` - Europe/San_Marino + * `Europe/Sarajevo` - Europe/Sarajevo + * `Europe/Saratov` - Europe/Saratov + * `Europe/Simferopol` - Europe/Simferopol + * `Europe/Skopje` - Europe/Skopje + * `Europe/Sofia` - Europe/Sofia + * `Europe/Stockholm` - Europe/Stockholm + * `Europe/Tallinn` - Europe/Tallinn + * `Europe/Tirane` - Europe/Tirane + * `Europe/Ulyanovsk` - Europe/Ulyanovsk + * `Europe/Vaduz` - Europe/Vaduz + * `Europe/Vatican` - Europe/Vatican + * `Europe/Vienna` - Europe/Vienna + * `Europe/Vilnius` - Europe/Vilnius + * `Europe/Volgograd` - Europe/Volgograd + * `Europe/Warsaw` - Europe/Warsaw + * `Europe/Zagreb` - Europe/Zagreb + * `Europe/Zurich` - Europe/Zurich + * `GMT` - GMT + * `Indian/Antananarivo` - Indian/Antananarivo + * `Indian/Chagos` - Indian/Chagos + * `Indian/Christmas` - Indian/Christmas + * `Indian/Cocos` - Indian/Cocos + * `Indian/Comoro` - Indian/Comoro + * `Indian/Kerguelen` - Indian/Kerguelen + * `Indian/Mahe` - Indian/Mahe + * `Indian/Maldives` - Indian/Maldives + * `Indian/Mauritius` - Indian/Mauritius + * `Indian/Mayotte` - Indian/Mayotte + * `Indian/Reunion` - Indian/Reunion + * `Pacific/Apia` - Pacific/Apia + * `Pacific/Auckland` - Pacific/Auckland + * `Pacific/Bougainville` - Pacific/Bougainville + * `Pacific/Chatham` - Pacific/Chatham + * `Pacific/Chuuk` - Pacific/Chuuk + * `Pacific/Easter` - Pacific/Easter + * `Pacific/Efate` - Pacific/Efate + * `Pacific/Fakaofo` - Pacific/Fakaofo + * `Pacific/Fiji` - Pacific/Fiji + * `Pacific/Funafuti` - Pacific/Funafuti + * `Pacific/Galapagos` - Pacific/Galapagos + * `Pacific/Gambier` - Pacific/Gambier + * `Pacific/Guadalcanal` - Pacific/Guadalcanal + * `Pacific/Guam` - Pacific/Guam + * `Pacific/Honolulu` - Pacific/Honolulu + * `Pacific/Kanton` - Pacific/Kanton + * `Pacific/Kiritimati` - Pacific/Kiritimati + * `Pacific/Kosrae` - Pacific/Kosrae + * `Pacific/Kwajalein` - Pacific/Kwajalein + * `Pacific/Majuro` - Pacific/Majuro + * `Pacific/Marquesas` - Pacific/Marquesas + * `Pacific/Midway` - Pacific/Midway + * `Pacific/Nauru` - Pacific/Nauru + * `Pacific/Niue` - Pacific/Niue + * `Pacific/Norfolk` - Pacific/Norfolk + * `Pacific/Noumea` - Pacific/Noumea + * `Pacific/Pago_Pago` - Pacific/Pago_Pago + * `Pacific/Palau` - Pacific/Palau + * `Pacific/Pitcairn` - Pacific/Pitcairn + * `Pacific/Pohnpei` - Pacific/Pohnpei + * `Pacific/Port_Moresby` - Pacific/Port_Moresby + * `Pacific/Rarotonga` - Pacific/Rarotonga + * `Pacific/Saipan` - Pacific/Saipan + * `Pacific/Tahiti` - Pacific/Tahiti + * `Pacific/Tarawa` - Pacific/Tarawa + * `Pacific/Tongatapu` - Pacific/Tongatapu + * `Pacific/Wake` - Pacific/Wake + * `Pacific/Wallis` - Pacific/Wallis + * `UTC` - UTC + local_timezone: + nullable: true + description: |- + User's current local timezone (if traveling) + + * `Africa/Abidjan` - Africa/Abidjan + * `Africa/Accra` - Africa/Accra + * `Africa/Addis_Ababa` - Africa/Addis_Ababa + * `Africa/Algiers` - Africa/Algiers + * `Africa/Asmara` - Africa/Asmara + * `Africa/Bamako` - Africa/Bamako + * `Africa/Bangui` - Africa/Bangui + * `Africa/Banjul` - Africa/Banjul + * `Africa/Bissau` - Africa/Bissau + * `Africa/Blantyre` - Africa/Blantyre + * `Africa/Brazzaville` - Africa/Brazzaville + * `Africa/Bujumbura` - Africa/Bujumbura + * `Africa/Cairo` - Africa/Cairo + * `Africa/Casablanca` - Africa/Casablanca + * `Africa/Ceuta` - Africa/Ceuta + * `Africa/Conakry` - Africa/Conakry + * `Africa/Dakar` - Africa/Dakar + * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam + * `Africa/Djibouti` - Africa/Djibouti + * `Africa/Douala` - Africa/Douala + * `Africa/El_Aaiun` - Africa/El_Aaiun + * `Africa/Freetown` - Africa/Freetown + * `Africa/Gaborone` - Africa/Gaborone + * `Africa/Harare` - Africa/Harare + * `Africa/Johannesburg` - Africa/Johannesburg + * `Africa/Juba` - Africa/Juba + * `Africa/Kampala` - Africa/Kampala + * `Africa/Khartoum` - Africa/Khartoum + * `Africa/Kigali` - Africa/Kigali + * `Africa/Kinshasa` - Africa/Kinshasa + * `Africa/Lagos` - Africa/Lagos + * `Africa/Libreville` - Africa/Libreville + * `Africa/Lome` - Africa/Lome + * `Africa/Luanda` - Africa/Luanda + * `Africa/Lubumbashi` - Africa/Lubumbashi + * `Africa/Lusaka` - Africa/Lusaka + * `Africa/Malabo` - Africa/Malabo + * `Africa/Maputo` - Africa/Maputo + * `Africa/Maseru` - Africa/Maseru + * `Africa/Mbabane` - Africa/Mbabane + * `Africa/Mogadishu` - Africa/Mogadishu + * `Africa/Monrovia` - Africa/Monrovia + * `Africa/Nairobi` - Africa/Nairobi + * `Africa/Ndjamena` - Africa/Ndjamena + * `Africa/Niamey` - Africa/Niamey + * `Africa/Nouakchott` - Africa/Nouakchott + * `Africa/Ouagadougou` - Africa/Ouagadougou + * `Africa/Porto-Novo` - Africa/Porto-Novo + * `Africa/Sao_Tome` - Africa/Sao_Tome + * `Africa/Tripoli` - Africa/Tripoli + * `Africa/Tunis` - Africa/Tunis + * `Africa/Windhoek` - Africa/Windhoek + * `America/Adak` - America/Adak + * `America/Anchorage` - America/Anchorage + * `America/Anguilla` - America/Anguilla + * `America/Antigua` - America/Antigua + * `America/Araguaina` - America/Araguaina + * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires + * `America/Argentina/Catamarca` - America/Argentina/Catamarca + * `America/Argentina/Cordoba` - America/Argentina/Cordoba + * `America/Argentina/Jujuy` - America/Argentina/Jujuy + * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja + * `America/Argentina/Mendoza` - America/Argentina/Mendoza + * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos + * `America/Argentina/Salta` - America/Argentina/Salta + * `America/Argentina/San_Juan` - America/Argentina/San_Juan + * `America/Argentina/San_Luis` - America/Argentina/San_Luis + * `America/Argentina/Tucuman` - America/Argentina/Tucuman + * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia + * `America/Aruba` - America/Aruba + * `America/Asuncion` - America/Asuncion + * `America/Atikokan` - America/Atikokan + * `America/Bahia` - America/Bahia + * `America/Bahia_Banderas` - America/Bahia_Banderas + * `America/Barbados` - America/Barbados + * `America/Belem` - America/Belem + * `America/Belize` - America/Belize + * `America/Blanc-Sablon` - America/Blanc-Sablon + * `America/Boa_Vista` - America/Boa_Vista + * `America/Bogota` - America/Bogota + * `America/Boise` - America/Boise + * `America/Cambridge_Bay` - America/Cambridge_Bay + * `America/Campo_Grande` - America/Campo_Grande + * `America/Cancun` - America/Cancun + * `America/Caracas` - America/Caracas + * `America/Cayenne` - America/Cayenne + * `America/Cayman` - America/Cayman + * `America/Chicago` - America/Chicago + * `America/Chihuahua` - America/Chihuahua + * `America/Ciudad_Juarez` - America/Ciudad_Juarez + * `America/Costa_Rica` - America/Costa_Rica + * `America/Coyhaique` - America/Coyhaique + * `America/Creston` - America/Creston + * `America/Cuiaba` - America/Cuiaba + * `America/Curacao` - America/Curacao + * `America/Danmarkshavn` - America/Danmarkshavn + * `America/Dawson` - America/Dawson + * `America/Dawson_Creek` - America/Dawson_Creek + * `America/Denver` - America/Denver + * `America/Detroit` - America/Detroit + * `America/Dominica` - America/Dominica + * `America/Edmonton` - America/Edmonton + * `America/Eirunepe` - America/Eirunepe + * `America/El_Salvador` - America/El_Salvador + * `America/Fort_Nelson` - America/Fort_Nelson + * `America/Fortaleza` - America/Fortaleza + * `America/Glace_Bay` - America/Glace_Bay + * `America/Goose_Bay` - America/Goose_Bay + * `America/Grand_Turk` - America/Grand_Turk + * `America/Grenada` - America/Grenada + * `America/Guadeloupe` - America/Guadeloupe + * `America/Guatemala` - America/Guatemala + * `America/Guayaquil` - America/Guayaquil + * `America/Guyana` - America/Guyana + * `America/Halifax` - America/Halifax + * `America/Havana` - America/Havana + * `America/Hermosillo` - America/Hermosillo + * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis + * `America/Indiana/Knox` - America/Indiana/Knox + * `America/Indiana/Marengo` - America/Indiana/Marengo + * `America/Indiana/Petersburg` - America/Indiana/Petersburg + * `America/Indiana/Tell_City` - America/Indiana/Tell_City + * `America/Indiana/Vevay` - America/Indiana/Vevay + * `America/Indiana/Vincennes` - America/Indiana/Vincennes + * `America/Indiana/Winamac` - America/Indiana/Winamac + * `America/Inuvik` - America/Inuvik + * `America/Iqaluit` - America/Iqaluit + * `America/Jamaica` - America/Jamaica + * `America/Juneau` - America/Juneau + * `America/Kentucky/Louisville` - America/Kentucky/Louisville + * `America/Kentucky/Monticello` - America/Kentucky/Monticello + * `America/Kralendijk` - America/Kralendijk + * `America/La_Paz` - America/La_Paz + * `America/Lima` - America/Lima + * `America/Los_Angeles` - America/Los_Angeles + * `America/Lower_Princes` - America/Lower_Princes + * `America/Maceio` - America/Maceio + * `America/Managua` - America/Managua + * `America/Manaus` - America/Manaus + * `America/Marigot` - America/Marigot + * `America/Martinique` - America/Martinique + * `America/Matamoros` - America/Matamoros + * `America/Mazatlan` - America/Mazatlan + * `America/Menominee` - America/Menominee + * `America/Merida` - America/Merida + * `America/Metlakatla` - America/Metlakatla + * `America/Mexico_City` - America/Mexico_City + * `America/Miquelon` - America/Miquelon + * `America/Moncton` - America/Moncton + * `America/Monterrey` - America/Monterrey + * `America/Montevideo` - America/Montevideo + * `America/Montserrat` - America/Montserrat + * `America/Nassau` - America/Nassau + * `America/New_York` - America/New_York + * `America/Nome` - America/Nome + * `America/Noronha` - America/Noronha + * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah + * `America/North_Dakota/Center` - America/North_Dakota/Center + * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem + * `America/Nuuk` - America/Nuuk + * `America/Ojinaga` - America/Ojinaga + * `America/Panama` - America/Panama + * `America/Paramaribo` - America/Paramaribo + * `America/Phoenix` - America/Phoenix + * `America/Port-au-Prince` - America/Port-au-Prince + * `America/Port_of_Spain` - America/Port_of_Spain + * `America/Porto_Velho` - America/Porto_Velho + * `America/Puerto_Rico` - America/Puerto_Rico + * `America/Punta_Arenas` - America/Punta_Arenas + * `America/Rankin_Inlet` - America/Rankin_Inlet + * `America/Recife` - America/Recife + * `America/Regina` - America/Regina + * `America/Resolute` - America/Resolute + * `America/Rio_Branco` - America/Rio_Branco + * `America/Santarem` - America/Santarem + * `America/Santiago` - America/Santiago + * `America/Santo_Domingo` - America/Santo_Domingo + * `America/Sao_Paulo` - America/Sao_Paulo + * `America/Scoresbysund` - America/Scoresbysund + * `America/Sitka` - America/Sitka + * `America/St_Barthelemy` - America/St_Barthelemy + * `America/St_Johns` - America/St_Johns + * `America/St_Kitts` - America/St_Kitts + * `America/St_Lucia` - America/St_Lucia + * `America/St_Thomas` - America/St_Thomas + * `America/St_Vincent` - America/St_Vincent + * `America/Swift_Current` - America/Swift_Current + * `America/Tegucigalpa` - America/Tegucigalpa + * `America/Thule` - America/Thule + * `America/Tijuana` - America/Tijuana + * `America/Toronto` - America/Toronto + * `America/Tortola` - America/Tortola + * `America/Vancouver` - America/Vancouver + * `America/Whitehorse` - America/Whitehorse + * `America/Winnipeg` - America/Winnipeg + * `America/Yakutat` - America/Yakutat + * `Antarctica/Casey` - Antarctica/Casey + * `Antarctica/Davis` - Antarctica/Davis + * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville + * `Antarctica/Macquarie` - Antarctica/Macquarie + * `Antarctica/Mawson` - Antarctica/Mawson + * `Antarctica/McMurdo` - Antarctica/McMurdo + * `Antarctica/Palmer` - Antarctica/Palmer + * `Antarctica/Rothera` - Antarctica/Rothera + * `Antarctica/Syowa` - Antarctica/Syowa + * `Antarctica/Troll` - Antarctica/Troll + * `Antarctica/Vostok` - Antarctica/Vostok + * `Arctic/Longyearbyen` - Arctic/Longyearbyen + * `Asia/Aden` - Asia/Aden + * `Asia/Almaty` - Asia/Almaty + * `Asia/Amman` - Asia/Amman + * `Asia/Anadyr` - Asia/Anadyr + * `Asia/Aqtau` - Asia/Aqtau + * `Asia/Aqtobe` - Asia/Aqtobe + * `Asia/Ashgabat` - Asia/Ashgabat + * `Asia/Atyrau` - Asia/Atyrau + * `Asia/Baghdad` - Asia/Baghdad + * `Asia/Bahrain` - Asia/Bahrain + * `Asia/Baku` - Asia/Baku + * `Asia/Bangkok` - Asia/Bangkok + * `Asia/Barnaul` - Asia/Barnaul + * `Asia/Beirut` - Asia/Beirut + * `Asia/Bishkek` - Asia/Bishkek + * `Asia/Brunei` - Asia/Brunei + * `Asia/Chita` - Asia/Chita + * `Asia/Colombo` - Asia/Colombo + * `Asia/Damascus` - Asia/Damascus + * `Asia/Dhaka` - Asia/Dhaka + * `Asia/Dili` - Asia/Dili + * `Asia/Dubai` - Asia/Dubai + * `Asia/Dushanbe` - Asia/Dushanbe + * `Asia/Famagusta` - Asia/Famagusta + * `Asia/Gaza` - Asia/Gaza + * `Asia/Hebron` - Asia/Hebron + * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh + * `Asia/Hong_Kong` - Asia/Hong_Kong + * `Asia/Hovd` - Asia/Hovd + * `Asia/Irkutsk` - Asia/Irkutsk + * `Asia/Jakarta` - Asia/Jakarta + * `Asia/Jayapura` - Asia/Jayapura + * `Asia/Jerusalem` - Asia/Jerusalem + * `Asia/Kabul` - Asia/Kabul + * `Asia/Kamchatka` - Asia/Kamchatka + * `Asia/Karachi` - Asia/Karachi + * `Asia/Kathmandu` - Asia/Kathmandu + * `Asia/Khandyga` - Asia/Khandyga + * `Asia/Kolkata` - Asia/Kolkata + * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk + * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur + * `Asia/Kuching` - Asia/Kuching + * `Asia/Kuwait` - Asia/Kuwait + * `Asia/Macau` - Asia/Macau + * `Asia/Magadan` - Asia/Magadan + * `Asia/Makassar` - Asia/Makassar + * `Asia/Manila` - Asia/Manila + * `Asia/Muscat` - Asia/Muscat + * `Asia/Nicosia` - Asia/Nicosia + * `Asia/Novokuznetsk` - Asia/Novokuznetsk + * `Asia/Novosibirsk` - Asia/Novosibirsk + * `Asia/Omsk` - Asia/Omsk + * `Asia/Oral` - Asia/Oral + * `Asia/Phnom_Penh` - Asia/Phnom_Penh + * `Asia/Pontianak` - Asia/Pontianak + * `Asia/Pyongyang` - Asia/Pyongyang + * `Asia/Qatar` - Asia/Qatar + * `Asia/Qostanay` - Asia/Qostanay + * `Asia/Qyzylorda` - Asia/Qyzylorda + * `Asia/Riyadh` - Asia/Riyadh + * `Asia/Sakhalin` - Asia/Sakhalin + * `Asia/Samarkand` - Asia/Samarkand + * `Asia/Seoul` - Asia/Seoul + * `Asia/Shanghai` - Asia/Shanghai + * `Asia/Singapore` - Asia/Singapore + * `Asia/Srednekolymsk` - Asia/Srednekolymsk + * `Asia/Taipei` - Asia/Taipei + * `Asia/Tashkent` - Asia/Tashkent + * `Asia/Tbilisi` - Asia/Tbilisi + * `Asia/Tehran` - Asia/Tehran + * `Asia/Thimphu` - Asia/Thimphu + * `Asia/Tokyo` - Asia/Tokyo + * `Asia/Tomsk` - Asia/Tomsk + * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar + * `Asia/Urumqi` - Asia/Urumqi + * `Asia/Ust-Nera` - Asia/Ust-Nera + * `Asia/Vientiane` - Asia/Vientiane + * `Asia/Vladivostok` - Asia/Vladivostok + * `Asia/Yakutsk` - Asia/Yakutsk + * `Asia/Yangon` - Asia/Yangon + * `Asia/Yekaterinburg` - Asia/Yekaterinburg + * `Asia/Yerevan` - Asia/Yerevan + * `Atlantic/Azores` - Atlantic/Azores + * `Atlantic/Bermuda` - Atlantic/Bermuda + * `Atlantic/Canary` - Atlantic/Canary + * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde + * `Atlantic/Faroe` - Atlantic/Faroe + * `Atlantic/Madeira` - Atlantic/Madeira + * `Atlantic/Reykjavik` - Atlantic/Reykjavik + * `Atlantic/South_Georgia` - Atlantic/South_Georgia + * `Atlantic/St_Helena` - Atlantic/St_Helena + * `Atlantic/Stanley` - Atlantic/Stanley + * `Australia/Adelaide` - Australia/Adelaide + * `Australia/Brisbane` - Australia/Brisbane + * `Australia/Broken_Hill` - Australia/Broken_Hill + * `Australia/Darwin` - Australia/Darwin + * `Australia/Eucla` - Australia/Eucla + * `Australia/Hobart` - Australia/Hobart + * `Australia/Lindeman` - Australia/Lindeman + * `Australia/Lord_Howe` - Australia/Lord_Howe + * `Australia/Melbourne` - Australia/Melbourne + * `Australia/Perth` - Australia/Perth + * `Australia/Sydney` - Australia/Sydney + * `Europe/Amsterdam` - Europe/Amsterdam + * `Europe/Andorra` - Europe/Andorra + * `Europe/Astrakhan` - Europe/Astrakhan + * `Europe/Athens` - Europe/Athens + * `Europe/Belgrade` - Europe/Belgrade + * `Europe/Berlin` - Europe/Berlin + * `Europe/Bratislava` - Europe/Bratislava + * `Europe/Brussels` - Europe/Brussels + * `Europe/Bucharest` - Europe/Bucharest + * `Europe/Budapest` - Europe/Budapest + * `Europe/Busingen` - Europe/Busingen + * `Europe/Chisinau` - Europe/Chisinau + * `Europe/Copenhagen` - Europe/Copenhagen + * `Europe/Dublin` - Europe/Dublin + * `Europe/Gibraltar` - Europe/Gibraltar + * `Europe/Guernsey` - Europe/Guernsey + * `Europe/Helsinki` - Europe/Helsinki + * `Europe/Isle_of_Man` - Europe/Isle_of_Man + * `Europe/Istanbul` - Europe/Istanbul + * `Europe/Jersey` - Europe/Jersey + * `Europe/Kaliningrad` - Europe/Kaliningrad + * `Europe/Kirov` - Europe/Kirov + * `Europe/Kyiv` - Europe/Kyiv + * `Europe/Lisbon` - Europe/Lisbon + * `Europe/Ljubljana` - Europe/Ljubljana + * `Europe/London` - Europe/London + * `Europe/Luxembourg` - Europe/Luxembourg + * `Europe/Madrid` - Europe/Madrid + * `Europe/Malta` - Europe/Malta + * `Europe/Mariehamn` - Europe/Mariehamn + * `Europe/Minsk` - Europe/Minsk + * `Europe/Monaco` - Europe/Monaco + * `Europe/Moscow` - Europe/Moscow + * `Europe/Oslo` - Europe/Oslo + * `Europe/Paris` - Europe/Paris + * `Europe/Podgorica` - Europe/Podgorica + * `Europe/Prague` - Europe/Prague + * `Europe/Riga` - Europe/Riga + * `Europe/Rome` - Europe/Rome + * `Europe/Samara` - Europe/Samara + * `Europe/San_Marino` - Europe/San_Marino + * `Europe/Sarajevo` - Europe/Sarajevo + * `Europe/Saratov` - Europe/Saratov + * `Europe/Simferopol` - Europe/Simferopol + * `Europe/Skopje` - Europe/Skopje + * `Europe/Sofia` - Europe/Sofia + * `Europe/Stockholm` - Europe/Stockholm + * `Europe/Tallinn` - Europe/Tallinn + * `Europe/Tirane` - Europe/Tirane + * `Europe/Ulyanovsk` - Europe/Ulyanovsk + * `Europe/Vaduz` - Europe/Vaduz + * `Europe/Vatican` - Europe/Vatican + * `Europe/Vienna` - Europe/Vienna + * `Europe/Vilnius` - Europe/Vilnius + * `Europe/Volgograd` - Europe/Volgograd + * `Europe/Warsaw` - Europe/Warsaw + * `Europe/Zagreb` - Europe/Zagreb + * `Europe/Zurich` - Europe/Zurich + * `GMT` - GMT + * `Indian/Antananarivo` - Indian/Antananarivo + * `Indian/Chagos` - Indian/Chagos + * `Indian/Christmas` - Indian/Christmas + * `Indian/Cocos` - Indian/Cocos + * `Indian/Comoro` - Indian/Comoro + * `Indian/Kerguelen` - Indian/Kerguelen + * `Indian/Mahe` - Indian/Mahe + * `Indian/Maldives` - Indian/Maldives + * `Indian/Mauritius` - Indian/Mauritius + * `Indian/Mayotte` - Indian/Mayotte + * `Indian/Reunion` - Indian/Reunion + * `Pacific/Apia` - Pacific/Apia + * `Pacific/Auckland` - Pacific/Auckland + * `Pacific/Bougainville` - Pacific/Bougainville + * `Pacific/Chatham` - Pacific/Chatham + * `Pacific/Chuuk` - Pacific/Chuuk + * `Pacific/Easter` - Pacific/Easter + * `Pacific/Efate` - Pacific/Efate + * `Pacific/Fakaofo` - Pacific/Fakaofo + * `Pacific/Fiji` - Pacific/Fiji + * `Pacific/Funafuti` - Pacific/Funafuti + * `Pacific/Galapagos` - Pacific/Galapagos + * `Pacific/Gambier` - Pacific/Gambier + * `Pacific/Guadalcanal` - Pacific/Guadalcanal + * `Pacific/Guam` - Pacific/Guam + * `Pacific/Honolulu` - Pacific/Honolulu + * `Pacific/Kanton` - Pacific/Kanton + * `Pacific/Kiritimati` - Pacific/Kiritimati + * `Pacific/Kosrae` - Pacific/Kosrae + * `Pacific/Kwajalein` - Pacific/Kwajalein + * `Pacific/Majuro` - Pacific/Majuro + * `Pacific/Marquesas` - Pacific/Marquesas + * `Pacific/Midway` - Pacific/Midway + * `Pacific/Nauru` - Pacific/Nauru + * `Pacific/Niue` - Pacific/Niue + * `Pacific/Norfolk` - Pacific/Norfolk + * `Pacific/Noumea` - Pacific/Noumea + * `Pacific/Pago_Pago` - Pacific/Pago_Pago + * `Pacific/Palau` - Pacific/Palau + * `Pacific/Pitcairn` - Pacific/Pitcairn + * `Pacific/Pohnpei` - Pacific/Pohnpei + * `Pacific/Port_Moresby` - Pacific/Port_Moresby + * `Pacific/Rarotonga` - Pacific/Rarotonga + * `Pacific/Saipan` - Pacific/Saipan + * `Pacific/Tahiti` - Pacific/Tahiti + * `Pacific/Tarawa` - Pacific/Tarawa + * `Pacific/Tongatapu` - Pacific/Tongatapu + * `Pacific/Wake` - Pacific/Wake + * `Pacific/Wallis` - Pacific/Wallis + * `UTC` - UTC + oneOf: + - $ref: '#/components/schemas/LocalTimezoneEnum' + - $ref: '#/components/schemas/BlankEnum' + - $ref: '#/components/schemas/NullEnum' + bootswatch_theme: + type: integer + nullable: true + description: Bootswatch theme for light mode + PatchedVendorRequest: + type: object + properties: + name: + type: string + legal_name: + type: string + abbreviated_name: + type: string + overview: + type: string + history: + type: string + services_provided: + type: string + vendor_type: + type: string + employee_count: + type: integer + nullable: true + revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + assets: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + fiscal_year_end: + type: string + format: date + nullable: true + partner_portal_url: + type: string + format: uri + is_competitor: + type: boolean + deal_registration_notes: + type: string + PatchedVendorSolutionRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + vendor_id: + type: integer + writeOnly: true + description: + type: string + minLength: 1 + title: Solution Information + description: Detailed solution description with URL support + url: + type: string + format: uri + maxLength: 200 + notes: + type: string + minLength: 1 + description: Additional notes about the solution + category: + type: string + maxLength: 100 + release_date: + type: string + format: date + nullable: true + end_of_life_date: + type: string + format: date + nullable: true + documentation_url: + type: string + format: uri + maxLength: 200 + PatchedWorkshopRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + date: + type: string + format: date + time: + type: string + format: time + duration: + allOf: + - $ref: '#/components/schemas/DurationEnum' + minimum: -2147483648 + maximum: 2147483647 + workshop_type: + $ref: '#/components/schemas/WorkshopTypeEnum' + participant_ids: + type: array + items: + type: integer + writeOnly: true + notes: + type: string + PotentialImpactEnum: + enum: + - Schedule + - Cost + - Quality + - Multiple + type: string + description: |- + * `Schedule` - Schedule + * `Cost` - Cost + * `Quality` - Quality + * `Multiple` - Multiple + PowerEnum: + enum: + - High + - Medium + - Low + type: string + description: |- + * `High` - High + * `Medium` - Medium + * `Low` - Low + PowerPointTemplate: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + master_slides: + readOnly: true + color_palette: + readOnly: true + is_active: + type: boolean + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - color_palette + - created_date + - id + - master_slides + - modified_date + - name + PowerPointTemplateRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + is_active: + type: boolean + required: + - name + Presentation: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + source_type: + $ref: '#/components/schemas/SourceTypeEnum' + source_id: + type: integer + maximum: 2147483647 + minimum: -2147483648 + date: + type: string + format: date + presenter: + type: integer + nullable: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - id + - modified_date + - name + - source_id + - source_type + PresentationRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + source_type: + $ref: '#/components/schemas/SourceTypeEnum' + source_id: + type: integer + maximum: 2147483647 + minimum: -2147483648 + date: + type: string + format: date + presenter: + type: integer + nullable: true + required: + - name + - source_id + - source_type + PriceLineItem: + type: object + properties: + id: + type: integer + readOnly: true + vendor_solution: + type: integer + vendor_solution_name: + type: string + readOnly: true + type: + $ref: '#/components/schemas/PriceLineItemTypeEnum' + billing_cycle: + $ref: '#/components/schemas/BillingCycleEnum' + quantity: + type: string + format: decimal + pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ + cost: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + margin: + type: string + format: decimal + pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ + unit_price: + type: string + readOnly: true + total_price: + type: string + readOnly: true + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + required: + - cost + - id + - margin + - order + - total_price + - type + - unit_price + - vendor_solution + - vendor_solution_name + PriceLineItemRequest: + type: object + properties: + vendor_solution: + type: integer + type: + $ref: '#/components/schemas/PriceLineItemTypeEnum' + billing_cycle: + $ref: '#/components/schemas/BillingCycleEnum' + quantity: + type: string + format: decimal + pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ + cost: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + margin: + type: string + format: decimal + pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + required: + - cost + - margin + - order + - type + - vendor_solution + PriceLineItemTypeEnum: + enum: + - Hardware + - Software + - Subscription + - Advisory + - Implementation + - Support + - Managed Service + type: string + description: |- + * `Hardware` - Hardware + * `Software` - Software + * `Subscription` - Subscription + * `Advisory` - Advisory + * `Implementation` - Implementation + * `Support` - Support + * `Managed Service` - Managed Service + PriceVersion: + type: object + properties: + id: + type: integer + readOnly: true + title: + type: string + maxLength: 255 + currency: + type: string + version_number: + type: integer + maximum: 2147483647 + minimum: -2147483648 + date_created: + type: string + format: date + readOnly: true + notes: + type: string + line_items: + type: string + readOnly: true + one_time_total: + type: string + readOnly: true + monthly_total: + type: string + readOnly: true + annual_total: + type: string + readOnly: true + total: + type: string + readOnly: true + required: + - annual_total + - currency + - date_created + - id + - line_items + - monthly_total + - one_time_total + - title + - total + - version_number + PriceVersionRequest: + type: object + properties: + title: + type: string + minLength: 1 + maxLength: 255 + currency: + type: string + minLength: 1 + version_number: + type: integer + maximum: 2147483647 + minimum: -2147483648 + notes: + type: string + required: + - currency + - title + - version_number + PricingTool: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + client_name: + type: string + readOnly: true + association_display: + type: string + readOnly: true + latest_version: + type: string + readOnly: true + version_count: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - association_display + - client_name + - created_date + - description + - id + - latest_version + - modified_date + - name + - version_count + PricingToolRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + required: + - description + - name + Principle: + type: object + description: Serialize all Principle fields. + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + weight: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Importance (1-10) + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + created_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - description + - id + - name + - order + PrincipleAlignment: + type: object + description: Serialize a PrincipleAlignment with nested principle on read and + writable ``principle_id`` on write. + properties: + principle: + allOf: + - $ref: '#/components/schemas/Principle' + readOnly: true + alignment_score: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Alignment score (1-5) + notes: + type: string + required: + - alignment_score + - principle + PrincipleAlignmentRequest: + type: object + description: Serialize a PrincipleAlignment with nested principle on read and + writable ``principle_id`` on write. + properties: + principle_id: + type: integer + writeOnly: true + alignment_score: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Alignment score (1-5) + notes: + type: string + required: + - alignment_score + - principle_id + PrincipleRequest: + type: object + description: Serialize all Principle fields. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + weight: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Importance (1-10) + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + required: + - description + - name + - order + Priority758Enum: + enum: + - High + - Medium + - Low + type: string + description: |- + * `High` - High + * `Medium` - Medium + * `Low` - Low + Proposal: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + opportunity: + allOf: + - $ref: '#/components/schemas/Opportunity' + readOnly: true + primary_contact: + allOf: + - $ref: '#/components/schemas/Contact' + readOnly: true + status: + $ref: '#/components/schemas/ProposalStatusEnum' + due_date: + type: string + format: date + nullable: true + submitted_date: + type: string + format: date + nullable: true + repository_url: + type: string + format: uri + maxLength: 200 + created_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - id + - name + - opportunity + - primary_contact + - status + ProposalRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + opportunity_id: + type: integer + writeOnly: true + primary_contact_id: + type: integer + writeOnly: true + nullable: true + status: + $ref: '#/components/schemas/ProposalStatusEnum' + due_date: + type: string + format: date + nullable: true + submitted_date: + type: string + format: date + nullable: true + repository_url: + type: string + format: uri + maxLength: 200 + required: + - name + - opportunity_id + - status + ProposalStatusEnum: + enum: + - Draft + - In Review + - Final + type: string + description: |- + * `Draft` - Draft + * `In Review` - In Review + * `Final` - Final + RAIDTool: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + client_name: + type: string + readOnly: true + association_display: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + risks: + type: array + items: + $ref: '#/components/schemas/Risk' + readOnly: true + assumptions: + type: array + items: + $ref: '#/components/schemas/Assumption' + readOnly: true + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + readOnly: true + dependencies: + type: array + items: + $ref: '#/components/schemas/Dependency' + readOnly: true + required: + - association_display + - assumptions + - client_name + - created_date + - dependencies + - description + - id + - issues + - modified_date + - name + - risks + Recommendation: + type: object + description: |- + Serialize a Recommendation with nested impacts, alignments, findings, and requirements. + + ``finding_ids`` and ``requirement_ids`` are write-only; on read the full nested + objects are returned under ``associated_findings`` / ``associated_requirements``. + ``timeframe`` is a computed read-only field (Short / Medium / Long) derived from + ``implementation_days`` against fixed 30- and 180-day thresholds. + properties: + id: + type: integer + readOnly: true + title: + type: string + maxLength: 255 + description: + type: string + implementation_days: + type: integer + maximum: 2147483647 + minimum: -2147483648 + timeframe: + type: string + readOnly: true + associated_findings: + type: array + items: + $ref: '#/components/schemas/Finding' + readOnly: true + associated_requirements: + type: array + items: + $ref: '#/components/schemas/Requirement' + readOnly: true + cost: + type: string + format: decimal + pattern: ^-?\d{0,10}(?:\.\d{0,2})?$ + currency: + type: string + complexity: + $ref: '#/components/schemas/ComplexityEnum' + impacts: + type: array + items: + $ref: '#/components/schemas/RecommendationImpact' + readOnly: true + alignments: + type: array + items: + $ref: '#/components/schemas/PrincipleAlignment' + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + required: + - alignments + - associated_findings + - associated_requirements + - complexity + - cost + - created_date + - currency + - description + - id + - impacts + - implementation_days + - timeframe + - title + RecommendationImpact: + type: object + description: Serialize a RecommendationImpact record (impact type, score 1–5, + and notes). + properties: + impact_type: + $ref: '#/components/schemas/ImpactTypeEnum' + impact_score: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Impact level (1-5) + notes: + type: string + required: + - impact_score + - impact_type + RecommendationImpactRequest: + type: object + description: Serialize a RecommendationImpact record (impact type, score 1–5, + and notes). + properties: + impact_type: + $ref: '#/components/schemas/ImpactTypeEnum' + impact_score: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Impact level (1-5) + notes: + type: string + required: + - impact_score + - impact_type + RecommendationRequest: + type: object + description: |- + Serialize a Recommendation with nested impacts, alignments, findings, and requirements. + + ``finding_ids`` and ``requirement_ids`` are write-only; on read the full nested + objects are returned under ``associated_findings`` / ``associated_requirements``. + ``timeframe`` is a computed read-only field (Short / Medium / Long) derived from + ``implementation_days`` against fixed 30- and 180-day thresholds. + properties: + title: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + implementation_days: + type: integer + maximum: 2147483647 + minimum: -2147483648 + finding_ids: + type: array + items: + type: integer + writeOnly: true + requirement_ids: + type: array + items: + type: integer + writeOnly: true + cost: + type: string + format: decimal + pattern: ^-?\d{0,10}(?:\.\d{0,2})?$ + currency: + type: string + minLength: 1 + complexity: + $ref: '#/components/schemas/ComplexityEnum' + required: + - complexity + - cost + - currency + - description + - implementation_days + - title + Requirement: + type: object + description: Serialize a Requirement with nested findings on read and a writable + ``related_finding_ids`` list on write. + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + type: + $ref: '#/components/schemas/RequirementTypeEnum' + category: + type: string + maxLength: 100 + success_measure: + type: string + notes: + type: string + related_findings: + type: array + items: + $ref: '#/components/schemas/Finding' + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - description + - id + - name + - related_findings + - success_measure + - type + RequirementRequest: + type: object + description: Serialize a Requirement with nested findings on read and a writable + ``related_finding_ids`` list on write. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + type: + $ref: '#/components/schemas/RequirementTypeEnum' + category: + type: string + maxLength: 100 + success_measure: + type: string + minLength: 1 + notes: + type: string + related_finding_ids: + type: array + items: + type: integer + writeOnly: true + required: + - description + - name + - success_measure + - type + RequirementTypeEnum: + enum: + - Functional + - NonFunctional + type: string + description: |- + * `Functional` - Functional + * `NonFunctional` - Non-Functional + RequirementsTool: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + client_name: + type: string + readOnly: true + association_display: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + requirements: + type: array + items: + $ref: '#/components/schemas/Requirement' + readOnly: true + required: + - association_display + - client_name + - created_date + - description + - id + - modified_date + - name + - requirements + Risk: + type: object + properties: + id: + type: integer + readOnly: true + title: + type: string + maxLength: 255 + description: + type: string + probability: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Percentage (0-100) + impact: + $ref: '#/components/schemas/ImpactEnum' + mitigation_strategy: + type: string + owner: + type: integer + owner_name: + type: string + readOnly: true + status: + $ref: '#/components/schemas/RiskStatusEnum' + due_date: + type: string + format: date + required: + - description + - due_date + - id + - impact + - mitigation_strategy + - owner + - owner_name + - probability + - status + - title + RiskStatusEnum: + enum: + - Open + - Mitigating + - Closed + - Accepted + type: string + description: |- + * `Open` - Open + * `Mitigating` - Mitigating + * `Closed` - Closed + * `Accepted` - Accepted + SectorEnum: + enum: + - Aerospace + - Agriculture + - Construction + - Defense + - Education + - Entertainment + - Finance + - Health Care + - Hospitality + - Mining + - Manufacturing + - Technology + - Transport + - Utilities + type: string + description: |- + * `Aerospace` - Aerospace + * `Agriculture` - Agriculture + * `Construction` - Construction + * `Defense` - Defense + * `Education` - Education + * `Entertainment` - Entertainment + * `Finance` - Finance + * `Health Care` - Health Care + * `Hospitality` - Hospitality + * `Mining` - Mining + * `Manufacturing` - Manufacturing + * `Technology` - Technology + * `Transport` - Transport + * `Utilities` - Utilities + SizeEnum: + enum: + - Micro + - Small + - Medium + - Large + - Enterprise + type: string + description: |- + * `Micro` - Micro + * `Small` - Small + * `Medium` - Medium + * `Large` - Large + * `Enterprise` - Enterprise + SourceEnum: + enum: + - Workshop + - Interview + - Document + - Other + type: string + description: |- + * `Workshop` - Workshop + * `Interview` - Interview + * `Document` - Document + * `Other` - Other + SourceTypeEnum: + enum: + - Proposal + - Engagement + type: string + description: |- + * `Proposal` - Proposal + * `Engagement` - Engagement + Stage: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + start_date: + type: string + format: date + end_date: + type: string + format: date + color: + type: integer + nullable: true + description: Stage color (editable in admin) + status: + $ref: '#/components/schemas/StageStatusEnum' + progress: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Completion percentage (0-100) + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + milestone: + type: integer + nullable: true + description: Optional milestone that marks the completion of this stage + duration_days: + type: string + readOnly: true + required: + - duration_days + - end_date + - id + - name + - start_date + StageEnum: + enum: + - Prospecting + - Qualification + - Workshops + - Proposal + - Negotiation + - Closed + type: string + description: |- + * `Prospecting` - Prospecting + * `Qualification` - Qualification + * `Workshops` - Workshops + * `Proposal` - Proposal + * `Negotiation` - Negotiation + * `Closed` - Closed + StageRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + start_date: + type: string + format: date + end_date: + type: string + format: date + color: + type: integer + nullable: true + description: Stage color (editable in admin) + status: + $ref: '#/components/schemas/StageStatusEnum' + progress: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Completion percentage (0-100) + order: + type: integer + maximum: 2147483647 + minimum: -2147483648 + milestone: + type: integer + nullable: true + description: Optional milestone that marks the completion of this stage + required: + - end_date + - name + - start_date + StageStatusEnum: + enum: + - not_started + - in_progress + - completed + - delayed + - on_hold + type: string + description: |- + * `not_started` - Not Started + * `in_progress` - In Progress + * `completed` - Completed + * `delayed` - Delayed + * `on_hold` - On Hold + Stakeholder: + type: object + properties: + id: + type: integer + readOnly: true + contact: + allOf: + - $ref: '#/components/schemas/Contact' + readOnly: true + contact_name: + type: string + readOnly: true + tenure: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Years in current role + solution_seek: + type: string + solution_avoid: + type: string + notes: + type: string + power: + $ref: '#/components/schemas/PowerEnum' + interest: + $ref: '#/components/schemas/InterestEnum' + required: + - contact + - contact_name + - id + StakeholderRequest: + type: object + properties: + contact_id: + type: integer + writeOnly: true + tenure: + type: integer + maximum: 2147483647 + minimum: -2147483648 + description: Years in current role + solution_seek: + type: string + solution_avoid: + type: string + notes: + type: string + power: + $ref: '#/components/schemas/PowerEnum' + interest: + $ref: '#/components/schemas/InterestEnum' + required: + - contact_id + StakeholderTool: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + stakeholders: + type: array + items: + $ref: '#/components/schemas/Stakeholder' + readOnly: true + stakeholder_count: + type: string + readOnly: true + client_name: + type: string + readOnly: true + association_display: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - association_display + - client_name + - created_date + - description + - id + - modified_date + - name + - stakeholder_count + - stakeholders + StakeholderToolRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + required: + - description + - name + Status49eEnum: + enum: + - draft + - in_progress + - complete + - delivered + type: string + description: |- + * `draft` - Draft + * `in_progress` - In Progress + * `complete` - Complete + * `delivered` - Delivered + Status557Enum: + enum: + - Planning + - In Progress + - On Hold + - Completed + - Cancelled + type: string + description: |- + * `Planning` - Planning + * `In Progress` - In Progress + * `On Hold` - On Hold + * `Completed` - Completed + * `Cancelled` - Cancelled + TEIReport: + type: object + description: Report template serializer with counts and the spec-style ``id`` + alias. + properties: + id: + type: string + readOnly: true + name: + type: string + description: Display name (e.g., 'Amazon Connect 2026'). + maxLength: 255 + vendor: + type: string + description: Technology vendor (e.g., 'AWS', 'Genesys'). + maxLength: 255 + version: + type: string + description: Model version (e.g., '1.0', '2.1'). + maxLength: 50 + description: + type: string + analysis_period_years: + type: integer + maximum: 2147483647 + minimum: 0 + description: Number of years included in NPV/ROI (1-10). + discount_rate: + type: string + format: decimal + pattern: ^-?\d{0,2}(?:\.\d{0,4})?$ + description: Annual discount rate (e.g., 0.10 = 10%). + status: + $ref: '#/components/schemas/TEIReportStatusEnum' + field_count: + type: integer + readOnly: true + instance_count: + type: integer + readOnly: true + created_at: + type: string + format: date-time + readOnly: true + updated_at: + type: string + format: date-time + readOnly: true + required: + - created_at + - field_count + - id + - instance_count + - name + - updated_at + - vendor + - version + TEIReportField: + type: object + description: Field-definition serializer. + properties: + id: + type: integer + readOnly: true + table: + $ref: '#/components/schemas/TableEnum' + field_key: + type: string + description: Machine identifier, unique within report. + maxLength: 64 + pattern: ^[-a-zA-Z0-9_]+$ + label: + type: string + maxLength: 255 + description: + type: string + field_type: + $ref: '#/components/schemas/TEIReportFieldFieldTypeEnum' + category: + type: string + maxLength: 100 + default_value: + type: string + description: Pre-populated default (stored as string, cast by calculator). + maxLength: 255 + is_annual: + type: boolean + description: If True, value is collected per year (Y1..YN); if False, a + single value. + risk_adjustment: + type: string + format: decimal + pattern: ^-?\d{0,1}(?:\.\d{0,4})?$ + nullable: true + description: Default risk adjustment (0.0-1.0); only applied to benefit + fields. + sort_order: + type: integer + maximum: 2147483647 + minimum: 0 + is_required: + type: boolean + source_notes: + type: string + created_at: + type: string + format: date-time + readOnly: true + updated_at: + type: string + format: date-time + readOnly: true + required: + - created_at + - field_key + - field_type + - id + - label + - table + - updated_at + TEIReportFieldFieldTypeEnum: + enum: + - currency + - percentage + - integer + - decimal + - text + type: string + description: |- + * `currency` - Currency + * `percentage` - Percentage + * `integer` - Integer + * `decimal` - Decimal + * `text` - Text + TEIReportFieldRequest: + type: object + description: Field-definition serializer. + properties: + table: + $ref: '#/components/schemas/TableEnum' + field_key: + type: string + minLength: 1 + description: Machine identifier, unique within report. + maxLength: 64 + pattern: ^[-a-zA-Z0-9_]+$ + label: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + field_type: + $ref: '#/components/schemas/TEIReportFieldFieldTypeEnum' + category: + type: string + maxLength: 100 + default_value: + type: string + description: Pre-populated default (stored as string, cast by calculator). + maxLength: 255 + is_annual: + type: boolean + description: If True, value is collected per year (Y1..YN); if False, a + single value. + risk_adjustment: + type: string + format: decimal + pattern: ^-?\d{0,1}(?:\.\d{0,4})?$ + nullable: true + description: Default risk adjustment (0.0-1.0); only applied to benefit + fields. + sort_order: + type: integer + maximum: 2147483647 + minimum: 0 + is_required: + type: boolean + source_notes: + type: string + required: + - field_key + - field_type + - label + - table + TEIReportRequest: + type: object + description: Report template serializer with counts and the spec-style ``id`` + alias. + properties: + name: + type: string + minLength: 1 + description: Display name (e.g., 'Amazon Connect 2026'). + maxLength: 255 + vendor: + type: string + minLength: 1 + description: Technology vendor (e.g., 'AWS', 'Genesys'). + maxLength: 255 + version: + type: string + minLength: 1 + description: Model version (e.g., '1.0', '2.1'). + maxLength: 50 + description: + type: string + analysis_period_years: + type: integer + maximum: 2147483647 + minimum: 0 + description: Number of years included in NPV/ROI (1-10). + discount_rate: + type: string + format: decimal + pattern: ^-?\d{0,2}(?:\.\d{0,4})?$ + description: Annual discount rate (e.g., 0.10 = 10%). + status: + $ref: '#/components/schemas/TEIReportStatusEnum' + required: + - name + - vendor + - version + TEIReportStatusEnum: + enum: + - draft + - active + - archived + type: string + description: |- + * `draft` - Draft + * `active` - Active + * `archived` - Archived + TEITool: + type: object + description: Read serializer for ``TEITool`` list/detail responses. + properties: + id: + type: string + readOnly: true + report: + type: object + additionalProperties: {} + readOnly: true + opportunity: + type: object + additionalProperties: {} + nullable: true + readOnly: true + engagement: + type: object + additionalProperties: {} + nullable: true + readOnly: true + name: + type: string + readOnly: true + status: + allOf: + - $ref: '#/components/schemas/Status49eEnum' + readOnly: true + current_version: + type: integer + readOnly: true + description: Highest version_number among TEIVersion snapshots; 0 means + none saved yet. + summary: + type: object + additionalProperties: {} + nullable: true + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - created_date + - current_version + - engagement + - id + - modified_date + - name + - opportunity + - report + - status + - summary + TEIToolCreate: + type: object + description: |- + Write serializer for ``POST /tools/``. + + The report is resolved by its ``public_id``; proposal/engagement are + resolved by integer PK for simplicity (matches the rest of the Athena + admin/API surface). Viewset performs the duplicate-instance check. + properties: + report: + type: string + description: Report public_id (short UUID). + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + name: + type: string + nullable: true + status: + allOf: + - $ref: '#/components/schemas/Status49eEnum' + default: draft + required: + - report + TEIToolCreateRequest: + type: object + description: |- + Write serializer for ``POST /tools/``. + + The report is resolved by its ``public_id``; proposal/engagement are + resolved by integer PK for simplicity (matches the rest of the Athena + admin/API surface). Viewset performs the duplicate-instance check. + properties: + report: + type: string + minLength: 1 + description: Report public_id (short UUID). + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + name: + type: string + nullable: true + status: + allOf: + - $ref: '#/components/schemas/Status49eEnum' + default: draft + required: + - report + TEIToolUpdate: + type: object + description: Write serializer for ``PUT /tools/{id}/`` — only name/status are + mutable. + properties: + name: + type: string + maxLength: 255 + status: + $ref: '#/components/schemas/Status49eEnum' + required: + - name + TEIToolUpdateRequest: + type: object + description: Write serializer for ``PUT /tools/{id}/`` — only name/status are + mutable. + properties: + name: + type: string + minLength: 1 + maxLength: 255 + status: + $ref: '#/components/schemas/Status49eEnum' + required: + - name + TableEnum: + enum: + - benefits + - costs + type: string + description: |- + * `benefits` - Benefits + * `costs` - Costs + TableSource: + type: object + properties: + id: + type: string + title: + type: string + type: + type: string + app: + type: string + preview: + type: string + url: + type: string + nullable: true + required: + - app + - id + - preview + - title + - type + Tag: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 50 + required: + - id + - name + TagRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 50 + required: + - name + TermYearsEnum: + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + type: integer + description: |- + * `1` - 1 Year + * `2` - 2 Years + * `3` - 3 Years + * `4` - 4 Years + * `5` - 5 Years + TimeFormatEnum: + enum: + - 12-hour + - 24-hour + type: string + description: |- + * `12-hour` - 12-hour (3:30 PM) + * `24-hour` - 24-hour (15:30) + Timeline: + type: object + properties: + id: + type: integer + readOnly: true + title: + type: string + maxLength: 255 + description: + type: string + start_date: + type: string + format: date + end_date: + type: string + readOnly: true + progress_percentage: + type: string + readOnly: true + milestones: + type: array + items: + $ref: '#/components/schemas/Milestone' + readOnly: true + stages: + type: array + items: + $ref: '#/components/schemas/Stage' + readOnly: true + required: + - end_date + - id + - milestones + - progress_percentage + - stages + - start_date + - title + TimelineRequest: + type: object + properties: + title: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + start_date: + type: string + format: date + required: + - start_date + - title + TimelineTool: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + description: + type: string + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + client_name: + type: string + readOnly: true + association_display: + type: string + readOnly: true + timelines: + type: array + items: + $ref: '#/components/schemas/Timeline' + readOnly: true + timeline_count: + type: string + readOnly: true + created_date: + type: string + format: date-time + readOnly: true + modified_date: + type: string + format: date-time + readOnly: true + required: + - association_display + - client_name + - created_date + - description + - id + - modified_date + - name + - timeline_count + - timelines + TimelineToolRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: + type: string + minLength: 1 + proposal: + type: integer + nullable: true + engagement: + type: integer + nullable: true + required: + - description + - name + UserProfile: + type: object + description: |- + User profile serializer with preference settings. + + Provides access to user-specific configuration including: + - Date and time format preferences + - Timezone settings (home and local) + - UI theme customization + properties: + date_format: + allOf: + - $ref: '#/components/schemas/DateFormatEnum' + description: |- + Preferred date display format + + * `YYYY-MM-DD` - 2024-12-25 + * `DD/MM/YYYY` - 25/12/2024 + * `MM/DD/YYYY` - 12/25/2024 + * `DD.MM.YYYY` - 25.12.2024 + * `DD-MM-YYYY` - 25-12-2024 + time_format: + allOf: + - $ref: '#/components/schemas/TimeFormatEnum' + description: |- + 12-hour or 24-hour time format + + * `12-hour` - 12-hour (3:30 PM) + * `24-hour` - 24-hour (15:30) + home_timezone: + allOf: + - $ref: '#/components/schemas/HomeTimezoneEnum' + description: |- + User's home/permanent timezone + + * `Africa/Abidjan` - Africa/Abidjan + * `Africa/Accra` - Africa/Accra + * `Africa/Addis_Ababa` - Africa/Addis_Ababa + * `Africa/Algiers` - Africa/Algiers + * `Africa/Asmara` - Africa/Asmara + * `Africa/Bamako` - Africa/Bamako + * `Africa/Bangui` - Africa/Bangui + * `Africa/Banjul` - Africa/Banjul + * `Africa/Bissau` - Africa/Bissau + * `Africa/Blantyre` - Africa/Blantyre + * `Africa/Brazzaville` - Africa/Brazzaville + * `Africa/Bujumbura` - Africa/Bujumbura + * `Africa/Cairo` - Africa/Cairo + * `Africa/Casablanca` - Africa/Casablanca + * `Africa/Ceuta` - Africa/Ceuta + * `Africa/Conakry` - Africa/Conakry + * `Africa/Dakar` - Africa/Dakar + * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam + * `Africa/Djibouti` - Africa/Djibouti + * `Africa/Douala` - Africa/Douala + * `Africa/El_Aaiun` - Africa/El_Aaiun + * `Africa/Freetown` - Africa/Freetown + * `Africa/Gaborone` - Africa/Gaborone + * `Africa/Harare` - Africa/Harare + * `Africa/Johannesburg` - Africa/Johannesburg + * `Africa/Juba` - Africa/Juba + * `Africa/Kampala` - Africa/Kampala + * `Africa/Khartoum` - Africa/Khartoum + * `Africa/Kigali` - Africa/Kigali + * `Africa/Kinshasa` - Africa/Kinshasa + * `Africa/Lagos` - Africa/Lagos + * `Africa/Libreville` - Africa/Libreville + * `Africa/Lome` - Africa/Lome + * `Africa/Luanda` - Africa/Luanda + * `Africa/Lubumbashi` - Africa/Lubumbashi + * `Africa/Lusaka` - Africa/Lusaka + * `Africa/Malabo` - Africa/Malabo + * `Africa/Maputo` - Africa/Maputo + * `Africa/Maseru` - Africa/Maseru + * `Africa/Mbabane` - Africa/Mbabane + * `Africa/Mogadishu` - Africa/Mogadishu + * `Africa/Monrovia` - Africa/Monrovia + * `Africa/Nairobi` - Africa/Nairobi + * `Africa/Ndjamena` - Africa/Ndjamena + * `Africa/Niamey` - Africa/Niamey + * `Africa/Nouakchott` - Africa/Nouakchott + * `Africa/Ouagadougou` - Africa/Ouagadougou + * `Africa/Porto-Novo` - Africa/Porto-Novo + * `Africa/Sao_Tome` - Africa/Sao_Tome + * `Africa/Tripoli` - Africa/Tripoli + * `Africa/Tunis` - Africa/Tunis + * `Africa/Windhoek` - Africa/Windhoek + * `America/Adak` - America/Adak + * `America/Anchorage` - America/Anchorage + * `America/Anguilla` - America/Anguilla + * `America/Antigua` - America/Antigua + * `America/Araguaina` - America/Araguaina + * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires + * `America/Argentina/Catamarca` - America/Argentina/Catamarca + * `America/Argentina/Cordoba` - America/Argentina/Cordoba + * `America/Argentina/Jujuy` - America/Argentina/Jujuy + * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja + * `America/Argentina/Mendoza` - America/Argentina/Mendoza + * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos + * `America/Argentina/Salta` - America/Argentina/Salta + * `America/Argentina/San_Juan` - America/Argentina/San_Juan + * `America/Argentina/San_Luis` - America/Argentina/San_Luis + * `America/Argentina/Tucuman` - America/Argentina/Tucuman + * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia + * `America/Aruba` - America/Aruba + * `America/Asuncion` - America/Asuncion + * `America/Atikokan` - America/Atikokan + * `America/Bahia` - America/Bahia + * `America/Bahia_Banderas` - America/Bahia_Banderas + * `America/Barbados` - America/Barbados + * `America/Belem` - America/Belem + * `America/Belize` - America/Belize + * `America/Blanc-Sablon` - America/Blanc-Sablon + * `America/Boa_Vista` - America/Boa_Vista + * `America/Bogota` - America/Bogota + * `America/Boise` - America/Boise + * `America/Cambridge_Bay` - America/Cambridge_Bay + * `America/Campo_Grande` - America/Campo_Grande + * `America/Cancun` - America/Cancun + * `America/Caracas` - America/Caracas + * `America/Cayenne` - America/Cayenne + * `America/Cayman` - America/Cayman + * `America/Chicago` - America/Chicago + * `America/Chihuahua` - America/Chihuahua + * `America/Ciudad_Juarez` - America/Ciudad_Juarez + * `America/Costa_Rica` - America/Costa_Rica + * `America/Coyhaique` - America/Coyhaique + * `America/Creston` - America/Creston + * `America/Cuiaba` - America/Cuiaba + * `America/Curacao` - America/Curacao + * `America/Danmarkshavn` - America/Danmarkshavn + * `America/Dawson` - America/Dawson + * `America/Dawson_Creek` - America/Dawson_Creek + * `America/Denver` - America/Denver + * `America/Detroit` - America/Detroit + * `America/Dominica` - America/Dominica + * `America/Edmonton` - America/Edmonton + * `America/Eirunepe` - America/Eirunepe + * `America/El_Salvador` - America/El_Salvador + * `America/Fort_Nelson` - America/Fort_Nelson + * `America/Fortaleza` - America/Fortaleza + * `America/Glace_Bay` - America/Glace_Bay + * `America/Goose_Bay` - America/Goose_Bay + * `America/Grand_Turk` - America/Grand_Turk + * `America/Grenada` - America/Grenada + * `America/Guadeloupe` - America/Guadeloupe + * `America/Guatemala` - America/Guatemala + * `America/Guayaquil` - America/Guayaquil + * `America/Guyana` - America/Guyana + * `America/Halifax` - America/Halifax + * `America/Havana` - America/Havana + * `America/Hermosillo` - America/Hermosillo + * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis + * `America/Indiana/Knox` - America/Indiana/Knox + * `America/Indiana/Marengo` - America/Indiana/Marengo + * `America/Indiana/Petersburg` - America/Indiana/Petersburg + * `America/Indiana/Tell_City` - America/Indiana/Tell_City + * `America/Indiana/Vevay` - America/Indiana/Vevay + * `America/Indiana/Vincennes` - America/Indiana/Vincennes + * `America/Indiana/Winamac` - America/Indiana/Winamac + * `America/Inuvik` - America/Inuvik + * `America/Iqaluit` - America/Iqaluit + * `America/Jamaica` - America/Jamaica + * `America/Juneau` - America/Juneau + * `America/Kentucky/Louisville` - America/Kentucky/Louisville + * `America/Kentucky/Monticello` - America/Kentucky/Monticello + * `America/Kralendijk` - America/Kralendijk + * `America/La_Paz` - America/La_Paz + * `America/Lima` - America/Lima + * `America/Los_Angeles` - America/Los_Angeles + * `America/Lower_Princes` - America/Lower_Princes + * `America/Maceio` - America/Maceio + * `America/Managua` - America/Managua + * `America/Manaus` - America/Manaus + * `America/Marigot` - America/Marigot + * `America/Martinique` - America/Martinique + * `America/Matamoros` - America/Matamoros + * `America/Mazatlan` - America/Mazatlan + * `America/Menominee` - America/Menominee + * `America/Merida` - America/Merida + * `America/Metlakatla` - America/Metlakatla + * `America/Mexico_City` - America/Mexico_City + * `America/Miquelon` - America/Miquelon + * `America/Moncton` - America/Moncton + * `America/Monterrey` - America/Monterrey + * `America/Montevideo` - America/Montevideo + * `America/Montserrat` - America/Montserrat + * `America/Nassau` - America/Nassau + * `America/New_York` - America/New_York + * `America/Nome` - America/Nome + * `America/Noronha` - America/Noronha + * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah + * `America/North_Dakota/Center` - America/North_Dakota/Center + * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem + * `America/Nuuk` - America/Nuuk + * `America/Ojinaga` - America/Ojinaga + * `America/Panama` - America/Panama + * `America/Paramaribo` - America/Paramaribo + * `America/Phoenix` - America/Phoenix + * `America/Port-au-Prince` - America/Port-au-Prince + * `America/Port_of_Spain` - America/Port_of_Spain + * `America/Porto_Velho` - America/Porto_Velho + * `America/Puerto_Rico` - America/Puerto_Rico + * `America/Punta_Arenas` - America/Punta_Arenas + * `America/Rankin_Inlet` - America/Rankin_Inlet + * `America/Recife` - America/Recife + * `America/Regina` - America/Regina + * `America/Resolute` - America/Resolute + * `America/Rio_Branco` - America/Rio_Branco + * `America/Santarem` - America/Santarem + * `America/Santiago` - America/Santiago + * `America/Santo_Domingo` - America/Santo_Domingo + * `America/Sao_Paulo` - America/Sao_Paulo + * `America/Scoresbysund` - America/Scoresbysund + * `America/Sitka` - America/Sitka + * `America/St_Barthelemy` - America/St_Barthelemy + * `America/St_Johns` - America/St_Johns + * `America/St_Kitts` - America/St_Kitts + * `America/St_Lucia` - America/St_Lucia + * `America/St_Thomas` - America/St_Thomas + * `America/St_Vincent` - America/St_Vincent + * `America/Swift_Current` - America/Swift_Current + * `America/Tegucigalpa` - America/Tegucigalpa + * `America/Thule` - America/Thule + * `America/Tijuana` - America/Tijuana + * `America/Toronto` - America/Toronto + * `America/Tortola` - America/Tortola + * `America/Vancouver` - America/Vancouver + * `America/Whitehorse` - America/Whitehorse + * `America/Winnipeg` - America/Winnipeg + * `America/Yakutat` - America/Yakutat + * `Antarctica/Casey` - Antarctica/Casey + * `Antarctica/Davis` - Antarctica/Davis + * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville + * `Antarctica/Macquarie` - Antarctica/Macquarie + * `Antarctica/Mawson` - Antarctica/Mawson + * `Antarctica/McMurdo` - Antarctica/McMurdo + * `Antarctica/Palmer` - Antarctica/Palmer + * `Antarctica/Rothera` - Antarctica/Rothera + * `Antarctica/Syowa` - Antarctica/Syowa + * `Antarctica/Troll` - Antarctica/Troll + * `Antarctica/Vostok` - Antarctica/Vostok + * `Arctic/Longyearbyen` - Arctic/Longyearbyen + * `Asia/Aden` - Asia/Aden + * `Asia/Almaty` - Asia/Almaty + * `Asia/Amman` - Asia/Amman + * `Asia/Anadyr` - Asia/Anadyr + * `Asia/Aqtau` - Asia/Aqtau + * `Asia/Aqtobe` - Asia/Aqtobe + * `Asia/Ashgabat` - Asia/Ashgabat + * `Asia/Atyrau` - Asia/Atyrau + * `Asia/Baghdad` - Asia/Baghdad + * `Asia/Bahrain` - Asia/Bahrain + * `Asia/Baku` - Asia/Baku + * `Asia/Bangkok` - Asia/Bangkok + * `Asia/Barnaul` - Asia/Barnaul + * `Asia/Beirut` - Asia/Beirut + * `Asia/Bishkek` - Asia/Bishkek + * `Asia/Brunei` - Asia/Brunei + * `Asia/Chita` - Asia/Chita + * `Asia/Colombo` - Asia/Colombo + * `Asia/Damascus` - Asia/Damascus + * `Asia/Dhaka` - Asia/Dhaka + * `Asia/Dili` - Asia/Dili + * `Asia/Dubai` - Asia/Dubai + * `Asia/Dushanbe` - Asia/Dushanbe + * `Asia/Famagusta` - Asia/Famagusta + * `Asia/Gaza` - Asia/Gaza + * `Asia/Hebron` - Asia/Hebron + * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh + * `Asia/Hong_Kong` - Asia/Hong_Kong + * `Asia/Hovd` - Asia/Hovd + * `Asia/Irkutsk` - Asia/Irkutsk + * `Asia/Jakarta` - Asia/Jakarta + * `Asia/Jayapura` - Asia/Jayapura + * `Asia/Jerusalem` - Asia/Jerusalem + * `Asia/Kabul` - Asia/Kabul + * `Asia/Kamchatka` - Asia/Kamchatka + * `Asia/Karachi` - Asia/Karachi + * `Asia/Kathmandu` - Asia/Kathmandu + * `Asia/Khandyga` - Asia/Khandyga + * `Asia/Kolkata` - Asia/Kolkata + * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk + * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur + * `Asia/Kuching` - Asia/Kuching + * `Asia/Kuwait` - Asia/Kuwait + * `Asia/Macau` - Asia/Macau + * `Asia/Magadan` - Asia/Magadan + * `Asia/Makassar` - Asia/Makassar + * `Asia/Manila` - Asia/Manila + * `Asia/Muscat` - Asia/Muscat + * `Asia/Nicosia` - Asia/Nicosia + * `Asia/Novokuznetsk` - Asia/Novokuznetsk + * `Asia/Novosibirsk` - Asia/Novosibirsk + * `Asia/Omsk` - Asia/Omsk + * `Asia/Oral` - Asia/Oral + * `Asia/Phnom_Penh` - Asia/Phnom_Penh + * `Asia/Pontianak` - Asia/Pontianak + * `Asia/Pyongyang` - Asia/Pyongyang + * `Asia/Qatar` - Asia/Qatar + * `Asia/Qostanay` - Asia/Qostanay + * `Asia/Qyzylorda` - Asia/Qyzylorda + * `Asia/Riyadh` - Asia/Riyadh + * `Asia/Sakhalin` - Asia/Sakhalin + * `Asia/Samarkand` - Asia/Samarkand + * `Asia/Seoul` - Asia/Seoul + * `Asia/Shanghai` - Asia/Shanghai + * `Asia/Singapore` - Asia/Singapore + * `Asia/Srednekolymsk` - Asia/Srednekolymsk + * `Asia/Taipei` - Asia/Taipei + * `Asia/Tashkent` - Asia/Tashkent + * `Asia/Tbilisi` - Asia/Tbilisi + * `Asia/Tehran` - Asia/Tehran + * `Asia/Thimphu` - Asia/Thimphu + * `Asia/Tokyo` - Asia/Tokyo + * `Asia/Tomsk` - Asia/Tomsk + * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar + * `Asia/Urumqi` - Asia/Urumqi + * `Asia/Ust-Nera` - Asia/Ust-Nera + * `Asia/Vientiane` - Asia/Vientiane + * `Asia/Vladivostok` - Asia/Vladivostok + * `Asia/Yakutsk` - Asia/Yakutsk + * `Asia/Yangon` - Asia/Yangon + * `Asia/Yekaterinburg` - Asia/Yekaterinburg + * `Asia/Yerevan` - Asia/Yerevan + * `Atlantic/Azores` - Atlantic/Azores + * `Atlantic/Bermuda` - Atlantic/Bermuda + * `Atlantic/Canary` - Atlantic/Canary + * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde + * `Atlantic/Faroe` - Atlantic/Faroe + * `Atlantic/Madeira` - Atlantic/Madeira + * `Atlantic/Reykjavik` - Atlantic/Reykjavik + * `Atlantic/South_Georgia` - Atlantic/South_Georgia + * `Atlantic/St_Helena` - Atlantic/St_Helena + * `Atlantic/Stanley` - Atlantic/Stanley + * `Australia/Adelaide` - Australia/Adelaide + * `Australia/Brisbane` - Australia/Brisbane + * `Australia/Broken_Hill` - Australia/Broken_Hill + * `Australia/Darwin` - Australia/Darwin + * `Australia/Eucla` - Australia/Eucla + * `Australia/Hobart` - Australia/Hobart + * `Australia/Lindeman` - Australia/Lindeman + * `Australia/Lord_Howe` - Australia/Lord_Howe + * `Australia/Melbourne` - Australia/Melbourne + * `Australia/Perth` - Australia/Perth + * `Australia/Sydney` - Australia/Sydney + * `Europe/Amsterdam` - Europe/Amsterdam + * `Europe/Andorra` - Europe/Andorra + * `Europe/Astrakhan` - Europe/Astrakhan + * `Europe/Athens` - Europe/Athens + * `Europe/Belgrade` - Europe/Belgrade + * `Europe/Berlin` - Europe/Berlin + * `Europe/Bratislava` - Europe/Bratislava + * `Europe/Brussels` - Europe/Brussels + * `Europe/Bucharest` - Europe/Bucharest + * `Europe/Budapest` - Europe/Budapest + * `Europe/Busingen` - Europe/Busingen + * `Europe/Chisinau` - Europe/Chisinau + * `Europe/Copenhagen` - Europe/Copenhagen + * `Europe/Dublin` - Europe/Dublin + * `Europe/Gibraltar` - Europe/Gibraltar + * `Europe/Guernsey` - Europe/Guernsey + * `Europe/Helsinki` - Europe/Helsinki + * `Europe/Isle_of_Man` - Europe/Isle_of_Man + * `Europe/Istanbul` - Europe/Istanbul + * `Europe/Jersey` - Europe/Jersey + * `Europe/Kaliningrad` - Europe/Kaliningrad + * `Europe/Kirov` - Europe/Kirov + * `Europe/Kyiv` - Europe/Kyiv + * `Europe/Lisbon` - Europe/Lisbon + * `Europe/Ljubljana` - Europe/Ljubljana + * `Europe/London` - Europe/London + * `Europe/Luxembourg` - Europe/Luxembourg + * `Europe/Madrid` - Europe/Madrid + * `Europe/Malta` - Europe/Malta + * `Europe/Mariehamn` - Europe/Mariehamn + * `Europe/Minsk` - Europe/Minsk + * `Europe/Monaco` - Europe/Monaco + * `Europe/Moscow` - Europe/Moscow + * `Europe/Oslo` - Europe/Oslo + * `Europe/Paris` - Europe/Paris + * `Europe/Podgorica` - Europe/Podgorica + * `Europe/Prague` - Europe/Prague + * `Europe/Riga` - Europe/Riga + * `Europe/Rome` - Europe/Rome + * `Europe/Samara` - Europe/Samara + * `Europe/San_Marino` - Europe/San_Marino + * `Europe/Sarajevo` - Europe/Sarajevo + * `Europe/Saratov` - Europe/Saratov + * `Europe/Simferopol` - Europe/Simferopol + * `Europe/Skopje` - Europe/Skopje + * `Europe/Sofia` - Europe/Sofia + * `Europe/Stockholm` - Europe/Stockholm + * `Europe/Tallinn` - Europe/Tallinn + * `Europe/Tirane` - Europe/Tirane + * `Europe/Ulyanovsk` - Europe/Ulyanovsk + * `Europe/Vaduz` - Europe/Vaduz + * `Europe/Vatican` - Europe/Vatican + * `Europe/Vienna` - Europe/Vienna + * `Europe/Vilnius` - Europe/Vilnius + * `Europe/Volgograd` - Europe/Volgograd + * `Europe/Warsaw` - Europe/Warsaw + * `Europe/Zagreb` - Europe/Zagreb + * `Europe/Zurich` - Europe/Zurich + * `GMT` - GMT + * `Indian/Antananarivo` - Indian/Antananarivo + * `Indian/Chagos` - Indian/Chagos + * `Indian/Christmas` - Indian/Christmas + * `Indian/Cocos` - Indian/Cocos + * `Indian/Comoro` - Indian/Comoro + * `Indian/Kerguelen` - Indian/Kerguelen + * `Indian/Mahe` - Indian/Mahe + * `Indian/Maldives` - Indian/Maldives + * `Indian/Mauritius` - Indian/Mauritius + * `Indian/Mayotte` - Indian/Mayotte + * `Indian/Reunion` - Indian/Reunion + * `Pacific/Apia` - Pacific/Apia + * `Pacific/Auckland` - Pacific/Auckland + * `Pacific/Bougainville` - Pacific/Bougainville + * `Pacific/Chatham` - Pacific/Chatham + * `Pacific/Chuuk` - Pacific/Chuuk + * `Pacific/Easter` - Pacific/Easter + * `Pacific/Efate` - Pacific/Efate + * `Pacific/Fakaofo` - Pacific/Fakaofo + * `Pacific/Fiji` - Pacific/Fiji + * `Pacific/Funafuti` - Pacific/Funafuti + * `Pacific/Galapagos` - Pacific/Galapagos + * `Pacific/Gambier` - Pacific/Gambier + * `Pacific/Guadalcanal` - Pacific/Guadalcanal + * `Pacific/Guam` - Pacific/Guam + * `Pacific/Honolulu` - Pacific/Honolulu + * `Pacific/Kanton` - Pacific/Kanton + * `Pacific/Kiritimati` - Pacific/Kiritimati + * `Pacific/Kosrae` - Pacific/Kosrae + * `Pacific/Kwajalein` - Pacific/Kwajalein + * `Pacific/Majuro` - Pacific/Majuro + * `Pacific/Marquesas` - Pacific/Marquesas + * `Pacific/Midway` - Pacific/Midway + * `Pacific/Nauru` - Pacific/Nauru + * `Pacific/Niue` - Pacific/Niue + * `Pacific/Norfolk` - Pacific/Norfolk + * `Pacific/Noumea` - Pacific/Noumea + * `Pacific/Pago_Pago` - Pacific/Pago_Pago + * `Pacific/Palau` - Pacific/Palau + * `Pacific/Pitcairn` - Pacific/Pitcairn + * `Pacific/Pohnpei` - Pacific/Pohnpei + * `Pacific/Port_Moresby` - Pacific/Port_Moresby + * `Pacific/Rarotonga` - Pacific/Rarotonga + * `Pacific/Saipan` - Pacific/Saipan + * `Pacific/Tahiti` - Pacific/Tahiti + * `Pacific/Tarawa` - Pacific/Tarawa + * `Pacific/Tongatapu` - Pacific/Tongatapu + * `Pacific/Wake` - Pacific/Wake + * `Pacific/Wallis` - Pacific/Wallis + * `UTC` - UTC + local_timezone: + nullable: true + description: |- + User's current local timezone (if traveling) + + * `Africa/Abidjan` - Africa/Abidjan + * `Africa/Accra` - Africa/Accra + * `Africa/Addis_Ababa` - Africa/Addis_Ababa + * `Africa/Algiers` - Africa/Algiers + * `Africa/Asmara` - Africa/Asmara + * `Africa/Bamako` - Africa/Bamako + * `Africa/Bangui` - Africa/Bangui + * `Africa/Banjul` - Africa/Banjul + * `Africa/Bissau` - Africa/Bissau + * `Africa/Blantyre` - Africa/Blantyre + * `Africa/Brazzaville` - Africa/Brazzaville + * `Africa/Bujumbura` - Africa/Bujumbura + * `Africa/Cairo` - Africa/Cairo + * `Africa/Casablanca` - Africa/Casablanca + * `Africa/Ceuta` - Africa/Ceuta + * `Africa/Conakry` - Africa/Conakry + * `Africa/Dakar` - Africa/Dakar + * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam + * `Africa/Djibouti` - Africa/Djibouti + * `Africa/Douala` - Africa/Douala + * `Africa/El_Aaiun` - Africa/El_Aaiun + * `Africa/Freetown` - Africa/Freetown + * `Africa/Gaborone` - Africa/Gaborone + * `Africa/Harare` - Africa/Harare + * `Africa/Johannesburg` - Africa/Johannesburg + * `Africa/Juba` - Africa/Juba + * `Africa/Kampala` - Africa/Kampala + * `Africa/Khartoum` - Africa/Khartoum + * `Africa/Kigali` - Africa/Kigali + * `Africa/Kinshasa` - Africa/Kinshasa + * `Africa/Lagos` - Africa/Lagos + * `Africa/Libreville` - Africa/Libreville + * `Africa/Lome` - Africa/Lome + * `Africa/Luanda` - Africa/Luanda + * `Africa/Lubumbashi` - Africa/Lubumbashi + * `Africa/Lusaka` - Africa/Lusaka + * `Africa/Malabo` - Africa/Malabo + * `Africa/Maputo` - Africa/Maputo + * `Africa/Maseru` - Africa/Maseru + * `Africa/Mbabane` - Africa/Mbabane + * `Africa/Mogadishu` - Africa/Mogadishu + * `Africa/Monrovia` - Africa/Monrovia + * `Africa/Nairobi` - Africa/Nairobi + * `Africa/Ndjamena` - Africa/Ndjamena + * `Africa/Niamey` - Africa/Niamey + * `Africa/Nouakchott` - Africa/Nouakchott + * `Africa/Ouagadougou` - Africa/Ouagadougou + * `Africa/Porto-Novo` - Africa/Porto-Novo + * `Africa/Sao_Tome` - Africa/Sao_Tome + * `Africa/Tripoli` - Africa/Tripoli + * `Africa/Tunis` - Africa/Tunis + * `Africa/Windhoek` - Africa/Windhoek + * `America/Adak` - America/Adak + * `America/Anchorage` - America/Anchorage + * `America/Anguilla` - America/Anguilla + * `America/Antigua` - America/Antigua + * `America/Araguaina` - America/Araguaina + * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires + * `America/Argentina/Catamarca` - America/Argentina/Catamarca + * `America/Argentina/Cordoba` - America/Argentina/Cordoba + * `America/Argentina/Jujuy` - America/Argentina/Jujuy + * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja + * `America/Argentina/Mendoza` - America/Argentina/Mendoza + * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos + * `America/Argentina/Salta` - America/Argentina/Salta + * `America/Argentina/San_Juan` - America/Argentina/San_Juan + * `America/Argentina/San_Luis` - America/Argentina/San_Luis + * `America/Argentina/Tucuman` - America/Argentina/Tucuman + * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia + * `America/Aruba` - America/Aruba + * `America/Asuncion` - America/Asuncion + * `America/Atikokan` - America/Atikokan + * `America/Bahia` - America/Bahia + * `America/Bahia_Banderas` - America/Bahia_Banderas + * `America/Barbados` - America/Barbados + * `America/Belem` - America/Belem + * `America/Belize` - America/Belize + * `America/Blanc-Sablon` - America/Blanc-Sablon + * `America/Boa_Vista` - America/Boa_Vista + * `America/Bogota` - America/Bogota + * `America/Boise` - America/Boise + * `America/Cambridge_Bay` - America/Cambridge_Bay + * `America/Campo_Grande` - America/Campo_Grande + * `America/Cancun` - America/Cancun + * `America/Caracas` - America/Caracas + * `America/Cayenne` - America/Cayenne + * `America/Cayman` - America/Cayman + * `America/Chicago` - America/Chicago + * `America/Chihuahua` - America/Chihuahua + * `America/Ciudad_Juarez` - America/Ciudad_Juarez + * `America/Costa_Rica` - America/Costa_Rica + * `America/Coyhaique` - America/Coyhaique + * `America/Creston` - America/Creston + * `America/Cuiaba` - America/Cuiaba + * `America/Curacao` - America/Curacao + * `America/Danmarkshavn` - America/Danmarkshavn + * `America/Dawson` - America/Dawson + * `America/Dawson_Creek` - America/Dawson_Creek + * `America/Denver` - America/Denver + * `America/Detroit` - America/Detroit + * `America/Dominica` - America/Dominica + * `America/Edmonton` - America/Edmonton + * `America/Eirunepe` - America/Eirunepe + * `America/El_Salvador` - America/El_Salvador + * `America/Fort_Nelson` - America/Fort_Nelson + * `America/Fortaleza` - America/Fortaleza + * `America/Glace_Bay` - America/Glace_Bay + * `America/Goose_Bay` - America/Goose_Bay + * `America/Grand_Turk` - America/Grand_Turk + * `America/Grenada` - America/Grenada + * `America/Guadeloupe` - America/Guadeloupe + * `America/Guatemala` - America/Guatemala + * `America/Guayaquil` - America/Guayaquil + * `America/Guyana` - America/Guyana + * `America/Halifax` - America/Halifax + * `America/Havana` - America/Havana + * `America/Hermosillo` - America/Hermosillo + * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis + * `America/Indiana/Knox` - America/Indiana/Knox + * `America/Indiana/Marengo` - America/Indiana/Marengo + * `America/Indiana/Petersburg` - America/Indiana/Petersburg + * `America/Indiana/Tell_City` - America/Indiana/Tell_City + * `America/Indiana/Vevay` - America/Indiana/Vevay + * `America/Indiana/Vincennes` - America/Indiana/Vincennes + * `America/Indiana/Winamac` - America/Indiana/Winamac + * `America/Inuvik` - America/Inuvik + * `America/Iqaluit` - America/Iqaluit + * `America/Jamaica` - America/Jamaica + * `America/Juneau` - America/Juneau + * `America/Kentucky/Louisville` - America/Kentucky/Louisville + * `America/Kentucky/Monticello` - America/Kentucky/Monticello + * `America/Kralendijk` - America/Kralendijk + * `America/La_Paz` - America/La_Paz + * `America/Lima` - America/Lima + * `America/Los_Angeles` - America/Los_Angeles + * `America/Lower_Princes` - America/Lower_Princes + * `America/Maceio` - America/Maceio + * `America/Managua` - America/Managua + * `America/Manaus` - America/Manaus + * `America/Marigot` - America/Marigot + * `America/Martinique` - America/Martinique + * `America/Matamoros` - America/Matamoros + * `America/Mazatlan` - America/Mazatlan + * `America/Menominee` - America/Menominee + * `America/Merida` - America/Merida + * `America/Metlakatla` - America/Metlakatla + * `America/Mexico_City` - America/Mexico_City + * `America/Miquelon` - America/Miquelon + * `America/Moncton` - America/Moncton + * `America/Monterrey` - America/Monterrey + * `America/Montevideo` - America/Montevideo + * `America/Montserrat` - America/Montserrat + * `America/Nassau` - America/Nassau + * `America/New_York` - America/New_York + * `America/Nome` - America/Nome + * `America/Noronha` - America/Noronha + * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah + * `America/North_Dakota/Center` - America/North_Dakota/Center + * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem + * `America/Nuuk` - America/Nuuk + * `America/Ojinaga` - America/Ojinaga + * `America/Panama` - America/Panama + * `America/Paramaribo` - America/Paramaribo + * `America/Phoenix` - America/Phoenix + * `America/Port-au-Prince` - America/Port-au-Prince + * `America/Port_of_Spain` - America/Port_of_Spain + * `America/Porto_Velho` - America/Porto_Velho + * `America/Puerto_Rico` - America/Puerto_Rico + * `America/Punta_Arenas` - America/Punta_Arenas + * `America/Rankin_Inlet` - America/Rankin_Inlet + * `America/Recife` - America/Recife + * `America/Regina` - America/Regina + * `America/Resolute` - America/Resolute + * `America/Rio_Branco` - America/Rio_Branco + * `America/Santarem` - America/Santarem + * `America/Santiago` - America/Santiago + * `America/Santo_Domingo` - America/Santo_Domingo + * `America/Sao_Paulo` - America/Sao_Paulo + * `America/Scoresbysund` - America/Scoresbysund + * `America/Sitka` - America/Sitka + * `America/St_Barthelemy` - America/St_Barthelemy + * `America/St_Johns` - America/St_Johns + * `America/St_Kitts` - America/St_Kitts + * `America/St_Lucia` - America/St_Lucia + * `America/St_Thomas` - America/St_Thomas + * `America/St_Vincent` - America/St_Vincent + * `America/Swift_Current` - America/Swift_Current + * `America/Tegucigalpa` - America/Tegucigalpa + * `America/Thule` - America/Thule + * `America/Tijuana` - America/Tijuana + * `America/Toronto` - America/Toronto + * `America/Tortola` - America/Tortola + * `America/Vancouver` - America/Vancouver + * `America/Whitehorse` - America/Whitehorse + * `America/Winnipeg` - America/Winnipeg + * `America/Yakutat` - America/Yakutat + * `Antarctica/Casey` - Antarctica/Casey + * `Antarctica/Davis` - Antarctica/Davis + * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville + * `Antarctica/Macquarie` - Antarctica/Macquarie + * `Antarctica/Mawson` - Antarctica/Mawson + * `Antarctica/McMurdo` - Antarctica/McMurdo + * `Antarctica/Palmer` - Antarctica/Palmer + * `Antarctica/Rothera` - Antarctica/Rothera + * `Antarctica/Syowa` - Antarctica/Syowa + * `Antarctica/Troll` - Antarctica/Troll + * `Antarctica/Vostok` - Antarctica/Vostok + * `Arctic/Longyearbyen` - Arctic/Longyearbyen + * `Asia/Aden` - Asia/Aden + * `Asia/Almaty` - Asia/Almaty + * `Asia/Amman` - Asia/Amman + * `Asia/Anadyr` - Asia/Anadyr + * `Asia/Aqtau` - Asia/Aqtau + * `Asia/Aqtobe` - Asia/Aqtobe + * `Asia/Ashgabat` - Asia/Ashgabat + * `Asia/Atyrau` - Asia/Atyrau + * `Asia/Baghdad` - Asia/Baghdad + * `Asia/Bahrain` - Asia/Bahrain + * `Asia/Baku` - Asia/Baku + * `Asia/Bangkok` - Asia/Bangkok + * `Asia/Barnaul` - Asia/Barnaul + * `Asia/Beirut` - Asia/Beirut + * `Asia/Bishkek` - Asia/Bishkek + * `Asia/Brunei` - Asia/Brunei + * `Asia/Chita` - Asia/Chita + * `Asia/Colombo` - Asia/Colombo + * `Asia/Damascus` - Asia/Damascus + * `Asia/Dhaka` - Asia/Dhaka + * `Asia/Dili` - Asia/Dili + * `Asia/Dubai` - Asia/Dubai + * `Asia/Dushanbe` - Asia/Dushanbe + * `Asia/Famagusta` - Asia/Famagusta + * `Asia/Gaza` - Asia/Gaza + * `Asia/Hebron` - Asia/Hebron + * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh + * `Asia/Hong_Kong` - Asia/Hong_Kong + * `Asia/Hovd` - Asia/Hovd + * `Asia/Irkutsk` - Asia/Irkutsk + * `Asia/Jakarta` - Asia/Jakarta + * `Asia/Jayapura` - Asia/Jayapura + * `Asia/Jerusalem` - Asia/Jerusalem + * `Asia/Kabul` - Asia/Kabul + * `Asia/Kamchatka` - Asia/Kamchatka + * `Asia/Karachi` - Asia/Karachi + * `Asia/Kathmandu` - Asia/Kathmandu + * `Asia/Khandyga` - Asia/Khandyga + * `Asia/Kolkata` - Asia/Kolkata + * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk + * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur + * `Asia/Kuching` - Asia/Kuching + * `Asia/Kuwait` - Asia/Kuwait + * `Asia/Macau` - Asia/Macau + * `Asia/Magadan` - Asia/Magadan + * `Asia/Makassar` - Asia/Makassar + * `Asia/Manila` - Asia/Manila + * `Asia/Muscat` - Asia/Muscat + * `Asia/Nicosia` - Asia/Nicosia + * `Asia/Novokuznetsk` - Asia/Novokuznetsk + * `Asia/Novosibirsk` - Asia/Novosibirsk + * `Asia/Omsk` - Asia/Omsk + * `Asia/Oral` - Asia/Oral + * `Asia/Phnom_Penh` - Asia/Phnom_Penh + * `Asia/Pontianak` - Asia/Pontianak + * `Asia/Pyongyang` - Asia/Pyongyang + * `Asia/Qatar` - Asia/Qatar + * `Asia/Qostanay` - Asia/Qostanay + * `Asia/Qyzylorda` - Asia/Qyzylorda + * `Asia/Riyadh` - Asia/Riyadh + * `Asia/Sakhalin` - Asia/Sakhalin + * `Asia/Samarkand` - Asia/Samarkand + * `Asia/Seoul` - Asia/Seoul + * `Asia/Shanghai` - Asia/Shanghai + * `Asia/Singapore` - Asia/Singapore + * `Asia/Srednekolymsk` - Asia/Srednekolymsk + * `Asia/Taipei` - Asia/Taipei + * `Asia/Tashkent` - Asia/Tashkent + * `Asia/Tbilisi` - Asia/Tbilisi + * `Asia/Tehran` - Asia/Tehran + * `Asia/Thimphu` - Asia/Thimphu + * `Asia/Tokyo` - Asia/Tokyo + * `Asia/Tomsk` - Asia/Tomsk + * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar + * `Asia/Urumqi` - Asia/Urumqi + * `Asia/Ust-Nera` - Asia/Ust-Nera + * `Asia/Vientiane` - Asia/Vientiane + * `Asia/Vladivostok` - Asia/Vladivostok + * `Asia/Yakutsk` - Asia/Yakutsk + * `Asia/Yangon` - Asia/Yangon + * `Asia/Yekaterinburg` - Asia/Yekaterinburg + * `Asia/Yerevan` - Asia/Yerevan + * `Atlantic/Azores` - Atlantic/Azores + * `Atlantic/Bermuda` - Atlantic/Bermuda + * `Atlantic/Canary` - Atlantic/Canary + * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde + * `Atlantic/Faroe` - Atlantic/Faroe + * `Atlantic/Madeira` - Atlantic/Madeira + * `Atlantic/Reykjavik` - Atlantic/Reykjavik + * `Atlantic/South_Georgia` - Atlantic/South_Georgia + * `Atlantic/St_Helena` - Atlantic/St_Helena + * `Atlantic/Stanley` - Atlantic/Stanley + * `Australia/Adelaide` - Australia/Adelaide + * `Australia/Brisbane` - Australia/Brisbane + * `Australia/Broken_Hill` - Australia/Broken_Hill + * `Australia/Darwin` - Australia/Darwin + * `Australia/Eucla` - Australia/Eucla + * `Australia/Hobart` - Australia/Hobart + * `Australia/Lindeman` - Australia/Lindeman + * `Australia/Lord_Howe` - Australia/Lord_Howe + * `Australia/Melbourne` - Australia/Melbourne + * `Australia/Perth` - Australia/Perth + * `Australia/Sydney` - Australia/Sydney + * `Europe/Amsterdam` - Europe/Amsterdam + * `Europe/Andorra` - Europe/Andorra + * `Europe/Astrakhan` - Europe/Astrakhan + * `Europe/Athens` - Europe/Athens + * `Europe/Belgrade` - Europe/Belgrade + * `Europe/Berlin` - Europe/Berlin + * `Europe/Bratislava` - Europe/Bratislava + * `Europe/Brussels` - Europe/Brussels + * `Europe/Bucharest` - Europe/Bucharest + * `Europe/Budapest` - Europe/Budapest + * `Europe/Busingen` - Europe/Busingen + * `Europe/Chisinau` - Europe/Chisinau + * `Europe/Copenhagen` - Europe/Copenhagen + * `Europe/Dublin` - Europe/Dublin + * `Europe/Gibraltar` - Europe/Gibraltar + * `Europe/Guernsey` - Europe/Guernsey + * `Europe/Helsinki` - Europe/Helsinki + * `Europe/Isle_of_Man` - Europe/Isle_of_Man + * `Europe/Istanbul` - Europe/Istanbul + * `Europe/Jersey` - Europe/Jersey + * `Europe/Kaliningrad` - Europe/Kaliningrad + * `Europe/Kirov` - Europe/Kirov + * `Europe/Kyiv` - Europe/Kyiv + * `Europe/Lisbon` - Europe/Lisbon + * `Europe/Ljubljana` - Europe/Ljubljana + * `Europe/London` - Europe/London + * `Europe/Luxembourg` - Europe/Luxembourg + * `Europe/Madrid` - Europe/Madrid + * `Europe/Malta` - Europe/Malta + * `Europe/Mariehamn` - Europe/Mariehamn + * `Europe/Minsk` - Europe/Minsk + * `Europe/Monaco` - Europe/Monaco + * `Europe/Moscow` - Europe/Moscow + * `Europe/Oslo` - Europe/Oslo + * `Europe/Paris` - Europe/Paris + * `Europe/Podgorica` - Europe/Podgorica + * `Europe/Prague` - Europe/Prague + * `Europe/Riga` - Europe/Riga + * `Europe/Rome` - Europe/Rome + * `Europe/Samara` - Europe/Samara + * `Europe/San_Marino` - Europe/San_Marino + * `Europe/Sarajevo` - Europe/Sarajevo + * `Europe/Saratov` - Europe/Saratov + * `Europe/Simferopol` - Europe/Simferopol + * `Europe/Skopje` - Europe/Skopje + * `Europe/Sofia` - Europe/Sofia + * `Europe/Stockholm` - Europe/Stockholm + * `Europe/Tallinn` - Europe/Tallinn + * `Europe/Tirane` - Europe/Tirane + * `Europe/Ulyanovsk` - Europe/Ulyanovsk + * `Europe/Vaduz` - Europe/Vaduz + * `Europe/Vatican` - Europe/Vatican + * `Europe/Vienna` - Europe/Vienna + * `Europe/Vilnius` - Europe/Vilnius + * `Europe/Volgograd` - Europe/Volgograd + * `Europe/Warsaw` - Europe/Warsaw + * `Europe/Zagreb` - Europe/Zagreb + * `Europe/Zurich` - Europe/Zurich + * `GMT` - GMT + * `Indian/Antananarivo` - Indian/Antananarivo + * `Indian/Chagos` - Indian/Chagos + * `Indian/Christmas` - Indian/Christmas + * `Indian/Cocos` - Indian/Cocos + * `Indian/Comoro` - Indian/Comoro + * `Indian/Kerguelen` - Indian/Kerguelen + * `Indian/Mahe` - Indian/Mahe + * `Indian/Maldives` - Indian/Maldives + * `Indian/Mauritius` - Indian/Mauritius + * `Indian/Mayotte` - Indian/Mayotte + * `Indian/Reunion` - Indian/Reunion + * `Pacific/Apia` - Pacific/Apia + * `Pacific/Auckland` - Pacific/Auckland + * `Pacific/Bougainville` - Pacific/Bougainville + * `Pacific/Chatham` - Pacific/Chatham + * `Pacific/Chuuk` - Pacific/Chuuk + * `Pacific/Easter` - Pacific/Easter + * `Pacific/Efate` - Pacific/Efate + * `Pacific/Fakaofo` - Pacific/Fakaofo + * `Pacific/Fiji` - Pacific/Fiji + * `Pacific/Funafuti` - Pacific/Funafuti + * `Pacific/Galapagos` - Pacific/Galapagos + * `Pacific/Gambier` - Pacific/Gambier + * `Pacific/Guadalcanal` - Pacific/Guadalcanal + * `Pacific/Guam` - Pacific/Guam + * `Pacific/Honolulu` - Pacific/Honolulu + * `Pacific/Kanton` - Pacific/Kanton + * `Pacific/Kiritimati` - Pacific/Kiritimati + * `Pacific/Kosrae` - Pacific/Kosrae + * `Pacific/Kwajalein` - Pacific/Kwajalein + * `Pacific/Majuro` - Pacific/Majuro + * `Pacific/Marquesas` - Pacific/Marquesas + * `Pacific/Midway` - Pacific/Midway + * `Pacific/Nauru` - Pacific/Nauru + * `Pacific/Niue` - Pacific/Niue + * `Pacific/Norfolk` - Pacific/Norfolk + * `Pacific/Noumea` - Pacific/Noumea + * `Pacific/Pago_Pago` - Pacific/Pago_Pago + * `Pacific/Palau` - Pacific/Palau + * `Pacific/Pitcairn` - Pacific/Pitcairn + * `Pacific/Pohnpei` - Pacific/Pohnpei + * `Pacific/Port_Moresby` - Pacific/Port_Moresby + * `Pacific/Rarotonga` - Pacific/Rarotonga + * `Pacific/Saipan` - Pacific/Saipan + * `Pacific/Tahiti` - Pacific/Tahiti + * `Pacific/Tarawa` - Pacific/Tarawa + * `Pacific/Tongatapu` - Pacific/Tongatapu + * `Pacific/Wake` - Pacific/Wake + * `Pacific/Wallis` - Pacific/Wallis + * `UTC` - UTC + oneOf: + - $ref: '#/components/schemas/LocalTimezoneEnum' + - $ref: '#/components/schemas/BlankEnum' + - $ref: '#/components/schemas/NullEnum' + bootswatch_theme: + type: integer + nullable: true + description: Bootswatch theme for light mode + UserProfileRequest: + type: object + description: |- + User profile serializer with preference settings. + + Provides access to user-specific configuration including: + - Date and time format preferences + - Timezone settings (home and local) + - UI theme customization + properties: + date_format: + allOf: + - $ref: '#/components/schemas/DateFormatEnum' + description: |- + Preferred date display format + + * `YYYY-MM-DD` - 2024-12-25 + * `DD/MM/YYYY` - 25/12/2024 + * `MM/DD/YYYY` - 12/25/2024 + * `DD.MM.YYYY` - 25.12.2024 + * `DD-MM-YYYY` - 25-12-2024 + time_format: + allOf: + - $ref: '#/components/schemas/TimeFormatEnum' + description: |- + 12-hour or 24-hour time format + + * `12-hour` - 12-hour (3:30 PM) + * `24-hour` - 24-hour (15:30) + home_timezone: + allOf: + - $ref: '#/components/schemas/HomeTimezoneEnum' + description: |- + User's home/permanent timezone + + * `Africa/Abidjan` - Africa/Abidjan + * `Africa/Accra` - Africa/Accra + * `Africa/Addis_Ababa` - Africa/Addis_Ababa + * `Africa/Algiers` - Africa/Algiers + * `Africa/Asmara` - Africa/Asmara + * `Africa/Bamako` - Africa/Bamako + * `Africa/Bangui` - Africa/Bangui + * `Africa/Banjul` - Africa/Banjul + * `Africa/Bissau` - Africa/Bissau + * `Africa/Blantyre` - Africa/Blantyre + * `Africa/Brazzaville` - Africa/Brazzaville + * `Africa/Bujumbura` - Africa/Bujumbura + * `Africa/Cairo` - Africa/Cairo + * `Africa/Casablanca` - Africa/Casablanca + * `Africa/Ceuta` - Africa/Ceuta + * `Africa/Conakry` - Africa/Conakry + * `Africa/Dakar` - Africa/Dakar + * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam + * `Africa/Djibouti` - Africa/Djibouti + * `Africa/Douala` - Africa/Douala + * `Africa/El_Aaiun` - Africa/El_Aaiun + * `Africa/Freetown` - Africa/Freetown + * `Africa/Gaborone` - Africa/Gaborone + * `Africa/Harare` - Africa/Harare + * `Africa/Johannesburg` - Africa/Johannesburg + * `Africa/Juba` - Africa/Juba + * `Africa/Kampala` - Africa/Kampala + * `Africa/Khartoum` - Africa/Khartoum + * `Africa/Kigali` - Africa/Kigali + * `Africa/Kinshasa` - Africa/Kinshasa + * `Africa/Lagos` - Africa/Lagos + * `Africa/Libreville` - Africa/Libreville + * `Africa/Lome` - Africa/Lome + * `Africa/Luanda` - Africa/Luanda + * `Africa/Lubumbashi` - Africa/Lubumbashi + * `Africa/Lusaka` - Africa/Lusaka + * `Africa/Malabo` - Africa/Malabo + * `Africa/Maputo` - Africa/Maputo + * `Africa/Maseru` - Africa/Maseru + * `Africa/Mbabane` - Africa/Mbabane + * `Africa/Mogadishu` - Africa/Mogadishu + * `Africa/Monrovia` - Africa/Monrovia + * `Africa/Nairobi` - Africa/Nairobi + * `Africa/Ndjamena` - Africa/Ndjamena + * `Africa/Niamey` - Africa/Niamey + * `Africa/Nouakchott` - Africa/Nouakchott + * `Africa/Ouagadougou` - Africa/Ouagadougou + * `Africa/Porto-Novo` - Africa/Porto-Novo + * `Africa/Sao_Tome` - Africa/Sao_Tome + * `Africa/Tripoli` - Africa/Tripoli + * `Africa/Tunis` - Africa/Tunis + * `Africa/Windhoek` - Africa/Windhoek + * `America/Adak` - America/Adak + * `America/Anchorage` - America/Anchorage + * `America/Anguilla` - America/Anguilla + * `America/Antigua` - America/Antigua + * `America/Araguaina` - America/Araguaina + * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires + * `America/Argentina/Catamarca` - America/Argentina/Catamarca + * `America/Argentina/Cordoba` - America/Argentina/Cordoba + * `America/Argentina/Jujuy` - America/Argentina/Jujuy + * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja + * `America/Argentina/Mendoza` - America/Argentina/Mendoza + * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos + * `America/Argentina/Salta` - America/Argentina/Salta + * `America/Argentina/San_Juan` - America/Argentina/San_Juan + * `America/Argentina/San_Luis` - America/Argentina/San_Luis + * `America/Argentina/Tucuman` - America/Argentina/Tucuman + * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia + * `America/Aruba` - America/Aruba + * `America/Asuncion` - America/Asuncion + * `America/Atikokan` - America/Atikokan + * `America/Bahia` - America/Bahia + * `America/Bahia_Banderas` - America/Bahia_Banderas + * `America/Barbados` - America/Barbados + * `America/Belem` - America/Belem + * `America/Belize` - America/Belize + * `America/Blanc-Sablon` - America/Blanc-Sablon + * `America/Boa_Vista` - America/Boa_Vista + * `America/Bogota` - America/Bogota + * `America/Boise` - America/Boise + * `America/Cambridge_Bay` - America/Cambridge_Bay + * `America/Campo_Grande` - America/Campo_Grande + * `America/Cancun` - America/Cancun + * `America/Caracas` - America/Caracas + * `America/Cayenne` - America/Cayenne + * `America/Cayman` - America/Cayman + * `America/Chicago` - America/Chicago + * `America/Chihuahua` - America/Chihuahua + * `America/Ciudad_Juarez` - America/Ciudad_Juarez + * `America/Costa_Rica` - America/Costa_Rica + * `America/Coyhaique` - America/Coyhaique + * `America/Creston` - America/Creston + * `America/Cuiaba` - America/Cuiaba + * `America/Curacao` - America/Curacao + * `America/Danmarkshavn` - America/Danmarkshavn + * `America/Dawson` - America/Dawson + * `America/Dawson_Creek` - America/Dawson_Creek + * `America/Denver` - America/Denver + * `America/Detroit` - America/Detroit + * `America/Dominica` - America/Dominica + * `America/Edmonton` - America/Edmonton + * `America/Eirunepe` - America/Eirunepe + * `America/El_Salvador` - America/El_Salvador + * `America/Fort_Nelson` - America/Fort_Nelson + * `America/Fortaleza` - America/Fortaleza + * `America/Glace_Bay` - America/Glace_Bay + * `America/Goose_Bay` - America/Goose_Bay + * `America/Grand_Turk` - America/Grand_Turk + * `America/Grenada` - America/Grenada + * `America/Guadeloupe` - America/Guadeloupe + * `America/Guatemala` - America/Guatemala + * `America/Guayaquil` - America/Guayaquil + * `America/Guyana` - America/Guyana + * `America/Halifax` - America/Halifax + * `America/Havana` - America/Havana + * `America/Hermosillo` - America/Hermosillo + * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis + * `America/Indiana/Knox` - America/Indiana/Knox + * `America/Indiana/Marengo` - America/Indiana/Marengo + * `America/Indiana/Petersburg` - America/Indiana/Petersburg + * `America/Indiana/Tell_City` - America/Indiana/Tell_City + * `America/Indiana/Vevay` - America/Indiana/Vevay + * `America/Indiana/Vincennes` - America/Indiana/Vincennes + * `America/Indiana/Winamac` - America/Indiana/Winamac + * `America/Inuvik` - America/Inuvik + * `America/Iqaluit` - America/Iqaluit + * `America/Jamaica` - America/Jamaica + * `America/Juneau` - America/Juneau + * `America/Kentucky/Louisville` - America/Kentucky/Louisville + * `America/Kentucky/Monticello` - America/Kentucky/Monticello + * `America/Kralendijk` - America/Kralendijk + * `America/La_Paz` - America/La_Paz + * `America/Lima` - America/Lima + * `America/Los_Angeles` - America/Los_Angeles + * `America/Lower_Princes` - America/Lower_Princes + * `America/Maceio` - America/Maceio + * `America/Managua` - America/Managua + * `America/Manaus` - America/Manaus + * `America/Marigot` - America/Marigot + * `America/Martinique` - America/Martinique + * `America/Matamoros` - America/Matamoros + * `America/Mazatlan` - America/Mazatlan + * `America/Menominee` - America/Menominee + * `America/Merida` - America/Merida + * `America/Metlakatla` - America/Metlakatla + * `America/Mexico_City` - America/Mexico_City + * `America/Miquelon` - America/Miquelon + * `America/Moncton` - America/Moncton + * `America/Monterrey` - America/Monterrey + * `America/Montevideo` - America/Montevideo + * `America/Montserrat` - America/Montserrat + * `America/Nassau` - America/Nassau + * `America/New_York` - America/New_York + * `America/Nome` - America/Nome + * `America/Noronha` - America/Noronha + * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah + * `America/North_Dakota/Center` - America/North_Dakota/Center + * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem + * `America/Nuuk` - America/Nuuk + * `America/Ojinaga` - America/Ojinaga + * `America/Panama` - America/Panama + * `America/Paramaribo` - America/Paramaribo + * `America/Phoenix` - America/Phoenix + * `America/Port-au-Prince` - America/Port-au-Prince + * `America/Port_of_Spain` - America/Port_of_Spain + * `America/Porto_Velho` - America/Porto_Velho + * `America/Puerto_Rico` - America/Puerto_Rico + * `America/Punta_Arenas` - America/Punta_Arenas + * `America/Rankin_Inlet` - America/Rankin_Inlet + * `America/Recife` - America/Recife + * `America/Regina` - America/Regina + * `America/Resolute` - America/Resolute + * `America/Rio_Branco` - America/Rio_Branco + * `America/Santarem` - America/Santarem + * `America/Santiago` - America/Santiago + * `America/Santo_Domingo` - America/Santo_Domingo + * `America/Sao_Paulo` - America/Sao_Paulo + * `America/Scoresbysund` - America/Scoresbysund + * `America/Sitka` - America/Sitka + * `America/St_Barthelemy` - America/St_Barthelemy + * `America/St_Johns` - America/St_Johns + * `America/St_Kitts` - America/St_Kitts + * `America/St_Lucia` - America/St_Lucia + * `America/St_Thomas` - America/St_Thomas + * `America/St_Vincent` - America/St_Vincent + * `America/Swift_Current` - America/Swift_Current + * `America/Tegucigalpa` - America/Tegucigalpa + * `America/Thule` - America/Thule + * `America/Tijuana` - America/Tijuana + * `America/Toronto` - America/Toronto + * `America/Tortola` - America/Tortola + * `America/Vancouver` - America/Vancouver + * `America/Whitehorse` - America/Whitehorse + * `America/Winnipeg` - America/Winnipeg + * `America/Yakutat` - America/Yakutat + * `Antarctica/Casey` - Antarctica/Casey + * `Antarctica/Davis` - Antarctica/Davis + * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville + * `Antarctica/Macquarie` - Antarctica/Macquarie + * `Antarctica/Mawson` - Antarctica/Mawson + * `Antarctica/McMurdo` - Antarctica/McMurdo + * `Antarctica/Palmer` - Antarctica/Palmer + * `Antarctica/Rothera` - Antarctica/Rothera + * `Antarctica/Syowa` - Antarctica/Syowa + * `Antarctica/Troll` - Antarctica/Troll + * `Antarctica/Vostok` - Antarctica/Vostok + * `Arctic/Longyearbyen` - Arctic/Longyearbyen + * `Asia/Aden` - Asia/Aden + * `Asia/Almaty` - Asia/Almaty + * `Asia/Amman` - Asia/Amman + * `Asia/Anadyr` - Asia/Anadyr + * `Asia/Aqtau` - Asia/Aqtau + * `Asia/Aqtobe` - Asia/Aqtobe + * `Asia/Ashgabat` - Asia/Ashgabat + * `Asia/Atyrau` - Asia/Atyrau + * `Asia/Baghdad` - Asia/Baghdad + * `Asia/Bahrain` - Asia/Bahrain + * `Asia/Baku` - Asia/Baku + * `Asia/Bangkok` - Asia/Bangkok + * `Asia/Barnaul` - Asia/Barnaul + * `Asia/Beirut` - Asia/Beirut + * `Asia/Bishkek` - Asia/Bishkek + * `Asia/Brunei` - Asia/Brunei + * `Asia/Chita` - Asia/Chita + * `Asia/Colombo` - Asia/Colombo + * `Asia/Damascus` - Asia/Damascus + * `Asia/Dhaka` - Asia/Dhaka + * `Asia/Dili` - Asia/Dili + * `Asia/Dubai` - Asia/Dubai + * `Asia/Dushanbe` - Asia/Dushanbe + * `Asia/Famagusta` - Asia/Famagusta + * `Asia/Gaza` - Asia/Gaza + * `Asia/Hebron` - Asia/Hebron + * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh + * `Asia/Hong_Kong` - Asia/Hong_Kong + * `Asia/Hovd` - Asia/Hovd + * `Asia/Irkutsk` - Asia/Irkutsk + * `Asia/Jakarta` - Asia/Jakarta + * `Asia/Jayapura` - Asia/Jayapura + * `Asia/Jerusalem` - Asia/Jerusalem + * `Asia/Kabul` - Asia/Kabul + * `Asia/Kamchatka` - Asia/Kamchatka + * `Asia/Karachi` - Asia/Karachi + * `Asia/Kathmandu` - Asia/Kathmandu + * `Asia/Khandyga` - Asia/Khandyga + * `Asia/Kolkata` - Asia/Kolkata + * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk + * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur + * `Asia/Kuching` - Asia/Kuching + * `Asia/Kuwait` - Asia/Kuwait + * `Asia/Macau` - Asia/Macau + * `Asia/Magadan` - Asia/Magadan + * `Asia/Makassar` - Asia/Makassar + * `Asia/Manila` - Asia/Manila + * `Asia/Muscat` - Asia/Muscat + * `Asia/Nicosia` - Asia/Nicosia + * `Asia/Novokuznetsk` - Asia/Novokuznetsk + * `Asia/Novosibirsk` - Asia/Novosibirsk + * `Asia/Omsk` - Asia/Omsk + * `Asia/Oral` - Asia/Oral + * `Asia/Phnom_Penh` - Asia/Phnom_Penh + * `Asia/Pontianak` - Asia/Pontianak + * `Asia/Pyongyang` - Asia/Pyongyang + * `Asia/Qatar` - Asia/Qatar + * `Asia/Qostanay` - Asia/Qostanay + * `Asia/Qyzylorda` - Asia/Qyzylorda + * `Asia/Riyadh` - Asia/Riyadh + * `Asia/Sakhalin` - Asia/Sakhalin + * `Asia/Samarkand` - Asia/Samarkand + * `Asia/Seoul` - Asia/Seoul + * `Asia/Shanghai` - Asia/Shanghai + * `Asia/Singapore` - Asia/Singapore + * `Asia/Srednekolymsk` - Asia/Srednekolymsk + * `Asia/Taipei` - Asia/Taipei + * `Asia/Tashkent` - Asia/Tashkent + * `Asia/Tbilisi` - Asia/Tbilisi + * `Asia/Tehran` - Asia/Tehran + * `Asia/Thimphu` - Asia/Thimphu + * `Asia/Tokyo` - Asia/Tokyo + * `Asia/Tomsk` - Asia/Tomsk + * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar + * `Asia/Urumqi` - Asia/Urumqi + * `Asia/Ust-Nera` - Asia/Ust-Nera + * `Asia/Vientiane` - Asia/Vientiane + * `Asia/Vladivostok` - Asia/Vladivostok + * `Asia/Yakutsk` - Asia/Yakutsk + * `Asia/Yangon` - Asia/Yangon + * `Asia/Yekaterinburg` - Asia/Yekaterinburg + * `Asia/Yerevan` - Asia/Yerevan + * `Atlantic/Azores` - Atlantic/Azores + * `Atlantic/Bermuda` - Atlantic/Bermuda + * `Atlantic/Canary` - Atlantic/Canary + * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde + * `Atlantic/Faroe` - Atlantic/Faroe + * `Atlantic/Madeira` - Atlantic/Madeira + * `Atlantic/Reykjavik` - Atlantic/Reykjavik + * `Atlantic/South_Georgia` - Atlantic/South_Georgia + * `Atlantic/St_Helena` - Atlantic/St_Helena + * `Atlantic/Stanley` - Atlantic/Stanley + * `Australia/Adelaide` - Australia/Adelaide + * `Australia/Brisbane` - Australia/Brisbane + * `Australia/Broken_Hill` - Australia/Broken_Hill + * `Australia/Darwin` - Australia/Darwin + * `Australia/Eucla` - Australia/Eucla + * `Australia/Hobart` - Australia/Hobart + * `Australia/Lindeman` - Australia/Lindeman + * `Australia/Lord_Howe` - Australia/Lord_Howe + * `Australia/Melbourne` - Australia/Melbourne + * `Australia/Perth` - Australia/Perth + * `Australia/Sydney` - Australia/Sydney + * `Europe/Amsterdam` - Europe/Amsterdam + * `Europe/Andorra` - Europe/Andorra + * `Europe/Astrakhan` - Europe/Astrakhan + * `Europe/Athens` - Europe/Athens + * `Europe/Belgrade` - Europe/Belgrade + * `Europe/Berlin` - Europe/Berlin + * `Europe/Bratislava` - Europe/Bratislava + * `Europe/Brussels` - Europe/Brussels + * `Europe/Bucharest` - Europe/Bucharest + * `Europe/Budapest` - Europe/Budapest + * `Europe/Busingen` - Europe/Busingen + * `Europe/Chisinau` - Europe/Chisinau + * `Europe/Copenhagen` - Europe/Copenhagen + * `Europe/Dublin` - Europe/Dublin + * `Europe/Gibraltar` - Europe/Gibraltar + * `Europe/Guernsey` - Europe/Guernsey + * `Europe/Helsinki` - Europe/Helsinki + * `Europe/Isle_of_Man` - Europe/Isle_of_Man + * `Europe/Istanbul` - Europe/Istanbul + * `Europe/Jersey` - Europe/Jersey + * `Europe/Kaliningrad` - Europe/Kaliningrad + * `Europe/Kirov` - Europe/Kirov + * `Europe/Kyiv` - Europe/Kyiv + * `Europe/Lisbon` - Europe/Lisbon + * `Europe/Ljubljana` - Europe/Ljubljana + * `Europe/London` - Europe/London + * `Europe/Luxembourg` - Europe/Luxembourg + * `Europe/Madrid` - Europe/Madrid + * `Europe/Malta` - Europe/Malta + * `Europe/Mariehamn` - Europe/Mariehamn + * `Europe/Minsk` - Europe/Minsk + * `Europe/Monaco` - Europe/Monaco + * `Europe/Moscow` - Europe/Moscow + * `Europe/Oslo` - Europe/Oslo + * `Europe/Paris` - Europe/Paris + * `Europe/Podgorica` - Europe/Podgorica + * `Europe/Prague` - Europe/Prague + * `Europe/Riga` - Europe/Riga + * `Europe/Rome` - Europe/Rome + * `Europe/Samara` - Europe/Samara + * `Europe/San_Marino` - Europe/San_Marino + * `Europe/Sarajevo` - Europe/Sarajevo + * `Europe/Saratov` - Europe/Saratov + * `Europe/Simferopol` - Europe/Simferopol + * `Europe/Skopje` - Europe/Skopje + * `Europe/Sofia` - Europe/Sofia + * `Europe/Stockholm` - Europe/Stockholm + * `Europe/Tallinn` - Europe/Tallinn + * `Europe/Tirane` - Europe/Tirane + * `Europe/Ulyanovsk` - Europe/Ulyanovsk + * `Europe/Vaduz` - Europe/Vaduz + * `Europe/Vatican` - Europe/Vatican + * `Europe/Vienna` - Europe/Vienna + * `Europe/Vilnius` - Europe/Vilnius + * `Europe/Volgograd` - Europe/Volgograd + * `Europe/Warsaw` - Europe/Warsaw + * `Europe/Zagreb` - Europe/Zagreb + * `Europe/Zurich` - Europe/Zurich + * `GMT` - GMT + * `Indian/Antananarivo` - Indian/Antananarivo + * `Indian/Chagos` - Indian/Chagos + * `Indian/Christmas` - Indian/Christmas + * `Indian/Cocos` - Indian/Cocos + * `Indian/Comoro` - Indian/Comoro + * `Indian/Kerguelen` - Indian/Kerguelen + * `Indian/Mahe` - Indian/Mahe + * `Indian/Maldives` - Indian/Maldives + * `Indian/Mauritius` - Indian/Mauritius + * `Indian/Mayotte` - Indian/Mayotte + * `Indian/Reunion` - Indian/Reunion + * `Pacific/Apia` - Pacific/Apia + * `Pacific/Auckland` - Pacific/Auckland + * `Pacific/Bougainville` - Pacific/Bougainville + * `Pacific/Chatham` - Pacific/Chatham + * `Pacific/Chuuk` - Pacific/Chuuk + * `Pacific/Easter` - Pacific/Easter + * `Pacific/Efate` - Pacific/Efate + * `Pacific/Fakaofo` - Pacific/Fakaofo + * `Pacific/Fiji` - Pacific/Fiji + * `Pacific/Funafuti` - Pacific/Funafuti + * `Pacific/Galapagos` - Pacific/Galapagos + * `Pacific/Gambier` - Pacific/Gambier + * `Pacific/Guadalcanal` - Pacific/Guadalcanal + * `Pacific/Guam` - Pacific/Guam + * `Pacific/Honolulu` - Pacific/Honolulu + * `Pacific/Kanton` - Pacific/Kanton + * `Pacific/Kiritimati` - Pacific/Kiritimati + * `Pacific/Kosrae` - Pacific/Kosrae + * `Pacific/Kwajalein` - Pacific/Kwajalein + * `Pacific/Majuro` - Pacific/Majuro + * `Pacific/Marquesas` - Pacific/Marquesas + * `Pacific/Midway` - Pacific/Midway + * `Pacific/Nauru` - Pacific/Nauru + * `Pacific/Niue` - Pacific/Niue + * `Pacific/Norfolk` - Pacific/Norfolk + * `Pacific/Noumea` - Pacific/Noumea + * `Pacific/Pago_Pago` - Pacific/Pago_Pago + * `Pacific/Palau` - Pacific/Palau + * `Pacific/Pitcairn` - Pacific/Pitcairn + * `Pacific/Pohnpei` - Pacific/Pohnpei + * `Pacific/Port_Moresby` - Pacific/Port_Moresby + * `Pacific/Rarotonga` - Pacific/Rarotonga + * `Pacific/Saipan` - Pacific/Saipan + * `Pacific/Tahiti` - Pacific/Tahiti + * `Pacific/Tarawa` - Pacific/Tarawa + * `Pacific/Tongatapu` - Pacific/Tongatapu + * `Pacific/Wake` - Pacific/Wake + * `Pacific/Wallis` - Pacific/Wallis + * `UTC` - UTC + local_timezone: + nullable: true + description: |- + User's current local timezone (if traveling) + + * `Africa/Abidjan` - Africa/Abidjan + * `Africa/Accra` - Africa/Accra + * `Africa/Addis_Ababa` - Africa/Addis_Ababa + * `Africa/Algiers` - Africa/Algiers + * `Africa/Asmara` - Africa/Asmara + * `Africa/Bamako` - Africa/Bamako + * `Africa/Bangui` - Africa/Bangui + * `Africa/Banjul` - Africa/Banjul + * `Africa/Bissau` - Africa/Bissau + * `Africa/Blantyre` - Africa/Blantyre + * `Africa/Brazzaville` - Africa/Brazzaville + * `Africa/Bujumbura` - Africa/Bujumbura + * `Africa/Cairo` - Africa/Cairo + * `Africa/Casablanca` - Africa/Casablanca + * `Africa/Ceuta` - Africa/Ceuta + * `Africa/Conakry` - Africa/Conakry + * `Africa/Dakar` - Africa/Dakar + * `Africa/Dar_es_Salaam` - Africa/Dar_es_Salaam + * `Africa/Djibouti` - Africa/Djibouti + * `Africa/Douala` - Africa/Douala + * `Africa/El_Aaiun` - Africa/El_Aaiun + * `Africa/Freetown` - Africa/Freetown + * `Africa/Gaborone` - Africa/Gaborone + * `Africa/Harare` - Africa/Harare + * `Africa/Johannesburg` - Africa/Johannesburg + * `Africa/Juba` - Africa/Juba + * `Africa/Kampala` - Africa/Kampala + * `Africa/Khartoum` - Africa/Khartoum + * `Africa/Kigali` - Africa/Kigali + * `Africa/Kinshasa` - Africa/Kinshasa + * `Africa/Lagos` - Africa/Lagos + * `Africa/Libreville` - Africa/Libreville + * `Africa/Lome` - Africa/Lome + * `Africa/Luanda` - Africa/Luanda + * `Africa/Lubumbashi` - Africa/Lubumbashi + * `Africa/Lusaka` - Africa/Lusaka + * `Africa/Malabo` - Africa/Malabo + * `Africa/Maputo` - Africa/Maputo + * `Africa/Maseru` - Africa/Maseru + * `Africa/Mbabane` - Africa/Mbabane + * `Africa/Mogadishu` - Africa/Mogadishu + * `Africa/Monrovia` - Africa/Monrovia + * `Africa/Nairobi` - Africa/Nairobi + * `Africa/Ndjamena` - Africa/Ndjamena + * `Africa/Niamey` - Africa/Niamey + * `Africa/Nouakchott` - Africa/Nouakchott + * `Africa/Ouagadougou` - Africa/Ouagadougou + * `Africa/Porto-Novo` - Africa/Porto-Novo + * `Africa/Sao_Tome` - Africa/Sao_Tome + * `Africa/Tripoli` - Africa/Tripoli + * `Africa/Tunis` - Africa/Tunis + * `Africa/Windhoek` - Africa/Windhoek + * `America/Adak` - America/Adak + * `America/Anchorage` - America/Anchorage + * `America/Anguilla` - America/Anguilla + * `America/Antigua` - America/Antigua + * `America/Araguaina` - America/Araguaina + * `America/Argentina/Buenos_Aires` - America/Argentina/Buenos_Aires + * `America/Argentina/Catamarca` - America/Argentina/Catamarca + * `America/Argentina/Cordoba` - America/Argentina/Cordoba + * `America/Argentina/Jujuy` - America/Argentina/Jujuy + * `America/Argentina/La_Rioja` - America/Argentina/La_Rioja + * `America/Argentina/Mendoza` - America/Argentina/Mendoza + * `America/Argentina/Rio_Gallegos` - America/Argentina/Rio_Gallegos + * `America/Argentina/Salta` - America/Argentina/Salta + * `America/Argentina/San_Juan` - America/Argentina/San_Juan + * `America/Argentina/San_Luis` - America/Argentina/San_Luis + * `America/Argentina/Tucuman` - America/Argentina/Tucuman + * `America/Argentina/Ushuaia` - America/Argentina/Ushuaia + * `America/Aruba` - America/Aruba + * `America/Asuncion` - America/Asuncion + * `America/Atikokan` - America/Atikokan + * `America/Bahia` - America/Bahia + * `America/Bahia_Banderas` - America/Bahia_Banderas + * `America/Barbados` - America/Barbados + * `America/Belem` - America/Belem + * `America/Belize` - America/Belize + * `America/Blanc-Sablon` - America/Blanc-Sablon + * `America/Boa_Vista` - America/Boa_Vista + * `America/Bogota` - America/Bogota + * `America/Boise` - America/Boise + * `America/Cambridge_Bay` - America/Cambridge_Bay + * `America/Campo_Grande` - America/Campo_Grande + * `America/Cancun` - America/Cancun + * `America/Caracas` - America/Caracas + * `America/Cayenne` - America/Cayenne + * `America/Cayman` - America/Cayman + * `America/Chicago` - America/Chicago + * `America/Chihuahua` - America/Chihuahua + * `America/Ciudad_Juarez` - America/Ciudad_Juarez + * `America/Costa_Rica` - America/Costa_Rica + * `America/Coyhaique` - America/Coyhaique + * `America/Creston` - America/Creston + * `America/Cuiaba` - America/Cuiaba + * `America/Curacao` - America/Curacao + * `America/Danmarkshavn` - America/Danmarkshavn + * `America/Dawson` - America/Dawson + * `America/Dawson_Creek` - America/Dawson_Creek + * `America/Denver` - America/Denver + * `America/Detroit` - America/Detroit + * `America/Dominica` - America/Dominica + * `America/Edmonton` - America/Edmonton + * `America/Eirunepe` - America/Eirunepe + * `America/El_Salvador` - America/El_Salvador + * `America/Fort_Nelson` - America/Fort_Nelson + * `America/Fortaleza` - America/Fortaleza + * `America/Glace_Bay` - America/Glace_Bay + * `America/Goose_Bay` - America/Goose_Bay + * `America/Grand_Turk` - America/Grand_Turk + * `America/Grenada` - America/Grenada + * `America/Guadeloupe` - America/Guadeloupe + * `America/Guatemala` - America/Guatemala + * `America/Guayaquil` - America/Guayaquil + * `America/Guyana` - America/Guyana + * `America/Halifax` - America/Halifax + * `America/Havana` - America/Havana + * `America/Hermosillo` - America/Hermosillo + * `America/Indiana/Indianapolis` - America/Indiana/Indianapolis + * `America/Indiana/Knox` - America/Indiana/Knox + * `America/Indiana/Marengo` - America/Indiana/Marengo + * `America/Indiana/Petersburg` - America/Indiana/Petersburg + * `America/Indiana/Tell_City` - America/Indiana/Tell_City + * `America/Indiana/Vevay` - America/Indiana/Vevay + * `America/Indiana/Vincennes` - America/Indiana/Vincennes + * `America/Indiana/Winamac` - America/Indiana/Winamac + * `America/Inuvik` - America/Inuvik + * `America/Iqaluit` - America/Iqaluit + * `America/Jamaica` - America/Jamaica + * `America/Juneau` - America/Juneau + * `America/Kentucky/Louisville` - America/Kentucky/Louisville + * `America/Kentucky/Monticello` - America/Kentucky/Monticello + * `America/Kralendijk` - America/Kralendijk + * `America/La_Paz` - America/La_Paz + * `America/Lima` - America/Lima + * `America/Los_Angeles` - America/Los_Angeles + * `America/Lower_Princes` - America/Lower_Princes + * `America/Maceio` - America/Maceio + * `America/Managua` - America/Managua + * `America/Manaus` - America/Manaus + * `America/Marigot` - America/Marigot + * `America/Martinique` - America/Martinique + * `America/Matamoros` - America/Matamoros + * `America/Mazatlan` - America/Mazatlan + * `America/Menominee` - America/Menominee + * `America/Merida` - America/Merida + * `America/Metlakatla` - America/Metlakatla + * `America/Mexico_City` - America/Mexico_City + * `America/Miquelon` - America/Miquelon + * `America/Moncton` - America/Moncton + * `America/Monterrey` - America/Monterrey + * `America/Montevideo` - America/Montevideo + * `America/Montserrat` - America/Montserrat + * `America/Nassau` - America/Nassau + * `America/New_York` - America/New_York + * `America/Nome` - America/Nome + * `America/Noronha` - America/Noronha + * `America/North_Dakota/Beulah` - America/North_Dakota/Beulah + * `America/North_Dakota/Center` - America/North_Dakota/Center + * `America/North_Dakota/New_Salem` - America/North_Dakota/New_Salem + * `America/Nuuk` - America/Nuuk + * `America/Ojinaga` - America/Ojinaga + * `America/Panama` - America/Panama + * `America/Paramaribo` - America/Paramaribo + * `America/Phoenix` - America/Phoenix + * `America/Port-au-Prince` - America/Port-au-Prince + * `America/Port_of_Spain` - America/Port_of_Spain + * `America/Porto_Velho` - America/Porto_Velho + * `America/Puerto_Rico` - America/Puerto_Rico + * `America/Punta_Arenas` - America/Punta_Arenas + * `America/Rankin_Inlet` - America/Rankin_Inlet + * `America/Recife` - America/Recife + * `America/Regina` - America/Regina + * `America/Resolute` - America/Resolute + * `America/Rio_Branco` - America/Rio_Branco + * `America/Santarem` - America/Santarem + * `America/Santiago` - America/Santiago + * `America/Santo_Domingo` - America/Santo_Domingo + * `America/Sao_Paulo` - America/Sao_Paulo + * `America/Scoresbysund` - America/Scoresbysund + * `America/Sitka` - America/Sitka + * `America/St_Barthelemy` - America/St_Barthelemy + * `America/St_Johns` - America/St_Johns + * `America/St_Kitts` - America/St_Kitts + * `America/St_Lucia` - America/St_Lucia + * `America/St_Thomas` - America/St_Thomas + * `America/St_Vincent` - America/St_Vincent + * `America/Swift_Current` - America/Swift_Current + * `America/Tegucigalpa` - America/Tegucigalpa + * `America/Thule` - America/Thule + * `America/Tijuana` - America/Tijuana + * `America/Toronto` - America/Toronto + * `America/Tortola` - America/Tortola + * `America/Vancouver` - America/Vancouver + * `America/Whitehorse` - America/Whitehorse + * `America/Winnipeg` - America/Winnipeg + * `America/Yakutat` - America/Yakutat + * `Antarctica/Casey` - Antarctica/Casey + * `Antarctica/Davis` - Antarctica/Davis + * `Antarctica/DumontDUrville` - Antarctica/DumontDUrville + * `Antarctica/Macquarie` - Antarctica/Macquarie + * `Antarctica/Mawson` - Antarctica/Mawson + * `Antarctica/McMurdo` - Antarctica/McMurdo + * `Antarctica/Palmer` - Antarctica/Palmer + * `Antarctica/Rothera` - Antarctica/Rothera + * `Antarctica/Syowa` - Antarctica/Syowa + * `Antarctica/Troll` - Antarctica/Troll + * `Antarctica/Vostok` - Antarctica/Vostok + * `Arctic/Longyearbyen` - Arctic/Longyearbyen + * `Asia/Aden` - Asia/Aden + * `Asia/Almaty` - Asia/Almaty + * `Asia/Amman` - Asia/Amman + * `Asia/Anadyr` - Asia/Anadyr + * `Asia/Aqtau` - Asia/Aqtau + * `Asia/Aqtobe` - Asia/Aqtobe + * `Asia/Ashgabat` - Asia/Ashgabat + * `Asia/Atyrau` - Asia/Atyrau + * `Asia/Baghdad` - Asia/Baghdad + * `Asia/Bahrain` - Asia/Bahrain + * `Asia/Baku` - Asia/Baku + * `Asia/Bangkok` - Asia/Bangkok + * `Asia/Barnaul` - Asia/Barnaul + * `Asia/Beirut` - Asia/Beirut + * `Asia/Bishkek` - Asia/Bishkek + * `Asia/Brunei` - Asia/Brunei + * `Asia/Chita` - Asia/Chita + * `Asia/Colombo` - Asia/Colombo + * `Asia/Damascus` - Asia/Damascus + * `Asia/Dhaka` - Asia/Dhaka + * `Asia/Dili` - Asia/Dili + * `Asia/Dubai` - Asia/Dubai + * `Asia/Dushanbe` - Asia/Dushanbe + * `Asia/Famagusta` - Asia/Famagusta + * `Asia/Gaza` - Asia/Gaza + * `Asia/Hebron` - Asia/Hebron + * `Asia/Ho_Chi_Minh` - Asia/Ho_Chi_Minh + * `Asia/Hong_Kong` - Asia/Hong_Kong + * `Asia/Hovd` - Asia/Hovd + * `Asia/Irkutsk` - Asia/Irkutsk + * `Asia/Jakarta` - Asia/Jakarta + * `Asia/Jayapura` - Asia/Jayapura + * `Asia/Jerusalem` - Asia/Jerusalem + * `Asia/Kabul` - Asia/Kabul + * `Asia/Kamchatka` - Asia/Kamchatka + * `Asia/Karachi` - Asia/Karachi + * `Asia/Kathmandu` - Asia/Kathmandu + * `Asia/Khandyga` - Asia/Khandyga + * `Asia/Kolkata` - Asia/Kolkata + * `Asia/Krasnoyarsk` - Asia/Krasnoyarsk + * `Asia/Kuala_Lumpur` - Asia/Kuala_Lumpur + * `Asia/Kuching` - Asia/Kuching + * `Asia/Kuwait` - Asia/Kuwait + * `Asia/Macau` - Asia/Macau + * `Asia/Magadan` - Asia/Magadan + * `Asia/Makassar` - Asia/Makassar + * `Asia/Manila` - Asia/Manila + * `Asia/Muscat` - Asia/Muscat + * `Asia/Nicosia` - Asia/Nicosia + * `Asia/Novokuznetsk` - Asia/Novokuznetsk + * `Asia/Novosibirsk` - Asia/Novosibirsk + * `Asia/Omsk` - Asia/Omsk + * `Asia/Oral` - Asia/Oral + * `Asia/Phnom_Penh` - Asia/Phnom_Penh + * `Asia/Pontianak` - Asia/Pontianak + * `Asia/Pyongyang` - Asia/Pyongyang + * `Asia/Qatar` - Asia/Qatar + * `Asia/Qostanay` - Asia/Qostanay + * `Asia/Qyzylorda` - Asia/Qyzylorda + * `Asia/Riyadh` - Asia/Riyadh + * `Asia/Sakhalin` - Asia/Sakhalin + * `Asia/Samarkand` - Asia/Samarkand + * `Asia/Seoul` - Asia/Seoul + * `Asia/Shanghai` - Asia/Shanghai + * `Asia/Singapore` - Asia/Singapore + * `Asia/Srednekolymsk` - Asia/Srednekolymsk + * `Asia/Taipei` - Asia/Taipei + * `Asia/Tashkent` - Asia/Tashkent + * `Asia/Tbilisi` - Asia/Tbilisi + * `Asia/Tehran` - Asia/Tehran + * `Asia/Thimphu` - Asia/Thimphu + * `Asia/Tokyo` - Asia/Tokyo + * `Asia/Tomsk` - Asia/Tomsk + * `Asia/Ulaanbaatar` - Asia/Ulaanbaatar + * `Asia/Urumqi` - Asia/Urumqi + * `Asia/Ust-Nera` - Asia/Ust-Nera + * `Asia/Vientiane` - Asia/Vientiane + * `Asia/Vladivostok` - Asia/Vladivostok + * `Asia/Yakutsk` - Asia/Yakutsk + * `Asia/Yangon` - Asia/Yangon + * `Asia/Yekaterinburg` - Asia/Yekaterinburg + * `Asia/Yerevan` - Asia/Yerevan + * `Atlantic/Azores` - Atlantic/Azores + * `Atlantic/Bermuda` - Atlantic/Bermuda + * `Atlantic/Canary` - Atlantic/Canary + * `Atlantic/Cape_Verde` - Atlantic/Cape_Verde + * `Atlantic/Faroe` - Atlantic/Faroe + * `Atlantic/Madeira` - Atlantic/Madeira + * `Atlantic/Reykjavik` - Atlantic/Reykjavik + * `Atlantic/South_Georgia` - Atlantic/South_Georgia + * `Atlantic/St_Helena` - Atlantic/St_Helena + * `Atlantic/Stanley` - Atlantic/Stanley + * `Australia/Adelaide` - Australia/Adelaide + * `Australia/Brisbane` - Australia/Brisbane + * `Australia/Broken_Hill` - Australia/Broken_Hill + * `Australia/Darwin` - Australia/Darwin + * `Australia/Eucla` - Australia/Eucla + * `Australia/Hobart` - Australia/Hobart + * `Australia/Lindeman` - Australia/Lindeman + * `Australia/Lord_Howe` - Australia/Lord_Howe + * `Australia/Melbourne` - Australia/Melbourne + * `Australia/Perth` - Australia/Perth + * `Australia/Sydney` - Australia/Sydney + * `Europe/Amsterdam` - Europe/Amsterdam + * `Europe/Andorra` - Europe/Andorra + * `Europe/Astrakhan` - Europe/Astrakhan + * `Europe/Athens` - Europe/Athens + * `Europe/Belgrade` - Europe/Belgrade + * `Europe/Berlin` - Europe/Berlin + * `Europe/Bratislava` - Europe/Bratislava + * `Europe/Brussels` - Europe/Brussels + * `Europe/Bucharest` - Europe/Bucharest + * `Europe/Budapest` - Europe/Budapest + * `Europe/Busingen` - Europe/Busingen + * `Europe/Chisinau` - Europe/Chisinau + * `Europe/Copenhagen` - Europe/Copenhagen + * `Europe/Dublin` - Europe/Dublin + * `Europe/Gibraltar` - Europe/Gibraltar + * `Europe/Guernsey` - Europe/Guernsey + * `Europe/Helsinki` - Europe/Helsinki + * `Europe/Isle_of_Man` - Europe/Isle_of_Man + * `Europe/Istanbul` - Europe/Istanbul + * `Europe/Jersey` - Europe/Jersey + * `Europe/Kaliningrad` - Europe/Kaliningrad + * `Europe/Kirov` - Europe/Kirov + * `Europe/Kyiv` - Europe/Kyiv + * `Europe/Lisbon` - Europe/Lisbon + * `Europe/Ljubljana` - Europe/Ljubljana + * `Europe/London` - Europe/London + * `Europe/Luxembourg` - Europe/Luxembourg + * `Europe/Madrid` - Europe/Madrid + * `Europe/Malta` - Europe/Malta + * `Europe/Mariehamn` - Europe/Mariehamn + * `Europe/Minsk` - Europe/Minsk + * `Europe/Monaco` - Europe/Monaco + * `Europe/Moscow` - Europe/Moscow + * `Europe/Oslo` - Europe/Oslo + * `Europe/Paris` - Europe/Paris + * `Europe/Podgorica` - Europe/Podgorica + * `Europe/Prague` - Europe/Prague + * `Europe/Riga` - Europe/Riga + * `Europe/Rome` - Europe/Rome + * `Europe/Samara` - Europe/Samara + * `Europe/San_Marino` - Europe/San_Marino + * `Europe/Sarajevo` - Europe/Sarajevo + * `Europe/Saratov` - Europe/Saratov + * `Europe/Simferopol` - Europe/Simferopol + * `Europe/Skopje` - Europe/Skopje + * `Europe/Sofia` - Europe/Sofia + * `Europe/Stockholm` - Europe/Stockholm + * `Europe/Tallinn` - Europe/Tallinn + * `Europe/Tirane` - Europe/Tirane + * `Europe/Ulyanovsk` - Europe/Ulyanovsk + * `Europe/Vaduz` - Europe/Vaduz + * `Europe/Vatican` - Europe/Vatican + * `Europe/Vienna` - Europe/Vienna + * `Europe/Vilnius` - Europe/Vilnius + * `Europe/Volgograd` - Europe/Volgograd + * `Europe/Warsaw` - Europe/Warsaw + * `Europe/Zagreb` - Europe/Zagreb + * `Europe/Zurich` - Europe/Zurich + * `GMT` - GMT + * `Indian/Antananarivo` - Indian/Antananarivo + * `Indian/Chagos` - Indian/Chagos + * `Indian/Christmas` - Indian/Christmas + * `Indian/Cocos` - Indian/Cocos + * `Indian/Comoro` - Indian/Comoro + * `Indian/Kerguelen` - Indian/Kerguelen + * `Indian/Mahe` - Indian/Mahe + * `Indian/Maldives` - Indian/Maldives + * `Indian/Mauritius` - Indian/Mauritius + * `Indian/Mayotte` - Indian/Mayotte + * `Indian/Reunion` - Indian/Reunion + * `Pacific/Apia` - Pacific/Apia + * `Pacific/Auckland` - Pacific/Auckland + * `Pacific/Bougainville` - Pacific/Bougainville + * `Pacific/Chatham` - Pacific/Chatham + * `Pacific/Chuuk` - Pacific/Chuuk + * `Pacific/Easter` - Pacific/Easter + * `Pacific/Efate` - Pacific/Efate + * `Pacific/Fakaofo` - Pacific/Fakaofo + * `Pacific/Fiji` - Pacific/Fiji + * `Pacific/Funafuti` - Pacific/Funafuti + * `Pacific/Galapagos` - Pacific/Galapagos + * `Pacific/Gambier` - Pacific/Gambier + * `Pacific/Guadalcanal` - Pacific/Guadalcanal + * `Pacific/Guam` - Pacific/Guam + * `Pacific/Honolulu` - Pacific/Honolulu + * `Pacific/Kanton` - Pacific/Kanton + * `Pacific/Kiritimati` - Pacific/Kiritimati + * `Pacific/Kosrae` - Pacific/Kosrae + * `Pacific/Kwajalein` - Pacific/Kwajalein + * `Pacific/Majuro` - Pacific/Majuro + * `Pacific/Marquesas` - Pacific/Marquesas + * `Pacific/Midway` - Pacific/Midway + * `Pacific/Nauru` - Pacific/Nauru + * `Pacific/Niue` - Pacific/Niue + * `Pacific/Norfolk` - Pacific/Norfolk + * `Pacific/Noumea` - Pacific/Noumea + * `Pacific/Pago_Pago` - Pacific/Pago_Pago + * `Pacific/Palau` - Pacific/Palau + * `Pacific/Pitcairn` - Pacific/Pitcairn + * `Pacific/Pohnpei` - Pacific/Pohnpei + * `Pacific/Port_Moresby` - Pacific/Port_Moresby + * `Pacific/Rarotonga` - Pacific/Rarotonga + * `Pacific/Saipan` - Pacific/Saipan + * `Pacific/Tahiti` - Pacific/Tahiti + * `Pacific/Tarawa` - Pacific/Tarawa + * `Pacific/Tongatapu` - Pacific/Tongatapu + * `Pacific/Wake` - Pacific/Wake + * `Pacific/Wallis` - Pacific/Wallis + * `UTC` - UTC + oneOf: + - $ref: '#/components/schemas/LocalTimezoneEnum' + - $ref: '#/components/schemas/BlankEnum' + - $ref: '#/components/schemas/NullEnum' + bootswatch_theme: + type: integer + nullable: true + description: Bootswatch theme for light mode + Vendor: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + legal_name: + type: string + abbreviated_name: + type: string + overview: + type: string + history: + type: string + services_provided: + type: string + vendor_type: + type: string + employee_count: + type: integer + nullable: true + revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + assets: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + fiscal_year_end: + type: string + format: date + nullable: true + partner_portal_url: + type: string + format: uri + is_competitor: + type: boolean + deal_registration_notes: + type: string + parent_organization: + type: string + readOnly: true + parent_relationship_type: + type: string + readOnly: true + is_multi_role_organization: + type: string + readOnly: true + child_organizations_count: + type: string + readOnly: true + required: + - child_organizations_count + - id + - is_multi_role_organization + - parent_organization + - parent_relationship_type + VendorRequest: + type: object + properties: + name: + type: string + legal_name: + type: string + abbreviated_name: + type: string + overview: + type: string + history: + type: string + services_provided: + type: string + vendor_type: + type: string + employee_count: + type: integer + nullable: true + revenue: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + assets: + type: string + format: decimal + pattern: ^-?\d{0,13}(?:\.\d{0,2})?$ + nullable: true + fiscal_year_end: + type: string + format: date + nullable: true + partner_portal_url: + type: string + format: uri + is_competitor: + type: boolean + deal_registration_notes: + type: string + VendorSolution: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + vendor: + allOf: + - $ref: '#/components/schemas/Vendor' + readOnly: true + description: + type: string + title: Solution Information + description: Detailed solution description with URL support + url: + type: string + format: uri + maxLength: 200 + notes: + type: string + description: Additional notes about the solution + category: + type: string + maxLength: 100 + release_date: + type: string + format: date + nullable: true + end_of_life_date: + type: string + format: date + nullable: true + documentation_url: + type: string + format: uri + maxLength: 200 + created_at: + type: string + format: date-time + readOnly: true + updated_at: + type: string + format: date-time + readOnly: true + required: + - created_at + - id + - name + - updated_at + - vendor + VendorSolutionRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + vendor_id: + type: integer + writeOnly: true + description: + type: string + minLength: 1 + title: Solution Information + description: Detailed solution description with URL support + url: + type: string + format: uri + maxLength: 200 + notes: + type: string + minLength: 1 + description: Additional notes about the solution + category: + type: string + maxLength: 100 + release_date: + type: string + format: date + nullable: true + end_of_life_date: + type: string + format: date + nullable: true + documentation_url: + type: string + format: uri + maxLength: 200 + required: + - name + - vendor_id + Workshop: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + maxLength: 255 + date: + type: string + format: date + time: + type: string + format: time + duration: + allOf: + - $ref: '#/components/schemas/DurationEnum' + minimum: -2147483648 + maximum: 2147483647 + workshop_type: + $ref: '#/components/schemas/WorkshopTypeEnum' + participants: + type: array + items: + $ref: '#/components/schemas/Contact' + readOnly: true + notes: + type: string + required: + - date + - duration + - id + - name + - participants + - time + - workshop_type + WorkshopRequest: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + date: + type: string + format: date + time: + type: string + format: time + duration: + allOf: + - $ref: '#/components/schemas/DurationEnum' + minimum: -2147483648 + maximum: 2147483647 + workshop_type: + $ref: '#/components/schemas/WorkshopTypeEnum' + participant_ids: + type: array + items: + type: integer + writeOnly: true + notes: + type: string + required: + - date + - duration + - name + - time + - workshop_type + WorkshopTypeEnum: + enum: + - Exploration + - Discovery + - Prioritization + - Maturity + type: string + description: |- + * `Exploration` - Exploration + * `Discovery` - Discovery + * `Prioritization` - Prioritization + * `Maturity` - Maturity + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: Authorization + description: 'API key authentication. Use format: Api-Key {your-api-key}' +servers: +- url: http://localhost:8000 + description: Development server +- url: https://api.athena.example.com + description: Production server +tags: +- name: Core + description: Core system functionality +- name: Orbit + description: Business relationship management +- name: Location Tools + description: Client location management with automatic version numbering +- name: Location Sets + description: Versioned location collections with automatic numbering +- name: Locations + description: Individual location records with custom fields +- name: Custom Fields + description: Custom field definitions for location data +- name: Table Sources + description: Location data table source configurations +- name: CSV Operations + description: Bulk import/export operations for location data +- name: Engagement + description: Client engagement management +- name: Advisor + description: Advisory tools and recommendations +- name: BMC + description: Business Model Canvas tools +- name: Pricing + description: Pricing and cost management +- name: Gallery + description: Media and document management +- name: RAID + description: Risk, Assumption, Issue, Dependency tracking +- name: Stakeholder + description: Stakeholder management +- name: Timeline + description: Timeline and milestone management diff --git a/palladium/__init__.py b/palladium/__init__.py new file mode 100644 index 0000000..a3d438c --- /dev/null +++ b/palladium/__init__.py @@ -0,0 +1,7 @@ +""" +Palladium CLI shim — exposes ``python -m palladium``. + +The actual logic lives in :mod:`core.cli.main`. This package exists so the +README's command line interface (``python -m palladium test``) works without +clashing with the top-level project name. +""" diff --git a/palladium/__main__.py b/palladium/__main__.py new file mode 100644 index 0000000..567d573 --- /dev/null +++ b/palladium/__main__.py @@ -0,0 +1,6 @@ +"""``python -m palladium`` entrypoint.""" + +from core.cli.main import main + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..2383f0b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,49 @@ +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" + +[project] +name = "palladium" +version = "0.1.0" +description = "TEI (Total Economic Impact) Calculator — Palladium" +readme = "README.md" +requires-python = ">=3.11" +license = {file = "LICENSE"} +authors = [{name = "NTT Data"}] +dependencies = [ + "requests>=2.31", + "python-dotenv>=1.0", + "pandas>=2.0", + "plotly>=5.18", + "numpy>=1.26", +] + +[project.optional-dependencies] +notebooks = ["jupyter>=1.0", "ipython>=8.0"] +app = ["streamlit>=1.30"] +dev = ["pytest>=7.4", "ruff>=0.1"] + +[project.scripts] +palladium = "core.cli.main:main" + +[tool.setuptools.packages.find] +include = ["core*", "palladium*"] +exclude = ["tests*", "studies*", "app*", "docs*"] + +[tool.pytest.ini_options] +testpaths = ["tests"] +python_files = ["test_*.py"] +addopts = "-q" + +[tool.ruff] +line-length = 100 +target-version = "py311" + +[tool.ruff.lint] +select = ["E", "F", "I", "B", "UP", "W"] +ignore = ["E501"] # line length handled by formatter + +[tool.ruff.lint.per-file-ignores] +"studies/*/notebooks/*.ipynb" = ["E402"] +"tests/*" = ["F401"] +"app/main.py" = ["E402"] # sys.path bootstrap before app imports diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5daa3c0 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +requests>=2.31 +python-dotenv>=1.0 +jupyter>=1.0 +streamlit>=1.30 +pandas>=2.0 +plotly>=5.18 +numpy>=1.26 +pytest>=7.4 +ruff>=0.1 diff --git a/studies/202602_AmazonConnect/README.md b/studies/202602_AmazonConnect/README.md new file mode 100644 index 0000000..49ce756 --- /dev/null +++ b/studies/202602_AmazonConnect/README.md @@ -0,0 +1,71 @@ +# 202602 — Amazon Connect TEI + +Self-contained TEI study folder. All data, notebooks, and exports for the +Forrester *Total Economic Impact™ Of Amazon Connect* (February 2026, +commissioned by AWS) live here. + +## Source + +The full Forrester study is at [`docs/202602_TEI Report Amazon Connect.pdf`](docs/202602_TEI%20Report%20Amazon%20Connect.pdf). + +Key composite numbers reproduced in `seed_data.py`: + +| Metric | Value | +|---|---| +| ROI | **342%** | +| NPV | **$78.7M** | +| Benefits PV | $101.7M | +| Costs PV | $23.0M | +| Payback | <6 months | +| Discount rate | 10% | +| Analysis period | 3 years | + +## Composite organization + +* Global B2C, ~$10B revenue (Y1), 30% YoY growth +* 2,000 contact-center agents, 200 supervisors +* 20M annual contacts (75% calls, 25% chat) +* 10-min average handle time + +## Layout + +``` +202602_AmazonConnect/ +├── README.md ← this file +├── config.py ← TOOL_PUBLIC_ID, REPORT_PUBLIC_ID, study slug +├── seed_data.py ← BENEFITS, COSTS, ASSUMPTIONS as Python dicts +├── notebooks/ +│ ├── 01_benefits.ipynb ← quantify the 5 benefits, push to Athena +│ ├── 02_costs.ipynb ← quantify the 3 costs +│ ├── 03_business_case.ipynb ← /calculate, charts, scenarios +│ └── 04_export.ipynb ← /export → exports/export.json +├── exports/ ← generated; .gitignored +└── docs/ + └── 202602_TEI Report Amazon Connect.pdf +``` + +## Workflow + +1. **Set up credentials** in the project root `.env` (see `.env.example`). +2. **Create / link the TEI tool** in Athena, then put its `public_id` in + [`config.py`](config.py). +3. **Open `notebooks/01_benefits.ipynb`** and run all — pushes the 5 + benefit rows from `seed_data.py` into Athena. +4. **`02_costs.ipynb`** — pushes the 3 cost rows. +5. **`03_business_case.ipynb`** — calls `/calculate`, renders the cash + flow chart, runs scenario analysis. Should reproduce the PDF's + $78.7M NPV / 342% ROI. +6. **`04_export.ipynb`** — writes `exports/export.json` for the report + pipeline. + +## Adding a new study + +Copy this folder, rename to `YYYYMM_`, and: + +1. Replace `seed_data.py` with your benefits/costs. +2. Update `config.py` with the new tool/report public IDs. +3. Tweak the notebooks' narrative; the helper imports are the same. + +The only thing that changes between studies is the **data** and the +**narrative prose** in the notebooks. All math, charts, and API calls +come from `core/`. diff --git a/studies/202602_AmazonConnect/__init__.py b/studies/202602_AmazonConnect/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/studies/202602_AmazonConnect/config.py b/studies/202602_AmazonConnect/config.py new file mode 100644 index 0000000..93e764a --- /dev/null +++ b/studies/202602_AmazonConnect/config.py @@ -0,0 +1,39 @@ +""" +Study configuration for the Amazon Connect TEI (February 2026). + +Set ``TOOL_PUBLIC_ID`` to the public_id of the live TEI tool instance in +Athena once it has been created. ``REPORT_PUBLIC_ID`` is the template +this tool was created from (Athena admin sets up Report templates). + +Until both are filled in, the notebooks fall back to local-only mode: +they compute summaries from ``seed_data.py`` using ``core.calculations`` +and skip the network round-trip. +""" + +from __future__ import annotations + +import os + +#: Human-friendly study identifier — used in export metadata + filenames. +STUDY_SLUG = "202602_AmazonConnect" + +#: TEI Report template public_id (12-char short UUID). Provisioned in +#: Athena admin → TEI → Reports. +REPORT_PUBLIC_ID: str = os.getenv("PALLADIUM_REPORT_PUBLIC_ID", "") + +#: TEI Tool instance public_id. Created via the API +#: (``client.create_tool``) or the Streamlit app sidebar. +TOOL_PUBLIC_ID: str = os.getenv("PALLADIUM_TOOL_PUBLIC_ID", "") + +#: Default discount rate used for local validation of the study numbers. +DISCOUNT_RATE = 0.10 + +#: Analysis horizon (years). +ANALYSIS_YEARS = 3 + +#: Optional Athena Proposal ID this tool is linked to (when known). +PROPOSAL_ID: int | None = ( + int(os.environ["PALLADIUM_PROPOSAL_ID"]) + if os.getenv("PALLADIUM_PROPOSAL_ID") + else None +) diff --git a/studies/202602_AmazonConnect/docs/202602_TEI Report Amazon Connect.pdf b/studies/202602_AmazonConnect/docs/202602_TEI Report Amazon Connect.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9150966c9a49469d227315dc5157d2cfb09d5d9f GIT binary patch literal 1393856 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

(x{~RW39ZbgxUUSQ0K6 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

tIT?Ixrfadtr?UnMf)1 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%0Aor0!@FKduKG;>EhMU;8@0k$GETD&e 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

  • Ve)5p*T3%UTG2 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 u<7N9b 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

    w4tFrAJ=2%im~fGz19ZbYl5j2${cjF~3mjO5 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 u6=zNq|gqE~H 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

    8dz`3yC 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 \u001b[39m\u001b[32m4\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m core.notebook_helpers \u001b[38;5;28;01mimport\u001b[39;00m charts, display, tables\n\u001b[32m 5\u001b[39m \n\u001b[32m 6\u001b[39m display.alert(\n\u001b[32m 7\u001b[39m f'Study: {config.STUDY_SLUG} • discount rate {config.DISCOUNT_RATE:.0%} '\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/notebook/git/palladium/core/notebook_helpers/__init__.py:3\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[33;03m\"\"\"Notebook helpers — pandas tables, plotly charts, IPython display.\"\"\"\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mcore\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mnotebook_helpers\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m charts, display, tables\n\u001b[32m 5\u001b[39m __all__ = [\u001b[33m\"\u001b[39m\u001b[33mcharts\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mdisplay\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mtables\u001b[39m\u001b[33m\"\u001b[39m]\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/notebook/git/palladium/core/notebook_helpers/tables.py:13\u001b[39m\n\u001b[32m 9\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01m__future__\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m annotations\n\u001b[32m 11\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mtyping\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m Any, Iterable\n\u001b[32m---> \u001b[39m\u001b[32m13\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mpandas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mpd\u001b[39;00m\n\u001b[32m 15\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mcore\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mcalculations\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m risk_adjust_benefit, risk_adjust_cost\n\u001b[32m 18\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_years_in_data\u001b[39m(items: Iterable[\u001b[38;5;28mdict\u001b[39m]) -> \u001b[38;5;28mlist\u001b[39m[\u001b[38;5;28mint\u001b[39m]:\n", + "\u001b[31mModuleNotFoundError\u001b[39m: No module named 'pandas'" + ] + } + ], + "source": [ + "import config\n", + "import seed_data\n", + "from core.calculations import npv, risk_adjust_benefit\n", + "from core.notebook_helpers import charts, display, tables\n", + "\n", + "display.alert(\n", + " f'Study: {config.STUDY_SLUG} • discount rate {config.DISCOUNT_RATE:.0%} '\n", + " f'• {config.ANALYSIS_YEARS}-year horizon',\n", + " 'info',\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "fd94503d", + "metadata": {}, + "source": [ + "## Benefits — nominal & risk-adjusted\n", + "\n", + "Forrester quantifies five benefit categories:\n", + "\n", + "| Ref | Benefit | Y1 | Y2 | Y3 | Risk Adj |\n", + "|---|---|---|---|---|---|\n", + "| At | AI-driven contact resolution efficiency | $13.9M | $23.9M | $37.8M | 15% |\n", + "| Bt | AI-powered content & sentiment analysis | $4.6M | $5.4M | $6.3M | 15% |\n", + "| Ct | AI-enabled forecasting & supervision | $6.7M | $9.1M | $12.4M | 15% |\n", + "| Dt | Data-driven profit lift (conversion +20%) | $1.2M | $1.6M | $2.0M | 20% |\n", + "| Et | Legacy solution cost savings | $6.2M | $8.0M | $10.4M | 20% |\n", + "\n", + "All five are seeded in `seed_data.BENEFITS` with full source notes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6177ea7c", + "metadata": {}, + "outputs": [], + "source": [ + "df = tables.benefits_table(seed_data.BENEFITS)\n", + "df.style.format({col: '${:,.0f}' for col in df.columns if col not in ('field_key','label','category','risk_adjustment')})" + ] + }, + { + "cell_type": "markdown", + "id": "573f12d8", + "metadata": {}, + "source": [ + "## Local validation against the PDF\n", + "\n", + "Re-derive the per-benefit risk-adjusted PV and confirm we land on Forrester's\n", + "**$101,696,791** total within rounding." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8cf32003", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "rows = []\n", + "for b in seed_data.BENEFITS:\n", + " rf = b['risk_adjustment']\n", + " yr = [b['year_values'][str(y)] for y in (1, 2, 3)]\n", + " yr_ra = [risk_adjust_benefit(v, rf) for v in yr]\n", + " pv = npv(yr_ra, config.DISCOUNT_RATE)\n", + " rows.append({\n", + " 'Benefit': b['label'],\n", + " 'Y1 (RA)': yr_ra[0],\n", + " 'Y2 (RA)': yr_ra[1],\n", + " 'Y3 (RA)': yr_ra[2],\n", + " 'PV': pv,\n", + " })\n", + "df_check = pd.DataFrame(rows)\n", + "df_check.loc[len(df_check)] = ['TOTAL', df_check['Y1 (RA)'].sum(), df_check['Y2 (RA)'].sum(), df_check['Y3 (RA)'].sum(), df_check['PV'].sum()]\n", + "df_check.style.format({c: '${:,.0f}' for c in df_check.columns if c != 'Benefit'})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ded50c8", + "metadata": {}, + "outputs": [], + "source": [ + "expected_pv = 101_696_791\n", + "computed_pv = df_check.iloc[-1]['PV']\n", + "delta = computed_pv - expected_pv\n", + "kind = 'success' if abs(delta) < 1_000 else 'warning'\n", + "display.alert(\n", + " f'Computed Benefits PV: ${computed_pv:,.0f}
    '\n", + " f'Forrester target: ${expected_pv:,.0f}
    '\n", + " f'Δ = ${delta:,.0f} (rounding)',\n", + " kind,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a5ad453a", + "metadata": {}, + "source": [ + "## Visualize\n", + "\n", + "Horizontal bar chart of risk-adjusted three-year totals — mirrors the PDF p.6\n", + "*Benefits (Three-Year)* graphic." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "452b8408", + "metadata": {}, + "outputs": [], + "source": [ + "charts.benefits_bar(seed_data.BENEFITS).show()" + ] + }, + { + "cell_type": "markdown", + "id": "1c4591f5", + "metadata": {}, + "source": [ + "## Push to Athena\n", + "\n", + "When `config.TOOL_PUBLIC_ID` is set, persist the seed values to the live\n", + "TEI tool. Otherwise this cell is a no-op so the notebook still runs\n", + "offline." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d10a54b6", + "metadata": {}, + "outputs": [], + "source": [ + "if config.TOOL_PUBLIC_ID:\n", + " from core.tei_client import TEIClient\n", + "\n", + " client = TEIClient()\n", + " result = client.update_values(config.TOOL_PUBLIC_ID, seed_data.BENEFITS)\n", + " display.alert(f'Pushed {len(seed_data.BENEFITS)} benefit rows to '\n", + " f'tool {config.TOOL_PUBLIC_ID}.', 'success')\n", + "else:\n", + " display.alert(\n", + " 'No TOOL_PUBLIC_ID set in config.py — skipped Athena push. '\n", + " 'Set PALLADIUM_TOOL_PUBLIC_ID in your environment '\n", + " 'or edit config.py to enable.',\n", + " 'info',\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "78693c14", + "metadata": {}, + "source": [ + "---\n", + "\n", + "Continue with [`02_costs.ipynb`](02_costs.ipynb) →" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/studies/202602_AmazonConnect/notebooks/02_costs.ipynb b/studies/202602_AmazonConnect/notebooks/02_costs.ipynb new file mode 100644 index 0000000..e4ea7aa --- /dev/null +++ b/studies/202602_AmazonConnect/notebooks/02_costs.ipynb @@ -0,0 +1,213 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1a76b7ed", + "metadata": {}, + "source": [ + "# 02 — Costs Analysis\n", + "\n", + "**Study:** Forrester TEI™ Of Amazon Connect (Feb 2026)\n", + "\n", + "Three cost categories, three-year horizon, 10% discount rate.\n", + "Target risk-adjusted PV = **$22,983,076**." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46446223", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "from pathlib import Path\n", + "\n", + "ROOT = Path.cwd().resolve()\n", + "while ROOT != ROOT.parent and not (ROOT / 'core').is_dir():\n", + " ROOT = ROOT.parent\n", + "if str(ROOT) not in sys.path:\n", + " sys.path.insert(0, str(ROOT))\n", + "STUDY = ROOT / 'studies' / '202602_AmazonConnect'\n", + "if str(STUDY) not in sys.path:\n", + " sys.path.insert(0, str(STUDY))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4ec64198", + "metadata": {}, + "outputs": [], + "source": [ + "import config\n", + "import seed_data\n", + "from core.calculations import npv, risk_adjust_cost\n", + "from core.notebook_helpers import charts, display, tables" + ] + }, + { + "cell_type": "markdown", + "id": "26f1d385", + "metadata": {}, + "source": [ + "## Costs — nominal & risk-adjusted\n", + "\n", + "| Ref | Cost | Initial | Y1 | Y2 | Y3 | Risk Adj |\n", + "|---|---|---|---|---|---|---|\n", + "| Ft | Amazon Connect usage | — | $6.5M | $8.0M | $9.8M | ↑5% |\n", + "| Gt | Implementation & migration | $1.09M | $188K | $188K | — | ↑10% |\n", + "| Ht | Ongoing management | — | $256K | $187K | $187K | ↑15% |\n", + "\n", + "Note **costs are risk-adjusted *upward*** (higher risk → higher modelled cost)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9635f334", + "metadata": {}, + "outputs": [], + "source": [ + "df = tables.costs_table(seed_data.COSTS)\n", + "df.style.format({c: '${:,.0f}' for c in df.columns if c not in ('field_key','label','category','risk_adjustment')})" + ] + }, + { + "cell_type": "markdown", + "id": "0667d1da", + "metadata": {}, + "source": [ + "## Local validation\n", + "\n", + "Reproduce the **$22,983,076** Costs PV from the PDF Cash Flow Analysis." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3e35a794", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "rows = []\n", + "for c in seed_data.COSTS:\n", + " rf = c['risk_adjustment']\n", + " init_ra = risk_adjust_cost(c.get('initial') or 0, rf)\n", + " yr = [c['year_values'][str(y)] for y in (1, 2, 3)]\n", + " yr_ra = [risk_adjust_cost(v, rf) for v in yr]\n", + " pv = npv(yr_ra, config.DISCOUNT_RATE, initial=init_ra)\n", + " rows.append({\n", + " 'Cost': c['label'],\n", + " 'Initial (RA)': init_ra,\n", + " 'Y1 (RA)': yr_ra[0],\n", + " 'Y2 (RA)': yr_ra[1],\n", + " 'Y3 (RA)': yr_ra[2],\n", + " 'PV': pv,\n", + " })\n", + "df_check = pd.DataFrame(rows)\n", + "totals = df_check.drop(columns='Cost').sum()\n", + "df_check.loc[len(df_check)] = ['TOTAL'] + totals.tolist()\n", + "df_check.style.format({c: '${:,.0f}' for c in df_check.columns if c != 'Cost'})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4109784e", + "metadata": {}, + "outputs": [], + "source": [ + "expected_pv = 22_983_076\n", + "computed_pv = df_check.iloc[-1]['PV']\n", + "delta = computed_pv - expected_pv\n", + "kind = 'success' if abs(delta) < 1_000 else 'warning'\n", + "display.alert(\n", + " f'Computed Costs PV: ${computed_pv:,.0f}
    '\n", + " f'Forrester target: ${expected_pv:,.0f}
    '\n", + " f'Δ = ${delta:,.0f}',\n", + " kind,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "dd1b3c04", + "metadata": {}, + "source": [ + "## Cost mix\n", + "\n", + "Most of the three-year cost (~90%) is Amazon Connect *usage* (Ft) —\n", + "consistent with the PDF's framing that consumption-based pricing dominates,\n", + "with implementation a one-time investment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "90e9b5e2", + "metadata": {}, + "outputs": [], + "source": [ + "charts.cost_breakdown_pie(seed_data.COSTS).show()" + ] + }, + { + "cell_type": "markdown", + "id": "3d15ae10", + "metadata": {}, + "source": [ + "## Push to Athena" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03547040", + "metadata": {}, + "outputs": [], + "source": [ + "if config.TOOL_PUBLIC_ID:\n", + " from core.tei_client import TEIClient\n", + "\n", + " client = TEIClient()\n", + " client.update_values(config.TOOL_PUBLIC_ID, seed_data.COSTS)\n", + " display.alert(f'Pushed {len(seed_data.COSTS)} cost rows to '\n", + " f'tool {config.TOOL_PUBLIC_ID}.', 'success')\n", + "else:\n", + " display.alert('No TOOL_PUBLIC_ID set — skipped Athena push.', 'info')" + ] + }, + { + "cell_type": "markdown", + "id": "6f5befbb", + "metadata": {}, + "source": [ + "Continue with [`03_business_case.ipynb`](03_business_case.ipynb) →" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/studies/202602_AmazonConnect/notebooks/03_business_case.ipynb b/studies/202602_AmazonConnect/notebooks/03_business_case.ipynb new file mode 100644 index 0000000..1ed2c87 --- /dev/null +++ b/studies/202602_AmazonConnect/notebooks/03_business_case.ipynb @@ -0,0 +1,221 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 03 — Business Case\n", + "\n", + "Combine the benefits and costs into the consolidated TEI summary,\n", + "render the Cash Flow chart, and run scenario analysis. This notebook\n", + "should reproduce the headline numbers from the PDF Financial Summary:\n", + "\n", + "* **NPV $78.7M • ROI 342% • Payback <6 months**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "from pathlib import Path\n", + "\n", + "ROOT = Path.cwd().resolve()\n", + "while ROOT != ROOT.parent and not (ROOT / 'core').is_dir():\n", + " ROOT = ROOT.parent\n", + "if str(ROOT) not in sys.path:\n", + " sys.path.insert(0, str(ROOT))\n", + "STUDY = ROOT / 'studies' / '202602_AmazonConnect'\n", + "if str(STUDY) not in sys.path:\n", + " sys.path.insert(0, str(STUDY))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import config\n", + "import seed_data\n", + "from core.export import build_report_data\n", + "from core.export.report_data import _compute_summary\n", + "from core.notebook_helpers import charts, display, tables" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Local summary (no Athena round-trip)\n", + "\n", + "Compute the moderate-case TEI summary directly from `seed_data` so the\n", + "notebook produces results even before the Athena tool is provisioned." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "summary = _compute_summary(\n", + " seed_data.BENEFITS,\n", + " seed_data.COSTS,\n", + " config.DISCOUNT_RATE,\n", + " config.ANALYSIS_YEARS,\n", + ")\n", + "# `_compute_summary` returns roi_pct; expose it as `roi` for kpi_cards.\n", + "summary['roi'] = summary.get('roi_pct')\n", + "display.kpi_cards(summary, title='Forrester composite — moderate case')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_cash = tables.cashflow_table(summary)\n", + "df_cash.style.format({c: '${:,.0f}' for c in df_cash.columns if c != 'Year'})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Cash flow chart\n", + "\n", + "Mirrors the chart on PDF page 25: stacked benefits/costs by year +\n", + "cumulative-net line." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "charts.cashflow_chart(\n", + " summary['yearly_breakdown'],\n", + " initial_cost=summary.get('initial_costs', 0),\n", + ").show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Waterfall: Benefits PV → Costs PV → NPV" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "charts.waterfall([\n", + " ('Benefits PV', summary['total_benefits_pv']),\n", + " ('Costs PV', -summary['total_costs_pv']),\n", + " ('NPV', summary['npv']),\n", + "]).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scenario analysis\n", + "\n", + "Apply the default Palladium multipliers (see `core.calculations.SCENARIOS`):\n", + "\n", + "* **Conservative** — 80% adoption, +10pp risk on benefits / -10pp on costs\n", + "* **Moderate** — base case (= the published Forrester study)\n", + "* **Aggressive** — 115% adoption, -5pp risk on benefits / +5pp on costs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from core.calculations import apply_scenario\n", + "import pandas as pd\n", + "\n", + "scenario_summaries = {}\n", + "for name in ('conservative', 'moderate', 'aggressive'):\n", + " sb = apply_scenario(seed_data.BENEFITS, name, table='benefits')\n", + " sc = apply_scenario(seed_data.COSTS, name, table='costs')\n", + " scenario_summaries[name] = _compute_summary(sb, sc, config.DISCOUNT_RATE, config.ANALYSIS_YEARS)\n", + "\n", + "scen_df = pd.DataFrame([\n", + " {\n", + " 'Scenario': k,\n", + " 'Benefits PV': v['total_benefits_pv'],\n", + " 'Costs PV': v['total_costs_pv'],\n", + " 'NPV': v['npv'],\n", + " 'ROI %': v['roi_pct'],\n", + " 'Payback (mo)': round(v['payback_months'], 1) if v['payback_months'] is not None else None,\n", + " }\n", + " for k, v in scenario_summaries.items()\n", + "])\n", + "scen_df.style.format({\n", + " 'Benefits PV': '${:,.0f}', 'Costs PV': '${:,.0f}', 'NPV': '${:,.0f}', 'ROI %': '{:,.0f}%'\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "charts.scenario_comparison(scenario_summaries).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Cross-check vs Athena (optional)\n", + "\n", + "When `TOOL_PUBLIC_ID` is set, ask Athena to recalculate the summary on\n", + "the server side and confirm it matches our local computation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "if config.TOOL_PUBLIC_ID:\n", + " from core.tei_client import TEIClient\n", + "\n", + " client = TEIClient()\n", + " client.calculate(config.TOOL_PUBLIC_ID)\n", + " server_summary = client.get_summary(config.TOOL_PUBLIC_ID)\n", + " display.kpi_cards(server_summary, title='Athena server-side summary')\n", + "else:\n", + " display.alert('Set TOOL_PUBLIC_ID to compare Athena vs local.', 'info')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Continue with [`04_export.ipynb`](04_export.ipynb) →" + ] + } + ], + "metadata": { + "kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, + "language_info": {"name": "python", "version": "3.11"} + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/studies/202602_AmazonConnect/notebooks/04_export.ipynb b/studies/202602_AmazonConnect/notebooks/04_export.ipynb new file mode 100644 index 0000000..ce8b15c --- /dev/null +++ b/studies/202602_AmazonConnect/notebooks/04_export.ipynb @@ -0,0 +1,195 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "15a4163e", + "metadata": {}, + "source": [ + "# 04 — Export for the report pipeline\n", + "\n", + "Build the structured JSON envelope consumed by the html2docx report\n", + "generation pipeline (Peitho). Output goes to `exports/export.json`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18f02ef8", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "from pathlib import Path\n", + "\n", + "ROOT = Path.cwd().resolve()\n", + "while ROOT != ROOT.parent and not (ROOT / 'core').is_dir():\n", + " ROOT = ROOT.parent\n", + "if str(ROOT) not in sys.path:\n", + " sys.path.insert(0, str(ROOT))\n", + "STUDY = ROOT / 'studies' / '202602_AmazonConnect'\n", + "if str(STUDY) not in sys.path:\n", + " sys.path.insert(0, str(STUDY))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d91c01d", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "from datetime import datetime, timezone\n", + "\n", + "import config\n", + "import seed_data\n", + "from core import __version__\n", + "from core.calculations import apply_scenario\n", + "from core.export.report_data import _compute_summary\n", + "from core.notebook_helpers import display" + ] + }, + { + "cell_type": "markdown", + "id": "cff0b35b", + "metadata": {}, + "source": [ + "## Build the envelope\n", + "\n", + "Two paths:\n", + "\n", + "* **Live** — `core.export.build_report_data(client, public_id)` pulls\n", + " authoritative values + summary from Athena and stamps it.\n", + "* **Local** — when no `TOOL_PUBLIC_ID` is configured, build the envelope\n", + " directly from `seed_data` so this notebook is always runnable." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19416ff3", + "metadata": {}, + "outputs": [], + "source": [ + "if config.TOOL_PUBLIC_ID:\n", + " from core.export import build_report_data\n", + " from core.tei_client import TEIClient\n", + "\n", + " client = TEIClient()\n", + " envelope = build_report_data(\n", + " client,\n", + " config.TOOL_PUBLIC_ID,\n", + " include_scenarios=True,\n", + " study_slug=config.STUDY_SLUG,\n", + " )\n", + " source = 'live (Athena)'\n", + "else:\n", + " summary = _compute_summary(\n", + " seed_data.BENEFITS, seed_data.COSTS, config.DISCOUNT_RATE, config.ANALYSIS_YEARS\n", + " )\n", + " summary['roi'] = summary.get('roi_pct')\n", + " scenarios = {}\n", + " for name in ('conservative', 'moderate', 'aggressive'):\n", + " sb = apply_scenario(seed_data.BENEFITS, name, table='benefits')\n", + " sc = apply_scenario(seed_data.COSTS, name, table='costs')\n", + " scenarios[name] = _compute_summary(sb, sc, config.DISCOUNT_RATE, config.ANALYSIS_YEARS)\n", + " envelope = {\n", + " 'metadata': {\n", + " 'study_slug': config.STUDY_SLUG,\n", + " 'tool_public_id': '',\n", + " 'tool_name': 'Amazon Connect TEI (local seed)',\n", + " 'report_name': 'Total Economic Impact™ Of Amazon Connect',\n", + " 'report_vendor': 'AWS',\n", + " 'report_version': '1.0',\n", + " 'generated_at': datetime.now(timezone.utc).isoformat(),\n", + " 'generator': f'palladium core {__version__} (offline)',\n", + " },\n", + " 'report': {\n", + " 'name': 'Total Economic Impact™ Of Amazon Connect',\n", + " 'vendor': 'AWS',\n", + " 'version': '1.0',\n", + " 'discount_rate': config.DISCOUNT_RATE,\n", + " 'analysis_period_years': config.ANALYSIS_YEARS,\n", + " },\n", + " 'values': {'benefits': seed_data.BENEFITS, 'costs': seed_data.COSTS},\n", + " 'summary': summary,\n", + " 'scenarios': scenarios,\n", + " 'assumptions': seed_data.ASSUMPTIONS,\n", + " }\n", + " source = 'offline seed data'\n", + "\n", + "display.alert(f'Envelope built from {source}.', 'info')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98e94d07", + "metadata": {}, + "outputs": [], + "source": [ + "out_path = STUDY / 'exports' / 'export.json'\n", + "out_path.parent.mkdir(parents=True, exist_ok=True)\n", + "out_path.write_text(json.dumps(envelope, indent=2, default=str))\n", + "size_kb = out_path.stat().st_size / 1024\n", + "display.alert(f'Wrote {out_path.relative_to(ROOT)} ({size_kb:.1f} KB).', 'success')" + ] + }, + { + "cell_type": "markdown", + "id": "d09cad64", + "metadata": {}, + "source": [ + "## Envelope shape\n", + "\n", + "Top-level keys consumed by the report pipeline:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "841f12a1", + "metadata": {}, + "outputs": [], + "source": [ + "for key in envelope:\n", + " sub = envelope[key]\n", + " if isinstance(sub, dict):\n", + " print(f' {key}: dict with keys {list(sub.keys())}')\n", + " elif isinstance(sub, list):\n", + " print(f' {key}: list[{len(sub)}]')\n", + " else:\n", + " print(f' {key}: {type(sub).__name__}')" + ] + }, + { + "cell_type": "markdown", + "id": "17d6d0ce", + "metadata": {}, + "source": [ + "Done. Hand off `exports/export.json` to **Peitho** / **html2docx** to produce the final Word report." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/studies/202602_AmazonConnect/seed_data.py b/studies/202602_AmazonConnect/seed_data.py new file mode 100644 index 0000000..9142cf6 --- /dev/null +++ b/studies/202602_AmazonConnect/seed_data.py @@ -0,0 +1,162 @@ +""" +Seed dataset for the Amazon Connect TEI (Forrester, Feb 2026). + +Each row matches the wire shape produced by +``core.tei_client.TEIClient._normalize_value`` so it can be passed +straight to ``client.update_values(public_id, BENEFITS + COSTS)``. + +Numbers are the *nominal* (pre-risk-adjustment) values from the PDF — +risk adjustment is stored as a factor and applied by Athena's +calculator (or, locally, by ``core.calculations.risk_adjust_*``). + +References for the totals (from the PDF): + + Benefits (3-yr risk-adjusted PV @ 10%): $101,696,791 + Costs (3-yr risk-adjusted PV @ 10%): $ 22,983,076 + NPV $ 78,713,715 + ROI 342% + Payback <6 months +""" + +from __future__ import annotations + +#: 3-year nominal benefit cashflows. Risk adjustment factor is stored +#: separately; calculator applies it. +BENEFITS: list[dict] = [ + { + "field_key": "ai_contact_resolution", + "table": "benefits", + "label": "AI-driven contact resolution efficiency", + "category": "Productivity", + "year_values": {"1": 13_911_040, "2": 23_932_480, "3": 37_797_760}, + "risk_adjustment": 0.15, + "notes": ( + "PDF Section At/Atr. Composite: 20M annual contacts, 30% YoY " + "growth, 75% calls, 10-min AHT with legacy. Connect drops AHT " + "12% Y1 and shifts traffic to chat/self-service. 80% " + "productivity recapture. Risk adj 15% (legacy performance, " + "implementation depth, integration scope, growth)." + ), + }, + { + "field_key": "ai_content_sentiment", + "table": "benefits", + "label": "AI-powered content and sentiment analysis savings", + "category": "Productivity", + "year_values": {"1": 4_586_620, "2": 5_358_412, "3": 6_291_680}, + "risk_adjustment": 0.15, + "notes": ( + "PDF Section Bt/Btr. Auto post-contact summaries reclaim ~60s " + "per call; QA scaled from 1–3% to 100%; supervisors freed from " + "manual review. Risk adj 15%." + ), + }, + { + "field_key": "ai_forecasting_supervision", + "table": "benefits", + "label": "AI-enabled forecasting, agent scheduling, and supervision", + "category": "Productivity", + "year_values": {"1": 6_651_680, "2": 9_133_760, "3": 12_391_712}, + "risk_adjustment": 0.15, + "notes": ( + "PDF Section Ct/Ctr. ML-WFM yields 5% agent FTE optimization " + "and supervisors managing 20% more agents (10→12). 80% " + "productivity recapture. Risk adj 15%." + ), + }, + { + "field_key": "data_driven_profit_lift", + "table": "benefits", + "label": "Data-driven profit lift with increased conversion", + "category": "Revenue", + "year_values": {"1": 1_200_000, "2": 1_560_000, "3": 2_028_000}, + "risk_adjustment": 0.20, + "notes": ( + "PDF Section Dt/Dtr. Composite revenue $10B Y1 (+30% YoY); " + "5% from outbound contact-center marketing; conversion lifts " + "from 10% to 12% (+20% relative); 12% operating margin. " + "Risk adj 20%." + ), + }, + { + "field_key": "legacy_solution_savings", + "table": "benefits", + "label": "Legacy solution cost savings", + "category": "Cost Savings", + "year_values": {"1": 6_177_600, "2": 8_030_880, "3": 10_440_144}, + "risk_adjustment": 0.20, + "notes": ( + "PDF Section Et/Etr. Avg legacy license $180/agent-month × " + "(agents+supervisors) × 12, plus 30% overhead for infra & " + "third-party tools. Risk adj 20%." + ), + }, +] + + +#: Costs include an "initial" (year-0, undiscounted) component for +#: implementation. Cost risk adjustments are applied *upward*. +COSTS: list[dict] = [ + { + "field_key": "amazon_connect_usage", + "table": "costs", + "label": "Amazon Connect usage cost", + "category": "Subscription", + "initial": 0, + "year_values": {"1": 6_456_448, "2": 7_951_164, "3": 9_832_961}, + "risk_adjustment": 0.05, + "notes": ( + "PDF Section Ft/Ftr. Telephony $0.0106/min + Unlimited AI " + "$0.0380/min on minutes that reach an agent, plus chat at " + "$0.0100/message (10 messages/chat). Risk adj 5%." + ), + }, + { + "field_key": "implementation_migration", + "table": "costs", + "label": "Implementation and migration cost", + "category": "Implementation", + "initial": 1_087_500, + "year_values": {"1": 188_333, "2": 188_333, "3": 0}, + "risk_adjustment": 0.10, + "notes": ( + "PDF Section Gt/Gtr. 6-month initial migration: 5 internal " + "FTE @ $115k + $800k pro-services. Y1/Y2 M&A integrations: 2 " + "months × 2 FTE + $150k pro-services. Risk adj 10%." + ), + }, + { + "field_key": "ongoing_management", + "table": "costs", + "label": "Ongoing management", + "category": "Operations", + "initial": 0, + "year_values": {"1": 256_200, "2": 187_200, "3": 187_200}, + "risk_adjustment": 0.15, + "notes": ( + "PDF Section Ht/Htr. Y1: 5 IT/PM @ 30% × $115k + 5 business " + "users @ 30% × $55,800. Y2/Y3: 3 IT/PM @ 30% + 5 business " + "users @ 30%. Risk adj 15%." + ), + }, +] + + +#: Top-line composite assumptions — for the 03_business_case narrative. +ASSUMPTIONS: dict = { + "agents_fte": 2_000, + "supervisors_fte": 200, + "annual_contacts_y1": 20_000_000, + "growth_rate": 0.30, + "call_share": 0.75, + "aht_legacy_minutes": 10, + "agent_salary": 45_760, + "supervisor_salary": 55_800, + "discount_rate": 0.10, + "analysis_years": 3, +} + + +def all_values() -> list[dict]: + """Return BENEFITS + COSTS — handy single-call payload for update_values.""" + return BENEFITS + COSTS diff --git a/studies/__init__.py b/studies/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..f127dbf --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,32 @@ +"""Pytest fixtures for Palladium tests.""" + +from __future__ import annotations + +import os +import sys +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parent.parent +if str(ROOT) not in sys.path: + sys.path.insert(0, str(ROOT)) + + +@pytest.fixture(autouse=True) +def _env(monkeypatch): + """Default test env vars so TEIClient() doesn't need a real .env.""" + monkeypatch.setenv("ATHENA_BASE_URL", "https://athena.test") + monkeypatch.setenv("ATHENA_API_KEY", "test-key") + + +@pytest.fixture +def amazon_connect_seed(): + """Load the Amazon Connect study's seed data.""" + sys.path.insert(0, str(ROOT / "studies" / "202602_AmazonConnect")) + try: + import seed_data # type: ignore[import-not-found] + return seed_data + finally: + # Leave the path alone — many tests will use the seed + pass diff --git a/tests/test_calculations.py b/tests/test_calculations.py new file mode 100644 index 0000000..a96d7a0 --- /dev/null +++ b/tests/test_calculations.py @@ -0,0 +1,206 @@ +""" +Tests for core.calculations — reproduces the Forrester Amazon Connect TEI +totals from the published study within rounding. + +The PDF reports (Cash Flow Analysis, p.25): + Benefits PV (RA) = $101,696,791 + Costs PV (RA) = $ 22,983,076 + NPV = $ 78,713,715 + ROI = 342% + Payback = <6 months +""" + +from __future__ import annotations + +import pytest + +from core.calculations import ( + SCENARIOS, + apply_scenario, + discount_factor, + npv, + payback_months, + payback_years, + present_value, + present_value_series, + risk_adjust_benefit, + risk_adjust_cost, + roi, + roi_percentage, +) + +# ───────────────────────────────────────────── +# Building blocks +# ───────────────────────────────────────────── + + +class TestDiscounting: + def test_discount_factor_year_zero(self): + assert discount_factor(0, 0.10) == pytest.approx(1.0) + + def test_discount_factor_known_value(self): + # 1/(1.10)^3 + assert discount_factor(3, 0.10) == pytest.approx(0.7513148, rel=1e-5) + + def test_negative_year_raises(self): + with pytest.raises(ValueError): + discount_factor(-1, 0.10) + + def test_present_value_year_one(self): + assert present_value(110, 1, 0.10) == pytest.approx(100.0) + + def test_present_value_series_three_years(self): + # 100 each year for 3 years at 10% → ≈ 248.685 + assert present_value_series([100, 100, 100], 0.10) == pytest.approx( + 248.685, rel=1e-3 + ) + + +class TestNPV: + def test_zero_initial(self): + assert npv([100, 100], 0.0) == pytest.approx(200.0) + + def test_with_initial(self): + # 1000 invested up-front, 600 returned each of 2 years at 10% + result = npv([600, 600], 0.10, initial=-1000) + # PV of returns ≈ 545.45 + 495.87 = 1041.32, NPV ≈ 41.32 + assert result == pytest.approx(41.32, abs=0.5) + + +class TestRiskAdjustment: + def test_benefit_zero_risk(self): + assert risk_adjust_benefit(100, 0.0) == 100 + + def test_benefit_15pct(self): + assert risk_adjust_benefit(100, 0.15) == pytest.approx(85.0) + + def test_cost_5pct_upward(self): + assert risk_adjust_cost(100, 0.05) == pytest.approx(105.0) + + def test_clamping(self): + assert risk_adjust_benefit(100, 1.5) == 0 # clamped to 1.0 + assert risk_adjust_benefit(100, -0.5) == 100 # clamped to 0 + + +class TestROI: + def test_zero_costs_returns_zero(self): + assert roi(100, 0) == 0.0 + + def test_known(self): + assert roi_percentage(101_696_791, 22_983_076) == pytest.approx(342, abs=1) + + +class TestPayback: + def test_immediate(self): + assert payback_years(0, [100]) == 0.0 + + def test_amazon_connect_under_six_months(self): + # Initial $1.196M, Y1 net ~$20M → quick crossing + years = payback_years(1_196_250, [19_997_953, 31_562_489, 47_443_905]) + assert years is not None + assert payback_months(1_196_250, [19_997_953, 31_562_489, 47_443_905]) < 6 + + def test_never_recovered(self): + assert payback_years(1000, [100, 100, 100]) is None + + +class TestScenarios: + def test_default_scenarios_present(self): + assert set(SCENARIOS) == {"conservative", "moderate", "aggressive"} + + def test_moderate_is_passthrough(self): + items = [ + { + "table": "benefits", + "field_key": "x", + "year_values": {"1": 1000, "2": 2000}, + "risk_adjustment": 0.15, + } + ] + out = apply_scenario(items, "moderate") + assert out[0]["year_values"] == {"1": 1000.0, "2": 2000.0} + assert out[0]["risk_adjustment"] == pytest.approx(0.15) + + def test_conservative_lowers_benefits(self): + items = [ + { + "table": "benefits", + "field_key": "x", + "year_values": {"1": 1000}, + "risk_adjustment": 0.15, + } + ] + out = apply_scenario(items, "conservative") + assert out[0]["year_values"]["1"] == pytest.approx(800.0) + # 0.15 + 0.10 = 0.25 + assert out[0]["risk_adjustment"] == pytest.approx(0.25) + + def test_aggressive_increases_benefits(self): + items = [ + { + "table": "benefits", + "field_key": "x", + "year_values": {"1": 1000}, + "risk_adjustment": 0.15, + } + ] + out = apply_scenario(items, "aggressive") + assert out[0]["year_values"]["1"] == pytest.approx(1150.0) + assert out[0]["risk_adjustment"] == pytest.approx(0.10) + + def test_unknown_scenario_raises(self): + with pytest.raises(KeyError): + apply_scenario([], "purple") + + +# ───────────────────────────────────────────── +# End-to-end: reproduce the PDF totals +# ───────────────────────────────────────────── + + +class TestAmazonConnectComposite: + """Reproduce the Forrester Amazon Connect TEI numbers within rounding.""" + + DISCOUNT_RATE = 0.10 + EXPECTED_BENEFITS_PV = 101_696_791 + EXPECTED_COSTS_PV = 22_983_076 + EXPECTED_NPV = 78_713_715 + EXPECTED_ROI = 342 # percent + TOLERANCE = 1_500 # dollars; PDF rounding at thousands + + def _benefits_pv(self, seed) -> float: + total = 0.0 + for b in seed.BENEFITS: + rf = b["risk_adjustment"] + yr = [b["year_values"][str(y)] for y in (1, 2, 3)] + yr_ra = [risk_adjust_benefit(v, rf) for v in yr] + total += npv(yr_ra, self.DISCOUNT_RATE) + return total + + def _costs_pv(self, seed) -> float: + total = 0.0 + for c in seed.COSTS: + rf = c["risk_adjustment"] + init = risk_adjust_cost(c.get("initial") or 0, rf) + yr = [c["year_values"][str(y)] for y in (1, 2, 3)] + yr_ra = [risk_adjust_cost(v, rf) for v in yr] + total += npv(yr_ra, self.DISCOUNT_RATE, initial=init) + return total + + def test_benefits_pv(self, amazon_connect_seed): + result = self._benefits_pv(amazon_connect_seed) + assert result == pytest.approx(self.EXPECTED_BENEFITS_PV, abs=self.TOLERANCE) + + def test_costs_pv(self, amazon_connect_seed): + result = self._costs_pv(amazon_connect_seed) + assert result == pytest.approx(self.EXPECTED_COSTS_PV, abs=self.TOLERANCE) + + def test_npv(self, amazon_connect_seed): + b = self._benefits_pv(amazon_connect_seed) + c = self._costs_pv(amazon_connect_seed) + assert (b - c) == pytest.approx(self.EXPECTED_NPV, abs=self.TOLERANCE) + + def test_roi(self, amazon_connect_seed): + b = self._benefits_pv(amazon_connect_seed) + c = self._costs_pv(amazon_connect_seed) + assert roi_percentage(b, c) == pytest.approx(self.EXPECTED_ROI, abs=1) diff --git a/tests/test_client.py b/tests/test_client.py new file mode 100644 index 0000000..f59d048 --- /dev/null +++ b/tests/test_client.py @@ -0,0 +1,174 @@ +""" +TEI client tests with mocked HTTP. + +We mock ``requests.Session.request`` so tests do not require network access +or a live Athena instance. +""" + +from __future__ import annotations + +import json +from unittest.mock import MagicMock + +import pytest + +from core.tei_client import AthenaAPIError, TEIClient + + +def _mock_response(status: int, body=None) -> MagicMock: + resp = MagicMock() + resp.status_code = status + resp.content = b"{}" if body is None else json.dumps(body).encode() + resp.json.return_value = body if body is not None else {} + resp.text = json.dumps(body or {}) + return resp + + +@pytest.fixture +def client(monkeypatch) -> TEIClient: + c = TEIClient() + c.session = MagicMock() + return c + + +class TestConfig: + def test_requires_base_url(self, monkeypatch): + monkeypatch.delenv("ATHENA_BASE_URL", raising=False) + with pytest.raises(ValueError, match="ATHENA_BASE_URL"): + TEIClient(api_key="x") + + def test_requires_api_key(self, monkeypatch): + monkeypatch.delenv("ATHENA_API_KEY", raising=False) + with pytest.raises(ValueError, match="ATHENA_API_KEY"): + TEIClient(base_url="https://example.com") + + def test_authorization_header(self): + c = TEIClient(base_url="https://example.com", api_key="abc123") + assert c.session.headers["Authorization"] == "Api-Key abc123" + + +class TestPaths: + """Verify each endpoint targets the documented URL.""" + + def _last_call_url(self, client: TEIClient) -> str: + return client.session.request.call_args.kwargs["url"] + + def test_list_reports_path(self, client): + client.session.request.return_value = _mock_response( + 200, {"results": [], "next": None} + ) + client.list_reports() + assert self._last_call_url(client) == "https://athena.test/api/v1/tei/reports/" + + def test_get_tool_path(self, client): + client.session.request.return_value = _mock_response(200, {"id": "abc"}) + client.get_tool("abc123") + assert self._last_call_url(client).endswith("/api/v1/tei/tools/abc123/") + + def test_calculate_path(self, client): + client.session.request.return_value = _mock_response(200, {}) + client.calculate("abc") + assert self._last_call_url(client).endswith("/api/v1/tei/tools/abc/calculate/") + assert client.session.request.call_args.kwargs["method"] == "POST" + + def test_export_path(self, client): + client.session.request.return_value = _mock_response(200, {}) + client.export("abc") + assert self._last_call_url(client).endswith("/api/v1/tei/tools/abc/export/") + + def test_aggregate_summary_path(self, client): + client.session.request.return_value = _mock_response(200, {}) + client.aggregate_summary() + assert self._last_call_url(client).endswith("/api/v1/tei/summary/") + + def test_save_version_path(self, client): + client.session.request.return_value = _mock_response(201, {"version_number": 1}) + client.save_version("abc", note="initial") + url = self._last_call_url(client) + assert url.endswith("/api/v1/tei/tools/abc/versions/") + body = client.session.request.call_args.kwargs["json"] + assert body == {"note": "initial"} + + +class TestErrorHandling: + def test_404_raises_athena_error(self, client): + client.session.request.return_value = _mock_response( + 404, {"detail": "Not found"} + ) + with pytest.raises(AthenaAPIError) as ei: + client.get_tool("missing") + assert ei.value.status_code == 404 + assert "Not found" in ei.value.detail + + def test_test_connection_returns_error_dict(self, client): + client.session.request.return_value = _mock_response( + 401, {"detail": "Invalid token"} + ) + result = client.test_connection() + assert result["status"] == "error" + assert result["authenticated"] is False + assert result["error_code"] == 401 + + +class TestPagination: + def test_walks_next_links(self, client): + # First page returns one item with a `next` URL; second page returns + # one more item and no next. + page1 = _mock_response( + 200, + { + "results": [{"id": 1}], + "next": "https://athena.test/api/v1/tei/reports/?page=2", + }, + ) + page2 = _mock_response(200, {"results": [{"id": 2}], "next": None}) + client.session.request.return_value = page1 + client.session.get.return_value = page2 # follow next via session.get + + out = client.list_reports() + assert [r["id"] for r in out] == [1, 2] + + +class TestNormalizeValue: + def test_year_underscore_keys(self): + out = TEIClient._normalize_value( + {"field_key": "x", "year_1": 100, "year_2": 200, "risk_adjustment": 0.1} + ) + assert out["year_values"] == {"1": 100.0, "2": 200.0} + assert out["risk_adjustment"] == 0.1 + + def test_year_values_dict_passthrough(self): + out = TEIClient._normalize_value( + { + "field_key": "x", + "year_values": {"1": 50, "3": 75}, + "notes": " hi ", + } + ) + assert out["year_values"] == {"1": 50.0, "3": 75.0} + assert out["notes"] == " hi " + + def test_initial_carried(self): + out = TEIClient._normalize_value( + {"field_key": "x", "initial": 1000, "year_1": 5} + ) + assert out["initial"] == 1000.0 + + def test_scalar_value(self): + out = TEIClient._normalize_value({"field_key": "rate", "value": 0.10}) + assert out["value"] == 0.10 + assert "year_values" not in out + + +class TestUpdateValuesPayload: + def test_wraps_in_envelope(self, client): + client.session.request.return_value = _mock_response(200, {}) + client.update_values( + "abc", + [{"field_key": "x", "year_1": 100}, {"field_key": "y", "year_1": 200}], + ) + body = client.session.request.call_args.kwargs["json"] + assert "values" in body + assert len(body["values"]) == 2 + assert body["values"][0]["field_key"] == "x" + assert body["values"][0]["year_values"] == {"1": 100.0} diff --git a/tests/test_export.py b/tests/test_export.py new file mode 100644 index 0000000..11ac922 --- /dev/null +++ b/tests/test_export.py @@ -0,0 +1,98 @@ +"""Tests for core.export.report_data — envelope shape and computed totals.""" + +from __future__ import annotations + +from unittest.mock import MagicMock + +import pytest + +from core.export import build_report_data +from core.export.report_data import _compute_summary, _yearly_totals + + +class TestComputeSummary: + def test_amazon_connect_totals(self, amazon_connect_seed): + s = _compute_summary( + amazon_connect_seed.BENEFITS, + amazon_connect_seed.COSTS, + 0.10, + 3, + ) + assert s["total_benefits_pv"] == pytest.approx(101_696_791, abs=1500) + assert s["total_costs_pv"] == pytest.approx(22_983_076, abs=1500) + assert s["npv"] == pytest.approx(78_713_715, abs=2000) + assert s["roi_pct"] == pytest.approx(342, abs=1) + assert s["payback_months"] is not None and s["payback_months"] < 6 + + def test_yearly_breakdown_three_rows(self, amazon_connect_seed): + s = _compute_summary( + amazon_connect_seed.BENEFITS, amazon_connect_seed.COSTS, 0.10, 3 + ) + assert len(s["yearly_breakdown"]) == 3 + assert [r["year"] for r in s["yearly_breakdown"]] == [1, 2, 3] + + +class TestYearlyTotals: + def test_only_within_horizon(self): + items = [ + {"year_values": {"1": 100, "2": 200, "3": 300, "4": 999}}, + ] + assert _yearly_totals(items, 3) == [100.0, 200.0, 300.0] + + def test_skips_invalid_keys(self): + items = [{"year_values": {"1": 50, "abc": 999}}] + assert _yearly_totals(items, 2) == [50.0, 0.0] + + +class TestBuildReportData: + def _stub_client(self, seed): + c = MagicMock() + c.get_tool_with_data.return_value = { + "tool": {"id": "pid", "name": "T", "report": "rid", "proposal": 7}, + "fields": [], + "values": seed.BENEFITS + seed.COSTS, + } + c.get_report.return_value = { + "id": "rid", + "name": "Amazon Connect", + "vendor": "AWS", + "version": "1.0", + "discount_rate": "0.10", + "analysis_period_years": 3, + } + c.export.return_value = {"echoed": True} + return c + + def test_envelope_shape(self, amazon_connect_seed): + client = self._stub_client(amazon_connect_seed) + env = build_report_data(client, "pid", study_slug="202602_AmazonConnect") + assert set(env) >= { + "metadata", + "report", + "fields", + "values", + "summary", + "athena_export", + "scenarios", + } + assert env["metadata"]["study_slug"] == "202602_AmazonConnect" + assert env["metadata"]["proposal"] == 7 + assert env["values"]["benefits"] + assert env["values"]["costs"] + + def test_scenarios_have_three_keys(self, amazon_connect_seed): + client = self._stub_client(amazon_connect_seed) + env = build_report_data(client, "pid") + assert set(env["scenarios"]) == {"conservative", "moderate", "aggressive"} + + def test_no_scenarios_flag(self, amazon_connect_seed): + client = self._stub_client(amazon_connect_seed) + env = build_report_data(client, "pid", include_scenarios=False) + assert "scenarios" not in env + + def test_local_summary_matches_seed(self, amazon_connect_seed): + client = self._stub_client(amazon_connect_seed) + env = build_report_data(client, "pid", include_scenarios=False) + assert env["summary"]["total_benefits_pv"] == pytest.approx( + 101_696_791, abs=1500 + )