decidim-stratified_sortitions 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +91 -0
  4. data/Rakefile +42 -0
  5. data/app/cells/decidim/stratified_sortitions/stratified_sortition_cell.rb +21 -0
  6. data/app/cells/decidim/stratified_sortitions/stratified_sortition_l_cell.rb +22 -0
  7. data/app/cells/decidim/stratified_sortitions/stratified_sortition_metadata_cell.rb +63 -0
  8. data/app/commands/decidim/stratified_sortitions/admin/create_stratified_sortition.rb +84 -0
  9. data/app/commands/decidim/stratified_sortitions/admin/destroy_stratified_sortition.rb +49 -0
  10. data/app/commands/decidim/stratified_sortitions/admin/duplicate_stratified_sortition.rb +74 -0
  11. data/app/commands/decidim/stratified_sortitions/admin/import_sample.rb +40 -0
  12. data/app/commands/decidim/stratified_sortitions/admin/remove_uploaded_samples.rb +53 -0
  13. data/app/commands/decidim/stratified_sortitions/admin/update_stratified_sortition.rb +174 -0
  14. data/app/controllers/concerns/decidim/stratified_sortitions/orderable_stratified_sortitions.rb +37 -0
  15. data/app/controllers/concerns/decidim/stratified_sortitions/strata_charts_data.rb +91 -0
  16. data/app/controllers/decidim/stratified_sortitions/admin/application_controller.rb +19 -0
  17. data/app/controllers/decidim/stratified_sortitions/admin/samples_controller.rb +143 -0
  18. data/app/controllers/decidim/stratified_sortitions/admin/stratified_sortitions_controller.rb +235 -0
  19. data/app/controllers/decidim/stratified_sortitions/application_controller.rb +13 -0
  20. data/app/controllers/decidim/stratified_sortitions/charts_pdf_controller_helper.rb +17 -0
  21. data/app/controllers/decidim/stratified_sortitions/stratified_sortitions_controller.rb +61 -0
  22. data/app/forms/decidim/stratified_sortitions/admin/sample_upload_form.rb +15 -0
  23. data/app/forms/decidim/stratified_sortitions/admin/stratified_sortitions_form.rb +155 -0
  24. data/app/forms/decidim/stratified_sortitions/admin/stratum_form.rb +69 -0
  25. data/app/forms/decidim/stratified_sortitions/admin/substratum_form.rb +26 -0
  26. data/app/helpers/decidim/stratified_sortitions/admin/stratified_sortitions_helper.rb +18 -0
  27. data/app/helpers/decidim/stratified_sortitions/application_helper.rb +85 -0
  28. data/app/helpers/decidim/stratified_sortitions/charts_pdf_helper.rb +73 -0
  29. data/app/helpers/decidim/stratified_sortitions/stratified_sortition_cells_helper.rb +56 -0
  30. data/app/javascript/channels/sample_import_progress.js +12 -0
  31. data/app/jobs/decidim/stratified_sortitions/admin/execute_sortition_job.rb +21 -0
  32. data/app/jobs/decidim/stratified_sortitions/admin/import_sample_job.rb +170 -0
  33. data/app/jobs/decidim/stratified_sortitions/admin/remove_samples_job.rb +19 -0
  34. data/app/jobs/decidim/stratified_sortitions/admin/sortition_results_export_job.rb +28 -0
  35. data/app/mailers/decidim/stratified_sortitions/admin/import_mailer.rb +26 -0
  36. data/app/models/decidim/stratified_sortitions/application_record.rb +9 -0
  37. data/app/models/decidim/stratified_sortitions/panel_portfolio.rb +165 -0
  38. data/app/models/decidim/stratified_sortitions/sample_import.rb +14 -0
  39. data/app/models/decidim/stratified_sortitions/sample_participant.rb +12 -0
  40. data/app/models/decidim/stratified_sortitions/sample_participant_stratum.rb +11 -0
  41. data/app/models/decidim/stratified_sortitions/stratified_sortition.rb +74 -0
  42. data/app/models/decidim/stratified_sortitions/stratum.rb +22 -0
  43. data/app/models/decidim/stratified_sortitions/substratum.rb +19 -0
  44. data/app/packs/entrypoints/decidim_stratified_sortitions.js +10 -0
  45. data/app/packs/entrypoints/decidim_stratified_sortitions_admin.js +9 -0
  46. data/app/packs/entrypoints/decidim_stratified_sortitions_admin.scss +1 -0
  47. data/app/packs/images/decidim/stratified_sortitions/icon.svg +1 -0
  48. data/app/packs/src/decidim/stratified_sortitions/application.js +3 -0
  49. data/app/packs/src/decidim/stratified_sortitions/results_tabs.js +59 -0
  50. data/app/packs/src/decidim/stratified_sortitions/stratum_fields.js +302 -0
  51. data/app/packs/src/decidim/stratified_sortitions/substratum_fields.js +165 -0
  52. data/app/packs/src/decidim/stratified_sortitions/upload_sample.js +16 -0
  53. data/app/packs/stylesheets/decidim/stratified_sortitions/admin/stratified_sortitions.scss +210 -0
  54. data/app/packs/stylesheets/decidim/stratified_sortitions/charts_pdf.scss +148 -0
  55. data/app/packs/stylesheets/stratified_sortitions.scss +56 -0
  56. data/app/permissions/decidim/stratified_sortitions/admin/permissions.rb +74 -0
  57. data/app/permissions/decidim/stratified_sortitions/permissions.rb +23 -0
  58. data/app/presenters/decidim/stratified_sortitions/admin_log/stratified_sortition_presenter.rb +35 -0
  59. data/app/queries/decidim/stratified_sortitions/filtered_stratified_sortitions.rb +39 -0
  60. data/app/serializers/decidim/stratified_sortitions/sortition_result_serializer.rb +116 -0
  61. data/app/services/decidim/stratified_sortitions/charts_pdf_generator.rb +96 -0
  62. data/app/services/decidim/stratified_sortitions/fair_sortition_service.rb +247 -0
  63. data/app/services/decidim/stratified_sortitions/leximin/constraint_builder.rb +180 -0
  64. data/app/services/decidim/stratified_sortitions/leximin/distribution_solver.rb +217 -0
  65. data/app/services/decidim/stratified_sortitions/leximin/feasibility_checker.rb +222 -0
  66. data/app/services/decidim/stratified_sortitions/leximin/panel_generator.rb +149 -0
  67. data/app/services/decidim/stratified_sortitions/leximin/panel_sampler.rb +125 -0
  68. data/app/services/decidim/stratified_sortitions/leximin_selector.rb +136 -0
  69. data/app/services/decidim/stratified_sortitions/sortition_results_exporter.rb +161 -0
  70. data/app/views/decidim/admin/components/index.html.erb +54 -0
  71. data/app/views/decidim/stratified_sortitions/admin/import_mailer/import.html.erb +22 -0
  72. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_confirm_execute_modal.html.erb +19 -0
  73. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_confirm_participants_modal.html.erb +20 -0
  74. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_form.html.erb +55 -0
  75. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_navigation_menu.html.erb +10 -0
  76. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_strata.html.erb +22 -0
  77. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_stratum.html.erb +75 -0
  78. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_substrata.html.erb +34 -0
  79. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_substratum.html.erb +54 -0
  80. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/edit.html.erb +21 -0
  81. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/execute.html.erb +155 -0
  82. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/export_charts_pdf.html.erb +38 -0
  83. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/index.html.erb +75 -0
  84. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/new.html.erb +21 -0
  85. data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/upload_sample.html.erb +117 -0
  86. data/app/views/decidim/stratified_sortitions/shared/_strata_charts.html.erb +21 -0
  87. data/app/views/decidim/stratified_sortitions/stratified_sortitions/_results_count.html.erb +15 -0
  88. data/app/views/decidim/stratified_sortitions/stratified_sortitions/_stratified_sortition.html.erb +1 -0
  89. data/app/views/decidim/stratified_sortitions/stratified_sortitions/_stratified_sortitions.html.erb +13 -0
  90. data/app/views/decidim/stratified_sortitions/stratified_sortitions/_tags.html.erb +9 -0
  91. data/app/views/decidim/stratified_sortitions/stratified_sortitions/index.html.erb +22 -0
  92. data/app/views/decidim/stratified_sortitions/stratified_sortitions/index.js.erb +5 -0
  93. data/app/views/decidim/stratified_sortitions/stratified_sortitions/show.html.erb +142 -0
  94. data/app/views/layouts/decidim/admin/_sidebar_menu.html.erb +45 -0
  95. data/app/views/layouts/decidim/stratified_sortitions/charts_pdf.html.erb +14 -0
  96. data/config/assets.rb +24 -0
  97. data/config/locales/ca.yml +361 -0
  98. data/config/locales/en.yml +360 -0
  99. data/config/locales/es.yml +360 -0
  100. data/config/locales/oc.yml +2 -0
  101. data/config/routes.rb +1 -0
  102. data/db/migrate/20251023103900_create_decidim_stratified_sortitions_stratified_sortitions.rb +18 -0
  103. data/db/migrate/20251104120000_create_stratified_sortitions_strata_and_substrata.decidim_stratified_sortitions.rb +27 -0
  104. data/db/migrate/20251219120000_create_sample_imports.rb +17 -0
  105. data/db/migrate/20251219120100_create_sample_participants.rb +19 -0
  106. data/db/migrate/20251219120200_create_sample_participant_strata.rb +16 -0
  107. data/db/migrate/20251230130000_change_value_to_text_in_substrata.rb +11 -0
  108. data/db/migrate/20260102114744_add_status_to_stratified_sortitions.rb +11 -0
  109. data/db/migrate/20260109105643_allow_null_value_in_substrata.rb +10 -0
  110. data/db/migrate/20260113121726_add_position_to_strata_and_substrata.rb +8 -0
  111. data/db/migrate/20260127100000_rename_weighing_to_max_quota_percentage.rb +12 -0
  112. data/db/migrate/20260127120000_create_panel_portfolios.rb +46 -0
  113. data/db/migrate/20260518000000_add_foreign_key_to_stratified_sortitions_component.rb +10 -0
  114. data/db/migrate/20260521000000_add_cascade_to_stratified_sortitions_foreign_keys.rb +64 -0
  115. data/db/migrate/20260616000000_add_execution_error_to_stratified_sortitions.rb +11 -0
  116. data/lib/decidim/stratified_sortitions/admin.rb +10 -0
  117. data/lib/decidim/stratified_sortitions/admin_engine.rb +49 -0
  118. data/lib/decidim/stratified_sortitions/component.rb +41 -0
  119. data/lib/decidim/stratified_sortitions/engine.rb +34 -0
  120. data/lib/decidim/stratified_sortitions/seeds.rb +24 -0
  121. data/lib/decidim/stratified_sortitions/test/factories.rb +80 -0
  122. data/lib/decidim/stratified_sortitions/version.rb +13 -0
  123. data/lib/decidim/stratified_sortitions.rb +29 -0
  124. metadata +222 -0
@@ -0,0 +1,360 @@
1
+ ---
2
+ en:
3
+ activemodel:
4
+ attributes:
5
+ stratified_sortition:
6
+ created_at: Created At
7
+ title: Title
8
+ description: Description
9
+ num_candidates: Number of candidates to select
10
+ selection_criteria: Selection Criteria
11
+ selected_profiles_description: Description of the profiles to be selected
12
+ errors:
13
+ messages:
14
+ cannot_add_strata_with_sample_participants: "Cannot add strata when there are already imported participants"
15
+ cannot_delete_strata_with_sample_participants: "Cannot delete strata when there are already imported participants"
16
+ cannot_change_stratum_name_with_sample_participants: "Cannot change stratum name when there are already imported participants"
17
+ cannot_change_stratum_kind_with_sample_participants: "Cannot change stratum kind when there are already imported participants"
18
+ cannot_add_substrata_with_sample_participants: "Cannot add substrata when there are already imported participants"
19
+ cannot_delete_substrata_with_sample_participants: "Cannot delete substrata when there are already imported participants"
20
+ cannot_change_substratum_name_with_sample_participants: "Cannot change substratum name when there are already imported participants"
21
+ cannot_change_substratum_value_with_sample_participants: "Cannot change substratum value when there are already imported participants"
22
+ cannot_change_substratum_range_with_sample_participants: "Cannot change substratum range when there are already imported participants"
23
+ cannot_change_num_candidates_when_executed: "Cannot change the number of candidates after the sortition has been executed"
24
+ decidim:
25
+ admin:
26
+ components:
27
+ index:
28
+ headers:
29
+ scope: Scope
30
+ components:
31
+ stratified_sortitions:
32
+ name: Stratified Sortitions
33
+ settings:
34
+ global:
35
+ announcement: Announcement
36
+ publish_sortitions: Publish comparative charts of the Sortitions
37
+ step:
38
+ announcement: Announcement
39
+ stratified_sortitions:
40
+ admin:
41
+ actions:
42
+ configure: Configure
43
+ confirm_destroy: Are you sure you want to delete this %{name}?
44
+ destroy: Delete
45
+ duplicate: Duplicate
46
+ execute: Execute sortition
47
+ new_stratified_sortition: "New Stratified Sortition"
48
+ title: "Actions"
49
+ census_management: Manage sample
50
+ models:
51
+ stratified_sortition:
52
+ fields:
53
+ created_at: Created At
54
+ title: Title
55
+ description: Description
56
+ num_candidates: Number of candidates to select
57
+ selection_criteria: Selection Criteria
58
+ selected_profiles_description: Description of the profiles to be selected
59
+ status: Status
60
+ stratified_sortitions:
61
+ create:
62
+ error: There's been a problem creating this stratified sortition
63
+ success: Stratified sortition successfully created
64
+ destroy:
65
+ error: There's been a problem deleting this stratified sortition
66
+ has_problems: This stratified sortition couldn't be deleted due to related problems
67
+ success: Stratified sortition successfully deleted
68
+ execute:
69
+ candidates: Candidates
70
+ chart_results: Distribution charts
71
+ tab_charts: Comparative charts
72
+ tab_participants: Selected participants
73
+ empty_sample_participants: The sortition cannot be executed without a loaded census
74
+ execute_stratified_sortition: Execute stratified sortition
75
+ confirm_execute_title: Confirmation
76
+ confirm_execute_body: Once the sortition is executed, it will be recorded on the platform and the action will be irreversible. The data, the strata configuration, and the sample cannot be edited.
77
+ confirm_execute_ok: Execute sortition
78
+ confirm_execute_cancel: Cancel
79
+ export: Export
80
+ export_results: Export results
81
+ export_csv: Stratified sortition results as CSV
82
+ export_excel: Stratified sortition results as Excel
83
+ export_json: Stratified sortition results as JSON
84
+ export_charts_pdf: Export charts PDF
85
+ pdf_title: "Sortition results: %{name}"
86
+ pdf_subtitle: Comparative sample distribution charts
87
+ pdf_belongs_to: "Belongs to: %{space_name}"
88
+ pdf_algorithm: "Algorithm used: %{algorithm}"
89
+ pdf_executed_at: "Sortition performed on: %{date}"
90
+ pdf_no_data: No data
91
+ algorithm: Algorithm
92
+ generated_at: Generated at
93
+ generation_time: Generation time
94
+ total_participants: Total participants
95
+ num_panels: Number of panels
96
+ selected_at: Selected at
97
+ verification_seed: Verification seed
98
+ random_value_used: Random value used
99
+ selected_panel_probability: Selected panel probability
100
+ selected_participants_title: Selected participants
101
+ selected_participants:
102
+ one: "1 selected participant"
103
+ other: "%{count} selected participants"
104
+ participant_id: ID
105
+ personal_data_1: Personal data 1
106
+ personal_data_2: Personal data 2
107
+ personal_data_3: Personal data 3
108
+ personal_data_4: Personal data 4
109
+ no_results_yet: The sortition has not been executed yet.
110
+ confirm_participants_title: Show the list of selected participants
111
+ confirm_participants_body: You are accessing personal information and data. This action will be recorded.
112
+ confirm_participants_ok: Show
113
+ confirm_participants_cancel: Cancel
114
+ results: Results
115
+ executing_notice: The sortition is being processed in the background. This page will update once it is complete.
116
+ execution_failed: "The sortition execution failed:"
117
+ success: Stratified sortition successfully executed
118
+ executing: The sortition has been enqueued and is being processed in the background.
119
+ target: Target
120
+ title: Execute stratified sortition
121
+ export_results:
122
+ no_results: There are no results to export. Execute the sortition first.
123
+ duplicate:
124
+ error: There's been a problem duplicating this stratified sortition
125
+ success: Stratified sortition successfully duplicated
126
+ index:
127
+ selected: Selected Stratified Sortitions
128
+ title: Stratified Sortitions
129
+ new:
130
+ create: Create
131
+ title: New Stratified Sortition
132
+ edit:
133
+ title: Edit Stratified Sortition
134
+ update: Update
135
+ form:
136
+ data: General Information
137
+ description: Description
138
+ name: Name
139
+ published: Published
140
+ selected_profiles_description_help: You can indicate, if applicable, the stratification criteria used in the draw, and the reason.
141
+ selection_criteria_help: You can indicate, if applicable, the eligibility criteria of the people who have been selected to participate in the sortition.
142
+ strata:
143
+ title: Strata
144
+ add_stratum: Add stratum
145
+ stratum:
146
+ up: Up
147
+ down: Down
148
+ remove: Remove
149
+ name: Name
150
+ kind:
151
+ title: Kind
152
+ value: Value
153
+ numeric_range: Numeric range
154
+ substrata_title: Substrata
155
+ title: Strata
156
+ substrata:
157
+ add_substratum: Add substratum
158
+ substratum:
159
+ up: Up
160
+ down: Down
161
+ remove: Remove
162
+ name: Name
163
+ value: Value
164
+ value_placeholder: Value
165
+ range: Range
166
+ range_placeholder: Range (e.g. 0-18)
167
+ title: Substratum
168
+ max_quota_percentage: Objective %
169
+ max_quota_percentage_placeholder: Objective %
170
+ update:
171
+ error: There's been a problem updating this stratified sortition
172
+ success: Stratified sortition successfully updated
173
+ upload_sample:
174
+ age: Age group
175
+ candidates: Candidates
176
+ census_file: Choose a file
177
+ census_file_label: Excel.csv file with census data
178
+ configure_strata_first: You must configure strata and substrata first
179
+ count_uploaded_files: "<b>%{count}</b> records uploaded."
180
+ description: The sample file must be a CSV and have a format similar to the example below:<br>You can download and use the template.
181
+ download_template: "Download template"
182
+ download_template_csv: "Download as a CSV template"
183
+ download_template_xlsx: "Download as a XLSX template"
184
+ example: "Candidate data 1,Candidate data 2,Candidate data 3,Candidate data 4,Stratum 1,Stratum 2,Stratum 3,Stratum N<br>example@example.com,D,Higher,34<br>example@example.com,E,Higher,24<br><br>. . ."
185
+ example_headers:
186
+ personal_data_1: "Personal data 1 (unique identifier)"
187
+ personal_data_2: "Personal data 2"
188
+ personal_data_3: "Personal data 3"
189
+ personal_data_4: "Personal data 4"
190
+ gender: "Gender"
191
+ age: "Age"
192
+ example_rows:
193
+ - - "11111111X"
194
+ - "Example name 1"
195
+ - "Phone Example 1"
196
+ - "example1@example.com"
197
+ - "Male"
198
+ - "45"
199
+ - - "22222222Y"
200
+ - "Example name 2"
201
+ - "Phone Example 2"
202
+ - "example2@example.com"
203
+ - "Female"
204
+ - "42"
205
+ execute_stratified_sortition: Execute sortition
206
+ execute_stratified_sortition_help: The sortition cannot be executed until records are uploaded.
207
+ filename_data: "%{filename}, on %{date}, number of records %{count}"
208
+ gender: Gender
209
+ last_upload_date: The last upload was on %{date}
210
+ help: The first four columns are candidate data, such as email, ID, phone, or address, and the following columns are the strata defined in the stratified sortition. Each row represents a candidate.
211
+ no_data: No data
212
+ place: Place of birth
213
+ remove_uploaded_samples: Remove all records
214
+ confirm_remove_uploaded_samples: Are you sure you want to remove all uploaded samples?
215
+ strata_not_configured: You must configure strata and substrata first
216
+ target: Target
217
+ title: Manage sample
218
+ upload_census: Upload a new sample
219
+ upload_file: Upload new sample
220
+ uploaded_file: Uploaded sample data
221
+ uploaded_files: "The following files have been added:"
222
+ no_uploaded_files: "No files uploaded."
223
+ help_csv: "<b>The file to be uploaded must follow these instructions:</b>
224
+ <ul><li>The file format must be .csv. You can download a template.</li>
225
+ <li>The first column is mandatory. It is the unique identifier for each participant and can be the ID, a randomly generated code, or any other form of identification you want to use.</li>
226
+ <li>Columns 2, 3, and 4 (Personal data 2, 3, 4) are optional and are not used for the sortition. They are used to add contact information for each participant.</li>
227
+ <li>The strata columns are mandatory and must have the same order and name as configured in the previous section.</li>
228
+ <li>The information in the columns must match one of the values specified for each stratum.</li>
229
+ <li>If a participant does not have data in any of the strata or does not match any of the configured values, they will be excluded from the sortition.</li></ul>"
230
+ help_submit: 'By clicking "Save", the system will load the data in the background. This may take several minutes depending on the volume of participants. When the load is complete, the result will be notified by email.'
231
+ import_mailer:
232
+ subject: "Sample import result"
233
+ import:
234
+ ready: "The sample import has been completed successfully."
235
+ total_rows: "Total rows"
236
+ imported_rows: "Successfully imported"
237
+ failed_rows: "Rows with errors"
238
+ errors_summary: "Total rows: %{total}. Successfully imported: %{imported}. Rows with errors: %{failed}."
239
+ see_details: "The identifiers of the participants who have had errors are:"
240
+ participant_id: "Participant ID:"
241
+ samples:
242
+ template:
243
+ personal_data_1: "Personal data 1 (unique identifier)"
244
+ personal_data_2: "Personal data 2"
245
+ personal_data_3: "Personal data 3"
246
+ personal_data_4: "Personal data 4"
247
+ import_success: "The sample has been imported successfully."
248
+ import_failed: "An error occurred while importing the sample: %{error}"
249
+ errors:
250
+ no_file: "No file has been selected."
251
+ no_strata: "You must configure strata and substrata before uploading a sample."
252
+ pending: "You can only upload samples when the stratified sortition is in pending status."
253
+ sample_imports:
254
+ create:
255
+ success: "The sample is being loaded in the background. When it finishes you will receive an email with the import summary."
256
+ remove_uploaded_samples:
257
+ enqueued: "The sample removal has been enqueued and will be processed in the background."
258
+ success: "Uploaded samples have been successfully removed."
259
+ error: "There was an error removing the uploaded samples."
260
+ stratified_sortitions:
261
+ count:
262
+ candidates_count:
263
+ one: 1 candidate
264
+ other: "%{count} candidates"
265
+ filters:
266
+ all: All
267
+ pending: Pending
268
+ executing: Executing
269
+ executed: Executed
270
+ failed: Failed
271
+ state: Status
272
+ index:
273
+ empty: There are no stratified sortitions yet.
274
+ orders:
275
+ label: 'Order stratified sortitions by:'
276
+ random: Random
277
+ recent: Recent
278
+ results_count:
279
+ count:
280
+ one: Candidate to select
281
+ other: Candidates to select
282
+ count_selected:
283
+ one: Selected candidate
284
+ other: Selected candidates
285
+ show:
286
+ introduction: 'This page contains the details of the stratified sortition %{reference}. By means of this sortition, %{num_candidates} candidates have been selected using a stratified random selection algorithm that ensures fair representation across all defined strata.'
287
+ description: Description
288
+ selection_criteria: Selection criteria
289
+ selected_profiles_description: Description of the selected profiles
290
+ to_be_selected_profiles_description: Description of the profiles to be selected
291
+ strata: Strata
292
+ max_quota: Max quota
293
+ selected_participants: Selected participants
294
+ selected_participants_count:
295
+ one: 1 participant has been selected
296
+ other: "%{count} participants have been selected"
297
+ sortition_details: Sortition details
298
+ num_candidates: Number of candidates to select
299
+ status: Status
300
+ strata_count: Number of strata
301
+ algorithm: Algorithm
302
+ algorithm_name: LEXIMIN
303
+ algorithm_description: Stratified random selection algorithm that ensures fair representation across all defined strata
304
+ reproducibility_details: Sortition reproducibility
305
+ verification_seed: Verification seed
306
+ random_value_used: Random value used
307
+ selected_panel_index: Selected panel index
308
+ selected_at: Selected at
309
+ strata_charts: Distribution of profiles
310
+ target: Target to achieve
311
+ candidates: Received candidatures
312
+ no_data: No data
313
+ results: Sortition results
314
+ statuses:
315
+ pending: Pending
316
+ executing: Executing
317
+ executed: Executed
318
+ failed: Failed
319
+ stratified_sortition:
320
+ num_candidates: candidates to select
321
+ strata_count: strata
322
+ stratified_sortitions_count:
323
+ count:
324
+ one: 1 stratified sortition
325
+ other: "%{count} stratified sortitions"
326
+ admin_log:
327
+ stratified_sortition:
328
+ create: "%{user_name} created the stratified sortition %{resource_name} on %{space_name}"
329
+ update: "%{user_name} updated the stratified sortition %{resource_name} on %{space_name}"
330
+ delete: "%{user_name} deleted the stratified sortition %{resource_name} on %{space_name}"
331
+ duplicate: "%{user_name} duplicated the stratified sortition %{resource_name}"
332
+ import_sample: "%{user_name} imported a sample to the stratified sortition %{resource_name} on %{space_name}"
333
+ remove_samples: "%{user_name} removed the imported records from the stratified sortition %{resource_name} on %{space_name}"
334
+ execute: "%{user_name} executed the stratified sortition %{resource_name} on %{space_name}"
335
+ export_results: "%{user_name} exported the results of the stratified sortition %{resource_name} on %{space_name}"
336
+ view_participants: "%{user_name} viewed the selected participants list of the stratified sortition %{resource_name} on %{space_name}"
337
+ errors:
338
+ panel_portfolio:
339
+ already_sampled: "Portfolio already sampled"
340
+ probabilities_size_mismatch: "must have the same size as panels (%{panels_count} panels, %{probabilities_count} probabilities)"
341
+ probabilities_sum_invalid: "must sum to 1.0 (currently %{total})"
342
+ feasibility:
343
+ panel_size_positive: "Panel size (num_candidates) must be a positive number"
344
+ no_categories: "No categories (substrata) defined. You must configure strata and substrata before running the algorithm"
345
+ no_volunteers: "No volunteers in the pool. You must import participants before running the sortition"
346
+ pool_too_small: "The volunteer pool (%{volunteers_count}) is smaller than the panel size (%{panel_size}). Add more participants or reduce the number of candidates to select"
347
+ stratum_insufficient_quotas: "Stratum '%{stratum_name}' has insufficient maximum quotas. The sum of maximum quotas (%{total_max}) is less than the panel size (%{panel_size})"
348
+ stratum_percentages_exceed: "Stratum '%{stratum_name}' has percentages that sum to more than 100%% (%{total_percentage}%%)"
349
+ substratum_insufficient_volunteers: "Substratum '%{substratum_name}' of stratum '%{stratum_name}' requires a minimum of %{min_quota} volunteers but only has %{volunteers_count}"
350
+ substratum_quota_exceeds_volunteers: "Substratum '%{substratum_name}' of stratum '%{stratum_name}' has a max quota of %{max_quota} (%{percentage}%%) but only %{volunteers_count} volunteer(s) belong to this category. Reduce the max quota percentage or add more participants in this category"
351
+ volunteers_missing_strata: "There are %{count} volunteer(s) that do not have a substratum assigned for each stratum. This may cause problems in the selection algorithm"
352
+ no_name: "No name"
353
+ fair_sortition:
354
+ already_performed: "The sortition has already been performed for this process"
355
+ portfolio_generation_failed: "Error generating panel portfolio: %{error}"
356
+ no_portfolio: "There is no panel portfolio. Execute `generate_portfolio` first"
357
+ sampling_failed: "Error while sampling: %{error}"
358
+ leximin:
359
+ no_feasible_panel: "Could not find a valid initial panel. The combination of quota constraints (max percentages) and the available sample makes it impossible to form a panel. Possible causes: (1) The max quota percentages for some substrata are too restrictive for the available sample size. (2) There are not enough participants in certain substratum combinations. (3) The number of candidates to select is too large relative to the sample. Try adjusting the max quota percentages or uploading a larger sample."
360
+ internal_error: "Internal error in the selection algorithm: %{error}. Please verify that the strata configuration and max quota percentages are compatible with the loaded sample."