Em dashes (—) and en dashes (–) had spread across comments, docs, tests, and a few UI strings, reading as AI-generated boilerplate rather than house style. Replaced each with punctuation matching its context: colon for explanatory clauses, comma for asides, plain hyphen for numeric/legal ranges (e.g. "21-23§"), "to"/"till" for date ranges, parentheses for paired-dash asides. messages/en.json and messages/sv.json were fixed by hand together to keep sv/en in sync. Left untouched where the dash is the functional subject rather than decorative punctuation: date-range-parser.ts's separator regex, charset-repair.ts's CP1252 byte-mapping table (and its test), the SIE encoding mojibake docs, generic-csv.ts's minus-sign normalizer, the agent system-prompt files that already instruct against em dashes, and a golden iXBRL test fixture compared byte-for-byte. Also fixes two bugs surfaced along the way: an off-by-one in ApiKeysPanel's scope-label split (a leftover from an earlier partial pass), and a charset-repair test that had lost the literal en-dash it exists to verify. Regenerated the agent atom seed migration (skills:generate) since 27 SKILL.md files changed. Added a CLAUDE.md rule against em/en dashes, with an explicit carve-out for the functional-dash cases above. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
110 lines
3.1 KiB
TypeScript
110 lines
3.1 KiB
TypeScript
/**
|
|
* Client-safe account name map for UI display.
|
|
* Covers the ~30 accounts used in transaction categorization.
|
|
* No server dependencies: safe for 'use client' components.
|
|
*/
|
|
|
|
const ACCOUNT_NAMES: Record<string, string> = {
|
|
// Assets (1xxx)
|
|
'1250': 'Inventarier',
|
|
'1510': 'Kundfordringar',
|
|
'1630': 'Skattekonto',
|
|
'1680': 'Fordringar hos ägare',
|
|
'1930': 'Företagskonto',
|
|
|
|
// Equity & Liabilities (2xxx)
|
|
'2013': 'Övriga egna uttag',
|
|
'2018': 'Egna insättningar',
|
|
'2350': 'Långfristiga skulder',
|
|
'2393': 'Kortfristig skuld närstående',
|
|
'2440': 'Leverantörsskulder',
|
|
'2510': 'Personalskatt',
|
|
'2611': 'Utg. moms 25%',
|
|
'2621': 'Utg. moms 12%',
|
|
'2631': 'Utg. moms 6%',
|
|
'2614': 'Utg. moms omvänd 25%',
|
|
'2624': 'Utg. moms omvänd 12%',
|
|
'2634': 'Utg. moms omvänd 6%',
|
|
'2641': 'Ing. moms',
|
|
'2645': 'Beräknad ing. moms förvärv utlandet',
|
|
'2647': 'Beräknad ing. moms omvänd i Sverige',
|
|
'2731': 'Arbetsgivaravgifter',
|
|
'2893': 'Skuld till ägare',
|
|
|
|
// Revenue (3xxx)
|
|
'3001': 'Försäljning 25%',
|
|
'3002': 'Försäljning 12%',
|
|
'3003': 'Försäljning 6%',
|
|
'3004': 'Momsfri försäljning',
|
|
'3305': 'Exportförsäljning',
|
|
'3308': 'EU-tjänster',
|
|
'3900': 'Övriga rörelseintäkter',
|
|
'3960': 'Valutakursvinster',
|
|
|
|
// Cost of goods (4xxx)
|
|
'4010': 'Varuinköp',
|
|
'4060': 'Varuinköp omvänd moms',
|
|
'4070': 'Varuinköp EU',
|
|
'4100': 'Inköp material/varor',
|
|
'4500': 'Övriga inköpskostnader',
|
|
'4531': 'Import-/tullkostnader',
|
|
'4600': 'Subentreprenader',
|
|
|
|
// External expenses (5xxx)
|
|
'5010': 'Lokalhyra',
|
|
'5020': 'El & uppvärmning',
|
|
'5410': 'Förbrukningsinventarier',
|
|
'5420': 'Programvaror',
|
|
'5421': 'Molntjänster',
|
|
'5460': 'Förbrukningsvaror',
|
|
'5611': 'Drivmedel bil',
|
|
'5613': 'Reparation fordon',
|
|
'5614': 'Parkering',
|
|
'5615': 'Leasing fordon',
|
|
'5800': 'Resekostnader',
|
|
'5810': 'Biljetter & transport',
|
|
'5820': 'Hotell',
|
|
'5910': 'Annonsering',
|
|
'5920': 'Design & grafik',
|
|
'5990': 'Konferens',
|
|
|
|
// Other external expenses (6xxx)
|
|
'6071': 'Representation',
|
|
'6110': 'Kontorsförbrukning',
|
|
'6200': 'Telefon & internet',
|
|
'6211': 'Mobiltelefon',
|
|
'6230': 'Internet',
|
|
'6250': 'Porto',
|
|
'6310': 'Företagsförsäkring',
|
|
'6530': 'Redovisningstjänster',
|
|
'6550': 'Konsulttjänster',
|
|
'6570': 'Bankavgifter',
|
|
'6980': 'Medlemsavgifter',
|
|
'6991': 'Övriga kostnader',
|
|
|
|
// Personnel & financial (7xxx / 8xxx)
|
|
'7210': 'Löner',
|
|
'7410': 'Pensionsförsäkring',
|
|
'7610': 'Utbildning',
|
|
'7622': 'Intern representation',
|
|
'7960': 'Valutakursförluster',
|
|
'8310': 'Ränteintäkter',
|
|
'8410': 'Räntekostnader',
|
|
}
|
|
|
|
/**
|
|
* Get the Swedish display name for an account number.
|
|
* Returns the number itself if no name is mapped.
|
|
*/
|
|
export function getAccountName(accountNumber: string): string {
|
|
return ACCOUNT_NAMES[accountNumber] || accountNumber
|
|
}
|
|
|
|
/**
|
|
* Format an account number with its name, e.g. "5010 Lokalhyra".
|
|
*/
|
|
export function formatAccountWithName(accountNumber: string): string {
|
|
const name = ACCOUNT_NAMES[accountNumber]
|
|
return name ? `${accountNumber} ${name}` : accountNumber
|
|
}
|