12#include <nlohmann/json.hpp>
15#include <unordered_map>
25TaxConfig parseTax(
const core::domain::Analysis &analysis) {
33 if (!
json.is_object()) {
37 const auto strategyIt =
39 if (strategyIt ==
json.end() || !strategyIt->is_string()) {
42 if (strategyIt->get<std::string>() !=
47 config.enabled =
true;
49 const auto percentIt =
51 if (percentIt ==
json.end() || !percentIt->is_number()) {
55 const double percent = percentIt->get<
double>();
56 config.factor = 1.0 + (percent / 100.0);
65core::ports::analysis::AnalysisResult
70 const std::unordered_map<std::string, double> adjustments =
72 const TaxConfig taxConfig = parseTax(
analysis);
75 const std::string label = transaction->bookingDate().empty()
77 : transaction->bookingDate();
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;
87 nlohmann::json summary;
89 transaction->amount();
92 if (taxConfig.enabled) {
94 (taxConfig.factor - 1.0) * 100.0;
101 out.
table.push_back({label, summary.dump()});
105 static_cast<double>(out.
table.size());
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.
Aggregates transaction predicates parsed from one analysis filter specification.
const std::string & configJson() const noexcept
constexpr std::string_view kStrategyKey
constexpr std::string_view kPercentKey
constexpr std::string_view kStrategyTax
constexpr std::string_view kRows
constexpr std::string_view kAmountAdjusted
constexpr std::string_view kTransactionId
constexpr std::string_view kTaxFactor
constexpr std::string_view kTaxPercent
constexpr std::string_view kAmountOriginal
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