From a6d5f2ab1cddcb9bf57396109402fd280676013f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 17 May 2026 22:00:53 +0000 Subject: [PATCH 1/2] feat(api): api update --- .stats.yml | 4 +- .../dealers/nlt/offer_retrieve_response.py | 200 ++++++++++++++---- 2 files changed, 163 insertions(+), 41 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1ab0ec9..23e57fa 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 12 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/azure/partnermax-52b9912a508298f3c622752ebf2b3a23da0c923955e1c5effe76912f7ed00b44.yml -openapi_spec_hash: 549792bed17760a971f104f9268072b2 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/azure/partnermax-6b46d3e49935c9b6d7df9150b7dad7fc184b4f1edaf47d3c1626785ea8eea04b.yml +openapi_spec_hash: 32e26e0ae2574e8356931eef53062c7e config_hash: bf921bb2f4db038ffed15141c74cd018 diff --git a/src/partnermax/types/dealers/nlt/offer_retrieve_response.py b/src/partnermax/types/dealers/nlt/offer_retrieve_response.py index 9d5f4f6..58f5599 100644 --- a/src/partnermax/types/dealers/nlt/offer_retrieve_response.py +++ b/src/partnermax/types/dealers/nlt/offer_retrieve_response.py @@ -1,82 +1,204 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional +from datetime import datetime from typing_extensions import Literal from ...._models import BaseModel -from .nlt_offer_summary import NltOfferSummary __all__ = [ "OfferRetrieveResponse", - "OfferRetrieveResponseQuotation", - "OfferRetrieveResponseSpecs", - "OfferRetrieveResponseDealerCard", - "OfferRetrieveResponseOptionalAccessory", + "AccessoriInclusi", + "AddonsDisponibili", + "AddonsDisponibiliAutoSostitutiva", + "AddonsDisponibiliPneumatici", + "AnticipoScenariEur", + "AnticipoScenariLabels", + "Gallery", + "NetworkOffer", + "Quotazioni", + "Tag", ] -class OfferRetrieveResponseQuotation(BaseModel): - down_payment_eur: int - """Down-payment amount in EUR for this tier (from the dealer's NLT settings).""" +class AccessoriInclusi(BaseModel): + codice: str - down_payment_tier: Literal["low", "medium", "high"] + descrizione: str - duration_months: Literal[24, 36, 48] + prezzo_extra_eur: float - km_per_year: Literal[10000, 15000, 20000, 25000, 30000, 40000] - monthly_canon_eur: float - """Displayed monthly canon (includes dealer markup + VAT treatment).""" +class AddonsDisponibiliAutoSostitutiva(BaseModel): + categoria_default: str + """Replacement vehicle category (B fixed).""" + categoria_descrizione: str -class OfferRetrieveResponseSpecs(BaseModel): - co2_g_per_km: Optional[int] = None + costo_mensile_eur: float - engine_displacement_cc: Optional[int] = None - height_mm: Optional[int] = None +class AddonsDisponibiliPneumatici(BaseModel): + costo_treno_eur: float + """Cost of one set of 4 tyres, EUR.""" - length_mm: Optional[int] = None + diametro_in: int + """Tyre diameter in inches.""" - power_kw: Optional[float] = None + regola_cambio: str + """Replacement rule (e.g. one set every 30 000 km, rounded up).""" - transmission: Optional[str] = None - trunk_litres: Optional[int] = None +class AddonsDisponibili(BaseModel): + auto_sostitutiva: Optional[AddonsDisponibiliAutoSostitutiva] = None + + pneumatici: Optional[AddonsDisponibiliPneumatici] = None + + +class AnticipoScenariEur(BaseModel): + anticipo_medio: int + """12.5% down-payment scenario, whole EUR.""" + + anticipo_standard: int + """25% down-payment scenario, whole EUR (matches vetrina canon).""" + + anticipo_zero: int + """Zero down-payment scenario, whole EUR.""" + + +class AnticipoScenariLabels(BaseModel): + anticipo_medio: str + + anticipo_standard: str + + anticipo_zero: str + + +class Gallery(BaseModel): + is_cover: bool + + url: str - width_mm: Optional[int] = None +class NetworkOffer(BaseModel): + canone_mensile_min_eur: float -class OfferRetrieveResponseDealerCard(BaseModel): - business_name: Optional[str] = None + dealer_id: int + + dealer_name: str city: Optional[str] = None + contact_url: Optional[str] = None + + google_maps_url: Optional[str] = None + phone: Optional[str] = None - primary_domain: Optional[str] = None + province: Optional[str] = None + + rating_value: Optional[float] = None + + review_count: Optional[int] = None + + +class Quotazioni(BaseModel): + canone_mensile_eur: float + """Displayed monthly canon for this (durata, km) cell. + + Computed by `calcola_canone_vetrina` for the primary dealer of the partner + network; VAT-inclusive when `solo_privati=true`. + """ + + durata_mesi: Literal[36, 48, 60] + + km_inclusi_anno: Literal[10000, 15000, 20000, 25000, 30000, 40000] + + +class Tag(BaseModel): + name: str - province_code: Optional[str] = None + color: Optional[str] = None + """Hex color for tag chip.""" + icon: Optional[str] = None + """FontAwesome icon class.""" -class OfferRetrieveResponseOptionalAccessory(BaseModel): - label: str - monthly_canon_delta_eur: float +class OfferRetrieveResponse(BaseModel): + """Full offer detail. + Shape mirrors apimax MCP `get_nlt_offer_details` (`apimax/app/api/mcp_server.py::_tool_get_nlt_offer_details`) bit-for-bit so partnermax SDK consumers stay aligned with the Custom GPT / MCP clients on the DealerMAX network. + """ -class OfferRetrieveResponse(NltOfferSummary): - included_services: List[ - Literal["full_insurance", "maintenance", "road_tax", "tires", "replacement_vehicle", "roadside_assistance"] - ] + found: bool - quotations: List[OfferRetrieveResponseQuotation] - """All 54 displayed price points (18 base quotations × 3 down-payment tiers).""" + iva_inclusa: bool + """True when canon is VAT-inclusive (i.e. `solo_privati=true`).""" - specs: OfferRetrieveResponseSpecs + network_dealer_count: int - dealer_card: Optional[OfferRetrieveResponseDealerCard] = None + slug: str + """Offer slug (stable identifier shared with apimax surfaces).""" - image_gallery: Optional[List[str]] = None + title: str + + accessori_inclusi: Optional[List[AccessoriInclusi]] = None + + addons_disponibili: Optional[AddonsDisponibili] = None + + anticipo_scenari_eur: Optional[AnticipoScenariEur] = None + + anticipo_scenari_labels: Optional[AnticipoScenariLabels] = None + + canone_mensile_min_eur: Optional[float] = None + """ + Lowest canon across the partner network for this offer (primary dealer's price). + """ + + description_full: Optional[str] = None + """AI-generated long-form description.""" + + description_short: Optional[str] = None + + fuel_type: Optional[str] = None + """Raw Italian label from `nlt_offerte.alimentazione` (e.g. "Benzina", "Ibrida").""" + + gallery: Optional[List[Gallery]] = None + + image_url: Optional[str] = None + + last_modified: Optional[datetime] = None + + marca: Optional[str] = None + + modello: Optional[str] = None + + network_offers: Optional[List[NetworkOffer]] = None + """All the partner's dealers that can fulfil this offer, sorted by canon ASC.""" + + prezzo_totale_eur: Optional[float] = None + """List price IVA-inclusive (vehicle + accessories + MSS).""" + + primary_dealer_city: Optional[str] = None + + primary_dealer_name: Optional[str] = None + + primary_dealer_province: Optional[str] = None + + quotazioni: Optional[List[Quotazioni]] = None + + segmento: Optional[str] = None + + solo_privati: Optional[bool] = None + """Per-offer VAT scope: true → consumer-facing (B2C, VAT-inclusive). + + false → business (B2B, VAT-exclusive). + """ + + tags: Optional[List[Tag]] = None + + transmission: Optional[str] = None + """Raw Italian label from `nlt_offerte.cambio`.""" - optional_accessories: Optional[List[OfferRetrieveResponseOptionalAccessory]] = None + versione: Optional[str] = None From df44187b64715783b33558e74fb738750d1b3dc9 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 17 May 2026 22:01:09 +0000 Subject: [PATCH 2/2] release: 0.3.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ pyproject.toml | 2 +- src/partnermax/_version.py | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 10f3091..6b7b74c 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.2.0" + ".": "0.3.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bd52aa..3e81646 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.3.0 (2026-05-17) + +Full Changelog: [v0.2.0...v0.3.0](https://github.com/DealerMax-app/partnermax-python/compare/v0.2.0...v0.3.0) + +### Features + +* **api:** api update ([a6d5f2a](https://github.com/DealerMax-app/partnermax-python/commit/a6d5f2ab1cddcb9bf57396109402fd280676013f)) + ## 0.2.0 (2026-05-17) Full Changelog: [v0.1.0...v0.2.0](https://github.com/DealerMax-app/partnermax-python/compare/v0.1.0...v0.2.0) diff --git a/pyproject.toml b/pyproject.toml index b261929..d3af4fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "partnermax" -version = "0.2.0" +version = "0.3.0" description = "The official Python library for the partnermax API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/partnermax/_version.py b/src/partnermax/_version.py index 8ebf0ab..19db8ef 100644 --- a/src/partnermax/_version.py +++ b/src/partnermax/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "partnermax" -__version__ = "0.2.0" # x-release-please-version +__version__ = "0.3.0" # x-release-please-version