2024-06-19 16:13:56 +02:00
using BS.Shared.DataContracts ;
using DevExpress.Pdf ;
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
using System.Text ;
using System.Text.RegularExpressions ;
using System.Threading.Tasks ;
namespace BeWo.Service.Import.Perseh
{
public class PersehReader
{
public HilfeplanImportDC ReadPdfDocument ( byte [ ] daten )
{
HilfeplanImportDC result = new HilfeplanImportDC ( ) ;
result . Gruppen = new List < HilfeplanImportItemDC > ( ) ;
2024-09-01 20:47:02 +02:00
//var gruppe1 = new HilfeplanImportItemDC { Label = "Leistungssuchende oder leistungsberechtigte Person", Items = new List<HilfeplanImportItemDC>() };
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Name", Content = "Bäurle", FieldName = "LastName" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Vorname", Content = "Christian", FieldName = "FirstName" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Geburtsdatum", Content = "08.04.1972", FieldName = "Birthdate" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Nationalität", Content = "deutsch" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Beruf", Content = "Wirt" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "GP-Nummer/Az", Content = "73.20-2100009313-01" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Erstellt von der\nleistungssuchenden oder\nleistungsberechtigten Person\nmit Behinderung unter", Content = "Max Mustermann (Bezugsbetreuer)\nMaria Musterfrau (Sozialarbeiterin)" });
2024-06-19 16:13:56 +02:00
2024-09-01 20:47:02 +02:00
//result.Gruppen.Add(gruppe1);
2024-06-19 16:13:56 +02:00
2024-09-01 20:47:02 +02:00
//gruppe1 = new HilfeplanImportItemDC { Label = "Gruppe 2", Items = new List<HilfeplanImportItemDC>() };
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Name", Content = "Bäurle", FieldName = "LastName" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Vorname", Content = "Christian", FieldName = "FirstName" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Geburtsdatum", Content = "08.04.1972", FieldName = "Birthdate" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Nationalität", Content = "deutsch" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Beruf", Content = "Wirt" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "GP-Nummer/Az", Content = "73.20-2100009313-01" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Erstellt von der\nleistungssuchenden oder\nleistungsberechtigten Person\nmit Behinderung unter", Content = "Max Mustermann (Bezugsbetreuer)\nMaria Musterfrau (Sozialarbeiterin)" });
2024-06-19 16:13:56 +02:00
2024-09-01 20:47:02 +02:00
//result.Gruppen.Add(gruppe1);
2024-06-19 16:13:56 +02:00
2024-06-24 16:30:36 +02:00
result . Ziele = new List < HilfeplanImportZielDC > ( ) ;
2024-09-01 20:47:02 +02:00
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." });
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" });
2024-06-19 16:13:56 +02:00
2024-09-01 20:47:02 +02:00
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." });
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" });
2024-06-19 16:13:56 +02:00
2024-09-01 20:47:02 +02:00
using ( var processor = new PdfDocumentProcessor ( ) )
{
using ( var ms = new MemoryStream ( daten ) )
{
processor . LoadDocument ( ms ) ;
2024-06-24 16:30:36 +02:00
2024-09-01 20:47:02 +02:00
var pdfText = processor . Text ;
var customerGruppe = ErstelleKlientenStammdatenGruppe ( pdfText ) ;
2024-10-21 13:27:52 +02:00
if ( customerGruppe = = null )
{
customerGruppe = ErstelleGruppeMitNamenUndAktenzeichen ( pdfText ) ;
}
2024-09-01 20:47:02 +02:00
if ( customerGruppe ! = null )
{
result . Gruppen . Add ( customerGruppe ) ;
}
2024-06-24 16:30:36 +02:00
2024-09-01 20:47:02 +02:00
result . Ziele = ErstelleAlleZiele ( pdfText ) ;
}
}
2024-06-19 16:13:56 +02:00
2024-09-18 21:50:00 +02:00
//result.Ziele = new List<HilfeplanImportZielDC>();
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." });
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" });
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." });
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" });
2024-06-19 16:13:56 +02:00
return result ;
}
2024-09-01 20:47:02 +02:00
private IList < HilfeplanImportZielDC > ErstelleAlleZiele ( string pdfText )
{
var ziele = new List < HilfeplanImportZielDC > ( ) ;
//Suche Zeile "Zielplanung". So beginnt hinten im Dokument der Bereich mit der Zusammenfassung der Ziele
var zeilen = pdfText . Split ( new [ ] { '\r' , '\n' } , StringSplitOptions . RemoveEmptyEntries ) ;
var startIdx = - 1 ;
var endIdx = - 1 ;
2024-10-21 13:27:52 +02:00
var zielplanungStart = - 1 ;
2024-09-01 20:47:02 +02:00
StringBuilder gesamtTextMitZielen = new StringBuilder ( ) ;
for ( int i = zeilen . Length - 1 ; i > = 0 ; i - - )
{
var z = zeilen [ i ] ;
if ( z = = "Zielplanung" )
{
2024-10-21 13:27:52 +02:00
zielplanungStart = i ;
2024-09-01 20:47:02 +02:00
startIdx = i ;
}
if ( z . StartsWith ( "Übersicht der Leistungsplanung " ) )
{
endIdx = i ;
}
}
2024-11-14 10:24:19 +01:00
if ( endIdx < startIdx )
{
for ( int i = zeilen . Length - 1 ; i > = 0 ; i - - )
{
var z = zeilen [ i ] ;
if ( z . StartsWith ( "Gesamtübersicht Stunden pro Woche" ) )
{
endIdx = i ;
}
}
}
2024-09-01 20:47:02 +02:00
if ( startIdx > = 0 )
{
for ( int i = startIdx ; i < endIdx ; i + + )
{
gesamtTextMitZielen . AppendLine ( zeilen [ i ] ) ;
}
zeilen = gesamtTextMitZielen . ToString ( ) . Split ( new [ ] { '\r' , '\n' } , StringSplitOptions . RemoveEmptyEntries ) ;
startIdx = 0 ;
while ( startIdx > = 0 )
{
var ta = TextAbschnittReader . LeseBisText ( zeilen , startIdx , "Lebensbereich " , true , false , false ) ;
if ( ta . Success )
{
ziele . AddRange ( ErstelleBereichMitZielen ( zeilen , ta ) ) ;
startIdx = ta . ZeilenIndex + 1 ;
}
else
{
startIdx = - 1 ;
}
}
}
2024-10-21 13:27:52 +02:00
ErstelleMassnahmen ( pdfText , zielplanungStart , ziele ) ;
2024-10-08 19:30:58 +02:00
2024-09-01 20:47:02 +02:00
return ziele ;
}
2024-10-08 19:30:58 +02:00
private void ErstelleMassnahmen ( string pdfText , int endIndex , List < HilfeplanImportZielDC > ziele )
{
2024-10-21 13:27:52 +02:00
var zeilen = pdfText . ToString ( ) . Split ( new [ ] { '\r' , '\n' } , StringSplitOptions . RemoveEmptyEntries ) ;
2024-10-08 19:30:58 +02:00
foreach ( var item in ziele )
{
item . Massnahmen = new List < HilfeplanImportZielDC > ( ) ;
2024-10-21 13:27:52 +02:00
int zeilenIndex = 0 ;
foreach ( var zeile in zeilen )
{
if ( zeilenIndex < endIndex & & zeile . StartsWith ( "Ziel " ) )
{
if ( item . ZielName . StartsWith ( zeile . Substring ( 5 ) ) )
{
int massnahmenStartIndex = - 1 ;
var ta = TextAbschnittReader . LeseBisText ( zeilen , zeilenIndex , "Beschreibung der Maßnahme" , true , false , false ) ;
if ( ta . Success )
{
massnahmenStartIndex = ta . ZeilenIndex ;
}
else
{
ta = TextAbschnittReader . LeseBisText ( zeilen , ta . ZeilenIndex + 1 , "Beschreibung der" , true , false , false ) ;
if ( ta . Success )
{
var ta2 = TextAbschnittReader . LeseBisText ( zeilen , ta . ZeilenIndex + 1 , "Maßnahme" , true , false , false ) ;
if ( ta2 . Success & & ta2 . ZeilenIndex = = ta . ZeilenIndex + 1 )
{
massnahmenStartIndex = ta2 . ZeilenIndex ;
}
}
}
if ( massnahmenStartIndex > 0 )
{
ta = TextAbschnittReader . LeseBisText ( zeilen , massnahmenStartIndex , "Wer soll das tun?" , true , false , false ) ;
if ( ta . Success )
{
var text = ta . Text ;
ErstelleMassnahmenFuerZiel ( item , text ) ;
}
}
}
}
zeilenIndex + + ;
}
}
}
public virtual void ErstelleMassnahmenFuerZiel ( HilfeplanImportZielDC item , string text )
{
var zeilen = text . Split ( new [ ] { '\r' , '\n' } , StringSplitOptions . RemoveEmptyEntries ) ;
var sb = new StringBuilder ( ) ;
//Entferne Zeilenumbrüche und unnötige Zeilen (wie Kopf und Fußzeilen)
//Letzte Zeile nicht mitnehmen, da steht drin "wer soll das tun?"
for ( int i = 0 ; i < zeilen . Length - 1 ; i + + )
{
String zeile = zeilen [ i ] ;
if ( i = = 0 )
{
if ( zeile . StartsWith ( "Beschreibung der Maßnahmen" ) )
{
zeile = zeile . Substring ( 26 ) ;
}
else if ( zeile . StartsWith ( "Beschreibung der Maßnahme" ) )
{
zeile = zeile . Substring ( 25 ) ;
}
if ( zeile . StartsWith ( "Maßnahmen" ) )
{
zeile = zeile . Substring ( 9 ) ;
}
else if ( zeile . StartsWith ( "Maßnahme" ) )
{
zeile = zeile . Substring ( 8 ) ;
}
zeile = zeile . Trim ( ) ;
}
if ( ! String . IsNullOrWhiteSpace ( zeile ) & & ! IgnoriereZeile ( zeile ) )
{
sb . Append ( zeile ) ;
sb . Append ( " " ) ;
}
}
item . Massnahmen = ErstelleMassnahmenDCs ( sb . ToString ( ) ) ;
}
public virtual IList < HilfeplanImportZielDC > ErstelleMassnahmenDCs ( string text )
{
var result = new List < HilfeplanImportZielDC > ( ) ;
//Finde Auflistung die mit einer Zahl und einem Punkt beginnen (1. erste Zeile, 2. zweite Zeile etc.)
if ( ! String . IsNullOrEmpty ( text ) & & text . StartsWith ( "1. " ) )
{
string pattern = @"(\d+\.\s.*?)(?=\s*\d+\.\s|$)" ;
MatchCollection matches = Regex . Matches ( text , pattern ) ;
var sb = new StringBuilder ( ) ;
foreach ( var match in matches )
{
sb . AppendLine ( match . ToString ( ) ) ;
}
var massnahme = new HilfeplanImportZielDC ( ) ;
massnahme . DoImport = true ;
massnahme . ZielName = sb . ToString ( ) ;
result . Add ( massnahme ) ;
}
if ( result . Count = = 0 & & ! String . IsNullOrEmpty ( text ) )
{
var massnahme = new HilfeplanImportZielDC ( ) ;
massnahme . DoImport = true ;
massnahme . ZielName = text ;
result . Add ( massnahme ) ;
2024-10-08 19:30:58 +02:00
}
2024-10-21 13:27:52 +02:00
return result ;
2024-10-08 19:30:58 +02:00
}
2024-09-01 20:47:02 +02:00
private IList < HilfeplanImportZielDC > ErstelleBereichMitZielen ( string [ ] zeilen , TextAbschnitt ta )
{
var ziele = new List < HilfeplanImportZielDC > ( ) ;
String bereich = zeilen [ ta . ZeilenIndex ] ;
int idxBereichStart = ta . ZeilenIndex + 1 ;
int idxBereichtEnde = zeilen . Length ;
var taEnde = TextAbschnittReader . LeseBisText ( zeilen , ta . ZeilenIndex + 1 , "Lebensbereich " , true , false , false ) ;
if ( taEnde . Success )
{
idxBereichtEnde = taEnde . ZeilenIndex ;
}
HilfeplanImportZielDC ziel = null ;
for ( int i = idxBereichStart ; i < idxBereichtEnde ; i + + )
{
String zeile = zeilen [ i ] ;
if ( zeile . StartsWith ( "Ziele • " ) | | zeile . StartsWith ( "• " ) )
{
ziel = new HilfeplanImportZielDC ( ) ;
2024-10-21 13:27:52 +02:00
ziel . DoImport = true ;
2024-09-01 20:47:02 +02:00
ziel . Bereich = bereich ;
ziel . ZielName = zeile . Replace ( "Ziele • " , "" ) . Replace ( "• " , "" ) . Trim ( ) ;
ziele . Add ( ziel ) ;
}
else if ( ziel ! = null )
{
if ( ! IgnoriereZeile ( zeile ) )
{
ziel . ZielName + = " " + zeile . Trim ( ) ;
2024-09-18 21:50:00 +02:00
ziel . ZielBeschreibung = "Beschreibung:\n" + zeile ;
2024-09-01 20:47:02 +02:00
}
}
}
return ziele ;
}
private bool IgnoriereZeile ( string zeile )
{
if ( zeile . StartsWith ( "(c) Landschaftsverband" ) | | zeile . StartsWith ( "Gesprächsleitfaden - " ) )
{
return true ;
}
if ( zeile . StartsWith ( "V1" ) | | zeile . StartsWith ( "V2" ) | | zeile . StartsWith ( "V3" ) )
{
return true ;
}
2024-10-21 13:27:52 +02:00
//Ignoriert das Aktenzeichen
if ( StartetMitNZiffern ( zeile , 10 ) )
{
return true ;
}
return false ;
}
private bool StartetMitNZiffern ( string zeile , int anzahlZiffern )
{
string pattern = String . Format ( "{0:0}" , anzahlZiffern ) ;
pattern = "\\d{" + pattern + "}" ;
MatchCollection matches = Regex . Matches ( zeile , pattern ) ;
if ( matches . Count > 0 & & matches [ 0 ] . Index = = 0 )
{
return true ;
}
2024-09-01 20:47:02 +02:00
return false ;
}
private HilfeplanImportItemDC ErstelleKlientenStammdatenGruppe ( string pdfText )
{
if ( pdfText . Contains ( "Individuelle Bedarfsermittlung - Element Basisdaten" ) )
{
var customerGruppe = new HilfeplanImportItemDC { Label = "Stammdaten" , Items = new List < HilfeplanImportItemDC > ( ) } ;
customerGruppe . Items = LeseKlientenStammdaten ( pdfText ) ;
return customerGruppe ;
}
return null ;
}
2024-10-21 13:27:52 +02:00
private HilfeplanImportItemDC ErstelleGruppeMitNamenUndAktenzeichen ( string pdfText )
{
String aktenzeichen = "" ;
String name = "" ;
String datum = "" ;
var zeilen = pdfText . Split ( new [ ] { '\r' , '\n' } , StringSplitOptions . RemoveEmptyEntries ) ;
//Der Name sollte oben auf der ersten Seite stehen. Suche innerhalb der ersten 10 Zeilen danach:
var ta = TextAbschnittReader . LeseBisText ( zeilen , 0 , "Name " , true , false , false ) ;
if ( ta . Success & & ta . ZeilenIndex < = 10 )
{
var zeile = zeilen [ ta . ZeilenIndex ] . Replace ( "Name " , "" ) ;
if ( zeile . Contains ( "GP-Nr./Az. " ) )
{
aktenzeichen = zeile . Substring ( zeile . IndexOf ( "GP-Nr./Az. " ) + 10 ) . Trim ( ) ;
}
var pattern = @"\d{2}\.\d{2}\.\d{4}" ;
MatchCollection matches = Regex . Matches ( zeile , pattern ) ;
if ( matches . Count > 0 )
{
datum = matches [ 0 ] . Value ;
if ( zeile . IndexOf ( datum ) > 0 )
{
name = zeile . Substring ( 0 , zeile . IndexOf ( datum ) ) . Trim ( ) ;
}
}
}
if ( String . IsNullOrEmpty ( aktenzeichen ) )
{
var pattern = @"\d{10}" ;
MatchCollection matches = Regex . Matches ( pdfText , pattern ) ;
if ( matches . Count > 0 )
{
aktenzeichen = matches [ 0 ] . Value ;
}
}
if ( ! String . IsNullOrEmpty ( aktenzeichen ) | | ! String . IsNullOrEmpty ( name ) | | ! String . IsNullOrEmpty ( datum ) )
{
var customerGruppe = new HilfeplanImportItemDC { Label = "Stammdaten" , Items = new List < HilfeplanImportItemDC > ( ) } ;
if ( ! String . IsNullOrEmpty ( name ) )
{
customerGruppe . Items . Add ( new HilfeplanImportItemDC { Label = "Name" , FieldName = "LastnameFirstname" , Content = name } ) ;
}
if ( ! String . IsNullOrEmpty ( datum ) )
{
customerGruppe . Items . Add ( new HilfeplanImportItemDC { Label = "Geburtsdatum" , FieldName = "Birthdate" , Content = datum } ) ;
}
if ( ! String . IsNullOrEmpty ( aktenzeichen ) )
{
customerGruppe . Items . Add ( new HilfeplanImportItemDC { Label = "GP-Nummer/Az" , FieldName = "CustomerReferenceNumber" , Content = aktenzeichen } ) ;
}
return customerGruppe ;
}
return null ;
}
2024-09-01 20:47:02 +02:00
private List < HilfeplanImportItemDC > LeseKlientenStammdaten ( string pdfText )
{
var liste = new List < HilfeplanImportItemDC > ( ) ;
var zeilen = pdfText . Split ( new [ ] { '\r' , '\n' } , StringSplitOptions . RemoveEmptyEntries ) ;
var ta = TextAbschnittReader . LeseBisText ( zeilen , 0 , "BEI_NRW für den Zeitraum vom " , true , false , false ) ;
if ( ta . Success )
{
var idx = ta . ZeilenIndex ;
liste . Add ( ErstelleStammdatenFeld ( "BEI_NRW für den Zeitraum vom" , "ApprovalPeriod" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "GP-Nummer/Az" , "CustomerReferenceNumber" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Name" , "Lastname" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Vorname" , "Firstname" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Titel" , "Titel" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Geburtsdatum" , "Birthdate" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Geschlecht" , "Sex" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Nationalität" , "Nationality" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Beruf" , "Job" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Familienstand" , "FamilyStatus" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Anzahl und Alter der Kinder" , "Children" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "PLZ" , "PostalCode" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Ort" , "Town" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Straße" , "Street" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Telefon" , "Phone" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "Fax" , "Fax" , zeilen , idx , out idx ) ) ;
liste . Add ( ErstelleStammdatenFeld ( "E-Mail" , "EMail" , zeilen , idx , out idx ) ) ;
}
return liste ;
}
private HilfeplanImportItemDC ErstelleStammdatenFeld ( string label , string fieldname , string [ ] zeilen , int startIndex , out int foundIdx )
{
var item = new HilfeplanImportItemDC { Label = label , FieldName = fieldname } ;
var ta = TextAbschnittReader . LeseBisText ( zeilen , startIndex , label , true , false , false ) ;
foundIdx = 0 ;
if ( ta . Success )
{
item . Content = zeilen [ ta . ZeilenIndex ] . Replace ( label , "" ) . Trim ( ) ;
if ( item . Label . Contains ( "_" ) )
{
item . Label = label . Replace ( "_" , "__" ) ;
}
foundIdx = ta . ZeilenIndex ;
}
return item ;
}
2024-06-19 16:13:56 +02:00
}
}