books/account-suggestions/process-accounts.js

200 lines
9 KiB
JavaScript
Raw Normal View History

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');