Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 2
0
 /// <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;
 }