| # Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and Contributors |
| # See license.txt |
| |
| |
| import frappe |
| from frappe import _ |
| from frappe.utils.bot import BotParser |
| |
| |
| class FindItemBot(BotParser): |
| def get_reply(self): |
| if self.startswith("where is", "find item", "locate"): |
| if not frappe.has_permission("Warehouse"): |
| raise frappe.PermissionError |
| |
| item = "%{0}%".format(self.strip_words(self.query, "where is", "find item", "locate")) |
| items = frappe.db.sql( |
| """select name from `tabItem` where item_code like %(txt)s |
| or item_name like %(txt)s or description like %(txt)s""", |
| dict(txt=item), |
| ) |
| |
| if items: |
| out = [] |
| warehouses = frappe.get_all("Warehouse") |
| for item in items: |
| found = False |
| for warehouse in warehouses: |
| qty = frappe.db.get_value( |
| "Bin", {"item_code": item[0], "warehouse": warehouse.name}, "actual_qty" |
| ) |
| if qty: |
| out.append( |
| _("{0} units of [{1}](/app/Form/Item/{1}) found in [{2}](/app/Form/Warehouse/{2})").format( |
| qty, item[0], warehouse.name |
| ) |
| ) |
| found = True |
| |
| if not found: |
| out.append(_("[{0}](/app/Form/Item/{0}) is out of stock").format(item[0])) |
| |
| return "\n\n".join(out) |
| |
| else: |
| return _("Did not find any item called {0}").format(item) |