Benutzer-Werkzeuge

Webseiten-Werkzeuge


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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki