Module: HrLite::Notifications
- Defined in:
- lib/hr_lite/notifications.rb
Overview
Central event bus. Domain code publishes an event; the per-event channel row (host-overridable via config.notification_matrix) decides which channels fire. Channel semantics:
bell: in-app notification (config.notify) to `bell_to` users
email: EventMailer to each `email_to` user
leadership_email: ONE email to every configured leadership address
leadership_bell: in-app notification to each leadership user record
Recipients are computed by the publishing site (it knows the domain); the matrix is purely the on/off routing table.
Constant Summary collapse
- DEFAULT_MATRIX =
{ "leave.requested" => { bell: true, email: false, leadership_email: true, leadership_bell: true }, "leave.approved" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, "leave.rejected" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, "leave.cancelled" => { bell: true, email: false, leadership_email: true, leadership_bell: false }, "attendance.flagged" => { bell: true, email: false, leadership_email: false, leadership_bell: false }, "attendance.regularized" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, "payroll.finalized" => { bell: false, email: false, leadership_email: true, leadership_bell: true }, "payroll.published" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, "kudos.mentioned" => { bell: true, email: true, leadership_email: false, leadership_bell: false }, "appraisal.shared" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, "promotion.recorded" => { bell: true, email: true, leadership_email: true, leadership_bell: true }, "policy.changed" => { bell: false, email: false, leadership_email: true, leadership_bell: true }, # An approval past its deadline. Leadership hears too — a decision # nobody is making is a process problem, not just one person's inbox. "approval.escalated" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, # Tax declarations. The submission bells whoever verifies them; the # decision goes back to the employee, whose year's TDS depends on it. "tax.declaration_submitted" => { bell: true, email: false, leadership_email: false, leadership_bell: false }, "tax.declaration_decided" => { bell: true, email: true, leadership_email: false, leadership_bell: false }, # A document about to lapse — a passport or a visa is somebody's right # to work, and finding out late is the whole problem. "document.expiring" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, "expense.submitted" => { bell: true, email: false, leadership_email: false, leadership_bell: false }, "expense.approved" => { bell: true, email: true, leadership_email: false, leadership_bell: false }, "expense.rejected" => { bell: true, email: true, leadership_email: false, leadership_bell: false }, "expense.reimbursed" => { bell: true, email: true, leadership_email: false, leadership_bell: false }, "hr_request.raised" => { bell: true, email: false, leadership_email: false, leadership_bell: false }, "hr_request.assigned" => { bell: true, email: false, leadership_email: false, leadership_bell: false }, "hr_request.resolved" => { bell: true, email: true, leadership_email: false, leadership_bell: false }, "policy.published" => { bell: true, email: true, leadership_email: false, leadership_bell: false }, "digest.daily" => { bell: false, email: false, leadership_email: true, leadership_bell: false }, "resignation.submitted" => { bell: true, email: false, leadership_email: true, leadership_bell: true }, "resignation.accepted" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, "resignation.withdrawn" => { bell: true, email: false, leadership_email: true, leadership_bell: false }, "employee.onboarded" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, "payroll.draft_ready" => { bell: false, email: false, leadership_email: true, leadership_bell: true }, "leave.team_notice" => { bell: true, email: true, leadership_email: false, leadership_bell: false }, "comp_off.requested" => { bell: true, email: false, leadership_email: true, leadership_bell: true }, "comp_off.approved" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, "comp_off.rejected" => { bell: true, email: true, leadership_email: false, leadership_bell: false }, "comp_off.cancelled" => { bell: true, email: false, leadership_email: true, leadership_bell: false }, "regularization.requested" => { bell: true, email: false, leadership_email: true, leadership_bell: false }, "regularization.approved" => { bell: true, email: true, leadership_email: true, leadership_bell: false }, "regularization.rejected" => { bell: true, email: true, leadership_email: false, leadership_bell: false }, "regularization.cancelled" => { bell: true, email: false, leadership_email: true, leadership_bell: false } }.freeze
Class Method Summary collapse
-
.matrix ⇒ Object
DEFAULT under the host override: a host matrix pinned on an older gem version keeps working when new events ship (rows it doesn't know about fall back to the defaults instead of vanishing).
-
.publish(event, title:, body: nil, path: nil, bell_to: [], email_to: [], lines: [], diff: nil, link_url: nil, leadership: {}) ⇒ Object
leadership:overrides title/body/path for the leadership copies of an event.
Class Method Details
.matrix ⇒ Object
DEFAULT under the host override: a host matrix pinned on an older gem version keeps working when new events ship (rows it doesn't know about fall back to the defaults instead of vanishing).
66 67 68 |
# File 'lib/hr_lite/notifications.rb', line 66 def matrix DEFAULT_MATRIX.merge(HrLite.config.notification_matrix || {}) end |
.publish(event, title:, body: nil, path: nil, bell_to: [], email_to: [], lines: [], diff: nil, link_url: nil, leadership: {}) ⇒ Object
leadership: overrides title/body/path for the leadership copies of an
event. Some events are written in the second person and point at an
employee-scoped path ("Your appraisal has been shared", /appraisals/7):
fanned out verbatim, leadership read them as being about themselves and
followed a link their own scope 404s or resolves to their own record.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/hr_lite/notifications.rb', line 75 def publish(event, title:, body: nil, path: nil, bell_to: [], email_to: [], lines: [], diff: nil, link_url: nil, leadership: {}) row = matrix[event.to_s] unless row Rails.logger.warn("[hr_lite] unknown notification event #{event}") return end lead_title = leadership[:title] || title lead_body = leadership.key?(:body) ? leadership[:body] : body lead_path = leadership[:path] || path deliver_bells(event, row, bell_to, title, body, path) deliver_emails(row, email_to, title, body, path, lines, link_url) deliver_leadership_email(event, row, lead_title, lead_body, lead_path, lines, diff) deliver_leadership_bells(event, row, bell_to, lead_title, lead_body, lead_path) nil end |