30namespace poppler = core::ports::pdf_rendering;
31namespace tesseract = core::ports::text_recognition;
35constexpr auto kPausePollInterval = std::chrono::milliseconds(50);
37bool waitWhilePaused(
const ImportRequest& req)
39 while (req.pauseFlag && req.pauseFlag->load()) {
40 if (req.cancelFlag && req.cancelFlag->load())
return false;
41 std::this_thread::sleep_for(kPausePollInterval);
43 return !(req.cancelFlag && req.cancelFlag->load());
51 std::shared_ptr<core::ports::document_image_processing::IDocumentImageProcessor> documentImageProcessor,
52 std::shared_ptr<core::ports::text_recognition::ITextRecognizer> tesseract,
53 std::shared_ptr<core::ports::diagnostics::IErrorReporter> errorReporter)
54 : poppler_(std::move(poppler))
55 , documentImageProcessor_(std::move(documentImageProcessor))
56 , tesseract_(std::move(tesseract))
57 , errorReporter_(std::move(errorReporter)) {
62 if (!poppler_ || !documentImageProcessor_ || !tesseract_)
return out;
63 if (req.
runRoot.empty())
return out;
67 const std::filesystem::path runRoot(req.
runRoot);
75 std::vector<core::application::importing::draft::TransactionDraft> all;
80 core::errors::ErrorSeverity::Info,
81 "core::import::DefaultImportStatementStrategy::run",
82 std::string(
"poppler render start: ") + renderRequest.pdfPath.string() +
" dpi=" + std::to_string(renderRequest.dpi),
87 const auto renderStart = core::application::importing::ImportClock::now();
88 auto renderRes = poppler_->render(renderRequest);
89 timings.renderSec = std::chrono::duration<double>(core::application::importing::ImportClock::now() - renderStart).count();
97 const auto extractStart = core::application::importing::ImportClock::now();
98 auto extractRes = poppler_->extract(extractRequest);
99 timings.extractSec = std::chrono::duration<double>(core::application::importing::ImportClock::now() - extractStart).count();
103 std::string carriedBookingDate;
106 core::application::importing::SchedulerResources schedulerResources(
107 req, errorReporter_);
108 std::mutex artifactsMutex;
112 documentImageProcessor_,
116 errorReporter_.get(),
120 const size_t totalPages = pages.size();
122 const auto finalizeStart = core::application::importing::ImportClock::now();
125 documentImageProcessor_,
130 errorReporter_.get(),
133 timings.finalizeSec = std::chrono::duration<double>(core::application::importing::ImportClock::now() - finalizeStart).count();
136 out.data = std::make_shared<Statement>();
137 auto statementName = std::filesystem::path(req.sourcePath).stem().string();
138 if (statementName.empty()) {
139 statementName = std::filesystem::path(req.sourcePath).filename().string();
141 if (statementName.empty()) {
142 statementName =
"Imported statement";
144 out.data->rename(statementName);
145 std::vector<std::string> transactionIds;
146 transactionIds.reserve(all.size());
147 for (
const auto& transaction : all) {
148 if (!transaction.id.empty()) {
149 transactionIds.push_back(transaction.id);
152 out.data->setTransactionIds(std::move(transactionIds));
153 out.transactions = std::move(all);
163 std::shared_ptr<core::ports::pdf_rendering::IPdfRenderer> poppler_;
164 std::shared_ptr<core::ports::document_image_processing::IDocumentImageProcessor> documentImageProcessor_;
165 std::shared_ptr<core::ports::text_recognition::ITextRecognizer> tesseract_;
166 std::shared_ptr<core::ports::diagnostics::IErrorReporter> errorReporter_;
170 std::shared_ptr<core::ports::document_image_processing::IDocumentImageProcessor> documentImageProcessor,
171 std::shared_ptr<core::ports::text_recognition::ITextRecognizer> tesseract,
172 std::shared_ptr<core::ports::diagnostics::IErrorReporter> errorReporter) {
173 return std::make_unique<DefaultImportStatementStrategy>(std::move(poppler), std::move(documentImageProcessor), std::move(tesseract), std::move(errorReporter));
FinalizeStats finalizeParsedPages(const ImportRequest &req, const std::vector< PageWork > &pages, const std::shared_ptr< core::ports::document_image_processing::IDocumentImageProcessor > &documentImageProcessor, ImportResult &out, std::vector< core::application::importing::draft::TransactionDraft > &all, std::string &carriedBookingDate, int &nextTxIndex, core::ports::diagnostics::IErrorReporter *errorReporter, const ProgressReporter &report, std::mutex &artifactsMutex)
Provides shared helpers for reporting structured errors and exceptions.
Document image processing port for import workflows.
Declares the public statement import service interface and factory.
PDF rendering port for import workflows.
Defines private constants shared by core import orchestration.
Declares private helper types and functions for the import pipeline implementation.
Declares private import strategy contracts used only by core import implementation files.
Declares private support types and helpers for the default import strategy.
Request types for PDF rendering operations.
Domain model for statements.
DefaultImportStatementStrategy(std::shared_ptr< core::ports::pdf_rendering::IPdfRenderer > poppler, std::shared_ptr< core::ports::document_image_processing::IDocumentImageProcessor > documentImageProcessor, std::shared_ptr< core::ports::text_recognition::ITextRecognizer > tesseract, std::shared_ptr< core::ports::diagnostics::IErrorReporter > errorReporter)
ImportResult run(const ImportRequest &req) override
Collects common core includes and aliases for precompiled-header builds.
constexpr std::string_view kProgressRenderedMessage
constexpr std::string_view kProgressExtractedMessage
constexpr double kProgressExtracted
constexpr std::string_view kProgressRenderingMessage
constexpr std::string_view kProgressExtractingMessage
constexpr std::string_view kProgressCanceled
constexpr double kProgressRendered
constexpr std::string_view kProgressDoneMessage
constexpr double kProgressPreparing
constexpr std::string_view kProgressPreparingMessage
constexpr double kProgressRendering
constexpr double kProgressExtracting
FinalizeStats finalizeParsedPages(const ImportRequest &req, const std::vector< PageWork > &pages, const std::shared_ptr< core::ports::document_image_processing::IDocumentImageProcessor > &documentImageProcessor, ImportResult &out, std::vector< core::application::importing::draft::TransactionDraft > &all, std::string &carriedBookingDate, int &nextTxIndex, core::ports::diagnostics::IErrorReporter *errorReporter, const ProgressReporter &report, std::mutex &artifactsMutex)
core::ports::pdf_rendering::RenderRequest makeRenderRequest(const ImportRequest &req)
std::vector< internal::PageWork > collectPageWork(const ImportRequest &req, const core::ports::pdf_rendering::RenderResult &renderResult, const core::ports::pdf_rendering::ExtractResult &extractResult, const std::shared_ptr< core::ports::document_image_processing::IDocumentImageProcessor > &documentImageProcessor, const std::shared_ptr< core::ports::text_recognition::ITextRecognizer > &tesseract, SchedulerResources &resources, const internal::ProgressReporter &report, core::ports::diagnostics::IErrorReporter *errorReporter, ImportResult &out, std::mutex &artifactsMutex)
std::unique_ptr< IImportStatementStrategy > createDefaultImportStrategy(std::shared_ptr< core::ports::pdf_rendering::IPdfRenderer > poppler, std::shared_ptr< core::ports::document_image_processing::IDocumentImageProcessor > documentImageProcessor, std::shared_ptr< core::ports::text_recognition::ITextRecognizer > tesseract, std::shared_ptr< core::ports::diagnostics::IErrorReporter > errorReporter)
internal::ProgressReporter makeProgressReporter(const ImportRequest &req, core::ports::diagnostics::IErrorReporter *errorReporter)
void ensureDirectoryExists(const std::filesystem::path &path, core::ports::diagnostics::IErrorReporter *errorReporter, const char *origin)
core::ports::pdf_rendering::ExtractRequest makeExtractRequest(const core::ports::pdf_rendering::RenderRequest &renderRequest, const ImportRequest &req)
void attachMetricsArtifact(ImportResult &out, const ImportRequest &req, const std::vector< internal::PageWork > &pages, size_t totalPages, const internal::FinalizeStats &finalizeStats, const ImportRunTimings &timings, core::ports::diagnostics::IErrorReporter *errorReporter)
void report(core::ports::diagnostics::IErrorReporter *reporter, const ErrorEvent &event)
Report an already constructed error event when a reporter exists.
Describes one import execution request.