424 lines
20 KiB
C#
424 lines
20 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|