fix: email list for auto reorder material request
(cherry picked from commit 764f3422a0826e22d116616daa3849d02cc1e117)
This commit is contained in:
parent
f6a779e1aa
commit
98c56535d8
@ -762,6 +762,62 @@ class TestMaterialRequest(FrappeTestCase):
|
|||||||
self.assertEqual(mr.per_ordered, 100)
|
self.assertEqual(mr.per_ordered, 100)
|
||||||
self.assertEqual(existing_requested_qty, current_requested_qty)
|
self.assertEqual(existing_requested_qty, current_requested_qty)
|
||||||
|
|
||||||
|
def test_auto_email_users_with_company_user_permissions(self):
|
||||||
|
from erpnext.stock.reorder_item import get_email_list
|
||||||
|
|
||||||
|
comapnywise_users = {
|
||||||
|
"_Test Company": "test_auto_email_@example.com",
|
||||||
|
"_Test Company 1": "test_auto_email_1@example.com",
|
||||||
|
}
|
||||||
|
|
||||||
|
permissions = []
|
||||||
|
|
||||||
|
for company, user in comapnywise_users.items():
|
||||||
|
if not frappe.db.exists("User", user):
|
||||||
|
frappe.get_doc(
|
||||||
|
{
|
||||||
|
"doctype": "User",
|
||||||
|
"email": user,
|
||||||
|
"first_name": user,
|
||||||
|
"send_notifications": 0,
|
||||||
|
"enabled": 1,
|
||||||
|
"user_type": "System User",
|
||||||
|
"roles": [{"role": "Purchase Manager"}],
|
||||||
|
}
|
||||||
|
).insert(ignore_permissions=True)
|
||||||
|
|
||||||
|
if not frappe.db.exists(
|
||||||
|
"User Permission", {"user": user, "allow": "Company", "for_value": company}
|
||||||
|
):
|
||||||
|
perm_doc = frappe.get_doc(
|
||||||
|
{
|
||||||
|
"doctype": "User Permission",
|
||||||
|
"user": user,
|
||||||
|
"allow": "Company",
|
||||||
|
"for_value": company,
|
||||||
|
"apply_to_all_doctypes": 1,
|
||||||
|
}
|
||||||
|
).insert(ignore_permissions=True)
|
||||||
|
|
||||||
|
permissions.append(perm_doc)
|
||||||
|
|
||||||
|
comapnywise_mr_list = frappe._dict({})
|
||||||
|
mr1 = make_material_request()
|
||||||
|
comapnywise_mr_list.setdefault(mr1.company, []).append(mr1.name)
|
||||||
|
|
||||||
|
mr2 = make_material_request(
|
||||||
|
company="_Test Company 1", warehouse="Stores - _TC1", cost_center="Main - _TC1"
|
||||||
|
)
|
||||||
|
comapnywise_mr_list.setdefault(mr2.company, []).append(mr2.name)
|
||||||
|
|
||||||
|
for company, mr_list in comapnywise_mr_list.items():
|
||||||
|
emails = get_email_list(company)
|
||||||
|
|
||||||
|
self.assertTrue(comapnywise_users[company] in emails)
|
||||||
|
|
||||||
|
for perm in permissions:
|
||||||
|
perm.delete()
|
||||||
|
|
||||||
|
|
||||||
def get_in_transit_warehouse(company):
|
def get_in_transit_warehouse(company):
|
||||||
if not frappe.db.exists("Warehouse Type", "Transit"):
|
if not frappe.db.exists("Warehouse Type", "Transit"):
|
||||||
|
@ -145,6 +145,7 @@ def create_material_request(material_requests):
|
|||||||
|
|
||||||
mr.log_error("Unable to create material request")
|
mr.log_error("Unable to create material request")
|
||||||
|
|
||||||
|
company_wise_mr = frappe._dict({})
|
||||||
for request_type in material_requests:
|
for request_type in material_requests:
|
||||||
for company in material_requests[request_type]:
|
for company in material_requests[request_type]:
|
||||||
try:
|
try:
|
||||||
@ -206,17 +207,19 @@ def create_material_request(material_requests):
|
|||||||
mr.submit()
|
mr.submit()
|
||||||
mr_list.append(mr)
|
mr_list.append(mr)
|
||||||
|
|
||||||
|
company_wise_mr.setdefault(company, []).append(mr)
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
_log_exception(mr)
|
_log_exception(mr)
|
||||||
|
|
||||||
if mr_list:
|
if company_wise_mr:
|
||||||
if getattr(frappe.local, "reorder_email_notify", None) is None:
|
if getattr(frappe.local, "reorder_email_notify", None) is None:
|
||||||
frappe.local.reorder_email_notify = cint(
|
frappe.local.reorder_email_notify = cint(
|
||||||
frappe.db.get_value("Stock Settings", None, "reorder_email_notify")
|
frappe.db.get_value("Stock Settings", None, "reorder_email_notify")
|
||||||
)
|
)
|
||||||
|
|
||||||
if frappe.local.reorder_email_notify:
|
if frappe.local.reorder_email_notify:
|
||||||
send_email_notification(mr_list)
|
send_email_notification(company_wise_mr)
|
||||||
|
|
||||||
if exceptions_list:
|
if exceptions_list:
|
||||||
notify_errors(exceptions_list)
|
notify_errors(exceptions_list)
|
||||||
@ -224,20 +227,56 @@ def create_material_request(material_requests):
|
|||||||
return mr_list
|
return mr_list
|
||||||
|
|
||||||
|
|
||||||
def send_email_notification(mr_list):
|
def send_email_notification(company_wise_mr):
|
||||||
"""Notify user about auto creation of indent"""
|
"""Notify user about auto creation of indent"""
|
||||||
|
|
||||||
email_list = frappe.db.sql_list(
|
for company, mr_list in company_wise_mr.items():
|
||||||
"""select distinct r.parent
|
email_list = get_email_list(company)
|
||||||
from `tabHas Role` r, tabUser p
|
|
||||||
where p.name = r.parent and p.enabled = 1 and p.docstatus < 2
|
if not email_list:
|
||||||
and r.role in ('Purchase Manager','Stock Manager')
|
continue
|
||||||
and p.name not in ('Administrator', 'All', 'Guest')"""
|
|
||||||
|
msg = frappe.render_template("templates/emails/reorder_item.html", {"mr_list": mr_list})
|
||||||
|
|
||||||
|
frappe.sendmail(
|
||||||
|
recipients=email_list, subject=_("Auto Material Requests Generated"), message=msg
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_email_list(company):
|
||||||
|
users = get_comapny_wise_users(company)
|
||||||
|
user_table = frappe.qb.DocType("User")
|
||||||
|
role_table = frappe.qb.DocType("Has Role")
|
||||||
|
|
||||||
|
query = (
|
||||||
|
frappe.qb.from_(user_table)
|
||||||
|
.inner_join(role_table)
|
||||||
|
.on(user_table.name == role_table.parent)
|
||||||
|
.select(user_table.email)
|
||||||
|
.where(
|
||||||
|
(role_table.role.isin(["Purchase Manager", "Stock Manager"]))
|
||||||
|
& (user_table.name.notin(["Administrator", "All", "Guest"]))
|
||||||
|
& (user_table.enabled == 1)
|
||||||
|
& (user_table.docstatus < 2)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
msg = frappe.render_template("templates/emails/reorder_item.html", {"mr_list": mr_list})
|
if users:
|
||||||
|
query = query.where(user_table.name.isin(users))
|
||||||
|
|
||||||
frappe.sendmail(recipients=email_list, subject=_("Auto Material Requests Generated"), message=msg)
|
emails = query.run(as_dict=True)
|
||||||
|
|
||||||
|
return list(set([email.email for email in emails]))
|
||||||
|
|
||||||
|
|
||||||
|
def get_comapny_wise_users(company):
|
||||||
|
users = frappe.get_all(
|
||||||
|
"User Permission",
|
||||||
|
filters={"allow": "Company", "for_value": company, "apply_to_all_doctypes": 1},
|
||||||
|
fields=["user"],
|
||||||
|
)
|
||||||
|
|
||||||
|
return [user.user for user in users]
|
||||||
|
|
||||||
|
|
||||||
def notify_errors(exceptions_list):
|
def notify_errors(exceptions_list):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user