Files
BeWoPlaner/ReportImp/SHKServiceSBD/Reports/AbweichungenArbeitszeitReport.cs

342 lines
11 KiB
C#

using System;
using System.Linq;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Data.Entities;
using BeWo.Data.Access;
using System.Collections.Generic;
using BS.Shared;
using BS.Shared.Core;
using DevExpress.XtraPrinting;
namespace SHKServiceSBD.Reports
{
[IDSpecificClass(Identifier = "AbweichungenArbeitszeitReport")]
public partial class AbweichungenArbeitszeitReport : DevExpress.XtraReports.UI.XtraReport, IBeWoReport<QueryRO>
{
public AbweichungenArbeitszeitReport()
{
InitializeComponent();
}
public void SetReportDataSource(QueryRO pRO)
{
this.bindingSource1.DataSource = CreateDataSource(pRO);
}
private QueryRO CreateDataSource(QueryRO ro)
{
QueryRO newQueryRo = new QueryRO();
DateTime start = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
DateTime ende = start.AddMonths(1).AddTicks(-1);
if (ro.Rows != null && ro.Rows.Count > 0)
{
if (ro.Rows[0].Field1 != null)
{
if (DateTime.TryParse(ro.Rows[0].Field1.ToString(), out var dt))
{
if (dt > DateTime.MinValue)
{
start = dt;
}
}
}
if (ro.Rows[0].Field2 != null)
{
if (DateTime.TryParse(ro.Rows[0].Field2.ToString(), out var dt))
{
if (dt < DateTime.MaxValue.Date)
{
ende = dt;
}
}
}
}
lblZeitraum.Text = String.Format("{0:dd.MM.yyyy}-{1:dd.MM.yyyy}", start, ende);
var span = new DateTimeSpan(start, ende);
span.EndDateTime = ende;
var allEmps = DAOFactory.GenericDAO.GetAllActive<Employee>().OrderBy(e => e.Person.LastNameFirstName);
var allRecords = DAOFactory.SearchDAO.FindServiceRecordsInSpan(span, null);
Dictionary<long, IList<ServiceRecord>> empOid2Records = new Dictionary<long, IList<ServiceRecord>>();
foreach (var sr in allRecords)
{
if (sr.EmployeeOid.HasValue)
{
if (!empOid2Records.ContainsKey(sr.EmployeeOid.Value))
{
empOid2Records.Add(sr.EmployeeOid.Value, new List<ServiceRecord>());
}
empOid2Records[sr.EmployeeOid.Value].Add(sr);
}
}
List<AbweichungenArbeitszeitRow> alleAbweichungen = new List<AbweichungenArbeitszeitRow>();
foreach (var emp in allEmps)
{
if (empOid2Records.ContainsKey(emp.Oid.Value))
{
alleAbweichungen.AddRange(ErstelleAbweichungen(emp, empOid2Records[emp.Oid.Value], start, ende));
}
}
foreach (var abw in alleAbweichungen)
{
QueryRO.Row row = new QueryRO.Row();
row.Field1 = String.Format("{0}", abw.Employee.Person.LastNameFirstName);
row.Field2 = String.Format("{0}", abw.Employee.PersonnelNumber);
row.Field3 = String.Format("{0:dd.MM.yyyy} Keine Arbeitszeit eingetragen", abw.Datum);
if (abw.ArbeitszeitStart > DateTime.MinValue && abw.ArbeitszeitEnde > DateTime.MinValue)
{
if (abw.ArbeitszeitStart.Second > 0 && abw.ArbeitszeitEnde.Second > 0)
{
row.Field3 = String.Format("{0:dd.MM.yyyy}", abw.ArbeitszeitStart);
}
else
{
row.Field3 = String.Format("{0:dd.MM.yyyy HH:mm}-{1:HH:mm}", abw.ArbeitszeitStart, abw.ArbeitszeitEnde);
}
}
row.Field4 = String.Format("{0}", abw.ArbeitszeitNotice);
if (abw.Customer != null)
{
row.Field5 = String.Format("{0}", abw.Customer.Person.FirstNameLastName);
}
row.Field6 = String.Format("{0}", abw.Betreuungszeit);
row.Field7 = String.Format("{0}", abw.ServiceRecordNotice);
row.Field8 = String.Format("{0}", abw.IstVertretung ? "x" : "");
row.Field9 = String.Format("{0}, {1:yyyyMMdd}", row.Field1, abw.Datum); // zum Sortieren
newQueryRo.Rows.Add(row);
}
newQueryRo.Rows.Sort((a, b) => a.Field9.ToString().CompareTo(b.Field9));
return newQueryRo;
}
private List<AbweichungenArbeitszeitRow> ErstelleAbweichungen(Employee emp, IList<ServiceRecord> records, DateTime start, DateTime ende)
{
var result = new List<AbweichungenArbeitszeitRow>();
var betreuteKlienten = new List<Customer>();
foreach (var e2c in emp.Employee2CustomerList.Where(e => e.IsActive == ActivationTypeId.Active
&& (!e.StartDate.HasValue || e.StartDate.Value.Date <= ende.Date)
&& (!e.EndDate.HasValue || e.EndDate.Value.Date >= start.Date)
&& e.ValueList.Any(v => v.Entry.Type == ValueListEntryType.StaffRoleType)))
{
betreuteKlienten.Add(e2c.Customer);
}
var arbeitszeiten = records.Where(r => !r.CostBearer2SupportConceptOid.HasValue).OrderBy(r => r.Start).ToList();
var klientenRecords = records.Where(r => r.CustomerOid.HasValue).OrderBy(r => r.Start).ToList();
var oid2Customer = new Dictionary<long, Customer>();
var customer2Arbeitszeit = new Dictionary<long, Arbeitszeit>();
var infoList = new List<ArbeitstagInfo>();
DateTime dtIter = start.Date;
//Erstelle für jeden Tag ein Info Objekt
while (dtIter <= ende.Date)
{
ArbeitstagInfo info = new ArbeitstagInfo();
info.Datum = dtIter;
info.Employee = emp;
info.ArbeitszeitRecords = arbeitszeiten.Where(r => r.Start.Value.Date == dtIter).ToList();
info.NachKlientenGruppierteRecords = GruppiereRecordsNachCustomer(klientenRecords.Where(r => r.Start.Value.Date == dtIter).ToList());
if (info.NachKlientenGruppierteRecords.Count == 0)
{
foreach (var c in betreuteKlienten)
{
info.NachKlientenGruppierteRecords.Add(c.Oid.Value, new List<ServiceRecord>());
}
}
foreach (var coid in info.NachKlientenGruppierteRecords.Keys)
{
if (!oid2Customer.ContainsKey(coid))
{
var customer = DAOFactory.GenericDAO.LoadByID<Customer>(coid);
oid2Customer.Add(coid, customer);
customer2Arbeitszeit.Add(coid, ReportHelper.GetArbeitszeit(customer, start, ende));
}
}
infoList.Add(info);
dtIter = dtIter.AddDays(1);
}
//Erstelle Abweichungen wenn die Arbeitszeit nicht mit den Betreuungszeiten des Klienten übereinstimmt
foreach (var item in infoList)
{
if (item.NachKlientenGruppierteRecords.Count > 0)
{
foreach (var coid in item.NachKlientenGruppierteRecords.Keys)
{
if (item.NachKlientenGruppierteRecords[coid].Count > 0 || item.ArbeitszeitRecords.Count > 0)
{
var abweichungen = ErstelleAbweichungenFuerTag(item, oid2Customer[coid], customer2Arbeitszeit[coid]);
result.AddRange(abweichungen);
}
}
}
}
//Setze ob der Einsatz in Vertretung war. Das ist dann der Fall, wenn der betreute Klient nicht der eigenen Hauptbetreuung zugeordnet ist.
foreach (var abw in result)
{
if (abw.Customer != null && betreuteKlienten.Count(c => c.Oid == abw.Customer.Oid) == 0)
{
abw.IstVertretung = true;
}
}
return result;
}
private List<AbweichungenArbeitszeitRow> ErstelleAbweichungenFuerTag(ArbeitstagInfo info, Customer customer, Arbeitszeit betreuungszeiten)
{
var result = new List<AbweichungenArbeitszeitRow>();
//Berechne geplante Betreuungszeit des Kindes an diesem Tag
var bzStart = DateTime.MaxValue;
var bzEnde = DateTime.MinValue;
if (betreuungszeiten != null)
{
foreach (var ae in betreuungszeiten.ArbeitszeitEintraege)
{
if (ReportHelper.IstAmGleichenWochentag(ae, info.Datum))
{
String dateStr1 = String.Format("{0:dd.MM.yyyy} {1}", info.Datum, ae.UhrzeitVon);
String dateStr2 = String.Format("{0:dd.MM.yyyy} {1}", info.Datum, ae.UhrzeitBis);
DateTime date1;
DateTime date2;
if (DateTime.TryParse(dateStr1, out date1) && DateTime.TryParse(dateStr2, out date2))
{
if (date1 < bzStart)
{
bzStart = date1;
}
if (date2 > bzEnde)
{
bzEnde = date2;
}
}
}
}
}
String betreuungszeit = "Nicht vorhanden";
if (bzStart < DateTime.MaxValue && bzEnde > DateTime.MinValue)
{
betreuungszeit = String.Format("{0:HH:mm}-{1:HH:mm}", bzStart, bzEnde);
}
String serviceRecordNotice = "";
foreach (var item in info.NachKlientenGruppierteRecords[customer.Oid.Value])
{
if (!String.IsNullOrEmpty(item.Notice))
{
if (serviceRecordNotice.Length > 0)
{
serviceRecordNotice += "; ";
}
serviceRecordNotice += item.Notice;
}
}
if (info.ArbeitszeitRecords.Count == 0)
{
result.Add(new AbweichungenArbeitszeitRow { Datum = info.Datum, Employee = info.Employee, Customer = customer, Betreuungszeit = betreuungszeit, ServiceRecordNotice = serviceRecordNotice });
}
if (info.Employee.Person.FirstName == "Agnes")
{
int test = 0;
}
foreach (var azRecord in info.ArbeitszeitRecords)
{
//Mitarbeiter Arbeitszeit an diesem Tag
var azStart = azRecord.Start.Value;
var azEnde = azRecord.End.Value;
//Arbeitszeit muss gleich der geplanten Betreuungszeit sein, sonst muss die Abweichung im Report angezeigt werden
if (azStart != bzStart || azEnde != bzEnde)
{
var abw = new AbweichungenArbeitszeitRow();
abw.Datum = info.Datum;
abw.Employee = info.Employee;
abw.Customer = customer;
abw.ArbeitszeitStart = azStart;
abw.ArbeitszeitEnde = azEnde;
abw.ArbeitszeitNotice = azRecord.Notice;
abw.Betreuungszeit = betreuungszeit;
abw.ServiceRecordNotice = serviceRecordNotice;
result.Add(abw);
}
}
return result;
}
private Dictionary<long, IList<ServiceRecord>> GruppiereRecordsNachCustomer(IList<ServiceRecord> records)
{
var dict = new Dictionary<long, IList<ServiceRecord>>();
foreach (var sr in records)
{
if (!dict.ContainsKey(sr.CustomerOid.Value))
{
dict.Add(sr.CustomerOid.Value, new List<ServiceRecord>());
}
dict[sr.CustomerOid.Value].Add(sr);
}
return dict;
}
class ArbeitstagInfo
{
public IList<ServiceRecord> ArbeitszeitRecords { get; set; }
public Employee Employee { get; internal set; }
public Dictionary<long, IList<ServiceRecord>> NachKlientenGruppierteRecords { get; internal set; }
public DateTime Datum { get; internal set; }
}
class AbweichungenArbeitszeitRow
{
public DateTime Datum { get; set; }
public Employee Employee { get; set; }
public Customer Customer { get; set; }
public DateTime ArbeitszeitStart { get; set; }
public DateTime ArbeitszeitEnde { get; set; }
public String ArbeitszeitNotice { get; set; }
public String Betreuungszeit { get; set; }
public String ServiceRecordNotice { get; set; }
public bool IstVertretung { get; set; }
}
}
}