bereken_hypotheek_starter
Calculate maximum mortgage amount for first-time home buyers based on income, age, and partner details to determine monthly payments and NHG comparison.
Instructions
Berekent de maximale hypotheek voor starters. Output: maximaal leenbedrag, maandlast en NHG-vergelijking.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| inkomen_aanvrager | Yes | Bruto jaarinkomen hoofdaanvrager in euro's. | |
| geboortedatum_aanvrager | Yes | Geboortedatum hoofdaanvrager (YYYY-MM-DD). | |
| heeft_partner | Yes | Geeft aan of een partner mee leent. | |
| inkomen_partner | No | Optioneel partnerinkomen in euro's. | |
| geboortedatum_partner | No | Optionele geboortedatum partner (YYYY-MM-DD). | |
| verplichtingen_pm | No | Optionele maandelijkse verplichtingen in euro's. | |
| session_id | No | Optioneel sessie-ID vanuit n8n (voor logging). |
Implementation Reference
- src/index.ts:524-548 (handler)The core handler function for the 'bereken_hypotheek_starter' tool. It extracts and validates arguments, constructs the payload, calls the external Replit mortgage calculation API, logs success, and returns a formatted response.async function handleBerekenStarter(request: any): Promise<ToolResponse> { const args = requireArguments<BaseArguments>(request); const logger = createLogger(args.session_id); validateBaseArguments(args); enforceRateLimit(args.session_id); const payload: any = { aanvragers: mapAanvragers(args), }; if (args.session_id) { payload.session_id = args.session_id; } const apiClient = getApiClient(); const { data } = await apiClient.post( REPLIT_API_URL_BEREKENEN, payload, { correlationId: args.session_id } ); logger.info('Toolcall succesvol', { tool: 'bereken_hypotheek_starter' }); return successResponse(formatResponse(data, "bereken_hypotheek_starter")); }
- src/index.ts:766-774 (registration)Registration of tool handlers in the TOOL_HANDLERS object, mapping 'bereken_hypotheek_starter' to its handler function.const TOOL_HANDLERS: Record<string, ToolHandler> = { bereken_hypotheek_starter: handleBerekenStarter, bereken_hypotheek_doorstromer: handleBerekenDoorstromer, bereken_hypotheek_uitgebreid: handleBerekenUitgebreid, haal_actuele_rentes_op: handleActueleRentes, opzet_hypotheek_starter: handleOpzetStarter, opzet_hypotheek_doorstromer: handleOpzetDoorstromer, opzet_hypotheek_uitgebreid: handleOpzetUitgebreid, };
- src/index.ts:782-796 (schema)Tool registration including name, description, and input schema definition for 'bereken_hypotheek_starter' in the listTools response.name: "bereken_hypotheek_starter", description: `Maximale hypotheek voor starters ZONDER concrete woning. Gebruik deze tool alleen wanneer de gebruiker zich oriënteert ("Wat kan ik lenen?") en er nog geen koopsom/adres bekend is. Zodra de gebruiker een specifiek huis of biedprijs noemt moet u overschakelen naar de opzet-hypotheek tools.`, inputSchema: { type: "object", description: `Gebruik basisintakevelden; zie ${OPZET_GUIDE_URI} voor detaildefinities.`, properties: { ...baseIntakeProperties, session_id: { type: "string", description: "Optioneel sessie-ID vanuit n8n (voor logging).", }, }, required: baseIntakeRequired, }, },
- src/validation/schemas.ts:92-203 (helper)Validation helper function validateBaseArguments used by the handler to validate core input fields like income, birthdate, partner info.export function validateBaseArguments(args: unknown): void { // Type check if (typeof args !== 'object' || args === null) { throw new ValidationError( ErrorCode.INVALID_INPUT, 'Arguments moet een object zijn', 'arguments' ); } const input = args as Record<string, unknown>; // Valideer verplichte velden if (typeof input.inkomen_aanvrager !== 'number') { throw new ValidationError( ErrorCode.INVALID_INPUT, 'inkomen_aanvrager moet een getal zijn', 'inkomen_aanvrager', input.inkomen_aanvrager ); } if (typeof input.geboortedatum_aanvrager !== 'string') { throw new ValidationError( ErrorCode.INVALID_INPUT, 'geboortedatum_aanvrager moet een string zijn', 'geboortedatum_aanvrager', input.geboortedatum_aanvrager ); } if (typeof input.heeft_partner !== 'boolean') { throw new ValidationError( ErrorCode.INVALID_INPUT, 'heeft_partner moet een boolean zijn', 'heeft_partner', input.heeft_partner ); } // Valideer inkomen range if (input.inkomen_aanvrager < ValidationConstraints.INKOMEN.MIN || input.inkomen_aanvrager > ValidationConstraints.INKOMEN.MAX) { throw new ValidationError( ErrorCode.INCOME_OUT_OF_RANGE, `Inkomen aanvrager moet tussen €${ValidationConstraints.INKOMEN.MIN} en €${ValidationConstraints.INKOMEN.MAX} liggen`, 'inkomen_aanvrager', input.inkomen_aanvrager ); } // Valideer leeftijd aanvrager validateAge(input.geboortedatum_aanvrager, 'aanvrager'); // Valideer partner gegevens indien heeft_partner = true if (input.heeft_partner) { if (input.inkomen_partner !== undefined) { if (typeof input.inkomen_partner !== 'number') { throw new ValidationError( ErrorCode.INVALID_INPUT, 'inkomen_partner moet een getal zijn', 'inkomen_partner', input.inkomen_partner ); } if (input.inkomen_partner < ValidationConstraints.INKOMEN.MIN || input.inkomen_partner > ValidationConstraints.INKOMEN.MAX) { throw new ValidationError( ErrorCode.INCOME_OUT_OF_RANGE, `Inkomen partner moet tussen €${ValidationConstraints.INKOMEN.MIN} en €${ValidationConstraints.INKOMEN.MAX} liggen`, 'inkomen_partner', input.inkomen_partner ); } } if (input.geboortedatum_partner) { if (typeof input.geboortedatum_partner !== 'string') { throw new ValidationError( ErrorCode.INVALID_INPUT, 'geboortedatum_partner moet een string zijn', 'geboortedatum_partner', input.geboortedatum_partner ); } validateAge(input.geboortedatum_partner, 'partner'); } } // Valideer verplichtingen if (input.verplichtingen_pm !== undefined) { if (typeof input.verplichtingen_pm !== 'number') { throw new ValidationError( ErrorCode.INVALID_INPUT, 'verplichtingen_pm moet een getal zijn', 'verplichtingen_pm', input.verplichtingen_pm ); } if (input.verplichtingen_pm < ValidationConstraints.VERPLICHTINGEN.MIN || input.verplichtingen_pm > ValidationConstraints.VERPLICHTINGEN.MAX) { throw new ValidationError( ErrorCode.INVALID_INPUT, `Verplichtingen moet tussen €${ValidationConstraints.VERPLICHTINGEN.MIN} en €${ValidationConstraints.VERPLICHTINGEN.MAX} liggen`, 'verplichtingen_pm', input.verplichtingen_pm ); } } }
- src/index.ts:420-429 (helper)Helper function to map and default applicant arguments into the payload format sent to the API.}) { return { inkomen_aanvrager: args.inkomen_aanvrager, geboortedatum_aanvrager: args.geboortedatum_aanvrager, heeft_partner: args.heeft_partner, inkomen_partner: args.inkomen_partner ?? 0, geboortedatum_partner: args.geboortedatum_partner ?? null, verplichtingen_pm: args.verplichtingen_pm ?? 0, }; }