FOSSredder 0.5.0
Loading...
Searching...
No Matches
AdjustmentCalculation.cpp
Go to the documentation of this file.
1
5
9
11
12#include <nlohmann/json.hpp>
13
14#include <string>
15#include <unordered_map>
16
18namespace {
19
20struct TaxConfig {
21 bool enabled = false;
22 double factor = 1.0;
23};
24
25TaxConfig parseTax(const core::domain::Analysis &analysis) {
26 TaxConfig config;
27 if (analysis.configJson().empty()) {
28 return config;
29 }
30
31 try {
32 const auto json = nlohmann::json::parse(analysis.configJson());
33 if (!json.is_object()) {
34 return config;
35 }
36
37 const auto strategyIt =
39 if (strategyIt == json.end() || !strategyIt->is_string()) {
40 return config;
41 }
42 if (strategyIt->get<std::string>() !=
44 return config;
45 }
46
47 config.enabled = true;
48
49 const auto percentIt =
51 if (percentIt == json.end() || !percentIt->is_number()) {
52 return config;
53 }
54
55 const double percent = percentIt->get<double>();
56 config.factor = 1.0 + (percent / 100.0);
57 return config;
58 } catch (...) {}
59
60 return {};
61}
62
63} // namespace
64
65core::ports::analysis::AnalysisResult
68 const AnalysisFilter &filter) {
70 const std::unordered_map<std::string, double> adjustments =
71 analysis.adjustments();
72 const TaxConfig taxConfig = parseTax(analysis);
73
74 for (const auto &transaction : collectAnalysisTransactions(state, filter)) {
75 const std::string label = transaction->bookingDate().empty()
76 ? transaction->name()
77 : transaction->bookingDate();
78
79 double adjustedAmount = transaction->amount();
80 const auto adjustmentIt = adjustments.find(transaction->id());
81 if (adjustmentIt != adjustments.end()) {
82 adjustedAmount = adjustmentIt->second;
83 } else if (taxConfig.enabled) {
84 adjustedAmount *= taxConfig.factor;
85 }
86
87 nlohmann::json summary;
89 transaction->amount();
91 adjustedAmount;
92 if (taxConfig.enabled) {
94 (taxConfig.factor - 1.0) * 100.0;
96 taxConfig.factor;
97 }
99 transaction->id();
100
101 out.table.push_back({label, summary.dump()});
102 }
103
105 static_cast<double>(out.table.size());
106 return out;
107}
108
109} // namespace core::application::analysis
Declares adjustment analysis calculation helpers.
Declares internal analysis filter predicates and collection helpers.
Defines stable analysis type, configuration, filter, and result keys.
Declares the analysis execution result port contract.
nlohmann::json json
Aggregates transaction predicates parsed from one analysis filter specification.
const std::string & configJson() const noexcept
Definition Analysis.cpp:196
std::vector< std::shared_ptr< core::domain::Transaction > > collectAnalysisTransactions(const core::domain::catalog::WorkspaceCatalog &state, const AnalysisFilter &filter)
Collects transactions that satisfy the supplied filter.
core::ports::analysis::AnalysisResult computeAdjustmentAnalysis(const core::domain::Analysis &analysis, const core::domain::catalog::WorkspaceCatalog &state, const AnalysisFilter &filter)
Computes adjusted transaction rows for one analysis definition.
std::vector< std::vector< std::string > > table
std::map< std::string, double > metrics