Merge branch 'develop' into fix-po-no-fetching
This commit is contained in:
commit
2bb110b3d1
@ -101,7 +101,7 @@ class Account(NestedSet):
|
||||
return
|
||||
if not frappe.db.get_value("Account",
|
||||
{'account_name': self.account_name, 'company': ancestors[0]}, 'name'):
|
||||
frappe.throw(_("Please add the account to root level Company - %s" % ancestors[0]))
|
||||
frappe.throw(_("Please add the account to root level Company - {}").format(ancestors[0]))
|
||||
elif self.parent_account:
|
||||
descendants = get_descendants_of('Company', self.company)
|
||||
if not descendants: return
|
||||
@ -164,9 +164,19 @@ class Account(NestedSet):
|
||||
|
||||
def create_account_for_child_company(self, parent_acc_name_map, descendants, parent_acc_name):
|
||||
for company in descendants:
|
||||
company_bold = frappe.bold(company)
|
||||
parent_acc_name_bold = frappe.bold(parent_acc_name)
|
||||
if not parent_acc_name_map.get(company):
|
||||
frappe.throw(_("While creating account for child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA")
|
||||
.format(company, parent_acc_name))
|
||||
frappe.throw(_("While creating account for Child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA")
|
||||
.format(company_bold, parent_acc_name_bold), title=_("Account Not Found"))
|
||||
|
||||
# validate if parent of child company account to be added is a group
|
||||
if (frappe.db.get_value("Account", self.parent_account, "is_group")
|
||||
and not frappe.db.get_value("Account", parent_acc_name_map[company], "is_group")):
|
||||
msg = _("While creating account for Child Company {0}, parent account {1} found as a ledger account.").format(company_bold, parent_acc_name_bold)
|
||||
msg += "<br><br>"
|
||||
msg += _("Please convert the parent account in corresponding child company to a group account.")
|
||||
frappe.throw(msg, title=_("Invalid Parent Account"))
|
||||
|
||||
filters = {
|
||||
"account_name": self.account_name,
|
||||
@ -309,8 +319,9 @@ def update_account_number(name, account_name, account_number=None, from_descenda
|
||||
allow_child_account_creation = _("Allow Account Creation Against Child Company")
|
||||
|
||||
message = _("Account {0} exists in parent company {1}.").format(frappe.bold(old_acc_name), frappe.bold(ancestor))
|
||||
message += "<br>" + _("Renaming it is only allowed via parent company {0}, \
|
||||
to avoid mismatch.").format(frappe.bold(ancestor)) + "<br><br>"
|
||||
message += "<br>"
|
||||
message += _("Renaming it is only allowed via parent company {0}, to avoid mismatch.").format(frappe.bold(ancestor))
|
||||
message += "<br><br>"
|
||||
message += _("To overrule this, enable '{0}' in company {1}").format(allow_child_account_creation, frappe.bold(account.company))
|
||||
|
||||
frappe.throw(message, title=_("Rename Not Allowed"))
|
||||
|
@ -111,6 +111,17 @@ class TestAccount(unittest.TestCase):
|
||||
self.assertEqual(acc_tc_4, "Test Sync Account - _TC4")
|
||||
self.assertEqual(acc_tc_5, "Test Sync Account - _TC5")
|
||||
|
||||
def test_add_account_to_a_group(self):
|
||||
frappe.db.set_value("Account", "Office Rent - _TC3", "is_group", 1)
|
||||
|
||||
acc = frappe.new_doc("Account")
|
||||
acc.account_name = "Test Group Account"
|
||||
acc.parent_account = "Office Rent - _TC3"
|
||||
acc.company = "_Test Company 3"
|
||||
self.assertRaises(frappe.ValidationError, acc.insert)
|
||||
|
||||
frappe.db.set_value("Account", "Office Rent - _TC3", "is_group", 0)
|
||||
|
||||
def test_account_rename_sync(self):
|
||||
frappe.local.flags.pop("ignore_root_company_validation", None)
|
||||
|
||||
@ -160,6 +171,7 @@ class TestAccount(unittest.TestCase):
|
||||
for doc in to_delete:
|
||||
frappe.delete_doc("Account", doc)
|
||||
|
||||
|
||||
def _make_test_records(verbose):
|
||||
from frappe.test_runner import make_test_objects
|
||||
|
||||
|
@ -7,7 +7,7 @@ frappe.ui.form.on('Accounting Dimension', {
|
||||
frm.set_query('document_type', () => {
|
||||
let invalid_doctypes = frappe.model.core_doctypes_list;
|
||||
invalid_doctypes.push('Accounting Dimension', 'Project',
|
||||
'Cost Center', 'Accounting Dimension Detail');
|
||||
'Cost Center', 'Accounting Dimension Detail', 'Company');
|
||||
|
||||
return {
|
||||
filters: {
|
||||
|
@ -19,7 +19,7 @@ class AccountingDimension(Document):
|
||||
|
||||
def validate(self):
|
||||
if self.document_type in core_doctypes_list + ('Accounting Dimension', 'Project',
|
||||
'Cost Center', 'Accounting Dimension Detail') :
|
||||
'Cost Center', 'Accounting Dimension Detail', 'Company') :
|
||||
|
||||
msg = _("Not allowed to create accounting dimension for {0}").format(self.document_type)
|
||||
frappe.throw(msg)
|
||||
|
@ -14,6 +14,7 @@
|
||||
"column_break_9",
|
||||
"update_stock",
|
||||
"ignore_pricing_rule",
|
||||
"hide_unavailable_items",
|
||||
"warehouse",
|
||||
"campaign",
|
||||
"company_address",
|
||||
@ -307,13 +308,19 @@
|
||||
"fieldtype": "Check",
|
||||
"label": "Update Stock",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "hide_unavailable_items",
|
||||
"fieldtype": "Check",
|
||||
"label": "Hide Unavailable Items"
|
||||
}
|
||||
],
|
||||
"icon": "icon-cog",
|
||||
"idx": 1,
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2020-10-20 13:16:50.665081",
|
||||
"modified": "2020-10-29 13:18:38.795925",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "POS Profile",
|
||||
|
@ -237,7 +237,7 @@ class TestSubscription(unittest.TestCase):
|
||||
subscription.party_type = 'Customer'
|
||||
subscription.party = '_Test Customer'
|
||||
subscription.append('plans', {'plan': '_Test Plan Name', 'qty': 1})
|
||||
subscription.start_date = '2018-01-01'
|
||||
subscription.start_date = add_days(nowdate(), -1000)
|
||||
subscription.insert()
|
||||
subscription.process() # generate first invoice
|
||||
|
||||
|
@ -63,6 +63,7 @@ def get_pos_entries(filters, group_by_field):
|
||||
FROM
|
||||
`tabPOS Invoice` p {from_sales_invoice_payment}
|
||||
WHERE
|
||||
p.docstatus = 1 and
|
||||
{group_by_mop_condition}
|
||||
{conditions}
|
||||
ORDER BY
|
||||
|
@ -9,9 +9,9 @@
|
||||
"filters_json": "{\"status\":\"In Location\",\"filter_based_on\":\"Fiscal Year\",\"period_start_date\":\"2020-04-01\",\"period_end_date\":\"2021-03-31\",\"date_based_on\":\"Purchase Date\",\"group_by\":\"--Select a group--\"}",
|
||||
"group_by_type": "Count",
|
||||
"idx": 0,
|
||||
"is_public": 0,
|
||||
"is_public": 1,
|
||||
"is_standard": 1,
|
||||
"modified": "2020-07-23 13:53:33.211371",
|
||||
"modified": "2020-10-28 23:15:58.432189",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Assets",
|
||||
"name": "Asset Value Analytics",
|
||||
|
@ -8,9 +8,9 @@
|
||||
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"from_date\":\"frappe.datetime.add_months(frappe.datetime.nowdate(), -12)\",\"to_date\":\"frappe.datetime.nowdate()\"}",
|
||||
"filters_json": "{\"status\":\"In Location\",\"group_by\":\"Asset Category\",\"is_existing_asset\":0}",
|
||||
"idx": 0,
|
||||
"is_public": 0,
|
||||
"is_public": 1,
|
||||
"is_standard": 1,
|
||||
"modified": "2020-07-23 13:39:32.429240",
|
||||
"modified": "2020-10-28 23:16:16.939070",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Assets",
|
||||
"name": "Category-wise Asset Value",
|
||||
|
@ -8,9 +8,9 @@
|
||||
"dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"from_date\":\"frappe.datetime.add_months(frappe.datetime.nowdate(), -12)\",\"to_date\":\"frappe.datetime.nowdate()\"}",
|
||||
"filters_json": "{\"status\":\"In Location\",\"group_by\":\"Location\",\"is_existing_asset\":0}",
|
||||
"idx": 0,
|
||||
"is_public": 0,
|
||||
"is_public": 1,
|
||||
"is_standard": 1,
|
||||
"modified": "2020-07-23 13:42:44.912551",
|
||||
"modified": "2020-10-28 23:16:07.883312",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Assets",
|
||||
"name": "Location-wise Asset Value",
|
||||
|
@ -735,10 +735,12 @@ def get_items_for_material_requests(doc, warehouses=None):
|
||||
mr_items = new_mr_items
|
||||
|
||||
if not mr_items:
|
||||
frappe.msgprint(_("""As raw materials projected quantity is more than required quantity,
|
||||
there is no need to create material request for the warehouse {0}.
|
||||
Still if you want to make material request,
|
||||
kindly enable <b>Ignore Existing Projected Quantity</b> checkbox""").format(doc.get('for_warehouse')))
|
||||
to_enable = frappe.bold(_("Ignore Existing Projected Quantity"))
|
||||
warehouse = frappe.bold(doc.get('for_warehouse'))
|
||||
message = _("As there are sufficient raw materials, Material Request is not required for Warehouse {0}.").format(warehouse) + "<br><br>"
|
||||
message += _(" If you still want to proceed, please enable {0}.").format(to_enable)
|
||||
|
||||
frappe.msgprint(message, title=_("Note"))
|
||||
|
||||
return mr_items
|
||||
|
||||
|
@ -53,7 +53,7 @@ def execute():
|
||||
# renamed reports from "Minutes to First Response for Issues" to "First Response Time for Issues". Same for Opportunity
|
||||
for report in ['Minutes to First Response for Issues', 'Minutes to First Response for Opportunity']:
|
||||
if frappe.db.exists('Report', report):
|
||||
frappe.delete_doc('Report', report)
|
||||
frappe.delete_doc('Report', report, ignore_permissions=True)
|
||||
|
||||
|
||||
def convert_to_seconds(value, unit):
|
||||
|
@ -352,9 +352,15 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
|
||||
let show_description = function(idx, exist = null) {
|
||||
if (exist) {
|
||||
scan_barcode_field.set_new_description(__('Row #{0}: Qty increased by 1', [idx]));
|
||||
frappe.show_alert({
|
||||
message: __('Row #{0}: Qty increased by 1', [idx]),
|
||||
indicator: 'green'
|
||||
});
|
||||
} else {
|
||||
scan_barcode_field.set_new_description(__('Row #{0}: Item added', [idx]));
|
||||
frappe.show_alert({
|
||||
message: __('Row #{0}: Item added', [idx]),
|
||||
indicator: 'green'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -365,7 +371,10 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
}).then(r => {
|
||||
const data = r && r.message;
|
||||
if (!data || Object.keys(data).length === 0) {
|
||||
scan_barcode_field.set_new_description(__('Cannot find Item with this barcode'));
|
||||
frappe.show_alert({
|
||||
message: __('Cannot find Item with this Barcode'),
|
||||
indicator: 'red'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@ -651,7 +660,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
let child = frappe.model.add_child(me.frm.doc, "taxes");
|
||||
child.charge_type = "On Net Total";
|
||||
child.account_head = tax;
|
||||
child.rate = rate;
|
||||
child.rate = 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -18,7 +18,7 @@
|
||||
{
|
||||
"hidden": 0,
|
||||
"label": "Review and Action",
|
||||
"links": "[\n {\n \"description\": \"Quality Review\",\n \"label\": \"Quality Review\",\n \"name\": \"Quality Review\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Quality Action\",\n \"label\": \"Quality Action\",\n \"name\": \"Quality Action\",\n \"type\": \"doctype\"\n }\n]"
|
||||
"links": "[\n {\n \"description\": \"Non Conformance\",\n \"label\": \"Non Conformance\",\n \"name\": \"Non Conformance\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Quality Review\",\n \"label\": \"Quality Review\",\n \"name\": \"Quality Review\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Quality Action\",\n \"label\": \"Quality Action\",\n \"name\": \"Quality Action\",\n \"type\": \"doctype\"\n }\n]"
|
||||
}
|
||||
],
|
||||
"category": "Modules",
|
||||
@ -29,11 +29,11 @@
|
||||
"docstatus": 0,
|
||||
"doctype": "Desk Page",
|
||||
"extends_another_page": 0,
|
||||
"icon": "",
|
||||
"hide_custom": 0,
|
||||
"idx": 0,
|
||||
"is_standard": 1,
|
||||
"label": "Quality",
|
||||
"modified": "2020-04-01 11:28:51.095012",
|
||||
"modified": "2020-10-27 16:28:54.138055",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality",
|
||||
@ -47,6 +47,7 @@
|
||||
"type": "DocType"
|
||||
},
|
||||
{
|
||||
"doc_view": "Tree",
|
||||
"label": "Quality Procedure",
|
||||
"link_to": "Quality Procedure",
|
||||
"type": "DocType"
|
||||
@ -55,6 +56,33 @@
|
||||
"label": "Quality Inspection",
|
||||
"link_to": "Quality Inspection",
|
||||
"type": "DocType"
|
||||
},
|
||||
{
|
||||
"color": "#ff8989",
|
||||
"doc_view": "",
|
||||
"format": "{} Open",
|
||||
"label": "Quality Review",
|
||||
"link_to": "Quality Review",
|
||||
"stats_filter": "{\"status\": \"Open\"}",
|
||||
"type": "DocType"
|
||||
},
|
||||
{
|
||||
"color": "#ff8989",
|
||||
"doc_view": "",
|
||||
"format": "{} Open",
|
||||
"label": "Quality Action",
|
||||
"link_to": "Quality Action",
|
||||
"stats_filter": "{\"status\": \"Open\"}",
|
||||
"type": "DocType"
|
||||
},
|
||||
{
|
||||
"color": "#ff8989",
|
||||
"doc_view": "",
|
||||
"format": "{} Open",
|
||||
"label": "Non Conformance",
|
||||
"link_to": "Non Conformance",
|
||||
"stats_filter": "{\"status\": \"Open\"}",
|
||||
"type": "DocType"
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
// Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('Non Conformance', {
|
||||
// refresh: function(frm) {
|
||||
|
||||
// }
|
||||
});
|
@ -0,0 +1,118 @@
|
||||
{
|
||||
"actions": [],
|
||||
"autoname": "format:QA-NC-{#####}",
|
||||
"creation": "2020-10-21 14:49:50.350136",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"subject",
|
||||
"procedure",
|
||||
"process_owner",
|
||||
"full_name",
|
||||
"column_break_4",
|
||||
"status",
|
||||
"section_break_4",
|
||||
"details",
|
||||
"corrective_action",
|
||||
"preventive_action"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "subject",
|
||||
"fieldtype": "Data",
|
||||
"in_list_view": 1,
|
||||
"label": "Subject",
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "procedure",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Procedure",
|
||||
"options": "Quality Procedure",
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "status",
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"label": "Status",
|
||||
"options": "Open\nResolved\nCancelled",
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "section_break_4",
|
||||
"fieldtype": "Section Break"
|
||||
},
|
||||
{
|
||||
"fieldname": "details",
|
||||
"fieldtype": "Text Editor",
|
||||
"label": "Details"
|
||||
},
|
||||
{
|
||||
"fetch_from": "procedure.process_owner",
|
||||
"fieldname": "process_owner",
|
||||
"fieldtype": "Data",
|
||||
"label": "Process Owner",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_4",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"fetch_from": "process_owner.full_name",
|
||||
"fieldname": "full_name",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
"label": "Full Name"
|
||||
},
|
||||
{
|
||||
"fieldname": "corrective_action",
|
||||
"fieldtype": "Text",
|
||||
"label": "Corrective Action"
|
||||
},
|
||||
{
|
||||
"fieldname": "preventive_action",
|
||||
"fieldtype": "Text",
|
||||
"label": "Preventive Action"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2020-10-26 15:27:47.247814",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Non Conformance",
|
||||
"owner": "Administrator",
|
||||
"permissions": [
|
||||
{
|
||||
"create": 1,
|
||||
"delete": 1,
|
||||
"email": 1,
|
||||
"export": 1,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "System Manager",
|
||||
"share": 1,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"create": 1,
|
||||
"delete": 1,
|
||||
"email": 1,
|
||||
"export": 1,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Employee",
|
||||
"share": 1,
|
||||
"write": 1
|
||||
}
|
||||
],
|
||||
"sort_field": "modified",
|
||||
"sort_order": "DESC",
|
||||
"track_changes": 1
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2020, 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 NonConformance(Document):
|
||||
pass
|
@ -0,0 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
# See license.txt
|
||||
from __future__ import unicode_literals
|
||||
|
||||
# import frappe
|
||||
import unittest
|
||||
|
||||
class TestNonConformance(unittest.TestCase):
|
||||
pass
|
@ -2,32 +2,5 @@
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('Quality Action', {
|
||||
onload: function(frm) {
|
||||
frm.set_value("date", frappe.datetime.get_today());
|
||||
frm.refresh();
|
||||
},
|
||||
document_name: function(frm){
|
||||
frappe.call({
|
||||
"method": "frappe.client.get",
|
||||
args: {
|
||||
doctype: frm.doc.document_type,
|
||||
name: frm.doc.document_name
|
||||
},
|
||||
callback: function(data){
|
||||
frm.fields_dict.resolutions.grid.remove_all();
|
||||
let objectives = [];
|
||||
|
||||
if(frm.doc.document_type === "Quality Review"){
|
||||
for(let i in data.message.reviews) objectives.push(data.message.reviews[i].review);
|
||||
} else {
|
||||
for(let j in data.message.parameters) objectives.push(data.message.parameters[j].feedback);
|
||||
}
|
||||
for (var objective in objectives){
|
||||
frm.add_child("resolutions");
|
||||
frm.fields_dict.resolutions.get_value()[objective].problem = objectives[objective];
|
||||
}
|
||||
frm.refresh();
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
@ -1,32 +1,34 @@
|
||||
{
|
||||
"autoname": "format:ACTN-{#####}",
|
||||
"actions": [],
|
||||
"autoname": "format:QA-ACT-{#####}",
|
||||
"creation": "2018-10-02 11:40:43.666100",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"corrective_preventive",
|
||||
"document_type",
|
||||
"goal",
|
||||
"review",
|
||||
"feedback",
|
||||
"status",
|
||||
"cb_00",
|
||||
"date",
|
||||
"document_name",
|
||||
"goal",
|
||||
"procedure",
|
||||
"status",
|
||||
"sb_00",
|
||||
"resolutions"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"depends_on": "eval:doc.type == 'Quality Review'",
|
||||
"fetch_from": "review.goal",
|
||||
"fieldname": "goal",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 1,
|
||||
"label": "Goal",
|
||||
"options": "Quality Goal",
|
||||
"read_only": 1
|
||||
"options": "Quality Goal"
|
||||
},
|
||||
{
|
||||
"default": "Today",
|
||||
"fieldname": "date",
|
||||
"fieldtype": "Date",
|
||||
"in_list_view": 1,
|
||||
@ -34,34 +36,20 @@
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"depends_on": "eval:doc.type == 'Quality Review'",
|
||||
"fieldname": "procedure",
|
||||
"fieldtype": "Link",
|
||||
"label": "Procedure",
|
||||
"options": "Quality Procedure",
|
||||
"read_only": 1
|
||||
"options": "Quality Procedure"
|
||||
},
|
||||
{
|
||||
"default": "Open",
|
||||
"fieldname": "status",
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 1,
|
||||
"label": "Status",
|
||||
"options": "Open\nClosed"
|
||||
},
|
||||
{
|
||||
"fieldname": "document_name",
|
||||
"fieldtype": "Dynamic Link",
|
||||
"label": "Document Name",
|
||||
"options": "document_type"
|
||||
},
|
||||
{
|
||||
"fieldname": "document_type",
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"label": "Document Type",
|
||||
"options": "Quality Review\nQuality Feedback",
|
||||
"reqd": 1
|
||||
"options": "Open\nCompleted",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"default": "Corrective",
|
||||
@ -86,9 +74,24 @@
|
||||
"fieldtype": "Table",
|
||||
"label": "Resolutions",
|
||||
"options": "Quality Action Resolution"
|
||||
},
|
||||
{
|
||||
"fieldname": "review",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Review",
|
||||
"options": "Quality Review"
|
||||
},
|
||||
{
|
||||
"fieldname": "feedback",
|
||||
"fieldtype": "Link",
|
||||
"label": "Feedback",
|
||||
"options": "Quality Feedback"
|
||||
}
|
||||
],
|
||||
"modified": "2019-05-28 13:10:44.092497",
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2020-10-27 16:21:59.533937",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Action",
|
||||
|
@ -7,4 +7,5 @@ import frappe
|
||||
from frappe.model.document import Document
|
||||
|
||||
class QualityAction(Document):
|
||||
pass
|
||||
def validate(self):
|
||||
self.status = 'Open' if any([d.status=='Open' for d in self.resolutions]) else 'Completed'
|
@ -1,23 +0,0 @@
|
||||
/* eslint-disable */
|
||||
// rename this file from _test_[name] to test_[name] to activate
|
||||
// and remove above this line
|
||||
|
||||
QUnit.test("test: Quality Action", function (assert) {
|
||||
let done = assert.async();
|
||||
|
||||
// number of asserts
|
||||
assert.expect(1);
|
||||
|
||||
frappe.run_serially([
|
||||
// insert a new Quality Actions
|
||||
() => frappe.tests.make('Quality Actions', [
|
||||
// values to be set
|
||||
{key: 'value'}
|
||||
]),
|
||||
() => {
|
||||
assert.equal(cur_frm.doc.key, 'value');
|
||||
},
|
||||
() => done()
|
||||
]);
|
||||
|
||||
});
|
@ -5,42 +5,7 @@ from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
import unittest
|
||||
from erpnext.quality_management.doctype.quality_procedure.test_quality_procedure import create_procedure
|
||||
from erpnext.quality_management.doctype.quality_goal.test_quality_goal import create_unit
|
||||
from erpnext.quality_management.doctype.quality_goal.test_quality_goal import create_goal
|
||||
from erpnext.quality_management.doctype.quality_review.test_quality_review import create_review
|
||||
|
||||
class TestQualityAction(unittest.TestCase):
|
||||
|
||||
def test_quality_action(self):
|
||||
create_procedure()
|
||||
create_unit()
|
||||
create_goal()
|
||||
create_review()
|
||||
test_create_action = create_action()
|
||||
test_get_action = get_action()
|
||||
|
||||
self.assertEquals(test_create_action, test_get_action)
|
||||
|
||||
def create_action():
|
||||
review = frappe.db.exists("Quality Review", {"goal": "GOAL-_Test Quality Goal"})
|
||||
action = frappe.get_doc({
|
||||
"doctype": "Quality Action",
|
||||
"action": "Corrective",
|
||||
"document_type": "Quality Review",
|
||||
"document_name": review,
|
||||
"date": frappe.utils.nowdate(),
|
||||
"goal": "GOAL-_Test Quality Goal",
|
||||
"procedure": "PRC-_Test Quality Procedure"
|
||||
})
|
||||
action_exist = frappe.db.exists("Quality Action", {"review": review})
|
||||
|
||||
if not action_exist:
|
||||
action.insert()
|
||||
return action.name
|
||||
else:
|
||||
return action_exist
|
||||
|
||||
def get_action():
|
||||
review = frappe.db.exists("Quality Review", {"goal": "GOAL-_Test Quality Goal"})
|
||||
return frappe.db.exists("Quality Action", {"document_name": review})
|
||||
# quality action has no code
|
||||
pass
|
@ -1,33 +1,54 @@
|
||||
{
|
||||
"actions": [],
|
||||
"creation": "2019-05-26 20:36:44.337186",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"problem",
|
||||
"sb_00",
|
||||
"resolution"
|
||||
"resolution",
|
||||
"status",
|
||||
"responsible",
|
||||
"completion_by"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "problem",
|
||||
"fieldtype": "Long Text",
|
||||
"in_list_view": 1,
|
||||
"label": "Review"
|
||||
},
|
||||
{
|
||||
"fieldname": "sb_00",
|
||||
"fieldtype": "Section Break"
|
||||
"label": "Problem"
|
||||
},
|
||||
{
|
||||
"fieldname": "resolution",
|
||||
"fieldtype": "Text Editor",
|
||||
"in_list_view": 1,
|
||||
"label": "Resolution"
|
||||
},
|
||||
{
|
||||
"fieldname": "status",
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"label": "Status",
|
||||
"options": "Open\nCompleted"
|
||||
},
|
||||
{
|
||||
"fieldname": "responsible",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Responsible",
|
||||
"options": "User"
|
||||
},
|
||||
{
|
||||
"fieldname": "completion_by",
|
||||
"fieldtype": "Date",
|
||||
"in_list_view": 1,
|
||||
"label": "Completion By"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"istable": 1,
|
||||
"modified": "2019-05-28 13:09:50.435323",
|
||||
"links": [],
|
||||
"modified": "2020-10-21 12:59:25.566682",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Action Resolution",
|
||||
|
@ -2,31 +2,9 @@
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('Quality Feedback', {
|
||||
refresh: function(frm) {
|
||||
frm.set_value("date", frappe.datetime.get_today());
|
||||
},
|
||||
|
||||
template: function(frm) {
|
||||
if (frm.doc.template) {
|
||||
frappe.call({
|
||||
"method": "frappe.client.get",
|
||||
args: {
|
||||
doctype: "Quality Feedback Template",
|
||||
name: frm.doc.template
|
||||
},
|
||||
callback: function(data) {
|
||||
if (data && data.message) {
|
||||
frm.fields_dict.parameters.grid.remove_all();
|
||||
|
||||
// fetch parameters from template and autofill
|
||||
for (let template_parameter of data.message.parameters) {
|
||||
let row = frm.add_child("parameters");
|
||||
row.parameter = template_parameter.parameter;
|
||||
}
|
||||
frm.refresh();
|
||||
}
|
||||
}
|
||||
});
|
||||
frm.call('set_parameters');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -1,16 +1,15 @@
|
||||
{
|
||||
"actions": [],
|
||||
"autoname": "format:FDBK-{#####}",
|
||||
"autoname": "format:QA-FB-{#####}",
|
||||
"creation": "2019-05-26 21:23:05.308379",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"document_type",
|
||||
"template",
|
||||
"cb_00",
|
||||
"document_type",
|
||||
"document_name",
|
||||
"date",
|
||||
"sb_00",
|
||||
"parameters"
|
||||
],
|
||||
@ -18,6 +17,7 @@
|
||||
{
|
||||
"fieldname": "template",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Template",
|
||||
"options": "Quality Feedback Template",
|
||||
"reqd": 1
|
||||
@ -26,13 +26,6 @@
|
||||
"fieldname": "cb_00",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"fieldname": "date",
|
||||
"fieldtype": "Date",
|
||||
"in_list_view": 1,
|
||||
"label": "Date",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "sb_00",
|
||||
"fieldtype": "Section Break"
|
||||
@ -47,6 +40,7 @@
|
||||
{
|
||||
"fieldname": "document_type",
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"label": "Type",
|
||||
"options": "User\nCustomer",
|
||||
"reqd": 1
|
||||
@ -54,13 +48,20 @@
|
||||
{
|
||||
"fieldname": "document_name",
|
||||
"fieldtype": "Dynamic Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Feedback By",
|
||||
"options": "document_type",
|
||||
"reqd": 1
|
||||
}
|
||||
],
|
||||
"links": [],
|
||||
"modified": "2020-07-03 15:50:58.589302",
|
||||
"links": [
|
||||
{
|
||||
"group": "Actions",
|
||||
"link_doctype": "Quality Action",
|
||||
"link_fieldname": "feedback"
|
||||
}
|
||||
],
|
||||
"modified": "2020-10-27 16:20:10.918544",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Feedback",
|
||||
|
@ -7,4 +7,17 @@ import frappe
|
||||
from frappe.model.document import Document
|
||||
|
||||
class QualityFeedback(Document):
|
||||
pass
|
||||
def set_parameters(self):
|
||||
if self.template and not getattr(self, 'parameters', []):
|
||||
for d in frappe.get_doc('Quality Feedback Template', self.template).parameters:
|
||||
self.append('parameters', dict(
|
||||
parameter = d.parameter,
|
||||
rating = 1
|
||||
))
|
||||
|
||||
def validate(self):
|
||||
if not self.document_name:
|
||||
self.document_type ='User'
|
||||
self.document_name = frappe.session.user
|
||||
self.set_parameters()
|
||||
|
||||
|
@ -5,49 +5,27 @@ from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
import unittest
|
||||
from erpnext.quality_management.doctype.quality_feedback_template.test_quality_feedback_template import create_template
|
||||
|
||||
|
||||
class TestQualityFeedback(unittest.TestCase):
|
||||
|
||||
def test_quality_feedback(self):
|
||||
create_template()
|
||||
test_create_feedback = create_feedback()
|
||||
test_get_feedback = get_feedback()
|
||||
template = frappe.get_doc(dict(
|
||||
doctype = 'Quality Feedback Template',
|
||||
template = 'Test Template',
|
||||
parameters = [
|
||||
dict(parameter='Test Parameter 1'),
|
||||
dict(parameter='Test Parameter 2')
|
||||
]
|
||||
)).insert()
|
||||
|
||||
self.assertEqual(test_create_feedback, test_get_feedback)
|
||||
feedback = frappe.get_doc(dict(
|
||||
doctype = 'Quality Feedback',
|
||||
template = template.name,
|
||||
document_type = 'User',
|
||||
document_name = frappe.session.user
|
||||
)).insert()
|
||||
|
||||
def create_feedback():
|
||||
create_customer()
|
||||
self.assertEqual(template.parameters[0].parameter, feedback.parameters[0].parameter)
|
||||
|
||||
feedabck = frappe.get_doc({
|
||||
"doctype": "Quality Feedback",
|
||||
"template": "TMPL-_Test Feedback Template",
|
||||
"document_type": "Customer",
|
||||
"document_name": "Quality Feedback Customer",
|
||||
"date": frappe.utils.nowdate(),
|
||||
"parameters": [
|
||||
{
|
||||
"parameter": "Test Parameter",
|
||||
"rating": 3,
|
||||
"feedback": "Test Feedback"
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
feedback_exists = frappe.db.exists("Quality Feedback", {"template": "TMPL-_Test Feedback Template"})
|
||||
|
||||
if not feedback_exists:
|
||||
feedabck.insert()
|
||||
return feedabck.name
|
||||
else:
|
||||
return feedback_exists
|
||||
|
||||
def get_feedback():
|
||||
return frappe.db.exists("Quality Feedback", {"template": "TMPL-_Test Feedback Template"})
|
||||
|
||||
def create_customer():
|
||||
if not frappe.db.exists("Customer", {"customer_name": "Quality Feedback Customer"}):
|
||||
customer = frappe.get_doc({
|
||||
"doctype": "Customer",
|
||||
"customer_name": "Quality Feedback Customer"
|
||||
}).insert(ignore_permissions=True)
|
||||
feedback.delete()
|
||||
template.delete()
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"actions": [],
|
||||
"creation": "2019-05-26 21:25:01.715807",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
@ -39,12 +40,13 @@
|
||||
"fieldname": "feedback",
|
||||
"fieldtype": "Text Editor",
|
||||
"in_list_view": 1,
|
||||
"label": "Feedback",
|
||||
"reqd": 1
|
||||
"label": "Feedback"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"istable": 1,
|
||||
"modified": "2019-07-13 19:58:08.966141",
|
||||
"links": [],
|
||||
"modified": "2020-10-27 17:28:12.033145",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Feedback Parameter",
|
||||
|
@ -1,13 +1,12 @@
|
||||
{
|
||||
"actions": [],
|
||||
"autoname": "format:TMPL-{template}",
|
||||
"autoname": "field:template",
|
||||
"creation": "2019-05-26 21:17:24.283061",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"template",
|
||||
"cb_00",
|
||||
"sb_00",
|
||||
"parameters"
|
||||
],
|
||||
@ -16,12 +15,9 @@
|
||||
"fieldname": "template",
|
||||
"fieldtype": "Data",
|
||||
"in_list_view": 1,
|
||||
"label": "Template",
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "cb_00",
|
||||
"fieldtype": "Column Break"
|
||||
"label": "Template Name",
|
||||
"reqd": 1,
|
||||
"unique": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "sb_00",
|
||||
@ -35,8 +31,14 @@
|
||||
"reqd": 1
|
||||
}
|
||||
],
|
||||
"links": [],
|
||||
"modified": "2020-07-03 16:06:03.749415",
|
||||
"links": [
|
||||
{
|
||||
"group": "Records",
|
||||
"link_doctype": "Quality Feedback",
|
||||
"link_fieldname": "template"
|
||||
}
|
||||
],
|
||||
"modified": "2020-10-27 16:18:53.579688",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Feedback Template",
|
||||
|
@ -7,31 +7,4 @@ import frappe
|
||||
import unittest
|
||||
|
||||
class TestQualityFeedbackTemplate(unittest.TestCase):
|
||||
|
||||
def test_quality_feedback_template(self):
|
||||
test_create_template = create_template()
|
||||
test_get_template = get_template()
|
||||
|
||||
self.assertEqual(test_create_template, test_get_template)
|
||||
|
||||
def create_template():
|
||||
template = frappe.get_doc({
|
||||
"doctype": "Quality Feedback Template",
|
||||
"template": "_Test Feedback Template",
|
||||
"parameters": [
|
||||
{
|
||||
"parameter": "Test Parameter"
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
template_exists = frappe.db.exists("Quality Feedback Template", {"template": "_Test Feedback Template"})
|
||||
|
||||
if not template_exists:
|
||||
template.insert()
|
||||
return template.name
|
||||
else:
|
||||
return template_exists
|
||||
|
||||
def get_template():
|
||||
return frappe.db.exists("Quality Feedback Template", {"template": "_Test Feedback Template"})
|
||||
pass
|
@ -2,7 +2,6 @@
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('Quality Goal', {
|
||||
refresh: function(frm) {
|
||||
frm.doc.created_by = frappe.session.user;
|
||||
}
|
||||
// refresh: function(frm) {
|
||||
// }
|
||||
});
|
||||
|
@ -1,5 +1,6 @@
|
||||
{
|
||||
"autoname": "format:GOAL-{goal}",
|
||||
"actions": [],
|
||||
"autoname": "field:goal",
|
||||
"creation": "2018-10-02 12:17:41.727541",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
@ -7,27 +8,14 @@
|
||||
"field_order": [
|
||||
"goal",
|
||||
"frequency",
|
||||
"created_by",
|
||||
"cb_00",
|
||||
"procedure",
|
||||
"weekday",
|
||||
"quarter",
|
||||
"date",
|
||||
"sb_00",
|
||||
"revision",
|
||||
"cb_01",
|
||||
"revised_on",
|
||||
"sb_01",
|
||||
"objectives"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "created_by",
|
||||
"fieldtype": "Link",
|
||||
"label": "Created By",
|
||||
"options": "User",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"default": "None",
|
||||
"fieldname": "frequency",
|
||||
@ -50,20 +38,6 @@
|
||||
"label": "Date",
|
||||
"options": "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30"
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "revision",
|
||||
"fieldtype": "Int",
|
||||
"label": "Revision",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "revised_on",
|
||||
"fieldtype": "Date",
|
||||
"in_list_view": 1,
|
||||
"label": "Revised On",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"depends_on": "eval:doc.frequency == 'Weekly';",
|
||||
"fieldname": "weekday",
|
||||
@ -75,15 +49,6 @@
|
||||
"fieldname": "cb_00",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"fieldname": "sb_00",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Revision and Revised On"
|
||||
},
|
||||
{
|
||||
"fieldname": "cb_01",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"fieldname": "sb_01",
|
||||
"fieldtype": "Section Break",
|
||||
@ -101,18 +66,17 @@
|
||||
"label": "Goal",
|
||||
"reqd": 1,
|
||||
"unique": 1
|
||||
},
|
||||
{
|
||||
"default": "January-April-July-October",
|
||||
"depends_on": "eval:doc.frequency == 'Quarterly';",
|
||||
"fieldname": "quarter",
|
||||
"fieldtype": "Select",
|
||||
"label": "Quarter",
|
||||
"options": "January-April-July-October",
|
||||
"read_only": 1
|
||||
}
|
||||
],
|
||||
"modified": "2019-05-28 14:49:12.768863",
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [
|
||||
{
|
||||
"group": "Review",
|
||||
"link_doctype": "Quality Review",
|
||||
"link_fieldname": "goal"
|
||||
}
|
||||
],
|
||||
"modified": "2020-10-27 15:57:59.368605",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Goal",
|
||||
|
@ -8,7 +8,5 @@ import frappe
|
||||
from frappe.model.document import Document
|
||||
|
||||
class QualityGoal(Document):
|
||||
|
||||
def validate(self):
|
||||
self.revision += 1
|
||||
self.revised_on = frappe.utils.today()
|
||||
pass
|
@ -1,12 +0,0 @@
|
||||
from frappe import _
|
||||
|
||||
def get_data():
|
||||
return {
|
||||
'fieldname': 'goal',
|
||||
'transactions': [
|
||||
{
|
||||
'label': _('Review'),
|
||||
'items': ['Quality Review']
|
||||
}
|
||||
]
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
/* eslint-disable */
|
||||
// rename this file from _test_[name] to test_[name] to activate
|
||||
// and remove above this line
|
||||
|
||||
QUnit.test("test: Quality Goal", function (assert) {
|
||||
let done = assert.async();
|
||||
|
||||
// number of asserts
|
||||
assert.expect(1);
|
||||
|
||||
frappe.run_serially([
|
||||
// insert a new Quality Goal
|
||||
() => frappe.tests.make('Quality Goal', [
|
||||
// values to be set
|
||||
{key: 'value'}
|
||||
]),
|
||||
() => {
|
||||
assert.equal(cur_frm.doc.key, 'value');
|
||||
},
|
||||
() => done()
|
||||
]);
|
||||
|
||||
});
|
@ -8,44 +8,18 @@ import unittest
|
||||
from erpnext.quality_management.doctype.quality_procedure.test_quality_procedure import create_procedure
|
||||
|
||||
class TestQualityGoal(unittest.TestCase):
|
||||
|
||||
def test_quality_goal(self):
|
||||
create_procedure()
|
||||
create_unit()
|
||||
test_create_goal = create_goal()
|
||||
test_get_goal = get_goal()
|
||||
# no code, just a basic sanity check
|
||||
goal = get_quality_goal()
|
||||
self.assertTrue(goal)
|
||||
goal.delete()
|
||||
|
||||
self.assertEquals(test_create_goal, test_get_goal)
|
||||
|
||||
def create_goal():
|
||||
goal = frappe.get_doc({
|
||||
"doctype": "Quality Goal",
|
||||
"goal": "_Test Quality Goal",
|
||||
"procedure": "PRC-_Test Quality Procedure",
|
||||
"objectives": [
|
||||
{
|
||||
"objective": "_Test Quality Objective",
|
||||
"target": "4",
|
||||
"uom": "_Test UOM"
|
||||
}
|
||||
def get_quality_goal():
|
||||
return frappe.get_doc(dict(
|
||||
doctype = 'Quality Goal',
|
||||
goal = 'Test Quality Module',
|
||||
frequency = 'Daily',
|
||||
objectives = [
|
||||
dict(objective = 'Check test cases', target='100', uom='Percent')
|
||||
]
|
||||
})
|
||||
goal_exist = frappe.db.exists("Quality Goal", {"goal": goal.goal})
|
||||
if not goal_exist:
|
||||
goal.insert()
|
||||
return goal.name
|
||||
else:
|
||||
return goal_exist
|
||||
|
||||
def get_goal():
|
||||
goal = frappe.db.exists("Quality Goal", "GOAL-_Test Quality Goal")
|
||||
return goal
|
||||
|
||||
def create_unit():
|
||||
unit = frappe.get_doc({
|
||||
"doctype": "UOM",
|
||||
"uom_name": "_Test UOM",
|
||||
})
|
||||
unit_exist = frappe.db.exists("UOM", unit.uom_name)
|
||||
if not unit_exist:
|
||||
unit.insert()
|
||||
)).insert()
|
@ -2,8 +2,5 @@
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('Quality Meeting', {
|
||||
onload: function(frm){
|
||||
frm.set_value("date", frappe.datetime.get_today());
|
||||
frm.refresh();
|
||||
}
|
||||
|
||||
});
|
||||
|
@ -1,28 +1,19 @@
|
||||
{
|
||||
"actions": [],
|
||||
"autoname": "naming_series:",
|
||||
"autoname": "format:QA-MEET-{YY}-{MM}-{DD}",
|
||||
"creation": "2018-10-15 16:25:41.548432",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"naming_series",
|
||||
"date",
|
||||
"cb_00",
|
||||
"status",
|
||||
"cb_00",
|
||||
"sb_00",
|
||||
"agenda",
|
||||
"sb_01",
|
||||
"minutes"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "date",
|
||||
"fieldtype": "Date",
|
||||
"in_list_view": 1,
|
||||
"label": "Date",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"default": "Open",
|
||||
"fieldname": "status",
|
||||
@ -55,16 +46,11 @@
|
||||
"fieldname": "sb_01",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Minutes"
|
||||
},
|
||||
{
|
||||
"fieldname": "naming_series",
|
||||
"fieldtype": "Select",
|
||||
"label": "Naming Series",
|
||||
"options": "MTNG-.YYYY.-.MM.-.DD.-"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2020-05-19 13:18:59.821740",
|
||||
"modified": "2020-10-27 16:36:45.657883",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Meeting",
|
||||
|
@ -1,23 +0,0 @@
|
||||
/* eslint-disable */
|
||||
// rename this file from _test_[name] to test_[name] to activate
|
||||
// and remove above this line
|
||||
|
||||
QUnit.test("test: Quality Meeting", function (assert) {
|
||||
let done = assert.async();
|
||||
|
||||
// number of asserts
|
||||
assert.expect(1);
|
||||
|
||||
frappe.run_serially([
|
||||
// insert a new Quality Meeting
|
||||
() => frappe.tests.make('Quality Meeting', [
|
||||
// values to be set
|
||||
{key: 'value'}
|
||||
]),
|
||||
() => {
|
||||
assert.equal(cur_frm.doc.key, 'value');
|
||||
},
|
||||
() => done()
|
||||
]);
|
||||
|
||||
});
|
@ -5,41 +5,7 @@ from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
import unittest
|
||||
from erpnext.quality_management.doctype.quality_review.test_quality_review import create_review
|
||||
|
||||
class TestQualityMeeting(unittest.TestCase):
|
||||
def test_quality_meeting(self):
|
||||
create_review()
|
||||
test_create_meeting = create_meeting()
|
||||
test_get_meeting = get_meeting()
|
||||
self.assertEquals(test_create_meeting, test_get_meeting)
|
||||
|
||||
def create_meeting():
|
||||
meeting = frappe.get_doc({
|
||||
"doctype": "Quality Meeting",
|
||||
"status": "Open",
|
||||
"date": frappe.utils.nowdate(),
|
||||
"agenda": [
|
||||
{
|
||||
"agenda": "Test Agenda"
|
||||
}
|
||||
],
|
||||
"minutes": [
|
||||
{
|
||||
"document_type": "Quality Review",
|
||||
"document_name": frappe.db.exists("Quality Review", {"goal": "GOAL-_Test Quality Goal"}),
|
||||
"minute": "Test Minute"
|
||||
}
|
||||
]
|
||||
})
|
||||
meeting_exist = frappe.db.exists("Quality Meeting", {"date": frappe.utils.nowdate(), "status": "Open"})
|
||||
|
||||
if not meeting_exist:
|
||||
meeting.insert()
|
||||
return meeting.name
|
||||
else:
|
||||
return meeting_exist
|
||||
|
||||
def get_meeting():
|
||||
meeting = frappe.db.exists("Quality Meeting", {"date": frappe.utils.nowdate(), "status": "Open"})
|
||||
return meeting
|
||||
# nothing to test
|
||||
pass
|
@ -1,19 +1,22 @@
|
||||
{
|
||||
"actions": [],
|
||||
"allow_rename": 1,
|
||||
"autoname": "format:PRC-{quality_procedure_name}",
|
||||
"autoname": "field:quality_procedure_name",
|
||||
"creation": "2018-10-06 00:06:29.756804",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"quality_procedure_name",
|
||||
"process_owner",
|
||||
"process_owner_full_name",
|
||||
"section_break_3",
|
||||
"processes",
|
||||
"sb_00",
|
||||
"parent_quality_procedure",
|
||||
"is_group",
|
||||
"sb_00",
|
||||
"processes",
|
||||
"lft",
|
||||
"rgt",
|
||||
"lft",
|
||||
"old_parent"
|
||||
],
|
||||
"fields": [
|
||||
@ -34,14 +37,14 @@
|
||||
"fieldname": "lft",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 1,
|
||||
"label": "Lft",
|
||||
"label": "Left Index",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "rgt",
|
||||
"fieldtype": "Int",
|
||||
"hidden": 1,
|
||||
"label": "Rgt",
|
||||
"label": "Right Index",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
@ -54,7 +57,7 @@
|
||||
{
|
||||
"fieldname": "sb_00",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Processes"
|
||||
"label": "Parent"
|
||||
},
|
||||
{
|
||||
"fieldname": "processes",
|
||||
@ -67,12 +70,52 @@
|
||||
"fieldtype": "Data",
|
||||
"in_list_view": 1,
|
||||
"label": "Quality Procedure",
|
||||
"reqd": 1
|
||||
"reqd": 1,
|
||||
"unique": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "process_owner",
|
||||
"fieldtype": "Link",
|
||||
"label": "Process Owner",
|
||||
"options": "User"
|
||||
},
|
||||
{
|
||||
"fieldname": "section_break_3",
|
||||
"fieldtype": "Section Break"
|
||||
},
|
||||
{
|
||||
"fetch_from": "process_owner.full_name",
|
||||
"fieldname": "process_owner_full_name",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
"label": "Process Owner Full Name",
|
||||
"print_hide": 1
|
||||
}
|
||||
],
|
||||
"is_tree": 1,
|
||||
"links": [],
|
||||
"modified": "2020-10-13 11:46:07.744194",
|
||||
"links": [
|
||||
{
|
||||
"group": "Reviews",
|
||||
"link_doctype": "Quality Review",
|
||||
"link_fieldname": "procedure"
|
||||
},
|
||||
{
|
||||
"group": "Goals",
|
||||
"link_doctype": "Quality Goal",
|
||||
"link_fieldname": "procedure"
|
||||
},
|
||||
{
|
||||
"group": "Actions",
|
||||
"link_doctype": "Quality Action",
|
||||
"link_fieldname": "procedure"
|
||||
},
|
||||
{
|
||||
"group": "Actions",
|
||||
"link_doctype": "Non Conformance",
|
||||
"link_fieldname": "procedure"
|
||||
}
|
||||
],
|
||||
"modified": "2020-10-26 15:25:39.316088",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Procedure",
|
||||
|
@ -14,69 +14,58 @@ class QualityProcedure(NestedSet):
|
||||
self.check_for_incorrect_child()
|
||||
|
||||
def on_update(self):
|
||||
NestedSet.on_update(self)
|
||||
self.set_parent()
|
||||
|
||||
def after_insert(self):
|
||||
self.set_parent()
|
||||
#if Child is Added through Tree View.
|
||||
|
||||
# add child to parent if missing
|
||||
if self.parent_quality_procedure:
|
||||
parent_quality_procedure = frappe.get_doc("Quality Procedure", self.parent_quality_procedure)
|
||||
parent_quality_procedure.append("processes", {"procedure": self.name})
|
||||
parent_quality_procedure.save()
|
||||
parent = frappe.get_doc("Quality Procedure", self.parent_quality_procedure)
|
||||
if not [d for d in parent.processes if d.procedure == self.name]:
|
||||
parent.append("processes", {"procedure": self.name, "process_description": self.name})
|
||||
parent.save()
|
||||
|
||||
def on_trash(self):
|
||||
if self.parent_quality_procedure:
|
||||
doc = frappe.get_doc("Quality Procedure", self.parent_quality_procedure)
|
||||
for process in doc.processes:
|
||||
if process.procedure == self.name:
|
||||
doc.processes.remove(process)
|
||||
doc.save(ignore_permissions=True)
|
||||
|
||||
flag_is_group = 0
|
||||
doc.load_from_db()
|
||||
|
||||
for process in doc.processes:
|
||||
flag_is_group = 1 if process.procedure else 0
|
||||
|
||||
doc.is_group = 0 if flag_is_group == 0 else 1
|
||||
doc.save(ignore_permissions=True)
|
||||
# clear from child table (sub procedures)
|
||||
frappe.db.sql('''update `tabQuality Procedure Process`
|
||||
set `procedure`='' where `procedure`=%s''', self.name)
|
||||
NestedSet.on_trash(self, allow_root_deletion=True)
|
||||
|
||||
def set_parent(self):
|
||||
rebuild_tree('Quality Procedure', 'parent_quality_procedure')
|
||||
|
||||
for process in self.processes:
|
||||
# Set parent for only those children who don't have a parent
|
||||
parent_quality_procedure = frappe.db.get_value("Quality Procedure", process.procedure, "parent_quality_procedure")
|
||||
if not parent_quality_procedure and process.procedure:
|
||||
has_parent = frappe.db.get_value("Quality Procedure", process.procedure, "parent_quality_procedure")
|
||||
if not has_parent and process.procedure:
|
||||
frappe.db.set_value(self.doctype, process.procedure, "parent_quality_procedure", self.name)
|
||||
|
||||
def check_for_incorrect_child(self):
|
||||
for process in self.processes:
|
||||
if process.procedure:
|
||||
self.is_group = 1
|
||||
# Check if any child process belongs to another parent.
|
||||
parent_quality_procedure = frappe.db.get_value("Quality Procedure", process.procedure, "parent_quality_procedure")
|
||||
if parent_quality_procedure and parent_quality_procedure != self.name:
|
||||
frappe.throw(_("{0} already has a Parent Procedure {1}.".format(frappe.bold(process.procedure), frappe.bold(parent_quality_procedure))),
|
||||
frappe.throw(_("{0} already has a Parent Procedure {1}.").format(frappe.bold(process.procedure), frappe.bold(parent_quality_procedure)),
|
||||
title=_("Invalid Child Procedure"))
|
||||
self.is_group = 1
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_children(doctype, parent=None, parent_quality_procedure=None, is_root=False):
|
||||
if parent is None or parent == "All Quality Procedures":
|
||||
parent = ""
|
||||
|
||||
return frappe.db.sql("""
|
||||
select
|
||||
name as value,
|
||||
is_group as expandable
|
||||
from
|
||||
`tab{doctype}`
|
||||
where
|
||||
ifnull(parent_quality_procedure, "")={parent}
|
||||
""".format(
|
||||
doctype = doctype,
|
||||
parent=frappe.db.escape(parent)
|
||||
), as_dict=1)
|
||||
if parent:
|
||||
parent_procedure = frappe.get_doc('Quality Procedure', parent)
|
||||
# return the list in order
|
||||
return [dict(
|
||||
value=d.procedure,
|
||||
expandable=frappe.db.get_value('Quality Procedure', d.procedure, 'is_group'))
|
||||
for d in parent_procedure.processes if d.procedure
|
||||
]
|
||||
else:
|
||||
return frappe.get_all(doctype, fields=['name as value', 'is_group as expandable'],
|
||||
filters = dict(parent_quality_procedure = parent), order_by='name asc')
|
||||
|
||||
@frappe.whitelist()
|
||||
def add_node():
|
||||
@ -88,4 +77,4 @@ def add_node():
|
||||
if args.parent_quality_procedure == 'All Quality Procedures':
|
||||
args.parent_quality_procedure = None
|
||||
|
||||
frappe.get_doc(args).insert()
|
||||
return frappe.get_doc(args).insert()
|
@ -1,20 +0,0 @@
|
||||
from frappe import _
|
||||
|
||||
def get_data():
|
||||
return {
|
||||
'fieldname': 'procedure',
|
||||
'transactions': [
|
||||
{
|
||||
'label': _('Goal'),
|
||||
'items': ['Quality Goal']
|
||||
},
|
||||
{
|
||||
'label': _('Review'),
|
||||
'items': ['Quality Review']
|
||||
},
|
||||
{
|
||||
'label': _('Action'),
|
||||
'items': ['Quality Action']
|
||||
}
|
||||
],
|
||||
}
|
@ -15,7 +15,7 @@ frappe.treeview_settings["Quality Procedure"] = {
|
||||
}
|
||||
},
|
||||
],
|
||||
breadcrumb: "Setup",
|
||||
breadcrumb: "Quality Management",
|
||||
disable_add_node: true,
|
||||
root_label: "All Quality Procedures",
|
||||
get_tree_root: false,
|
||||
|
@ -1,23 +0,0 @@
|
||||
/* eslint-disable */
|
||||
// rename this file from _test_[name] to test_[name] to activate
|
||||
// and remove above this line
|
||||
|
||||
QUnit.test("test: Quality Procedure", function (assert) {
|
||||
let done = assert.async();
|
||||
|
||||
// number of asserts
|
||||
assert.expect(1);
|
||||
|
||||
frappe.run_serially([
|
||||
// insert a new Quality Procedure
|
||||
() => frappe.tests.make('Quality Procedure', [
|
||||
// values to be set
|
||||
{key: 'value'}
|
||||
]),
|
||||
() => {
|
||||
assert.equal(cur_frm.doc.key, 'value');
|
||||
},
|
||||
() => done()
|
||||
]);
|
||||
|
||||
});
|
@ -6,54 +6,45 @@ from __future__ import unicode_literals
|
||||
import frappe
|
||||
import unittest
|
||||
|
||||
class TestQualityProcedure(unittest.TestCase):
|
||||
def test_quality_procedure(self):
|
||||
test_create_procedure = create_procedure()
|
||||
test_create_nested_procedure = create_nested_procedure()
|
||||
test_get_procedure, test_get_nested_procedure = get_procedure()
|
||||
from .quality_procedure import add_node
|
||||
|
||||
self.assertEquals(test_create_procedure, test_get_procedure.get("name"))
|
||||
self.assertEquals(test_create_nested_procedure, test_get_nested_procedure.get("name"))
|
||||
class TestQualityProcedure(unittest.TestCase):
|
||||
def test_add_node(self):
|
||||
try:
|
||||
procedure = frappe.get_doc(dict(
|
||||
doctype = 'Quality Procedure',
|
||||
quality_procedure_name = 'Test Procedure 1',
|
||||
processes = [
|
||||
dict(process_description = 'Test Step 1')
|
||||
]
|
||||
)).insert()
|
||||
|
||||
frappe.form_dict = dict(doctype = 'Quality Procedure', quality_procedure_name = 'Test Child 1',
|
||||
parent_quality_procedure = procedure.name, cmd='test', is_root='false')
|
||||
node = add_node()
|
||||
|
||||
procedure.reload()
|
||||
|
||||
self.assertEqual(procedure.is_group, 1)
|
||||
|
||||
# child row created
|
||||
self.assertTrue([d for d in procedure.processes if d.procedure == node.name])
|
||||
|
||||
node.delete()
|
||||
procedure.reload()
|
||||
|
||||
# child unset
|
||||
self.assertFalse([d for d in procedure.processes if d.name == node.name])
|
||||
|
||||
finally:
|
||||
procedure.delete()
|
||||
|
||||
def create_procedure():
|
||||
procedure = frappe.get_doc({
|
||||
"doctype": "Quality Procedure",
|
||||
"quality_procedure_name": "_Test Quality Procedure",
|
||||
"processes": [
|
||||
{
|
||||
"process_description": "_Test Quality Procedure Table",
|
||||
}
|
||||
return frappe.get_doc(dict(
|
||||
doctype = 'Quality Procedure',
|
||||
quality_procedure_name = 'Test Procedure 1',
|
||||
is_group = 1,
|
||||
processes = [
|
||||
dict(process_description = 'Test Step 1')
|
||||
]
|
||||
})
|
||||
|
||||
procedure_exist = frappe.db.exists("Quality Procedure", "PRC-_Test Quality Procedure")
|
||||
|
||||
if not procedure_exist:
|
||||
procedure.insert()
|
||||
return procedure.name
|
||||
else:
|
||||
return procedure_exist
|
||||
|
||||
def create_nested_procedure():
|
||||
nested_procedure = frappe.get_doc({
|
||||
"doctype": "Quality Procedure",
|
||||
"quality_procedure_name": "_Test Nested Quality Procedure",
|
||||
"processes": [
|
||||
{
|
||||
"procedure": "PRC-_Test Quality Procedure"
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
nested_procedure_exist = frappe.db.exists("Quality Procedure", "PRC-_Test Nested Quality Procedure")
|
||||
|
||||
if not nested_procedure_exist:
|
||||
nested_procedure.insert()
|
||||
return nested_procedure.name
|
||||
else:
|
||||
return nested_procedure_exist
|
||||
|
||||
def get_procedure():
|
||||
procedure = frappe.get_doc("Quality Procedure", "PRC-_Test Quality Procedure")
|
||||
nested_procedure = frappe.get_doc("Quality Procedure", "PRC-_Test Nested Quality Procedure")
|
||||
return {"name": procedure.name}, {"name": nested_procedure.name, "parent_quality_procedure": nested_procedure.parent_quality_procedure}
|
||||
)).insert()
|
@ -10,6 +10,7 @@
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"columns": 8,
|
||||
"fieldname": "process_description",
|
||||
"fieldtype": "Text Editor",
|
||||
"in_list_view": 1,
|
||||
@ -20,13 +21,14 @@
|
||||
"fieldname": "procedure",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Child Procedure",
|
||||
"label": "Sub Procedure",
|
||||
"options": "Quality Procedure"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"istable": 1,
|
||||
"links": [],
|
||||
"modified": "2020-06-17 15:44:38.937915",
|
||||
"modified": "2020-10-27 13:55:11.252945",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Procedure Process",
|
||||
|
@ -2,9 +2,6 @@
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('Quality Review', {
|
||||
onload: function(frm){
|
||||
frm.set_value("date", frappe.datetime.get_today());
|
||||
},
|
||||
goal: function(frm) {
|
||||
frappe.call({
|
||||
"method": "frappe.client.get",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"actions": [],
|
||||
"autoname": "format:REV-{#####}",
|
||||
"autoname": "format:QA-REV-{#####}",
|
||||
"creation": "2018-10-02 11:45:16.301955",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
@ -18,6 +18,7 @@
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"default": "Today",
|
||||
"fieldname": "date",
|
||||
"fieldtype": "Date",
|
||||
"in_list_view": 1,
|
||||
@ -50,7 +51,7 @@
|
||||
"collapsible": 1,
|
||||
"fieldname": "sb_01",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Additional Information"
|
||||
"label": "Notes"
|
||||
},
|
||||
{
|
||||
"fieldname": "reviews",
|
||||
@ -63,7 +64,8 @@
|
||||
"fieldname": "status",
|
||||
"fieldtype": "Select",
|
||||
"label": "Status",
|
||||
"options": "Open\nClosed"
|
||||
"options": "Open\nPassed\nFailed",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "goal",
|
||||
@ -74,8 +76,15 @@
|
||||
"reqd": 1
|
||||
}
|
||||
],
|
||||
"links": [],
|
||||
"modified": "2020-02-01 10:59:38.933115",
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [
|
||||
{
|
||||
"group": "Review",
|
||||
"link_doctype": "Quality Action",
|
||||
"link_fieldname": "review"
|
||||
}
|
||||
],
|
||||
"modified": "2020-10-21 12:56:47.046172",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Review",
|
||||
@ -120,5 +129,6 @@
|
||||
],
|
||||
"sort_field": "modified",
|
||||
"sort_order": "DESC",
|
||||
"title_field": "goal",
|
||||
"track_changes": 1
|
||||
}
|
@ -7,7 +7,26 @@ import frappe
|
||||
from frappe.model.document import Document
|
||||
|
||||
class QualityReview(Document):
|
||||
pass
|
||||
def validate(self):
|
||||
# fetch targets from goal
|
||||
if not self.reviews:
|
||||
for d in frappe.get_doc('Quality Goal', self.goal).objectives:
|
||||
self.append('reviews', dict(
|
||||
objective = d.objective,
|
||||
target = d.target,
|
||||
uom = d.uom
|
||||
))
|
||||
|
||||
self.set_status()
|
||||
|
||||
def set_status(self):
|
||||
# if any child item is failed, fail the parent
|
||||
if not len(self.reviews or []) or any([d.status=='Open' for d in self.reviews]):
|
||||
self.status = 'Open'
|
||||
elif any([d.status=='Failed' for d in self.reviews]):
|
||||
self.status = 'Failed'
|
||||
else:
|
||||
self.status = 'Passed'
|
||||
|
||||
def review():
|
||||
day = frappe.utils.getdate().day
|
||||
@ -24,7 +43,7 @@ def review():
|
||||
elif goal.frequency == 'Monthly' and goal.date == str(day):
|
||||
create_review(goal.name)
|
||||
|
||||
elif goal.frequency == 'Quarterly' and goal.data == str(day) and get_quarter(month):
|
||||
elif goal.frequency == 'Quarterly' and day==1 and get_quarter(month):
|
||||
create_review(goal.name)
|
||||
|
||||
def create_review(goal):
|
||||
@ -36,15 +55,6 @@ def create_review(goal):
|
||||
"date": frappe.utils.getdate()
|
||||
})
|
||||
|
||||
for objective in goal.objectives:
|
||||
review.append("reviews",
|
||||
{
|
||||
"objective": objective.objective,
|
||||
"target": objective.target,
|
||||
"uom": objective.uom
|
||||
}
|
||||
)
|
||||
|
||||
review.insert(ignore_permissions=True)
|
||||
|
||||
def get_quarter(month):
|
||||
|
@ -1,23 +0,0 @@
|
||||
/* eslint-disable */
|
||||
// rename this file from _test_[name] to test_[name] to activate
|
||||
// and remove above this line
|
||||
|
||||
QUnit.test("test: Performance Monitoring", function (assert) {
|
||||
let done = assert.async();
|
||||
|
||||
// number of asserts
|
||||
assert.expect(1);
|
||||
|
||||
frappe.run_serially([
|
||||
// insert a new Performance Monitoring
|
||||
() => frappe.tests.make('Performance Monitoring', [
|
||||
// values to be set
|
||||
{key: 'value'}
|
||||
]),
|
||||
() => {
|
||||
assert.equal(cur_frm.doc.key, 'value');
|
||||
},
|
||||
() => done()
|
||||
]);
|
||||
|
||||
});
|
@ -5,42 +5,18 @@ from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
import unittest
|
||||
from erpnext.quality_management.doctype.quality_procedure.test_quality_procedure import create_procedure
|
||||
from erpnext.quality_management.doctype.quality_goal.test_quality_goal import create_unit
|
||||
from erpnext.quality_management.doctype.quality_goal.test_quality_goal import create_goal
|
||||
|
||||
from ..quality_goal.test_quality_goal import get_quality_goal
|
||||
from .quality_review import review
|
||||
|
||||
class TestQualityReview(unittest.TestCase):
|
||||
def test_review_creation(self):
|
||||
quality_goal = get_quality_goal()
|
||||
review()
|
||||
|
||||
def test_quality_review(self):
|
||||
create_procedure()
|
||||
create_unit()
|
||||
create_goal()
|
||||
test_create_review = create_review()
|
||||
test_get_review = get_review()
|
||||
self.assertEquals(test_create_review, test_get_review)
|
||||
# check if review exists
|
||||
quality_review = frappe.get_doc('Quality Review', dict(goal = quality_goal.name))
|
||||
self.assertEqual(quality_goal.objectives[0].target, quality_review.reviews[0].target)
|
||||
quality_review.delete()
|
||||
|
||||
def create_review():
|
||||
review = frappe.get_doc({
|
||||
"doctype": "Quality Review",
|
||||
"goal": "GOAL-_Test Quality Goal",
|
||||
"procedure": "PRC-_Test Quality Procedure",
|
||||
"date": frappe.utils.nowdate(),
|
||||
"reviews": [
|
||||
{
|
||||
"objective": "_Test Quality Objective",
|
||||
"target": "100",
|
||||
"uom": "_Test UOM",
|
||||
"review": "Test Review"
|
||||
}
|
||||
]
|
||||
})
|
||||
review_exist = frappe.db.exists("Quality Review", {"goal": "GOAL-_Test Quality Goal"})
|
||||
if not review_exist:
|
||||
review.insert(ignore_permissions=True)
|
||||
return review.name
|
||||
else:
|
||||
return review_exist
|
||||
|
||||
def get_review():
|
||||
review = frappe.db.exists("Quality Review", {"goal": "GOAL-_Test Quality Goal"})
|
||||
return review
|
||||
quality_goal.delete()
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"actions": [],
|
||||
"creation": "2019-05-26 15:17:44.796958",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
@ -9,10 +10,12 @@
|
||||
"target",
|
||||
"uom",
|
||||
"sb_00",
|
||||
"status",
|
||||
"review"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"columns": 3,
|
||||
"fieldname": "objective",
|
||||
"fieldtype": "Text",
|
||||
"in_list_view": 1,
|
||||
@ -20,6 +23,7 @@
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"columns": 2,
|
||||
"fieldname": "target",
|
||||
"fieldtype": "Data",
|
||||
"in_list_view": 1,
|
||||
@ -27,6 +31,7 @@
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"columns": 1,
|
||||
"fetch_from": "target_unit",
|
||||
"fieldname": "uom",
|
||||
"fieldtype": "Link",
|
||||
@ -49,10 +54,20 @@
|
||||
{
|
||||
"fieldname": "cb_00",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"columns": 2,
|
||||
"fieldname": "status",
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"label": "Status",
|
||||
"options": "Open\nPassed\nFailed"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"istable": 1,
|
||||
"modified": "2019-05-26 16:14:12.586128",
|
||||
"links": [],
|
||||
"modified": "2020-10-27 16:28:20.908637",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Quality Management",
|
||||
"name": "Quality Review Objective",
|
||||
|
@ -14,11 +14,11 @@ from six import string_types
|
||||
def get_items(start, page_length, price_list, item_group, pos_profile, search_value=""):
|
||||
data = dict()
|
||||
result = []
|
||||
warehouse, show_only_available_items = "", False
|
||||
warehouse, hide_unavailable_items = "", False
|
||||
|
||||
allow_negative_stock = frappe.db.get_single_value('Stock Settings', 'allow_negative_stock')
|
||||
if not allow_negative_stock:
|
||||
warehouse, show_only_available_items = frappe.db.get_value('POS Profile', pos_profile, ['warehouse', 'show_only_available_items'])
|
||||
warehouse, hide_unavailable_items = frappe.db.get_value('POS Profile', pos_profile, ['warehouse', 'hide_unavailable_items'])
|
||||
|
||||
if not frappe.db.exists('Item Group', item_group):
|
||||
item_group = get_root_of('Item Group')
|
||||
@ -48,7 +48,7 @@ def get_items(start, page_length, price_list, item_group, pos_profile, search_va
|
||||
lft, rgt = frappe.db.get_value('Item Group', item_group, ['lft', 'rgt'])
|
||||
|
||||
bin_join_selection, bin_join_condition = "", ""
|
||||
if show_only_available_items:
|
||||
if hide_unavailable_items:
|
||||
bin_join_selection = ", `tabBin` bin"
|
||||
bin_join_condition = "AND bin.warehouse = %(warehouse)s AND bin.item_code = item.name AND bin.actual_qty > 0"
|
||||
|
||||
|
@ -236,7 +236,7 @@
|
||||
"index_web_pages_for_search": 1,
|
||||
"is_submittable": 1,
|
||||
"links": [],
|
||||
"modified": "2020-09-12 16:11:31.910508",
|
||||
"modified": "2020-10-21 13:03:11.938072",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Stock",
|
||||
"name": "Quality Inspection",
|
||||
@ -257,7 +257,6 @@
|
||||
"write": 1
|
||||
}
|
||||
],
|
||||
"quick_entry": 1,
|
||||
"search_fields": "item_code, report_date, reference_name",
|
||||
"show_name_in_global_search": 1,
|
||||
"sort_field": "modified",
|
||||
|
@ -6,10 +6,17 @@ import frappe
|
||||
from frappe import _
|
||||
|
||||
def execute(filters=None):
|
||||
validate_warehouse(filters)
|
||||
columns = get_columns()
|
||||
data = get_data(filters.warehouse)
|
||||
return columns, data
|
||||
|
||||
def validate_warehouse(filters):
|
||||
company = filters.company
|
||||
warehouse = filters.warehouse
|
||||
if not frappe.db.exists("Warehouse", {"name": warehouse, "company": company}):
|
||||
frappe.throw(_("Warehouse: {0} does not belong to {1}").format(warehouse, company))
|
||||
|
||||
def get_columns():
|
||||
columns = [
|
||||
{
|
||||
|
@ -45,7 +45,7 @@
|
||||
<p class='lead'>{{ education_settings.description }}</p>
|
||||
<p class="mt-4">
|
||||
{% if frappe.session.user == 'Guest' %}
|
||||
<a class="btn btn-primary btn-lg" href="'/login#signup'">{{_('Sign Up')}}</a>
|
||||
<a class="btn btn-primary btn-lg" href="/login#signup">{{_('Sign Up')}}</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
@ -62,4 +62,4 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
Loading…
x
Reference in New Issue
Block a user