skripte:susa_kost_vorverarbeiten
SuSa+KOST vor-verarbeiten
Nutzen: Dieses Skript kombiniert zwei separate Prozesse in einen einzigen, sequenziellen Workflow. Es dient der vollständigen monatlichen Vorverarbeitung von zusammengehörigen SuSa- und KOST-Dateien.
Funktion:
ANALYSE: Prüft die SuSa-Datei auf buchhalterische Korrektheit und erkennt den verwendeten Kontenrahmen. Stellt es eine Summendifferenz fest, wird nach einer zugehörigen KOST-Datei gesucht.
UMSTRUKTURIERUNG: Falls eine KOST-Datei nötig und vorhanden ist, wird diese automatisch umstrukturiert, um die Differenz zu bereinigen.
Gibt am Ende eine gesammelte, detaillierte Zusammenfassung für das gesamte Monatspaket (SuSa und, falls verarbeitet, KOST) aus.
--- 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) } $kost_lieferkundenValue = 100 $kost_kontoGesamtTextPattern = "Konto8300gesamt" $kost_newBlockValueA = "83001" $kost_newBlockValueC = "Wiederverkäufer" --- 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+KOST vor-verarbeiten' gestartet ==========" if (-not (Test-Path $folderPath)) { Write-Host "FEHLER: Ordner '$folderPath' nicht gefunden." -ForegroundColor Red; exit } $susaDateien = Get-ChildItem -Path $folderPath -Include "SuSa.xlsx", "SuSa.xls", "SuSa.csv" -Recurse if ($susaDateien.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 ($susaFile in $susaDateien) { Write-Host "`n==================== Monatspaket für $($susaFile.Name) ====================" -ForegroundColor Magenta $susaWorkbook = $null; $kostWorkbook = $null $kostFile = $null; $susaDifferenzBehandelt = $false # --- TEIL 1: SUSA-DATEI ANALYSIEREN --- Write-Host "`n--- 1. Analyse der SuSa-Datei ---" -ForegroundColor Cyan try { if (-not (Test-FileLock -Path $susaFile.FullName)) { throw "SuSa-Datei ist gesperrt." } $susaWorkbook = $excel.Workbooks.Open($susaFile.FullName) $sheet = $susaWorkbook.Worksheets.Item(1) $sheet.Columns.Item(1).NumberFormat = "0" $susaWorkbook.Save(); $susaWorkbook.Close($true) # Speichern und schließen für die Analyse $susaWorkbook = $excel.Workbooks.Open($susaFile.FullName, $true) $sheet = $susaWorkbook.Worksheets.Item(1); $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 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 } } $differenz = $sollSummeGesamt - $habenSummeGesamt if ([math]::Round($differenz, 2) -ne 0) { $susaDifferenzBehandelt = $true } } catch { Write-Host " -> STATUS: FEHLER bei der Analyse der SuSa-Datei: $($_.Exception.Message)" -ForegroundColor Red } finally { if ($susaWorkbook -ne $null) { $susaWorkbook.Close($false) } } # --- TEIL 2: KOST-DATEI SUCHEN UND VERARBEITEN (falls nötig) --- Write-Host "`n--- 2. Verarbeitung der KOST-Datei ---" -ForegroundColor Cyan $dateMatch = [regex]::Match($susaFile.Name, '^\d{6}').Value if ($dateMatch) { $kostFile = Get-ChildItem -Path $folderPath -Include "*$dateMatch*KOST*.xls*", "*$dateMatch*Kostenartensalden*.xls*" -File -Recurse | Select-Object -First 1 } if ($susaDifferenzBehandelt -and -not $kostFile) { Write-Host " -> STATUS: FEHLER - SuSa hat eine Differenz, aber keine passende KOST-Datei gefunden." -ForegroundColor Red } elseif ($kostFile) { Write-Host " > Zugehörige Datei gefunden: $($kostFile.Name)" if (-not (Test-FileLock -Path $kostFile.FullName)) { continue } try { $kostWorkbook = $excel.Workbooks.Open($kostFile.FullName) $worksheet = $kostWorkbook.Worksheets.Item(1) $worksheet.Columns.Item(1).NumberFormat = "0" $customerRowFind = $worksheet.Columns.Item(2).Find($kost_lieferkundenValue) $gesamtRowFind = $worksheet.Cells.Find($kost_kontoGesamtTextPattern) if ($customerRowFind -and $gesamtRowFind) { $kostWorkbook.Save() Write-Host " -> STATUS: KOST-Datei erfolgreich umstrukturiert." -ForegroundColor Green } else { Write-Host " -> STATUS: FEHLER - Ankerpunkte in KOST-Datei nicht gefunden." -ForegroundColor Red } } catch { Write-Host " -> STATUS: FEHLER bei der Verarbeitung der KOST-Datei: $($_.Exception.Message)" -ForegroundColor Red } finally { if ($kostWorkbook -ne $null) { $kostWorkbook.Close($false) } } } else { Write-Host " -> STATUS: Keine KOST-Datei zur Verarbeitung nötig oder gefunden." } # --- TEIL 3: GESAMTAUSGABE --- Write-Host "`n--- 3. Zusammenfassung für Monatspaket ---" -ForegroundColor Cyan Write-Host " > Kontenrahmen: $erkannterSKR" Write-Host " > SuSa-Summen: Soll=$('{0:N2}' -f $sollSummeGesamt) | Haben=$('{0:N2}' -f $habenSummeGesamt) | Differenz=$('{0:N2}' -f $differenz)" if ($susaDifferenzBehandelt) { Write-Host " -> HINWEIS: Summendifferenz erkannt, wird durch KOST-Datei '$($kostFile.Name)' bereinigt." -ForegroundColor Yellow } else { Write-Host " -> STATUS: Soll und Haben sind ausgeglichen." -ForegroundColor Green } } } finally { if ($excel) { $excel.Quit(); [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null } Write-Host "`n========== Skript 'SuSa+KOST vor-verarbeiten' beendet ==========" } ---- //Author: Stefan Agethen //Letzte Bearbeitung: 2025//
skripte/susa_kost_vorverarbeiten.txt · Zuletzt geändert: von Stefan Agethen
