tüit Logo

Skripte

Filter

Einleitung

Auf ein Linkfeld kann mit einigen wenigen Zeilen ein Filter eingestellt werden. Eine allgemeine Vorlage findet sich im nächsten Code Block. Wir passen die Inhalte in 'Mein Dokumententype', 'name_of_your_field', 'Linked Doctype', 'fieldname', 'in' und '["option1", "option2", "..."]' an. Es muss auf die Groß- und Kleinschreibung geachtet werden.

frappe.ui.form.on("Mein Dokumententype", {
	setup: function(frm) {
		frm.set_query("name_of_your_field", function() {
			return {
				filters: [
					["Linked Doctype","fieldname", "in", ["Open", "Working"]]
				]
			}
		});
	}
});
Erklärung der Inhalte
Inhalt Erklärung
Mein Dokumententype Customization für dieses Doctype
name_of_your_field Feldname
Linked Doctype Auswählbarer Doctype
fieldname Feldname auf den ausgewählten Doctype
in Operator ( vgl. Filter des auswählbaren Doctypes in seiner Listensicht )
["Open", "Working", "..."] Filtern nach "Open" oder "Working"

Beispiele

Offene Projekte in den Zeiterfassungen filtern

frappe.ui.form.on('Timesheet', {
	setup: function(frm) {
		frm.set_query("parent_project", function() {
			return {
				filters: [
					["Project","status", "in", ["Open"]]
				]
			}
		});
	}
})

Screenshot:

image-1637225997643.png

Überprüfen ob ein Häkchen (Check) gesetzt ist

Im Doctype Element
Feld extention (Type Link)
Ziel Doctype Protocol Template
zu überprüfendes Feld checkliste_ist_eine_erweiterung
zu überprüfender Wert 1 (häkchen gesetzt)

image-1637500640301.png

frappe.ui.form.on('Element', {
	setup: function(frm) {
		frm.set_query("extension", function() {
			return {
				filters: [
					["Protocol Template","checkliste_ist_eine_erweiterung", 'in' , ['1']]
				]
			}
		});
	}
});

image-1637500414448.png

 

Tabelleneintrag beim Speichern ändern

Tabelleneintrag beim Speichern ändern

Wir können bevor auf den Speichern-Button in einem Dokument geklickt wird einzelne Felder in einer Tabelle ändern.

  1. Im folgenden Beispiel muss 'frm.doc.items' im gesamten Skript mit 'frm.doc.feldname_der_tabelle' ersetzt werden.
  2. 'Doctype' mit dem richtigen Doctype ersetzten und auf Groß- und Kleinschreibung achten
  3. Mit 'frappe.model.set_value(...)' wird das Feld 'rate' in der Zeile geändert und auf '0' eingestellt
  4. Die letzte Zeile aktualisiert das Feld 'rate' damit der Anwender die Änderung sehen kann
frappe.ui.form.on('Doctype', {
	validate(frm) {
        for (let i = 0; i < frm.doc.items.length; i++) {
            var item = frm.doc.items[i];
            frappe.model.set_value(item.doctype, item.name,"rate","0");
            frm.refresh_fields("rate");
	    }
	}
});

Copy childtable ( Get Items From )

Einleitung

Mit Hilfe von dem Skript können Item-Positionen von einem Dokument eines Doctypes auf ein Dokument eines anderen Doctypes kopiert werden. Kopiert werden die Positionen vom Anwender auf einem Weg. Wir betätigen den Button 'Get Items from' auf dem anderen Doctype und wählen im Dropdown-Menü ein Quelldoctype aus. Ein Beispiel hier ist am Doctype Quotation implementiert.

Vor Anbringung des Skriptes

Wir erstellen ein neuen Doctype mit einer Childtable oder wählen einen Doctype mit Childtable aus. Direkt im Anschluss kann der Skript angebracht werden.

Anbringung eines 'Get Items From'-Buttons

Das Skript ist einfach einzufügen und an einigen wenigen Stellen anzupassen. Der Skript wird als "Client Script" im ERPNext hinzugefügt. (1) Ist der Doctype auf dem der Button erscheint. (2) Ist eine Skriptart die es auszuwählen gilt ( 'Form' ) und mit (3) kann der Script aktiviert werden.

image-1637682718562.png

Minimal running version

Der Script muss leicht angepasst werden bevor wir kopieren können.

  1. Zeile 9 enthält den Doctype in den die Tabellenpositionen kopiert werden
  2. Zeile 11 enthält den Doctype von dem die Positionen stammen
  3. Zeile 20 bis 29 müssen entsprechend den Kommentaren auf einen anderen Doctype angepasst werden.
/*
Author: Marius Widmann
Datum: 17.12.2021
Version: 2.0
Usage:
	To use this script create a client script for the doctype where the table should be pasted to
    and change line 9,11,20,21 and the fetch-from fields starting in line 22.
*/
frappe.ui.form.on('Quotation', { // Doctype we are working on
	refresh(frm) {
	    frm.add_custom_button('Angebotsvorlage', function () { frm.trigger('get_items') }, __("Get Items From")); // Button name = 'Angebotsvorlage'
	},
	get_items(frm){
	    copy_child_table(frm);
	}
});

function copy_child_table(frm) {
	var cur_frm = frm;
    var from = ["Angebotsvorlage","angebotsvorlage_item"]; // From ["Doctype","Doctypechildtable"]
    var to = [cur_frm,"items"]; // To [frm, "Doctypechildtable"]
    var fields = [  // Fetch these fields
      "item_code",
      "item_name",
      "positionsart",
      "description",
      "qty",
      "uom",
      "rate"];
    
	let dialog = new frappe.ui.form.MultiSelectDialog({
		doctype: from[0],
		target: to[0],
		setters: { },
		date_field: "creation",
		get_query() {
			return {
				filters: { }
			};
		},
		action(selections) {
            for(var n = 0; n < selections.length; n++){
		        var id = selections[0];
		        frappe.db.get_doc(from[0], id)
                .then(doc => { 
                	for(var n = 0; n < doc[from[1]].length; n++){
                        
                        // Copy-Paste Operation
                        var item=doc[from[1]][n];
                        var child = {};
                        for(var m = 0; m < fields.length; m++){
                            child[fields[m]] = item[fields[m]]
                        }
                        cur_frm.add_child(to[1],child);
                        cur_frm.refresh_fields(to[1]);
                        
                    }
                });
            }
		}
	});
}

 

Anpassung der Preise der Itempositionen je nach Ausprägung eines Attributs

Intro

Manchmal ist es notwendig vor dem Speichern eines Dokuments Anpassung von Feldern in der Itempositionstabelle zu machen. Diese Änderungen können abhängig sein von einem Attribut / einem Feld des jeweiligen Tabelleneintrages oder der Tabellenposition.

Anleitung

Das Skript unterhalb kann genau so als Client Skript für Angebote eingebaut werden. In der Variable fields ( Zeile 9 ) können die Item Felder gelistet werden, die bei der Änderung geändert werden.

In Zeile 19 kann anstelle der letzten 0 ein String-Value, ein Integer-Value, ein Float-Value oder eine Variable eingefügt werden, die dem geänderten Wert vom Feld in fields entspricht.

 

// Set item fields before save
// Date: 18.01.2022
// Version: 0.1.0
// Author: Marius Widmann
// Licence:

// Fields in the items table that should be set to zero
var fields = [
    "rate",
    ];

frappe.ui.form.on('Quotation', {
	validate(frm) {
	    frappe.show_progress('Adapting prices based on Positionsart...', 0, 100, 'Please wait');
        for (let i = 0; i < frm.doc.items.length; i++) {
            var item = frm.doc.items[i];
            if(item.positionsart != "Standard"){
                for ( let j = 0; j < fields.length; j++ ) {
                    frappe.model.set_value(item.doctype, item.name,fields[j],0);
                    frm.refresh_fields(fields[j]);
                    frappe.show_progress('Adapting prices based on Positionsart...', ((i+1)*(j+1))/((frm.doc.items.length)*(fields.length))*100, 100, 'Please wait');
                }
            }
	    }
	    frappe.show_progress('Adapting prices based on Positionsart...', 100, 100, 'Please close');
	}
});