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.
Minimal running version
Der Script muss leicht angepasst werden bevor wir kopieren können.
- Anzupassen sind die fetch-from Felder in den Zeilen 3 bis 9.
- In Zeile 11 bis 13 die Feldnamen und Doctypes anpassen
- 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
}
});
}
}
});
}