blob: ca0afa009c4ad10697c2478e04d9439cbd45a7e6 [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
132 out["currency"] = supplier.default_currency
133
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):
156 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")
242
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530243 def add_communication_list(self):
244 # remove communications if present
245 self.doclist = webnotes.doclist(self.doclist).get({
246 "doctype": ["!=", "Communcation"]})
247
248 comm_list = webnotes.conn.sql("""select * from tabCommunication
249 where %s=%s order by modified desc limit 20""" \
250 % (self.doc.doctype.replace(" ", "_").lower(), "%s"),
Anand Doshi060d9242013-06-12 17:40:36 +0530251 self.doc.name, as_dict=1, update={"doctype":"Communication"})
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530252
253 self.doclist.extend(webnotes.doclist([webnotes.doc(fielddata=d) \
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530254 for d in comm_list]))
255
256 def validate_posting_time(self):
257 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530258 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530259
Anand Doshi670199b2013-06-10 15:38:01 +0530260 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530261 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530262 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530263
264 self.delete_events()
265 self._add_calendar_event(opts)
266
267 def delete_events(self):
268 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
269 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)))
270
271 def _add_calendar_event(self, opts):
272 opts = webnotes._dict(opts)
273
274 if self.doc.contact_date:
275 event_doclist = [{
276 "doctype": "Event",
277 "owner": opts.owner or self.doc.owner,
278 "subject": opts.subject,
279 "description": opts.description,
280 "starts_on": self.doc.contact_date + " 10:00:00",
281 "event_type": "Private",
282 "ref_type": self.doc.doctype,
283 "ref_name": self.doc.name
284 }]
285
286 if webnotes.conn.exists("Profile", self.doc.contact_by):
287 event_doclist.append({
288 "doctype": "Event User",
289 "parentfield": "event_individuals",
290 "person": self.doc.contact_by
291 })
292
293 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530294
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530295 def validate_uom_is_integer(self, uom_field, qty_fields):
296 validate_uom_is_integer(self.doclist, uom_field, qty_fields)
297
Nabin Hait2bd37772013-07-08 19:00:29 +0530298 def validate_with_previous_doc(self, source_dt, ref):
299 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530300 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530301 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530302 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530303 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530304 ref_dn = d.fields.get(val["ref_dn_field"])
305 if ref_dn:
306 if is_child:
307 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530308 if ref_dn not in item_ref_dn:
309 item_ref_dn.append(ref_dn)
310 else:
311 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
312 _(": Duplicate row from same ") + key, raise_exception=1)
313 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530314 ref_doc.setdefault(key, [])
315 if ref_dn not in ref_doc[key]:
316 ref_doc[key].append(ref_dn)
317 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530318 self.compare_values(ref_doc, val["compare_fields"])
319
320 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530321 for ref_doctype, ref_dn_list in ref_doc.items():
322 for ref_docname in ref_dn_list:
323 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
324 [d[0] for d in fields], as_dict=1)
325
326 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530327 if prevdoc_values[field] is not None:
328 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530329
330def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
331 out = {}
332
333 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530334 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530335 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530336 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530337 out["address_display"] = get_address_display(billing_address)
338 else:
339 out[party_field + "_address"] = out["address_display"] = None
340
341 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530342 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530343 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530344 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530345 out["shipping_address"] = get_address_display(shipping_address)
346 else:
347 out["shipping_address_name"] = out["shipping_address"] = None
348
349 # get contact
350 if party_field == "lead":
351 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530352 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530353 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530354 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530355
356 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530357
Anand Doshi2ac0a832013-07-10 20:49:44 +0530358def get_default_address(party_field, party_name, is_shipping_address=False):
359 if is_shipping_address:
360 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
361 else:
362 order_by = "is_primary_address desc, name asc"
363
364 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
365 limit 1""" % (party_field, "%s", order_by), party_name)
366
367 return address[0][0] if address else None
368
369def get_default_contact(party_field, party_name):
370 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
371 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
372 (party_name,))
373
374 return contact[0][0] if contact else None
375
Anand Doshiedbf3e12013-07-02 11:40:16 +0530376def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530377 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530378 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530379
Anand Doshiedbf3e12013-07-02 11:40:16 +0530380 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530381 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530382 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
383 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
384
Anand Doshi2ac0a832013-07-10 20:49:44 +0530385 display = ""
386 for separator, fieldname in sequence:
387 if address_dict.get(fieldname):
388 display += separator + address_dict.get(fieldname)
389
390 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530391
Anand Doshi2ac0a832013-07-10 20:49:44 +0530392def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530393 out = {}
394 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
395 out[fieldname] = None
396
397 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
398 if lead:
399 lead = lead[0]
400 out.update({
401 "contact_display": lead.get("lead_name"),
402 "contact_email": lead.get("email_id"),
403 "contact_mobile": lead.get("mobile_no"),
404 "contact_phone": lead.get("phone"),
405 })
406
407 return out
408
Anand Doshi2ac0a832013-07-10 20:49:44 +0530409def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530410 out = {}
411 for fieldname in ["contact_person", "contact_display", "contact_email",
412 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
413 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530414
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530415 if not contact_name and party_field:
416 contact_name = get_default_contact(party_field, party_name)
417
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530418 if contact_name:
419 contact = webnotes.conn.sql("""select * from `tabContact` where name=%s""",
420 contact_name, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530421
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530422 if contact:
423 contact = contact[0]
424 out.update({
425 "contact_person": contact.get("name"),
426 "contact_display": " ".join(filter(None,
427 [contact.get("first_name"), contact.get("last_name")])),
428 "contact_email": contact.get("email_id"),
429 "contact_mobile": contact.get("mobile_no"),
430 "contact_phone": contact.get("phone"),
431 "contact_designation": contact.get("designation"),
432 "contact_department": contact.get("department")
433 })
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530434
Anand Doshi99100a42013-07-04 17:13:53 +0530435 return out
436
437def get_address_territory(address_doc):
438 territory = None
439 for fieldname in ("city", "state", "country"):
440 value = address_doc.fields.get(fieldname)
441 if value:
442 territory = webnotes.conn.get_value("Territory", value.strip())
443 if territory:
444 break
445
446 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530447
448def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
449 """common validation for currency and price list currency"""
450 if conversion_rate == 0:
451 msgprint(conversion_rate_label + _(' cannot be 0'), raise_exception=True)
452
453 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
454
455 # parenthesis for 'OR' are necessary as we want it to evaluate as
456 # mandatory valid condition and (1st optional valid condition
457 # or 2nd optional valid condition)
458 valid_conversion_rate = (conversion_rate and
459 ((currency == company_currency and conversion_rate == 1.00)
460 or (currency != company_currency and conversion_rate != 1.00)))
461
462 if not valid_conversion_rate:
463 msgprint(_('Please enter valid ') + conversion_rate_label + (': ')
464 + ("1 %s = [?] %s" % (currency, company_currency)),
465 raise_exception=True)
466
467def validate_item_fetch(args, item):
468 from stock.utils import validate_end_of_life
469 validate_end_of_life(item.name, item.end_of_life)
470
471 # validate company
472 if not args.company:
473 msgprint(_("Please specify Company"), raise_exception=True)
474
Anand Doshif3096132013-05-21 19:35:06 +0530475def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530476 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530477 if not meta:
478 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530479
Anand Doshif3096132013-05-21 19:35:06 +0530480 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530481 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530482 validate_conversion_rate(args.currency, args.conversion_rate,
483 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530484
485 # round it
486 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530487 get_field_precision(meta.get_field("conversion_rate"),
488 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530489
Anand Doshif3096132013-05-21 19:35:06 +0530490 # validate price list conversion rate
491 if meta.get_field("price_list_currency") and args.price_list_name and \
492 args.price_list_currency:
493 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530494 meta.get_label("plc_conversion_rate"), args.company)
495
496 # round it
497 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530498 get_field_precision(meta.get_field("plc_conversion_rate"),
499 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530500
Anand Doshi11d31132013-06-17 12:51:36 +0530501def delete_events(ref_type, ref_name):
502 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530503 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
Rushabh Mehta4dca4012013-07-25 17:45:59 +0530504
505def validate_uom_is_integer(doclist, uom_field, qty_fields):
506 if isinstance(qty_fields, basestring):
507 qty_fields = [qty_fields]
508
509 integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom,
510 "must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
511
512 if not integer_uoms:
513 return
514
515 for d in doclist:
516 if d.fields.get(uom_field) in integer_uoms:
517 for f in qty_fields:
518 if d.fields.get(f):
519 if cint(d.fields[f])!=d.fields[f]:
520 webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
521 + "': " + _("Quantity cannot be a fraction.") \
522 + " " + _("In Row") + ": " + str(d.idx),
523 raise_exception=True)