Skip to content

Commit 423b2c1

Browse files
Merge pull request #1991 from dmitry-sinina/disable_email_balance_notifications
Disable email balance notifications
2 parents 4fbfb41 + 26de60e commit 423b2c1

7 files changed

Lines changed: 77 additions & 30 deletions

File tree

app/admin/system/infos.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
row :keep_expired_destinations_days
3939
row :keep_expired_dialpeers_days
4040
row :keep_balance_notifications_days
41+
row :disable_balance_notification_emails
4142
row :calls_monitoring do
4243
attributes_table_for(YetiConfig.calls_monitoring) do
4344
row :write_account_stats

app/assets/stylesheets/active_admin.css.scss

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,17 @@ body.active_admin.index #active_admin_content {
130130

131131
.cdr-stat-grid {
132132
display: grid;
133-
grid-template-columns: 1fr 1fr;
133+
grid-template-columns: 1fr;
134134
gap: 4px 6px;
135135
font-size: 1.05em;
136136
padding: 2px 0;
137137

138138
.cdr-stat-cell {
139139
display: flex;
140-
flex-direction: column;
140+
flex-direction: row;
141+
justify-content: space-between;
142+
align-items: baseline;
143+
gap: 8px;
141144

142145
.cdr-stat-label {
143146
color: #888;
@@ -149,30 +152,12 @@ body.active_admin.index #active_admin_content {
149152
.cdr-stat-value {
150153
font-weight: 600;
151154
line-height: 1.3;
152-
}
153-
}
154-
155-
.cdr-stat-full {
156-
grid-column: 1 / -1;
157-
flex-direction: row;
158-
justify-content: space-between;
159-
align-items: baseline;
160-
gap: 8px;
161-
162-
.cdr-stat-value {
163155
text-align: right;
164156
white-space: nowrap;
165157
}
166158
}
167159

168-
.cdr-stat-separator {
169-
grid-column: 1 / -1;
170-
border-top: 1px solid #e8e8e8;
171-
margin: 1px 0;
172-
}
173-
174160
.cdr-stat-by-currency {
175-
grid-column: 1 / -1;
176161
padding: 0 0 1px 8px;
177162

178163
.cdr-stat-currency-row {

app/domain/notification_event.rb

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def low_threshold_reached(account)
2424
System::EventSubscription::CONST::EVENT_ACCOUNT_LOW_THRESHOLD_REACHED,
2525
subject: "Account with id #{account.id} low balance",
2626
message: account_threshold_message(account),
27-
additional_contacts: account_contacts(account),
27+
additional_contacts: account_email_recipients(account),
2828
event_data: account_threshold_data(account)
2929
)
3030
end
@@ -34,7 +34,7 @@ def high_threshold_reached(account)
3434
System::EventSubscription::CONST::EVENT_ACCOUNT_HIGH_THRESHOLD_REACHED,
3535
subject: "Account with id #{account.id} high balance",
3636
message: account_threshold_message(account),
37-
additional_contacts: account_contacts(account),
37+
additional_contacts: account_email_recipients(account),
3838
event_data: account_threshold_data(account)
3939
)
4040
end
@@ -44,7 +44,7 @@ def low_threshold_cleared(account)
4444
System::EventSubscription::CONST::EVENT_ACCOUNT_LOW_THRESHOLD_CLEARED,
4545
subject: "Account with id #{account.id} low balance cleared",
4646
message: account_threshold_message(account),
47-
additional_contacts: account_contacts(account),
47+
additional_contacts: account_email_recipients(account),
4848
event_data: account_threshold_data(account)
4949
)
5050
end
@@ -54,7 +54,7 @@ def high_threshold_cleared(account)
5454
System::EventSubscription::CONST::EVENT_ACCOUNT_HIGH_THRESHOLD_CLEARED,
5555
subject: "Account with id #{account.id} high balance cleared",
5656
message: account_threshold_message(account),
57-
additional_contacts: account_contacts(account),
57+
additional_contacts: account_email_recipients(account),
5858
event_data: account_threshold_data(account)
5959
)
6060
end
@@ -153,6 +153,12 @@ def account_contacts(account)
153153
account.balance_notification_setting.contacts.preload(contractor: :smtp_connection).to_a
154154
end
155155

156+
def account_email_recipients(account)
157+
return [] if YetiConfig.disable_balance_notification_emails
158+
159+
account_contacts(account)
160+
end
161+
156162
def destination_contacts(destination)
157163
contact_ids = destination.rateplans.pluck(:send_quality_alarms_to).flatten.compact.uniq
158164
Billing::Contact.where(id: contact_ids).preload(contractor: :smtp_connection).to_a

config/initializers/config.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ def self.setting_files(config_root, _env)
6767

6868
optional(:partition_detach_before_drop).filled(:bool)
6969

70+
optional(:disable_balance_notification_emails).filled(:bool)
71+
7072
required(:prometheus).schema do
7173
required(:enabled).value(:bool?)
7274
required(:host).maybe(:string)

config/yeti_web.yml.distr

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ s3_storage:
7979

8080
tmpdir: 'tmp'
8181

82+
# When true, suppresses balance-threshold emails to addresses configured on
83+
# Account Balance Notification Settings (send_balance_notifications_to).
84+
# HTTP webhooks and emails to System::EventSubscription contacts are unaffected.
85+
#disable_balance_notification_emails: false
86+
8287
# Admin UI session expiration configuration (optional)
8388
# If not set, sessions will not expire (current behavior)
8489
# If set, sessions will expire after the specified number of seconds of inactivity

lib/resource_dsl/acts_as_cdr_stat.rb

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ def acts_as_cdr_stat
66
section = ActiveAdmin::SidebarSection.new 'Statistic', class: 'toggle', only: :index do
77
div id: 'cdr_statistic', class: 'loader'
88
div id: 'cdr_statistic_placeholder', class: 'cdr-stat-grid', style: 'display: none;' do
9-
div class: 'cdr-stat-cell cdr-stat-full' do
9+
div class: 'cdr-stat-cell' do
1010
span 'Originated calls', class: 'cdr-stat-label'
1111
strong id: :cdr_stat_originated_calls_count, class: 'cdr-stat-value'
1212
end
@@ -18,7 +18,6 @@ def acts_as_cdr_stat
1818
span 'Rerouted', class: 'cdr-stat-label'
1919
strong id: :cdr_stat_rerouted_calls_count, class: 'cdr-stat-value'
2020
end
21-
div class: 'cdr-stat-separator'
2221
div class: 'cdr-stat-cell' do
2322
span 'Duration', class: 'cdr-stat-label'
2423
strong id: :cdr_stat_calls_duration, class: 'cdr-stat-value'
@@ -35,17 +34,16 @@ def acts_as_cdr_stat
3534
span 'Term ASR', class: 'cdr-stat-label'
3635
strong id: :cdr_stat_termination_asr, class: 'cdr-stat-value'
3736
end
38-
div class: 'cdr-stat-separator'
39-
div class: 'cdr-stat-cell cdr-stat-full' do
37+
div class: 'cdr-stat-cell' do
4038
span 'Profit', class: 'cdr-stat-label'
4139
strong id: :cdr_stat_profit, class: 'cdr-stat-value'
4240
end
43-
div class: 'cdr-stat-cell cdr-stat-full' do
41+
div class: 'cdr-stat-cell' do
4442
span 'Origination cost', class: 'cdr-stat-label'
4543
strong id: :cdr_stat_origination_cost, class: 'cdr-stat-value'
4644
end
4745
div id: :cdr_stat_origination_cost_by_currency, class: 'cdr-stat-by-currency'
48-
div class: 'cdr-stat-cell cdr-stat-full' do
46+
div class: 'cdr-stat-cell' do
4947
span 'Termination cost', class: 'cdr-stat-label'
5048
strong id: :cdr_stat_termination_cost, class: 'cdr-stat-value'
5149
end

spec/domain/notification_event_spec.rb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,45 @@
9999
end
100100

101101
context 'when event_subscription has url'
102+
103+
context 'when YetiConfig.disable_balance_notification_emails is true' do
104+
before do
105+
allow(YetiConfig).to receive(:disable_balance_notification_emails).and_return(true)
106+
end
107+
108+
let(:expected_contacts) { subscription_contacts }
109+
110+
include_examples :sends_email_to_contacts
111+
include_examples :does_not_enqueue_send_http_job
112+
113+
context 'when event_subscription has url filled' do
114+
before do
115+
event_subscription.update! url: 'http://example.com/cb'
116+
end
117+
118+
include_examples :sends_email_to_contacts
119+
# expected_event_data still carries the account's send_balance_notifications_to emails
120+
include_examples :enqueues_send_http_job
121+
end
122+
123+
context 'when event_subscription has no contacts' do
124+
before do
125+
event_subscription.update! send_to: []
126+
end
127+
128+
include_examples :does_not_send_email
129+
include_examples :does_not_enqueue_send_http_job
130+
131+
context 'when event_subscription has url filled' do
132+
before do
133+
event_subscription.update! url: 'http://example.com/cb'
134+
end
135+
136+
include_examples :does_not_send_email
137+
include_examples :enqueues_send_http_job
138+
end
139+
end
140+
end
102141
end
103142

104143
shared_examples :send_destination_quality_alarm_emails do
@@ -173,6 +212,17 @@
173212
include_examples :sends_email_to_contacts
174213
include_examples :enqueues_send_http_job
175214
end
215+
216+
context 'when YetiConfig.disable_balance_notification_emails is true' do
217+
# Regression guard: the flag must only suppress account balance emails,
218+
# not destination quality alarm emails to rateplan-configured contacts.
219+
before do
220+
allow(YetiConfig).to receive(:disable_balance_notification_emails).and_return(true)
221+
end
222+
223+
include_examples :sends_email_to_contacts
224+
include_examples :does_not_enqueue_send_http_job
225+
end
176226
end
177227

178228
shared_examples :send_events_to_event_subscription_contacts do

0 commit comments

Comments
 (0)