Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<span>
<h1 class="item_show__header-title">
<%= local_assigns[:title] || "" %>
</h1>
</span>
<% (strata_data || []).each do |stratum_data| %>
<div class="column chart-col">
<b><%= translated_attribute(stratum_data[:stratum].name).upcase %></b>
<% if stratum_data[:chart_data].present? %>
<%= pie_chart stratum_data[:chart_data],
legend: "bottom",
donut: false %>
<% else %>
<p class="text-muted">
<%= t('decidim.stratified_sortitions.admin.stratified_sortitions.upload_sample.no_data') %>
</p>
<% end %>
</div>
<% end %>
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
<div class="row mt-4">
<%= form_tag samples_path(id: @stratified_sortition.id), multipart: true, class: 'form' do %>
<div class="flex">

<%= file_field_tag :file, id: 'sample-file-input' %>

<% if @stratified_sortition.strata_and_substrata_configured? %>
Expand Down Expand Up @@ -61,25 +60,13 @@
</div>
</div>
<div class="mt-4 mb-4">
<span>
<h1 class="item_show__header-title">
<%= t(".target") %>
</h1>
</span>
<div class="row chart-row">
<% @strata_data.each do |stratum_data| %>
<div class="column chart-col">
<b><%= translated_attribute(stratum_data[:stratum].name).upcase %></b>
<% if stratum_data[:chart_data].present? %>
<%= pie_chart stratum_data[:chart_data],
legend: "bottom",
donut: false
%>
<% else %>
<p class="text-muted"><%= t('.no_data') %></p>
<% end %>
</div>
<% end %>
<div class="col-md-6 charts-column target">
<%= render partial: "strata_charts", locals: { strata_data: @strata_data, title: t(".target") } %>
</div>
<div class="col-md-6 charts-column">
<%= render partial: "strata_charts", locals: { strata_data: @candidates_data, title: t(".candidates") } %>
</div>
</div>
<div class="mt-16 census_file_type">
<span>
Expand Down
1 change: 1 addition & 0 deletions config/locales/ca.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ ca:
success: Sorteig estratificat actualitzat amb èxit
upload_sample:
age: Grup d'edat
candidates: Candidats
census_file: Triar un fitxer
census_file_label: Arxiu excel.csv amb les dades del cens
configure_strata_first: Primer has de configurar els estrats i subestrats
Expand Down
1 change: 1 addition & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ en:
success: Stratified sortition successfully updated
upload_sample:
age: Age group
candidates: Candidates
census_file: Choose a file
census_file_label: Excel.csv file with census data
configure_strata_first: You must configure strata and substrata first
Expand Down
1 change: 1 addition & 0 deletions config/locales/es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ es:
success: Sorteo estratificado actualizado con éxito
upload_sample:
age: Grupo de edad
candidates: Candidatos
census_file: Elegir un archivo
census_file_label: Archivo excel.csv con los datos del censo
configure_strata_first: Primero debes configurar los estratos y subestratos
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,58 @@ module Admin
end
end
end

describe "upload_sample" do
let(:stratified_sortition) { create(:stratified_sortition) }
let(:params) do
{
participatory_process_slug: component.participatory_space.slug,
id: stratified_sortition.id,
}
end

before do
stratum_1 = create(:stratum, stratified_sortition:, kind: "value", name: { ca: "Gènere", es: "Género", en: "Gender" })
substratum_1 = create(:substratum, stratum: stratum_1, name: { ca: "Home", es: "Hombre", en: "Man" }, value: "H", weighing: "50")
substratum_2 = create(:substratum, stratum: stratum_1, name: { ca: "Dona", es: "Mujer", en: "Woman" }, value: "D", weighing: "50")

sample_import = create(:sample_import, stratified_sortition:)
participant_1 = create(:sample_participant, decidim_stratified_sortition: stratified_sortition, decidim_stratified_sortitions_sample_import: sample_import)
participant_2 = create(:sample_participant, decidim_stratified_sortition: stratified_sortition, decidim_stratified_sortitions_sample_import: sample_import)

create(:sample_participant_stratum, decidim_stratified_sortitions_sample_participant: participant_1, decidim_stratified_sortitions_stratum: stratum_1, decidim_stratified_sortitions_substratum: substratum_1)
create(:sample_participant_stratum, decidim_stratified_sortitions_sample_participant: participant_2, decidim_stratified_sortitions_stratum: stratum_1, decidim_stratified_sortitions_substratum: substratum_2)
end

it "renders the upload_sample template" do
get(:upload_sample, params:)
expect(response).to render_template(:upload_sample)
end

it "assigns @stratified_sortition" do
get(:upload_sample, params:)
expect(assigns(:stratified_sortition)).to eq(stratified_sortition)
end

it "assigns @sample_participants_count" do
get(:upload_sample, params:)
expect(assigns(:sample_participants_count)).to eq(stratified_sortition.sample_participants.count)
end

it "assigns @strata_data and @candidates_data" do
get(:upload_sample, params:)
expect(assigns(:strata_data)).to be_an(Array)
expect(assigns(:candidates_data)).to be_an(Array)
expect(assigns(:strata_data).first[:stratum]).to be_present
expect(assigns(:candidates_data).first[:stratum]).to be_present
end

it "@candidates_data refleja los datos importados" do
get(:upload_sample, params:)
imported = assigns(:candidates_data).first[:chart_data].map(&:last)
expect(imported.sum).to eq(stratified_sortition.sample_participants.count)
end
end
end
end
end
Expand Down
Loading