blob: 8df7f25b4de6324c0bfa7da3fb8a743c1ff6f308 [file] [log] [blame]
Rushabh Mehtaad45e312013-11-20 12:59:58 +05301# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
Rushabh Mehtae67d1fb2013-08-05 14:59:54 +05302# License: GNU General Public License v3. See license.txt
Rushabh Mehta3966f1d2012-02-23 12:35:32 +05303
Anand Doshi486f9df2012-07-19 13:40:31 +05304from __future__ import unicode_literals
Rushabh Mehta1f847992013-12-12 19:12:19 +05305import webnotes, json
Anand Doshi1dde46a2013-05-15 21:15:57 +05306from webnotes import msgprint, _
Rushabh Mehta1f847992013-12-12 19:12:19 +05307from webnotes.utils import cstr, flt, now_datetime, cint
Anand Doshi0fd99e72012-11-30 16:38:04 +05308from webnotes.model.doc import addchild
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +05309
Rushabh Mehta1f847992013-12-12 19:12:19 +053010from erpnext.controllers.status_updater import StatusUpdater
Anand Doshi756dca72013-01-15 18:39:21 +053011
Nabin Hait0feebc12013-06-03 16:45:38 +053012class TransactionBase(StatusUpdater):
Anand Doshi99100a42013-07-04 17:13:53 +053013 def get_default_address_and_contact(self, party_field, party_name=None):
Anand Doshiedc5f2e2013-04-26 17:21:49 +053014 """get a dict of default field values of address and contact for a given party type
15 party_type can be one of: customer, supplier"""
Anand Doshi99100a42013-07-04 17:13:53 +053016 if not party_name:
17 party_name = self.doc.fields.get(party_field)
Anand Doshiedc5f2e2013-04-26 17:21:49 +053018
Anand Doshi99100a42013-07-04 17:13:53 +053019 return get_default_address_and_contact(party_field, party_name,
20 fetch_shipping_address=True if self.meta.get_field("shipping_address_name") else False)
21
Anand Doshi2ac0a832013-07-10 20:49:44 +053022 def set_address_fields(self):
23 party_type, party_name = self.get_party_type_and_name()
24
25 if party_type in ("Customer", "Lead"):
26 if self.doc.customer_address:
27 self.doc.address_display = get_address_display(self.doc.customer_address)
28
29 if self.doc.shipping_address_name:
30 self.doc.shipping_address = get_address_display(self.doc.shipping_address_name)
31
32 elif self.doc.supplier_address:
33 self.doc.address_display = get_address_display(self.doc.supplier_address)
34
35 def set_contact_fields(self):
36 party_type, party_name = self.get_party_type_and_name()
37
38 if party_type == "Lead":
39 contact_dict = map_lead_contact_details(party_name)
40 else:
41 contact_dict = map_party_contact_details(self.doc.contact_person, party_type, party_name)
42
43 for fieldname, value in contact_dict.items():
44 if self.meta.get_field(fieldname):
45 self.doc.fields[fieldname] = value
46
47 def get_party_type_and_name(self):
48 if not hasattr(self, "_party_type_and_name"):
49 for party_type in ("Lead", "Customer", "Supplier"):
50 party_field = party_type.lower()
51 if self.meta.get_field(party_field) and self.doc.fields.get(party_field):
52 self._party_type_and_name = (party_type, self.doc.fields.get(party_field))
53 break
54
55 return self._party_type_and_name
56
Anand Doshi99100a42013-07-04 17:13:53 +053057 def get_customer_defaults(self):
Anand Doshi047f8d72013-08-27 14:20:00 +053058 if not self.doc.customer: return {}
59
Anand Doshi99100a42013-07-04 17:13:53 +053060 out = self.get_default_address_and_contact("customer")
61
62 customer = webnotes.doc("Customer", self.doc.customer)
63 for f in ['customer_name', 'customer_group', 'territory']:
64 out[f] = customer.fields.get(f)
Anand Doshiedc5f2e2013-04-26 17:21:49 +053065
Anand Doshi99100a42013-07-04 17:13:53 +053066 # fields prepended with default in Customer doctype
Akhilesh Darjee2ced3b02014-01-28 19:16:05 +053067 for f in ['sales_partner', 'commission_rate', 'currency', 'price_list', 'taxes_and_charges']:
Anand Doshi946e0de2013-07-11 18:26:00 +053068 if customer.fields.get("default_" + f):
69 out[f] = customer.fields.get("default_" + f)
Anand Doshi99100a42013-07-04 17:13:53 +053070
71 return out
72
73 def set_customer_defaults(self):
74 """
75 For a customer:
76 1. Sets default address and contact
77 2. Sets values like Territory, Customer Group, etc.
78 3. Clears existing Sales Team and fetches the one mentioned in Customer
79 """
80 customer_defaults = self.get_customer_defaults()
Nabin Haitdc15b4f2014-01-20 16:48:49 +053081
82 customer_defaults["selling_price_list"] = \
83 self.get_user_default_price_list("selling_price_list") or \
84 customer_defaults.get("price_list") or \
85 webnotes.conn.get_value("Customer Group", self.doc.customer_group,
86 "default_price_list") or self.doc.selling_price_list
Anand Doshi99100a42013-07-04 17:13:53 +053087
Anand Doshif2045fb2013-07-25 17:46:02 +053088 for fieldname, val in customer_defaults.items():
Anand Doshi6c0b9362013-07-26 11:32:26 +053089 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +053090 self.doc.fields[fieldname] = val
91
Nabin Haitd2b87262013-09-02 20:12:53 +053092 if self.meta.get_field("sales_team") and self.doc.customer:
Anand Doshi99100a42013-07-04 17:13:53 +053093 self.set_sales_team_for_customer()
94
Nabin Haitdc15b4f2014-01-20 16:48:49 +053095 def get_user_default_price_list(self, price_list):
96 from webnotes.defaults import get_defaults_for
97 user_default_price_list = get_defaults_for(webnotes.session.user).get(price_list)
98 return cstr(user_default_price_list) \
99 if not isinstance(user_default_price_list, list) else ""
100
Anand Doshi99100a42013-07-04 17:13:53 +0530101 def set_sales_team_for_customer(self):
102 from webnotes.model import default_fields
103
104 # clear table
105 self.doclist = self.doc.clear_table(self.doclist, "sales_team")
106
107 sales_team = webnotes.conn.sql("""select * from `tabSales Team`
108 where parenttype="Customer" and parent=%s""", self.doc.customer, as_dict=True)
109 for i, sales_person in enumerate(sales_team):
110 # remove default fields
111 for fieldname in default_fields:
112 if fieldname in sales_person:
113 del sales_person[fieldname]
114
115 sales_person.update({
116 "doctype": "Sales Team",
117 "parentfield": "sales_team",
Akhilesh Darjee4f721562014-01-29 16:31:38 +0530118 "idx": i + 1
Anand Doshi99100a42013-07-04 17:13:53 +0530119 })
120
121 # add child
122 self.doclist.append(sales_person)
Anand Doshif2045fb2013-07-25 17:46:02 +0530123
124 def get_supplier_defaults(self):
125 out = self.get_default_address_and_contact("supplier")
126
127 supplier = webnotes.doc("Supplier", self.doc.supplier)
128 out["supplier_name"] = supplier.supplier_name
Anand Doshic7280b42013-07-29 11:48:28 +0530129 if supplier.default_currency:
130 out["currency"] = supplier.default_currency
Akhilesh Darjee2ced3b02014-01-28 19:16:05 +0530131
132 # fields prepended with default in Customer doctype
133 for f in ['currency', 'taxes_and_charges']:
134 if supplier.fields.get("default_" + f):
135 out[f] = supplier.fields.get("default_" + f)
Nabin Haitdc15b4f2014-01-20 16:48:49 +0530136
137 out["buying_price_list"] = self.get_user_default_price_list("buying_price_list") or \
138 supplier.default_price_list or self.doc.buying_price_list
Anand Doshif2045fb2013-07-25 17:46:02 +0530139
140 return out
Akhilesh Darjee4f721562014-01-29 16:31:38 +0530141
Anand Doshif2045fb2013-07-25 17:46:02 +0530142 def set_supplier_defaults(self):
143 for fieldname, val in self.get_supplier_defaults().items():
Anand Doshi6c0b9362013-07-26 11:32:26 +0530144 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +0530145 self.doc.fields[fieldname] = val
146
Anand Doshi99100a42013-07-04 17:13:53 +0530147 def get_lead_defaults(self):
148 out = self.get_default_address_and_contact("lead")
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530149
Anand Doshi99100a42013-07-04 17:13:53 +0530150 lead = webnotes.conn.get_value("Lead", self.doc.lead,
151 ["territory", "company_name", "lead_name"], as_dict=True) or {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530152
Anand Doshi99100a42013-07-04 17:13:53 +0530153 out["territory"] = lead.get("territory")
154 out["customer_name"] = lead.get("company_name") or lead.get("lead_name")
155
156 return out
157
158 def set_lead_defaults(self):
159 self.doc.fields.update(self.get_lead_defaults())
Anand Doshi99100a42013-07-04 17:13:53 +0530160
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530161 def get_customer_address(self, args):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530162 args = json.loads(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530163 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530164 'customer_address' : args["address"],
165 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530166 }
Nabin Haita279d782013-07-15 13:04:33 +0530167 if args.get('contact'):
168 ret.update(map_party_contact_details(args['contact']))
Anand Doshiae30e012012-10-26 15:01:22 +0530169
Anand Doshi2ac0a832013-07-10 20:49:44 +0530170 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530171
172 def set_customer_address(self, args):
173 self.doc.fields.update(self.get_customer_address(args))
174
Anand Doshi99100a42013-07-04 17:13:53 +0530175 # TODO deprecate this - used only in sales_order.js
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530176 def get_shipping_address(self, name):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530177 shipping_address = get_default_address("customer", name, is_shipping_address=True)
178 return {
179 'shipping_address_name' : shipping_address,
180 'shipping_address' : get_address_display(shipping_address) if shipping_address else None
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530181 }
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530182
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530183 # Get Supplier Default Primary Address - first load
184 # -----------------------
185 def get_default_supplier_address(self, args):
Anand Doshi923d41d2013-05-28 17:23:36 +0530186 if isinstance(args, basestring):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530187 args = json.loads(args)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530188
189 address_name = get_default_address("supplier", args["supplier"])
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530190 ret = {
191 'supplier_address' : address_name,
Anand Doshi2ac0a832013-07-10 20:49:44 +0530192 'address_display' : get_address_display(address_name),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530193 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530194 ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530195 ret.update(self.get_supplier_details(args['supplier']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530196 return ret
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530197
198 # Get Supplier Address
199 # -----------------------
200 def get_supplier_address(self, args):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530201 args = json.loads(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530202 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530203 'supplier_address' : args['address'],
204 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530205 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530206 ret.update(map_party_contact_details(contact_name=args['contact']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530207 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530208
209 def set_supplier_address(self, args):
210 self.doc.fields.update(self.get_supplier_address(args))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530211
212 # Get Supplier Details
213 # -----------------------
Anand Doshif2f5c942012-07-18 20:13:52 +0530214 def get_supplier_details(self, name):
215 supplier_details = webnotes.conn.sql("""\
216 select supplier_name, default_currency
217 from `tabSupplier`
218 where name = %s and docstatus < 2""", name, as_dict=1)
219 if supplier_details:
220 return {
221 'supplier_name': (supplier_details[0]['supplier_name']
222 or self.doc.fields.get('supplier_name')),
223 'currency': (supplier_details[0]['default_currency']
224 or self.doc.fields.get('currency')),
225 }
226 else:
227 return {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530228
229 # Get Sales Person Details of Customer
230 # ------------------------------------
231 def get_sales_person(self, name):
Anand Doshi8ae5ba92012-06-25 20:05:35 +0530232 self.doclist = self.doc.clear_table(self.doclist,'sales_team')
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530233 idx = 0
Anand Doshi74d1b652012-01-27 12:25:09 +0530234 for d in webnotes.conn.sql("select sales_person, allocated_percentage, allocated_amount, incentives from `tabSales Team` where parent = '%s'" % name):
Anand Doshif5d90ab2012-12-24 17:02:38 +0530235 ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530236 ch.sales_person = d and cstr(d[0]) or ''
237 ch.allocated_percentage = d and flt(d[1]) or 0
238 ch.allocated_amount = d and flt(d[2]) or 0
239 ch.incentives = d and flt(d[3]) or 0
240 ch.idx = idx
241 idx += 1
Nabin Hait41cc3272012-04-30 14:36:18 +0530242
Rushabh Mehta35c017a2012-11-30 10:57:28 +0530243 def load_notification_message(self):
244 dt = self.doc.doctype.lower().replace(" ", "_")
245 if int(webnotes.conn.get_value("Notification Control", None, dt) or 0):
246 self.doc.fields["__notification_message"] = \
247 webnotes.conn.get_value("Notification Control", None, dt + "_message")
Rushabh Mehta96690eb2013-09-02 17:04:27 +0530248
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530249 def validate_posting_time(self):
250 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530251 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530252
Anand Doshi670199b2013-06-10 15:38:01 +0530253 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530254 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530255 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530256
257 self.delete_events()
258 self._add_calendar_event(opts)
259
260 def delete_events(self):
261 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Nabin Haitad6ce4e2013-09-19 11:02:24 +0530262 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)),
263 ignore_permissions=True)
Anand Doshie53a81d2013-06-10 15:15:40 +0530264
265 def _add_calendar_event(self, opts):
266 opts = webnotes._dict(opts)
267
268 if self.doc.contact_date:
269 event_doclist = [{
270 "doctype": "Event",
271 "owner": opts.owner or self.doc.owner,
272 "subject": opts.subject,
273 "description": opts.description,
274 "starts_on": self.doc.contact_date + " 10:00:00",
275 "event_type": "Private",
276 "ref_type": self.doc.doctype,
277 "ref_name": self.doc.name
278 }]
279
280 if webnotes.conn.exists("Profile", self.doc.contact_by):
281 event_doclist.append({
282 "doctype": "Event User",
283 "parentfield": "event_individuals",
284 "person": self.doc.contact_by
285 })
286
287 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530288
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530289 def validate_uom_is_integer(self, uom_field, qty_fields):
290 validate_uom_is_integer(self.doclist, uom_field, qty_fields)
291
Nabin Hait2bd37772013-07-08 19:00:29 +0530292 def validate_with_previous_doc(self, source_dt, ref):
293 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530294 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530295 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530296 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530297 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530298 ref_dn = d.fields.get(val["ref_dn_field"])
299 if ref_dn:
300 if is_child:
301 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530302 if ref_dn not in item_ref_dn:
303 item_ref_dn.append(ref_dn)
Nabin Hait5e200e42013-07-29 15:29:51 +0530304 elif not val.get("allow_duplicate_prev_row_id"):
Nabin Haita9ec49e2013-07-15 16:33:24 +0530305 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
306 _(": Duplicate row from same ") + key, raise_exception=1)
307 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530308 ref_doc.setdefault(key, [])
309 if ref_dn not in ref_doc[key]:
310 ref_doc[key].append(ref_dn)
311 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530312 self.compare_values(ref_doc, val["compare_fields"])
313
314 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530315 for ref_doctype, ref_dn_list in ref_doc.items():
316 for ref_docname in ref_dn_list:
317 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
318 [d[0] for d in fields], as_dict=1)
319
320 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530321 if prevdoc_values[field] is not None:
322 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530323
324def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
325 out = {}
326
327 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530328 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530329 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530330 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530331 out["address_display"] = get_address_display(billing_address)
332 else:
333 out[party_field + "_address"] = out["address_display"] = None
334
335 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530336 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530337 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530338 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530339 out["shipping_address"] = get_address_display(shipping_address)
340 else:
341 out["shipping_address_name"] = out["shipping_address"] = None
342
343 # get contact
344 if party_field == "lead":
345 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530346 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530347 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530348 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530349
350 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530351
Anand Doshi2ac0a832013-07-10 20:49:44 +0530352def get_default_address(party_field, party_name, is_shipping_address=False):
353 if is_shipping_address:
354 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
355 else:
356 order_by = "is_primary_address desc, name asc"
357
358 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
359 limit 1""" % (party_field, "%s", order_by), party_name)
360
361 return address[0][0] if address else None
362
363def get_default_contact(party_field, party_name):
364 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
365 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
366 (party_name,))
367
368 return contact[0][0] if contact else None
369
Anand Doshiedbf3e12013-07-02 11:40:16 +0530370def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530371 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530372 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530373
Anand Doshiedbf3e12013-07-02 11:40:16 +0530374 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530375 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530376 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
377 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
378
Anand Doshi2ac0a832013-07-10 20:49:44 +0530379 display = ""
380 for separator, fieldname in sequence:
381 if address_dict.get(fieldname):
382 display += separator + address_dict.get(fieldname)
383
384 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530385
Anand Doshi2ac0a832013-07-10 20:49:44 +0530386def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530387 out = {}
388 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
389 out[fieldname] = None
390
391 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
392 if lead:
393 lead = lead[0]
394 out.update({
395 "contact_display": lead.get("lead_name"),
396 "contact_email": lead.get("email_id"),
397 "contact_mobile": lead.get("mobile_no"),
398 "contact_phone": lead.get("phone"),
399 })
400
401 return out
402
Anand Doshi2ac0a832013-07-10 20:49:44 +0530403def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530404 out = {}
405 for fieldname in ["contact_person", "contact_display", "contact_email",
406 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
407 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530408
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530409 if not contact_name and party_field:
410 contact_name = get_default_contact(party_field, party_name)
411
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530412 if contact_name:
413 contact = webnotes.conn.sql("""select * from `tabContact` where name=%s""",
414 contact_name, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530415
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530416 if contact:
417 contact = contact[0]
418 out.update({
419 "contact_person": contact.get("name"),
420 "contact_display": " ".join(filter(None,
421 [contact.get("first_name"), contact.get("last_name")])),
422 "contact_email": contact.get("email_id"),
423 "contact_mobile": contact.get("mobile_no"),
424 "contact_phone": contact.get("phone"),
425 "contact_designation": contact.get("designation"),
426 "contact_department": contact.get("department")
427 })
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530428
Anand Doshi99100a42013-07-04 17:13:53 +0530429 return out
430
431def get_address_territory(address_doc):
432 territory = None
433 for fieldname in ("city", "state", "country"):
434 value = address_doc.fields.get(fieldname)
435 if value:
436 territory = webnotes.conn.get_value("Territory", value.strip())
437 if territory:
438 break
439
440 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530441
442def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
443 """common validation for currency and price list currency"""
Akhilesh Darjee10dce342013-09-25 11:09:33 +0530444
Anand Doshi1dde46a2013-05-15 21:15:57 +0530445 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
Akhilesh Darjeee0b32822013-11-12 19:27:16 +0530446
Akhilesh Darjee1797cfe2013-10-11 13:34:10 +0530447 if not conversion_rate:
Rushabh Mehta2b089852013-12-19 18:27:48 +0530448 msgprint(_('%(conversion_rate_label)s is mandatory. Maybe Currency Exchange record is not created for %(from_currency)s to %(to_currency)s') % {
Akhilesh Darjeee0b32822013-11-12 19:27:16 +0530449 "conversion_rate_label": conversion_rate_label,
450 "from_currency": currency,
451 "to_currency": company_currency
452 }, raise_exception=True)
Anand Doshi1dde46a2013-05-15 21:15:57 +0530453
454def validate_item_fetch(args, item):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530455 from erpnext.stock.utils import validate_end_of_life
Anand Doshi1dde46a2013-05-15 21:15:57 +0530456 validate_end_of_life(item.name, item.end_of_life)
457
458 # validate company
459 if not args.company:
460 msgprint(_("Please specify Company"), raise_exception=True)
461
Anand Doshif3096132013-05-21 19:35:06 +0530462def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530463 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530464 if not meta:
465 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530466
Anand Doshif3096132013-05-21 19:35:06 +0530467 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530468 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530469 validate_conversion_rate(args.currency, args.conversion_rate,
470 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530471
472 # round it
473 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530474 get_field_precision(meta.get_field("conversion_rate"),
475 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530476
Anand Doshif3096132013-05-21 19:35:06 +0530477 # validate price list conversion rate
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530478 if meta.get_field("price_list_currency") and (args.selling_price_list or args.buying_price_list) \
479 and args.price_list_currency:
Anand Doshif3096132013-05-21 19:35:06 +0530480 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530481 meta.get_label("plc_conversion_rate"), args.company)
482
483 # round it
484 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530485 get_field_precision(meta.get_field("plc_conversion_rate"),
486 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530487
Anand Doshi11d31132013-06-17 12:51:36 +0530488def delete_events(ref_type, ref_name):
489 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530490 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530491
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530492class UOMMustBeIntegerError(webnotes.ValidationError): pass
493
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530494def validate_uom_is_integer(doclist, uom_field, qty_fields):
495 if isinstance(qty_fields, basestring):
496 qty_fields = [qty_fields]
497
498 integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom,
499 "must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
500
501 if not integer_uoms:
502 return
503
504 for d in doclist:
505 if d.fields.get(uom_field) in integer_uoms:
506 for f in qty_fields:
507 if d.fields.get(f):
508 if cint(d.fields[f])!=d.fields[f]:
509 webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
510 + "': " + _("Quantity cannot be a fraction.") \
511 + " " + _("In Row") + ": " + str(d.idx),
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530512 raise_exception=UOMMustBeIntegerError)