Rushabh Mehta | fe027b3 | 2016-03-28 13:21:43 +0530 | [diff] [blame] | 1 | # Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and Contributors |
| 2 | # See license.txt |
| 3 | |
Rushabh Mehta | fe027b3 | 2016-03-28 13:21:43 +0530 | [diff] [blame] | 4 | |
Rushabh Mehta | fe027b3 | 2016-03-28 13:21:43 +0530 | [diff] [blame] | 5 | import frappe |
| 6 | from frappe import _ |
Chillar Anand | 915b343 | 2021-09-02 16:44:59 +0530 | [diff] [blame] | 7 | from frappe.utils.bot import BotParser |
| 8 | |
Rushabh Mehta | fe027b3 | 2016-03-28 13:21:43 +0530 | [diff] [blame] | 9 | |
| 10 | class FindItemBot(BotParser): |
| 11 | def get_reply(self): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 12 | if self.startswith("where is", "find item", "locate"): |
| 13 | if not frappe.has_permission("Warehouse"): |
Rushabh Mehta | 3117b4b | 2016-03-29 11:53:07 +0530 | [diff] [blame] | 14 | raise frappe.PermissionError |
| 15 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 16 | item = "%{0}%".format(self.strip_words(self.query, "where is", "find item", "locate")) |
| 17 | items = frappe.db.sql( |
| 18 | """select name from `tabItem` where item_code like %(txt)s |
| 19 | or item_name like %(txt)s or description like %(txt)s""", |
| 20 | dict(txt=item), |
| 21 | ) |
Rushabh Mehta | fe027b3 | 2016-03-28 13:21:43 +0530 | [diff] [blame] | 22 | |
| 23 | if items: |
| 24 | out = [] |
| 25 | warehouses = frappe.get_all("Warehouse") |
| 26 | for item in items: |
| 27 | found = False |
| 28 | for warehouse in warehouses: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 29 | qty = frappe.db.get_value( |
| 30 | "Bin", {"item_code": item[0], "warehouse": warehouse.name}, "actual_qty" |
| 31 | ) |
Rushabh Mehta | fe027b3 | 2016-03-28 13:21:43 +0530 | [diff] [blame] | 32 | if qty: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 33 | out.append( |
| 34 | _("{0} units of [{1}](/app/Form/Item/{1}) found in [{2}](/app/Form/Warehouse/{2})").format( |
| 35 | qty, item[0], warehouse.name |
| 36 | ) |
| 37 | ) |
Rushabh Mehta | fe027b3 | 2016-03-28 13:21:43 +0530 | [diff] [blame] | 38 | found = True |
| 39 | |
| 40 | if not found: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 41 | out.append(_("[{0}](/app/Form/Item/{0}) is out of stock").format(item[0])) |
Rushabh Mehta | fe027b3 | 2016-03-28 13:21:43 +0530 | [diff] [blame] | 42 | |
| 43 | return "\n\n".join(out) |
| 44 | |
| 45 | else: |
Ankush Menat | 4551d7d | 2021-08-19 13:41:10 +0530 | [diff] [blame] | 46 | return _("Did not find any item called {0}").format(item) |