Initial commit: Books accounting system with EventFlow CQRS

Backend (.NET 10):
- EventFlow CQRS/Event Sourcing with PostgreSQL
- GraphQL.NET API with mutations and queries
- Custom ReadModelSqlGenerator for snake_case PostgreSQL columns
- Hangfire for background job processing
- Integration tests with isolated test databases

Frontend (React/Vite):
- Initial project structure

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Nicolaj Hartmann 2026-01-18 02:52:30 +01:00
commit 66f6fa138d
126 changed files with 24741 additions and 0 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,122 @@
# Dinero Expense Accounts with Suggestions
# 104 accounts for AI-powered account suggestion
meta:
source: Dinero API
organizationId: 582288
accountType: expense
totalAccounts: 104
removedAccounts: 3220|5120|7140|7280
regionVariants:
varekøb: DK=2000|EU=2050|WORLD=2150
ydelseskøb: EU=2100|WORLD=2200
fragt: DK=2250|DK_VATFREE=2300|EU=2350
husleje: DK=5000|DK_VATFREE=5010
parkering: DK=6080|DK_VATFREE=6085
accounts[104]{number,name,category,vatCode,region,vatRubric,suggestions}:
2000,Vareforbrug,Variable omkostninger,I25,DK,,varer|indkøb|lager|goods|inventory|purchase|varekøb
2050,EU-erhvervelser varer (rubrik A-varer),Variable omkostninger,IEUV,EU,EU_BOX_A_GOODS,eu|europa|germany|france|italien|spain|netherlands|eu-erhvervelse
2100,EU-erhvervelser ydelser (rubrik A-ydelser),Variable omkostninger,IEUY,EU,EU_BOX_A_SERVICES,eu|europa|ydelse|service|eu-ydelse
2150,Varekøb verden,Variable omkostninger,IVV,WORLD,,usa|uk|kina|china|verden|import|world
2200,Ydelseskøb verden,Variable omkostninger,IVY,WORLD,,usa|uk|kina|verden|service|ydelse|world
2250,Fragt med moms,Variable omkostninger,I25,DK,,fragt|levering|shipping|delivery|postnord|gls|dao|bring|ups|dhl
2300,Fragt uden moms,Variable omkostninger,,DK,,fragt|shipping|delivery|momsfri
2350,Fragt - EU,Variable omkostninger,IEUV,EU,EU_BOX_A_GOODS,fragt|eu|shipping|dhl|ups|fedex
2400,Valutakursdifferencer import,Variable omkostninger,,DK,,valuta|kurs|currency|exchange
2450,Varelagerregulering,Variable omkostninger,,DK,,lager|regulering|inventory
2800,Fremmed arbejde,Variable omkostninger,I25,DK,,underleverandør|freelance|contractor|subcontractor|fremmed arbejde
3000,AM-indkomst,Lønomkostninger,,DK,,løn|salary|wage|payroll|am-indkomst
3020,Arbejdsgiver ATP,Lønomkostninger,,DK,,atp|arbejdsgiver
3040,Medarbejder ATP,Lønomkostninger,,DK,,atp|medarbejder
3060,Sygepenge mv.,Lønomkostninger,,DK,,sygepenge|sickness|sygedag
3070,Personalegoder herunder fri telefon,Lønomkostninger,,DK,,personalegode|fri telefon|benefit|goder
3080,B-honorar,Lønomkostninger,,DK,,b-honorar|honorar|fee
3090,Barsel,Lønomkostninger,,DK,,barsel|maternity|fødsel
3100,Feriepenge og SH,Lønomkostninger,,DK,,ferie|feriepenge|sh|vacation|holiday
3120,Pension,Lønomkostninger,,DK,,pension|pensionsbidrag|retirement
3140,Diæter/rejsegodtgørelse,Lønomkostninger,,DK,,diæt|rejsegodtgørelse|per diem|allowance
3160,Kørsel i egen bil (kilometergodtgørelse),Lønomkostninger,,DK,,kørsel|kilometer|km|mileage|km-godtgørelse|bil
3180,AER/AES/ATP-finansieringsbidrag,Lønomkostninger,,DK,,aer|aes|atp|finansieringsbidrag
3200,Arbejdstøj,Lønomkostninger,I25,DK,,arbejdstøj|uniform|workwear|tøj
3240,Mad under kursus/møder mv. fuldt fradrag,Lønomkostninger,I25,DK,,mad|kursus|møde|food|catering|frokost
3260,Gaver til personalet fuldt fradrag,Lønomkostninger,,DK,,gave|personale|gift|employee
3280,Uddannelsesudgifter,Lønomkostninger,I25,DK,,kursus|uddannelse|course|training|efteruddannelse
3300,Diverse vedr. ansatte med moms,Lønomkostninger,I25,DK,,diverse|personale|ansatte|moms
3320,Diverse vedr. ansatte uden moms,Lønomkostninger,,DK,,diverse|personale|ansatte|momsfri
3340,Regulering feriepenge,Lønomkostninger,,DK,,ferie|regulering|feriepenge
3355,Frokostordning til ansatte,Lønomkostninger,,DK,,frokost|frokostordning|lunch|kantine
4000,Annoncer og reklame,Salgsomkostninger,I25,DK,,annonce|reklame|marketing|ads|google|facebook|linkedin|meta|advertising
4020,Udsmykning i forbindelse med arrangementer/events,Salgsomkostninger,I25,DK,,udsmykning|event|arrangement|decoration
4040,Hotel personale fuldt fradrag,Salgsomkostninger,I25,DK,,hotel|overnatning|accommodation|booking.com|hotels.com|personale
4060,Hotel forretningsforbindelser delvis fradrag,Salgsomkostninger,I25,DK,,hotel|overnatning|kunde|client|forretningsforbindelse
4080,Konferencer,Salgsomkostninger,,DK,,konference|conference|seminar|event
4100,Messer,Salgsomkostninger,I25,DK,,messe|fair|exhibition|udstilling
4120,Restaurant personale fuldt fradrag,Salgsomkostninger,REP,DK,,restaurant|frokost|middag|lunch|dinner|café|personale
4140,Restaurant forretningsforbindelser delvis fradrag,Salgsomkostninger,REP,DK,,restaurant|repræsentation|kunde|client|forretningsforbindelse
4160,Mad i virksomheden til forretningsforbindelser delvis fradrag,Salgsomkostninger,I25,DK,,mad|virksomhed|forretningsforbindelse|catering
4180,Repræsentation gaver og blomster delvis fradrag,Salgsomkostninger,,DK,,gave|blomster|gift|flowers|repræsentation
4200,Anden fradragsberettiget repræsentation med moms,Salgsomkostninger,I25,DK,,repræsentation|representation
4220,Repræsentation diverse,Salgsomkostninger,,DK,,repræsentation|diverse
4240,Øvrige personaleomkostninger,Salgsomkostninger,I25,DK,,personale|personnel|staff
4260,Ej fradragsberettiget andel,Salgsomkostninger,,DK,,ikke-fradrag|non-deductible
4280,Rejseomkostninger,Salgsomkostninger,,DK,,rejse|travel|tur|trip
5000,Husleje,Lokaleomkostninger,I25,DK,,husleje|leje|rent|kontor|lokale
5010,Husleje uden moms,Lokaleomkostninger,,DK,,husleje|leje|rent|momsfri
5025,El,Lokaleomkostninger,I25,DK,,el|strøm|electricity|power|ørsted|norlys|ewii|andel
5030,Vand,Lokaleomkostninger,I25,DK,,vand|water|vandværk
5035,Varme,Lokaleomkostninger,I25,DK,,varme|gas|fjernvarme|heating|naturgas
5040,Elafgift,Lokaleomkostninger,,DK,,elafgift|afgift|tax
5045,Naturgas- og bygasafgift,Lokaleomkostninger,,DK,,gas|afgift|naturgas
5050,Vandafgift,Lokaleomkostninger,,DK,,vand|afgift|vandafgift
5060,Rengøring og affaldshåndtering,Lokaleomkostninger,I25,DK,,rengøring|cleaning|affald|waste|renovation
5080,Reparation og vedligeholdelse,Lokaleomkostninger,I25,DK,,reparation|vedligeholdelse|maintenance|repair
5100,Ejendomsskat,Lokaleomkostninger,,DK,,ejendomsskat|property tax|skat
5140,Mødelokaler,Lokaleomkostninger,I25,DK,,mødelokale|meeting room|konference
5160,Dekoration,Lokaleomkostninger,I25,DK,,dekoration|decoration|indretning
6000,Billeje (gulplade),Kørsel og rejser,I25,DK,,billeje|car rental|leje|hertz|avis|europcar|sixt|enterprise
6020,Brændstof (gulplade),Kørsel og rejser,I25,DK,,benzin|diesel|fuel|brændstof|ok|shell|q8|circle k|ingo
6040,Vedligeholdelse af bil (gulplade),Kørsel og rejser,I25,DK,,bil|vedligeholdelse|car|service|værksted|dæk
6060,Vægtafgift og forsikringer,Kørsel og rejser,,DK,,vægtafgift|forsikring|car insurance|bilforsikring
6080,Parkering (gulplade),Kørsel og rejser,I25,DK,,parkering|parking|p-afgift|easypark|parkman|apcoa
6085,Parkering uden moms,Kørsel og rejser,,DK,,parkering|parking|momsfri
6100,Broafgift,Kørsel og rejser,I25,DK,,bro|bridge|storebælt|øresund|toll|afgift
6120,Taxa,Kørsel og rejser,,DK,,taxa|taxi|uber|bolt|dantaxi|viggo|4x27
6140,Tog,Kørsel og rejser,,DK,,tog|dsb|train|rejsekort|billet
6160,Fly,Kørsel og rejser,,DK,,fly|flight|sas|norwegian|ryanair|lufthansa|flybillet
6180,Bus,Kørsel og rejser,,DK,,bus|movia|arriva|flixbus
6200,Færge,Kørsel og rejser,I25,DK,,færge|ferry|molslinjen|scandlines|bornholmslinjen
6400,Diverse transportomkostninger uden moms,Kørsel og rejser,,DK,,transport|diverse|transportation
7005,Revision og regnskabsmæssig assistance,Administrationsomkostninger,I25,DK,,revisor|revision|audit|regnskab|pwc|deloitte|ey|kpmg|bdo
7010,Advokat,Administrationsomkostninger,I25,DK,,advokat|lawyer|legal|juridisk|attorney
7020,Bogføringsassistance,Administrationsomkostninger,I25,DK,,bogføring|bookkeeping|regnskab|bogholder
7040,Konsulentbistand,Administrationsomkostninger,I25,DK,,konsulent|consultant|rådgivning|advisory|rådgiver
7060,Kontingenter inkl. moms,Administrationsomkostninger,I25,DK,,kontingent|medlemskab|membership|forening
7080,Kontingenter ekskl. moms,Administrationsomkostninger,,DK,,kontingent|medlemskab|momsfri
7100,Aviser,Administrationsomkostninger,,DK,,avis|newspaper|berlingske|politiken|jyllandsposten|børsen|dagblad
7120,Faglitteratur,Administrationsomkostninger,I25,DK,,bog|book|litteratur|amazon|saxo|tales|faglitteratur
7160,Erhvervsforsikringer,Administrationsomkostninger,,DK,,forsikring|insurance|tryg|topdanmark|if|codan|gjensidige|alm brand
7180,Fragt og kørsel,Administrationsomkostninger,I25,DK,,fragt|kørsel|shipping|transport
7200,Kontorartikler og tryksager,Administrationsomkostninger,I25,DK,,kontor|office|papir|printer|lyreco|staples|kontorartikler
7220,Porto og gebyrer,Administrationsomkostninger,,DK,,porto|gebyr|postage|fee|postnord
7240,Telefoni,Administrationsomkostninger,I25,DK,,telefon|mobil|phone|mobile|telia|telenor|3|telmore|cbs|lebara
7260,Beskatning af fri telefoni,Administrationsomkostninger,,DK,,telefon|beskatning|fri telefon
7300,Internet og webhotel,Administrationsomkostninger,I25,DK,,internet|hosting|domain|web|simply|one.com|cloudflare|aws|azure
7320,Køb af software,Administrationsomkostninger,I25,DK,,software|app|abonnement|subscription|saas|adobe|microsoft|slack|notion|google workspace|dropbox
7360,Offentlige bøder og gebyrer,Administrationsomkostninger,,DK,,bøde|gebyr|fine|offentlig
7380,Registrerede kassedifferencer,Administrationsomkostninger,,DK,,kasse|difference|cash
7400,Betalingsløsning,Administrationsomkostninger,I25,DK,,betaling|payment|stripe|mobilepay|nets|clearhaus|paypal
7420,Indløsere,Administrationsomkostninger,,DK,,indløser|acquirer|nets|clearhaus
7440,Licens,Administrationsomkostninger,,DK,,licens|license|rettighed
7460,Diverse inkl. moms,Administrationsomkostninger,I25,DK,,diverse|moms|miscellaneous
7480,Diverse ekskl. moms,Administrationsomkostninger,,DK,,diverse|momsfri|miscellaneous
7500,Generalforsamling bestyrelsesmøder ude i byen fuld fradrag,Administrationsomkostninger,REP,DK,,generalforsamling|bestyrelse|møde|board|meeting
7520,Generalforsamling i virksomhedens lokaler,Administrationsomkostninger,,DK,,generalforsamling|møde|lokale
7540,Bestyrelsesmøder i virksomhedens lokaler,Administrationsomkostninger,I25,DK,,bestyrelse|board|møde|lokale
7560,Bestyrelsesmøder ude i byen,Administrationsomkostninger,REP,DK,,bestyrelse|board|møde|restaurant
8040,Småanskaffelser (straksafskrivning),Afskrivninger,I25,DK,,computer|laptop|møbler|furniture|udstyr|equipment|apple|dell|lenovo|småanskaffelse
8050,Småanskaffelser med omvendt betalingspligt,Afskrivninger,OBPK,DK,,småanskaffelse|omvendt betalingspligt|reverse charge
9200,Bankrenter,Renteudgifter,,DK,,rente|bank|interest|bankrenter
9210,Leverandører mv.,Renteudgifter,,DK,,rente|leverandør|supplier|interest
9220,Ikke-fradragsberettigede renter,Renteudgifter,,DK,,rente|ikke-fradrag|non-deductible

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,199 @@
const fs = require('fs');
// Load accounts
const accounts = JSON.parse(fs.readFileSync('accounts.json', 'utf8'));
// Accounts to remove
const removeNumbers = [3220, 5120, 7140, 7280];
// Suggestions mapping by account number
const suggestionsMap = {
// Variable omkostninger
2000: ["varer", "indkøb", "lager", "goods", "inventory", "purchase", "varekøb"],
2050: ["eu", "europa", "germany", "france", "italien", "spain", "netherlands", "eu-erhvervelse"],
2100: ["eu", "europa", "ydelse", "service", "eu-ydelse"],
2150: ["usa", "uk", "kina", "china", "verden", "import", "world"],
2200: ["usa", "uk", "kina", "verden", "service", "ydelse", "world"],
2250: ["fragt", "levering", "shipping", "delivery", "postnord", "gls", "dao", "bring", "ups", "dhl"],
2300: ["fragt", "shipping", "delivery", "momsfri"],
2350: ["fragt", "eu", "shipping", "dhl", "ups", "fedex"],
2400: ["valuta", "kurs", "currency", "exchange"],
2450: ["lager", "regulering", "inventory"],
2800: ["underleverandør", "freelance", "contractor", "subcontractor", "fremmed arbejde"],
// Lønomkostninger
3000: ["løn", "salary", "wage", "payroll", "am-indkomst"],
3020: ["atp", "arbejdsgiver"],
3040: ["atp", "medarbejder"],
3060: ["sygepenge", "sickness", "sygedag"],
3070: ["personalegode", "fri telefon", "benefit", "goder"],
3080: ["b-honorar", "honorar", "fee"],
3090: ["barsel", "maternity", "fødsel"],
3100: ["ferie", "feriepenge", "sh", "vacation", "holiday"],
3120: ["pension", "pensionsbidrag", "retirement"],
3140: ["diæt", "rejsegodtgørelse", "per diem", "allowance"],
3160: ["kørsel", "kilometer", "km", "mileage", "km-godtgørelse", "bil"],
3180: ["aer", "aes", "atp", "finansieringsbidrag"],
3200: ["arbejdstøj", "uniform", "workwear", "tøj"],
3240: ["mad", "kursus", "møde", "food", "catering", "frokost"],
3260: ["gave", "personale", "gift", "employee"],
3280: ["kursus", "uddannelse", "course", "training", "efteruddannelse"],
3300: ["diverse", "personale", "ansatte", "moms"],
3320: ["diverse", "personale", "ansatte", "momsfri"],
3340: ["ferie", "regulering", "feriepenge"],
3355: ["frokost", "frokostordning", "lunch", "kantine"],
// Salgsomkostninger
4000: ["annonce", "reklame", "marketing", "ads", "google", "facebook", "linkedin", "meta", "advertising"],
4020: ["udsmykning", "event", "arrangement", "decoration"],
4040: ["hotel", "overnatning", "accommodation", "booking.com", "hotels.com", "personale"],
4060: ["hotel", "overnatning", "kunde", "client", "forretningsforbindelse"],
4080: ["konference", "conference", "seminar", "event"],
4100: ["messe", "fair", "exhibition", "udstilling"],
4120: ["restaurant", "frokost", "middag", "lunch", "dinner", "café", "personale"],
4140: ["restaurant", "repræsentation", "kunde", "client", "forretningsforbindelse"],
4160: ["mad", "virksomhed", "forretningsforbindelse", "catering"],
4180: ["gave", "blomster", "gift", "flowers", "repræsentation"],
4200: ["repræsentation", "representation"],
4220: ["repræsentation", "diverse"],
4240: ["personale", "personnel", "staff"],
4260: ["ikke-fradrag", "non-deductible"],
4280: ["rejse", "travel", "tur", "trip"],
// Lokaleomkostninger
5000: ["husleje", "leje", "rent", "kontor", "lokale"],
5010: ["husleje", "leje", "rent", "momsfri"],
5025: ["el", "strøm", "electricity", "power", "ørsted", "norlys", "ewii", "andel"],
5030: ["vand", "water", "vandværk"],
5035: ["varme", "gas", "fjernvarme", "heating", "naturgas"],
5040: ["elafgift", "afgift", "tax"],
5045: ["gas", "afgift", "naturgas"],
5050: ["vand", "afgift", "vandafgift"],
5060: ["rengøring", "cleaning", "affald", "waste", "renovation"],
5080: ["reparation", "vedligeholdelse", "maintenance", "repair"],
5100: ["ejendomsskat", "property tax", "skat"],
5140: ["mødelokale", "meeting room", "konference"],
5160: ["dekoration", "decoration", "indretning"],
// Kørsel og rejser
6000: ["billeje", "car rental", "leje", "hertz", "avis", "europcar", "sixt", "enterprise"],
6020: ["benzin", "diesel", "fuel", "brændstof", "ok", "shell", "q8", "circle k", "ingo"],
6040: ["bil", "vedligeholdelse", "car", "service", "værksted", "dæk"],
6060: ["vægtafgift", "forsikring", "car insurance", "bilforsikring"],
6080: ["parkering", "parking", "p-afgift", "easypark", "parkman", "apcoa"],
6085: ["parkering", "parking", "momsfri"],
6100: ["bro", "bridge", "storebælt", "øresund", "toll", "afgift"],
6120: ["taxa", "taxi", "uber", "bolt", "dantaxi", "viggo", "4x27"],
6140: ["tog", "dsb", "train", "rejsekort", "billet"],
6160: ["fly", "flight", "sas", "norwegian", "ryanair", "lufthansa", "flybillet"],
6180: ["bus", "movia", "arriva", "flixbus"],
6200: ["færge", "ferry", "molslinjen", "scandlines", "bornholmslinjen"],
6400: ["transport", "diverse", "transportation"],
// Administrationsomkostninger
7005: ["revisor", "revision", "audit", "regnskab", "pwc", "deloitte", "ey", "kpmg", "bdo"],
7010: ["advokat", "lawyer", "legal", "juridisk", "attorney"],
7020: ["bogføring", "bookkeeping", "regnskab", "bogholder"],
7040: ["konsulent", "consultant", "rådgivning", "advisory", "rådgiver"],
7060: ["kontingent", "medlemskab", "membership", "forening"],
7080: ["kontingent", "medlemskab", "momsfri"],
7100: ["avis", "newspaper", "berlingske", "politiken", "jyllandsposten", "børsen", "dagblad"],
7120: ["bog", "book", "litteratur", "amazon", "saxo", "tales", "faglitteratur"],
7160: ["forsikring", "insurance", "tryg", "topdanmark", "if", "codan", "gjensidige", "alm brand"],
7180: ["fragt", "kørsel", "shipping", "transport"],
7200: ["kontor", "office", "papir", "printer", "lyreco", "staples", "kontorartikler"],
7220: ["porto", "gebyr", "postage", "fee", "postnord"],
7240: ["telefon", "mobil", "phone", "mobile", "telia", "telenor", "3", "telmore", "cbs", "lebara"],
7260: ["telefon", "beskatning", "fri telefon"],
7300: ["internet", "hosting", "domain", "web", "simply", "one.com", "cloudflare", "aws", "azure"],
7320: ["software", "app", "abonnement", "subscription", "saas", "adobe", "microsoft", "slack", "notion", "google workspace", "dropbox"],
7360: ["bøde", "gebyr", "fine", "offentlig"],
7380: ["kasse", "difference", "cash"],
7400: ["betaling", "payment", "stripe", "mobilepay", "nets", "clearhaus", "paypal"],
7420: ["indløser", "acquirer", "nets", "clearhaus"],
7440: ["licens", "license", "rettighed"],
7460: ["diverse", "moms", "miscellaneous"],
7480: ["diverse", "momsfri", "miscellaneous"],
7500: ["generalforsamling", "bestyrelse", "møde", "board", "meeting"],
7520: ["generalforsamling", "møde", "lokale"],
7540: ["bestyrelse", "board", "møde", "lokale"],
7560: ["bestyrelse", "board", "møde", "restaurant"],
// Afskrivninger
8040: ["computer", "laptop", "møbler", "furniture", "udstyr", "equipment", "apple", "dell", "lenovo", "småanskaffelse"],
8050: ["småanskaffelse", "omvendt betalingspligt", "reverse charge"],
// Renteudgifter
9200: ["rente", "bank", "interest", "bankrenter"],
9210: ["rente", "leverandør", "supplier", "interest"],
9220: ["rente", "ikke-fradrag", "non-deductible"]
};
// VAT rubric mapping for EU accounts
const vatRubricMap = {
2050: "EU_BOX_A_GOODS",
2100: "EU_BOX_A_SERVICES",
2350: "EU_BOX_A_GOODS"
};
// Region variants mapping
const regionVariants = {
2000: { category: "varekøb", EU: 2050, WORLD: 2150 },
2050: { category: "varekøb", DK: 2000, WORLD: 2150 },
2150: { category: "varekøb", DK: 2000, EU: 2050 },
2100: { category: "ydelseskøb", WORLD: 2200 },
2200: { category: "ydelseskøb", EU: 2100 },
2250: { category: "fragt", DK_VATFREE: 2300, EU: 2350 },
2300: { category: "fragt", DK: 2250, EU: 2350 },
2350: { category: "fragt", DK: 2250, DK_VATFREE: 2300 },
5000: { category: "husleje", DK_VATFREE: 5010 },
5010: { category: "husleje", DK: 5000 },
6080: { category: "parkering", DK_VATFREE: 6085 },
6085: { category: "parkering", DK: 6080 }
};
// Process accounts
const enrichedAccounts = accounts
.filter(acc => !removeNumbers.includes(acc.number))
.map(acc => {
// Determine region
let region = "DK";
if (acc.defaultVatTypeRegion === "EU") {
region = "EU";
} else if (acc.defaultVatTypeRegion === "World") {
region = "WORLD";
}
// Build enriched account
const enriched = {
id: acc.id,
number: acc.number,
name: acc.name,
categoryName: acc.categoryName,
defaultVatCode: acc.defaultVatCode,
region: region,
suggestions: suggestionsMap[acc.number] || []
};
// Add vatRubric for EU accounts
if (vatRubricMap[acc.number]) {
enriched.vatRubric = vatRubricMap[acc.number];
}
// Add related accounts for region variants
if (regionVariants[acc.number]) {
enriched.regionVariants = regionVariants[acc.number];
}
return enriched;
});
// Save output
fs.writeFileSync(
'accounts-with-suggestions.json',
JSON.stringify(enrichedAccounts, null, 2),
'utf8'
);
console.log(`Processed ${enrichedAccounts.length} accounts (removed ${removeNumbers.length})`);
console.log('Saved to accounts-with-suggestions.json');

View file

@ -0,0 +1,45 @@
{
"vendor": {
"name": "EWII A/S",
"address": "Kokbjerg 30, 6000 Kolding",
"country": "DK",
"vatNumber": "DK28297947"
},
"invoice": {
"type": "reminder",
"number": null,
"date": "2024-06-06",
"dueDate": "2024-06-17",
"currency": "DKK",
"totalAmount": 3361.04,
"vatAmount": null,
"netAmount": null
},
"customer": {
"name": "Nicolaj Helmer Hartmann",
"address": "Mejsevej 2, 8370 Hadsten",
"customerNumber": "400143507"
},
"lineItems": [
{
"description": "El restance - Rykker 2",
"amount": 3361.04
}
],
"suggestedAccount": {
"number": 5025,
"name": "El",
"vatCode": "I25",
"region": "DK",
"confidence": 0.95,
"reasoning": "EWII er el-leverandør, betalingspåmindelse vedrører el-forbrug"
},
"alternativeAccounts": [
{
"number": 5040,
"name": "Elafgift",
"confidence": 0.3,
"reasoning": "Kan indeholde elafgift, men primært el-forbrug"
}
]
}

View file

@ -0,0 +1,50 @@
{
"vendor": {
"name": "Microsoft Ireland Operations Ltd",
"address": "One Microsoft Place, South County Business Park, Leopardstown, Dublin 18, D18 P521, Ireland",
"country": "IE",
"vatNumber": "IE8256796U"
},
"invoice": {
"type": "invoice",
"number": "E0800QGJD1",
"date": "2024-01-03",
"dueDate": "2024-01-03",
"currency": "DKK",
"totalAmount": 69.90,
"vatAmount": 0.00,
"netAmount": 69.90,
"vatNote": "omvendt betalingspligt"
},
"customer": {
"name": "Softwarehuset",
"address": "Mejsevej 2, 8370 Hadsten",
"vatNumber": "DK38059726"
},
"lineItems": [
{
"description": "Office 365 E1 - Månedligt abonnementsgebyr",
"period": "23-12-2023 - 22-01-2024",
"quantity": 1,
"unitPrice": 69.90,
"amount": 69.90
}
],
"suggestedAccount": {
"number": 2100,
"name": "EU-erhvervelser ydelser (rubrik A-ydelser)",
"vatCode": "IEUY",
"region": "EU",
"vatRubric": "EU_BOX_A_SERVICES",
"confidence": 0.97,
"reasoning": "Software/cloud-service fra EU (Irland) med omvendt betalingspligt - skal bogføres som EU-ydelseskøb"
},
"alternativeAccounts": [
{
"number": 7320,
"name": "Køb af software",
"confidence": 0.4,
"reasoning": "Ville være korrekt hvis leverandør var dansk, men EU-leverandør kræver EU-konto pga. momsindberetning"
}
]
}

View file

@ -0,0 +1,65 @@
{
"vendor": {
"name": "Waoo (Fibia P/S)",
"address": "Energivej 33, 4690 Haslev",
"country": "DK",
"vatNumber": "DK36058552"
},
"invoice": {
"type": "invoice",
"number": "08338955",
"date": "2025-08-07",
"dueDate": "2025-09-01",
"currency": "DKK",
"totalAmount": 1284.00,
"vatAmount": 256.80,
"netAmount": 1027.20
},
"customer": {
"name": "Nicolaj Hartmann",
"address": "Mejsevej 2, Hadbjerg, 8370 Hadsten",
"customerNumber": "1299453",
"contractNumber": "861418"
},
"lineItems": [
{
"description": "Waoo Fiber 1000",
"period": "01.09.2025 - 30.09.2025",
"amount": 389.00
},
{
"description": "Waoo Fiber 1000",
"period": "01.10.2025 - 31.10.2025",
"amount": 389.00
},
{
"description": "Waoo Fiber 1000",
"period": "01.11.2025 - 30.11.2025",
"amount": 389.00
},
{
"description": "Abonnement Fast IP adresse",
"period": "01.09.2025 - 30.09.2025",
"amount": 39.00
},
{
"description": "Abonnement Fast IP adresse",
"period": "01.10.2025 - 31.10.2025",
"amount": 39.00
},
{
"description": "Abonnement Fast IP adresse",
"period": "01.11.2025 - 30.11.2025",
"amount": 39.00
}
],
"suggestedAccount": {
"number": 7300,
"name": "Internet og webhotel",
"vatCode": "I25",
"region": "DK",
"confidence": 0.98,
"reasoning": "Fiber internet abonnement fra dansk udbyder med 25% moms"
},
"alternativeAccounts": []
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 KiB