Skip to content

Api reference

components.instant_quote.public.blueprint

create_api

create_api(app_or_blueprint)
Source code in components/instant_quote/public/blueprint.py
def create_api(app_or_blueprint) -> None:  # type: ignore[no-untyped-def]  # noqa: D103
    from shared.api.custom_api import CustomApi

    api = CustomApi(app_or_blueprint)

    @api.representation("application/json")
    def output_json(data, code, headers=None):  # type: ignore[no-untyped-def]
        """Tells flask-restful to use the flask json serializer instead of json."""
        return make_response(jsonify(data), code, headers)

    from components.instant_quote.public.controllers.admin_instant_quotes import (
        admin_instant_quote_endpoint,
    )
    from components.instant_quote.public.controllers.instant_quote import (
        instant_quote_endpoint,
    )

    api.add_endpoint(instant_quote_endpoint)
    api.add_endpoint(admin_instant_quote_endpoint)

instant_quote_api_blueprint module-attribute

instant_quote_api_blueprint = CustomBlueprint(
    "instant_quote_api_blueprint", __name__
)

components.instant_quote.public.controllers

admin_instant_quotes

AdminInstantQuoteController

Bases: BaseController

delete
delete(id)
Source code in components/instant_quote/public/controllers/admin_instant_quotes.py
@view_method(
    auth_strategy=GlobalAuthorizationStrategies().alaner_admin(
        permitted_for={EmployeePermission.use_offer_builder}
    ),
)
@obs.api_call()
def delete(self, id: str):  # type: ignore[no-untyped-def]  # noqa: D102
    from components.instant_quote.internal.instant_quote import (
        delete_instant_quote as delete_instant_quote_api,
    )

    delete_instant_quote_api(instant_quote_id=id)
    current_session.commit()
    return make_json_response()

admin_instant_quote_endpoint module-attribute

admin_instant_quote_endpoint = Endpoint(
    "/marmot/instant_quotes"
)

create_instant_quote

create_instant_quote(params)
Source code in components/instant_quote/public/controllers/admin_instant_quotes.py
@AdminInstantQuoteController.action_route(
    "",
    methods=["POST"],
    auth_strategy=GlobalAuthorizationStrategies().alaner_admin(
        permitted_for={EmployeePermission.use_offer_builder}
    ),
)
@request_argument("account_ref", type=str, required=True)
@request_argument("title", type=str, required=True)
@request_argument("introduction_paragraph", type=str, required=False)
@request_argument("competitor_product_ref", type=str, required=False)
@request_argument(
    "product_version",
    type=dict,  # TODO simplify in frontend, can send product_version_ref as simple str instead of dict
    required=True,
)
@request_argument("contact_email", type=str, required=False)
@obs.api_call()
def create_instant_quote(params):  # type: ignore[no-untyped-def]  # noqa: D103
    from datetime import timedelta

    from components.instant_quote.public.controllers.presenters.instant_quote import (
        InstantQuotePresenter,
    )
    from components.instant_quote.public.main import (
        create_instant_quote as create_instant_quote_api,
    )
    from shared.helpers.time.utc import utctoday

    instant_quote = create_instant_quote_api(
        account_ref=params["account_ref"],
        title=params["title"],
        introduction_paragraph=params.get("introduction_paragraph"),
        competitor_product_ref=params.get("competitor_product_ref"),
        product_version_ref=params["product_version"]["id"],
        creator_ref=g.current_user.id,
        creator_display_name=g.current_user.full_name,
        contact_email=params.get("contact_email"),
        expire_on=utctoday() + timedelta(days=7),
    )
    current_session.commit()

    return make_json_response(InstantQuotePresenter.from_entity(entity=instant_quote))

paginate_instant_quotes

paginate_instant_quotes(params)
Source code in components/instant_quote/public/controllers/admin_instant_quotes.py
@AdminInstantQuoteController.action_route(
    "",
    methods=["GET"],
    auth_strategy=GlobalAuthorizationStrategies().alaner_admin(
        permitted_for={EmployeePermission.use_offer_builder}
    ),
)
@request_argument("account_ref", type=str, required=True)
@obs.api_call()
def paginate_instant_quotes(params: dict):  # type: ignore[type-arg,no-untyped-def]  # noqa: D103
    from components.instant_quote.public.controllers.presenters.instant_quote import (
        InstantQuotePresenter,
    )
    from components.instant_quote.public.main import (
        paginate_instant_quotes as paginate_instant_quotes_api,
    )

    instant_quotes = paginate_instant_quotes_api(
        page=1, per_page=30, account_ref=params["account_ref"]
    )

    return make_json_response(
        [
            InstantQuotePresenter.from_entity(entity=quote)
            for quote in instant_quotes.items
        ]
    )

refresh_token

refresh_token(params)
Source code in components/instant_quote/public/controllers/admin_instant_quotes.py
@AdminInstantQuoteController.action_route(
    "/refresh_token",
    methods=["POST"],
    auth_strategy=GlobalAuthorizationStrategies().alaner_admin(
        permitted_for={EmployeePermission.use_offer_builder}
    ),
)
@request_argument("id", type=str, required=True)
@obs.api_call()
def refresh_token(params):  # type: ignore[no-untyped-def]  # noqa: D103
    from components.instant_quote.public.controllers.presenters.instant_quote import (
        InstantQuotePresenter,
    )
    from components.instant_quote.public.main import (
        get_instant_quote as get_instant_quote_entity,
        refresh_token as refresh_token_api,
    )

    refresh_token_api(instant_quote_id=params["id"])
    current_session.commit()

    instant_quote_entity = get_instant_quote_entity(instant_quote_id=params["id"])

    return make_json_response(
        InstantQuotePresenter.from_entity(entity=instant_quote_entity)
    )

instant_quote

InstantQuoteController

Bases: BaseController

get_alan_offer_coverage_table

get_alan_offer_coverage_table(instant_quote_id)
Source code in components/instant_quote/public/controllers/instant_quote.py
@InstantQuoteController.action_route(
    "/<instant_quote_id>/alan_offer_coverage_table",
    methods=["GET"],
    auth_strategy=AuthorizationStrategies.authenticated_with_token_fallback(
        token_extractor=InstantQuoteTokenGenerator.map_token_content,
    ),
)
@request_argument("token", type=str, required=False)
@obs.api_call()
def get_alan_offer_coverage_table(instant_quote_id: str):  # type: ignore[no-untyped-def]  # noqa: D103
    from components.instant_quote.external.builder_product import get_coverage_table
    from components.instant_quote.public.main import (
        get_instant_quote as get_instant_quote_api,
    )

    instant_quote = get_instant_quote_api(instant_quote_id=instant_quote_id)
    return make_json_response(
        get_coverage_table(product_version_ref=instant_quote.product_version_ref)
    )

get_competitor_offer_coverage_table

get_competitor_offer_coverage_table(instant_quote_id)
Source code in components/instant_quote/public/controllers/instant_quote.py
@InstantQuoteController.action_route(
    "/<instant_quote_id>/competitor_offer_coverage_table",
    methods=["GET"],
    auth_strategy=AuthorizationStrategies.authenticated_with_token_fallback(
        token_extractor=InstantQuoteTokenGenerator.map_token_content,
    ),
)
@request_argument("token", type=str, required=False)
@obs.api_call()
def get_competitor_offer_coverage_table(instant_quote_id: str):  # type: ignore[no-untyped-def]  # noqa: D103
    from components.instant_quote.external.competitor_product import get_coverage_table
    from components.instant_quote.public.main import (
        get_instant_quote as get_instant_quote_api,
    )

    instant_quote = get_instant_quote_api(instant_quote_id=instant_quote_id)

    if instant_quote.competitor_product_ref is None:
        abort(404)

    return make_json_response(
        get_coverage_table(competitor_product_ref=instant_quote.competitor_product_ref)
    )

get_instant_quote

get_instant_quote(instant_quote_id)
Source code in components/instant_quote/public/controllers/instant_quote.py
@InstantQuoteController.action_route(
    "/<instant_quote_id>",
    methods=["GET"],
    auth_strategy=AuthorizationStrategies.authenticated_with_token_fallback(
        token_extractor=InstantQuoteTokenGenerator.map_token_content,
    ),
)
@request_argument("token", type=str, required=False)
@obs.api_call()
def get_instant_quote(instant_quote_id: str):  # type: ignore[no-untyped-def]  # noqa: D103
    from components.instant_quote.public.controllers.presenters.instant_quote import (
        InstantQuotePresenter,
    )
    from components.instant_quote.public.main import (
        get_instant_quote as get_instant_quote_api,
    )

    instant_quote = get_instant_quote_api(instant_quote_id=instant_quote_id)

    return make_json_response(InstantQuotePresenter.from_entity(entity=instant_quote))

get_instant_quote_alan_offer_estimated_costs

get_instant_quote_alan_offer_estimated_costs(
    instant_quote_id,
)
Source code in components/instant_quote/public/controllers/instant_quote.py
@InstantQuoteController.action_route(
    "/<instant_quote_id>/alan_offer_estimated_costs",
    methods=["GET"],
    auth_strategy=AuthorizationStrategies.authenticated_with_token_fallback(
        token_extractor=InstantQuoteTokenGenerator.map_token_content,
    ),
)
@request_argument("token", type=str, required=False)
@obs.api_call()
def get_instant_quote_alan_offer_estimated_costs(instant_quote_id: str):  # type: ignore[no-untyped-def]  # noqa: D103
    from components.instant_quote.external.estimated_cost import (
        get_alan_offer_estimated_costs,
        get_estimated_cost_presenter,
    )
    from components.instant_quote.public.main import (
        get_instant_quote as get_instant_quote_api,
    )

    instant_quote = get_instant_quote_api(instant_quote_id=instant_quote_id)

    estimated_cost = get_alan_offer_estimated_costs(instant_quote)

    return make_json_response(
        get_estimated_cost_presenter(estimated_cost=estimated_cost)
    )

get_instant_quote_alan_offer_price_scenarios

get_instant_quote_alan_offer_price_scenarios(
    instant_quote_id,
)
Source code in components/instant_quote/public/controllers/instant_quote.py
@InstantQuoteController.action_route(
    "/<instant_quote_id>/alan_offer_price_scenarios",
    methods=["GET"],
    auth_strategy=AuthorizationStrategies.authenticated_with_token_fallback(
        token_extractor=InstantQuoteTokenGenerator.map_token_content,
    ),
)
@request_argument("token", type=str, required=False)
@obs.api_call()
def get_instant_quote_alan_offer_price_scenarios(instant_quote_id: str):  # type: ignore[no-untyped-def]  # noqa: D103
    from components.instant_quote.external.builder_product import (
        get_health_prices_from_product_version,
    )
    from components.instant_quote.public.controllers.presenters.price import (
        PriceScenariosPresenter,
    )
    from components.instant_quote.public.main import (
        get_instant_quote as get_instant_quote_api,
    )

    instant_quote = get_instant_quote_api(instant_quote_id=instant_quote_id)

    health_prices = get_health_prices_from_product_version(
        product_version_ref=instant_quote.product_version_ref,
    )
    return make_json_response(
        PriceScenariosPresenter.create(
            health_prices=health_prices,
            settings=instant_quote.settings,
        )
    )

get_instant_quote_competitor_offer_estimated_costs

get_instant_quote_competitor_offer_estimated_costs(
    instant_quote_id,
)
Source code in components/instant_quote/public/controllers/instant_quote.py
@InstantQuoteController.action_route(
    "/<instant_quote_id>/competitor_offer_estimated_costs",
    methods=["GET"],
    auth_strategy=AuthorizationStrategies.authenticated_with_token_fallback(
        token_extractor=InstantQuoteTokenGenerator.map_token_content,
    ),
)
@request_argument("token", type=str, required=False)
@obs.api_call()
def get_instant_quote_competitor_offer_estimated_costs(instant_quote_id: str):  # type: ignore[no-untyped-def]  # noqa: D103
    from components.instant_quote.external.estimated_cost import (
        get_competitor_offer_estimated_costs,
        get_estimated_cost_presenter,
    )
    from components.instant_quote.public.main import (
        get_instant_quote as get_instant_quote_api,
    )

    instant_quote = get_instant_quote_api(instant_quote_id=instant_quote_id)

    if instant_quote.competitor_product_ref is None:
        abort(404)

    estimated_cost = get_competitor_offer_estimated_costs(
        instant_quote=instant_quote,
        competitor_product_ref=instant_quote.competitor_product_ref,
    )

    return make_json_response(
        get_estimated_cost_presenter(estimated_cost=estimated_cost)
    )

get_instant_quote_competitor_offer_price_scenarios

get_instant_quote_competitor_offer_price_scenarios(
    instant_quote_id,
)
Source code in components/instant_quote/public/controllers/instant_quote.py
@InstantQuoteController.action_route(
    "/<instant_quote_id>/competitor_offer_price_scenarios",
    methods=["GET"],
    auth_strategy=AuthorizationStrategies.authenticated_with_token_fallback(
        token_extractor=InstantQuoteTokenGenerator.map_token_content,
    ),
)
@request_argument("token", type=str, required=False)
@obs.api_call()
def get_instant_quote_competitor_offer_price_scenarios(instant_quote_id: str):  # type: ignore[no-untyped-def]  # noqa: D103
    from components.instant_quote.external.competitor_product import (
        get_health_prices_from_competitor_product,
    )
    from components.instant_quote.public.controllers.presenters.price import (
        PriceScenariosPresenter,
    )
    from components.instant_quote.public.main import (
        get_instant_quote as get_instant_quote_api,
    )

    instant_quote = get_instant_quote_api(instant_quote_id=instant_quote_id)

    if instant_quote.competitor_product_ref is None:
        abort(404)

    health_prices = get_health_prices_from_competitor_product(
        competitor_product_ref=instant_quote.competitor_product_ref
    )
    return make_json_response(
        PriceScenariosPresenter.create(
            health_prices=health_prices,
            settings=instant_quote.settings,
        )
    )

instant_quote_endpoint module-attribute

instant_quote_endpoint = Endpoint('/instant_quotes')

update_instant_quote_demographics

update_instant_quote_demographics(instant_quote_id, params)
Source code in components/instant_quote/public/controllers/instant_quote.py
@InstantQuoteController.action_route(
    "/<instant_quote_id>/demographics",
    methods=["PATCH"],
    auth_strategy=AuthorizationStrategies.authenticated_with_token_fallback(
        token_extractor=InstantQuoteTokenGenerator.map_token_content,
    ),
)
@request_argument("token", type=str, required=False)
@request_argument("demographics", type=dict, required=True)
@obs.api_call()
def update_instant_quote_demographics(instant_quote_id: str, params: dict):  # type: ignore[type-arg,no-untyped-def]  # noqa: D103
    from components.instant_quote.public.entities.instant_quote_demographics import (
        InstantQuoteDemographics,
    )
    from components.instant_quote.public.main import update_instant_quote

    demographics = params["demographics"]

    update_instant_quote(
        instant_quote_id=instant_quote_id,
        demographics=InstantQuoteDemographics(
            n_primaries_alone=demographics["n_primaries_alone"],
            n_primaries_with_1_child=demographics["n_primaries_with_1_child"],
            n_primaries_with_2_children=demographics["n_primaries_with_2_children"],
            n_primaries_with_partner=demographics["n_primaries_with_partner"],
            n_primaries_with_partner_and_1_child=demographics[
                "n_primaries_with_partner_and_1_child"
            ],
            n_primaries_with_partner_and_2_children=demographics[
                "n_primaries_with_partner_and_2_children"
            ],
        ),
    )
    current_session.commit()

    return make_json_response()

update_instant_quote_settings

update_instant_quote_settings(instant_quote_id, params)
Source code in components/instant_quote/public/controllers/instant_quote.py
@InstantQuoteController.action_route(
    "/<instant_quote_id>/settings",
    methods=["PATCH"],
    auth_strategy=AuthorizationStrategies.authenticated_with_token_fallback(
        token_extractor=InstantQuoteTokenGenerator.map_token_content,
    ),
)
@request_argument("settings", type=dict, required=True)
@request_argument("token", type=str, required=False)
@obs.api_call()
def update_instant_quote_settings(instant_quote_id: str, params: dict):  # type: ignore[type-arg,no-untyped-def]  # noqa: D103
    from components.instant_quote.public.entities.instant_quote_settings import (
        InstantQuoteSettings,
    )
    from components.instant_quote.public.main import update_instant_quote

    settings = params["settings"]

    update_instant_quote(
        instant_quote_id=instant_quote_id,
        settings=InstantQuoteSettings(
            participation_primary=settings["participation_primary"],
            participation_partner=settings["participation_partner"],
            participation_children=settings["participation_children"],
        ),
    )
    current_session.commit()

    return make_json_response()

presenters

estimated_cost

CostDetailsPresenter dataclass
CostDetailsPresenter(total, company_participation)

Bases: DataClassJsonMixin

company_participation instance-attribute
company_participation
total instance-attribute
total
EstimatedCostLinePresenter dataclass
EstimatedCostLinePresenter(
    primary_cost,
    partner_cost,
    children_cost,
    family_cost,
    total,
    total_company_part,
)

Bases: DataClassJsonMixin

children_cost instance-attribute
children_cost
family_cost instance-attribute
family_cost
partner_cost instance-attribute
partner_cost
primary_cost instance-attribute
primary_cost
total instance-attribute
total
total_company_part instance-attribute
total_company_part
EstimatedCostPresenter dataclass
EstimatedCostPresenter(base_cost, option_costs)

Bases: DataClassJsonMixin

base_cost instance-attribute
base_cost
option_costs instance-attribute
option_costs

instant_quote

InstantQuotePresenter dataclass
InstantQuotePresenter(
    id,
    account_ref,
    title,
    introduction_paragraph,
    contact_email,
    product_version,
    competitor_product_ref,
    demographics,
    settings,
    validity_in_days,
    expire_on,
    created_at,
    link,
)

Bases: DataClassJsonMixin

account_ref instance-attribute
account_ref
competitor_product_ref instance-attribute
competitor_product_ref
contact_email instance-attribute
contact_email
created_at class-attribute instance-attribute
created_at = field(
    metadata=config(
        encoder=isoformat,
        decoder=fromisoformat,
        mm_field=Date(format="iso"),
    )
)
demographics instance-attribute
demographics
expire_on class-attribute instance-attribute
expire_on = field(
    metadata=config(
        encoder=isoformat,
        decoder=fromisoformat,
        mm_field=Date(format="iso"),
    )
)
from_entity classmethod
from_entity(entity)
Source code in components/instant_quote/public/controllers/presenters/instant_quote.py
@classmethod
def from_entity(cls, entity: InstantQuote) -> "InstantQuotePresenter":  # noqa: D102
    from flask import current_app

    from components.fr.subcomponents.ccn_compliance.protected.ccn_collective_agreements_for_compliance_checks import (  # noqa: ALN039 ALN043
        legacy_get_ccn_collective_agreements_for_compliance_checks,
    )
    from components.instant_quote.external.builder_product import (
        get_product_version,
    )
    from components.instant_quote.external.user import (
        get_contact_email_for_instant_quote,
    )

    product_version = get_product_version(
        product_version_ref=entity.product_version_ref
    )

    ccn_cas = legacy_get_ccn_collective_agreements_for_compliance_checks(
        int(entity.product_version_ref)
    )
    contact_email = entity.contact_email or get_contact_email_for_instant_quote(
        user_ref=entity.creator_ref
    )

    return cls(
        id=entity.id,
        account_ref=entity.account_ref,
        title=entity.title,
        introduction_paragraph=entity.introduction_paragraph,
        contact_email=contact_email,
        product_version=ProductVersionPresenter(
            id=product_version.id,
            product_id=product_version.product_id,
            version_number=product_version.version_number,
            title=product_version.title,
            emoji=product_version.emoji,
            description=product_version.description,
            ccn_collective_agreements=ccn_cas,
        ),
        competitor_product_ref=entity.competitor_product_ref,
        validity_in_days=max(0, (entity.expire_on - utctoday()).days),
        demographics=InstantQuoteDemographicsPresenter.from_entity(
            entity=entity.demographics
        ),
        settings=InstantQuoteSettingsPresenter.from_entity(entity=entity.settings),
        expire_on=entity.expire_on,
        created_at=entity.created_at,
        link=current_app.front_end_url.build_url(  # type: ignore[attr-defined]
            additional_path=f"/instant-quote/{entity.id}",
            query_args={"token": entity.token},
        ),
    )
id instance-attribute
id
introduction_paragraph instance-attribute
introduction_paragraph
link
product_version instance-attribute
product_version
settings instance-attribute
settings
title instance-attribute
title
validity_in_days instance-attribute
validity_in_days
ProductVersionPresenter dataclass
ProductVersionPresenter(
    id,
    product_id,
    version_number,
    title,
    emoji,
    description,
    ccn_collective_agreements,
)

Bases: DataClassJsonMixin

ccn_collective_agreements instance-attribute
ccn_collective_agreements
description instance-attribute
description
emoji instance-attribute
emoji
id instance-attribute
id
product_id instance-attribute
product_id
title instance-attribute
title
version_number instance-attribute
version_number

instant_quote_demographics

InstantQuoteDemographicsPresenter dataclass
InstantQuoteDemographicsPresenter(
    n_primaries_alone,
    n_primaries_with_1_child,
    n_primaries_with_2_children,
    n_primaries_with_partner,
    n_primaries_with_partner_and_1_child,
    n_primaries_with_partner_and_2_children,
)

Bases: DataClassJsonMixin

from_entity classmethod
from_entity(entity)
Source code in components/instant_quote/public/controllers/presenters/instant_quote_demographics.py
@classmethod
def from_entity(  # noqa: D102
    cls, entity: InstantQuoteDemographics
) -> "InstantQuoteDemographicsPresenter":
    return cls(
        n_primaries_alone=entity.n_primaries_alone,
        n_primaries_with_1_child=entity.n_primaries_with_1_child,
        n_primaries_with_2_children=entity.n_primaries_with_2_children,
        n_primaries_with_partner=entity.n_primaries_with_partner,
        n_primaries_with_partner_and_1_child=entity.n_primaries_with_partner_and_1_child,
        n_primaries_with_partner_and_2_children=entity.n_primaries_with_partner_and_2_children,
    )
n_primaries_alone instance-attribute
n_primaries_alone
n_primaries_with_1_child instance-attribute
n_primaries_with_1_child
n_primaries_with_2_children instance-attribute
n_primaries_with_2_children
n_primaries_with_partner instance-attribute
n_primaries_with_partner
n_primaries_with_partner_and_1_child instance-attribute
n_primaries_with_partner_and_1_child
n_primaries_with_partner_and_2_children instance-attribute
n_primaries_with_partner_and_2_children

instant_quote_settings

InstantQuoteSettingsPresenter dataclass
InstantQuoteSettingsPresenter(
    participation_primary,
    participation_partner,
    participation_children,
)

Bases: DataClassJsonMixin

from_entity classmethod
from_entity(entity)
Source code in components/instant_quote/public/controllers/presenters/instant_quote_settings.py
@classmethod
def from_entity(  # noqa: D102
    cls, entity: InstantQuoteSettings
) -> "InstantQuoteSettingsPresenter":
    return cls(
        participation_primary=entity.participation_primary,
        participation_partner=entity.participation_partner,
        participation_children=entity.participation_children,
    )
participation_children instance-attribute
participation_children
participation_partner instance-attribute
participation_partner
participation_primary instance-attribute
participation_primary

price

OptionPricesPresenter dataclass
OptionPricesPresenter(
    price_structure,
    primary_price,
    partner_price,
    child_price,
    family_price,
    nth_children_free,
)

Bases: DataClassJsonMixin

child_price instance-attribute
child_price
family_price instance-attribute
family_price
nth_children_free instance-attribute
nth_children_free
partner_price instance-attribute
partner_price
price_structure instance-attribute
price_structure
primary_price instance-attribute
primary_price
PriceScenarioDetailsPresenter dataclass
PriceScenarioDetailsPresenter(
    total, company_part, employee_part
)

Bases: DataClassJsonMixin

company_part instance-attribute
company_part
create classmethod
create(price, participation)
Source code in components/instant_quote/public/controllers/presenters/price.py
@classmethod
def create(  # noqa: D102
    cls, price: int, participation: float
) -> "PriceScenarioDetailsPresenter":
    total = price
    company_part = int(price * participation / 100)
    employee_part = price - company_part
    return cls(total=total, company_part=company_part, employee_part=employee_part)
employee_part instance-attribute
employee_part
total instance-attribute
total
PriceScenariosPresenter dataclass
PriceScenariosPresenter(
    price_structure,
    primary_price,
    partner_price,
    child_price,
    family_price,
    nth_children_free,
    option_prices,
)

Bases: DataClassJsonMixin

child_price instance-attribute
child_price
create classmethod
create(health_prices, settings)
Source code in components/instant_quote/public/controllers/presenters/price.py
@classmethod
def create(  # noqa: D102
    cls, health_prices: "HealthPrices", settings: InstantQuoteSettings
) -> "PriceScenariosPresenter":
    return cls(
        price_structure=health_prices.base_price.price_structure,
        primary_price=PriceScenarioDetailsPresenter.create(
            price=health_prices.base_price.primary_price,
            participation=settings.participation_primary,
        ),
        partner_price=(
            PriceScenarioDetailsPresenter.create(
                price=health_prices.base_price.partner_price,
                participation=settings.participation_partner,
            )
        ),
        child_price=(
            PriceScenarioDetailsPresenter.create(
                price=health_prices.base_price.child_price,
                participation=settings.participation_children,
            )
        ),
        family_price=(
            PriceScenarioDetailsPresenter.create(
                price=health_prices.base_price.family_price,
                # in this case, partner & children participation are the same
                participation=settings.participation_partner,
            )
        ),
        nth_children_free=health_prices.base_price.nth_children_free,
        option_prices=[
            OptionPricesPresenter(
                primary_price=option_price.primary_price,
                partner_price=option_price.partner_price,
                child_price=option_price.child_price,
                family_price=option_price.family_price,
                nth_children_free=option_price.nth_children_free,
                price_structure=option_price.price_structure,
            )
            for option_price in health_prices.option_prices
        ],
    )
family_price instance-attribute
family_price
nth_children_free instance-attribute
nth_children_free
option_prices instance-attribute
option_prices
partner_price instance-attribute
partner_price
price_structure instance-attribute
price_structure
primary_price instance-attribute
primary_price

components.instant_quote.public.entities

instant_quote

InstantQuote dataclass

InstantQuote(
    id,
    account_ref,
    title,
    introduction_paragraph,
    creator_ref,
    creator_display_name,
    contact_email,
    expire_on,
    product_version_ref,
    competitor_product_ref,
    demographics,
    settings,
    created_at,
    token,
)
account_ref instance-attribute
account_ref
competitor_product_ref instance-attribute
competitor_product_ref
contact_email instance-attribute
contact_email
created_at instance-attribute
created_at
creator_display_name instance-attribute
creator_display_name
creator_ref instance-attribute
creator_ref
demographics instance-attribute
demographics
expire_on instance-attribute
expire_on
from_model classmethod
from_model(model)
Source code in components/instant_quote/public/entities/instant_quote.py
@classmethod
def from_model(cls, model: "InstantQuoteSQLA") -> "InstantQuote":  # noqa: D102
    return cls(
        id=str(model.id),
        account_ref=model.account_ref,
        title=model.title,
        introduction_paragraph=model.introduction_paragraph,
        creator_ref=model.creator_ref,
        creator_display_name=model.creator_display_name,
        contact_email=model.contact_email,
        expire_on=model.expire_on,
        product_version_ref=model.product_version_ref,
        competitor_product_ref=(
            model.competitor_product_refs[0]
            if model.competitor_product_refs
            else None
        ),
        demographics=InstantQuoteDemographics.from_model(model=model.demographics),
        settings=InstantQuoteSettings.from_model(model=model.settings),
        created_at=model.created_at.date(),
        token=model.token,
    )
id instance-attribute
id
introduction_paragraph instance-attribute
introduction_paragraph
product_version_ref instance-attribute
product_version_ref
settings instance-attribute
settings
title instance-attribute
title
token instance-attribute
token

ProductVersion dataclass

ProductVersion(
    id,
    product_id,
    version_number,
    title,
    emoji,
    description,
)
description instance-attribute
description
emoji instance-attribute
emoji
id instance-attribute
id
product_id instance-attribute
product_id
title instance-attribute
title
version_number instance-attribute
version_number

instant_quote_demographics

InstantQuoteDemographics dataclass

InstantQuoteDemographics(
    n_primaries_alone,
    n_primaries_with_1_child,
    n_primaries_with_2_children,
    n_primaries_with_partner,
    n_primaries_with_partner_and_1_child,
    n_primaries_with_partner_and_2_children,
)
from_model classmethod
from_model(model)
Source code in components/instant_quote/public/entities/instant_quote_demographics.py
@classmethod
def from_model(  # noqa: D102
    cls, model: "InstantQuoteDemographicsSQLA"
) -> "InstantQuoteDemographics":
    return cls(
        n_primaries_alone=model.n_primaries_alone,
        n_primaries_with_1_child=model.n_primaries_with_1_child,
        n_primaries_with_2_children=model.n_primaries_with_2_children,
        n_primaries_with_partner=model.n_primaries_with_partner,
        n_primaries_with_partner_and_1_child=model.n_primaries_with_partner_and_1_child,
        n_primaries_with_partner_and_2_children=model.n_primaries_with_partner_and_2_children,
    )
n_primaries_alone instance-attribute
n_primaries_alone
n_primaries_with_1_child instance-attribute
n_primaries_with_1_child
n_primaries_with_2_children instance-attribute
n_primaries_with_2_children
n_primaries_with_partner instance-attribute
n_primaries_with_partner
n_primaries_with_partner_and_1_child instance-attribute
n_primaries_with_partner_and_1_child
n_primaries_with_partner_and_2_children instance-attribute
n_primaries_with_partner_and_2_children

instant_quote_settings

InstantQuoteSettings dataclass

InstantQuoteSettings(
    participation_primary,
    participation_partner,
    participation_children,
)
from_model classmethod
from_model(model)
Source code in components/instant_quote/public/entities/instant_quote_settings.py
@classmethod
def from_model(cls, model: "InstantQuoteSettingsSQLA") -> "InstantQuoteSettings":  # noqa: D102
    return cls(
        participation_primary=model.participation_primary,
        participation_partner=model.participation_partner,
        participation_children=model.participation_children,
    )
participation_children instance-attribute
participation_children
participation_partner instance-attribute
participation_partner
participation_primary instance-attribute
participation_primary

components.instant_quote.public.main

create_instant_quote

create_instant_quote(
    account_ref,
    title,
    introduction_paragraph,
    competitor_product_ref,
    product_version_ref,
    contact_email,
    creator_ref,
    creator_display_name,
    expire_on,
)
Source code in components/instant_quote/public/main.py
def create_instant_quote(  # noqa: D103
    account_ref: str,
    title: str,
    introduction_paragraph: str | None,
    competitor_product_ref: str,
    product_version_ref: str,
    contact_email: str | None,
    creator_ref: str,
    creator_display_name: str,
    expire_on: date,
) -> InstantQuote:
    from components.instant_quote.internal.instant_quote import (
        attach_token_to_instant_quote,
        create_instant_quote as create_instant_quote_bl,
    )

    instant_quote_sqla = create_instant_quote_bl(
        account_ref=account_ref,
        title=title,
        introduction_paragraph=introduction_paragraph,
        competitor_product_ref=competitor_product_ref,
        product_version_ref=product_version_ref,
        contact_email=contact_email,
        creator_ref=creator_ref,
        creator_display_name=creator_display_name,
        expire_on=expire_on,
    )

    current_session.add(instant_quote_sqla)
    current_session.flush()

    attach_token_to_instant_quote(instant_quote_id=str(instant_quote_sqla.id))

    return InstantQuote.from_model(model=instant_quote_sqla)

delete_instant_quotes_for_product_versions

delete_instant_quotes_for_product_versions(
    product_version_refs,
)
Source code in components/instant_quote/public/main.py
def delete_instant_quotes_for_product_versions(product_version_refs: list[str]) -> None:  # noqa: D103
    from components.instant_quote.internal.instant_quote import (
        delete_instant_quotes_for_product_versions as delete_instant_quotes_for_product_versions_bl,
    )

    return delete_instant_quotes_for_product_versions_bl(
        product_version_refs=product_version_refs
    )

get_instant_quote

get_instant_quote(instant_quote_id)
Source code in components/instant_quote/public/main.py
def get_instant_quote(instant_quote_id: str) -> InstantQuote:  # noqa: D103
    from components.instant_quote.internal.instant_quote import (
        get_instant_quote as get_instant_quote_bl,
    )

    return InstantQuote.from_model(
        model=get_instant_quote_bl(instant_quote_id=instant_quote_id)
    )

get_instant_quote_ids_for_product_versions

get_instant_quote_ids_for_product_versions(
    product_version_refs,
)
Source code in components/instant_quote/public/main.py
def get_instant_quote_ids_for_product_versions(  # noqa: D103
    product_version_refs: list[str],
) -> list[UUID]:
    from components.instant_quote.internal.instant_quote import (
        get_instant_quotes_for_product_versions as get_instant_quotes_for_product_versions_bl,
    )

    return [
        instant_quote.id
        for instant_quote in get_instant_quotes_for_product_versions_bl(
            product_version_refs=product_version_refs
        )
    ]

paginate_instant_quotes

paginate_instant_quotes(
    page, per_page, account_ref=None, max_per_page=100
)
Source code in components/instant_quote/public/main.py
def paginate_instant_quotes(  # type: ignore[no-untyped-def]  # noqa: D103
    page: int,
    per_page: int,
    account_ref: str | None = None,  # start at 1
    max_per_page: int = 100,
):
    from components.instant_quote.internal.instant_quote import (
        build_instant_quote_query,
    )
    from components.instant_quote.internal.models.instant_quote import (
        InstantQuote as InstantQuoteSQLA,
    )
    from shared.helpers import collections
    from shared.server_side_rendering.paginate import Paginate

    query = build_instant_quote_query(account_ref=account_ref)
    query.order_by(InstantQuoteSQLA.created_at)
    pagination = paginate(
        query=query,
        page=page,
        per_page=per_page,
        max_per_page=max_per_page,
    )

    return Paginate(
        items=collections.compact(
            [InstantQuote.from_model(model=model) for model in pagination.items]
        ),
        page=mandatory(pagination.page),
        next_page=pagination.next_num,
        prev_page=pagination.prev_num,
        items_count=mandatory(pagination.total),
        pages_count=pagination.pages,
    )

refresh_token

refresh_token(instant_quote_id)
Source code in components/instant_quote/public/main.py
def refresh_token(instant_quote_id: str) -> None:  # noqa: D103
    from components.instant_quote.internal.instant_quote import (
        attach_token_to_instant_quote,
    )

    attach_token_to_instant_quote(instant_quote_id=instant_quote_id)

update_instant_quote

update_instant_quote(
    instant_quote_id, demographics=None, settings=None
)
Source code in components/instant_quote/public/main.py
def update_instant_quote(  # noqa: D103
    instant_quote_id: str,
    demographics: InstantQuoteDemographics | None = None,
    settings: InstantQuoteSettings | None = None,
) -> None:
    from components.instant_quote.internal.instant_quote import (
        update_instant_quote_demographics,
        update_instant_quote_settings,
    )

    if demographics is not None:
        update_instant_quote_demographics(
            instant_quote_id=instant_quote_id, demographics=demographics
        )

    if settings is not None:
        update_instant_quote_settings(
            instant_quote_id=instant_quote_id, settings=settings
        )