Files
BeWoPlaner/Report/ReportObjects/BudgetnachweisAnhangRO.cs

259 lines
11 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 SummeFehlkontakte { get; set; }
public decimal SummeFehlkontakteStunden { get; set; }
public decimal SummeFaktorStunden { get; set; }
public decimal SummeGesamtStunden { get; set; }
public decimal SummeGesamtStundenMitFK { get; set; }
public void Create(Settlement2DC dc)
{
CostBearer2SupportConcept cb2sc = DAOFactory.GenericDAO.LoadByID<CostBearer2SupportConcept>(dc.CostBearer2SupportConceptOid.Value);
Customer customer = cb2sc.SupportConcept.Customer;
this.SettlementDC = dc;
this.Costbearer2SupportConceptDC = MapperFactory.SupportConceptCostBearerRelDC_CostBearer2SupportConcept.MapToNewDC(cb2sc);
this.CustomerDC = MapperFactory.CustomerDC_Customer.MapToNewDC(customer);
this.BewilligtStart = dc.AccountingPeriodStart.Value;
this.BewilligtEnde = dc.AccountingPeriodEnd.Value;
this.MonatsZeilen = new List<BudgetnachweisMonatsZeile>();
this.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, this.BewilligtEnde);
if (rf != null && rf.CostRateValue.HasValue)
{
this.RateFactor = rf.CostRateValue.Value;
}
foreach (var cr in crList)
{
if (!cr.EndDate.HasValue)
{
cr.EndDate = this.BewilligtEnde.AddDays(1);
}
}
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 >= this.BewilligtStart && cr.StartDate <= this.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 < BewilligtStart)
{
ez.Start = this.BewilligtStart;
}
if (ez.Ende == DateTime.MaxValue)
{
ez.Ende = this.BewilligtEnde;
}
ez.CostRatePeriod = cr;
ez.ServiceRecords = new List<ServiceRecordDC>();
this.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);
IList<ServiceRecord> serviceRecords = GetServiceRecords(cb2sc);
Dictionary<string, BudgetnachweisMonatsZeile> monat2Zeile = new Dictionary<string, BudgetnachweisMonatsZeile>();
DateTime monat = new DateTime(this.BewilligtStart.Year, this.BewilligtStart.Month, this.BewilligtStart.Day);
while (monat <= this.BewilligtEnde)
{
String key = String.Format("{0:MM.yyyy}", monat);
var zeile = new BudgetnachweisMonatsZeile();
zeile.ServiceRecords = new List<ServiceRecordDC>();
zeile.Monat = monat;
zeile.SummeMinuten = 0;
zeile.SummeFehlkontakte = 0;
foreach (var e in this.Entgeltzeitraeume)
{
if (e.Start <= monat && monat <= e.Ende)
{
zeile.Entgeltzeitraum = e.Index;
}
}
if (monat.Day != 1)
monat = new DateTime(monat.Year, monat.Month, 1);
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))
{
if (monat2Zeile[key].Monat <= sr.Start.Value.Date)
{
monat2Zeile[key].ServiceRecords.Add(srDc);
decimal minuten = sr.RoundedDuration;
decimal prozent = sr.ServiceDescription.ServiceCategory.ProzentAbrechnung;
//if (sr.ServiceDescription.ProzentAbrechnung.HasValue)
//{
// prozent = sr.ServiceDescription.ProzentAbrechnung.Value;
//}
//minuten *= (prozent / 100);
if (sr.ServiceDescription.Name.ToLower().Contains("fehlkontakt"))
{
monat2Zeile[key].SummeFehlkontakte += minuten;
}
else
monat2Zeile[key].SummeMinuten += minuten;
foreach (var e in this.Entgeltzeitraeume)
{
if (e.Start <= sr.Start.Value.Date && sr.Start.Value.Date <= e.Ende)
{
e.ServiceRecords.Add(srDc);
if (sr.ServiceDescription.Name.ToLower().Contains("fehlkontakt"))
{
e.SummeFehlkontakte += minuten;
}
else
e.SummeFLMinuten += minuten;
}
}
}
}
}
}
this.MonatsZeilen.AddRange(monat2Zeile.Values.OrderBy(m => m.Monat));
foreach (var e in this.Entgeltzeitraeume)
{
e.SummeFLStunden = Math.Round(e.SummeFLMinuten / 60, 2, MidpointRounding.AwayFromZero);
e.SummeFehlkontakteStunden = Math.Round(e.SummeFehlkontakte / 60, 2, MidpointRounding.AwayFromZero);
e.SummeGesamtStunden = Math.Round(((this.RateFactor + 100) / 100) * e.SummeFLStunden, 2, MidpointRounding.AwayFromZero);
e.SummeFaktorStunden = e.SummeGesamtStunden - e.SummeFLStunden;
e.SummeGesamtStundenMitFK = e.SummeFehlkontakteStunden + e.SummeGesamtStunden;
//e.SummeFaktorMinuten = (this.RateFactor / 100) * e.SummeFLMinuten;
e.SummeFaktorMinuten = e.SummeFaktorStunden * 60;
e.SummeGesamtMinuten = e.SummeFaktorMinuten + e.SummeFLMinuten;
this.SummeFLMinuten += e.SummeFLMinuten;
this.SummeFaktorMinuten += e.SummeFaktorMinuten;
this.SummeGesamtMinuten += e.SummeGesamtMinuten;
this.SummeFLStunden += e.SummeFLStunden;
this.SummeFaktorStunden += e.SummeFaktorStunden;
this.SummeGesamtStunden += e.SummeGesamtStunden;
this.SummeFehlkontakte += e.SummeFehlkontakte;
this.SummeFehlkontakteStunden += e.SummeFehlkontakteStunden;
this.SummeGesamtStundenMitFK += e.SummeGesamtStundenMitFK;
}
}
public virtual IList<ServiceRecord> GetServiceRecords(CostBearer2SupportConcept cb2sc)
{
return cb2sc.ServiceRecords;
}
}
public class BudgetnachweisMonatsZeile
{
public List<ServiceRecordDC> ServiceRecords { get; set; }
public DateTime Monat { get; set; }
public decimal? SummeMinuten { get; set; }
public decimal? SummeFehlkontakte { get; set; }
public int Entgeltzeitraum { get; set; }
public decimal? Betrag { 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 SummeFehlkontakte { get; set; }
public decimal SummeFehlkontakteStunden { get; set; }
public decimal SummeFaktorStunden { get; set; }
public decimal SummeGesamtStunden { get; set; }
public decimal SummeGesamtStundenMitFK { get; set; }
public int Index { get; set; }
}
}