blob: f783faa9ec2e53fec52abc265fc3da8cb33272d2 [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
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
Nabin Haita6df2682014-01-15 12:21:14 +053082 customer_defaults["selling_price_list"] = self.get_user_default_price_list("Selling") or \
83 customer_defaults.get("price_list") or \
84 webnotes.conn.get_value("Customer Group", self.doc.customer_group,
85 "default_price_list") or self.doc.selling_price_list
Anand Doshi99100a42013-07-04 17:13:53 +053086
Anand Doshif2045fb2013-07-25 17:46:02 +053087 for fieldname, val in customer_defaults.items():
Anand Doshi6c0b9362013-07-26 11:32:26 +053088 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +053089 self.doc.fields[fieldname] = val
90
Nabin Haitd2b87262013-09-02 20:12:53 +053091 if self.meta.get_field("sales_team") and self.doc.customer:
Anand Doshi99100a42013-07-04 17:13:53 +053092 self.set_sales_team_for_customer()
93
Nabin Haita6df2682014-01-15 12:21:14 +053094 def get_user_default_price_list(self, price_list_for):
95 from webnotes.defaults import get_user_default_as_list
96 user_default_price_list = get_user_default_as_list("selling_price_list"
97 if price_list_for=="Selling" else "buying_price_list")
98 return user_default_price_list[0] if len(user_default_price_list)==1 else ""
99
Anand Doshi99100a42013-07-04 17:13:53 +0530100 def set_sales_team_for_customer(self):
101 from webnotes.model import default_fields
102
103 # clear table
104 self.doclist = self.doc.clear_table(self.doclist, "sales_team")
105
106 sales_team = webnotes.conn.sql("""select * from `tabSales Team`
107 where parenttype="Customer" and parent=%s""", self.doc.customer, as_dict=True)
108 for i, sales_person in enumerate(sales_team):
109 # remove default fields
110 for fieldname in default_fields:
111 if fieldname in sales_person:
112 del sales_person[fieldname]
113
114 sales_person.update({
115 "doctype": "Sales Team",
116 "parentfield": "sales_team",
117 "idx": i+1
118 })
119
120 # add child
121 self.doclist.append(sales_person)
Anand Doshif2045fb2013-07-25 17:46:02 +0530122
123 def get_supplier_defaults(self):
124 out = self.get_default_address_and_contact("supplier")
125
126 supplier = webnotes.doc("Supplier", self.doc.supplier)
127 out["supplier_name"] = supplier.supplier_name
Anand Doshic7280b42013-07-29 11:48:28 +0530128 if supplier.default_currency:
129 out["currency"] = supplier.default_currency
Nabin Haita6df2682014-01-15 12:21:14 +0530130
131 out["buying_price_list"] = self.get_user_default_price_list("Buying") or \
132 supplier.default_price_list or self.doc.buying_price_list
Anand Doshif2045fb2013-07-25 17:46:02 +0530133
134 return out
135
136 def set_supplier_defaults(self):
137 for fieldname, val in self.get_supplier_defaults().items():
Anand Doshi6c0b9362013-07-26 11:32:26 +0530138 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +0530139 self.doc.fields[fieldname] = val
140
Anand Doshi99100a42013-07-04 17:13:53 +0530141 def get_lead_defaults(self):
142 out = self.get_default_address_and_contact("lead")
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530143
Anand Doshi99100a42013-07-04 17:13:53 +0530144 lead = webnotes.conn.get_value("Lead", self.doc.lead,
145 ["territory", "company_name", "lead_name"], as_dict=True) or {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530146
Anand Doshi99100a42013-07-04 17:13:53 +0530147 out["territory"] = lead.get("territory")
148 out["customer_name"] = lead.get("company_name") or lead.get("lead_name")
149
150 return out
151
152 def set_lead_defaults(self):
153 self.doc.fields.update(self.get_lead_defaults())
Anand Doshi99100a42013-07-04 17:13:53 +0530154
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530155 def get_customer_address(self, args):
Nabin Hait1ec51092013-09-25 19:58:32 +0530156 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530157 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530158 'customer_address' : args["address"],
159 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530160 }
Nabin Haita279d782013-07-15 13:04:33 +0530161 if args.get('contact'):
162 ret.update(map_party_contact_details(args['contact']))
Anand Doshiae30e012012-10-26 15:01:22 +0530163
Anand Doshi2ac0a832013-07-10 20:49:44 +0530164 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530165
166 def set_customer_address(self, args):
167 self.doc.fields.update(self.get_customer_address(args))
168
Anand Doshi99100a42013-07-04 17:13:53 +0530169 # TODO deprecate this - used only in sales_order.js
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530170 def get_shipping_address(self, name):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530171 shipping_address = get_default_address("customer", name, is_shipping_address=True)
172 return {
173 'shipping_address_name' : shipping_address,
174 'shipping_address' : get_address_display(shipping_address) if shipping_address else None
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530175 }
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530176
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530177 # Get Supplier Default Primary Address - first load
178 # -----------------------
179 def get_default_supplier_address(self, args):
Anand Doshi923d41d2013-05-28 17:23:36 +0530180 if isinstance(args, basestring):
181 args = load_json(args)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530182
183 address_name = get_default_address("supplier", args["supplier"])
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530184 ret = {
185 'supplier_address' : address_name,
Anand Doshi2ac0a832013-07-10 20:49:44 +0530186 'address_display' : get_address_display(address_name),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530187 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530188 ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530189 ret.update(self.get_supplier_details(args['supplier']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530190 return ret
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530191
192 # Get Supplier Address
193 # -----------------------
194 def get_supplier_address(self, args):
195 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530196 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530197 'supplier_address' : args['address'],
198 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530199 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530200 ret.update(map_party_contact_details(contact_name=args['contact']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530201 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530202
203 def set_supplier_address(self, args):
204 self.doc.fields.update(self.get_supplier_address(args))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530205
206 # Get Supplier Details
207 # -----------------------
Anand Doshif2f5c942012-07-18 20:13:52 +0530208 def get_supplier_details(self, name):
209 supplier_details = webnotes.conn.sql("""\
210 select supplier_name, default_currency
211 from `tabSupplier`
212 where name = %s and docstatus < 2""", name, as_dict=1)
213 if supplier_details:
214 return {
215 'supplier_name': (supplier_details[0]['supplier_name']
216 or self.doc.fields.get('supplier_name')),
217 'currency': (supplier_details[0]['default_currency']
218 or self.doc.fields.get('currency')),
219 }
220 else:
221 return {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530222
223 # Get Sales Person Details of Customer
224 # ------------------------------------
225 def get_sales_person(self, name):
Anand Doshi8ae5ba92012-06-25 20:05:35 +0530226 self.doclist = self.doc.clear_table(self.doclist,'sales_team')
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530227 idx = 0
Anand Doshi74d1b652012-01-27 12:25:09 +0530228 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 +0530229 ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530230 ch.sales_person = d and cstr(d[0]) or ''
231 ch.allocated_percentage = d and flt(d[1]) or 0
232 ch.allocated_amount = d and flt(d[2]) or 0
233 ch.incentives = d and flt(d[3]) or 0
234 ch.idx = idx
235 idx += 1
Nabin Hait41cc3272012-04-30 14:36:18 +0530236
Rushabh Mehta35c017a2012-11-30 10:57:28 +0530237 def load_notification_message(self):
238 dt = self.doc.doctype.lower().replace(" ", "_")
239 if int(webnotes.conn.get_value("Notification Control", None, dt) or 0):
240 self.doc.fields["__notification_message"] = \
241 webnotes.conn.get_value("Notification Control", None, dt + "_message")
Rushabh Mehta96690eb2013-09-02 17:04:27 +0530242
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530243 def validate_posting_time(self):
244 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530245 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530246
Anand Doshi670199b2013-06-10 15:38:01 +0530247 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530248 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530249 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530250
251 self.delete_events()
252 self._add_calendar_event(opts)
253
254 def delete_events(self):
255 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Nabin Haitad6ce4e2013-09-19 11:02:24 +0530256 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)),
257 ignore_permissions=True)
Anand Doshie53a81d2013-06-10 15:15:40 +0530258
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"""
Akhilesh Darjee10dce342013-09-25 11:09:33 +0530438
Anand Doshi1dde46a2013-05-15 21:15:57 +0530439 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
Akhilesh Darjeee0b32822013-11-12 19:27:16 +0530440
Akhilesh Darjee1797cfe2013-10-11 13:34:10 +0530441 if not conversion_rate:
Akhilesh Darjeee0b32822013-11-12 19:27:16 +0530442 msgprint(_('%(conversion_rate_label)s is mandatory. Maybe Currency Exchange \
443 record is not created for %(from_currency)s to %(to_currency)s') % {
444 "conversion_rate_label": conversion_rate_label,
445 "from_currency": currency,
446 "to_currency": company_currency
447 }, raise_exception=True)
Anand Doshi1dde46a2013-05-15 21:15:57 +0530448
449def validate_item_fetch(args, item):
450 from stock.utils import validate_end_of_life
451 validate_end_of_life(item.name, item.end_of_life)
452
453 # validate company
454 if not args.company:
455 msgprint(_("Please specify Company"), raise_exception=True)
456
Anand Doshif3096132013-05-21 19:35:06 +0530457def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530458 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530459 if not meta:
460 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530461
Anand Doshif3096132013-05-21 19:35:06 +0530462 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530463 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530464 validate_conversion_rate(args.currency, args.conversion_rate,
465 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530466
467 # round it
468 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530469 get_field_precision(meta.get_field("conversion_rate"),
470 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530471
Anand Doshif3096132013-05-21 19:35:06 +0530472 # validate price list conversion rate
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530473 if meta.get_field("price_list_currency") and (args.selling_price_list or args.buying_price_list) \
474 and args.price_list_currency:
Anand Doshif3096132013-05-21 19:35:06 +0530475 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530476 meta.get_label("plc_conversion_rate"), args.company)
477
478 # round it
479 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530480 get_field_precision(meta.get_field("plc_conversion_rate"),
481 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530482
Anand Doshi11d31132013-06-17 12:51:36 +0530483def delete_events(ref_type, ref_name):
484 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530485 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530486
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530487class UOMMustBeIntegerError(webnotes.ValidationError): pass
488
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530489def validate_uom_is_integer(doclist, uom_field, qty_fields):
490 if isinstance(qty_fields, basestring):
491 qty_fields = [qty_fields]
492
493 integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom,
494 "must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
495
496 if not integer_uoms:
497 return
498
499 for d in doclist:
500 if d.fields.get(uom_field) in integer_uoms:
501 for f in qty_fields:
502 if d.fields.get(f):
503 if cint(d.fields[f])!=d.fields[f]:
504 webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
505 + "': " + _("Quantity cannot be a fraction.") \
506 + " " + _("In Row") + ": " + str(d.idx),
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530507 raise_exception=UOMMustBeIntegerError)