Files
BeWoPlaner/Service/Import/Perseh/PersehReader.cs

495 lines
22 KiB
C#

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>();
//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)" });
//result.Gruppen.Add(gruppe1);
//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)" });
//result.Gruppen.Add(gruppe1);
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" });
using (var processor = new PdfDocumentProcessor())
{
using (var ms = new MemoryStream(daten))
{
processor.LoadDocument(ms);
var pdfText = processor.Text;
var customerGruppe = ErstelleKlientenStammdatenGruppe(pdfText);
if (customerGruppe == null)
{
customerGruppe = ErstelleGruppeMitNamenUndAktenzeichen(pdfText);
}
if (customerGruppe != null)
{
result.Gruppen.Add(customerGruppe);
}
result.Ziele = ErstelleAlleZiele(pdfText);
}
}
//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" });
return result;
}
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;
var zielplanungStart = -1;
StringBuilder gesamtTextMitZielen = new StringBuilder();
for (int i = zeilen.Length - 1; i >= 0; i--)
{
var z = zeilen[i];
if (z == "Zielplanung")
{
zielplanungStart = i;
startIdx = i;
}
if (z.StartsWith("Übersicht der Leistungsplanung "))
{
endIdx = i;
}
}
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;
}
}
}
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;
}
}
}
ErstelleMassnahmen(pdfText, zielplanungStart, ziele);
return ziele;
}
private void ErstelleMassnahmen(string pdfText, int endIndex, List<HilfeplanImportZielDC> ziele)
{
var zeilen = pdfText.ToString().Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var item in ziele)
{
item.Massnahmen = new List<HilfeplanImportZielDC>();
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);
}
return result;
}
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();
ziel.DoImport = true;
ziel.Bereich = bereich;
ziel.ZielName = zeile.Replace("Ziele • ", "").Replace("• ", "").Trim();
ziele.Add(ziel);
}
else if (ziel != null)
{
if (!IgnoriereZeile(zeile))
{
ziel.ZielName += " " + zeile.Trim();
ziel.ZielBeschreibung = "Beschreibung:\n" + zeile;
}
}
}
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;
}
//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;
}
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;
}
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;
}
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;
}
}
}