2018-05-21 16:58:56 +02:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
2019-08-08 14:47:53 +02:00
2018-05-21 16:58:56 +02:00
using BeWo.Data.Access ;
using BeWo.Data.Entities ;
using BeWo.Service.DCEntityMapper ;
2023-06-07 09:45:20 +02:00
using BeWo.Service.ServiceUtils.DistanceCalculator ;
2018-05-21 16:58:56 +02:00
using BS.Shared ;
2019-09-27 15:55:01 +02:00
using BS.Shared.Core ;
2018-05-21 16:58:56 +02:00
using BS.Shared.DataContracts ;
using BS.Shared.DataContracts.Compact ;
2019-08-16 18:03:30 +02:00
using BS.Shared.Extensions ;
2020-04-15 18:22:10 +02:00
using DevExpress.XtraRichEdit.Commands ;
2020-02-05 16:42:47 +01:00
using Employee = BeWo . Data . Entities . Employee ;
2018-05-21 16:58:56 +02:00
namespace BeWo.Service.SBD
{
2023-06-07 09:45:20 +02:00
public class VertretungsManager
2018-05-21 16:58:56 +02:00
{
2023-08-23 23:15:58 +02:00
private static List < ContactDC > LoadContactInformationForEntity < T > ( Person p ) where T : BeWoEntityBase
2019-09-27 15:55:01 +02:00
{
2023-08-23 23:15:58 +02:00
return MapperFactory . ContactDC_Contact . MapToNewDCs ( p . Contacts ) ;
2019-09-02 15:48:37 +02:00
}
2023-06-07 09:45:20 +02:00
public virtual List < CompactVertreterEmployeeDC > SucheVertreter ( VertreterSucheFilterDC filter )
{
var vertretungsListe = CreateVertretungsListe ( filter . StartDate , filter . EndDate ) ;
// EmployeeOids der Mitarbeiter, die einen abwesenden Mitarbeiter vertreten
var ausgewaehlteVertreter = vertretungsListe . Where ( vertretungsItem = > vertretungsItem . VertretungsStatus ! = VertretungsStatus . KlientKrank & &
vertretungsItem . Vertreter ! = null & &
vertretungsItem . Vertreter . ActivationType = = ActivationTypeId . Active ) . Select ( item = > item . Vertreter . EmployeeOid ) ;
// EmployeeOids der Betreuer abwesender Klienten, die nicht schon einen anderen Klienten vertreten
var employeeOids = vertretungsListe . Where ( vertretungsItem = > vertretungsItem . Employee ! = null & &
vertretungsItem . VertretungsStatus = = VertretungsStatus . KlientKrank & &
! ausgewaehlteVertreter . Contains ( vertretungsItem . Employee . EmployeeOid ) ) . Select ( s = > s . Employee . EmployeeOid ) ;
// EmployeeOids von abwesenden Mitarbeitern
var abwesenendeEmployeeOids = vertretungsListe . Where ( vertretungsItem = > vertretungsItem . VertretungsStatus ! = VertretungsStatus . KlientKrank & &
vertretungsItem . Employee ! = null ) . Select ( item = > item . Employee . EmployeeOid ) ;
employeeOids = employeeOids . Where ( e = > ! abwesenendeEmployeeOids . Contains ( e ) ) ;
var allEmps = DAOFactory . GenericDAO . GetActiveByIDs < Employee > ( employeeOids ) . ToList ( ) ;
var list = MapperFactory . CompactVertreterEmployeeDC_VertreterEmployee . MapToNewDCs ( allEmps ) ;
//Setze Betreuungszeiten
foreach ( var vertreter in list )
{
foreach ( var item in vertretungsListe )
{
if ( item . Employee ! = null & & item . Employee . EmployeeOid = = vertreter . EmployeeOid )
{
//if (vertreter.Arbeitszeit == null)
//{
// vertreter.Arbeitszeit = new List<ArbeitszeitDC>();
//}
//if (vertreter.Arbeitszeit.Count == 0)
//{
// vertreter.Arbeitszeit.Add(new ArbeitszeitDC
// {
// Eintraege = new List<ArbeitszeitEintragDC>()
// });
//}
//vertreter.Arbeitszeit[0].Eintraege.AddRange(item.Arbeitszeiten);
vertreter . Arbeitszeit = new List < ArbeitszeitDC > ( ) ;
vertreter . Arbeitszeit . Add (
new ArbeitszeitDC
{
Eintraege = item . Arbeitszeiten . ToList ( )
} ) ;
}
}
}
if ( filter . CustomerOid . HasValue & & filter . VerwendeEntfernungssuche )
{
GetDistanceForVertreterEmployees ( filter . CustomerOid . Value , ref list , allEmps ) ;
}
return list ;
}
public virtual List < VertretungsItemDC > CreateSubstitutions ( DateTime start , DateTime end )
2018-05-21 16:58:56 +02:00
{
2019-12-07 21:06:03 +01:00
var vertretungsItems = new List < VertretungsItemDC > ( ) ;
2018-05-21 16:58:56 +02:00
2018-10-08 11:57:16 +02:00
end = end . Date . AddDays ( 1 ) . AddTicks ( - 1 ) ;
2020-04-15 18:22:10 +02:00
var vertretungen = DAOFactory . SearchDAO . FindVertretungen ( start , end ) . Where ( v = > v . VertretenderMitarbeiterOid . HasValue ) . ToList ( ) ;
2019-08-08 14:47:53 +02:00
var absenceTimes = DAOFactory . SearchDAO . FindAbsenceTimes ( start , end ) . ToList ( ) ;
2018-05-21 16:58:56 +02:00
2019-12-07 21:06:03 +01:00
var employeeAbsenceTimes = absenceTimes . Where ( absenceTime = > absenceTime . EmployeeOid . HasValue ) . ToList ( ) ;
var customerAbsenceTimes = absenceTimes . Where ( absenceTime = > absenceTime . CustomerOid . HasValue ) . ToList ( ) ;
2024-02-19 14:15:43 +01:00
var customerOids = vertretungen . Where ( w = > w . CustomerOid . HasValue & & w . CustomerOid > 0 ) . Select ( s = > s . CustomerOid . Value ) . ToList ( ) ;
2019-09-02 15:48:37 +02:00
customerOids . AddRangeIfElementsNotIn ( absenceTimes . Where ( w = > w . CustomerOid . HasValue ) . Select ( s = > s . CustomerOid . Value ) . ToList ( ) ) ;
var customers = DAOFactory . GenericDAO . LoadByIDs < Customer > ( customerOids ) ;
var customerContactInformation = new Dictionary < long , List < ContactDC > > ( ) ;
2019-12-07 21:06:03 +01:00
var employees = DAOFactory . GenericDAO . LoadByIDs < Employee > ( employeeAbsenceTimes . Select ( absenceTime = > absenceTime . EmployeeOid . Value ) ) ;
2019-09-27 15:55:01 +02:00
2019-12-07 21:06:03 +01:00
var employeeVertretungsItems = new List < VertretungsItemDC > ( ) ;
var customerVertretungsItems = new List < VertretungsItemDC > ( ) ;
var employeeVertretungsItemsGuids2Ignore = new List < Guid > ( ) ;
2019-09-27 15:55:01 +02:00
2019-09-02 15:48:37 +02:00
foreach ( var customer in customers )
{
var contacts = MapperFactory . ContactDC_Contact . MapToNewDCs ( customer . Person . Contacts ) ;
2019-12-07 21:06:03 +01:00
if ( customer . Oid ! = null )
2019-09-02 15:48:37 +02:00
{
customerContactInformation . AddOrUpdateValueInDictionary ( customer . Oid . Value , contacts ) ;
}
}
2019-12-07 21:06:03 +01:00
// Mitarbeiterabwesenheiten
foreach ( var absenceTime in employeeAbsenceTimes )
2018-05-21 16:58:56 +02:00
{
2019-12-07 21:06:03 +01:00
var employee = employees . FirstOrDefault ( emp = > emp . Oid . HasValue & & emp . Oid . Value . Equals ( absenceTime . EmployeeOid ) ) ;
if ( employee = = null )
2018-05-21 16:58:56 +02:00
{
2019-12-07 21:06:03 +01:00
continue ;
}
2024-10-08 19:30:58 +02:00
2024-03-18 00:16:56 +01:00
List < VertretungsItemDC > items = CreateVertretungsItemsForAbsenceEmployee ( employee , vertretungen , absenceTime , start , end ) ;
employeeVertretungsItems . AddRange ( items ) ;
}
2019-12-11 16:43:07 +01:00
2024-03-20 17:32:19 +01:00
if ( start . Date = = end . Date ) // Nur in Tagesansicht erst mal
2024-03-18 00:16:56 +01:00
{
2024-03-20 17:32:19 +01:00
// Vertretungen deren Klient wiederrum vertreten werden muss
foreach ( var vertretung in vertretungen )
2019-12-07 21:06:03 +01:00
{
2024-03-20 17:32:19 +01:00
if ( vertretung . VertretenderMitarbeiterOid . HasValue )
2019-09-27 15:55:01 +02:00
{
2024-03-20 17:32:19 +01:00
if ( employeeAbsenceTimes . Count ( ea = > ea . EmployeeOid . HasValue & & ea . EmployeeOid . Value = = vertretung . VertretenderMitarbeiterOid . Value ) = = 0 )
{
var employee = DAOFactory . GenericDAO . LoadByID < Employee > ( vertretung . VertretenderMitarbeiterOid . Value ) ;
2018-10-08 11:57:16 +02:00
2024-03-20 17:32:19 +01:00
List < VertretungsItemDC > items = CreateVertretungsItemsForAbsenceEmployee ( employee , vertretungen , null , start , end ) ;
employeeVertretungsItems . AddRange ( items ) ;
}
2018-10-08 11:57:16 +02:00
}
2024-03-18 00:16:56 +01:00
2024-03-20 17:32:19 +01:00
}
2018-05-21 16:58:56 +02:00
}
2019-12-03 13:00:04 +01:00
2019-12-07 21:06:03 +01:00
// Klientenabwesenheiten
foreach ( var absenceTime in customerAbsenceTimes )
2018-05-21 16:58:56 +02:00
{
2019-12-07 21:06:03 +01:00
var customer = customers . FirstOrDefault ( first = > first . Oid . HasValue & & first . Oid . Equals ( absenceTime . CustomerOid ) ) ? ? DAOFactory . GenericDAO . LoadByID < Customer > ( absenceTime . CustomerOid . Value ) ;
2024-02-01 01:06:46 +01:00
2024-10-08 19:30:58 +02:00
if ( customer . Person . LastName . Contains ( "Platz" ) )
2024-02-01 01:06:46 +01:00
{
}
2019-12-07 21:06:03 +01:00
var absenceTimeDC = MapperFactory . AbsenceTimeDC_AbsenceTime . MapToNewDC ( absenceTime ) ;
var customerDC = MapperFactory . CompactCustomerDC_Customer . MapToNewDC ( customer ) ;
2023-08-23 23:15:58 +02:00
var customerContactInformationList = LoadContactInformationForEntity < Customer > ( customer . Person ) ;
var schools = MapperFactory . CustomerOrganisationRelationDC_Customer2Organisation . MapToNewDCs ( customer . Customer2OrganisationList . Where ( customer2Organisation = > customer2Organisation . ValueList . Any ( b = > b . Entry . Type = = ValueListEntryType . EnvironmentOrganisationType & & IstSchule ( b . Entry . Value ) ) ) ) ;
2020-02-05 16:42:47 +01:00
var schoolAssistanceTimes = GetSchoolAssistanceTimes ( customer , start , end , absenceTime ) ;
2024-02-20 12:36:59 +01:00
var hauptbetreuer = customer . Employee2CustomerList . FirstOrDefault ( e2c = > e2c . IsActive = = ActivationTypeId . Active & &
( ! e2c . StartDate . HasValue | | e2c . StartDate . Value . Date < = end . Date ) & & ( ! e2c . EndDate . HasValue | | e2c . EndDate . Value . Date > = start . Date ) & &
e2c . ValueList . Any ( b = > b . Entry . Type . Equals ( ValueListEntryType . StaffRoleType ) & & b . Entry . Value . ToLower ( ) . Equals ( "hauptbetreuung" ) ) ) ? . Employee ;
2022-05-12 12:08:52 +02:00
if ( hauptbetreuer = = null )
{
2024-02-20 12:36:59 +01:00
//hauptbetreuer = customer.Employee2CustomerList.FirstOrDefault()?.Employee;
2022-05-12 12:08:52 +02:00
}
2019-12-07 21:06:03 +01:00
MigriereSubstitutionStatus ( customer ) ;
2018-10-08 11:57:16 +02:00
2020-02-05 16:42:47 +01:00
var assistingEmployees = new List < Employee > ( ) ;
2020-03-03 09:27:02 +01:00
customer . Arbeitszeiten . DoForEach ( a = > assistingEmployees . AddRangeIfElementsNotIn ( a . ArbeitszeitEintraege . Where ( ae = > ae . Employee ! = null ) . Select ( s = > s . Employee ) ) ) ;
2020-02-05 16:42:47 +01:00
schoolAssistanceTimes . DoForEach ( a = >
{
foreach ( var assistanceTimeEntry in a . ArbeitszeitEintraege )
{
if ( assistanceTimeEntry . Employee ! = null & & assistanceTimeEntry . Employee . IsActive ! = ActivationTypeId . Active )
{
continue ;
}
if ( assistanceTimeEntry . Employee = = null )
{
if ( hauptbetreuer ! = null )
{
assistingEmployees . AddIfNotIn ( hauptbetreuer ) ;
}
}
else
{
assistingEmployees . AddIfNotIn ( assistanceTimeEntry . Employee ) ;
}
}
} ) ;
2024-02-20 12:36:59 +01:00
var hasCaregiver = customer . Employee2CustomerList . Any ( e2c = >
( ! e2c . StartDate . HasValue | | e2c . StartDate . Value . Date < = end . Date ) & & ( ! e2c . EndDate . HasValue | | e2c . EndDate . Value . Date > = start . Date ) & &
e2c . ValueList . Any ( b = > b . Entry . Type . Equals ( ValueListEntryType . StaffRoleType ) & & ! b . Entry . Value . ToLower ( ) . Equals ( "ehemalige betreuung" ) ) ) | | assistingEmployees . Any ( ) ;
2019-12-07 21:06:03 +01:00
if ( hasCaregiver )
{
2020-02-05 16:42:47 +01:00
var relatedEmployees = new List < Employee > ( assistingEmployees ) ;
relatedEmployees . AddRangeIfElementsNotIn (
customer . Employee2CustomerList
. Where (
2024-02-20 12:36:59 +01:00
e2c = > e2c . Employee . IsActive = = ActivationTypeId . Active & &
( ! e2c . StartDate . HasValue | | e2c . StartDate . Value . Date < = end . Date ) & & ( ! e2c . EndDate . HasValue | | e2c . EndDate . Value . Date > = start . Date ) & &
! e2c . ValueList . Any (
2020-02-05 16:42:47 +01:00
w = > w . Entry . Type . Equals ( ValueListEntryType . StaffRoleType ) & &
! w . Entry . Value . ToLower ( ) . Equals ( "ehemalige betreuung" ) ) )
. Select ( s = > s . Employee ) ) ;
foreach ( var employee in relatedEmployees )
2019-08-08 14:47:53 +02:00
{
2019-12-07 21:06:03 +01:00
var employeeDC = MapperFactory . CompactEmployeeDC_Employee . MapToNewDC ( employee ) ;
2023-08-23 23:15:58 +02:00
var employeeAddressString = GetEmployeeAddressInfo ( employee ) ;
var employeeContactInformationList = LoadContactInformationForEntity < Employee > ( employee . Person ) ;
2019-09-27 15:55:01 +02:00
2019-12-07 21:06:03 +01:00
var assistanceTimeEntries = GetAssistanceTimesForCustomer ( customer , employee , absenceTime , start , end ) ;
2019-09-02 15:48:37 +02:00
2020-02-05 16:42:47 +01:00
var dateTime = start ;
while ( dateTime < = end )
2019-12-07 21:06:03 +01:00
{
2020-02-05 16:42:47 +01:00
if ( LiegtImZeitraum ( dateTime , absenceTime ) )
2019-09-27 15:55:01 +02:00
{
2020-02-05 16:42:47 +01:00
var dateTimeCopy = dateTime ;
var relevantAssistanceTimeEntries = assistanceTimeEntries . Where ( entry = > IsAbsenceTimeInAssistanceTime ( dateTime , entry , absenceTime ) & & ( entry . Employee ! = null & & entry . Employee . Equals ( employee ) | | entry . Employee = = null & & employee . Equals ( hauptbetreuer ) ) ) . ToList ( ) ;
var vertretungsObjekte = vertretungen . Where ( w = > w . EmployeeOid . HasValue & & w . EmployeeOid . Equals ( employee . Oid ) & & w . CustomerOid . HasValue & & w . CustomerOid . Equals ( customer . Oid ) & & w . VertretungsZeitraumVon . Date < = dateTimeCopy & & w . VertretungsZeitraumBis . Date > = dateTimeCopy ) . ToList ( ) ;
var lastSubstitutions = DAOFactory . SearchDAO . GetLastSubstitutionItems ( employee . Oid . Value , 3 ) ;
var lastSubstitutionDCs = MapperFactory . VertretungDC_Vertretung . MapToNewDCs ( lastSubstitutions ) ;
var assistanceTimeEntryDCs = MapperFactory . ArbeitszeitEintragDC_ArbeitszeitEintrag . MapToNewDCs ( relevantAssistanceTimeEntries ) ;
2020-04-08 14:25:01 +02:00
2020-02-05 16:42:47 +01:00
foreach ( var assistanceTimeEntry in relevantAssistanceTimeEntries )
{
var assistanceTimeEntryDC = MapperFactory . ArbeitszeitEintragDC_ArbeitszeitEintrag . MapToNewDC ( assistanceTimeEntry ) ;
2019-12-07 21:06:03 +01:00
var newVertretungsItem = new VertretungsItemDC
{
Id = Guid . NewGuid ( ) ,
Datum = dateTime ,
Absencetime = absenceTimeDC ,
Arbeitszeiten = assistanceTimeEntryDCs ,
Employee = employeeDC ,
EmployeeAddressString = employeeAddressString ,
LastSubstitutions = lastSubstitutionDCs ,
Customer = customerDC ,
CustomerContactInformation = customerContactInformationList ,
EmployeeContactInformation = employeeContactInformationList ,
Schools = schools ,
VertretungsStatus = VertretungsStatus . KlientKrank ,
2020-02-05 16:42:47 +01:00
Bemerkung = absenceTime . Notice ,
2023-10-29 21:33:19 +01:00
AssistanceTime = assistanceTimeEntryDC ,
BetreuungszeitenAmDatum = assistanceTimeEntryDC ! = null ? assistanceTimeEntryDC . ToString ( ) : String . Empty ,
AlleBetreuungszeiten = GetBetreuungszeitenString ( assistanceTimeEntries )
2019-12-07 21:06:03 +01:00
} ;
AddKrankheitsZeitraumAndMeldungToItem ( newVertretungsItem , newVertretungsItem . Absencetime ) ;
var vertretung = vertretungsObjekte . FirstOrDefault ( ) ;
2024-02-19 14:15:43 +01:00
Employee substitutionEmployee = null ;
2019-12-07 21:06:03 +01:00
2024-02-19 14:15:43 +01:00
if ( vertretung ? . VertretenderMitarbeiterOid ! = null )
2019-12-07 21:06:03 +01:00
{
2020-02-05 16:42:47 +01:00
if ( GetIsSubstitutedCompletely ( relevantAssistanceTimeEntries , vertretung , dateTime ) )
2019-12-07 21:06:03 +01:00
{
2024-02-19 14:15:43 +01:00
substitutionEmployee = DAOFactory . GenericDAO . LoadByID < Employee > ( vertretung . VertretenderMitarbeiterOid . Value ) ;
2019-12-07 21:06:03 +01:00
var substitutionEmployeeDC = MapperFactory . CompactEmployeeDC_Employee . MapToNewDC ( substitutionEmployee ) ;
2019-09-27 15:55:01 +02:00
2019-12-07 21:06:03 +01:00
newVertretungsItem . Vertreter = substitutionEmployeeDC ;
2019-09-27 15:55:01 +02:00
2023-08-23 23:15:58 +02:00
newVertretungsItem . VertreterInfoString = GetEmployeeAddressInfo ( substitutionEmployee ) ;
2019-09-27 15:55:01 +02:00
2019-12-07 21:06:03 +01:00
newVertretungsItem . Vertretung = MapperFactory . VertretungDC_Vertretung . MapToNewDC ( vertretung ) ;
newVertretungsItem . Bemerkung = vertretung . Notice ;
2019-09-27 15:55:01 +02:00
2019-12-07 21:06:03 +01:00
newVertretungsItem . VertretungsStatus = VertretungsStatus . MaKrankVertretungVorhanden ;
}
}
2019-08-16 18:03:30 +02:00
2020-04-08 14:25:01 +02:00
// TODO: Hat die vertretungsItemListe Objekte mit dem Klienten im selben Zeitfenster?
2024-02-01 01:06:46 +01:00
foreach ( var employeeVertretungsItem in employeeVertretungsItems . Where ( w = > w . Customer . Equals ( customerDC ) & & w . Employee ! = null & & w . Employee . EmployeeOid = = employeeDC . EmployeeOid ) )
2020-04-08 14:25:01 +02:00
{
if ( employeeVertretungsItem . Datum = = dateTime )
{
if ( IsAbsenceTimeInAssistanceTime ( dateTime , employeeVertretungsItem . AssistanceTime , absenceTime ) )
{
employeeVertretungsItemsGuids2Ignore . AddIfNotIn ( employeeVertretungsItem . Id ) ;
2020-04-15 18:22:10 +02:00
if ( newVertretungsItem . VertretungsStatus = = VertretungsStatus . KlientKrank )
{
newVertretungsItem . VertretungsStatus = VertretungsStatus . KlientUndMitarbeiterKrank ;
}
else
{
newVertretungsItem . VertretungsStatus =
VertretungsStatus . MaKrankKeineVertretungBenoetigt ;
}
2020-04-08 14:25:01 +02:00
}
}
}
2024-10-08 19:30:58 +02:00
//prüfe auch noch, ob zugeordneter Employee krank ist
if ( newVertretungsItem . VertretungsStatus = = VertretungsStatus . KlientKrank )
{
if ( newVertretungsItem . Employee ! = null )
{
if ( employeeAbsenceTimes . Any ( a = > a . EmployeeOid = = newVertretungsItem . Employee . EmployeeOid ) )
{
newVertretungsItem . VertretungsStatus = VertretungsStatus . KlientUndMitarbeiterKrank ;
}
}
//newVertretungsItem.VertretungsStatus = VertretungsStatus.KlientUndMitarbeiterKrank;
}
2019-12-07 21:06:03 +01:00
SetSubstitutionColor ( newVertretungsItem ) ;
2019-08-16 18:03:30 +02:00
2024-02-19 14:15:43 +01:00
Organisation schule = null ;
var c2o = customer . Customer2OrganisationList . Where ( customer2Organisation = > customer2Organisation . ValueList . Any ( b = > b . Entry . Type = = ValueListEntryType . EnvironmentOrganisationType & & IstSchule ( b . Entry . Value ) ) ) . FirstOrDefault ( ) ;
if ( c2o ! = null )
{
schule = c2o . Organisation ;
}
SetMailInfos ( newVertretungsItem , customer , employee , substitutionEmployee , schule ) ;
2020-04-08 14:25:01 +02:00
2019-12-07 21:06:03 +01:00
SetSBDInformation ( newVertretungsItem , customer , employee , false ) ;
2019-12-03 13:00:04 +01:00
2019-12-07 21:06:03 +01:00
SetTeamleitung ( employee , newVertretungsItem ) ;
2019-12-03 13:00:04 +01:00
2019-12-07 21:06:03 +01:00
customerVertretungsItems . Add ( newVertretungsItem ) ;
}
2019-12-03 13:00:04 +01:00
}
2020-02-05 16:42:47 +01:00
dateTime = dateTime . AddDays ( 1 ) ;
2019-12-03 13:00:04 +01:00
}
}
2019-12-07 21:06:03 +01:00
}
2019-12-19 14:27:03 +01:00
else // Kein Betreuer, also auch keine Vertretungen, sondern nur Abwesenheiten
2019-12-07 21:06:03 +01:00
{
var assistanceTimeEntries = GetAssistanceTimesForCustomer ( customer , null , absenceTime , start , end ) ;
2019-12-03 13:00:04 +01:00
2019-12-07 21:06:03 +01:00
var dateTime = start ;
while ( dateTime < = end )
2018-05-21 16:58:56 +02:00
{
2019-12-07 21:06:03 +01:00
if ( LiegtImZeitraum ( dateTime , absenceTime ) )
2018-05-21 16:58:56 +02:00
{
2019-12-07 21:06:03 +01:00
var relevantAssistanceTimeEntries = assistanceTimeEntries . Where ( entry = > IsAbsenceTimeInAssistanceTime ( dateTime , entry , absenceTime ) ) . ToList ( ) ;
var assistanceTimeEntryDCs = MapperFactory . ArbeitszeitEintragDC_ArbeitszeitEintrag . MapToNewDCs ( relevantAssistanceTimeEntries ) ;
var newVertretungsItem = new VertretungsItemDC
2018-05-21 16:58:56 +02:00
{
2019-12-07 21:06:03 +01:00
Id = Guid . NewGuid ( ) ,
Datum = dateTime ,
Absencetime = absenceTimeDC ,
Arbeitszeiten = assistanceTimeEntryDCs ,
Customer = customerDC ,
CustomerContactInformation = customerContactInformationList ,
Schools = schools ,
2020-10-01 10:32:31 +02:00
VertretungsStatus = VertretungsStatus . KlientUndMitarbeiterKrank ,
2019-12-07 21:06:03 +01:00
Bemerkung = absenceTime . Notice
} ;
2018-10-08 11:57:16 +02:00
2019-12-07 21:06:03 +01:00
SetzeSchule ( newVertretungsItem , customer ) ;
2019-09-27 15:55:01 +02:00
2019-12-07 21:06:03 +01:00
AddKrankheitsZeitraumAndMeldungToItem ( newVertretungsItem , absenceTimeDC ) ;
2019-09-27 15:55:01 +02:00
2019-12-07 21:06:03 +01:00
SetSubstitutionColor ( newVertretungsItem ) ;
2018-10-08 11:57:16 +02:00
2019-12-07 21:06:03 +01:00
SetSBDInformation ( newVertretungsItem , customer , null , false ) ;
customerVertretungsItems . Add ( newVertretungsItem ) ;
2018-05-21 16:58:56 +02:00
}
2019-12-07 21:06:03 +01:00
dateTime = dateTime . AddDays ( 1 ) ;
2018-05-21 16:58:56 +02:00
}
2019-12-07 21:06:03 +01:00
}
}
2020-02-05 16:42:47 +01:00
2019-12-07 21:06:03 +01:00
vertretungsItems . AddRange ( employeeVertretungsItems . Where ( vertretungsItem = > ! employeeVertretungsItemsGuids2Ignore . Contains ( vertretungsItem . Id ) ) ) ;
2020-04-15 18:22:10 +02:00
//prüfen, ob Mitarbeiter bereits als Vertretung eingesetzt ist:
2020-10-01 10:32:31 +02:00
//customerVertretungsItems = customerVertretungsItems.Where(c => c.Employee != null && c.Equals( !employeeVertretungsItems.Where(ei => ei.Vertreter != null).Select(ei2 => ei2.Vertreter.EmployeeOid).Contains(c.Employee.EmployeeOid))).ToList();
var newList = new List < VertretungsItemDC > ( ) ;
foreach ( var ci in customerVertretungsItems )
{
if ( ci . Employee = = null )
{
newList . Add ( ci ) ;
}
else
{
bool istAlsVertreterEingesetzt = false ;
foreach ( var ei in employeeVertretungsItems )
{
if ( ei . Vertreter ! = null & & ei . Vertreter . EmployeeOid = = ci . Employee . EmployeeOid )
{
istAlsVertreterEingesetzt = true ;
}
}
if ( ! istAlsVertreterEingesetzt )
{
newList . Add ( ci ) ;
}
}
}
//customerVertretungsItems = customerVertretungsItems.Where(c => c.Employee == null || !employeeVertretungsItems.Where(ei => ei.Vertreter != null).Select(ei2 => ei2.Vertreter.EmployeeOid).Contains(c.Employee.EmployeeOid)).ToList();
customerVertretungsItems = newList ;
2019-12-07 21:06:03 +01:00
vertretungsItems . AddRange ( customerVertretungsItems ) ;
SetSubstitutingEmployee2CustomersRelation ( vertretungsItems ) ;
2018-05-21 16:58:56 +02:00
2020-10-01 10:32:31 +02:00
vertretungsItems = RemoveDuplicates ( vertretungsItems ) ;
2019-12-07 21:06:03 +01:00
return vertretungsItems ;
}
2019-09-02 15:48:37 +02:00
2024-03-18 00:16:56 +01:00
//Erstellt Vertretungsitems für abwesenden MA oder MA, der als Vertreter bei einem anderen Klienten eingesetzt ist, so dass sein eigener Klient betreut werden muss
public virtual List < VertretungsItemDC > CreateVertretungsItemsForAbsenceEmployee ( Employee employee , List < Vertretung > vorhandeneVertretungen , AbsenceTime absenceTime , DateTime start , DateTime end )
{
var result = new List < VertretungsItemDC > ( ) ;
var employeeDC = MapperFactory . CompactEmployeeDC_Employee . MapToNewDC ( employee ) ;
var employeeAddressString = GetEmployeeAddressInfo ( employee ) ;
var employeeContactInformationList = LoadContactInformationForEntity < Employee > ( employee . Person ) ;
AbsenceTimeDC absenceTimeDC = null ;
if ( absenceTime ! = null )
{
absenceTimeDC = MapperFactory . AbsenceTimeDC_AbsenceTime . MapToNewDC ( absenceTime ) ;
}
2024-04-21 22:40:53 +02:00
//if (employee.Person.LastNameFirstName.Contains("Platzhalter"))
//{
// int test = 0;
//}
2024-03-18 00:16:56 +01:00
foreach ( var employee2Customer in employee . Employee2CustomerList . Where ( e2C = > e2C . IsActive = = ActivationTypeId . Active & & ( ! e2C . StartDate . HasValue | | e2C . StartDate . Value . Date < = end . Date ) & & ( ! e2C . EndDate . HasValue | | e2C . EndDate . Value . Date > = start . Date ) ) )
{
foreach ( var valueListEntry2Object in employee2Customer . ValueList . Where ( entry2Object = > entry2Object . Entry . Type = = ValueListEntryType . StaffRoleType ) )
{
var customer = employee2Customer . Customer ;
var customerDC = MapperFactory . CompactCustomerDC_Customer . MapToNewDC ( customer ) ;
var customerContactInformationList = LoadContactInformationForEntity < Customer > ( customer . Person ) ;
var c2oList = customer . Customer2OrganisationList . Where ( customer2Organisation = > customer2Organisation . ValueList . Any ( b = > b . Entry . Type = = ValueListEntryType . EnvironmentOrganisationType & & IstSchule ( b . Entry . Value ) ) ) . ToList ( ) ;
var schools = MapperFactory . CustomerOrganisationRelationDC_Customer2Organisation . MapToNewDCs ( c2oList ) ;
Organisation schule = null ;
if ( c2oList . Count > 0 )
{
schule = c2oList [ 0 ] . Organisation ;
}
var assistanceTimeEntries = GetAssistanceTimesForCustomer ( customer , employee , absenceTime , start , end ) ;
var dateTime = start ;
while ( dateTime < = end )
{
if ( absenceTime = = null | | LiegtImZeitraum ( dateTime , absenceTime ) )
{
var dateTimeCopy = dateTime ;
var relevantAssistanceTimeEntries = assistanceTimeEntries . Where ( entry = > IsAbsenceTimeInAssistanceTime ( dateTimeCopy , entry , absenceTime ) ) ;
foreach ( var assistanceTimeEntry in relevantAssistanceTimeEntries )
{
var vertretungsObjekte = vorhandeneVertretungen . Where ( w = > w . EmployeeOid . HasValue & & w . EmployeeOid . Equals ( employee . Oid ) & & w . CustomerOid . HasValue & & w . CustomerOid . Equals ( customer . Oid ) & & w . VertretungsZeitraumVon . Date < = dateTimeCopy & & w . VertretungsZeitraumBis . Date > = dateTimeCopy ) ;
var lastSubstitutions = DAOFactory . SearchDAO . GetLastSubstitutionItems ( employee . Oid . Value , 3 ) ;
var lastSubstitutionDCs = MapperFactory . VertretungDC_Vertretung . MapToNewDCs ( lastSubstitutions ) ;
var assistanceTimeEntryDC = MapperFactory . ArbeitszeitEintragDC_ArbeitszeitEintrag . MapToNewDC ( assistanceTimeEntry ) ;
var newVertretungsItem = new VertretungsItemDC
{
Id = Guid . NewGuid ( ) ,
Datum = dateTime ,
Absencetime = absenceTimeDC ,
AssistanceTime = assistanceTimeEntryDC ,
BetreuungszeitenAmDatum = assistanceTimeEntryDC ! = null ? assistanceTimeEntryDC . ToString ( ) : String . Empty ,
AlleBetreuungszeiten = GetBetreuungszeitenString ( assistanceTimeEntries ) ,
Employee = employeeDC ,
EmployeeAddressString = employeeAddressString ,
LastSubstitutions = lastSubstitutionDCs ,
Customer = customerDC ,
CustomerContactInformation = customerContactInformationList ,
EmployeeContactInformation = employeeContactInformationList ,
Schools = schools ,
Bemerkung = absenceTime ? . Notice
} ;
if ( newVertretungsItem . Absencetime ! = null )
{
AddKrankheitsZeitraumAndMeldungToItem ( newVertretungsItem , newVertretungsItem . Absencetime ) ;
}
DateTime absenceTimeStartDate = newVertretungsItem . Datum ;
if ( absenceTime ! = null )
{
absenceTimeStartDate = absenceTime . Start . Value ;
}
GetVertretungsstatus ( newVertretungsItem , dateTime , absenceTimeStartDate , customer ) ;
if ( absenceTime = = null & & newVertretungsItem . VertretungsStatus = = VertretungsStatus . MaKrankKeineVertretungBenoetigt )
{
newVertretungsItem . VertretungsStatus = VertretungsStatus . MaKrankVertretungBenoetigt ;
}
//Es kann in Ausnahmen mehrere Vertretungen für den gleichen erkrankten MA geben. Z.B. wenn die erste Vertretung selber erkrankt und eine zweite ausgewählt wird.
Vertretung vertretung = null ;
Employee vertreter = null ;
foreach ( var vo in vertretungsObjekte )
{
if ( vo . VertretenderMitarbeiterOid . HasValue )
{
vertreter = DAOFactory . GenericDAO . LoadByID < Employee > ( vo . VertretenderMitarbeiterOid . Value ) ;
if ( ! IstAbwesend ( vertreter . AbsenceTimes , dateTime ) )
{
vertretung = vo ;
}
}
}
if ( vertretung ? . VertretenderMitarbeiterOid ! = null )
{
if ( GetIsSubstitutedCompletely ( new List < ArbeitszeitEintrag > { assistanceTimeEntry } , vertretung , dateTime ) )
{
if ( vertreter = = null )
{
vertreter = DAOFactory . GenericDAO . LoadByID < Employee > ( vertretung . VertretenderMitarbeiterOid . Value ) ;
}
var substitutionEmployeeDC = MapperFactory . CompactEmployeeDC_Employee . MapToNewDC ( vertreter ) ;
newVertretungsItem . Vertreter = substitutionEmployeeDC ;
newVertretungsItem . VertreterInfoString = GetEmployeeAddressInfo ( vertreter ) ;
newVertretungsItem . Vertretung = MapperFactory . VertretungDC_Vertretung . MapToNewDC ( vertretung ) ;
newVertretungsItem . Bemerkung = vertretung . Notice ;
newVertretungsItem . VertretungsStatus = VertretungsStatus . MaKrankVertretungVorhanden ;
//if (IstAbwesend(vertreter.AbsenceTimes, dateTime))
//{
// newVertretungsItem.VertretungsStatus = VertretungsStatus.MaKrankVertretungBenoetigt;
// newVertretungsItem.Vertreter = null;
// newVertretungsItem.VertreterInfoString = null;
// newVertretungsItem.Vertretung = null;
//}
}
}
SetSubstitutionColor ( newVertretungsItem ) ;
SetSBDInformation ( newVertretungsItem , customer , employee , true ) ;
SetMailInfos ( newVertretungsItem , customer , employee , vertreter , schule ) ;
SetTeamleitung ( employee , newVertretungsItem ) ;
2024-03-20 17:32:19 +01:00
if ( newVertretungsItem . Absencetime = = null )
{
newVertretungsItem . Absencetime = new AbsenceTimeDC ( ) ;
}
2024-03-18 00:16:56 +01:00
result . Add ( newVertretungsItem ) ;
}
}
dateTime = dateTime . AddDays ( 1 ) ;
}
}
}
return result ;
}
2024-02-19 14:15:43 +01:00
private bool IstAbwesend ( IList < AbsenceTime > absenceTimes , DateTime datum )
{
foreach ( var at in absenceTimes )
{
if ( ( ! at . Start . HasValue | | at . Start . Value . Date < = datum ) & & ( ! at . End . HasValue | | at . End . Value . Date > = datum ) )
{
return true ;
}
}
return false ;
}
2020-10-01 10:32:31 +02:00
private List < VertretungsItemDC > RemoveDuplicates ( List < VertretungsItemDC > vertretungsItems )
{
var newList = new List < VertretungsItemDC > ( ) ;
var keyDict = new Dictionary < string , bool > ( ) ;
foreach ( var ci in vertretungsItems )
{
if ( ci . Customer ! = null & & ci . Employee ! = null & & ci . Absencetime ! = null & &
( ci . VertretungsStatus = = VertretungsStatus . KlientUndMitarbeiterKrank | |
ci . VertretungsStatus = = VertretungsStatus . MaKrankKeineVertretungBenoetigt | |
ci . VertretungsStatus = = VertretungsStatus . MaKrankVertretungVorhanden ) )
{
String key = "" ;
if ( ci . Vertretung ! = null & &
ci . Vertretung . VertretungsZeitraumVon . Hour = = 0 & &
ci . Vertretung . VertretungsZeitraumVon . Minute = = 0 & &
ci . Vertretung . VertretungsZeitraumBis . Hour = = 23 & &
ci . Vertretung . VertretungsZeitraumBis . Minute = = 59 )
{
ci . Vertretung . VertretungsZeitraumBis = ci . Vertretung . VertretungsZeitraumBis . Date ;
key = String . Format ( "{0}_{1}_{2:dd.MM.yyyy HH:mm} - {3:dd.MM.yyyy HH:mm}_{4}" , ci . Customer . Oid , ci . Employee . EmployeeOid , ci . Vertretung . VertretungsZeitraumVon , ci . Vertretung . VertretungsZeitraumBis , ci . Absencetime . AbsenceTimeOid ) ;
}
else
{
if ( ci . Vertretung = = null )
{
key = String . Format ( "{0}_{1}_{2}" , ci . Customer . Oid , ci . Employee . EmployeeOid , ci . Absencetime . AbsenceTimeOid ) ;
}
}
if ( String . IsNullOrEmpty ( key ) | | ! keyDict . ContainsKey ( key ) )
{
newList . Add ( ci ) ;
if ( ! String . IsNullOrEmpty ( key ) )
{
keyDict . Add ( key , true ) ;
}
}
else
{
int test = 0 ;
}
}
else
{
newList . Add ( ci ) ;
}
}
return newList ;
}
2023-06-07 09:45:20 +02:00
public virtual List < VertretungsItemDC > CreateVertretungsListe ( DateTime start , DateTime end )
2019-12-07 21:06:03 +01:00
{
return CreateSubstitutions ( start , end ) ;
}
2019-09-02 15:48:37 +02:00
2019-12-07 21:06:03 +01:00
private static void SetSubstitutingEmployee2CustomersRelation ( IEnumerable < VertretungsItemDC > vertretungsItems )
{
var vertreterZuKlient = new Dictionary < string , CompactCustomerDC > ( ) ;
foreach ( var item in vertretungsItems )
{
//Suche alle Vertreter für Klienten und merke diese
if ( item . VertretungsStatus ! = VertretungsStatus . KlientKrank )
{
if ( item . Vertreter ! = null & & item . Customer ! = null )
2018-10-08 11:57:16 +02:00
{
2019-12-07 21:06:03 +01:00
var key = $"{item.Vertreter.EmployeeOid}_{item.Datum:dd.MM.yyyy}" ;
2018-05-21 16:58:56 +02:00
2019-12-07 21:06:03 +01:00
if ( ! vertreterZuKlient . ContainsKey ( key ) )
2018-10-08 11:57:16 +02:00
{
2019-12-07 21:06:03 +01:00
vertreterZuKlient . Add ( key , item . Customer ) ;
2018-10-08 11:57:16 +02:00
}
}
2019-12-07 21:06:03 +01:00
}
2018-10-08 11:57:16 +02:00
2019-12-07 21:06:03 +01:00
if ( item . MitarbeiterEinsatzBei = = "???" & & item . Employee ! = null )
{
item . MitarbeiterEinsatzBei = "" ;
2018-10-08 11:57:16 +02:00
2019-12-07 21:06:03 +01:00
var key = $"{item.Employee.EmployeeOid}_{item.Datum:dd.MM.yyyy}" ;
2018-10-08 11:57:16 +02:00
2019-12-07 21:06:03 +01:00
if ( vertreterZuKlient . ContainsKey ( key ) )
2018-10-08 11:57:16 +02:00
{
2019-12-07 21:06:03 +01:00
item . MitarbeiterEinsatzBei = $"{vertreterZuKlient[key].LastNameFirstName}" ;
2018-10-08 11:57:16 +02:00
}
2019-12-07 21:06:03 +01:00
}
}
}
2019-08-08 14:47:53 +02:00
2023-10-26 00:06:56 +02:00
2023-06-07 09:45:20 +02:00
public virtual void SetSBDInformation ( VertretungsItemDC vertretungsItem , Customer customer , Employee employee , bool isEmployeeAbsenceTime )
2019-12-07 21:06:03 +01:00
{
2023-10-26 00:06:56 +02:00
if ( customer ! = null )
{
vertretungsItem . CustomerPflege = customer . Pflege ? "Ja" : "Nein" ;
vertretungsItem . CustomerToilettengang = customer . Toilettengang ? "Ja" : "Nein" ;
vertretungsItem . CustomerAggressivitaet = customer . Aggressiv ? "Ja" : "Nein" ;
vertretungsItem . CustomerHygienebelehrung = customer . Hygienebelehrung ? "Ja" : "Nein" ;
vertretungsItem . CustomerSchutzstufe = customer . Schutzstufe ;
}
2019-12-07 21:06:03 +01:00
vertretungsItem . EmployeePflege = employee = = null ? "Nein" : employee . Pflege ? "Ja" : "Nein" ;
vertretungsItem . EmployeeToilettengang = employee = = null ? "Nein" : employee . Toilettengang ? "Ja" : "Nein" ;
vertretungsItem . EmployeeAggressivitaet = employee = = null ? "Nein" : employee . Aggressiv ? "Ja" : "Nein" ;
vertretungsItem . EmployeeHygienebelehrung = employee = = null ? "Nein" : employee . Hygienebelehrung ? "Ja" : "Nein" ;
vertretungsItem . EmployeeSchutzstufe = employee ? . Schutzstufe ;
if ( isEmployeeAbsenceTime )
{
2023-10-26 00:06:56 +02:00
if ( customer ! = null )
2019-12-07 21:06:03 +01:00
{
2023-10-26 00:06:56 +02:00
vertretungsItem . Pflege = customer . Pflege ? "Ja" : "Nein" ;
vertretungsItem . Toilettengang = customer . Toilettengang ? "Ja" : "Nein" ;
vertretungsItem . Aggressiv = customer . Aggressiv ? "Ja" : "Nein" ;
if ( customer . Person . Sex . HasValue )
{
vertretungsItem . Geschlecht = Utils . GetSexAbbrevation ( customer . Person . Sex ) ;
}
2018-05-21 16:58:56 +02:00
}
2019-12-07 21:06:03 +01:00
}
else
{
vertretungsItem . Pflege = employee = = null ? "Nein" : employee . Pflege ? "Ja" : "Nein" ;
vertretungsItem . Toilettengang = employee = = null ? "Nein" : employee . Toilettengang ? "Ja" : "Nein" ;
vertretungsItem . Aggressiv = employee = = null ? "Nein" : employee . Aggressiv ? "Ja" : "Nein" ;
2018-05-21 16:58:56 +02:00
2019-12-07 21:06:03 +01:00
if ( employee ? . Person . Sex ! = null )
{
vertretungsItem . Geschlecht = Utils . GetSexAbbrevation ( employee . Person . Sex ) ;
}
vertretungsItem . MitarbeiterEinsatzBei = "???" ;
2018-05-21 16:58:56 +02:00
}
2023-04-20 00:53:02 +02:00
2023-05-02 14:24:26 +02:00
var customerToolTip = new StringBuilder ( ) ;
var employeeToolTip = new StringBuilder ( ) ;
var vertreterToolTip = new StringBuilder ( ) ;
String customerName = "" ;
String employeeName = "" ;
String vertreterName = "" ;
if ( vertretungsItem . Customer ! = null )
{
customerName = String . Format ( "{0} {1}" , vertretungsItem . Customer . FirstName , vertretungsItem . Customer . LastName ) ;
}
if ( vertretungsItem . Employee ! = null )
{
employeeName = String . Format ( "{0} {1}" , vertretungsItem . Employee . FirstName , vertretungsItem . Employee . LastName ) ;
}
if ( vertretungsItem . Vertreter ! = null )
{
vertreterName = String . Format ( "{0} {1}" , vertretungsItem . Vertreter . FirstName , vertretungsItem . Vertreter . LastName ) ;
}
String schoolString = "" ;
if ( vertretungsItem . Schools ! = null )
{
foreach ( var item in vertretungsItem . Schools )
{
if ( schoolString . Length > 0 )
{
schoolString + = ", " ;
}
schoolString + = item . Organisation . Name ;
2023-08-23 23:15:58 +02:00
if ( ! String . IsNullOrEmpty ( item . Organisation . Street ) )
{
schoolString + = "<LineBreak/>" ;
schoolString + = item . Organisation . Street ;
}
if ( ! String . IsNullOrEmpty ( item . Organisation . PostalCode ) | | ! String . IsNullOrEmpty ( item . Organisation . Town ) )
{
schoolString + = "<LineBreak/>" ;
schoolString + = String . Format ( "{0} {1}" , item . Organisation . PostalCode , item . Organisation . Town ) ;
}
if ( ! String . IsNullOrEmpty ( item . Customer2OrganisationNotice ) )
{
schoolString + = "<LineBreak/>" ;
if ( ! item . Customer2OrganisationNotice . Contains ( "Klasse" ) )
{
schoolString + = "Klasse " ;
}
schoolString + = item . Customer2OrganisationNotice ;
}
2023-05-02 14:24:26 +02:00
}
}
customerToolTip . AppendLine ( "<StackPanel xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" ) ;
employeeToolTip . AppendLine ( "<StackPanel xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" ) ;
vertreterToolTip . AppendLine ( "<StackPanel xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" ) ;
//Customer Tooltip
if ( ! String . IsNullOrEmpty ( customerName ) )
{
customerToolTip . AppendLine ( String . Format ( "<TextBlock FontWeight='Bold' Text='{0}' />" , customerName ) ) ;
}
2023-08-23 23:15:58 +02:00
if ( vertretungsItem . Customer ! = null )
2023-05-02 14:24:26 +02:00
{
2023-08-23 23:15:58 +02:00
customerToolTip . AppendLine ( String . Format ( "<TextBlock Text='{0}' />" , vertretungsItem . Customer . AddressString ) ) ;
2023-05-02 14:24:26 +02:00
}
String contactString = "" ;
if ( vertretungsItem . EmployeeContactInformation ! = null & & vertretungsItem . EmployeeContactInformation . Count > 0 )
{
foreach ( var item in vertretungsItem . EmployeeContactInformation )
{
if ( contactString . Length > 0 )
{
contactString + = "<LineBreak/>" ;
}
var typeAsString = string . Empty ;
switch ( item . ContactType )
{
case ContactType . business_Mail :
typeAsString = "E-Mail: " ;
break ;
case ContactType . business_Fax :
typeAsString = "Fax: " ;
break ;
case ContactType . business_Phone :
typeAsString = "Tel.: " ;
break ;
case ContactType . business_MobilePhone :
typeAsString = "Handynr.: " ;
break ;
}
contactString + = typeAsString + item . ContactValue ;
}
}
if ( ! String . IsNullOrEmpty ( contactString ) )
{
customerToolTip . AppendLine ( String . Format ( "<Separator />" ) ) ;
customerToolTip . AppendLine ( String . Format ( "<TextBlock FontWeight='Bold' Text='Kontakt:' /> " ) ) ;
customerToolTip . AppendLine ( String . Format ( "<TextBlock>{0}</TextBlock>" , contactString ) ) ;
}
2023-08-23 23:15:58 +02:00
if ( ! String . IsNullOrEmpty ( schoolString ) )
{
customerToolTip . AppendLine ( String . Format ( "<Separator />" ) ) ;
customerToolTip . AppendLine ( String . Format ( "<TextBlock FontWeight='Bold' Text='Schule:' /> " ) ) ;
customerToolTip . AppendLine ( String . Format ( "<TextBlock>{0}</TextBlock>" , schoolString ) ) ;
}
2023-10-29 21:33:19 +01:00
String alleBetreuungszeiten = vertretungsItem . AlleBetreuungszeiten ;
if ( ! String . IsNullOrEmpty ( alleBetreuungszeiten ) )
{
alleBetreuungszeiten = alleBetreuungszeiten . Replace ( "\n" , "<LineBreak/>" ) ;
customerToolTip . AppendLine ( String . Format ( "<Separator />" ) ) ;
customerToolTip . AppendLine ( String . Format ( "<TextBlock FontWeight='Bold' Text='Betreuungszeiten:' /> " ) ) ;
customerToolTip . AppendLine ( String . Format ( "<TextBlock>{0}</TextBlock>" , alleBetreuungszeiten ) ) ;
}
2023-05-02 14:24:26 +02:00
var lastSubstitutions = string . Empty ;
2023-08-01 16:03:19 +02:00
if ( vertretungsItem . LastSubstitutions ! = null )
2023-05-02 14:24:26 +02:00
{
2023-08-01 16:03:19 +02:00
foreach ( var item in vertretungsItem . LastSubstitutions )
2023-05-02 14:24:26 +02:00
{
2023-08-01 16:03:19 +02:00
if ( lastSubstitutions . Length > 0 )
{
lastSubstitutions + = "<LineBreak/>" ;
}
2023-05-02 14:24:26 +02:00
2023-08-01 16:03:19 +02:00
var start = item . VertretungsZeitraumVon . Minute = = 0 & & item . VertretungsZeitraumVon . Hour = = 0 ? item . VertretungsZeitraumVon . ToString ( "dd.MM.yyyy" ) : item . VertretungsZeitraumVon . ToString ( "dd.MM.yyyy HH:mm" ) ;
var end = item . VertretungsZeitraumBis . Minute = = 0 & & item . VertretungsZeitraumBis . Hour = = 0 ? item . VertretungsZeitraumBis . ToString ( "dd.MM.yyyy" ) : item . VertretungsZeitraumBis . ToString ( "dd.MM.yyyy HH:mm" ) ;
2023-05-02 14:24:26 +02:00
2023-08-01 16:03:19 +02:00
lastSubstitutions + = $"{start} - {end}" ;
}
2023-05-02 14:24:26 +02:00
}
if ( ! String . IsNullOrEmpty ( lastSubstitutions ) )
{
customerToolTip . AppendLine ( String . Format ( "<Separator />" ) ) ;
customerToolTip . AppendLine ( String . Format ( "<TextBlock FontWeight='Bold' Text='Letzte Vertretungen:' /> " ) ) ;
customerToolTip . AppendLine ( String . Format ( "<TextBlock>{0}</TextBlock>" , lastSubstitutions ) ) ;
}
var sbdStatus = string . Empty ;
//if (vertretungsItem.Absencetime != null)
//{
2023-10-26 00:06:56 +02:00
if ( customer ! = null )
2023-05-02 14:24:26 +02:00
{
2023-10-26 00:06:56 +02:00
if ( customer . Pflege )
2023-05-02 14:24:26 +02:00
{
2023-10-26 00:06:56 +02:00
sbdStatus + = "Benötigt Pflege" ;
2023-05-02 14:24:26 +02:00
}
2023-10-26 00:06:56 +02:00
if ( customer . Toilettengang )
2023-05-02 14:24:26 +02:00
{
2023-10-26 00:06:56 +02:00
if ( sbdStatus . Length > 0 )
{
sbdStatus + = ", " ;
}
2023-05-02 14:24:26 +02:00
2023-10-26 00:06:56 +02:00
sbdStatus + = "Toilettengang" ;
}
2023-05-02 14:24:26 +02:00
2023-10-26 00:06:56 +02:00
if ( customer . Aggressiv )
2023-05-02 14:24:26 +02:00
{
2023-10-26 00:06:56 +02:00
if ( sbdStatus . Length > 0 )
{
sbdStatus + = ", " ;
}
2023-05-02 14:24:26 +02:00
2023-10-26 00:06:56 +02:00
sbdStatus + = "Aggressivität" ;
}
2023-05-02 14:24:26 +02:00
2023-10-26 00:06:56 +02:00
if ( customer . Hygienebelehrung )
2023-05-02 14:24:26 +02:00
{
2023-10-26 00:06:56 +02:00
if ( sbdStatus . Length > 0 )
{
sbdStatus + = ", " ;
}
2023-05-02 14:24:26 +02:00
2023-10-26 00:06:56 +02:00
sbdStatus + = "Hygienebelehrung" ;
}
2023-05-02 14:24:26 +02:00
2023-10-26 00:06:56 +02:00
if ( ! String . IsNullOrWhiteSpace ( customer . Schutzstufe ) )
2023-05-02 14:24:26 +02:00
{
2023-10-26 00:06:56 +02:00
if ( sbdStatus . Length > 0 )
{
sbdStatus + = ", " ;
}
2023-05-02 14:24:26 +02:00
2023-10-26 00:06:56 +02:00
sbdStatus + = $"Schutzstufe {customer.Schutzstufe}" ;
}
2023-05-02 14:24:26 +02:00
2023-10-26 00:06:56 +02:00
// Vertretung gewünscht [ab x. Tag]
if ( customer . SubstitutionNeed = = SubstitutionNeed . SubstitutionWanted )
2023-05-02 14:24:26 +02:00
{
2023-10-26 00:06:56 +02:00
if ( sbdStatus . Length > 0 )
{
sbdStatus + = "<LineBreak/>" ;
}
sbdStatus + = "Vertretung gewünscht" ;
if ( customer . AbWelchemKrankheitsTag > 0 )
{
sbdStatus + = $" ab {customer.AbWelchemKrankheitsTag}. Tag" ;
}
2023-05-02 14:24:26 +02:00
}
}
if ( ! String . IsNullOrEmpty ( sbdStatus ) )
{
customerToolTip . AppendLine ( String . Format ( "<Separator />" ) ) ;
2023-08-23 23:15:58 +02:00
customerToolTip . AppendLine ( String . Format ( "<TextBlock FontWeight='Bold' Text='Weitere Informationen:' /> " ) ) ;
2023-05-02 14:24:26 +02:00
customerToolTip . AppendLine ( String . Format ( "<TextBlock>{0}</TextBlock>" , sbdStatus ) ) ;
}
//}
//else
//{
// if (EmployeePflege?.Equals("Ja") ?? false)
// {
// result += "Benötigt Pflege";
// }
// if (EmployeeToilettengang?.Equals("Ja") ?? false)
// {
// if (result.Length > 0)
// {
// result += ", ";
// }
// result += "Toilettengang";
// }
// if (EmployeeAggressivitaet?.Equals("Ja") ?? false)
// {
// if (result.Length > 0)
// {
// result += ", ";
// }
// result += "Aggressivität";
// }
// if (EmployeeHygienebelehrung?.Equals("Ja") ?? false)
// {
// if (result.Length > 0)
// {
// result += ", ";
// }
// result += "Hygienebelehrung";
// }
// if (string.IsNullOrWhiteSpace(EmployeeSchutzstufe) == false)
// {
// if (result.Length > 0)
// {
// result += ", ";
// }
// result += $"Schutzstufe {EmployeeSchutzstufe}";
// }
////}
2023-08-23 23:15:58 +02:00
2023-05-02 14:24:26 +02:00
// <Separator Visibility="{Binding Path=Row.SchulbegleitenderDienstString, Converter={StaticResource StringLengthVisibilityConverter}}" />
// <TextBlock FontWeight="Bold" Text="Schulbegleitender Dienst:" Visibility="{Binding Path=Row.SchulbegleitenderDienstString, Converter={StaticResource StringLengthVisibilityConverter}}" />
// <TextBlock Text="{Binding Row.SchulbegleitenderDienstString}" Visibility="{Binding Path=Text, Converter={StaticResource StringLengthVisibilityConverter}, RelativeSource={RelativeSource Self}}" />
// <Separator Visibility="{Binding Row.EmployeeAddressString, Converter={StaticResource StringLengthVisibilityConverter}}" />
// <TextBlock FontWeight="Bold" Text="{markup:Translate Mitarbeiter/in:}" Visibility="{Binding Row.EmployeeAddressString, Converter={StaticResource StringLengthVisibilityConverter}}" />
// <TextBlock Text="{Binding Row.EmployeeAddressString}" Visibility="{Binding Path=Text, Converter={StaticResource StringLengthVisibilityConverter}, RelativeSource={RelativeSource Self}}" />
//</StackPanel>
//Employee Tooltip
if ( ! String . IsNullOrEmpty ( employeeName ) )
{
employeeToolTip . AppendLine ( String . Format ( "<TextBlock FontWeight='Bold' Text='{0}' />" , employeeName ) ) ;
}
//if (!String.IsNullOrEmpty(schoolString))
//{
// employeeToolTip.AppendLine(String.Format("<Separator />"));
// employeeToolTip.AppendLine(String.Format("<TextBlock FontWeight='Bold' Text='Schule:' /> "));
// employeeToolTip.AppendLine(String.Format("<TextBlock Text='{0}' />", schoolString));
//}
2023-04-20 00:53:02 +02:00
if ( vertretungsItem . Employee ! = null )
{
2023-05-02 14:24:26 +02:00
employeeToolTip . AppendLine ( String . Format ( "<Separator />" ) ) ;
employeeToolTip . AppendLine ( String . Format ( "<TextBlock FontWeight='Bold' Text='Wohnort:' /> " ) ) ;
employeeToolTip . AppendLine ( String . Format ( "<TextBlock Text='{0}' />" , vertretungsItem . Employee . DetailDescription ) ) ;
}
//Vertreter Tooltip
if ( ! String . IsNullOrEmpty ( vertreterName ) )
{
vertreterToolTip . AppendLine ( String . Format ( "<TextBlock FontWeight='Bold' Text='{0}' />" , vertreterName ) ) ;
}
//if (!String.IsNullOrEmpty(schoolString))
//{
// vertreterToolTip.AppendLine(String.Format("<Separator />"));
// vertreterToolTip.AppendLine(String.Format("<TextBlock FontWeight='Bold' Text='Schule:' /> "));
// vertreterToolTip.AppendLine(String.Format("<TextBlock Text='{0}' />", schoolString));
//}
if ( vertretungsItem . Vertreter ! = null )
{
vertreterToolTip . AppendLine ( String . Format ( "<Separator />" ) ) ;
vertreterToolTip . AppendLine ( String . Format ( "<TextBlock FontWeight='Bold' Text='Wohnort:' /> " ) ) ;
vertreterToolTip . AppendLine ( String . Format ( "<TextBlock Text='{0}' />" , vertretungsItem . Vertreter . DetailDescription ) ) ;
2023-04-20 00:53:02 +02:00
}
2023-05-02 14:24:26 +02:00
customerToolTip . AppendLine ( "</StackPanel>" ) ;
employeeToolTip . AppendLine ( "</StackPanel>" ) ;
vertreterToolTip . AppendLine ( "</StackPanel>" ) ;
// < TextBlock FontWeight='Bold' Text='{0}'/>
// <Separator />
// <TextBlock Text='{1}'/>
// </StackPanel>", text1, text2); //.Replace("'", "\"");
// //tt = @"<TextBlock FontWeight='Bold' Text='TESTSETSETESSETSET'/>";
vertretungsItem . CustomerToolTip = customerToolTip . ToString ( ) ;
vertretungsItem . EmployeeToolTip = employeeToolTip . ToString ( ) ;
vertretungsItem . VertreterToolTip = vertreterToolTip . ToString ( ) ;
//< Separator Visibility = "{Binding Path=Row.SchoolString, Converter={StaticResource StringLengthVisibilityConverter}}" />
2023-04-20 00:53:02 +02:00
//< TextBlock FontWeight = "Bold" Text = "Schule1:" Visibility = "{Binding Path=Row.SchoolString, Converter={StaticResource StringLengthVisibilityConverter}}" />
//< TextBlock Text = "{Binding Row.SchoolString}" Visibility = "{Binding Path=Text, Converter={StaticResource StringLengthVisibilityConverter}, RelativeSource={RelativeSource Self}}" />
//< Separator Visibility = "{Binding Path=Row.Customer.AddressString, Converter={StaticResource StringLengthVisibilityConverter}}" />
//< TextBlock FontWeight = "Bold" Text = "Wohnort:" Visibility = "{Binding Path=Row.Customer.AddressString, Converter={StaticResource StringLengthVisibilityConverter}}" />
//< TextBlock Text = "{Binding Row.Customer.AddressString}" />
//< Separator Visibility = "{Binding Path=Row.CustomerContactInformationString, Converter={StaticResource StringLengthVisibilityConverter}}" />
//< TextBlock FontWeight = "Bold" Text = "Kontakt:" Visibility = "{Binding Path=Row.CustomerContactInformationString, Converter={StaticResource StringLengthVisibilityConverter}}" />
//< TextBlock Text = "{Binding Row.CustomerContactInformationString}" Visibility = "{Binding Path=Text, Converter={StaticResource StringLengthVisibilityConverter}, RelativeSource={RelativeSource Self}}" />
//< Separator Visibility = "{Binding Path=Row.SchulbegleitenderDienstString, Converter={StaticResource StringLengthVisibilityConverter}}" />
//< TextBlock FontWeight = "Bold" Text = "Schulbegleitender Dienst:" Visibility = "{Binding Path=Row.SchulbegleitenderDienstString, Converter={StaticResource StringLengthVisibilityConverter}}" />
//< TextBlock Text = "{Binding Row.SchulbegleitenderDienstString}" Visibility = "{Binding Path=Text, Converter={StaticResource StringLengthVisibilityConverter}, RelativeSource={RelativeSource Self}}" />
2019-12-07 21:06:03 +01:00
}
2018-05-21 16:58:56 +02:00
2023-10-29 21:33:19 +01:00
private string GetBetreuungszeitenString ( List < ArbeitszeitEintrag > assistanceTimeEntries )
{
Dictionary < AppointmentDayOfWeek , String > tag2Eintrag = new Dictionary < AppointmentDayOfWeek , String > ( ) ;
foreach ( var item in assistanceTimeEntries )
{
if ( ! tag2Eintrag . ContainsKey ( item . Tag ) )
{
tag2Eintrag . Add ( item . Tag , String . Format ( "{0}: {1}-{2}" , item . Tag . ToString ( ) . Substring ( 0 , 2 ) , item . UhrzeitVon , item . UhrzeitBis ) ) ;
}
else
{
tag2Eintrag [ item . Tag ] + = String . Format ( ", {0}-{1}" , item . UhrzeitVon , item . UhrzeitBis ) ;
}
}
String str = "" ;
foreach ( var item in assistanceTimeEntries )
{
if ( tag2Eintrag . ContainsKey ( item . Tag ) )
{
if ( str . Length > 0 )
{
str + = "\n" ;
}
str + = tag2Eintrag [ item . Tag ] ;
tag2Eintrag . Remove ( item . Tag ) ;
}
}
return str ;
}
2023-10-26 00:06:56 +02:00
public virtual void SetMailInfos ( VertretungsItemDC vertretungsItem , Customer customer , Employee employee , Employee vertretung , Organisation school )
{
if ( customer ! = null )
{
foreach ( var c in customer . Person . Contacts )
{
if ( c . Type = = ContactType . private_Mail | | c . Type = = ContactType . business_Mail )
{
vertretungsItem . MailCustomer = new MailDC ( ) ;
vertretungsItem . MailCustomer . Receiver = c . Value ;
}
}
}
if ( employee ! = null )
{
foreach ( var c in employee . Person . Contacts )
{
if ( c . Type = = ContactType . private_Mail | | c . Type = = ContactType . business_Mail )
{
vertretungsItem . MailEmployee = new MailDC ( ) ;
vertretungsItem . MailEmployee . Receiver = c . Value ;
}
}
}
if ( vertretung ! = null )
{
foreach ( var c in vertretung . Person . Contacts )
{
if ( c . Type = = ContactType . private_Mail | | c . Type = = ContactType . business_Mail )
{
vertretungsItem . MailVertretung = new MailDC ( ) ;
vertretungsItem . MailVertretung . Receiver = c . Value ;
}
}
}
if ( school ! = null )
{
foreach ( var c in school . Contacts )
{
if ( c . Type = = ContactType . private_Mail | | c . Type = = ContactType . business_Mail )
{
vertretungsItem . MailSchule = new MailDC ( ) ;
vertretungsItem . MailSchule . Receiver = c . Value ;
}
}
}
}
2023-06-07 09:45:20 +02:00
public virtual void SetSubstitutionColor ( VertretungsItemDC vertretungsItem )
2019-12-07 21:06:03 +01:00
{
switch ( vertretungsItem . VertretungsStatus )
{
case VertretungsStatus . MaKrankVertretungBenoetigt :
vertretungsItem . KlientStatusColor = "#FF0000" ; // Rot
break ;
case VertretungsStatus . MaKrankKeineVertretungBenoetigt :
vertretungsItem . KlientStatusColor = "#7FFF7F" ; // Grün
break ;
2020-04-15 18:22:10 +02:00
case VertretungsStatus . KlientUndMitarbeiterKrank :
vertretungsItem . KlientStatusColor = "#7FFF7F" ; // Grün
break ;
2019-12-07 21:06:03 +01:00
case VertretungsStatus . MaKrankVertretungVorhanden :
vertretungsItem . KlientStatusColor = "#7FFF7F" ; // Grün
break ;
case VertretungsStatus . KlientKrank :
vertretungsItem . KlientStatusColor = "#FFFFA5" ; // Gelb
break ;
}
2018-05-21 16:58:56 +02:00
}
2019-10-13 13:40:49 +02:00
private static void MigriereSubstitutionStatus ( Customer customer )
{
if ( customer ! = null )
{
if ( customer . SubstitutionNeed = = SubstitutionNeed . SubstitutionNeedUnset )
{
if ( customer . VertretungDringendErforderlich )
{
customer . SubstitutionNeed = SubstitutionNeed . SubstitutionNeeded ;
}
else
{
2019-12-03 13:00:04 +01:00
customer . SubstitutionNeed = customer . VertretungGewuenscht ? SubstitutionNeed . SubstitutionWanted : SubstitutionNeed . NoSubstitutionWanted ;
2019-10-13 13:40:49 +02:00
}
}
else
{
customer . SubstitutionNeed = customer . SubstitutionNeed ;
}
}
}
2020-02-05 16:42:47 +01:00
2023-06-07 09:45:20 +02:00
public virtual void SetTeamleitung ( BeWoEntityBase employee , VertretungsItemDC item )
2018-10-08 11:57:16 +02:00
{
2020-02-05 16:42:47 +01:00
if ( employee . Oid = = null )
2019-08-08 14:47:53 +02:00
{
return ;
}
var sb = new StringBuilder ( ) ;
var teams = DAOFactory . SearchDAO . FindTeamsOfEmployee ( employee . Oid . Value ) ;
2018-10-08 11:57:16 +02:00
foreach ( var team in teams )
{
if ( team . Leader ! = null )
{
if ( sb . Length > 0 )
{
sb . Append ( ", " ) ;
}
sb . Append ( team . Leader . Person . FirstNameLastName ) ;
}
}
item . Teamleitung = sb . ToString ( ) ;
}
2023-06-07 09:45:20 +02:00
public virtual void SetzeSchule ( VertretungsItemDC newItem , Customer customer )
2018-05-21 16:58:56 +02:00
{
2018-10-08 11:57:16 +02:00
if ( customer ! = null )
2018-05-21 16:58:56 +02:00
{
2020-02-05 16:42:47 +01:00
foreach ( var customer2Organisation in customer . Customer2OrganisationList )
2018-05-21 16:58:56 +02:00
{
2019-08-08 14:47:53 +02:00
foreach ( var valueListEntry2Object in customer2Organisation . ValueList )
2018-05-21 16:58:56 +02:00
{
2023-08-23 23:15:58 +02:00
if ( valueListEntry2Object . Entry . Value ! = null & & IstSchule ( valueListEntry2Object . Entry . Value ) )
2018-05-21 16:58:56 +02:00
{
2019-08-08 14:47:53 +02:00
newItem . Schule = MapperFactory . CompactOrganisationDC_Organisation . MapToNewDC ( customer2Organisation . Organisation ) ;
if ( customer2Organisation . Organisation . Address ! = null )
2018-10-08 11:57:16 +02:00
{
2019-08-08 14:47:53 +02:00
newItem . Schule . Street = customer2Organisation . Organisation . Address . Street ;
newItem . Schule . PostalCode = customer2Organisation . Organisation . Address . PostalCode ;
newItem . Schule . Town = customer2Organisation . Organisation . Address . Town ;
2018-10-08 11:57:16 +02:00
}
2018-05-21 16:58:56 +02:00
}
}
}
}
}
2023-08-23 23:15:58 +02:00
public virtual bool IstSchule ( String name )
{
if ( ! String . IsNullOrEmpty ( name ) )
{
return name . ToLower ( ) . Contains ( "schule" ) | | name . ToLower ( ) . Contains ( "kindergarten" ) ;
}
return false ;
}
2019-08-08 14:47:53 +02:00
private static bool LiegtImZeitraum ( DateTime dateTime , AbsenceTime absenceTime )
2018-05-21 16:58:56 +02:00
{
2019-08-08 14:47:53 +02:00
return absenceTime . Start < dateTime . Date . AddDays ( 1 ) & & absenceTime . End > = dateTime . Date ;
2018-05-21 16:58:56 +02:00
}
2023-06-07 09:45:20 +02:00
public virtual void AddKrankheitsZeitraumAndMeldungToItem ( VertretungsItemDC item , AbsenceTimeDC absenceTime )
2018-05-21 16:58:56 +02:00
{
2019-08-08 14:47:53 +02:00
if ( ! absenceTime . Start . HasValue | | ! absenceTime . End . HasValue )
2018-05-21 16:58:56 +02:00
{
2019-08-08 14:47:53 +02:00
item . Krankheitszeitraum = absenceTime . Start . HasValue ? absenceTime . Start . Value . ToString ( "dd.MM.yyyy" ) : "Unbekannt" ;
2018-05-21 16:58:56 +02:00
item . Krankheitszeitraum + = " - " ;
2019-08-08 14:47:53 +02:00
if ( absenceTime . End . HasValue )
2018-05-21 16:58:56 +02:00
{
2019-08-08 14:47:53 +02:00
item . Krankheitszeitraum + = absenceTime . End . Value . ToString ( "dd.MM.yyyy" ) ;
2018-05-21 16:58:56 +02:00
}
else
{
item . Krankheitszeitraum + = "Unbekannt" ;
}
}
else
{
2019-08-08 14:47:53 +02:00
if ( absenceTime . Start . Value . Date ! = absenceTime . End . Value . Date )
2018-05-21 16:58:56 +02:00
{
2019-08-08 14:47:53 +02:00
if ( absenceTime . Start . Value . Hour = = 0 & & absenceTime . Start . Value . Minute = = 0 & &
absenceTime . End . Value . Hour = = 0 & & absenceTime . End . Value . Minute = = 0 )
2018-05-21 16:58:56 +02:00
{
2019-08-08 14:47:53 +02:00
item . Krankheitszeitraum = absenceTime . Start . Value . ToString ( "dd.MM.yyyy" ) + " - " + absenceTime . End . Value . ToString ( "dd.MM.yyyy" ) ;
2018-05-21 16:58:56 +02:00
}
else
{
2019-08-08 14:47:53 +02:00
item . Krankheitszeitraum = absenceTime . Start . Value . ToString ( "dd.MM.yyyy HH:mm" ) + " - " + absenceTime . End . Value . ToString ( "dd.MM.yyyy HH:mm" ) ;
2018-05-21 16:58:56 +02:00
}
}
else
{
2019-08-08 14:47:53 +02:00
if ( absenceTime . Start . Value . Hour = = 0 & & absenceTime . Start . Value . Minute = = 0 & &
absenceTime . End . Value . Hour = = 0 & & absenceTime . End . Value . Minute = = 0 )
2018-05-21 16:58:56 +02:00
{
2019-08-08 14:47:53 +02:00
item . Krankheitszeitraum = absenceTime . Start . Value . ToString ( "dd.MM.yyyy" ) ;
2018-05-21 16:58:56 +02:00
}
else
{
2019-08-08 14:47:53 +02:00
item . Krankheitszeitraum = absenceTime . Start . Value . ToString ( "dd.MM.yyyy HH:mm" ) + " - " + absenceTime . End . Value . ToString ( "HH:mm" ) ;
2018-05-21 16:58:56 +02:00
}
}
}
2019-08-08 14:47:53 +02:00
if ( absenceTime . KrankheitsMeldung ! = null )
{
item . Krankheitsmeldung = absenceTime . KrankheitsMeldung . Value ;
}
else if ( absenceTime . Start . HasValue )
{
item . Krankheitsmeldung = absenceTime . Start . Value ;
}
2018-05-21 16:58:56 +02:00
}
2023-06-07 09:45:20 +02:00
public virtual bool GetIsSubstitutedCompletely ( IEnumerable < ArbeitszeitEintrag > assistanceTimes , Vertretung substitution , DateTime dateTime )
2019-09-27 15:55:01 +02:00
{
var isSubstituted = true ;
2020-02-05 16:42:47 +01:00
foreach ( var assistanceTime in assistanceTimes )
2019-09-27 15:55:01 +02:00
{
2019-12-07 21:06:03 +01:00
var assistanceDateTimes = DateTimeUtils . GetAssistanceTimeComparisonDateTime ( assistanceTime . UhrzeitVon , assistanceTime . UhrzeitBis , dateTime ) ;
2019-10-13 13:40:49 +02:00
if ( substitution . VertretungsZeitraumBis . Hour = = 0 & & substitution . VertretungsZeitraumBis . Minute = = 0 )
{
substitution . VertretungsZeitraumBis = substitution . VertretungsZeitraumBis . AddDays ( 1 ) . AddTicks ( - 1 ) ;
}
2019-12-03 13:00:04 +01:00
2019-09-27 15:55:01 +02:00
isSubstituted = assistanceDateTimes . Start . AreInBetweenDates ( assistanceDateTimes . End , substitution . VertretungsZeitraumVon , substitution . VertretungsZeitraumBis ) ;
2020-02-05 16:42:47 +01:00
if ( ! isSubstituted )
2019-09-27 15:55:01 +02:00
{
break ;
}
}
return isSubstituted ;
}
2023-06-07 09:45:20 +02:00
public virtual void GetVertretungsstatus ( VertretungsItemDC vertretungsItem , DateTime dateTime , DateTime absenceTimeStartDate , Customer customer )
2019-09-27 15:55:01 +02:00
{
2019-10-13 13:40:49 +02:00
MigriereSubstitutionStatus ( customer ) ;
2019-09-27 15:55:01 +02:00
if ( customer . SubstitutionNeed = = SubstitutionNeed . SubstitutionNeeded )
{
vertretungsItem . VertretungsStatus = VertretungsStatus . MaKrankVertretungBenoetigt ;
vertretungsItem . Dringlichkeit = "Dringend" ;
2019-12-07 21:06:03 +01:00
vertretungsItem . DringlichkeitColor = "#FF0000" ; // rot
2020-04-15 18:22:10 +02:00
}
else if ( customer . SubstitutionNeed = = SubstitutionNeed . SubstitutionWanted )
2019-09-27 15:55:01 +02:00
{
vertretungsItem . Dringlichkeit = "Möglichst" ;
2019-12-07 21:06:03 +01:00
vertretungsItem . DringlichkeitColor = "#F3D04F" ; // Senfgelb
2019-09-27 15:55:01 +02:00
}
2020-04-15 18:22:10 +02:00
else if ( customer . SubstitutionNeed = = SubstitutionNeed . NoSubstitutionWanted )
{
vertretungsItem . VertretungsStatus = VertretungsStatus . MaKrankKeineVertretungBenoetigt ;
vertretungsItem . Dringlichkeit = "Kein Vertretungsbedarf" ;
vertretungsItem . DringlichkeitColor = "#FFFFFF" ; // weiß
}
2019-09-27 15:55:01 +02:00
if ( customer . AbWelchemKrankheitsTag > 1 & & dateTime < absenceTimeStartDate . AddDays ( customer . AbWelchemKrankheitsTag - 1 ) )
{
vertretungsItem . VertretungsStatus = VertretungsStatus . MaKrankKeineVertretungBenoetigt ;
vertretungsItem . Dringlichkeit = $"Vertretung erst ab dem {customer.AbWelchemKrankheitsTag}.Tag benötigt" ;
2019-12-07 21:06:03 +01:00
vertretungsItem . DringlichkeitColor = "#FFFFFF" ; // weiß
2019-09-27 15:55:01 +02:00
}
2019-12-12 17:31:50 +01:00
if ( customer . AbWelchemKrankheitsTag < = 1 & & customer . SubstitutionNeed ! = SubstitutionNeed . SubstitutionWanted & & customer . SubstitutionNeed ! = SubstitutionNeed . SubstitutionNeeded )
2019-09-27 15:55:01 +02:00
{
vertretungsItem . VertretungsStatus = VertretungsStatus . MaKrankKeineVertretungBenoetigt ;
}
}
2023-08-23 23:15:58 +02:00
public virtual string GetEmployeeAddressInfo ( Employee employee )
2019-09-27 15:55:01 +02:00
{
var result = string . Empty ;
var address = employee . Person . Address ;
if ( address ! = null )
{
var addressInfo = string . Empty ;
addressInfo + = employee . Person . LastNameFirstName ;
if ( ! string . IsNullOrWhiteSpace ( address . Street ) )
{
if ( addressInfo . Length > 0 )
{
addressInfo + = "\n\n" ;
}
addressInfo + = address . Street ;
}
if ( ! string . IsNullOrWhiteSpace ( address . PostalCode ) )
{
if ( addressInfo . Length > 0 )
{
addressInfo + = "\n" ;
}
addressInfo + = address . PostalCode ;
}
if ( ! string . IsNullOrWhiteSpace ( address . Town ) )
{
if ( addressInfo . Length > 0 )
{
addressInfo + = " " ;
}
addressInfo + = address . Town ;
}
result = addressInfo ;
}
return result ;
}
2019-12-03 13:00:04 +01:00
2023-06-07 09:45:20 +02:00
public virtual bool IsAbsenceTimeInAssistanceTime ( DateTime currentDate , ArbeitszeitEintrag assistanceTime , AbsenceTime absenceTime )
2019-12-07 21:06:03 +01:00
{
2024-03-18 00:16:56 +01:00
if ( currentDate . DayOfWeek ! = DateTimeUtils . ConvertAppointmentDayOfWeekToDayOfWeek ( assistanceTime . Tag ) )
2019-12-07 21:06:03 +01:00
{
return false ;
}
2024-03-18 00:16:56 +01:00
if ( absenceTime = = null )
{
return true ;
}
2019-12-07 21:06:03 +01:00
var assistanceTimeDates = DateTimeUtils . GetAssistanceTimeComparisonDateTime ( assistanceTime . UhrzeitVon , assistanceTime . UhrzeitBis , currentDate ) ;
var absenceTimeEnd = absenceTime . End ;
2020-04-08 14:25:01 +02:00
if ( absenceTimeEnd . HasValue & & absenceTimeEnd . Value . Hour = = 0 & & absenceTimeEnd . Value . Minute = = 0 )
2019-12-07 21:06:03 +01:00
{
absenceTimeEnd = absenceTimeEnd . Value . AddHours ( 23 ) . AddMinutes ( 59 ) . AddSeconds ( 59 ) ;
}
return assistanceTimeDates . Start . IsIntervalOverlappingWithAbsenceTimeInterval ( assistanceTimeDates . End , absenceTime . Start . Value , absenceTimeEnd ) ;
}
2023-06-07 09:45:20 +02:00
public virtual bool IsAbsenceTimeInAssistanceTime ( DateTime currentDate , ArbeitszeitEintragDC assistanceTime , AbsenceTime absenceTime )
2019-12-03 13:00:04 +01:00
{
2019-12-07 21:06:03 +01:00
if ( currentDate . DayOfWeek ! = DateTimeUtils . ConvertAppointmentDayOfWeekToDayOfWeek ( assistanceTime . Tag ) | | absenceTime . Start = = null )
2019-12-03 13:00:04 +01:00
{
return false ;
}
2019-12-07 21:06:03 +01:00
var assistanceTimeDates = DateTimeUtils . GetAssistanceTimeComparisonDateTime ( assistanceTime . UhrzeitVon , assistanceTime . UhrzeitBis , currentDate ) ;
var absenceTimeEnd = absenceTime . End ;
2020-08-17 15:50:00 +02:00
//if (absenceTimeEnd.HasValue && absenceTime.Start.Value.Equals(absenceTimeEnd.Value))
//{
// absenceTimeEnd = absenceTimeEnd.Value.AddHours(23).AddMinutes(59).AddSeconds(59);
//}
if ( absenceTimeEnd . HasValue & & absenceTimeEnd . Value . Hour = = 0 & & absenceTimeEnd . Value . Minute = = 0 & & absenceTimeEnd . Value . Second = = 0 )
2019-12-07 21:06:03 +01:00
{
2020-08-17 15:50:00 +02:00
absenceTimeEnd = absenceTimeEnd . Value . Date . AddHours ( 23 ) . AddMinutes ( 59 ) . AddSeconds ( 59 ) ;
2019-12-07 21:06:03 +01:00
}
return assistanceTimeDates . Start . IsIntervalOverlappingWithAbsenceTimeInterval ( assistanceTimeDates . End , absenceTime . Start . Value , absenceTimeEnd ) ;
}
2023-06-07 09:45:20 +02:00
public virtual List < ArbeitszeitEintrag > GetAssistanceTimesForCustomer ( Customer customer , Employee employee , AbsenceTime absenceTime , DateTime start , DateTime end )
2019-12-07 21:06:03 +01:00
{
var assistanceTimeEntries = new List < ArbeitszeitEintrag > ( ) ;
var allSchoolAssistanceTimes = new List < Arbeitszeit > ( ) ;
var allCustomerAssistanceTimes = new List < Arbeitszeit > ( ) ;
var schoolAssistanceTimes = new List < Arbeitszeit > ( ) ;
var customerAssistanceTimes = new List < Arbeitszeit > ( ) ;
2023-08-23 23:15:58 +02:00
var hasSchoolAssistanceTimes = customer . Customer2OrganisationList . Any ( a = > a . ValueList . Any ( b = > b . Entry . Type = = ValueListEntryType . EnvironmentOrganisationType & & IstSchule ( b . Entry . Value ) ) ) ;
2019-12-07 21:06:03 +01:00
if ( hasSchoolAssistanceTimes )
{
2023-08-23 23:15:58 +02:00
var school = customer . Customer2OrganisationList . FirstOrDefault ( f = > f . ValueList . Any ( b = > b . Entry . Type = = ValueListEntryType . EnvironmentOrganisationType & & IstSchule ( b . Entry . Value ) ) ) ;
2019-12-07 21:06:03 +01:00
if ( school ! = null )
{
allSchoolAssistanceTimes . AddRange ( school . Organisation . Arbeitszeiten ) ;
}
}
var hasAssistanceTimes = customer . Arbeitszeiten ? . Count > 0 ;
if ( hasAssistanceTimes )
{
allCustomerAssistanceTimes . AddRange ( customer . Arbeitszeiten ) ;
}
var dateTime = start ;
while ( dateTime < = end )
{
2024-03-18 00:16:56 +01:00
if ( absenceTime = = null | | LiegtImZeitraum ( dateTime , absenceTime ) )
2019-12-07 21:06:03 +01:00
{
customerAssistanceTimes . AddRange ( allCustomerAssistanceTimes . Where ( w = > IsArbeitszeitValid ( w , dateTime ) ) ) ;
schoolAssistanceTimes . AddRange ( allSchoolAssistanceTimes . Where ( w = > IsArbeitszeitValid ( w , dateTime ) ) ) ;
}
dateTime = dateTime . AddDays ( 1 ) ;
}
if ( customerAssistanceTimes . Count > 0 )
{
customerAssistanceTimes . DoForEach ( assistanceTime = > assistanceTimeEntries . AddRange ( assistanceTime . ArbeitszeitEintraege . Where ( entry = > entry . Employee = = null | | entry . Employee . Equals ( employee ) ) ) ) ;
}
else
{
schoolAssistanceTimes . DoForEach ( assistanceTime = > assistanceTimeEntries . AddRange ( assistanceTime . ArbeitszeitEintraege . Where ( entry = > entry . Employee = = null | | entry . Employee . Equals ( employee ) ) ) ) ;
}
return assistanceTimeEntries ;
}
2023-06-07 09:45:20 +02:00
public virtual bool IsArbeitszeitValid ( Arbeitszeit arbeitszeit , DateTime time )
2019-12-07 21:06:03 +01:00
{
if ( arbeitszeit . GueltigVon = = null & & arbeitszeit . GueltigBis = = null )
{
return true ;
}
if ( arbeitszeit . GueltigVon . HasValue & & arbeitszeit . GueltigBis . HasValue )
{
return time . InBetween ( arbeitszeit . GueltigVon . Value , arbeitszeit . GueltigBis . Value , true ) ;
}
if ( arbeitszeit . GueltigVon = = null & & arbeitszeit . GueltigBis . HasValue )
{
return time < = arbeitszeit . GueltigBis ;
}
2019-12-03 13:00:04 +01:00
2019-12-07 21:06:03 +01:00
if ( arbeitszeit . GueltigBis = = null )
{
return time > = arbeitszeit . GueltigVon ;
}
2019-12-03 13:00:04 +01:00
2019-12-07 21:06:03 +01:00
return false ;
2019-12-03 13:00:04 +01:00
}
2020-02-05 16:42:47 +01:00
2023-06-07 09:45:20 +02:00
public virtual List < Arbeitszeit > GetSchoolAssistanceTimes ( Customer customer , DateTime start , DateTime end , AbsenceTime absenceTime )
2020-02-05 16:42:47 +01:00
{
var allSchoolAssistanceTimes = new List < Arbeitszeit > ( ) ;
var schoolAssistanceTimes = new List < Arbeitszeit > ( ) ;
2023-08-23 23:15:58 +02:00
var hasSchoolAssistanceTimes = customer . Customer2OrganisationList . Any ( a = > a . ValueList . Any ( b = > b . Entry . Type = = ValueListEntryType . EnvironmentOrganisationType & & IstSchule ( b . Entry . Value ) ) ) ;
2020-02-05 16:42:47 +01:00
if ( hasSchoolAssistanceTimes )
{
2023-08-23 23:15:58 +02:00
var school = customer . Customer2OrganisationList . FirstOrDefault ( f = > f . ValueList . Any ( b = > b . Entry . Type = = ValueListEntryType . EnvironmentOrganisationType & & IstSchule ( b . Entry . Value ) ) ) ;
2020-02-05 16:42:47 +01:00
if ( school ! = null )
{
allSchoolAssistanceTimes . AddRange ( school . Organisation . Arbeitszeiten ) ;
}
}
var dateTime = start ;
while ( dateTime < = end )
{
if ( LiegtImZeitraum ( dateTime , absenceTime ) )
{
schoolAssistanceTimes . AddRange ( allSchoolAssistanceTimes . Where ( w = > IsArbeitszeitValid ( w , dateTime ) ) ) ;
}
dateTime = dateTime . AddDays ( 1 ) ;
}
return schoolAssistanceTimes ;
}
2023-06-07 09:45:20 +02:00
protected void GetDistanceForVertreterEmployees ( long customerOid , ref List < CompactVertreterEmployeeDC > list , IList < Employee > employees )
{
var customer = DAOFactory . GenericDAO . LoadByID < Customer > ( customerOid ) ;
2023-08-23 23:15:58 +02:00
var school = customer . Customer2OrganisationList . FirstOrDefault ( f = > f . ValueList . Any ( b = > b . Entry . Type = = ValueListEntryType . EnvironmentOrganisationType & & IstSchule ( b . Entry . Value ) ) ) ;
2023-06-07 09:45:20 +02:00
var origin = new Address [ ] { school . Person . Address } ;
var destinations = employees . Select ( x = > x . Person . Address ) . ToArray ( ) ;
var matrix = AddressRouteManager . GetMatrix ( origin , destinations ) ;
Employee empl ; AddressRoute route ;
foreach ( var employee in list )
{
empl = employees . FirstOrDefault ( e = > e . Person . Oid . Value = = employee . PersonOid ) ;
route = matrix . GetRoute ( school . Person . Address , empl . Person . Address ) ;
employee . AddressRoute = MapperFactory . AddressRouteDC_AddressRoute . MapToNewDC ( route ) ;
}
}
2023-08-23 23:15:58 +02:00
public virtual void SaveVertretung ( VertretungDC vertretung )
{
var x = MapperFactory . VertretungDC_Vertretung . MapToNewEntity ( vertretung ) ;
DAOFactory . GenericDAO . Insert ( x ) ;
}
2018-05-21 16:58:56 +02:00
}
}