[fixes] address and contact
diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.py b/erpnext/accounts/doctype/tax_rule/tax_rule.py
index 7ec833e..606d067 100644
--- a/erpnext/accounts/doctype/tax_rule/tax_rule.py
+++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py
@@ -7,6 +7,7 @@
from frappe import _
from frappe.model.document import Document
from frappe.utils import cstr, cint
+from frappe.geo.doctype.address.address import get_default_address
class IncorrectCustomerGroup(frappe.ValidationError): pass
class IncorrectSupplierType(frappe.ValidationError): pass
@@ -96,27 +97,31 @@
@frappe.whitelist()
def get_party_details(party, party_type, args=None):
out = {}
+ billing_address, shipping_address = None, None
if args:
- billing_filters= {"name": args.get("billing_address")}
- shipping_filters= {"name": args.get("shipping_address")}
+ if args.get('billing_address'):
+ billing_address = frappe.get_doc('Address', args.get('billing_address'))
+ if args.get('shipping_address'):
+ shipping_address = frappe.get_doc('Address', args.get('shipping_address'))
else:
- billing_filters= {party_type: party, "is_primary_address": 1}
- shipping_filters= {party_type:party, "is_shipping_address": 1}
-
- billing_address= frappe.get_all("Address", fields=["city", "county", "state", "country"], filters= billing_filters)
- shipping_address= frappe.get_all("Address", fields=["city", "county", "state", "country"], filters= shipping_filters)
+ billing_address_name = get_default_address(party_type, party)
+ shipping_address_name = get_default_address(party_type, party, 'is_shipping_address')
+ if billing_address_name:
+ billing_address = frappe.get_doc('Address', billing_address_name)
+ if shipping_address_name:
+ shipping_address = frappe.get_doc('Address', shipping_address_name)
if billing_address:
- out["billing_city"]= billing_address[0].city
- out["billing_county"]= billing_address[0].county
- out["billing_state"]= billing_address[0].state
- out["billing_country"]= billing_address[0].country
+ out["billing_city"]= billing_address.city
+ out["billing_county"]= billing_address.county
+ out["billing_state"]= billing_address.state
+ out["billing_country"]= billing_address.country
if shipping_address:
- out["shipping_city"]= shipping_address[0].city
- out["shipping_county"]= shipping_address[0].county
- out["shipping_state"]= shipping_address[0].state
- out["shipping_country"]= shipping_address[0].country
+ out["shipping_city"]= shipping_address.city
+ out["shipping_county"]= shipping_address.county
+ out["shipping_state"]= shipping_address.state
+ out["shipping_country"]= shipping_address.country
return out
diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py
index 3677ee2..9eaaad1 100644
--- a/erpnext/buying/doctype/supplier/supplier.py
+++ b/erpnext/buying/doctype/supplier/supplier.py
@@ -6,7 +6,9 @@
import frappe.defaults
from frappe import msgprint, _
from frappe.model.naming import make_autoname
-from erpnext.utilities.address_and_contact import load_address_and_contact
+from erpnext.utilities.address_and_contact import (load_address_and_contact,
+ delete_contact_and_address)
+
from erpnext.utilities.transaction_base import TransactionBase
from erpnext.accounts.party import validate_party_accounts, get_timeline_data # keep this
from erpnext.accounts.party_status import get_party_status
@@ -46,21 +48,10 @@
else:
self.name = make_autoname(self.naming_series + '.#####')
- def update_address(self):
- frappe.db.sql("""update `tabAddress` set supplier_name=%s, modified=NOW()
- where supplier=%s""", (self.supplier_name, self.name))
-
- def update_contact(self):
- frappe.db.sql("""update `tabContact` set supplier_name=%s, modified=NOW()
- where supplier=%s""", (self.supplier_name, self.name))
-
def on_update(self):
if not self.naming_series:
self.naming_series = ''
- self.update_address()
- self.update_contact()
-
def validate(self):
#validation for Naming Series mandatory field...
if frappe.defaults.get_global_default('supp_master_name') == 'Naming Series':
@@ -78,28 +69,9 @@
else:
return ''
- def delete_supplier_address(self):
- for rec in frappe.db.sql("select * from `tabAddress` where supplier=%s", (self.name,), as_dict=1):
- frappe.db.sql("delete from `tabAddress` where name=%s",(rec['name']))
-
- def delete_supplier_contact(self):
- for contact in frappe.db.sql_list("""select name from `tabContact`
- where supplier=%s""", self.name):
- frappe.delete_doc("Contact", contact)
-
def on_trash(self):
- self.delete_supplier_address()
- self.delete_supplier_contact()
+ delete_contact_and_address('Supplier', self.name)
def after_rename(self, olddn, newdn, merge=False):
- set_field = ''
if frappe.defaults.get_global_default('supp_master_name') == 'Supplier Name':
frappe.db.set(self, "supplier_name", newdn)
- self.update_contact()
- set_field = ", supplier_name=%(newdn)s"
- self.update_supplier_address(newdn, set_field)
-
- def update_supplier_address(self, newdn, set_field):
- frappe.db.sql("""update `tabAddress` set address_title=%(newdn)s
- {set_field} where supplier=%(newdn)s"""\
- .format(set_field=set_field), ({"newdn": newdn}))
\ No newline at end of file
diff --git a/erpnext/demo/data/address.json b/erpnext/demo/data/address.json
index de0e3c8..7618c2c 100644
--- a/erpnext/demo/data/address.json
+++ b/erpnext/demo/data/address.json
@@ -5,7 +5,7 @@
"city": "Larnaka",
"country": "Cyprus",
"links": [{"link_doctype": "Customer", "link_name": "Adaptas"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "R Patr\u00e3o Caramelho 116",
@@ -13,7 +13,7 @@
"city": "Fajozes",
"country": "Portugal",
"links": [{"link_doctype": "Customer", "link_name": "Asian Fusion"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "30 Fulford Road",
@@ -21,7 +21,7 @@
"city": "PENTRE-PIOD",
"country": "United Kingdom",
"links": [{"link_doctype": "Customer", "link_name": "Asian Junction"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "Schoenebergerstrasse 13",
@@ -29,7 +29,7 @@
"city": "Raschau",
"country": "Germany",
"links": [{"link_doctype": "Customer", "link_name": "Big D Supermarkets"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "Hoheluftchaussee 43",
@@ -37,7 +37,7 @@
"city": "Kieritzsch",
"country": "Germany",
"links": [{"link_doctype": "Customer", "link_name": "Buttrey Food & Drug"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "R Cimo Vila 6",
@@ -45,7 +45,7 @@
"city": "Rebordosa",
"country": "Portugal",
"links": [{"link_doctype": "Customer", "link_name": "Chi-Chis"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "R 5 Outubro 9",
@@ -53,7 +53,7 @@
"city": "Quinta Nova S\u00e3o Domingos",
"country": "Portugal",
"links": [{"link_doctype": "Customer", "link_name": "Choices"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "Avenida Macambira 953",
@@ -61,7 +61,7 @@
"city": "Goi\u00e2nia",
"country": "Brazil",
"links": [{"link_doctype": "Customer", "link_name": "Consumers and Consumers Express"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "2342 Goyeau Ave",
@@ -69,7 +69,7 @@
"city": "Windsor",
"country": "Canada",
"links": [{"link_doctype": "Customer", "link_name": "Crafts Canada"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "Laukaantie 82",
@@ -77,7 +77,7 @@
"city": "KOKKOLA",
"country": "Finland",
"links": [{"link_doctype": "Customer", "link_name": "Endicott Shoes"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "9 Brown Street",
@@ -85,7 +85,7 @@
"city": "PETERSHAM",
"country": "Australia",
"links": [{"link_doctype": "Customer", "link_name": "Fayva"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "Via Donnalbina 41",
@@ -93,7 +93,7 @@
"city": "Cala Gonone",
"country": "Italy",
"links": [{"link_doctype": "Customer", "link_name": "Intelacard"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "Liljerum Grenadj\u00e4rtorpet 69",
@@ -101,7 +101,7 @@
"city": "TOMTEBODA",
"country": "Sweden",
"links": [{"link_doctype": "Customer", "link_name": "Landskip Yard Care"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "72 Bishopgate Street",
@@ -109,7 +109,7 @@
"city": "SEAHAM",
"country": "United Kingdom",
"links": [{"link_doctype": "Customer", "link_name": "Life Plan Counselling"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "\u03a3\u03ba\u03b1\u03c6\u03af\u03b4\u03b9\u03b1 105",
@@ -117,7 +117,7 @@
"city": "\u03a0\u0391\u03a1\u0395\u039a\u039a\u039b\u0397\u03a3\u0399\u0391",
"country": "Cyprus",
"links": [{"link_doctype": "Customer", "link_name": "Mr Fables"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "Mellemvej 7",
@@ -125,7 +125,7 @@
"city": "Aabybro",
"country": "Denmark",
"links": [{"link_doctype": "Customer", "link_name": "Nelson Brothers"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "Plougg\u00e5rdsvej 98",
@@ -133,7 +133,7 @@
"city": "Karby",
"country": "Denmark",
"links": [{"link_doctype": "Customer", "link_name": "Netobill"}],
- "phone": "23566775757",
+ "phone": "23566775757"
},
{
"address_line1": "176 Michalakopoulou Street",
@@ -141,7 +141,7 @@
"city": "Agio Georgoudi",
"country": "Cyprus",
"phone": "23566775757",
- "links": [{"link_doctype": "Supplier", "link_name": "Helios Air"}],
+ "links": [{"link_doctype": "Supplier", "link_name": "Helios Air"}]
},
{
"address_line1": "Fibichova 1102",
@@ -149,7 +149,7 @@
"city": "Kokor\u00edn",
"country": "Czech Republic",
"phone": "23566775757",
- "links": [{"link_doctype": "Supplier", "link_name": "Ks Merchandise"}],
+ "links": [{"link_doctype": "Supplier", "link_name": "Ks Merchandise"}]
},
{
"address_line1": "Zahradn\u00ed 888",
@@ -157,7 +157,7 @@
"city": "Cecht\u00edn",
"country": "Czech Republic",
"phone": "23566775757",
- "links": [{"link_doctype": "Supplier", "link_name": "HomeBase"}],
+ "links": [{"link_doctype": "Supplier", "link_name": "HomeBase"}]
},
{
"address_line1": "ul. Grochowska 94",
@@ -165,7 +165,7 @@
"city": "Warszawa",
"country": "Poland",
"phone": "23566775757",
- "links": [{"link_doctype": "Supplier", "link_name": "Scott Ties"}],
+ "links": [{"link_doctype": "Supplier", "link_name": "Scott Ties"}]
},
{
"address_line1": "Norra Esplanaden 87",
@@ -173,7 +173,7 @@
"city": "HELSINKI",
"country": "Finland",
"phone": "23566775757",
- "links": [{"link_doctype": "Supplier", "link_name": "Reliable Investments"}],
+ "links": [{"link_doctype": "Supplier", "link_name": "Reliable Investments"}]
},
{
"address_line1": "2038 Fallon Drive",
@@ -181,7 +181,7 @@
"city": "Dresden",
"country": "Canada",
"phone": "23566775757",
- "links": [{"link_doctype": "Supplier", "link_name": "Nan Duskin"}],
+ "links": [{"link_doctype": "Supplier", "link_name": "Nan Duskin"}]
},
{
"address_line1": "77 cours Franklin Roosevelt",
@@ -189,7 +189,7 @@
"city": "MARSEILLE",
"country": "France",
"phone": "23566775757",
- "links": [{"link_doctype": "Supplier", "link_name": "Rainbow Records"}],
+ "links": [{"link_doctype": "Supplier", "link_name": "Rainbow Records"}]
},
{
"address_line1": "ul. Tuwima Juliana 85",
@@ -197,7 +197,7 @@
"city": "\u0141\u00f3d\u017a",
"country": "Poland",
"phone": "23566775757",
- "links": [{"link_doctype": "Supplier", "link_name": "New World Realty"}],
+ "links": [{"link_doctype": "Supplier", "link_name": "New World Realty"}]
},
{
"address_line1": "Gl. Sygehusvej 41",
@@ -205,7 +205,7 @@
"city": "Narsaq",
"country": "Greenland",
"phone": "23566775757",
- "links": [{"link_doctype": "Supplier", "link_name": "Asiatic Solutions"}],
+ "links": [{"link_doctype": "Supplier", "link_name": "Asiatic Solutions"}]
},
{
"address_line1": "Gosposka ulica 50",
@@ -213,6 +213,6 @@
"city": "Nova Gorica",
"country": "Slovenia",
"phone": "23566775757",
- "links": [{"link_doctype": "Supplier", "link_name": "Eagle Hardware"}],
+ "links": [{"link_doctype": "Supplier", "link_name": "Eagle Hardware"}]
}
]
\ No newline at end of file
diff --git a/erpnext/demo/data/contact.json b/erpnext/demo/data/contact.json
index 9911a7f..113b561 100644
--- a/erpnext/demo/data/contact.json
+++ b/erpnext/demo/data/contact.json
@@ -105,60 +105,60 @@
"links": [{"link_doctype": "Supplier", "link_name": "Helios Air"}],
"email_id": "TewoldeAbaalom@example.com",
"first_name": "Tewolde",
- "last_name": "Abaalom",
+ "last_name": "Abaalom"
},
{
"links": [{"link_doctype": "Supplier", "link_name": "Ks Merchandise"}],
"email_id": "LeilaFernandesRodrigues@example.com",
"first_name": "Leila",
- "last_name": "Rodrigues",
+ "last_name": "Rodrigues"
},
{
"links": [{"link_doctype": "Supplier", "link_name": "HomeBase"}],
"email_id": "DmitryBulgakov@example.com",
"first_name": "Dmitry",
- "last_name": "Bulgakov",
+ "last_name": "Bulgakov"
},
{
"links": [{"link_doctype": "Supplier", "link_name": "Scott Ties"}],
"email_id": "HaiducWhitfoot@example.com",
"first_name": "Haiduc",
- "last_name": "Whitfoot",
+ "last_name": "Whitfoot"
},
{
"links": [{"link_doctype": "Supplier", "link_name": "Reliable Investments"}],
"email_id": "SesseljaPetursdottir@example.com",
"first_name": "Sesselja",
- "last_name": "P\u00e9tursd\u00f3ttir",
+ "last_name": "P\u00e9tursd\u00f3ttir"
},
{
"links": [{"link_doctype": "Supplier", "link_name": "Nan Duskin"}],
"email_id": "HajdarPignar@example.com",
"first_name": "Hajdar",
- "last_name": "Pignar",
+ "last_name": "Pignar"
},
{
"links": [{"link_doctype": "Supplier", "link_name": "Rainbow Records"}],
"email_id": "GustavaLorenzo@example.com",
"first_name": "Gustava",
- "last_name": "Lorenzo",
+ "last_name": "Lorenzo"
},
{
"links": [{"link_doctype": "Supplier", "link_name": "New World Realty"}],
"email_id": "BethanyWood@example.com",
"first_name": "Bethany",
- "last_name": "Wood",
+ "last_name": "Wood"
},
{
"links": [{"link_doctype": "Supplier", "link_name": "Asiatic Solutions"}],
"email_id": "GlorianaBrownlock@example.com",
"first_name": "Gloriana",
- "last_name": "Brownlock",
+ "last_name": "Brownlock"
},
{
"links": [{"link_doctype": "Supplier", "link_name": "Eagle Hardware"}],
"email_id": "JensonFraser@gustr.com",
"first_name": "Jenson",
- "last_name": "Fraser",
+ "last_name": "Fraser"
}
]
\ No newline at end of file
diff --git a/erpnext/demo/setup/setup_data.py b/erpnext/demo/setup/setup_data.py
index 902bbab..21ac648 100644
--- a/erpnext/demo/setup/setup_data.py
+++ b/erpnext/demo/setup/setup_data.py
@@ -32,7 +32,7 @@
import_json('Contact')
import_json('Lead')
setup_currency_exchange()
- setup_mode_of_payment()
+ #setup_mode_of_payment()
setup_account_to_expense_type()
setup_budget()
setup_pos_profile()
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index d794200..acea675 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -114,10 +114,8 @@
]
default_roles = [
- {'role': 'Customer', 'doctype':'Contact', 'email_field': 'email_id',
- 'filters': {'ifnull(customer, "")': ('!=', '')}},
- {'role': 'Supplier', 'doctype':'Contact', 'email_field': 'email_id',
- 'filters': {'ifnull(supplier, "")': ('!=', '')}},
+ {'role': 'Customer', 'doctype':'Contact', 'email_field': 'email_id'},
+ {'role': 'Supplier', 'doctype':'Contact', 'email_field': 'email_id'},
{'role': 'Student', 'doctype':'Student', 'email_field': 'student_email_id'}
]
@@ -154,9 +152,10 @@
"on_cancel": "erpnext.stock.doctype.material_request.material_request.update_completed_and_requested_qty"
},
"User": {
+ "after_insert": "frappe.email.doctype.contact.contact.update_contact",
"validate": "erpnext.hr.doctype.employee.employee.validate_employee_role",
"on_update": "erpnext.hr.doctype.employee.employee.update_user_permissions",
- "on_update": "frappe.email.doctype.contact.contact.update_contact"
+ "on_update": "erpnext.utilities.address_and_contact.set_default_role"
},
("Sales Taxes and Charges Template", 'Price List'): {
"on_update": "erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings.validate_cart_settings"
diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py
index 48e2982..d8011af 100644
--- a/erpnext/selling/doctype/customer/customer.py
+++ b/erpnext/selling/doctype/customer/customer.py
@@ -9,7 +9,7 @@
from frappe.utils import flt, cint, cstr
from frappe.desk.reportview import build_match_conditions
from erpnext.utilities.transaction_base import TransactionBase
-from erpnext.utilities.address_and_contact import load_address_and_contact
+from erpnext.utilities.address_and_contact import load_address_and_contact, delete_contact_and_address
from erpnext.accounts.party import validate_party_accounts, get_timeline_data # keep this
from erpnext.accounts.party_status import get_party_status
from erpnext import get_default_currency
@@ -79,9 +79,6 @@
if self.flags.old_lead != self.lead_name:
self.update_lead_status()
- self.update_address()
- self.update_contact()
-
if self.flags.is_new_doc:
self.create_lead_address_contact()
@@ -95,30 +92,26 @@
for d in frappe.get_all(doctype, {'lead': self.lead_name}):
frappe.db.set_value(doctype, d.name, 'customer', self.name, update_modified=False)
- def update_address(self):
- frappe.db.sql("""update `tabAddress` set customer_name=%s, modified=NOW()
- where customer=%s""", (self.customer_name, self.name))
-
- def update_contact(self):
- frappe.db.sql("""update `tabContact` set customer_name=%s, modified=NOW()
- where customer=%s""", (self.customer_name, self.name))
-
def create_lead_address_contact(self):
if self.lead_name:
- if not frappe.db.get_value("Address", {"lead": self.lead_name, "customer": self.name}):
- frappe.db.sql("""update `tabAddress` set customer=%s, customer_name=%s where lead=%s""",
- (self.name, self.customer_name, self.lead_name))
+ # assign lead address to customer (if already not set)
+ address_name = frappe.get_value('Dynamic Link', dict(parenttype='Address', link_doctype='Lead', link_name=self.name))
+ if address_name:
+ address = frappe.get_doc('Address', address_name)
+ if not address.has_link('Customer', self.name):
+ address.append('links', dict(link_doctype='Customer', link_name=self.name))
+ address.save()
lead = frappe.db.get_value("Lead", self.lead_name, ["lead_name", "email_id", "phone", "mobile_no"], as_dict=True)
+ # create contact from lead
c = frappe.new_doc('Contact')
c.first_name = lead.lead_name
c.email_id = lead.email_id
c.phone = lead.phone
c.mobile_no = lead.mobile_no
- c.customer = self.name
- c.customer_name = self.customer_name
c.is_primary_contact = 1
+ c.append('links', dict(link_doctype='Customer', link_name=self.name))
c.flags.ignore_permissions = self.flags.ignore_permissions
c.autoname()
if not frappe.db.exists("Contact", c.name):
@@ -137,40 +130,14 @@
if flt(self.credit_limit) < outstanding_amt:
frappe.throw(_("""New credit limit is less than current outstanding amount for the customer. Credit limit has to be atleast {0}""").format(outstanding_amt))
- def delete_customer_address(self):
- addresses = frappe.db.sql("""select name, lead from `tabAddress`
- where customer=%s""", (self.name,))
-
- for name, lead in addresses:
- if lead:
- frappe.db.sql("""update `tabAddress` set customer=null, customer_name=null
- where name=%s""", name)
- else:
- frappe.db.sql("""delete from `tabAddress` where name=%s""", name)
-
- def delete_customer_contact(self):
- for contact in frappe.db.sql_list("""select name from `tabContact`
- where customer=%s""", self.name):
- frappe.delete_doc("Contact", contact)
-
def on_trash(self):
- self.delete_customer_address()
- self.delete_customer_contact()
+ delete_contact_and_address('Customer', self.name)
if self.lead_name:
frappe.db.sql("update `tabLead` set status='Interested' where name=%s",self.lead_name)
def after_rename(self, olddn, newdn, merge=False):
- set_field = ''
if frappe.defaults.get_global_default('cust_master_name') == 'Customer Name':
frappe.db.set(self, "customer_name", newdn)
- self.update_contact()
- set_field = ", customer_name=%(newdn)s"
- self.update_customer_address(newdn, set_field)
-
- def update_customer_address(self, newdn, set_field):
- frappe.db.sql("""update `tabAddress` set address_title=%(newdn)s
- {set_field} where customer=%(newdn)s"""\
- .format(set_field=set_field), ({"newdn": newdn}))
def get_customer_list(doctype, txt, searchfield, start, page_len, filters):
diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py
index 395ea51..664c089 100644
--- a/erpnext/setup/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/setup_wizard/setup_wizard.py
@@ -407,7 +407,7 @@
if args.get("customer_contact_" + str(i)):
create_contact(args.get("customer_contact_" + str(i)),
- "customer", doc.name)
+ "Customer", doc.name)
except frappe.NameError:
pass
@@ -425,7 +425,7 @@
if args.get("supplier_contact_" + str(i)):
create_contact(args.get("supplier_contact_" + str(i)),
- "supplier", doc.name)
+ "Supplier", doc.name)
except frappe.NameError:
pass
@@ -433,12 +433,13 @@
"""Create contact based on given contact name"""
contact = contact.strip().split(" ")
- frappe.get_doc({
+ contact = frappe.get_doc({
"doctype":"Contact",
- party_type: party,
"first_name":contact[0],
"last_name": len(contact) > 1 and contact[1] or ""
- }).insert()
+ })
+ contact.append('links', dict(link_doctype=party_type, link_name=party))
+ contact.insert()
def create_letter_head(args):
if args.get("attach_letterhead"):
diff --git a/erpnext/shopping_cart/utils.py b/erpnext/shopping_cart/utils.py
index 50ce5cf..3241234 100644
--- a/erpnext/shopping_cart/utils.py
+++ b/erpnext/shopping_cart/utils.py
@@ -31,12 +31,11 @@
def check_customer_or_supplier():
if frappe.session.user:
- contacts = frappe.get_all("Contact", fields=["customer", "supplier", "email_id"],
- filters={"email_id": frappe.session.user})
+ contact_name = frappe.get_value("Contact", {"email_id": frappe.session.user})
+ if contact_name:
+ contact = frappe.get_doc('Contact', contact_name)
+ for link in contact.links:
+ if link.link_doctype in ('Customer', 'Supplier'):
+ return link.link_doctype, link.link_name
- customer = [d.customer for d in contacts if d.customer] or None
- supplier = [d.supplier for d in contacts if d.supplier] or None
-
- if customer: return 'Customer', customer
- if supplier : return 'Supplier', supplier
return 'Customer', None
\ No newline at end of file
diff --git a/erpnext/utilities/address_and_contact.py b/erpnext/utilities/address_and_contact.py
index fddb1f7..eaa71f9 100644
--- a/erpnext/utilities/address_and_contact.py
+++ b/erpnext/utilities/address_and_contact.py
@@ -34,6 +34,19 @@
doc.set_onload('contact_list', contact_list)
+def set_default_role(doc, method):
+ '''Set customer, supplier, student based on email'''
+ contact_name = frappe.get_value('Contact', dict(email_id=doc.email))
+ if contact_name:
+ contact = frappe.get_doc('Contact', contact_name)
+ for link in contact.links:
+ if link.link_doctype=='Customer':
+ doc.add_roles('Customer')
+ elif link.link_doctype=='Supplier':
+ doc.add_roles('Supplier')
+ elif frappe.get_value('Student', dict(student_email_id=doc.email)):
+ doc.add_roles('Student')
+
def has_permission(doc, ptype, user):
links = get_permitted_and_not_permitted_links(doc.doctype)
if not links.get("not_permitted_links"):
@@ -105,3 +118,14 @@
"permitted_links": permitted_links,
"not_permitted_links": not_permitted_links
}
+
+def delete_contact_and_address(doctype, name):
+ for parenttype in ('Contact', 'Address'):
+ items = frappe.db.sql("""select parent from `tabDynamic Link`
+ where parenttype=%s and link_type=%s and link_name=%s""",
+ (parenttype, doctype, name))
+
+ for name in items:
+ doc = frappe.get_doc(parenttype, name)
+ if len(doc.links)==1:
+ doc.delete()