changeset 907:fa068ce3faac

IN 37: handles updating the distrubtion in the survey when the budget item source is renamed.
author John Schneiderman <JohnMS@member.fsf.org>
date Mon, 17 Oct 2022 17:33:44 +0200
parents c03b90fb95ec
children b1ab37bce375
files src/navigation/internal/BudgetBankLedgers.cpp src/navigation/unit-tests/BudgetBankLedgers-unit-tests.cpp
diffstat 2 files changed, 300 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/navigation/internal/BudgetBankLedgers.cpp	Mon Oct 10 18:58:35 2022 +0200
+++ b/src/navigation/internal/BudgetBankLedgers.cpp	Mon Oct 17 17:33:44 2022 +0200
@@ -387,30 +387,55 @@
 {
 	this->verifyBudgetSourceName(changed);
 	this->budgetLedgers_.renameWage(original, changed, {});
+	const BudgetItemIdentifier id{BudgetItemTypes::Wage, original};
+
+	for (auto& survey : this->surveys_)
+		if (survey.second.distribution().count(id) != 0)
+			survey.second.renamed(id, changed);
 }
 
 void BudgetBankLedgers::renameBill(const BudgetSource& original, const BudgetSource& changed)
 {
 	this->verifyBudgetSourceName(changed);
 	this->budgetLedgers_.renameBill(original, changed, {});
+	const BudgetItemIdentifier id{BudgetItemTypes::Bill, original};
+
+	for (auto& survey : this->surveys_)
+		if (survey.second.distribution().count(id) != 0)
+			survey.second.renamed(id, changed);
 }
 
 void BudgetBankLedgers::renameDebt(const BudgetSource& original, const BudgetSource& changed)
 {
 	this->verifyBudgetSourceName(changed);
 	this->budgetLedgers_.renameDebt(original, changed, {});
+	const BudgetItemIdentifier id{BudgetItemTypes::Debt, original};
+
+	for (auto& survey : this->surveys_)
+		if (survey.second.distribution().count(id) != 0)
+			survey.second.renamed(id, changed);
 }
 
 void BudgetBankLedgers::renameGoal(const BudgetSource& original, const BudgetSource& changed)
 {
 	this->verifyBudgetSourceName(changed);
 	this->budgetLedgers_.renameGoal(original, changed, {});
+	const BudgetItemIdentifier id{BudgetItemTypes::Goal, original};
+
+	for (auto& survey : this->surveys_)
+		if (survey.second.distribution().count(id) != 0)
+			survey.second.renamed(id, changed);
 }
 
 void BudgetBankLedgers::renameNontrack(const BudgetSource& original, const BudgetSource& changed)
 {
 	this->verifyBudgetSourceName(changed);
 	this->budgetLedgers_.renameNontrack(original, changed, {});
+	const BudgetItemIdentifier id{BudgetItemTypes::Nontrack, original};
+
+	for (auto& survey : this->surveys_)
+		if (survey.second.distribution().count(id) != 0)
+			survey.second.renamed(id, changed);
 }
 
 //}
@@ -936,7 +961,7 @@
 	const auto previousSurvey{this->surveys_.find(ba)};
 	const auto& ledger{this->generalLedger_.ledger(ba.account_.code_)};
 	const auto reconciledBalance{
-		[&previousSurvey, &ledger, &allReconciled, &allAdded, ac{ba.account_.code_}, this] ()
+		[&previousSurvey, &ledger, &allReconciled, &allAdded, ac{ba.account_.code_}] ()
 		{
 			Money balance{
 				previousSurvey.hasValue()
@@ -961,6 +986,7 @@
 		allPosted.emplace_back(this->generalLedger_.post(added));
 	this->generalLedger_.clear(allPosted);
 	this->generalLedger_.clear(allReconciled);
+	// TODO: confirm that the monies distributed in the survey is not also distributed in another survey.
 
 	try
 	{
--- a/src/navigation/unit-tests/BudgetBankLedgers-unit-tests.cpp	Mon Oct 10 18:58:35 2022 +0200
+++ b/src/navigation/unit-tests/BudgetBankLedgers-unit-tests.cpp	Mon Oct 17 17:33:44 2022 +0200
@@ -720,6 +720,279 @@
 		);
 	}
 
+	void renameBill_hasCompletedSurvey_ShouldBeRenamed()
+	{
+		BudgetBankLedgers bbl{};
+		const BudgetSource originalSource{"Original Source Name"};
+		const Bill item{
+			originalSource,
+			Money{1500, 0u, Iso4217Codes::USD},
+			EventFrequency::Monthly,
+			{2020, 11, 29}
+		};
+		bbl.add(item);
+		const Bank c1st{BankName{"Community 1st"}};
+		bbl.add(c1st);
+		const auto savings{
+			bbl.addAccount(
+				"Primary Share",
+				SupportedAccountTypes::Savings,
+				Money{Iso4217Codes::USD}
+			)
+		};
+		bbl.addAssociation(c1st.name_, savings.number(), SupportedAccountTypes::Savings);
+		const Money surveyAmount{5, 0u, Iso4217Codes::USD};
+		const BudgetItemIdentifier id{BudgetItemTypes::Bill, item.source()};
+		const auto budgetAccount{bbl.budgetLedgers().lookUpAccountCode(id)};
+		const auto bankAccount{*bbl.findBankAccount(c1st.name_, savings.number())};
+		bbl.completedSurvey(
+			QDate::currentDate(),
+			bankAccount,
+			{},
+			{
+				{
+					Transaction{
+						QDate::currentDate(),
+						savings,
+						budgetAccount,
+						surveyAmount
+					}
+				}
+			},
+			{
+				{
+					{id, surveyAmount}
+				}
+			}
+		);
+		const BudgetSource newSource{"New Source Name"};
+		QVERIFY_NO_THROW(bbl.renameBill(originalSource, newSource));
+		const auto survey{*bbl.surveys().cbegin()};
+		QVERIFY_THAT(
+			survey.second.distribution().cbegin()->first.source_,
+			equals(newSource)
+		);
+	}
+
+	void renameDebt_hasCompletedSurvey_ShouldBeRenamed()
+	{
+		BudgetBankLedgers bbl{};
+		const BudgetSource originalSource{"Original Source Name"};
+		const Debt item{
+			originalSource,
+			Money{1500, 0u, Iso4217Codes::USD},
+			EventFrequency::Monthly,
+			{2020, 11, 29},
+			Money{15000, 0u, Iso4217Codes::USD},
+			Percentage{15.00}
+		};
+		bbl.add(item);
+		const Bank c1st{BankName{"Community 1st"}};
+		bbl.add(c1st);
+		const auto savings{
+			bbl.addAccount(
+				"Primary Share",
+				SupportedAccountTypes::Savings,
+				Money{Iso4217Codes::USD}
+			)
+		};
+		bbl.addAssociation(c1st.name_, savings.number(), SupportedAccountTypes::Savings);
+		const Money surveyAmount{5, 0u, Iso4217Codes::USD};
+		const BudgetItemIdentifier id{BudgetItemTypes::Debt, item.source()};
+		const auto budgetAccount{bbl.budgetLedgers().lookUpAccountCode(id)};
+		const auto bankAccount{*bbl.findBankAccount(c1st.name_, savings.number())};
+		bbl.completedSurvey(
+			QDate::currentDate(),
+			bankAccount,
+			{},
+			{
+				{
+					Transaction{
+						QDate::currentDate(),
+						savings,
+						budgetAccount,
+						surveyAmount
+					}
+				}
+			},
+			{
+				{
+					{id, surveyAmount}
+				}
+			}
+		);
+		const BudgetSource newSource{"New Source Name"};
+		QVERIFY_NO_THROW(bbl.renameDebt(originalSource, newSource));
+		const auto survey{*bbl.surveys().cbegin()};
+		QVERIFY_THAT(
+			survey.second.distribution().cbegin()->first.source_,
+			equals(newSource)
+		);
+	}
+
+	void renameGoal_hasCompletedSurvey_ShouldBeRenamed()
+	{
+		BudgetBankLedgers bbl{};
+		const BudgetSource originalSource{"Original Source Name"};
+		const Goal item{
+			originalSource,
+			Money{1500, 0u, Iso4217Codes::USD},
+			EventFrequency::Monthly,
+			{2020, 11, 29},
+			Money{15000, 0u, Iso4217Codes::USD}
+		};
+		bbl.add(item);
+		const Bank c1st{BankName{"Community 1st"}};
+		bbl.add(c1st);
+		const auto savings{
+			bbl.addAccount(
+				"Primary Share",
+				SupportedAccountTypes::Savings,
+				Money{Iso4217Codes::USD}
+			)
+		};
+		bbl.addAssociation(c1st.name_, savings.number(), SupportedAccountTypes::Savings);
+		const Money surveyAmount{5, 0u, Iso4217Codes::USD};
+		const BudgetItemIdentifier id{BudgetItemTypes::Goal, item.source()};
+		const auto budgetAccount{bbl.budgetLedgers().lookUpAccountCode(id)};
+		const auto bankAccount{*bbl.findBankAccount(c1st.name_, savings.number())};
+		bbl.completedSurvey(
+			QDate::currentDate(),
+			bankAccount,
+			{},
+			{
+				{
+					Transaction{
+						QDate::currentDate(),
+						savings,
+						budgetAccount,
+						surveyAmount
+					}
+				}
+			},
+			{
+				{
+					{id, surveyAmount}
+				}
+			}
+		);
+		const BudgetSource newSource{"New Source Name"};
+		QVERIFY_NO_THROW(bbl.renameGoal(originalSource, newSource));
+		const auto survey{*bbl.surveys().cbegin()};
+		QVERIFY_THAT(
+			survey.second.distribution().cbegin()->first.source_,
+			equals(newSource)
+		);
+	}
+
+	void renameNontrack_hasCompletedSurvey_ShouldBeRenamed()
+	{
+		BudgetBankLedgers bbl{};
+		const BudgetSource originalSource{"Original Source Name"};
+		const Nontrack item{
+			originalSource,
+			Money{1500, 0u, Iso4217Codes::USD},
+			EventFrequency::Monthly,
+			{2020, 11, 29}
+		};
+		bbl.add(item);
+		const Bank c1st{BankName{"Community 1st"}};
+		bbl.add(c1st);
+		const auto savings{
+			bbl.addAccount(
+				"Primary Share",
+				SupportedAccountTypes::Savings,
+				Money{Iso4217Codes::USD}
+			)
+		};
+		bbl.addAssociation(c1st.name_, savings.number(), SupportedAccountTypes::Savings);
+		const Money surveyAmount{5, 0u, Iso4217Codes::USD};
+		const BudgetItemIdentifier id{BudgetItemTypes::Nontrack, item.source()};
+		const auto budgetAccount{bbl.budgetLedgers().lookUpAccountCode(id)};
+		const auto bankAccount{*bbl.findBankAccount(c1st.name_, savings.number())};
+		bbl.completedSurvey(
+			QDate::currentDate(),
+			bankAccount,
+			{},
+			{
+				{
+					Transaction{
+						QDate::currentDate(),
+						savings,
+						budgetAccount,
+						surveyAmount
+					}
+				}
+			},
+			{
+				{
+					{id, surveyAmount}
+				}
+			}
+		);
+		const BudgetSource newSource{"New Source Name"};
+		QVERIFY_NO_THROW(bbl.renameNontrack(originalSource, newSource));
+		const auto survey{*bbl.surveys().cbegin()};
+		QVERIFY_THAT(
+			survey.second.distribution().cbegin()->first.source_,
+			equals(newSource)
+		);
+	}
+
+	void renameWage_hasCompletedSurvey_ShouldBeRenamed()
+	{
+		BudgetBankLedgers bbl{};
+		const BudgetSource originalSource{"Original Source Name"};
+		const Wage item{
+			originalSource,
+			Money{1500, 0u, Iso4217Codes::USD},
+			EventFrequency::Monthly,
+			{2020, 11, 29}
+		};
+		bbl.add(item);
+		const Bank c1st{BankName{"Community 1st"}};
+		bbl.add(c1st);
+		const auto savings{
+			bbl.addAccount(
+				"Primary Share",
+				SupportedAccountTypes::Savings,
+				Money{Iso4217Codes::USD}
+			)
+		};
+		bbl.addAssociation(c1st.name_, savings.number(), SupportedAccountTypes::Savings);
+		const Money surveyAmount{5, 0u, Iso4217Codes::USD};
+		const BudgetItemIdentifier id{BudgetItemTypes::Wage, item.source()};
+		const auto budgetAccount{bbl.budgetLedgers().lookUpAccountCode(id)};
+		const auto bankAccount{*bbl.findBankAccount(c1st.name_, savings.number())};
+		bbl.completedSurvey(
+			QDate::currentDate(),
+			bankAccount,
+			{},
+			{
+				{
+					Transaction{
+						QDate::currentDate(),
+						savings,
+						budgetAccount,
+						surveyAmount
+					}
+				}
+			},
+			{
+				{
+					{id, surveyAmount}
+				}
+			}
+		);
+		const BudgetSource newSource{"New Source Name"};
+		QVERIFY_NO_THROW(bbl.renameWage(originalSource, newSource));
+		const auto survey{*bbl.surveys().cbegin()};
+		QVERIFY_THAT(
+			survey.second.distribution().cbegin()->first.source_,
+			equals(newSource)
+		);
+	}
+
 	//}
 
 	//{ add Account Tests