Files
BeWoPlaner/ReportImp/Fortis/ZeitdokumentationPlanIstUebersicht.cs

350 lines
12 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using DevExpress.XtraReports.UI;
namespace Fortis
{
public partial class ZeitdokumentationPlanIstUebersicht : XtraReport, IBeWoReport<ServicesOverviewRO>
{
public ZeitdokumentationPlanIstUebersicht()
{
InitializeComponent();
}
public void SetReportDataSource(ServicesOverviewRO pRO)
{
var newRo = BerechneRO(pRO);
bindingSource1.DataSource = newRo;
}
private PlanIstUebersichtRO BerechneRO(ServicesOverviewRO pRO)
{
var ro = new PlanIstUebersichtRO();
//ro.ServicesOverviewRO = pRO;
ro.Name = pRO.CustomerLastName;
ro.Vorname = pRO.CustomerFirstName;
ro.GebDatum = pRO.CustomerBirthday;
ro.Leistungserbringer = "";
ro.Ansprechpartner = pRO.MainAttendant;
//if (!String.IsNullOrEmpty(pRO.ApprovedStartDate))
//{
// ro.DokuzeitraumStart = DateTime.Parse(pRO.ApprovedStartDate);
//}
//if (!String.IsNullOrEmpty(pRO.ApprovedEndDate))
//{
// ro.DokuzeitraumEnde = DateTime.Parse(pRO.ApprovedEndDate);
//}
ro.DokuzeitraumStart = pRO.StartDate;
ro.DokuzeitraumEnde = pRO.EndDate;
if (ro.DokuzeitraumStart.HasValue && ro.DokuzeitraumEnde.HasValue)
{
ro.AnzahlTagePlan = (int)ro.DokuzeitraumEnde.Value.Subtract(ro.DokuzeitraumStart.Value).TotalDays + 1;
}
ro.StufeGeplant = "";
if (pRO.ApprovedFLSPerWeek > 0)
{
decimal minuten = pRO.ApprovedFLSPerWeek * 60;
ro.StufeGeplant = SetKorridorAndReturnStufe(minuten, out var korridorVon, out var korridorBis);
ro.KorridorVon = korridorVon;
ro.KorridorBis = korridorBis;
}
ro.AktuellesDatum = DateTime.Now.Date;
if (ro.DokuzeitraumStart.HasValue)
{
//ro.AnzahlTage = (int)ro.AktuellesDatum.Subtract(ro.DokuzeitraumStart.Value).TotalDays + 1;
ro.AnzahlTage = ro.AnzahlTagePlan;
}
BerechneGesamtSummenIst(pRO, ro);
if (ro.AnzahlTage.HasValue && ro.AnzahlTage.Value > 0)
{
ro.DurchschnittProWocheDirekt = ro.SummeDirekt / ro.AnzahlTage.Value * 7;
ro.DurchschnittProWocheAbgesagt = ro.SummeAbgesagt / ro.AnzahlTage.Value * 7;
if ((ro.DurchschnittProWocheDirekt + ro.DurchschnittProWocheAbgesagt) > 0)
{
ro.ProzentDirekt = (ro.DurchschnittProWocheDirekt / (ro.DurchschnittProWocheDirekt + ro.DurchschnittProWocheAbgesagt)) * 100;
ro.ProzentAbgesagt = (ro.DurchschnittProWocheAbgesagt / (ro.DurchschnittProWocheDirekt + ro.DurchschnittProWocheAbgesagt)) * 100;
}
}
//Stufe IST:
var durchschnittProWoche = Math.Round(ro.DurchschnittProWocheDirekt + ro.DurchschnittProWocheAbgesagt, 2);
if (!ro.DokuzeitraumStart.HasValue)
{
ro.StufeIst = "-";
}
else
{
ro.StufeIst = SetKorridorAndReturnStufe(durchschnittProWoche, out var kv, out var kb);
}
//Unter STufe:
if (durchschnittProWoche < ro.KorridorVon)
{
ro.MinutenProWocheUnterStufe = durchschnittProWoche - ro.KorridorVon;
}
else
{
ro.MinutenProWocheUnterStufe = 0;
}
//Bis Ende Stufe:
if (ro.KorridorVon <= durchschnittProWoche && durchschnittProWoche < ro.KorridorBis)
{
ro.MinutenProWocheBisEndeStufe = durchschnittProWoche - ro.KorridorBis;
}
//Über Stufe:
if (durchschnittProWoche >= ro.KorridorBis)
{
ro.MinutenProWocheUeberStufe = durchschnittProWoche - ro.KorridorBis;
}
else
{
ro.MinutenProWocheUeberStufe = 0;
}
if (ro.MinutenProWocheUnterStufe < 0)
{
//ro.Hinweise = "Vorsicht: Rückforderung droht!";
ro.Hinweise = "";
}
return ro;
}
private string SetKorridorAndReturnStufe(decimal minuten, out decimal korridorVon, out decimal korridorBis)
{
String stufe = "";
if (minuten < 30)
{
korridorVon = 0;
korridorBis = 30;
}
else if (minuten < 60)
{
stufe = "1";
korridorVon = 30;
korridorBis = 60;
}
else if (minuten < 90)
{
stufe = "2";
korridorVon = 60;
korridorBis = 90;
}
else if (minuten < 120)
{
stufe = "3";
korridorVon = 90;
korridorBis = 120;
}
else if (minuten < 150)
{
stufe = "4";
korridorVon = 120;
korridorBis = 150;
}
else if (minuten < 180)
{
stufe = "5";
korridorVon = 150;
korridorBis = 180;
}
else if (minuten < 210)
{
stufe = "6";
korridorVon = 180;
korridorBis = 210;
}
else if (minuten < 240)
{
stufe = "7";
korridorVon = 210;
korridorBis = 240;
}
else if (minuten < 270)
{
stufe = "8";
korridorVon = 240;
korridorBis = 270;
}
else if (minuten < 300)
{
stufe = "9";
korridorVon = 270;
korridorBis = 300;
}
else if (minuten < 330)
{
stufe = "10";
korridorVon = 300;
korridorBis = 330;
}
else if (minuten < 360)
{
stufe = "11";
korridorVon = 330;
korridorBis = 360;
}
else if (minuten < 390)
{
stufe = "12";
korridorVon = 360;
korridorBis = 390;
}
else if (minuten < 420)
{
stufe = "13";
korridorVon = 390;
korridorBis = 420;
}
else if (minuten < 450)
{
stufe = "14";
korridorVon = 420;
korridorBis = 450;
}
else if (minuten < 480)
{
stufe = "15";
korridorVon = 450;
korridorBis = 480;
}
else
{
int st = 16;
korridorVon = 480;
korridorBis = korridorVon + 30;
//AXDVG TEST
while (korridorBis < minuten)
{
st++;
korridorVon += 30;
korridorBis += 30;
}
stufe = String.Format("{0:0}", st);
}
return stufe;
}
private void BerechneGesamtSummenIst(ServicesOverviewRO pRO, PlanIstUebersichtRO ro)
{
if (pRO.CostBearer2SupportConceptList != null && pRO.CostBearer2SupportConceptList.Count > 0)
{
IList<ServiceRecord> allServiceRecords = pRO.CostBearer2SupportConceptList[0].ServiceRecords;
Dictionary<long, bool> groupBookingDict = new Dictionary<long, bool>();
foreach (var item in allServiceRecords)
{
if (!item.GroupOid.HasValue || !groupBookingDict.ContainsKey(item.GroupOid.Value))
{
if (item.Start >= pRO.StartDate && item.Start.Value.Date <= pRO.EndDate)
{
decimal prozent = item.ServiceDescription.ServiceCategory.ProzentAbrechnung;
if (item.ServiceDescription.ProzentAbrechnung.HasValue)
{
prozent = item.ServiceDescription.ProzentAbrechnung.Value;
}
var minutenIst = Math.Round((item.RoundedDuration * prozent) / 100, 0, MidpointRounding.AwayFromZero);
var fsr = FortisServiceRecord.CreateFromServiceDescription(item.ServiceDescription.ServiceCategory.Name, item.ServiceDescription.Name, (double)minutenIst, item.Start.Value, item.End.Value);
if (item.ServiceDescription != null && item.ServiceDescription.Name.Contains("abgesagt"))
{
ro.SummeAbgesagt += minutenIst;
}
else
{
if (fsr != null)
{
ro.SummeDirekt += (decimal)fsr.BerechneDirekteMinutenGesamt();
}
}
if (item.GroupOid.HasValue)
groupBookingDict.Add(item.GroupOid.Value, true);
}
}
}
}
}
}
public class PlanIstUebersichtRO
{
public String Name { get; set; }
public String Vorname { get; set; }
public DateTime? GebDatum { get; set; }
public String Leistungserbringer { get; set; }
public String Ansprechpartner { get; set; }
public DateTime? DokuzeitraumStart { get; set; }
public DateTime? DokuzeitraumEnde { get; set; }
public int? AnzahlTagePlan { get; set; }
public String StufeGeplant { get; set; }
public decimal KorridorVon { get; set; }
public decimal KorridorBis { get; set; }
public DateTime? Unterbrechungszeitraum1Start { get; set; }
public DateTime? Unterbrechungszeitraum1Ende { get; set; }
public int? AnzahlTageUnterbrechung1 { get; set; }
public DateTime? Unterbrechungszeitraum2Start { get; set; }
public DateTime? Unterbrechungszeitraum2Ende { get; set; }
public int? AnzahlTageUnterbrechung2 { get; set; }
public DateTime? Unterbrechungszeitraum3Start { get; set; }
public DateTime? Unterbrechungszeitraum3Ende { get; set; }
public int? AnzahlTageUnterbrechung3 { get; set; }
public int? SummeTageUnterbrechung { get; set; }
public DateTime AktuellesDatum { get; set; }
public int? AnzahlTage { get; set; }
public decimal SummeDirekt { get; set; }
public decimal SummeAbgesagt { get; set; }
public decimal DurchschnittProWocheDirekt { get; set; }
public decimal DurchschnittProWocheAbgesagt { get; set; }
public decimal ProzentDirekt { get; set; }
public decimal ProzentAbgesagt { get; set; }
public decimal MinutenProWocheUnterStufe { get; set; }
public decimal MinutenProWocheBisEndeStufe { get; set; }
public decimal MinutenProWocheUeberStufe { get; set; }
public String StufeIst { get; set; }
public decimal FehlstundenGesamt { get; set; }
public String Hinweise { get; set; }
}
}