blob: 0b4b9032eb8e3d829ebe97065a4880e7cb63027f [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
Akhilesh Darjee4f721562014-01-29 16:31:38 +0530146
147 def get_other_charges(self):
148 self.doclist = self.doc.clear_table(self.doclist, "other_charges")
149 self.set_taxes("other_charges", "taxes_and_charges")
Anand Doshif2045fb2013-07-25 17:46:02 +0530150
Anand Doshi99100a42013-07-04 17:13:53 +0530151 def get_lead_defaults(self):
152 out = self.get_default_address_and_contact("lead")
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530153
Anand Doshi99100a42013-07-04 17:13:53 +0530154 lead = webnotes.conn.get_value("Lead", self.doc.lead,
155 ["territory", "company_name", "lead_name"], as_dict=True) or {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530156
Anand Doshi99100a42013-07-04 17:13:53 +0530157 out["territory"] = lead.get("territory")
158 out["customer_name"] = lead.get("company_name") or lead.get("lead_name")
159
160 return out
161
162 def set_lead_defaults(self):
163 self.doc.fields.update(self.get_lead_defaults())
Anand Doshi99100a42013-07-04 17:13:53 +0530164
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530165 def get_customer_address(self, args):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530166 args = json.loads(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530167 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530168 'customer_address' : args["address"],
169 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530170 }
Nabin Haita279d782013-07-15 13:04:33 +0530171 if args.get('contact'):
172 ret.update(map_party_contact_details(args['contact']))
Anand Doshiae30e012012-10-26 15:01:22 +0530173
Anand Doshi2ac0a832013-07-10 20:49:44 +0530174 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530175
176 def set_customer_address(self, args):
177 self.doc.fields.update(self.get_customer_address(args))
178
Anand Doshi99100a42013-07-04 17:13:53 +0530179 # TODO deprecate this - used only in sales_order.js
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530180 def get_shipping_address(self, name):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530181 shipping_address = get_default_address("customer", name, is_shipping_address=True)
182 return {
183 'shipping_address_name' : shipping_address,
184 'shipping_address' : get_address_display(shipping_address) if shipping_address else None
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530185 }
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530186
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530187 # Get Supplier Default Primary Address - first load
188 # -----------------------
189 def get_default_supplier_address(self, args):
Anand Doshi923d41d2013-05-28 17:23:36 +0530190 if isinstance(args, basestring):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530191 args = json.loads(args)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530192
193 address_name = get_default_address("supplier", args["supplier"])
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530194 ret = {
195 'supplier_address' : address_name,
Anand Doshi2ac0a832013-07-10 20:49:44 +0530196 'address_display' : get_address_display(address_name),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530197 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530198 ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530199 ret.update(self.get_supplier_details(args['supplier']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530200 return ret
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530201
202 # Get Supplier Address
203 # -----------------------
204 def get_supplier_address(self, args):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530205 args = json.loads(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530206 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530207 'supplier_address' : args['address'],
208 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530209 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530210 ret.update(map_party_contact_details(contact_name=args['contact']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530211 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530212
213 def set_supplier_address(self, args):
214 self.doc.fields.update(self.get_supplier_address(args))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530215
216 # Get Supplier Details
217 # -----------------------
Anand Doshif2f5c942012-07-18 20:13:52 +0530218 def get_supplier_details(self, name):
219 supplier_details = webnotes.conn.sql("""\
220 select supplier_name, default_currency
221 from `tabSupplier`
222 where name = %s and docstatus < 2""", name, as_dict=1)
223 if supplier_details:
224 return {
225 'supplier_name': (supplier_details[0]['supplier_name']
226 or self.doc.fields.get('supplier_name')),
227 'currency': (supplier_details[0]['default_currency']
228 or self.doc.fields.get('currency')),
229 }
230 else:
231 return {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530232
233 # Get Sales Person Details of Customer
234 # ------------------------------------
235 def get_sales_person(self, name):
Anand Doshi8ae5ba92012-06-25 20:05:35 +0530236 self.doclist = self.doc.clear_table(self.doclist,'sales_team')
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530237 idx = 0
Anand Doshi74d1b652012-01-27 12:25:09 +0530238 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 +0530239 ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530240 ch.sales_person = d and cstr(d[0]) or ''
241 ch.allocated_percentage = d and flt(d[1]) or 0
242 ch.allocated_amount = d and flt(d[2]) or 0
243 ch.incentives = d and flt(d[3]) or 0
244 ch.idx = idx
245 idx += 1
Nabin Hait41cc3272012-04-30 14:36:18 +0530246
Rushabh Mehta35c017a2012-11-30 10:57:28 +0530247 def load_notification_message(self):
248 dt = self.doc.doctype.lower().replace(" ", "_")
249 if int(webnotes.conn.get_value("Notification Control", None, dt) or 0):
250 self.doc.fields["__notification_message"] = \
251 webnotes.conn.get_value("Notification Control", None, dt + "_message")
Rushabh Mehta96690eb2013-09-02 17:04:27 +0530252
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530253 def validate_posting_time(self):
254 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530255 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530256
Anand Doshi670199b2013-06-10 15:38:01 +0530257 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530258 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530259 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530260
261 self.delete_events()
262 self._add_calendar_event(opts)
263
264 def delete_events(self):
265 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Nabin Haitad6ce4e2013-09-19 11:02:24 +0530266 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)),
267 ignore_permissions=True)
Anand Doshie53a81d2013-06-10 15:15:40 +0530268
269 def _add_calendar_event(self, opts):
270 opts = webnotes._dict(opts)
271
272 if self.doc.contact_date:
273 event_doclist = [{
274 "doctype": "Event",
275 "owner": opts.owner or self.doc.owner,
276 "subject": opts.subject,
277 "description": opts.description,
278 "starts_on": self.doc.contact_date + " 10:00:00",
279 "event_type": "Private",
280 "ref_type": self.doc.doctype,
281 "ref_name": self.doc.name
282 }]
283
284 if webnotes.conn.exists("Profile", self.doc.contact_by):
285 event_doclist.append({
286 "doctype": "Event User",
287 "parentfield": "event_individuals",
288 "person": self.doc.contact_by
289 })
290
291 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530292
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530293 def validate_uom_is_integer(self, uom_field, qty_fields):
294 validate_uom_is_integer(self.doclist, uom_field, qty_fields)
295
Nabin Hait2bd37772013-07-08 19:00:29 +0530296 def validate_with_previous_doc(self, source_dt, ref):
297 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530298 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530299 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530300 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530301 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530302 ref_dn = d.fields.get(val["ref_dn_field"])
303 if ref_dn:
304 if is_child:
305 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530306 if ref_dn not in item_ref_dn:
307 item_ref_dn.append(ref_dn)
Nabin Hait5e200e42013-07-29 15:29:51 +0530308 elif not val.get("allow_duplicate_prev_row_id"):
Nabin Haita9ec49e2013-07-15 16:33:24 +0530309 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
310 _(": Duplicate row from same ") + key, raise_exception=1)
311 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530312 ref_doc.setdefault(key, [])
313 if ref_dn not in ref_doc[key]:
314 ref_doc[key].append(ref_dn)
315 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530316 self.compare_values(ref_doc, val["compare_fields"])
317
318 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530319 for ref_doctype, ref_dn_list in ref_doc.items():
320 for ref_docname in ref_dn_list:
321 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
322 [d[0] for d in fields], as_dict=1)
323
324 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530325 if prevdoc_values[field] is not None:
326 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530327
328def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
329 out = {}
330
331 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530332 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530333 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530334 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530335 out["address_display"] = get_address_display(billing_address)
336 else:
337 out[party_field + "_address"] = out["address_display"] = None
338
339 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530340 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530341 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530342 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530343 out["shipping_address"] = get_address_display(shipping_address)
344 else:
345 out["shipping_address_name"] = out["shipping_address"] = None
346
347 # get contact
348 if party_field == "lead":
349 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530350 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530351 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530352 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530353
354 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530355
Anand Doshi2ac0a832013-07-10 20:49:44 +0530356def get_default_address(party_field, party_name, is_shipping_address=False):
357 if is_shipping_address:
358 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
359 else:
360 order_by = "is_primary_address desc, name asc"
361
362 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
363 limit 1""" % (party_field, "%s", order_by), party_name)
364
365 return address[0][0] if address else None
366
367def get_default_contact(party_field, party_name):
368 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
369 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
370 (party_name,))
371
372 return contact[0][0] if contact else None
373
Anand Doshiedbf3e12013-07-02 11:40:16 +0530374def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530375 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530376 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530377
Anand Doshiedbf3e12013-07-02 11:40:16 +0530378 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530379 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530380 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
381 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
382
Anand Doshi2ac0a832013-07-10 20:49:44 +0530383 display = ""
384 for separator, fieldname in sequence:
385 if address_dict.get(fieldname):
386 display += separator + address_dict.get(fieldname)
387
388 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530389
Anand Doshi2ac0a832013-07-10 20:49:44 +0530390def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530391 out = {}
392 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
393 out[fieldname] = None
394
395 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
396 if lead:
397 lead = lead[0]
398 out.update({
399 "contact_display": lead.get("lead_name"),
400 "contact_email": lead.get("email_id"),
401 "contact_mobile": lead.get("mobile_no"),
402 "contact_phone": lead.get("phone"),
403 })
404
405 return out
406
Anand Doshi2ac0a832013-07-10 20:49:44 +0530407def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530408 out = {}
409 for fieldname in ["contact_person", "contact_display", "contact_email",
410 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
411 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530412
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530413 if not contact_name and party_field:
414 contact_name = get_default_contact(party_field, party_name)
415
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530416 if contact_name:
417 contact = webnotes.conn.sql("""select * from `tabContact` where name=%s""",
418 contact_name, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530419
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530420 if contact:
421 contact = contact[0]
422 out.update({
423 "contact_person": contact.get("name"),
424 "contact_display": " ".join(filter(None,
425 [contact.get("first_name"), contact.get("last_name")])),
426 "contact_email": contact.get("email_id"),
427 "contact_mobile": contact.get("mobile_no"),
428 "contact_phone": contact.get("phone"),
429 "contact_designation": contact.get("designation"),
430 "contact_department": contact.get("department")
431 })
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530432
Anand Doshi99100a42013-07-04 17:13:53 +0530433 return out
434
435def get_address_territory(address_doc):
436 territory = None
437 for fieldname in ("city", "state", "country"):
438 value = address_doc.fields.get(fieldname)
439 if value:
440 territory = webnotes.conn.get_value("Territory", value.strip())
441 if territory:
442 break
443
444 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530445
446def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
447 """common validation for currency and price list currency"""
Akhilesh Darjee10dce342013-09-25 11:09:33 +0530448
Anand Doshi1dde46a2013-05-15 21:15:57 +0530449 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
Akhilesh Darjeee0b32822013-11-12 19:27:16 +0530450
Akhilesh Darjee1797cfe2013-10-11 13:34:10 +0530451 if not conversion_rate:
Rushabh Mehta2b089852013-12-19 18:27:48 +0530452 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 +0530453 "conversion_rate_label": conversion_rate_label,
454 "from_currency": currency,
455 "to_currency": company_currency
456 }, raise_exception=True)
Anand Doshi1dde46a2013-05-15 21:15:57 +0530457
458def validate_item_fetch(args, item):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530459 from erpnext.stock.utils import validate_end_of_life
Anand Doshi1dde46a2013-05-15 21:15:57 +0530460 validate_end_of_life(item.name, item.end_of_life)
461
462 # validate company
463 if not args.company:
464 msgprint(_("Please specify Company"), raise_exception=True)
465
Anand Doshif3096132013-05-21 19:35:06 +0530466def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530467 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530468 if not meta:
469 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530470
Anand Doshif3096132013-05-21 19:35:06 +0530471 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530472 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530473 validate_conversion_rate(args.currency, args.conversion_rate,
474 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530475
476 # round it
477 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530478 get_field_precision(meta.get_field("conversion_rate"),
479 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530480
Anand Doshif3096132013-05-21 19:35:06 +0530481 # validate price list conversion rate
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530482 if meta.get_field("price_list_currency") and (args.selling_price_list or args.buying_price_list) \
483 and args.price_list_currency:
Anand Doshif3096132013-05-21 19:35:06 +0530484 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530485 meta.get_label("plc_conversion_rate"), args.company)
486
487 # round it
488 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530489 get_field_precision(meta.get_field("plc_conversion_rate"),
490 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530491
Anand Doshi11d31132013-06-17 12:51:36 +0530492def delete_events(ref_type, ref_name):
493 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530494 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530495
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530496class UOMMustBeIntegerError(webnotes.ValidationError): pass
497
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530498def validate_uom_is_integer(doclist, uom_field, qty_fields):
499 if isinstance(qty_fields, basestring):
500 qty_fields = [qty_fields]
501
502 integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom,
503 "must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
504
505 if not integer_uoms:
506 return
507
508 for d in doclist:
509 if d.fields.get(uom_field) in integer_uoms:
510 for f in qty_fields:
511 if d.fields.get(f):
512 if cint(d.fields[f])!=d.fields[f]:
513 webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
514 + "': " + _("Quantity cannot be a fraction.") \
515 + " " + _("In Row") + ": " + str(d.idx),
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530516 raise_exception=UOMMustBeIntegerError)