blob: 2c6357acff8e52d23e3a0c279163e470a338cfb0 [file] [log] [blame]
Rushabh Mehtaad45e312013-11-20 12:59:58 +05301# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
Rushabh Mehtae67d1fb2013-08-05 14:59:54 +05302# License: GNU General Public License v3. See license.txt
Rushabh Mehta3966f1d2012-02-23 12:35:32 +05303
Anand Doshi486f9df2012-07-19 13:40:31 +05304from __future__ import unicode_literals
Rushabh Mehta1f847992013-12-12 19:12:19 +05305import webnotes, json
Anand Doshi1dde46a2013-05-15 21:15:57 +05306from webnotes import msgprint, _
Rushabh Mehta1f847992013-12-12 19:12:19 +05307from webnotes.utils import cstr, flt, now_datetime, cint
Anand Doshi0fd99e72012-11-30 16:38:04 +05308from webnotes.model.doc import addchild
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +05309
Rushabh Mehta1f847992013-12-12 19:12:19 +053010from erpnext.controllers.status_updater import StatusUpdater
Anand Doshi756dca72013-01-15 18:39:21 +053011
Nabin Hait0feebc12013-06-03 16:45:38 +053012class TransactionBase(StatusUpdater):
Anand Doshi99100a42013-07-04 17:13:53 +053013 def get_default_address_and_contact(self, party_field, party_name=None):
Anand Doshiedc5f2e2013-04-26 17:21:49 +053014 """get a dict of default field values of address and contact for a given party type
15 party_type can be one of: customer, supplier"""
Anand Doshi99100a42013-07-04 17:13:53 +053016 if not party_name:
17 party_name = self.doc.fields.get(party_field)
Anand Doshiedc5f2e2013-04-26 17:21:49 +053018
Anand Doshi99100a42013-07-04 17:13:53 +053019 return get_default_address_and_contact(party_field, party_name,
20 fetch_shipping_address=True if self.meta.get_field("shipping_address_name") else False)
21
Anand Doshi2ac0a832013-07-10 20:49:44 +053022 def set_address_fields(self):
23 party_type, party_name = self.get_party_type_and_name()
24
25 if party_type in ("Customer", "Lead"):
26 if self.doc.customer_address:
27 self.doc.address_display = get_address_display(self.doc.customer_address)
28
29 if self.doc.shipping_address_name:
30 self.doc.shipping_address = get_address_display(self.doc.shipping_address_name)
31
32 elif self.doc.supplier_address:
33 self.doc.address_display = get_address_display(self.doc.supplier_address)
34
35 def set_contact_fields(self):
36 party_type, party_name = self.get_party_type_and_name()
37
38 if party_type == "Lead":
39 contact_dict = map_lead_contact_details(party_name)
40 else:
41 contact_dict = map_party_contact_details(self.doc.contact_person, party_type, party_name)
42
43 for fieldname, value in contact_dict.items():
44 if self.meta.get_field(fieldname):
45 self.doc.fields[fieldname] = value
46
47 def get_party_type_and_name(self):
48 if not hasattr(self, "_party_type_and_name"):
49 for party_type in ("Lead", "Customer", "Supplier"):
50 party_field = party_type.lower()
51 if self.meta.get_field(party_field) and self.doc.fields.get(party_field):
52 self._party_type_and_name = (party_type, self.doc.fields.get(party_field))
53 break
54
55 return self._party_type_and_name
56
Anand Doshi99100a42013-07-04 17:13:53 +053057 def get_customer_defaults(self):
Anand Doshi047f8d72013-08-27 14:20:00 +053058 if not self.doc.customer: return {}
59
Anand Doshi99100a42013-07-04 17:13:53 +053060 out = self.get_default_address_and_contact("customer")
61
62 customer = webnotes.doc("Customer", self.doc.customer)
63 for f in ['customer_name', 'customer_group', 'territory']:
64 out[f] = customer.fields.get(f)
Anand Doshiedc5f2e2013-04-26 17:21:49 +053065
Anand Doshi99100a42013-07-04 17:13:53 +053066 # fields prepended with default in Customer doctype
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()
Nabin Haitdc15b4f2014-01-20 16:48:49 +053081
82 customer_defaults["selling_price_list"] = \
83 self.get_user_default_price_list("selling_price_list") or \
84 customer_defaults.get("price_list") or \
85 webnotes.conn.get_value("Customer Group", self.doc.customer_group,
86 "default_price_list") or self.doc.selling_price_list
Anand Doshi99100a42013-07-04 17:13:53 +053087
Anand Doshif2045fb2013-07-25 17:46:02 +053088 for fieldname, val in customer_defaults.items():
Anand Doshi6c0b9362013-07-26 11:32:26 +053089 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +053090 self.doc.fields[fieldname] = val
91
Nabin Haitd2b87262013-09-02 20:12:53 +053092 if self.meta.get_field("sales_team") and self.doc.customer:
Anand Doshi99100a42013-07-04 17:13:53 +053093 self.set_sales_team_for_customer()
94
Nabin Haitdc15b4f2014-01-20 16:48:49 +053095 def get_user_default_price_list(self, price_list):
96 from webnotes.defaults import get_defaults_for
97 user_default_price_list = get_defaults_for(webnotes.session.user).get(price_list)
98 return cstr(user_default_price_list) \
99 if not isinstance(user_default_price_list, list) else ""
100
Anand Doshi99100a42013-07-04 17:13:53 +0530101 def set_sales_team_for_customer(self):
102 from webnotes.model import default_fields
103
104 # clear table
105 self.doclist = self.doc.clear_table(self.doclist, "sales_team")
106
107 sales_team = webnotes.conn.sql("""select * from `tabSales Team`
108 where parenttype="Customer" and parent=%s""", self.doc.customer, as_dict=True)
109 for i, sales_person in enumerate(sales_team):
110 # remove default fields
111 for fieldname in default_fields:
112 if fieldname in sales_person:
113 del sales_person[fieldname]
114
115 sales_person.update({
116 "doctype": "Sales Team",
117 "parentfield": "sales_team",
118 "idx": i+1
119 })
120
121 # add child
122 self.doclist.append(sales_person)
Anand Doshif2045fb2013-07-25 17:46:02 +0530123
124 def get_supplier_defaults(self):
125 out = self.get_default_address_and_contact("supplier")
126
127 supplier = webnotes.doc("Supplier", self.doc.supplier)
128 out["supplier_name"] = supplier.supplier_name
Anand Doshic7280b42013-07-29 11:48:28 +0530129 if supplier.default_currency:
130 out["currency"] = supplier.default_currency
Nabin Haitdc15b4f2014-01-20 16:48:49 +0530131
132 out["buying_price_list"] = self.get_user_default_price_list("buying_price_list") or \
133 supplier.default_price_list or self.doc.buying_price_list
Anand Doshif2045fb2013-07-25 17:46:02 +0530134
135 return out
136
137 def set_supplier_defaults(self):
138 for fieldname, val in self.get_supplier_defaults().items():
Anand Doshi6c0b9362013-07-26 11:32:26 +0530139 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +0530140 self.doc.fields[fieldname] = val
141
Anand Doshi99100a42013-07-04 17:13:53 +0530142 def get_lead_defaults(self):
143 out = self.get_default_address_and_contact("lead")
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530144
Anand Doshi99100a42013-07-04 17:13:53 +0530145 lead = webnotes.conn.get_value("Lead", self.doc.lead,
146 ["territory", "company_name", "lead_name"], as_dict=True) or {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530147
Anand Doshi99100a42013-07-04 17:13:53 +0530148 out["territory"] = lead.get("territory")
149 out["customer_name"] = lead.get("company_name") or lead.get("lead_name")
150
151 return out
152
153 def set_lead_defaults(self):
154 self.doc.fields.update(self.get_lead_defaults())
Anand Doshi99100a42013-07-04 17:13:53 +0530155
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530156 def get_customer_address(self, args):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530157 args = json.loads(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530158 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530159 'customer_address' : args["address"],
160 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530161 }
Nabin Haita279d782013-07-15 13:04:33 +0530162 if args.get('contact'):
163 ret.update(map_party_contact_details(args['contact']))
Anand Doshiae30e012012-10-26 15:01:22 +0530164
Anand Doshi2ac0a832013-07-10 20:49:44 +0530165 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530166
167 def set_customer_address(self, args):
168 self.doc.fields.update(self.get_customer_address(args))
169
Anand Doshi99100a42013-07-04 17:13:53 +0530170 # TODO deprecate this - used only in sales_order.js
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530171 def get_shipping_address(self, name):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530172 shipping_address = get_default_address("customer", name, is_shipping_address=True)
173 return {
174 'shipping_address_name' : shipping_address,
175 'shipping_address' : get_address_display(shipping_address) if shipping_address else None
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530176 }
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530177
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530178 # Get Supplier Default Primary Address - first load
179 # -----------------------
180 def get_default_supplier_address(self, args):
Anand Doshi923d41d2013-05-28 17:23:36 +0530181 if isinstance(args, basestring):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530182 args = json.loads(args)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530183
184 address_name = get_default_address("supplier", args["supplier"])
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530185 ret = {
186 'supplier_address' : address_name,
Anand Doshi2ac0a832013-07-10 20:49:44 +0530187 'address_display' : get_address_display(address_name),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530188 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530189 ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530190 ret.update(self.get_supplier_details(args['supplier']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530191 return ret
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530192
193 # Get Supplier Address
194 # -----------------------
195 def get_supplier_address(self, args):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530196 args = json.loads(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530197 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530198 'supplier_address' : args['address'],
199 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530200 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530201 ret.update(map_party_contact_details(contact_name=args['contact']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530202 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530203
204 def set_supplier_address(self, args):
205 self.doc.fields.update(self.get_supplier_address(args))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530206
207 # Get Supplier Details
208 # -----------------------
Anand Doshif2f5c942012-07-18 20:13:52 +0530209 def get_supplier_details(self, name):
210 supplier_details = webnotes.conn.sql("""\
211 select supplier_name, default_currency
212 from `tabSupplier`
213 where name = %s and docstatus < 2""", name, as_dict=1)
214 if supplier_details:
215 return {
216 'supplier_name': (supplier_details[0]['supplier_name']
217 or self.doc.fields.get('supplier_name')),
218 'currency': (supplier_details[0]['default_currency']
219 or self.doc.fields.get('currency')),
220 }
221 else:
222 return {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530223
224 # Get Sales Person Details of Customer
225 # ------------------------------------
226 def get_sales_person(self, name):
Anand Doshi8ae5ba92012-06-25 20:05:35 +0530227 self.doclist = self.doc.clear_table(self.doclist,'sales_team')
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530228 idx = 0
Anand Doshi74d1b652012-01-27 12:25:09 +0530229 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 +0530230 ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530231 ch.sales_person = d and cstr(d[0]) or ''
232 ch.allocated_percentage = d and flt(d[1]) or 0
233 ch.allocated_amount = d and flt(d[2]) or 0
234 ch.incentives = d and flt(d[3]) or 0
235 ch.idx = idx
236 idx += 1
Nabin Hait41cc3272012-04-30 14:36:18 +0530237
Rushabh Mehta35c017a2012-11-30 10:57:28 +0530238 def load_notification_message(self):
239 dt = self.doc.doctype.lower().replace(" ", "_")
240 if int(webnotes.conn.get_value("Notification Control", None, dt) or 0):
241 self.doc.fields["__notification_message"] = \
242 webnotes.conn.get_value("Notification Control", None, dt + "_message")
Rushabh Mehta96690eb2013-09-02 17:04:27 +0530243
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530244 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`
Nabin Haitad6ce4e2013-09-19 11:02:24 +0530257 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)),
258 ignore_permissions=True)
Anand Doshie53a81d2013-06-10 15:15:40 +0530259
260 def _add_calendar_event(self, opts):
261 opts = webnotes._dict(opts)
262
263 if self.doc.contact_date:
264 event_doclist = [{
265 "doctype": "Event",
266 "owner": opts.owner or self.doc.owner,
267 "subject": opts.subject,
268 "description": opts.description,
269 "starts_on": self.doc.contact_date + " 10:00:00",
270 "event_type": "Private",
271 "ref_type": self.doc.doctype,
272 "ref_name": self.doc.name
273 }]
274
275 if webnotes.conn.exists("Profile", self.doc.contact_by):
276 event_doclist.append({
277 "doctype": "Event User",
278 "parentfield": "event_individuals",
279 "person": self.doc.contact_by
280 })
281
282 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530283
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530284 def validate_uom_is_integer(self, uom_field, qty_fields):
285 validate_uom_is_integer(self.doclist, uom_field, qty_fields)
286
Nabin Hait2bd37772013-07-08 19:00:29 +0530287 def validate_with_previous_doc(self, source_dt, ref):
288 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530289 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530290 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530291 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530292 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530293 ref_dn = d.fields.get(val["ref_dn_field"])
294 if ref_dn:
295 if is_child:
296 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530297 if ref_dn not in item_ref_dn:
298 item_ref_dn.append(ref_dn)
Nabin Hait5e200e42013-07-29 15:29:51 +0530299 elif not val.get("allow_duplicate_prev_row_id"):
Nabin Haita9ec49e2013-07-15 16:33:24 +0530300 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
301 _(": Duplicate row from same ") + key, raise_exception=1)
302 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530303 ref_doc.setdefault(key, [])
304 if ref_dn not in ref_doc[key]:
305 ref_doc[key].append(ref_dn)
306 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530307 self.compare_values(ref_doc, val["compare_fields"])
308
309 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530310 for ref_doctype, ref_dn_list in ref_doc.items():
311 for ref_docname in ref_dn_list:
312 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
313 [d[0] for d in fields], as_dict=1)
314
315 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530316 if prevdoc_values[field] is not None:
317 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530318
319def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
320 out = {}
321
322 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530323 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530324 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530325 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530326 out["address_display"] = get_address_display(billing_address)
327 else:
328 out[party_field + "_address"] = out["address_display"] = None
329
330 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530331 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530332 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530333 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530334 out["shipping_address"] = get_address_display(shipping_address)
335 else:
336 out["shipping_address_name"] = out["shipping_address"] = None
337
338 # get contact
339 if party_field == "lead":
340 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530341 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530342 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530343 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530344
345 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530346
Anand Doshi2ac0a832013-07-10 20:49:44 +0530347def get_default_address(party_field, party_name, is_shipping_address=False):
348 if is_shipping_address:
349 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
350 else:
351 order_by = "is_primary_address desc, name asc"
352
353 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
354 limit 1""" % (party_field, "%s", order_by), party_name)
355
356 return address[0][0] if address else None
357
358def get_default_contact(party_field, party_name):
359 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
360 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
361 (party_name,))
362
363 return contact[0][0] if contact else None
364
Anand Doshiedbf3e12013-07-02 11:40:16 +0530365def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530366 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530367 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530368
Anand Doshiedbf3e12013-07-02 11:40:16 +0530369 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530370 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530371 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
372 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
373
Anand Doshi2ac0a832013-07-10 20:49:44 +0530374 display = ""
375 for separator, fieldname in sequence:
376 if address_dict.get(fieldname):
377 display += separator + address_dict.get(fieldname)
378
379 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530380
Anand Doshi2ac0a832013-07-10 20:49:44 +0530381def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530382 out = {}
383 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
384 out[fieldname] = None
385
386 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
387 if lead:
388 lead = lead[0]
389 out.update({
390 "contact_display": lead.get("lead_name"),
391 "contact_email": lead.get("email_id"),
392 "contact_mobile": lead.get("mobile_no"),
393 "contact_phone": lead.get("phone"),
394 })
395
396 return out
397
Anand Doshi2ac0a832013-07-10 20:49:44 +0530398def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530399 out = {}
400 for fieldname in ["contact_person", "contact_display", "contact_email",
401 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
402 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530403
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530404 if not contact_name and party_field:
405 contact_name = get_default_contact(party_field, party_name)
406
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530407 if contact_name:
408 contact = webnotes.conn.sql("""select * from `tabContact` where name=%s""",
409 contact_name, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530410
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530411 if contact:
412 contact = contact[0]
413 out.update({
414 "contact_person": contact.get("name"),
415 "contact_display": " ".join(filter(None,
416 [contact.get("first_name"), contact.get("last_name")])),
417 "contact_email": contact.get("email_id"),
418 "contact_mobile": contact.get("mobile_no"),
419 "contact_phone": contact.get("phone"),
420 "contact_designation": contact.get("designation"),
421 "contact_department": contact.get("department")
422 })
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530423
Anand Doshi99100a42013-07-04 17:13:53 +0530424 return out
425
426def get_address_territory(address_doc):
427 territory = None
428 for fieldname in ("city", "state", "country"):
429 value = address_doc.fields.get(fieldname)
430 if value:
431 territory = webnotes.conn.get_value("Territory", value.strip())
432 if territory:
433 break
434
435 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530436
437def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
438 """common validation for currency and price list currency"""
Akhilesh Darjee10dce342013-09-25 11:09:33 +0530439
Anand Doshi1dde46a2013-05-15 21:15:57 +0530440 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
Akhilesh Darjeee0b32822013-11-12 19:27:16 +0530441
Akhilesh Darjee1797cfe2013-10-11 13:34:10 +0530442 if not conversion_rate:
Rushabh Mehta2b089852013-12-19 18:27:48 +0530443 msgprint(_('%(conversion_rate_label)s is mandatory. Maybe Currency Exchange record is not created for %(from_currency)s to %(to_currency)s') % {
Akhilesh Darjeee0b32822013-11-12 19:27:16 +0530444 "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):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530450 from erpnext.stock.utils import validate_end_of_life
Anand Doshi1dde46a2013-05-15 21:15:57 +0530451 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)