skripte:susa_pruefen
SuSa prüfen
Nutzen: Dieses Skript analysiert Summen- und Saldenlisten (SuSa) verschiedener Formate, um deren buchhalterische Korrektheit zu überprüfen und eine schnelle betriebswirtschaftliche Auswertung zu liefern.
Funktion:
Arbeitet mit einem flexiblen Profil-System, um verschiedene Datei-Layouts (z.B. DATEV-CSV) zu unterstützen.
Analysiert SuSa-Dateien basierend auf einem festen Spalten-Layout.
Erkennt automatisch den Kontenrahmen (SKR03/04) anhand von Schlüsselkonten.
Unterscheidet zwischen Sach- und Personenkonten für eine informative Analyse.
Prüft die Summengleichheit von Soll und Haben (primäre Aufgabe).
Berechnet und zeigt die Summen der Hauptkostenarten (Erlöse, Material, Personal etc.) und das daraus resultierende Betriebsergebnis an.
--- KONFIGURATION --- $folderPath = $PSScriptRoot $col = @{ Konto = "A"; Bezeichnung = "B"; EB_Wert = "C"; Soll = "I"; Haben = "J" } $kontenrahmen = @{ SKR03 = @{ Erloese = 8000..8999; Materialkosten = 3000..3999; Personalkosten = 4100..4199; Sonstige_Kosten = 4200..4999 } SKR04 = @{ Erloese = 4000..4999; Materialkosten = 5000..5999; Personalkosten = 6000..6199; Sonstige_Kosten = 6200..6999 } } $markerAccounts = @{ SKR03 = @(1000, 1200, 8300, 8400); SKR04 = @(1600, 1800, 4300, 4400) } --- ENDE KONFIGURATION --- --- FUNKTIONEN --- function Test-FileLock { param ([string]$Path) try { $stream = [System.IO.File]::Open($Path, 'Open', 'Read', 'Write'); if ($stream) { $stream.Close() }; return true } catch { Write-Host "FEHLER: Datei '(Split-Path $Path -Leaf)' ist gesperrt." -ForegroundColor Red; return $false } } function ConvertTo-Number($value) { if ($null -eq $value -or $value -is [string] -and [string]::IsNullOrWhiteSpace($value)) { return 0 } return [double]($value -replace '.', '' -replace ',', '.') } --- Skriptstart --- Write-Host "========== Skript 'SuSa prüfen' gestartet ==========" if (-not (Test-Path $folderPath)) { Write-Host "FEHLER: Ordner '$folderPath' nicht gefunden." -ForegroundColor Red; exit } $dateien = Get-ChildItem -Path $folderPath -Include "SuSa.xlsx", "SuSa.xls", "SuSa.csv" -Recurse if ($dateien.Count -eq 0) { Write-Host "Keine passenden SuSa-Dateien gefunden." -ForegroundColor Yellow; exit } $excel = New-Object -ComObject Excel.Application $excel.Visible = $false; $excel.DisplayAlerts = $false try { foreach ($file in $dateien) { Write-Host "`n--- Verarbeite Datei: $($file.Name) ---" -ForegroundColor Cyan if (-not (Test-FileLock -Path $file.FullName)) { continue } $workbook = $null try { $workbook = $excel.Workbooks.Open($file.FullName) $sheet = $workbook.Worksheets.Item(1) $sheet.Columns.Item(1).NumberFormat = "0" $workbook.Save() Write-Host " > Spalte A formatiert und gespeichert." $usedRange = $sheet.UsedRange; $sollSummeGesamt = 0; $habenSummeGesamt = 0 $sachkonten = @{ Count = 0; Soll = 0; Haben = 0 }; $personenkonten = @{ Count = 0; Soll = 0; Haben = 0 } $kategorieSummen = @{ Erloese = 0; Materialkosten = 0; Personalkosten = 0; Sonstige_Kosten = 0 } $skr03Score = 0; $skr04Score = 0 Write-Host " > Analysiere Konten zur SKR-Erkennung..." for ($i = 1; $i -le $usedRange.Rows.Count; $i++) { $kontoNummer = $usedRange.Cells.Item($i, $col.Konto).Text if ($kontoNummer -match "^\d{4}$") { $kontoNummerInt = [int]$kontoNummer if ($markerAccounts.SKR03 -contains $kontoNummerInt) { $skr03Score++ } if ($markerAccounts.SKR04 -contains $kontoNummerInt) { $skr04Score++ } } } $erkannterSKR = if ($skr03Score -gt $skr04Score) { "SKR03" } elseif ($skr04Score -gt $skr03Score) { "SKR04" } else { "Unbekannt" } if ($erkannterSKR -eq "Unbekannt") { throw "Kontenrahmen konnte nicht eindeutig erkannt werden." } Write-Host " > Kontenrahmen erkannt: $erkannterSKR" -ForegroundColor Yellow $skrDefinition = $kontenrahmen[$erkannterSKR] for ($i = 1; $i -le $usedRange.Rows.Count; $i++) { $kontoNummer = $usedRange.Cells.Item($i, $col.Konto).Text if ($kontoNummer -notmatch "^\d{4,5}$") { continue } $sollWert = ConvertTo-Number($usedRange.Cells.Item($i, $col.Soll).Text) $habenWert = ConvertTo-Number($usedRange.Cells.Item($i, $col.Haben).Text) $sollSummeGesamt += $sollWert; $habenSummeGesamt += $habenWert if ($kontoNummer -match "^\d{4}$") { $sachkonten.Count++; $sachkonten.Soll += $sollWert; $sachkonten.Haben += $habenWert $kontoNummerInt = [int]$kontoNummer if ($kontoNummerInt -in $skrDefinition.Erloese) { $kategorieSummen.Erloese += $habenWert } if ($kontoNummerInt -in $skrDefinition.Materialkosten) { $kategorieSummen.Materialkosten += $sollWert } if ($kontoNummerInt -in $skrDefinition.Personalkosten) { $kategorieSummen.Personalkosten += $sollWert } if ($kontoNummerInt -in $skrDefinition.Sonstige_Kosten) { $kategorieSummen.Sonstige_Kosten += $sollWert } } elseif ($kontoNummer -match "^\d{5}$") { $personenkonten.Count++; $personenkonten.Soll += $sollWert; $personenkonten.Haben += $habenWert } } $workbook.Close($false) $gewinn = $kategorieSummen.Erloese - $kategorieSummen.Materialkosten - $kategorieSummen.Personalkosten - $kategorieSummen.Sonstige_Kosten Write-Host " > Prüfung der Gesamtsummen:" Write-Host " - Soll-Summe: $('{0:N2}' -f $sollSummeGesamt)" Write-Host " - Haben-Summe: $('{0:N2}' -f $habenSummeGesamt)" if ([math]::Round($sollSummeGesamt, 2) -eq [math]::Round($habenSummeGesamt, 2)) { Write-Host " -> PRIMÄRE PRÜFUNG: ERFOLGREICH" -ForegroundColor Green } else { Write-Host " -> PRIMÄRE PRÜFUNG: ACHTUNG - Summendifferenz." -ForegroundColor Yellow } Write-Host " > Sekundäre Analyse (Kostenarten):" Write-Host " - Erlöse Gesamt:".PadRight(25) + "$('{0:N2}' -f $kategorieSummen.Erloese)" Write-Host " - Materialkosten:".PadRight(25) + "$('{0:N2}' -f $kategorieSummen.Materialkosten)" Write-Host " - Personalkosten:".PadRight(25) + "$('{0:N2}' -f $kategorieSummen.Personalkosten)" Write-Host " - Sonstige Kosten:".PadRight(25) + "$('{0:N2}' -f $kategorieSummen.Sonstige_Kosten)" Write-Host " ----------------------------------" if ($gewinn -ge 0) { Write-Host " = Betriebsergebnis:".PadRight(25) -NoNewline; Write-Host "$('{0:N2}' -f $gewinn)" -ForegroundColor Green } else { Write-Host " = Betriebsergebnis:".PadRight(25) -NoNewline; Write-Host "$('{0:N2}' -f $gewinn)" -ForegroundColor Red } Write-Host " > Informative Analyse (Kontentypen):" Write-Host " - Sachkonten (4-stellig):".PadRight(30) + "$($sachkonten.Count) Konten | Soll: $('{0:N2}' -f $sachkonten.Soll) | Haben: $('{0:N2}' -f $sachkonten.Haben)" Write-Host " - Personenkonten (5-stellig):".PadRight(30) + "$($personenkonten.Count) Konten | Soll: $('{0:N2}' -f $personenkonten.Soll) | Haben: $('{0:N2}' -f $personenkonten.Haben)" } catch { Write-Host "FEHLER bei der Verarbeitung von '$($file.Name)': $($_.Exception.Message)" -ForegroundColor Red if ($workbook -ne $null) { $workbook.Close($false) } } } } finally { if ($excel) { $excel.Quit() [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null } Write-Host "`n========== Skript 'SuSa prüfen' beendet ==========" } //Author: Stefan Agethen //Letzte Bearbeitung: 2025//
skripte/susa_pruefen.txt · Zuletzt geändert: von Stefan Agethen
