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,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddExecutionErrorToStratifiedSortitions < ActiveRecord::Migration[7.0]
4
+ def up
5
+ add_column :decidim_stratified_sortitions_stratified_sortitions, :execution_error, :text
6
+ end
7
+
8
+ def down
9
+ remove_column :decidim_stratified_sortitions_stratified_sortitions, :execution_error
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module StratifiedSortitions
5
+ # This module contains all the domain logic associated to Decidim's StratifiedSortitions
6
+ # component admin panel.
7
+ module Admin
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "chartkick"
4
+
5
+ module Decidim
6
+ module StratifiedSortitions
7
+ # This is the engine that runs on the administration interface of `decidim_stratified_sortitions`.
8
+ # It mostly handles rendering the created projects associated to a participatory
9
+ # process.
10
+ class AdminEngine < ::Rails::Engine
11
+ isolate_namespace Decidim::StratifiedSortitions::Admin
12
+
13
+ paths["db/migrate"] = nil
14
+ paths["lib/tasks"] = nil
15
+
16
+ routes do
17
+ resources :stratified_sortitions do
18
+ post :duplicate, on: :member
19
+ get :upload_sample, on: :member
20
+ post :process_sample, on: :member
21
+ get :execute, on: :member
22
+ post :execute_stratified_sortition, on: :member
23
+ post :export_results, on: :member
24
+ post :export_charts_pdf, on: :member
25
+ post :log_view_participants, on: :member
26
+ end
27
+
28
+ resources :samples, only: [:show, :create] do
29
+ collection do
30
+ get :download_template
31
+ delete :remove_multiple
32
+ end
33
+ end
34
+
35
+ root to: "stratified_sortitions#index"
36
+ end
37
+
38
+ initializer "decidim_sstratified_sortitions_admin.mount_routes" do |_app|
39
+ Decidim::Core::Engine.routes do
40
+ mount Decidim::StratifiedSortitions::AdminEngine, at: "/admin", as: "decidim_admin_stratified_sortitions"
41
+ end
42
+ end
43
+
44
+ def load_seed
45
+ nil
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "decidim/components/namer"
4
+ require "decidim/stratified_sortitions/admin"
5
+ require "decidim/stratified_sortitions/engine"
6
+ require "decidim/stratified_sortitions/admin_engine"
7
+
8
+ Decidim.register_component(:stratified_sortitions) do |component|
9
+ component.engine = Decidim::StratifiedSortitions::Engine
10
+ component.stylesheet = "decidim/stratified_sortitions/stratified_sortitions"
11
+ component.admin_engine = Decidim::StratifiedSortitions::AdminEngine
12
+ component.icon = "media/images/decidim_stratified_sortitions.svg"
13
+
14
+ component.on(:before_destroy) do |instance|
15
+ Decidim::StratifiedSortitions::StratifiedSortition.where(decidim_component_id: instance.id).find_each(&:destroy!)
16
+ end
17
+
18
+ component.permissions_class_name = "Decidim::StratifiedSortitions::Permissions"
19
+
20
+ # These actions permissions can be configured in the admin panel
21
+ # component.actions = %w()
22
+
23
+ component.settings(:global) do |settings|
24
+ settings.attribute :publish_sortitions, type: :boolean, default: true
25
+ end
26
+
27
+ component.settings(:step) do |settings|
28
+ settings.attribute :announcement, type: :text, translated: true, editor: true
29
+ end
30
+
31
+ component.register_resource(:stratified_sortition) do |resource|
32
+ # Register a optional resource that can be references from other resources.
33
+ resource.model_class_name = "Decidim::StratifiedSortitions::StratifiedSortition"
34
+ resource.card = "decidim/stratified_sortitions/stratified_sortition"
35
+ resource.searchable = true
36
+ end
37
+
38
+ component.register_stat :sortitions_count, primary: true, priority: Decidim::StatsRegistry::HIGH_PRIORITY do |components, start_at, end_at|
39
+ Decidim::StratifiedSortitions::FilteredStratifiedSortitions.for(components, start_at, end_at).count
40
+ end
41
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+ require "active_support/all"
5
+ require "chartkick"
6
+
7
+ require "decidim/core"
8
+
9
+ module Decidim
10
+ module StratifiedSortitions
11
+ # Decidim's StratifiedSortitions Rails Engine.
12
+ class Engine < ::Rails::Engine
13
+ isolate_namespace Decidim::StratifiedSortitions
14
+
15
+ routes do
16
+ resources :stratified_sortitions, only: [:index, :show]
17
+ scope "/stratified_sortitions" do
18
+ root to: "stratified_sortitions#index"
19
+ end
20
+ get "/", to: redirect("stratified_sortitions", status: 301)
21
+ end
22
+
23
+ initializer "decidim_stratified_sortitions.register_icons" do
24
+ Decidim.icons.register(name: "seedling-line", icon: "seedling-line", category: "system", description: "", engine: :stratified_sortitions)
25
+ Decidim.icons.register(name: "bar-chart-box-line", icon: "bar-chart-box-line", category: "system", description: "", engine: :stratified_sortitions)
26
+ Decidim.icons.register(name: "group-line", icon: "group-line", category: "system", description: "", engine: :stratified_sortitions)
27
+ end
28
+
29
+ initializer "StratifiedSortitions.webpacker.assets_path" do
30
+ Decidim.register_assets_path File.expand_path("app/packs", root)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/components/namer"
4
+
5
+ module Decidim
6
+ module StratifiedSortitions
7
+ class Seeds
8
+ attr_reader :participatory_space
9
+
10
+ def initialize(participatory_space:)
11
+ @participatory_space = participatory_space
12
+ end
13
+
14
+ def call
15
+ Decidim::Component.create!(
16
+ name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :stratified_sortitions).i18n_name,
17
+ manifest_name: :stratified_sortitions,
18
+ published_at: Time.current,
19
+ participatory_space:
20
+ )
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/components/namer"
4
+ require "decidim/faker/localized"
5
+ require "decidim/core/test/factories"
6
+
7
+ FactoryBot.define do
8
+ # Singular alias factory expected by specs (some tests call :stratified_sortition_component)
9
+ factory :stratified_sortition_component, parent: :component do
10
+ name { Decidim::Components::Namer.new(participatory_space.organization.available_locales, :stratified_sortitions).i18n_name }
11
+ manifest_name { :stratified_sortitions }
12
+ participatory_space { association(:participatory_process, :with_steps) }
13
+ end
14
+
15
+ factory :stratified_sortition, class: "Decidim::StratifiedSortitions::StratifiedSortition" do
16
+ title { generate_localized_title }
17
+ description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { generate_localized_title } }
18
+ selection_criteria { Decidim::Faker::Localized.wrapped("<p>", "</p>") { Decidim::Faker::Localized.sentence(word_count: 4) } }
19
+ selected_profiles_description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { Decidim::Faker::Localized.sentence(word_count: 4) } }
20
+ num_candidates { rand(1..10) }
21
+ component { association(:stratified_sortition_component) }
22
+ end
23
+
24
+ factory :stratum, class: "Decidim::StratifiedSortitions::Stratum" do
25
+ sequence(:name) { |n| { en: "Stratum #{n}" } }
26
+ kind { "value" }
27
+ stratified_sortition { association(:stratified_sortition) }
28
+ end
29
+
30
+ factory :substratum, class: "Decidim::StratifiedSortitions::Substratum" do
31
+ sequence(:name) { |n| { en: "Substratum #{n}" } }
32
+ value { "A" }
33
+ range { "0-10" }
34
+ max_quota_percentage { "10" }
35
+ stratum { association(:stratum) }
36
+ end
37
+
38
+ factory :sample_import, class: "Decidim::StratifiedSortitions::SampleImport" do
39
+ stratified_sortition { association(:stratified_sortition) }
40
+ filename { "sample.csv" }
41
+ status { :processing }
42
+ total_rows { 0 }
43
+ imported_rows { 0 }
44
+ failed_rows { 0 }
45
+ import_errors { {} }
46
+ end
47
+
48
+ factory :sample_participant, class: "Decidim::StratifiedSortitions::SampleParticipant" do
49
+ sequence(:personal_data_1) { |n| "ID#{n}" }
50
+ personal_data_2 { "Data 2" }
51
+ personal_data_3 { "Data 3" }
52
+ personal_data_4 { "Data 4" }
53
+ decidim_stratified_sortition { association(:stratified_sortition) }
54
+ decidim_stratified_sortitions_sample_import { association(:sample_import) }
55
+ end
56
+
57
+ factory :sample_participant_stratum, class: "Decidim::StratifiedSortitions::SampleParticipantStratum" do
58
+ decidim_stratified_sortitions_sample_participant { association(:sample_participant) }
59
+ decidim_stratified_sortitions_stratum { association(:stratum) }
60
+ decidim_stratified_sortitions_substratum { association(:substratum) }
61
+ end
62
+
63
+ factory :panel_portfolio, class: "Decidim::StratifiedSortitions::PanelPortfolio" do
64
+ stratified_sortition { association(:stratified_sortition) }
65
+ panels { [[1, 2, 3], [4, 5, 6]] }
66
+ probabilities { [0.6, 0.4] }
67
+ selection_probabilities { { 1 => 0.6, 2 => 0.6, 3 => 0.6, 4 => 0.4, 5 => 0.4, 6 => 0.4 } }
68
+ generated_at { Time.current }
69
+ generation_time_seconds { 1.5 }
70
+ num_iterations { 10 }
71
+ convergence_achieved { true }
72
+
73
+ trait :sampled do
74
+ selected_panel_index { 0 }
75
+ selected_at { Time.current }
76
+ verification_seed { "test_seed" }
77
+ random_value_used { 0.3 }
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module StratifiedSortitions
5
+ def self.version
6
+ "0.0.1"
7
+ end
8
+
9
+ def self.decidim_version
10
+ "~> 0.29"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/stratified_sortitions/admin"
4
+ require "decidim/stratified_sortitions/engine"
5
+ require "decidim/stratified_sortitions/admin_engine"
6
+ require "decidim/stratified_sortitions/component"
7
+
8
+ module Decidim
9
+ # Base module for this engine.
10
+ module StratifiedSortitions
11
+ include ActiveSupport::Configurable
12
+
13
+ # Public setting that defines how many elements will be shown
14
+ # per page inside the administration view.
15
+ config_accessor :items_per_page do
16
+ 15
17
+ end
18
+
19
+ config_accessor :leximin_algorithm do
20
+ "https://www.nature.com/articles/s41586-021-03788-6"
21
+ end
22
+
23
+ def self.derive_random_seed(seed)
24
+ return nil unless seed
25
+
26
+ Digest::SHA256.hexdigest(seed).to_i(16) % (2**31)
27
+ end
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,222 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: decidim-stratified_sortitions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Oliver Valls
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-09-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: chartkick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.1.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 5.1.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: decidim-admin
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.29'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.29'
41
+ - !ruby/object:Gem::Dependency
42
+ name: decidim-core
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.29'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.29'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ruby-cbc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.3.19
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.3.19
69
+ description: To-Do
70
+ email:
71
+ - 199462+tramuntanal@users.noreply.github.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - LICENSE-AGPLv3.txt
77
+ - README.md
78
+ - Rakefile
79
+ - app/cells/decidim/stratified_sortitions/stratified_sortition_cell.rb
80
+ - app/cells/decidim/stratified_sortitions/stratified_sortition_l_cell.rb
81
+ - app/cells/decidim/stratified_sortitions/stratified_sortition_metadata_cell.rb
82
+ - app/commands/decidim/stratified_sortitions/admin/create_stratified_sortition.rb
83
+ - app/commands/decidim/stratified_sortitions/admin/destroy_stratified_sortition.rb
84
+ - app/commands/decidim/stratified_sortitions/admin/duplicate_stratified_sortition.rb
85
+ - app/commands/decidim/stratified_sortitions/admin/import_sample.rb
86
+ - app/commands/decidim/stratified_sortitions/admin/remove_uploaded_samples.rb
87
+ - app/commands/decidim/stratified_sortitions/admin/update_stratified_sortition.rb
88
+ - app/controllers/concerns/decidim/stratified_sortitions/orderable_stratified_sortitions.rb
89
+ - app/controllers/concerns/decidim/stratified_sortitions/strata_charts_data.rb
90
+ - app/controllers/decidim/stratified_sortitions/admin/application_controller.rb
91
+ - app/controllers/decidim/stratified_sortitions/admin/samples_controller.rb
92
+ - app/controllers/decidim/stratified_sortitions/admin/stratified_sortitions_controller.rb
93
+ - app/controllers/decidim/stratified_sortitions/application_controller.rb
94
+ - app/controllers/decidim/stratified_sortitions/charts_pdf_controller_helper.rb
95
+ - app/controllers/decidim/stratified_sortitions/stratified_sortitions_controller.rb
96
+ - app/forms/decidim/stratified_sortitions/admin/sample_upload_form.rb
97
+ - app/forms/decidim/stratified_sortitions/admin/stratified_sortitions_form.rb
98
+ - app/forms/decidim/stratified_sortitions/admin/stratum_form.rb
99
+ - app/forms/decidim/stratified_sortitions/admin/substratum_form.rb
100
+ - app/helpers/decidim/stratified_sortitions/admin/stratified_sortitions_helper.rb
101
+ - app/helpers/decidim/stratified_sortitions/application_helper.rb
102
+ - app/helpers/decidim/stratified_sortitions/charts_pdf_helper.rb
103
+ - app/helpers/decidim/stratified_sortitions/stratified_sortition_cells_helper.rb
104
+ - app/javascript/channels/sample_import_progress.js
105
+ - app/jobs/decidim/stratified_sortitions/admin/execute_sortition_job.rb
106
+ - app/jobs/decidim/stratified_sortitions/admin/import_sample_job.rb
107
+ - app/jobs/decidim/stratified_sortitions/admin/remove_samples_job.rb
108
+ - app/jobs/decidim/stratified_sortitions/admin/sortition_results_export_job.rb
109
+ - app/mailers/decidim/stratified_sortitions/admin/import_mailer.rb
110
+ - app/models/decidim/stratified_sortitions/application_record.rb
111
+ - app/models/decidim/stratified_sortitions/panel_portfolio.rb
112
+ - app/models/decidim/stratified_sortitions/sample_import.rb
113
+ - app/models/decidim/stratified_sortitions/sample_participant.rb
114
+ - app/models/decidim/stratified_sortitions/sample_participant_stratum.rb
115
+ - app/models/decidim/stratified_sortitions/stratified_sortition.rb
116
+ - app/models/decidim/stratified_sortitions/stratum.rb
117
+ - app/models/decidim/stratified_sortitions/substratum.rb
118
+ - app/packs/entrypoints/decidim_stratified_sortitions.js
119
+ - app/packs/entrypoints/decidim_stratified_sortitions_admin.js
120
+ - app/packs/entrypoints/decidim_stratified_sortitions_admin.scss
121
+ - app/packs/images/decidim/stratified_sortitions/icon.svg
122
+ - app/packs/src/decidim/stratified_sortitions/application.js
123
+ - app/packs/src/decidim/stratified_sortitions/results_tabs.js
124
+ - app/packs/src/decidim/stratified_sortitions/stratum_fields.js
125
+ - app/packs/src/decidim/stratified_sortitions/substratum_fields.js
126
+ - app/packs/src/decidim/stratified_sortitions/upload_sample.js
127
+ - app/packs/stylesheets/decidim/stratified_sortitions/admin/stratified_sortitions.scss
128
+ - app/packs/stylesheets/decidim/stratified_sortitions/charts_pdf.scss
129
+ - app/packs/stylesheets/stratified_sortitions.scss
130
+ - app/permissions/decidim/stratified_sortitions/admin/permissions.rb
131
+ - app/permissions/decidim/stratified_sortitions/permissions.rb
132
+ - app/presenters/decidim/stratified_sortitions/admin_log/stratified_sortition_presenter.rb
133
+ - app/queries/decidim/stratified_sortitions/filtered_stratified_sortitions.rb
134
+ - app/serializers/decidim/stratified_sortitions/sortition_result_serializer.rb
135
+ - app/services/decidim/stratified_sortitions/charts_pdf_generator.rb
136
+ - app/services/decidim/stratified_sortitions/fair_sortition_service.rb
137
+ - app/services/decidim/stratified_sortitions/leximin/constraint_builder.rb
138
+ - app/services/decidim/stratified_sortitions/leximin/distribution_solver.rb
139
+ - app/services/decidim/stratified_sortitions/leximin/feasibility_checker.rb
140
+ - app/services/decidim/stratified_sortitions/leximin/panel_generator.rb
141
+ - app/services/decidim/stratified_sortitions/leximin/panel_sampler.rb
142
+ - app/services/decidim/stratified_sortitions/leximin_selector.rb
143
+ - app/services/decidim/stratified_sortitions/sortition_results_exporter.rb
144
+ - app/views/decidim/admin/components/index.html.erb
145
+ - app/views/decidim/stratified_sortitions/admin/import_mailer/import.html.erb
146
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_confirm_execute_modal.html.erb
147
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_confirm_participants_modal.html.erb
148
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_form.html.erb
149
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_navigation_menu.html.erb
150
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_strata.html.erb
151
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_stratum.html.erb
152
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_substrata.html.erb
153
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_substratum.html.erb
154
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/edit.html.erb
155
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/execute.html.erb
156
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/export_charts_pdf.html.erb
157
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/index.html.erb
158
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/new.html.erb
159
+ - app/views/decidim/stratified_sortitions/admin/stratified_sortitions/upload_sample.html.erb
160
+ - app/views/decidim/stratified_sortitions/shared/_strata_charts.html.erb
161
+ - app/views/decidim/stratified_sortitions/stratified_sortitions/_results_count.html.erb
162
+ - app/views/decidim/stratified_sortitions/stratified_sortitions/_stratified_sortition.html.erb
163
+ - app/views/decidim/stratified_sortitions/stratified_sortitions/_stratified_sortitions.html.erb
164
+ - app/views/decidim/stratified_sortitions/stratified_sortitions/_tags.html.erb
165
+ - app/views/decidim/stratified_sortitions/stratified_sortitions/index.html.erb
166
+ - app/views/decidim/stratified_sortitions/stratified_sortitions/index.js.erb
167
+ - app/views/decidim/stratified_sortitions/stratified_sortitions/show.html.erb
168
+ - app/views/layouts/decidim/admin/_sidebar_menu.html.erb
169
+ - app/views/layouts/decidim/stratified_sortitions/charts_pdf.html.erb
170
+ - config/assets.rb
171
+ - config/locales/ca.yml
172
+ - config/locales/en.yml
173
+ - config/locales/es.yml
174
+ - config/locales/oc.yml
175
+ - config/routes.rb
176
+ - db/migrate/20251023103900_create_decidim_stratified_sortitions_stratified_sortitions.rb
177
+ - db/migrate/20251104120000_create_stratified_sortitions_strata_and_substrata.decidim_stratified_sortitions.rb
178
+ - db/migrate/20251219120000_create_sample_imports.rb
179
+ - db/migrate/20251219120100_create_sample_participants.rb
180
+ - db/migrate/20251219120200_create_sample_participant_strata.rb
181
+ - db/migrate/20251230130000_change_value_to_text_in_substrata.rb
182
+ - db/migrate/20260102114744_add_status_to_stratified_sortitions.rb
183
+ - db/migrate/20260109105643_allow_null_value_in_substrata.rb
184
+ - db/migrate/20260113121726_add_position_to_strata_and_substrata.rb
185
+ - db/migrate/20260127100000_rename_weighing_to_max_quota_percentage.rb
186
+ - db/migrate/20260127120000_create_panel_portfolios.rb
187
+ - db/migrate/20260518000000_add_foreign_key_to_stratified_sortitions_component.rb
188
+ - db/migrate/20260521000000_add_cascade_to_stratified_sortitions_foreign_keys.rb
189
+ - db/migrate/20260616000000_add_execution_error_to_stratified_sortitions.rb
190
+ - lib/decidim/stratified_sortitions.rb
191
+ - lib/decidim/stratified_sortitions/admin.rb
192
+ - lib/decidim/stratified_sortitions/admin_engine.rb
193
+ - lib/decidim/stratified_sortitions/component.rb
194
+ - lib/decidim/stratified_sortitions/engine.rb
195
+ - lib/decidim/stratified_sortitions/seeds.rb
196
+ - lib/decidim/stratified_sortitions/test/factories.rb
197
+ - lib/decidim/stratified_sortitions/version.rb
198
+ homepage: https://github.com/gencat/decidim-module-stratified_sortitions
199
+ licenses:
200
+ - AGPL-3.0
201
+ metadata:
202
+ rubygems_mfa_required: 'true'
203
+ post_install_message:
204
+ rdoc_options: []
205
+ require_paths:
206
+ - lib
207
+ required_ruby_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: 3.1.1
212
+ required_rubygems_version: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ requirements: []
218
+ rubygems_version: 3.4.19
219
+ signing_key:
220
+ specification_version: 4
221
+ summary: A decidim stratified sortitions module
222
+ test_files: []