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 { 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 Entgeltzeitraeume { get; set; } public List 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(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(); this.Entgeltzeitraeume = new List(); 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(); 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 serviceRecords = DAOFactory.SearchDAO.FindCustomerServiceRecords(customer.Oid.Value, span, null, null, false); IList serviceRecords = GetServiceRecords(cb2sc); Dictionary monat2Zeile = new Dictionary(); 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(); 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(); 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 GetServiceRecords(CostBearer2SupportConcept cb2sc) { return cb2sc.ServiceRecords; } } public class BudgetnachweisMonatsZeile { public List 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 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; } } }