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}) | 		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) | 		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) | ||||||
|  | 		) | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	if users: | ||||||
|  | 		query = query.where(user_table.name.isin(users)) | ||||||
|  | 
 | ||||||
|  | 	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