2016-06-27 01:45:38 +02:00
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
using System.ServiceModel ;
using System.Xml ;
using System.Xml.Linq ;
using BeWo.Data.Access ;
using BeWo.Data.Entities ;
using BeWo.Service.Core ;
using BeWo.Service.DCEntityMapper ;
using BeWo.Service.ServiceContracts ;
using BS.Shared ;
using BS.Shared.DataContracts ;
using BS.Shared.DataContracts.Compact ;
using BS.Shared.Extensions ;
using DevExpress.XtraScheduler ;
2018-10-24 19:32:12 +02:00
using static System . String ;
2016-06-27 01:45:38 +02:00
using Resource = BeWo . Data . Entities . Resource ;
using Utils = BeWo . Service . Core . Utils ;
namespace BeWo.Service.ServiceImplementations
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class ResourceServiceImp : IResourceService
{
public void DeactivateResource ( long pOid , long pVersion )
{
try
{
ServiceLogic . SetActivationType < Resource > ( new Dictionary < long , long > { { pOid , pVersion } } , ActivationTypeId . Deleted ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public void DeactivateResources ( Dictionary < long , long > pOid2Version )
{
try
{
ServiceLogic . SetActivationType < Resource > ( pOid2Version , ActivationTypeId . Deleted ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public void DeleteBooking ( long pOid , long pVersion )
{
try
{
this . DeleteBookings ( new Dictionary < long , long > { { pOid , pVersion } } ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public void DeleteBookings ( Dictionary < long , long > pOid2Version )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < ResourceBookingSequence > ( pOid2Version . Select ( e = > e . Key ) ) ;
lOriginals . DoForEach ( or = > MapperFactory . BookingSequenceDC_ResourceBookingSequence . ConcurrencyCheck ( pOid2Version [ or . Oid . Value ] , or ) ) ;
DAOFactory . GenericDAO . Delete ( lOriginals ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public void DeleteResource ( long pOid , long pVersion )
{
try
{
this . DeleteResources ( new Dictionary < long , long > { { pOid , pVersion } } ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public void DeleteResources ( Dictionary < long , long > pOid2Version )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < Resource > ( pOid2Version . Select ( e = > e . Key ) ) ;
lOriginals . DoForEach ( or = > MapperFactory . ResourceDC_Resource . ConcurrencyCheck ( pOid2Version [ or . Oid . Value ] , or ) ) ;
DAOFactory . GenericDAO . Delete ( lOriginals ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < BookingSequenceDC > GetAllBookings ( DateTime pStartSpan , DateTime pEndSpan )
{
try
{
var t = DAOFactory . SearchDAO . FindBookings ( pStartSpan , pEndSpan ) ;
//### Kalender
//ConvertResourceBookingsToResourceAppointments();
return MapperFactory . BookingSequenceDC_ResourceBookingSequence . MapToNewDCs ( t ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < BookingSequenceDC > GetAllBookingsByResource ( long pResourceOid , DateTime pStartSpan , DateTime pEndSpan )
{
try
{
var t = DAOFactory . SearchDAO . FindBookings ( pResourceOid , pStartSpan , pEndSpan ) ;
return MapperFactory . BookingSequenceDC_ResourceBookingSequence . MapToNewDCs ( t ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < ResourceDC > GetAllResources ( )
{
try
{
return MapperFactory . ResourceDC_Resource . MapToNewDCs ( DAOFactory . GenericDAO . GetAllActive < Resource > ( ) ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < long > InsertNewBookings ( List < BookingSequenceDC > pBookings )
{
try
{
var lEntities = MapperFactory . BookingSequenceDC_ResourceBookingSequence . MapToNewEntities ( pBookings ) ;
DAOFactory . GenericDAO . Insert ( lEntities ) ;
return lEntities . Select ( e = > e . Oid . Value ) . ToList ( ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < BookingSequenceDC > InsertNewBookingSequenceDCs ( IEnumerable < BookingSequenceDC > pBookings )
{
try
{
var lEntities = MapperFactory . BookingSequenceDC_ResourceBookingSequence . MapToNewEntities ( pBookings ) ;
DAOFactory . GenericDAO . Insert ( lEntities ) ;
return MapperFactory . BookingSequenceDC_ResourceBookingSequence . MapToNewDCs ( lEntities ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < long > InsertNewResources ( List < ResourceDC > pResources )
{
try
{
List < Resource > lResources = MapperFactory . ResourceDC_Resource . MapToNewEntities ( pResources ) ;
DAOFactory . GenericDAO . Insert ( lResources ) ;
return lResources . Select ( r = > r . Oid . Value ) . ToList ( ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < long > UpdateBookings ( List < BookingSequenceDC > pBookings )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < ResourceBookingSequence > ( pBookings . Select ( b = > b . SequenceOid . Value ) ) ;
MapperFactory . BookingSequenceDC_ResourceBookingSequence . MergeWithEntitys ( pBookings , lOriginals ) ;
DAOFactory . GenericDAO . Update ( lOriginals ) ;
return lOriginals . Select ( b = > b . Oid . Value ) . ToList ( ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < BookingSequenceDC > UpdateBookingSequenceDCs ( List < BookingSequenceDC > pBookings )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < ResourceBookingSequence > ( pBookings . Select ( b = > b . SequenceOid . Value ) ) ;
MapperFactory . BookingSequenceDC_ResourceBookingSequence . MergeWithEntitys ( pBookings , lOriginals ) ;
DAOFactory . GenericDAO . Update ( lOriginals ) ;
return MapperFactory . BookingSequenceDC_ResourceBookingSequence . MapToNewDCs ( lOriginals ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < ResourceDC > UpdateResourceDCs ( List < ResourceDC > pResource )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < Resource > ( pResource . Select ( b = > b . ResourceOid . Value ) ) ;
MapperFactory . ResourceDC_Resource . MergeWithEntitys ( pResource , lOriginals ) ;
DAOFactory . GenericDAO . Update ( lOriginals ) ;
return MapperFactory . ResourceDC_Resource . MapToNewDCs ( lOriginals ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < long > UpdateResources ( List < ResourceDC > pResource )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < Resource > ( pResource . Select ( b = > b . ResourceOid . Value ) ) ;
MapperFactory . ResourceDC_Resource . MergeWithEntitys ( pResource , lOriginals ) ;
DAOFactory . GenericDAO . Update ( lOriginals ) ;
return lOriginals . Select ( b = > b . Oid . Value ) . ToList ( ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < ResourceAppointmentDC > UpdateResourceAppointments ( List < ResourceAppointmentDC > pResourceAppointments )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < ResourceAppointment > ( pResourceAppointments . Select ( b = > b . ResourceAppointmentOid . Value ) ) ;
MapperFactory . ResourceAppointmentDC_ResourceAppointment . MergeWithEntitys ( pResourceAppointments , lOriginals ) ;
DAOFactory . GenericDAO . Update ( lOriginals ) ;
return MapperFactory . ResourceAppointmentDC_ResourceAppointment . MapToNewDCs ( lOriginals ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < ResourceAppointmentDC > InsertNewResourceAppointments ( IEnumerable < ResourceAppointmentDC > pResourceAppointments )
{
try
{
var lResources = MapperFactory . ResourceAppointmentDC_ResourceAppointment . MapToNewEntities ( pResourceAppointments ) ;
DAOFactory . GenericDAO . Insert ( lResources ) ;
return MapperFactory . ResourceAppointmentDC_ResourceAppointment . MapToNewDCs ( lResources ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public void DeleteResourceAppointments ( Dictionary < long , long > pOid2Version )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < ResourceAppointment > ( pOid2Version . Select ( e = > e . Key ) ) ;
lOriginals . DoForEach ( or = > MapperFactory . ResourceAppointmentDC_ResourceAppointment . ConcurrencyCheck ( pOid2Version [ or . Oid . Value ] , or ) ) ;
DAOFactory . GenericDAO . Delete ( lOriginals ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
private void ConvertResourceBookingsToResourceAppointments ( )
{
try
{
const string selectQuery = "SELECT ResourceBookingSequenceOid, Oid FROM resourcebooking WHERE IsActive = 1 AND IsDeleted = 0" ;
var dataSet = DAOFactory . AdoDAO . ExecuteQuery ( selectQuery ) ;
var dataReader = dataSet . CreateDataReader ( ) ;
var rbs2rb = new Dictionary < long , List < long > > ( ) ;
var newSchedulerAppointments = new List < SchedulerAppointmentDC > ( ) ;
var sequence2booking = new Dictionary < ResourceBookingSequence , List < ResourceBooking > > ( ) ;
var allResourceBookings = DAOFactory . GenericDAO . GetAllActive < ResourceBooking > ( ) ;
while ( dataReader . Read ( ) )
{
rbs2rb . AddOrUpdateValueInDictionary ( ( long ) dataReader . GetValue ( 0 ) , new List < long > { ( long ) dataReader . GetValue ( 1 ) } ) ;
}
if ( allResourceBookings . Count = = 0 ) return ;
allResourceBookings = allResourceBookings . OrderBy ( o = > o . Oid ) . ToList ( ) ;
foreach ( var b in allResourceBookings )
{
if ( ! sequence2booking . ContainsKey ( b . Sequence ) )
sequence2booking . Add ( b . Sequence , new List < ResourceBooking > { b } ) ;
else
sequence2booking [ b . Sequence ] . Add ( b ) ;
}
foreach ( var kvp in sequence2booking )
{
var sequence = kvp . Key ;
var frequencyType = sequence . FrequencyType ;
foreach ( var booking in kvp . Value )
{
var originator = DAOFactory . SearchDAO . FindEmployeeByFullname ( booking . InsUser ) ? ? booking . Employee ;
if ( booking . Sequence . FrequencyType . Equals ( ResourceBookingFrequencyType . MonthlyOnLastDay ) )
{
var singleBookings = ConvertType6ResourceAppointment ( booking ) ;
newSchedulerAppointments . AddRange ( singleBookings ) ;
continue ;
}
var employeeList = new List < Employee2SchedulerAppointmentDC > ( ) ;
if ( booking . Employee ! = null )
employeeList . Add ( new Employee2SchedulerAppointmentDC
{
Employee = MapperFactory . CompactEmployeeDC_Employee . MapToNewDC ( booking . Employee ) ,
ParticipationAnswer = ParticipationAnswer . Zusage ,
IsPC_CheckedTs = null ,
IsPChanged = false
} ) ;
var resourceList = new List < ResourceDC > { MapperFactory . ResourceDC_Resource . MapToNewDC ( booking . Sequence . Resource ) } ;
var newSchedulerAppointment = new SchedulerAppointmentDC
{
AllDay = booking . Start . Equals ( booking . End ) ,
CustomerList = new List < CompactCustomerDC > ( ) ,
Description = booking . Notice ,
EmployeeList = employeeList ,
EndDate = booking . End ,
StartDate = booking . Start ,
IsPrivate = false ,
ResourceList = resourceList ,
Subject = booking . Notice ,
Originator = MapperFactory . CompactEmployeeDC_Employee . MapToNewDC ( originator ) ,
Type = 0 ,
FormerBookingSequenceOid = booking . Sequence . Oid
} ;
if ( kvp . Value . Count > 1 & & booking . SequencePosition > 0 )
{
newSchedulerAppointment . Type = booking . IsDeleted ? 4 : 3 ;
}
else if ( frequencyType > 0 )
{
newSchedulerAppointment . Type = 1 ;
}
if ( ! booking . Sequence . FrequencyType . Equals ( ResourceBookingFrequencyType . Once ) )
newSchedulerAppointment . RecurrenceInfo = CreateRecurrenceInfo ( booking ) . ToXml ( ) ;
if ( newSchedulerAppointments . FirstOrDefault ( f = > f . FormerBookingSequenceOid . Equals ( sequence . Oid ) ) ! = null )
{
var x = newSchedulerAppointments . First ( f = > f . FormerBookingSequenceOid . Equals ( sequence . Oid ) & & f . RecurrenceInfo ! = null ) . RecurrenceInfo ;
using ( var reader = XmlReader . Create ( new StringReader ( x ) ) )
{
reader . ReadToFollowing ( "RecurrenceInfo" ) ;
reader . MoveToAttribute ( "Id" ) ;
var id = reader . Value ;
var doc = XDocument . Load ( new StringReader ( newSchedulerAppointment . RecurrenceInfo ) ) ;
var xElement = doc . Element ( "RecurrenceInfo" ) ;
if ( xElement ! = null )
{
xElement . RemoveAttributes ( ) ;
xElement . Add ( new XAttribute ( "Id" , id ) ) ;
xElement . Add ( new XAttribute ( "Index" , booking . SequencePosition ) ) ;
}
newSchedulerAppointment . RecurrenceInfo = doc . ToString ( ) ;
}
}
newSchedulerAppointments . Add ( newSchedulerAppointment ) ;
}
}
foreach ( var resourcebooking in allResourceBookings )
{
resourcebooking . IsActive = ActivationTypeId . Deleted ;
resourcebooking . Sequence . IsActive = ActivationTypeId . Deleted ;
}
DAOFactory . GenericDAO . Update ( allResourceBookings ) ;
InsertSchedulerAppointments ( newSchedulerAppointments ) ;
}
catch ( Exception ex )
{
throw Utils . CreateBeWoFaultException ( ex ) ;
}
}
private static RecurrenceInfo CreateRecurrenceInfo ( ResourceBooking booking )
{
var sequence = booking . Sequence ;
var recInfo = new RecurrenceInfo { Range = RecurrenceRange . EndByDate } ;
DateTime ? datum = null ;
// Rekonstruktion der gelöschten Zeiten (der neue Termin wird sonst nicht als gelöscht angezeigt)
if ( booking . Start = = null )
{
var firstBooking = DAOFactory . SearchDAO . GetFirstResourceBookingFromSequence ( sequence . Oid . Value ) ;
var sequenceStartDate = firstBooking . Start . Value ;
// Täglich
if ( sequence . FrequencyType . Equals ( ResourceBookingFrequencyType . Daily ) )
{
datum = sequenceStartDate . AddDays ( sequence . RepeatInterval * booking . SequencePosition ) ;
}
// Wöchentlich
if ( sequence . FrequencyType . Equals ( ResourceBookingFrequencyType . Weekly ) )
{
datum = sequenceStartDate . AddDays ( sequenceStartDate . Day + 7 * sequence . RepeatInterval * booking . SequencePosition ) ;
}
// Monatlich
if ( sequence . FrequencyType . Equals ( ResourceBookingFrequencyType . Monthly ) )
{
datum = sequenceStartDate . AddMonths ( sequence . RepeatInterval * booking . SequencePosition ) ;
}
// X. Wochentag des Monats
if ( sequence . FrequencyType . Equals ( ResourceBookingFrequencyType . MonthlyOnFirstDay ) )
{
datum = sequenceStartDate . AddMonthsDayDependent ( sequence . RepeatInterval * booking . SequencePosition , true ) ;
}
booking . Start = datum ;
booking . End = booking . Start . Value . AddMinutes ( ( firstBooking . End . Value - firstBooking . Start . Value ) . TotalMinutes ) ;
}
if ( booking . Start ! = null )
recInfo . Start = booking . Start . Value ;
if ( sequence . SequenceEnd ! = null )
recInfo . End = sequence . SequenceEnd . Value ;
if ( sequence . RepeatInterval > 1 )
recInfo . Periodicity = sequence . RepeatInterval ;
switch ( booking . Sequence . FrequencyType )
{
case ResourceBookingFrequencyType . Daily :
recInfo . OccurrenceCount = ( ( recInfo . End - recInfo . Start ) . Days + 1 ) /
booking . Sequence . RepeatInterval ;
recInfo . Type = RecurrenceType . Daily ;
break ;
case ResourceBookingFrequencyType . Weekly :
recInfo . OccurrenceCount = ( ( recInfo . End - recInfo . Start ) . Days / 7 + 1 ) /
booking . Sequence . RepeatInterval ;
recInfo . Type = RecurrenceType . Weekly ;
recInfo . WeekDays = GetWeekDay ( recInfo . Start . DayOfWeek . ToString ( ) ) ;
break ;
case ResourceBookingFrequencyType . Monthly :
recInfo . Type = RecurrenceType . Monthly ;
recInfo . OccurrenceCount = ( ( recInfo . End - recInfo . Start ) . Days / 30 + 1 ) /
booking . Sequence . RepeatInterval ;
recInfo . WeekDays = GetWeekDay ( recInfo . Start . DayOfWeek . ToString ( ) ) ;
recInfo . DayNumber = recInfo . Start . Day ;
recInfo . WeekOfMonth = WeekOfMonth . None ;
break ;
case ResourceBookingFrequencyType . MonthlyOnFirstDay :
recInfo . Type = RecurrenceType . Monthly ;
recInfo . OccurrenceCount = ( ( recInfo . End - recInfo . Start ) . Days / 30 + 1 ) /
booking . Sequence . RepeatInterval ;
recInfo . WeekDays = GetWeekDay ( recInfo . Start . DayOfWeek . ToString ( ) ) ;
recInfo . WeekOfMonth = recInfo . Start . GetWeekOfMonth ( DayOfWeek . Sunday ) ;
break ;
}
return recInfo ;
}
private static IEnumerable < SchedulerAppointmentDC > ConvertType6ResourceAppointment ( ResourceBooking booking )
{
var sequence = booking . Sequence ;
if ( sequence . Oid = = null ) return null ;
var firstBooking = DAOFactory . SearchDAO . GetFirstResourceBookingFromSequence ( sequence . Oid . Value ) ;
if ( firstBooking . Start = = null | | firstBooking . End = = null | | sequence . SequenceEnd = = null ) return null ;
// X. Letzten Wochentag im Monat berechnen für den gesamten Zeitraum (Typ 3 und 4 beachten, oder nicht?)
var duration = ( firstBooking . End . Value - firstBooking . Start . Value ) . TotalMinutes ;
var newDates = new List < DateTime > { firstBooking . Start . Value } ;
newDates . AddRange ( CalculateLastXInMonthDates ( DAOFactory . SearchDAO . GetExcludedBookingSequencePositions ( sequence . Oid . Value ) , firstBooking . Start . Value , sequence ) ) ;
var employee = MapperFactory . CompactEmployeeDC_Employee . MapToNewDC ( booking . Employee ) ;
var employeeList = new List < Employee2SchedulerAppointmentDC > ( ) ;
if ( booking . Employee ! = null )
employeeList . Add ( new Employee2SchedulerAppointmentDC
{
Employee = employee ,
ParticipationAnswer = ParticipationAnswer . Zusage ,
IsPC_CheckedTs = null ,
IsPChanged = false
} ) ;
var resourceList = new List < ResourceDC > { MapperFactory . ResourceDC_Resource . MapToNewDC ( booking . Sequence . Resource ) } ;
return newDates . Select ( date = > new SchedulerAppointmentDC
{
AllDay = false ,
CustomerList = new List < CompactCustomerDC > ( ) ,
Description = firstBooking . Notice ,
EmployeeList = employeeList ,
EndDate = date . AddMinutes ( duration ) ,
FormerBookingSequenceOid = firstBooking . Sequence . Oid ,
IsPrivate = false ,
Originator = employee ,
ResourceList = resourceList ,
StartDate = date ,
Subject = firstBooking . Notice ,
Type = 0
} ) . ToList ( ) ;
}
private static IEnumerable < DateTime > CalculateLastXInMonthDates ( ICollection < int > excludedBookingSequencePositions , DateTime pSequenceStart , ResourceBookingSequence pSequence )
{
// bearbeitete und gelöschte Termine nicht beachten
var result = new List < DateTime > ( ) ;
var lCurrentPosition = 0 ;
var lCurrentSequencePosition = 1 ;
var lCurrentStart = pSequenceStart . AddMonthsDayDependent ( 1 , false ) ;
while ( lCurrentStart < = pSequence . SequenceEnd )
{
lCurrentPosition + + ;
if ( lCurrentPosition % pSequence . RepeatInterval = = 0 & & ! excludedBookingSequencePositions . Contains ( lCurrentSequencePosition ) )
{
result . Add ( lCurrentStart ) ;
lCurrentSequencePosition + + ;
}
lCurrentStart = lCurrentStart . AddMonthsDayDependent ( 1 , false ) ;
}
return result ;
}
private static WeekDays GetWeekDay ( string name )
{
switch ( name )
{
case "Sunday" :
return WeekDays . Sunday ;
case "Monday" :
return WeekDays . Monday ;
case "Tuesday" :
return WeekDays . Thursday ;
case "Wednesday" :
return WeekDays . Wednesday ;
case "Thursday" :
return WeekDays . Thursday ;
case "Friday" :
return WeekDays . Friday ;
case "Saturday" :
return WeekDays . Saturday ;
default :
return WeekDays . Sunday ;
}
}
public List < ResourceAppointmentDC > GetAllResourceAppointments ( )
{
try
{
var lResources = DAOFactory . GenericDAO . GetAll < ResourceAppointment > ( ) ;
return MapperFactory . ResourceAppointmentDC_ResourceAppointment . MapToNewDCs ( lResources ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < SchedulerAppointmentDC > GetAllSchedulerAppointments ( )
{
try
{
var lSchedulerAppointments = DAOFactory . GenericDAO . GetAll < SchedulerAppointment > ( ) ;
return MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( lSchedulerAppointments ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < SchedulerAppointmentDC > GetAllActiveSchedulerAppointments ( )
{
try
{
var lSchedulerAppointments = DAOFactory . GenericDAO . GetAllActive < SchedulerAppointment > ( ) ;
return MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( lSchedulerAppointments ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public void DeleteSchedulerAppointments ( Dictionary < long , long > pOid2Version )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < SchedulerAppointment > ( pOid2Version . Select ( n = > n . Key ) ) ;
lOriginals . DoForEach ( on = > MapperFactory . SchedulerAppointmentDCSchedulerAppointment . ConcurrencyCheck ( pOid2Version [ on . Oid . Value ] , on ) ) ;
DAOFactory . GenericDAO . Delete ( lOriginals ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < SchedulerAppointmentDC > InsertSchedulerAppointments ( IList < SchedulerAppointmentDC > pSchedulerAppointments )
{
try
{
foreach ( var item in pSchedulerAppointments )
{
try
{
item . EmployeeList . ForEach ( each = >
{
each . Employee2SchedulerAppointmentOid = null ;
each . Employee2SchedulerAppointmentVersion = null ;
each . SchedulerAppointmentOid = null ;
each . IsPChanged = false ;
each . IsPC_CheckedTs = null ;
} ) ;
var lRelations = MapperFactory . Employee2SchedulerAppointmentDC_Employee2SchedulerAppointment . MapToNewEntities ( item . EmployeeList ) ;
DAOFactory . GenericDAO . Insert ( lRelations ) ;
var neu = MapperFactory . Employee2SchedulerAppointmentDC_Employee2SchedulerAppointment . MapToNewDCs ( lRelations ) ;
item . EmployeeList = neu ;
}
catch ( Exception exception )
{
throw Utils . CreateBeWoFaultException ( exception ) ;
}
}
var lAppointments = MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewEntities ( pSchedulerAppointments ) ;
DAOFactory . GenericDAO . Insert ( lAppointments ) ;
return MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( lAppointments ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < SchedulerAppointmentDC > UpdateSchedulerAppointments ( List < SchedulerAppointmentDC > pSchedulerAppointments )
{
try
{
if ( pSchedulerAppointments . Any ( p = > p . SchedulerAppointmentOid = = null ) )
{
return new List < SchedulerAppointmentDC > ( ) ;
}
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < SchedulerAppointment > ( pSchedulerAppointments . Select ( b = > b . SchedulerAppointmentOid . Value ) ) ;
var allegleich = true ;
2017-12-22 18:09:52 -04:00
var test = pSchedulerAppointments . Where ( w = > w . SchedulerAppointmentOid . HasValue & & lOriginals . Any ( a = > a . Oid . HasValue & &
a . Oid . Value = = w . SchedulerAppointmentOid . Value & & a . RecurrenceInfo ! = null & &
w . RecurrenceInfo = = null ) )
. ToList ( ) ;
if ( test . Count > 0 )
{
var originalAppointments = lOriginals . Where ( w = > w . Oid . HasValue & & test . Select ( s = > s . SchedulerAppointmentOid . Value ) . Contains ( w . Oid . Value ) ) . ToList ( ) ;
foreach ( var modifiedException in test )
{
var original = originalAppointments . FirstOrDefault ( f = > f . Oid . Value = = modifiedException . SchedulerAppointmentOid . Value ) ;
if ( original = = null )
{
continue ;
}
if ( modifiedException . Type ! = 4 )
{
modifiedException . Type = original . Type ;
}
modifiedException . RecurrenceInfo = original . RecurrenceInfo ;
}
}
2016-06-27 01:45:38 +02:00
// Die geänderten Anwesenheiten updaten und die entfernten löschen
foreach ( var item in pSchedulerAppointments )
{
allegleich = false ;
var lNewRelations = MapperFactory . Employee2SchedulerAppointmentDC_Employee2SchedulerAppointment . MapToNewEntities ( item . EmployeeList . Where ( e2a = > e2a . Employee2SchedulerAppointmentOid = = null ) ) ;
var lOldRelations = MapperFactory . Employee2SchedulerAppointmentDC_Employee2SchedulerAppointment . MapToNewDCs ( DAOFactory . GenericDAO . LoadByIDs < Employee2SchedulerAppointment > ( item . EmployeeList . Where ( w = > w . Employee2SchedulerAppointmentOid ! = null ) . ToList ( ) . Select ( s = > s . Employee2SchedulerAppointmentOid . Value ) ) ) ;
var geaenderte = new List < Employee2SchedulerAppointmentDC > ( ) ;
foreach ( var i in lOldRelations )
{
geaenderte . AddRange ( item . EmployeeList . Where ( o = > o . Employee2SchedulerAppointmentOid = = i . Employee2SchedulerAppointmentOid & &
( o . Employee2SchedulerAppointmentVersion ! = i . Employee2SchedulerAppointmentVersion | | o . ParticipationAnswer ! = i . ParticipationAnswer | | o . IsPChanged ! = i . IsPChanged ) & &
! geaenderte . Contains ( o ) ) ) ;
}
geaenderte = UpdateEmployee2SchedulerAppointments ( geaenderte ) ;
var geloeschte = DAOFactory . SearchDAO . GetRemovedEmp2AppObjectsBySchAppOid ( item . SchedulerAppointmentOid . Value ) . Where ( g = > ! item . EmployeeList . Select ( s = > s . Employee2SchedulerAppointmentOid ) . Contains ( g . Oid ) ) ;
DAOFactory . GenericDAO . Delete ( geloeschte ) ;
DAOFactory . GenericDAO . Insert ( lNewRelations ) ;
var neu = MapperFactory . Employee2SchedulerAppointmentDC_Employee2SchedulerAppointment . MapToNewDCs ( lNewRelations ) ;
var alt = item . EmployeeList . Where ( e2a = > e2a . Employee2SchedulerAppointmentOid ! = null & & ! geaenderte . Contains ( e2a ) ) . ToList ( ) ;
alt . AddRange ( neu ) ;
alt . AddRange ( geaenderte ) ;
item . EmployeeList = alt ;
}
if ( allegleich )
{
return pSchedulerAppointments ;
}
MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MergeWithEntitys ( pSchedulerAppointments , lOriginals ) ;
DAOFactory . GenericDAO . Update ( lOriginals ) ;
return MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( lOriginals ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < ResourceAppointmentDC > GetResourceAppointmentsById ( IEnumerable < long > pOids )
{
try
{
var lAppointments = DAOFactory . GenericDAO . LoadByIDs < ResourceAppointment > ( pOids ) ;
return MapperFactory . ResourceAppointmentDC_ResourceAppointment . MapToNewDCs ( lAppointments ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < ResourceAppointmentDC > LoadPossibleDuplicates ( string pRecurrenceInfo )
{
try
{
var possibleDuplicates = DAOFactory . SearchDAO . GetResourceAppointmentExceptionsWithIndexAndId ( pRecurrenceInfo ) ;
return MapperFactory . ResourceAppointmentDC_ResourceAppointment . MapToNewDCs ( possibleDuplicates ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < SchedulerAppointmentDC > GetSchedulerAppointmentsById ( IEnumerable < long > pOids )
{
try
{
var lSchedulerAppointments = DAOFactory . GenericDAO . LoadByIDs < SchedulerAppointment > ( pOids ) ;
return MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( lSchedulerAppointments ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public SchedulerAppointmentDC GetSchedulerAppointmentByid ( long oid )
{
try
{
var lSchedulerAppointments = DAOFactory . GenericDAO . GetByID < SchedulerAppointment > ( oid ) ;
return MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDC ( lSchedulerAppointments ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public void DeactivateSchedulerAppointments ( Dictionary < long , long > pOid2Version )
{
try
{
foreach ( var kvp in pOid2Version )
2018-05-20 13:19:28 +02:00
{
ServiceLogic . SetActivationType < SchedulerAppointment > ( new Dictionary < long , long > { { kvp . Key , kvp . Value } } , ActivationTypeId . Deleted ) ;
}
2016-06-27 01:45:38 +02:00
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < SchedulerAppointmentDC > DeactivateSchedulerAppointmentsForSync ( Dictionary < long , long > pOid2Version )
{
try
{
2018-05-20 13:19:28 +02:00
/ *
* Type :
* 0 : Normal
* 1 : Pattern
* 2 : Occurence
* 3 : ChangedOccurence
* 4 : DeletedOccurence
* /
2017-12-22 18:09:52 -04:00
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < SchedulerAppointment > ( pOid2Version . Keys ) ;
if ( lOriginals . Count > 0 & & lOriginals . Any ( a = > a . Type = = 3 & & a . Oid . HasValue & & pOid2Version . Keys . Contains ( a . Oid . Value ) ) )
{
2018-05-20 13:19:28 +02:00
// Bearbeitete Serientermine werden auf "gelöscht" gesetzt
2017-12-22 18:09:52 -04:00
var originalsToUpdate = lOriginals . Where ( w = > w . Type = = 3 & & w . Oid . HasValue & & pOid2Version . Keys . Contains ( w . Oid . Value ) ) . ToList ( ) ;
foreach ( var original in originalsToUpdate )
{
original . Type = 4 ;
}
DAOFactory . GenericDAO . Update ( originalsToUpdate ) ;
var updatedAppointments = DAOFactory . GenericDAO . LoadByIDs < SchedulerAppointment > ( originalsToUpdate . Select ( s = > s . Oid . Value ) ) ;
foreach ( var appointment in updatedAppointments )
{
2018-05-20 13:19:28 +02:00
// Die auf "gelöscht" gesetzten, bearbeiteten Serientermine werden aus dem Dictionary entfernt
2017-12-22 18:09:52 -04:00
if ( appointment . Oid . HasValue & & appointment . Version . HasValue & & pOid2Version . ContainsKey ( appointment . Oid . Value ) )
{
pOid2Version . Remove ( appointment . Oid . Value ) ;
}
}
}
2019-02-12 19:43:34 +01:00
// Geänderte Serientermine werden anhand der RecurrenceId aus der Datenbank geladen und der Typ auf "gelöscht" gesetzt
//CB: Nur von Type = 1 also Root prüfen
foreach ( var org in lOriginals )
2018-05-20 13:19:28 +02:00
{
2019-02-12 19:43:34 +01:00
if ( org . Type = = 1 )
2018-05-20 13:19:28 +02:00
{
2019-02-12 19:43:34 +01:00
List < SchedulerAppointment > appointments = new List < SchedulerAppointment > ( ) ;
appointments . Add ( org ) ;
var recurrenceIds = Utils . ExtractRecurrenceIdFromRecurrenceString ( appointments ) ;
if ( recurrenceIds . Count > 0 )
2018-05-20 13:19:28 +02:00
{
2019-02-12 19:43:34 +01:00
var exceptionsToDelete = DAOFactory . SearchDAO . FindAppointmentsByRecurrenceId ( recurrenceIds ) ;
exceptionsToDelete . DoForEach ( exception = >
{
if ( exception . Oid ! = null & & exception . Version ! = null )
{
pOid2Version . AddIfNotIn ( new KeyValuePair < long , long > ( exception . Oid . Value ,
exception . Version . Value ) ) ;
}
} ) ;
2018-05-20 13:19:28 +02:00
}
2019-02-12 19:43:34 +01:00
}
2018-05-20 13:19:28 +02:00
}
2019-02-12 19:43:34 +01:00
foreach ( var kvp in pOid2Version )
2017-12-22 18:09:52 -04:00
{
ServiceLogic . SetActivationType < SchedulerAppointment > ( new Dictionary < long , long > { { kvp . Key , kvp . Value } } , ActivationTypeId . Deleted ) ;
}
2016-06-27 01:45:38 +02:00
return GetSchedulerAppointmentsById ( pOid2Version . Keys ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public Dictionary < ValueListEntryDC , List < ResourceDC > > GetAllCategories2ResourcesInDictionary ( )
{
try
{
var ressourcen = MapperFactory . ResourceDC_Resource . MapToNewDCs ( DAOFactory . GenericDAO . GetAllActive < Resource > ( ) ) ;
return ressourcen . Select ( res = > res . ResourceCategory )
. Distinct ( )
. OrderBy ( cat = > cat . TypeDescription )
. Select (
cat = >
new
{
Key = cat ,
Value = ressourcen . Where ( res = > res . ResourceCategory . Equals ( cat ) ) . OrderBy ( res = > res . Name ) . ToList ( )
} ) . ToDictionary ( a = > a . Key , a = > a . Value ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
2017-02-01 13:53:59 +01:00
public List < SchedulerAppointmentDC > GetAllOpenAppointmentsForEmployee ( long pEmployeeOid )
{
try
{
var offeneTermine = DAOFactory . SearchDAO . GetAllOpenAppointmentsForEmployee ( pEmployeeOid ) ;
offeneTermine . AddRange ( DAOFactory . SearchDAO . GetAllParticipationNotificationsForEmployee ( pEmployeeOid ) ) ;
2016-06-27 01:45:38 +02:00
2017-02-01 13:53:59 +01:00
return MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( offeneTermine ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
2016-06-27 01:45:38 +02:00
public List < Employee2SchedulerAppointmentDC > InsertEmployee2SchedulerAppointments ( IEnumerable < Employee2SchedulerAppointmentDC > pEmployee2SchedulerAppointments )
{
try
{
var lRelations = MapperFactory . Employee2SchedulerAppointmentDC_Employee2SchedulerAppointment . MapToNewEntities ( pEmployee2SchedulerAppointments ) ;
DAOFactory . GenericDAO . Insert ( lRelations ) ;
return MapperFactory . Employee2SchedulerAppointmentDC_Employee2SchedulerAppointment . MapToNewDCs ( lRelations ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < Employee2SchedulerAppointmentDC > UpdateEmployee2SchedulerAppointments ( List < Employee2SchedulerAppointmentDC > pEmployee2SchedulerAppointments )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < Employee2SchedulerAppointment > ( pEmployee2SchedulerAppointments . Select ( b = > b . Employee2SchedulerAppointmentOid . Value ) ) ;
foreach ( var item in pEmployee2SchedulerAppointments )
item . IsPChanged = item . ParticipationAnswer ! = lOriginals . Find ( f = > f . Oid = = item . Employee2SchedulerAppointmentOid ) . ParticipationAnswer ;
MapperFactory . Employee2SchedulerAppointmentDC_Employee2SchedulerAppointment . MergeWithEntitys ( pEmployee2SchedulerAppointments , lOriginals ) ;
DAOFactory . GenericDAO . Update ( lOriginals ) ;
return MapperFactory . Employee2SchedulerAppointmentDC_Employee2SchedulerAppointment . MapToNewDCs ( lOriginals ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public void DeleteEmployee2SchedulerAppointments ( Dictionary < long , long > pOid2Version )
{
try
{
var lOriginals = DAOFactory . GenericDAO . LoadByIDs < Employee2SchedulerAppointment > ( pOid2Version . Select ( e = > e . Key ) ) ;
lOriginals . DoForEach ( or = > MapperFactory . Employee2SchedulerAppointmentDC_Employee2SchedulerAppointment . ConcurrencyCheck ( pOid2Version [ or . Oid . Value ] , or ) ) ;
DAOFactory . GenericDAO . Delete ( lOriginals ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < SchedulerAppointmentDC > GetAllActiveAndNotDeclinedForEmployeeAppointments ( long pEmployeeOid )
{
try
{
var blubb = DAOFactory . SearchDAO . GetAllActiveAndNotDeclinedForEmployeeAppointments ( pEmployeeOid ) ;
return MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( blubb ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public bool OverlappingAppointmentsExist ( DateTime start , DateTime end , List < long > employees , List < long > customers , List < long > resources , long originator , long? appointmentOid , string recurrenceId = "" , int ocurrenceIndex = 0 )
{
try
{
return DAOFactory . SearchDAO . OverlappingAppointmentsExist ( start , end , employees , customers , resources , originator , appointmentOid , recurrenceId , ocurrenceIndex ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
public List < SchedulerAppointmentDC > GetAllActiveAppointmentsForEmployeeInInterval ( DateTime start , DateTime end , long pEmployeeOid )
{
return GetAllActiveAppointmentsForEmployeeInInterval2 ( start , end , pEmployeeOid , false ) ;
}
2018-01-29 12:57:10 +01:00
// TODO: veraltet
2017-08-23 17:17:08 +02:00
public List < SchedulerAppointmentDC > GetAllActiveAppointmentsForEmployeeInInterval2 ( DateTime pStart , DateTime pEnd , long pEmployeeOid , bool pHasRightToSeeAllEmployeeAppointments )
2016-06-27 01:45:38 +02:00
{
try
{
var apps = pHasRightToSeeAllEmployeeAppointments ?
2017-08-23 17:17:08 +02:00
DAOFactory . SearchDAO . GetAllActiveAppointmentsInInterval ( pStart , pEnd ) :
DAOFactory . SearchDAO . GetAllActiveAppointmentsForEmployeeInInterval ( pStart , pEnd , pEmployeeOid ) ;
2016-06-27 01:45:38 +02:00
return MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( apps ) . OrderBy ( a = > a . StartDate ) . ToList ( ) ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
2017-08-23 17:17:08 +02:00
public List < AbsenceTimeDC > GetAllActiveAbsenceTimesInInterval ( DateTime pStart , DateTime pEnd , long pEmployeeOid , bool pHasRightToSeeAllEmployeeAppointments )
{
try
{
2017-08-28 16:41:19 +02:00
var absenceTimes = DAOFactory . SearchDAO . GetAllAbsenceTimesInIntervalByEmployee ( pStart , pEnd , pEmployeeOid , pHasRightToSeeAllEmployeeAppointments ) ;
2019-02-12 19:43:34 +01:00
var dcList = MapperFactory . AbsenceTimeDC_AbsenceTime . MapToNewDCs ( absenceTimes ) ;
foreach ( var at in dcList )
{
if ( at . End . HasValue )
{
at . End = at . End . Value . Date . AddDays ( 1 ) . AddTicks ( - 1 ) ;
}
}
return dcList . OrderBy ( a = > a . Start ) . ToList ( ) ;
2017-08-23 17:17:08 +02:00
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
2017-12-12 17:20:23 -04:00
2019-01-05 17:03:44 -04:00
public List < SchedulerAppointmentDC > LoadFilteredAppointmentsMitAufgaben ( bool pHasRightToSeeAllEmployeeAppointments , long pEmployeeOid , DateTime pIntervalStart , DateTime pIntervalEnd , List < long > pSelectedEmployees , List < long > pSelectedCustomer , List < long > pSelectedResources , bool pEmployeesOnly , bool pCustomersOnly , bool pResourcesOnly , bool pPrivateAppointmentsOnly , bool pOnlyMyAppointments , bool pShowTasks )
{
try
{
long? ownerOid = null ;
//Keine Auswahl getroffen: Nur meine Termine anzeigen
if ( ( pSelectedEmployees = = null | | pSelectedEmployees . Count = = 0 ) & & ( pSelectedCustomer = = null | | pSelectedCustomer . Count = = 0 ) & & ( pSelectedResources = = null | | pSelectedResources . Count = = 0 ) )
{
ownerOid = pEmployeeOid ;
}
//Benutzer hat sich selber selektiert
if ( pSelectedEmployees ! = null & & pSelectedEmployees . Exists ( e = > e = = pEmployeeOid ) )
{
ownerOid = pEmployeeOid ;
}
//Man hat nur Customer und/oder Resourcen ausgewählt, dann dürfen die eigenen nicht angezeigt werden
if ( ( pSelectedEmployees = = null | | pSelectedEmployees . Count = = 0 ) & &
( pSelectedCustomer ! = null & & pSelectedCustomer . Count > 0 | |
pSelectedResources ! = null & & pSelectedResources . Count > 0 ) )
{
ownerOid = null ;
}
//Wenn man kein Recht hat alle zu sehen, muss immer auf Owner gefiltert werden
if ( ! pHasRightToSeeAllEmployeeAppointments )
{
ownerOid = pEmployeeOid ;
}
if ( ! ( ! pHasRightToSeeAllEmployeeAppointments & & pSelectedEmployees ! = null & & pSelectedEmployees . Count = = 1 & & pSelectedEmployees . Contains ( pEmployeeOid ) ) )
{
//Rausnehmen, sonst werden Termine nicht gezeigt, bei denen man Owner ist und kein Employee ausgewählt wurde.
//Wird nicht rausgenommen, wenn man die Termine anderer Mitarbeiter nicht sehen darf und "nur meine Termine" ausgewählt hat.
//Sonst werden die Filter mit and und nicht mit or verknüpft.
pSelectedEmployees ? . Remove ( pEmployeeOid ) ;
}
if ( pPrivateAppointmentsOnly & & ( pSelectedEmployees = = null | | pSelectedEmployees . Count = = 0 ) & & ( pSelectedCustomer = = null | | pSelectedCustomer . Count = = 0 ) & & ( pSelectedResources = = null | | pSelectedResources . Count = = 0 ) & & ! ( pSelectedEmployees = = null | | pSelectedEmployees . Count = = 0 ) & &
( pSelectedCustomer ! = null & & pSelectedCustomer . Count > 0 | |
pSelectedResources ! = null & & pSelectedResources . Count > 0 ) )
{
ownerOid = pEmployeeOid ;
}
var appointments = DAOFactory . SearchDAO . LoadFilteredAppointmentsForEmployee ( pHasRightToSeeAllEmployeeAppointments , ownerOid , pIntervalStart , pIntervalEnd , pSelectedEmployees , pSelectedCustomer , pSelectedResources , pEmployeesOnly , pCustomersOnly , pResourcesOnly , pPrivateAppointmentsOnly , pOnlyMyAppointments , false ) . ToList ( ) ;
var all = MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( appointments ) . OrderBy ( a = > a . StartDate ) . ToList ( ) ;
var filteredEmployeeOids = new List < long > ( ) ;
if ( ownerOid . HasValue )
{
filteredEmployeeOids . Add ( ownerOid . Value ) ;
}
if ( pSelectedEmployees ! = null )
{
foreach ( var empOid in pSelectedEmployees )
{
filteredEmployeeOids . Add ( empOid ) ;
}
}
var result = FilterAppointments ( all , pEmployeeOid , filteredEmployeeOids , pSelectedCustomer , pSelectedResources , pCustomersOnly , pResourcesOnly , pShowTasks ) ;
//Check fehlerhaftes RecurrenceInfos
foreach ( var app in result )
{
if ( ! IsNullOrEmpty ( app . RecurrenceInfo ) )
{
if ( app . RecurrenceInfo . Contains ( "WeekDays=\"0\"" ) )
{
app . RecurrenceInfo = app . RecurrenceInfo . Replace ( "WeekDays=\"0\"" , "WeekDays=\"2\"" ) ;
}
}
}
// Ausnahmen immer laden. Entsprechen die Ausnahmen nicht den Filterkriterien, werden sie als gelöscht markiert, um nicht auf dem Client angezeigt zu werden.
var ausnahmen = MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( DAOFactory . SearchDAO . FindAppointmentsByRecurrenecInfo ( result . Where ( w = > w . Type = = 1 ) . Select ( s = > s . RecurrenceInfo ) . ToList ( ) , true ) ) ;
var demFilterEntsprechendeTermine = FilterAppointments ( ausnahmen , pEmployeeOid , filteredEmployeeOids , pSelectedCustomer , pSelectedResources , pCustomersOnly , pResourcesOnly , pShowTasks ) ;
foreach ( var appointment in ausnahmen . Where ( w = > ! demFilterEntsprechendeTermine . Contains ( w ) ) )
{
var kosmetisch = new SchedulerAppointmentDC
{
SchedulerAppointmentOid = appointment . SchedulerAppointmentOid * - 1 ,
NewSchedulerAppointmentVersion = 1 ,
Type = 4 ,
RecurrenceInfo = appointment . RecurrenceInfo ,
EmployeeList = appointment . EmployeeList ,
CustomerList = appointment . CustomerList ,
ResourceList = appointment . ResourceList ,
Originator = appointment . Originator
} ;
result . Add ( kosmetisch ) ;
}
return result ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
2017-12-12 17:20:23 -04:00
public List < SchedulerAppointmentDC > LoadFilteredAppointments ( bool pHasRightToSeeAllEmployeeAppointments , long pEmployeeOid , DateTime pIntervalStart , DateTime pIntervalEnd , List < long > pSelectedEmployees , List < long > pSelectedCustomer , List < long > pSelectedResources , bool pEmployeesOnly , bool pCustomersOnly , bool pResourcesOnly , bool pPrivateAppointmentsOnly , bool pOnlyMyAppointments )
{
try
{
2017-12-18 17:53:54 +01:00
long? ownerOid = null ;
//Keine Auswahl getroffen: Nur meine Termine anzeigen
if ( ( pSelectedEmployees = = null | | pSelectedEmployees . Count = = 0 ) & & ( pSelectedCustomer = = null | | pSelectedCustomer . Count = = 0 ) & & ( pSelectedResources = = null | | pSelectedResources . Count = = 0 ) )
{
ownerOid = pEmployeeOid ;
}
2018-10-24 19:32:12 +02:00
2017-12-18 17:53:54 +01:00
//Benutzer hat sich selber selektiert
if ( pSelectedEmployees ! = null & & pSelectedEmployees . Exists ( e = > e = = pEmployeeOid ) )
{
ownerOid = pEmployeeOid ;
}
2018-10-24 19:32:12 +02:00
2017-12-18 17:53:54 +01:00
//Man hat nur Customer und/oder Resourcen ausgewählt, dann dürfen die eigenen nicht angezeigt werden
if ( ( pSelectedEmployees = = null | | pSelectedEmployees . Count = = 0 ) & &
2017-12-22 18:09:52 -04:00
( pSelectedCustomer ! = null & & pSelectedCustomer . Count > 0 | |
pSelectedResources ! = null & & pSelectedResources . Count > 0 ) )
2017-12-18 17:53:54 +01:00
{
ownerOid = null ;
}
2018-10-24 19:32:12 +02:00
2017-12-18 17:53:54 +01:00
//Wenn man kein Recht hat alle zu sehen, muss immer auf Owner gefiltert werden
if ( ! pHasRightToSeeAllEmployeeAppointments )
{
ownerOid = pEmployeeOid ;
}
2017-12-22 18:09:52 -04:00
if ( ! ( ! pHasRightToSeeAllEmployeeAppointments & & pSelectedEmployees ! = null & & pSelectedEmployees . Count = = 1 & & pSelectedEmployees . Contains ( pEmployeeOid ) ) )
{
2018-05-20 13:19:28 +02:00
//Rausnehmen, sonst werden Termine nicht gezeigt, bei denen man Owner ist und kein Employee ausgewählt wurde.
//Wird nicht rausgenommen, wenn man die Termine anderer Mitarbeiter nicht sehen darf und "nur meine Termine" ausgewählt hat.
//Sonst werden die Filter mit and und nicht mit or verknüpft.
2017-12-22 18:09:52 -04:00
pSelectedEmployees ? . Remove ( pEmployeeOid ) ;
}
2017-12-18 17:53:54 +01:00
2017-12-18 19:16:43 -04:00
if ( pPrivateAppointmentsOnly & & ( pSelectedEmployees = = null | | pSelectedEmployees . Count = = 0 ) & & ( pSelectedCustomer = = null | | pSelectedCustomer . Count = = 0 ) & & ( pSelectedResources = = null | | pSelectedResources . Count = = 0 ) & & ! ( pSelectedEmployees = = null | | pSelectedEmployees . Count = = 0 ) & &
( pSelectedCustomer ! = null & & pSelectedCustomer . Count > 0 | |
pSelectedResources ! = null & & pSelectedResources . Count > 0 ) )
{
ownerOid = pEmployeeOid ;
}
2018-04-27 14:13:42 +02:00
2018-05-20 13:19:28 +02:00
var appointments = DAOFactory . SearchDAO . LoadFilteredAppointmentsForEmployee ( pHasRightToSeeAllEmployeeAppointments , ownerOid , pIntervalStart , pIntervalEnd , pSelectedEmployees , pSelectedCustomer , pSelectedResources , pEmployeesOnly , pCustomersOnly , pResourcesOnly , pPrivateAppointmentsOnly , pOnlyMyAppointments , false ) . ToList ( ) ;
2018-01-08 22:29:10 +01:00
2018-04-27 14:13:42 +02:00
var all = MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( appointments ) . OrderBy ( a = > a . StartDate ) . ToList ( ) ;
2018-01-08 22:29:10 +01:00
2018-10-24 19:32:12 +02:00
var filteredEmployeeOids = new List < long > ( ) ;
2018-04-27 14:13:42 +02:00
if ( ownerOid . HasValue )
{
filteredEmployeeOids . Add ( ownerOid . Value ) ;
}
if ( pSelectedEmployees ! = null )
{
foreach ( var empOid in pSelectedEmployees )
{
filteredEmployeeOids . Add ( empOid ) ;
}
}
2018-10-24 19:32:12 +02:00
var result = FilterAppointments ( all , pEmployeeOid , filteredEmployeeOids , pSelectedCustomer , pSelectedResources , pCustomersOnly , pResourcesOnly ) ;
//Check fehlerhaftes RecurrenceInfos
foreach ( var app in result )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
if ( ! IsNullOrEmpty ( app . RecurrenceInfo ) )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
if ( app . RecurrenceInfo . Contains ( "WeekDays=\"0\"" ) )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
app . RecurrenceInfo = app . RecurrenceInfo . Replace ( "WeekDays=\"0\"" , "WeekDays=\"2\"" ) ;
2018-04-27 14:13:42 +02:00
}
}
2018-10-24 19:32:12 +02:00
}
// Ausnahmen immer laden. Entsprechen die Ausnahmen nicht den Filterkriterien, werden sie als gelöscht markiert, um nicht auf dem Client angezeigt zu werden.
var ausnahmen = MapperFactory . SchedulerAppointmentDCSchedulerAppointment . MapToNewDCs ( DAOFactory . SearchDAO . FindAppointmentsByRecurrenecInfo ( result . Where ( w = > w . Type = = 1 ) . Select ( s = > s . RecurrenceInfo ) . ToList ( ) , true ) ) ;
var demFilterEntsprechendeTermine = FilterAppointments ( ausnahmen , pEmployeeOid , filteredEmployeeOids , pSelectedCustomer , pSelectedResources , pCustomersOnly , pResourcesOnly ) ;
foreach ( var appointment in ausnahmen . Where ( w = > ! demFilterEntsprechendeTermine . Contains ( w ) ) )
{
var kosmetisch = new SchedulerAppointmentDC
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
SchedulerAppointmentOid = appointment . SchedulerAppointmentOid * - 1 ,
NewSchedulerAppointmentVersion = 1 ,
Type = 4 ,
RecurrenceInfo = appointment . RecurrenceInfo ,
EmployeeList = appointment . EmployeeList ,
CustomerList = appointment . CustomerList ,
ResourceList = appointment . ResourceList ,
Originator = appointment . Originator
} ;
result . Add ( kosmetisch ) ;
}
return result ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
2019-01-05 17:03:44 -04:00
private static List < SchedulerAppointmentDC > FilterAppointments ( IEnumerable < SchedulerAppointmentDC > pAppointments , long pEmployeeOid , ICollection < long > pFilteredEmployeeOids , ICollection < long > pSelectedCustomers , ICollection < long > pSelectedResources , bool pCustomersOnly , bool pResourcesOnly , bool pShowTasks = false )
2018-10-24 19:32:12 +02:00
{
var result = new List < SchedulerAppointmentDC > ( ) ;
foreach ( var app in pAppointments )
{
var add = true ;
if ( app . Originator ! = null & & app . Originator . EmployeeOid = = pEmployeeOid )
{
if ( app . EmployeeList ! = null & & app . EmployeeList . Count > 0 )
{
add = false ;
foreach ( var emp in app . EmployeeList )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
if ( pFilteredEmployeeOids . Contains ( emp . Employee . EmployeeOid ) )
2018-04-27 14:13:42 +02:00
{
add = true ;
}
}
}
2018-10-24 19:32:12 +02:00
}
//Prüfe Klientenfilter
if ( ! add )
{
if ( app . CustomerList ! = null & & app . CustomerList . Count > 0 )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
if ( pCustomersOnly )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
add = true ;
}
else if ( pSelectedCustomers ! = null & & pSelectedCustomers . Count > 0 )
{
foreach ( var cust in app . CustomerList )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
if ( pSelectedCustomers . Contains ( cust . CustomerOid ) )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
add = true ;
2018-04-27 14:13:42 +02:00
}
}
}
}
}
2018-10-24 19:32:12 +02:00
//Prüfe Ressourcenfilter
if ( ! add )
2018-05-21 16:39:24 +02:00
{
2018-10-24 19:32:12 +02:00
if ( app . ResourceList ! = null & & app . ResourceList . Count > 0 )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
if ( pResourcesOnly )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
add = true ;
}
else if ( pSelectedResources ! = null & & pSelectedResources . Count > 0 )
{
foreach ( var res in app . ResourceList )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
if ( pSelectedResources . Contains ( res . ResourceOid . Value ) )
2018-04-27 14:13:42 +02:00
{
2018-10-24 19:32:12 +02:00
add = true ;
2018-04-27 14:13:42 +02:00
}
}
}
}
}
2019-01-05 17:03:44 -04:00
if ( app . IsTask & & ! pShowTasks )
2018-05-21 16:39:24 +02:00
{
2019-01-05 17:03:44 -04:00
add = false ;
}
2018-10-24 19:32:12 +02:00
if ( add )
{
result . Add ( app ) ;
2018-05-21 16:39:24 +02:00
}
2017-12-12 17:20:23 -04:00
}
2018-10-24 19:32:12 +02:00
return result ;
2017-12-12 17:20:23 -04:00
}
2016-06-27 01:45:38 +02:00
}
}