Files
BeWoPlaner/Service/Import/AvisImport/AviseImporter.cs
2026-04-28 16:42:47 +02:00

256 lines
10 KiB
C#

using BeWo.Data.Access;
using BeWo.Data.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.Import.AvisImport
{
public class AviseImporter
{
public DateTime BuchungsDatum { get; set; } = DateTime.Now.Date;
//Der Rückgabewert wird beim Client in einer Messagebox angezeigt
public virtual String ImportAvise(List<Avis> avise, List<HilfeplanInfo> hilfeplaene)
{
var importresult = ImportAbschlagszahlungen(avise, hilfeplaene);
String importDaten = "1 Datensatz";
String vorhandenDaten = "0 Datensätze waren";
int importiertCount = 0;
int bereitsVorhandenCount = 0;
var irFalseList = new List<AvisImportResult>();
var irDoubleList = new List<AvisImportResult>();
var newEntities = new List<AccountingTransaction>();
foreach (var ir in importresult)
{
switch (ir.ResultState)
{
case ImportResultState.Success:
importiertCount++;
if (ir.NewAbschlagszahlung != null)
{
newEntities.Add(ir.NewAbschlagszahlung);
}
break;
case ImportResultState.Failed:
irFalseList.Add(ir);
break;
case ImportResultState.AlreadyExisting:
irDoubleList.Add(ir);
bereitsVorhandenCount++;
break;
}
}
DAOFactory.GenericDAO.Insert(newEntities);
if (importiertCount != 1)
{
importDaten = String.Format("{0} Datensätze", importiertCount);
}
StringBuilder sb = new StringBuilder();
sb.AppendLine(String.Format("Der Import ist abgeschlossen. Es wurden {0} neu importiert.", importDaten));
if (bereitsVorhandenCount > 0)
{
vorhandenDaten = "1 Datensatz war";
if (bereitsVorhandenCount != 1)
{
vorhandenDaten = String.Format("{0} Datensätze waren", irDoubleList.Count);
}
sb.AppendLine("");
sb.AppendLine(String.Format("{0} bereits vorhanden:", vorhandenDaten));
foreach (var ir in irDoubleList)
{
sb.AppendLine(ir.Message);
}
}
if (irFalseList.Count > 0)
{
String nichtImportiertDaten = "1 Datensatz konnte";
if (irFalseList.Count != 1)
{
nichtImportiertDaten = String.Format("{0} Datensätze konnten", irFalseList.Count);
}
sb.AppendLine("");
sb.AppendLine(String.Format("{0} nicht importiert werden:", nichtImportiertDaten));
foreach (var ir in irFalseList)
{
sb.AppendLine(ir.Message);
}
}
var text = sb.ToString();
if (text.Length > 5700) // Gibt sonst einen Fehler beim Deserialisieren auf dem Client
{
text = text.Substring(0, 5700) + "...";
}
return text;
}
public virtual List<AvisImportResult> ImportAbschlagszahlungen(List<Avis> avise, List<HilfeplanInfo> hilfeplaene)
{
var result = new List<AvisImportResult>();
foreach (var avis in avise)
{
//if (avis.Klient != null && avis.Klient.Contains("Noga"))
//{
//}
var ir = ImportAbschlagszahlung(avis, hilfeplaene);
result.Add(ir);
}
return result;
}
public virtual AvisImportResult ImportAbschlagszahlung(Avis avis, List<HilfeplanInfo> hilfeplaene)
{
var result = new AvisImportResult();
result.ResultState = ImportResultState.Failed;
result.Avis = avis;
var allePassendenHps = new List<HilfeplanInfo>();
HilfeplanInfo passenderHilfeplan = null;
foreach (var hp in hilfeplaene)
{
var r = VergleicheAvisMitHilfeplan(avis, hp);
if (r.ResultState == ImportResultState.Success)
{
allePassendenHps.Add(hp);
}
}
if (allePassendenHps.Count == 0)
{
result.Message = String.Format("GP {0} konnte nicht gefunden werden.", avis.Aktenzeichen);
}
// Gibt es nur einen Hilfeplan überhaupt, dann muss nicht auf vorhandenes Start- und Enddatum geprüft werden, sonst schon
else if (allePassendenHps.Count == 1)
{
result.Message = String.Format("Es wurde kein Hilfeplan mit passendem Zeitraum gefunden.");
DateTime monatStart = new DateTime(avis.GueltigkeitsDatum.Year, avis.GueltigkeitsDatum.Month, 1);
DateTime monatEnde = monatStart.AddMonths(1);
if (allePassendenHps[0].Start < monatEnde && allePassendenHps[0].Ende >= monatStart)
{
passenderHilfeplan = allePassendenHps[0];
result.ResultState = ImportResultState.Success;
result.Message = "";
}
}
else
{
result.Message = String.Format("Es wurde kein Hilfeplan mit passendem Zeitraum gefunden.");
DateTime monatStart = new DateTime(avis.GueltigkeitsDatum.Year, avis.GueltigkeitsDatum.Month, 1);
DateTime monatEnde = monatStart.AddMonths(1);
foreach (var hp in allePassendenHps)
{
// Auf Jahr 1 und 9999 prüfen, weil das bei Plänen ohne Start und Enddatum gesetzt ist. Auf so einen soll NUR gebucht werden, wenn es nur diesen einen gibt
if (hp.Start.Value.Year != 1 && hp.Ende.Value.Year != 9999 && hp.Start < monatEnde && hp.Ende >= monatStart)
{
passenderHilfeplan = hp;
result.ResultState = ImportResultState.Success;
result.Message = "";
}
}
}
if (result.ResultState == ImportResultState.Failed)
{
result.Message = String.Format("{0}, {1}, {2:MMM yyyy}, Grund: {3}", avis.Klient, avis.Aktenzeichen, avis.GueltigkeitsDatum, result.Message);
}
else if (passenderHilfeplan != null)
{
if (!CheckObAbschlagszahlungBereitsImportiert(avis, passenderHilfeplan))
{
result.NewAbschlagszahlung = CreateAbschlagszahlung(avis, passenderHilfeplan);
result.ResultState = ImportResultState.Success;
}
else
{
result.ResultState = ImportResultState.AlreadyExisting;
result.Message = String.Format("{0}, {1}, {2:MMM yyyy}, wurde bereits importiert.", avis.Klient, avis.Aktenzeichen, avis.GueltigkeitsDatum);
}
}
return result;
}
public virtual AvisImportResult VergleicheAvisMitHilfeplan(Avis avis, HilfeplanInfo hp)
{
var result = new AvisImportResult();
result.Avis = avis;
//Prüfe ob Aktenzeichen vorkommt
if (!String.IsNullOrEmpty(hp.Aktenzeichen) && hp.Aktenzeichen.Contains(avis.Aktenzeichen))
{
result.ResultState = ImportResultState.Success;
}
else
{
result.Message = String.Format("Aktenzeichen {0} konnte nicht gefunden werden.", avis.Aktenzeichen);
}
//Prüfe ob Klientname vorkommt
//var nameBuchung = avis.Verwendungszweck.ToLower();
//var nachname = hp.CustomerLastName.ToLower();
//var vorname = hp.CustomerFirstName.ToLower();
//nachname = nachname.Replace("ö", "oe");
//nachname = nachname.Replace("ü", "ue");
//nachname = nachname.Replace("ä", "ae");
//nachname = nachname.Replace("ß", "ss");
//vorname = vorname.Replace("ö", "oe");
//vorname = vorname.Replace("ü", "ue");
//vorname = vorname.Replace("ä", "ae");
//vorname = vorname.Replace("ß", "ss");
//var name = String.Format("{0}{1}", nachname, vorname);
//if (nameBuchung.Contains(name))
//{
// return true;
//}
return result;
}
public virtual AccountingTransaction CreateAbschlagszahlung(Avis avis, HilfeplanInfo hp)
{
var newAz = new AccountingTransaction();
newAz.CostBearer2SupportConcept = hp.CostBearer2SupportConcept;
newAz.Amount = avis.Betrag;
newAz.BookingDate = BuchungsDatum;
newAz.ImportNotice = CreateImportNotice(avis);
newAz.ValidityDate = avis.GueltigkeitsDatum;
newAz.Notice = String.Format("Automatischer Import vom {0:dd.MM.yyyy} für {1}, AZ: {2}", avis.BuchungsDatum, avis.Klient, avis.Aktenzeichen);
return newAz;
}
public virtual String CreateImportNotice(Avis avis)
{
return String.Format("Automatischer Import vom {0:dd.MM.yyyy} für {1}, AZ: {2} über {3:c}", avis.GueltigkeitsDatum, avis.Klient, avis.Aktenzeichen, avis.Betrag);
}
public virtual bool CheckObAbschlagszahlungBereitsImportiert(Avis avis, HilfeplanInfo hp)
{
var azAltList = DAOFactory.SearchDAO.FindAccountingTransactionsWithImportNotice(CreateImportNotice(avis));
return azAltList != null && azAltList.Any();
}
}
}