diff --git a/app/controllers/decidim/stratified_sortitions/admin/stratified_sortitions_controller.rb b/app/controllers/decidim/stratified_sortitions/admin/stratified_sortitions_controller.rb
index 90cea65..fff9472 100644
--- a/app/controllers/decidim/stratified_sortitions/admin/stratified_sortitions_controller.rb
+++ b/app/controllers/decidim/stratified_sortitions/admin/stratified_sortitions_controller.rb
@@ -104,19 +104,8 @@ def upload_sample
@sample_participants_count = @stratified_sortition.sample_participants.count
@last_sample = SampleImport.where(stratified_sortition: @stratified_sortition).order(created_at: :desc).first
@samples = SampleImport.where(stratified_sortition: @stratified_sortition).order(created_at: :asc)
-
- @strata_data = @stratified_sortition.strata.map do |stratum|
- chart_data = stratum.substrata.map do |substratum|
- weighing_value = substratum.weighing.present? ? substratum.weighing.to_f : 0.0
- label_with_percentage = "#{translated_attribute(substratum.name)} (#{weighing_value}%)"
- [label_with_percentage, weighing_value]
- end
- chart_data = chart_data.reject { |_name, value| value.zero? }
- {
- stratum:,
- chart_data:,
- }
- end
+ @strata_data = strata_data(@stratified_sortition)
+ @candidates_data = candidates_data(@stratified_sortition)
end
private
@@ -144,6 +133,71 @@ def blank_stratum
def blank_substratum(stratum_form)
Decidim::StratifiedSortitions::Admin::SubstratumForm.new(stratum: stratum_form.model)
end
+
+ def strata_data(stratified_sortition)
+ stratified_sortition.strata.map do |stratum|
+ chart_data = stratum.substrata.map do |substratum|
+ weighing_value = substratum.weighing.present? ? substratum.weighing.to_f : 0.0
+ label_with_percentage = "#{translated_attribute(substratum.name)} (#{weighing_value}%)"
+ [label_with_percentage, weighing_value]
+ end
+ chart_data = chart_data.reject { |_name, value| value.zero? }
+ {
+ stratum:,
+ chart_data:,
+ }
+ end
+ end
+
+ def candidates_data(stratified_sortition)
+ sample_candidates_ids = stratified_sortition.sample_participants.pluck(:id)
+ sample_candidates_stratum = fetch_sample_candidates_stratum(sample_candidates_ids)
+ by_stratum = group_by_stratum(sample_candidates_stratum)
+ by_stratum_and_substratum = group_by_stratum_and_substratum(sample_candidates_stratum)
+
+ stratified_sortition.strata.map do |stratum|
+ build_stratum_chart(stratum, by_stratum, by_stratum_and_substratum)
+ end
+ end
+
+ def fetch_sample_candidates_stratum(sample_candidates_ids)
+ Decidim::StratifiedSortitions::SampleParticipantStratum
+ .where(decidim_stratified_sortitions_sample_participant_id: sample_candidates_ids)
+ .select(:decidim_stratified_sortitions_sample_participant_id,
+ :decidim_stratified_sortitions_stratum_id,
+ :decidim_stratified_sortitions_substratum_id)
+ .distinct
+ .to_a
+ end
+
+ def group_by_stratum(sample_candidates_stratum)
+ sample_candidates_stratum.group_by(&:decidim_stratified_sortitions_stratum_id)
+ end
+
+ def group_by_stratum_and_substratum(sample_candidates_stratum)
+ sample_candidates_stratum.group_by do |s|
+ [s.decidim_stratified_sortitions_stratum_id, s.decidim_stratified_sortitions_substratum_id]
+ end
+ end
+
+ def build_stratum_chart(stratum, by_stratum, by_stratum_and_substratum)
+ substrata = stratum.substrata
+ total = by_stratum[stratum.id]&.map(&:decidim_stratified_sortitions_sample_participant_id)&.uniq&.count || 0
+ chart_data = substrata.map do |substratum|
+ build_substratum_chart_row(stratum, substratum, by_stratum_and_substratum, total)
+ end
+ chart_data = chart_data.reject { |_name, value| value.zero? }
+ { stratum:, chart_data: }
+ end
+
+ def build_substratum_chart_row(stratum, substratum, by_stratum_and_substratum, total)
+ ids = (by_stratum_and_substratum[[stratum.id, substratum.id]] || [])
+ .map(&:decidim_stratified_sortitions_sample_participant_id).uniq
+ count = ids.count
+ percentage = total.positive? ? ((count.to_f / total) * 100).round(1) : 0.0
+ label = "#{translated_attribute(substratum.name)} (#{percentage}%)"
+ [label, count]
+ end
end
end
end
diff --git a/app/packs/stylesheets/decidim/stratified_sortitions/admin/stratified_sortitions.scss b/app/packs/stylesheets/decidim/stratified_sortitions/admin/stratified_sortitions.scss
index eb5b94c..481cc96 100644
--- a/app/packs/stylesheets/decidim/stratified_sortitions/admin/stratified_sortitions.scss
+++ b/app/packs/stylesheets/decidim/stratified_sortitions/admin/stratified_sortitions.scss
@@ -30,10 +30,8 @@
.chart-row {
display: flex;
- gap: 4em;
margin-top: 1em;
- flex-wrap: wrap;
- justify-content: start;
+ justify-content: space-around;
}
.chart-col {
@@ -42,12 +40,24 @@
max-width: 450px;
display: flex;
flex-direction: column;
+ margin-top: 1em;
}
.chart-place {
max-width: 380px;
}
+.charts-column {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.target {
+ border-right: 1px solid #6B7280CC;
+}
+
@media (max-width: 900px) {
.chart-row {
gap: 2em;
diff --git a/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_strata_charts.html.erb b/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_strata_charts.html.erb
new file mode 100644
index 0000000..0a0db3f
--- /dev/null
+++ b/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_strata_charts.html.erb
@@ -0,0 +1,19 @@
+
+
+ <%= local_assigns[:title] || "" %>
+
+
+<% (strata_data || []).each do |stratum_data| %>
+
+ <%= t('decidim.stratified_sortitions.admin.stratified_sortitions.upload_sample.no_data') %> +
+ <% end %> +<%= t('.no_data') %>
- <% end %> -