271 lines
11 KiB
C#
271 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;
|
|
}
|
|
var maxEndDatum = crList.Select(e => e.EndDate).Max();
|
|
bool cutLastPrice = false;
|
|
|
|
foreach (var cr in crList)
|
|
{
|
|
if (!cr.EndDate.HasValue)
|
|
{
|
|
if (maxEndDatum.HasValue && maxEndDatum.Value.Date >= this.BewilligtEnde.Date)
|
|
{
|
|
cutLastPrice = true;
|
|
}
|
|
else
|
|
{
|
|
cr.EndDate = this.BewilligtEnde.AddDays(1);
|
|
}
|
|
}
|
|
}
|
|
if (cutLastPrice)
|
|
{
|
|
crList = crList.Where(l => l.EndDate != null).ToList();
|
|
}
|
|
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; }
|
|
|
|
}
|
|
} |