17QVariantMap toMetricsMap(
const core::ports::analysis::AnalysisResult& result) {
19 for (
const auto& [key, value] : result.
metrics) {
20 metrics.insert(QString::fromStdString(key), value);
25QVariantList toTableList(
const core::ports::analysis::AnalysisResult& result) {
27 for (
const auto& row : result.
table) {
29 for (
const auto& column : row) {
30 columns.push_back(QString::fromStdString(column));
32 table.push_back(columns);
38toArtifactList(
const core::ports::analysis::AnalysisResult& result) {
39 QVariantList artifacts;
40 for (
const auto& artifact : result.
artifacts) {
41 artifacts.push_back(QString::fromStdString(artifact));
46QStringList toStringList(
const std::vector<std::string>& values) {
48 out.reserve(
static_cast<int>(values.size()));
49 for (
const auto& value : values) {
51 out.push_back(QString::fromStdString(value));
58toTransactionRows(
const core::ports::analysis::AnalysisResult& result) {
59 QVariantList transactions;
63 QString::fromStdString(transaction.id);
65 QString::fromStdString(transaction.name);
67 QString::fromStdString(transaction.bookingDate);
70 QString::fromStdString(transaction.contractId);
72 transaction.contractType.empty()
74 : QString::fromStdString(transaction.contractType);
76 QStringList propertyIds;
77 propertyIds.reserve(
static_cast<int>(transaction.propertyIds.size()));
78 for (
const auto& propertyId : transaction.propertyIds) {
79 if (!propertyId.empty()) {
80 propertyIds.push_back(QString::fromStdString(propertyId));
85 QStringList propertyNames;
86 propertyNames.reserve(
static_cast<int>(transaction.propertyNames.size()));
87 for (
const auto& propertyName : transaction.propertyNames) {
88 if (!propertyName.empty()) {
89 propertyNames.push_back(QString::fromStdString(propertyName));
92 item[QStringLiteral(
"propertyNames")] = propertyNames;
94 transactions.push_back(item);
99std::vector<std::string> toStdStringList(
const QStringList& values) {
100 std::vector<std::string> out;
101 out.reserve(values.size());
102 for (
const auto& value : values) {
103 const QString trimmed = value.trimmed();
104 if (!trimmed.isEmpty()) {
105 out.push_back(trimmed.toStdString());
111std::vector<core::ports::analysis::AnalysisAdjustmentTransactionInput>
112toAdjustmentTransactions(
const QVariantList& transactions) {
113 std::vector<core::ports::analysis::AnalysisAdjustmentTransactionInput> out;
114 out.reserve(
static_cast<std::size_t
>(transactions.size()));
115 for (
const auto& value : transactions) {
116 const QVariantMap row = value.toMap();
117 core::ports::analysis::AnalysisAdjustmentTransactionInput item;
119 row.value(QStringLiteral(
"id")).toString().trimmed().toStdString();
120 item.
amount = row.value(QStringLiteral(
"amount")).toDouble();
121 if (!item.
id.empty()) {
122 out.push_back(std::move(item));
131 std::shared_ptr<core::ports::analysis::IAnalysisRunner> runner)
132 : runner_(std::move(runner)) {}
138 "Analysis runner invoked",
140 return runner_ ? runner_->runAnalysis(workspace, request)
147 const std::string& filterSpec)
const {
148 return runner_ ? runner_->previewTransactions(workspace,
155 const QString& filterSpec)
const {
157 request.
analysisId = analysisId.trimmed().toStdString();
164 return runner_ ? runner_->parseFilterSpec(filterSpec)
169AnalysisAdapter::filterSelectionFromFields(
170 const std::string& dateField,
const std::string& dateMode,
171 const std::string& year,
const std::string& dateFrom,
172 const std::string& dateTo,
const std::vector<std::string>& propertyIds,
173 const std::vector<std::string>& contractTypes,
174 const std::string& allocatableMode)
const {
175 return runner_ ? runner_->filterSelectionFromFields(
176 dateField, dateMode, year, dateFrom, dateTo, propertyIds,
182 const QString& dateField,
const QString& dateMode,
const QString& year,
183 const QString& dateFrom,
const QString& dateTo,
184 const QStringList& propertyIds,
const QStringList&
contractTypes,
185 const QString& allocatableMode)
const {
189 const auto selection = filterSelectionFromFields(
190 dateField.trimmed().toLower().toStdString(),
191 dateMode.trimmed().toLower().toStdString(), year.trimmed().toStdString(),
192 dateFrom.trimmed().toStdString(), dateTo.trimmed().toStdString(),
193 toStdStringList(propertyIds), toStdStringList(
contractTypes),
194 allocatableMode.trimmed().toLower().toStdString());
195 return QString::fromStdString(runner_->buildFilterSpec(selection));
199AnalysisAdapter::buildAnalysisAdjustments(
203 const std::vector<std::string>& selectedTransactionIds,
204 double taxPercent)
const {
205 return runner_ ? runner_->buildAnalysisAdjustments(
206 transactions, selectedTransactionIds, taxPercent)
211AnalysisAdapter::buildAnalysisAdjustments(
212 const QVariantList& transactions,
const QStringList& selectedTransactionIds,
213 double taxPercent)
const {
214 return buildAnalysisAdjustments(toAdjustmentTransactions(transactions),
215 toStdStringList(selectedTransactionIds),
220 const QVariantList& transactions,
const QStringList& selectedTransactionIds,
221 double taxPercent)
const {
223 for (
const auto& [
id, amount] : buildAnalysisAdjustments(
224 transactions, selectedTransactionIds, taxPercent)) {
225 out.insert(QString::fromStdString(
id), amount);
232 const QVariantMap& amountsById)
const {
234 out.reserve(
static_cast<std::size_t
>(amountsById.size()));
235 for (
auto it = amountsById.constBegin(); it != amountsById.constEnd(); ++it) {
236 const QString
id = it.key().trimmed();
238 out.emplace_back(
id.toStdString(), it.value().toDouble());
245 double defaultValue)
const {
249 return runner_->parseAnalysisPercentText(
text.toStdString())
250 .value_or(defaultValue);
255 const std::string& analysisId,
bool includeCalculationAdjustments,
258 runner_->applyAnalysisPreviewOverrides(
259 workspace, analysisId, includeCalculationAdjustments, adjustments);
266 bool includeCalculationAdjustments,
267 const std::string& unassignedLabel)
const {
268 return runner_ ? runner_->projectTableState(result, adjustments,
269 includeCalculationAdjustments,
277 : std::vector<std::string>{};
286 QString::fromStdString(result.
type);
288 {QStringLiteral(
"type"), QString::fromStdString(result.
config.
type)},
289 {QStringLiteral(
"plotType"),
291 {QStringLiteral(
"plotMeasure"),
294 {QStringLiteral(
"contractTypes"),
299 toTransactionRows(result);
311 contractTypes.push_back(QString::fromStdString(contractType));
314 QVariantList propertyRows;
315 propertyRows.reserve(
static_cast<int>(state.
propertyRows.size()));
317 QVariantList amounts;
318 amounts.reserve(
static_cast<int>(row.amounts.size()));
319 for (
double amount : row.amounts) {
320 amounts.push_back(amount);
322 propertyRows.push_back(
323 QVariantMap{{QStringLiteral(
"propertyName"),
324 QString::fromStdString(row.propertyName)},
325 {QStringLiteral(
"amounts"), amounts},
326 {QStringLiteral(
"total"), row.total}});
329 return QVariantMap{{QStringLiteral(
"contractTypes"),
contractTypes},
330 {QStringLiteral(
"propertyRows"), propertyRows},
331 {QStringLiteral(
"grandTotal"), state.
grandTotal}};
337 QVariantList transactions;
338 transactions.reserve(
static_cast<int>(preview.
transactions.size()));
342 const QString txId = QString::fromStdString(transaction.id);
343 const QString statementId = QString::fromStdString(transaction.statementId);
344 const QString contractId = QString::fromStdString(transaction.contractId);
346 QStringList propertyIds;
347 propertyIds.reserve(
static_cast<int>(transaction.propertyIds.size()));
348 for (
const auto& propertyId : transaction.propertyIds) {
349 const QString
id = QString::fromStdString(propertyId);
350 if (!
id.isEmpty() && !propertyIds.contains(
id)) {
351 propertyIds.push_back(
id);
355 QStringList propertyNames;
356 propertyNames.reserve(
static_cast<int>(transaction.propertyNames.size()));
357 for (
const auto& name : transaction.propertyNames) {
359 propertyNames.push_back(QString::fromStdString(name));
363 row[QStringLiteral(
"id")] = txId;
364 row[QStringLiteral(
"name")] = QString::fromStdString(transaction.name);
365 row[QStringLiteral(
"transactionName")] =
366 QString::fromStdString(transaction.name);
367 row[QStringLiteral(
"date")] =
368 QString::fromStdString(transaction.bookingDate);
369 row[QStringLiteral(
"valuta")] = QString::fromStdString(transaction.valuta);
370 row[QStringLiteral(
"amount")] = transaction.amount;
371 row[QStringLiteral(
"statementId")] = statementId;
372 row[QStringLiteral(
"statementName")] =
373 QString::fromStdString(transaction.statementName);
374 row[QStringLiteral(
"actorName")] =
375 QString::fromStdString(transaction.actorName);
376 row[QStringLiteral(
"contractId")] = contractId;
377 row[QStringLiteral(
"contractName")] =
378 QString::fromStdString(transaction.contractName);
379 row[QStringLiteral(
"contractType")] =
380 QString::fromStdString(transaction.contractType);
381 row[QStringLiteral(
"propertyIds")] = propertyIds;
382 row[QStringLiteral(
"propertyNames")] = propertyNames;
383 row[QStringLiteral(
"propertiesLabel")] =
384 propertyNames.join(QStringLiteral(
", "));
385 row[QStringLiteral(
"allocatable")] = transaction.allocatable;
387 transactions.push_back(row);
392 metrics[QStringLiteral(
"transactionCount")] =
396 out[QStringLiteral(
"transactions")] = transactions;
397 out[QStringLiteral(
"metrics")] = metrics;
406 values.push_back(QString::fromStdString(type));
Declares the analysis adapter used by UI workflows.
Declarations for the UI PayloadKeys component.
Provides translated C++ UI strings for shell, workflow, adapter and view model code.
Declarations for the UI Trace component.
QStringList mapContractTypes(const std::vector< std::string > &contractTypes) const
Maps contract types to a QML string list.
QVariantMap buildAnalysisAdjustmentAmounts(const QVariantList &transactions, const QStringList &selectedTransactionIds, double taxPercent) const
Builds analysis adjustment amounts from preview rows.
core::ports::analysis::AnalysisTableState projectTableState(const core::ports::analysis::AnalysisResult &result, const core::ports::analysis::AnalysisAdjustmentAmounts &adjustments, bool includeCalculationAdjustments, const std::string &unassignedLabel) const
Projects table state for QML presentation.
core::ports::analysis::AnalysisAdjustmentAmounts adjustmentAmountsFromMap(const QVariantMap &amountsById) const
Converts a QML adjustment amount map to core adjustment pairs.
AnalysisAdapter(std::shared_ptr< core::ports::analysis::IAnalysisRunner > runner)
Creates an analysis adapter backed by a core runner.
core::ports::analysis::AnalysisFilterSelection parseFilterSpec(const std::string &filterSpec) const
Parses a serialized analysis filter specification through the core runner.
core::ports::analysis::AnalysisResult runAnalysis(const core::ports::workspace::WorkspaceSnapshot &workspace, const core::ports::analysis::AnalysisRequest &request) const
Runs an analysis through the core runner.
QVariantMap mapAnalysisResult(const core::ports::analysis::AnalysisResult &result) const
Maps an analysis result to a QML payload.
QVariantMap mapAnalysisTableState(const core::ports::analysis::AnalysisTableState &state) const
Maps table state to a QML payload.
std::vector< std::string > contractTypes(const core::ports::workspace::WorkspaceSnapshot &workspace) const
Returns available contract types from the core runner.
void applyAnalysisPreviewOverrides(core::ports::workspace::WorkspaceSnapshot &workspace, const std::string &analysisId, bool includeCalculationAdjustments, const core::ports::analysis::AnalysisAdjustmentAmounts &adjustments) const
Applies preview-only overrides to a workspace snapshot.
double parseAnalysisPercentText(const QString &text, double defaultValue=0.0) const
Parses user-entered percent text through the core runner.
core::ports::analysis::AnalysisRequest buildAnalysisRequest(const QString &analysisId, const QString &filterSpec) const
Builds an analysis request from UI-facing ids and filter specs.
QVariantMap mapPreviewResult(const core::ports::analysis::AnalysisPreviewResult &preview) const
Maps preview result to a QML payload.
core::ports::analysis::AnalysisPreviewResult previewTransactions(const core::ports::workspace::WorkspaceSnapshot &workspace, const std::string &filterSpec) const
Builds preview transactions through the core runner.
QString buildFilterSpec(const QString &dateField, const QString &dateMode, const QString &year, const QString &dateFrom, const QString &dateTo, const QStringList &propertyIds, const QStringList &contractTypes, const QString &allocatableMode) const
Builds a serialized analysis filter specification from UI fields.
std::vector< std::pair< std::string, double > > AnalysisAdjustmentAmounts
Adjustment amount pairs keyed by transaction id.
void traceAdapter(const char *origin, std::string message, core::errors::ErrorContext context={})
Emits an adapter trace event.
QString unassignedContractType()
Label for transactions without an assigned contract type.
AnalysisPreviewMetrics metrics
std::vector< AnalysisPreviewTransaction > transactions
AnalysisFilterSelection filter
std::vector< std::string > artifacts
std::vector< AnalysisTransaction > transactions
AnalysisConfigInput config
std::vector< std::vector< std::string > > table
std::map< std::string, double > metrics
std::vector< std::string > contractTypes
std::vector< AnalysisTablePropertyRow > propertyRows