blob: aace0cb78e2e2c97d7cdef8316eaff5b5744cd21 [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
Anand Doshi99100a42013-07-04 17:13:53 +053090 if self.meta.get_field("sales_team"):
91 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):
146 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530147 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530148 'customer_address' : args["address"],
149 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530150 }
Nabin Haita279d782013-07-15 13:04:33 +0530151 if args.get('contact'):
152 ret.update(map_party_contact_details(args['contact']))
Anand Doshiae30e012012-10-26 15:01:22 +0530153
Anand Doshi2ac0a832013-07-10 20:49:44 +0530154 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530155
156 def set_customer_address(self, args):
157 self.doc.fields.update(self.get_customer_address(args))
158
Anand Doshi99100a42013-07-04 17:13:53 +0530159 # TODO deprecate this - used only in sales_order.js
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530160 def get_shipping_address(self, name):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530161 shipping_address = get_default_address("customer", name, is_shipping_address=True)
162 return {
163 'shipping_address_name' : shipping_address,
164 'shipping_address' : get_address_display(shipping_address) if shipping_address else None
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530165 }
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530166
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530167 # Get Supplier Default Primary Address - first load
168 # -----------------------
169 def get_default_supplier_address(self, args):
Anand Doshi923d41d2013-05-28 17:23:36 +0530170 if isinstance(args, basestring):
171 args = load_json(args)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530172
173 address_name = get_default_address("supplier", args["supplier"])
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530174 ret = {
175 'supplier_address' : address_name,
Anand Doshi2ac0a832013-07-10 20:49:44 +0530176 'address_display' : get_address_display(address_name),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530177 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530178 ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530179 ret.update(self.get_supplier_details(args['supplier']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530180 return ret
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530181
182 # Get Supplier Address
183 # -----------------------
184 def get_supplier_address(self, args):
185 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530186 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530187 'supplier_address' : args['address'],
188 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530189 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530190 ret.update(map_party_contact_details(contact_name=args['contact']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530191 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530192
193 def set_supplier_address(self, args):
194 self.doc.fields.update(self.get_supplier_address(args))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530195
196 # Get Supplier Details
197 # -----------------------
Anand Doshif2f5c942012-07-18 20:13:52 +0530198 def get_supplier_details(self, name):
199 supplier_details = webnotes.conn.sql("""\
200 select supplier_name, default_currency
201 from `tabSupplier`
202 where name = %s and docstatus < 2""", name, as_dict=1)
203 if supplier_details:
204 return {
205 'supplier_name': (supplier_details[0]['supplier_name']
206 or self.doc.fields.get('supplier_name')),
207 'currency': (supplier_details[0]['default_currency']
208 or self.doc.fields.get('currency')),
209 }
210 else:
211 return {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530212
213 # Get Sales Person Details of Customer
214 # ------------------------------------
215 def get_sales_person(self, name):
Anand Doshi8ae5ba92012-06-25 20:05:35 +0530216 self.doclist = self.doc.clear_table(self.doclist,'sales_team')
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530217 idx = 0
Anand Doshi74d1b652012-01-27 12:25:09 +0530218 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 +0530219 ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530220 ch.sales_person = d and cstr(d[0]) or ''
221 ch.allocated_percentage = d and flt(d[1]) or 0
222 ch.allocated_amount = d and flt(d[2]) or 0
223 ch.incentives = d and flt(d[3]) or 0
224 ch.idx = idx
225 idx += 1
Nabin Hait41cc3272012-04-30 14:36:18 +0530226
Rushabh Mehta35c017a2012-11-30 10:57:28 +0530227 def load_notification_message(self):
228 dt = self.doc.doctype.lower().replace(" ", "_")
229 if int(webnotes.conn.get_value("Notification Control", None, dt) or 0):
230 self.doc.fields["__notification_message"] = \
231 webnotes.conn.get_value("Notification Control", None, dt + "_message")
232
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530233 def add_communication_list(self):
234 # remove communications if present
235 self.doclist = webnotes.doclist(self.doclist).get({
236 "doctype": ["!=", "Communcation"]})
237
238 comm_list = webnotes.conn.sql("""select * from tabCommunication
239 where %s=%s order by modified desc limit 20""" \
240 % (self.doc.doctype.replace(" ", "_").lower(), "%s"),
Anand Doshi060d9242013-06-12 17:40:36 +0530241 self.doc.name, as_dict=1, update={"doctype":"Communication"})
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530242
243 self.doclist.extend(webnotes.doclist([webnotes.doc(fielddata=d) \
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530244 for d in comm_list]))
245
246 def validate_posting_time(self):
247 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530248 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530249
Anand Doshi670199b2013-06-10 15:38:01 +0530250 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530251 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530252 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530253
254 self.delete_events()
255 self._add_calendar_event(opts)
256
257 def delete_events(self):
258 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
259 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)))
260
261 def _add_calendar_event(self, opts):
262 opts = webnotes._dict(opts)
263
264 if self.doc.contact_date:
265 event_doclist = [{
266 "doctype": "Event",
267 "owner": opts.owner or self.doc.owner,
268 "subject": opts.subject,
269 "description": opts.description,
270 "starts_on": self.doc.contact_date + " 10:00:00",
271 "event_type": "Private",
272 "ref_type": self.doc.doctype,
273 "ref_name": self.doc.name
274 }]
275
276 if webnotes.conn.exists("Profile", self.doc.contact_by):
277 event_doclist.append({
278 "doctype": "Event User",
279 "parentfield": "event_individuals",
280 "person": self.doc.contact_by
281 })
282
283 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530284
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530285 def validate_uom_is_integer(self, uom_field, qty_fields):
286 validate_uom_is_integer(self.doclist, uom_field, qty_fields)
287
Nabin Hait2bd37772013-07-08 19:00:29 +0530288 def validate_with_previous_doc(self, source_dt, ref):
289 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530290 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530291 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530292 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530293 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530294 ref_dn = d.fields.get(val["ref_dn_field"])
295 if ref_dn:
296 if is_child:
297 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530298 if ref_dn not in item_ref_dn:
299 item_ref_dn.append(ref_dn)
Nabin Hait5e200e42013-07-29 15:29:51 +0530300 elif not val.get("allow_duplicate_prev_row_id"):
Nabin Haita9ec49e2013-07-15 16:33:24 +0530301 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
302 _(": Duplicate row from same ") + key, raise_exception=1)
303 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530304 ref_doc.setdefault(key, [])
305 if ref_dn not in ref_doc[key]:
306 ref_doc[key].append(ref_dn)
307 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530308 self.compare_values(ref_doc, val["compare_fields"])
309
310 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530311 for ref_doctype, ref_dn_list in ref_doc.items():
312 for ref_docname in ref_dn_list:
313 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
314 [d[0] for d in fields], as_dict=1)
315
316 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530317 if prevdoc_values[field] is not None:
318 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530319
320def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
321 out = {}
322
323 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530324 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530325 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530326 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530327 out["address_display"] = get_address_display(billing_address)
328 else:
329 out[party_field + "_address"] = out["address_display"] = None
330
331 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530332 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530333 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530334 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530335 out["shipping_address"] = get_address_display(shipping_address)
336 else:
337 out["shipping_address_name"] = out["shipping_address"] = None
338
339 # get contact
340 if party_field == "lead":
341 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530342 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530343 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530344 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530345
346 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530347
Anand Doshi2ac0a832013-07-10 20:49:44 +0530348def get_default_address(party_field, party_name, is_shipping_address=False):
349 if is_shipping_address:
350 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
351 else:
352 order_by = "is_primary_address desc, name asc"
353
354 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
355 limit 1""" % (party_field, "%s", order_by), party_name)
356
357 return address[0][0] if address else None
358
359def get_default_contact(party_field, party_name):
360 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
361 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
362 (party_name,))
363
364 return contact[0][0] if contact else None
365
Anand Doshiedbf3e12013-07-02 11:40:16 +0530366def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530367 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530368 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530369
Anand Doshiedbf3e12013-07-02 11:40:16 +0530370 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530371 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530372 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
373 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
374
Anand Doshi2ac0a832013-07-10 20:49:44 +0530375 display = ""
376 for separator, fieldname in sequence:
377 if address_dict.get(fieldname):
378 display += separator + address_dict.get(fieldname)
379
380 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530381
Anand Doshi2ac0a832013-07-10 20:49:44 +0530382def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530383 out = {}
384 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
385 out[fieldname] = None
386
387 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
388 if lead:
389 lead = lead[0]
390 out.update({
391 "contact_display": lead.get("lead_name"),
392 "contact_email": lead.get("email_id"),
393 "contact_mobile": lead.get("mobile_no"),
394 "contact_phone": lead.get("phone"),
395 })
396
397 return out
398
Anand Doshi2ac0a832013-07-10 20:49:44 +0530399def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530400 out = {}
401 for fieldname in ["contact_person", "contact_display", "contact_email",
402 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
403 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530404
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530405 if not contact_name and party_field:
406 contact_name = get_default_contact(party_field, party_name)
407
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530408 if contact_name:
409 contact = webnotes.conn.sql("""select * from `tabContact` where name=%s""",
410 contact_name, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530411
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530412 if contact:
413 contact = contact[0]
414 out.update({
415 "contact_person": contact.get("name"),
416 "contact_display": " ".join(filter(None,
417 [contact.get("first_name"), contact.get("last_name")])),
418 "contact_email": contact.get("email_id"),
419 "contact_mobile": contact.get("mobile_no"),
420 "contact_phone": contact.get("phone"),
421 "contact_designation": contact.get("designation"),
422 "contact_department": contact.get("department")
423 })
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530424
Anand Doshi99100a42013-07-04 17:13:53 +0530425 return out
426
427def get_address_territory(address_doc):
428 territory = None
429 for fieldname in ("city", "state", "country"):
430 value = address_doc.fields.get(fieldname)
431 if value:
432 territory = webnotes.conn.get_value("Territory", value.strip())
433 if territory:
434 break
435
436 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530437
438def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
439 """common validation for currency and price list currency"""
440 if conversion_rate == 0:
441 msgprint(conversion_rate_label + _(' cannot be 0'), raise_exception=True)
442
443 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
444
445 # parenthesis for 'OR' are necessary as we want it to evaluate as
446 # mandatory valid condition and (1st optional valid condition
447 # or 2nd optional valid condition)
448 valid_conversion_rate = (conversion_rate and
449 ((currency == company_currency and conversion_rate == 1.00)
450 or (currency != company_currency and conversion_rate != 1.00)))
451
452 if not valid_conversion_rate:
453 msgprint(_('Please enter valid ') + conversion_rate_label + (': ')
454 + ("1 %s = [?] %s" % (currency, company_currency)),
455 raise_exception=True)
456
457def validate_item_fetch(args, item):
458 from stock.utils import validate_end_of_life
459 validate_end_of_life(item.name, item.end_of_life)
460
461 # validate company
462 if not args.company:
463 msgprint(_("Please specify Company"), raise_exception=True)
464
Anand Doshif3096132013-05-21 19:35:06 +0530465def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530466 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530467 if not meta:
468 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530469
Anand Doshif3096132013-05-21 19:35:06 +0530470 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530471 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530472 validate_conversion_rate(args.currency, args.conversion_rate,
473 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530474
475 # round it
476 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530477 get_field_precision(meta.get_field("conversion_rate"),
478 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530479
Anand Doshif3096132013-05-21 19:35:06 +0530480 # validate price list conversion rate
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530481 if meta.get_field("price_list_currency") and (args.selling_price_list or args.buying_price_list) \
482 and args.price_list_currency:
Anand Doshif3096132013-05-21 19:35:06 +0530483 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530484 meta.get_label("plc_conversion_rate"), args.company)
485
486 # round it
487 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530488 get_field_precision(meta.get_field("plc_conversion_rate"),
489 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530490
Anand Doshi11d31132013-06-17 12:51:36 +0530491def delete_events(ref_type, ref_name):
492 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530493 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530494
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530495class UOMMustBeIntegerError(webnotes.ValidationError): pass
496
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530497def validate_uom_is_integer(doclist, uom_field, qty_fields):
498 if isinstance(qty_fields, basestring):
499 qty_fields = [qty_fields]
500
501 integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom,
502 "must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
503
504 if not integer_uoms:
505 return
506
507 for d in doclist:
508 if d.fields.get(uom_field) in integer_uoms:
509 for f in qty_fields:
510 if d.fields.get(f):
511 if cint(d.fields[f])!=d.fields[f]:
512 webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
513 + "': " + _("Quantity cannot be a fraction.") \
514 + " " + _("In Row") + ": " + str(d.idx),
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530515 raise_exception=UOMMustBeIntegerError)