import { z } from 'zod';
import { CompanyDatabase } from '../database/db.js';
import { BrregClient } from '../apis/brreg.js';
import { RegnskapClient } from '../apis/regnskap.js';
const FetchFinancialsSchema = z.object({
org_nr: z.string().describe("Organisasjonsnummer"),
auto_import: z.boolean().default(true).describe("Lagre automatisk til database"),
all_years: z.boolean().default(true).describe("Forsøk å hente alle tilgjengelige år")
});
/**
* Automatically fetch financial data from Regnskapsregisteret API
* NO manual download required - fully automated!
* Note: Open API only returns latest year. Historical data requires manual import.
*/
export async function fetchFinancials(args: unknown, db: CompanyDatabase, brreg: BrregClient) {
const params = FetchFinancialsSchema.parse(args);
// Verify company exists and save to database if needed
let company = await db.getCompany(params.org_nr);
if (!company) {
const brregCompany = await brreg.getCompany(params.org_nr);
if (!brregCompany) {
return {
content: [{
type: "text" as const,
text: `Fant ikke selskap med org.nr ${params.org_nr}`
}]
};
}
// Save company to database first (required for foreign key)
await db.insertOrUpdateCompany({
org_nr: brregCompany.organisasjonsnummer,
name: brregCompany.navn,
organization_form: brregCompany.organisasjonsform?.beskrivelse,
nace_code: brregCompany.naeringskode1?.kode,
nace_description: brregCompany.naeringskode1?.beskrivelse,
employees_count: brregCompany.antallAnsatte,
business_municipality: brregCompany.forretningsadresse?.kommune,
bankrupt: brregCompany.konkurs,
under_liquidation: brregCompany.underAvvikling,
last_updated: new Date().toISOString()
} as any);
company = await db.getCompany(params.org_nr);
}
// Fetch financial data from Regnskapsregisteret
const regnskapClient = new RegnskapClient();
let financialDataList: any[] = [];
if (params.all_years) {
// Fetch all available years (Note: Open API only returns latest)
financialDataList = await regnskapClient.getAllAvailableFinancials(params.org_nr);
} else {
// Fetch only latest year
const singleYear = await regnskapClient.getExtractedFinancials(params.org_nr);
if (singleYear) financialDataList = [singleYear];
}
if (financialDataList.length === 0) {
return {
content: [{
type: "text" as const,
text: `
❌ INGEN REGNSKAPSDATA TILGJENGELIG: ${company?.name || params.org_nr}
Regnskapsregisteret API har ikke data for dette selskapet.
Mulige årsaker:
- Selskapet har ikke levert årsregnskap ennå
- Selskapet er for lite (ikke regnskapspliktig)
- Regnskapet er ikke godkjent ennå
- Data finnes bare fra 2018 og nyere
💡 ALTERNATIV:
Bruk 'get_financial_link' for å laste ned manuelt fra Brønnøysund.
`
}]
};
}
// Auto-import to database if requested
if (params.auto_import) {
for (const financialData of financialDataList) {
await db.insertFinancialSnapshot({
org_nr: financialData.org_nr,
year: financialData.year,
revenue: financialData.revenue,
profit: financialData.profit,
assets: financialData.assets,
equity: financialData.equity,
employees: null, // Not in accounting data
source: 'regnskapsregisteret_api'
});
}
}
// Calculate growth if we have multiple years
let growthStats = null;
if (financialDataList.length >= 2) {
const latest = financialDataList[0];
const previous = financialDataList[1];
if (latest.revenue && previous.revenue && previous.revenue > 0) {
const revenueGrowth = ((latest.revenue - previous.revenue) / previous.revenue) * 100;
const profitGrowth = latest.profit && previous.profit && previous.profit !== 0
? ((latest.profit - previous.profit) / Math.abs(previous.profit)) * 100
: null;
growthStats = {
revenueGrowth: revenueGrowth.toFixed(1),
profitGrowth: profitGrowth?.toFixed(1),
years: `${previous.year} → ${latest.year}`
};
}
}
const latest = financialDataList[0];
// Check if we have historical data in database
const dbHistory = await db.getFinancialHistory(params.org_nr, 10);
const hasHistoricalData = dbHistory.length > 1;
const report = `
🎉 REGNSKAPSDATA HENTET AUTOMATISK: ${company?.name || params.org_nr}
📋 Regnskapsår: ${latest.year}
💱 Valuta: ${latest.currency}
🔖 Kilde: Regnskapsregisteret API (offisielt)
${financialDataList.length === 1 ? `\nℹ️ Open API returnerer kun siste år. For historiske data: Kjør fetch årlig eller bruk manuell import.` : ''}
📊 SISTE ÅR (${latest.year}):
${latest.revenue ? `💰 Driftsinntekter: ${(latest.revenue / 1000000).toFixed(1)}M ${latest.currency}` : ''}
${latest.operating_profit ? `📈 Driftsresultat: ${(latest.operating_profit / 1000000).toFixed(1)}M ${latest.currency}` : ''}
${latest.profit ? `✨ Årsresultat: ${(latest.profit / 1000000).toFixed(1)}M ${latest.currency}` : ''}
${latest.revenue && latest.profit ? `📊 Resultatmargin: ${((latest.profit / latest.revenue) * 100).toFixed(1)}%` : ''}
${latest.assets ? `🏢 Sum eiendeler: ${(latest.assets / 1000000).toFixed(1)}M ${latest.currency}` : ''}
${latest.equity ? `💎 Egenkapital: ${(latest.equity / 1000000).toFixed(1)}M ${latest.currency}` : ''}
${latest.debt ? `📉 Gjeld: ${(latest.debt / 1000000).toFixed(1)}M ${latest.currency}` : ''}
${latest.assets && latest.equity ? `📊 Egenkapitalandel: ${((latest.equity / latest.assets) * 100).toFixed(1)}%` : ''}
${hasHistoricalData && dbHistory.length > 1 ? `
📈 VEKSTANALYSE (basert på ${dbHistory.length} år i database):
${dbHistory.length >= 2 && (dbHistory[0] as any).revenue && (dbHistory[1] as any).revenue ? `- Omsetningsvekst siste år: ${(((dbHistory[0] as any).revenue - (dbHistory[1] as any).revenue) / (dbHistory[1] as any).revenue * 100).toFixed(1)}%` : ''}
${dbHistory.length >= 2 && (dbHistory[0] as any).profit && (dbHistory[1] as any).profit ? `- Resultatvekst siste år: ${(((dbHistory[0] as any).profit - (dbHistory[1] as any).profit) / Math.abs((dbHistory[1] as any).profit) * 100).toFixed(1)}%` : ''}
` : ''}
${hasHistoricalData ? `
📊 HISTORISK OVERSIKT (fra database):
${dbHistory.slice(0, 5).map((f: any) =>
`${f.year}: ${f.revenue ? (f.revenue / 1000000).toFixed(0) + 'M' : 'N/A'} omsetning, ${f.profit ? (f.profit / 1000000).toFixed(0) + 'M' : 'N/A'} resultat`
).join('\n')}
` : ''}
${params.auto_import ? `
✅ DATA AUTOMATISK LAGRET I DATABASE
💡 VIDERE ANALYSE:
- analyze_financials → Fullstendig risikoanalyse med reelle tall
- analyze_growth → ${hasHistoricalData ? `Vekstberegning med ${dbHistory.length} års data` : 'Kjør fetch igjen neste år for trendanalyse'}
- Sammenligning med SSB bransjesnitt
` : ''}
🚀 FULLT AUTOMATISK!
${hasHistoricalData ? `Du har nå ${dbHistory.length} år med regnskapsdata for dette selskapet.` : 'Kjør fetch_financials årlig for å bygge historikk.'}
`;
return {
content: [{
type: "text" as const,
text: report
}]
};
}