Files
BeWoPlaner/ReportImp/SHKServiceSBD/Service/CustomVertretungsManager.cs

424 lines
20 KiB
C#
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using BeWo.Service.SBD;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace SHKServiceSBD.Service
{
public class CustomVertretungsManager : VertretungsManager
{
public override List<VertretungsItemDC> CreateVertretungsListe(DateTime start, DateTime end)
{
var vertretungsListe = base.CreateVertretungsListe(start, end);
//Suche vorhandene Vertretungen für die Martinschule (Das sind alle, bei denen die CustomerOid null ist)
var vertretungenMartingSchuleUndOhneBetreuung = DAOFactory.SearchDAO.FindVertretungen(start, end).Where(v => v.VertretenderMitarbeiterOid.HasValue && (v.CustomerOid == null || v.EmployeeOid == null)).ToList();
var vertretungenMartingSchule = vertretungenMartingSchuleUndOhneBetreuung.Where(v => v.CustomerOid == null).ToList();
var vertretungenOhneBetreuung = vertretungenMartingSchuleUndOhneBetreuung.Where(v => v.EmployeeOid == null).ToList();
//Suche Mitarbeiter des Teams Martinschule. Prüfe ob mehr als 80 Prozent anwesend sind, sonst sollen die auch in Vertretungssuche auftauchen.
var team = DAOFactory.GenericDAO.GetAllActive<Team>().Where(t => t.Name == "Martinsschule").FirstOrDefault();
if (team != null)
{
var list = new List<CompactVertreterEmployeeDC>();
var allEmps = team.MemberList;
var abwesendeEmployees = new List<Employee>();
var abwesenheitByEmployee = new Dictionary<long, AbsenceTime>();
foreach (var emp in allEmps)
{
foreach (var at in emp.AbsenceTimes)
{
if (at.Start <= end && (!at.End.HasValue || at.End >= start))
{
if (!abwesenheitByEmployee.ContainsKey(emp.Oid.Value) && (vertretungenMartingSchule.Count(v => v.EmployeeOid.Value == emp.Oid) == 0))
{
abwesendeEmployees.Add(emp);
abwesenheitByEmployee.Add(emp.Oid.Value, at);
}
continue;
}
}
}
double prozent = 1;
if (allEmps.Count > 0 )
{
prozent = (double)(allEmps.Count - abwesendeEmployees.Count) / allEmps.Count;
}
if (prozent < 0.8)
{
//Weniger als 80 Prozent anwesend, daher alle kranken MAs in Vertretungen anzeigen
foreach (var emp in abwesendeEmployees)
{
var employeeDC = MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(emp);
var absenceTimeDC = MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDC(abwesenheitByEmployee[employeeDC.EmployeeOid]);
DateTime dt = start;
while (dt <= end)
{
if (absenceTimeDC.Start <= dt && (!absenceTimeDC.End.HasValue || absenceTimeDC.End >= dt))
{
var newItem = ErstelleMartinschuleVertretungsItem(dt, absenceTimeDC, employeeDC, null);
SetSBDInformation(newItem, null, emp, true);
vertretungsListe.Add(newItem);
}
dt = dt.AddDays(1);
}
}
}
}
foreach (var item in vertretungenMartingSchule)
{
var newItem = ErstelleMartinschuleVertretungsItem(item.VertretungsZeitraumVon, null, null, item);
SetSBDInformation(newItem, null, null, true);
vertretungsListe.Add(newItem);
}
//Suche Kinder ohne Betreuuung
var allCustomer = DAOFactory.GenericDAO.GetAllActive<Customer>();
foreach (var c in allCustomer)
{
if (vertretungsListe.Count(v => v.Customer != null && v.Customer.Oid == c.Oid) == 0)
{
if (c.Employee2CustomerList.Count == 0)
{
bool istInMartinschule = false;
foreach (var t2c in c.Team2CustomerList)
{
if (t2c.Team.Name == "Martinsschule")
{
istInMartinschule = true;
}
}
if (!istInMartinschule)
{
DateTime dt = start;
while (dt <= end)
{
if (vertretungenOhneBetreuung.Count(v => v.CustomerOid == c.Oid) == 0)
{
var newItem = ErstelleMartinschuleVertretungsItem(dt, null, null, null);
newItem.Customer = MapperFactory.CompactCustomerDC_Customer.MapToNewDC(c);
newItem.Employee = new CompactEmployeeDC();
newItem.Employee.LastName = "Ohne Betreuung";
newItem.Absencetime = new AbsenceTimeDC();
newItem.Absencetime.Start = dt;
newItem.Absencetime.End = dt;
SetSBDInformation(newItem, c, null, false);
vertretungsListe.Add(newItem);
}
dt = dt.AddDays(1);
}
}
}
}
}
foreach (var item in vertretungenOhneBetreuung)
{
var newItem = ErstelleMartinschuleVertretungsItem(item.VertretungsZeitraumVon, null, null, item);
Customer c = null;
if (item.CustomerOid.HasValue)
{
c = DAOFactory.GenericDAO.LoadByID<Customer>(item.CustomerOid.Value);
newItem.Customer = MapperFactory.CompactCustomerDC_Customer.MapToNewDC(c);
}
newItem.Employee = new CompactEmployeeDC();
newItem.Employee.LastName = "Ohne Betreuung";
newItem.Absencetime = new AbsenceTimeDC();
newItem.Absencetime.Start = item.VertretungsZeitraumVon;
newItem.Absencetime.End = item.VertretungsZeitraumBis;
SetSBDInformation(newItem, c, null, false);
vertretungsListe.Add(newItem);
}
foreach (var item in vertretungsListe)
{
if (item.Employee == null)
{
item.Employee = new CompactEmployeeDC();
item.Employee.LastName = "Ohne Betreuung";
}
item.CustomerToolTip = null;
item.EmployeeToolTip = null;
item.VertreterToolTip = null;
}
return vertretungsListe;
}
private VertretungsItemDC ErstelleMartinschuleVertretungsItem(DateTime dt, AbsenceTimeDC atDC, CompactEmployeeDC empDC, Vertretung vertretung)
{
var newItem = new VertretungsItemDC
{
Id = Guid.NewGuid(),
Datum = dt,
Absencetime = atDC,
AssistanceTime = new ArbeitszeitEintragDC(),
BetreuungszeitenAmDatum = "",
Employee = empDC,
};
newItem.Customer = new CompactCustomerDC(); // Erstelle Dummy Customer für die Martinschule
newItem.Customer.FirstName = "Martinsschule";
newItem.DringlichkeitColor = "#FF8080";
newItem.Dringlichkeit = "";
if (newItem.Absencetime != null)
{
newItem.VertretungsStatus = VertretungsStatus.MaKrankVertretungBenoetigt;
newItem.Bemerkung = atDC.Notice;
base.AddKrankheitsZeitraumAndMeldungToItem(newItem, newItem.Absencetime);
}
if (vertretung != null)
{
newItem.Vertretung = MapperFactory.VertretungDC_Vertretung.MapToNewDC(vertretung);
if (empDC == null && vertretung.EmployeeOid.HasValue)
{
var emp = DAOFactory.GenericDAO.LoadByID<Employee>(vertretung.EmployeeOid.Value);
foreach (var at in emp.AbsenceTimes)
{
if (at.Start <= vertretung.VertretungsZeitraumVon && (!at.End.HasValue || at.End >= vertretung.VertretungsZeitraumBis))
{
newItem.Absencetime = MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDC(at);
newItem.Bemerkung = at.Notice;
base.AddKrankheitsZeitraumAndMeldungToItem(newItem, newItem.Absencetime);
}
}
newItem.Employee = MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(emp);
}
if (vertretung.VertretenderMitarbeiterOid.HasValue)
{
newItem.Vertreter = MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(DAOFactory.GenericDAO.LoadByID<Employee>(vertretung.VertretenderMitarbeiterOid.Value));
}
newItem.KlientStatusColor = "#7FFF7F"; // Grün;
newItem.VertretungsStatus = VertretungsStatus.MaKrankVertretungVorhanden;
}
//SetSBDInformation(newItem, null, null, )
return newItem;
}
public override List<CompactVertreterEmployeeDC> SucheVertreter(VertreterSucheFilterDC filter)
{
//var vertreterBase = base.SucheVertreter(filter);
var vertretungsListe = CreateVertretungsListe(filter.StartDate, filter.EndDate);
// EmployeeOids der Mitarbeiter, die einen abwesenden Mitarbeiter vertreten
var alleZugewiesenenVertreterEmpOids = vertretungsListe.Where(vertretungsItem => vertretungsItem.VertretungsStatus != VertretungsStatus.KlientKrank &&
vertretungsItem.Vertreter != null &&
vertretungsItem.Vertreter.ActivationType == ActivationTypeId.Active).Select(item => item.Vertreter.EmployeeOid).ToList();
// EmployeeOids von abwesenden Mitarbeitern
var abwesenendeEmployeeOids = vertretungsListe.Where(vertretungsItem => vertretungsItem.VertretungsStatus != VertretungsStatus.KlientKrank &&
vertretungsItem.Employee != null).Select(item => item.Employee.EmployeeOid);
//var employeeOids = vertretungsListe.Where(vertretungsItem => vertretungsItem.Employee != null &&
// vertretungsItem.VertretungsStatus == VertretungsStatus.KlientKrank &&
// !ausgewaehlteVertreter.Contains(vertretungsItem.Employee.EmployeeOid)).Select(s => s.Employee.EmployeeOid);
//employeeOids = employeeOids.Where(e => !abwesenendeEmployeeOids.Contains(e));
var team = DAOFactory.GenericDAO.GetAllActive<Team>().Where(t => t.Name == "Vertretungsplanung").FirstOrDefault();
if (team != null)
{
var list = new List<CompactVertreterEmployeeDC>();
var allEmps = team.MemberList;
var empsInResult = new List<Employee>();
foreach (var emp in allEmps)
{
if (!alleZugewiesenenVertreterEmpOids.Contains(emp.Oid.Value) && !abwesenendeEmployeeOids.Contains(emp.Oid.Value) && !IsAbwesend(emp, filter.StartDate, filter.EndDate))
{
empsInResult.Add(emp);
var dc = MapperFactory.CompactVertreterEmployeeDC_VertreterEmployee.MapToNewDC(emp);
list.Add(dc);
}
}
//Füge alle Employees zu, deren Kind krank sind
var schonVorhandeneEmps = empsInResult.Select(e => e.Oid.Value).ToList();
var employeeOids = vertretungsListe.Where(vertretungsItem => vertretungsItem.Employee != null &&
vertretungsItem.VertretungsStatus == VertretungsStatus.KlientKrank && !schonVorhandeneEmps.Contains(vertretungsItem.Employee.EmployeeOid)).Select(s => s.Employee.EmployeeOid).Distinct().ToList();
if (employeeOids.Count > 0)
{
var weitereEmps = DAOFactory.GenericDAO.LoadByIDs<Employee>(employeeOids);
list.AddRange(MapperFactory.CompactVertreterEmployeeDC_VertreterEmployee.MapToNewDCs(weitereEmps));
}
if (filter.CustomerOid.HasValue && filter.VerwendeEntfernungssuche)
{
GetDistanceForVertreterEmployees(filter.CustomerOid.Value, ref list, empsInResult);
}
return list;
}
return base.SucheVertreter(filter);
}
private bool IsAbwesend(Employee emp, DateTime startDate, DateTime endDate)
{
foreach (var at in emp.AbsenceTimes)
{
if (at.Start <= startDate && (!at.End.HasValue || at.End >= endDate))
{
return true;
}
}
return false;
}
public override void SetMailInfos(VertretungsItemDC vertretungsItem, Customer customer, Employee employee, Employee vertretung, Organisation school)
{
base.SetMailInfos(vertretungsItem, customer, employee, vertretung, school);
if (vertretungsItem.Employee?.LastName == "Müller")
{
}
if (vertretungsItem.MailCustomer != null)
{
vertretungsItem.MailCustomer.Subject = "Vertretungsinformation";
//vertretungsItem.MailCustomer.Message = @"Lieber Klient,%0D%0A%0D%0Ablablubb%0D%0AZeile2%0D%0A%0D%0ANochne Zeile%0D%0A%0D%0ATschüss";
if (vertretung != null)
{
String vertreterName = vertretung.Person.LastName;
if (vertretung.Person.Sex.HasValue && vertretung.Person.Sex.Value == Sex.Male)
{
vertreterName = "Herr " + vertreterName;
}
else
{
vertreterName = "Frau " + vertreterName;
}
vertretungsItem.MailCustomer.Message = String.Format(@"Sehr geehrte Damen und Herren,
die Schulbegleitung für {0} wird vom {1:dd.MM.yyyy} bis voraussichtlich {2:dd.MM.yyyy} {3} übernehmen.
Eventuelle Änderungen oder Vertretungen nach dem Datum Ende teilen wir Ihnen so früh wie möglich mit. Es gilt die jeweils letzte Mail.
Bei Rückfragen erreichen Sie uns an jedem Unterrichtstag von 6:30 Uhr bis 10:00 Uhr unter 015116889795", customer != null ? customer.Person.FirstName : "", vertretungsItem.Absencetime != null ? vertretungsItem.Absencetime.Start : null, vertretungsItem.Absencetime != null ? vertretungsItem.Absencetime.End : null, vertreterName);
vertretungsItem.MailCustomer.Message = vertretungsItem.MailCustomer.Message.Replace(Environment.NewLine, "%0D%0A");
}
}
if (vertretungsItem.MailEmployee != null)
{
vertretungsItem.MailEmployee.Subject = "Vertretungsinformation";
//vertretungsItem.MailEmployee.Message = @"Lieber MA,%0D%0A%0D%0Ablablubb%0D%0AZeile2%0D%0A%0D%0ANochne Zeile%0D%0A%0D%0ATschüss";
}
if (vertretungsItem.MailVertretung != null)
{
vertretungsItem.MailVertretung.Subject = "Vertretungsinformation";
//vertretungsItem.MailVertretung.Message = @"Lieber Vertreter,%0D%0A%0D%0Ablablubb%0D%0AZeile2%0D%0A%0D%0ANochne Zeile%0D%0A%0D%0ATschüss";
}
if (vertretungsItem.MailSchule != null)
{
vertretungsItem.MailSchule.Subject = "Vertretungsinformation";
if (vertretung != null)
{
String vertreterName = vertretung.Person.LastName;
if (vertretung.Person.Sex.HasValue && vertretung.Person.Sex.Value == Sex.Male)
{
vertreterName = "Herr " + vertreterName;
}
else
{
vertreterName = "Frau " + vertreterName;
}
vertretungsItem.MailSchule.Message = String.Format(@"Sehr geehrte Damen und Herren,
die Schulbegleitung für {0} wird vom {1:dd.MM.yyyy} bis voraussichtlich {2:dd.MM.yyyy} {3} übernehmen.
Eventuelle Änderungen oder Vertretungen nach dem Datum Ende teilen wir Ihnen so früh wie möglich mit. Es gilt die jeweils letzte Mail.
Bei Rückfragen erreichen Sie uns an jedem Unterrichtstag von 6:30 Uhr bis 10:00 Uhr unter 015116889795", customer != null ? customer.Person.FirstNameLastName : "", vertretungsItem.Absencetime != null ? vertretungsItem.Absencetime.Start : null, vertretungsItem.Absencetime != null ? vertretungsItem.Absencetime.End : null, vertreterName);
}
else
{
vertretungsItem.MailSchule.Message = String.Format(@"Sehr geehrte Damen und Herren,
leider haben wir aktuell für {0} am {1:dd.MM.yyyy} keine freie Vertretungskraft. 
Eventuelle Änderungen oder Vertretungen nach dem {1:dd.MM.yyyy} teilen wir Ihnen so früh wie möglich mit. Es gilt die jeweils letzte Mail.
Bei Rückfragen erreichen Sie uns an jedem Unterrichtstag von 6:30 Uhr bis 10:00 Uhr unter: 015116889795", customer != null ? customer.Person.FirstNameLastName : "", vertretungsItem.Datum);
}
vertretungsItem.MailSchule.Message = vertretungsItem.MailSchule.Message.Replace(Environment.NewLine, "%0D%0A");
}
}
public override void SetSubstitutionColor(VertretungsItemDC vertretungsItem)
{
base.SetSubstitutionColor(vertretungsItem);
if (vertretungsItem.VertretungsStatus == VertretungsStatus.MaKrankVertretungBenoetigt)
{
vertretungsItem.KlientStatusColor = "#FF8080"; // Rot
}
}
public override void GetVertretungsstatus(VertretungsItemDC vertretungsItem, DateTime dateTime, DateTime absenceTimeStartDate, Customer customer)
{
base.GetVertretungsstatus(vertretungsItem, dateTime, absenceTimeStartDate, customer);
if (customer.SubstitutionNeed == SubstitutionNeed.SubstitutionNeeded)
{
vertretungsItem.DringlichkeitColor = "#FF8080"; // rot
}
}
public override void SaveVertretung(VertretungDC vertretung)
{
if (vertretung.CustomerOid == 0) // Martinschule
{
vertretung.CustomerOid = null;
}
if (vertretung.EmployeeOid == 0) // Kinder ohne Betreuung
{
vertretung.EmployeeOid = null;
}
base.SaveVertretung(vertretung);
}
}
}