Files
BeWoPlaner/Report/ReportObjects/BudgetnachweisAnhangRO.cs
2021-05-24 21:40:02 +02:00

224 lines
8.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
namespace BeWo.Report.ReportObjects
{
public class BudgetnachweisAnhangRO : AbstractBeWoReportObject<BudgetnachweisAnhangRO>
{
public Settlement2DC SettlementDC { get; set; }
public SupportConceptCostBearerRelDC Costbearer2SupportConceptDC { get; set; }
public CustomerDC CustomerDC { get; set; }
public DateTime BewilligtStart { get; set; }
public DateTime BewilligtEnde { get; set; }
public List<Entgeltzeitraum> Entgeltzeitraeume { get; set; }
public List<BudgetnachweisMonatsZeile> MonatsZeilen { get; set; }
public decimal RateFactor { get; set; }
public decimal SummeFLMinuten { get; set; }
public decimal SummeFaktorMinuten { get; set; }
public decimal SummeGesamtMinuten { get; set; }
public decimal SummeFLStunden { get; set; }
public decimal SummeFaktorStunden { get; set; }
public decimal SummeGesamtStunden { get; set; }
public static BudgetnachweisAnhangRO Create(Settlement2DC dc)
{
var result = new BudgetnachweisAnhangRO();
CostBearer2SupportConcept cb2sc = DAOFactory.GenericDAO.LoadByID<CostBearer2SupportConcept>(dc.CostBearer2SupportConceptOid.Value);
Customer customer = cb2sc.SupportConcept.Customer;
result.SettlementDC = dc;
result.Costbearer2SupportConceptDC = MapperFactory.SupportConceptCostBearerRelDC_CostBearer2SupportConcept.MapToNewDC(cb2sc);
result.CustomerDC = MapperFactory.CustomerDC_Customer.MapToNewDC(customer);
result.BewilligtStart = dc.AccountingPeriodStart.Value;
result.BewilligtEnde = dc.AccountingPeriodEnd.Value;
result.MonatsZeilen = new List<BudgetnachweisMonatsZeile>();
result.Entgeltzeitraeume = new List<Entgeltzeitraum>();
var crList = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(cb2sc.CostBearer.CostRatePeriods.Where(c => c.CostRateType == CostRatePeriodType.HourlyRate));
var crRfList = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(cb2sc.CostBearer.CostRatePeriods.Where(c => c.CostRateType == CostRatePeriodType.RateFactor));
var rf = crRfList.GetCostRatePeriodForDate(CostRatePeriodType.RateFactor, result.BewilligtEnde);
if (rf != null && rf.CostRateValue.HasValue)
{
result.RateFactor = rf.CostRateValue.Value;
}
foreach (var cr in crList)
{
if (!cr.EndDate.HasValue)
{
cr.EndDate = result.BewilligtEnde;
}
}
crList = crList.OrderBy(c => c.EndDate).ToList();
DateTime start = DateTime.MinValue;
int idx = 1;
foreach (var cr in crList)
{
if (!cr.StartDate.HasValue)
{
cr.StartDate = start;
}
if (cr.StartDate > DateTime.MinValue)
{
cr.StartDate = cr.StartDate.Value.AddDays(1);
}
if (cr.EndDate >= result.BewilligtStart && cr.StartDate <= result.BewilligtEnde)
{
var ez = new Entgeltzeitraum();
ez.Index = idx++;
ez.Start = cr.StartDate.Value;
ez.Ende = cr.EndDate.Value;
if (ez.Start == DateTime.MinValue)
{
ez.Start = result.BewilligtStart;
}
if (ez.Ende == DateTime.MaxValue)
{
ez.Ende = result.BewilligtEnde;
}
ez.CostRatePeriod = cr;
ez.ServiceRecords = new List<ServiceRecordDC>();
result.Entgeltzeitraeume.Add(ez);
}
start = cr.EndDate.Value;
}
var span = new DateTimeSpan();
span.StartDateTime = dc.AccountingPeriodStart.Value;
span.EndDateTime = dc.AccountingPeriodEnd.Value.AddDays(1).AddTicks(-1);
IList<ServiceRecord> serviceRecords = DAOFactory.SearchDAO.FindCustomerServiceRecords(customer.Oid.Value, span, null, null, false);
Dictionary<string, BudgetnachweisMonatsZeile> monat2Zeile = new Dictionary<string, BudgetnachweisMonatsZeile>();
DateTime monat = new DateTime(result.BewilligtStart.Year, result.BewilligtStart.Month, 1);
while (monat <= result.BewilligtEnde)
{
String key = String.Format("{0:MM.yyyy}", monat);
var zeile = new BudgetnachweisMonatsZeile();
zeile.ServiceRecords = new List<ServiceRecordDC>();
zeile.Monat = monat;
zeile.SummeMinuten = 0;
foreach (var e in result.Entgeltzeitraeume)
{
if (e.Start <= monat && monat <= e.Ende)
{
zeile.Entgeltzeitraum = e.Index;
}
}
monat = monat.AddMonths(1);
monat2Zeile.Add(key, zeile);
}
var groupBookingDict = new Dictionary<long, bool>();
foreach (var sr in serviceRecords)
{
if (sr.ServiceDescription.ServiceCategory.IsBillable && (!sr.GroupOid.HasValue || !groupBookingDict.ContainsKey(sr.GroupOid.Value)))
{
if (sr.GroupOid.HasValue)
{
groupBookingDict.Add(sr.GroupOid.Value, true);
}
var srDc = MapperFactory.ServiceRecordDC_ServiceRecord.MapToNewDC(sr);
String key = String.Format("{0:MM.yyyy}", sr.Start);
if (monat2Zeile.ContainsKey(key))
{
monat2Zeile[key].ServiceRecords.Add(srDc);
decimal minuten = sr.RoundedDuration;
monat2Zeile[key].SummeMinuten += minuten;
foreach (var e in result.Entgeltzeitraeume)
{
if (e.Start <= sr.Start.Value.Date && sr.Start.Value.Date <= e.Ende)
{
e.ServiceRecords.Add(srDc);
e.SummeFLMinuten += minuten;
}
}
}
}
}
result.MonatsZeilen.AddRange(monat2Zeile.Values.OrderBy(m => m.Monat));
foreach (var e in result.Entgeltzeitraeume)
{
e.SummeFaktorMinuten = (result.RateFactor / 100) * e.SummeFLMinuten;
e.SummeGesamtMinuten = e.SummeFaktorMinuten + e.SummeFLMinuten;
e.SummeFLStunden = e.SummeFLMinuten / 60;
e.SummeFaktorStunden = e.SummeFaktorMinuten / 60;
e.SummeGesamtStunden = e.SummeGesamtMinuten / 60;
result.SummeFLMinuten += e.SummeFLMinuten;
result.SummeFaktorMinuten += e.SummeFaktorMinuten;
result.SummeGesamtMinuten += e.SummeGesamtMinuten;
}
result.SummeFLStunden = result.SummeFLMinuten / 60;
result.SummeFaktorStunden = result.SummeFaktorMinuten / 60;
result.SummeGesamtStunden = result.SummeGesamtMinuten / 60;
return result;
}
}
public class BudgetnachweisMonatsZeile
{
public List<ServiceRecordDC> ServiceRecords { get; set; }
public DateTime Monat { get; set; }
public decimal? SummeMinuten { get; set; }
public int Entgeltzeitraum { get; set; }
}
public class Entgeltzeitraum
{
public List<ServiceRecordDC> ServiceRecords { get; set; }
public CostRatePeriodDC CostRatePeriod { get; set; }
public DateTime Start { get; set; }
public DateTime Ende { get; set; }
public decimal SummeFLMinuten { get; set; }
public decimal SummeFaktorMinuten { get; set; }
public decimal SummeGesamtMinuten { get; set; }
public decimal SummeFLStunden { get; set; }
public decimal SummeFaktorStunden { get; set; }
public decimal SummeGesamtStunden { get; set; }
public int Index { get; set; }
}
}