Files

290 lines
14 KiB
C#
Raw Permalink Normal View History

using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BS.Shared.Core;
using BS.Shared.DataContracts;
2025-03-20 08:12:29 +01:00
using BS.Shared.Extensions;
2026-06-12 13:52:34 +02:00
using DevExpress.XtraCharts.GLGraphics.Platform;
using DevExpress.XtraReports.UI;
2026-06-12 13:52:34 +02:00
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
namespace LebenshilfeStadeMID
{
public partial class Quittierungsbeleg : XtraReport, IBeWoReport<ServicesOverviewRO>
{
public Quittierungsbeleg()
{
InitializeComponent();
}
public void SetReportDataSource(ServicesOverviewRO pRO)
{
2024-11-13 12:50:40 +01:00
double summeVerfuegungszeit = 0;
2025-06-20 12:54:08 +02:00
double summeZusatzleistung1 = 0;
double summeZusatzleistung2 = 0;
2025-06-24 13:18:43 +02:00
double gesamteZeit = 0;
2024-11-13 12:50:40 +01:00
if (pRO.Services != null)
{
2025-03-20 08:12:29 +01:00
// Verf<72>gungszeiten und Zusatzleistungen aus der Liste rauskopieren, weil die Werte am Ende alle in einer Zeile stehen sollen
List<ServicesOverviewRO.ServiceDetail> verfuegungszeiten = new List<ServicesOverviewRO.ServiceDetail>();
List<ServicesOverviewRO.ServiceDetail> zusatzleistungen = new List<ServicesOverviewRO.ServiceDetail>();
2025-08-20 08:13:23 +02:00
verfuegungszeiten.AddRange(pRO.Services.Where(s => s.ServiceDescription.ToLower().Contains("verf<72>gungszeit") || s.ServiceDescription.ToLower().Contains("vorbereitungszeit")).ToList());
zusatzleistungen.AddRange(pRO.Services.Where(s => s.ServiceDescription.ToLower().Contains("zusatzleistung")).ToList());
2025-03-20 08:12:29 +01:00
pRO.Services.RemoveRange(verfuegungszeiten);
// Zusatzleistungen pauschal entfernen geht nicht, da Zusatzleistungen auch an Tagen existieren k<>nnen an denen es keine anderen Leistungen gibt.
//pRO.Services.RemoveRange(zusatzleistungen);
foreach (var zsl in zusatzleistungen)
{
if (pRO.Services.Any(s => s.StartDate.Date == zsl.StartDate.Date && s.ServiceDescription != zsl.ServiceDescription))
pRO.Services.Remove(zsl);
else
{
}
}
2025-03-20 08:12:29 +01:00
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<75>gen
pRO = MarkiereAbwesenheiten(customer, pRO);
List<ServicesOverviewRO.ServiceDetail> servicesBillable = new List<ServicesOverviewRO.ServiceDetail>();
foreach (var sd in pRO.Services)
{
2024-11-21 13:02:51 +01:00
sd.Notice = "";
sd.Notice2 = "";
2025-06-20 12:54:08 +02:00
sd.Notice3 = "";
2025-04-22 13:30:52 +02:00
sd.Notice5 = "";
2025-06-20 12:54:08 +02:00
2024-11-21 13:02:51 +01:00
2025-03-20 08:12:29 +01:00
// Verf<72>gungszeit in eigentlichen ServiceRecord eintragen und aus Liste entfernen, dass der nicht mehrfach <20>bertragen wird
2026-06-12 13:52:34 +02:00
var vz = verfuegungszeiten.FirstOrDefault(s => s.StartDate.Date == sd.StartDate.Date && !s.ServiceDescription.ToLower().Contains("vorbereitungszeit fachlich egh"));
2025-06-20 12:54:08 +02:00
var zls = zusatzleistungen.Where(s => s.StartDate.Date == sd.StartDate.Date).ToList();
2025-03-20 08:12:29 +01:00
if (vz != null)
2024-11-13 12:50:40 +01:00
{
2025-04-08 17:22:59 +02:00
sd.Notice = string.Format("{0:0.00}", vz.Minutes / 60);
2025-03-20 08:12:29 +01:00
sd.Minutes += vz.Minutes;
summeVerfuegungszeit += vz.Minutes;
verfuegungszeiten.Remove(vz);
}
// Zusatzleistung in eigentlichen ServiceRecord eintragen und aus Liste entfernen, dass der nicht mehrfach <20>bertragen wird
// is zsl[x] = servicerecord gibt es an dem Tag keinen Eintrag, bei dem man die Zusatzleistung eintragen k<>nnte, dann werden die Min
// nicht erh<72>ht sondern einfach die Zusatzleistung als Zeit angezeigt
2025-06-20 12:54:08 +02:00
if (zls != null)
2024-11-13 12:50:40 +01:00
{
2025-06-20 12:54:08 +02:00
if (zls.Count > 0)
{
if (zls[0] != sd)
sd.Minutes += zls[0].Minutes;
2025-06-20 12:54:08 +02:00
sd.Notice2 = string.Format("{0:0.00} ({1:0})", zls[0].Minutes / 60, zls[0].ServiceDescription);
summeZusatzleistung1 += zls[0].Minutes;
zusatzleistungen.Remove(zls[0]);
}
if (zls.Count > 1)
{
if (zls[1] != sd)
sd.Minutes += zls[1].Minutes;
2025-06-20 12:54:08 +02:00
sd.Notice3 = string.Format("{0:0.00} ({1:0})", zls[1].Minutes / 60, zls[1].ServiceDescription);
summeZusatzleistung2 += zls[1].Minutes;
zusatzleistungen.Remove(zls[1]);
}
2024-11-13 12:50:40 +01:00
}
2025-06-20 12:54:08 +02:00
// Notice5 ist Zeit in Stunden, au<61>er es in der Leistung steht "Klassenfahrt" drin, dann ist Notice5 Klassenfahrt
if (sd.ServiceDescription.ToLower().Contains("klassenfahrt"))
sd.Notice5 = "Klassenfahrt";
else
2025-06-24 13:18:43 +02:00
{
2025-07-01 16:34:48 +02:00
//sd.Notice5 = string.Format("{0:0.00}", Math.Round(sd.Minutes / 60, 2));
//gesamteZeit += Math.Round(sd.Minutes / 60, 2);
sd.Notice5 = string.Format("{0}", sd.Minutes);
gesamteZeit += sd.Minutes;
2025-06-24 13:18:43 +02:00
}
2025-06-20 12:54:08 +02:00
if (sd.IsBillable || sd.ServiceDescription.ToLower().Contains("fehlkontakt") || sd.ServiceCategory.ToLower().Contains("fehlkontakt"))
2025-03-20 08:12:29 +01:00
if (!sd.ServiceDescription.IsNullOrEmpty())
servicesBillable.Add(sd);
}
pRO.Services = servicesBillable;
}
2025-07-01 16:34:48 +02:00
tcSumVerfuegungszeitMin.Text = string.Format("{0:0}", summeVerfuegungszeit);
tcSumZusatzleistung1Min.Text = string.Format("{0:0}", summeZusatzleistung1);
tcSumZusatzleistung2Min.Text = string.Format("{0:0}", summeZusatzleistung2);
lblGesamtzeitMin.Text = string.Format("{0:0}", gesamteZeit);
tcSumVerfuegungszeitStd.Text = string.Format("{0:0.00}", summeVerfuegungszeit / 60);
tcSumZusatzleistung1Std.Text = string.Format("{0:0.00}", summeZusatzleistung1 / 60);
tcSumZusatzleistung2Std.Text = string.Format("{0:0.00}", summeZusatzleistung2 / 60);
lblGesamtzeitStd.Text = string.Format("{0:0.00}", gesamteZeit / 60);
2024-11-13 12:50:40 +01:00
bindingSource1.DataSource = pRO;
}
private ServicesOverviewRO MarkiereAbwesenheiten(CustomerDC customer, ServicesOverviewRO pRO)
{
2025-03-05 10:45:58 +01:00
//pRO = ErstelleAbwesenheitenFuerKlientenAlt(customer, pRO);
pRO = ErstelleAbwesenheitenFuerKlienten(customer, pRO);
pRO = ErstelleAbwesenheitenFuerMitarbeiter(customer, pRO);
return pRO;
}
private ServicesOverviewRO ErstelleAbwesenheitenFuerKlienten(CustomerDC customer, ServicesOverviewRO pRO)
2025-03-05 10:45:58 +01:00
{
foreach (var service in pRO.Services)
{
if (service.ServiceDescription.ToLower().Contains("krank"))
service.Notice4 = "x";
}
return pRO;
}
// Die tragen die Abwesenheiten nicht in den Klienten ein, sondern als Zeiterfassung. Daher wird das hier nicht mehr benutzt
private ServicesOverviewRO ErstelleAbwesenheitenFuerKlientenAlt(CustomerDC customer, ServicesOverviewRO 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.AbsenceReason.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 ServicesOverviewRO.ServiceDetail()
{
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<75>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));
2024-11-13 12:50:40 +01:00
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;
}
private void picSignature_BeforePrint(object sender, System.ComponentModel.CancelEventArgs e)
{
XRPictureBox xrBox = sender as XRPictureBox;
//var test = this.GetCurrent
string base64String = xrBox.Tag as string;
if (!String.IsNullOrWhiteSpace(base64String))
{
var base64Data = Regex.Match(base64String, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value;
var binData = Convert.FromBase64String(base64Data);
System.Drawing.Image img = ByteArrayToImage(binData);
xrBox.Image = Utils.CropImage(img);
}
else
{
xrBox.Image = null;
}
}
public System.Drawing.Image ByteArrayToImage(byte[] byteArrayIn)
{
using(var memoryStream = new MemoryStream(byteArrayIn))
{
return System.Drawing.Image.FromStream(memoryStream);
}
}
}
}