Compare commits
95 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
35167be0d9 | ||
|
|
1846d0fa2f | ||
|
|
9ef1d0f5a5 | ||
|
|
738d8c2e0f | ||
|
|
632f7673d5 | ||
|
|
51b4167cdd | ||
|
|
320fb13b37 | ||
|
|
4796e8e317 | ||
|
|
87b6498e02 | ||
|
|
499144fd86 | ||
|
|
b96e239cc0 | ||
|
|
139db5ffe7 | ||
|
|
8cf951b574 | ||
|
|
0c1d441aa3 | ||
|
|
5906ddf804 | ||
|
|
1696294847 | ||
|
|
046e1a6e28 | ||
|
|
ee5ff805e9 | ||
|
|
af01f5154b | ||
|
|
b554f9077c | ||
|
|
bfb3de771b | ||
|
|
21045c456e | ||
|
|
5ebb9a0fc7 | ||
|
|
7663bbadb9 | ||
|
|
4a263c714d | ||
|
|
7587b19d1b | ||
|
|
919c9db1b0 | ||
|
|
3b8b3fe766 | ||
|
|
85adbd7eae | ||
|
|
c697526382 | ||
|
|
99350db5e1 | ||
|
|
478ffb9ae3 | ||
|
|
73dc35ddbf | ||
|
|
250e964205 | ||
|
|
22a5e79b9a | ||
|
|
4d49a7f6d1 | ||
|
|
ce436b7698 | ||
|
|
ec9430dae7 | ||
|
|
578624db1f | ||
|
|
3a512af0e2 | ||
|
|
9b2b42dfc1 | ||
|
|
317888211a | ||
|
|
4d185f3541 | ||
|
|
892cd615f8 | ||
|
|
495ef67caa | ||
|
|
3beb1ba667 | ||
|
|
33977827c4 | ||
|
|
41c954b8b3 | ||
|
|
e2176b852e | ||
|
|
9d5b1b0e8f | ||
|
|
2b420f7038 | ||
|
|
353af64197 | ||
|
|
8bccaed35a | ||
|
|
4d2e782e42 | ||
|
|
c07741d36f | ||
|
|
734e635ef6 | ||
|
|
6f9ef5b890 | ||
|
|
145393b12f | ||
|
|
9c6e2c3637 | ||
|
|
cfc2693b2e | ||
|
|
448d919cc1 | ||
|
|
87ec6a12ef | ||
|
|
059f99e621 | ||
|
|
8579dd1d78 | ||
|
|
1d9fd9aa52 | ||
|
|
930dd5e54e | ||
|
|
7800bd89dc | ||
|
|
53b877bd8f | ||
|
|
40937083bf | ||
|
|
d0109a6fc0 | ||
|
|
b8a4a584e6 | ||
|
|
cda6206c1f | ||
|
|
7bdc45eceb | ||
|
|
dc6e369172 | ||
|
|
fb4f320df4 | ||
|
|
08450878f1 | ||
|
|
2ffe878999 | ||
|
|
49a6b4a4fa | ||
|
|
05e51d6c83 | ||
|
|
4cccdbdbf9 | ||
|
|
4b888b95d0 | ||
|
|
b5ec8381a6 | ||
|
|
1c6828e5d6 | ||
|
|
d65b4b4238 | ||
|
|
13abada526 | ||
|
|
de54f3019f | ||
|
|
d023d9a0bd | ||
|
|
edb2749dfd | ||
|
|
fcaf313c0f | ||
|
|
96381da547 | ||
|
|
91b2833708 | ||
|
|
20a862a6b9 | ||
|
|
65656ec2df | ||
|
|
9306aff1bb | ||
|
|
73f969fd7f |
@@ -4,7 +4,7 @@ import inspect
|
|||||||
import frappe
|
import frappe
|
||||||
from erpnext.hooks import regional_overrides
|
from erpnext.hooks import regional_overrides
|
||||||
|
|
||||||
__version__ = '8.6.1'
|
__version__ = '8.7.3'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
|||||||
@@ -68,7 +68,8 @@ frappe.ui.form.on('Account', {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else if (cint(frm.doc.is_group) == 0) {
|
} else if (cint(frm.doc.is_group) == 0
|
||||||
|
&& frappe.boot.user.can_read.indexOf("GL Entry") !== -1) {
|
||||||
cur_frm.add_custom_button(__('Ledger'), function () {
|
cur_frm.add_custom_button(__('Ledger'), function () {
|
||||||
frappe.route_options = {
|
frappe.route_options = {
|
||||||
"account": frm.doc.name,
|
"account": frm.doc.name,
|
||||||
|
|||||||
@@ -147,8 +147,9 @@ class Asset(Document):
|
|||||||
accumulated_depreciation_after_full_schedule = \
|
accumulated_depreciation_after_full_schedule = \
|
||||||
max([d.accumulated_depreciation_amount for d in self.get("schedules")])
|
max([d.accumulated_depreciation_amount for d in self.get("schedules")])
|
||||||
|
|
||||||
asset_value_after_full_schedule = (flt(self.gross_purchase_amount) -
|
asset_value_after_full_schedule = flt(flt(self.gross_purchase_amount) -
|
||||||
flt(accumulated_depreciation_after_full_schedule))
|
flt(accumulated_depreciation_after_full_schedule),
|
||||||
|
self.precision('expected_value_after_useful_life'))
|
||||||
|
|
||||||
if self.expected_value_after_useful_life < asset_value_after_full_schedule:
|
if self.expected_value_after_useful_life < asset_value_after_full_schedule:
|
||||||
frappe.throw(_("Expected value after useful life must be greater than or equal to {0}")
|
frappe.throw(_("Expected value after useful life must be greater than or equal to {0}")
|
||||||
|
|||||||
@@ -718,7 +718,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-04-27 13:18:06.617940",
|
"modified": "2017-08-03 12:40:09.611951",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "GL Entry",
|
"name": "GL Entry",
|
||||||
@@ -786,7 +786,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"quick_entry": 1,
|
"quick_entry": 1,
|
||||||
"read_only": 1,
|
"read_only": 0,
|
||||||
"read_only_onload": 0,
|
"read_only_onload": 0,
|
||||||
"search_fields": "voucher_no,account,posting_date,against_voucher",
|
"search_fields": "voucher_no,account,posting_date,against_voucher",
|
||||||
"show_name_in_global_search": 0,
|
"show_name_in_global_search": 0,
|
||||||
|
|||||||
23
erpnext/accounts/doctype/gl_entry/test_gl_entry.js
Normal file
23
erpnext/accounts/doctype/gl_entry/test_gl_entry.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
// rename this file from _test_[name] to test_[name] to activate
|
||||||
|
// and remove above this line
|
||||||
|
|
||||||
|
QUnit.test("test: GL Entry", function (assert) {
|
||||||
|
let done = assert.async();
|
||||||
|
|
||||||
|
// number of asserts
|
||||||
|
assert.expect(1);
|
||||||
|
|
||||||
|
frappe.run_serially('GL Entry', [
|
||||||
|
// insert a new GL Entry
|
||||||
|
() => frappe.tests.make([
|
||||||
|
// values to be set
|
||||||
|
{key: 'value'}
|
||||||
|
]),
|
||||||
|
() => {
|
||||||
|
assert.equal(cur_frm.doc.key, 'value');
|
||||||
|
},
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
|
||||||
|
});
|
||||||
@@ -43,8 +43,26 @@ frappe.ui.form.on("Journal Entry", {
|
|||||||
$.each(frm.doc.accounts || [], function(i, row) {
|
$.each(frm.doc.accounts || [], function(i, row) {
|
||||||
erpnext.journal_entry.set_exchange_rate(frm, row.doctype, row.name);
|
erpnext.journal_entry.set_exchange_rate(frm, row.doctype, row.name);
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
company: function(frm) {
|
||||||
|
frappe.call({
|
||||||
|
method: "frappe.client.get_value",
|
||||||
|
args: {
|
||||||
|
doctype: "Company",
|
||||||
|
filters: {"name": frm.doc.company},
|
||||||
|
fieldname: "cost_center"
|
||||||
|
},
|
||||||
|
callback: function(r){
|
||||||
|
if(r.message){
|
||||||
|
$.each(frm.doc.accounts || [], function(i, jvd) {
|
||||||
|
frappe.model.set_value(jvd.doctype, jvd.name, "cost_center", r.message.cost_center);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
|
erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
|
||||||
onload: function() {
|
onload: function() {
|
||||||
|
|||||||
@@ -721,38 +721,6 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "tc_name",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Terms and Conditions",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"oldfieldname": "tc_name",
|
|
||||||
"oldfieldtype": "Link",
|
|
||||||
"options": "Terms and Conditions",
|
|
||||||
"permlevel": 0,
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@@ -782,39 +750,6 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"description": "",
|
|
||||||
"fieldname": "territory",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Territory",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"oldfieldname": "territory",
|
|
||||||
"oldfieldtype": "Link",
|
|
||||||
"options": "Territory",
|
|
||||||
"permlevel": 0,
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@@ -847,6 +782,38 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "tc_name",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Terms and Conditions",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"oldfieldname": "tc_name",
|
||||||
|
"oldfieldtype": "Link",
|
||||||
|
"options": "Terms and Conditions",
|
||||||
|
"permlevel": 0,
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@@ -910,6 +877,129 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "customer_details",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "New Customer Details",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"description": "",
|
||||||
|
"fieldname": "territory",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Territory",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"oldfieldname": "territory",
|
||||||
|
"oldfieldtype": "Link",
|
||||||
|
"options": "Territory",
|
||||||
|
"permlevel": 0,
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_31",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "customer_group",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Customer Group",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Customer Group",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@@ -1201,7 +1291,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-06-16 17:04:33.165676",
|
"modified": "2017-07-28 03:40:03.253088",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "POS Profile",
|
"name": "POS Profile",
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class POSProfile(Document):
|
|||||||
self.check_for_duplicate()
|
self.check_for_duplicate()
|
||||||
self.validate_all_link_fields()
|
self.validate_all_link_fields()
|
||||||
self.validate_duplicate_groups()
|
self.validate_duplicate_groups()
|
||||||
|
self.validate_customer_territory_group()
|
||||||
|
|
||||||
def check_for_duplicate(self):
|
def check_for_duplicate(self):
|
||||||
res = frappe.db.sql("""select name, user from `tabPOS Profile`
|
res = frappe.db.sql("""select name, user from `tabPOS Profile`
|
||||||
@@ -48,6 +49,13 @@ class POSProfile(Document):
|
|||||||
if len(customer_groups) != len(set(customer_groups)):
|
if len(customer_groups) != len(set(customer_groups)):
|
||||||
frappe.throw(_("Duplicate customer group found in the cutomer group table"), title = "Duplicate Customer Group")
|
frappe.throw(_("Duplicate customer group found in the cutomer group table"), title = "Duplicate Customer Group")
|
||||||
|
|
||||||
|
def validate_customer_territory_group(self):
|
||||||
|
if not self.territory:
|
||||||
|
frappe.throw(_("Territory is Required in POS Profile"), title="Mandatory Field")
|
||||||
|
|
||||||
|
if not self.customer_group:
|
||||||
|
frappe.throw(_("Customer Group is Required in POS Profile"), title="Mandatory Field")
|
||||||
|
|
||||||
def before_save(self):
|
def before_save(self):
|
||||||
set_account_for_mode_of_payment(self)
|
set_account_for_mode_of_payment(self)
|
||||||
|
|
||||||
|
|||||||
23
erpnext/accounts/doctype/pos_profile/test_pos_profile.js
Normal file
23
erpnext/accounts/doctype/pos_profile/test_pos_profile.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
// rename this file from _test_[name] to test_[name] to activate
|
||||||
|
// and remove above this line
|
||||||
|
|
||||||
|
QUnit.test("test: POS Profile", function (assert) {
|
||||||
|
let done = assert.async();
|
||||||
|
|
||||||
|
// number of asserts
|
||||||
|
assert.expect(1);
|
||||||
|
|
||||||
|
frappe.run_serially('POS Profile', [
|
||||||
|
// insert a new POS Profile
|
||||||
|
() => frappe.tests.make([
|
||||||
|
// values to be set
|
||||||
|
{key: 'value'}
|
||||||
|
]),
|
||||||
|
() => {
|
||||||
|
assert.equal(cur_frm.doc.key, 'value');
|
||||||
|
},
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
|
||||||
|
});
|
||||||
@@ -42,6 +42,7 @@ def make_pos_profile():
|
|||||||
"naming_series": "_T-POS Profile-",
|
"naming_series": "_T-POS Profile-",
|
||||||
"selling_price_list": "_Test Price List",
|
"selling_price_list": "_Test Price List",
|
||||||
"territory": "_Test Territory",
|
"territory": "_Test Territory",
|
||||||
|
"customer_group": frappe.db.get_value('Customer Group', {'is_group': 0}, 'name'),
|
||||||
"warehouse": "_Test Warehouse - _TC",
|
"warehouse": "_Test Warehouse - _TC",
|
||||||
"write_off_account": "_Test Write Off - _TC",
|
"write_off_account": "_Test Write Off - _TC",
|
||||||
"write_off_cost_center": "_Test Write Off Cost Center - _TC"
|
"write_off_cost_center": "_Test Write Off Cost Center - _TC"
|
||||||
|
|||||||
@@ -510,7 +510,7 @@ class PurchaseInvoice(BuyingController):
|
|||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
if self.update_stock and valuation_tax:
|
if self.auto_accounting_for_stock and self.update_stock and valuation_tax:
|
||||||
for cost_center, amount in valuation_tax.items():
|
for cost_center, amount in valuation_tax.items():
|
||||||
gl_entries.append(
|
gl_entries.append(
|
||||||
self.get_gl_dict({
|
self.get_gl_dict({
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe, json
|
import frappe, json
|
||||||
|
from frappe import _
|
||||||
from frappe.utils import nowdate
|
from frappe.utils import nowdate
|
||||||
from erpnext.setup.utils import get_exchange_rate
|
from erpnext.setup.utils import get_exchange_rate
|
||||||
from frappe.core.doctype.communication.email import make
|
from frappe.core.doctype.communication.email import make
|
||||||
@@ -20,6 +21,7 @@ def get_pos_data():
|
|||||||
|
|
||||||
if pos_profile.get('name'):
|
if pos_profile.get('name'):
|
||||||
pos_profile = frappe.get_doc('POS Profile', pos_profile.get('name'))
|
pos_profile = frappe.get_doc('POS Profile', pos_profile.get('name'))
|
||||||
|
pos_profile.validate()
|
||||||
|
|
||||||
company_data = get_company_data(doc.company)
|
company_data = get_company_data(doc.company)
|
||||||
update_pos_profile_data(doc, pos_profile, company_data)
|
update_pos_profile_data(doc, pos_profile, company_data)
|
||||||
@@ -378,13 +380,27 @@ def add_customer(data):
|
|||||||
customer_doc.customer_name = data.get('full_name') or data.get('customer')
|
customer_doc.customer_name = data.get('full_name') or data.get('customer')
|
||||||
customer_doc.customer_pos_id = data.get('customer_pos_id')
|
customer_doc.customer_pos_id = data.get('customer_pos_id')
|
||||||
customer_doc.customer_type = 'Company'
|
customer_doc.customer_type = 'Company'
|
||||||
customer_doc.customer_group = frappe.db.get_single_value('Selling Settings', 'customer_group')
|
customer_doc.customer_group = get_customer_group(data)
|
||||||
customer_doc.territory = frappe.db.get_single_value('Selling Settings', 'territory')
|
customer_doc.territory = get_territory(data)
|
||||||
customer_doc.flags.ignore_mandatory = True
|
customer_doc.flags.ignore_mandatory = True
|
||||||
customer_doc.save(ignore_permissions = True)
|
customer_doc.save(ignore_permissions = True)
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
return customer_doc.name
|
return customer_doc.name
|
||||||
|
|
||||||
|
def get_territory(data):
|
||||||
|
if data.get('territory'):
|
||||||
|
return data.get('territory')
|
||||||
|
|
||||||
|
return frappe.db.get_single_value('Selling Settings',
|
||||||
|
'territory') or _('All Territories')
|
||||||
|
|
||||||
|
def get_customer_group(data):
|
||||||
|
if data.get('customer_group'):
|
||||||
|
return data.get('customer_group')
|
||||||
|
|
||||||
|
return frappe.db.get_single_value('Selling Settings',
|
||||||
|
'customer_group') or frappe.db.get_value('Customer Group', {'is_group': 0}, 'name')
|
||||||
|
|
||||||
def make_contact(args,customer):
|
def make_contact(args,customer):
|
||||||
if args.get('email_id') or args.get('phone'):
|
if args.get('email_id') or args.get('phone'):
|
||||||
name = frappe.db.get_value('Dynamic Link',
|
name = frappe.db.get_value('Dynamic Link',
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
import unittest, copy
|
import unittest, copy
|
||||||
from frappe.utils import nowdate, add_days, flt
|
from frappe.utils import nowdate, add_days, flt
|
||||||
|
from frappe.model.dynamic_links import get_dynamic_link_map
|
||||||
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry, get_qty_after_transaction
|
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry, get_qty_after_transaction
|
||||||
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import unlink_payment_on_cancel_of_invoice
|
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import unlink_payment_on_cancel_of_invoice
|
||||||
from erpnext.accounts.doctype.pos_profile.test_pos_profile import make_pos_profile
|
from erpnext.accounts.doctype.pos_profile.test_pos_profile import make_pos_profile
|
||||||
@@ -485,6 +486,12 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
|
|
||||||
self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 161.8)
|
self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 161.8)
|
||||||
|
|
||||||
|
link_data = get_dynamic_link_map().get('Sales Invoice', [])
|
||||||
|
link_doctypes = [d.parent for d in link_data]
|
||||||
|
|
||||||
|
# test case for dynamic link order
|
||||||
|
self.assertTrue(link_doctypes.index('GL Entry') > link_doctypes.index('Journal Entry Account'))
|
||||||
|
|
||||||
jv.cancel()
|
jv.cancel()
|
||||||
self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 561.8)
|
self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 561.8)
|
||||||
|
|
||||||
|
|||||||
@@ -20,20 +20,22 @@ frappe.ui.form.on("Tax Rule", "refresh", function(frm) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
frappe.ui.form.on("Tax Rule", "customer", function(frm) {
|
frappe.ui.form.on("Tax Rule", "customer", function(frm) {
|
||||||
frappe.call({
|
if(frm.doc.customer) {
|
||||||
method:"erpnext.accounts.doctype.tax_rule.tax_rule.get_party_details",
|
frappe.call({
|
||||||
args: {
|
method:"erpnext.accounts.doctype.tax_rule.tax_rule.get_party_details",
|
||||||
"party": frm.doc.customer,
|
args: {
|
||||||
"party_type": "customer"
|
"party": frm.doc.customer,
|
||||||
},
|
"party_type": "customer"
|
||||||
callback: function(r) {
|
},
|
||||||
if(!r.exc) {
|
callback: function(r) {
|
||||||
$.each(r.message, function(k, v) {
|
if(!r.exc) {
|
||||||
frm.set_value(k, v);
|
$.each(r.message, function(k, v) {
|
||||||
});
|
frm.set_value(k, v);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
frappe.ui.form.on("Tax Rule", "supplier", function(frm) {
|
frappe.ui.form.on("Tax Rule", "supplier", function(frm) {
|
||||||
|
|||||||
@@ -979,6 +979,8 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
|||||||
get_prompt_details: function() {
|
get_prompt_details: function() {
|
||||||
this.prompt_details = this.customer_doc.get_values();
|
this.prompt_details = this.customer_doc.get_values();
|
||||||
this.prompt_details['country'] = this.pos_profile_data.country;
|
this.prompt_details['country'] = this.pos_profile_data.country;
|
||||||
|
this.prompt_details['territory'] = this.pos_profile_data["territory"];
|
||||||
|
this.prompt_details['customer_group'] = this.pos_profile_data["customer_group"];
|
||||||
this.prompt_details['customer_pos_id'] = this.customer_doc.fields_dict.customer_pos_id.value;
|
this.prompt_details['customer_pos_id'] = this.customer_doc.fields_dict.customer_pos_id.value;
|
||||||
return JSON.stringify(this.prompt_details)
|
return JSON.stringify(this.prompt_details)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ from frappe.contacts.doctype.address.address import (get_address_display,
|
|||||||
from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact
|
from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact
|
||||||
from erpnext.exceptions import PartyFrozen, PartyDisabled, InvalidAccountCurrency
|
from erpnext.exceptions import PartyFrozen, PartyDisabled, InvalidAccountCurrency
|
||||||
from erpnext.accounts.utils import get_fiscal_year
|
from erpnext.accounts.utils import get_fiscal_year
|
||||||
from erpnext import get_default_currency
|
from erpnext import get_default_currency, get_company_currency
|
||||||
|
|
||||||
|
|
||||||
class DuplicatePartyAccountError(frappe.ValidationError): pass
|
class DuplicatePartyAccountError(frappe.ValidationError): pass
|
||||||
|
|
||||||
@@ -43,6 +44,7 @@ def _get_party_details(party=None, account=None, party_type="Customer", company=
|
|||||||
frappe.throw(_("Not permitted for {0}").format(party), frappe.PermissionError)
|
frappe.throw(_("Not permitted for {0}").format(party), frappe.PermissionError)
|
||||||
|
|
||||||
party = frappe.get_doc(party_type, party)
|
party = frappe.get_doc(party_type, party)
|
||||||
|
currency = party.default_currency if party.default_currency else get_company_currency(company)
|
||||||
|
|
||||||
set_address_details(out, party, party_type, doctype, company)
|
set_address_details(out, party, party_type, doctype, company)
|
||||||
set_contact_details(out, party, party_type)
|
set_contact_details(out, party, party_type)
|
||||||
@@ -273,6 +275,7 @@ def get_due_date(posting_date, party_type, party, company):
|
|||||||
return due_date
|
return due_date
|
||||||
|
|
||||||
def get_credit_days(party_type, party, company):
|
def get_credit_days(party_type, party, company):
|
||||||
|
credit_days = 0
|
||||||
if party_type and party:
|
if party_type and party:
|
||||||
if party_type == "Customer":
|
if party_type == "Customer":
|
||||||
credit_days_based_on, credit_days, customer_group = \
|
credit_days_based_on, credit_days, customer_group = \
|
||||||
@@ -282,10 +285,10 @@ def get_credit_days(party_type, party, company):
|
|||||||
frappe.db.get_value(party_type, party, ["credit_days_based_on", "credit_days", "supplier_type"])
|
frappe.db.get_value(party_type, party, ["credit_days_based_on", "credit_days", "supplier_type"])
|
||||||
|
|
||||||
if not credit_days_based_on:
|
if not credit_days_based_on:
|
||||||
if party_type == "Customer":
|
if party_type == "Customer" and customer_group:
|
||||||
credit_days_based_on, credit_days = \
|
credit_days_based_on, credit_days = \
|
||||||
frappe.db.get_value("Customer Group", customer_group, ["credit_days_based_on", "credit_days"])
|
frappe.db.get_value("Customer Group", customer_group, ["credit_days_based_on", "credit_days"])
|
||||||
else:
|
elif party_type == "Supplier" and supplier_type:
|
||||||
credit_days_based_on, credit_days = \
|
credit_days_based_on, credit_days = \
|
||||||
frappe.db.get_value("Supplier Type", supplier_type, ["credit_days_based_on", "credit_days"])
|
frappe.db.get_value("Supplier Type", supplier_type, ["credit_days_based_on", "credit_days"])
|
||||||
|
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ def add_total_row(out, root_type, balance_must_be, period_list, company_currency
|
|||||||
for period in period_list:
|
for period in period_list:
|
||||||
total_row.setdefault(period.key, 0.0)
|
total_row.setdefault(period.key, 0.0)
|
||||||
total_row[period.key] += row.get(period.key, 0.0)
|
total_row[period.key] += row.get(period.key, 0.0)
|
||||||
row[period.key] = ""
|
row[period.key] = 0.0
|
||||||
|
|
||||||
total_row.setdefault("total", 0.0)
|
total_row.setdefault("total", 0.0)
|
||||||
total_row["total"] += flt(row["total"])
|
total_row["total"] += flt(row["total"])
|
||||||
|
|||||||
@@ -209,7 +209,10 @@ class GrossProfitGenerator(object):
|
|||||||
sle.voucher_detail_no == row.item_row:
|
sle.voucher_detail_no == row.item_row:
|
||||||
previous_stock_value = len(my_sle) > i+1 and \
|
previous_stock_value = len(my_sle) > i+1 and \
|
||||||
flt(my_sle[i+1].stock_value) or 0.0
|
flt(my_sle[i+1].stock_value) or 0.0
|
||||||
return previous_stock_value - flt(sle.stock_value)
|
if previous_stock_value:
|
||||||
|
return previous_stock_value - flt(sle.stock_value)
|
||||||
|
else:
|
||||||
|
return flt(row.qty) * self.get_average_buying_rate(row, item_code)
|
||||||
else:
|
else:
|
||||||
return flt(row.qty) * self.get_average_buying_rate(row, item_code)
|
return flt(row.qty) * self.get_average_buying_rate(row, item_code)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ class PurchaseOrder(BuyingController):
|
|||||||
super(PurchaseOrder, self).validate()
|
super(PurchaseOrder, self).validate()
|
||||||
|
|
||||||
self.set_status()
|
self.set_status()
|
||||||
|
|
||||||
|
self.validate_supplier()
|
||||||
validate_for_items(self)
|
validate_for_items(self)
|
||||||
self.check_for_closed_status()
|
self.check_for_closed_status()
|
||||||
|
|
||||||
@@ -65,6 +67,17 @@ class PurchaseOrder(BuyingController):
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
def validate_supplier(self):
|
||||||
|
prevent_po = frappe.db.get_value("Supplier", self.supplier, 'prevent_pos')
|
||||||
|
if prevent_po:
|
||||||
|
standing = frappe.db.get_value("Supplier Scorecard",self.supplier, 'status')
|
||||||
|
frappe.throw(_("Purchase Orders are not allowed for {0} due to a scorecard standing of {1}.").format(self.supplier, standing))
|
||||||
|
|
||||||
|
warn_po = frappe.db.get_value("Supplier", self.supplier, 'warn_pos')
|
||||||
|
if warn_po:
|
||||||
|
standing = frappe.db.get_value("Supplier Scorecard",self.supplier, 'status')
|
||||||
|
frappe.msgprint(_("{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution.").format(self.supplier, standing), title=_("Caution"), indicator='orange')
|
||||||
|
|
||||||
def validate_minimum_order_qty(self):
|
def validate_minimum_order_qty(self):
|
||||||
items = list(set([d.item_code for d in self.get("items")]))
|
items = list(set([d.item_code for d in self.get("items")]))
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 1,
|
"bold": 1,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -45,6 +46,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -74,6 +76,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -104,6 +107,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -132,6 +136,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 1,
|
"allow_on_submit": 1,
|
||||||
"bold": 1,
|
"bold": 1,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -162,6 +167,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 1,
|
"allow_on_submit": 1,
|
||||||
"bold": 1,
|
"bold": 1,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -191,6 +197,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
@@ -220,6 +227,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -252,6 +260,7 @@
|
|||||||
"width": "300px"
|
"width": "300px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -279,6 +288,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -308,6 +318,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -338,6 +349,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -366,6 +378,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 1,
|
"bold": 1,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -398,6 +411,7 @@
|
|||||||
"width": "60px"
|
"width": "60px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -431,6 +445,7 @@
|
|||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -458,6 +473,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -491,6 +507,7 @@
|
|||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -523,6 +540,7 @@
|
|||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -550,6 +568,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -579,6 +598,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -608,6 +628,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -635,6 +656,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -664,6 +686,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -691,6 +714,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 1,
|
"bold": 1,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -722,6 +746,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -753,6 +778,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -780,6 +806,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -814,6 +841,7 @@
|
|||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -845,6 +873,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -874,6 +903,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -902,6 +932,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -932,6 +963,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -962,6 +994,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -990,6 +1023,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1020,6 +1054,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1050,6 +1085,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1078,6 +1114,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1109,6 +1146,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1138,6 +1176,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1171,6 +1210,7 @@
|
|||||||
"width": "120px"
|
"width": "120px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1201,6 +1241,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1231,6 +1272,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1260,6 +1302,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1289,6 +1332,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1318,6 +1362,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1347,6 +1392,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1374,6 +1420,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1406,6 +1453,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1437,6 +1485,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1467,6 +1516,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1499,6 +1549,7 @@
|
|||||||
"width": "100px"
|
"width": "100px"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1529,6 +1580,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1559,6 +1611,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1588,6 +1641,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1619,6 +1673,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 1,
|
"allow_on_submit": 1,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -1659,7 +1714,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-04-25 18:49:08.604055",
|
"modified": "2017-08-02 22:15:47.411235",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Purchase Order Item",
|
"name": "Purchase Order Item",
|
||||||
|
|||||||
@@ -44,6 +44,9 @@ frappe.ui.form.on("Request for Quotation",{
|
|||||||
freeze: true,
|
freeze: true,
|
||||||
args: {
|
args: {
|
||||||
rfq_name: frm.doc.name
|
rfq_name: frm.doc.name
|
||||||
|
},
|
||||||
|
callback: function(r){
|
||||||
|
frm.reload_doc();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -51,6 +54,91 @@ frappe.ui.form.on("Request for Quotation",{
|
|||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
get_suppliers_button: function (frm) {
|
||||||
|
var doc = frm.doc;
|
||||||
|
var dialog = new frappe.ui.Dialog({
|
||||||
|
title: __("Get Suppliers"),
|
||||||
|
fields: [
|
||||||
|
{ "fieldtype": "Select", "label": __("Get Suppliers By"),
|
||||||
|
"fieldname": "search_type",
|
||||||
|
"options": "Tag\nSupplier Type", "reqd": 1 },
|
||||||
|
{ "fieldtype": "Link", "label": __("Supplier Type"),
|
||||||
|
"fieldname": "supplier_type",
|
||||||
|
"options": "Supplier Type", "reqd": 0,
|
||||||
|
"depends_on": "eval:doc.search_type == 'Supplier Type'"},
|
||||||
|
{ "fieldtype": "Data", "label": __("Tag"),
|
||||||
|
"fieldname": "tag", "reqd": 0,
|
||||||
|
"depends_on": "eval:doc.search_type == 'Tag'" },
|
||||||
|
{ "fieldtype": "Button", "label": __("Add All Suppliers"),
|
||||||
|
"fieldname": "add_suppliers", "cssClass": "btn-primary"},
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog.fields_dict.add_suppliers.$input.click(function() {
|
||||||
|
var args = dialog.get_values();
|
||||||
|
if(!args) return;
|
||||||
|
dialog.hide();
|
||||||
|
|
||||||
|
//Remove blanks
|
||||||
|
for (var j = 0; j < frm.doc.suppliers.length; j++) {
|
||||||
|
if(!frm.doc.suppliers[j].hasOwnProperty("supplier")) {
|
||||||
|
frm.get_field("suppliers").grid.grid_rows[j].remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function load_suppliers(r) {
|
||||||
|
if(r.message) {
|
||||||
|
for (var i = 0; i < r.message.length; i++) {
|
||||||
|
var exists = false;
|
||||||
|
if (r.message[i].constructor === Array){
|
||||||
|
var supplier = r.message[i][0];
|
||||||
|
} else {
|
||||||
|
var supplier = r.message[i].name;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var j = 0; j < doc.suppliers.length;j++) {
|
||||||
|
if (supplier === doc.suppliers[j].supplier) {
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!exists) {
|
||||||
|
var d = frm.add_child('suppliers');
|
||||||
|
d.supplier = supplier;
|
||||||
|
frm.script_manager.trigger("supplier", d.doctype, d.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
frm.refresh_field("suppliers");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.search_type === "Tag" && args.tag) {
|
||||||
|
return frappe.call({
|
||||||
|
type: "GET",
|
||||||
|
method: "frappe.desk.tags.get_tagged_docs",
|
||||||
|
args: {
|
||||||
|
"doctype": "Supplier",
|
||||||
|
"tag": args.tag
|
||||||
|
},
|
||||||
|
callback: load_suppliers
|
||||||
|
});
|
||||||
|
} else if (args.supplier_type) {
|
||||||
|
return frappe.call({
|
||||||
|
method: "frappe.client.get_list",
|
||||||
|
args: {
|
||||||
|
doctype: "Supplier",
|
||||||
|
order_by: "name",
|
||||||
|
fields: ["name"],
|
||||||
|
filters: [["Supplier", "supplier_type", "=", args.supplier_type]]
|
||||||
|
|
||||||
|
},
|
||||||
|
callback: load_suppliers
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialog.show();
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
make_suppplier_quotation: function(frm) {
|
make_suppplier_quotation: function(frm) {
|
||||||
var doc = frm.doc;
|
var doc = frm.doc;
|
||||||
var dialog = new frappe.ui.Dialog({
|
var dialog = new frappe.ui.Dialog({
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Series",
|
"label": "Series",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Company",
|
"label": "Company",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
@@ -156,7 +156,7 @@
|
|||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Date",
|
"label": "Date",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
@@ -236,6 +236,36 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "get_suppliers_button",
|
||||||
|
"fieldtype": "Button",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Get Suppliers",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@@ -406,7 +436,7 @@
|
|||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Message for Supplier",
|
"label": "Message for Supplier",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
@@ -786,7 +816,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-06-13 14:29:13.171291",
|
"modified": "2017-07-21 14:06:46.309322",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Request for Quotation",
|
"name": "Request for Quotation",
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ STANDARD_USERS = ("Guest", "Administrator")
|
|||||||
class RequestforQuotation(BuyingController):
|
class RequestforQuotation(BuyingController):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.validate_duplicate_supplier()
|
self.validate_duplicate_supplier()
|
||||||
|
self.validate_supplier_list()
|
||||||
validate_for_items(self)
|
validate_for_items(self)
|
||||||
self.update_email_id()
|
self.update_email_id()
|
||||||
|
|
||||||
@@ -29,6 +30,17 @@ class RequestforQuotation(BuyingController):
|
|||||||
if len(supplier_list) != len(set(supplier_list)):
|
if len(supplier_list) != len(set(supplier_list)):
|
||||||
frappe.throw(_("Same supplier has been entered multiple times"))
|
frappe.throw(_("Same supplier has been entered multiple times"))
|
||||||
|
|
||||||
|
def validate_supplier_list(self):
|
||||||
|
for d in self.suppliers:
|
||||||
|
prevent_rfqs = frappe.db.get_value("Supplier", d.supplier, 'prevent_rfqs')
|
||||||
|
if prevent_rfqs:
|
||||||
|
standing = frappe.db.get_value("Supplier Scorecard",d.supplier, 'status')
|
||||||
|
frappe.throw(_("RFQs are not allowed for {0} due to a scorecard standing of {1}").format(d.supplier, standing))
|
||||||
|
warn_rfqs = frappe.db.get_value("Supplier", d.supplier, 'warn_rfqs')
|
||||||
|
if warn_rfqs:
|
||||||
|
standing = frappe.db.get_value("Supplier Scorecard",d.supplier, 'status')
|
||||||
|
frappe.msgprint(_("{0} currently has a {1} Supplier Scorecard standing, and RFQs to this supplier should be issued with caution.").format(d.supplier, standing), title=_("Caution"), indicator='orange')
|
||||||
|
|
||||||
def update_email_id(self):
|
def update_email_id(self):
|
||||||
for rfq_supplier in self.suppliers:
|
for rfq_supplier in self.suppliers:
|
||||||
if not rfq_supplier.email_id:
|
if not rfq_supplier.email_id:
|
||||||
@@ -40,6 +52,8 @@ class RequestforQuotation(BuyingController):
|
|||||||
|
|
||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
frappe.db.set(self, 'status', 'Submitted')
|
frappe.db.set(self, 'status', 'Submitted')
|
||||||
|
for supplier in self.suppliers:
|
||||||
|
supplier.email_sent = 0
|
||||||
|
|
||||||
def on_cancel(self):
|
def on_cancel(self):
|
||||||
frappe.db.set(self, 'status', 'Cancelled')
|
frappe.db.set(self, 'status', 'Cancelled')
|
||||||
@@ -54,6 +68,8 @@ class RequestforQuotation(BuyingController):
|
|||||||
|
|
||||||
self.update_supplier_part_no(rfq_supplier)
|
self.update_supplier_part_no(rfq_supplier)
|
||||||
self.supplier_rfq_mail(rfq_supplier, update_password_link, self.get_link())
|
self.supplier_rfq_mail(rfq_supplier, update_password_link, self.get_link())
|
||||||
|
rfq_supplier.email_sent = 1
|
||||||
|
rfq_supplier.save()
|
||||||
|
|
||||||
def get_link(self):
|
def get_link(self):
|
||||||
# RFQ link for supplier portal
|
# RFQ link for supplier portal
|
||||||
@@ -84,7 +100,10 @@ class RequestforQuotation(BuyingController):
|
|||||||
else:
|
else:
|
||||||
contact = frappe.new_doc("Contact")
|
contact = frappe.new_doc("Contact")
|
||||||
contact.first_name = rfq_supplier.supplier_name or rfq_supplier.supplier
|
contact.first_name = rfq_supplier.supplier_name or rfq_supplier.supplier
|
||||||
contact.supplier = rfq_supplier.supplier
|
contact.append('links', {
|
||||||
|
'link_doctype': 'Supplier',
|
||||||
|
'link_name': rfq_supplier.supplier
|
||||||
|
})
|
||||||
|
|
||||||
if not contact.email_id and not contact.user:
|
if not contact.email_id and not contact.user:
|
||||||
contact.email_id = user.name
|
contact.email_id = user.name
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 0,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
"beta": 0,
|
"beta": 0,
|
||||||
@@ -12,6 +13,7 @@
|
|||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 1,
|
"allow_on_submit": 1,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -42,6 +44,39 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 1,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"default": "0",
|
||||||
|
"depends_on": "eval:doc.docstatus >= 1",
|
||||||
|
"fieldname": "email_sent",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Email Sent",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 1,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -72,6 +107,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -102,6 +138,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -130,6 +167,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 1,
|
"bold": 1,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -160,6 +198,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -190,6 +229,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 1,
|
"allow_on_submit": 1,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -219,17 +259,17 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
"hide_heading": 0,
|
"hide_heading": 0,
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
"idx": 0,
|
"idx": 0,
|
||||||
"image_view": 0,
|
"image_view": 0,
|
||||||
"in_create": 0,
|
"in_create": 0,
|
||||||
"in_dialog": 0,
|
|
||||||
"is_submittable": 0,
|
"is_submittable": 0,
|
||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-02-17 16:42:57.254211",
|
"modified": "2017-07-24 06:52:19.542717",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Request for Quotation Supplier",
|
"name": "Request for Quotation Supplier",
|
||||||
|
|||||||
@@ -322,6 +322,126 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "warn_rfqs",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Warn RFQs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "warn_pos",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Warn POs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "prevent_rfqs",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Prevent RFQs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "prevent_pos",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Prevent POs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@@ -850,7 +970,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-06-13 14:29:16.310834",
|
"modified": "2017-07-06 16:40:46.935608",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Supplier",
|
"name": "Supplier",
|
||||||
|
|||||||
146
erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.js
Normal file
146
erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.js
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
/* global frappe, refresh_field */
|
||||||
|
|
||||||
|
frappe.ui.form.on("Supplier Scorecard", {
|
||||||
|
|
||||||
|
onload: function(frm) {
|
||||||
|
|
||||||
|
if (frm.doc.indicator_color !== "") {
|
||||||
|
frm.set_indicator_formatter("status", function(doc) {
|
||||||
|
return doc.indicator_color.toLowerCase();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (frm.doc.__unsaved == 1) {
|
||||||
|
loadAllCriteria(frm);
|
||||||
|
loadAllStandings(frm);
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
refresh: function(frm) {
|
||||||
|
if (frm.dashboard.hasOwnProperty('heatmap')) {
|
||||||
|
frm.dashboard.heatmap.setLegend([0,20,40,60,80,101],["#991600","#169900"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
frappe.ui.form.on("Supplier Scorecard Scoring Standing", {
|
||||||
|
|
||||||
|
standing_name: function(frm, cdt, cdn) {
|
||||||
|
if (frm.doc.standing_name != undefined) {
|
||||||
|
var d = frappe.get_doc(cdt, cdn);
|
||||||
|
return frm.call({
|
||||||
|
method: "erpnext.buying.doctype.supplier_scorecard_standing.supplier_scorecard_standing.get_scoring_standing",
|
||||||
|
child: d,
|
||||||
|
args: {
|
||||||
|
standing_name: d.standing_name
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
frappe.ui.form.on("Supplier Scorecard Scoring Variable", {
|
||||||
|
|
||||||
|
variable_label: function(frm, cdt, cdn) {
|
||||||
|
if (frm.doc.variable_label != undefined) {
|
||||||
|
var d = frappe.get_doc(cdt, cdn);
|
||||||
|
return frm.call({
|
||||||
|
method: "erpnext.buying.doctype.supplier_scorecard_variable.supplier_scorecard_variable.get_scoring_variable",
|
||||||
|
child: d,
|
||||||
|
args: {
|
||||||
|
variable_label: d.variable_label
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
frappe.ui.form.on("Supplier Scorecard Scoring Criteria", {
|
||||||
|
|
||||||
|
criteria_name: function(frm, cdt, cdn) {
|
||||||
|
if (frm.doc.criteria_name != undefined) {
|
||||||
|
var d = frappe.get_doc(cdt, cdn);
|
||||||
|
frm.call({
|
||||||
|
method: "erpnext.buying.doctype.supplier_scorecard_criteria.supplier_scorecard_criteria.get_variables",
|
||||||
|
args: {
|
||||||
|
criteria_name: d.criteria_name
|
||||||
|
},
|
||||||
|
callback: function(r) {
|
||||||
|
for (var i = 0; i < r.message.length; i++)
|
||||||
|
{
|
||||||
|
var exists = false;
|
||||||
|
for (var j = 0; j < frm.doc.variables.length; j++)
|
||||||
|
{
|
||||||
|
if(!frm.doc.variables[j].hasOwnProperty("variable_label")) {
|
||||||
|
frm.get_field("variables").grid.grid_rows[j].remove();
|
||||||
|
}
|
||||||
|
else if(frm.doc.variables[j].variable_label === r.message[i]) {
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!exists){
|
||||||
|
var new_row = frm.add_child("variables");
|
||||||
|
new_row.variable_label = r.message[i];
|
||||||
|
frm.script_manager.trigger("variable_label", new_row.doctype, new_row.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
refresh_field("variables");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return frm.call({
|
||||||
|
method: "erpnext.buying.doctype.supplier_scorecard_criteria.supplier_scorecard_criteria.get_scoring_criteria",
|
||||||
|
child: d,
|
||||||
|
args: {
|
||||||
|
criteria_name: d.criteria_name
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var loadAllCriteria = function(frm) {
|
||||||
|
frappe.call({
|
||||||
|
method: "erpnext.buying.doctype.supplier_scorecard_criteria.supplier_scorecard_criteria.get_criteria_list",
|
||||||
|
callback: function(r) {
|
||||||
|
for (var j = 0; j < frm.doc.criteria.length; j++)
|
||||||
|
{
|
||||||
|
if(!frm.doc.criteria[j].hasOwnProperty("criteria_name")) {
|
||||||
|
frm.get_field("criteria").grid.grid_rows[j].remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i = 0; i < r.message.length; i++)
|
||||||
|
{
|
||||||
|
var new_row = frm.add_child("criteria");
|
||||||
|
new_row.criteria_name = r.message[i].name;
|
||||||
|
frm.script_manager.trigger("criteria_name", new_row.doctype, new_row.name);
|
||||||
|
}
|
||||||
|
refresh_field("criteria");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var loadAllStandings = function(frm) {
|
||||||
|
frappe.call({
|
||||||
|
method: "erpnext.buying.doctype.supplier_scorecard_standing.supplier_scorecard_standing.get_standings_list",
|
||||||
|
callback: function(r) {
|
||||||
|
for (var j = 0; j < frm.doc.standings.length; j++)
|
||||||
|
{
|
||||||
|
if(!frm.doc.standings[j].hasOwnProperty("standing_name")) {
|
||||||
|
frm.get_field("standings").grid.grid_rows[j].remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i = 0; i < r.message.length; i++)
|
||||||
|
{
|
||||||
|
var new_row = frm.add_child("standings");
|
||||||
|
new_row.standing_name = r.message[i].name;
|
||||||
|
frm.script_manager.trigger("standing_name", new_row.doctype, new_row.name);
|
||||||
|
}
|
||||||
|
refresh_field("standings");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,701 @@
|
|||||||
|
{
|
||||||
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
|
"allow_import": 0,
|
||||||
|
"allow_rename": 0,
|
||||||
|
"autoname": "field:supplier",
|
||||||
|
"beta": 1,
|
||||||
|
"creation": "2017-05-29 01:40:54.786555",
|
||||||
|
"custom": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "DocType",
|
||||||
|
"document_type": "",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "supplier",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Supplier",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "supplier_score",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Supplier Score",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "indicator_color",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Indicator Color",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "status",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Status",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_2",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"default": "Per Month",
|
||||||
|
"fieldname": "period",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Evaluation Period",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Per Month\nPer Week\nPer Year",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 1,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "scoring_setup",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Scoring Setup",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"default": "{total_score} * max( 0, min ( 1 , (12 - {period_number}) / 12) )",
|
||||||
|
"description": "Scorecard variables can be used, as well as:\n{total_score} (the total score from that period),\n{period_number} (the number of periods to present day)\n",
|
||||||
|
"fieldname": "weighting_function",
|
||||||
|
"fieldtype": "Small Text",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Weighting Function",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "standings",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Scoring Standings",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier Scorecard Scoring Standing",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 1,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "criteria_setup",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Criteria Setup",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "criteria",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Scoring Criteria",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier Scorecard Scoring Criteria",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "variables",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Supplier Variables",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier Scorecard Scoring Variable",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 1,
|
||||||
|
"collapsible_depends_on": "eval: doc.status != 'Unknown'",
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "scorecard_actions",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Scorecard Actions",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "warn_rfqs",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Warn for new Request for Quotations",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "warn_pos",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Warn for new Purchase Orders",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "prevent_rfqs",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Prevent RFQs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "prevent_pos",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Prevent POs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_16",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "notify_supplier",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Notify Supplier",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "notify_employee",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Notify Employee",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "employee",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Employee",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Employee",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
|
"hide_heading": 0,
|
||||||
|
"hide_toolbar": 0,
|
||||||
|
"idx": 0,
|
||||||
|
"image_view": 0,
|
||||||
|
"in_create": 0,
|
||||||
|
"is_submittable": 0,
|
||||||
|
"issingle": 0,
|
||||||
|
"istable": 0,
|
||||||
|
"max_attachments": 0,
|
||||||
|
"modified": "2017-07-12 07:33:11.874949",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Buying",
|
||||||
|
"name": "Supplier Scorecard",
|
||||||
|
"name_case": "",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"amend": 0,
|
||||||
|
"apply_user_permissions": 0,
|
||||||
|
"cancel": 0,
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"if_owner": 0,
|
||||||
|
"import": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "System Manager",
|
||||||
|
"set_user_permissions": 0,
|
||||||
|
"share": 1,
|
||||||
|
"submit": 0,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quick_entry": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_onload": 0,
|
||||||
|
"show_name_in_global_search": 0,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 0,
|
||||||
|
"track_seen": 0
|
||||||
|
}
|
||||||
262
erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py
Normal file
262
erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
from frappe import throw, _
|
||||||
|
from frappe.model.document import Document
|
||||||
|
import time
|
||||||
|
from datetime import timedelta
|
||||||
|
from frappe.utils import nowdate, get_last_day, getdate, add_days, add_years
|
||||||
|
from erpnext.buying.doctype.supplier_scorecard_period.supplier_scorecard_period import make_supplier_scorecard
|
||||||
|
|
||||||
|
class SupplierScorecard(Document):
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
self.validate_standings()
|
||||||
|
self.validate_criteria_weights()
|
||||||
|
self.calculate_total_score()
|
||||||
|
self.update_standing()
|
||||||
|
|
||||||
|
def on_update(self):
|
||||||
|
score = make_all_scorecards(self.name)
|
||||||
|
if score > 0:
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
def validate_standings(self):
|
||||||
|
# Check that there are no overlapping scores and check that there are no missing scores
|
||||||
|
score = 0
|
||||||
|
for c1 in self.standings:
|
||||||
|
for c2 in self.standings:
|
||||||
|
if c1 != c2:
|
||||||
|
if (c1.max_grade > c2.min_grade and c1.min_grade < c2.max_grade):
|
||||||
|
throw(_('Overlap in scoring between {0} and {1}').format(c1.standing_name,c2.standing_name))
|
||||||
|
if c2.min_grade == score:
|
||||||
|
score = c2.max_grade
|
||||||
|
if score < 100:
|
||||||
|
throw(_('Unable to find score starting at {0}. You need to have standing scores covering 0 to 100').format(score))
|
||||||
|
|
||||||
|
def validate_criteria_weights(self):
|
||||||
|
|
||||||
|
weight = 0
|
||||||
|
for c in self.criteria:
|
||||||
|
weight += c.weight
|
||||||
|
|
||||||
|
if weight != 100:
|
||||||
|
throw(_('Criteria weights must add up to 100%'))
|
||||||
|
|
||||||
|
def calculate_total_score(self):
|
||||||
|
scorecards = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
scp.name
|
||||||
|
FROM
|
||||||
|
`tabSupplier Scorecard Period` scp
|
||||||
|
WHERE
|
||||||
|
scp.scorecard = %(sc)s
|
||||||
|
ORDER BY
|
||||||
|
scp.end_date DESC""",
|
||||||
|
{"sc": self.name}, as_dict=1)
|
||||||
|
|
||||||
|
period = 0
|
||||||
|
total_score = 0
|
||||||
|
total_max_score = 0
|
||||||
|
for scp in scorecards:
|
||||||
|
my_sc = frappe.get_doc('Supplier Scorecard Period', scp.name)
|
||||||
|
my_scp_weight = self.weighting_function
|
||||||
|
my_scp_weight = my_scp_weight.replace('{period_number}', str(period))
|
||||||
|
|
||||||
|
my_scp_maxweight = my_scp_weight.replace('{total_score}', '100')
|
||||||
|
my_scp_weight = my_scp_weight.replace('{total_score}', str(my_sc.total_score))
|
||||||
|
|
||||||
|
max_score = my_sc.calculate_weighted_score(my_scp_maxweight)
|
||||||
|
score = my_sc.calculate_weighted_score(my_scp_weight)
|
||||||
|
|
||||||
|
total_score += score
|
||||||
|
total_max_score += max_score
|
||||||
|
period += 1
|
||||||
|
if total_max_score > 0:
|
||||||
|
self.supplier_score = round(100.0 * (total_score / total_max_score) ,1)
|
||||||
|
else:
|
||||||
|
self.supplier_score = 100
|
||||||
|
|
||||||
|
def update_standing(self):
|
||||||
|
# Get the setup document
|
||||||
|
|
||||||
|
for standing in self.standings:
|
||||||
|
if (not standing.min_grade or (standing.min_grade <= self.supplier_score)) and \
|
||||||
|
(not standing.max_grade or (standing.max_grade > self.supplier_score)):
|
||||||
|
self.status = standing.standing_name
|
||||||
|
self.indicator_color = standing.standing_color
|
||||||
|
self.notify_supplier = standing.notify_supplier
|
||||||
|
self.notify_employee = standing.notify_employee
|
||||||
|
self.employee_link = standing.employee_link
|
||||||
|
|
||||||
|
#Update supplier standing info
|
||||||
|
for fieldname in ('prevent_pos', 'prevent_rfqs','warn_rfqs','warn_pos'):
|
||||||
|
self.set(fieldname, standing.get(fieldname))
|
||||||
|
frappe.db.set_value("Supplier", self.supplier, fieldname, self.get(fieldname))
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_timeline_data(doctype, name):
|
||||||
|
# Get a list of all the associated scorecards
|
||||||
|
scs = frappe.get_doc(doctype, name)
|
||||||
|
out = {}
|
||||||
|
timeline_data = {}
|
||||||
|
scorecards = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
sc.name
|
||||||
|
FROM
|
||||||
|
`tabSupplier Scorecard Period` sc
|
||||||
|
WHERE
|
||||||
|
sc.scorecard = %(scs)s""",
|
||||||
|
{"scs": scs.name}, as_dict=1)
|
||||||
|
|
||||||
|
for sc in scorecards:
|
||||||
|
start_date, end_date, total_score = frappe.db.get_value('Supplier Scorecard Period', sc.name, ['start_date', 'end_date', 'total_score'])
|
||||||
|
for single_date in daterange(start_date, end_date):
|
||||||
|
timeline_data[time.mktime(single_date.timetuple())] = total_score
|
||||||
|
|
||||||
|
out['timeline_data'] = timeline_data
|
||||||
|
return out
|
||||||
|
|
||||||
|
def daterange(start_date, end_date):
|
||||||
|
for n in range(int ((end_date - start_date).days)+1):
|
||||||
|
yield start_date + timedelta(n)
|
||||||
|
|
||||||
|
def refresh_scorecards():
|
||||||
|
scorecards = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
sc.name
|
||||||
|
FROM
|
||||||
|
`tabSupplier Scorecard` sc""",
|
||||||
|
{}, as_dict=1)
|
||||||
|
for sc in scorecards:
|
||||||
|
# Check to see if any new scorecard periods are created
|
||||||
|
if make_all_scorecards(sc.name) > 0:
|
||||||
|
# Save the scorecard to update the score and standings
|
||||||
|
sc.save()
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def make_all_scorecards(docname):
|
||||||
|
|
||||||
|
sc = frappe.get_doc('Supplier Scorecard', docname)
|
||||||
|
supplier = frappe.get_doc('Supplier',sc.supplier)
|
||||||
|
|
||||||
|
start_date = getdate(supplier.creation)
|
||||||
|
end_date = get_scorecard_date(sc.period, start_date)
|
||||||
|
todays = getdate(nowdate())
|
||||||
|
|
||||||
|
scp_count = 0
|
||||||
|
first_start_date = todays
|
||||||
|
last_end_date = todays
|
||||||
|
|
||||||
|
while (start_date < todays) and (end_date <= todays):
|
||||||
|
# check to make sure there is no scorecard period already created
|
||||||
|
scorecards = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
scp.name
|
||||||
|
FROM
|
||||||
|
`tabSupplier Scorecard Period` scp
|
||||||
|
WHERE
|
||||||
|
scp.scorecard = %(sc)s
|
||||||
|
AND (
|
||||||
|
(scp.start_date > %(end_date)s
|
||||||
|
AND scp.end_date < %(start_date)s)
|
||||||
|
OR
|
||||||
|
(scp.start_date < %(end_date)s
|
||||||
|
AND scp.end_date > %(start_date)s))
|
||||||
|
ORDER BY
|
||||||
|
scp.end_date DESC""",
|
||||||
|
{"sc": docname, "start_date": start_date, "end_date": end_date, "supplier": supplier}, as_dict=1)
|
||||||
|
if len(scorecards) == 0:
|
||||||
|
period_card = make_supplier_scorecard(docname, None)
|
||||||
|
period_card.start_date = start_date
|
||||||
|
period_card.end_date = end_date
|
||||||
|
period_card.save()
|
||||||
|
scp_count = scp_count + 1
|
||||||
|
if start_date < first_start_date:
|
||||||
|
first_start_date = start_date
|
||||||
|
last_end_date = end_date
|
||||||
|
|
||||||
|
start_date = getdate(add_days(end_date,1))
|
||||||
|
end_date = get_scorecard_date(sc.period, start_date)
|
||||||
|
if scp_count > 0:
|
||||||
|
frappe.msgprint(_("Created {0} scorecards for {1} between: ").format(scp_count, sc.supplier) + str(first_start_date) + " - " + str(last_end_date))
|
||||||
|
return scp_count
|
||||||
|
|
||||||
|
def get_scorecard_date(period, start_date):
|
||||||
|
if period == 'Per Week':
|
||||||
|
end_date = getdate(add_days(start_date,7))
|
||||||
|
elif period == 'Per Month':
|
||||||
|
end_date = get_last_day(start_date)
|
||||||
|
elif period == 'Per Year':
|
||||||
|
end_date = add_days(add_years(start_date,1), -1)
|
||||||
|
return end_date
|
||||||
|
|
||||||
|
def make_default_records():
|
||||||
|
install_variable_docs = [
|
||||||
|
{"param_name": "total_accepted_items", "variable_label": "Total Accepted Items", \
|
||||||
|
"path": "get_total_accepted_items"},
|
||||||
|
{"param_name": "total_accepted_amount", "variable_label": "Total Accepted Amount", \
|
||||||
|
"path": "get_total_accepted_amount"},
|
||||||
|
{"param_name": "total_rejected_items", "variable_label": "Total Rejected Items", \
|
||||||
|
"path": "get_total_rejected_items"},
|
||||||
|
{"param_name": "total_rejected_amount", "variable_label": "Total Rejected Amount", \
|
||||||
|
"path": "get_total_rejected_amount"},
|
||||||
|
{"param_name": "total_received_items", "variable_label": "Total Received Items", \
|
||||||
|
"path": "get_total_received_items"},
|
||||||
|
{"param_name": "total_received_amount", "variable_label": "Total Received Amount", \
|
||||||
|
"path": "get_total_received_amount"},
|
||||||
|
{"param_name": "rfq_response_days", "variable_label": "RFQ Response Days", \
|
||||||
|
"path": "get_rfq_response_days"},
|
||||||
|
{"param_name": "sq_total_items", "variable_label": "SQ Total Items", \
|
||||||
|
"path": "get_sq_total_items"},
|
||||||
|
{"param_name": "sq_total_number", "variable_label": "SQ Total Number", \
|
||||||
|
"path": "get_sq_total_number"},
|
||||||
|
{"param_name": "rfq_total_number", "variable_label": "RFQ Total Number", \
|
||||||
|
"path": "get_rfq_total_number"},
|
||||||
|
{"param_name": "rfq_total_items", "variable_label": "RFQ Total Items", \
|
||||||
|
"path": "get_rfq_total_items"},
|
||||||
|
{"param_name": "tot_item_days", "variable_label": "Total Item Days", \
|
||||||
|
"path": "get_item_workdays"},
|
||||||
|
{"param_name": "on_time_shipment_num", "variable_label": "# of On Time Shipments", "path": \
|
||||||
|
"get_on_time_shipments"},
|
||||||
|
{"param_name": "cost_of_delayed_shipments", "variable_label": "Cost of Delayed Shipments", \
|
||||||
|
"path": "get_cost_of_delayed_shipments"},
|
||||||
|
{"param_name": "cost_of_on_time_shipments", "variable_label": "Cost of On Time Shipments", \
|
||||||
|
"path": "get_cost_of_on_time_shipments"},
|
||||||
|
{"param_name": "total_working_days", "variable_label": "Total Working Days", \
|
||||||
|
"path": "get_total_workdays"},
|
||||||
|
{"param_name": "tot_cost_shipments", "variable_label": "Total Cost of Shipments", \
|
||||||
|
"path": "get_total_cost_of_shipments"},
|
||||||
|
{"param_name": "tot_days_late", "variable_label": "Total Days Late", \
|
||||||
|
"path": "get_total_days_late"},
|
||||||
|
{"param_name": "total_shipments", "variable_label": "Total Shipments", \
|
||||||
|
"path": "get_total_shipments"}
|
||||||
|
]
|
||||||
|
install_standing_docs = [
|
||||||
|
{"min_grade": 0.0, "prevent_rfqs": 1, "notify_supplier": 0, "max_grade": 30.0, "prevent_pos": 1, \
|
||||||
|
"standing_color": "Red", "notify_employee": 0, "standing_name": "Very Poor"},
|
||||||
|
{"min_grade": 30.0, "prevent_rfqs": 1, "notify_supplier": 0, "max_grade": 50.0, "prevent_pos": 0, \
|
||||||
|
"standing_color": "Red", "notify_employee": 0, "standing_name": "Poor"},
|
||||||
|
{"min_grade": 50.0, "prevent_rfqs": 0, "notify_supplier": 0, "max_grade": 80.0, "prevent_pos": 0, \
|
||||||
|
"standing_color": "Green", "notify_employee": 0, "standing_name": "Average"},
|
||||||
|
{"min_grade": 80.0, "prevent_rfqs": 0, "notify_supplier": 0, "max_grade": 100.0, "prevent_pos": 0, \
|
||||||
|
"standing_color": "Blue", "notify_employee": 0, "standing_name": "Excellent"},
|
||||||
|
]
|
||||||
|
|
||||||
|
for d in install_variable_docs:
|
||||||
|
try:
|
||||||
|
d['doctype'] = "Supplier Scorecard Variable"
|
||||||
|
frappe.get_doc(d).insert()
|
||||||
|
except frappe.NameError:
|
||||||
|
pass
|
||||||
|
for d in install_standing_docs:
|
||||||
|
try:
|
||||||
|
d['doctype'] = "Supplier Scorecard Standing"
|
||||||
|
frappe.get_doc(d).insert()
|
||||||
|
except frappe.NameError:
|
||||||
|
pass
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
from frappe import _
|
||||||
|
|
||||||
|
def get_data():
|
||||||
|
return {
|
||||||
|
'heatmap': True,
|
||||||
|
'heatmap_message': _('This covers all scorecards tied to this Setup'),
|
||||||
|
'fieldname': 'supplier',
|
||||||
|
'method' : 'erpnext.buying.doctype.supplier_scorecard.supplier_scorecard.get_timeline_data',
|
||||||
|
'transactions': [
|
||||||
|
{
|
||||||
|
'label': _('Scorecards'),
|
||||||
|
'items': ['Supplier Scorecard Period']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
/* global frappe, __ */
|
||||||
|
|
||||||
|
frappe.listview_settings["Supplier Scorecard"] = {
|
||||||
|
add_fields: ["indicator_color", "status"],
|
||||||
|
get_indicator: function(doc) {
|
||||||
|
|
||||||
|
if (doc.indicator_color) {
|
||||||
|
return [__(doc.status), doc.indicator_color.toLowerCase(), "status,=," + doc.status];
|
||||||
|
} else {
|
||||||
|
return [__("Unknown"), "darkgrey", "status,=,''"];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
|
# See license.txt
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestSupplierScorecard(unittest.TestCase):
|
||||||
|
|
||||||
|
def test_create_scorecard(self):
|
||||||
|
delete_test_scorecards()
|
||||||
|
my_doc = make_supplier_scorecard()
|
||||||
|
doc = my_doc.insert()
|
||||||
|
self.assertEqual(doc.name, valid_scorecard[0].get("supplier"))
|
||||||
|
|
||||||
|
def test_criteria_weight(self):
|
||||||
|
delete_test_scorecards()
|
||||||
|
my_doc = make_supplier_scorecard()
|
||||||
|
for d in my_doc.criteria:
|
||||||
|
d.weight = 0
|
||||||
|
self.assertRaises(frappe.ValidationError,my_doc.insert)
|
||||||
|
|
||||||
|
def test_missing_variable(self):
|
||||||
|
delete_test_scorecards()
|
||||||
|
my_doc = make_supplier_scorecard()
|
||||||
|
del my_doc.variables
|
||||||
|
self.assertRaises(frappe.ValidationError,my_doc.insert)
|
||||||
|
|
||||||
|
def make_supplier_scorecard():
|
||||||
|
my_doc = frappe.get_doc(valid_scorecard[0])
|
||||||
|
|
||||||
|
# Make sure the criteria exist (making them)
|
||||||
|
for d in valid_scorecard[0].get("criteria"):
|
||||||
|
if not frappe.db.exists("Supplier Scorecard Criteria", d.get("criteria_name")):
|
||||||
|
d["doctype"] = "Supplier Scorecard Criteria"
|
||||||
|
d["name"] = d.get("criteria_name")
|
||||||
|
my_criteria = frappe.get_doc(d)
|
||||||
|
my_criteria.insert()
|
||||||
|
return my_doc
|
||||||
|
|
||||||
|
|
||||||
|
def delete_test_scorecards():
|
||||||
|
my_doc = make_supplier_scorecard()
|
||||||
|
if frappe.db.exists("Supplier Scorecard", my_doc.name):
|
||||||
|
# Delete all the periods, then delete the scorecard
|
||||||
|
frappe.db.sql("""delete from `tabSupplier Scorecard Period` where scorecard = %(scorecard)s""", {'scorecard': my_doc.name})
|
||||||
|
frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Criteria` where parenttype = 'Supplier Scorecard Period'""")
|
||||||
|
frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Standing` where parenttype = 'Supplier Scorecard Period'""")
|
||||||
|
frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Variable` where parenttype = 'Supplier Scorecard Period'""")
|
||||||
|
frappe.delete_doc(my_doc.doctype, my_doc.name)
|
||||||
|
|
||||||
|
valid_scorecard = [
|
||||||
|
{
|
||||||
|
"standings":[
|
||||||
|
{
|
||||||
|
"min_grade":0.0,"name":"Very Poor",
|
||||||
|
"prevent_rfqs":1,
|
||||||
|
"notify_supplier":0,
|
||||||
|
"doctype":"Supplier Scorecard Standing",
|
||||||
|
"max_grade":30.0,
|
||||||
|
"prevent_pos":1,
|
||||||
|
"warn_pos":0,
|
||||||
|
"warn_rfqs":0,
|
||||||
|
"standing_color":"Red",
|
||||||
|
"notify_employee":0,
|
||||||
|
"standing_name":"Very Poor",
|
||||||
|
"parenttype":"Supplier Scorecard",
|
||||||
|
"parentfield":"standings"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"min_grade":30.0,
|
||||||
|
"name":"Poor",
|
||||||
|
"prevent_rfqs":1,
|
||||||
|
"notify_supplier":0,
|
||||||
|
"doctype":"Supplier Scorecard Standing",
|
||||||
|
"max_grade":50.0,
|
||||||
|
"prevent_pos":0,
|
||||||
|
"warn_pos":0,
|
||||||
|
"warn_rfqs":0,
|
||||||
|
"standing_color":"Red",
|
||||||
|
"notify_employee":0,
|
||||||
|
"standing_name":"Poor",
|
||||||
|
"parenttype":"Supplier Scorecard",
|
||||||
|
"parentfield":"standings"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"min_grade":50.0,
|
||||||
|
"name":"Average",
|
||||||
|
"prevent_rfqs":0,
|
||||||
|
"notify_supplier":0,
|
||||||
|
"doctype":"Supplier Scorecard Standing",
|
||||||
|
"max_grade":80.0,
|
||||||
|
"prevent_pos":0,
|
||||||
|
"warn_pos":0,
|
||||||
|
"warn_rfqs":0,
|
||||||
|
"standing_color":"Green",
|
||||||
|
"notify_employee":0,
|
||||||
|
"standing_name":"Average",
|
||||||
|
"parenttype":"Supplier Scorecard",
|
||||||
|
"parentfield":"standings"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"min_grade":80.0,
|
||||||
|
"name":"Excellent",
|
||||||
|
"prevent_rfqs":0,
|
||||||
|
"notify_supplier":0,
|
||||||
|
"doctype":"Supplier Scorecard Standing",
|
||||||
|
"max_grade":100.0,
|
||||||
|
"prevent_pos":0,
|
||||||
|
"warn_pos":0,
|
||||||
|
"warn_rfqs":0,
|
||||||
|
"standing_color":"Blue",
|
||||||
|
"notify_employee":0,
|
||||||
|
"standing_name":"Excellent",
|
||||||
|
"parenttype":"Supplier Scorecard",
|
||||||
|
"parentfield":"standings"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prevent_pos":0,
|
||||||
|
"variables": [
|
||||||
|
{
|
||||||
|
"param_name":"cost_of_on_time_shipments",
|
||||||
|
"doctype":"Supplier Scorecard Scoring Variable",
|
||||||
|
"parenttype":"Supplier Scorecard",
|
||||||
|
"variable_label":"Cost of On Time Shipments",
|
||||||
|
"path":"get_cost_of_on_time_shipments",
|
||||||
|
"parentfield":"variables"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"param_name":"tot_cost_shipments",
|
||||||
|
"doctype":"Supplier Scorecard Scoring Variable",
|
||||||
|
"parenttype":"Supplier Scorecard",
|
||||||
|
"variable_label":"Total Cost of Shipments",
|
||||||
|
"path":"get_total_cost_of_shipments",
|
||||||
|
"parentfield":"variables"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"param_name":"tot_days_late",
|
||||||
|
"doctype":"Supplier Scorecard Scoring Variable",
|
||||||
|
"parenttype":"Supplier Scorecard",
|
||||||
|
"variable_label":"Total Days Late",
|
||||||
|
"path":"get_total_days_late",
|
||||||
|
"parentfield":"variables"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"param_name":"total_working_days",
|
||||||
|
"doctype":"Supplier Scorecard Scoring Variable",
|
||||||
|
"parenttype":"Supplier Scorecard",
|
||||||
|
"variable_label":"Total Working Days",
|
||||||
|
"path":"get_total_workdays",
|
||||||
|
"parentfield":"variables"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"param_name":"on_time_shipment_num",
|
||||||
|
"doctype":"Supplier Scorecard Scoring Variable",
|
||||||
|
"parenttype":"Supplier Scorecard",
|
||||||
|
"variable_label":"# of On Time Shipments",
|
||||||
|
"path":"get_on_time_shipments",
|
||||||
|
"parentfield":"variables"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"param_name":"total_shipments",
|
||||||
|
"doctype":"Supplier Scorecard Scoring Variable",
|
||||||
|
"parenttype":"Supplier Scorecard",
|
||||||
|
"variable_label":"Total Shipments",
|
||||||
|
"path":"get_total_shipments",
|
||||||
|
"parentfield":"variables"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"period":"Per Month",
|
||||||
|
"doctype":"Supplier Scorecard",
|
||||||
|
"warn_pos":0,
|
||||||
|
"warn_rfqs":0,
|
||||||
|
"notify_supplier":0,
|
||||||
|
"criteria":[
|
||||||
|
{
|
||||||
|
"weight":100.0,
|
||||||
|
"doctype":"Supplier Scorecard Scoring Criteria",
|
||||||
|
"formula":"(({cost_of_on_time_shipments} / {tot_cost_shipments}) if {tot_cost_shipments} > 0 else 1 )* 100 ",
|
||||||
|
"criteria_name":"Delivery",
|
||||||
|
"max_score":100.0,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supplier":"_Test Supplier",
|
||||||
|
"name":"_Test Supplier",
|
||||||
|
"weighting_function":"{total_score} * max( 0, min ( 1 , (12 - {period_number}) / 12) )",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
/* global frappe */
|
||||||
|
|
||||||
|
frappe.ui.form.on("Supplier Scorecard Criteria", {
|
||||||
|
refresh: function() {}
|
||||||
|
});
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
|
"allow_import": 0,
|
||||||
|
"allow_rename": 0,
|
||||||
|
"autoname": "field:criteria_name",
|
||||||
|
"beta": 1,
|
||||||
|
"creation": "2017-05-29 01:32:43.064891",
|
||||||
|
"custom": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "DocType",
|
||||||
|
"document_type": "",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "criteria_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Criteria Name",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "weight",
|
||||||
|
"fieldtype": "Percent",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Criteria Weight",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"default": "100",
|
||||||
|
"fieldname": "max_score",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Max Score",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "formula",
|
||||||
|
"fieldtype": "Small Text",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Criteria Formula",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
|
"hide_heading": 0,
|
||||||
|
"hide_toolbar": 0,
|
||||||
|
"idx": 0,
|
||||||
|
"image_view": 0,
|
||||||
|
"in_create": 0,
|
||||||
|
"is_submittable": 0,
|
||||||
|
"issingle": 0,
|
||||||
|
"istable": 0,
|
||||||
|
"max_attachments": 0,
|
||||||
|
"modified": "2017-07-17 10:30:47.458285",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Buying",
|
||||||
|
"name": "Supplier Scorecard Criteria",
|
||||||
|
"name_case": "",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"amend": 0,
|
||||||
|
"apply_user_permissions": 0,
|
||||||
|
"cancel": 0,
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"if_owner": 0,
|
||||||
|
"import": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "System Manager",
|
||||||
|
"set_user_permissions": 0,
|
||||||
|
"share": 1,
|
||||||
|
"submit": 0,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quick_entry": 1,
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_onload": 0,
|
||||||
|
"show_name_in_global_search": 0,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1,
|
||||||
|
"track_seen": 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
from frappe import _
|
||||||
|
import re
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class InvalidFormulaVariable(frappe.ValidationError): pass
|
||||||
|
|
||||||
|
class SupplierScorecardCriteria(Document):
|
||||||
|
def validate(self):
|
||||||
|
self.validate_variables()
|
||||||
|
self.validate_formula()
|
||||||
|
|
||||||
|
def validate_variables(self):
|
||||||
|
# make sure all the variables exist
|
||||||
|
_get_variables(self)
|
||||||
|
|
||||||
|
def validate_formula(self):
|
||||||
|
# evaluate the formula with 0's to make sure it is valid
|
||||||
|
test_formula = self.formula.replace("\r", "").replace("\n", "")
|
||||||
|
|
||||||
|
regex = r"\{(.*?)\}"
|
||||||
|
|
||||||
|
mylist = re.finditer(regex, test_formula, re.MULTILINE | re.DOTALL)
|
||||||
|
for dummy1, match in enumerate(mylist):
|
||||||
|
for dummy2 in range(0, len(match.groups())):
|
||||||
|
test_formula = test_formula.replace('{' + match.group(1) + '}', "0")
|
||||||
|
|
||||||
|
test_formula = test_formula.replace('<','<').replace('>','>')
|
||||||
|
try:
|
||||||
|
frappe.safe_eval(test_formula, None, {'max':max, 'min': min})
|
||||||
|
except Exception:
|
||||||
|
frappe.throw(_("Error evaluating the criteria formula"))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_scoring_criteria(criteria_name):
|
||||||
|
criteria = frappe.get_doc("Supplier Scorecard Criteria", criteria_name)
|
||||||
|
|
||||||
|
return criteria
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_criteria_list():
|
||||||
|
criteria = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
scs.name
|
||||||
|
FROM
|
||||||
|
`tabSupplier Scorecard Criteria` scs""",
|
||||||
|
{}, as_dict=1)
|
||||||
|
|
||||||
|
return criteria
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_variables(criteria_name):
|
||||||
|
criteria = frappe.get_doc("Supplier Scorecard Criteria", criteria_name)
|
||||||
|
return _get_variables(criteria)
|
||||||
|
|
||||||
|
def _get_variables(criteria):
|
||||||
|
my_variables = []
|
||||||
|
regex = r"\{(.*?)\}"
|
||||||
|
|
||||||
|
mylist = re.finditer(regex, criteria.formula, re.MULTILINE | re.DOTALL)
|
||||||
|
for dummy1, match in enumerate(mylist):
|
||||||
|
for dummy2 in range(0, len(match.groups())):
|
||||||
|
try:
|
||||||
|
#var = frappe.get_doc("Supplier Scorecard Variable", {'param_name' : d})
|
||||||
|
var = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
scv.name
|
||||||
|
FROM
|
||||||
|
`tabSupplier Scorecard Variable` scv
|
||||||
|
WHERE
|
||||||
|
param_name=%(param)s""",
|
||||||
|
{'param':match.group(1)},)[0][0]
|
||||||
|
my_variables.append(var)
|
||||||
|
except Exception:
|
||||||
|
# Ignore the ones where the variable can't be found
|
||||||
|
frappe.throw(_('Unable to find variable: ') + str(match.group(1)), InvalidFormulaVariable)
|
||||||
|
#pass
|
||||||
|
|
||||||
|
|
||||||
|
#frappe.msgprint(str(my_variables))
|
||||||
|
return my_variables
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
|
# See license.txt
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestSupplierScorecardCriteria(unittest.TestCase):
|
||||||
|
def test_variables_exist(self):
|
||||||
|
delete_test_scorecards()
|
||||||
|
for d in test_good_criteria:
|
||||||
|
frappe.get_doc(d).insert()
|
||||||
|
|
||||||
|
self.assertRaises(frappe.ValidationError,frappe.get_doc(test_bad_criteria[0]).insert)
|
||||||
|
|
||||||
|
def test_formula_validate(self):
|
||||||
|
delete_test_scorecards()
|
||||||
|
self.assertRaises(frappe.ValidationError,frappe.get_doc(test_bad_criteria[1]).insert)
|
||||||
|
self.assertRaises(frappe.ValidationError,frappe.get_doc(test_bad_criteria[2]).insert)
|
||||||
|
|
||||||
|
def delete_test_scorecards():
|
||||||
|
# Delete all the periods so we can delete all the criteria
|
||||||
|
frappe.db.sql("""delete from `tabSupplier Scorecard Period`""")
|
||||||
|
frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Criteria` where parenttype = 'Supplier Scorecard Period'""")
|
||||||
|
frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Standing` where parenttype = 'Supplier Scorecard Period'""")
|
||||||
|
frappe.db.sql("""delete from `tabSupplier Scorecard Scoring Variable` where parenttype = 'Supplier Scorecard Period'""")
|
||||||
|
|
||||||
|
for d in test_good_criteria:
|
||||||
|
if frappe.db.exists("Supplier Scorecard Criteria", d.get("name")):
|
||||||
|
# Delete all the periods, then delete the scorecard
|
||||||
|
frappe.delete_doc(d.get("doctype"), d.get("name"))
|
||||||
|
|
||||||
|
for d in test_bad_criteria:
|
||||||
|
if frappe.db.exists("Supplier Scorecard Criteria", d.get("name")):
|
||||||
|
# Delete all the periods, then delete the scorecard
|
||||||
|
frappe.delete_doc(d.get("doctype"), d.get("name"))
|
||||||
|
|
||||||
|
test_good_criteria = [
|
||||||
|
{
|
||||||
|
"name":"Delivery",
|
||||||
|
"weight":40.0,
|
||||||
|
"doctype":"Supplier Scorecard Criteria",
|
||||||
|
"formula":"(({cost_of_on_time_shipments} / {tot_cost_shipments}) if {tot_cost_shipments} > 0 else 1 )* 100",
|
||||||
|
"criteria_name":"Delivery",
|
||||||
|
"max_score":100.0
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
test_bad_criteria = [
|
||||||
|
{
|
||||||
|
"name":"Fake Criteria 1",
|
||||||
|
"weight":40.0,
|
||||||
|
"doctype":"Supplier Scorecard Criteria",
|
||||||
|
"formula":"(({fake_variable} / {tot_cost_shipments}) if {tot_cost_shipments} > 0 else 1 )* 100", # Invalid variable name
|
||||||
|
"criteria_name":"Fake Criteria 1",
|
||||||
|
"max_score":100.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"Fake Criteria 2",
|
||||||
|
"weight":40.0,
|
||||||
|
"doctype":"Supplier Scorecard Criteria",
|
||||||
|
"formula":"(({cost_of_on_time_shipments} / {tot_cost_shipments}))* 100", # Force 0 divided by 0
|
||||||
|
"criteria_name":"Fake Criteria 2",
|
||||||
|
"max_score":100.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"Fake Criteria 3",
|
||||||
|
"weight":40.0,
|
||||||
|
"doctype":"Supplier Scorecard Criteria",
|
||||||
|
"formula":"(({cost_of_on_time_shipments} {cost_of_on_time_shipments} / {tot_cost_shipments}))* 100", # Two variables beside eachother
|
||||||
|
"criteria_name":"Fake Criteria 3",
|
||||||
|
"max_score":100.0
|
||||||
|
},
|
||||||
|
]
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
/* global frappe */
|
||||||
|
|
||||||
|
|
||||||
|
frappe.ui.form.on("Supplier Scorecard Period", {
|
||||||
|
onload: function(frm) {
|
||||||
|
frm.get_field("variables").grid.toggle_display("value", true);
|
||||||
|
frm.get_field("criteria").grid.toggle_display("score", true);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,397 @@
|
|||||||
|
{
|
||||||
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
|
"allow_import": 0,
|
||||||
|
"allow_rename": 0,
|
||||||
|
"autoname": "naming_series:",
|
||||||
|
"beta": 1,
|
||||||
|
"creation": "2017-05-30 00:38:18.773013",
|
||||||
|
"custom": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "DocType",
|
||||||
|
"document_type": "",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "supplier",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Supplier",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "naming_series",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Naming Series",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "SSC-",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "total_score",
|
||||||
|
"fieldtype": "Percent",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Period Score",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_2",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "start_date",
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Start Date",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "end_date",
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "End Date",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 1,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "section_break_11",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Calculations",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "criteria",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Criteria",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier Scorecard Scoring Criteria",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "variables",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Variables",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier Scorecard Scoring Variable",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 1,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "sec_ref",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Reference",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "scorecard",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Supplier Scorecard Setup",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier Scorecard",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
|
"hide_heading": 0,
|
||||||
|
"hide_toolbar": 0,
|
||||||
|
"idx": 0,
|
||||||
|
"image_view": 0,
|
||||||
|
"in_create": 1,
|
||||||
|
"is_submittable": 0,
|
||||||
|
"issingle": 0,
|
||||||
|
"istable": 0,
|
||||||
|
"max_attachments": 0,
|
||||||
|
"modified": "2017-07-12 07:33:26.130861",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Buying",
|
||||||
|
"name": "Supplier Scorecard Period",
|
||||||
|
"name_case": "",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"amend": 0,
|
||||||
|
"apply_user_permissions": 0,
|
||||||
|
"cancel": 0,
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"if_owner": 0,
|
||||||
|
"import": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "System Manager",
|
||||||
|
"set_user_permissions": 0,
|
||||||
|
"share": 1,
|
||||||
|
"submit": 0,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quick_entry": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_onload": 0,
|
||||||
|
"show_name_in_global_search": 0,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 0,
|
||||||
|
"track_seen": 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
from frappe import throw, _
|
||||||
|
from frappe.model.document import Document
|
||||||
|
from frappe.model.mapper import get_mapped_doc
|
||||||
|
import erpnext.buying.doctype.supplier_scorecard_variable.supplier_scorecard_variable as variable_functions
|
||||||
|
|
||||||
|
class SupplierScorecardPeriod(Document):
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
self.validate_criteria_weights()
|
||||||
|
self.calculate_variables()
|
||||||
|
self.calculate_criteria()
|
||||||
|
self.calculate_score()
|
||||||
|
|
||||||
|
def validate_criteria_weights(self):
|
||||||
|
|
||||||
|
weight = 0
|
||||||
|
for c in self.criteria:
|
||||||
|
weight += c.weight
|
||||||
|
|
||||||
|
if weight != 100:
|
||||||
|
throw(_('Criteria weights must add up to 100%'))
|
||||||
|
|
||||||
|
def calculate_variables(self):
|
||||||
|
for var in self.variables:
|
||||||
|
|
||||||
|
if '.' in var.path:
|
||||||
|
method_to_call = import_string_path(var.path)
|
||||||
|
var.value = method_to_call(self)
|
||||||
|
else:
|
||||||
|
method_to_call = getattr(variable_functions, var.path)
|
||||||
|
var.value = method_to_call(self)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_criteria(self):
|
||||||
|
#Get the criteria
|
||||||
|
for crit in self.criteria:
|
||||||
|
|
||||||
|
#me = ""
|
||||||
|
my_eval_statement = crit.formula.replace("\r", "").replace("\n", "")
|
||||||
|
#for let in my_eval_statement:
|
||||||
|
# me += let.encode('hex') + " "
|
||||||
|
#frappe.msgprint(me)
|
||||||
|
|
||||||
|
for var in self.variables:
|
||||||
|
if var.value:
|
||||||
|
if var.param_name in my_eval_statement:
|
||||||
|
my_eval_statement = my_eval_statement.replace('{' + var.param_name + '}', "{:.2f}".format(var.value))
|
||||||
|
else:
|
||||||
|
if var.param_name in my_eval_statement:
|
||||||
|
my_eval_statement = my_eval_statement.replace('{' + var.param_name + '}', '0.0')
|
||||||
|
|
||||||
|
#frappe.msgprint(my_eval_statement )
|
||||||
|
|
||||||
|
my_eval_statement = my_eval_statement.replace('<','<').replace('>','>')
|
||||||
|
|
||||||
|
try:
|
||||||
|
crit.score = min(crit.max_score, max( 0 ,frappe.safe_eval(my_eval_statement, None, {'max':max, 'min': min})))
|
||||||
|
except Exception:
|
||||||
|
frappe.throw(_("Could not solve criteria score function for {0}. Make sure the formula is valid.".format(crit.criteria_name)),frappe.ValidationError)
|
||||||
|
crit.score = 0
|
||||||
|
|
||||||
|
def calculate_score(self):
|
||||||
|
myscore = 0
|
||||||
|
for crit in self.criteria:
|
||||||
|
myscore += crit.score * crit.weight/100.0
|
||||||
|
self.total_score = myscore
|
||||||
|
|
||||||
|
def calculate_weighted_score(self, weighing_function):
|
||||||
|
my_eval_statement = weighing_function.replace("\r", "").replace("\n", "")
|
||||||
|
|
||||||
|
for var in self.variables:
|
||||||
|
if var.value:
|
||||||
|
if var.param_name in my_eval_statement:
|
||||||
|
my_eval_statement = my_eval_statement.replace('{' + var.param_name + '}', "{:.2f}".format(var.value))
|
||||||
|
else:
|
||||||
|
if var.param_name in my_eval_statement:
|
||||||
|
my_eval_statement = my_eval_statement.replace('{' + var.param_name + '}', '0.0')
|
||||||
|
|
||||||
|
my_eval_statement = my_eval_statement.replace('<','<').replace('>','>')
|
||||||
|
|
||||||
|
try:
|
||||||
|
weighed_score = frappe.safe_eval(my_eval_statement, None, {'max':max, 'min': min})
|
||||||
|
except Exception:
|
||||||
|
frappe.throw(_("Could not solve weighted score function. Make sure the formula is valid."),frappe.ValidationError)
|
||||||
|
weighed_score = 0
|
||||||
|
return weighed_score
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def import_string_path(path):
|
||||||
|
components = path.split('.')
|
||||||
|
mod = __import__(components[0])
|
||||||
|
for comp in components[1:]:
|
||||||
|
mod = getattr(mod, comp)
|
||||||
|
return mod
|
||||||
|
|
||||||
|
|
||||||
|
def post_process(source, target):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def make_supplier_scorecard(source_name, target_doc=None):
|
||||||
|
#def update_item(obj, target, source_parent):
|
||||||
|
# target.qty = flt(obj.qty) - flt(obj.received_qty)
|
||||||
|
# target.stock_qty = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.conversion_factor)
|
||||||
|
# target.amount = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.rate)
|
||||||
|
# target.base_amount = (flt(obj.qty) - flt(obj.received_qty)) * \
|
||||||
|
# flt(obj.rate) * flt(source_parent.conversion_rate)
|
||||||
|
|
||||||
|
doc = get_mapped_doc("Supplier Scorecard", source_name, {
|
||||||
|
"Supplier Scorecard": {
|
||||||
|
"doctype": "Supplier Scorecard Period"
|
||||||
|
},
|
||||||
|
"Supplier Scorecard Scoring Variable": {
|
||||||
|
"doctype": "Supplier Scorecard Scoring Variable",
|
||||||
|
"add_if_empty": True
|
||||||
|
},
|
||||||
|
"Supplier Scorecard Scoring Constraint": {
|
||||||
|
"doctype": "Supplier Scorecard Scoring Constraint",
|
||||||
|
"add_if_empty": True
|
||||||
|
}
|
||||||
|
}, target_doc, post_process)
|
||||||
|
|
||||||
|
return doc
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
|
# See license.txt
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestSupplierScorecardPeriod(unittest.TestCase):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,280 @@
|
|||||||
|
{
|
||||||
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
|
"allow_import": 0,
|
||||||
|
"allow_rename": 0,
|
||||||
|
"beta": 1,
|
||||||
|
"creation": "2017-05-29 01:32:17.988454",
|
||||||
|
"custom": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "DocType",
|
||||||
|
"document_type": "",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 3,
|
||||||
|
"fieldname": "criteria_name",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Criteria Name",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier Scorecard Criteria",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "section_break_2",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 2,
|
||||||
|
"fieldname": "weight",
|
||||||
|
"fieldtype": "Percent",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Criteria Weight",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_4",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"default": "100",
|
||||||
|
"fieldname": "max_score",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Max Score",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "section_break_6",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "formula",
|
||||||
|
"fieldtype": "Small Text",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Criteria Formula",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "score",
|
||||||
|
"fieldtype": "Percent",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Score",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
|
"hide_heading": 0,
|
||||||
|
"hide_toolbar": 0,
|
||||||
|
"idx": 0,
|
||||||
|
"image_view": 0,
|
||||||
|
"in_create": 0,
|
||||||
|
"is_submittable": 0,
|
||||||
|
"issingle": 0,
|
||||||
|
"istable": 1,
|
||||||
|
"max_attachments": 0,
|
||||||
|
"modified": "2017-07-12 07:33:41.532361",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Buying",
|
||||||
|
"name": "Supplier Scorecard Scoring Criteria",
|
||||||
|
"name_case": "",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [],
|
||||||
|
"quick_entry": 1,
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_onload": 0,
|
||||||
|
"show_name_in_global_search": 0,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1,
|
||||||
|
"track_seen": 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class SupplierScorecardScoringCriteria(Document):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,491 @@
|
|||||||
|
{
|
||||||
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
|
"allow_import": 0,
|
||||||
|
"allow_rename": 0,
|
||||||
|
"beta": 1,
|
||||||
|
"creation": "2017-05-29 01:36:22.697234",
|
||||||
|
"custom": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "DocType",
|
||||||
|
"document_type": "",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 3,
|
||||||
|
"fieldname": "standing_name",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Standing Name",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier Scorecard Standing",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_2",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "standing_color",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Color",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Blue\nPurple\nGreen\nYellow\nOrange\nRed",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "section_break_4",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 2,
|
||||||
|
"fieldname": "min_grade",
|
||||||
|
"fieldtype": "Percent",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Min Grade",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 2,
|
||||||
|
"fieldname": "max_grade",
|
||||||
|
"fieldtype": "Percent",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Max Grade",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "actions",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Actions",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "warn_rfqs",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Warn RFQs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "warn_pos",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Warn Purchase Orders",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "prevent_rfqs",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Prevent RFQs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "prevent_pos",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Prevent Purchase Orders",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_10",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "notify_supplier",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Notify Supplier",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "notify_employee",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Notify Employee",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "employee_link",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Employee ",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Employee",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
|
"hide_heading": 0,
|
||||||
|
"hide_toolbar": 0,
|
||||||
|
"idx": 0,
|
||||||
|
"image_view": 0,
|
||||||
|
"in_create": 0,
|
||||||
|
"is_submittable": 0,
|
||||||
|
"issingle": 0,
|
||||||
|
"istable": 1,
|
||||||
|
"max_attachments": 0,
|
||||||
|
"modified": "2017-07-12 07:33:20.615684",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Buying",
|
||||||
|
"name": "Supplier Scorecard Scoring Standing",
|
||||||
|
"name_case": "",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [],
|
||||||
|
"quick_entry": 1,
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_onload": 0,
|
||||||
|
"show_name_in_global_search": 0,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1,
|
||||||
|
"track_seen": 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class SupplierScorecardScoringStanding(Document):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,222 @@
|
|||||||
|
{
|
||||||
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
|
"allow_import": 0,
|
||||||
|
"allow_rename": 0,
|
||||||
|
"beta": 1,
|
||||||
|
"creation": "2017-05-29 01:30:06.105240",
|
||||||
|
"custom": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "DocType",
|
||||||
|
"document_type": "",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 3,
|
||||||
|
"fieldname": "variable_label",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Variable Name",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Supplier Scorecard Variable",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "description",
|
||||||
|
"fieldtype": "Small Text",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Description",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "is_custom",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Custom?",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "param_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Parameter Name",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "path",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Path",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 1,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 2,
|
||||||
|
"fieldname": "value",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Value",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
|
"hide_heading": 0,
|
||||||
|
"hide_toolbar": 0,
|
||||||
|
"idx": 0,
|
||||||
|
"image_view": 0,
|
||||||
|
"in_create": 0,
|
||||||
|
"is_submittable": 0,
|
||||||
|
"issingle": 0,
|
||||||
|
"istable": 1,
|
||||||
|
"max_attachments": 0,
|
||||||
|
"modified": "2017-07-12 07:33:36.671502",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Buying",
|
||||||
|
"name": "Supplier Scorecard Scoring Variable",
|
||||||
|
"name_case": "",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [],
|
||||||
|
"quick_entry": 1,
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_onload": 0,
|
||||||
|
"show_name_in_global_search": 0,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1,
|
||||||
|
"track_seen": 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class SupplierScorecardScoringVariable(Document):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
/* global frappe */
|
||||||
|
|
||||||
|
frappe.ui.form.on("Supplier Scorecard Standing", {
|
||||||
|
refresh: function() {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,424 @@
|
|||||||
|
{
|
||||||
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
|
"allow_import": 0,
|
||||||
|
"allow_rename": 0,
|
||||||
|
"autoname": "field:standing_name",
|
||||||
|
"beta": 1,
|
||||||
|
"creation": "2017-05-29 01:36:47.893639",
|
||||||
|
"custom": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "DocType",
|
||||||
|
"document_type": "",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "standing_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Standing Name",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "standing_color",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Color",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Blue\nPurple\nGreen\nYellow\nOrange\nRed",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "min_grade",
|
||||||
|
"fieldtype": "Percent",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Min Grade",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "max_grade",
|
||||||
|
"fieldtype": "Percent",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Max Grade",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_5",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "warn_rfqs",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Warn RFQs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "warn_pos",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Warn Purchase Orders",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "prevent_rfqs",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Prevent RFQs",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "prevent_pos",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Prevent Purchase Orders",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "notify_supplier",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Notify Supplier",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "notify_employee",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Notify Other",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "employee_link",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 1,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Other",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Employee",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
|
"hide_heading": 0,
|
||||||
|
"hide_toolbar": 0,
|
||||||
|
"idx": 0,
|
||||||
|
"image_view": 0,
|
||||||
|
"in_create": 0,
|
||||||
|
"is_submittable": 0,
|
||||||
|
"issingle": 0,
|
||||||
|
"istable": 0,
|
||||||
|
"max_attachments": 0,
|
||||||
|
"modified": "2017-07-12 07:33:16.560273",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Buying",
|
||||||
|
"name": "Supplier Scorecard Standing",
|
||||||
|
"name_case": "",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"amend": 0,
|
||||||
|
"apply_user_permissions": 0,
|
||||||
|
"cancel": 0,
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"if_owner": 0,
|
||||||
|
"import": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "System Manager",
|
||||||
|
"set_user_permissions": 0,
|
||||||
|
"share": 1,
|
||||||
|
"submit": 0,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quick_entry": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_onload": 0,
|
||||||
|
"show_name_in_global_search": 0,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 0,
|
||||||
|
"track_seen": 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class SupplierScorecardStanding(Document):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_scoring_standing(standing_name):
|
||||||
|
standing = frappe.get_doc("Supplier Scorecard Standing", standing_name)
|
||||||
|
|
||||||
|
return standing
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_standings_list():
|
||||||
|
standings = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
scs.name
|
||||||
|
FROM
|
||||||
|
`tabSupplier Scorecard Standing` scs""",
|
||||||
|
{}, as_dict=1)
|
||||||
|
|
||||||
|
return standings
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
|
# See license.txt
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestSupplierScorecardStanding(unittest.TestCase):
|
||||||
|
pass
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
/* global frappe */
|
||||||
|
|
||||||
|
frappe.ui.form.on("Supplier Scorecard Variable", {
|
||||||
|
refresh: function() {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,242 @@
|
|||||||
|
{
|
||||||
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
|
"allow_import": 0,
|
||||||
|
"allow_rename": 0,
|
||||||
|
"autoname": "field:variable_label",
|
||||||
|
"beta": 1,
|
||||||
|
"creation": "2017-05-29 01:30:34.688389",
|
||||||
|
"custom": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "DocType",
|
||||||
|
"document_type": "",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "variable_label",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Variable Name",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "is_custom",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Custom?",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "param_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Parameter Name",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "path",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Path",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 1,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_5",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "description",
|
||||||
|
"fieldtype": "Small Text",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Description",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
|
"hide_heading": 0,
|
||||||
|
"hide_toolbar": 0,
|
||||||
|
"idx": 0,
|
||||||
|
"image_view": 0,
|
||||||
|
"in_create": 0,
|
||||||
|
"is_submittable": 0,
|
||||||
|
"issingle": 0,
|
||||||
|
"istable": 0,
|
||||||
|
"max_attachments": 0,
|
||||||
|
"modified": "2017-07-12 07:33:31.395262",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Buying",
|
||||||
|
"name": "Supplier Scorecard Variable",
|
||||||
|
"name_case": "",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [
|
||||||
|
{
|
||||||
|
"amend": 0,
|
||||||
|
"apply_user_permissions": 0,
|
||||||
|
"cancel": 0,
|
||||||
|
"create": 1,
|
||||||
|
"delete": 1,
|
||||||
|
"email": 1,
|
||||||
|
"export": 1,
|
||||||
|
"if_owner": 0,
|
||||||
|
"import": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"print": 1,
|
||||||
|
"read": 1,
|
||||||
|
"report": 1,
|
||||||
|
"role": "System Manager",
|
||||||
|
"set_user_permissions": 0,
|
||||||
|
"share": 1,
|
||||||
|
"submit": 0,
|
||||||
|
"write": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quick_entry": 1,
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_onload": 0,
|
||||||
|
"show_name_in_global_search": 0,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1,
|
||||||
|
"track_seen": 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,503 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
import sys
|
||||||
|
from frappe import _
|
||||||
|
from frappe.model.document import Document
|
||||||
|
from frappe.utils import getdate
|
||||||
|
|
||||||
|
class VariablePathNotFound(frappe.ValidationError): pass
|
||||||
|
|
||||||
|
class SupplierScorecardVariable(Document):
|
||||||
|
def validate(self):
|
||||||
|
self.validate_path_exists()
|
||||||
|
|
||||||
|
def validate_path_exists(self):
|
||||||
|
if '.' in self.path:
|
||||||
|
try:
|
||||||
|
from erpnext.buying.doctype.supplier_scorecard_period.supplier_scorecard_period import import_string_path
|
||||||
|
import_string_path(self.path)
|
||||||
|
except AttributeError:
|
||||||
|
frappe.throw(_("Could not find path for " + self.path), VariablePathNotFound)
|
||||||
|
|
||||||
|
else:
|
||||||
|
if not hasattr(sys.modules[__name__], self.path):
|
||||||
|
frappe.throw(_("Could not find path for " + self.path), VariablePathNotFound)
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_scoring_variable(variable_label):
|
||||||
|
variable = frappe.get_doc("Supplier Scorecard Variable", variable_label)
|
||||||
|
|
||||||
|
return variable
|
||||||
|
|
||||||
|
def get_total_workdays(scorecard):
|
||||||
|
""" Gets the number of days in this period"""
|
||||||
|
delta = getdate(scorecard.end_date) - getdate(scorecard.start_date)
|
||||||
|
return delta.days
|
||||||
|
|
||||||
|
def get_item_workdays(scorecard):
|
||||||
|
""" Gets the number of days in this period"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
total_item_days = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(DATEDIFF( %(end_date)s, po_item.schedule_date) * (po_item.qty))
|
||||||
|
FROM
|
||||||
|
`tabPurchase Order Item` po_item,
|
||||||
|
`tabPurchase Order` po
|
||||||
|
WHERE
|
||||||
|
po.supplier = %(supplier)s
|
||||||
|
AND po_item.received_qty < po_item.qty
|
||||||
|
AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND po_item.parent = po.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not total_item_days:
|
||||||
|
total_item_days = 0
|
||||||
|
return total_item_days
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_total_cost_of_shipments(scorecard):
|
||||||
|
""" Gets the total cost of all shipments in the period (based on Purchase Orders)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(po_item.base_amount)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Order Item` po_item,
|
||||||
|
`tabPurchase Order` po
|
||||||
|
WHERE
|
||||||
|
po.supplier = %(supplier)s
|
||||||
|
AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND po_item.docstatus = 1
|
||||||
|
AND po_item.parent = po.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if data:
|
||||||
|
return data
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def get_cost_of_delayed_shipments(scorecard):
|
||||||
|
""" Gets the total cost of all delayed shipments in the period (based on Purchase Receipts - POs)"""
|
||||||
|
return get_total_cost_of_shipments(scorecard) - get_cost_of_on_time_shipments(scorecard)
|
||||||
|
|
||||||
|
def get_cost_of_on_time_shipments(scorecard):
|
||||||
|
""" Gets the total cost of all on_time shipments in the period (based on Purchase Receipts)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
|
||||||
|
total_delivered_on_time_costs = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(pr_item.base_amount)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Order Item` po_item,
|
||||||
|
`tabPurchase Receipt Item` pr_item,
|
||||||
|
`tabPurchase Order` po,
|
||||||
|
`tabPurchase Receipt` pr
|
||||||
|
WHERE
|
||||||
|
po.supplier = %(supplier)s
|
||||||
|
AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND po_item.schedule_date >= pr.posting_date
|
||||||
|
AND pr_item.docstatus = 1
|
||||||
|
AND pr_item.purchase_order_item = po_item.name
|
||||||
|
AND po_item.parent = po.name
|
||||||
|
AND pr_item.parent = pr.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if total_delivered_on_time_costs:
|
||||||
|
return total_delivered_on_time_costs
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def get_total_days_late(scorecard):
|
||||||
|
""" Gets the number of item days late in the period (based on Purchase Receipts vs POs)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
total_delivered_late_days = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(DATEDIFF(pr.posting_date,po_item.schedule_date)* pr_item.qty)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Order Item` po_item,
|
||||||
|
`tabPurchase Receipt Item` pr_item,
|
||||||
|
`tabPurchase Order` po,
|
||||||
|
`tabPurchase Receipt` pr
|
||||||
|
WHERE
|
||||||
|
po.supplier = %(supplier)s
|
||||||
|
AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND po_item.schedule_date < pr.posting_date
|
||||||
|
AND pr_item.docstatus = 1
|
||||||
|
AND pr_item.purchase_order_item = po_item.name
|
||||||
|
AND po_item.parent = po.name
|
||||||
|
AND pr_item.parent = pr.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
if not total_delivered_late_days:
|
||||||
|
total_delivered_late_days = 0
|
||||||
|
|
||||||
|
total_missed_late_days = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(DATEDIFF( %(end_date)s, po_item.schedule_date) * (po_item.qty - po_item.received_qty))
|
||||||
|
FROM
|
||||||
|
`tabPurchase Order Item` po_item,
|
||||||
|
`tabPurchase Order` po
|
||||||
|
WHERE
|
||||||
|
po.supplier = %(supplier)s
|
||||||
|
AND po_item.received_qty < po_item.qty
|
||||||
|
AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND po_item.parent = po.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not total_missed_late_days:
|
||||||
|
total_missed_late_days = 0
|
||||||
|
return total_missed_late_days + total_delivered_late_days
|
||||||
|
|
||||||
|
def get_on_time_shipments(scorecard):
|
||||||
|
""" Gets the number of late shipments (counting each item) in the period (based on Purchase Receipts vs POs)"""
|
||||||
|
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
total_items_delivered_on_time = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
COUNT(pr_item.qty)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Order Item` po_item,
|
||||||
|
`tabPurchase Receipt Item` pr_item,
|
||||||
|
`tabPurchase Order` po,
|
||||||
|
`tabPurchase Receipt` pr
|
||||||
|
WHERE
|
||||||
|
po.supplier = %(supplier)s
|
||||||
|
AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND po_item.schedule_date <= pr.posting_date
|
||||||
|
AND po_item.qty = pr_item.qty
|
||||||
|
AND pr_item.docstatus = 1
|
||||||
|
AND pr_item.purchase_order_item = po_item.name
|
||||||
|
AND po_item.parent = po.name
|
||||||
|
AND pr_item.parent = pr.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not total_items_delivered_on_time:
|
||||||
|
total_items_delivered_on_time = 0
|
||||||
|
return total_items_delivered_on_time
|
||||||
|
|
||||||
|
def get_late_shipments(scorecard):
|
||||||
|
""" Gets the number of late shipments (counting each item) in the period (based on Purchase Receipts vs POs)"""
|
||||||
|
return get_total_shipments(scorecard) - get_on_time_shipments(scorecard)
|
||||||
|
|
||||||
|
def get_total_received(scorecard):
|
||||||
|
""" Gets the total number of received shipments in the period (based on Purchase Receipts)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
COUNT(pr_item.base_amount)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Receipt Item` pr_item,
|
||||||
|
`tabPurchase Receipt` pr
|
||||||
|
WHERE
|
||||||
|
pr.supplier = %(supplier)s
|
||||||
|
AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND pr_item.docstatus = 1
|
||||||
|
AND pr_item.parent = pr.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_total_received_amount(scorecard):
|
||||||
|
""" Gets the total amount (in company currency) received in the period (based on Purchase Receipts)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(pr_item.received_qty * pr_item.base_rate)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Receipt Item` pr_item,
|
||||||
|
`tabPurchase Receipt` pr
|
||||||
|
WHERE
|
||||||
|
pr.supplier = %(supplier)s
|
||||||
|
AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND pr_item.docstatus = 1
|
||||||
|
AND pr_item.parent = pr.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_total_received_items(scorecard):
|
||||||
|
""" Gets the total number of received shipments in the period (based on Purchase Receipts)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(pr_item.received_qty)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Receipt Item` pr_item,
|
||||||
|
`tabPurchase Receipt` pr
|
||||||
|
WHERE
|
||||||
|
pr.supplier = %(supplier)s
|
||||||
|
AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND pr_item.docstatus = 1
|
||||||
|
AND pr_item.parent = pr.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_total_rejected_amount(scorecard):
|
||||||
|
""" Gets the total amount (in company currency) rejected in the period (based on Purchase Receipts)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(pr_item.rejected_qty * pr_item.base_rate)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Receipt Item` pr_item,
|
||||||
|
`tabPurchase Receipt` pr
|
||||||
|
WHERE
|
||||||
|
pr.supplier = %(supplier)s
|
||||||
|
AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND pr_item.docstatus = 1
|
||||||
|
AND pr_item.parent = pr.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_total_rejected_items(scorecard):
|
||||||
|
""" Gets the total number of rejected items in the period (based on Purchase Receipts)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(pr_item.rejected_qty)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Receipt Item` pr_item,
|
||||||
|
`tabPurchase Receipt` pr
|
||||||
|
WHERE
|
||||||
|
pr.supplier = %(supplier)s
|
||||||
|
AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND pr_item.docstatus = 1
|
||||||
|
AND pr_item.parent = pr.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_total_accepted_amount(scorecard):
|
||||||
|
""" Gets the total amount (in company currency) accepted in the period (based on Purchase Receipts)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(pr_item.qty * pr_item.base_rate)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Receipt Item` pr_item,
|
||||||
|
`tabPurchase Receipt` pr
|
||||||
|
WHERE
|
||||||
|
pr.supplier = %(supplier)s
|
||||||
|
AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND pr_item.docstatus = 1
|
||||||
|
AND pr_item.parent = pr.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_total_accepted_items(scorecard):
|
||||||
|
""" Gets the total number of rejected items in the period (based on Purchase Receipts)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(pr_item.qty)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Receipt Item` pr_item,
|
||||||
|
`tabPurchase Receipt` pr
|
||||||
|
WHERE
|
||||||
|
pr.supplier = %(supplier)s
|
||||||
|
AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND pr_item.docstatus = 1
|
||||||
|
AND pr_item.parent = pr.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_total_shipments(scorecard):
|
||||||
|
""" Gets the total number of ordered shipments to arrive in the period (based on Purchase Receipts)"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
COUNT(po_item.base_amount)
|
||||||
|
FROM
|
||||||
|
`tabPurchase Order Item` po_item,
|
||||||
|
`tabPurchase Order` po
|
||||||
|
WHERE
|
||||||
|
po.supplier = %(supplier)s
|
||||||
|
AND po_item.schedule_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND po_item.docstatus = 1
|
||||||
|
AND po_item.parent = po.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_rfq_total_number(scorecard):
|
||||||
|
""" Gets the total number of RFQs sent to supplier"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
COUNT(rfq.name) as total_rfqs
|
||||||
|
FROM
|
||||||
|
`tabRequest for Quotation Item` rfq_item,
|
||||||
|
`tabRequest for Quotation Supplier` rfq_sup,
|
||||||
|
`tabRequest for Quotation` rfq
|
||||||
|
WHERE
|
||||||
|
rfq_sup.supplier = %(supplier)s
|
||||||
|
AND rfq.transaction_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND rfq_item.docstatus = 1
|
||||||
|
AND rfq_item.parent = rfq.name
|
||||||
|
AND rfq_sup.parent = rfq.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_rfq_total_items(scorecard):
|
||||||
|
""" Gets the total number of RFQ items sent to supplier"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
COUNT(rfq_item.name) as total_rfqs
|
||||||
|
FROM
|
||||||
|
`tabRequest for Quotation Item` rfq_item,
|
||||||
|
`tabRequest for Quotation Supplier` rfq_sup,
|
||||||
|
`tabRequest for Quotation` rfq
|
||||||
|
WHERE
|
||||||
|
rfq_sup.supplier = %(supplier)s
|
||||||
|
AND rfq.transaction_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND rfq_item.docstatus = 1
|
||||||
|
AND rfq_item.parent = rfq.name
|
||||||
|
AND rfq_sup.parent = rfq.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def get_sq_total_number(scorecard):
|
||||||
|
""" Gets the total number of RFQ items sent to supplier"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
COUNT(sq.name) as total_sqs
|
||||||
|
FROM
|
||||||
|
`tabRequest for Quotation Item` rfq_item,
|
||||||
|
`tabSupplier Quotation Item` sq_item,
|
||||||
|
`tabRequest for Quotation Supplier` rfq_sup,
|
||||||
|
`tabRequest for Quotation` rfq,
|
||||||
|
`tabSupplier Quotation` sq
|
||||||
|
WHERE
|
||||||
|
rfq_sup.supplier = %(supplier)s
|
||||||
|
AND rfq.transaction_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND sq_item.request_for_quotation_item = rfq_item.name
|
||||||
|
AND sq_item.docstatus = 1
|
||||||
|
AND rfq_item.docstatus = 1
|
||||||
|
AND sq.supplier = %(supplier)s
|
||||||
|
AND sq_item.parent = sq.name
|
||||||
|
AND rfq_item.parent = rfq.name
|
||||||
|
AND rfq_sup.parent = rfq.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_sq_total_items(scorecard):
|
||||||
|
""" Gets the total number of RFQ items sent to supplier"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
|
||||||
|
# Look up all PO Items with delivery dates between our dates
|
||||||
|
data = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
COUNT(sq_item.name) as total_sqs
|
||||||
|
FROM
|
||||||
|
`tabRequest for Quotation Item` rfq_item,
|
||||||
|
`tabSupplier Quotation Item` sq_item,
|
||||||
|
`tabSupplier Quotation` sq,
|
||||||
|
`tabRequest for Quotation Supplier` rfq_sup,
|
||||||
|
`tabRequest for Quotation` rfq
|
||||||
|
WHERE
|
||||||
|
rfq_sup.supplier = %(supplier)s
|
||||||
|
AND rfq.transaction_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND sq_item.request_for_quotation_item = rfq_item.name
|
||||||
|
AND sq_item.docstatus = 1
|
||||||
|
AND sq.supplier = %(supplier)s
|
||||||
|
AND sq_item.parent = sq.name
|
||||||
|
AND rfq_item.docstatus = 1
|
||||||
|
AND rfq_item.parent = rfq.name
|
||||||
|
AND rfq_sup.parent = rfq.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
if not data:
|
||||||
|
data = 0
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_rfq_response_days(scorecard):
|
||||||
|
""" Gets the total number of days it has taken a supplier to respond to rfqs in the period"""
|
||||||
|
supplier = frappe.get_doc('Supplier', scorecard.supplier)
|
||||||
|
total_sq_days = frappe.db.sql("""
|
||||||
|
SELECT
|
||||||
|
SUM(DATEDIFF(sq.transaction_date, rfq.transaction_date))
|
||||||
|
FROM
|
||||||
|
`tabRequest for Quotation Item` rfq_item,
|
||||||
|
`tabSupplier Quotation Item` sq_item,
|
||||||
|
`tabSupplier Quotation` sq,
|
||||||
|
`tabRequest for Quotation Supplier` rfq_sup,
|
||||||
|
`tabRequest for Quotation` rfq
|
||||||
|
WHERE
|
||||||
|
rfq_sup.supplier = %(supplier)s
|
||||||
|
AND rfq.transaction_date BETWEEN %(start_date)s AND %(end_date)s
|
||||||
|
AND sq_item.request_for_quotation_item = rfq_item.name
|
||||||
|
AND sq_item.docstatus = 1
|
||||||
|
AND sq.supplier = %(supplier)s
|
||||||
|
AND sq_item.parent = sq.name
|
||||||
|
AND rfq_item.docstatus = 1
|
||||||
|
AND rfq_item.parent = rfq.name
|
||||||
|
AND rfq_sup.parent = rfq.name""",
|
||||||
|
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date}, as_dict=0)[0][0]
|
||||||
|
if not total_sq_days:
|
||||||
|
total_sq_days = 0
|
||||||
|
|
||||||
|
|
||||||
|
return total_sq_days
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
|
# See license.txt
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from erpnext.buying.doctype.supplier_scorecard_variable.supplier_scorecard_variable import VariablePathNotFound
|
||||||
|
|
||||||
|
|
||||||
|
class TestSupplierScorecardVariable(unittest.TestCase):
|
||||||
|
def test_variable_exist(self):
|
||||||
|
for d in test_existing_variables:
|
||||||
|
my_doc = frappe.get_doc("Supplier Scorecard Variable", d.get("name"))
|
||||||
|
self.assertEquals(my_doc.param_name, d.get('param_name'))
|
||||||
|
self.assertEquals(my_doc.variable_label, d.get('variable_label'))
|
||||||
|
self.assertEquals(my_doc.path, d.get('path'))
|
||||||
|
|
||||||
|
def test_path_exists(self):
|
||||||
|
for d in test_good_variables:
|
||||||
|
if frappe.db.exists(d):
|
||||||
|
frappe.delete_doc(d.get("doctype"), d.get("name"))
|
||||||
|
frappe.get_doc(d).insert()
|
||||||
|
|
||||||
|
for d in test_bad_variables:
|
||||||
|
self.assertRaises(VariablePathNotFound,frappe.get_doc(d).insert)
|
||||||
|
|
||||||
|
test_existing_variables = [
|
||||||
|
{
|
||||||
|
"param_name":"total_accepted_items",
|
||||||
|
"name":"Total Accepted Items",
|
||||||
|
"doctype":"Supplier Scorecard Variable",
|
||||||
|
"variable_label":"Total Accepted Items",
|
||||||
|
"path":"get_total_accepted_items"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
test_good_variables = [
|
||||||
|
{
|
||||||
|
"param_name":"good_variable1",
|
||||||
|
"name":"Good Variable 1",
|
||||||
|
"doctype":"Supplier Scorecard Variable",
|
||||||
|
"variable_label":"Good Variable 1",
|
||||||
|
"path":"get_total_accepted_items"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
test_bad_variables = [
|
||||||
|
{
|
||||||
|
"param_name":"fake_variable1",
|
||||||
|
"name":"Fake Variable 1",
|
||||||
|
"doctype":"Supplier Scorecard Variable",
|
||||||
|
"variable_label":"Fake Variable 1",
|
||||||
|
"path":"get_fake_variable1"
|
||||||
|
},
|
||||||
|
]
|
||||||
@@ -141,6 +141,32 @@ def get_data():
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"label": _("Supplier Scorecard"),
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"type": "doctype",
|
||||||
|
"name": "Supplier Scorecard",
|
||||||
|
"description": _("All Supplier scorecards."),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "doctype",
|
||||||
|
"name": "Supplier Scorecard Variable",
|
||||||
|
"description": _("Templates of supplier scorecard variables.")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "doctype",
|
||||||
|
"name": "Supplier Scorecard Criteria",
|
||||||
|
"description": _("Templates of supplier scorecard criteria."),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "doctype",
|
||||||
|
"name": "Supplier Scorecard Standing",
|
||||||
|
"description": _("Templates of supplier standings."),
|
||||||
|
},
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"label": _("Other Reports"),
|
"label": _("Other Reports"),
|
||||||
"icon": "fa fa-list",
|
"icon": "fa fa-list",
|
||||||
|
|||||||
@@ -17,6 +17,11 @@ def get_data():
|
|||||||
"name": "Task",
|
"name": "Task",
|
||||||
"description": _("Project activity / task."),
|
"description": _("Project activity / task."),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "doctype",
|
||||||
|
"name": "Project Type",
|
||||||
|
"description": _("Define Project type."),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "report",
|
"type": "report",
|
||||||
"route": "List/Task/Gantt",
|
"route": "List/Task/Gantt",
|
||||||
|
|||||||
@@ -169,7 +169,6 @@ def create_variant(item, args):
|
|||||||
|
|
||||||
return variant
|
return variant
|
||||||
|
|
||||||
|
|
||||||
def copy_attributes_to_variant(item, variant):
|
def copy_attributes_to_variant(item, variant):
|
||||||
from frappe.model import no_value_fields
|
from frappe.model import no_value_fields
|
||||||
|
|
||||||
@@ -189,6 +188,8 @@ def copy_attributes_to_variant(item, variant):
|
|||||||
variant.set(field.fieldname, item.get(field.fieldname))
|
variant.set(field.fieldname, item.get(field.fieldname))
|
||||||
variant.variant_of = item.name
|
variant.variant_of = item.name
|
||||||
variant.has_variants = 0
|
variant.has_variants = 0
|
||||||
|
if not variant.description:
|
||||||
|
variant.description = ''
|
||||||
|
|
||||||
if item.variant_based_on=='Item Attribute':
|
if item.variant_based_on=='Item Attribute':
|
||||||
if variant.attributes:
|
if variant.attributes:
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ def lead_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
|
|
||||||
# searches for customer
|
# searches for customer
|
||||||
def customer_query(doctype, txt, searchfield, start, page_len, filters):
|
def customer_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
|
conditions = []
|
||||||
cust_master_name = frappe.defaults.get_user_default("cust_master_name")
|
cust_master_name = frappe.defaults.get_user_default("cust_master_name")
|
||||||
|
|
||||||
if cust_master_name == "Customer Name":
|
if cust_master_name == "Customer Name":
|
||||||
@@ -79,7 +80,7 @@ def customer_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
return frappe.db.sql("""select {fields} from `tabCustomer`
|
return frappe.db.sql("""select {fields} from `tabCustomer`
|
||||||
where docstatus < 2
|
where docstatus < 2
|
||||||
and ({scond}) and disabled=0
|
and ({scond}) and disabled=0
|
||||||
{mcond}
|
{fcond} {mcond}
|
||||||
order by
|
order by
|
||||||
if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999),
|
if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999),
|
||||||
if(locate(%(_txt)s, customer_name), locate(%(_txt)s, customer_name), 99999),
|
if(locate(%(_txt)s, customer_name), locate(%(_txt)s, customer_name), 99999),
|
||||||
@@ -88,7 +89,8 @@ def customer_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
limit %(start)s, %(page_len)s""".format(**{
|
limit %(start)s, %(page_len)s""".format(**{
|
||||||
"fields": fields,
|
"fields": fields,
|
||||||
"scond": searchfields,
|
"scond": searchfields,
|
||||||
"mcond": get_match_cond(doctype)
|
"mcond": get_match_cond(doctype),
|
||||||
|
"fcond": get_filters_cond(doctype, filters, conditions).replace('%', '%%'),
|
||||||
}), {
|
}), {
|
||||||
'txt': "%%%s%%" % txt,
|
'txt': "%%%s%%" % txt,
|
||||||
'_txt': txt.replace("%", ""),
|
'_txt': txt.replace("%", ""),
|
||||||
|
|||||||
@@ -27,8 +27,7 @@ def test_recurring_document(obj, test_records):
|
|||||||
base_doc.set(date_field, today)
|
base_doc.set(date_field, today)
|
||||||
|
|
||||||
if base_doc.doctype == "Sales Order":
|
if base_doc.doctype == "Sales Order":
|
||||||
for d in base_doc.get("items"):
|
base_doc.set("delivery_date", add_days(today, 15))
|
||||||
d.set("delivery_date", add_days(today, 15))
|
|
||||||
|
|
||||||
# monthly
|
# monthly
|
||||||
doc1 = frappe.copy_doc(base_doc)
|
doc1 = frappe.copy_doc(base_doc)
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ def get_transaction_list(doctype, txt=None, filters=None, limit_start=0, limit_p
|
|||||||
else:
|
else:
|
||||||
filters.append((doctype, "docstatus", "=", 1))
|
filters.append((doctype, "docstatus", "=", 1))
|
||||||
|
|
||||||
if user != "Guest" and is_website_user():
|
if (user != "Guest" and is_website_user()) or doctype == 'Request for Quotation':
|
||||||
parties_doctype = 'Request for Quotation Supplier' if doctype == 'Request for Quotation' else doctype
|
parties_doctype = 'Request for Quotation Supplier' if doctype == 'Request for Quotation' else doctype
|
||||||
# find party for this contact
|
# find party for this contact
|
||||||
customers, suppliers = get_customers_suppliers(parties_doctype, user)
|
customers, suppliers = get_customers_suppliers(parties_doctype, user)
|
||||||
|
|||||||
82
erpnext/crm/doctype/item/test_item.js
Normal file
82
erpnext/crm/doctype/item/test_item.js
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
QUnit.test("test: item", function (assert) {
|
||||||
|
assert.expect(6);
|
||||||
|
let done = assert.async();
|
||||||
|
let keyboard_cost = 800;
|
||||||
|
let screen_cost = 4000;
|
||||||
|
let CPU_cost = 15000;
|
||||||
|
let scrap_cost = 100;
|
||||||
|
let no_of_items_to_stock = 100;
|
||||||
|
let is_stock_item = 1;
|
||||||
|
frappe.run_serially([
|
||||||
|
// test item creation
|
||||||
|
() => frappe.set_route("List", "Item"),
|
||||||
|
|
||||||
|
// Create a keyboard item
|
||||||
|
() => frappe.tests.make(
|
||||||
|
"Item", [
|
||||||
|
{item_code: "Keyboard"},
|
||||||
|
{item_group: "Products"},
|
||||||
|
{is_stock_item: is_stock_item},
|
||||||
|
{standard_rate: keyboard_cost},
|
||||||
|
{opening_stock: no_of_items_to_stock}
|
||||||
|
]
|
||||||
|
),
|
||||||
|
() => {
|
||||||
|
assert.ok(cur_frm.doc.item_name.includes('Keyboard'),
|
||||||
|
'Item Keyboard created correctly');
|
||||||
|
assert.ok(cur_frm.doc.item_code.includes('Keyboard'),
|
||||||
|
'item_code for Keyboard set correctly');
|
||||||
|
assert.ok(cur_frm.doc.item_group.includes('Products'),
|
||||||
|
'item_group for Keyboard set correctly');
|
||||||
|
assert.equal(cur_frm.doc.is_stock_item, is_stock_item,
|
||||||
|
'is_stock_item for Keyboard set correctly');
|
||||||
|
assert.equal(cur_frm.doc.standard_rate, keyboard_cost,
|
||||||
|
'standard_rate for Keyboard set correctly');
|
||||||
|
assert.equal(cur_frm.doc.opening_stock, no_of_items_to_stock,
|
||||||
|
'opening_stock for Keyboard set correctly');
|
||||||
|
},
|
||||||
|
|
||||||
|
// Create a Screen item
|
||||||
|
() => frappe.tests.make(
|
||||||
|
"Item", [
|
||||||
|
{item_code: "Screen"},
|
||||||
|
{item_group: "Products"},
|
||||||
|
{is_stock_item: is_stock_item},
|
||||||
|
{standard_rate: screen_cost},
|
||||||
|
{opening_stock: no_of_items_to_stock}
|
||||||
|
]
|
||||||
|
),
|
||||||
|
|
||||||
|
// Create a CPU item
|
||||||
|
() => frappe.tests.make(
|
||||||
|
"Item", [
|
||||||
|
{item_code: "CPU"},
|
||||||
|
{item_group: "Products"},
|
||||||
|
{is_stock_item: is_stock_item},
|
||||||
|
{standard_rate: CPU_cost},
|
||||||
|
{opening_stock: no_of_items_to_stock}
|
||||||
|
]
|
||||||
|
),
|
||||||
|
|
||||||
|
// Create a laptop item
|
||||||
|
() => frappe.tests.make(
|
||||||
|
"Item", [
|
||||||
|
{item_code: "Laptop"},
|
||||||
|
{item_group: "Products"}
|
||||||
|
]
|
||||||
|
),
|
||||||
|
|
||||||
|
// Create a scrap item
|
||||||
|
() => frappe.tests.make(
|
||||||
|
"Item", [
|
||||||
|
{item_code: "Scrap item"},
|
||||||
|
{item_group: "Products"},
|
||||||
|
{is_stock_item: is_stock_item},
|
||||||
|
{standard_rate: scrap_cost},
|
||||||
|
{opening_stock: no_of_items_to_stock}
|
||||||
|
]
|
||||||
|
),
|
||||||
|
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
@@ -118,8 +118,7 @@ def make_sales_order():
|
|||||||
from erpnext.selling.doctype.quotation.quotation import make_sales_order
|
from erpnext.selling.doctype.quotation.quotation import make_sales_order
|
||||||
so = frappe.get_doc(make_sales_order(q))
|
so = frappe.get_doc(make_sales_order(q))
|
||||||
so.transaction_date = frappe.flags.current_date
|
so.transaction_date = frappe.flags.current_date
|
||||||
for d in so.get("items"):
|
so.delivery_date = frappe.utils.add_days(frappe.flags.current_date, 10)
|
||||||
d.delivery_date = frappe.utils.add_days(frappe.flags.current_date, 10)
|
|
||||||
so.insert()
|
so.insert()
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
so.submit()
|
so.submit()
|
||||||
|
|||||||
BIN
erpnext/docs/assets/img/buying/supplier-scorecard-criteria.png
Normal file
BIN
erpnext/docs/assets/img/buying/supplier-scorecard-criteria.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
BIN
erpnext/docs/assets/img/buying/supplier-scorecard-standing.png
Normal file
BIN
erpnext/docs/assets/img/buying/supplier-scorecard-standing.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
BIN
erpnext/docs/assets/img/buying/supplier-scorecard-weighing.png
Normal file
BIN
erpnext/docs/assets/img/buying/supplier-scorecard-weighing.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
BIN
erpnext/docs/assets/img/buying/supplier-scorecard.png
Normal file
BIN
erpnext/docs/assets/img/buying/supplier-scorecard.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 53 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 53 KiB |
@@ -5,3 +5,4 @@ purchase-order
|
|||||||
setup
|
setup
|
||||||
articles
|
articles
|
||||||
purchase-taxes
|
purchase-taxes
|
||||||
|
supplier-scorecard
|
||||||
76
erpnext/docs/user/manual/en/buying/supplier-scorecard.md
Normal file
76
erpnext/docs/user/manual/en/buying/supplier-scorecard.md
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
A Supplier Scorecard is an evaluation tool used to assess the performance of
|
||||||
|
suppliers. Supplier scorecards can be used to keep track of item quality,
|
||||||
|
delivery and responsiveness of suppliers across long periods of time. This data
|
||||||
|
is typically used to help in purchasing decisions.
|
||||||
|
|
||||||
|
A Supplier Scorecard is manually created for each supplier.
|
||||||
|
|
||||||
|
In ERPNext, you can create a supplier scorecard by going to:
|
||||||
|
|
||||||
|
> Buying > Documents > Supplier Scorecard > New Supplier Scorecard
|
||||||
|
|
||||||
|
### Create Supplier Scorecard
|
||||||
|
A supplier scorecard is created for each supplier individually. Only one supplier scorecard can be created for each
|
||||||
|
supplier.
|
||||||
|
<img class="screenshot" alt="Purchase Order" src="{{docs_base_url}}/assets/img/buying/supplier-scorecard.png">
|
||||||
|
|
||||||
|
#### Final Score and Standings
|
||||||
|
The supplier scorecard consists of a set evaluation periods, during which the performance of a supplier is
|
||||||
|
evaluated. This period can be daily, monthly or yearly. The current score is calculated from the score of each evaluation
|
||||||
|
period based on the weighting function. The default formula is linearly weight over the previous 12 scoring periods.
|
||||||
|
<img class="screenshot" alt="Purchase Order" src="{{docs_base_url}}/assets/img/buying/supplier-scorecard-weighing.png">
|
||||||
|
This formula is customizable.
|
||||||
|
|
||||||
|
The supplier standing is used to quickly sort suppliers based on their performance. These are customizable for each supplier.
|
||||||
|
The scorecard standing of a supplier can also be used to restrict suppliers from being included in Request for Quotations or
|
||||||
|
being issued Purchase Orders.
|
||||||
|
<img class="screenshot" alt="Purchase Order" src="{{docs_base_url}}/assets/img/buying/supplier-scorecard-standing.png">
|
||||||
|
|
||||||
|
#### Evaluation Criteria and Variables
|
||||||
|
A supplier can be evaluated on several individual evaluation criteria, including (but not limited to) quotation response time,
|
||||||
|
delivered item quality, and delivery timeliness. These criteria are weighed to determine the final period score.
|
||||||
|
<img class="screenshot" alt="Purchase Order" src="{{docs_base_url}}/assets/img/buying/supplier-scorecard-criteria.png">
|
||||||
|
The method for calculating each criteria is determined through the criteria formula field, which can use a number of pre-established variables.
|
||||||
|
The value of each of these variables is calculated over the scoring period for each supplier. Examples of such variables include:
|
||||||
|
- The total number of items received from the supplier
|
||||||
|
- The total number of accepted items from the supplier
|
||||||
|
- The total number of rejected items from the supplier
|
||||||
|
- The total number of deliveries from the supplier
|
||||||
|
- The total amount (in dollars) received from a supplier
|
||||||
|
Additional variables can be added through server-side customizations.
|
||||||
|
|
||||||
|
The criteria formula should be customized to evaluate the suppliers in each criteria in a way that best fits the Company requirements.
|
||||||
|
|
||||||
|
##### Evaluation Formulas
|
||||||
|
The evaluation formula uses the pre-established or custom variables to evaluate an aspect of supplier performance over the scoring period. Formulas can use the following mathematical functions:
|
||||||
|
|
||||||
|
* addition: +
|
||||||
|
* subtraction: -
|
||||||
|
* multiplication: *
|
||||||
|
* division: /
|
||||||
|
* min: min(x,y)
|
||||||
|
* max: max(x,y)
|
||||||
|
* if/else: (x) if (formula) else (y)
|
||||||
|
* less than: <
|
||||||
|
* greated than: >
|
||||||
|
* variables: {variable_name}
|
||||||
|
|
||||||
|
It is crucial that the formula be solvable for all variable values. This is most often an issue if the value resolves to 0. For example:
|
||||||
|
```
|
||||||
|
{total_accepted_items} / {total_received_items}
|
||||||
|
```
|
||||||
|
|
||||||
|
This example would resolve to 0 / 0 in periods where there are no received items, and therefore should have a check to protect in this case:
|
||||||
|
```
|
||||||
|
({total_accepted_items} / {total_received_items}) if {total_received_items} > 0 else 1.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Evaluating the Supplier
|
||||||
|
An evaluation is generated for each Supplier Scorecard Period by clicking the "Generate Missing Scorecard Periods" button. The supplier
|
||||||
|
current score can be seen, as well as a visual graphic showing the performance of the supplier over time. Any actions against the supplier
|
||||||
|
are also noted here, including warnings when create RFQs and POs or locking out those features for this supplier altogether.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{next}
|
||||||
@@ -26,6 +26,12 @@ To setup an incoming Email Account, check on **Enable Incoming** and set your PO
|
|||||||
|
|
||||||
<img class="screenshot" alt="Incoming EMail" src="{{docs_base_url}}/assets/img/setup/email/email-account-incoming.png">
|
<img class="screenshot" alt="Incoming EMail" src="{{docs_base_url}}/assets/img/setup/email/email-account-incoming.png">
|
||||||
|
|
||||||
|
### Setting Import Conditions for Email Import
|
||||||
|
|
||||||
|
Email Accounts allows you to set conditions according to the data of the incoming emails. The email will be imported to ERPNext only if the all conditions are true. For example if you want to import an email if the subject is "Some important email", you put doc.subject == "Some important email" in the conditions textbox. You can also set more complex conditions by combining them, as shown on the following screenshot.
|
||||||
|
|
||||||
|
<img class="screenshot" alt="Incoming EMail Conditions" src="{{docs_base_url}}/assets/img/setup/email/email-account-incoming-conditions.png">
|
||||||
|
|
||||||
### How ERPNext handles replies
|
### How ERPNext handles replies
|
||||||
|
|
||||||
In ERPNext when you send an email to a contact like a customer, the sender will be the user who sent the email. In the **Reply-To** property, the Email Address will be of the default incoming account (like `replies@yourcompany.com`). ERPNext will automatically extract these emails from the incoming account and tag it to the relevant communication
|
In ERPNext when you send an email to a contact like a customer, the sender will be the user who sent the email. In the **Reply-To** property, the Email Address will be of the default incoming account (like `replies@yourcompany.com`). ERPNext will automatically extract these emails from the incoming account and tag it to the relevant communication
|
||||||
|
|||||||
@@ -72,14 +72,20 @@ website_route_rules = [
|
|||||||
"parents": [{"title": _("Invoices"), "name": "invoices"}]
|
"parents": [{"title": _("Invoices"), "name": "invoices"}]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{"from_route": "/quotations", "to_route": "Supplier Quotation"},
|
{"from_route": "/supplier-quotations", "to_route": "Supplier Quotation"},
|
||||||
{"from_route": "/quotations/<path:name>", "to_route": "order",
|
{"from_route": "/supplier-quotations/<path:name>", "to_route": "order",
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"doctype": "Supplier Quotation",
|
"doctype": "Supplier Quotation",
|
||||||
"parents": [{"title": _("Supplier Quotation"), "name": "quotations"}]
|
"parents": [{"title": _("Supplier Quotation"), "name": "quotations"}]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{"from_route": "/quotation", "to_route": "Quotation"},
|
{"from_route": "/quotations", "to_route": "Quotation"},
|
||||||
|
{"from_route": "/quotations/<path:name>", "to_route": "order",
|
||||||
|
"defaults": {
|
||||||
|
"doctype": "Quotation",
|
||||||
|
"parents": [{"title": _("Quotations"), "name": "quotation"}]
|
||||||
|
}
|
||||||
|
},
|
||||||
{"from_route": "/shipments", "to_route": "Delivery Note"},
|
{"from_route": "/shipments", "to_route": "Delivery Note"},
|
||||||
{"from_route": "/shipments/<path:name>", "to_route": "order",
|
{"from_route": "/shipments/<path:name>", "to_route": "order",
|
||||||
"defaults": {
|
"defaults": {
|
||||||
@@ -103,34 +109,38 @@ website_route_rules = [
|
|||||||
},
|
},
|
||||||
{"from_route": "/jobs", "to_route": "Job Opening"},
|
{"from_route": "/jobs", "to_route": "Job Opening"},
|
||||||
{"from_route": "/admissions", "to_route": "Student Admission"},
|
{"from_route": "/admissions", "to_route": "Student Admission"},
|
||||||
{"from_route": "/boms", "to_route": "BOM"}
|
{"from_route": "/boms", "to_route": "BOM"},
|
||||||
|
{"from_route": "/timesheets", "to_route": "Timesheet"},
|
||||||
]
|
]
|
||||||
|
|
||||||
standard_portal_menu_items = [
|
standard_portal_menu_items = [
|
||||||
{"title": _("Projects"), "route": "/project", "reference_doctype": "Project"},
|
{"title": _("Projects"), "route": "/project", "reference_doctype": "Project"},
|
||||||
{"title": _("Request for Quotations"), "route": "/rfq", "reference_doctype": "Request for Quotation", "role": "Supplier"},
|
{"title": _("Request for Quotations"), "route": "/rfq", "reference_doctype": "Request for Quotation", "role": "Supplier"},
|
||||||
{"title": _("Supplier Quotation"), "route": "/quotations", "reference_doctype": "Supplier Quotation", "role": "Supplier"},
|
{"title": _("Supplier Quotation"), "route": "/supplier-quotations", "reference_doctype": "Supplier Quotation", "role": "Supplier"},
|
||||||
{"title": _("Quotations"), "route": "/quotation", "reference_doctype": "Quotation", "role":"Customer"},
|
{"title": _("Quotations"), "route": "/quotations", "reference_doctype": "Quotation", "role":"Customer"},
|
||||||
{"title": _("Orders"), "route": "/orders", "reference_doctype": "Sales Order", "role":"Customer"},
|
{"title": _("Orders"), "route": "/orders", "reference_doctype": "Sales Order", "role":"Customer"},
|
||||||
{"title": _("Invoices"), "route": "/invoices", "reference_doctype": "Sales Invoice", "role":"Customer"},
|
{"title": _("Invoices"), "route": "/invoices", "reference_doctype": "Sales Invoice", "role":"Customer"},
|
||||||
{"title": _("Shipments"), "route": "/shipments", "reference_doctype": "Delivery Note", "role":"Customer"},
|
{"title": _("Shipments"), "route": "/shipments", "reference_doctype": "Delivery Note", "role":"Customer"},
|
||||||
{"title": _("Issues"), "route": "/issues", "reference_doctype": "Issue", "role":"Customer"},
|
{"title": _("Issues"), "route": "/issues", "reference_doctype": "Issue", "role":"Customer"},
|
||||||
{"title": _("Addresses"), "route": "/addresses", "reference_doctype": "Address"},
|
{"title": _("Addresses"), "route": "/addresses", "reference_doctype": "Address"},
|
||||||
{"title": _("Fees"), "route": "/fees", "reference_doctype": "Fees", "role":"Student"}
|
{"title": _("Fees"), "route": "/fees", "reference_doctype": "Fees", "role":"Student"},
|
||||||
|
{"title": _("Timesheets"), "route": "/timesheets", "reference_doctype": "Timesheet", "role":"Customer"}
|
||||||
]
|
]
|
||||||
|
|
||||||
default_roles = [
|
default_roles = [
|
||||||
{'role': 'Customer', 'doctype':'Contact', 'email_field': 'email_id'},
|
{'role': 'Customer', 'doctype':'Contact', 'email_field': 'email_id'},
|
||||||
{'role': 'Supplier', 'doctype':'Contact', 'email_field': 'email_id'},
|
{'role': 'Supplier', 'doctype':'Contact', 'email_field': 'email_id'},
|
||||||
{'role': 'Student', 'doctype':'Student', 'email_field': 'student_email_id'}
|
{'role': 'Student', 'doctype':'Student', 'email_field': 'student_email_id'},
|
||||||
]
|
]
|
||||||
|
|
||||||
has_website_permission = {
|
has_website_permission = {
|
||||||
"Sales Order": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
"Sales Order": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
|
"Quotation": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
"Sales Invoice": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
"Sales Invoice": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
"Supplier Quotation": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
"Supplier Quotation": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
"Delivery Note": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
"Delivery Note": "erpnext.controllers.website_list_for_contact.has_website_permission",
|
||||||
"Issue": "erpnext.support.doctype.issue.issue.has_website_permission"
|
"Issue": "erpnext.support.doctype.issue.issue.has_website_permission",
|
||||||
|
"Timesheet": "erpnext.controllers.website_list_for_contact.has_website_permission"
|
||||||
}
|
}
|
||||||
|
|
||||||
dump_report_map = "erpnext.startup.report_data_map.data_map"
|
dump_report_map = "erpnext.startup.report_data_map.data_map"
|
||||||
@@ -184,6 +194,7 @@ scheduler_events = {
|
|||||||
"erpnext.accounts.doctype.asset.depreciation.post_depreciation_entries",
|
"erpnext.accounts.doctype.asset.depreciation.post_depreciation_entries",
|
||||||
"erpnext.hr.doctype.daily_work_summary_settings.daily_work_summary_settings.send_summary",
|
"erpnext.hr.doctype.daily_work_summary_settings.daily_work_summary_settings.send_summary",
|
||||||
"erpnext.stock.doctype.serial_no.serial_no.update_maintenance_status",
|
"erpnext.stock.doctype.serial_no.serial_no.update_maintenance_status",
|
||||||
|
"erpnext.buying.doctype.supplier_scorecard.supplier_scorecard.refresh_scorecards",
|
||||||
"erpnext.setup.doctype.company.company.cache_companies_monthly_sales_history"
|
"erpnext.setup.doctype.company.company.cache_companies_monthly_sales_history"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
22
erpnext/hr/doctype/branch/test_branch.js
Normal file
22
erpnext/hr/doctype/branch/test_branch.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
QUnit.module('hr');
|
||||||
|
|
||||||
|
QUnit.test("Test: Branch [HR]", function (assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
let done = assert.async();
|
||||||
|
|
||||||
|
frappe.run_serially([
|
||||||
|
// test branch creation
|
||||||
|
() => frappe.set_route("List", "Branch", "List"),
|
||||||
|
() => frappe.new_doc("Branch"),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => frappe.click_link('Edit in full page'),
|
||||||
|
() => cur_frm.set_value("branch", "Test Branch"),
|
||||||
|
|
||||||
|
// save form
|
||||||
|
() => cur_frm.save(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => assert.equal("Test Branch", cur_frm.doc.branch,
|
||||||
|
'name of branch correctly saved'),
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
22
erpnext/hr/doctype/department/test_department.js
Normal file
22
erpnext/hr/doctype/department/test_department.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
QUnit.module('hr');
|
||||||
|
|
||||||
|
QUnit.test("Test: Department [HR]", function (assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
let done = assert.async();
|
||||||
|
|
||||||
|
frappe.run_serially([
|
||||||
|
// test department creation
|
||||||
|
() => frappe.set_route("List", "Department", "List"),
|
||||||
|
() => frappe.new_doc("Department"),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => frappe.click_link('Edit in full page'),
|
||||||
|
() => cur_frm.set_value("department_name", "Test Department"),
|
||||||
|
() => cur_frm.set_value("leave_block_list", "Test Leave block list"),
|
||||||
|
// save form
|
||||||
|
() => cur_frm.save(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => assert.equal("Test Department", cur_frm.doc.department_name,
|
||||||
|
'name of department correctly saved'),
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
22
erpnext/hr/doctype/designation/test_designation.js
Normal file
22
erpnext/hr/doctype/designation/test_designation.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
QUnit.module('hr');
|
||||||
|
|
||||||
|
QUnit.test("Test: Designation [HR]", function (assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
let done = assert.async();
|
||||||
|
|
||||||
|
frappe.run_serially([
|
||||||
|
// test designation creation
|
||||||
|
() => frappe.set_route("List", "Designation", "List"),
|
||||||
|
() => frappe.new_doc("Designation"),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => frappe.click_link('Edit in full page'),
|
||||||
|
() => cur_frm.set_value("designation_name", "Test Designation"),
|
||||||
|
() => cur_frm.set_value("description", "This designation is just for testing."),
|
||||||
|
// save form
|
||||||
|
() => cur_frm.save(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => assert.equal("Test Designation", cur_frm.doc.designation_name,
|
||||||
|
'name of designation correctly saved'),
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
38
erpnext/hr/doctype/employee/test_employee.js
Normal file
38
erpnext/hr/doctype/employee/test_employee.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
QUnit.module('hr');
|
||||||
|
|
||||||
|
QUnit.test("Test: Employee [HR]", function (assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
let done = assert.async();
|
||||||
|
let today_date = frappe.datetime.nowdate();
|
||||||
|
|
||||||
|
frappe.run_serially([
|
||||||
|
// test employee creation
|
||||||
|
() => frappe.set_route("List", "Employee", "List"),
|
||||||
|
() => frappe.new_doc("Employee"),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => cur_frm.set_value("employee_name", "Test Employee"),
|
||||||
|
() => cur_frm.set_value("salutation", "Ms"),
|
||||||
|
() => cur_frm.set_value("date_of_joining", frappe.datetime.add_months(today_date, -2)), // joined 2 month from now
|
||||||
|
() => cur_frm.set_value("date_of_birth", frappe.datetime.add_months(today_date, -240)), // age is 20 years
|
||||||
|
() => cur_frm.set_value("employment_type", "Test Employment type"),
|
||||||
|
() => cur_frm.set_value("holiday_list", "Test Holiday list"),
|
||||||
|
() => cur_frm.set_value("branch", "Test Branch"),
|
||||||
|
() => cur_frm.set_value("department", "Test Department"),
|
||||||
|
() => cur_frm.set_value("designation", "Test Designation"),
|
||||||
|
() => frappe.click_button('Add Row'),
|
||||||
|
() => cur_frm.fields_dict.leave_approvers.grid.grid_rows[0].doc.leave_approver="Administrator",
|
||||||
|
// save data
|
||||||
|
() => cur_frm.save(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
// check name of employee
|
||||||
|
() => assert.equal("Test Employee", cur_frm.doc.employee_name,
|
||||||
|
'name of employee correctly saved'),
|
||||||
|
// check auto filled gender according to salutation
|
||||||
|
() => assert.equal("Female", cur_frm.doc.gender,
|
||||||
|
'gender correctly saved as per salutation'),
|
||||||
|
// check auto filled retirement date [60 years from DOB]
|
||||||
|
() => assert.equal(frappe.datetime.add_months(today_date, 480), cur_frm.doc.date_of_retirement, // 40 years from now
|
||||||
|
'retirement date correctly saved as per date of birth'),
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
21
erpnext/hr/doctype/employment_type/test_employment_type.js
Normal file
21
erpnext/hr/doctype/employment_type/test_employment_type.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
QUnit.module('hr');
|
||||||
|
|
||||||
|
QUnit.test("Test: Employment type [HR]", function (assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
let done = assert.async();
|
||||||
|
|
||||||
|
frappe.run_serially([
|
||||||
|
// test employment type creation
|
||||||
|
() => frappe.set_route("List", "Employment Type", "List"),
|
||||||
|
() => frappe.new_doc("Employment Type"),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => frappe.click_link('Edit in full page'),
|
||||||
|
() => cur_frm.set_value("employee_type_name", "Test Employment type"),
|
||||||
|
// save form
|
||||||
|
() => cur_frm.save(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => assert.equal("Test Employment type", cur_frm.doc.employee_type_name,
|
||||||
|
'name of employment type correctly saved'),
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
42
erpnext/hr/doctype/holiday_list/test_holiday_list.js
Normal file
42
erpnext/hr/doctype/holiday_list/test_holiday_list.js
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
QUnit.module('hr');
|
||||||
|
|
||||||
|
QUnit.test("Test: Holiday list [HR]", function (assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
let done = assert.async();
|
||||||
|
let date = frappe.datetime.add_months(frappe.datetime.nowdate(), -2); // date 2 months from now
|
||||||
|
|
||||||
|
frappe.run_serially([
|
||||||
|
// test holiday list creation
|
||||||
|
() => frappe.set_route("List", "Holiday List", "List"),
|
||||||
|
() => frappe.new_doc("Holiday List"),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => cur_frm.set_value("holiday_list_name", "Test Holiday list"),
|
||||||
|
() => cur_frm.set_value("from_date", date),
|
||||||
|
() => cur_frm.set_value("weekly_off", "Sunday"), // holiday list for sundays
|
||||||
|
() => frappe.click_button('Get Weekly Off Dates'),
|
||||||
|
|
||||||
|
// save form
|
||||||
|
() => cur_frm.save(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => assert.equal("Test Holiday list", cur_frm.doc.holiday_list_name,
|
||||||
|
'name of holiday list correctly saved'),
|
||||||
|
|
||||||
|
// check if holiday list contains correct days
|
||||||
|
() => {
|
||||||
|
var list = cur_frm.doc.holidays;
|
||||||
|
var list_length = list.length;
|
||||||
|
var i = 0;
|
||||||
|
for ( ; i < list_length; i++)
|
||||||
|
if (list[i].description != 'Sunday') break;
|
||||||
|
assert.equal(list_length, i, "all holidays are sundays in holiday list");
|
||||||
|
},
|
||||||
|
|
||||||
|
// check if to_date is set one year from from_date
|
||||||
|
() => {
|
||||||
|
var date_year_later = frappe.datetime.add_days(frappe.datetime.add_months(date, 12), -1); // date after one year
|
||||||
|
assert.equal(date_year_later, cur_frm.doc.to_date,
|
||||||
|
"to date set correctly");
|
||||||
|
},
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
27
erpnext/hr/doctype/leave_block_list/test_leave_block_list.js
Normal file
27
erpnext/hr/doctype/leave_block_list/test_leave_block_list.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
QUnit.module('hr');
|
||||||
|
|
||||||
|
QUnit.test("Test: Leave block list [HR]", function (assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
let done = assert.async();
|
||||||
|
let today_date = frappe.datetime.nowdate();
|
||||||
|
|
||||||
|
frappe.run_serially([
|
||||||
|
// test leave block list creation
|
||||||
|
() => frappe.set_route("List", "Leave Block List", "List"),
|
||||||
|
() => frappe.new_doc("Leave Block List"),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => cur_frm.set_value("leave_block_list_name", "Test Leave block list"),
|
||||||
|
() => cur_frm.set_value("company", "Test Company"),
|
||||||
|
() => frappe.click_button('Add Row'),
|
||||||
|
() => {
|
||||||
|
cur_frm.fields_dict.leave_block_list_dates.grid.grid_rows[0].doc.block_date = today_date;
|
||||||
|
cur_frm.fields_dict.leave_block_list_dates.grid.grid_rows[0].doc.reason = "Blocked leave test";
|
||||||
|
},
|
||||||
|
// save form
|
||||||
|
() => cur_frm.save(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => assert.equal("Test Leave block list", cur_frm.doc.leave_block_list_name,
|
||||||
|
'name of blocked leave list correctly saved'),
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
@@ -311,7 +311,7 @@ class ProcessPayroll(Document):
|
|||||||
journal_entry.submit()
|
journal_entry.submit()
|
||||||
jv_name = journal_entry.name
|
jv_name = journal_entry.name
|
||||||
self.update_salary_slip_status(jv_name = jv_name)
|
self.update_salary_slip_status(jv_name = jv_name)
|
||||||
except Exception, e:
|
except Exception as e:
|
||||||
frappe.msgprint(e)
|
frappe.msgprint(e)
|
||||||
return jv_name
|
return jv_name
|
||||||
|
|
||||||
@@ -339,7 +339,12 @@ class ProcessPayroll(Document):
|
|||||||
"debit_in_account_currency": total_salary_amount.rounded_total
|
"debit_in_account_currency": total_salary_amount.rounded_total
|
||||||
})
|
})
|
||||||
journal_entry.set("accounts", account_amt_list)
|
journal_entry.set("accounts", account_amt_list)
|
||||||
return journal_entry.as_dict()
|
return journal_entry.as_dict()
|
||||||
|
else:
|
||||||
|
frappe.msgprint(
|
||||||
|
_("There are no submitted Salary Slips to process."),
|
||||||
|
title="Error", indicator="red"
|
||||||
|
)
|
||||||
|
|
||||||
def update_salary_slip_status(self, jv_name = None):
|
def update_salary_slip_status(self, jv_name = None):
|
||||||
ss_list = self.get_sal_slip_list(ss_status=1)
|
ss_list = self.get_sal_slip_list(ss_status=1)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 0,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
"beta": 0,
|
"beta": 0,
|
||||||
@@ -12,6 +13,7 @@
|
|||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -22,6 +24,7 @@
|
|||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Payment Date",
|
"label": "Payment Date",
|
||||||
@@ -40,6 +43,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -50,11 +54,13 @@
|
|||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Principal Amount",
|
"label": "Principal Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@@ -68,6 +74,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -78,11 +85,13 @@
|
|||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Interest Amount",
|
"label": "Interest Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@@ -96,6 +105,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -106,11 +116,13 @@
|
|||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Total Payment",
|
"label": "Total Payment",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@@ -124,6 +136,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@@ -134,11 +147,13 @@
|
|||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Balance Loan Amount",
|
"label": "Balance Loan Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@@ -152,17 +167,17 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
"hide_heading": 0,
|
"hide_heading": 0,
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
"idx": 0,
|
"idx": 0,
|
||||||
"image_view": 0,
|
"image_view": 0,
|
||||||
"in_create": 0,
|
"in_create": 0,
|
||||||
"in_dialog": 0,
|
|
||||||
"is_submittable": 0,
|
"is_submittable": 0,
|
||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-01-09 12:00:10.818772",
|
"modified": "2017-07-26 14:47:29.862084",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Repayment Schedule",
|
"name": "Repayment Schedule",
|
||||||
@@ -172,6 +187,7 @@
|
|||||||
"quick_entry": 1,
|
"quick_entry": 1,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"read_only_onload": 0,
|
"read_only_onload": 0,
|
||||||
|
"show_name_in_global_search": 0,
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"track_changes": 1,
|
"track_changes": 1,
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ class BOM(WebsiteGenerator):
|
|||||||
validate_uom_is_integer(self, "stock_uom", "stock_qty", "BOM Item")
|
validate_uom_is_integer(self, "stock_uom", "stock_qty", "BOM Item")
|
||||||
|
|
||||||
self.update_stock_qty()
|
self.update_stock_qty()
|
||||||
self.validate_materials()
|
|
||||||
self.set_bom_material_details()
|
self.set_bom_material_details()
|
||||||
|
self.validate_materials()
|
||||||
self.validate_operations()
|
self.validate_operations()
|
||||||
self.calculate_cost()
|
self.calculate_cost()
|
||||||
|
|
||||||
|
|||||||
62
erpnext/manufacturing/doctype/bom/test_bom.js
Normal file
62
erpnext/manufacturing/doctype/bom/test_bom.js
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
QUnit.test("test: item", function (assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
let done = assert.async();
|
||||||
|
|
||||||
|
frappe.run_serially([
|
||||||
|
// test item creation
|
||||||
|
() => frappe.set_route("List", "Item"),
|
||||||
|
|
||||||
|
// Create a BOM for a laptop
|
||||||
|
() => frappe.tests.make(
|
||||||
|
"BOM", [
|
||||||
|
{item: "Laptop"},
|
||||||
|
{quantity: 1},
|
||||||
|
{with_operations: 1},
|
||||||
|
{operations: [
|
||||||
|
[
|
||||||
|
{operation: "Assemble CPU"},
|
||||||
|
{time_in_mins: 60},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{operation: "Assemble Keyboard"},
|
||||||
|
{time_in_mins: 30},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{operation: "Assemble Screen"},
|
||||||
|
{time_in_mins: 30},
|
||||||
|
]
|
||||||
|
]},
|
||||||
|
{scrap_items: [
|
||||||
|
[
|
||||||
|
{item_code: "Scrap item"}
|
||||||
|
]
|
||||||
|
]},
|
||||||
|
{items: [
|
||||||
|
[
|
||||||
|
{item_code: "CPU"},
|
||||||
|
{qty: 1}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{item_code: "Keyboard"},
|
||||||
|
{qty: 1}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{item_code: "Screen"},
|
||||||
|
{qty: 1}
|
||||||
|
]
|
||||||
|
]},
|
||||||
|
]
|
||||||
|
),
|
||||||
|
() => cur_frm.savesubmit(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => frappe.click_button('Yes'),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
|
||||||
|
() => {
|
||||||
|
assert.ok(cur_frm.doc.operating_cost + cur_frm.doc.raw_material_cost -
|
||||||
|
cur_frm.doc.scrap_material_cost == cur_frm.doc.total_cost, 'Total_Cost calculated correctly');
|
||||||
|
},
|
||||||
|
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
65
erpnext/manufacturing/doctype/operation/test_operation.js
Normal file
65
erpnext/manufacturing/doctype/operation/test_operation.js
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
QUnit.test("test: operation", function (assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
let done = assert.async();
|
||||||
|
let set_op_name = (text) => {
|
||||||
|
$(`input.input-with-feedback.form-control.bold:visible`).val(`${text}`);
|
||||||
|
};
|
||||||
|
let click_create = () => {
|
||||||
|
$(`.btn-primary:contains("Create"):visible`).click();
|
||||||
|
};
|
||||||
|
|
||||||
|
frappe.run_serially([
|
||||||
|
// test operation creation
|
||||||
|
() => frappe.set_route("List", "Operation"),
|
||||||
|
|
||||||
|
// Create a Keyboard operation
|
||||||
|
() => {
|
||||||
|
frappe.tests.make(
|
||||||
|
"Operation", [
|
||||||
|
{workstation: "Keyboard assembly workstation"}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
},
|
||||||
|
() => frappe.timeout(4),
|
||||||
|
() => set_op_name("Assemble Keyboard"),
|
||||||
|
() => frappe.timeout(0.5),
|
||||||
|
() => click_create(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
() => {
|
||||||
|
assert.ok(cur_frm.docname.includes('Assemble Keyboard'),
|
||||||
|
'Assemble Keyboard created successfully');
|
||||||
|
assert.ok(cur_frm.doc.workstation.includes('Keyboard assembly workstation'),
|
||||||
|
'Keyboard assembly workstation was linked successfully');
|
||||||
|
},
|
||||||
|
|
||||||
|
// Create a Screen operation
|
||||||
|
() => {
|
||||||
|
frappe.tests.make(
|
||||||
|
"Operation", [
|
||||||
|
{workstation: "Screen assembly workstation"}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
},
|
||||||
|
() => frappe.timeout(4),
|
||||||
|
() => set_op_name("Assemble Screen"),
|
||||||
|
() => frappe.timeout(0.5),
|
||||||
|
() => click_create(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
|
||||||
|
// Create a CPU operation
|
||||||
|
() => {
|
||||||
|
frappe.tests.make(
|
||||||
|
"Operation", [
|
||||||
|
{workstation: "CPU assembly workstation"}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
},
|
||||||
|
() => frappe.timeout(4),
|
||||||
|
() => set_op_name("Assemble CPU"),
|
||||||
|
() => frappe.timeout(0.5),
|
||||||
|
() => click_create(),
|
||||||
|
() => frappe.timeout(1),
|
||||||
|
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
@@ -273,7 +273,7 @@ class ProductionOrder(Document):
|
|||||||
timesheets = []
|
timesheets = []
|
||||||
plan_days = frappe.db.get_single_value("Manufacturing Settings", "capacity_planning_for_days") or 30
|
plan_days = frappe.db.get_single_value("Manufacturing Settings", "capacity_planning_for_days") or 30
|
||||||
|
|
||||||
timesheet = make_timesheet(self.name)
|
timesheet = make_timesheet(self.name, self.company)
|
||||||
timesheet.set('time_logs', [])
|
timesheet.set('time_logs', [])
|
||||||
|
|
||||||
for i, d in enumerate(self.operations):
|
for i, d in enumerate(self.operations):
|
||||||
@@ -575,10 +575,11 @@ def get_events(start, end, filters=None):
|
|||||||
return data
|
return data
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_timesheet(production_order):
|
def make_timesheet(production_order, company):
|
||||||
timesheet = frappe.new_doc("Timesheet")
|
timesheet = frappe.new_doc("Timesheet")
|
||||||
timesheet.employee = ""
|
timesheet.employee = ""
|
||||||
timesheet.production_order = production_order
|
timesheet.production_order = production_order
|
||||||
|
timesheet.company = company
|
||||||
return timesheet
|
return timesheet
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ class TestProductionOrder(unittest.TestCase):
|
|||||||
|
|
||||||
name = frappe.db.get_value('Timesheet', {'production_order': prod_order.name}, 'name')
|
name = frappe.db.get_value('Timesheet', {'production_order': prod_order.name}, 'name')
|
||||||
time_sheet_doc = frappe.get_doc('Timesheet', name)
|
time_sheet_doc = frappe.get_doc('Timesheet', name)
|
||||||
|
self.assertEqual(prod_order.company, time_sheet_doc.company)
|
||||||
time_sheet_doc.submit()
|
time_sheet_doc.submit()
|
||||||
|
|
||||||
|
|
||||||
@@ -107,7 +108,7 @@ class TestProductionOrder(unittest.TestCase):
|
|||||||
self.assertEqual(prod_order.operations[0].actual_operation_time, 60)
|
self.assertEqual(prod_order.operations[0].actual_operation_time, 60)
|
||||||
self.assertEqual(prod_order.operations[0].actual_operating_cost, 100)
|
self.assertEqual(prod_order.operations[0].actual_operating_cost, 100)
|
||||||
|
|
||||||
time_sheet_doc1 = make_timesheet(prod_order.name)
|
time_sheet_doc1 = make_timesheet(prod_order.name, prod_order.company)
|
||||||
self.assertEqual(len(time_sheet_doc1.get('time_logs')), 0)
|
self.assertEqual(len(time_sheet_doc1.get('time_logs')), 0)
|
||||||
|
|
||||||
time_sheet_doc.cancel()
|
time_sheet_doc.cancel()
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
QUnit.test("test: workstation", function (assert) {
|
||||||
|
assert.expect(9);
|
||||||
|
let done = assert.async();
|
||||||
|
let elec_rate = 50;
|
||||||
|
let rent = 100;
|
||||||
|
let consumable_rate = 20;
|
||||||
|
let labour_rate = 500;
|
||||||
|
frappe.run_serially([
|
||||||
|
// test workstation creation
|
||||||
|
() => frappe.set_route("List", "Workstation"),
|
||||||
|
|
||||||
|
// Create a keyboard workstation
|
||||||
|
() => frappe.tests.make(
|
||||||
|
"Workstation", [
|
||||||
|
{workstation_name: "Keyboard assembly workstation"},
|
||||||
|
{hour_rate_electricity: elec_rate},
|
||||||
|
{hour_rate_rent: rent},
|
||||||
|
{hour_rate_consumable: consumable_rate},
|
||||||
|
{hour_rate_labour: labour_rate},
|
||||||
|
{working_hours: [
|
||||||
|
[
|
||||||
|
{enabled: 1},
|
||||||
|
{start_time: '11:00:00'},
|
||||||
|
{end_time: '18:00:00'}
|
||||||
|
]
|
||||||
|
]}
|
||||||
|
]
|
||||||
|
),
|
||||||
|
() => {
|
||||||
|
assert.ok(cur_frm.doc.workstation_name.includes('Keyboard assembly workstation'),
|
||||||
|
'Keyboard assembly workstation created successfully');
|
||||||
|
assert.equal(cur_frm.doc.hour_rate_electricity, elec_rate,
|
||||||
|
'electricity rate set correctly');
|
||||||
|
assert.equal(cur_frm.doc.hour_rate_rent, rent,
|
||||||
|
'rent set correctly');
|
||||||
|
assert.equal(cur_frm.doc.hour_rate_consumable, consumable_rate,
|
||||||
|
'consumable rate set correctly');
|
||||||
|
assert.equal(cur_frm.doc.hour_rate_labour, labour_rate,
|
||||||
|
'labour rate set correctly');
|
||||||
|
assert.equal(cur_frm.doc.working_hours[0].enabled, 1,
|
||||||
|
'working hours enabled');
|
||||||
|
assert.ok(cur_frm.doc.working_hours[0].start_time.includes('11:00:0'),
|
||||||
|
'start time set correctly');
|
||||||
|
assert.ok(cur_frm.doc.working_hours[0].end_time.includes('18:00:0'),
|
||||||
|
'end time set correctly');
|
||||||
|
assert.ok(cur_frm.doc.hour_rate_electricity+cur_frm.doc.hour_rate_rent+
|
||||||
|
cur_frm.doc.hour_rate_consumable+cur_frm.doc.hour_rate_labour==
|
||||||
|
cur_frm.doc.hour_rate, 'Net hour rate set correctly');
|
||||||
|
},
|
||||||
|
|
||||||
|
// Create a Screen workstation
|
||||||
|
() => frappe.tests.make(
|
||||||
|
"Workstation", [
|
||||||
|
{workstation_name: "Screen assembly workstation"},
|
||||||
|
{hour_rate_electricity: elec_rate},
|
||||||
|
{hour_rate_rent: rent},
|
||||||
|
{hour_rate_consumable: consumable_rate},
|
||||||
|
{hour_rate_labour: labour_rate},
|
||||||
|
{working_hours: [
|
||||||
|
[
|
||||||
|
{enabled: 1},
|
||||||
|
{start_time: '11:00:00'},
|
||||||
|
{end_time: '18:00:00'}
|
||||||
|
]
|
||||||
|
]}
|
||||||
|
]
|
||||||
|
),
|
||||||
|
|
||||||
|
// Create a CPU workstation
|
||||||
|
() => frappe.tests.make(
|
||||||
|
"Workstation", [
|
||||||
|
{workstation_name: "CPU assembly workstation"},
|
||||||
|
{hour_rate_electricity: elec_rate},
|
||||||
|
{hour_rate_rent: rent},
|
||||||
|
{hour_rate_consumable: consumable_rate},
|
||||||
|
{hour_rate_labour: labour_rate},
|
||||||
|
{working_hours: [
|
||||||
|
[
|
||||||
|
{enabled: 1},
|
||||||
|
{start_time: '11:00:00'},
|
||||||
|
{end_time: '18:00:00'}
|
||||||
|
]
|
||||||
|
]}
|
||||||
|
]
|
||||||
|
),
|
||||||
|
|
||||||
|
() => done()
|
||||||
|
]);
|
||||||
|
});
|
||||||
@@ -334,6 +334,7 @@ execute:frappe.reload_doctype('Employee') #2016-10-18
|
|||||||
execute:frappe.db.sql("update `tabEmployee` set prefered_contact_email = IFNULL(prefered_contact_email,'') ")
|
execute:frappe.db.sql("update `tabEmployee` set prefered_contact_email = IFNULL(prefered_contact_email,'') ")
|
||||||
execute:frappe.reload_doctype("Salary Slip")
|
execute:frappe.reload_doctype("Salary Slip")
|
||||||
execute:frappe.db.sql("update `tabSalary Slip` set posting_date=creation")
|
execute:frappe.db.sql("update `tabSalary Slip` set posting_date=creation")
|
||||||
|
erpnext.patches.v8_0.create_domain_docs #16-05-2017
|
||||||
erpnext.patches.v7_1.update_portal_roles
|
erpnext.patches.v7_1.update_portal_roles
|
||||||
erpnext.patches.v7_1.set_total_amount_currency_in_je
|
erpnext.patches.v7_1.set_total_amount_currency_in_je
|
||||||
finally:erpnext.patches.v7_0.update_timesheet_communications
|
finally:erpnext.patches.v7_0.update_timesheet_communications
|
||||||
@@ -404,7 +405,6 @@ erpnext.patches.v8_0.delete_bin_indexes
|
|||||||
erpnext.patches.v8_0.move_account_head_from_account_to_warehouse_for_inventory
|
erpnext.patches.v8_0.move_account_head_from_account_to_warehouse_for_inventory
|
||||||
erpnext.patches.v8_0.change_in_words_varchar_length
|
erpnext.patches.v8_0.change_in_words_varchar_length
|
||||||
erpnext.patches.v8_0.update_stock_qty_value_in_bom_item
|
erpnext.patches.v8_0.update_stock_qty_value_in_bom_item
|
||||||
erpnext.patches.v8_0.create_domain_docs #16-05-2017
|
|
||||||
erpnext.patches.v8_0.update_sales_cost_in_project
|
erpnext.patches.v8_0.update_sales_cost_in_project
|
||||||
erpnext.patches.v8_0.save_system_settings
|
erpnext.patches.v8_0.save_system_settings
|
||||||
erpnext.patches.v8_1.delete_deprecated_reports
|
erpnext.patches.v8_1.delete_deprecated_reports
|
||||||
@@ -422,5 +422,12 @@ erpnext.patches.v8_1.add_indexes_in_transaction_doctypes
|
|||||||
erpnext.patches.v8_3.set_restrict_to_domain_for_module_def
|
erpnext.patches.v8_3.set_restrict_to_domain_for_module_def
|
||||||
erpnext.patches.v8_1.update_expense_claim_status
|
erpnext.patches.v8_1.update_expense_claim_status
|
||||||
erpnext.patches.v8_3.update_company_total_sales
|
erpnext.patches.v8_3.update_company_total_sales
|
||||||
erpnext.patches.v8_1.set_delivery_date_in_so_item
|
erpnext.patches.v8_4.make_scorecard_records
|
||||||
erpnext.patches.v8_5.fix_tax_breakup_for_non_invoice_docs
|
erpnext.patches.v8_1.set_delivery_date_in_so_item #2017-07-28
|
||||||
|
erpnext.patches.v8_5.fix_tax_breakup_for_non_invoice_docs
|
||||||
|
erpnext.patches.v8_5.remove_quotations_route_in_sidebar
|
||||||
|
erpnext.patches.v8_5.update_existing_data_in_project_type
|
||||||
|
erpnext.patches.v8_5.update_customer_group_in_POS_profile
|
||||||
|
erpnext.patches.v8_6.update_timesheet_company_from_PO
|
||||||
|
erpnext.patches.v8_6.set_write_permission_for_quotation_for_sales_manager
|
||||||
|
erpnext.patches.v8_5.remove_project_type_property_setter
|
||||||
@@ -26,7 +26,7 @@ def execute():
|
|||||||
if not sales_invoice or not serial_nos:
|
if not sales_invoice or not serial_nos:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
serial_nos = ["'%s'"%no for no in serial_nos.split("\n")]
|
serial_nos = ["'%s'"%frappe.db.escape(no) for no in serial_nos.split("\n")]
|
||||||
|
|
||||||
frappe.db.sql("""
|
frappe.db.sql("""
|
||||||
UPDATE
|
UPDATE
|
||||||
@@ -36,7 +36,7 @@ def execute():
|
|||||||
WHERE
|
WHERE
|
||||||
name in ({serial_nos})
|
name in ({serial_nos})
|
||||||
""".format(
|
""".format(
|
||||||
sales_invoice=sales_invoice,
|
sales_invoice=frappe.db.escape(sales_invoice),
|
||||||
serial_nos=",".join(serial_nos)
|
serial_nos=",".join(serial_nos)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -10,4 +10,5 @@ def execute():
|
|||||||
frappe.reload_doc('manufacturing', 'doctype', 'bom_scrap_item')
|
frappe.reload_doc('manufacturing', 'doctype', 'bom_scrap_item')
|
||||||
frappe.db.sql("update `tabBOM Item` set stock_qty = qty, uom = stock_uom, conversion_factor = 1")
|
frappe.db.sql("update `tabBOM Item` set stock_qty = qty, uom = stock_uom, conversion_factor = 1")
|
||||||
frappe.db.sql("update `tabBOM Explosion Item` set stock_qty = qty")
|
frappe.db.sql("update `tabBOM Explosion Item` set stock_qty = qty")
|
||||||
frappe.db.sql("update `tabBOM Scrap Item` set stock_qty = qty")
|
if "qty" in frappe.db.get_table_columns("BOM Scrap Item"):
|
||||||
|
frappe.db.sql("update `tabBOM Scrap Item` set stock_qty = qty")
|
||||||
@@ -4,10 +4,18 @@ def execute():
|
|||||||
frappe.reload_doctype("Sales Order")
|
frappe.reload_doctype("Sales Order")
|
||||||
frappe.reload_doctype("Sales Order Item")
|
frappe.reload_doctype("Sales Order Item")
|
||||||
|
|
||||||
frappe.db.sql("""update `tabSales Order` set final_delivery_date = delivery_date where docstatus=1""")
|
if "final_delivery_date" in frappe.db.get_table_columns("Sales Order"):
|
||||||
|
frappe.db.sql("""
|
||||||
|
update `tabSales Order`
|
||||||
|
set delivery_date = final_delivery_date
|
||||||
|
where (delivery_date is null or delivery_date = '' or delivery_date = '0000-00-00')
|
||||||
|
and order_type = 'Sales'""")
|
||||||
|
|
||||||
frappe.db.sql("""
|
frappe.db.sql("""
|
||||||
update `tabSales Order` so, `tabSales Order Item` so_item
|
update `tabSales Order` so, `tabSales Order Item` so_item
|
||||||
set so_item.delivery_date = so.delivery_date
|
set so_item.delivery_date = so.delivery_date
|
||||||
where so.name = so_item.parent
|
where so.name = so_item.parent
|
||||||
|
and so.order_type = 'Sales'
|
||||||
|
and (so_item.delivery_date is null or so_item.delivery_date = ''
|
||||||
|
or so_item.delivery_date = '0000-00-00')
|
||||||
""")
|
""")
|
||||||
1
erpnext/patches/v8_4/__init__.py
Normal file
1
erpnext/patches/v8_4/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
11
erpnext/patches/v8_4/make_scorecard_records.py
Normal file
11
erpnext/patches/v8_4/make_scorecard_records.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
from erpnext.buying.doctype.supplier_scorecard.supplier_scorecard import make_default_records
|
||||||
|
def execute():
|
||||||
|
frappe.reload_doc('buying', 'doctype', 'supplier_scorecard_variable')
|
||||||
|
frappe.reload_doc('buying', 'doctype', 'supplier_scorecard_standing')
|
||||||
|
make_default_records()
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user