blob: 2900bf6ec3b2db61478b83a89f8b83e71c9f24da [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, _
Anand Doshiee3d5cc2013-03-13 12:58:54 +053020from webnotes.utils import load_json, cstr, flt, now_datetime
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
97 self.doc.fields.update(customer_defaults)
98
99 if self.meta.get_field("sales_team"):
100 self.set_sales_team_for_customer()
101
102 def set_sales_team_for_customer(self):
103 from webnotes.model import default_fields
104
105 # clear table
106 self.doclist = self.doc.clear_table(self.doclist, "sales_team")
107
108 sales_team = webnotes.conn.sql("""select * from `tabSales Team`
109 where parenttype="Customer" and parent=%s""", self.doc.customer, as_dict=True)
110 for i, sales_person in enumerate(sales_team):
111 # remove default fields
112 for fieldname in default_fields:
113 if fieldname in sales_person:
114 del sales_person[fieldname]
115
116 sales_person.update({
117 "doctype": "Sales Team",
118 "parentfield": "sales_team",
119 "idx": i+1
120 })
121
122 # add child
123 self.doclist.append(sales_person)
Anand Doshiedc5f2e2013-04-26 17:21:49 +0530124
Anand Doshi99100a42013-07-04 17:13:53 +0530125 def get_lead_defaults(self):
126 out = self.get_default_address_and_contact("lead")
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530127
Anand Doshi99100a42013-07-04 17:13:53 +0530128 lead = webnotes.conn.get_value("Lead", self.doc.lead,
129 ["territory", "company_name", "lead_name"], as_dict=True) or {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530130
Anand Doshi99100a42013-07-04 17:13:53 +0530131 out["territory"] = lead.get("territory")
132 out["customer_name"] = lead.get("company_name") or lead.get("lead_name")
133
134 return out
135
136 def set_lead_defaults(self):
137 self.doc.fields.update(self.get_lead_defaults())
Anand Doshi99100a42013-07-04 17:13:53 +0530138
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530139 def get_customer_address(self, args):
140 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530141 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530142 'customer_address' : args["address"],
143 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530144 }
Nabin Haita279d782013-07-15 13:04:33 +0530145 if args.get('contact'):
146 ret.update(map_party_contact_details(args['contact']))
Anand Doshiae30e012012-10-26 15:01:22 +0530147
Anand Doshi2ac0a832013-07-10 20:49:44 +0530148 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530149
150 def set_customer_address(self, args):
151 self.doc.fields.update(self.get_customer_address(args))
152
Anand Doshi99100a42013-07-04 17:13:53 +0530153 # TODO deprecate this - used only in sales_order.js
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530154 def get_shipping_address(self, name):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530155 shipping_address = get_default_address("customer", name, is_shipping_address=True)
156 return {
157 'shipping_address_name' : shipping_address,
158 'shipping_address' : get_address_display(shipping_address) if shipping_address else None
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530159 }
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530160
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530161 # Get Supplier Default Primary Address - first load
162 # -----------------------
163 def get_default_supplier_address(self, args):
Anand Doshi923d41d2013-05-28 17:23:36 +0530164 if isinstance(args, basestring):
165 args = load_json(args)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530166
167 address_name = get_default_address("supplier", args["supplier"])
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530168 ret = {
169 'supplier_address' : address_name,
Anand Doshi2ac0a832013-07-10 20:49:44 +0530170 'address_display' : get_address_display(address_name),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530171 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530172 ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530173 ret.update(self.get_supplier_details(args['supplier']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530174 return ret
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530175
176 # Get Supplier Address
177 # -----------------------
178 def get_supplier_address(self, args):
179 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530180 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530181 'supplier_address' : args['address'],
182 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530183 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530184 ret.update(map_party_contact_details(contact_name=args['contact']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530185 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530186
187 def set_supplier_address(self, args):
188 self.doc.fields.update(self.get_supplier_address(args))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530189
190 # Get Supplier Details
191 # -----------------------
Anand Doshif2f5c942012-07-18 20:13:52 +0530192 def get_supplier_details(self, name):
193 supplier_details = webnotes.conn.sql("""\
194 select supplier_name, default_currency
195 from `tabSupplier`
196 where name = %s and docstatus < 2""", name, as_dict=1)
197 if supplier_details:
198 return {
199 'supplier_name': (supplier_details[0]['supplier_name']
200 or self.doc.fields.get('supplier_name')),
201 'currency': (supplier_details[0]['default_currency']
202 or self.doc.fields.get('currency')),
203 }
204 else:
205 return {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530206
207 # Get Sales Person Details of Customer
208 # ------------------------------------
209 def get_sales_person(self, name):
Anand Doshi8ae5ba92012-06-25 20:05:35 +0530210 self.doclist = self.doc.clear_table(self.doclist,'sales_team')
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530211 idx = 0
Anand Doshi74d1b652012-01-27 12:25:09 +0530212 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 +0530213 ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530214 ch.sales_person = d and cstr(d[0]) or ''
215 ch.allocated_percentage = d and flt(d[1]) or 0
216 ch.allocated_amount = d and flt(d[2]) or 0
217 ch.incentives = d and flt(d[3]) or 0
218 ch.idx = idx
219 idx += 1
Nabin Hait41cc3272012-04-30 14:36:18 +0530220
Rushabh Mehta35c017a2012-11-30 10:57:28 +0530221 def load_notification_message(self):
222 dt = self.doc.doctype.lower().replace(" ", "_")
223 if int(webnotes.conn.get_value("Notification Control", None, dt) or 0):
224 self.doc.fields["__notification_message"] = \
225 webnotes.conn.get_value("Notification Control", None, dt + "_message")
226
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530227 def add_communication_list(self):
228 # remove communications if present
229 self.doclist = webnotes.doclist(self.doclist).get({
230 "doctype": ["!=", "Communcation"]})
231
232 comm_list = webnotes.conn.sql("""select * from tabCommunication
233 where %s=%s order by modified desc limit 20""" \
234 % (self.doc.doctype.replace(" ", "_").lower(), "%s"),
Anand Doshi060d9242013-06-12 17:40:36 +0530235 self.doc.name, as_dict=1, update={"doctype":"Communication"})
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530236
237 self.doclist.extend(webnotes.doclist([webnotes.doc(fielddata=d) \
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530238 for d in comm_list]))
239
240 def validate_posting_time(self):
241 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530242 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530243
Anand Doshi670199b2013-06-10 15:38:01 +0530244 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530245 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530246 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530247
248 self.delete_events()
249 self._add_calendar_event(opts)
250
251 def delete_events(self):
252 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
253 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)))
254
255 def _add_calendar_event(self, opts):
256 opts = webnotes._dict(opts)
257
258 if self.doc.contact_date:
259 event_doclist = [{
260 "doctype": "Event",
261 "owner": opts.owner or self.doc.owner,
262 "subject": opts.subject,
263 "description": opts.description,
264 "starts_on": self.doc.contact_date + " 10:00:00",
265 "event_type": "Private",
266 "ref_type": self.doc.doctype,
267 "ref_name": self.doc.name
268 }]
269
270 if webnotes.conn.exists("Profile", self.doc.contact_by):
271 event_doclist.append({
272 "doctype": "Event User",
273 "parentfield": "event_individuals",
274 "person": self.doc.contact_by
275 })
276
277 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530278
279 def validate_with_previous_doc(self, source_dt, ref):
280 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530281 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530282 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530283 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530284 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530285 ref_dn = d.fields.get(val["ref_dn_field"])
286 if ref_dn:
287 if is_child:
288 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530289 if ref_dn not in item_ref_dn:
290 item_ref_dn.append(ref_dn)
291 else:
292 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
293 _(": Duplicate row from same ") + key, raise_exception=1)
294 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530295 ref_doc.setdefault(key, [])
296 if ref_dn not in ref_doc[key]:
297 ref_doc[key].append(ref_dn)
298 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530299 self.compare_values(ref_doc, val["compare_fields"])
300
301 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530302 for ref_doctype, ref_dn_list in ref_doc.items():
303 for ref_docname in ref_dn_list:
304 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
305 [d[0] for d in fields], as_dict=1)
306
307 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530308 if prevdoc_values[field] is not None:
309 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530310
311def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
312 out = {}
313
314 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530315 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530316 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530317 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530318 out["address_display"] = get_address_display(billing_address)
319 else:
320 out[party_field + "_address"] = out["address_display"] = None
321
322 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530323 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530324 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530325 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530326 out["shipping_address"] = get_address_display(shipping_address)
327 else:
328 out["shipping_address_name"] = out["shipping_address"] = None
329
330 # get contact
331 if party_field == "lead":
332 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530333 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530334 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530335 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530336
337 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530338
Anand Doshi2ac0a832013-07-10 20:49:44 +0530339def get_default_address(party_field, party_name, is_shipping_address=False):
340 if is_shipping_address:
341 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
342 else:
343 order_by = "is_primary_address desc, name asc"
344
345 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
346 limit 1""" % (party_field, "%s", order_by), party_name)
347
348 return address[0][0] if address else None
349
350def get_default_contact(party_field, party_name):
351 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
352 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
353 (party_name,))
354
355 return contact[0][0] if contact else None
356
Anand Doshiedbf3e12013-07-02 11:40:16 +0530357def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530358 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530359 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530360
Anand Doshiedbf3e12013-07-02 11:40:16 +0530361 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530362 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530363 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
364 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
365
Anand Doshi2ac0a832013-07-10 20:49:44 +0530366 display = ""
367 for separator, fieldname in sequence:
368 if address_dict.get(fieldname):
369 display += separator + address_dict.get(fieldname)
370
371 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530372
Anand Doshi2ac0a832013-07-10 20:49:44 +0530373def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530374 out = {}
375 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
376 out[fieldname] = None
377
378 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
379 if lead:
380 lead = lead[0]
381 out.update({
382 "contact_display": lead.get("lead_name"),
383 "contact_email": lead.get("email_id"),
384 "contact_mobile": lead.get("mobile_no"),
385 "contact_phone": lead.get("phone"),
386 })
387
388 return out
389
Anand Doshi2ac0a832013-07-10 20:49:44 +0530390def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530391 out = {}
392 for fieldname in ["contact_person", "contact_display", "contact_email",
393 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
394 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530395
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530396 if not contact_name and party_field:
397 contact_name = get_default_contact(party_field, party_name)
398
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530399 if contact_name:
400 contact = webnotes.conn.sql("""select * from `tabContact` where name=%s""",
401 contact_name, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530402
Nabin Hait02a3d7a2013-07-24 16:33:30 +0530403 if contact:
404 contact = contact[0]
405 out.update({
406 "contact_person": contact.get("name"),
407 "contact_display": " ".join(filter(None,
408 [contact.get("first_name"), contact.get("last_name")])),
409 "contact_email": contact.get("email_id"),
410 "contact_mobile": contact.get("mobile_no"),
411 "contact_phone": contact.get("phone"),
412 "contact_designation": contact.get("designation"),
413 "contact_department": contact.get("department")
414 })
Anand Doshiba8ea7d2013-07-24 12:08:42 +0530415
Anand Doshi99100a42013-07-04 17:13:53 +0530416 return out
417
418def get_address_territory(address_doc):
419 territory = None
420 for fieldname in ("city", "state", "country"):
421 value = address_doc.fields.get(fieldname)
422 if value:
423 territory = webnotes.conn.get_value("Territory", value.strip())
424 if territory:
425 break
426
427 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530428
429def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
430 """common validation for currency and price list currency"""
431 if conversion_rate == 0:
432 msgprint(conversion_rate_label + _(' cannot be 0'), raise_exception=True)
433
434 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
435
436 # parenthesis for 'OR' are necessary as we want it to evaluate as
437 # mandatory valid condition and (1st optional valid condition
438 # or 2nd optional valid condition)
439 valid_conversion_rate = (conversion_rate and
440 ((currency == company_currency and conversion_rate == 1.00)
441 or (currency != company_currency and conversion_rate != 1.00)))
442
443 if not valid_conversion_rate:
444 msgprint(_('Please enter valid ') + conversion_rate_label + (': ')
445 + ("1 %s = [?] %s" % (currency, company_currency)),
446 raise_exception=True)
447
448def validate_item_fetch(args, item):
449 from stock.utils import validate_end_of_life
450 validate_end_of_life(item.name, item.end_of_life)
451
452 # validate company
453 if not args.company:
454 msgprint(_("Please specify Company"), raise_exception=True)
455
Anand Doshif3096132013-05-21 19:35:06 +0530456def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530457 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530458 if not meta:
459 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530460
Anand Doshif3096132013-05-21 19:35:06 +0530461 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530462 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530463 validate_conversion_rate(args.currency, args.conversion_rate,
464 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530465
466 # round it
467 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530468 get_field_precision(meta.get_field("conversion_rate"),
469 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530470
Anand Doshif3096132013-05-21 19:35:06 +0530471 # validate price list conversion rate
472 if meta.get_field("price_list_currency") and args.price_list_name and \
473 args.price_list_currency:
474 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530475 meta.get_label("plc_conversion_rate"), args.company)
476
477 # round it
478 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530479 get_field_precision(meta.get_field("plc_conversion_rate"),
480 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530481
Anand Doshi11d31132013-06-17 12:51:36 +0530482def delete_events(ref_type, ref_name):
483 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530484 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)