blob: 0655567c2431e549a0892a2e7a4dbe77d3352b3d [file] [log] [blame]
Rushabh Mehtae67d1fb2013-08-05 14:59:54 +05301# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
2# 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
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +05305import webnotes
Anand Doshi1dde46a2013-05-15 21:15:57 +05306from webnotes import msgprint, _
Rushabh Mehta4dca4012013-07-25 17:45:59 +05307from webnotes.utils import load_json, 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
Nabin Hait0feebc12013-06-03 16:45:38 +053010from 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
67 for f in ['sales_partner', 'commission_rate', 'currency', 'price_list']:
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()
Anand Doshi2ac0a832013-07-10 20:49:44 +053081
Anand Doshi47e14a92013-08-13 13:01:12 +053082 customer_defaults["selling_price_list"] = customer_defaults.get("price_list") or \
Anand Doshi99100a42013-07-04 17:13:53 +053083 webnotes.conn.get_value("Customer Group", self.doc.customer_group, "default_price_list") or \
Anand Doshi47e14a92013-08-13 13:01:12 +053084 self.doc.selling_price_list
Anand Doshi99100a42013-07-04 17:13:53 +053085
Anand Doshif2045fb2013-07-25 17:46:02 +053086 for fieldname, val in customer_defaults.items():
Anand Doshi6c0b9362013-07-26 11:32:26 +053087 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +053088 self.doc.fields[fieldname] = val
89
Nabin Haitd2b87262013-09-02 20:12:53 +053090 if self.meta.get_field("sales_team") and self.doc.customer:
Anand Doshi99100a42013-07-04 17:13:53 +053091 self.set_sales_team_for_customer()
92
93 def set_sales_team_for_customer(self):
94 from webnotes.model import default_fields
95
96 # clear table
97 self.doclist = self.doc.clear_table(self.doclist, "sales_team")
98
99 sales_team = webnotes.conn.sql("""select * from `tabSales Team`
100 where parenttype="Customer" and parent=%s""", self.doc.customer, as_dict=True)
101 for i, sales_person in enumerate(sales_team):
102 # remove default fields
103 for fieldname in default_fields:
104 if fieldname in sales_person:
105 del sales_person[fieldname]
106
107 sales_person.update({
108 "doctype": "Sales Team",
109 "parentfield": "sales_team",
110 "idx": i+1
111 })
112
113 # add child
114 self.doclist.append(sales_person)
Anand Doshif2045fb2013-07-25 17:46:02 +0530115
116 def get_supplier_defaults(self):
117 out = self.get_default_address_and_contact("supplier")
118
119 supplier = webnotes.doc("Supplier", self.doc.supplier)
120 out["supplier_name"] = supplier.supplier_name
Anand Doshic7280b42013-07-29 11:48:28 +0530121 if supplier.default_currency:
122 out["currency"] = supplier.default_currency
Anand Doshif2045fb2013-07-25 17:46:02 +0530123
124 return out
125
126 def set_supplier_defaults(self):
127 for fieldname, val in self.get_supplier_defaults().items():
Anand Doshi6c0b9362013-07-26 11:32:26 +0530128 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +0530129 self.doc.fields[fieldname] = val
130
Anand Doshi99100a42013-07-04 17:13:53 +0530131 def get_lead_defaults(self):
132 out = self.get_default_address_and_contact("lead")
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530133
Anand Doshi99100a42013-07-04 17:13:53 +0530134 lead = webnotes.conn.get_value("Lead", self.doc.lead,
135 ["territory", "company_name", "lead_name"], as_dict=True) or {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530136
Anand Doshi99100a42013-07-04 17:13:53 +0530137 out["territory"] = lead.get("territory")
138 out["customer_name"] = lead.get("company_name") or lead.get("lead_name")
139
140 return out
141
142 def set_lead_defaults(self):
143 self.doc.fields.update(self.get_lead_defaults())
Anand Doshi99100a42013-07-04 17:13:53 +0530144
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530145 def get_customer_address(self, args):
Nabin Hait1ec51092013-09-25 19:58:32 +0530146 args = load_json(args)
147 webnotes.errprint(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530148 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530149 'customer_address' : args["address"],
150 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530151 }
Nabin Haita279d782013-07-15 13:04:33 +0530152 if args.get('contact'):
153 ret.update(map_party_contact_details(args['contact']))
Anand Doshiae30e012012-10-26 15:01:22 +0530154
Anand Doshi2ac0a832013-07-10 20:49:44 +0530155 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530156
157 def set_customer_address(self, args):
158 self.doc.fields.update(self.get_customer_address(args))
159
Anand Doshi99100a42013-07-04 17:13:53 +0530160 # TODO deprecate this - used only in sales_order.js
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530161 def get_shipping_address(self, name):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530162 shipping_address = get_default_address("customer", name, is_shipping_address=True)
163 return {
164 'shipping_address_name' : shipping_address,
165 'shipping_address' : get_address_display(shipping_address) if shipping_address else None
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530166 }
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530167
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530168 # Get Supplier Default Primary Address - first load
169 # -----------------------
170 def get_default_supplier_address(self, args):
Anand Doshi923d41d2013-05-28 17:23:36 +0530171 if isinstance(args, basestring):
172 args = load_json(args)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530173
174 address_name = get_default_address("supplier", args["supplier"])
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530175 ret = {
176 'supplier_address' : address_name,
Anand Doshi2ac0a832013-07-10 20:49:44 +0530177 'address_display' : get_address_display(address_name),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530178 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530179 ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530180 ret.update(self.get_supplier_details(args['supplier']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530181 return ret
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530182
183 # Get Supplier Address
184 # -----------------------
185 def get_supplier_address(self, args):
186 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530187 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530188 'supplier_address' : args['address'],
189 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530190 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530191 ret.update(map_party_contact_details(contact_name=args['contact']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530192 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530193
194 def set_supplier_address(self, args):
195 self.doc.fields.update(self.get_supplier_address(args))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530196
197 # Get Supplier Details
198 # -----------------------
Anand Doshif2f5c942012-07-18 20:13:52 +0530199 def get_supplier_details(self, name):
200 supplier_details = webnotes.conn.sql("""\
201 select supplier_name, default_currency
202 from `tabSupplier`
203 where name = %s and docstatus < 2""", name, as_dict=1)
204 if supplier_details:
205 return {
206 'supplier_name': (supplier_details[0]['supplier_name']
207 or self.doc.fields.get('supplier_name')),
208 'currency': (supplier_details[0]['default_currency']
209 or self.doc.fields.get('currency')),
210 }
211 else:
212 return {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530213
214 # Get Sales Person Details of Customer
215 # ------------------------------------
216 def get_sales_person(self, name):
Anand Doshi8ae5ba92012-06-25 20:05:35 +0530217 self.doclist = self.doc.clear_table(self.doclist,'sales_team')
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530218 idx = 0
Anand Doshi74d1b652012-01-27 12:25:09 +0530219 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 +0530220 ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530221 ch.sales_person = d and cstr(d[0]) or ''
222 ch.allocated_percentage = d and flt(d[1]) or 0
223 ch.allocated_amount = d and flt(d[2]) or 0
224 ch.incentives = d and flt(d[3]) or 0
225 ch.idx = idx
226 idx += 1
Nabin Hait41cc3272012-04-30 14:36:18 +0530227
Rushabh Mehta35c017a2012-11-30 10:57:28 +0530228 def load_notification_message(self):
229 dt = self.doc.doctype.lower().replace(" ", "_")
230 if int(webnotes.conn.get_value("Notification Control", None, dt) or 0):
231 self.doc.fields["__notification_message"] = \
232 webnotes.conn.get_value("Notification Control", None, dt + "_message")
Rushabh Mehta96690eb2013-09-02 17:04:27 +0530233
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530234 def validate_posting_time(self):
235 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530236 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530237
Anand Doshi670199b2013-06-10 15:38:01 +0530238 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530239 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530240 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530241
242 self.delete_events()
243 self._add_calendar_event(opts)
244
245 def delete_events(self):
246 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Nabin Haitad6ce4e2013-09-19 11:02:24 +0530247 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)),
248 ignore_permissions=True)
Anand Doshie53a81d2013-06-10 15:15:40 +0530249
250 def _add_calendar_event(self, opts):
251 opts = webnotes._dict(opts)
252
253 if self.doc.contact_date:
254 event_doclist = [{
255 "doctype": "Event",
256 "owner": opts.owner or self.doc.owner,
257 "subject": opts.subject,
258 "description": opts.description,
259 "starts_on": self.doc.contact_date + " 10:00:00",
260 "event_type": "Private",
261 "ref_type": self.doc.doctype,
262 "ref_name": self.doc.name
263 }]
264
265 if webnotes.conn.exists("Profile", self.doc.contact_by):
266 event_doclist.append({
267 "doctype": "Event User",
268 "parentfield": "event_individuals",
269 "person": self.doc.contact_by
270 })
271
272 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530273
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530274 def validate_uom_is_integer(self, uom_field, qty_fields):
275 validate_uom_is_integer(self.doclist, uom_field, qty_fields)
276
Nabin Hait2bd37772013-07-08 19:00:29 +0530277 def validate_with_previous_doc(self, source_dt, ref):
278 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530279 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530280 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530281 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530282 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530283 ref_dn = d.fields.get(val["ref_dn_field"])
284 if ref_dn:
285 if is_child:
286 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530287 if ref_dn not in item_ref_dn:
288 item_ref_dn.append(ref_dn)
Nabin Hait5e200e42013-07-29 15:29:51 +0530289 elif not val.get("allow_duplicate_prev_row_id"):
Nabin Haita9ec49e2013-07-15 16:33:24 +0530290 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
291 _(": Duplicate row from same ") + key, raise_exception=1)
292 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530293 ref_doc.setdefault(key, [])
294 if ref_dn not in ref_doc[key]:
295 ref_doc[key].append(ref_dn)
296 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530297 self.compare_values(ref_doc, val["compare_fields"])
298
299 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530300 for ref_doctype, ref_dn_list in ref_doc.items():
301 for ref_docname in ref_dn_list:
302 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
303 [d[0] for d in fields], as_dict=1)
304
305 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530306 if prevdoc_values[field] is not None:
307 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530308
309def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
310 out = {}
311
312 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530313 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530314 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530315 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530316 out["address_display"] = get_address_display(billing_address)
317 else:
318 out[party_field + "_address"] = out["address_display"] = None
319
320 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530321 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530322 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530323 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530324 out["shipping_address"] = get_address_display(shipping_address)
325 else:
326 out["shipping_address_name"] = out["shipping_address"] = None
327
328 # get contact
329 if party_field == "lead":
330 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530331 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530332 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530333 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530334
335 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530336
Anand Doshi2ac0a832013-07-10 20:49:44 +0530337def get_default_address(party_field, party_name, is_shipping_address=False):
338 if is_shipping_address:
339 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
340 else:
341 order_by = "is_primary_address desc, name asc"
342
343 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
344 limit 1""" % (party_field, "%s", order_by), party_name)
345
346 return address[0][0] if address else None
347
348def get_default_contact(party_field, party_name):
349 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
350 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
351 (party_name,))
352
353 return contact[0][0] if contact else None
354
Anand Doshiedbf3e12013-07-02 11:40:16 +0530355def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530356 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530357 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530358
Anand Doshiedbf3e12013-07-02 11:40:16 +0530359 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530360 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530361 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
362 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
363
Anand Doshi2ac0a832013-07-10 20:49:44 +0530364 display = ""
365 for separator, fieldname in sequence:
366 if address_dict.get(fieldname):
367 display += separator + address_dict.get(fieldname)
368
369 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530370
Anand Doshi2ac0a832013-07-10 20:49:44 +0530371def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530372 out = {}
373 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
374 out[fieldname] = None
375
376 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
377 if lead:
378 lead = lead[0]
379 out.update({
380 "contact_display": lead.get("lead_name"),
381 "contact_email": lead.get("email_id"),
382 "contact_mobile": lead.get("mobile_no"),
383 "contact_phone": lead.get("phone"),
384 })
385
386 return out
387
Anand Doshi2ac0a832013-07-10 20:49:44 +0530388def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530389 out = {}
390 for fieldname in ["contact_person", "contact_display", "contact_email",
391 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
392 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530393
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530394 if not contact_name and party_field:
395 contact_name = get_default_contact(party_field, party_name)
396
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530397 if contact_name:
398 contact = webnotes.conn.sql("""select * from `tabContact` where name=%s""",
399 contact_name, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530400
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530401 if contact:
402 contact = contact[0]
403 out.update({
404 "contact_person": contact.get("name"),
405 "contact_display": " ".join(filter(None,
406 [contact.get("first_name"), contact.get("last_name")])),
407 "contact_email": contact.get("email_id"),
408 "contact_mobile": contact.get("mobile_no"),
409 "contact_phone": contact.get("phone"),
410 "contact_designation": contact.get("designation"),
411 "contact_department": contact.get("department")
412 })
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530413
Anand Doshi99100a42013-07-04 17:13:53 +0530414 return out
415
416def get_address_territory(address_doc):
417 territory = None
418 for fieldname in ("city", "state", "country"):
419 value = address_doc.fields.get(fieldname)
420 if value:
421 territory = webnotes.conn.get_value("Territory", value.strip())
422 if territory:
423 break
424
425 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530426
427def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
428 """common validation for currency and price list currency"""
429 if conversion_rate == 0:
430 msgprint(conversion_rate_label + _(' cannot be 0'), raise_exception=True)
431
432 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
433
434 # parenthesis for 'OR' are necessary as we want it to evaluate as
435 # mandatory valid condition and (1st optional valid condition
436 # or 2nd optional valid condition)
437 valid_conversion_rate = (conversion_rate and
438 ((currency == company_currency and conversion_rate == 1.00)
439 or (currency != company_currency and conversion_rate != 1.00)))
440
441 if not valid_conversion_rate:
442 msgprint(_('Please enter valid ') + conversion_rate_label + (': ')
443 + ("1 %s = [?] %s" % (currency, company_currency)),
444 raise_exception=True)
445
446def validate_item_fetch(args, item):
447 from stock.utils import validate_end_of_life
448 validate_end_of_life(item.name, item.end_of_life)
449
450 # validate company
451 if not args.company:
452 msgprint(_("Please specify Company"), raise_exception=True)
453
Anand Doshif3096132013-05-21 19:35:06 +0530454def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530455 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530456 if not meta:
457 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530458
Anand Doshif3096132013-05-21 19:35:06 +0530459 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530460 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530461 validate_conversion_rate(args.currency, args.conversion_rate,
462 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530463
464 # round it
465 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530466 get_field_precision(meta.get_field("conversion_rate"),
467 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530468
Anand Doshif3096132013-05-21 19:35:06 +0530469 # validate price list conversion rate
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530470 if meta.get_field("price_list_currency") and (args.selling_price_list or args.buying_price_list) \
471 and args.price_list_currency:
Anand Doshif3096132013-05-21 19:35:06 +0530472 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530473 meta.get_label("plc_conversion_rate"), args.company)
474
475 # round it
476 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530477 get_field_precision(meta.get_field("plc_conversion_rate"),
478 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530479
Anand Doshi11d31132013-06-17 12:51:36 +0530480def delete_events(ref_type, ref_name):
481 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530482 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530483
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530484class UOMMustBeIntegerError(webnotes.ValidationError): pass
485
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530486def validate_uom_is_integer(doclist, uom_field, qty_fields):
487 if isinstance(qty_fields, basestring):
488 qty_fields = [qty_fields]
489
490 integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom,
491 "must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
492
493 if not integer_uoms:
494 return
495
496 for d in doclist:
497 if d.fields.get(uom_field) in integer_uoms:
498 for f in qty_fields:
499 if d.fields.get(f):
500 if cint(d.fields[f])!=d.fields[f]:
501 webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
502 + "': " + _("Quantity cannot be a fraction.") \
503 + " " + _("In Row") + ": " + str(d.idx),
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530504 raise_exception=UOMMustBeIntegerError)