blob: b688200b597178fc775d32e81854320edfdb0602 [file] [log] [blame]
Rushabh Mehta3966f1d2012-02-23 12:35:32 +05301# ERPNext - web based ERP (http://erpnext.com)
2# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
3#
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
Anand Doshi486f9df2012-07-19 13:40:31 +053017from __future__ import unicode_literals
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +053018import webnotes
Anand Doshi1dde46a2013-05-15 21:15:57 +053019from webnotes import msgprint, _
Rushabh Mehta4dca4012013-07-25 17:45:59 +053020from webnotes.utils import load_json, cstr, flt, now_datetime, cint
Anand Doshi0fd99e72012-11-30 16:38:04 +053021from webnotes.model.doc import addchild
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +053022
Nabin Hait0feebc12013-06-03 16:45:38 +053023from controllers.status_updater import StatusUpdater
Anand Doshi756dca72013-01-15 18:39:21 +053024
Nabin Hait0feebc12013-06-03 16:45:38 +053025class TransactionBase(StatusUpdater):
Anand Doshi99100a42013-07-04 17:13:53 +053026 def get_default_address_and_contact(self, party_field, party_name=None):
Anand Doshiedc5f2e2013-04-26 17:21:49 +053027 """get a dict of default field values of address and contact for a given party type
28 party_type can be one of: customer, supplier"""
Anand Doshi99100a42013-07-04 17:13:53 +053029 if not party_name:
30 party_name = self.doc.fields.get(party_field)
Anand Doshiedc5f2e2013-04-26 17:21:49 +053031
Anand Doshi99100a42013-07-04 17:13:53 +053032 return get_default_address_and_contact(party_field, party_name,
33 fetch_shipping_address=True if self.meta.get_field("shipping_address_name") else False)
34
Anand Doshi2ac0a832013-07-10 20:49:44 +053035 def set_address_fields(self):
36 party_type, party_name = self.get_party_type_and_name()
37
38 if party_type in ("Customer", "Lead"):
39 if self.doc.customer_address:
40 self.doc.address_display = get_address_display(self.doc.customer_address)
41
42 if self.doc.shipping_address_name:
43 self.doc.shipping_address = get_address_display(self.doc.shipping_address_name)
44
45 elif self.doc.supplier_address:
46 self.doc.address_display = get_address_display(self.doc.supplier_address)
47
48 def set_contact_fields(self):
49 party_type, party_name = self.get_party_type_and_name()
50
51 if party_type == "Lead":
52 contact_dict = map_lead_contact_details(party_name)
53 else:
54 contact_dict = map_party_contact_details(self.doc.contact_person, party_type, party_name)
55
56 for fieldname, value in contact_dict.items():
57 if self.meta.get_field(fieldname):
58 self.doc.fields[fieldname] = value
59
60 def get_party_type_and_name(self):
61 if not hasattr(self, "_party_type_and_name"):
62 for party_type in ("Lead", "Customer", "Supplier"):
63 party_field = party_type.lower()
64 if self.meta.get_field(party_field) and self.doc.fields.get(party_field):
65 self._party_type_and_name = (party_type, self.doc.fields.get(party_field))
66 break
67
68 return self._party_type_and_name
69
Anand Doshi99100a42013-07-04 17:13:53 +053070 def get_customer_defaults(self):
71 out = self.get_default_address_and_contact("customer")
72
73 customer = webnotes.doc("Customer", self.doc.customer)
74 for f in ['customer_name', 'customer_group', 'territory']:
75 out[f] = customer.fields.get(f)
Anand Doshiedc5f2e2013-04-26 17:21:49 +053076
Anand Doshi99100a42013-07-04 17:13:53 +053077 # fields prepended with default in Customer doctype
78 for f in ['sales_partner', 'commission_rate', 'currency', 'price_list']:
Anand Doshi946e0de2013-07-11 18:26:00 +053079 if customer.fields.get("default_" + f):
80 out[f] = customer.fields.get("default_" + f)
Anand Doshi99100a42013-07-04 17:13:53 +053081
82 return out
83
84 def set_customer_defaults(self):
85 """
86 For a customer:
87 1. Sets default address and contact
88 2. Sets values like Territory, Customer Group, etc.
89 3. Clears existing Sales Team and fetches the one mentioned in Customer
90 """
91 customer_defaults = self.get_customer_defaults()
Anand Doshi2ac0a832013-07-10 20:49:44 +053092
Anand Doshi9b496142013-07-11 19:13:58 +053093 customer_defaults["price_list"] = customer_defaults.get("price_list") or \
Anand Doshi99100a42013-07-04 17:13:53 +053094 webnotes.conn.get_value("Customer Group", self.doc.customer_group, "default_price_list") or \
95 self.doc.price_list
96
Anand Doshif2045fb2013-07-25 17:46:02 +053097 for fieldname, val in customer_defaults.items():
Anand Doshi6c0b9362013-07-26 11:32:26 +053098 if self.meta.get_field(fieldname):
Anand Doshif2045fb2013-07-25 17:46:02 +053099 self.doc.fields[fieldname] = val
100
Anand Doshi99100a42013-07-04 17:13:53 +0530101 if self.meta.get_field("sales_team"):
102 self.set_sales_team_for_customer()
103
104 def set_sales_team_for_customer(self):
105 from webnotes.model import default_fields
106
107 # clear table
108 self.doclist = self.doc.clear_table(self.doclist, "sales_team")
109
110 sales_team = webnotes.conn.sql("""select * from `tabSales Team`
111 where parenttype="Customer" and parent=%s""", self.doc.customer, as_dict=True)
112 for i, sales_person in enumerate(sales_team):
113 # remove default fields
114 for fieldname in default_fields:
115 if fieldname in sales_person:
116 del sales_person[fieldname]
117
118 sales_person.update({
119 "doctype": "Sales Team",
120 "parentfield": "sales_team",
121 "idx": i+1
122 })
123
124 # add child
125 self.doclist.append(sales_person)
Anand Doshif2045fb2013-07-25 17:46:02 +0530126
127 def get_supplier_defaults(self):
128 out = self.get_default_address_and_contact("supplier")
129
130 supplier = webnotes.doc("Supplier", self.doc.supplier)
131 out["supplier_name"] = supplier.supplier_name
Anand Doshic7280b42013-07-29 11:48:28 +0530132 if supplier.default_currency:
133 out["currency"] = supplier.default_currency
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):
157 args = load_json(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):
182 args = load_json(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):
196 args = load_json(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")
243
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530244 def add_communication_list(self):
245 # remove communications if present
246 self.doclist = webnotes.doclist(self.doclist).get({
247 "doctype": ["!=", "Communcation"]})
248
249 comm_list = webnotes.conn.sql("""select * from tabCommunication
250 where %s=%s order by modified desc limit 20""" \
251 % (self.doc.doctype.replace(" ", "_").lower(), "%s"),
Anand Doshi060d9242013-06-12 17:40:36 +0530252 self.doc.name, as_dict=1, update={"doctype":"Communication"})
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530253
254 self.doclist.extend(webnotes.doclist([webnotes.doc(fielddata=d) \
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530255 for d in comm_list]))
256
257 def validate_posting_time(self):
258 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530259 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530260
Anand Doshi670199b2013-06-10 15:38:01 +0530261 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530262 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530263 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530264
265 self.delete_events()
266 self._add_calendar_event(opts)
267
268 def delete_events(self):
269 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
270 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)))
271
272 def _add_calendar_event(self, opts):
273 opts = webnotes._dict(opts)
274
275 if self.doc.contact_date:
276 event_doclist = [{
277 "doctype": "Event",
278 "owner": opts.owner or self.doc.owner,
279 "subject": opts.subject,
280 "description": opts.description,
281 "starts_on": self.doc.contact_date + " 10:00:00",
282 "event_type": "Private",
283 "ref_type": self.doc.doctype,
284 "ref_name": self.doc.name
285 }]
286
287 if webnotes.conn.exists("Profile", self.doc.contact_by):
288 event_doclist.append({
289 "doctype": "Event User",
290 "parentfield": "event_individuals",
291 "person": self.doc.contact_by
292 })
293
294 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530295
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530296 def validate_uom_is_integer(self, uom_field, qty_fields):
297 validate_uom_is_integer(self.doclist, uom_field, qty_fields)
298
Nabin Hait2bd37772013-07-08 19:00:29 +0530299 def validate_with_previous_doc(self, source_dt, ref):
300 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530301 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530302 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530303 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530304 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530305 ref_dn = d.fields.get(val["ref_dn_field"])
306 if ref_dn:
307 if is_child:
308 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530309 if ref_dn not in item_ref_dn:
310 item_ref_dn.append(ref_dn)
Nabin Hait5e200e42013-07-29 15:29:51 +0530311 elif not val.get("allow_duplicate_prev_row_id"):
Nabin Haita9ec49e2013-07-15 16:33:24 +0530312 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
313 _(": Duplicate row from same ") + key, raise_exception=1)
314 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530315 ref_doc.setdefault(key, [])
316 if ref_dn not in ref_doc[key]:
317 ref_doc[key].append(ref_dn)
318 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530319 self.compare_values(ref_doc, val["compare_fields"])
320
321 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530322 for ref_doctype, ref_dn_list in ref_doc.items():
323 for ref_docname in ref_dn_list:
324 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
325 [d[0] for d in fields], as_dict=1)
326
327 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530328 if prevdoc_values[field] is not None:
329 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530330
331def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
332 out = {}
333
334 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530335 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530336 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530337 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530338 out["address_display"] = get_address_display(billing_address)
339 else:
340 out[party_field + "_address"] = out["address_display"] = None
341
342 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530343 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530344 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530345 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530346 out["shipping_address"] = get_address_display(shipping_address)
347 else:
348 out["shipping_address_name"] = out["shipping_address"] = None
349
350 # get contact
351 if party_field == "lead":
352 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530353 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530354 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530355 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530356
357 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530358
Anand Doshi2ac0a832013-07-10 20:49:44 +0530359def get_default_address(party_field, party_name, is_shipping_address=False):
360 if is_shipping_address:
361 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
362 else:
363 order_by = "is_primary_address desc, name asc"
364
365 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
366 limit 1""" % (party_field, "%s", order_by), party_name)
367
368 return address[0][0] if address else None
369
370def get_default_contact(party_field, party_name):
371 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
372 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
373 (party_name,))
374
375 return contact[0][0] if contact else None
376
Anand Doshiedbf3e12013-07-02 11:40:16 +0530377def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530378 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530379 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530380
Anand Doshiedbf3e12013-07-02 11:40:16 +0530381 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530382 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530383 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
384 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
385
Anand Doshi2ac0a832013-07-10 20:49:44 +0530386 display = ""
387 for separator, fieldname in sequence:
388 if address_dict.get(fieldname):
389 display += separator + address_dict.get(fieldname)
390
391 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530392
Anand Doshi2ac0a832013-07-10 20:49:44 +0530393def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530394 out = {}
395 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
396 out[fieldname] = None
397
398 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
399 if lead:
400 lead = lead[0]
401 out.update({
402 "contact_display": lead.get("lead_name"),
403 "contact_email": lead.get("email_id"),
404 "contact_mobile": lead.get("mobile_no"),
405 "contact_phone": lead.get("phone"),
406 })
407
408 return out
409
Anand Doshi2ac0a832013-07-10 20:49:44 +0530410def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530411 out = {}
412 for fieldname in ["contact_person", "contact_display", "contact_email",
413 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
414 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530415
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530416 if not contact_name and party_field:
417 contact_name = get_default_contact(party_field, party_name)
418
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530419 if contact_name:
420 contact = webnotes.conn.sql("""select * from `tabContact` where name=%s""",
421 contact_name, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530422
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530423 if contact:
424 contact = contact[0]
425 out.update({
426 "contact_person": contact.get("name"),
427 "contact_display": " ".join(filter(None,
428 [contact.get("first_name"), contact.get("last_name")])),
429 "contact_email": contact.get("email_id"),
430 "contact_mobile": contact.get("mobile_no"),
431 "contact_phone": contact.get("phone"),
432 "contact_designation": contact.get("designation"),
433 "contact_department": contact.get("department")
434 })
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530435
Anand Doshi99100a42013-07-04 17:13:53 +0530436 return out
437
438def get_address_territory(address_doc):
439 territory = None
440 for fieldname in ("city", "state", "country"):
441 value = address_doc.fields.get(fieldname)
442 if value:
443 territory = webnotes.conn.get_value("Territory", value.strip())
444 if territory:
445 break
446
447 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530448
449def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
450 """common validation for currency and price list currency"""
451 if conversion_rate == 0:
452 msgprint(conversion_rate_label + _(' cannot be 0'), raise_exception=True)
453
454 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
455
456 # parenthesis for 'OR' are necessary as we want it to evaluate as
457 # mandatory valid condition and (1st optional valid condition
458 # or 2nd optional valid condition)
459 valid_conversion_rate = (conversion_rate and
460 ((currency == company_currency and conversion_rate == 1.00)
461 or (currency != company_currency and conversion_rate != 1.00)))
462
463 if not valid_conversion_rate:
464 msgprint(_('Please enter valid ') + conversion_rate_label + (': ')
465 + ("1 %s = [?] %s" % (currency, company_currency)),
466 raise_exception=True)
467
468def validate_item_fetch(args, item):
469 from stock.utils import validate_end_of_life
470 validate_end_of_life(item.name, item.end_of_life)
471
472 # validate company
473 if not args.company:
474 msgprint(_("Please specify Company"), raise_exception=True)
475
Anand Doshif3096132013-05-21 19:35:06 +0530476def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530477 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530478 if not meta:
479 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530480
Anand Doshif3096132013-05-21 19:35:06 +0530481 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530482 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530483 validate_conversion_rate(args.currency, args.conversion_rate,
484 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530485
486 # round it
487 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530488 get_field_precision(meta.get_field("conversion_rate"),
489 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530490
Anand Doshif3096132013-05-21 19:35:06 +0530491 # validate price list conversion rate
492 if meta.get_field("price_list_currency") and args.price_list_name and \
493 args.price_list_currency:
494 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530495 meta.get_label("plc_conversion_rate"), args.company)
496
497 # round it
498 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530499 get_field_precision(meta.get_field("plc_conversion_rate"),
500 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530501
Anand Doshi11d31132013-06-17 12:51:36 +0530502def delete_events(ref_type, ref_name):
503 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530504 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530505
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530506class UOMMustBeIntegerError(webnotes.ValidationError): pass
507
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530508def validate_uom_is_integer(doclist, uom_field, qty_fields):
509 if isinstance(qty_fields, basestring):
510 qty_fields = [qty_fields]
511
512 integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom,
513 "must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
514
515 if not integer_uoms:
516 return
517
518 for d in doclist:
519 if d.fields.get(uom_field) in integer_uoms:
520 for f in qty_fields:
521 if d.fields.get(f):
522 if cint(d.fields[f])!=d.fields[f]:
523 webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
524 + "': " + _("Quantity cannot be a fraction.") \
525 + " " + _("In Row") + ": " + str(d.idx),
Rushabh Mehtac4f5e4f2013-07-26 11:21:45 +0530526 raise_exception=UOMMustBeIntegerError)