@fin.cx/skr
Version:
SKR03 and SKR04 German accounting standards for double-entry bookkeeping
401 lines • 32 kB
JavaScript
import * as plugins from './plugins.js';
/**
* Maps invoice data to SKR accounts
* Handles both SKR03 and SKR04 account mappings
*/
export class SKRInvoiceMapper {
constructor(skrType) {
// SKR03 account mappings
this.SKR03_ACCOUNTS = {
// Control accounts
vendorControl: '1600', // Verbindlichkeiten aus Lieferungen und Leistungen
customerControl: '1200', // Forderungen aus Lieferungen und Leistungen
// VAT accounts
inputVAT19: '1576', // Abziehbare Vorsteuer 19%
inputVAT7: '1571', // Abziehbare Vorsteuer 7%
outputVAT19: '1776', // Umsatzsteuer 19%
outputVAT7: '1771', // Umsatzsteuer 7%
reverseChargeVAT: '1577', // Abziehbare Vorsteuer §13b UStG
reverseChargePayable: '1787', // Umsatzsteuer §13b UStG
// Default expense/revenue accounts
defaultExpense: '4610', // Werbekosten
defaultRevenue: '8400', // Erlöse 19% USt
revenueReduced: '8300', // Erlöse 7% USt
revenueTaxFree: '8120', // Steuerfreie Umsätze
// Common expense accounts by category
materialExpense: '5000', // Aufwendungen für Roh-, Hilfs- und Betriebsstoffe
merchandiseExpense: '5400', // Aufwendungen für Waren
personnelExpense: '6000', // Löhne und Gehälter
rentExpense: '4200', // Miete
officeExpense: '4930', // Bürobedarf
travelExpense: '4670', // Reisekosten
vehicleExpense: '4530', // Kfz-Kosten
// Skonto accounts
skontoExpense: '4736', // Erhaltene Skonti 19% USt
skontoRevenue: '8736', // Gewährte Skonti 19% USt
// Intra-EU accounts
intraEUAcquisition: '8125', // Steuerfreie innergemeinschaftliche Erwerbe
intraEUSupply: '8125' // Steuerfreie innergemeinschaftliche Lieferungen
};
// SKR04 account mappings
this.SKR04_ACCOUNTS = {
// Control accounts
vendorControl: '3300', // Verbindlichkeiten aus Lieferungen und Leistungen
customerControl: '1400', // Forderungen aus Lieferungen und Leistungen
// VAT accounts
inputVAT19: '1406', // Abziehbare Vorsteuer 19%
inputVAT7: '1401', // Abziehbare Vorsteuer 7%
outputVAT19: '3806', // Umsatzsteuer 19%
outputVAT7: '3801', // Umsatzsteuer 7%
reverseChargeVAT: '1407', // Abziehbare Vorsteuer §13b UStG
reverseChargePayable: '3837', // Umsatzsteuer §13b UStG
// Default expense/revenue accounts
defaultExpense: '6300', // Sonstige betriebliche Aufwendungen
defaultRevenue: '4400', // Erlöse 19% USt
revenueReduced: '4300', // Erlöse 7% USt
revenueTaxFree: '4120', // Steuerfreie Umsätze
// Common expense accounts by category
materialExpense: '5000', // Aufwendungen für Roh-, Hilfs- und Betriebsstoffe
merchandiseExpense: '5400', // Aufwendungen für Waren
personnelExpense: '6000', // Löhne
rentExpense: '6310', // Miete
officeExpense: '6815', // Bürobedarf
travelExpense: '6670', // Reisekosten
vehicleExpense: '6530', // Kfz-Kosten
// Skonto accounts
skontoExpense: '4736', // Erhaltene Skonti 19% USt
skontoRevenue: '8736', // Gewährte Skonti 19% USt
// Intra-EU accounts
intraEUAcquisition: '4125', // Steuerfreie innergemeinschaftliche Erwerbe
intraEUSupply: '4125' // Steuerfreie innergemeinschaftliche Lieferungen
};
// Product category to account mappings
this.CATEGORY_MAPPINGS = {
'MATERIAL': { skr03: '5000', skr04: '5000' },
'MERCHANDISE': { skr03: '5400', skr04: '5400' },
'SERVICE': { skr03: '4610', skr04: '6300' },
'OFFICE': { skr03: '4930', skr04: '6815' },
'IT': { skr03: '4940', skr04: '6825' },
'TRAVEL': { skr03: '4670', skr04: '6670' },
'VEHICLE': { skr03: '4530', skr04: '6530' },
'RENT': { skr03: '4200', skr04: '6310' },
'UTILITIES': { skr03: '4240', skr04: '6320' },
'INSURANCE': { skr03: '4360', skr04: '6420' },
'MARKETING': { skr03: '4610', skr04: '6600' },
'CONSULTING': { skr03: '4640', skr04: '6650' },
'LEGAL': { skr03: '4790', skr04: '6790' },
'TELECOMMUNICATION': { skr03: '4920', skr04: '6805' }
};
this.skrType = skrType;
this.logger = new plugins.smartlog.ConsoleLog();
}
/**
* Get account mappings for current SKR type
*/
getAccounts() {
return this.skrType === 'SKR03' ? this.SKR03_ACCOUNTS : this.SKR04_ACCOUNTS;
}
/**
* Map invoice to booking rules
*/
mapInvoiceToSKR(invoice, customMappings) {
const accounts = this.getAccounts();
const taxScenario = invoice.taxScenario || 'domestic_taxed';
// Base booking rules
const bookingRules = {
skrType: this.skrType,
// Control accounts
vendorControlAccount: customMappings?.vendorControlAccount || accounts.vendorControl,
customerControlAccount: customMappings?.customerControlAccount || accounts.customerControl,
// VAT accounts
vatAccounts: {
inputVAT19: accounts.inputVAT19,
inputVAT7: accounts.inputVAT7,
outputVAT19: accounts.outputVAT19,
outputVAT7: accounts.outputVAT7,
reverseChargeVAT: accounts.reverseChargeVAT
},
// Default accounts
defaultExpenseAccount: accounts.defaultExpense,
defaultRevenueAccount: accounts.defaultRevenue,
// Skonto
skontoMethod: customMappings?.skontoMethod || 'gross',
skontoExpenseAccount: accounts.skontoExpense,
skontoRevenueAccount: accounts.skontoRevenue,
// Custom mappings
productCategoryMapping: customMappings?.productCategoryMapping || {},
vendorMapping: customMappings?.vendorMapping || {},
customerMapping: customMappings?.customerMapping || {}
};
return bookingRules;
}
/**
* Map invoice line to SKR account
*/
mapInvoiceLineToAccount(line, invoice, bookingRules) {
// Check if account is already specified
if (line.accountNumber) {
return line.accountNumber;
}
// For revenue (outbound invoices)
if (invoice.direction === 'outbound') {
return this.mapRevenueAccount(line, invoice, bookingRules);
}
// For expenses (inbound invoices)
return this.mapExpenseAccount(line, invoice, bookingRules);
}
/**
* Map revenue account based on VAT rate and scenario
*/
mapRevenueAccount(line, invoice, bookingRules) {
const accounts = this.getAccounts();
const vatRate = line.vatCategory.rate;
// Check tax scenario
switch (invoice.taxScenario) {
case 'intra_eu_supply':
return accounts.intraEUSupply;
case 'export':
case 'domestic_exempt':
return accounts.revenueTaxFree;
case 'domestic_taxed':
default:
// Map by VAT rate
if (vatRate === 19) {
return accounts.defaultRevenue;
}
else if (vatRate === 7) {
return accounts.revenueReduced;
}
else if (vatRate === 0) {
return accounts.revenueTaxFree;
}
return accounts.defaultRevenue;
}
}
/**
* Map expense account based on product category and vendor
*/
mapExpenseAccount(line, invoice, bookingRules) {
const accounts = this.getAccounts();
// Check vendor-specific mapping
const vendorId = invoice.supplier.id;
if (bookingRules.vendorMapping && bookingRules.vendorMapping[vendorId]) {
return bookingRules.vendorMapping[vendorId];
}
// Try to determine category from line description
const category = this.detectProductCategory(line.description);
if (category) {
const mapping = this.CATEGORY_MAPPINGS[category];
if (mapping) {
return this.skrType === 'SKR03' ? mapping.skr03 : mapping.skr04;
}
}
// Check product category mapping
if (line.productCode && bookingRules.productCategoryMapping) {
const mappedAccount = bookingRules.productCategoryMapping[line.productCode];
if (mappedAccount) {
return mappedAccount;
}
}
// Default expense account
return bookingRules.defaultExpenseAccount;
}
/**
* Detect product category from description
*/
detectProductCategory(description) {
const lowerDesc = description.toLowerCase();
const categoryKeywords = {
'MATERIAL': ['material', 'rohstoff', 'raw material', 'component'],
'MERCHANDISE': ['ware', 'merchandise', 'product', 'artikel'],
'SERVICE': ['service', 'dienstleistung', 'beratung', 'support'],
'OFFICE': ['büro', 'office', 'papier', 'stationery'],
'IT': ['software', 'hardware', 'computer', 'lizenz', 'license'],
'TRAVEL': ['reise', 'travel', 'hotel', 'flug', 'flight'],
'VEHICLE': ['kfz', 'vehicle', 'auto', 'benzin', 'fuel'],
'RENT': ['miete', 'rent', 'lease', 'pacht'],
'UTILITIES': ['strom', 'wasser', 'gas', 'energie', 'electricity', 'water'],
'INSURANCE': ['versicherung', 'insurance'],
'MARKETING': ['werbung', 'marketing', 'advertising', 'kampagne'],
'CONSULTING': ['beratung', 'consulting', 'advisory'],
'LEGAL': ['rechts', 'legal', 'anwalt', 'lawyer', 'notar'],
'TELECOMMUNICATION': ['telefon', 'internet', 'mobilfunk', 'telekom']
};
for (const [category, keywords] of Object.entries(categoryKeywords)) {
if (keywords.some(keyword => lowerDesc.includes(keyword))) {
return category;
}
}
return undefined;
}
/**
* Get VAT account for given VAT category and rate
*/
getVATAccount(vatCategory, direction, taxScenario) {
const accounts = this.getAccounts();
// Handle reverse charge
if (taxScenario === 'reverse_charge' || vatCategory.code === 'AE') {
return direction === 'input'
? accounts.reverseChargeVAT
: accounts.reverseChargePayable;
}
// Standard VAT accounts by rate
if (direction === 'input') {
if (vatCategory.rate === 19) {
return accounts.inputVAT19;
}
else if (vatCategory.rate === 7) {
return accounts.inputVAT7;
}
}
else {
if (vatCategory.rate === 19) {
return accounts.outputVAT19;
}
else if (vatCategory.rate === 7) {
return accounts.outputVAT7;
}
}
// Default to 19% if rate is not standard
return direction === 'input' ? accounts.inputVAT19 : accounts.outputVAT19;
}
/**
* Get control account for party
*/
getControlAccount(invoice, bookingRules) {
if (invoice.direction === 'inbound') {
// Check vendor-specific control account
const vendorId = invoice.supplier.id;
if (bookingRules.vendorMapping && bookingRules.vendorMapping[vendorId]) {
const customAccount = bookingRules.vendorMapping[vendorId];
// Check if it's a control account (starts with 16 for SKR03 or 33 for SKR04)
if (this.isControlAccount(customAccount)) {
return customAccount;
}
}
return bookingRules.vendorControlAccount;
}
else {
// Check customer-specific control account
const customerId = invoice.customer.id;
if (bookingRules.customerMapping && bookingRules.customerMapping[customerId]) {
const customAccount = bookingRules.customerMapping[customerId];
// Check if it's a control account (starts with 12 for SKR03 or 14 for SKR04)
if (this.isControlAccount(customAccount)) {
return customAccount;
}
}
return bookingRules.customerControlAccount;
}
}
/**
* Check if account is a control account
*/
isControlAccount(accountNumber) {
if (this.skrType === 'SKR03') {
return accountNumber.startsWith('12') || accountNumber.startsWith('16');
}
else {
return accountNumber.startsWith('14') || accountNumber.startsWith('33');
}
}
/**
* Get skonto accounts
*/
getSkontoAccounts(invoice) {
const accounts = this.getAccounts();
if (invoice.direction === 'inbound') {
// Received skonto (expense reduction)
return {
skontoAccount: accounts.skontoExpense,
vatCorrectionAccount: accounts.inputVAT19 // VAT correction
};
}
else {
// Granted skonto (revenue reduction)
return {
skontoAccount: accounts.skontoRevenue,
vatCorrectionAccount: accounts.outputVAT19 // VAT correction
};
}
}
/**
* Validate account number format
*/
validateAccountNumber(accountNumber) {
// SKR accounts are typically 4 digits, sometimes with sub-accounts
const accountPattern = /^\d{4}(\d{0,2})?$/;
return accountPattern.test(accountNumber);
}
/**
* Get account description
*/
getAccountDescription(accountNumber) {
// This would typically look up from a complete SKR account database
// For now, return a basic description
const commonAccounts = {
// SKR03
'1200': 'Forderungen aus Lieferungen und Leistungen',
'1600': 'Verbindlichkeiten aus Lieferungen und Leistungen',
'1576': 'Abziehbare Vorsteuer 19%',
'1571': 'Abziehbare Vorsteuer 7%',
'1776': 'Umsatzsteuer 19%',
'1771': 'Umsatzsteuer 7%',
'4610': 'Werbekosten',
'8400': 'Erlöse 19% USt',
'8300': 'Erlöse 7% USt',
// SKR04
'1400': 'Forderungen aus Lieferungen und Leistungen',
'3300': 'Verbindlichkeiten aus Lieferungen und Leistungen',
'1406': 'Abziehbare Vorsteuer 19%',
'1401': 'Abziehbare Vorsteuer 7%',
'3806': 'Umsatzsteuer 19%',
'3801': 'Umsatzsteuer 7%',
'6300': 'Sonstige betriebliche Aufwendungen',
'4400': 'Erlöse 19% USt',
'4300': 'Erlöse 7% USt'
};
return commonAccounts[accountNumber] || `Account ${accountNumber}`;
}
/**
* Calculate booking confidence score
*/
calculateConfidence(invoice, bookingRules) {
let confidence = 100;
// Reduce confidence for missing or uncertain mappings
invoice.lines.forEach(line => {
if (!line.accountNumber) {
confidence -= 10; // No explicit account mapping
}
if (!line.productCode) {
confidence -= 5; // No product code for mapping
}
});
// Reduce confidence for complex tax scenarios
if (invoice.taxScenario === 'reverse_charge' ||
invoice.taxScenario === 'intra_eu_acquisition') {
confidence -= 15;
}
// Reduce confidence for mixed VAT rates
if (invoice.vatBreakdown.length > 1) {
confidence -= 10;
}
// Reduce confidence if no vendor/customer mapping exists
if (invoice.direction === 'inbound') {
if (!bookingRules.vendorMapping?.[invoice.supplier.id]) {
confidence -= 10;
}
}
else {
if (!bookingRules.customerMapping?.[invoice.customer.id]) {
confidence -= 10;
}
}
// Reduce confidence for credit notes
if (invoice.invoiceTypeCode === '381') {
confidence -= 10;
}
return Math.max(0, confidence);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmludm9pY2UubWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc2tyLmludm9pY2UubWFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBVXhDOzs7R0FHRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFrRzNCLFlBQVksT0FBaUI7UUE5RjdCLHlCQUF5QjtRQUNSLG1CQUFjLEdBQUc7WUFDaEMsbUJBQW1CO1lBQ25CLGFBQWEsRUFBRSxNQUFNLEVBQVksbURBQW1EO1lBQ3BGLGVBQWUsRUFBRSxNQUFNLEVBQVUsNkNBQTZDO1lBRTlFLGVBQWU7WUFDZixVQUFVLEVBQUUsTUFBTSxFQUFlLDJCQUEyQjtZQUM1RCxTQUFTLEVBQUUsTUFBTSxFQUFnQiwwQkFBMEI7WUFDM0QsV0FBVyxFQUFFLE1BQU0sRUFBYyxtQkFBbUI7WUFDcEQsVUFBVSxFQUFFLE1BQU0sRUFBZSxrQkFBa0I7WUFDbkQsZ0JBQWdCLEVBQUUsTUFBTSxFQUFTLGlDQUFpQztZQUNsRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUkseUJBQXlCO1lBRXpELG1DQUFtQztZQUNuQyxjQUFjLEVBQUUsTUFBTSxFQUFXLGNBQWM7WUFDL0MsY0FBYyxFQUFFLE1BQU0sRUFBVyxpQkFBaUI7WUFDbEQsY0FBYyxFQUFFLE1BQU0sRUFBVyxnQkFBZ0I7WUFDakQsY0FBYyxFQUFFLE1BQU0sRUFBVyxzQkFBc0I7WUFFdkQsc0NBQXNDO1lBQ3RDLGVBQWUsRUFBRSxNQUFNLEVBQVUsbURBQW1EO1lBQ3BGLGtCQUFrQixFQUFFLE1BQU0sRUFBTyx5QkFBeUI7WUFDMUQsZ0JBQWdCLEVBQUUsTUFBTSxFQUFTLHFCQUFxQjtZQUN0RCxXQUFXLEVBQUUsTUFBTSxFQUFjLFFBQVE7WUFDekMsYUFBYSxFQUFFLE1BQU0sRUFBWSxhQUFhO1lBQzlDLGFBQWEsRUFBRSxNQUFNLEVBQVksY0FBYztZQUMvQyxjQUFjLEVB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