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

247 lines
12 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)
{
result.Gruppen.Add(customerGruppe);
}
result.Ziele = ErstelleAlleZiele(pdfText);
}
}
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;
StringBuilder gesamtTextMitZielen = new StringBuilder();
for (int i = zeilen.Length - 1; i >= 0; i--)
{
var z = zeilen[i];
if (z == "Zielplanung")
{
startIdx = i;
}
if (z.StartsWith("Übersicht der Leistungsplanung "))
{
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;
}
}
}
return ziele;
}
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.Bereich = bereich;
ziel.ZielName = zeile.Replace("Ziele • ", "").Replace("• ", "").Trim();
ziele.Add(ziel);
}
else if (ziel != null)
{
if (!IgnoriereZeile(zeile))
{
ziel.ZielName += " " + zeile.Trim();
}
}
}
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;
}
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 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;
}
}
}