diff --git a/erpnext/accounts/custom/address.json b/erpnext/accounts/custom/address.json index 08f972d13b3..5c921da9b7a 100644 --- a/erpnext/accounts/custom/address.json +++ b/erpnext/accounts/custom/address.json @@ -1,58 +1,126 @@ { "custom_fields": [ { - "_assign": null, - "_comments": null, - "_liked_by": null, - "_user_tags": null, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "creation": "2018-12-28 22:29:21.828090", - "default": null, - "depends_on": null, - "description": null, - "docstatus": 0, - "dt": "Address", - "fetch_from": null, - "fieldname": "tax_category", - "fieldtype": "Link", - "hidden": 0, - "idx": 14, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "insert_after": "fax", - "label": "Tax Category", - "modified": "2018-12-28 22:29:21.828090", - "modified_by": "Administrator", - "name": "Address-tax_category", - "no_copy": 0, - "options": "Tax Category", - "owner": "Administrator", - "parent": null, - "parentfield": null, - "parenttype": null, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": null, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "translatable": 0, - "unique": 0, + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2018-12-28 22:29:21.828090", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "Address", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "tax_category", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 15, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "fax", + "label": "Tax Category", + "length": 0, + "mandatory_depends_on": null, + "modified": "2018-12-28 22:29:21.828090", + "modified_by": "Administrator", + "name": "Address-tax_category", + "no_copy": 0, + "options": "Tax Category", + "owner": "Administrator", + "parent": null, + "parentfield": null, + "parenttype": null, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2020-10-14 17:41:40.878179", + "default": "0", + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "Address", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "is_your_company_address", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 20, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "linked_with", + "label": "Is Your Company Address", + "length": 0, + "mandatory_depends_on": null, + "modified": "2020-10-14 17:41:40.878179", + "modified_by": "Administrator", + "name": "Address-is_your_company_address", + "no_copy": 0, + "options": null, + "owner": "Administrator", + "parent": null, + "parentfield": null, + "parenttype": null, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "translatable": 0, + "unique": 0, "width": null } - ], - "custom_perms": [], - "doctype": "Address", - "property_setters": [], + ], + "custom_perms": [], + "doctype": "Address", + "property_setters": [], "sync_on_migrate": 1 } \ No newline at end of file diff --git a/erpnext/accounts/custom/address.py b/erpnext/accounts/custom/address.py new file mode 100644 index 00000000000..5e764037a74 --- /dev/null +++ b/erpnext/accounts/custom/address.py @@ -0,0 +1,42 @@ +import frappe +from frappe import _ +from frappe.contacts.doctype.address.address import Address +from frappe.contacts.doctype.address.address import get_address_templates + +class ERPNextAddress(Address): + def validate(self): + self.validate_reference() + super(ERPNextAddress, self).validate() + + def link_address(self): + """Link address based on owner""" + if self.is_your_company_address: + return + + return super(ERPNextAddress, self).link_address() + + def validate_reference(self): + if self.is_your_company_address and not [ + row for row in self.links if row.link_doctype == "Company" + ]: + frappe.throw(_("Address needs to be linked to a Company. Please add a row for Company in the Links table."), + title=_("Company Not Linked")) + +@frappe.whitelist() +def get_shipping_address(company, address = None): + filters = [ + ["Dynamic Link", "link_doctype", "=", "Company"], + ["Dynamic Link", "link_name", "=", company], + ["Address", "is_your_company_address", "=", 1] + ] + fields = ["*"] + if address and frappe.db.get_value('Dynamic Link', + {'parent': address, 'link_name': company}): + filters.append(["Address", "name", "=", address]) + + address = frappe.get_all("Address", filters=filters, fields=fields) or {} + + if address: + address_as_dict = address[0] + name, address_template = get_address_templates(address_as_dict) + return address_as_dict.get("name"), frappe.render_template(address_template, address_as_dict) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index cf1d69f9147..9bd31050c4d 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -21,11 +21,16 @@ web_include_js = "assets/js/erpnext-web.min.js" web_include_css = "assets/css/erpnext-web.css" doctype_js = { + "Address": "public/js/address.js", "Communication": "public/js/communication.js", "Event": "public/js/event.js", "Newsletter": "public/js/newsletter.js" } +override_doctype_class = { + 'Address': 'erpnext.accounts.custom.address.ERPNextAddress' +} + welcome_email = "erpnext.setup.utils.welcome_email" # setup wizard @@ -561,4 +566,4 @@ global_search_doctypes = { {'doctype': 'Hotel Room Package', 'index': 3}, {'doctype': 'Hotel Room Type', 'index': 4} ] -} \ No newline at end of file +} diff --git a/erpnext/public/js/address.js b/erpnext/public/js/address.js new file mode 100644 index 00000000000..57f7163bbb2 --- /dev/null +++ b/erpnext/public/js/address.js @@ -0,0 +1,25 @@ +// Copyright (c) 2016, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on("Address", { + is_your_company_address: function(frm) { + frm.clear_table('links'); + if(frm.doc.is_your_company_address) { + frm.add_child('links', { + link_doctype: 'Company', + link_name: frappe.defaults.get_user_default('Company') + }); + frm.set_query('link_doctype', 'links', () => { + return { + filters: { + name: 'Company' + } + }; + }); + frm.refresh_field('links'); + } + else { + frm.trigger('refresh'); + } + } +}); diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index 44e75aee36a..770704e595b 100644 --- a/erpnext/public/js/utils/party.js +++ b/erpnext/public/js/utils/party.js @@ -277,7 +277,7 @@ erpnext.utils.validate_mandatory = function(frm, label, value, trigger_on) { erpnext.utils.get_shipping_address = function(frm, callback){ if (frm.doc.company) { frappe.call({ - method: "frappe.contacts.doctype.address.address.get_shipping_address", + method: "erpnext.accounts.custom.address.get_shipping_address", args: { company: frm.doc.company, address: frm.doc.shipping_address