blob: ced4531e163b9b30826b3e162068b57b6725baa5 [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):
58 out = self.get_default_address_and_contact("customer")
59
60 customer = webnotes.doc("Customer", self.doc.customer)
61 for f in ['customer_name', 'customer_group', 'territory']:
62 out[f] = customer.fields.get(f)
Anand Doshiedc5f2e2013-04-26 17:21:49 +053063
Anand Doshi99100a42013-07-04 17:13:53 +053064 # fields prepended with default in Customer doctype
65 for f in ['sales_partner', 'commission_rate', 'currency', 'price_list']:
Anand Doshi946e0de2013-07-11 18:26:00 +053066 if customer.fields.get("default_" + f):
67 out[f] = customer.fields.get("default_" + f)
Anand Doshi99100a42013-07-04 17:13:53 +053068
69 return out
70
71 def set_customer_defaults(self):
72 """
73 For a customer:
74 1. Sets default address and contact
75 2. Sets values like Territory, Customer Group, etc.
76 3. Clears existing Sales Team and fetches the one mentioned in Customer
77 """
78 customer_defaults = self.get_customer_defaults()
Anand Doshi2ac0a832013-07-10 20:49:44 +053079
Anand Doshi9b496142013-07-11 19:13:58 +053080 customer_defaults["price_list"] = customer_defaults.get("price_list") or \
Anand Doshi99100a42013-07-04 17:13:53 +053081 webnotes.conn.get_value("Customer Group", self.doc.customer_group, "default_price_list") or \
82 self.doc.price_list
83
Anand Doshif2045fb2013-07-25 17:46:02 +053084 for fieldname, val in customer_defaults.items():
Anand Doshi6c0b9362013-07-26 11:32:26 +053085 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +053086 self.doc.fields[fieldname] = val
87
Anand Doshi99100a42013-07-04 17:13:53 +053088 if self.meta.get_field("sales_team"):
89 self.set_sales_team_for_customer()
90
91 def set_sales_team_for_customer(self):
92 from webnotes.model import default_fields
93
94 # clear table
95 self.doclist = self.doc.clear_table(self.doclist, "sales_team")
96
97 sales_team = webnotes.conn.sql("""select * from `tabSales Team`
98 where parenttype="Customer" and parent=%s""", self.doc.customer, as_dict=True)
99 for i, sales_person in enumerate(sales_team):
100 # remove default fields
101 for fieldname in default_fields:
102 if fieldname in sales_person:
103 del sales_person[fieldname]
104
105 sales_person.update({
106 "doctype": "Sales Team",
107 "parentfield": "sales_team",
108 "idx": i+1
109 })
110
111 # add child
112 self.doclist.append(sales_person)
Anand Doshif2045fb2013-07-25 17:46:02 +0530113
114 def get_supplier_defaults(self):
115 out = self.get_default_address_and_contact("supplier")
116
117 supplier = webnotes.doc("Supplier", self.doc.supplier)
118 out["supplier_name"] = supplier.supplier_name
Anand Doshic7280b42013-07-29 11:48:28 +0530119 if supplier.default_currency:
120 out["currency"] = supplier.default_currency
Anand Doshif2045fb2013-07-25 17:46:02 +0530121
122 return out
123
124 def set_supplier_defaults(self):
125 for fieldname, val in self.get_supplier_defaults().items():
Anand Doshi6c0b9362013-07-26 11:32:26 +0530126 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +0530127 self.doc.fields[fieldname] = val
128
Anand Doshi99100a42013-07-04 17:13:53 +0530129 def get_lead_defaults(self):
130 out = self.get_default_address_and_contact("lead")
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530131
Anand Doshi99100a42013-07-04 17:13:53 +0530132 lead = webnotes.conn.get_value("Lead", self.doc.lead,
133 ["territory", "company_name", "lead_name"], as_dict=True) or {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530134
Anand Doshi99100a42013-07-04 17:13:53 +0530135 out["territory"] = lead.get("territory")
136 out["customer_name"] = lead.get("company_name") or lead.get("lead_name")
137
138 return out
139
140 def set_lead_defaults(self):
141 self.doc.fields.update(self.get_lead_defaults())
Anand Doshi99100a42013-07-04 17:13:53 +0530142
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530143 def get_customer_address(self, args):
144 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530145 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530146 'customer_address' : args["address"],
147 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530148 }
Nabin Haita279d782013-07-15 13:04:33 +0530149 if args.get('contact'):
150 ret.update(map_party_contact_details(args['contact']))
Anand Doshiae30e012012-10-26 15:01:22 +0530151
Anand Doshi2ac0a832013-07-10 20:49:44 +0530152 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530153
154 def set_customer_address(self, args):
155 self.doc.fields.update(self.get_customer_address(args))
156
Anand Doshi99100a42013-07-04 17:13:53 +0530157 # TODO deprecate this - used only in sales_order.js
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530158 def get_shipping_address(self, name):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530159 shipping_address = get_default_address("customer", name, is_shipping_address=True)
160 return {
161 'shipping_address_name' : shipping_address,
162 'shipping_address' : get_address_display(shipping_address) if shipping_address else None
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530163 }
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530164
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530165 # Get Supplier Default Primary Address - first load
166 # -----------------------
167 def get_default_supplier_address(self, args):
Anand Doshi923d41d2013-05-28 17:23:36 +0530168 if isinstance(args, basestring):
169 args = load_json(args)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530170
171 address_name = get_default_address("supplier", args["supplier"])
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530172 ret = {
173 'supplier_address' : address_name,
Anand Doshi2ac0a832013-07-10 20:49:44 +0530174 'address_display' : get_address_display(address_name),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530175 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530176 ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530177 ret.update(self.get_supplier_details(args['supplier']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530178 return ret
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530179
180 # Get Supplier Address
181 # -----------------------
182 def get_supplier_address(self, args):
183 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530184 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530185 'supplier_address' : args['address'],
186 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530187 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530188 ret.update(map_party_contact_details(contact_name=args['contact']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530189 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530190
191 def set_supplier_address(self, args):
192 self.doc.fields.update(self.get_supplier_address(args))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530193
194 # Get Supplier Details
195 # -----------------------
Anand Doshif2f5c942012-07-18 20:13:52 +0530196 def get_supplier_details(self, name):
197 supplier_details = webnotes.conn.sql("""\
198 select supplier_name, default_currency
199 from `tabSupplier`
200 where name = %s and docstatus < 2""", name, as_dict=1)
201 if supplier_details:
202 return {
203 'supplier_name': (supplier_details[0]['supplier_name']
204 or self.doc.fields.get('supplier_name')),
205 'currency': (supplier_details[0]['default_currency']
206 or self.doc.fields.get('currency')),
207 }
208 else:
209 return {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530210
211 # Get Sales Person Details of Customer
212 # ------------------------------------
213 def get_sales_person(self, name):
Anand Doshi8ae5ba92012-06-25 20:05:35 +0530214 self.doclist = self.doc.clear_table(self.doclist,'sales_team')
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530215 idx = 0
Anand Doshi74d1b652012-01-27 12:25:09 +0530216 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 +0530217 ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530218 ch.sales_person = d and cstr(d[0]) or ''
219 ch.allocated_percentage = d and flt(d[1]) or 0
220 ch.allocated_amount = d and flt(d[2]) or 0
221 ch.incentives = d and flt(d[3]) or 0
222 ch.idx = idx
223 idx += 1
Nabin Hait41cc3272012-04-30 14:36:18 +0530224
Rushabh Mehta35c017a2012-11-30 10:57:28 +0530225 def load_notification_message(self):
226 dt = self.doc.doctype.lower().replace(" ", "_")
227 if int(webnotes.conn.get_value("Notification Control", None, dt) or 0):
228 self.doc.fields["__notification_message"] = \
229 webnotes.conn.get_value("Notification Control", None, dt + "_message")
230
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530231 def add_communication_list(self):
232 # remove communications if present
233 self.doclist = webnotes.doclist(self.doclist).get({
234 "doctype": ["!=", "Communcation"]})
235
236 comm_list = webnotes.conn.sql("""select * from tabCommunication
237 where %s=%s order by modified desc limit 20""" \
238 % (self.doc.doctype.replace(" ", "_").lower(), "%s"),
Anand Doshi060d9242013-06-12 17:40:36 +0530239 self.doc.name, as_dict=1, update={"doctype":"Communication"})
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530240
241 self.doclist.extend(webnotes.doclist([webnotes.doc(fielddata=d) \
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530242 for d in comm_list]))
243
244 def validate_posting_time(self):
245 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530246 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530247
Anand Doshi670199b2013-06-10 15:38:01 +0530248 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530249 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530250 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530251
252 self.delete_events()
253 self._add_calendar_event(opts)
254
255 def delete_events(self):
256 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
257 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)))
258
259 def _add_calendar_event(self, opts):
260 opts = webnotes._dict(opts)
261
262 if self.doc.contact_date:
263 event_doclist = [{
264 "doctype": "Event",
265 "owner": opts.owner or self.doc.owner,
266 "subject": opts.subject,
267 "description": opts.description,
268 "starts_on": self.doc.contact_date + " 10:00:00",
269 "event_type": "Private",
270 "ref_type": self.doc.doctype,
271 "ref_name": self.doc.name
272 }]
273
274 if webnotes.conn.exists("Profile", self.doc.contact_by):
275 event_doclist.append({
276 "doctype": "Event User",
277 "parentfield": "event_individuals",
278 "person": self.doc.contact_by
279 })
280
281 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530282
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530283 def validate_uom_is_integer(self, uom_field, qty_fields):
284 validate_uom_is_integer(self.doclist, uom_field, qty_fields)
285
Nabin Hait2bd37772013-07-08 19:00:29 +0530286 def validate_with_previous_doc(self, source_dt, ref):
287 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530288 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530289 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530290 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530291 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530292 ref_dn = d.fields.get(val["ref_dn_field"])
293 if ref_dn:
294 if is_child:
295 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530296 if ref_dn not in item_ref_dn:
297 item_ref_dn.append(ref_dn)
Nabin Hait5e200e42013-07-29 15:29:51 +0530298 elif not val.get("allow_duplicate_prev_row_id"):
Nabin Haita9ec49e2013-07-15 16:33:24 +0530299 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
300 _(": Duplicate row from same ") + key, raise_exception=1)
301 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530302 ref_doc.setdefault(key, [])
303 if ref_dn not in ref_doc[key]:
304 ref_doc[key].append(ref_dn)
305 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530306 self.compare_values(ref_doc, val["compare_fields"])
307
308 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530309 for ref_doctype, ref_dn_list in ref_doc.items():
310 for ref_docname in ref_dn_list:
311 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
312 [d[0] for d in fields], as_dict=1)
313
314 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530315 if prevdoc_values[field] is not None:
316 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530317
318def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
319 out = {}
320
321 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530322 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530323 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530324 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530325 out["address_display"] = get_address_display(billing_address)
326 else:
327 out[party_field + "_address"] = out["address_display"] = None
328
329 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530330 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530331 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530332 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530333 out["shipping_address"] = get_address_display(shipping_address)
334 else:
335 out["shipping_address_name"] = out["shipping_address"] = None
336
337 # get contact
338 if party_field == "lead":
339 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530340 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530341 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530342 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530343
344 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530345
Anand Doshi2ac0a832013-07-10 20:49:44 +0530346def get_default_address(party_field, party_name, is_shipping_address=False):
347 if is_shipping_address:
348 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
349 else:
350 order_by = "is_primary_address desc, name asc"
351
352 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
353 limit 1""" % (party_field, "%s", order_by), party_name)
354
355 return address[0][0] if address else None
356
357def get_default_contact(party_field, party_name):
358 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
359 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
360 (party_name,))
361
362 return contact[0][0] if contact else None
363
Anand Doshiedbf3e12013-07-02 11:40:16 +0530364def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530365 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530366 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530367
Anand Doshiedbf3e12013-07-02 11:40:16 +0530368 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530369 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530370 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
371 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
372
Anand Doshi2ac0a832013-07-10 20:49:44 +0530373 display = ""
374 for separator, fieldname in sequence:
375 if address_dict.get(fieldname):
376 display += separator + address_dict.get(fieldname)
377
378 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530379
Anand Doshi2ac0a832013-07-10 20:49:44 +0530380def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530381 out = {}
382 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
383 out[fieldname] = None
384
385 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
386 if lead:
387 lead = lead[0]
388 out.update({
389 "contact_display": lead.get("lead_name"),
390 "contact_email": lead.get("email_id"),
391 "contact_mobile": lead.get("mobile_no"),
392 "contact_phone": lead.get("phone"),
393 })
394
395 return out
396
Anand Doshi2ac0a832013-07-10 20:49:44 +0530397def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530398 out = {}
399 for fieldname in ["contact_person", "contact_display", "contact_email",
400 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
401 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530402
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530403 if not contact_name and party_field:
404 contact_name = get_default_contact(party_field, party_name)
405
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530406 if contact_name:
407 contact = webnotes.conn.sql("""select * from `tabContact` where name=%s""",
408 contact_name, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530409
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530410 if contact:
411 contact = contact[0]
412 out.update({
413 "contact_person": contact.get("name"),
414 "contact_display": " ".join(filter(None,
415 [contact.get("first_name"), contact.get("last_name")])),
416 "contact_email": contact.get("email_id"),
417 "contact_mobile": contact.get("mobile_no"),
418 "contact_phone": contact.get("phone"),
419 "contact_designation": contact.get("designation"),
420 "contact_department": contact.get("department")
421 })
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530422
Anand Doshi99100a42013-07-04 17:13:53 +0530423 return out
424
425def get_address_territory(address_doc):
426 territory = None
427 for fieldname in ("city", "state", "country"):
428 value = address_doc.fields.get(fieldname)
429 if value:
430 territory = webnotes.conn.get_value("Territory", value.strip())
431 if territory:
432 break
433
434 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530435
436def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
437 """common validation for currency and price list currency"""
438 if conversion_rate == 0:
439 msgprint(conversion_rate_label + _(' cannot be 0'), raise_exception=True)
440
441 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
442
443 # parenthesis for 'OR' are necessary as we want it to evaluate as
444 # mandatory valid condition and (1st optional valid condition
445 # or 2nd optional valid condition)
446 valid_conversion_rate = (conversion_rate and
447 ((currency == company_currency and conversion_rate == 1.00)
448 or (currency != company_currency and conversion_rate != 1.00)))
449
450 if not valid_conversion_rate:
451 msgprint(_('Please enter valid ') + conversion_rate_label + (': ')
452 + ("1 %s = [?] %s" % (currency, company_currency)),
453 raise_exception=True)
454
455def validate_item_fetch(args, item):
456 from stock.utils import validate_end_of_life
457 validate_end_of_life(item.name, item.end_of_life)
458
459 # validate company
460 if not args.company:
461 msgprint(_("Please specify Company"), raise_exception=True)
462
Anand Doshif3096132013-05-21 19:35:06 +0530463def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530464 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530465 if not meta:
466 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530467
Anand Doshif3096132013-05-21 19:35:06 +0530468 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530469 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530470 validate_conversion_rate(args.currency, args.conversion_rate,
471 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530472
473 # round it
474 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530475 get_field_precision(meta.get_field("conversion_rate"),
476 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530477
Anand Doshif3096132013-05-21 19:35:06 +0530478 # validate price list conversion rate
479 if meta.get_field("price_list_currency") and args.price_list_name and \
480 args.price_list_currency:
481 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530482 meta.get_label("plc_conversion_rate"), args.company)
483
484 # round it
485 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530486 get_field_precision(meta.get_field("plc_conversion_rate"),
487 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530488
Anand Doshi11d31132013-06-17 12:51:36 +0530489def delete_events(ref_type, ref_name):
490 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530491 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530492
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530493class UOMMustBeIntegerError(webnotes.ValidationError): pass
494
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530495def validate_uom_is_integer(doclist, uom_field, qty_fields):
496 if isinstance(qty_fields, basestring):
497 qty_fields = [qty_fields]
498
499 integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom,
500 "must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
501
502 if not integer_uoms:
503 return
504
505 for d in doclist:
506 if d.fields.get(uom_field) in integer_uoms:
507 for f in qty_fields:
508 if d.fields.get(f):
509 if cint(d.fields[f])!=d.fields[f]:
510 webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
511 + "': " + _("Quantity cannot be a fraction.") \
512 + " " + _("In Row") + ": " + str(d.idx),
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530513 raise_exception=UOMMustBeIntegerError)