import requests from config import Config BASE_DATA_URL = "https://byod-api.signpost.be/v1" def get_signpost_token(): """Token met de Signpost/M4S-gegevens van de huidige school (None bij een fout).""" return signpost_token_met_reden()[0] def signpost_token_met_reden(): """Geeft (token, None) of (None, leesbare foutmelding).""" if not (Config.M4S_CLIENT_ID and Config.M4S_CLIENT_SECRET): return None, ("Signpost is nog niet ingesteld voor deze school: vul de client-ID en het client-secret in " "via 🔌 Koppelingen van deze school › Signpost / M4S.") auth_payload = { "grant_type": "client_credentials", "client_id": Config.M4S_CLIENT_ID, "client_secret": Config.M4S_CLIENT_SECRET, "scope": "openid", "resource": "management_portal:api" } try: response = requests.post(Config.M4S_AUTH_URL, data=auth_payload, timeout=15) except requests.exceptions.RequestException as e: return None, f"Signpost ({Config.M4S_AUTH_URL}) is niet bereikbaar: {e}" if response.status_code in (400, 401, 403): detail = '' try: j = response.json() detail = j.get('error_description') or j.get('error') or '' except ValueError: pass return None, (f"Signpost weigert de aanmelding (HTTP {response.status_code}{': ' + detail if detail else ''}). " "Controleer de client-ID en het client-secret bij 🔌 Koppelingen van deze school.") if not response.ok: return None, f"Signpost gaf foutcode {response.status_code} bij het aanmelden." token = response.json().get("access_token") return (token, None) if token else (None, "Signpost gaf geen token terug.") #------------------------------------------------------------------------------------------------- #herstelling signpost doorgeven #------------------------------------------------------------------------------------------------- def create_signpost_case(serial_number, description, damage_flags=None): """ Maakt een nieuw herstellingsdossier aan bij Signpost. :param serial_number: Het serienummer van het toestel. :param description: Omschrijving van het probleem. :param damage_flags: Dict met booleans (bv. {'waterDamage': True}) """ token = get_signpost_token() if not token: return False, "Authenticatie mislukt." headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json", "Accept": "application/json" } # Bouw het payload op basis van de Config klasse payload = { "languageCode": getattr(Config, "M4S_LANGUAGE_CODE", "nl-BE"), "description": description, "status": getattr(Config, "M4S_REPAIR_STATUS", "Nieuw"), "repairLocationType": int(getattr(Config, "M4S_REPAIR_LOCATION_TYPE", 1)), "serialNumber": serial_number, "institutionGuid": Config.M4S_INSTITUTIONGUID, "address": { "street": Config.M4S_REPAIR_STREET, "number": Config.M4S_REPAIR_STREETNUMBER, "zipCode": Config.M4S_REPAIR_ZIPCODE, "city": Config.M4S_REPAIIR_CITY, "countryCode": Config.M4S_REPAIR_COUNTRYCODE, "repairAtInstitution": True }, "contacts": [{ "firstName": Config.M4S_CONTACT_FIRST_NAME, "lastName": Config.M4S_CONTACT_LAST_NAME, "email": Config.M4S_CONTACT_EMAIL, "phone": Config.M4S_CONTACT_PHONE }], "billingContact": { "firstName": Config.M4S_BILLING_FIRST_NAME, "lastName": Config.M4S_BILLING_LAST_NAME, "email": Config.M4S_BILLING_EMAIL, "phone": Config.M4S_BILLING_PHONE, "street": Config.M4S_REPAIR_STREET, "number": Config.M4S_REPAIR_STREETNUMBER, "zipCode": Config.M4S_REPAIR_ZIPCODE, "city": Config.M4S_REPAIIR_CITY, "countryCode": Config.M4S_REPAIR_COUNTRYCODE } } # Voeg schade-indicatoren toe indien meegegeven if damage_flags: payload.update(damage_flags) try: res = requests.post(f"{BASE_DATA_URL}/field-service/cases", headers=headers, json=payload, timeout=15) if res.status_code in [200, 201]: return True, res.json().get("ourReference", "Succesvol aangemaakt") else: return False, f"API Fout {res.status_code}: {res.text}" except Exception as e: return False, f"Verbindingsfout: {str(e)}" #------------------------------------------------------------------------------------------------- # #------------------------------------------------------------------------------------------------- def get_cases_by_serial(serial_number): token = get_signpost_token() if not token: return [] headers = { "Authorization": f"Bearer {token}", "Accept": "application/json" } params = {"$search": serial_number} try: res = requests.get(f"{BASE_DATA_URL}/field-service/cases", headers=headers, params=params, timeout=15) if res.status_code == 200: return res.json().get("items", []) return [] except Exception as e: print(f"Signpost API Fout: {e}") return []