Copy childtable ( Get Items From )
EinbauEinleitung
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.
Minimal running version
Der Script muss leicht angepasst werden bevor wir kopieren können.
- Zeile 9 enthält den Doctype in den die Tabellenpositionen kopiert werden
- Zeile 11 enthält den Doctype von dem die Positionen stammen
- 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]);
}
});
}
}
});
}