Beispiele für die neuen storage path templates ab Version 2.13

Klasse, ganz herzlichen Dank für diesen Beitrag! In der Doku steht sowas leider nicht und die 5000 Youtube-Videos zu paperless-ngx kennen das erst recht nicht, da gibt es nur triviale Anleitungen zur Installation und die absoluten Basics, die man sich mit minimalem Aufwand selbst erarbeiten kann

Mein Anwendungsfall dieser Technik wird so aussehen, dass ich per Tag oder Custom-Boolean-Field steuere, welche Dokumente in speziellen Unterordner versteckt werden und welche nicht

Hallo zusammen,

ich bin gerade dabei, paperless-ngx Ver. 2.14.7 auf meine Bedürfnisse zu konfigurieren, habe mich aber jetzt total festgefahren und komme einfach nicht mehr weiter.
Die paperless-ngx läuft auf einem Rasperry unter docker.

Alle neuen Dokumente sollen einen „Posteingangstag“ bekommen.

Folgendes habe ich getan:
Ich habe ein benutzerdefiniertes Feld „Kategorie“ mit dem Datentyp „Auswählen“ erstellt, welches automatisch per Arbeitsablauf jedem neuen Dokument mit dem Auslöser „Verarbeitung gestartet“ zugewiesen wird. Das funktioniert auch so weit.

Jetzt habe ich noch ein PAPERLESS_STORAGE_PATH_TEMPLATE in der docker-compose.yml eingetragen, der folgendes machen soll:

Handelt sich um ein Dokument der Kategorie „Belege“, dann in Dokumente\Belege\Dokumententyp\Tags\YYYY-MM-TT-Korrespondent-Titel.pdf abspeichern,
alle anderen Dokumente in Dokumente\Kategorie\Korrespondent\Tags\YYYY-MM-TT-Korrespondent-Titel.pdf abspeichern

PAPERLESS_STORAGE_PATH_TEMPLATE: >
{% if „Belege“ in custom_fields %}
Dokumente/Belege/{{document_type}}/{% if tags %}{{ tags|join(‚-‘) }}/{% endif %}{{created_year}}-{{created_month}}-{{created_day}}-{{correspondent}}-{{title}}.pdf
{% else %}
Dokumente/{{custom_fields}}/{{correspondent}}/{% if tags %}{{ tags|join(‚-‘) }}-{% endif %}{{created_year}}-{{created_month}}-{{created_day}}{{correspondent}}{{title}}.pdf
{% endif %}

Leider funktioniert das überhaupt nicht. Alle Dokumente werden nur unter 000000X (X = fortlaufende Nummer) in den Ordnern archive und originals abgelegt.
Die gewünschte Ordnerstruktur wird auch nicht angelegt.

Ich dachte, wenn ich die neuen Dokumente manuell bearbeite (Zuweisung Kategorie, Dokumententyp, Tags Korrespondent) und anschließend das „Posteingangstag“ entferne und dann speichere,
sollten die Dokumente dann nach o.a. Template abgelegt werden.

Warum funktioniert das nicht?
Kann hier jemand helfen?

→ Ich glaube, ich bin hier auf einem total falschen Weg, mit der Variablen PAPERLESS_STORAGE_PATH_TEMPLATE. :joy:

Ob’s damit funktionieren könnte, weiß ich nicht, aber es ist auf jeden Fall umständlich, dann später den Pfad anzupassen.

Ich mach das bei mir so:

  • Dokumente erhalten einen Storage-Path, der das Dokument beschreibt, z.B. „Versicherung“, „Arzt“, „Bank“
  • Es gibt einen Default-Storage-Path „Allgemein“ und einen Storage-Path „Noch sortieren“
  • Für jeden Pfad wird das Aussehen individuell festgelegt - bei manchen Sachen ist eine Gruppierung je Jahr sinnvoll, bei manchen fließt ein Tag mit ein oder der Correspondent oder irgend was anderes
  • Zur Zeit habe ich noch einen Automatismus drin, der den Storage-Path beim ersten Speichern nach bestimmten Kriterien setzt, aber das fliegt wahrscheinlich wieder raus

Vorteil dieser Lösung ist, dass ich die Storage-Paths jederzeit verändern kann und die Dokumente neu sortiert werden. Über PAPERLESS_STORAGE_PATH_TEMPLATE wird das wahrscheinlich nicht funktionieren

Wie wird das neu sortieren aller Dokumente denn angestoßen?

Das passiert automatisch, sobald man einen Storage-Path ändert. Aber halt nur für die in der Weboberfläche konfigurierbaren, für PAPERLESS_STORAGE_PATH_TEMPLATE in der conf muss man evtl. auf „Erneut verarbeiten“ gehen, was aber wahrscheinlich den kompletten Verarbeitungsprozess wieder anstösst

Danke dir. Werde ich mich in Ruhe mal mit beschäftigen.

Grüße

Jetzt nur nochmal zum Verständnis, funktioniert PAPERLESS_STORAGE_PATH_TEMPLATE eigentlich überhaupt? Selbst wenn ich da nur einen ganz einfachen Pfad eingebe wie z.B. PAPERLESS_STORAGE_PATH_TEMPLATE: >
{{ correspondent }}/{{ document_type }}/{{ title }}.pdf
werden die Dokumente weiterhin mit 0000000X in archive und originals abgelegt.

Und wenn ich diese Pfandangaben

{% if „Kategorie“ in custom_fields and custom_fields.Kategorie.value == ‚Belege‘ %}
Dokumente/Belege/{{ document_type }}/{% if tags %}{{ tags|join(‚-‘) }}/{% endif %}{{ created_year }}-{{ created_month }}-{{ created_day }}-{{ correspondent }}-{{ title }}.pdf
{% else %}
Dokumente/{% if „Kategorie“ in custom_fields %}{{ custom_fields.Kategorie.value }}{% else %}Unkategorisiert{% endif %}/{{ correspondent }}/{% if tags %}{{ tags|join(‚-‘) }}-{% endif %}{{ document_type }}/{{ created_year }}-{{ created_month }}-{{ created_day }}{{ correspondent }}{{ title }}.pdf
{% endif %}

im GUI unter Speicherpfad eingeben möchte, erhalte ich den Fehler „ungültige Variable erkannt“.
Wo ist da der Fehler?

@rrosin: Eigentlich dachte ich meine Variante mit der if-else Abfrage sei praktikabel. Kannst du mir mal ein paar Beispiele deiner Pfade zeigen? Hast du die einfach im GUI unter Speicherpfade eingetragen?

So, jetzt habe ich den Speicherpfad nochmals abgeändert und erhalte jetzt auch keinen Fehler mehr beim Abspeichern des Speicherpfades:

{% if „Kategorie“ in custom_fields %}
{% if custom_fields.Kategorie.value == ‚Belege‘ %}
Dokumente/Belege/{{ document_type }}/{{ created_year }}-{{ created_month }}-{{ created_day }}{{ correspondent }}{{ title }}
{% else %}
Dokumente/{{ custom_fields.Kategorie.value }}/{{ correspondent }}/{% if tags %}{{ tags|join(‚-‘) }}-{% endif %}{{ document_type }}{{ created_year }}-{{ created_month }}-{{ created_day }}{{ correspondent }}{{ title }}
{% endif %}
{% else %}
Dokumente/Unkategorisiert/{{ created_year }}-{{ created_month }}-{{ created_day }}{{ correspondent }}{{ title }}
{% endif %}

Das erste Dokument mit der Kategorie Belege hat auch funktioniert und wird korrekt in Dokumente/Belege/usw. abgelegt.
Dann habe ich 2 weitere Dokumente hochgeladen, auch wieder mit zugeordneten Kategorien, einmal „Versicherungen“ und einmal „Internet-Festnetz“.
Keines dieser beiden Dokumente wurde entsprechend abgelegt, sondern wieder nur mit 000000X im Ordner archive und originals.

Hat jemand eine Idee?

Ohne Gewähr: Soweit ich das verstanden habe, führt paperless-ngx zuerst OCR durch, dann werden die Auto-Zuordnungen gemacht, und als letztes wird einmalig der Pfad anhand PAPERLESS_STORAGE_PATH_TEMPLATE gesetzt. Wenn man das Dokument danach bearbeitet, wird es m.E. der Pfad nicht mehr neu angepasst. Es hat also wenig Sinn, in PAPERLESS_STORAGE_PATH_TEMPLATE irgendwelche variablen Informationen des Dokumentes zu verwenden.
Lege stattdessen einen Storage-Path „Standard“ o.ä. an und pack deine Logik dort hinein. Setze bei allen neuen Dokumenten per Automation den Storage-Path auf „Standard“.

Das mit if/else verwende ich auch und halte es für praktikabel. Beispielpfad:

arzt/
{% if "ally" in tag_name_list %}ally
{%else %}{% if "tangmo" in tag_name_list %}tangmo
         {%else %}reiner
         {% endif %}
{% endif %}
/
{% if "has_no_date" not in tag_name_list %}
        {{ created_year }}-{{ created_month }}-{{ created_day }}
{% endif %}
{% if "keep_filename" in tag_name_list %} 
       {{ original_name }}
{% else %}
       {{ title }}
{% endif %}

hi zusammen, ich finde die templates von euch echt super. Habt ihr mir nen hinweis, wie ich je Tag in der tag_name_list einen unterordner erstellen kann?
Eigentlich brauch ich nur die Eigenschaft der Anzahl der tags z.b. tag_name_list.length oder .count oder was es da sonst gibt.

Das sind alles tolle storage path templates. :folded_hands: Vielen Dank.

Ich nutze einen Teil davon um durch automatisch zugewiesene Tags der Unterordner-Namen im consume Verzeichnis (Scan Target) einen Teil der Ordnerstruktur für den Speicherpfad zu gewinnnen.

{{ document_type }}/
{{ correspondent }}
{% for tag in tag_name_list %}
  {% if tag == "Hans" or tag == "Emma" %}
    {% print("/" + tag) %}
  {% endif %}
{% endfor %}/
{{ created_year }}/
{{ created_year_short }}_{{ created_month }}_{{ created_day }}-{{ title }}

Ich möchte gern aber nur direkt Personen bezogene Tags der Vornamen haben (zusätzlich zu anderen Tags wie „Eingang“, „ToDo“, „Wichtig“, etc.). Alle Dokumente die allgemeiner oder gemeinschaftlicher Natur sind, sollen kein so ein Tag haben oder gar anzeigen.
Dennoch möchte ich gern in der File Struktur das diese Dokumente (landen direkt im consume Verzeichnis, ohne Subfolder) in einen Unterordner namens „Allgemein“ landen.

Wäre jemand von den Erfahrenen unter Euch so nett und könnte mir bitte etwas auf die Sprünge helfen? :wink: So etwas, wie die Prüfung das Hans/Emma „ist nicht in tag_name_list vorhanden“ habe ich als Kriterium nicht finden können.

Vielen Dank für eure Arbeit!

Hallo zusammen,

ich versuche gerade, eure großartigen Vorlagen etwas anzupassen – leider bisher ohne Erfolg.

Mein Ziel ist es, Dokumente anhand ihrer Tags in unterschiedliche Ordner zu verschieben:

  • Wenn ein Tag mit einem Sternchen (*) beginnt, soll ein entsprechender Ordner angelegt werden.
  • Alle anderen Dokumente sollen im Ordner Allgemein landen.

Ich habe schon einiges ausprobiert, aber bekomme es einfach nicht hin. Vielleicht könnt ihr mir weiterhelfen?

Hier mein aktueller Code:

{% set selected_tag = "Allgemein" %}

{% for tag in tag_name_list %}
  {% if tag|startswith("*") %}
    {% set selected_tag = tag[1:] %}
    {% break %}
  {% endif %}
{% endfor %}

{{ selected_tag }}/{{ correspondent }}/{{ created_year }}-{{ created_month }}-{{ created_day }} - {{ document_type }} - {{ title }}

Hallo zusammen,

ich hänge mich mal ganz frech hier mit in den Thread.

Bin gerade mit meiner ersten Installation von paperless-ngx auf meiner Synology beschäftigt.

Hab mir dank der Beispiele hier eine Ordnerstruktur mit einem entsprechenden Template überlegt. Dafür schonmal ein recht herzliches Dankeschön!

Hier mal mein gesamtes Template:

{% if custom_fields.Dokumentenart.value=="Privat" and document_type=="Steuerdokument" %}
Privat/{{ document_type }}/{{ custom_fields.Wirtschaftsjahr.value }}/{{ correspondent.replace(" ", "_") }}_{{ custom_fields.Belegnummer.value }}_{{ created_year }}-{{ created_month }}-{{ created_day }}_{{ title|replace(" ","_")|replace(".","-")|replace("ß","ss")|replace("ä","ae")|replace("ö","oe")|replace("ü","ue")|replace("Ä","Ae")|replace("Ö","Oe")|replace("Ü","Ue") }}

{% elif custom_fields.Dokumentenart.value=="Privat" and document_type=="Bankdokument" and "Kontonummer" in custom_fields %}
Privat/{{ document_type }}/{{ custom_fields.Kontonummer.value }}/{{ custom_fields.Wirtschaftsjahr.value }}/{{ correspondent.replace(" ", "_") }}_{{ custom_fields.Belegnummer.value }}_{{ created_year }}-{{ created_month }}-{{ created_day }}_{{ title|replace(" ","_")|replace(".","-")|replace("ß","ss")|replace("ä","ae")|replace("ö","oe")|replace("ü","ue")|replace("Ä","Ae")|replace("Ö","Oe")|replace("Ü","Ue") }}

{% elif custom_fields.Dokumentenart.value=="Privat" %}
Privat/{{ document_type }}/{{ correspondent.replace(" ", "_") }}_{{ custom_fields.Belegnummer.value }}_{{ created_year }}-{{ created_month }}-{{ created_day }}_{{ title|replace(" ","_")|replace(".","-")|replace("ß","ss")|replace("ä","ae")|replace("ö","oe")|replace("ü","ue")|replace("Ä","Ae")|replace("Ö","Oe")|replace("Ü","Ue") }}

{% elif custom_fields.Dokumentenart.value=="Immobilien" and document_type=="Rechnung" and "Haus" in custom_fields and "Wirtschaftsjahr" in custom_fields %}
Immobilien/{{ custom_fields.Haus.value }}/{{ document_type }}/{{ custom_fields.Wirtschaftsjahr.value }}/{{ correspondent.replace(" ", "_") }}_{{ custom_fields.Belegnummer.value }}_{{ created_year }}-{{ created_month }}-{{ created_day }}_{{ title|replace(" ","_")|replace(".","-")|replace("ß","ss")|replace("ä","ae")|replace("ö","oe")|replace("ü","ue")|replace("Ä","Ae")|replace("Ö","Oe")|replace("Ü","Ue") }}

{% elif custom_fields.Dokumentenart.value=="Immobilien" and document_type=="NKAbrechnung" and "Haus" in custom_fields and "Wirtschaftsjahr" in custom_fields %}
Immobilien/{{ custom_fields.Haus.value }}/{{ document_type }}/{{ custom_fields.Wirtschaftsjahr.value }}/{{ correspondent.replace(" ", "_") }}_{{ custom_fields.Belegnummer.value }}_{{ created_year }}-{{ created_month }}-{{ created_day }}_{{ title|replace(" ","_")|replace(".","-")|replace("ß","ss")|replace("ä","ae")|replace("ö","oe")|replace("ü","ue")|replace("Ä","Ae")|replace("Ö","Oe")|replace("Ü","Ue") }}

{% elif custom_fields.Dokumentenart.value=="Immobilien" and document_type!="Rechnung" and document_type!="NKAbrechnung" and "Haus" in custom_fields %}
Immobilien/{{ custom_fields.Haus.value }}/{{ document_type }}/{{ correspondent.replace(" ", "_") }}_{{ custom_fields.Belegnummer.value }}_{{ created_year }}-{{ created_month }}-{{ created_day }}_{{ title|replace(" ","_")|replace(".","-")|replace("ß","ss")|replace("ä","ae")|replace("ö","oe")|replace("ü","ue")|replace("Ä","Ae")|replace("Ö","Oe")|replace("Ü","Ue") }}

{% else %}
Unsortiert/{{ correspondent.replace(" ", "_") }}_{{ custom_fields.Belegnummer.value }}_{{ created_year }}-{{ created_month }}-{{ created_day }}_{{ title|replace(" ","_")|replace(".","-")|replace("ß","ss")|replace("ä","ae")|replace("ö","oe")|replace("ü","ue")|replace("Ä","Ae")|replace("Ö","Oe")|replace("Ü","Ue") }}

{% endif %}

Erste Frage:

Gehe ich richtig in der Annahme, dass ich das an dieser Stelle “einfach” einfüge?

Meine Google-Recherche dazu war leider erfolglos.

Zweite Frage:

Ich erhalte (wenn wie oben eingefügt) leider immer eine Fehlermeldung “Ungültige Variable erkannt.”

Selbst wenn ich nur einen kleinen Teil des Templates als Test einfüge:

Unsortiert/{{ correspondent.replace(" ", "_") }}_{{ custom_fields.Belegnummer.value }}

Ohne “{{ custom_fields.Belegnummer.value }}” kommt keine Meldung. Es hängt also custom_field. Das benutzerdefinierte Feld “Belegnummer” ist aber angelegt.

Ich fürchte ich komme hier ohne einen kleinen Tipp nicht weiter :face_exhaling:

Edit:

Ich habe nun alle custom_fields.XXX.value durch custom_fields|get_cf_value(‚XXX‘) ersetzt. keine Fehlermeldung mehr und es scheint wie gewünscht zu funktionieren.

Hallo,

nur eine ganz blöde grundsätzliche Frage für Anfänger … Wo lege ich denn die Templates ab?

Dankeschön

Probier doch mal
{{ custom_fields|get_cf_value(‘Belegnummer‘) }}

1 „Gefällt mir“

tut mir leid, daß ich nochmal fragen muss.

Kann man diese Templates in irgendeiner Weise bei den Arbeitsabläufen integrieren oder macht es nur zur Ersteinrichtung der Speicherpfade Sinn?

Ich versuche mich in die Arbeitsabläufe einzuarbeiten und versuche hier die vorhandenen Dateipfade weiterzuverwenden. Kann man hier die Templates sinnvoll verwenden und wenn ja an welcher Stelle?

Ich versuche einen Workflow mit Variablen zu verwenden, so dass dieser nicht jedesmal gänzlich neu erstellt werden muss. Dieser Workflow könnte ja über Tags gesteuert werden: Posteingang → RechnungseingangsTag →zu bezahlenTag →”von welcher BankTag”→"Speicherort-Tag oder so ähnlich

Die Templates gehen leider nicht genau so umfangreich bei den Arbeitsabläufen wie bei den Speicherpfaden.
Du kannst nur die Variablen nutzen, die auch in der Doku erwähnt werden:
https://docs.paperless-ngx.com/usage/#workflow-placeholders

schade

vielleicht gibts demnächst ja so etwas

Hallo zusammen,

ich würde auch gerne Custom Fields nutzen aber es funktioniert bei mir nicht. Paperless-ngx läuft bei mir im Container (Docker compose). Soweit sehr gut. Allerdings kann ich die Custom Fields nicht nutzen.

{{ custom_fields.Test.value }}

Folgender Fehler kommt

Jemand ne Idee?

Probier doch mal
{{ custom_fields|get_cf_value(‘Test‘) }}