blob: eed463961c3ee9438fe9149b7d2207f081781115 [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()
Anand Doshi2ac0a832013-07-10 20:49:44 +053081
Anand Doshi47e14a92013-08-13 13:01:12 +053082 customer_defaults["selling_price_list"] = customer_defaults.get("price_list") or \
Anand Doshi99100a42013-07-04 17:13:53 +053083 webnotes.conn.get_value("Customer Group", self.doc.customer_group, "default_price_list") or \
Anand Doshi47e14a92013-08-13 13:01:12 +053084 self.doc.selling_price_list
Anand Doshi99100a42013-07-04 17:13:53 +053085
Anand Doshif2045fb2013-07-25 17:46:02 +053086 for fieldname, val in customer_defaults.items():
Anand Doshi6c0b9362013-07-26 11:32:26 +053087 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +053088 self.doc.fields[fieldname] = val
89
Nabin Haitd2b87262013-09-02 20:12:53 +053090 if self.meta.get_field("sales_team") and self.doc.customer:
Anand Doshi99100a42013-07-04 17:13:53 +053091 self.set_sales_team_for_customer()
92
93 def set_sales_team_for_customer(self):
94 from webnotes.model import default_fields
95
96 # clear table
97 self.doclist = self.doc.clear_table(self.doclist, "sales_team")
98
99 sales_team = webnotes.conn.sql("""select * from `tabSales Team`
100 where parenttype="Customer" and parent=%s""", self.doc.customer, as_dict=True)
101 for i, sales_person in enumerate(sales_team):
102 # remove default fields
103 for fieldname in default_fields:
104 if fieldname in sales_person:
105 del sales_person[fieldname]
106
107 sales_person.update({
108 "doctype": "Sales Team",
109 "parentfield": "sales_team",
110 "idx": i+1
111 })
112
113 # add child
114 self.doclist.append(sales_person)
Anand Doshif2045fb2013-07-25 17:46:02 +0530115
116 def get_supplier_defaults(self):
117 out = self.get_default_address_and_contact("supplier")
118
119 supplier = webnotes.doc("Supplier", self.doc.supplier)
120 out["supplier_name"] = supplier.supplier_name
Anand Doshic7280b42013-07-29 11:48:28 +0530121 if supplier.default_currency:
122 out["currency"] = supplier.default_currency
Akhilesh Darjee910c7162013-11-19 12:51:14 +0530123 if supplier.default_price_list:
124 out["buying_price_list"] = supplier.default_price_list
Anand Doshif2045fb2013-07-25 17:46:02 +0530125
126 return out
127
128 def set_supplier_defaults(self):
129 for fieldname, val in self.get_supplier_defaults().items():
Anand Doshi6c0b9362013-07-26 11:32:26 +0530130 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +0530131 self.doc.fields[fieldname] = val
132
Anand Doshi99100a42013-07-04 17:13:53 +0530133 def get_lead_defaults(self):
134 out = self.get_default_address_and_contact("lead")
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530135
Anand Doshi99100a42013-07-04 17:13:53 +0530136 lead = webnotes.conn.get_value("Lead", self.doc.lead,
137 ["territory", "company_name", "lead_name"], as_dict=True) or {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530138
Anand Doshi99100a42013-07-04 17:13:53 +0530139 out["territory"] = lead.get("territory")
140 out["customer_name"] = lead.get("company_name") or lead.get("lead_name")
141
142 return out
143
144 def set_lead_defaults(self):
145 self.doc.fields.update(self.get_lead_defaults())
Anand Doshi99100a42013-07-04 17:13:53 +0530146
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530147 def get_customer_address(self, args):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530148 args = json.loads(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530149 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530150 'customer_address' : args["address"],
151 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530152 }
Nabin Haita279d782013-07-15 13:04:33 +0530153 if args.get('contact'):
154 ret.update(map_party_contact_details(args['contact']))
Anand Doshiae30e012012-10-26 15:01:22 +0530155
Anand Doshi2ac0a832013-07-10 20:49:44 +0530156 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530157
158 def set_customer_address(self, args):
159 self.doc.fields.update(self.get_customer_address(args))
160
Anand Doshi99100a42013-07-04 17:13:53 +0530161 # TODO deprecate this - used only in sales_order.js
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530162 def get_shipping_address(self, name):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530163 shipping_address = get_default_address("customer", name, is_shipping_address=True)
164 return {
165 'shipping_address_name' : shipping_address,
166 'shipping_address' : get_address_display(shipping_address) if shipping_address else None
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530167 }
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530168
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530169 # Get Supplier Default Primary Address - first load
170 # -----------------------
171 def get_default_supplier_address(self, args):
Anand Doshi923d41d2013-05-28 17:23:36 +0530172 if isinstance(args, basestring):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530173 args = json.loads(args)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530174
175 address_name = get_default_address("supplier", args["supplier"])
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530176 ret = {
177 'supplier_address' : address_name,
Anand Doshi2ac0a832013-07-10 20:49:44 +0530178 'address_display' : get_address_display(address_name),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530179 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530180 ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530181 ret.update(self.get_supplier_details(args['supplier']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530182 return ret
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530183
184 # Get Supplier Address
185 # -----------------------
186 def get_supplier_address(self, args):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530187 args = json.loads(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530188 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530189 'supplier_address' : args['address'],
190 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530191 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530192 ret.update(map_party_contact_details(contact_name=args['contact']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530193 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530194
195 def set_supplier_address(self, args):
196 self.doc.fields.update(self.get_supplier_address(args))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530197
198 # Get Supplier Details
199 # -----------------------
Anand Doshif2f5c942012-07-18 20:13:52 +0530200 def get_supplier_details(self, name):
201 supplier_details = webnotes.conn.sql("""\
202 select supplier_name, default_currency
203 from `tabSupplier`
204 where name = %s and docstatus < 2""", name, as_dict=1)
205 if supplier_details:
206 return {
207 'supplier_name': (supplier_details[0]['supplier_name']
208 or self.doc.fields.get('supplier_name')),
209 'currency': (supplier_details[0]['default_currency']
210 or self.doc.fields.get('currency')),
211 }
212 else:
213 return {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530214
215 # Get Sales Person Details of Customer
216 # ------------------------------------
217 def get_sales_person(self, name):
Anand Doshi8ae5ba92012-06-25 20:05:35 +0530218 self.doclist = self.doc.clear_table(self.doclist,'sales_team')
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530219 idx = 0
Anand Doshi74d1b652012-01-27 12:25:09 +0530220 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 +0530221 ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530222 ch.sales_person = d and cstr(d[0]) or ''
223 ch.allocated_percentage = d and flt(d[1]) or 0
224 ch.allocated_amount = d and flt(d[2]) or 0
225 ch.incentives = d and flt(d[3]) or 0
226 ch.idx = idx
227 idx += 1
Nabin Hait41cc3272012-04-30 14:36:18 +0530228
Rushabh Mehta35c017a2012-11-30 10:57:28 +0530229 def load_notification_message(self):
230 dt = self.doc.doctype.lower().replace(" ", "_")
231 if int(webnotes.conn.get_value("Notification Control", None, dt) or 0):
232 self.doc.fields["__notification_message"] = \
233 webnotes.conn.get_value("Notification Control", None, dt + "_message")
Rushabh Mehta96690eb2013-09-02 17:04:27 +0530234
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530235 def validate_posting_time(self):
236 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530237 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530238
Anand Doshi670199b2013-06-10 15:38:01 +0530239 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530240 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530241 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530242
243 self.delete_events()
244 self._add_calendar_event(opts)
245
246 def delete_events(self):
247 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Nabin Haitad6ce4e2013-09-19 11:02:24 +0530248 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)),
249 ignore_permissions=True)
Anand Doshie53a81d2013-06-10 15:15:40 +0530250
251 def _add_calendar_event(self, opts):
252 opts = webnotes._dict(opts)
253
254 if self.doc.contact_date:
255 event_doclist = [{
256 "doctype": "Event",
257 "owner": opts.owner or self.doc.owner,
258 "subject": opts.subject,
259 "description": opts.description,
260 "starts_on": self.doc.contact_date + " 10:00:00",
261 "event_type": "Private",
262 "ref_type": self.doc.doctype,
263 "ref_name": self.doc.name
264 }]
265
266 if webnotes.conn.exists("Profile", self.doc.contact_by):
267 event_doclist.append({
268 "doctype": "Event User",
269 "parentfield": "event_individuals",
270 "person": self.doc.contact_by
271 })
272
273 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530274
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530275 def validate_uom_is_integer(self, uom_field, qty_fields):
276 validate_uom_is_integer(self.doclist, uom_field, qty_fields)
277
Nabin Hait2bd37772013-07-08 19:00:29 +0530278 def validate_with_previous_doc(self, source_dt, ref):
279 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530280 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530281 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530282 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530283 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530284 ref_dn = d.fields.get(val["ref_dn_field"])
285 if ref_dn:
286 if is_child:
287 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530288 if ref_dn not in item_ref_dn:
289 item_ref_dn.append(ref_dn)
Nabin Hait5e200e42013-07-29 15:29:51 +0530290 elif not val.get("allow_duplicate_prev_row_id"):
Nabin Haita9ec49e2013-07-15 16:33:24 +0530291 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
292 _(": Duplicate row from same ") + key, raise_exception=1)
293 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530294 ref_doc.setdefault(key, [])
295 if ref_dn not in ref_doc[key]:
296 ref_doc[key].append(ref_dn)
297 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530298 self.compare_values(ref_doc, val["compare_fields"])
299
300 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530301 for ref_doctype, ref_dn_list in ref_doc.items():
302 for ref_docname in ref_dn_list:
303 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
304 [d[0] for d in fields], as_dict=1)
305
306 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530307 if prevdoc_values[field] is not None:
308 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530309
310def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
311 out = {}
312
313 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530314 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530315 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530316 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530317 out["address_display"] = get_address_display(billing_address)
318 else:
319 out[party_field + "_address"] = out["address_display"] = None
320
321 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530322 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530323 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530324 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530325 out["shipping_address"] = get_address_display(shipping_address)
326 else:
327 out["shipping_address_name"] = out["shipping_address"] = None
328
329 # get contact
330 if party_field == "lead":
331 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530332 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530333 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530334 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530335
336 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530337
Anand Doshi2ac0a832013-07-10 20:49:44 +0530338def get_default_address(party_field, party_name, is_shipping_address=False):
339 if is_shipping_address:
340 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
341 else:
342 order_by = "is_primary_address desc, name asc"
343
344 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
345 limit 1""" % (party_field, "%s", order_by), party_name)
346
347 return address[0][0] if address else None
348
349def get_default_contact(party_field, party_name):
350 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
351 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
352 (party_name,))
353
354 return contact[0][0] if contact else None
355
Anand Doshiedbf3e12013-07-02 11:40:16 +0530356def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530357 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530358 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530359
Anand Doshiedbf3e12013-07-02 11:40:16 +0530360 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530361 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530362 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
363 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
364
Anand Doshi2ac0a832013-07-10 20:49:44 +0530365 display = ""
366 for separator, fieldname in sequence:
367 if address_dict.get(fieldname):
368 display += separator + address_dict.get(fieldname)
369
370 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530371
Anand Doshi2ac0a832013-07-10 20:49:44 +0530372def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530373 out = {}
374 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
375 out[fieldname] = None
376
377 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
378 if lead:
379 lead = lead[0]
380 out.update({
381 "contact_display": lead.get("lead_name"),
382 "contact_email": lead.get("email_id"),
383 "contact_mobile": lead.get("mobile_no"),
384 "contact_phone": lead.get("phone"),
385 })
386
387 return out
388
Anand Doshi2ac0a832013-07-10 20:49:44 +0530389def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530390 out = {}
391 for fieldname in ["contact_person", "contact_display", "contact_email",
392 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
393 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530394
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530395 if not contact_name and party_field:
396 contact_name = get_default_contact(party_field, party_name)
397
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530398 if contact_name:
399 contact = webnotes.conn.sql("""select * from `tabContact` where name=%s""",
400 contact_name, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530401
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530402 if contact:
403 contact = contact[0]
404 out.update({
405 "contact_person": contact.get("name"),
406 "contact_display": " ".join(filter(None,
407 [contact.get("first_name"), contact.get("last_name")])),
408 "contact_email": contact.get("email_id"),
409 "contact_mobile": contact.get("mobile_no"),
410 "contact_phone": contact.get("phone"),
411 "contact_designation": contact.get("designation"),
412 "contact_department": contact.get("department")
413 })
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530414
Anand Doshi99100a42013-07-04 17:13:53 +0530415 return out
416
417def get_address_territory(address_doc):
418 territory = None
419 for fieldname in ("city", "state", "country"):
420 value = address_doc.fields.get(fieldname)
421 if value:
422 territory = webnotes.conn.get_value("Territory", value.strip())
423 if territory:
424 break
425
426 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530427
428def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
429 """common validation for currency and price list currency"""
Akhilesh Darjee10dce342013-09-25 11:09:33 +0530430
Anand Doshi1dde46a2013-05-15 21:15:57 +0530431 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
Akhilesh Darjeee0b32822013-11-12 19:27:16 +0530432
Akhilesh Darjee1797cfe2013-10-11 13:34:10 +0530433 if not conversion_rate:
Rushabh Mehta2b089852013-12-19 18:27:48 +0530434 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 +0530435 "conversion_rate_label": conversion_rate_label,
436 "from_currency": currency,
437 "to_currency": company_currency
438 }, raise_exception=True)
Anand Doshi1dde46a2013-05-15 21:15:57 +0530439
440def validate_item_fetch(args, item):
Rushabh Mehta1f847992013-12-12 19:12:19 +0530441 from erpnext.stock.utils import validate_end_of_life
Anand Doshi1dde46a2013-05-15 21:15:57 +0530442 validate_end_of_life(item.name, item.end_of_life)
443
444 # validate company
445 if not args.company:
446 msgprint(_("Please specify Company"), raise_exception=True)
447
Anand Doshif3096132013-05-21 19:35:06 +0530448def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530449 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530450 if not meta:
451 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530452
Anand Doshif3096132013-05-21 19:35:06 +0530453 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530454 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530455 validate_conversion_rate(args.currency, args.conversion_rate,
456 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530457
458 # round it
459 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530460 get_field_precision(meta.get_field("conversion_rate"),
461 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530462
Anand Doshif3096132013-05-21 19:35:06 +0530463 # validate price list conversion rate
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530464 if meta.get_field("price_list_currency") and (args.selling_price_list or args.buying_price_list) \
465 and args.price_list_currency:
Anand Doshif3096132013-05-21 19:35:06 +0530466 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530467 meta.get_label("plc_conversion_rate"), args.company)
468
469 # round it
470 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530471 get_field_precision(meta.get_field("plc_conversion_rate"),
472 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530473
Anand Doshi11d31132013-06-17 12:51:36 +0530474def delete_events(ref_type, ref_name):
475 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530476 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530477
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530478class UOMMustBeIntegerError(webnotes.ValidationError): pass
479
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530480def validate_uom_is_integer(doclist, uom_field, qty_fields):
481 if isinstance(qty_fields, basestring):
482 qty_fields = [qty_fields]
483
484 integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom,
485 "must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
486
487 if not integer_uoms:
488 return
489
490 for d in doclist:
491 if d.fields.get(uom_field) in integer_uoms:
492 for f in qty_fields:
493 if d.fields.get(f):
494 if cint(d.fields[f])!=d.fields[f]:
495 webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
496 + "': " + _("Quantity cannot be a fraction.") \
497 + " " + _("In Row") + ": " + str(d.idx),
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530498 raise_exception=UOMMustBeIntegerError)