feat: tag documents as Posteingang when AM entry is missing during upload check
Build and Push Multi-Platform Images / build-and-push (push) Successful in 37s
Build and Push Multi-Platform Images / build-and-push (push) Successful in 37s
- Add agrarmonitor_tag_posteingang setting (default empty) - When a document is not found in Agrarmonitor, move it back to Posteingang tag instead of skipping (if tagPosteingang is configured) - Expose tagPosteingang in polling config API and settings UI Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -53,6 +53,7 @@ export class AgrarmonitorPollingService implements OnModuleInit {
|
||||
await this.upsertSetting('agrarmonitor_tag_verbucht', '9');
|
||||
await this.upsertSetting('agrarmonitor_tag_hochgeladen', '');
|
||||
await this.upsertSetting('agrarmonitor_link_field', '');
|
||||
await this.upsertSetting('agrarmonitor_tag_posteingang', '');
|
||||
}
|
||||
|
||||
@Cron(process.env['AGRARMONITOR_POLLING_CRON'] || '0 */30 * * * *')
|
||||
@@ -67,18 +68,20 @@ export class AgrarmonitorPollingService implements OnModuleInit {
|
||||
this.processVerarbeiteteDocuments().catch((err) => this.logger.error('Cron-Upload-Check-Fehler:', err));
|
||||
}
|
||||
|
||||
async getPollingConfig(): Promise<{ tagFertig: string; tagVerbucht: string; tagHochgeladen: string; linkField: string }> {
|
||||
const [fertig, verbucht, hochgeladen, linkField] = await Promise.all([
|
||||
async getPollingConfig(): Promise<{ tagFertig: string; tagVerbucht: string; tagHochgeladen: string; linkField: string; tagPosteingang: string }> {
|
||||
const [fertig, verbucht, hochgeladen, linkField, posteingang] = await Promise.all([
|
||||
this.settingRepo.findOneBy({ Tag: 'agrarmonitor_tag_fertig' }),
|
||||
this.settingRepo.findOneBy({ Tag: 'agrarmonitor_tag_verbucht' }),
|
||||
this.settingRepo.findOneBy({ Tag: 'agrarmonitor_tag_hochgeladen' }),
|
||||
this.settingRepo.findOneBy({ Tag: 'agrarmonitor_link_field' }),
|
||||
this.settingRepo.findOneBy({ Tag: 'agrarmonitor_tag_posteingang' }),
|
||||
]);
|
||||
return {
|
||||
tagFertig: fertig?.Wert ?? '4',
|
||||
tagVerbucht: verbucht?.Wert ?? '9',
|
||||
tagHochgeladen: hochgeladen?.Wert ?? '',
|
||||
linkField: linkField?.Wert ?? '',
|
||||
tagPosteingang: posteingang?.Wert ?? '',
|
||||
};
|
||||
}
|
||||
|
||||
@@ -87,14 +90,16 @@ export class AgrarmonitorPollingService implements OnModuleInit {
|
||||
tagVerbucht: string,
|
||||
tagHochgeladen: string,
|
||||
linkField: string,
|
||||
): Promise<{ tagFertig: string; tagVerbucht: string; tagHochgeladen: string; linkField: string }> {
|
||||
tagPosteingang: string,
|
||||
): Promise<{ tagFertig: string; tagVerbucht: string; tagHochgeladen: string; linkField: string; tagPosteingang: string }> {
|
||||
await Promise.all([
|
||||
this.settingRepo.update({ Tag: 'agrarmonitor_tag_fertig' }, { Wert: tagFertig }),
|
||||
this.settingRepo.update({ Tag: 'agrarmonitor_tag_verbucht' }, { Wert: tagVerbucht }),
|
||||
this.settingRepo.update({ Tag: 'agrarmonitor_tag_hochgeladen' }, { Wert: tagHochgeladen }),
|
||||
this.settingRepo.update({ Tag: 'agrarmonitor_link_field' }, { Wert: linkField }),
|
||||
this.settingRepo.update({ Tag: 'agrarmonitor_tag_posteingang' }, { Wert: tagPosteingang }),
|
||||
]);
|
||||
return { tagFertig, tagVerbucht, tagHochgeladen, linkField };
|
||||
return { tagFertig, tagVerbucht, tagHochgeladen, linkField, tagPosteingang };
|
||||
}
|
||||
|
||||
async runPolling(): Promise<PollingResult> {
|
||||
@@ -290,15 +295,17 @@ export class AgrarmonitorPollingService implements OnModuleInit {
|
||||
this.logger.log('Starte Upload-Check');
|
||||
|
||||
try {
|
||||
const [hochgeladenSetting, fertigSetting, linkFieldSetting] = await Promise.all([
|
||||
const [hochgeladenSetting, fertigSetting, linkFieldSetting, posteingangSetting] = await Promise.all([
|
||||
this.settingRepo.findOneBy({ Tag: 'agrarmonitor_tag_hochgeladen' }),
|
||||
this.settingRepo.findOneBy({ Tag: 'agrarmonitor_tag_fertig' }),
|
||||
this.settingRepo.findOneBy({ Tag: 'agrarmonitor_link_field' }),
|
||||
this.settingRepo.findOneBy({ Tag: 'agrarmonitor_tag_posteingang' }),
|
||||
]);
|
||||
|
||||
const tagHochgeladenId = parseInt(hochgeladenSetting?.Wert ?? '', 10);
|
||||
const tagFertigId = parseInt(fertigSetting?.Wert ?? '4', 10);
|
||||
const linkFieldId = parseInt(linkFieldSetting?.Wert ?? '', 10);
|
||||
const tagPosteingangId = parseInt(posteingangSetting?.Wert ?? '', 10);
|
||||
|
||||
if (isNaN(tagHochgeladenId)) {
|
||||
this.logger.warn('Tag "hochgeladen" nicht konfiguriert — Upload-Check übersprungen');
|
||||
@@ -361,7 +368,15 @@ export class AgrarmonitorPollingService implements OnModuleInit {
|
||||
}
|
||||
|
||||
if (!vorhanden) {
|
||||
result.skipped++;
|
||||
if (!isNaN(tagPosteingangId)) {
|
||||
const currentTags: number[] = (doc.tags as number[]) ?? [];
|
||||
const newTags = [...new Set(currentTags.filter(t => t !== tagHochgeladenId).concat([tagPosteingangId]))];
|
||||
await this.paperlessService.updateDocument(doc.id as number, { tags: newTags });
|
||||
this.logger.log(`${interneBelegnummer} nicht mehr in Agrarmonitor — zurück in Posteingang`);
|
||||
result.updated++;
|
||||
} else {
|
||||
result.skipped++;
|
||||
}
|
||||
await this.delay(500);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -32,8 +32,8 @@ export class AgrarmonitorController {
|
||||
|
||||
@Put('polling-config')
|
||||
@RequirePermissions(Permission.MANAGE_SETTINGS)
|
||||
async updatePollingConfig(@Body() body: { tagFertig: string; tagVerbucht: string; tagHochgeladen: string; linkField: string }) {
|
||||
return this.pollingService.updatePollingConfig(body.tagFertig, body.tagVerbucht, body.tagHochgeladen, body.linkField);
|
||||
async updatePollingConfig(@Body() body: { tagFertig: string; tagVerbucht: string; tagHochgeladen: string; linkField: string; tagPosteingang: string }) {
|
||||
return this.pollingService.updatePollingConfig(body.tagFertig, body.tagVerbucht, body.tagHochgeladen, body.linkField, body.tagPosteingang ?? '');
|
||||
}
|
||||
|
||||
@Post('run-polling')
|
||||
|
||||
@@ -202,6 +202,7 @@ export interface AgrarmonitorPollingConfig {
|
||||
tagVerbucht: string;
|
||||
tagHochgeladen: string;
|
||||
linkField: string;
|
||||
tagPosteingang: string;
|
||||
}
|
||||
|
||||
export interface AgrarmonitorPollingResult {
|
||||
|
||||
@@ -2588,6 +2588,9 @@ function AgrarmonitorTab() {
|
||||
<Form.Item name="tagHochgeladen" label="Tag-ID: Hochgeladen in Agrarmonitor">
|
||||
<Input placeholder="3" style={{ width: 120 }} />
|
||||
</Form.Item>
|
||||
<Form.Item name="tagPosteingang" label="Tag-ID: Posteingang (bei fehlendem AM-Beleg)">
|
||||
<Input placeholder="1" style={{ width: 120 }} />
|
||||
</Form.Item>
|
||||
<Form.Item name="linkField" label="Custom Field: Agrarmonitor-Link">
|
||||
<Select allowClear placeholder="Kein Feld ausgewählt" style={{ width: 280 }}>
|
||||
{customFields.map(f => (
|
||||
|
||||
Reference in New Issue
Block a user