decidim-budgets 0.30.3 → 0.31.0.rc2
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.
- checksums.yaml +4 -4
 - data/app/cells/decidim/budgets/budget_list_item/show.erb +19 -9
 - data/app/cells/decidim/budgets/budget_list_item/vote_action.erb +2 -2
 - data/app/cells/decidim/budgets/budget_list_item_cell.rb +44 -10
 - data/app/cells/decidim/budgets/budgets_list/card_list.erb +0 -2
 - data/app/cells/decidim/budgets/budgets_list/main_list.erb +2 -2
 - data/app/cells/decidim/budgets/budgets_list/show.erb +3 -3
 - data/app/cells/decidim/budgets/budgets_list/voted.erb +12 -10
 - data/app/cells/decidim/budgets/budgets_list_cell.rb +22 -0
 - data/app/cells/decidim/budgets/project_budget_amount_cell.rb +14 -0
 - data/app/cells/decidim/budgets/project_l/extra_data.erb +8 -2
 - data/app/cells/decidim/budgets/project_l/metadata.erb +1 -1
 - data/app/cells/decidim/budgets/project_l_cell.rb +2 -4
 - data/app/cells/decidim/budgets/project_metadata_cell.rb +15 -19
 - data/app/cells/decidim/budgets/project_selected_status_cell.rb +1 -11
 - data/app/cells/decidim/budgets/project_vote_button/show.erb +5 -5
 - data/app/cells/decidim/budgets/project_vote_button_cell.rb +14 -9
 - data/app/cells/decidim/budgets/project_votes_count_cell.rb +8 -14
 - data/app/commands/decidim/budgets/cancel_order.rb +5 -0
 - data/app/controllers/decidim/budgets/admin/budgets_controller.rb +2 -2
 - data/app/controllers/decidim/budgets/admin/projects_controller.rb +2 -2
 - data/app/controllers/decidim/budgets/admin/proposals_imports_controller.rb +1 -1
 - data/app/controllers/decidim/budgets/application_controller.rb +13 -1
 - data/app/controllers/decidim/budgets/budgets_controller.rb +1 -3
 - data/app/controllers/decidim/budgets/line_items_controller.rb +19 -0
 - data/app/controllers/decidim/budgets/orders_controller.rb +20 -0
 - data/app/controllers/decidim/budgets/projects_controller.rb +3 -1
 - data/app/forms/decidim/budgets/admin/component_form.rb +4 -30
 - data/app/helpers/decidim/budgets/application_helper.rb +1 -0
 - data/app/helpers/decidim/budgets/projects_helper.rb +11 -7
 - data/app/models/decidim/budgets/order.rb +2 -2
 - data/app/packs/entrypoints/decidim_budgets.js +1 -0
 - data/app/packs/src/decidim/budgets/admin/projects.js +2 -2
 - data/app/packs/src/decidim/budgets/budgetSummaryBackdrop.js +41 -0
 - data/app/packs/src/decidim/budgets/exit_handler.js +7 -2
 - data/app/packs/src/decidim/budgets/progressFixed.js +1 -1
 - data/app/packs/src/decidim/budgets/projects.js +1 -1
 - data/app/packs/stylesheets/budgets.scss +57 -37
 - data/app/permissions/decidim/budgets/permissions.rb +17 -13
 - data/app/presenters/decidim/budgets/project_presenter.rb +2 -4
 - data/app/views/decidim/budgets/admin/budgets/_actions.html.erb +65 -18
 - data/app/views/decidim/budgets/admin/budgets/_budget-tr.html.erb +4 -4
 - data/app/views/decidim/budgets/admin/budgets/_form.html.erb +1 -1
 - data/app/views/decidim/budgets/admin/budgets/index.html.erb +14 -11
 - data/app/views/decidim/budgets/admin/budgets/manage_trash.html.erb +2 -1
 - data/app/views/decidim/budgets/admin/projects/_actions.html.erb +66 -22
 - data/app/views/decidim/budgets/admin/projects/_bulk-actions.html.erb +15 -17
 - data/app/views/decidim/budgets/admin/projects/_form.html.erb +1 -1
 - data/app/views/decidim/budgets/admin/projects/_project-tr.html.erb +7 -7
 - data/app/views/decidim/budgets/admin/projects/bulk_actions/_dropdown.html.erb +23 -30
 - data/app/views/decidim/budgets/admin/projects/index.html.erb +2 -2
 - data/app/views/decidim/budgets/admin/projects/manage_trash.html.erb +2 -1
 - data/app/views/decidim/budgets/line_items/update_budget.js.erb +6 -5
 - data/app/views/decidim/budgets/orders/status.html.erb +30 -30
 - data/app/views/decidim/budgets/projects/_addition_selector.html.erb +1 -1
 - data/app/views/decidim/budgets/projects/_budget_summary.html.erb +5 -1
 - data/app/views/decidim/budgets/projects/_exit_modal.html.erb +1 -1
 - data/app/views/decidim/budgets/projects/_project.html.erb +5 -1
 - data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +1 -9
 - data/app/views/decidim/budgets/projects/_projects.html.erb +3 -1
 - data/app/views/decidim/budgets/projects/index.html.erb +28 -6
 - data/app/views/decidim/budgets/projects/order_progress_summary/_content.html.erb +30 -0
 - data/app/views/decidim/budgets/projects/order_progress_summary/_content_responsive.html.erb +56 -0
 - data/app/views/decidim/budgets/projects/order_progress_summary/_progress_box.html.erb +43 -0
 - data/app/views/decidim/budgets/projects/order_progress_summary/_progress_box_buttons.html.erb +12 -0
 - data/app/views/decidim/budgets/projects/order_progress_summary/_progress_box_sticky.html.erb +25 -0
 - data/app/views/decidim/budgets/projects/show.html.erb +30 -17
 - data/config/assets.rb +2 -2
 - data/config/locales/ar.yml +0 -8
 - data/config/locales/bg.yml +2 -18
 - data/config/locales/ca-IT.yml +26 -14
 - data/config/locales/ca.yml +26 -14
 - data/config/locales/cs.yml +21 -18
 - data/config/locales/de.yml +26 -14
 - data/config/locales/el.yml +0 -7
 - data/config/locales/en.yml +26 -14
 - data/config/locales/es-MX.yml +26 -14
 - data/config/locales/es-PY.yml +26 -14
 - data/config/locales/es.yml +25 -13
 - data/config/locales/eu.yml +26 -14
 - data/config/locales/fi-plain.yml +26 -14
 - data/config/locales/fi.yml +26 -14
 - data/config/locales/fr-CA.yml +26 -14
 - data/config/locales/fr.yml +26 -14
 - data/config/locales/ga-IE.yml +0 -5
 - data/config/locales/gl.yml +0 -7
 - data/config/locales/hu.yml +2 -18
 - data/config/locales/id-ID.yml +0 -7
 - data/config/locales/is-IS.yml +0 -6
 - data/config/locales/it.yml +0 -7
 - data/config/locales/ja.yml +26 -14
 - data/config/locales/kaa.yml +0 -1
 - data/config/locales/ko.yml +0 -5
 - data/config/locales/lb.yml +0 -7
 - data/config/locales/lt.yml +2 -18
 - data/config/locales/lv.yml +0 -7
 - data/config/locales/nl.yml +0 -7
 - data/config/locales/no.yml +0 -7
 - data/config/locales/pl.yml +2 -18
 - data/config/locales/pt-BR.yml +2 -18
 - data/config/locales/pt.yml +0 -7
 - data/config/locales/ro-RO.yml +7 -7
 - data/config/locales/ru.yml +0 -7
 - data/config/locales/sk.yml +0 -7
 - data/config/locales/sq-AL.yml +0 -3
 - data/config/locales/sv.yml +25 -13
 - data/config/locales/tr-TR.yml +0 -8
 - data/config/locales/uk.yml +0 -7
 - data/config/locales/zh-CN.yml +0 -8
 - data/config/locales/zh-TW.yml +0 -7
 - data/db/migrate/20250912110212_move_voting_rules_to_radio_buttons.rb +22 -0
 - data/lib/decidim/api/budget_type.rb +7 -0
 - data/lib/decidim/api/project_type.rb +29 -1
 - data/lib/decidim/budgets/budget_order_pdf.rb +73 -0
 - data/lib/decidim/budgets/component.rb +26 -13
 - data/lib/decidim/budgets/engine.rb +3 -11
 - data/lib/decidim/budgets/seeds.rb +16 -5
 - data/lib/decidim/budgets/test/factories.rb +3 -18
 - data/lib/decidim/budgets/version.rb +1 -1
 - data/lib/decidim/budgets/workflows/base.rb +0 -14
 - data/lib/decidim/budgets.rb +1 -5
 - metadata +21 -15
 - data/app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb +0 -32
 - data/app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb +0 -27
 - data/app/views/decidim/budgets/projects/_order_progress_summary_content.html.erb +0 -122
 - /data/app/views/decidim/budgets/projects/{_order_progress_progressbar_marks_right.html.erb → order_progress_summary/_progressbar_marks_right.html.erb} +0 -0
 
| 
         @@ -31,7 +31,6 @@ Decidim.register_component(:budgets) do |component| 
     | 
|
| 
       31 
31 
     | 
    
         
             
                resource.model_class_name = "Decidim::Budgets::Project"
         
     | 
| 
       32 
32 
     | 
    
         
             
                resource.template = "decidim/budgets/projects/linked_projects"
         
     | 
| 
       33 
33 
     | 
    
         
             
                resource.card = "decidim/budgets/project"
         
     | 
| 
       34 
     | 
    
         
            -
                resource.actions = %w(vote comment)
         
     | 
| 
       35 
34 
     | 
    
         
             
                resource.searchable = true
         
     | 
| 
       36 
35 
     | 
    
         
             
              end
         
     | 
| 
       37 
36 
     | 
    
         | 
| 
         @@ -39,24 +38,36 @@ Decidim.register_component(:budgets) do |component| 
     | 
|
| 
       39 
38 
     | 
    
         
             
                Decidim::Budgets::Budget.where(component: components).count
         
     | 
| 
       40 
39 
     | 
    
         
             
              end
         
     | 
| 
       41 
40 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
              component.register_stat :projects_count, 
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
      
 41 
     | 
    
         
            +
              component.register_stat :projects_count,
         
     | 
| 
      
 42 
     | 
    
         
            +
                                      priority: Decidim::StatsRegistry::MEDIUM_PRIORITY,
         
     | 
| 
      
 43 
     | 
    
         
            +
                                      sub_title: "votes",
         
     | 
| 
      
 44 
     | 
    
         
            +
                                      icon_name: "git-pull-request-line",
         
     | 
| 
      
 45 
     | 
    
         
            +
                                      tooltip_key: "projects_count_tooltip" do |components, start_at, end_at|
         
     | 
| 
       47 
46 
     | 
    
         
             
                budgets = Decidim::Budgets::Budget.where(component: components)
         
     | 
| 
      
 47 
     | 
    
         
            +
                projects = Decidim::Budgets::FilteredProjects.for(components, start_at, end_at)
         
     | 
| 
       48 
48 
     | 
    
         
             
                orders = Decidim::Budgets::Order.where(budget: budgets)
         
     | 
| 
       49 
49 
     | 
    
         
             
                orders = orders.where(created_at: start_at..) if start_at.present?
         
     | 
| 
       50 
50 
     | 
    
         
             
                orders = orders.where(created_at: ..end_at) if end_at.present?
         
     | 
| 
       51 
     | 
    
         
            -
                 
     | 
| 
      
 51 
     | 
    
         
            +
                [
         
     | 
| 
      
 52 
     | 
    
         
            +
                  projects.count,
         
     | 
| 
      
 53 
     | 
    
         
            +
                  orders.count
         
     | 
| 
      
 54 
     | 
    
         
            +
                ]
         
     | 
| 
       52 
55 
     | 
    
         
             
              end
         
     | 
| 
       53 
56 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
              component.register_stat :comments_count, 
     | 
| 
      
 57 
     | 
    
         
            +
              component.register_stat :comments_count,
         
     | 
| 
      
 58 
     | 
    
         
            +
                                      priority: Decidim::StatsRegistry::HIGH_PRIORITY,
         
     | 
| 
      
 59 
     | 
    
         
            +
                                      icon_name: "chat-1-line",
         
     | 
| 
      
 60 
     | 
    
         
            +
                                      tooltip_key: "comments_count",
         
     | 
| 
      
 61 
     | 
    
         
            +
                                      tag: :comments do |components, start_at, end_at|
         
     | 
| 
       55 
62 
     | 
    
         
             
                projects = Decidim::Budgets::FilteredProjects.for(components, start_at, end_at)
         
     | 
| 
       56 
63 
     | 
    
         
             
                projects.sum(:comments_count)
         
     | 
| 
       57 
64 
     | 
    
         
             
              end
         
     | 
| 
       58 
65 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
              component.register_stat :followers_count, 
     | 
| 
      
 66 
     | 
    
         
            +
              component.register_stat :followers_count,
         
     | 
| 
      
 67 
     | 
    
         
            +
                                      tag: :followers,
         
     | 
| 
      
 68 
     | 
    
         
            +
                                      icon_name: "user-follow-line",
         
     | 
| 
      
 69 
     | 
    
         
            +
                                      tooltip_key: "followers_count_tooltip",
         
     | 
| 
      
 70 
     | 
    
         
            +
                                      priority: Decidim::StatsRegistry::MEDIUM_PRIORITY do |components, start_at, end_at|
         
     | 
| 
       60 
71 
     | 
    
         
             
                projects_ids = Decidim::Budgets::FilteredProjects.for(components, start_at, end_at).pluck(:id)
         
     | 
| 
       61 
72 
     | 
    
         
             
                Decidim::Follow.where(decidim_followable_type: "Decidim::Budgets::Project", decidim_followable_id: projects_ids).count
         
     | 
| 
       62 
73 
     | 
    
         
             
              end
         
     | 
| 
         @@ -76,16 +87,18 @@ Decidim.register_component(:budgets) do |component| 
     | 
|
| 
       76 
87 
     | 
    
         | 
| 
       77 
88 
     | 
    
         
             
              component.settings(:global) do |settings|
         
     | 
| 
       78 
89 
     | 
    
         
             
                settings.attribute :taxonomy_filters, type: :taxonomy_filters
         
     | 
| 
       79 
     | 
    
         
            -
                settings.attribute :workflow, type: :enum, default: "one", choices: -> { Decidim::Budgets.workflows.keys.map(&:to_s) }
         
     | 
| 
      
 90 
     | 
    
         
            +
                settings.attribute :workflow, type: :enum, default: "one", choices: ->(_context) { Decidim::Budgets.workflows.keys.map(&:to_s) }
         
     | 
| 
       80 
91 
     | 
    
         
             
                settings.attribute :projects_per_page, type: :integer, default: 12
         
     | 
| 
       81 
     | 
    
         
            -
                settings.attribute : 
     | 
| 
      
 92 
     | 
    
         
            +
                settings.attribute :voting_rule, type: :enum, default: "threshold_percent", choices: %w(threshold_percent minimum_projects selected_projects)
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
       82 
94 
     | 
    
         
             
                settings.attribute :vote_threshold_percent, type: :integer, default: 70
         
     | 
| 
       83 
95 
     | 
    
         
             
                settings.attribute :vote_threshold_percent, type: :integer, default: 70
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
       85 
97 
     | 
    
         
             
                settings.attribute :vote_minimum_budget_projects_number, type: :integer, default: 1
         
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
       87 
99 
     | 
    
         
             
                settings.attribute :vote_selected_projects_minimum, type: :integer, default: 0
         
     | 
| 
       88 
100 
     | 
    
         
             
                settings.attribute :vote_selected_projects_maximum, type: :integer, default: 1
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
       89 
102 
     | 
    
         
             
                settings.attribute :comments_enabled, type: :boolean, default: true
         
     | 
| 
       90 
103 
     | 
    
         
             
                settings.attribute :comments_max_length, type: :integer, required: true
         
     | 
| 
       91 
104 
     | 
    
         
             
                settings.attribute :geocoding_enabled, type: :boolean, default: false
         
     | 
| 
         @@ -17,6 +17,7 @@ module Decidim 
     | 
|
| 
       17 
17 
     | 
    
         
             
                        member do
         
     | 
| 
       18 
18 
     | 
    
         
             
                          post :checkout
         
     | 
| 
       19 
19 
     | 
    
         
             
                          get :status
         
     | 
| 
      
 20 
     | 
    
         
            +
                          get :export_pdf
         
     | 
| 
       20 
21 
     | 
    
         
             
                        end
         
     | 
| 
       21 
22 
     | 
    
         
             
                        resource :line_item, only: [:create, :destroy]
         
     | 
| 
       22 
23 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -33,6 +34,7 @@ module Decidim 
     | 
|
| 
       33 
34 
     | 
    
         
             
                    Decidim.icons.register(name: "Decidim::Budgets::Order", icon: "check-double-fill", description: "Budget voting", category: "activity", engine: :budgets)
         
     | 
| 
       34 
35 
     | 
    
         | 
| 
       35 
36 
     | 
    
         
             
                    Decidim.icons.register(name: "git-pull-request-line", icon: "git-pull-request-line", category: "system", description: "", engine: :budgets)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    Decidim.icons.register(name: "progress-2-line", icon: "progress-2-line", category: "system", description: "", engine: :budgets)
         
     | 
| 
       36 
38 
     | 
    
         
             
                  end
         
     | 
| 
       37 
39 
     | 
    
         | 
| 
       38 
40 
     | 
    
         
             
                  initializer "decidim_budgets.add_cells_view_paths" do
         
     | 
| 
         @@ -40,17 +42,7 @@ module Decidim 
     | 
|
| 
       40 
42 
     | 
    
         
             
                    Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Budgets::Engine.root}/app/views") # for partials
         
     | 
| 
       41 
43 
     | 
    
         
             
                  end
         
     | 
| 
       42 
44 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
                  initializer "decidim_budgets. 
     | 
| 
       44 
     | 
    
         
            -
                    Decidim.metrics_operation.register(:participants, :budgets) do |metric_operation|
         
     | 
| 
       45 
     | 
    
         
            -
                      metric_operation.manager_class = "Decidim::Budgets::Metrics::BudgetParticipantsMetricMeasure"
         
     | 
| 
       46 
     | 
    
         
            -
                    end
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
                    Decidim.metrics_operation.register(:followers, :budgets) do |metric_operation|
         
     | 
| 
       49 
     | 
    
         
            -
                      metric_operation.manager_class = "Decidim::Budgets::Metrics::BudgetFollowersMetricMeasure"
         
     | 
| 
       50 
     | 
    
         
            -
                    end
         
     | 
| 
       51 
     | 
    
         
            -
                  end
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
                  initializer "decidim_budgets.webpacker.assets_path" do
         
     | 
| 
      
 45 
     | 
    
         
            +
                  initializer "decidim_budgets.shakapacker.assets_path" do
         
     | 
| 
       54 
46 
     | 
    
         
             
                    Decidim.register_assets_path File.expand_path("app/packs", root)
         
     | 
| 
       55 
47 
     | 
    
         
             
                  end
         
     | 
| 
       56 
48 
     | 
    
         | 
| 
         @@ -15,12 +15,12 @@ module Decidim 
     | 
|
| 
       15 
15 
     | 
    
         
             
                  def call
         
     | 
| 
       16 
16 
     | 
    
         
             
                    component = create_component!
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
                     
     | 
| 
      
 18 
     | 
    
         
            +
                    number_of_records.times do
         
     | 
| 
       19 
19 
     | 
    
         
             
                      create_budget!(component:)
         
     | 
| 
       20 
20 
     | 
    
         
             
                    end
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
                    Decidim::Budgets::Budget.where(component:).each do |budget|
         
     | 
| 
       23 
     | 
    
         
            -
                       
     | 
| 
      
 23 
     | 
    
         
            +
                      number_of_records.times do
         
     | 
| 
       24 
24 
     | 
    
         
             
                        project = create_project!(budget:)
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
                        create_attachments!(attached_to: project)
         
     | 
| 
         @@ -37,6 +37,14 @@ module Decidim 
     | 
|
| 
       37 
37 
     | 
    
         
             
                        "<p>#{::Faker::Lorem.paragraph}</p>"
         
     | 
| 
       38 
38 
     | 
    
         
             
                    end
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
      
 40 
     | 
    
         
            +
                    step_settings = if participatory_space.allows_steps?
         
     | 
| 
      
 41 
     | 
    
         
            +
                                      { participatory_space.active_step.id => {
         
     | 
| 
      
 42 
     | 
    
         
            +
                                        votes: %w(enabled disabled finished).sample
         
     | 
| 
      
 43 
     | 
    
         
            +
                                      } }
         
     | 
| 
      
 44 
     | 
    
         
            +
                                    else
         
     | 
| 
      
 45 
     | 
    
         
            +
                                      {}
         
     | 
| 
      
 46 
     | 
    
         
            +
                                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       40 
48 
     | 
    
         
             
                    params = {
         
     | 
| 
       41 
49 
     | 
    
         
             
                      name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :budgets).i18n_name,
         
     | 
| 
       42 
50 
     | 
    
         
             
                      manifest_name: :budgets,
         
     | 
| 
         @@ -47,7 +55,8 @@ module Decidim 
     | 
|
| 
       47 
55 
     | 
    
         
             
                        landing_page_content:,
         
     | 
| 
       48 
56 
     | 
    
         
             
                        more_information_modal: Decidim::Faker::Localized.paragraph(sentence_count: 4),
         
     | 
| 
       49 
57 
     | 
    
         
             
                        workflow: Decidim::Budgets.workflows.keys.sample
         
     | 
| 
       50 
     | 
    
         
            -
                      }
         
     | 
| 
      
 58 
     | 
    
         
            +
                      },
         
     | 
| 
      
 59 
     | 
    
         
            +
                      step_settings:
         
     | 
| 
       51 
60 
     | 
    
         
             
                    }
         
     | 
| 
       52 
61 
     | 
    
         | 
| 
       53 
62 
     | 
    
         
             
                    Decidim.traceability.perform_action!(
         
     | 
| 
         @@ -72,19 +81,21 @@ module Decidim 
     | 
|
| 
       72 
81 
     | 
    
         
             
                        description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
         
     | 
| 
       73 
82 
     | 
    
         
             
                          Decidim::Faker::Localized.paragraph(sentence_count: 3)
         
     | 
| 
       74 
83 
     | 
    
         
             
                        end,
         
     | 
| 
       75 
     | 
    
         
            -
                        total_budget: ::Faker::Number.number(digits:  
     | 
| 
      
 84 
     | 
    
         
            +
                        total_budget: ::Faker::Number.number(digits: 7)
         
     | 
| 
       76 
85 
     | 
    
         
             
                      )
         
     | 
| 
       77 
86 
     | 
    
         
             
                    end
         
     | 
| 
       78 
87 
     | 
    
         
             
                  end
         
     | 
| 
       79 
88 
     | 
    
         | 
| 
       80 
89 
     | 
    
         
             
                  def create_project!(budget:)
         
     | 
| 
      
 90 
     | 
    
         
            +
                    minimum_amount = Integer(budget.total_budget * 0.1)
         
     | 
| 
      
 91 
     | 
    
         
            +
                    maximum_amount = Integer(budget.total_budget * 0.5)
         
     | 
| 
       81 
92 
     | 
    
         
             
                    params = {
         
     | 
| 
       82 
93 
     | 
    
         
             
                      budget:,
         
     | 
| 
       83 
94 
     | 
    
         
             
                      title: Decidim::Faker::Localized.sentence(word_count: 2),
         
     | 
| 
       84 
95 
     | 
    
         
             
                      description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
         
     | 
| 
       85 
96 
     | 
    
         
             
                        Decidim::Faker::Localized.paragraph(sentence_count: 3)
         
     | 
| 
       86 
97 
     | 
    
         
             
                      end,
         
     | 
| 
       87 
     | 
    
         
            -
                      budget_amount: ::Faker::Number.between(from:  
     | 
| 
      
 98 
     | 
    
         
            +
                      budget_amount: ::Faker::Number.between(from: minimum_amount, to: maximum_amount)
         
     | 
| 
       88 
99 
     | 
    
         
             
                    }
         
     | 
| 
       89 
100 
     | 
    
         | 
| 
       90 
101 
     | 
    
         
             
                    if budget.component.settings.geocoding_enabled?
         
     | 
| 
         @@ -26,17 +26,12 @@ FactoryBot.define do 
     | 
|
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
                trait :with_vote_threshold_percent do
         
     | 
| 
       28 
28 
     | 
    
         
             
                  transient do
         
     | 
| 
       29 
     | 
    
         
            -
                    vote_rule_threshold_percent_enabled { true }
         
     | 
| 
       30 
     | 
    
         
            -
                    vote_rule_minimum_budget_projects_enabled { false }
         
     | 
| 
       31 
     | 
    
         
            -
                    vote_rule_projects_enabled { false }
         
     | 
| 
       32 
29 
     | 
    
         
             
                    vote_threshold_percent { 70 }
         
     | 
| 
       33 
30 
     | 
    
         
             
                  end
         
     | 
| 
       34 
31 
     | 
    
         | 
| 
       35 
32 
     | 
    
         
             
                  settings do
         
     | 
| 
       36 
33 
     | 
    
         
             
                    {
         
     | 
| 
       37 
     | 
    
         
            -
                       
     | 
| 
       38 
     | 
    
         
            -
                      vote_rule_minimum_budget_projects_enabled:,
         
     | 
| 
       39 
     | 
    
         
            -
                      vote_rule_selected_projects_enabled: vote_rule_projects_enabled,
         
     | 
| 
      
 34 
     | 
    
         
            +
                      voting_rule: "threshold_percent",
         
     | 
| 
       40 
35 
     | 
    
         
             
                      vote_threshold_percent:
         
     | 
| 
       41 
36 
     | 
    
         
             
                    }
         
     | 
| 
       42 
37 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -44,17 +39,12 @@ FactoryBot.define do 
     | 
|
| 
       44 
39 
     | 
    
         | 
| 
       45 
40 
     | 
    
         
             
                trait :with_minimum_budget_projects do
         
     | 
| 
       46 
41 
     | 
    
         
             
                  transient do
         
     | 
| 
       47 
     | 
    
         
            -
                    vote_rule_threshold_percent_enabled { false }
         
     | 
| 
       48 
     | 
    
         
            -
                    vote_rule_minimum_budget_projects_enabled { true }
         
     | 
| 
       49 
     | 
    
         
            -
                    vote_rule_projects_enabled { false }
         
     | 
| 
       50 
42 
     | 
    
         
             
                    vote_minimum_budget_projects_number { 3 }
         
     | 
| 
       51 
43 
     | 
    
         
             
                  end
         
     | 
| 
       52 
44 
     | 
    
         | 
| 
       53 
45 
     | 
    
         
             
                  settings do
         
     | 
| 
       54 
46 
     | 
    
         
             
                    {
         
     | 
| 
       55 
     | 
    
         
            -
                       
     | 
| 
       56 
     | 
    
         
            -
                      vote_rule_minimum_budget_projects_enabled:,
         
     | 
| 
       57 
     | 
    
         
            -
                      vote_rule_selected_projects_enabled: vote_rule_projects_enabled,
         
     | 
| 
      
 47 
     | 
    
         
            +
                      voting_rule: "minimum_projects",
         
     | 
| 
       58 
48 
     | 
    
         
             
                      vote_minimum_budget_projects_number:
         
     | 
| 
       59 
49 
     | 
    
         
             
                    }
         
     | 
| 
       60 
50 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -62,18 +52,13 @@ FactoryBot.define do 
     | 
|
| 
       62 
52 
     | 
    
         | 
| 
       63 
53 
     | 
    
         
             
                trait :with_budget_projects_range do
         
     | 
| 
       64 
54 
     | 
    
         
             
                  transient do
         
     | 
| 
       65 
     | 
    
         
            -
                    vote_rule_threshold_percent_enabled { false }
         
     | 
| 
       66 
     | 
    
         
            -
                    vote_rule_minimum_budget_projects_enabled { false }
         
     | 
| 
       67 
     | 
    
         
            -
                    vote_rule_projects_enabled { true }
         
     | 
| 
       68 
55 
     | 
    
         
             
                    vote_minimum_budget_projects_number { 3 }
         
     | 
| 
       69 
56 
     | 
    
         
             
                    vote_maximum_budget_projects_number { 6 }
         
     | 
| 
       70 
57 
     | 
    
         
             
                  end
         
     | 
| 
       71 
58 
     | 
    
         | 
| 
       72 
59 
     | 
    
         
             
                  settings do
         
     | 
| 
       73 
60 
     | 
    
         
             
                    {
         
     | 
| 
       74 
     | 
    
         
            -
                       
     | 
| 
       75 
     | 
    
         
            -
                      vote_rule_minimum_budget_projects_enabled:,
         
     | 
| 
       76 
     | 
    
         
            -
                      vote_rule_selected_projects_enabled: vote_rule_projects_enabled,
         
     | 
| 
      
 61 
     | 
    
         
            +
                      voting_rule: "selected_projects",
         
     | 
| 
       77 
62 
     | 
    
         
             
                      vote_selected_projects_minimum: vote_minimum_budget_projects_number,
         
     | 
| 
       78 
63 
     | 
    
         
             
                      vote_selected_projects_maximum: vote_maximum_budget_projects_number
         
     | 
| 
       79 
64 
     | 
    
         
             
                    }
         
     | 
| 
         @@ -10,20 +10,6 @@ module Decidim 
     | 
|
| 
       10 
10 
     | 
    
         
             
                      @user = user
         
     | 
| 
       11 
11 
     | 
    
         
             
                    end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
                    # Public: Checks if the component has only one budget resource.
         
     | 
| 
       14 
     | 
    
         
            -
                    #
         
     | 
| 
       15 
     | 
    
         
            -
                    # Returns Boolean.
         
     | 
| 
       16 
     | 
    
         
            -
                    def single?
         
     | 
| 
       17 
     | 
    
         
            -
                      budgets.one?
         
     | 
| 
       18 
     | 
    
         
            -
                    end
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                    # Public: Return the single budget resource of the component
         
     | 
| 
       21 
     | 
    
         
            -
                    #
         
     | 
| 
       22 
     | 
    
         
            -
                    # Returns an ActiveRecord.
         
     | 
| 
       23 
     | 
    
         
            -
                    def single
         
     | 
| 
       24 
     | 
    
         
            -
                      budgets.first if single?
         
     | 
| 
       25 
     | 
    
         
            -
                    end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
13 
     | 
    
         
             
                    # Public: Decides if the given resource should be highlighted.
         
     | 
| 
       28 
14 
     | 
    
         
             
                    # This method must be overwritten for each Workflow class.
         
     | 
| 
       29 
15 
     | 
    
         
             
                    # - resource: the budget resource to consider
         
     | 
    
        data/lib/decidim/budgets.rb
    CHANGED
    
    | 
         @@ -11,12 +11,8 @@ module Decidim 
     | 
|
| 
       11 
11 
     | 
    
         
             
              # Base module for this engine.
         
     | 
| 
       12 
12 
     | 
    
         
             
              module Budgets
         
     | 
| 
       13 
13 
     | 
    
         
             
                autoload :ProjectSerializer, "decidim/budgets/project_serializer"
         
     | 
| 
      
 14 
     | 
    
         
            +
                autoload :OrderPDF, "decidim/budgets/budget_order_pdf"
         
     | 
| 
       14 
15 
     | 
    
         | 
| 
       15 
16 
     | 
    
         
             
                include ActiveSupport::Configurable
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                # Public Setting that defines whether proposals can be linked to meetings
         
     | 
| 
       18 
     | 
    
         
            -
                config_accessor :enable_proposal_linking do
         
     | 
| 
       19 
     | 
    
         
            -
                  Decidim.const_defined?("Proposals")
         
     | 
| 
       20 
     | 
    
         
            -
                end
         
     | 
| 
       21 
17 
     | 
    
         
             
              end
         
     | 
| 
       22 
18 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: decidim-budgets
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.31.0.rc2
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Josep Jaume Rey Peroy
         
     | 
| 
         @@ -18,70 +18,70 @@ dependencies: 
     | 
|
| 
       18 
18 
     | 
    
         
             
                requirements:
         
     | 
| 
       19 
19 
     | 
    
         
             
                - - '='
         
     | 
| 
       20 
20 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       21 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 21 
     | 
    
         
            +
                    version: 0.31.0.rc2
         
     | 
| 
       22 
22 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       23 
23 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       24 
24 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       25 
25 
     | 
    
         
             
                requirements:
         
     | 
| 
       26 
26 
     | 
    
         
             
                - - '='
         
     | 
| 
       27 
27 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       28 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 28 
     | 
    
         
            +
                    version: 0.31.0.rc2
         
     | 
| 
       29 
29 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       30 
30 
     | 
    
         
             
              name: decidim-core
         
     | 
| 
       31 
31 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       32 
32 
     | 
    
         
             
                requirements:
         
     | 
| 
       33 
33 
     | 
    
         
             
                - - '='
         
     | 
| 
       34 
34 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       35 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 35 
     | 
    
         
            +
                    version: 0.31.0.rc2
         
     | 
| 
       36 
36 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       37 
37 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       38 
38 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       39 
39 
     | 
    
         
             
                requirements:
         
     | 
| 
       40 
40 
     | 
    
         
             
                - - '='
         
     | 
| 
       41 
41 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       42 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 42 
     | 
    
         
            +
                    version: 0.31.0.rc2
         
     | 
| 
       43 
43 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       44 
44 
     | 
    
         
             
              name: decidim-admin
         
     | 
| 
       45 
45 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       46 
46 
     | 
    
         
             
                requirements:
         
     | 
| 
       47 
47 
     | 
    
         
             
                - - '='
         
     | 
| 
       48 
48 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       49 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 49 
     | 
    
         
            +
                    version: 0.31.0.rc2
         
     | 
| 
       50 
50 
     | 
    
         
             
              type: :development
         
     | 
| 
       51 
51 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       52 
52 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       53 
53 
     | 
    
         
             
                requirements:
         
     | 
| 
       54 
54 
     | 
    
         
             
                - - '='
         
     | 
| 
       55 
55 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       56 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 56 
     | 
    
         
            +
                    version: 0.31.0.rc2
         
     | 
| 
       57 
57 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       58 
58 
     | 
    
         
             
              name: decidim-dev
         
     | 
| 
       59 
59 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       60 
60 
     | 
    
         
             
                requirements:
         
     | 
| 
       61 
61 
     | 
    
         
             
                - - '='
         
     | 
| 
       62 
62 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       63 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 63 
     | 
    
         
            +
                    version: 0.31.0.rc2
         
     | 
| 
       64 
64 
     | 
    
         
             
              type: :development
         
     | 
| 
       65 
65 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       66 
66 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       67 
67 
     | 
    
         
             
                requirements:
         
     | 
| 
       68 
68 
     | 
    
         
             
                - - '='
         
     | 
| 
       69 
69 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       70 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 70 
     | 
    
         
            +
                    version: 0.31.0.rc2
         
     | 
| 
       71 
71 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       72 
72 
     | 
    
         
             
              name: decidim-proposals
         
     | 
| 
       73 
73 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       74 
74 
     | 
    
         
             
                requirements:
         
     | 
| 
       75 
75 
     | 
    
         
             
                - - '='
         
     | 
| 
       76 
76 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       77 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 77 
     | 
    
         
            +
                    version: 0.31.0.rc2
         
     | 
| 
       78 
78 
     | 
    
         
             
              type: :development
         
     | 
| 
       79 
79 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       80 
80 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       81 
81 
     | 
    
         
             
                requirements:
         
     | 
| 
       82 
82 
     | 
    
         
             
                - - '='
         
     | 
| 
       83 
83 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       84 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 84 
     | 
    
         
            +
                    version: 0.31.0.rc2
         
     | 
| 
       85 
85 
     | 
    
         
             
            description: A budgets component for decidim's participatory spaces.
         
     | 
| 
       86 
86 
     | 
    
         
             
            email:
         
     | 
| 
       87 
87 
     | 
    
         
             
            - josepjaume@gmail.com
         
     | 
| 
         @@ -114,6 +114,7 @@ files: 
     | 
|
| 
       114 
114 
     | 
    
         
             
            - app/cells/decidim/budgets/limit_announcement/show.erb
         
     | 
| 
       115 
115 
     | 
    
         
             
            - app/cells/decidim/budgets/limit_announcement_cell.rb
         
     | 
| 
       116 
116 
     | 
    
         
             
            - app/cells/decidim/budgets/order_activity_cell.rb
         
     | 
| 
      
 117 
     | 
    
         
            +
            - app/cells/decidim/budgets/project_budget_amount_cell.rb
         
     | 
| 
       117 
118 
     | 
    
         
             
            - app/cells/decidim/budgets/project_cell.rb
         
     | 
| 
       118 
119 
     | 
    
         
             
            - app/cells/decidim/budgets/project_history_cell.rb
         
     | 
| 
       119 
120 
     | 
    
         
             
            - app/cells/decidim/budgets/project_l/extra_data.erb
         
     | 
| 
         @@ -174,6 +175,7 @@ files: 
     | 
|
| 
       174 
175 
     | 
    
         
             
            - app/packs/entrypoints/decidim_budgets_admin.js
         
     | 
| 
       175 
176 
     | 
    
         
             
            - app/packs/images/decidim/budgets/decidim_budgets.svg
         
     | 
| 
       176 
177 
     | 
    
         
             
            - app/packs/src/decidim/budgets/admin/projects.js
         
     | 
| 
      
 178 
     | 
    
         
            +
            - app/packs/src/decidim/budgets/budgetSummaryBackdrop.js
         
     | 
| 
       177 
179 
     | 
    
         
             
            - app/packs/src/decidim/budgets/exit_handler.js
         
     | 
| 
       178 
180 
     | 
    
         
             
            - app/packs/src/decidim/budgets/progressFixed.js
         
     | 
| 
       179 
181 
     | 
    
         
             
            - app/packs/src/decidim/budgets/projects.js
         
     | 
| 
         @@ -184,8 +186,6 @@ files: 
     | 
|
| 
       184 
186 
     | 
    
         
             
            - app/presenters/decidim/budgets/admin_log/project_presenter.rb
         
     | 
| 
       185 
187 
     | 
    
         
             
            - app/presenters/decidim/budgets/project_presenter.rb
         
     | 
| 
       186 
188 
     | 
    
         
             
            - app/queries/decidim/budgets/filtered_projects.rb
         
     | 
| 
       187 
     | 
    
         
            -
            - app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb
         
     | 
| 
       188 
     | 
    
         
            -
            - app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb
         
     | 
| 
       189 
189 
     | 
    
         
             
            - app/serializers/decidim/budgets/download_your_data_budgets_order_serializer.rb
         
     | 
| 
       190 
190 
     | 
    
         
             
            - app/services/decidim/budgets/order_reminder_generator.rb
         
     | 
| 
       191 
191 
     | 
    
         
             
            - app/views/decidim/budgets/admin/budgets/_actions.html.erb
         
     | 
| 
         @@ -224,8 +224,6 @@ files: 
     | 
|
| 
       224 
224 
     | 
    
         
             
            - app/views/decidim/budgets/projects/_exit_modal.html.erb
         
     | 
| 
       225 
225 
     | 
    
         
             
            - app/views/decidim/budgets/projects/_linked_projects.html.erb
         
     | 
| 
       226 
226 
     | 
    
         
             
            - app/views/decidim/budgets/projects/_order.html.erb
         
     | 
| 
       227 
     | 
    
         
            -
            - app/views/decidim/budgets/projects/_order_progress_progressbar_marks_right.html.erb
         
     | 
| 
       228 
     | 
    
         
            -
            - app/views/decidim/budgets/projects/_order_progress_summary_content.html.erb
         
     | 
| 
       229 
227 
     | 
    
         
             
            - app/views/decidim/budgets/projects/_order_total_budget.html.erb
         
     | 
| 
       230 
228 
     | 
    
         
             
            - app/views/decidim/budgets/projects/_project.html.erb
         
     | 
| 
       231 
229 
     | 
    
         
             
            - app/views/decidim/budgets/projects/_project_budget_button.html.erb
         
     | 
| 
         @@ -234,6 +232,12 @@ files: 
     | 
|
| 
       234 
232 
     | 
    
         
             
            - app/views/decidim/budgets/projects/_projects_list.html.erb
         
     | 
| 
       235 
233 
     | 
    
         
             
            - app/views/decidim/budgets/projects/index.html.erb
         
     | 
| 
       236 
234 
     | 
    
         
             
            - app/views/decidim/budgets/projects/index.js.erb
         
     | 
| 
      
 235 
     | 
    
         
            +
            - app/views/decidim/budgets/projects/order_progress_summary/_content.html.erb
         
     | 
| 
      
 236 
     | 
    
         
            +
            - app/views/decidim/budgets/projects/order_progress_summary/_content_responsive.html.erb
         
     | 
| 
      
 237 
     | 
    
         
            +
            - app/views/decidim/budgets/projects/order_progress_summary/_progress_box.html.erb
         
     | 
| 
      
 238 
     | 
    
         
            +
            - app/views/decidim/budgets/projects/order_progress_summary/_progress_box_buttons.html.erb
         
     | 
| 
      
 239 
     | 
    
         
            +
            - app/views/decidim/budgets/projects/order_progress_summary/_progress_box_sticky.html.erb
         
     | 
| 
      
 240 
     | 
    
         
            +
            - app/views/decidim/budgets/projects/order_progress_summary/_progressbar_marks_right.html.erb
         
     | 
| 
       237 
241 
     | 
    
         
             
            - app/views/decidim/budgets/projects/show.html.erb
         
     | 
| 
       238 
242 
     | 
    
         
             
            - app/views/decidim/budgets/vote_reminder_mailer/vote_reminder.html.erb
         
     | 
| 
       239 
243 
     | 
    
         
             
            - config/assets.rb
         
     | 
| 
         @@ -342,6 +346,7 @@ files: 
     | 
|
| 
       342 
346 
     | 
    
         
             
            - db/migrate/20220428072638_add_geolocalization_fields_to_projects.rb
         
     | 
| 
       343 
347 
     | 
    
         
             
            - db/migrate/20240828103724_add_deleted_at_to_decidim_budgets_budgets.rb
         
     | 
| 
       344 
348 
     | 
    
         
             
            - db/migrate/20240916135141_add_deleted_at_to_decidim_budgets_projects.rb
         
     | 
| 
      
 349 
     | 
    
         
            +
            - db/migrate/20250912110212_move_voting_rules_to_radio_buttons.rb
         
     | 
| 
       345 
350 
     | 
    
         
             
            - decidim-budgets.gemspec
         
     | 
| 
       346 
351 
     | 
    
         
             
            - lib/decidim/api/budget_type.rb
         
     | 
| 
       347 
352 
     | 
    
         
             
            - lib/decidim/api/budgets_type.rb
         
     | 
| 
         @@ -350,6 +355,7 @@ files: 
     | 
|
| 
       350 
355 
     | 
    
         
             
            - lib/decidim/budgets/admin.rb
         
     | 
| 
       351 
356 
     | 
    
         
             
            - lib/decidim/budgets/admin_engine.rb
         
     | 
| 
       352 
357 
     | 
    
         
             
            - lib/decidim/budgets/api.rb
         
     | 
| 
      
 358 
     | 
    
         
            +
            - lib/decidim/budgets/budget_order_pdf.rb
         
     | 
| 
       353 
359 
     | 
    
         
             
            - lib/decidim/budgets/component.rb
         
     | 
| 
       354 
360 
     | 
    
         
             
            - lib/decidim/budgets/engine.rb
         
     | 
| 
       355 
361 
     | 
    
         
             
            - lib/decidim/budgets/project_serializer.rb
         
     | 
| 
         @@ -1,32 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            module Decidim
         
     | 
| 
       4 
     | 
    
         
            -
              module Budgets
         
     | 
| 
       5 
     | 
    
         
            -
                module Metrics
         
     | 
| 
       6 
     | 
    
         
            -
                  # Searches for unique Users following the next objects
         
     | 
| 
       7 
     | 
    
         
            -
                  #  - Budgets
         
     | 
| 
       8 
     | 
    
         
            -
                  class BudgetFollowersMetricMeasure < Decidim::MetricMeasure
         
     | 
| 
       9 
     | 
    
         
            -
                    def valid?
         
     | 
| 
       10 
     | 
    
         
            -
                      super && @resource.is_a?(Decidim::Component)
         
     | 
| 
       11 
     | 
    
         
            -
                    end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                    def calculate
         
     | 
| 
       14 
     | 
    
         
            -
                      budgets = Decidim::Budgets::Budget.where(component: @resource)
         
     | 
| 
       15 
     | 
    
         
            -
                      projects = Decidim::Budgets::Project.where(budget: budgets)
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                      budgets_followers = Decidim::Follow.where(followable: projects).joins(:user)
         
     | 
| 
       18 
     | 
    
         
            -
                                                         .where(decidim_follows: { created_at: ..end_time })
         
     | 
| 
       19 
     | 
    
         
            -
                      cumulative_users = budgets_followers.pluck(:decidim_user_id)
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                      budgets_followers = budgets_followers.where(decidim_follows: { created_at: start_time.. })
         
     | 
| 
       22 
     | 
    
         
            -
                      quantity_users = budgets_followers.pluck(:decidim_user_id)
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                      {
         
     | 
| 
       25 
     | 
    
         
            -
                        cumulative_users: cumulative_users.uniq,
         
     | 
| 
       26 
     | 
    
         
            -
                        quantity_users: quantity_users.uniq
         
     | 
| 
       27 
     | 
    
         
            -
                      }
         
     | 
| 
       28 
     | 
    
         
            -
                    end
         
     | 
| 
       29 
     | 
    
         
            -
                  end
         
     | 
| 
       30 
     | 
    
         
            -
                end
         
     | 
| 
       31 
     | 
    
         
            -
              end
         
     | 
| 
       32 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,27 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            module Decidim
         
     | 
| 
       4 
     | 
    
         
            -
              module Budgets
         
     | 
| 
       5 
     | 
    
         
            -
                module Metrics
         
     | 
| 
       6 
     | 
    
         
            -
                  # Searches for Participants in the following actions
         
     | 
| 
       7 
     | 
    
         
            -
                  #  - Vote a participatory budgeting project (Budgets)
         
     | 
| 
       8 
     | 
    
         
            -
                  class BudgetParticipantsMetricMeasure < Decidim::MetricMeasure
         
     | 
| 
       9 
     | 
    
         
            -
                    def valid?
         
     | 
| 
       10 
     | 
    
         
            -
                      super && @resource.is_a?(Decidim::Component)
         
     | 
| 
       11 
     | 
    
         
            -
                    end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                    def calculate
         
     | 
| 
       14 
     | 
    
         
            -
                      budgets = Decidim::Budgets::Budget.where(component: @resource)
         
     | 
| 
       15 
     | 
    
         
            -
                      orders = Decidim::Budgets::Order.where(budget: budgets)
         
     | 
| 
       16 
     | 
    
         
            -
                                                      .finished
         
     | 
| 
       17 
     | 
    
         
            -
                                                      .where(decidim_budgets_orders: { checked_out_at: ..end_time })
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                      {
         
     | 
| 
       20 
     | 
    
         
            -
                        cumulative_users: orders.pluck(:decidim_user_id),
         
     | 
| 
       21 
     | 
    
         
            -
                        quantity_users: orders.where(decidim_budgets_orders: { checked_out_at: start_time.. }).pluck(:decidim_user_id)
         
     | 
| 
       22 
     | 
    
         
            -
                      }
         
     | 
| 
       23 
     | 
    
         
            -
                    end
         
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
       25 
     | 
    
         
            -
                end
         
     | 
| 
       26 
     | 
    
         
            -
              end
         
     | 
| 
       27 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,122 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            <div data-order-progress-responsive="<%= responsive.inspect %>" class="budget-summary__content">
         
     | 
| 
       2 
     | 
    
         
            -
              <div class="budget-summary__progressbox" data-current-allocation="<%= current_order ? current_order.total : 0 %>">
         
     | 
| 
       3 
     | 
    
         
            -
                <% if include_heading %>
         
     | 
| 
       4 
     | 
    
         
            -
                  <% if current_order_checked_out? %>
         
     | 
| 
       5 
     | 
    
         
            -
                    <%= t("title", scope: "decidim.budgets.projects.budget_summary.checked_out") %>
         
     | 
| 
       6 
     | 
    
         
            -
                    <div class="budget-summary__content__header">
         
     | 
| 
       7 
     | 
    
         
            -
                      <span class="budget-summary__content__header--title">
         
     | 
| 
       8 
     | 
    
         
            -
                        <%= t("name", scope: "decidim.components.budgets") %>
         
     | 
| 
       9 
     | 
    
         
            -
                      </span>
         
     | 
| 
       10 
     | 
    
         
            -
                      /
         
     | 
| 
       11 
     | 
    
         
            -
                      <%= translated_attribute(budget.title) %>
         
     | 
| 
       12 
     | 
    
         
            -
                      <p class="budget-summary__content__header--description">
         
     | 
| 
       13 
     | 
    
         
            -
                        <%= t("description", scope: "decidim.budgets.projects.budget_summary.checked_out") %>
         
     | 
| 
       14 
     | 
    
         
            -
                      </p>
         
     | 
| 
       15 
     | 
    
         
            -
                    </div>
         
     | 
| 
       16 
     | 
    
         
            -
                  <% else %>
         
     | 
| 
       17 
     | 
    
         
            -
                    <p class="budget-summary__progressbox--checked_out">
         
     | 
| 
       18 
     | 
    
         
            -
                      <%= current_rule_description %>
         
     | 
| 
       19 
     | 
    
         
            -
                    </p>
         
     | 
| 
       20 
     | 
    
         
            -
                  <% end %>
         
     | 
| 
       21 
     | 
    
         
            -
                <% end %>
         
     | 
| 
       22 
     | 
    
         
            -
                <div class="budget-summary__progressbar">
         
     | 
| 
       23 
     | 
    
         
            -
                  <div class="budget-progress" role="progressbar" aria-label="<%= t("budget", scope: "decidim.budgets.projects.order_progress") %>" aria-valuenow="<%= current_order_budget_percent %>" aria-valuetext="<%= current_order_budget_percent %> %" aria-valuemin="0" aria-valuemax="100">
         
     | 
| 
       24 
     | 
    
         
            -
                    <div class="budget-summary__progressbar--minimum" style="width: <%= current_order_budget_percent_minimum %>%">
         
     | 
| 
       25 
     | 
    
         
            -
                    </div>
         
     | 
| 
       26 
     | 
    
         
            -
                    <div class="budget-summary__progressbar--meter bg-success" style="width: <%= current_order_budget_percent %>%"> </div>
         
     | 
| 
       27 
     | 
    
         
            -
                  </div>
         
     | 
| 
       28 
     | 
    
         
            -
                  <div class="budget-summary__progressbar-marks">
         
     | 
| 
       29 
     | 
    
         
            -
                    <span class="budget-summary__progressbar-legend">
         
     | 
| 
       30 
     | 
    
         
            -
                      <strong id="order-total-budget<%= "-responsive" if responsive %>" class="budget-summary__progressbar-legend-strong">
         
     | 
| 
       31 
     | 
    
         
            -
                        <%= render partial: "decidim/budgets/projects/order_total_budget" %>
         
     | 
| 
       32 
     | 
    
         
            -
                      </strong>
         
     | 
| 
       33 
     | 
    
         
            -
                      <%= t("assigned", scope: "decidim.budgets.projects.order_progress") %>
         
     | 
| 
       34 
     | 
    
         
            -
                    </span>
         
     | 
| 
       35 
     | 
    
         
            -
                    <% if current_order.minimum_budget > 0 %>
         
     | 
| 
       36 
     | 
    
         
            -
                      <span class="budget-summary__progressbar-legend budget-summary__progressbar-marks_center">
         
     | 
| 
       37 
     | 
    
         
            -
                        <strong class="budget-summary__progressbar-legend-strong">
         
     | 
| 
       38 
     | 
    
         
            -
                          <%= budget_to_currency(current_order.minimum_budget) %>
         
     | 
| 
       39 
     | 
    
         
            -
                        </strong>
         
     | 
| 
       40 
     | 
    
         
            -
                        <%= t("minimum", scope: "decidim.budgets.projects.order_progress") %>
         
     | 
| 
       41 
     | 
    
         
            -
                      </span>
         
     | 
| 
       42 
     | 
    
         
            -
                    <% end %>
         
     | 
| 
       43 
     | 
    
         
            -
                    <%= render partial: "decidim/budgets/projects/order_progress_progressbar_marks_right" %>
         
     | 
| 
       44 
     | 
    
         
            -
                  </div>
         
     | 
| 
       45 
     | 
    
         
            -
                </div>
         
     | 
| 
       46 
     | 
    
         
            -
              </div>
         
     | 
| 
       47 
     | 
    
         
            -
              <div class="budget-summary__progressbox-buttons layout-aside__ctas-buttons" data-sticky-buttons>
         
     | 
| 
       48 
     | 
    
         
            -
                <% if !current_order_checked_out? && voting_open? %>
         
     | 
| 
       49 
     | 
    
         
            -
                  <button class="button button__secondary button__lg w-full" data-dialog-open="budget-confirm" <%= budget_confirm_disabled_attr %>>
         
     | 
| 
       50 
     | 
    
         
            -
                    <%= t("vote", scope: "decidim.budgets.projects.budget_summary") %>
         
     | 
| 
       51 
     | 
    
         
            -
                    <%= icon "check-line" %>
         
     | 
| 
       52 
     | 
    
         
            -
                  </button>
         
     | 
| 
       53 
     | 
    
         
            -
                <% end %>
         
     | 
| 
       54 
     | 
    
         
            -
                <% if include_heading && current_order_checked_out? %>
         
     | 
| 
       55 
     | 
    
         
            -
                  <%= link_to budget_order_path(return_to: "budget"), method: :delete, class: "button button__lg button__secondary cancel-order w-full", data: { confirm: t("are_you_sure", scope: "decidim.budgets.projects.budget_confirm") } do %>
         
     | 
| 
       56 
     | 
    
         
            -
                    <span><%= t("cancel_order", scope: "decidim.budgets.projects.budget_summary") %></span>
         
     | 
| 
       57 
     | 
    
         
            -
                    <%= icon "delete-bin-line" %>
         
     | 
| 
       58 
     | 
    
         
            -
                  <% end %>
         
     | 
| 
       59 
     | 
    
         
            -
                <% end %>
         
     | 
| 
       60 
     | 
    
         
            -
              </div>
         
     | 
| 
       61 
     | 
    
         
            -
              <div class="budget-summary__button-modal">
         
     | 
| 
       62 
     | 
    
         
            -
                <button type="button" data-dialog-open="budget-modal-info" aria-haspopup="dialog" tabindex="0" class="button button__text button__xs underline font-bold">
         
     | 
| 
       63 
     | 
    
         
            -
                  <%= t("more_information", scope: "decidim.budgets.budget_information_modal") %>
         
     | 
| 
       64 
     | 
    
         
            -
                </button>
         
     | 
| 
       65 
     | 
    
         
            -
              </div>
         
     | 
| 
       66 
     | 
    
         
            -
              <div class="w-screen max-w-screen progressbox-fixed-wrapper" data-progressbox-fixed>
         
     | 
| 
       67 
     | 
    
         
            -
                <div class="gap-0 layout-item py-4 items-center budget-summary__progressbar">
         
     | 
| 
       68 
     | 
    
         
            -
                  <div class="budget-summary__progressbox layout-item__main">
         
     | 
| 
       69 
     | 
    
         
            -
                    <div class="budget-progress relative" role="progressbar" aria-valuenow="<%= current_order_budget_percent %>" aria-valuetext="<%= current_order_budget_percent %>%" aria-valuemin="0" aria-valuemax="100">
         
     | 
| 
       70 
     | 
    
         
            -
                      <div class="budget-summary__progressbar--minimum" style="width: <%= current_order_budget_percent_minimum %>%">
         
     | 
| 
       71 
     | 
    
         
            -
                      </div>
         
     | 
| 
       72 
     | 
    
         
            -
                      <div class="budget-summary__progressbar--meter bg-success" style="width: <%= current_order_budget_percent %>%">
         
     | 
| 
       73 
     | 
    
         
            -
                      </div>
         
     | 
| 
       74 
     | 
    
         
            -
                    </div>
         
     | 
| 
       75 
     | 
    
         
            -
                    <div class="budget-summary__progressbar-marks">
         
     | 
| 
       76 
     | 
    
         
            -
                      <span class="budget-summary__progressbar-legend" style="width: <%= current_order_budget_percent_minimum %>%;">
         
     | 
| 
       77 
     | 
    
         
            -
                        <%= t("assigned", scope: "decidim.budgets.projects.order_progress") %>
         
     | 
| 
       78 
     | 
    
         
            -
                        <strong id="order-total-budget-sticky<%= "-responsive" if responsive %>" class="budget-summary__progressbar-legend-strong">
         
     | 
| 
       79 
     | 
    
         
            -
                          <%= render partial: "decidim/budgets/projects/order_total_budget" %>
         
     | 
| 
       80 
     | 
    
         
            -
                        </strong>
         
     | 
| 
       81 
     | 
    
         
            -
                      </span>
         
     | 
| 
       82 
     | 
    
         
            -
                      <% if current_order.minimum_budget > 0 %>
         
     | 
| 
       83 
     | 
    
         
            -
                      <span class="budget-summary__progressbar-legend budget-summary__progressbar-marks_center">
         
     | 
| 
       84 
     | 
    
         
            -
                        <%= t("minimum", scope: "decidim.budgets.projects.order_progress") %>
         
     | 
| 
       85 
     | 
    
         
            -
                        <strong class="budget-summary__progressbar-legend-strong">
         
     | 
| 
       86 
     | 
    
         
            -
                          <%= budget_to_currency(current_order.minimum_budget) %>
         
     | 
| 
       87 
     | 
    
         
            -
                        </strong>
         
     | 
| 
       88 
     | 
    
         
            -
                      </span>
         
     | 
| 
       89 
     | 
    
         
            -
                      <% end %>
         
     | 
| 
       90 
     | 
    
         
            -
                      <%= render partial: "decidim/budgets/projects/order_progress_progressbar_marks_right" %>
         
     | 
| 
       91 
     | 
    
         
            -
                    </div>
         
     | 
| 
       92 
     | 
    
         
            -
                  </div>
         
     | 
| 
       93 
     | 
    
         
            -
                  <div class="layout-item__aside budget-summary__progressbox-buttons hidden lg:block">
         
     | 
| 
       94 
     | 
    
         
            -
                    <% if !current_order_checked_out? && voting_open? %>
         
     | 
| 
       95 
     | 
    
         
            -
                      <button class="button button__secondary button__lg mt-2 md:mt-0 w-full" data-dialog-open="budget-confirm" <%= budget_confirm_disabled_attr %>>
         
     | 
| 
       96 
     | 
    
         
            -
                        <span>
         
     | 
| 
       97 
     | 
    
         
            -
                          <%= t("vote", scope: "decidim.budgets.projects.budget_summary") %>
         
     | 
| 
       98 
     | 
    
         
            -
                        </span>
         
     | 
| 
       99 
     | 
    
         
            -
                        <%= icon "check-line" %>
         
     | 
| 
       100 
     | 
    
         
            -
                      </button>
         
     | 
| 
       101 
     | 
    
         
            -
                    <% end %>
         
     | 
| 
       102 
     | 
    
         
            -
                    <% if include_heading && current_order_checked_out? %>
         
     | 
| 
       103 
     | 
    
         
            -
                      <%= link_to budget_order_path(return_to: "budget"), method: :delete, class: "button button__lg button__secondary cancel-order w-full mt-2 md:mt-0", data: { confirm: t("are_you_sure", scope: "decidim.budgets.projects.budget_confirm") } do %>
         
     | 
| 
       104 
     | 
    
         
            -
                        <span><%= t("cancel_order", scope: "decidim.budgets.projects.budget_summary") %></span>
         
     | 
| 
       105 
     | 
    
         
            -
                        <%= icon "delete-bin-line" %>
         
     | 
| 
       106 
     | 
    
         
            -
                      <% end %>
         
     | 
| 
       107 
     | 
    
         
            -
                    <% end %>
         
     | 
| 
       108 
     | 
    
         
            -
                  </div>
         
     | 
| 
       109 
     | 
    
         
            -
                </div>
         
     | 
| 
       110 
     | 
    
         
            -
              </div>
         
     | 
| 
       111 
     | 
    
         
            -
            </div>
         
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
            <div class="budget-summary__button-dropdown">
         
     | 
| 
       114 
     | 
    
         
            -
              <button id="dropdown-trigger-button-dropdown" data-component="dropdown" data-target="dropdown-menu-button-dropdown" class="budget-summary__button-dropdown_text">
         
     | 
| 
       115 
     | 
    
         
            -
                <%= t("more_information", scope: "decidim.budgets.budget_information_modal") %>
         
     | 
| 
       116 
     | 
    
         
            -
                <%= icon "arrow-down-s-line" %>
         
     | 
| 
       117 
     | 
    
         
            -
                <%= icon "arrow-up-s-line" %>
         
     | 
| 
       118 
     | 
    
         
            -
              </button>
         
     | 
| 
       119 
     | 
    
         
            -
              <p id="dropdown-menu-button-dropdown">
         
     | 
| 
       120 
     | 
    
         
            -
                <%= cell("decidim/budgets/budget_information_modal", @budget).call(:more_information) %>
         
     | 
| 
       121 
     | 
    
         
            -
              </p>
         
     | 
| 
       122 
     | 
    
         
            -
            </div>
         
     |