Class: Decidim::Budgets::Order
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- Decidim::Budgets::Order
- Includes:
- DownloadYourData, NewsletterParticipant
- Defined in:
- app/models/decidim/budgets/order.rb
Overview
The data store for a Order in the Decidim::Budgets component. It is unique for each user and component and contains a collection of projects
Class Method Summary collapse
- .export_serializer ⇒ Object
- .newsletter_participant_ids(component) ⇒ Object
- .user_collection(user) ⇒ Object
Instance Method Summary collapse
-
#allocation_for(project) ⇒ Object
Public: Returns the numeric amount the given project should allocate from the total available allocation when it is added to the order.
-
#available_allocation ⇒ Object
Public: Returns the available budget allocation the user is able to allocate to this order or the maximum amount of projects to be selected in case the project selection voting is enabled.
-
#budget_percent ⇒ Object
Public: Returns the order budget percent from the settings total budget or the progress for selected projects if the selected project rule is enabled.
-
#can_checkout? ⇒ Boolean
Public: Check if the order total budget is enough to checkout.
-
#checked_out? ⇒ Boolean
Public: Returns true if the order has been checked out.
-
#maximum_budget ⇒ Object
Public: Returns the required maximum budget to checkout.
-
#maximum_projects ⇒ Object
Public: Returns the required maximum projects to checkout.
-
#minimum_budget ⇒ Object
Public: Returns the required minimum budget to checkout.
-
#minimum_projects ⇒ Object
Public: Returns the required minimum projects to checkout.
-
#minimum_projects_rule? ⇒ Boolean
Public: Returns if it is required a minimum projects limit to checkout.
-
#projects_rule? ⇒ Boolean
Public: Returns true if the project voting rule is enabled.
-
#total ⇒ Object
Public: For budget voting returns the total budget and for project selection voting, returns the amount of selected projects.
-
#total_budget ⇒ Object
Public: Returns the sum of project budgets.
-
#total_projects ⇒ Object
Public: Returns the count of projects.
Class Method Details
.export_serializer ⇒ Object
173 174 175 |
# File 'app/models/decidim/budgets/order.rb', line 173 def self.export_serializer Decidim::Budgets::DownloadYourDataBudgetsOrderSerializer end |
.newsletter_participant_ids(component) ⇒ Object
177 178 179 180 181 182 183 184 185 186 |
# File 'app/models/decidim/budgets/order.rb', line 177 def self.(component) Decidim::Budgets::Order.finished .joins(budget: [:component]) .where(budget: { decidim_components: { id: component.id } }) .group(:decidim_user_id) .pluck(:decidim_user_id) .flatten.compact end |
.user_collection(user) ⇒ Object
169 170 171 |
# File 'app/models/decidim/budgets/order.rb', line 169 def self.user_collection(user) where(decidim_user_id: user.id) end |
Instance Method Details
#allocation_for(project) ⇒ Object
Public: Returns the numeric amount the given project should allocate from the total available allocation when it is added to the order. The allocation is normally the project’s budget but for project selection voting, the allocation is one.
66 67 68 69 70 |
# File 'app/models/decidim/budgets/order.rb', line 66 def allocation_for(project) return 1 if projects_rule? project.budget_amount end |
#available_allocation ⇒ Object
Public: Returns the available budget allocation the user is able to allocate to this order or the maximum amount of projects to be selected in case the project selection voting is enabled.
56 57 58 59 60 |
# File 'app/models/decidim/budgets/order.rb', line 56 def available_allocation return maximum_projects if projects_rule? maximum_budget end |
#budget_percent ⇒ Object
Public: Returns the order budget percent from the settings total budget or the progress for selected projects if the selected project rule is enabled
109 110 111 112 113 114 |
# File 'app/models/decidim/budgets/order.rb', line 109 def budget_percent return (total_projects.to_f / maximum_projects) * 100 if projects_rule? return 0 if budget.total_budget.zero? (total_budget.to_f / budget.total_budget) * 100 end |
#can_checkout? ⇒ Boolean
Public: Check if the order total budget is enough to checkout
96 97 98 99 100 101 102 103 104 |
# File 'app/models/decidim/budgets/order.rb', line 96 def can_checkout? if projects_rule? total_projects >= minimum_projects && total_projects <= maximum_projects elsif minimum_projects_rule? total_projects >= minimum_projects else total_budget.to_f >= minimum_budget end end |
#checked_out? ⇒ Boolean
Public: Returns true if the order has been checked out
91 92 93 |
# File 'app/models/decidim/budgets/order.rb', line 91 def checked_out? checked_out_at.present? end |
#maximum_budget ⇒ Object
Public: Returns the required maximum budget to checkout
125 126 127 128 129 |
# File 'app/models/decidim/budgets/order.rb', line 125 def maximum_budget return 0 unless budget budget.total_budget.to_f end |
#maximum_projects ⇒ Object
Public: Returns the required maximum projects to checkout
159 160 161 162 163 164 165 166 167 |
# File 'app/models/decidim/budgets/order.rb', line 159 def maximum_projects return nil unless budget if projects_rule? budget.settings.vote_selected_projects_maximum else 0 end end |
#minimum_budget ⇒ Object
Public: Returns the required minimum budget to checkout
117 118 119 120 121 122 |
# File 'app/models/decidim/budgets/order.rb', line 117 def minimum_budget return 0 unless budget return 0 if minimum_projects_rule? || projects_rule? budget.total_budget.to_f * (budget.settings.vote_threshold_percent.to_f / 100) end |
#minimum_projects ⇒ Object
Public: Returns the required minimum projects to checkout
146 147 148 149 150 151 152 153 154 155 156 |
# File 'app/models/decidim/budgets/order.rb', line 146 def minimum_projects return 0 unless budget if minimum_projects_rule? budget.settings.vote_minimum_budget_projects_number elsif projects_rule? budget.settings.vote_selected_projects_minimum else 0 end end |
#minimum_projects_rule? ⇒ Boolean
Public: Returns if it is required a minimum projects limit to checkout
132 133 134 135 136 |
# File 'app/models/decidim/budgets/order.rb', line 132 def minimum_projects_rule? return unless budget budget.settings.vote_rule_minimum_budget_projects_enabled end |
#projects_rule? ⇒ Boolean
Public: Returns true if the project voting rule is enabled
139 140 141 142 143 |
# File 'app/models/decidim/budgets/order.rb', line 139 def projects_rule? return unless budget budget.settings.vote_rule_selected_projects_enabled end |
#total ⇒ Object
Public: For budget voting returns the total budget and for project selection voting, returns the amount of selected projects.
84 85 86 87 88 |
# File 'app/models/decidim/budgets/order.rb', line 84 def total return total_projects if projects_rule? total_budget end |
#total_budget ⇒ Object
Public: Returns the sum of project budgets
73 74 75 |
# File 'app/models/decidim/budgets/order.rb', line 73 def total_budget projects.to_a.sum(&:budget_amount) end |
#total_projects ⇒ Object
Public: Returns the count of projects
78 79 80 |
# File 'app/models/decidim/budgets/order.rb', line 78 def total_projects projects.count end |