Skip to main content

Mappentyp "SqueezeInvoice"

Die Feldstruktur des Mappentypen "SqueezeInvoice" entspricht zum großen Teil dem "Invoice" Mappentypen. Es wurden einige Felder, die rein zur Workflow-Steuerung dienen, entfernt. Dafür sind einige neue Felder hinzugekommen und bei vielen Betrags-Feldern wurde ein User-Exit bei Wertänderung gesetzt, damit automatische Berechnungen durchgeführt werden können.

 

Zugriffsrechte

Der Mappentyp hat in der Auslieferung keinen aktiven Mappenklassenschutz. Es werden lediglich fixe Mappenrechte gesetzt. Ein Mappenklassenschutz wird erst erforderlich, wenn Benutzer aus einer Gruppe nicht die Rechnungen aus der anderen Gruppe sehen dürfen.

 

Register

Der Mappentyp enthält 4 Register. Auf dem Register "Squeeze" wird bei der Anlage über Squeeze eine sqz-Datei erzeugt und auf dem Register abgelegt. Die Dateiendung ist intern mit dem Squeeze-Viewer verknüpft, welcher den passenden Rechnungs-Beleg aus Squeeze ausruft. Die Datei muss vor der Übergabe an den weiteren Rechnungs-Workflow wieder gelöscht werden.

Auf dem zweiten Belege-Register "Documents" wird die PDF-Datei abgelegt. Auf dem Feldregister "Workflow" befinden sich technische Felder zur Steuerung der Anzeige bei den dynamischen Filter-Ordnern und auf dem Register "Gentable" befinden sich die Felder zur Steuerung des Gentable.

 

Gentable

Beim Gentable sollte die aktuelle Kundenlösung übernommen werden, so dass der Feldwert unverändert in das Gentable-Feld des finalen Mappentyps geschrieben werden kann. Es kann sein, dass ein Kunde unterschiedliche Gentable verwendet, um zum Beispiel Rechnungen mit und ohne Bestellbezug unterschiedlich behandeln zu können. Hier muss in Abstimmung mit dem Kunden entschieden werden welche Positions-Spalten im Gentable für die Validierung enthalten sein müssen.

Die Gentable XML wird über das Mappenfeld "GentableXML" geladen. Die Steuerung erfolgt über das Skript "SqueezeInvoice_DF_GentableDefScriptName", welches über die Eigenschaft "gentableDefScriptName" aufgerufen wird. Das Skript kann optional auch andere XML aus anderen Feldern laden. Bei Bedarf kann die Eigenschaft auch entfernt werden und die XML-Struktur kann alternativ über eine Server-XML-Datei aufgerufen werden.

Der Name der Gentable-Definition sollte in "SqueezeInvoice" umbenannt werden, damit Überschneidungen zum bestehenden Gentable vermieden werden. Falls dies explizit gewollt ist muss der Name in den Funktionsaufrufen entsprechend angepasst werden. Das ausgelieferte Beispiel enthält Spalten, welche über eine Bedingung ("condition") nur bei Bestellbezug angezeigt werden. Bei einer Wertänderung am Bool-Feld "HasOrder" wird die Mappe aktualisiert. Dadurch werden die Gentable-Spalten entsprechend ein- oder ausgeblendet.

image-1612893074015.png

 

Benutzerdefinierte Aktionen und Portal-Skripte

Der Mappentyp wird mit einigen vordefinierten benutzerdefinierten Aktionen ausgeliefert. Die Skripte werden unverschlüsselt ausgeliefert und können somit uneingeschränkt angepasst werden.

Über die Aktion "UDA_PutBackGroupBasket" kann eine übernommene Rechnung zurück in den Gruppenkorb gelegt werden. Eine Rechnung öffnet sich automatisch im Bearbeitungs-Modus und durch das Skript vor dem Bearbeiten ("SqueezeInvoice_DF_BeforeEdit" - siehe Eigenschaft "beforeEditScript") wird der Beleg automatisch aus dem Gruppenkorb-Ordner entnommen. Hierdurch greifen die Filter für den Ordner.

Die Aktion "UDA_GetOrderData" ermittelt die Bestellpositionen. Das Skript iteriert die angegebenen Bestellnummern und führt die Funktion "getOrderData()" aus. Die Funktion ruft eine Stammdaten-Tabelle aus Squeeze auf. Wichtig ist, dass "getMasterData()" die ID der Tabelle und nicht den Namen benötigt! Dem Aufruf können Filter mitgegeben werden. In dem Beispiel wird die Tabellen-Spalte "CreditorID" mit der Lieferanten-ID zur Rechnung gefiltert und als zweiter Filter wird entweder eine Bestellnummer oder eine Lieferscheinnummer angegeben. Als Rückgabe liefert die Funktion alle Spalten-Werte zu allen Treffern in einem Objekt.

/** Ermittelt die Bestelldaten aus den Squeeze-Stammdaten
 * @param {string} vendorID Lieferanten ID für Filterung
 * @param {string} addColumnFilter Zusätzliche Filter-Spalte
 * @param {string} addColumnValue Spaltenwert 
 **/
function getOrderData(vendorID, addColumnFilter, addColumnValue){
    var sqz = new Squeeze();
        sqz.addFilter("CreditorID", vendorID, "eq");
        sqz.addFilter(addColumnFilter, addColumnValue, "eq");
    var mdObj = sqz.getMasterdata("11"); /* Die ID der Stammdaten-Tabelle und nicht den Namen! */
    if( mdObj.error===true ){
        return mdObj.errorMessage;
    }
    return mdObj.data;
}

Das Beispiel kann verwendet werden um weitere Stammdaten-Abfragen gegen die Squeeze-Stammdaten zu generieren. Durch die Abfragen an Squeeze kommt die Lösung ohne eigene Stammdaten aus.

Am Ende des Skripts wird aus den Bestelldaten ein Gentable erstellt. Diese Stelle muss projektspezifisch angepasst werden. In dem Beispiel wird das Gentable im XML-Format gespeichert.

/* Erstelle neues Gentable */
var gentable = "<table>\n";
for( var md=0; md<masterDataObj.length; md++ ){
    var masterDataEntry = masterDataObj[md];
    var articleText     = parseHtml(masterDataEntry.PosArticleText);
    if( masterDataEntry.id ){
        gentable += "    <tr>\n";
        gentable += "        <td title=\"OrderNumber\">"    + masterDataEntry.OrderNumber        + "</td>\n";
        gentable += "        <td title=\"OrderPos\">"       + masterDataEntry.Position           + "</td>\n";
        gentable += "        <td title=\"DeliveryNoteId\">" + masterDataEntry.DeliveryNoteNumber + "</td>\n";
        gentable += "        <td title=\"IncGoodsID\">"     + masterDataEntry.PosWENr            + "</td>\n";
        gentable += "        <td title=\"Quantity\">"       + masterDataEntry.PosQuantity        + "</td>\n";
        gentable += "        <td title=\"QuantityUnit\">"   + masterDataEntry.Unit               + "</td>\n";
        gentable += "        <td title=\"Price\">"          + masterDataEntry.PosSinglePrice     + "</td>\n";
        gentable += "        <td title=\"PriceUnit\">"      + masterDataEntry.PosPricingUnit     + "</td>\n";
        gentable += "        <td title=\"NetAmount\">"      + masterDataEntry.PosTotalAmount     + "</td>\n";
        gentable += "        <td title=\"ArticleNumber\">"  + masterDataEntry.PosArticleNumber   + "</td>\n";
        gentable += "        <td title=\"ArticleDesc\">"    + articleText                        + "</td>\n";
        gentable += "    </tr>\n";
    }
}
gentable += "</table>";
docFile.Gentable = gentable;
if( docFile.sync() ){
    context.returnType = "showEditFile";
    return docFile.getid();
}

Die Aktion "UDA_StartWorkflow" startet den Rechnungs-Workflow. Bevor die Übergabe gestartet werden kann sollten einige Prüfungen erfolgen. Im ausgelieferten Skript wird zum Beispiel die Summe aus Netto und Steuer mit dem Brutto-Betrag verglichen und die Summe der Bestellpositionen wird gegen den Kopfbetrag geprüft. Es können beliebige Prüfungen hinzugefügt werden.

Im nächsten Schritt werden alle wichtigen Feldwerte in Variablen zwischengespeichert, denn beim später folgenden Mappentypwechsel gehen Feldwerte verloren, wenn ein Feld nicht im neuen Mappentypen enthalten ist. Zudem werden alle Eigenschaften an der Mappe entfernt.

Nach dem Mappentypwechsel müssen die Werte auf die neuen Felder gespeichert werden. Alle Belege werden automatisch auf das erste Dokumenten-Register geschoben. Die sqz-Datei muss gelöscht werden und ggf. müssen Eigenschaften neu gesetzt werden. Am Ende wird der passende Workflow gestartet.