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.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.

 

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.

Im nächsten Schritt werden alle wichtigen Feldwerte in Variablen zwischengespeichert, denn beim später folgenden Mappentypwechsel gehen alle Angaben verloren, die nicht im neuen Mappentypen vorkommen.