From bf0f0aaf6f18a67b8297f6ea4844004f0cf62cd9 Mon Sep 17 00:00:00 2001 From: Rohan Bansal Date: Wed, 23 May 2018 15:06:45 +0530 Subject: [PATCH 1/4] Add Contract-related doctypes to ERPNext --- erpnext/crm/doctype/contract/__init__.py | 0 erpnext/crm/doctype/contract/contract.js | 22 + erpnext/crm/doctype/contract/contract.json | 1013 +++++++++++++++++ erpnext/crm/doctype/contract/contract.py | 106 ++ erpnext/crm/doctype/contract/contract_list.js | 12 + erpnext/crm/doctype/contract/test_contract.js | 23 + erpnext/crm/doctype/contract/test_contract.py | 10 + .../contract_fulfilment_checklist/__init__.py | 0 .../contract_fulfilment_checklist.js | 8 + .../contract_fulfilment_checklist.json | 219 ++++ .../contract_fulfilment_checklist.py | 10 + .../test_contract_fulfilment_checklist.js | 23 + .../test_contract_fulfilment_checklist.py | 10 + .../crm/doctype/contract_template/__init__.py | 0 .../contract_template/contract_template.js | 8 + .../contract_template/contract_template.json | 306 +++++ .../contract_template/contract_template.py | 10 + .../test_contract_template.js | 23 + .../test_contract_template.py | 10 + .../__init__.py | 0 .../contract_template_fulfilment_terms.json | 71 ++ .../contract_template_fulfilment_terms.py | 10 + erpnext/hooks.py | 3 +- 23 files changed, 1896 insertions(+), 1 deletion(-) create mode 100644 erpnext/crm/doctype/contract/__init__.py create mode 100644 erpnext/crm/doctype/contract/contract.js create mode 100755 erpnext/crm/doctype/contract/contract.json create mode 100644 erpnext/crm/doctype/contract/contract.py create mode 100644 erpnext/crm/doctype/contract/contract_list.js create mode 100644 erpnext/crm/doctype/contract/test_contract.js create mode 100644 erpnext/crm/doctype/contract/test_contract.py create mode 100644 erpnext/crm/doctype/contract_fulfilment_checklist/__init__.py create mode 100644 erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.js create mode 100644 erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.json create mode 100644 erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.py create mode 100644 erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.js create mode 100644 erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.py create mode 100644 erpnext/crm/doctype/contract_template/__init__.py create mode 100644 erpnext/crm/doctype/contract_template/contract_template.js create mode 100644 erpnext/crm/doctype/contract_template/contract_template.json create mode 100644 erpnext/crm/doctype/contract_template/contract_template.py create mode 100644 erpnext/crm/doctype/contract_template/test_contract_template.js create mode 100644 erpnext/crm/doctype/contract_template/test_contract_template.py create mode 100644 erpnext/crm/doctype/contract_template_fulfilment_terms/__init__.py create mode 100644 erpnext/crm/doctype/contract_template_fulfilment_terms/contract_template_fulfilment_terms.json create mode 100644 erpnext/crm/doctype/contract_template_fulfilment_terms/contract_template_fulfilment_terms.py diff --git a/erpnext/crm/doctype/contract/__init__.py b/erpnext/crm/doctype/contract/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/crm/doctype/contract/contract.js b/erpnext/crm/doctype/contract/contract.js new file mode 100644 index 0000000000..1b3700ef59 --- /dev/null +++ b/erpnext/crm/doctype/contract/contract.js @@ -0,0 +1,22 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +cur_frm.add_fetch("contract_template", "contract_terms", "contract_terms"); +cur_frm.add_fetch("contract_template", "requires_fulfilment", "requires_fulfilment"); + +// Add fulfilment terms from contract template into contract +frappe.ui.form.on("Contract", { + contract_template: function (frm) { + // Populate the fulfilment terms table from a contract template, if any + frappe.model.with_doc("Contract Template", frm.doc.contract_template, function () { + var tabletransfer = frappe.model.get_doc("Contract Template", frm.doc.contract_template); + + frm.doc.fulfilment_terms = []; + $.each(tabletransfer.fulfilment_terms, function (index, row) { + var d = frm.add_child("fulfilment_terms"); + d.requirement = row.requirement; + frm.refresh_field("fulfilment_terms"); + }); + }); + } +}); diff --git a/erpnext/crm/doctype/contract/contract.json b/erpnext/crm/doctype/contract/contract.json new file mode 100755 index 0000000000..31b7723d28 --- /dev/null +++ b/erpnext/crm/doctype/contract/contract.json @@ -0,0 +1,1013 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "", + "beta": 0, + "creation": "2018-04-12 06:32:04.582486", + "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, + "default": "Customer", + "fieldname": "party_type", + "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": "Party Type", + "length": 0, + "no_copy": 0, + "options": "Customer\nSupplier\nEmployee", + "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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_signed", + "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": "Signed", + "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": "cb_party", + "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": "party_name", + "fieldtype": "Dynamic 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": 1, + "label": "Party Name", + "length": 0, + "no_copy": 0, + "options": "party_type", + "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, + "depends_on": "", + "fieldname": "party_user", + "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": "Party User", + "length": 0, + "no_copy": 0, + "options": "User", + "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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "status", + "fieldtype": "Select", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "Unsigned\nActive\nInactive", + "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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "fulfilment_status", + "fieldtype": "Select", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Fulfilment Status", + "length": 0, + "no_copy": 0, + "options": "N/A\nUnfulfilled\nPartially Fulfilled\nFulfilled\nLapsed", + "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": "sb_terms", + "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": "Contract Period", + "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": 0, + "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": 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": "cb_date", + "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": "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": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": "", + "columns": 0, + "depends_on": "eval:doc.is_signed==1", + "fieldname": "sb_signee", + "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": "Signee 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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "signee", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Signee", + "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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "signed_on", + "fieldtype": "Datetime", + "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": "Signed On", + "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": "cb_user", + "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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "ip_address", + "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": "IP Address", + "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": 1, + "collapsible_depends_on": "eval:doc.docstatus==0", + "columns": 0, + "fieldname": "sb_contract", + "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": "Contract 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, + "fieldname": "contract_template", + "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": "Contract Template", + "length": 0, + "no_copy": 0, + "options": "Contract Template", + "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": "contract_terms", + "fieldtype": "Text Editor", + "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": "Contract Terms", + "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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "contract_display", + "fieldtype": "Text Editor", + "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": "Contract Display", + "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": "sb_fulfilment", + "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": "Fulfilment 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, + "fieldname": "requires_fulfilment", + "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": "Requires Fulfilment", + "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, + "depends_on": "eval:doc.requires_fulfilment==1", + "fieldname": "fulfilment_deadline", + "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": "Fulfilment Deadline", + "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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.requires_fulfilment==1", + "fieldname": "fulfilment_terms", + "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": "Fulfilment Terms", + "length": 0, + "no_copy": 0, + "options": "Contract Fulfilment Checklist", + "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": 1, + "columns": 0, + "fieldname": "sb_references", + "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": "References", + "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": "", + "depends_on": "", + "fieldname": "document_type", + "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": "Document Type", + "length": 0, + "no_copy": 0, + "options": "\nQuotation\nProject\nSales Order\nPurchase Order\nSales Invoice\nPurchase Invoice", + "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": "cb_links", + "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, + "depends_on": "", + "fieldname": "document_name", + "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Document Name", + "length": 0, + "no_copy": 0, + "options": "document_type", + "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": "amended_from", + "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": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Contract", + "permlevel": 0, + "print_hide": 1, + "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": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-05-03 03:29:54.877041", + "modified_by": "Administrator", + "module": "CRM", + "name": "Contract", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "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": 1, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 1, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "", + "track_changes": 1, + "track_seen": 1 +} \ No newline at end of file diff --git a/erpnext/crm/doctype/contract/contract.py b/erpnext/crm/doctype/contract/contract.py new file mode 100644 index 0000000000..89b59cb478 --- /dev/null +++ b/erpnext/crm/doctype/contract/contract.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals + +import frappe +from frappe import _ +from frappe.model.document import Document +from frappe.utils import getdate, now_datetime, nowdate + + +class Contract(Document): + def autoname(self): + name = self.party_name + + if self.contract_template: + name += " - {} Agreement".format(self.contract_template) + + self.name = name + + def validate(self): + self.validate_dates() + self.update_contract_status() + self.update_fulfilment_status() + self.set_contract_display() + + def before_update_after_submit(self): + self.update_contract_status() + self.update_fulfilment_status() + self.set_contract_display() + + def validate_dates(self): + if self.end_date and self.end_date < self.start_date: + frappe.throw("End Date cannot be before Start Date!") + + def update_contract_status(self): + if self.is_signed: + self.status = get_status(self.start_date, self.end_date) + else: + self.status = "Unsigned" + + def update_fulfilment_status(self): + fulfilment_status = "N/A" + + if self.requires_fulfilment: + fulfilment_progress = self.get_fulfilment_progress() + + if not fulfilment_progress: + fulfilment_status = "Unfulfilled" + elif fulfilment_progress < len(self.fulfilment_terms): + fulfilment_status = "Partially Unfulfilled" + elif fulfilment_progress == len(self.fulfilment_terms): + fulfilment_status = "Fulfilled" + + if fulfilment_status != "Fulfilled" and self.fulfilment_deadline: + now_date = getdate(nowdate()) + deadline_date = getdate(self.fulfilment_deadline) + + if now_date > deadline_date: + fulfilment_status = "Lapsed" + + self.fulfilment_status = fulfilment_status + + def set_contract_display(self): + self.contract_display = frappe.render_template(self.contract_terms, {"doc": self}) + + def get_fulfilment_progress(self): + return len([term for term in self.fulfilment_terms if term.fulfilled]) + + +def get_status(start_date, end_date): + """ + Get a Contract's status based on the start, current and end dates + + Args: + start_date (str): The start date of the contract + end_date (str): The end date of the contract + + Returns: + str: 'Active' if within range, otherwise 'Inactive' + """ + + if not end_date: + return "Active" + + start_date = getdate(start_date) + end_date = getdate(end_date) + now_date = getdate(nowdate()) + + return "Active" if start_date < now_date < end_date else "Inactive" + + +def update_status_for_contracts(): + """ + Run the daily hook to update the statuses for all signed + and submitted Contracts + """ + + contracts = frappe.get_all("Contract", filters={"is_signed": True, "docstatus": 1}, fields=["name", "start_date", "end_date"]) + + for contract in contracts: + status = get_status(contract.get("start_date"), + contract.get("end_date")) + + frappe.db.set_value("Contract", contract.get("name"), "status", status) diff --git a/erpnext/crm/doctype/contract/contract_list.js b/erpnext/crm/doctype/contract/contract_list.js new file mode 100644 index 0000000000..2ef59007f4 --- /dev/null +++ b/erpnext/crm/doctype/contract/contract_list.js @@ -0,0 +1,12 @@ +frappe.listview_settings['Contract'] = { + add_fields: ["status"], + get_indicator: function (doc) { + if (doc.status == "Unsigned") { + return [__(doc.status), "red", "status,=," + doc.status]; + } else if (doc.status == "Active") { + return [__(doc.status), "green", "status,=," + doc.status]; + } else if (doc.status == "Inactive") { + return [__(doc.status), "darkgrey", "status,=," + doc.status]; + } + }, +}; \ No newline at end of file diff --git a/erpnext/crm/doctype/contract/test_contract.js b/erpnext/crm/doctype/contract/test_contract.js new file mode 100644 index 0000000000..4c77c3d649 --- /dev/null +++ b/erpnext/crm/doctype/contract/test_contract.js @@ -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: Contract", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Contract + () => frappe.tests.make('Contract', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/crm/doctype/contract/test_contract.py b/erpnext/crm/doctype/contract/test_contract.py new file mode 100644 index 0000000000..a77fc6cd9b --- /dev/null +++ b/erpnext/crm/doctype/contract/test_contract.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestContract(unittest.TestCase): + pass diff --git a/erpnext/crm/doctype/contract_fulfilment_checklist/__init__.py b/erpnext/crm/doctype/contract_fulfilment_checklist/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.js b/erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.js new file mode 100644 index 0000000000..f0525b13e2 --- /dev/null +++ b/erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Contract Fulfilment Checklist', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.json b/erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.json new file mode 100644 index 0000000000..4a22dcee18 --- /dev/null +++ b/erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.json @@ -0,0 +1,219 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-16 06:51:33.320037", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "fulfilled", + "fieldtype": "Check", + "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": "Fulfilled", + "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": "cb_notes", + "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": "requirement", + "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": "Requirement", + "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": "sb_notes", + "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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "notes", + "fieldtype": "Text", + "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": "Notes", + "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": "amended_from", + "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": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Contract Fulfilment Checklist", + "permlevel": 0, + "print_hide": 1, + "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": 1, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-04-16 08:27:25.156332", + "modified_by": "Administrator", + "module": "CRM", + "name": "Contract Fulfilment Checklist", + "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 +} \ No newline at end of file diff --git a/erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.py b/erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.py new file mode 100644 index 0000000000..6039035727 --- /dev/null +++ b/erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, 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 ContractFulfilmentChecklist(Document): + pass diff --git a/erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.js b/erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.js new file mode 100644 index 0000000000..2a2d5e1bfc --- /dev/null +++ b/erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.js @@ -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: Contract Fulfilment Checklist", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Contract Fulfilment Checklist + () => frappe.tests.make('Contract Fulfilment Checklist', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.py b/erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.py new file mode 100644 index 0000000000..c78796be6b --- /dev/null +++ b/erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestContractFulfilmentChecklist(unittest.TestCase): + pass diff --git a/erpnext/crm/doctype/contract_template/__init__.py b/erpnext/crm/doctype/contract_template/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/crm/doctype/contract_template/contract_template.js b/erpnext/crm/doctype/contract_template/contract_template.js new file mode 100644 index 0000000000..4f7c9a8dc9 --- /dev/null +++ b/erpnext/crm/doctype/contract_template/contract_template.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Contract Template', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/crm/doctype/contract_template/contract_template.json b/erpnext/crm/doctype/contract_template/contract_template.json new file mode 100644 index 0000000000..b883ce20c9 --- /dev/null +++ b/erpnext/crm/doctype/contract_template/contract_template.json @@ -0,0 +1,306 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "field:title", + "beta": 0, + "creation": "2018-04-16 06:44:48.791312", + "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": "title", + "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": "Title", + "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": "sb_terms", + "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": "", + "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": "contract_terms", + "fieldtype": "Text Editor", + "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": "Contract Terms and Conditions", + "length": 0, + "no_copy": 0, + "options": "", + "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": "sb_fulfilment", + "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": "", + "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": "requires_fulfilment", + "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": "Requires Fulfilment", + "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, + "depends_on": "eval:doc.requires_fulfilment==1", + "fieldname": "fulfilment_terms", + "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": "Fulfilment Terms and Conditions", + "length": 0, + "no_copy": 0, + "options": "Contract Template Fulfilment Terms", + "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": "2018-04-17 07:36:05.217599", + "modified_by": "Administrator", + "module": "CRM", + "name": "Contract Template", + "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 + }, + { + "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": "Sales Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "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": "Purchase Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "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": "HR 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": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/crm/doctype/contract_template/contract_template.py b/erpnext/crm/doctype/contract_template/contract_template.py new file mode 100644 index 0000000000..601ee9a28b --- /dev/null +++ b/erpnext/crm/doctype/contract_template/contract_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, 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 ContractTemplate(Document): + pass diff --git a/erpnext/crm/doctype/contract_template/test_contract_template.js b/erpnext/crm/doctype/contract_template/test_contract_template.js new file mode 100644 index 0000000000..6aaddd7df4 --- /dev/null +++ b/erpnext/crm/doctype/contract_template/test_contract_template.js @@ -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: Contract Template", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Contract Template + () => frappe.tests.make('Contract Template', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/crm/doctype/contract_template/test_contract_template.py b/erpnext/crm/doctype/contract_template/test_contract_template.py new file mode 100644 index 0000000000..b2b0db66a5 --- /dev/null +++ b/erpnext/crm/doctype/contract_template/test_contract_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestContractTemplate(unittest.TestCase): + pass diff --git a/erpnext/crm/doctype/contract_template_fulfilment_terms/__init__.py b/erpnext/crm/doctype/contract_template_fulfilment_terms/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/crm/doctype/contract_template_fulfilment_terms/contract_template_fulfilment_terms.json b/erpnext/crm/doctype/contract_template_fulfilment_terms/contract_template_fulfilment_terms.json new file mode 100644 index 0000000000..a84dfee977 --- /dev/null +++ b/erpnext/crm/doctype/contract_template_fulfilment_terms/contract_template_fulfilment_terms.json @@ -0,0 +1,71 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-04-16 06:46:48.636936", + "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": "requirement", + "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": "Requirement", + "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": "2018-04-16 07:17:38.060049", + "modified_by": "Administrator", + "module": "CRM", + "name": "Contract Template Fulfilment Terms", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 0, + "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 +} \ No newline at end of file diff --git a/erpnext/crm/doctype/contract_template_fulfilment_terms/contract_template_fulfilment_terms.py b/erpnext/crm/doctype/contract_template_fulfilment_terms/contract_template_fulfilment_terms.py new file mode 100644 index 0000000000..767b1901ab --- /dev/null +++ b/erpnext/crm/doctype/contract_template_fulfilment_terms/contract_template_fulfilment_terms.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, 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 ContractTemplateFulfilmentTerms(Document): + pass diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 815e2ebc2a..ca467b5a9a 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -235,7 +235,8 @@ scheduler_events = { "erpnext.setup.doctype.company.company.cache_companies_monthly_sales_history", "erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_latest_price_in_all_boms", "erpnext.assets.doctype.asset.asset.update_maintenance_status", - "erpnext.assets.doctype.asset.asset.make_post_gl_entry" + "erpnext.assets.doctype.asset.asset.make_post_gl_entry", + "erpnext.crm.doctype.contract.contract.update_status_for_contracts" ], "monthly": [ "erpnext.accounts.doctype.sales_invoice.sales_invoice.booked_deferred_revenue", From 841d54c49d01f1f394c8bab09c3cf151eca773bf Mon Sep 17 00:00:00 2001 From: Rohan Bansal Date: Wed, 30 May 2018 12:19:04 +0530 Subject: [PATCH 2/4] Start adding tests for contracts --- erpnext/crm/doctype/contract/contract.py | 16 ++- erpnext/crm/doctype/contract/test_contract.py | 104 +++++++++++++++++- .../crm/doctype/contract/test_records.json | 20 ++++ .../contract_template/test_records.json | 31 ++++++ 4 files changed, 165 insertions(+), 6 deletions(-) create mode 100644 erpnext/crm/doctype/contract/test_records.json create mode 100644 erpnext/crm/doctype/contract_template/test_records.json diff --git a/erpnext/crm/doctype/contract/contract.py b/erpnext/crm/doctype/contract/contract.py index 89b59cb478..e2ff62d62a 100644 --- a/erpnext/crm/doctype/contract/contract.py +++ b/erpnext/crm/doctype/contract/contract.py @@ -17,7 +17,12 @@ class Contract(Document): if self.contract_template: name += " - {} Agreement".format(self.contract_template) - self.name = name + # If identical, append contract name with the next number in the iteration + if frappe.db.exists("Contract", name): + count = len(frappe.get_all("Contract", filters={"name": ["like", "%{}%".format(name)]})) + name = "{} - {}".format(name, count) + + self.name = _(name) def validate(self): self.validate_dates() @@ -32,7 +37,7 @@ class Contract(Document): def validate_dates(self): if self.end_date and self.end_date < self.start_date: - frappe.throw("End Date cannot be before Start Date!") + frappe.throw(_("End Date cannot be before Start Date!")) def update_contract_status(self): if self.is_signed: @@ -49,7 +54,7 @@ class Contract(Document): if not fulfilment_progress: fulfilment_status = "Unfulfilled" elif fulfilment_progress < len(self.fulfilment_terms): - fulfilment_status = "Partially Unfulfilled" + fulfilment_status = "Partially Fulfilled" elif fulfilment_progress == len(self.fulfilment_terms): fulfilment_status = "Fulfilled" @@ -97,7 +102,10 @@ def update_status_for_contracts(): and submitted Contracts """ - contracts = frappe.get_all("Contract", filters={"is_signed": True, "docstatus": 1}, fields=["name", "start_date", "end_date"]) + contracts = frappe.get_all("Contract", + filters={"is_signed": True, + "docstatus": 1}, + fields=["name", "start_date", "end_date"]) for contract in contracts: status = get_status(contract.get("start_date"), diff --git a/erpnext/crm/doctype/contract/test_contract.py b/erpnext/crm/doctype/contract/test_contract.py index a77fc6cd9b..2b5c875d4d 100644 --- a/erpnext/crm/doctype/contract/test_contract.py +++ b/erpnext/crm/doctype/contract/test_contract.py @@ -3,8 +3,108 @@ # See license.txt from __future__ import unicode_literals -import frappe import unittest +import frappe +from frappe.test_runner import make_test_records +from frappe.utils import add_days, nowdate + +contract_test_records = frappe.get_test_records('Contract') +make_test_records('Contract Template') +make_test_records("Customer", force=True) + + class TestContract(unittest.TestCase): - pass + def setUp(self): + self.contract_doc = frappe.copy_doc(contract_test_records[0]) + + template_with_requirements = frappe.get_all("Contract Template", filters={"requires_fulfilment": 1}) + self.contract_template_with_requirements = template_with_requirements[0].name + + template_without_requirements = frappe.get_all("Contract Template", filters={"requires_fulfilment": 0}) + self.contract_template_without_requirements = template_without_requirements[0].name + + def test_validate_start_date_before_end_date(self): + self.contract_doc.start_date = nowdate() + self.contract_doc.end_date = add_days(nowdate(), -1) + + self.assertRaises(frappe.ValidationError, self.contract_doc.insert) + + def test_unsigned_contract_status(self): + self.contract_doc.insert() + + self.assertEqual(self.contract_doc.status, "Unsigned") + + def test_active_signed_contract_status(self): + self.contract_doc.is_signed = True + self.contract_doc.start_date = add_days(nowdate(), -1) + self.contract_doc.end_date = add_days(nowdate(), 1) + self.contract_doc.insert() + + self.assertEqual(self.contract_doc.status, "Active") + + def test_past_inactive_signed_contract_status(self): + self.contract_doc.is_signed = True + self.contract_doc.start_date = add_days(nowdate(), -2) + self.contract_doc.end_date = add_days(nowdate(), -1) + self.contract_doc.insert() + + self.assertEqual(self.contract_doc.status, "Inactive") + + def test_future_inactive_signed_contract_status(self): + self.contract_doc.is_signed = True + self.contract_doc.start_date = add_days(nowdate(), 1) + self.contract_doc.end_date = add_days(nowdate(), 2) + self.contract_doc.insert() + + self.assertEqual(self.contract_doc.status, "Inactive") + + def test_contract_status_with_no_fulfilment_terms(self): + self.contract_doc.contract_terms = self.contract_template_without_requirements + self.contract_doc.insert() + + self.assertEqual(self.contract_doc.fulfilment_status, "N/A") + + def test_unfulfilled_contract_status(self): + self.contract_doc.contract_terms = self.contract_template_with_requirements + self.contract_doc.save() + self.contract_doc.insert() + + self.contract_doc.reload() + + self.assertEqual(self.contract_doc.fulfilment_status, "Unfulfilled") + + def test_fulfilled_contract_status(self): + self.contract_doc.contract_terms = self.contract_template_with_requirements + self.contract_doc.save() + self.contract_doc.insert() + + self.contract_doc.reload() + + # Mark all the terms as fulfilled + for term in self.contract_doc.fulfilment_terms: + term.fulfilled = 1 + + self.contract_doc.save() + + self.assertEqual(self.contract_doc.fulfilment_status, "Fulfilled") + + def test_partially_fulfilled_contract_status(self): + self.contract_doc.contract_terms = self.contract_template_with_requirements + self.contract_doc.insert() + + self.contract_doc.reload() + + # Mark only the first term as fulfilled + self.contract_doc.fulfilment_terms[0].fulfilled = 1 + self.contract_doc.save() + + self.assertEqual(self.contract_doc.fulfilment_status, "Partially Fulfilled") + + def test_lapsed_contract_status(self): + self.contract_doc.contract_terms = self.contract_template_with_requirements + self.contract_doc.insert() + + self.contract_doc.reload() + + self.assertEqual(self.contract_doc.fulfilment_status, "Lapsed") diff --git a/erpnext/crm/doctype/contract/test_records.json b/erpnext/crm/doctype/contract/test_records.json new file mode 100644 index 0000000000..23cc3bb82c --- /dev/null +++ b/erpnext/crm/doctype/contract/test_records.json @@ -0,0 +1,20 @@ +[ + { + "doctype": "Contract", + "party_type": "Customer", + "party_name": "_Test Customer", + "contract_terms": "This is a test customer contract." + }, + { + "doctype": "Contract", + "party_type": "Supplier", + "party_name": "_Test Supplier", + "contract_terms": "This is a test supplier contract." + }, + { + "doctype": "Contract", + "party_type": "Employee", + "party_name": "_Test Employee", + "contract_terms": "This is a test employee contract." + } +] \ No newline at end of file diff --git a/erpnext/crm/doctype/contract_template/test_records.json b/erpnext/crm/doctype/contract_template/test_records.json new file mode 100644 index 0000000000..341b1cf107 --- /dev/null +++ b/erpnext/crm/doctype/contract_template/test_records.json @@ -0,0 +1,31 @@ +[ + { + "doctype": "Contract Template", + "title": "_Test Customer Contract", + "contract_terms": "This is a test customer contract." + }, + { + "doctype": "Contract Template", + "title": "_Test Customer Contract with Requirements", + "contract_terms": "This is a test customer contract.", + "requires_fulfilment": 1, + "fulfilment_terms": [ + { + "requirement": "This is a test requirement." + }, + { + "requirement": "This is another test requirement." + } + ] + }, + { + "doctype": "Contract Template", + "title": "_Test Supplier Contract", + "contract_terms": "This is a test supplier contract." + }, + { + "doctype": "Contract Template", + "title": "_Test Employee Contract", + "contract_terms": "This is a test employee contract." + } +] \ No newline at end of file From f3335364465ee72d17ef263438699fdb5d118413 Mon Sep 17 00:00:00 2001 From: Shreya Date: Thu, 14 Jun 2018 16:25:16 +0530 Subject: [PATCH 3/4] Remove test_records.json and modify test --- erpnext/crm/doctype/contract/test_contract.py | 75 +++++++++++-------- .../crm/doctype/contract/test_records.json | 20 ----- .../contract_template/test_records.json | 31 -------- 3 files changed, 42 insertions(+), 84 deletions(-) delete mode 100644 erpnext/crm/doctype/contract/test_records.json delete mode 100644 erpnext/crm/doctype/contract_template/test_records.json diff --git a/erpnext/crm/doctype/contract/test_contract.py b/erpnext/crm/doctype/contract/test_contract.py index 2b5c875d4d..d5f4e71bff 100644 --- a/erpnext/crm/doctype/contract/test_contract.py +++ b/erpnext/crm/doctype/contract/test_contract.py @@ -6,23 +6,13 @@ from __future__ import unicode_literals import unittest import frappe -from frappe.test_runner import make_test_records from frappe.utils import add_days, nowdate -contract_test_records = frappe.get_test_records('Contract') -make_test_records('Contract Template') -make_test_records("Customer", force=True) - - class TestContract(unittest.TestCase): + def setUp(self): - self.contract_doc = frappe.copy_doc(contract_test_records[0]) - - template_with_requirements = frappe.get_all("Contract Template", filters={"requires_fulfilment": 1}) - self.contract_template_with_requirements = template_with_requirements[0].name - - template_without_requirements = frappe.get_all("Contract Template", filters={"requires_fulfilment": 0}) - self.contract_template_without_requirements = template_without_requirements[0].name + frappe.db.sql("delete from `tabContract`") + self.contract_doc = get_contract() def test_validate_start_date_before_end_date(self): self.contract_doc.start_date = nowdate() @@ -32,7 +22,6 @@ class TestContract(unittest.TestCase): def test_unsigned_contract_status(self): self.contract_doc.insert() - self.assertEqual(self.contract_doc.status, "Unsigned") def test_active_signed_contract_status(self): @@ -60,28 +49,29 @@ class TestContract(unittest.TestCase): self.assertEqual(self.contract_doc.status, "Inactive") def test_contract_status_with_no_fulfilment_terms(self): - self.contract_doc.contract_terms = self.contract_template_without_requirements + self.contract_doc.contract_term = "_Test Customer Contract" self.contract_doc.insert() self.assertEqual(self.contract_doc.fulfilment_status, "N/A") def test_unfulfilled_contract_status(self): - self.contract_doc.contract_terms = self.contract_template_with_requirements + self.contract_doc.contract_term = "_Test Customer Contract with Requirements" + self.contract_doc.requires_fulfilment = 1 self.contract_doc.save() - self.contract_doc.insert() - - self.contract_doc.reload() - self.assertEqual(self.contract_doc.fulfilment_status, "Unfulfilled") def test_fulfilled_contract_status(self): - self.contract_doc.contract_terms = self.contract_template_with_requirements - self.contract_doc.save() - self.contract_doc.insert() - - self.contract_doc.reload() + self.contract_doc.contract_terms = "_Test Customer Contract with Requirements" # Mark all the terms as fulfilled + self.contract_doc.requires_fulfilment = 1 + fulfilment_terms = [] + fulfilment_terms.append({ + "requirement": "This is a test requirement.", + "fulfilled": 0 + }) + self.contract_doc.set("fulfilment_terms", fulfilment_terms) + for term in self.contract_doc.fulfilment_terms: term.fulfilled = 1 @@ -90,21 +80,40 @@ class TestContract(unittest.TestCase): self.assertEqual(self.contract_doc.fulfilment_status, "Fulfilled") def test_partially_fulfilled_contract_status(self): - self.contract_doc.contract_terms = self.contract_template_with_requirements - self.contract_doc.insert() - - self.contract_doc.reload() + self.contract_doc.contract_terms = "_Test Customer Contract with Requirements" + self.contract_doc.requires_fulfilment = 1 # Mark only the first term as fulfilled + self.contract_doc.save() + fulfilment_terms = [] + fulfilment_terms.append({ + "requirement": "This is a test requirement.", + "fulfilled": 0 + }) + fulfilment_terms.append({ + "requirement": "This is another test requirement.", + "fulfilled": 0 + }) + + self.contract_doc.set("fulfilment_terms", fulfilment_terms) self.contract_doc.fulfilment_terms[0].fulfilled = 1 self.contract_doc.save() self.assertEqual(self.contract_doc.fulfilment_status, "Partially Fulfilled") def test_lapsed_contract_status(self): - self.contract_doc.contract_terms = self.contract_template_with_requirements - self.contract_doc.insert() - - self.contract_doc.reload() + self.contract_doc.contract_term = "_Test Customer Contract with Requirements" + self.contract_doc.start_date = add_days(nowdate(), -2) + self.contract_doc.end_date = add_days(nowdate(), 1) + self.contract_doc.requires_fulfilment = 1 + self.contract_doc.fulfilment_deadline = add_days(nowdate(), -1) + self.contract_doc.save() self.assertEqual(self.contract_doc.fulfilment_status, "Lapsed") + +def get_contract(): + doc = frappe.new_doc("Contract") + doc.party_type = "Customer" + doc.party_name = "_Test Customer" + doc.contract_terms = "This is a test customer contract." + return doc diff --git a/erpnext/crm/doctype/contract/test_records.json b/erpnext/crm/doctype/contract/test_records.json deleted file mode 100644 index 23cc3bb82c..0000000000 --- a/erpnext/crm/doctype/contract/test_records.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "doctype": "Contract", - "party_type": "Customer", - "party_name": "_Test Customer", - "contract_terms": "This is a test customer contract." - }, - { - "doctype": "Contract", - "party_type": "Supplier", - "party_name": "_Test Supplier", - "contract_terms": "This is a test supplier contract." - }, - { - "doctype": "Contract", - "party_type": "Employee", - "party_name": "_Test Employee", - "contract_terms": "This is a test employee contract." - } -] \ No newline at end of file diff --git a/erpnext/crm/doctype/contract_template/test_records.json b/erpnext/crm/doctype/contract_template/test_records.json deleted file mode 100644 index 341b1cf107..0000000000 --- a/erpnext/crm/doctype/contract_template/test_records.json +++ /dev/null @@ -1,31 +0,0 @@ -[ - { - "doctype": "Contract Template", - "title": "_Test Customer Contract", - "contract_terms": "This is a test customer contract." - }, - { - "doctype": "Contract Template", - "title": "_Test Customer Contract with Requirements", - "contract_terms": "This is a test customer contract.", - "requires_fulfilment": 1, - "fulfilment_terms": [ - { - "requirement": "This is a test requirement." - }, - { - "requirement": "This is another test requirement." - } - ] - }, - { - "doctype": "Contract Template", - "title": "_Test Supplier Contract", - "contract_terms": "This is a test supplier contract." - }, - { - "doctype": "Contract Template", - "title": "_Test Employee Contract", - "contract_terms": "This is a test employee contract." - } -] \ No newline at end of file From cdd3982b4447a6e4b363b62fe0102dde261daaeb Mon Sep 17 00:00:00 2001 From: Shreya Date: Thu, 14 Jun 2018 16:26:15 +0530 Subject: [PATCH 4/4] [minor] Fix --- erpnext/crm/doctype/contract/contract.js | 18 +++-- erpnext/crm/doctype/contract/contract.json | 93 +++++++++++++--------- erpnext/crm/doctype/contract/contract.py | 7 +- 3 files changed, 68 insertions(+), 50 deletions(-) diff --git a/erpnext/crm/doctype/contract/contract.js b/erpnext/crm/doctype/contract/contract.js index 1b3700ef59..ee9e895130 100644 --- a/erpnext/crm/doctype/contract/contract.js +++ b/erpnext/crm/doctype/contract/contract.js @@ -8,15 +8,17 @@ cur_frm.add_fetch("contract_template", "requires_fulfilment", "requires_fulfilme frappe.ui.form.on("Contract", { contract_template: function (frm) { // Populate the fulfilment terms table from a contract template, if any - frappe.model.with_doc("Contract Template", frm.doc.contract_template, function () { - var tabletransfer = frappe.model.get_doc("Contract Template", frm.doc.contract_template); + if (frm.doc.contract_template) { + frappe.model.with_doc("Contract Template", frm.doc.contract_template, function () { + var tabletransfer = frappe.model.get_doc("Contract Template", frm.doc.contract_template); - frm.doc.fulfilment_terms = []; - $.each(tabletransfer.fulfilment_terms, function (index, row) { - var d = frm.add_child("fulfilment_terms"); - d.requirement = row.requirement; - frm.refresh_field("fulfilment_terms"); + frm.doc.fulfilment_terms = []; + $.each(tabletransfer.fulfilment_terms, function (index, row) { + var d = frm.add_child("fulfilment_terms"); + d.requirement = row.requirement; + frm.refresh_field("fulfilment_terms"); + }); }); - }); + } } }); diff --git a/erpnext/crm/doctype/contract/contract.json b/erpnext/crm/doctype/contract/contract.json index 31b7723d28..d48cc3762c 100755 --- a/erpnext/crm/doctype/contract/contract.json +++ b/erpnext/crm/doctype/contract/contract.json @@ -15,6 +15,7 @@ "fields": [ { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -43,10 +44,12 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -73,10 +76,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -102,10 +107,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -133,10 +140,12 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -165,10 +174,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -196,10 +207,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -227,10 +240,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -257,10 +272,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -287,10 +304,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -316,10 +335,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -346,10 +367,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -378,10 +401,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -409,10 +434,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -440,10 +467,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -469,10 +498,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -500,10 +531,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -531,10 +564,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -562,10 +597,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -592,41 +629,12 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "contract_display", - "fieldtype": "Text Editor", - "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": "Contract Display", - "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_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -653,10 +661,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -683,10 +693,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -714,10 +726,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -746,10 +760,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -776,10 +792,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -809,10 +827,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -838,10 +858,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -870,10 +892,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -900,6 +924,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -913,7 +938,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-03 03:29:54.877041", + "modified": "2018-06-14 12:47:10.142988", "modified_by": "Administrator", "module": "CRM", "name": "Contract", @@ -922,7 +947,6 @@ "permissions": [ { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -942,7 +966,6 @@ }, { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -962,7 +985,6 @@ }, { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, @@ -982,7 +1004,6 @@ }, { "amend": 1, - "apply_user_permissions": 0, "cancel": 1, "create": 1, "delete": 1, diff --git a/erpnext/crm/doctype/contract/contract.py b/erpnext/crm/doctype/contract/contract.py index e2ff62d62a..64cc97b503 100644 --- a/erpnext/crm/doctype/contract/contract.py +++ b/erpnext/crm/doctype/contract/contract.py @@ -28,16 +28,14 @@ class Contract(Document): self.validate_dates() self.update_contract_status() self.update_fulfilment_status() - self.set_contract_display() def before_update_after_submit(self): self.update_contract_status() self.update_fulfilment_status() - self.set_contract_display() def validate_dates(self): if self.end_date and self.end_date < self.start_date: - frappe.throw(_("End Date cannot be before Start Date!")) + frappe.throw(_("End Date cannot be before Start Date.")) def update_contract_status(self): if self.is_signed: @@ -67,9 +65,6 @@ class Contract(Document): self.fulfilment_status = fulfilment_status - def set_contract_display(self): - self.contract_display = frappe.render_template(self.contract_terms, {"doc": self}) - def get_fulfilment_progress(self): return len([term for term in self.fulfilment_terms if term.fulfilled])