Files
BeWoPlaner/ReportImp/LebenshilfeStadeMID/LeistungsnachweisSbd.cs
2024-11-21 13:02:51 +01:00

178 lines
7.7 KiB
C#

using System;
using System.Collections.Generic;
using BeWo.Report.ReportObjects;
using BeWo.Report;
using DevExpress.XtraReports.UI;
using System.Data;
using BS.Shared.Core;
using BeWo.Service.DCEntityMapper;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using System.Linq;
using BS.Shared.DataContracts;
namespace LebenshilfeStadeMID
{
public partial class LeistungsnachweisSbd : DevExpress.XtraReports.UI.XtraReport, IBeWoReport<SbdStundenaufstellungRO>
{
public LeistungsnachweisSbd()
{
InitializeComponent();
}
public void SetReportDataSource(SbdStundenaufstellungRO pRO)
{
double summeVerfuegungszeit = 0;
double summeZusatzleistung = 0;
if (pRO.Services != null)
{
var customer = MapperFactory.CustomerDC_Customer.MapToNewDC(DAOFactory.GenericDAO.GetByID<Customer>(pRO.CustomerOid));
if (customer.RelatedEmployees != null && customer.RelatedEmployees.Count > 0)
{
var vertretung = customer.RelatedEmployees.FirstOrDefault(e => e.RelationRole.DisplayName == "Vertretung");
if (vertretung != null)
lblVertretung.Text = vertretung.Employee.FirstNameLastName;
}
// Im Beleg muss jede Klienten- und Mitarbeiterabwesenheit dargestellt werden, egal ob da ein Termin stattgefunden hat oder nicht
// Klientenabwesenheiten markieren bzw. hinzufügen
pRO = MarkiereAbwesenheiten(customer, pRO);
List<ServicesOverviewRO.ServiceDetail> servicesBillable = new List<ServicesOverviewRO.ServiceDetail>();
foreach (var sd in pRO.Services)
{
sd.Notice = "";sd.Notice2 = "";sd.Notice4 = "";
if (sd.ServiceDescription != null && sd.ServiceDescription.ToLower().Contains("verfügungszeit"))
{
sd.Notice = string.Format("{0:0}", sd.Minutes);
summeVerfuegungszeit += sd.Minutes;
}
else if (sd.ServiceDescription != null && sd.ServiceDescription.ToLower().Contains("bewilligte zusatzleistung"))
{
sd.Notice2 = string.Format("{0:0}", sd.Minutes);
summeZusatzleistung += sd.Minutes;
}
}
}
tcSumVerfuegungszeit.Text = string.Format("{0:0}", summeVerfuegungszeit);
tcSumZusatzleistung.Text = string.Format("{0:0}", summeZusatzleistung);
this.bindingSource1.DataSource = pRO;
}
private SbdStundenaufstellungRO MarkiereAbwesenheiten(CustomerDC customer, SbdStundenaufstellungRO pRO)
{
pRO = ErstelleAbwesenheitenFuerKlienten(customer, pRO);
//pRO = ErstelleAbwesenheitenFuerMitarbeiter(customer, pRO);
return pRO;
}
private SbdStundenaufstellungRO ErstelleAbwesenheitenFuerKlienten(CustomerDC customer, SbdStundenaufstellungRO pRO)
{
foreach (var abs in pRO.Abwesenheiten)
{
var ende = abs.End.HasValue ? abs.End.Value : pRO.EndDate;
var start = new DateTime(abs.Start.Value.Year, abs.Start.Value.Month, abs.Start.Value.Day);
// Jeden Abwesenheitstag durchlaufen
while (start <= ende)
{
var services = pRO.Services.Where(s => s.StartDate.Date == start.Date).ToList();
if (services != null)
{
// Gibt es am Abwesenheitstag einen Termin, einfach x setzen
if (services.Count > 0)
{
foreach (var service in services)
{
if (abs.Reason.Description.ToLower().Contains("krank"))
service.Notice4 = "x";
}
}
// Gibt es keinen Termin, neuen Tag erzeugen und nur Datum und x setzen
else
{
pRO.Services.Add(new SbdStundenaufstellungRO.SbdServiceDetail()
{
StartDate = new DateTime(start.Year, start.Month, start.Day),
Notice4 = "x",
ServiceCategory = "",
ServiceDescription = "",
IsBillable = true
});
}
}
start = start.AddDays(1);
}
}
return pRO;
}
private ServicesOverviewRO ErstelleAbwesenheitenFuerMitarbeiter(CustomerDC customer, ServicesOverviewRO pRO)
{
// Mitarbeiterabwesenheiten markieren bzw. hinzufügen
if (customer.RelatedEmployees != null && customer.RelatedEmployees.Count > 0)
{
var mainAttendant = customer.RelatedEmployees.FirstOrDefault(e => e.RelationRole.DisplayName == "Hauptbetreuung");
if (mainAttendant != null)
{
var employee = MapperFactory.EmployeeDC_Employee.MapToNewDC(DAOFactory.GenericDAO.GetByID<Employee>(mainAttendant.Employee.EmployeeOid));
employee.AbsenceTimes = employee.AbsenceTimes
.Where(a => a.Start >= pRO.StartDate && a.Start <= pRO.EndDate || a.End >= pRO.StartDate && a.End <= pRO.EndDate)
.OrderBy(a => a.Start).ToList();
foreach (var abs in employee.AbsenceTimes)
{
var ende = abs.End.HasValue ? abs.End.Value : pRO.EndDate;
var start = new DateTime(abs.Start.Value.Year, abs.Start.Value.Month, abs.Start.Value.Day);
// Jeden Abwesenheitstag durchlaufen
while (start <= ende)
{
var services = pRO.Services.Where(s => s.StartDate.Date == start.Date).ToList();
if (services != null)
{
// Gibt es am Abwesenheitstag einen Termin, einfach x setzen
if (services.Count > 0)
{
foreach (var service in services)
{
if (abs.Reason.Description.ToLower().Contains("krank"))
service.Notice3 = "x";
}
}
// Gibt es keinen Termin, neuen Tag erzeugen und nur Datum und x setzen
else
{
pRO.Services.Add(new ServicesOverviewRO.ServiceDetail()
{
StartDate = new DateTime(start.Year, start.Month, start.Day),
Notice3 = "x",
ServiceCategory = "",
ServiceDescription = "",
IsBillable = true
});
}
}
start = start.AddDays(1);
}
}
}
}
return pRO;
}
}
}