import { getPool } from '../../db/mssqlClient.js'; import { LOAD_STEUERSATZ, LOAD_STEUERKLASSEN } from '../../db/mssql/steuer.js'; import env from '../../config/env.js'; let steuersatzCache; let steuerklassenCache; /** * Loads VAT rates per tax class for the configured steuer zone (`tSteuersatz` only). * Results are cached for the process lifetime. * @returns {Promise>} */ export async function loadSteuersatz() { if (steuersatzCache) { return steuersatzCache; } const pool = await getPool(); const result = await pool.request() .input('steuerZone', env.steuerZone) .query(LOAD_STEUERSATZ); steuersatzCache = result.recordset.map((row) => ({ kSteuerklasse: row.kSteuerklasse, fSteuersatz: row.fSteuersatz, })); return steuersatzCache; } /** * Loads tax classes with display metadata for the configured steuer zone. * Results are cached for the process lifetime. * @returns {Promise>} */ export async function loadSteuerklassen() { if (steuerklassenCache) { return steuerklassenCache; } const pool = await getPool(); const result = await pool.request() .input('steuerZone', env.steuerZone) .query(LOAD_STEUERKLASSEN); steuerklassenCache = result.recordset.map((row) => ({ kSteuerklasse: row.kSteuerklasse, cName: row.cName, nStandard: row.nStandard, fSteuersatz: row.fSteuersatz, })); return steuerklassenCache; } export function bruttoFromNetto(netto, kSteuerklasse, steuersaetze) { const row = steuersaetze.find((item) => item.kSteuerklasse === kSteuerklasse); if (row == null || netto == null) { return null; } return netto * (1 + row.fSteuersatz / 100); } export async function getSteuer() { const steuerklassen = await loadSteuerklassen(); return { steuerklassen }; }