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 }, "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).
48 49 50 |
# File 'lib/hr_lite/notifications.rb', line 48 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.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/hr_lite/notifications.rb', line 57 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 |