Files
BeWoPlaner/Report/DefaultReports/Straffaelligenhilfe/VgaStatistikReport.cs
2026-06-18 11:05:29 +02:00

342 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using BeWo.Service.Reporting.Straffaelligenhilfe;
using DevExpress.XtraReports.UI;
namespace BeWo.Report.DefaultReports.Straffaelligenhilfe
{
/// <summary>
/// XtraReport für die "Statistik der Ableistung gemeinnütziger Arbeit" (V 2014.1).
///
/// Verwendung:
/// var rows = VgaStatistikReport.CreateRows(efs, a153, a153s, bewO, bewM, gnad);
/// var report = new VgaStatistikReport();
/// report.Parameters["Vermittlungsstelle"].Value = "Musterstadt";
/// report.Parameters["Staatsanwaltschaft"].Value = "GESAMT";
/// report.Parameters["Berichtszeitraum"].Value = new DateTime(2025, 6, 30);
/// report.SetReportDataSource(rows);
/// report.ShowPreview();
/// </summary>
public partial class VgaStatistikReport : XtraReport
{
public VgaStatistikReport()
{
InitializeComponent();
}
/// <summary>
/// Setzt die Datenquelle des Reports.
/// </summary>
public void SetReportDataSource(VgaStatistic efs,
VgaStatistic auflage153a,
VgaStatistic auflage153aSteuerstraf,
VgaStatistic bewOhne,
VgaStatistic bewMit,
VgaStatistic gnadenverfahren)
{
lblBerichtszeitraum.Text = String.Format("{0:dd.MM.yyyy}-{1:dd.MM.yyyy}", efs.StartDate, efs.EndDate);
this.bindingSource1.DataSource = CreateRows(efs, auflage153a, auflage153aSteuerstraf, bewOhne, bewMit, gnadenverfahren);
}
// ── Factory ─────────────────────────────────────────────────────────────
/// <summary>
/// Konvertiert 6 ausgefüllte VgaStatistic-Objekte (je eine Kategorie) in die
/// Zeilenliste für den Report. Spalte C (insgesamt) wird als Summe berechnet.
///
/// Parameterreihenfolge entspricht den Excel-Spalten DI:
/// efs → Spalte D: Abwendung Ersatzfreiheitsstrafe
/// auflage153a → Spalte E: Auflage gem. § 153a StPO
/// auflage153aSteuerstraf → Spalte F: Auflage § 153a StPO Steuerstrafverfahren
/// bewOhne → Spalte G: Bewährungsauflage ohne Bewährungshelfer
/// bewMit → Spalte H: Bewährungsauflage mit Bewährungshelfer
/// gnadenverfahren → Spalte I: Auflage im Gnadenverfahren
/// </summary>
public static List<VgaStatistikReportRow> CreateRows(
VgaStatistic efs,
VgaStatistic auflage153a,
VgaStatistic auflage153aSteuerstraf,
VgaStatistic bewOhne,
VgaStatistic bewMit,
VgaStatistic gnadenverfahren)
{
// Kurzform: Zähle eine Eigenschaft über alle 6 Kategorien
decimal Sum(Func<VgaStatistic, decimal> f) =>
f(efs) + f(auflage153a) + f(auflage153aSteuerstraf) +
f(bewOhne) + f(bewMit) + f(gnadenverfahren);
// Normale Datenzeile
VgaStatistikReportRow Row(string pos, string beschr,
Func<VgaStatistic, decimal> f,
VgaReportRowType type = VgaReportRowType.Normal) =>
VgaStatistikReportRow.FromValues(pos, beschr,
f(efs), f(auflage153a), f(auflage153aSteuerstraf),
f(bewOhne), f(bewMit), f(gnadenverfahren), type);
return new List<VgaStatistikReportRow>
{
// ── Auftragsbestand ────────────────────────────────────────────
Row("0.1",
"Anzahl der aus dem vorhergehenden Berichtszeitraum übernommenen offenen Aufträge",
s => s.AnzahlAlt),
Row("0.2",
"Anzahl der im aktuellen Berichtszeitraum erteilten Aufträge",
s => s.AnzahlNeu, VgaReportRowType.Highlighted),
Row("1.",
"Anzahl der insges. erteilten Aufträge (Summe Zeilen 0.1 + 0.2)",
s => s.AnzahlInsgesamt, VgaReportRowType.Highlighted),
Row("1.1.",
"darunter mehrfach erteilte Aufträge zur selben Person und zum selben Aktenzeichen (Fallzahl v. Zeile 1)",
s => s.Anzahl1_1, VgaReportRowType.Highlighted),
Row("1.2.",
"darunter Amtshilfe für andere Bezirke in BW (Fallzahl v. Zeile 1)",
s => s.Anzahl1_2),
Row("1.3.",
"darunter Amtshilfe für andere Bundesländer / Ausland (Fallzahl v. Zeile 1)",
s => s.Anzahl1_3),
Row("1.4.",
"Aufträge für männliche Klienten (Fallzahl v. Zeile 1)",
s => s.Anzahl1_4),
Row("1.5.",
"Aufträge für weibliche Klienten (Fallzahl v. Zeile 1)",
s => s.Anzahl1_5),
// ── Arbeitsstunden ─────────────────────────────────────────────
Row("2.",
"Anzahl der (beauftragten) Arbeitsstunden (bezogen auf Zeile 1) in vollen Std.",
s => s.Anzahl2),
// ── Erledigte Aufträge ─────────────────────────────────────────
Row("3.",
"Anzahl aller erledigten Aufträge (incl. Abbrüche, teilweise erledigter Aufträge, gescheiterte Fälle)",
s => s.Anzahl3),
Row("3.1.",
"davon Anzahl der teilweise erledigten Aufträge (Fallzahl v. Zeile 3)",
s => s.Anzahl3_1),
VgaStatistikReportRow.FromEfsOnly(
"3.1.1.",
"Anzahl der Aufträge = Personen, bei denen die Auflagen teilweise nur durch Arbeitsleistungen erledigt wurden (Fallzahl v. Spalte D; Zeile 3.1.)",
efs.Anzahl3_1_1.ToString("N0")),
Row("3.2.",
"davon Anzahl der gescheiterten Fälle (negativer Fallstatus u. Abbrüche (Fallzahl v. Zeile 3))",
s => s.Anzahl3_2),
Row("3.3.",
"davon Anzahl der vollständig erledigten Aufträge (Fallzahl v. Zeile 3)",
s => s.Anzahl3_3),
VgaStatistikReportRow.FromEfsOnly(
"3.3.1.",
"Anzahl der Aufträge = Personen, bei denen die Auflagen nur durch Arbeitsleistungen erfüllt wurden (Fallzahl v. Spalte D; Zeile 3.3.)",
efs.Anzahl3_3_1.ToString("N0")),
// ── Verlauf (Abschnittsüberschrift) ────────────────────────────
VgaStatistikReportRow.SectionHeader(
"4.",
"Verlauf (der erledigten Aufträge gem. Zeile 3)",
"Mehrfachnennungen möglich !!"),
Row("4.1.",
"darunter Vermittlungen in externe Einsatzstellen (Fallzahl von Zeile 3)",
s => s.Anzahl4_1),
Row("4.2.",
"darunter Vermittlungen in verschiedene Einsatzstellen (Fallzahl von Zeile 3)",
s => s.Anzahl4_2),
Row("4.3.",
"darunter Vermittlungen in eigene Arbeitsgruppen (Fallzahl von Zeile 3)",
s => s.Anzahl4_3),
Row("4.4.",
"darunter durch Ratenzahlungsvereinbarung (Fallzahlen v. Zeile 3)",
s => s.Anzahl4_4),
Row("4.5.",
"darunter sonstige Erledigung (Umzug, Änderung des Beschlusses) (Fallzahl v. Zeile 3)",
s => s.Anzahl4_5),
Row("4.6.",
"darunter Mischformen (Fallzahlen von Zeile 3)",
s => s.Anzahl4_6),
Row("4.7.",
"Übergang in Aufsuchende Sozialarbeit",
s => s.Anzahl4_7),
Row("4.8.",
"Übergang in Treuhänderische Geldverwaltung",
s => s.Anzahl4_8),
// ── Geleistete Stunden ─────────────────────────────────────────
Row("5.",
"Anzahl der geleisteten Arbeitsstunden bezogen auf Zeile 3 (volle Std.)",
s => s.Anzahl5),
// ── Zahlungen / Hafttage / Fälle (nur Insgesamt = EFS) ─────────
VgaStatistikReportRow.FromEfsOnly(
"6.",
"Summe der nachgewiesenen Zahlungen in €",
(efs.Betrag6 + auflage153a.Betrag6 + auflage153aSteuerstraf.Betrag6 +
bewOhne.Betrag6 + bewMit.Betrag6 + gnadenverfahren.Betrag6).ToString("N2")),
VgaStatistikReportRow.FromEfsOnly(
"7.",
"Anzahl der vermiedenen Hafttage (durch Arbeitsstd. und / oder Zahlungen)",
Sum(s => s.Anzahl7).ToString("N0")),
VgaStatistikReportRow.FromEfsOnly(
"7.1.",
"Anzahl der vermiedenen Hafttage (nur durch Arbeitsstd.)",
Sum(s => s.Anzahl7_1).ToString("N0")),
VgaStatistikReportRow.FromEfsOnly(
"8.",
"Anzahl der Aufträge = Personen, bei denen die Vollstreckung der Freiheitsstrafe vollständig oder teilweise durch gemeinnützige Arbeit abgewendet wurde",
Sum(s => s.Anzahl8).ToString("N0")),
// ── Gründe für Abbrüche (Abschnittsüberschrift) ────────────────
VgaStatistikReportRow.SectionHeader(
"9.",
"Gründe für Abbrüche / Scheitern",
"(Fallzahlen bezogen auf Zeile 3.2 - Mehrfachnennung möglich)"),
Row("9.1.", "kein Kontakt", s => s.Anzahl9_1),
Row("9.2.", "nicht angetreten", s => s.Anzahl9_2),
Row("9.3.", "Abbruch der Tätigkeit", s => s.Anzahl9_3),
Row("9.4.", "längerfristig arbeitsunfähig", s => s.Anzahl9_4),
Row("9.5.", "Suchtproblematik", s => s.Anzahl9_5),
Row("9.6.", "psychische Probleme", s => s.Anzahl9_6),
Row("9.7.", "keine Motivation", s => s.Anzahl9_7),
Row("9.8.", "in Haft", s => s.Anzahl9_8),
Row("9.9.", "unbekannt", s => s.Anzahl9_9),
// ── Offene Aufträge ────────────────────────────────────────────
Row("10.",
"Anzahl der offenen Aufträge (= Zeile 1 minus Zeile 3)",
s => s.Anzahl10),
// ── Dauer der Beratung (Abschnittsüberschrift) ─────────────────
VgaStatistikReportRow.SectionHeader(
"11.",
"Dauer der Beratung / Betreuung (der erl. Aufträge)",
"(Fallzahlen-Summen müssen identisch sein mit Zeile 3)"),
Row("11.1.", "bis 3 Monate", s => s.Anzahl11_1),
Row("11.2.", "3 bis 6 Monate", s => s.Anzahl11_2),
Row("11.3.", "6 bis 12 Monate", s => s.Anzahl11_3),
Row("11.4.", "über 12 Monate", s => s.Anzahl11_4),
// ── Vermittlung aus Haft ───────────────────────────────────────
Row("12.", "Vermittlung aus Haft", s => s.Anzahl12),
};
}
}
/// <summary>
/// Zeilentyp für die bedingte Formatierung im VGA-Statistik Report.
/// </summary>
public enum VgaReportRowType
{
Normal = 0,
Highlighted = 1, // Orangefarbener Hintergrund (z. B. Zeilen 0.2, 1., 1.1.)
SectionHeader = 2 // Blauer Hintergrund (Abschnittsüberschriften 4., 9., 11.)
}
/// <summary>
/// Datenmodell für eine Zeile im VGA-Statistik Report.
/// Alle Werte werden als formatierte Strings übergeben, damit auch "x"-Einträge
/// für nicht anwendbare Felder dargestellt werden können.
/// </summary>
public class VgaStatistikReportRow
{
public string Position { get; set; } = "";
public string Beschreibung { get; set; } = "";
public string ColInsgesamt { get; set; } = "";
public string ColEFS { get; set; } = "";
public string ColAuflage153a { get; set; } = "";
public string ColAuflage153aSteuerstraf { get; set; } = "";
public string ColBewOhne { get; set; } = "";
public string ColBewMit { get; set; } = "";
public string ColGnadenverfahren { get; set; } = "";
public VgaReportRowType RowType { get; set; } = VgaReportRowType.Normal;
/// <summary>
/// Erstellt eine normale Datenzeile aus den Einzelwerten der 6 Kategorien.
/// Insgesamt wird als Summe berechnet.
/// </summary>
internal static VgaStatistikReportRow FromValues(
string position, string beschreibung,
decimal valEFS, decimal valA153, decimal valA153s, decimal valBewO, decimal valBewM, decimal valGnad,
VgaReportRowType rowType = VgaReportRowType.Normal)
{
decimal total = valEFS + valA153 + valA153s + valBewO + valBewM + valGnad;
return new VgaStatistikReportRow
{
Position = position,
Beschreibung = beschreibung,
ColInsgesamt = total.ToString("0.##"),
ColEFS = valEFS.ToString("0.##"),
ColAuflage153a = valA153.ToString("0.##"),
ColAuflage153aSteuerstraf = valA153s.ToString("0.##"),
ColBewOhne = valBewO.ToString("0.##"),
ColBewMit = valBewM.ToString("0.##"),
ColGnadenverfahren = valGnad.ToString("0.##"),
RowType = rowType
};
}
/// <summary>
/// Erstellt eine Zeile, bei der nur Insgesamt (= EFS-Wert) relevant ist
/// Spalten EI werden als "x" (nicht anwendbar) dargestellt.
/// Verwendet für Positionen 3.1.1., 3.3.1., 6., 7., 7.1., 8.
/// </summary>
internal static VgaStatistikReportRow FromEfsOnly(
string position, string beschreibung,
string valTotal,
VgaReportRowType rowType = VgaReportRowType.Normal)
{
return new VgaStatistikReportRow
{
Position = position,
Beschreibung = beschreibung,
ColInsgesamt = valTotal,
ColEFS = valTotal,
ColAuflage153a = "x",
ColAuflage153aSteuerstraf = "x",
ColBewOhne = "x",
ColBewMit = "x",
ColGnadenverfahren = "x",
RowType = rowType
};
}
/// <summary>
/// Erstellt eine Abschnittsüberschrift (blauer Hintergrund).
/// ColInsgesamt nimmt den Hinweistext auf.
/// </summary>
internal static VgaStatistikReportRow SectionHeader(
string position, string beschreibung, string hinweis = "")
{
return new VgaStatistikReportRow
{
Position = position,
Beschreibung = beschreibung,
ColInsgesamt = hinweis,
RowType = VgaReportRowType.SectionHeader
};
}
}
}