Merge branch '4.0.0-wip' of github.com:webnotes/erpnext into 4.0.0-cleanup
diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py
index 2d15b62..3221901 100644
--- a/erpnext/accounts/doctype/account/test_account.py
+++ b/erpnext/accounts/doctype/account/test_account.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import webnotes
-def make_test_records(verbose):
+def _make_test_records(verbose):
from webnotes.test_runner import make_test_objects
accounts = [
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 9c6a9b2..010ef63 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -154,6 +154,19 @@
}
},
+ customer: function() {
+ if(this.frm.updating_customer_details)
+ return;
+ erpnext.selling.get_customer_details(this.frm,
+ "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_customer_details",
+ {
+ posting_date: this.frm.doc.posting_date,
+ company: this.frm.doc.company,
+ customer: this.frm.doc.customer,
+ debit_to: this.frm.doc.debit_to
+ })
+ },
+
debit_to: function() {
this.customer();
},
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index f77abfe..10255fa 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -147,23 +147,13 @@
self.set_pos_fields(for_validate)
if not self.doc.debit_to:
- self.doc.debit_to = self.get_customer_account()
+ self.doc.debit_to = get_customer_account(self.doc.company, self.doc.customer)
if not self.doc.due_date:
- self.doc.due_date = self.get_due_date()
+ self.doc.due_date = get_due_date(self.doc.posting_date, self.doc.customer,
+ self.doc.debit_to, self.doc.company)
super(DocType, self).set_missing_values(for_validate)
-
- def set_customer_defaults(self):
- # TODO cleanup these methods
- if self.doc.customer:
- self.doc.debit_to = self.get_customer_account()
- elif self.doc.debit_to:
- self.doc.customer = webnotes.conn.get_value('Account', self.doc.debit_to, 'master_name')
-
- self.doc.due_date = self.get_due_date()
-
- super(DocType, self).set_customer_defaults()
-
+
def update_time_log_batch(self, sales_invoice):
for d in self.doclist.get({"doctype":"Sales Invoice Item"}):
if d.time_log_batch:
@@ -190,7 +180,7 @@
if pos:
if not for_validate and not self.doc.customer:
self.doc.customer = pos.customer
- self.set_customer_defaults()
+ # self.set_customer_defaults()
for fieldname in ('territory', 'naming_series', 'currency', 'charge', 'letter_head', 'tc_name',
'selling_price_list', 'company', 'select_print_heading', 'cash_bank_account'):
@@ -214,44 +204,6 @@
# fetch charges
if self.doc.charge and not len(self.doclist.get({"parentfield": "other_charges"})):
self.set_taxes("other_charges", "charge")
-
- def get_customer_account(self):
- """Get Account Head to which amount needs to be Debited based on Customer"""
- if not self.doc.company:
- msgprint("Please select company first and re-select the customer after doing so",
- raise_exception=1)
- if self.doc.customer:
- acc_head = webnotes.conn.sql("""select name from `tabAccount`
- where (name = %s or (master_name = %s and master_type = 'customer'))
- and docstatus != 2 and company = %s""",
- (cstr(self.doc.customer) + " - " + self.get_company_abbr(),
- self.doc.customer, self.doc.company))
-
- if acc_head and acc_head[0][0]:
- return acc_head[0][0]
- else:
- msgprint("%s does not have an Account Head in %s. \
- You must first create it from the Customer Master" %
- (self.doc.customer, self.doc.company))
-
- def get_due_date(self):
- """Set Due Date = Posting Date + Credit Days"""
- due_date = None
- if self.doc.posting_date:
- credit_days = 0
- if self.doc.debit_to:
- credit_days = webnotes.conn.get_value("Account", self.doc.debit_to, "credit_days")
- if self.doc.customer and not credit_days:
- credit_days = webnotes.conn.get_value("Customer", self.doc.customer, "credit_days")
- if self.doc.company and not credit_days:
- credit_days = webnotes.conn.get_value("Company", self.doc.company, "credit_days")
-
- if credit_days:
- due_date = add_days(self.doc.posting_date, credit_days)
- else:
- due_date = self.doc.posting_date
-
- return due_date
def get_advances(self):
super(DocType, self).get_advances(self.doc.debit_to,
@@ -894,6 +846,59 @@
assign_to.add(args)
@webnotes.whitelist()
+def get_customer_details(company, customer, debit_to, posting_date):
+ if not webnotes.has_permission("Customer", "read", customer):
+ webnotes.throw("No Permission")
+
+ from erpnext.selling.doctype.customer.customer import get_customer_details
+
+ if customer:
+ debit_to = get_customer_account(company, customer)
+ elif debit_to:
+ customer = webnotes.conn.get_value('Account',debit_to, 'master_name')
+
+ out = {
+ "customer": customer,
+ "debit_to": debit_to,
+ "due_date": get_due_date(posting_date, customer, debit_to, company)
+ }
+ out.update(get_customer_details(customer))
+ return out
+
+def get_customer_account(company, customer):
+ if not company:
+ webnotes.throw(_("Please select company first."))
+
+ if customer:
+ acc_head = webnotes.conn.get_value("Account", {"master_name":customer,
+ "master_type":"Customer", "company": company})
+
+ if not acc_head:
+ webnotes.throw(_("Customer has no account head in selected Company. Open the customer record and create an Account Head first."))
+
+ return acc_head
+
+def get_due_date(posting_date, customer, debit_to, company):
+ """Set Due Date = Posting Date + Credit Days"""
+ due_date = None
+ if posting_date:
+ credit_days = 0
+ if debit_to:
+ credit_days = webnotes.conn.get_value("Account", debit_to, "credit_days")
+ if customer and not credit_days:
+ credit_days = webnotes.conn.get_value("Customer", customer, "credit_days")
+ if company and not credit_days:
+ credit_days = webnotes.conn.get_value("Company", company, "credit_days")
+
+ if credit_days:
+ due_date = add_days(posting_date, credit_days)
+ else:
+ due_date = posting_date
+
+ return due_date
+
+
+@webnotes.whitelist()
def get_bank_cash_account(mode_of_payment):
val = webnotes.conn.get_value("Mode of Payment", mode_of_payment, "default_account")
if not val:
diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py
index 99c7352..ec60428 100644
--- a/erpnext/buying/doctype/supplier/supplier.py
+++ b/erpnext/buying/doctype/supplier/supplier.py
@@ -194,4 +194,27 @@
out["total_billing"] = billing[0][0]
out["total_unpaid"] = billing[0][1]
- return out
\ No newline at end of file
+ return out
+
+@webnotes.whitelist()
+def get_supplier_details(supplier):
+ if not webnotes.has_permission("Supplier", "read", supplier):
+ webnotes.msgprint("No Permission", raise_exception=webnotes.PermissionError)
+
+ supplier = webnotes.doc("Supplier", supplier)
+
+ out = webnotes._dict({
+ "supplier_address": webnotes.conn.get_value("Address",
+ {"supplier": supplier.name, "is_primary_address":1}, "name"),
+ "contact_person": webnotes.conn.get_value("Contact",
+ {"supplier":supplier.name, "is_primary_contact":1}, "name")
+ })
+
+ out.supplier_name = supplier.supplier_name
+ out.currency = supplier.default_currency
+ out.buying_price_list = supplier.default_price_list
+
+ return out
+
+
+
\ No newline at end of file
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index f950f28..7b1be18 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -33,9 +33,10 @@
self.set_taxes("other_charges", "charge")
def set_missing_lead_customer_details(self):
+ from erpnext.selling.doctype.customer.customer import get_customer_details
if self.doc.customer:
if not (self.doc.contact_person and self.doc.customer_address and self.doc.customer_name):
- for fieldname, val in self.get_customer_defaults().items():
+ for fieldname, val in get_customer_details(self.doc.customer).iteritems():
if not self.doc.fields.get(fieldname) and self.meta.get_field(fieldname):
self.doc.fields[fieldname] = val
diff --git a/erpnext/public/build.json b/erpnext/public/build.json
index ea9808a..bb81a58 100644
--- a/erpnext/public/build.json
+++ b/erpnext/public/build.json
@@ -11,6 +11,7 @@
"public/js/toolbar.js",
"public/js/feature_setup.js",
"public/js/utils.js",
- "public/js/queries.js"
+ "public/js/queries.js",
+ "public/js/utils/customer_supplier.js"
]
}
\ No newline at end of file
diff --git a/erpnext/public/js/utils/customer_supplier.js b/erpnext/public/js/utils/customer_supplier.js
new file mode 100644
index 0000000..ccfbfc9
--- /dev/null
+++ b/erpnext/public/js/utils/customer_supplier.js
@@ -0,0 +1,46 @@
+// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+// License: GNU General Public License v3. See license.txt
+
+wn.provide("erpnext.utils");
+erpnext.utils.get_customer_details = function(frm, method, args) {
+ if(!method)
+ method = "erpnext.selling.doctype.customer.customer.get_customer_details";
+ if(!args)
+ args = { customer: frm.doc.customer };
+ wn.call({
+ method: method,
+ args: args,
+ callback: function(r) {
+ if(r.message) {
+ frm.updating_customer_details = true;
+ frm.set_value(r.message);
+ frm.updating_customer_details = false;
+ }
+ }
+ });
+}
+
+erpnext.utils.get_address_display = function(frm, address_field) {
+ if(frm.updating_customer_details) return;
+ if(!address_field) address_field = "customer_address";
+ wn.call({
+ method: "erpnext.utilities.doctype.address.address.get_address_display",
+ args: {address: frm.doc[address_field] },
+ callback: function(r) {
+ if(r.message)
+ frm.set_value("address_display", r.message)
+ }
+ })
+}
+
+erpnext.utils.get_contact_details = function(frm) {
+ if(frm.updating_customer_details) return;
+ wn.call({
+ method: "erpnext.utilities.doctype.contact.contact.get_contact_details",
+ args: {address: frm.doc.contact_person },
+ callback: function(r) {
+ if(r.message)
+ frm.set_value(r.message);
+ }
+ })
+}
\ No newline at end of file
diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py
index ee54f93..05e8112 100644
--- a/erpnext/selling/doctype/customer/customer.py
+++ b/erpnext/selling/doctype/customer/customer.py
@@ -10,6 +10,8 @@
from erpnext.utilities.transaction_base import TransactionBase
+from erpnext.utilities.doctype.address.address import get_address_display
+from erpnext.utilities.doctype.contact.contact import get_contact_details
class DocType(TransactionBase):
def __init__(self, doc, doclist=[]):
@@ -189,4 +191,51 @@
out["total_billing"] = billing[0][0]
out["total_unpaid"] = billing[0][1]
- return out
\ No newline at end of file
+ return out
+
+@webnotes.whitelist()
+def get_customer_details(customer):
+ if not webnotes.has_permission("Customer", "read", customer):
+ webnotes.throw("Not Permitted", webnotes.PermissionError)
+
+ out = {}
+ customer_bean = webnotes.bean("Customer", customer)
+ customer = customer_bean.doc
+
+ out = webnotes._dict({
+ "customer_address": webnotes.conn.get_value("Address",
+ {"customer": customer.name, "is_primary_address":1}, "name"),
+ "contact_person": webnotes.conn.get_value("Contact",
+ {"customer":customer.name, "is_primary_contact":1}, "name")
+ })
+
+ # address display
+ out.address_display = get_address_display(out.customer_address)
+
+ # primary contact details
+ out.update(get_contact_details(out.contact_person))
+
+ # copy
+ for f in ['customer_name', 'customer_group', 'territory']:
+ out[f] = customer.get(f)
+
+ # fields prepended with default in Customer doctype
+ for f in ['sales_partner', 'commission_rate', 'currency', 'price_list']:
+ if customer.get("default_" + f):
+ out[f] = customer.get("default_" + f)
+
+ # price list
+ out.selling_price_list = customer.price_list or webnotes.conn.get_value("Customer Group",
+ customer.customer_group, "default_price_list")
+
+ if out.selling_price_list:
+ out.price_list_currency = webnotes.conn.get_value("Price List", out.selling_price_list, "currency")
+
+ # sales team
+ out.sales_team = [{
+ "sales_person": d.sales_person,
+ "sales_designation": d.sales_designation
+ } for d in customer_bean.doclist.get({"doctype":"Sales Team"})]
+
+ return out
+
\ No newline at end of file
diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py
index 707d38a..b3e0372 100644
--- a/erpnext/selling/doctype/customer/test_customer.py
+++ b/erpnext/selling/doctype/customer/test_customer.py
@@ -6,7 +6,38 @@
import webnotes
import unittest
+from webnotes.test_runner import make_test_records
+
+
class TestCustomer(unittest.TestCase):
+ def test_get_customer_details(self):
+ from erpnext.selling.doctype.customer.customer import get_customer_details
+
+ to_check = {
+ 'address_display': '_Test Address Line 1\n_Test City\nIndia\nPhone: +91 0000000000',
+ 'selling_price_list': None,
+ 'customer_group': '_Test Customer Group',
+ 'contact_designation': None,
+ 'customer_address': '_Test Address-Office',
+ 'contact_department': None,
+ 'contact_email': 'test_contact_customer@example.com',
+ 'contact_mobile': None,
+ '_sales_team': [],
+ 'contact_display': '_Test Contact For _Test Customer',
+ 'contact_person': '_Test Contact For _Test Customer-_Test Customer',
+ 'territory': u'_Test Territory',
+ 'contact_phone': '+91 0000000000',
+ 'customer_name': '_Test Customer'
+ }
+
+ make_test_records("Address")
+ make_test_records("Contact")
+
+ details = get_customer_details("_Test Customer")
+
+ for key, value in to_check.iteritems():
+ self.assertEquals(value, details.get(key))
+
def test_rename(self):
self.assertEqual(webnotes.conn.exists("Customer", "_Test Customer 1"),
(("_Test Customer 1",),))
@@ -20,7 +51,6 @@
webnotes.rename_doc("Customer", "_Test Customer 1 Renamed", "_Test Customer 1")
def test_merge(self):
- from webnotes.test_runner import make_test_records
make_test_records("Sales Invoice")
# clear transactions for new name
diff --git a/erpnext/selling/doctype/installation_note/installation_note.js b/erpnext/selling/doctype/installation_note/installation_note.js
index 223bd8d..c666247 100644
--- a/erpnext/selling/doctype/installation_note/installation_note.js
+++ b/erpnext/selling/doctype/installation_note/installation_note.js
@@ -4,6 +4,16 @@
cur_frm.cscript.tname = "Installation Note Item";
cur_frm.cscript.fname = "installed_item_details";
+
+wn.ui.form.on_change("Installation Note", "customer",
+ function(frm) { erpnext.utils.get_customer_details(frm); });
+
+wn.ui.form.on_change("Installation Note", "customer_address",
+ function(frm) { erpnext.utils.get_address_display(frm); });
+
+wn.ui.form.on_change("Installation Note", "contact_person",
+ function(frm) { erpnext.utils.get_contact_details(frm); });
+
wn.provide("erpnext.selling");
// TODO commonify this code
erpnext.selling.InstallationNote = wn.ui.form.Controller.extend({
@@ -11,11 +21,6 @@
if(!this.frm.doc.status) set_multiple(dt,dn,{ status:'Draft'});
if(this.frm.doc.__islocal) set_multiple(this.frm.doc.doctype, this.frm.doc.name,
{inst_date: get_today()});
-
- fields = ['customer_address', 'contact_person','customer_name', 'address_display',
- 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']
- if(this.frm.doc.customer) unhide_field(fields);
- else hide_field(fields)
this.setup_queries();
},
@@ -60,42 +65,7 @@
}
);
}
- },
-
- customer: function() {
- var me = this;
- if(this.frm.doc.customer) {
- return this.frm.call({
- doc: this.frm.doc,
- method: "set_customer_defaults",
- });
-
- // TODO shift this to depends_on
- unhide_field(['customer_address', 'contact_person', 'customer_name',
- 'address_display', 'contact_display', 'contact_mobile', 'contact_email',
- 'territory', 'customer_group']);
- }
- },
-
- customer_address: function() {
- var me = this;
- if(this.frm.doc.customer) {
- return this.frm.call({
- doc: this.frm.doc,
- args: {
- customer: this.frm.doc.customer,
- address: this.frm.doc.customer_address,
- contact: this.frm.doc.contact_person
- },
- method: "get_customer_address",
- freeze: true,
- });
- }
- },
-
- contact_person: function() {
- this.customer_address();
- },
+ },
});
$.extend(cur_frm.cscript, new erpnext.selling.InstallationNote({frm: cur_frm}));
\ No newline at end of file
diff --git a/erpnext/selling/doctype/installation_note/installation_note.txt b/erpnext/selling/doctype/installation_note/installation_note.txt
index d23a68a..d8d8b6d 100644
--- a/erpnext/selling/doctype/installation_note/installation_note.txt
+++ b/erpnext/selling/doctype/installation_note/installation_note.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-04-30 13:13:06",
"docstatus": 0,
- "modified": "2013-12-20 19:24:08",
+ "modified": "2014-01-02 10:25:49",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -74,6 +74,7 @@
"search_index": 1
},
{
+ "depends_on": "customer",
"doctype": "DocField",
"fieldname": "customer_address",
"fieldtype": "Link",
@@ -82,6 +83,7 @@
"print_hide": 1
},
{
+ "depends_on": "customer",
"doctype": "DocField",
"fieldname": "contact_person",
"fieldtype": "Link",
@@ -104,6 +106,7 @@
"doctype": "DocField",
"fieldname": "address_display",
"fieldtype": "Small Text",
+ "hidden": 1,
"label": "Address",
"read_only": 1
},
@@ -111,10 +114,12 @@
"doctype": "DocField",
"fieldname": "contact_display",
"fieldtype": "Small Text",
+ "hidden": 1,
"label": "Contact",
"read_only": 1
},
{
+ "depends_on": "customer",
"doctype": "DocField",
"fieldname": "contact_mobile",
"fieldtype": "Text",
@@ -122,6 +127,7 @@
"read_only": 1
},
{
+ "depends_on": "customer",
"doctype": "DocField",
"fieldname": "contact_email",
"fieldtype": "Text",
@@ -130,6 +136,7 @@
"read_only": 1
},
{
+ "depends_on": "customer",
"description": "<a href=\"#Sales Browser/Territory\">Add / Edit</a>",
"doctype": "DocField",
"fieldname": "territory",
@@ -142,6 +149,7 @@
"search_index": 1
},
{
+ "depends_on": "customer",
"description": "<a href=\"#Sales Browser/Customer Group\">Add / Edit</a>",
"doctype": "DocField",
"fieldname": "customer_group",
diff --git a/erpnext/selling/doctype/opportunity/opportunity.js b/erpnext/selling/doctype/opportunity/opportunity.js
index 396def8..fd449fa 100644
--- a/erpnext/selling/doctype/opportunity/opportunity.js
+++ b/erpnext/selling/doctype/opportunity/opportunity.js
@@ -3,6 +3,12 @@
{% include 'utilities/doctype/sms_control/sms_control.js' %};
+wn.ui.form.on_change("Opportunity", "customer", function(frm) {
+ erpnext.utils.get_customer_details(frm) });
+wn.ui.form.on_change("Opportunity", "customer_address", erpnext.utils.get_address_display);
+wn.ui.form.on_change("Opportunity", "contact_person", erpnext.utils.get_contact_details);
+
+
wn.provide("erpnext.selling");
// TODO commonify this code
erpnext.selling.Opportunity = wn.ui.form.Controller.extend({
@@ -12,8 +18,6 @@
if(!this.frm.doc.enquiry_from && this.frm.doc.lead)
this.frm.doc.enquiry_from = "Lead";
- if(!this.frm.doc.enquiry_from)
- hide_field(['customer', 'customer_address', 'contact_person', 'customer_name','lead', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
if(!this.frm.doc.status)
set_multiple(cdt,cdn,{status:'Draft'});
if(!this.frm.doc.date)
@@ -23,14 +27,6 @@
if(!this.frm.doc.fiscal_year && sys_defaults.fiscal_year)
set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year});
- if(this.frm.doc.enquiry_from) {
- if(this.frm.doc.enquiry_from == 'Customer') {
- hide_field('lead');
- }
- else if (this.frm.doc.enquiry_from == 'Lead') {
- hide_field(['customer', 'customer_address', 'contact_person', 'customer_group']);
- }
- }
if(!this.frm.doc.__islocal) {
cur_frm.communication_view = new wn.views.CommunicationList({
@@ -73,22 +69,7 @@
me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
});
},
-
- customer: function() {
- var me = this;
- if(this.frm.doc.customer) {
- // TODO shift this to depends_on
- unhide_field(['customer_address', 'contact_person', 'customer_name',
- 'address_display', 'contact_display', 'contact_mobile', 'contact_email',
- 'territory', 'customer_group']);
-
- return this.frm.call({
- doc: this.frm.doc,
- method: "set_customer_defaults",
- });
- }
- },
-
+
create_quotation: function() {
wn.model.open_mapped_doc({
method: "erpnext.selling.doctype.opportunity.opportunity.make_quotation",
@@ -109,10 +90,7 @@
cur_frm.add_custom_button(wn._('Opportunity Lost'), cur_frm.cscript['Declare Opportunity Lost']);
}
cur_frm.add_custom_button(wn._('Send SMS'), cur_frm.cscript.send_sms, "icon-mobile-phone");
- }
-
- cur_frm.toggle_display("contact_info", doc.customer || doc.lead);
-
+ }
}
cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
@@ -128,46 +106,13 @@
}
}
-// hide - unhide fields on basis of enquiry_from lead or customer
-cur_frm.cscript.enquiry_from = function(doc,cdt,cdn){
- cur_frm.cscript.lead_cust_show(doc,cdt,cdn);
-}
-
-// hide - unhide fields based on lead or customer
-cur_frm.cscript.lead_cust_show = function(doc,cdt,cdn){
- if(doc.enquiry_from == 'Lead'){
- unhide_field(['lead']);
- hide_field(['customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
- doc.lead = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
- }
- else if(doc.enquiry_from == 'Customer'){
- unhide_field(['customer']);
- hide_field(['lead', 'address_display', 'contact_display', 'contact_mobile',
- 'contact_email', 'territory', 'customer_group']);
- doc.lead = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
- }
-}
-
-cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc, dt, dn) {
- args = {
- address: doc.customer_address,
- contact: doc.contact_person
- }
- if(doc.customer) args.update({customer: doc.customer});
-
- return get_server_fields('get_customer_address', JSON.stringify(args),'', doc, dt, dn, 1);
-}
cur_frm.cscript.lead = function(doc, cdt, cdn) {
cur_frm.toggle_display("contact_info", doc.customer || doc.lead);
-
wn.model.map_current_doc({
method: "erpnext.selling.doctype.lead.lead.make_opportunity",
source_name: cur_frm.doc.lead
})
-
- unhide_field(['customer_name', 'address_display','contact_mobile', 'customer_address',
- 'contact_email', 'territory']);
}
diff --git a/erpnext/selling/doctype/opportunity/opportunity.txt b/erpnext/selling/doctype/opportunity/opportunity.txt
index d0dc0f5..b0fe782 100644
--- a/erpnext/selling/doctype/opportunity/opportunity.txt
+++ b/erpnext/selling/doctype/opportunity/opportunity.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-03-07 18:50:30",
"docstatus": 0,
- "modified": "2013-12-20 19:24:15",
+ "modified": "2014-01-02 11:10:51",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -80,6 +80,7 @@
"reqd": 1
},
{
+ "depends_on": "eval:doc.enquiry_from===\"Customer\"",
"doctype": "DocField",
"fieldname": "customer",
"fieldtype": "Link",
@@ -96,6 +97,7 @@
"search_index": 0
},
{
+ "depends_on": "eval:doc.enquiry_from===\"Lead\"",
"doctype": "DocField",
"fieldname": "lead",
"fieldtype": "Link",
@@ -183,6 +185,7 @@
"read_only": 0
},
{
+ "depends_on": "eval:doc.lead || doc.customer",
"doctype": "DocField",
"fieldname": "contact_info",
"fieldtype": "Section Break",
@@ -191,6 +194,7 @@
"read_only": 0
},
{
+ "depends_on": "eval:doc.customer || doc.lead",
"doctype": "DocField",
"fieldname": "customer_address",
"fieldtype": "Link",
@@ -204,13 +208,14 @@
"doctype": "DocField",
"fieldname": "address_display",
"fieldtype": "Small Text",
- "hidden": 0,
+ "hidden": 1,
"label": "Address",
"oldfieldname": "address",
"oldfieldtype": "Small Text",
"read_only": 1
},
{
+ "depends_on": "customer",
"description": "<a href=\"#Sales Browser/Territory\">Add / Edit</a>",
"doctype": "DocField",
"fieldname": "territory",
@@ -224,7 +229,7 @@
"search_index": 1
},
{
- "depends_on": "eval:doc.enquiry_from==\"Customer\"",
+ "depends_on": "customer",
"description": "<a href=\"#Sales Browser/Customer Group\">Add / Edit</a>",
"doctype": "DocField",
"fieldname": "customer_group",
@@ -247,6 +252,7 @@
"read_only": 0
},
{
+ "depends_on": "customer",
"doctype": "DocField",
"fieldname": "customer_name",
"fieldtype": "Data",
@@ -255,6 +261,7 @@
"read_only": 1
},
{
+ "depends_on": "eval:doc.lead || doc.customer",
"doctype": "DocField",
"fieldname": "contact_person",
"fieldtype": "Link",
@@ -265,6 +272,7 @@
"read_only": 0
},
{
+ "depends_on": "customer",
"doctype": "DocField",
"fieldname": "contact_display",
"fieldtype": "Small Text",
@@ -272,6 +280,7 @@
"read_only": 1
},
{
+ "depends_on": "eval:doc.lead || doc.customer",
"doctype": "DocField",
"fieldname": "contact_email",
"fieldtype": "Text",
@@ -279,6 +288,7 @@
"read_only": 1
},
{
+ "depends_on": "eval:doc.lead || doc.customer",
"doctype": "DocField",
"fieldname": "contact_mobile",
"fieldtype": "Text",
diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js
index 1c8aed3..8ca076d 100644
--- a/erpnext/selling/sales_common.js
+++ b/erpnext/selling/sales_common.js
@@ -10,6 +10,7 @@
wn.provide("erpnext.selling");
wn.require("assets/erpnext/js/transaction.js");
+
{% include "public/js/controllers/accounts.js" %}
erpnext.selling.SellingController = erpnext.TransactionController.extend({
@@ -103,47 +104,15 @@
},
customer: function() {
- var me = this;
- if(this.frm.doc.customer || this.frm.doc.debit_to) {
- if(!this.frm.doc.company) {
- this.frm.set_value("customer", null);
- msgprint(wn._("Please specify Company"));
- } else {
- var selling_price_list = this.frm.doc.selling_price_list;
- return this.frm.call({
- doc: this.frm.doc,
- method: "set_customer_defaults",
- freeze: true,
- callback: function(r) {
- if(!r.exc) {
- (me.frm.doc.selling_price_list !== selling_price_list) ?
- me.selling_price_list() :
- me.price_list_currency();
- }
- }
- });
- }
- }
+ erpnext.utils.get_customer_details(this.frm);
},
customer_address: function() {
- var me = this;
- if(this.frm.doc.customer) {
- return this.frm.call({
- doc: this.frm.doc,
- args: {
- customer: this.frm.doc.customer,
- address: this.frm.doc.customer_address,
- contact: this.frm.doc.contact_person
- },
- method: "set_customer_address",
- freeze: true,
- });
- }
+ erpnext.utils.get_address_display(this.frm, "customer_address");
},
contact_person: function() {
- this.customer_address();
+ erpnext.utils.get_contact_details(this.frm);
},
barcode: function(doc, cdt, cdn) {
diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py
index f9723e1..c69501c 100644
--- a/erpnext/startup/event_handlers.py
+++ b/erpnext/startup/event_handlers.py
@@ -10,16 +10,7 @@
called after login
update login_from and delete parallel sessions
"""
- # Clear previous sessions i.e. logout previous log-in attempts
- allow_multiple_sessions = ['demo@erpnext.com', 'Administrator', 'Guest']
- if webnotes.session['user'] not in allow_multiple_sessions:
- from webnotes.sessions import clear_sessions
- clear_sessions(webnotes.session.user, keep_current=True)
-
- # check if account is expired
- check_if_expired()
-
- if webnotes.session['user'] not in ('Guest', 'demo@erpnext.com'):
+ if webnotes.session['user'] not in ('Guest'):
# create feed
from webnotes.utils import nowtime
from webnotes.profile import get_user_fullname
@@ -27,31 +18,4 @@
make_feed('Login', 'Profile', login_manager.user, login_manager.user,
'%s logged in at %s' % (get_user_fullname(login_manager.user), nowtime()),
login_manager.user=='Administrator' and '#8CA2B3' or '#1B750D')
- webnotes.conn.commit()
-
-def check_if_expired():
- """check if account is expired. If expired, do not allow login"""
- from webnotes import conf
- # check if expires_on is specified
- if not 'expires_on' in conf: return
-
- # check if expired
- from datetime import datetime, date
- expires_on = datetime.strptime(conf.expires_on, '%Y-%m-%d').date()
- if date.today() <= expires_on: return
-
- # if expired, stop user from logging in
- from webnotes.utils import formatdate
- msg = """Oops! Your subscription expired on <b>%s</b>.<br>""" % formatdate(conf.expires_on)
-
- if 'System Manager' in webnotes.user.get_roles():
- msg += """Just drop in a mail at <b>support@erpnext.com</b> and
- we will guide you to get your account re-activated."""
- else:
- msg += """Just ask your System Manager to drop in a mail at <b>support@erpnext.com</b> and
- we will guide him to get your account re-activated."""
-
- webnotes.msgprint(msg)
-
- webnotes.response['message'] = 'Account Expired'
- raise webnotes.AuthenticationError
+ webnotes.conn.commit()
\ No newline at end of file
diff --git a/erpnext/support/doctype/customer_issue/customer_issue.js b/erpnext/support/doctype/customer_issue/customer_issue.js
index 0ff3f17..d4cdbc2 100644
--- a/erpnext/support/doctype/customer_issue/customer_issue.js
+++ b/erpnext/support/doctype/customer_issue/customer_issue.js
@@ -2,27 +2,21 @@
// License: GNU General Public License v3. See license.txt
wn.provide("erpnext.support");
-// TODO commonify this code
+
+wn.ui.form.on_change("Customer Issue", "customer", function(frm) {
+ erpnext.utils.get_customer_details(frm) });
+wn.ui.form.on_change("Customer Issue", "customer_address",
+ erpnext.utils.get_address_display);
+wn.ui.form.on_change("Customer Issue", "contact_person",
+ erpnext.utils.get_contact_details);
+
erpnext.support.CustomerIssue = wn.ui.form.Controller.extend({
refresh: function() {
if((cur_frm.doc.status=='Open' || cur_frm.doc.status == 'Work In Progress')) {
cur_frm.add_custom_button(wn._('Make Maintenance Visit'), this.make_maintenance_visit)
}
},
-
- customer: function() {
- var me = this;
- if(this.frm.doc.customer) {
- // TODO shift this to depends_on
- unhide_field(['customer_address', 'contact_person']);
-
- return this.frm.call({
- doc: this.frm.doc,
- method: "set_customer_defaults",
- });
- }
- },
-
+
make_maintenance_visit: function() {
wn.model.open_mapped_doc({
method: "erpnext.support.doctype.customer_issue.customer_issue.make_maintenance_visit",
@@ -35,16 +29,7 @@
cur_frm.cscript.onload = function(doc,cdt,cdn){
if(!doc.status)
- set_multiple(dt,dn,{status:'Open'});
- if(doc.__islocal){
- hide_field(['customer_address','contact_person']);
- }
-}
-
-cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {
- if(doc.customer)
- return get_server_fields('get_customer_address',
- JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+ set_multiple(dt,dn,{status:'Open'});
}
cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
@@ -82,6 +67,8 @@
cur_frm.add_fetch('serial_no', 'customer', 'customer');
cur_frm.add_fetch('serial_no', 'customer_name', 'customer_name');
cur_frm.add_fetch('serial_no', 'delivery_address', 'customer_address');
+cur_frm.add_fetch('item_code', 'item_name', 'item_name');
+cur_frm.add_fetch('item_code', 'description', 'description');
cur_frm.fields_dict['item_code'].get_query = function(doc, cdt, cdn) {
if(doc.serial_no) {
@@ -98,8 +85,6 @@
}
}
-cur_frm.add_fetch('item_code', 'item_name', 'item_name');
-cur_frm.add_fetch('item_code', 'description', 'description');
cur_frm.fields_dict.customer.get_query = function(doc,cdt,cdn) {
diff --git a/erpnext/support/doctype/customer_issue/customer_issue.txt b/erpnext/support/doctype/customer_issue/customer_issue.txt
index ae16c2c..cee27d5 100644
--- a/erpnext/support/doctype/customer_issue/customer_issue.txt
+++ b/erpnext/support/doctype/customer_issue/customer_issue.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-01-10 16:34:30",
"docstatus": 0,
- "modified": "2013-12-20 19:24:02",
+ "modified": "2014-01-02 11:20:49",
"modified_by": "Administrator",
"owner": "harshada@webnotestech.com"
},
@@ -274,6 +274,7 @@
"width": "50%"
},
{
+ "depends_on": "customer",
"doctype": "DocField",
"fieldname": "customer_name",
"fieldtype": "Data",
@@ -281,6 +282,7 @@
"read_only": 1
},
{
+ "depends_on": "customer",
"description": "<a href=\"#Sales Browser/Customer Group\">Add / Edit</a>",
"doctype": "DocField",
"fieldname": "customer_group",
@@ -291,6 +293,7 @@
"reqd": 0
},
{
+ "depends_on": "customer",
"description": "<a href=\"#Sales Browser/Territory\">Add / Edit</a>",
"doctype": "DocField",
"fieldname": "territory",
@@ -305,10 +308,27 @@
"search_index": 1
},
{
+ "depends_on": "customer",
"doctype": "DocField",
- "fieldname": "address_display",
+ "fieldname": "contact_display",
"fieldtype": "Small Text",
- "label": "Address",
+ "label": "Contact",
+ "read_only": 1
+ },
+ {
+ "depends_on": "customer",
+ "doctype": "DocField",
+ "fieldname": "contact_mobile",
+ "fieldtype": "Data",
+ "label": "Mobile No",
+ "read_only": 1
+ },
+ {
+ "depends_on": "customer",
+ "doctype": "DocField",
+ "fieldname": "contact_email",
+ "fieldtype": "Data",
+ "label": "Contact Email",
"read_only": 1
},
{
@@ -318,27 +338,8 @@
"width": "50%"
},
{
- "doctype": "DocField",
- "fieldname": "contact_display",
- "fieldtype": "Small Text",
- "label": "Contact",
- "read_only": 1
- },
- {
- "doctype": "DocField",
- "fieldname": "contact_mobile",
- "fieldtype": "Data",
- "label": "Mobile No",
- "read_only": 1
- },
- {
- "doctype": "DocField",
- "fieldname": "contact_email",
- "fieldtype": "Data",
- "label": "Contact Email",
- "read_only": 1
- },
- {
+ "depends_on": "customer",
+ "description": "If different than customer address",
"doctype": "DocField",
"fieldname": "service_address",
"fieldtype": "Small Text",
@@ -347,6 +348,15 @@
"oldfieldtype": "Small Text"
},
{
+ "depends_on": "customer",
+ "doctype": "DocField",
+ "fieldname": "address_display",
+ "fieldtype": "Small Text",
+ "hidden": 0,
+ "label": "Address",
+ "read_only": 1
+ },
+ {
"doctype": "DocField",
"fieldname": "more_info",
"fieldtype": "Section Break",
diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js
index 75773e0..4cdf56f 100644
--- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js
+++ b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.js
@@ -2,6 +2,14 @@
// License: GNU General Public License v3. See license.txt
wn.provide("erpnext.support");
+
+wn.ui.form.on_change("Maintenance Schedule", "customer", function(frm) {
+ erpnext.utils.get_customer_details(frm) });
+wn.ui.form.on_change("Maintenance Schedule", "customer_address",
+ erpnext.utils.get_address_display);
+wn.ui.form.on_change("Maintenance Schedule", "contact_person",
+ erpnext.utils.get_contact_details);
+
// TODO commonify this code
erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({
refresh: function() {
@@ -28,15 +36,6 @@
})
}
},
- customer: function() {
- var me = this;
- if(this.frm.doc.customer) {
- return this.frm.call({
- doc: this.frm.doc,
- method: "set_customer_defaults",
- });
- }
- },
});
$.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm}));
@@ -46,14 +45,9 @@
if(doc.__islocal){
set_multiple(dt,dn,{transaction_date:get_today()});
- hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
}
}
-cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {
- if(doc.customer) return get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
-}
-
cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
return{
filters:{ 'customer': doc.customer}
diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.txt b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.txt
index ff97b95..6c3508a 100644
--- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.txt
+++ b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-01-10 16:34:30",
"docstatus": 0,
- "modified": "2013-12-20 19:24:13",
+ "modified": "2014-01-02 11:24:51",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -55,12 +55,6 @@
},
{
"doctype": "DocField",
- "fieldname": "column_break0",
- "fieldtype": "Column Break",
- "oldfieldtype": "Column Break"
- },
- {
- "doctype": "DocField",
"fieldname": "customer",
"fieldtype": "Link",
"in_filter": 1,
@@ -75,84 +69,11 @@
},
{
"doctype": "DocField",
- "fieldname": "customer_address",
- "fieldtype": "Link",
- "label": "Customer Address",
- "options": "Address",
- "print_hide": 1
- },
- {
- "doctype": "DocField",
- "fieldname": "contact_person",
- "fieldtype": "Link",
- "label": "Contact Person",
- "options": "Contact",
- "print_hide": 1
- },
- {
- "doctype": "DocField",
- "fieldname": "customer_name",
- "fieldtype": "Data",
- "in_filter": 1,
- "in_list_view": 1,
- "label": "Customer Name",
- "oldfieldname": "customer_name",
- "oldfieldtype": "Data",
- "read_only": 1,
- "reqd": 0,
- "search_index": 0
- },
- {
- "doctype": "DocField",
- "fieldname": "address_display",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Address",
- "read_only": 1
- },
- {
- "doctype": "DocField",
- "fieldname": "contact_display",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Contact",
- "read_only": 1
- },
- {
- "doctype": "DocField",
- "fieldname": "contact_mobile",
- "fieldtype": "Data",
- "hidden": 1,
- "label": "Mobile No",
- "read_only": 1
- },
- {
- "doctype": "DocField",
- "fieldname": "contact_email",
- "fieldtype": "Data",
- "hidden": 1,
- "label": "Contact Email",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "doctype": "DocField",
- "fieldname": "column_break1",
+ "fieldname": "column_break0",
"fieldtype": "Column Break",
"oldfieldtype": "Column Break"
},
{
- "doctype": "DocField",
- "fieldname": "transaction_date",
- "fieldtype": "Date",
- "in_filter": 1,
- "label": "Transaction Date",
- "oldfieldname": "transaction_date",
- "oldfieldtype": "Date",
- "reqd": 1,
- "search_index": 0
- },
- {
"default": "Draft",
"doctype": "DocField",
"fieldname": "status",
@@ -169,50 +90,16 @@
},
{
"doctype": "DocField",
- "fieldname": "amended_from",
- "fieldtype": "Data",
- "ignore_restrictions": 1,
- "label": "Amended From",
- "no_copy": 1,
- "oldfieldname": "amended_from",
- "oldfieldtype": "Data",
- "read_only": 1
- },
- {
- "doctype": "DocField",
- "fieldname": "company",
- "fieldtype": "Link",
+ "fieldname": "transaction_date",
+ "fieldtype": "Date",
"in_filter": 1,
- "label": "Company",
- "oldfieldname": "company",
- "oldfieldtype": "Link",
- "options": "Company",
+ "label": "Transaction Date",
+ "oldfieldname": "transaction_date",
+ "oldfieldtype": "Date",
"reqd": 1,
"search_index": 0
},
{
- "description": "<a href=\"#Sales Browser/Territory\">Add / Edit</a>",
- "doctype": "DocField",
- "fieldname": "territory",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Territory",
- "oldfieldname": "territory",
- "oldfieldtype": "Link",
- "options": "Territory",
- "reqd": 1,
- "search_index": 0
- },
- {
- "description": "<a href=\"#Sales Browser/Customer Group\">Add / Edit</a>",
- "doctype": "DocField",
- "fieldname": "customer_group",
- "fieldtype": "Link",
- "label": "Customer Group",
- "options": "Customer Group",
- "reqd": 1
- },
- {
"doctype": "DocField",
"fieldname": "items",
"fieldtype": "Section Break",
@@ -255,6 +142,120 @@
"read_only": 1
},
{
+ "doctype": "DocField",
+ "fieldname": "contact_info",
+ "fieldtype": "Section Break",
+ "label": "Contact Info"
+ },
+ {
+ "depends_on": "customer",
+ "doctype": "DocField",
+ "fieldname": "customer_name",
+ "fieldtype": "Data",
+ "in_filter": 1,
+ "in_list_view": 1,
+ "label": "Customer Name",
+ "oldfieldname": "customer_name",
+ "oldfieldtype": "Data",
+ "read_only": 1,
+ "reqd": 0,
+ "search_index": 0
+ },
+ {
+ "depends_on": "customer",
+ "doctype": "DocField",
+ "fieldname": "contact_person",
+ "fieldtype": "Link",
+ "label": "Contact Person",
+ "options": "Contact",
+ "print_hide": 1
+ },
+ {
+ "depends_on": "customer",
+ "doctype": "DocField",
+ "fieldname": "contact_mobile",
+ "fieldtype": "Data",
+ "hidden": 1,
+ "label": "Mobile No",
+ "read_only": 1
+ },
+ {
+ "depends_on": "customer",
+ "doctype": "DocField",
+ "fieldname": "contact_email",
+ "fieldtype": "Data",
+ "hidden": 1,
+ "label": "Contact Email",
+ "print_hide": 1,
+ "read_only": 1
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "contact_display",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Contact",
+ "read_only": 1
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "column_break_17",
+ "fieldtype": "Column Break"
+ },
+ {
+ "depends_on": "customer",
+ "doctype": "DocField",
+ "fieldname": "customer_address",
+ "fieldtype": "Link",
+ "label": "Customer Address",
+ "options": "Address",
+ "print_hide": 1
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "address_display",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Address",
+ "read_only": 1
+ },
+ {
+ "depends_on": "customer",
+ "description": "<a href=\"#Sales Browser/Territory\">Add / Edit</a>",
+ "doctype": "DocField",
+ "fieldname": "territory",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Territory",
+ "oldfieldname": "territory",
+ "oldfieldtype": "Link",
+ "options": "Territory",
+ "reqd": 1,
+ "search_index": 0
+ },
+ {
+ "depends_on": "customer",
+ "description": "<a href=\"#Sales Browser/Customer Group\">Add / Edit</a>",
+ "doctype": "DocField",
+ "fieldname": "customer_group",
+ "fieldtype": "Link",
+ "label": "Customer Group",
+ "options": "Customer Group",
+ "reqd": 1
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "company",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Company",
+ "oldfieldname": "company",
+ "oldfieldtype": "Link",
+ "options": "Company",
+ "reqd": 1,
+ "search_index": 0
+ },
+ {
"doctype": "DocPerm"
}
]
\ No newline at end of file
diff --git a/erpnext/support/doctype/maintenance_visit/maintenance_visit.js b/erpnext/support/doctype/maintenance_visit/maintenance_visit.js
index f571b9a..5d1aa54 100644
--- a/erpnext/support/doctype/maintenance_visit/maintenance_visit.js
+++ b/erpnext/support/doctype/maintenance_visit/maintenance_visit.js
@@ -2,6 +2,14 @@
// License: GNU General Public License v3. See license.txt
wn.provide("erpnext.support");
+
+wn.ui.form.on_change("Maintenance Visit", "customer", function(frm) {
+ erpnext.utils.get_customer_details(frm) });
+wn.ui.form.on_change("Maintenance Visit", "customer_address",
+ erpnext.utils.get_address_display);
+wn.ui.form.on_change("Maintenance Visit", "contact_person",
+ erpnext.utils.get_contact_details);
+
// TODO commonify this code
erpnext.support.MaintenanceVisit = wn.ui.form.Controller.extend({
refresh: function() {
@@ -44,20 +52,7 @@
})
});
}
- cur_frm.cscript.hide_contact_info();
},
- customer: function() {
- var me = this;
- if(this.frm.doc.customer) {
- // TODO shift this to depends_on
- cur_frm.cscript.hide_contact_info();
-
- return this.frm.call({
- doc: this.frm.doc,
- method: "set_customer_defaults",
- });
- }
- },
});
$.extend(cur_frm.cscript, new erpnext.support.MaintenanceVisit({frm: cur_frm}));
@@ -65,15 +60,6 @@
cur_frm.cscript.onload = function(doc, dt, dn) {
if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
if(doc.__islocal) set_multiple(dt,dn,{mntc_date:get_today()});
- cur_frm.cscript.hide_contact_info();
-}
-
-cur_frm.cscript.hide_contact_info = function() {
- cur_frm.toggle_display("contact_info_section", cur_frm.doc.customer ? true : false);
-}
-
-cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {
- if(doc.customer) return get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
}
cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
diff --git a/erpnext/support/doctype/maintenance_visit/maintenance_visit.txt b/erpnext/support/doctype/maintenance_visit/maintenance_visit.txt
index 2b2986e..314960a 100644
--- a/erpnext/support/doctype/maintenance_visit/maintenance_visit.txt
+++ b/erpnext/support/doctype/maintenance_visit/maintenance_visit.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-01-10 16:34:31",
"docstatus": 0,
- "modified": "2013-12-20 19:24:13",
+ "modified": "2014-01-02 11:28:44",
"modified_by": "Administrator",
"owner": "ashwini@webnotestech.com"
},
@@ -268,6 +268,7 @@
"search_index": 0
},
{
+ "depends_on": "customer",
"doctype": "DocField",
"fieldname": "contact_info_section",
"fieldtype": "Section Break",
diff --git a/erpnext/support/doctype/support_ticket/support_ticket.js b/erpnext/support/doctype/support_ticket/support_ticket.js
index b5224e7..a276e36 100644
--- a/erpnext/support/doctype/support_ticket/support_ticket.js
+++ b/erpnext/support/doctype/support_ticket/support_ticket.js
@@ -5,20 +5,8 @@
return{ query: "erpnext.controllers.queries.customer_query" } }
wn.provide("erpnext.support");
-// TODO commonify this code
-erpnext.support.SupportTicket = wn.ui.form.Controller.extend({
- customer: function() {
- var me = this;
- if(this.frm.doc.customer) {
- return this.frm.call({
- doc: this.frm.doc,
- method: "set_customer_defaults",
- });
- }
- }
-});
-$.extend(cur_frm.cscript, new erpnext.support.SupportTicket({frm: cur_frm}));
+cur_frm.add_fetch("customer", "customer_name", "customer_name")
$.extend(cur_frm.cscript, {
onload: function(doc, dt, dn) {
diff --git a/erpnext/utilities/doctype/address/address.py b/erpnext/utilities/doctype/address/address.py
index ad6e049..ea21c21 100644
--- a/erpnext/utilities/doctype/address/address.py
+++ b/erpnext/utilities/doctype/address/address.py
@@ -51,3 +51,26 @@
webnotes.conn.sql("""update `tabAddress` set `%s`=0 where `%s`=%s and name!=%s""" %
(is_address_type, fieldname, "%s", "%s"), (self.doc.fields[fieldname], self.doc.name))
break
+
+@webnotes.whitelist()
+def get_address_display(address_dict):
+ if not isinstance(address_dict, dict):
+ address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
+
+ meta = webnotes.get_doctype("Address")
+ sequence = (("", "address_line1"),
+ ("\n", "address_line2"),
+ ("\n", "city"),
+ ("\n", "state"),
+ ("\n" + meta.get_label("pincode") + ": ", "pincode"),
+ ("\n", "country"),
+ ("\n" + meta.get_label("phone") + ": ", "phone"),
+ ("\n" + meta.get_label("fax") + ": ", "fax"))
+
+ display = ""
+ for separator, fieldname in sequence:
+ if address_dict.get(fieldname):
+ display += separator + address_dict.get(fieldname)
+
+ return display.strip()
+
diff --git a/erpnext/utilities/doctype/contact/contact.py b/erpnext/utilities/doctype/contact/contact.py
index 301d7fd..9dcb30d 100644
--- a/erpnext/utilities/doctype/contact/contact.py
+++ b/erpnext/utilities/doctype/contact/contact.py
@@ -5,9 +5,9 @@
import webnotes
from webnotes.utils import cstr, extract_email_id
-from erpnext.utilities.transaction_base import TransactionBase
+from erpnext.controllers.status_updater import StatusUpdater
-class DocType(TransactionBase):
+class DocType(StatusUpdater):
def __init__(self, doc, doclist=[]):
self.doc = doc
self.doclist = doclist
@@ -49,3 +49,20 @@
def on_trash(self):
webnotes.conn.sql("""update `tabSupport Ticket` set contact='' where contact=%s""",
self.doc.name)
+
+@webnotes.whitelist()
+def get_contact_details(contact):
+ contact = webnotes.doc("Contact", contact)
+ out = {
+ "contact_person": contact.get("name"),
+ "contact_display": " ".join(filter(None,
+ [contact.get("first_name"), contact.get("last_name")])),
+ "contact_email": contact.get("email_id"),
+ "contact_mobile": contact.get("mobile_no"),
+ "contact_phone": contact.get("phone"),
+ "contact_designation": contact.get("designation"),
+ "contact_department": contact.get("department")
+ }
+
+ return out
+
\ No newline at end of file
diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py
index eed4639..d58a453 100644
--- a/erpnext/utilities/transaction_base.py
+++ b/erpnext/utilities/transaction_base.py
@@ -9,16 +9,8 @@
from erpnext.controllers.status_updater import StatusUpdater
-class TransactionBase(StatusUpdater):
- def get_default_address_and_contact(self, party_field, party_name=None):
- """get a dict of default field values of address and contact for a given party type
- party_type can be one of: customer, supplier"""
- if not party_name:
- party_name = self.doc.fields.get(party_field)
-
- return get_default_address_and_contact(party_field, party_name,
- fetch_shipping_address=True if self.meta.get_field("shipping_address_name") else False)
-
+
+class TransactionBase(StatusUpdater):
def set_address_fields(self):
party_type, party_name = self.get_party_type_and_name()
@@ -53,80 +45,14 @@
break
return self._party_type_and_name
-
- def get_customer_defaults(self):
- if not self.doc.customer: return {}
-
- out = self.get_default_address_and_contact("customer")
-
- customer = webnotes.doc("Customer", self.doc.customer)
- for f in ['customer_name', 'customer_group', 'territory']:
- out[f] = customer.fields.get(f)
-
- # fields prepended with default in Customer doctype
- for f in ['sales_partner', 'commission_rate', 'currency', 'price_list']:
- if customer.fields.get("default_" + f):
- out[f] = customer.fields.get("default_" + f)
-
- return out
-
- def set_customer_defaults(self):
- """
- For a customer:
- 1. Sets default address and contact
- 2. Sets values like Territory, Customer Group, etc.
- 3. Clears existing Sales Team and fetches the one mentioned in Customer
- """
- customer_defaults = self.get_customer_defaults()
-
- customer_defaults["selling_price_list"] = customer_defaults.get("price_list") or \
- webnotes.conn.get_value("Customer Group", self.doc.customer_group, "default_price_list") or \
- self.doc.selling_price_list
-
- for fieldname, val in customer_defaults.items():
- if self.meta.get_field(fieldname):
- self.doc.fields[fieldname] = val
-
- if self.meta.get_field("sales_team") and self.doc.customer:
- self.set_sales_team_for_customer()
-
- def set_sales_team_for_customer(self):
- from webnotes.model import default_fields
-
- # clear table
- self.doclist = self.doc.clear_table(self.doclist, "sales_team")
-
- sales_team = webnotes.conn.sql("""select * from `tabSales Team`
- where parenttype="Customer" and parent=%s""", self.doc.customer, as_dict=True)
- for i, sales_person in enumerate(sales_team):
- # remove default fields
- for fieldname in default_fields:
- if fieldname in sales_person:
- del sales_person[fieldname]
-
- sales_person.update({
- "doctype": "Sales Team",
- "parentfield": "sales_team",
- "idx": i+1
- })
-
- # add child
- self.doclist.append(sales_person)
-
+
def get_supplier_defaults(self):
- out = self.get_default_address_and_contact("supplier")
-
- supplier = webnotes.doc("Supplier", self.doc.supplier)
- out["supplier_name"] = supplier.supplier_name
- if supplier.default_currency:
- out["currency"] = supplier.default_currency
- if supplier.default_price_list:
- out["buying_price_list"] = supplier.default_price_list
-
- return out
+ from erpnext.buying.doctype.supplier.supplier import get_supplier_details
+ return get_supplier_details(self.doc.supplier)
def set_supplier_defaults(self):
- for fieldname, val in self.get_supplier_defaults().items():
+ from erpnext.buying.doctype.supplier.supplier import get_supplier_details
+ for fieldname, val in get_supplier_details(self.doc.supplier).iteritems():
if self.meta.get_field(fieldname):
self.doc.fields[fieldname] = val
@@ -143,21 +69,7 @@
def set_lead_defaults(self):
self.doc.fields.update(self.get_lead_defaults())
-
- def get_customer_address(self, args):
- args = json.loads(args)
- ret = {
- 'customer_address' : args["address"],
- 'address_display' : get_address_display(args["address"]),
- }
- if args.get('contact'):
- ret.update(map_party_contact_details(args['contact']))
-
- return ret
-
- def set_customer_address(self, args):
- self.doc.fields.update(self.get_customer_address(args))
-
+
# TODO deprecate this - used only in sales_order.js
def get_shipping_address(self, name):
shipping_address = get_default_address("customer", name, is_shipping_address=True)
@@ -306,34 +218,6 @@
for field, condition in fields:
if prevdoc_values[field] is not None:
self.validate_value(field, condition, prevdoc_values[field], doc)
-
-def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
- out = {}
-
- # get addresses
- billing_address = get_default_address(party_field, party_name)
- if billing_address:
- out[party_field + "_address"] = billing_address
- out["address_display"] = get_address_display(billing_address)
- else:
- out[party_field + "_address"] = out["address_display"] = None
-
- if fetch_shipping_address:
- shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
- if shipping_address:
- out["shipping_address_name"] = shipping_address
- out["shipping_address"] = get_address_display(shipping_address)
- else:
- out["shipping_address_name"] = out["shipping_address"] = None
-
- # get contact
- if party_field == "lead":
- out["customer_address"] = out.get("lead_address")
- out.update(map_lead_contact_details(party_name))
- else:
- out.update(map_party_contact_details(None, party_field, party_name))
-
- return out
def get_default_address(party_field, party_name, is_shipping_address=False):
if is_shipping_address:
@@ -352,23 +236,7 @@
(party_name,))
return contact[0][0] if contact else None
-
-def get_address_display(address_dict):
- if not isinstance(address_dict, dict):
- address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
-
- meta = webnotes.get_doctype("Address")
- sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
- ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
- ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
-
- display = ""
- for separator, fieldname in sequence:
- if address_dict.get(fieldname):
- display += separator + address_dict.get(fieldname)
- return display.strip()
-
def map_lead_contact_details(party_name):
out = {}
for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]: