tüit Logo Direkt zum Hauptinhalt

Get Items From other document

Einbau 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. Anzupassen sind die fetch-from Felder in den Zeilen 3 bis 9.
  2. In Zeile 11 bis 13 die Feldnamen und Doctypes anpassen
  3. Und in Zeile 15 den Doctype auf dem der Button erscheinen soll eintragen
// The fetch-from fields
var fields = [
  "item_code",
  "item_name",
  "positionsart",
  "description",
  "qty",
  "uom",
  "rate"];
 
var other_doctype = "Angebotsvorlage"; // The other doctype from where to pick up items
var other_table = "angebotsvorlage_item"; // The table on the other doctype
var original_table = "items"; // The table within the original doctype

frappe.ui.form.on("Quotation", { // Doctype mit dem 'Get Items From'-Button
	refresh(frm) {
	    frm.add_custom_button(other_doctype, function () { frm.trigger('get_items') }, __("Get Items From"));
	},
	get_items(frm){
	    start_dialog(frm);
	}
});

function start_dialog(frm) {
	let dialog = new frappe.ui.form.MultiSelectDialog({

		// Read carefully and adjust parameters
		doctype: other_doctype, // Doctype we want to pick up
		target: frm,
		setters: {
			// MultiDialog Filterfields
			// customer: frm.doc.customer,
		},
		date_field: "creation", // "modified", "creation", ...
		get_query() {
			// MultiDialog Listfilter
			return {
				filters: {  }
			};
		},
		action(selections) {
		    for(var n = 0; n < selections.length; n++){
		        var name = selections[n];
		        frappe.db.get_doc(other_doctype, name) // Again, the Doctype we want to pick up
                .then(doc => {
                    // Remove the first empty element of the table
                    if(!('item_code' in frm.get_field("items").grid.grid_rows[0].doc)){ // This if is specific for item table's only
                        frm.get_field("items").grid.grid_rows[0].remove();
                    }
                    
                    // Run through all items of the template quotation
                    for(var n = 0; n < doc[other_table].length; n++){
                        // Declare variables and add table row
                        var item=doc[other_table][n];
                        var row=frm.add_child(original_table); // Zeile anlegen
                        frm.refresh_fields(original_table); // Refresh Tabelle
                        
                        // Copy-Paste Operation
                        for(var m = 0; m < fields.length; m++){
                            frm.get_field(original_table).grid.grid_rows[n+1].doc[fields[m]] = item[fields[m]];
                            frm.get_field(original_table).grid.grid_rows[n+1].refresh_field(fields[m]);
                        }
                        frm.refresh_fields(original_table); // Refresh Tabelle
                    }
                });
		    }
		}
	});
}