blob: de229b9162ca3b1b0008688567d26711f512458d [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())
138
139
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530140 # Get Customer Address
141 # -----------------------
142 def get_customer_address(self, args):
143 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530144 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530145 'customer_address' : args["address"],
146 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530147 }
Nabin Haita279d782013-07-15 13:04:33 +0530148 if args.get('contact'):
149 ret.update(map_party_contact_details(args['contact']))
Anand Doshiae30e012012-10-26 15:01:22 +0530150
Anand Doshi2ac0a832013-07-10 20:49:44 +0530151 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530152
153 def set_customer_address(self, args):
154 self.doc.fields.update(self.get_customer_address(args))
155
Anand Doshi99100a42013-07-04 17:13:53 +0530156 # TODO deprecate this - used only in sales_order.js
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530157 def get_shipping_address(self, name):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530158 shipping_address = get_default_address("customer", name, is_shipping_address=True)
159 return {
160 'shipping_address_name' : shipping_address,
161 'shipping_address' : get_address_display(shipping_address) if shipping_address else None
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530162 }
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530163
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530164 # Get Supplier Default Primary Address - first load
165 # -----------------------
166 def get_default_supplier_address(self, args):
Anand Doshi923d41d2013-05-28 17:23:36 +0530167 if isinstance(args, basestring):
168 args = load_json(args)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530169
170 address_name = get_default_address("supplier", args["supplier"])
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530171 ret = {
172 'supplier_address' : address_name,
Anand Doshi2ac0a832013-07-10 20:49:44 +0530173 'address_display' : get_address_display(address_name),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530174 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530175 ret.update(map_party_contact_details(None, "supplier", args["supplier"]))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530176 ret.update(self.get_supplier_details(args['supplier']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530177 return ret
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530178
179 # Get Supplier Address
180 # -----------------------
181 def get_supplier_address(self, args):
182 args = load_json(args)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530183 ret = {
Anand Doshi2ac0a832013-07-10 20:49:44 +0530184 'supplier_address' : args['address'],
185 'address_display' : get_address_display(args["address"]),
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530186 }
Anand Doshi2ac0a832013-07-10 20:49:44 +0530187 ret.update(map_party_contact_details(contact_name=args['contact']))
Nabin Hait06c4de82011-08-16 16:38:11 +0530188 return ret
Nabin Haitdeff5782013-07-24 11:30:35 +0530189
190 def set_supplier_address(self, args):
191 self.doc.fields.update(self.get_supplier_address(args))
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530192
193 # Get Supplier Details
194 # -----------------------
Anand Doshif2f5c942012-07-18 20:13:52 +0530195 def get_supplier_details(self, name):
196 supplier_details = webnotes.conn.sql("""\
197 select supplier_name, default_currency
198 from `tabSupplier`
199 where name = %s and docstatus < 2""", name, as_dict=1)
200 if supplier_details:
201 return {
202 'supplier_name': (supplier_details[0]['supplier_name']
203 or self.doc.fields.get('supplier_name')),
204 'currency': (supplier_details[0]['default_currency']
205 or self.doc.fields.get('currency')),
206 }
207 else:
208 return {}
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530209
210 # Get Sales Person Details of Customer
211 # ------------------------------------
212 def get_sales_person(self, name):
Anand Doshi8ae5ba92012-06-25 20:05:35 +0530213 self.doclist = self.doc.clear_table(self.doclist,'sales_team')
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530214 idx = 0
Anand Doshi74d1b652012-01-27 12:25:09 +0530215 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 +0530216 ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +0530217 ch.sales_person = d and cstr(d[0]) or ''
218 ch.allocated_percentage = d and flt(d[1]) or 0
219 ch.allocated_amount = d and flt(d[2]) or 0
220 ch.incentives = d and flt(d[3]) or 0
221 ch.idx = idx
222 idx += 1
Nabin Hait41cc3272012-04-30 14:36:18 +0530223
Rushabh Mehta35c017a2012-11-30 10:57:28 +0530224 def load_notification_message(self):
225 dt = self.doc.doctype.lower().replace(" ", "_")
226 if int(webnotes.conn.get_value("Notification Control", None, dt) or 0):
227 self.doc.fields["__notification_message"] = \
228 webnotes.conn.get_value("Notification Control", None, dt + "_message")
229
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530230 def add_communication_list(self):
231 # remove communications if present
232 self.doclist = webnotes.doclist(self.doclist).get({
233 "doctype": ["!=", "Communcation"]})
234
235 comm_list = webnotes.conn.sql("""select * from tabCommunication
236 where %s=%s order by modified desc limit 20""" \
237 % (self.doc.doctype.replace(" ", "_").lower(), "%s"),
Anand Doshi060d9242013-06-12 17:40:36 +0530238 self.doc.name, as_dict=1, update={"doctype":"Communication"})
Rushabh Mehtac4e7b682012-11-26 18:18:10 +0530239
240 self.doclist.extend(webnotes.doclist([webnotes.doc(fielddata=d) \
Anand Doshiee3d5cc2013-03-13 12:58:54 +0530241 for d in comm_list]))
242
243 def validate_posting_time(self):
244 if not self.doc.posting_time:
Anand Doshiacec0222013-03-26 12:33:43 +0530245 self.doc.posting_time = now_datetime().strftime('%H:%M:%S')
Anand Doshie53a81d2013-06-10 15:15:40 +0530246
Anand Doshi670199b2013-06-10 15:38:01 +0530247 def add_calendar_event(self, opts, force=False):
Anand Doshie53a81d2013-06-10 15:15:40 +0530248 if self.doc.contact_by != cstr(self._prev.contact_by) or \
Anand Doshi670199b2013-06-10 15:38:01 +0530249 self.doc.contact_date != cstr(self._prev.contact_date) or force:
Anand Doshie53a81d2013-06-10 15:15:40 +0530250
251 self.delete_events()
252 self._add_calendar_event(opts)
253
254 def delete_events(self):
255 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
256 where ref_type=%s and ref_name=%s""", (self.doc.doctype, self.doc.name)))
257
258 def _add_calendar_event(self, opts):
259 opts = webnotes._dict(opts)
260
261 if self.doc.contact_date:
262 event_doclist = [{
263 "doctype": "Event",
264 "owner": opts.owner or self.doc.owner,
265 "subject": opts.subject,
266 "description": opts.description,
267 "starts_on": self.doc.contact_date + " 10:00:00",
268 "event_type": "Private",
269 "ref_type": self.doc.doctype,
270 "ref_name": self.doc.name
271 }]
272
273 if webnotes.conn.exists("Profile", self.doc.contact_by):
274 event_doclist.append({
275 "doctype": "Event User",
276 "parentfield": "event_individuals",
277 "person": self.doc.contact_by
278 })
279
280 webnotes.bean(event_doclist).insert()
Nabin Hait2bd37772013-07-08 19:00:29 +0530281
282 def validate_with_previous_doc(self, source_dt, ref):
283 for key, val in ref.items():
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530284 is_child = val.get("is_child_table")
Nabin Hait2bd37772013-07-08 19:00:29 +0530285 ref_doc = {}
Nabin Haita9ec49e2013-07-15 16:33:24 +0530286 item_ref_dn = []
Nabin Hait2bd37772013-07-08 19:00:29 +0530287 for d in self.doclist.get({"doctype": source_dt}):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530288 ref_dn = d.fields.get(val["ref_dn_field"])
289 if ref_dn:
290 if is_child:
291 self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
Nabin Haita9ec49e2013-07-15 16:33:24 +0530292 if ref_dn not in item_ref_dn:
293 item_ref_dn.append(ref_dn)
294 else:
295 webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
296 _(": Duplicate row from same ") + key, raise_exception=1)
297 elif ref_dn:
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530298 ref_doc.setdefault(key, [])
299 if ref_dn not in ref_doc[key]:
300 ref_doc[key].append(ref_dn)
301 if ref_doc:
Nabin Hait2bd37772013-07-08 19:00:29 +0530302 self.compare_values(ref_doc, val["compare_fields"])
303
304 def compare_values(self, ref_doc, fields, doc=None):
Nabin Hait6e68e0e2013-07-10 15:33:29 +0530305 for ref_doctype, ref_dn_list in ref_doc.items():
306 for ref_docname in ref_dn_list:
307 prevdoc_values = webnotes.conn.get_value(ref_doctype, ref_docname,
308 [d[0] for d in fields], as_dict=1)
309
310 for field, condition in fields:
Anand Doshi63d844b2013-07-10 20:55:15 +0530311 if prevdoc_values[field] is not None:
312 self.validate_value(field, condition, prevdoc_values[field], doc)
Anand Doshi99100a42013-07-04 17:13:53 +0530313
314def get_default_address_and_contact(party_field, party_name, fetch_shipping_address=False):
315 out = {}
316
317 # get addresses
Anand Doshi2ac0a832013-07-10 20:49:44 +0530318 billing_address = get_default_address(party_field, party_name)
Anand Doshi99100a42013-07-04 17:13:53 +0530319 if billing_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530320 out[party_field + "_address"] = billing_address
Anand Doshi99100a42013-07-04 17:13:53 +0530321 out["address_display"] = get_address_display(billing_address)
322 else:
323 out[party_field + "_address"] = out["address_display"] = None
324
325 if fetch_shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530326 shipping_address = get_default_address(party_field, party_name, is_shipping_address=True)
Anand Doshi99100a42013-07-04 17:13:53 +0530327 if shipping_address:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530328 out["shipping_address_name"] = shipping_address
Anand Doshi99100a42013-07-04 17:13:53 +0530329 out["shipping_address"] = get_address_display(shipping_address)
330 else:
331 out["shipping_address_name"] = out["shipping_address"] = None
332
333 # get contact
334 if party_field == "lead":
335 out["customer_address"] = out.get("lead_address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530336 out.update(map_lead_contact_details(party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530337 else:
Anand Doshi2ac0a832013-07-10 20:49:44 +0530338 out.update(map_party_contact_details(None, party_field, party_name))
Anand Doshi99100a42013-07-04 17:13:53 +0530339
340 return out
Anand Doshi99100a42013-07-04 17:13:53 +0530341
Anand Doshi2ac0a832013-07-10 20:49:44 +0530342def get_default_address(party_field, party_name, is_shipping_address=False):
343 if is_shipping_address:
344 order_by = "is_shipping_address desc, is_primary_address desc, name asc"
345 else:
346 order_by = "is_primary_address desc, name asc"
347
348 address = webnotes.conn.sql("""select name from `tabAddress` where `%s`=%s order by %s
349 limit 1""" % (party_field, "%s", order_by), party_name)
350
351 return address[0][0] if address else None
352
353def get_default_contact(party_field, party_name):
354 contact = webnotes.conn.sql("""select name from `tabContact` where `%s`=%s
355 order by is_primary_contact desc, name asc limit 1""" % (party_field, "%s"),
356 (party_name,))
357
358 return contact[0][0] if contact else None
359
Anand Doshiedbf3e12013-07-02 11:40:16 +0530360def get_address_display(address_dict):
Anand Doshi2ac0a832013-07-10 20:49:44 +0530361 if not isinstance(address_dict, dict):
Nabin Haita279d782013-07-15 13:04:33 +0530362 address_dict = webnotes.conn.get_value("Address", address_dict, "*", as_dict=True) or {}
Anand Doshi99100a42013-07-04 17:13:53 +0530363
Anand Doshiedbf3e12013-07-02 11:40:16 +0530364 meta = webnotes.get_doctype("Address")
Anand Doshi2ac0a832013-07-10 20:49:44 +0530365 sequence = (("", "address_line1"), ("\n", "address_line2"), ("\n", "city"),
Anand Doshiedbf3e12013-07-02 11:40:16 +0530366 ("\n", "state"), ("\n" + meta.get_label("pincode") + ": ", "pincode"), ("\n", "country"),
367 ("\n" + meta.get_label("phone") + ": ", "phone"), ("\n" + meta.get_label("fax") + ": ", "fax"))
368
Anand Doshi2ac0a832013-07-10 20:49:44 +0530369 display = ""
370 for separator, fieldname in sequence:
371 if address_dict.get(fieldname):
372 display += separator + address_dict.get(fieldname)
373
374 return display.strip()
Anand Doshi99100a42013-07-04 17:13:53 +0530375
Anand Doshi2ac0a832013-07-10 20:49:44 +0530376def map_lead_contact_details(party_name):
Anand Doshi99100a42013-07-04 17:13:53 +0530377 out = {}
378 for fieldname in ["contact_display", "contact_email", "contact_mobile", "contact_phone"]:
379 out[fieldname] = None
380
381 lead = webnotes.conn.sql("""select * from `tabLead` where name=%s""", party_name, as_dict=True)
382 if lead:
383 lead = lead[0]
384 out.update({
385 "contact_display": lead.get("lead_name"),
386 "contact_email": lead.get("email_id"),
387 "contact_mobile": lead.get("mobile_no"),
388 "contact_phone": lead.get("phone"),
389 })
390
391 return out
392
Anand Doshi2ac0a832013-07-10 20:49:44 +0530393def map_party_contact_details(contact_name=None, party_field=None, party_name=None):
Anand Doshi99100a42013-07-04 17:13:53 +0530394 out = {}
395 for fieldname in ["contact_person", "contact_display", "contact_email",
396 "contact_mobile", "contact_phone", "contact_designation", "contact_department"]:
397 out[fieldname] = None
Nabin Haitdeff5782013-07-24 11:30:35 +0530398
399 condition = ""
400 if contact_name:
401 condition = " name = '%s'" % contact_name
402 elif party_field and party_name:
403 condition = " `%s`='%s'" % (party_field, party_name)
404
405 contact = webnotes.conn.sql("""select * from `tabContact` where %s
406 order by is_primary_contact desc, name asc limit 1""" % condition, as_dict=True)
Anand Doshi2ac0a832013-07-10 20:49:44 +0530407
Nabin Haitdeff5782013-07-24 11:30:35 +0530408 if contact:
409 contact = contact[0]
410 out.update({
411 "contact_person": contact.get("name"),
412 "contact_display": " ".join(filter(None,
413 [contact.get("first_name"), contact.get("last_name")])),
414 "contact_email": contact.get("email_id"),
415 "contact_mobile": contact.get("mobile_no"),
416 "contact_phone": contact.get("phone"),
417 "contact_designation": contact.get("designation"),
418 "contact_department": contact.get("department")
419 })
420
Anand Doshi99100a42013-07-04 17:13:53 +0530421 return out
422
423def get_address_territory(address_doc):
424 territory = None
425 for fieldname in ("city", "state", "country"):
426 value = address_doc.fields.get(fieldname)
427 if value:
428 territory = webnotes.conn.get_value("Territory", value.strip())
429 if territory:
430 break
431
432 return territory
Anand Doshi1dde46a2013-05-15 21:15:57 +0530433
434def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, company):
435 """common validation for currency and price list currency"""
436 if conversion_rate == 0:
437 msgprint(conversion_rate_label + _(' cannot be 0'), raise_exception=True)
438
439 company_currency = webnotes.conn.get_value("Company", company, "default_currency")
440
441 # parenthesis for 'OR' are necessary as we want it to evaluate as
442 # mandatory valid condition and (1st optional valid condition
443 # or 2nd optional valid condition)
444 valid_conversion_rate = (conversion_rate and
445 ((currency == company_currency and conversion_rate == 1.00)
446 or (currency != company_currency and conversion_rate != 1.00)))
447
448 if not valid_conversion_rate:
449 msgprint(_('Please enter valid ') + conversion_rate_label + (': ')
450 + ("1 %s = [?] %s" % (currency, company_currency)),
451 raise_exception=True)
452
453def validate_item_fetch(args, item):
454 from stock.utils import validate_end_of_life
455 validate_end_of_life(item.name, item.end_of_life)
456
457 # validate company
458 if not args.company:
459 msgprint(_("Please specify Company"), raise_exception=True)
460
Anand Doshif3096132013-05-21 19:35:06 +0530461def validate_currency(args, item, meta=None):
Anand Doshifc777182013-05-27 19:29:07 +0530462 from webnotes.model.meta import get_field_precision
Anand Doshif3096132013-05-21 19:35:06 +0530463 if not meta:
464 meta = webnotes.get_doctype(args.doctype)
Anand Doshifc777182013-05-27 19:29:07 +0530465
Anand Doshif3096132013-05-21 19:35:06 +0530466 # validate conversion rate
Anand Doshi1dde46a2013-05-15 21:15:57 +0530467 if meta.get_field("currency"):
Anand Doshi1dde46a2013-05-15 21:15:57 +0530468 validate_conversion_rate(args.currency, args.conversion_rate,
469 meta.get_label("conversion_rate"), args.company)
Anand Doshifc777182013-05-27 19:29:07 +0530470
471 # round it
472 args.conversion_rate = flt(args.conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530473 get_field_precision(meta.get_field("conversion_rate"),
474 webnotes._dict({"fields": args})))
Anand Doshi1dde46a2013-05-15 21:15:57 +0530475
Anand Doshif3096132013-05-21 19:35:06 +0530476 # validate price list conversion rate
477 if meta.get_field("price_list_currency") and args.price_list_name and \
478 args.price_list_currency:
479 validate_conversion_rate(args.price_list_currency, args.plc_conversion_rate,
Anand Doshifc777182013-05-27 19:29:07 +0530480 meta.get_label("plc_conversion_rate"), args.company)
481
482 # round it
483 args.plc_conversion_rate = flt(args.plc_conversion_rate,
Anand Doshie961af42013-05-31 14:30:46 +0530484 get_field_precision(meta.get_field("plc_conversion_rate"),
485 webnotes._dict({"fields": args})))
Anand Doshi097ac352013-06-10 15:38:31 +0530486
Anand Doshi11d31132013-06-17 12:51:36 +0530487def delete_events(ref_type, ref_name):
488 webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
Anand Doshib5fd7882013-06-17 12:55:05 +0530489 where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)