# ----------------------------------------------------------------------------- # Immo-Ka — Agrégateur de maisons à vendre (province de Québec) # Auteur : Simon-Pierre Boucher — contact@spboucher.ai # mortgage/providers/tangerine.py : Tangerine — JSON statique publié # (currentRates.json, le fichier que charge leur page /rates). Un seul taux # par terme (pas de distinction affiché/spécial chez Tangerine) : kind # "special" car c'est leur taux client réel. # ----------------------------------------------------------------------------- from __future__ import annotations import json from .base import RateProvider, parse_rate RATES_URL = ("https://www.tangerine.ca/content/dam/tangerine-shared/" "product-rates/currentRates.json") class TangerineProvider(RateProvider): provider_id = "tangerine" institution = "Tangerine" source_url = "https://www.tangerine.ca/en/rates" request_delay = 1.0 def fetch(self) -> list[dict]: return self.parse(self.get(RATES_URL).text) def parse(self, payload: str) -> list[dict]: data = json.loads(payload) out: list[dict] = [] for r in data.get("rates") or []: if r.get("group") != "mortgage": continue code = r.get("max_product_code") rate = r.get("interest_rate") term_years = r.get("term") if not isinstance(rate, (int, float)) or rate <= 0: continue if not isinstance(term_years, (int, float)) or term_years <= 0: continue if code == "Mortgage": rtype, label = "fixed", f"Fixe {int(term_years)} an(s)" elif code == "VarMortgage": rtype, label = "variable", f"Variable {int(term_years)} an(s)" else: continue # preferred_* et autres : clients connectés, ignorés apr = parse_rate(r.get("apr_value_en") or "") out.append(self.make_product( rate=float(rate), rate_type=rtype, term_months=int(term_years * 12), kind="special", product_name=label, apr=apr, conditions=f"Taux unique Tangerine (en date du {r.get('date')})", raw={"account_term": r.get("account_term"), "date": r.get("date"), "interest_rate": rate})) return out