Smart Rule - Text Scannen

Hallo

wir bekommen laufend Rechnungen in diesem Format:

Bildschirm­foto 2023-08-12 um 15.19.27

Wie schon so oft gehabt geht es um die Rechnungsnummer und das Datum

Datum ist easy mit dem Platzhalter “neuestes Dokumentendatum”

Bei der Rechnungsnummer tu ich mir noch schwer: Wenn ich “Text scannen” eingebe so wie hier, also nur mit Präfix ohne Suffix

dann bekomme ich zwar die Rechnungsnummer aber auch noch das Rechnungsdatum und noch einiges mehr:

Als Suffix müsste ich ja dann das variable Rechnungsdatum eingeben.

Als Suffix müsste dann der Platzhalter “neuestes Dokumentendatum” eingeben werden …aber ich befürchte das geht nicht (als Suffix muss Text eingegeben werden)

Habt ihr eine Idee wie ich die Rechnungsnummer ohne Regex einfangen kann.

Vielen Dank für eure Hilfe vorab

Rainer

Warum darf es keine Regex sein?

Es darf gerne Regex sein…nur kenn ich mich mit Regex nicht wirklich aus…und ich hoffte dass es mit der Text scannen Funktion vielleicht doch klappen könnte …

Wenn die Rechnungsnummer immer in der Form “Monat Jahr 6 Ziffern” erscheint, ist das trivial:
\d\d\s+\d{4}\s+\d{6}
Zwei Ziffern, mindestens ein Leerraum, vier Ziffern, mindestens ein Leerraum, sechs Ziffern
Und dann “Regulärer Ausdruck” bei “Text scannen” auswählen.

was für dich trivial sein mag ist für mich “hohe Mathematik” :grinning:

Aber danke …ich werde es gleich ausprobieren

Aber dann stellt sich gleich die nächste Frage: Wie kann ich das Ergebnis dann beispielsweise in einer Warnung anzeigen lassen …denn der Platzhalter “DocumentString” funktioniert dann nicht !?

Das Ganze in Klammern setzen und dann \1 benutzen.

Das ist übrigens auch in der Dokumentation erklärt: Einfach mal “regular expression” bei “Hilfe” eintragen und dann den Anhang “Smart Rule …” studieren.

Herzlichen Dank für deine Hilfe. Es funktioniert !!!

:+1: :+1: :+1:

Nun habe ich doch noch eine Frage zu dem fast gleichen Thema: Es geht nach wie vor um “Text scannen” - diesmal jedoch um den Betrag. Am Ende der Rechnung steht:

Mit “Text scannen” - “Betrag” - Bruttobetrag* wird einwandfrei der Dokumentbetrag eingefangen.

Leider is der Platzhalter “Dokumentbetrag” nicht in jeder Action aufrufbar.

Ich habe ein benutzerdefiniertes Metafeld erstellt mit dem Namen “Preis” (Dezimalzahl, Währung, €) - in dieses Feld sollte der Dokumentenbetrag eingesetzt werden. Wegen der Formatierung (Dezimalzahl, Währung, €) lassen sich keine Platzhalter aufrufen

Wenn ich die Formatierung ändere in “Einzeiliger Text” dann funktioniert es.

Ich wollte aber mit diesem Script

die Umsatzsteuer berechnen lassen und dann noch den Nettobetrag. Dazu ist die Formatierung der Felder in (Dezimalzahl, Währung, €) notwendig.

Kannst Du mir hier helfen? Oder gibt es eine Möglichkeit Brutto, Netto und Umsatzsteuer einzufangen ohne das zitierte Script zu verwenden?

Warum das nicht so funktioniert, wie Du möchtest (d.h. warum der Platzhalter “Dokumentenbetrag” für dieses benutzerdefinierte Metafeld nicht verwendbar ist), ist eine Frage für @cgrunenberg.

Unter der Prämisse, dass es immer um dieselben Rechnungen geht, könnte man das mit einem Skript erledigen, bspw. so (das ist nicht getestet, ich habe ja kein passendes Dokument).

function performsmartrule(records) {
  records.forEach(r => {
     const match = r.plainText().match((\b/\d+\.\d\d\b/);
     if (not match) return; /* nächster Record wenn kein Betrag gefunden */
     const netto = parseFloat(match[0]);
     const brutto = netto * 1.19; /* hier müsste man noch ein bisschen runden */
     const USt = brutto - netto;
     r.addCustomMetaData(brutto, {for: "mdpreis", to: r});
     r.addCustomMetaData(netto, {for: "mdnetto", to: r});
     r.addCustomMetaData(USt, {for: "mdust", to: r});
 })
}

Das Script sucht zunächst nach einem regulären Ausdruck, der

  • an einer Wortgrenze beginnt (\b);
  • es folgt eine beliebige Anzahl von Ziffern (\d+), mindestens eine
  • es folgt ein Punkt (\.),
  • und schließlich folgen genau zwei Ziffern (\d\d) und eine Wortgrenze.
    Damit sollte es den Nettopreis finden, weil der bei diesen (!) Rechnungen als erster Betrag auftaucht.
    Es folgen die Berechnung von Bruttopreis und Umsatzsteuer, den Bruttobetrag müsste man vermutlich noch runden. Und schließlich werden diese Werte für die benutzerdefinierten Metadaten “Preis”, “Netto” und “USt” eingetragen (diese Bezeichnungen werden in DT-Scripts mW immer nur in Kleinbuchstaben mit vorangestelltem md benutzt).

Alternativ könnte man alle Beträge in dem Dokument aufsammeln, indem man
r.plainText().matchAll(/\b(\d+\.\d\d)\b/g)
benutzt und dann den größten Betrag als “Brutto” nimmt etc. Das ist aber etwas aufwendiger, weil das Ergebnis von matchAll kein einfaches Array mehr ist.

Wow !!! Ich bin beeindruckt…vielen Dank !!

Ich probiere es mal aus und berichte dann !!!

Platzhalter werden im Augenblick grundsätzlich nur in text-basierten Feldern unterstützt, abgesehen vom Dokumentenbetrag bei Preisen macht der Rest auch kaum Sinn. Das ist aber zumindest geplant.