Ejemplo 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);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Calculate water fee of specific invoice
        /// </summary>
        /// <param name="invoice"></param>
        public void CalculateFee(InvoiceShared invoice)
        {
            Contract.Requires(invoice != null);
            Contract.Requires(invoiceHistory != null);

            IEnumerable <FeeConfig> feeConfigs = invoiceHistory.FeeConfigHistory.GetFeeConfigHistoryForPeriod(invoice);

            if (!feeConfigs.Any())
            {
                throw new InvalidDataException($"Unable to calculate fee for invoice ({invoice.Id}), because of missing fee configurations");
            }

            if (invoice.Balanced == false)  // estimated invoide should have only one fee config
            {
                if (feeConfigs.Count() > 1)
                {
                    throw new InvalidDataException($"Unable to calculate fee for estimated invoice ({invoice.Id}), because found too much fee configurations for invoice period");
                }

                CalculateEstimatedFee(invoice, feeConfigs.First());
            }
            else
            {
                IEnumerable <InvoiceShared> estimatedInvoiced = invoiceHistory.Invoices.GetEstimatedInvoicesInPeriod(invoice);
                CalculateRealFee(invoice, estimatedInvoiced, feeConfigs);
            }
        }
Ejemplo n.º 3
0
        private static bool CalculateRealFee(InvoiceShared realInvoice, InvoiceShared estimatedInvoice, FeeConfig feeConfig)
        {
            Contract.Requires(realInvoice != null);
            Contract.Requires(estimatedInvoice != null);
            Contract.Requires(feeConfig != null);

            if (!CalculateCommonRealBasicFee(realInvoice, estimatedInvoice, feeConfig))
            {
                return(false);
            }
            if (!CalculateCommonRealUsageFee(realInvoice, estimatedInvoice, feeConfig))
            {
                return(false);
            }

            foreach (var userInvoice in realInvoice.UserInvoices)
            {
                UserInvoice estimatedUserInvoice = estimatedInvoice.UserInvoices.GetInvoiceByOwner(userInvoice.InvoiceOwner);

                CalculateUserRealBasicFee(estimatedInvoice, userInvoice, realInvoice.UserInvoices.Count, feeConfig);
                CalculateUserRealUsageFee(userInvoice, estimatedUserInvoice, feeConfig);
            }

            return(true);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Checks if sum of user invoices differs from sum of common invoice
        /// </summary>
        /// <param name="invoice"></param>
        /// <param name="commonSum"></param>
        /// <param name="usersSum"></param>
        /// <returns></returns>
        public static bool IsSumOfUserInvoicesDifferent(this InvoiceShared invoice, Func <InvoiceShared, decimal> commonSum, Func <UserInvoice, decimal> usersSum)
        {
            Contract.Requires(invoice != null);
            Contract.Requires(commonSum != null);
            Contract.Requires(usersSum != null);

            decimal invoiceSum = commonSum(invoice);
            decimal userSum    = invoice.UserInvoices.Sum(userInvoice => usersSum(userInvoice));

            return(invoiceSum != userSum);
        }
Ejemplo n.º 5
0
        private static bool CalculateCommonRealBasicFee(InvoiceShared realInvoice, InvoiceShared estimatedInvoice, FeeConfig feeConfig)
        {
            Contract.Requires(realInvoice != null);
            Contract.Requires(estimatedInvoice != null);
            Contract.Requires(feeConfig != null);

            realInvoice.GetBasicFee().CleanWaterFee += (estimatedInvoice.GetMonths() * feeConfig.GetMonthlyCleanWaterBasicFeeWithoutVAT()).RoundToCents();
            realInvoice.GetBasicFee().WasteWaterFee += (estimatedInvoice.GetMonths() * feeConfig.GetMonthlyWasteWaterBasicFeeWithoutVAT()).RoundToCents();

            return(true);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Calculate water fee of specific invoice
        /// </summary>
        /// <param name="invoiceId"></param>
        public void CalculateFee(int invoiceId)
        {
            Contract.Requires(invoiceHistory != null);

            InvoiceShared invoice = invoiceHistory.Invoices.GetInvoiceById(invoiceId);

            if (invoice == null)
            {
                throw new KeyNotFoundException($"Invoice with id {invoiceId} not found");
            }

            CalculateFee(invoice);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Calculate water consumption for all invoice history
        /// </summary>
        public void CalculateConsumption()
        {
            Contract.Requires(invoiceHistory != null);

            InvoiceShared prevInvoice = null;

            foreach (var invoice in invoiceHistory.Invoices)
            {
                CalculateConsumption(prevInvoice, invoice,
                                     invoiceHistory.MainMeterConfigHistory.MeterConfigs,
                                     invoiceHistory.UserMeterConfigHistory);
                prevInvoice = invoice;
            }
        }
Ejemplo n.º 8
0
        private static bool CalculateCommonEstimatedBasicFee(InvoiceShared estimatedInvoice, FeeConfig feeConfig)
        {
            Contract.Requires(estimatedInvoice != null);
            Contract.Requires(feeConfig != null);

            if (estimatedInvoice.Balanced == false)
            {
                estimatedInvoice.GetBasicFee().CleanWaterFee = (estimatedInvoice.GetMonths() * feeConfig.GetMonthlyCleanWaterBasicFeeWithoutVAT()).RoundToCents();
                estimatedInvoice.GetBasicFee().WasteWaterFee = (estimatedInvoice.GetMonths() * feeConfig.GetMonthlyWasteWaterBasicFeeWithoutVAT()).RoundToCents();

                return(true);
            }

            return(false);
        }
Ejemplo n.º 9
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);
        }
Ejemplo n.º 10
0
        private void RefreshDataGridViewRows(DataGridViewRowCollection rows, Price.ShowFormat priceFormat)
        {
            foreach (DataGridViewRow row in rows)
            {
                InvoiceShared invoice = GetCommonInvoiceFromRow(row);

                if (IsUserInvoice(row))
                {
                    ShowUserInvoice(row, invoice, GetUserInvoiceFromRow(row), priceFormat);
                }
                else
                {
                    ShowCommonInvoice(row, invoice, priceFormat);
                }
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Calculate water consumption of specific invoice
        /// </summary>
        /// <param name="invoiceId"></param>
        /// <returns></returns>
        public ulong CalculateConsumption(int invoiceId)
        {
            Contract.Requires(invoiceHistory != null);

            InvoiceShared invoice = invoiceHistory.Invoices.GetInvoiceById(invoiceId);

            if (invoice == null)
            {
                throw new KeyNotFoundException($"Invoice with id {invoiceId} not found");
            }

            InvoiceShared prevInvoice = invoiceHistory.Invoices.GetInvoiceByEndDate(invoice.Start.AddDays(-1));

            return(CalculateConsumption(prevInvoice, invoice,
                                        invoiceHistory.MainMeterConfigHistory.MeterConfigs,
                                        invoiceHistory.UserMeterConfigHistory));
        }
Ejemplo n.º 12
0
        private void ShowSharedInvoice(InvoiceShared invoice, Price.ShowFormat priceFormat)
        {
            DataGridViewRow row = new DataGridViewRow();

            row.CreateCells(dataGridView);

            ShowCommonInvoice(row, invoice, priceFormat);
            dataGridView.Rows.Add(row);

            foreach (UserInvoice userInvoice in invoice.UserInvoices)
            {
                row = new DataGridViewRow();
                row.CreateCells(dataGridView);

                ShowUserInvoice(row, invoice, userInvoice, priceFormat);
                dataGridView.Rows.Add(row);
            }
        }
Ejemplo n.º 13
0
        private static void ShowUserInvoice(DataGridViewRow row, InvoiceShared invoice, UserInvoice userInvoice, Price.ShowFormat priceFormat)
        {
            Contract.Requires(row != null);
            Contract.Requires(invoice != null);
            Contract.Requires(userInvoice != null);

            row.Cells[0].Value           = userInvoice.InvoiceOwner;
            row.Cells[0].Tag             = invoice.Id;
            row.Cells[1].Style.BackColor = Color.LightGray;

            row.Cells[2].Value = userInvoice.InvoiceOwner;

            row.Cells[3].Value           = userInvoice.GetReadOut().ToString();
            row.Cells[3].Style.BackColor = invoice.IsSumOfUserInvoicesDifferent(inv => inv.GetReadOut().Sum(), userInv => userInv.GetReadOut().Sum()) ?
                                           Color.LightPink : row.Cells[3].Style.BackColor;

            row.Cells[4].Value           = userInvoice.GetConsumption().ToString();
            row.Cells[4].Style.BackColor = invoice.IsSumOfUserInvoicesDifferent(inv => inv.GetConsumption().Sum(), userInv => userInv.GetConsumption().Sum()) ?
                                           Color.LightPink : row.Cells[4].Style.BackColor;

            row.Cells[5].Value           = userInvoice.GetBasicFee().ToString(priceFormat);
            row.Cells[5].Style.BackColor = invoice.IsSumOfUserInvoicesDifferent(
                inv => (inv.GetBasicFee().GetTotalPrice().VATLess),
                userInv => (userInv.GetBasicFee().GetTotalPrice().VATLess)) ?
                                           Color.LightPink : row.Cells[5].Style.BackColor;

            row.Cells[6].Value           = userInvoice.GetUsageFee().ToString(priceFormat);
            row.Cells[6].Style.BackColor = invoice.IsSumOfUserInvoicesDifferent(
                inv => (inv.GetUsageFee().GetTotalPrice().VATLess),
                userInv => (userInv.GetUsageFee().GetTotalPrice().VATLess)) ?
                                           Color.LightPink : row.Cells[6].Style.BackColor;

            row.Cells[7].Value = invoice.Balanced;

            row.Cells[8].Value           = userInvoice.GetTotalPrice().ToString(Price.ShowFormat.both);
            row.Cells[8].Style.BackColor = invoice.IsSumOfUserInvoicesDifferent(
                inv => (inv.GetTotalPrice().VATLess + inv.GetTotalPrice().WithVAT),
                userInv => (userInv.GetTotalPrice().VATLess + userInv.GetTotalPrice().WithVAT)) ?
                                           Color.LightPink : row.Cells[8].Style.BackColor;

            row.Tag = userInvoice;
        }
Ejemplo n.º 14
0
        private static void ShowCommonInvoice(DataGridViewRow row, InvoiceShared invoice, Price.ShowFormat priceFormat)
        {
            Contract.Requires(row != null);
            Contract.Requires(invoice != null);

            row.DefaultCellStyle.BackColor = Color.LightCyan;

            row.Cells[0].Value = invoice.Id;
            row.Cells[0].Tag   = invoice.Id;
            row.Cells[1].Value = invoice.PeriodToString();
            row.Cells[2].Value = "Yhteinen";
            row.Cells[3].Value = invoice.GetReadOut().ToString();
            row.Cells[4].Value = invoice.GetConsumption().ToString();
            row.Cells[5].Value = invoice.GetBasicFee().ToString(priceFormat);
            row.Cells[6].Value = invoice.GetUsageFee().ToString(priceFormat);
            row.Cells[7].Value = invoice.Balanced;
            row.Cells[8].Value = invoice.GetTotalPrice().ToString(Price.ShowFormat.both);

            row.Tag = invoice.CommonInvoice;
        }
Ejemplo n.º 15
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);
        }
Ejemplo n.º 16
0
        private static bool CalculateEstimatedFee(InvoiceShared estimatedInvoice, FeeConfig feeConfig)
        {
            Contract.Requires(estimatedInvoice != null);
            Contract.Requires(feeConfig != null);

            if (!CalculateCommonEstimatedBasicFee(estimatedInvoice, feeConfig))
            {
                return(false);
            }
            if (!CalculateCommonEstimatedUsageFee(estimatedInvoice, feeConfig))
            {
                return(false);
            }

            foreach (var userInvoice in estimatedInvoice.UserInvoices)
            {
                CalculateUserEstimatedBasicFee(estimatedInvoice, userInvoice, estimatedInvoice.UserInvoices.Count, feeConfig);
                CalculateUserEstimatedUsageFee(userInvoice, feeConfig);
            }

            return(true);
        }
Ejemplo n.º 17
0
        private void DeleteSelectedInvoices()
        {
            if (dataGridView.SelectedRows.Count == 0)
            {
                return;
            }

            if (MessageBox.Show("Poistetaanko valitut laskut?", "Posto", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                == DialogResult.No)
            {
                return;
            }

            anyChangesToInvoiceHistory = true;

            foreach (DataGridViewRow row in dataGridView.SelectedRows)
            {
                InvoiceShared invoice = GetCommonInvoiceFromRow(row);

                if (IsUserInvoice(row))
                {
                    UserInvoice userInvoice = GetUserInvoiceFromRow(row);
                    invoice.UserInvoices.Remove(userInvoice);
                }
                else
                {
                    foreach (var _ in invoice.UserInvoices)
                    {
                        // removing user invoices from datagrid
                        dataGridView.Rows.RemoveAt(row.Index + 1);
                    }

                    invoiceHistory.Invoices.Remove(invoice);
                }

                dataGridView.Rows.Remove(row);
            }
        }
Ejemplo n.º 18
0
        private static void CalculateRealFee(InvoiceShared realInvoice, IEnumerable <InvoiceShared> estimatedInvoices, IEnumerable <FeeConfig> feeConfigs)
        {
            Contract.Requires(realInvoice != null);
            Contract.Requires(feeConfigs != null);
            Contract.Requires(estimatedInvoices != null);

            realInvoice.GetBasicFee().ResetWaterFee();
            realInvoice.GetUsageFee().ResetWaterFee();
            realInvoice.UserInvoices.ForEach(invoice =>
            {
                invoice.GetBasicFee().ResetWaterFee();
                invoice.GetUsageFee().ResetWaterFee();
            });

            foreach (var estimatedInvoice in estimatedInvoices)
            {
                CalculateRealFee(realInvoice, estimatedInvoice, feeConfigs.GetFeeConfigOfPeriodOrThrowException(estimatedInvoice));
            }

            InvoiceShared unestimatedInvoice = realInvoice.CreateUnestimated(estimatedInvoices);

            CalculateRealFee(realInvoice, unestimatedInvoice, feeConfigs.GetFeeConfigOfPeriodOrThrowException(unestimatedInvoice));
        }
Ejemplo n.º 19
0
        private void AssertInvoicesFee(InvoiceShared expected, InvoiceShared actual)
        {
            Assert.AreEqual(expected.GetBasicFee().CleanWaterFee, actual.GetBasicFee().CleanWaterFee, $"different clean water basic fee of invoice {actual.Id}");
            Assert.AreEqual(expected.GetBasicFee().WasteWaterFee, actual.GetBasicFee().WasteWaterFee, $"different waste water basic fee of invoice {actual.Id}");
            Assert.AreEqual(expected.GetUsageFee().CleanWaterFee, actual.GetUsageFee().CleanWaterFee, $"different clean water usage fee of invoice {actual.Id}");
            Assert.AreEqual(expected.GetUsageFee().WasteWaterFee, actual.GetUsageFee().WasteWaterFee, $"different waste water usage fee of invoice {actual.Id}");

            Assert.AreEqual(expected.UserInvoices.Count, actual.UserInvoices.Count);
            for (int i = 0; i < expected.UserInvoices.Count; i++)
            {
                UserInvoice expectedUserInvoice = expected.UserInvoices[i];
                UserInvoice actualUserInvoice   = actual.UserInvoices.GetInvoiceByOwner(expectedUserInvoice.InvoiceOwner);
                Assert.IsNotNull(actualUserInvoice, $"missing user '{actualUserInvoice.InvoiceOwner}' invoice {actual.Id}");

                Assert.AreEqual(expectedUserInvoice.GetBasicFee().CleanWaterFee, actualUserInvoice.GetBasicFee().CleanWaterFee,
                                $"different clean water basic fee of user '{actualUserInvoice.InvoiceOwner}' invoice {actual.Id}");
                Assert.AreEqual(expectedUserInvoice.GetBasicFee().WasteWaterFee, actualUserInvoice.GetBasicFee().WasteWaterFee,
                                $"different waste water basic fee of user '{actualUserInvoice.InvoiceOwner}' invoice {actual.Id}");
                Assert.AreEqual(expectedUserInvoice.GetUsageFee().CleanWaterFee, actualUserInvoice.GetUsageFee().CleanWaterFee,
                                $"different clean water usage fee of user '{actualUserInvoice.InvoiceOwner}' invoice {actual.Id}");
                Assert.AreEqual(expectedUserInvoice.GetUsageFee().WasteWaterFee, actualUserInvoice.GetUsageFee().WasteWaterFee,
                                $"different waste water usage fee of user '{actualUserInvoice.InvoiceOwner}' invoice {actual.Id}");
            }
        }