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