fix: Zieldokument prüfen, Versions-Verarbeitung abwarten, Abschnittsseiten vom Backend

- Neue Version nur, wenn die Belegnummer in Paperless eindeutig zu genau
  diesem Dokument gehört (serverseitig geprüft)
- Auf die Paperless-Task der Version warten; Ablehnung → Fehler, Tag 21 weg
- Entscheidung im Posteingang nur zusammen mit processOnlyOne
- Vergleichsdialog im Posteingang zeigt die Seiten, die tatsächlich
  hochgeladen werden

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bjoernpoettkerandClaude Opus 5.5 committed 2026-11-02 14:14:01 +01:00
1 parent 98021fdcbf
commit 32b5228f68
10 files changed
+283 -19

No files matched your search

@@ -1,4 +1,9 @@
import { Injectable, Logger, NotFoundException } from '@nestjs/common';
import {
BadRequestException,
Injectable,
Logger,
NotFoundException,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import * as fs from 'fs/promises';
@@ -21,6 +26,7 @@ import { applyTemplate, buildVariables } from './variable-resolver';
import { DokumentVersionService } from '../paperless/dokument-version.service';
import {
aktionenAbEntscheidung,
originalSeitenDesAbschnitts,
type PaperlessEntscheidung,
} from './paperless-entscheidung.util';
@@ -58,6 +64,8 @@ export interface ActionResult {
verworfen?: boolean;
/** Aufgelöste interne Belegnummer (bei Duplikaten) */
belegnummer?: string;
/** Original-Seiten des Abschnitts (bei Duplikaten, für den Vergleich) */
seiten?: number[];
}
export interface RunForDocumentResult {
@@ -101,6 +109,12 @@ export class InboxPostprocessorService {
processOnlyOne: boolean = false,
entscheidung?: PaperlessEntscheidung,
): Promise<RunForDocumentResult> {
// Eine Duplikat-Entscheidung gilt immer nur für den einen Abschnitt
if (entscheidung && !processOnlyOne) {
throw new BadRequestException(
'Eine Duplikat-Entscheidung ist nur zusammen mit processOnlyOne erlaubt',
);
}
const doc = await this.docRepo.findOne({ where: { Id: documentId } });
if (!doc) throw new NotFoundException('Dokument nicht gefunden');
if (doc.Source === 'user' && doc.OwnerUsername !== preferredUsername) {
@@ -306,6 +320,12 @@ export class InboxPostprocessorService {
versionMoeglich: res.versionMoeglich,
duplikatKandidaten: res.duplikatKandidaten,
belegnummer: res.belegnummer,
seiten: res.skipped
? originalSeitenDesAbschnitts(
survivingOriginalPages,
pageIndices,
)
: undefined,
});
if (res.skipped) {
abortProcessing = true;
@@ -456,6 +476,7 @@ export class InboxPostprocessorService {
await this.dokumentVersion.haengeVersionAn(
entscheidung.documentId,
pdfPath,
interneBelegnummer,
);
this.logger.log(
`Belegnummer ${interneBelegnummer} als neue Version zu Dokument ${entscheidung.documentId} hinzugefügt`,