/// <inheritdoc /> /// <summary> /// Calculates the derived register for Taf1. /// </summary> /// <param name="device">Date from the SMGW. There should be just original value lists.</param> /// <param name="supplier">The calculation data from the supplier.</param> /// <returns>An ITaf2Data instance. The object contains the calculated data.</returns> public TafAdapterData Calculate(UsagePointAdapterTRuDI device, UsagePointLieferant supplier) { this.originalValueLists = device.MeterReadings.Where(mr => mr.IsOriginalValueList()).Select(mr => new OriginalValueList(mr, device.ServiceCategory.Kind ?? Kind.Electricity)).ToList(); if (!this.originalValueLists.Any()) { throw new InvalidOperationException("Es ist keine originäre Messwertliste verfügbar."); } this.ValidateOriginalValueLists(originalValueLists, supplier, device.MeterReadings.Count); var registers = supplier.GetRegister(); this.UpdateReadingTypeFromOriginalValueList(registers); var accountingPeriod = new Taf1Data(registers, supplier.AnalysisProfile.TariffStages); accountingPeriod.SetDate(supplier.AnalysisProfile.BillingPeriod.Start, supplier.AnalysisProfile.BillingPeriod.GetEnd()); this.SetTotalBillingPeriod(accountingPeriod); ValidateBillingPeriod(); var dayProfiles = supplier.AnalysisProfile.TariffChangeTrigger.TimeTrigger.DayProfiles; foreach (OriginalValueList ovl in originalValueLists) { var startReading = ovl.MeterReading.GetIntervalReadingFromDate(billingPeriodStart); var endReading = ovl.MeterReading.GetIntervalReadingFromDate(billingPeriodEnd); if (startReading == null || !IsStatusValid(startReading)) { throw new InvalidOperationException($"Zu dem Zeitpunkt {billingPeriodStart} ist kein Wert vorhanden oder der Status kritisch oder fatal."); } if (endReading == null || !IsStatusValid(endReading)) { throw new InvalidOperationException($"Zu dem Zeitpunkt {billingPeriodEnd} ist kein Wert vorhanden oder der Status kritisch oder fatal."); } var dayProfile = this.GetDayProfileNumber(dayProfiles, new ObisId(ovl.MeterReading.ReadingType.ObisCode), supplier.AnalysisProfile); var tariffStages = supplier.AnalysisProfile.TariffStages; var tariffId = this.GetTariffId(tariffStages, dayProfiles, dayProfile); CheckValidSupplierFile(supplier, dayProfile, tariffId); var result = this.GetSection(supplier, ovl.MeterReading, startReading, endReading, tariffId); accountingPeriod.Add(result); accountingPeriod.AddInitialReading(new Reading() { Amount = accountingPeriod.AccountingSections.First(s => s.Reading.ObisCode == ovl.MeterReading.ReadingType.ObisCode).Reading.Amount, ObisCode = new ObisId(ovl.MeterReading.ReadingType.ObisCode) }); } return(new TafAdapterData(typeof(Taf2SummaryView), typeof(Taf2DetailView), accountingPeriod)); }
/// <summary> /// Set billingPeriodStart and -End. accountingPeriod.Begin and accountingPeriod.End can not be null /// due to the validation process. There must be a billing period. /// </summary> /// <param name="accountingPeriod"></param> public void SetTotalBillingPeriod(Taf1Data accountingPeriod) { billingPeriodStart = accountingPeriod.Begin; billingPeriodEnd = accountingPeriod.End; }