private static ulong CalculateConsumption(InvoiceShared prevInvoice, InvoiceShared invoice, IEnumerable <MeterConfig> mainMeterConfigHistory, IEnumerable <UserMeterConfigHistory> userMeterConfigHistory) { Contract.Requires(invoice != null); DateRange readOutPeriod = InvoiceExtensions.GetReadOutPeriod(prevInvoice, invoice); IEnumerable <MeterConfig> meterConfigs = mainMeterConfigHistory.GetMeterConfigHistoryForPeriod(readOutPeriod); ulong realCommonConsumption = CalculateRealCommonConsumption(prevInvoice, invoice, meterConfigs); ulong estimatedCommonConsumption = CalculateEstimatedCommonConsumption(prevInvoice, invoice, meterConfigs); ulong totalEstimatedUserConsumption = 0U; foreach (var userInvoice in invoice.UserInvoices) { UserInvoice prevUserInvoice = prevInvoice?.UserInvoices.GetInvoiceByOwner(userInvoice.InvoiceOwner); IEnumerable <MeterConfig> userMeterConfigs = userMeterConfigHistory. GetMeterConfigHistoryByOwner(userInvoice.InvoiceOwner). GetMeterConfigHistoryForPeriod(readOutPeriod); ulong realUserConsumption = CalculateRealUserConsumption(readOutPeriod, prevUserInvoice, userInvoice, userMeterConfigs); totalEstimatedUserConsumption += CalculateEstimatedUserConsumption(userInvoice, realUserConsumption, new ConsumptionValue(estimatedCommonConsumption, realCommonConsumption)); } FineGrainEstimatedUserConsumption( invoice.UserInvoices, totalEstimatedUserConsumption, new ConsumptionValue(estimatedCommonConsumption, realCommonConsumption) ); return(realCommonConsumption); }
private static ulong CalculateRealCommonConsumption(InvoiceShared prevInvoice, InvoiceShared invoice, IEnumerable <MeterConfig> meterConfigs) { Contract.Requires(invoice != null); Contract.Requires(meterConfigs != null); DateRange readOutPeriod = InvoiceExtensions.GetReadOutPeriod(prevInvoice, invoice); ulong startRealReadOut = prevInvoice?.GetReadOut().Real ?? 0U; ulong endRealReadOut = invoice.GetReadOut().Real; ulong commonRealConsumption = CalculateConsumption(readOutPeriod, startRealReadOut, endRealReadOut, meterConfigs); invoice.GetConsumption().Real = commonRealConsumption; return(commonRealConsumption); }
private static ulong CalculateEstimatedCommonConsumption(InvoiceShared prevInvoice, InvoiceShared invoice, IEnumerable <MeterConfig> meterConfigs) { Contract.Requires(invoice != null); Contract.Requires(meterConfigs != null); DateRange readOutPeriod = InvoiceExtensions.GetReadOutPeriod(prevInvoice, invoice); ulong commonEstimatedConsumption = invoice.GetConsumption().Estimated; if (commonEstimatedConsumption == 0) { ulong startEstimatedReadOut = prevInvoice?.GetReadOut().Estimated ?? 0U; ulong endEstimatedReadOut = invoice.GetReadOut().Estimated; commonEstimatedConsumption = CalculateConsumption(readOutPeriod, startEstimatedReadOut, endEstimatedReadOut, meterConfigs); invoice.GetConsumption().Estimated = commonEstimatedConsumption; } return(commonEstimatedConsumption); }
/// <summary> /// Calculates the custom total. /// </summary> /// <param name="itemization"> /// The itemization. /// </param> /// <returns> /// The <see cref="decimal"/>. /// </returns> public static decimal CalculateCustomTotal(this InvoiceItemItemization itemization) { return(InvoiceExtensions.Ensure2Places(itemization.Custom.Sum(x => x.Price * x.Quantity))); }