diff --git a/odex30_base/system_notification/__init__.py b/odex30_base/system_notification/__init__.py new file mode 100644 index 0000000..cde864b --- /dev/null +++ b/odex30_base/system_notification/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/odex30_base/system_notification/__manifest__.py b/odex30_base/system_notification/__manifest__.py new file mode 100644 index 0000000..55bdc6e --- /dev/null +++ b/odex30_base/system_notification/__manifest__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +{ + 'name': "System Notification", + 'version': '18.0.1.0.0', + 'summary': """""", + 'description': """ + """, + 'category': 'Odex30-base', # تم تغيير الفئة + 'depends': ['base_automation', 'mail'], + 'data': [ + 'security/ir.model.access.csv', + 'views/views.xml', + 'views/group_state_notification.xml', + 'data/mail_data.xml', + ], + 'installable': True, + 'application': False, + 'auto_install': False, +} diff --git a/odex30_base/system_notification/data/mail_data.xml b/odex30_base/system_notification/data/mail_data.xml new file mode 100644 index 0000000..b87fcef --- /dev/null +++ b/odex30_base/system_notification/data/mail_data.xml @@ -0,0 +1,71 @@ + + + + + + diff --git a/odex30_base/system_notification/i18n/ar_001.po b/odex30_base/system_notification/i18n/ar_001.po new file mode 100644 index 0000000..9d941a1 --- /dev/null +++ b/odex30_base/system_notification/i18n/ar_001.po @@ -0,0 +1,276 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * system_notification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-12-05 11:54+0000\n" +"PO-Revision-Date: 2024-12-05 11:54+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: system_notification +#: model:ir.model,name:system_notification.model_base_automation +msgid "Automated Action" +msgstr "إجراء آلي" + +#. module: system_notification +#: model:ir.actions.act_window,name:system_notification.base_automation_act +msgid "Automated Actions" +msgstr "الإجراءات التلقائية" + +#. module: system_notification +#: model:ir.ui.view,arch_db:system_notification.view_base_group_automation_tree +msgid "Automation" +msgstr "أتمتة" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation_notify__cc_groups_ids +msgid "CC Notify Groups" +msgstr "نسخة ايميل لـ" + +#. module: system_notification +#: model:ir.actions.act_window,help:system_notification.base_automation_act +msgid "Click to setup a new automated automation." +msgstr "انقر لإعداد أتمتة آلية جديدة." + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_automation_group__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_automation_group__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_automation_group__display_name +msgid "Display Name" +msgstr "الاسم المعروض" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_automation_group__atuomation_ids +msgid "Group States " +msgstr "حالات المجموعة" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_automation_group__id +msgid "ID" +msgstr "المعرف" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_automation_group__last_update +msgid "Last Modified on" +msgstr "آخر تعديل في" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_automation_group__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_automation_group__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_automation_group__model_id +msgid "Model" +msgstr "اسم الإجراء" + +#. module: system_notification +#: model:ir.ui.menu,name:system_notification.menu_root +msgid "System Notification" +msgstr "إشعارات النظام" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation_notify__to_groups_ids +msgid "TO Notify Groups" +msgstr "إشعار المجموعة" + +#. module: system_notification +#: model:ir.model,name:system_notification.model_automation_group +msgid "automation.group" +msgstr "المجموعة التلقائية" + +#. module: system_notification +#: model:ir.model,name:system_notification.model_ir_actions_server +msgid "ir.actions.server" +msgstr "ir.actions.server" + +#. module: system_notification +#: model:ir.ui.view,arch_db:system_notification.view_base_group_automation_form +msgid "states" +msgstr "الحالات" + +#. module: system_notification +#: model:ir.ui.menu,name:system_notification.menu_base_group_automation_form +msgid "states notificatin" +msgstr "حالات الاشعار" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__notify_to_groups_ids +msgid "TO Notify Groups" +msgstr "إرسال للمجموعات" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__notify_cc_groups_ids +msgid "CC Notify Groups" +msgstr "نسخة للمجموعات" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__notify_note +msgid "Notification Note" +msgstr "ملاحظات الاشعار" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__send_notify +msgid "Send Notify" +msgstr "إشعار داخلي" + +#. module: system_notification +#: model_terms:ir.ui.view,arch_db:system_notification.view_base_automation_form +msgid "Notification Data" +msgstr "بيانات الإشعار" + +#. module: system_notification +#: model_terms:ir.ui.view,arch_db:system_notification.view_base_automation_form +msgid "HR Notification Data" +msgstr "بيانات إشعارات الموارد البشرية" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__send_notify +msgid "Send Notifications Within The System" +msgstr "إرسال إشعارات داخل النظام" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__notify_title +msgid "Notification Title" +msgstr "عنوان الإشعار" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__notify_summary +msgid "Notification Message" +msgstr "رسالة الإشعار" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__hr_notifys +msgid "HR Notifys" +msgstr "إشعار الموارد البشرية" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__services_manager_id +msgid "Services Manager" +msgstr "الخدمات المشتركة" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__ceo_notify +msgid "CEO Manager" +msgstr "الرئيس التنفيذي" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__hr_manager_notify +msgid "HR Manager" +msgstr "مدير الموارد البشرية" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__hr_email_notify +msgid "HR E-Mail" +msgstr "ايميل الموارد البشرية" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__department_manager_notify +msgid "Department Manager" +msgstr "مدير الإدارة" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__direct_manager_notify +msgid "Direct Manager" +msgstr "المدير المباشر" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__employee_notify +msgid "Employee Notify" +msgstr "إشعار الموظف" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__it_manager_id +msgid "IT Manager" +msgstr "مدير التقــنية" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__cyber_security_id +msgid "Cyber ​​Security" +msgstr "الآمن السيبراني" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__admin_manager_id +msgid "Admin Affairs Manager" +msgstr "مدير الشئون الإدارية" + +#. module: system_notification +#: model:ir.model.fields,field_description:system_notification.field_base_automation__financial_manager_id +msgid "Financial Manager" +msgstr "مدير المــالية" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__hr_notifys +msgid "Send Notifications HR Moduls Depend on (Employee Id) only" +msgstr "إرسال إشعار بخصوص منظومات الموارد البشرية إعتماداً على (إسم الموظف) فقط" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__direct_manager_notify +msgid "Send Notification To The Employee's Direct Manager Only" +msgstr "إرسال إشعار للمدير المباشر للموظف فقط حسب سجل الموظف" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__department_manager_notify +msgid "Send Notification To The Department Manager For The Employee Only" +msgstr "إرسال إشعار لمدير ادارة للموظف فقط حسب سجل الموظف" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__employee_notify +msgid "Send Notification To The Employee Only" +msgstr "إرسال إشعار للموظف فقط حسب سجل الموظف" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__ceo_notify +msgid "Send Notification To The CEO Manager Only" +msgstr "إرسال إشعار للرئيس التنفيذي فقط" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__hr_manager_notify +msgid "Send Notification To The HR Manager Only" +msgstr "إرسال إشعار لمدير الموارد البشرية فقط" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__hr_email_notify +msgid "Send Notification To The HR E-Mail Only" +msgstr "إرسال إشعار إيميل الموراد البشرية فقط" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__services_manager_id +msgid "Send Notification To The Services Manager Only" +msgstr "إرسال إشعار لمدير الخدمات المشتركة فقط" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__it_manager_id +msgid "Send Notification To The IT Manager Only" +msgstr "إرسال إشعار لمدير التقنية فقط" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__admin_manager_id +msgid "Send Notification To The Admin Affairs Manager Only" +msgstr "إرسال إشعار لمدير الشئون الإدارية فقط" + +#. module: system_notification +#: model:ir.model.fields,help:system_notification.field_base_automation__financial_manager_id +msgid "Send Notification To The Financial Manager Only" +msgstr "إرسال إشعار لمدير المالية فقط" diff --git a/odex30_base/system_notification/models/__init__.py b/odex30_base/system_notification/models/__init__.py new file mode 100644 index 0000000..9f7733c --- /dev/null +++ b/odex30_base/system_notification/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import group_state_notification diff --git a/odex30_base/system_notification/models/group_state_notification.py b/odex30_base/system_notification/models/group_state_notification.py new file mode 100644 index 0000000..8c1c135 --- /dev/null +++ b/odex30_base/system_notification/models/group_state_notification.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + + +class BaseGroupAutomation(models.Model): + _name = 'automation.group' + _rec_name = 'model_id' + _description = 'Automation Group' + + model_id = fields.Many2one('ir.model', string="Model", ondelete='cascade', required=True) + atuomation_ids = fields.Many2many( + comodel_name='base.automation', + relation='automation_state_groups_rel', + string='Group States' + ) + + def unlink(self): + """ + Delete all record(s) from recordset + return True on success, False otherwise + """ + for record in self.atuomation_ids: + record.unlink() + result = super(BaseGroupAutomation, self).unlink() + return result diff --git a/odex30_base/system_notification/models/models.py b/odex30_base/system_notification/models/models.py new file mode 100644 index 0000000..951192b --- /dev/null +++ b/odex30_base/system_notification/models/models.py @@ -0,0 +1,225 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api, _ +from datetime import datetime + + +class BaseAutomation(models.Model): + _inherit = 'base.automation' + + # إضافة خيار الإشعار + send_notify = fields.Boolean(string='Send Notify', help="Send Notifications Within The System") + notify_title = fields.Char(string='Notification Title', related='model_id.name') + notify_note = fields.Char(string='Notification Note') + notify_summary = fields.Char(string='Notification Message') + + notify_to_groups_ids = fields.Many2many( + comodel_name='res.groups', + relation='automation_notifications_to_groups_rel', + string='TO Notify Groups' + ) + + notify_cc_groups_ids = fields.Many2many( + comodel_name='res.groups', + relation='automation_notifications_cc_groups_rel', + string='CC Notify Groups' + ) + + hr_notifys = fields.Boolean( + string='HR Notifys', + help="Send Notifications HR Modules Depend on (Employee Id) only" + ) + direct_manager_notify = fields.Boolean(string='Direct Manager Notify', help="Notify direct manager") + department_manager_notify = fields.Boolean(string='Department Manager Notify', help="Notify department manager") + employee_notify = fields.Boolean(string='Employee Notify', help="Notify employee") + ceo_notify = fields.Boolean(string='CEO Manager', help="Notify CEO") + hr_manager_notify = fields.Boolean(string='HR Manager', help="Notify HR manager") + hr_email_notify = fields.Boolean(string='HR E-Mail', help="Notify HR email") + services_manager_id = fields.Boolean(string='Services Manager', help="Notify services manager") + it_manager_id = fields.Boolean(string='IT Manager', help="Notify IT manager") + admin_manager_id = fields.Boolean(string='Admin Affairs Manager', help="Notify admin manager") + financial_manager_id = fields.Boolean(string='Financial Manager', help="Notify financial manager") + cyber_security_id = fields.Boolean(string='Cyber Security', help="Notify cyber security") + + def check_record_access(self, user_id, record, mode='read'): + try: + record.with_user(user_id).check_access_rule(mode) + return True + except: + return False + + def access_users(self, groups, record): + users = [] + for group in groups: + for user in group.users: + if user.partner_id.email not in users and \ + self.check_record_access(user_id=user.id, record=record, mode='read') and \ + user.partner_id.email: + if self.hr_notifys: + if hasattr(record, 'employee_id') and record.employee_id: + emp = record.employee_id.sudo() + if self.direct_manager_notify and user.id == emp.parent_id.user_id.id: + users.append(user.partner_id.email) + elif self.department_manager_notify and user.id == emp.coach_id.user_id.id: + users.append(user.partner_id.email) + elif self.employee_notify and user.id == emp.user_id.id: + users.append(user.partner_id.email) + elif self.ceo_notify and user.id == emp.company_id.general_supervisor_id.user_id.id: + users.append(user.partner_id.email) + elif self.hr_manager_notify and user.id == emp.company_id.hr_manager_id.user_id.id: + users.append(user.partner_id.email) + elif self.services_manager_id and user.id == emp.company_id.services_manager_id.user_id.id: + users.append(user.partner_id.email) + elif self.it_manager_id and user.id == emp.company_id.it_manager_id.user_id.id: + users.append(user.partner_id.email) + elif self.admin_manager_id and user.id == emp.company_id.admin_manager_id.user_id.id: + users.append(user.partner_id.email) + elif self.financial_manager_id and user.id == emp.company_id.financial_manager_id.user_id.id: + users.append(user.partner_id.email) + elif self.cyber_security_id and user.id == emp.company_id.cyber_security_id.user_id.id: + users.append(user.partner_id.email) + elif self.hr_email_notify and emp.company_id.hr_email and emp.company_id.hr_email not in users: + users.append(emp.company_id.hr_email) + else: + users.append(user.partner_id.email) + else: + users.append(user.partner_id.email) + return ",".join(users) + + def access_users_ids(self, groups, record): + processed_users = set() + for group in groups: + for user in group.users: + if user.id not in processed_users and \ + self.check_record_access(user_id=user.id, record=record, mode='read'): + if self.hr_notifys: + if hasattr(record, 'employee_id') and record.employee_id: + emp = record.employee_id.sudo() + if self.direct_manager_notify and user.id == emp.parent_id.user_id.id: + processed_users.add(user.id) + elif self.department_manager_notify and user.id == emp.coach_id.user_id.id: + processed_users.add(user.id) + elif self.employee_notify and user.id == emp.user_id.id: + processed_users.add(user.id) + elif self.ceo_notify and user.id == emp.company_id.general_supervisor_id.user_id.id: + processed_users.add(user.id) + elif self.hr_manager_notify and user.id == emp.company_id.hr_manager_id.user_id.id: + processed_users.add(user.id) + elif self.services_manager_id and user.id == emp.company_id.services_manager_id.user_id.id: + processed_users.add(user.id) + elif self.it_manager_id and user.id == emp.company_id.it_manager_id.user_id.id: + processed_users.add(user.id) + elif self.admin_manager_id and user.id == emp.company_id.admin_manager_id.user_id.id: + processed_users.add(user.id) + elif self.financial_manager_id and user.id == emp.company_id.financial_manager_id.user_id.id: + processed_users.add(user.id) + elif self.cyber_security_id and user.id == emp.company_id.cyber_security_id.user_id.id: + processed_users.add(user.id) + else: + processed_users.add(user.id) + else: + processed_users.add(user.id) + return list(processed_users) + + def get_notify_message(self, record): + user_ids = self.access_users_ids(self.notify_to_groups_ids, record) + today = datetime.today() + + for user in user_ids: + data = { + 'res_id': record.id, + 'res_model_id': self.env['ir.model'].search([('model', '=', record._name)]).id, + 'user_id': user, + 'summary': _(self.name or 'Notification'), + 'activity_type_id': self.env.ref('mail.mail_activity_data_todo').id, + 'date_deadline': today + } + self.env['mail.activity'].create(data) + + if self.hr_notifys: + if not user_ids and self.notify_to_groups_ids: + if hasattr(record, 'employee_id') and record.employee_id: + hr_manager_user = record.employee_id.sudo().company_id.hr_manager_id.user_id.id + data = { + 'res_id': record.id, + 'res_model_id': self.env['ir.model'].search([('model', '=', record._name)]).id, + 'user_id': hr_manager_user, + 'summary': _(self.name or 'Notification'), + 'activity_type_id': self.env.ref('mail.mail_activity_data_todo').id, + 'date_deadline': today + } + self.env['mail.activity'].create(data) + + def get_mail_to(self, record): + users = self.access_users(self.notify_to_groups_ids, record) + if self.hr_notifys: + if not users and self.notify_to_groups_ids: + if hasattr(record, 'employee_id') and record.employee_id: + hr_manager_mail = record.employee_id.sudo().company_id.hr_manager_id.user_id.partner_id.email + users = hr_manager_mail + return users + + def get_mail_cc(self, record): + users = self.access_users(self.notify_cc_groups_ids, record) + if self.hr_notifys: + if not users and self.notify_cc_groups_ids: + if hasattr(record, 'employee_id') and record.employee_id: + hr_mail = record.employee_id.sudo().company_id.hr_email + users = hr_mail + return users + + def _process(self, records, domain_post=None): + result = super()._process(records, domain_post) + if self.send_notify: + for record in records: + self.get_notify_message(record) + return result + + +class MailActivity(models.Model): + _inherit = 'mail.activity' + + def action_notify(self): + if not self: + return + + original_context = self.env.context + body_template = self.env.ref('mail.message_activity_assigned') + + for activity in self: + if activity.user_id.lang: + self = self.with_context(lang=activity.user_id.lang) + body_template = body_template.with_context(lang=activity.user_id.lang) + activity = activity.with_context(lang=activity.user_id.lang) + + model_description = self.env['ir.model']._get(activity.res_model).display_name + + body = body_template._render( + { + 'activity': activity, + 'model_description': model_description, + 'access_link': self.env['mail.thread']._notify_get_action_link( + 'view', + model=activity.res_model, + res_id=activity.res_id + ), + }, + engine='ir.qweb', + minimal_qcontext=True + ) + + record = self.env[activity.res_model].browse(activity.res_id) + if activity.user_id: + record.message_post( + body=body, + subject=_('%(activity_name)s: %(summary)s assigned to you', + activity_name=activity.res_name, + summary=activity.summary or activity.activity_type_id.name + ), + partner_ids=activity.user_id.partner_id.ids, + email_layout_xmlid='system_notification.mail_notification_odex', + message_type='notification' + ) + + body_template = body_template.with_context(original_context) + self = self.with_context(original_context) diff --git a/odex30_base/system_notification/security/ir.model.access.csv b/odex30_base/system_notification/security/ir.model.access.csv new file mode 100644 index 0000000..9730574 --- /dev/null +++ b/odex30_base/system_notification/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_automation_group_emp,automation.group.emp,model_automation_group,base.group_user,1,1,1,0 diff --git a/odex30_base/system_notification/static/description/icon.png b/odex30_base/system_notification/static/description/icon.png new file mode 100644 index 0000000..4141f52 Binary files /dev/null and b/odex30_base/system_notification/static/description/icon.png differ diff --git a/odex30_base/system_notification/static/src/css/website_rtl.css b/odex30_base/system_notification/static/src/css/website_rtl.css new file mode 100644 index 0000000..85347c6 --- /dev/null +++ b/odex30_base/system_notification/static/src/css/website_rtl.css @@ -0,0 +1,22 @@ +@media (min-width: 768px){ + .rtl .navbar-right{ + float: left !important; + } + .rtl .navbar-right .dropdown .dropdown-menu{ + right: auto !important; + left: 0 !important; + } + .rtl .navbar-left{ + float: right !important; + } + .rtl .navbar-left .dropdown .dropdown-menu{ + left: auto !important; + right: 0 !important; + } + .navbar-nav.navbar-right:last-child{ + margin-left: auto; + } + .rtl .pull-left{ + float: right !important; + } +} diff --git a/odex30_base/system_notification/views/activity.xml b/odex30_base/system_notification/views/activity.xml new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/odex30_base/system_notification/views/activity.xml @@ -0,0 +1 @@ + diff --git a/odex30_base/system_notification/views/group_state_notification.xml b/odex30_base/system_notification/views/group_state_notification.xml new file mode 100644 index 0000000..cda90c7 --- /dev/null +++ b/odex30_base/system_notification/views/group_state_notification.xml @@ -0,0 +1,63 @@ + + + + + base.automation.inherit.view.form + base.automation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System Notifications + + + + diff --git a/odex30_base/system_notification/views/views.xml b/odex30_base/system_notification/views/views.xml new file mode 100644 index 0000000..bc2ebec --- /dev/null +++ b/odex30_base/system_notification/views/views.xml @@ -0,0 +1,77 @@ + + + + + Automations + automation.group + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + base.automation.list + automation.group + + + + + + + + + + Automated Actions + automation.group + list,form + + +

+ Click to setup a new automated automation. +

+

+ Use automated actions to automatically trigger actions for + various screens. Example: a lead created by a specific user may + be automatically set to a specific sales channel, or an + opportunity which still has status pending after 14 days might + trigger an automatic reminder email. +

+
+
+ + +