From 926cbf54ec09a544974ee30ed1adbd4134f638a4 Mon Sep 17 00:00:00 2001 From: Pascal Zumkehr Date: Fri, 24 May 2024 14:38:19 +0200 Subject: [PATCH] Refactor sac membership config forms --- .../article_number_field_rows_component.rb | 27 --- .../field_rows_component.html.haml | 14 -- .../field_rows_component.rb | 33 --- .../valid_from_selector_component.html.haml | 4 +- .../valid_from_selector_component.rb | 17 +- .../reduction_field_rows_component.rb | 24 -- .../valid_from_selector_component.html.haml | 6 - .../valid_from_selector_component.rb | 39 ---- .../concerns/membership_configurable.rb | 73 ++++++ .../sac_membership_configs_controller.rb | 138 ++++------- ...c_section_membership_configs_controller.rb | 105 +++------ .../sac_membership_config_decorator.rb | 15 -- ...sac_section_membership_config_decorator.rb | 15 -- app/models/group/ortsgruppe.rb | 4 +- app/models/group/sac_cas.rb | 2 +- app/models/group/sektion.rb | 2 +- app/models/sac_membership_config.rb | 12 +- app/models/sac_section_membership_config.rb | 27 +-- .../sac_membership_configs/_form.html.haml | 215 ++++-------------- .../_form.html.haml | 80 ++----- config/locales/wagon.de.yml | 57 ++--- ...5_create_sac_section_membership_configs.rb | 18 +- ...521141824_change_sac_membership_configs.rb | 6 +- .../4_sac_section_membership_configs.rb | 16 +- .../sac_membership_configs_controller_spec.rb | 2 +- ...tion_membership_configs_controller_spec.rb | 11 +- .../sac_section_membership_configs.yml | 32 +-- spec/models/sac_membership_config_spec.rb | 2 +- .../sac_section_membership_config_spec.rb | 18 +- 29 files changed, 333 insertions(+), 681 deletions(-) delete mode 100644 app/components/sac_membership_configs/article_number_field_rows_component.rb delete mode 100644 app/components/sac_membership_configs/field_rows_component.html.haml delete mode 100644 app/components/sac_membership_configs/field_rows_component.rb delete mode 100644 app/components/sac_section_membership_configs/reduction_field_rows_component.rb delete mode 100644 app/components/sac_section_membership_configs/valid_from_selector_component.html.haml delete mode 100644 app/components/sac_section_membership_configs/valid_from_selector_component.rb create mode 100644 app/controllers/concerns/membership_configurable.rb delete mode 100644 app/decorators/sac_membership_config_decorator.rb delete mode 100644 app/decorators/sac_section_membership_config_decorator.rb diff --git a/app/components/sac_membership_configs/article_number_field_rows_component.rb b/app/components/sac_membership_configs/article_number_field_rows_component.rb deleted file mode 100644 index 17e263511..000000000 --- a/app/components/sac_membership_configs/article_number_field_rows_component.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of -# hitobito_sac_cas and licensed under the Affero General Public License version 3 -# or later. See the COPYING file at the top-level directory or at -# https://github.com/hitobito/hitobito_sac_cas - -module SacMembershipConfigs - class ArticleNumberFieldRowsComponent < FieldRowsComponent - - def initialize(form:, attrs: []) - super - @attrs = [:sac_fee_article_number, - :sac_entry_fee_article_number, - :hut_solidarity_fee_article_number, - :magazine_fee_article_number, - :magazine_postage_abroad_article_number, - :section_fee_article_number, - :section_entry_fee_article_number, - :section_bulletin_postage_abroad_article_number, - :service_fee_article_number, - :balancing_payment_article_number, - :course_fee_article_number] - end - - end -end diff --git a/app/components/sac_membership_configs/field_rows_component.html.haml b/app/components/sac_membership_configs/field_rows_component.html.haml deleted file mode 100644 index 92972e8f6..000000000 --- a/app/components/sac_membership_configs/field_rows_component.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -.container.ml-0 - - @attrs.each do |attr| - .row - .col-3.p-1 - = t("#{model_class_plural}.form.#{attr}") - .col-3.p-1 - .input-group.input-group-sm - = @form.input_field attr - - if currency?(attr) - %span.input-group-text - = t('global.currency') - - if years?(attr) - %span.input-group-text - = t('global.years') diff --git a/app/components/sac_membership_configs/field_rows_component.rb b/app/components/sac_membership_configs/field_rows_component.rb deleted file mode 100644 index 5425619db..000000000 --- a/app/components/sac_membership_configs/field_rows_component.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of -# hitobito_sac_cas and licensed under the Affero General Public License version 3 -# or later. See the COPYING file at the top-level directory or at -# https://github.com/hitobito/hitobito_sac_cas - -module SacMembershipConfigs - class FieldRowsComponent < ApplicationComponent - - delegate :entry, :model_class, :column_type, to: :helpers - - def initialize(form:, attrs:) - @form = form - @attrs = attrs - end - - private - - def currency?(attr) - column_type(entry, attr) == :decimal - end - - def years?(attr) - attr.to_s.match?(/_age|_years/) - end - - def model_class_plural - model_class.to_s.underscore.pluralize - end - - end -end diff --git a/app/components/sac_membership_configs/valid_from_selector_component.html.haml b/app/components/sac_membership_configs/valid_from_selector_component.html.haml index 2e35fe152..a96639c36 100644 --- a/app/components/sac_membership_configs/valid_from_selector_component.html.haml +++ b/app/components/sac_membership_configs/valid_from_selector_component.html.haml @@ -1,6 +1,6 @@ %ul.pagination.pagination-sm - @available_configs.each do |config| - %li.page-item{ class: [active?(config) && 'active'] } + %li.page-item{ class: item_class(config) } = link_to_edit_config(config) - %li.page-item{ class: [entry.new_record? && 'active'] } + %li.page-item{ class: new_item_class } = link_new_config diff --git a/app/components/sac_membership_configs/valid_from_selector_component.rb b/app/components/sac_membership_configs/valid_from_selector_component.rb index 55a6fe98f..bc7c90ecc 100644 --- a/app/components/sac_membership_configs/valid_from_selector_component.rb +++ b/app/components/sac_membership_configs/valid_from_selector_component.rb @@ -10,25 +10,34 @@ class ValidFromSelectorComponent < ApplicationComponent delegate :entry, to: :helpers - def initialize(available_configs:) + def initialize(group, available_configs) + @group = group @available_configs = available_configs end private + def item_class(config) + 'active' if active?(config) + end + + def new_item_class + 'active' if entry.new_record? + end + def active?(config) config.id == params[:id].to_i end def link_to_edit_config(config) link_to(config.valid_from, - edit_group_sac_membership_config_path(group_id: Group.root.id, id: config.id), + polymorphic_path([@group, config], action: :edit), class: 'page-link') end def link_new_config - link_to(t('sac_membership_configs.global.link.add'), - new_group_sac_membership_config_path(group_id: Group.root.id), + link_to(t('sac_section_membership_configs.global.link.add'), + polymorphic_path([@group, entry.class], action: :new), class: 'page-link') end diff --git a/app/components/sac_section_membership_configs/reduction_field_rows_component.rb b/app/components/sac_section_membership_configs/reduction_field_rows_component.rb deleted file mode 100644 index 7fb4a201d..000000000 --- a/app/components/sac_section_membership_configs/reduction_field_rows_component.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of -# hitobito_sac_cas and licensed under the Affero General Public License version 3 -# or later. See the COPYING file at the top-level directory or at -# https://github.com/hitobito/hitobito_sac_cas - -module SacSectionMembershipConfigs - class ReductionFieldRowsComponent < SacMembershipConfigs::FieldRowsComponent - - def initialize(form:, attrs: []) - super - @attrs = [:sac_fee_exemption_for_honorary_members, - :sac_section_fee_exemption_for_honorary_members, - :sac_fee_exemption_for_benefited_members, - :sac_section_fee_exemption_for_benefited_members, - :reduction_amount, - :reduction_required_membership_years, - :reduction_required_age] - - end - - end -end diff --git a/app/components/sac_section_membership_configs/valid_from_selector_component.html.haml b/app/components/sac_section_membership_configs/valid_from_selector_component.html.haml deleted file mode 100644 index 2e35fe152..000000000 --- a/app/components/sac_section_membership_configs/valid_from_selector_component.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%ul.pagination.pagination-sm - - @available_configs.each do |config| - %li.page-item{ class: [active?(config) && 'active'] } - = link_to_edit_config(config) - %li.page-item{ class: [entry.new_record? && 'active'] } - = link_new_config diff --git a/app/components/sac_section_membership_configs/valid_from_selector_component.rb b/app/components/sac_section_membership_configs/valid_from_selector_component.rb deleted file mode 100644 index 6678e6504..000000000 --- a/app/components/sac_section_membership_configs/valid_from_selector_component.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of -# hitobito_sac_cas and licensed under the Affero General Public License version 3 -# or later. See the COPYING file at the top-level directory or at -# https://github.com/hitobito/hitobito_sac_cas - -module SacSectionMembershipConfigs - class ValidFromSelectorComponent < ApplicationComponent - - delegate :entry, to: :helpers - - def initialize(available_configs:, sac_section_id:) - @available_configs = available_configs - @sac_section_id = sac_section_id - end - - private - - def active?(config) - config.id == params[:id].to_i - end - - def link_to_edit_config(config) - link_to(config.valid_from, - edit_group_sac_section_membership_config_path( - group_id: config.group_id, id: config.id), - class: 'page-link') - end - - def link_new_config - link_to(t('sac_section_membership_configs.global.link.add'), - new_group_sac_section_membership_config_path( - group_id: helpers.params[:group_id]), - class: 'page-link') - end - - end -end diff --git a/app/controllers/concerns/membership_configurable.rb b/app/controllers/concerns/membership_configurable.rb new file mode 100644 index 000000000..8545b52dc --- /dev/null +++ b/app/controllers/concerns/membership_configurable.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of +# hitobito_sac_cas and licensed under the Affero General Public License version 3 +# or later. See the COPYING file at the top-level directory or at +# https://github.com/hitobito/hitobito_sac_cas + +module MembershipConfigurable + extend ActiveSupport::Concern + + included do + helper_method :cancel_url, :available_configs, :group + before_action :assert_group_type + end + + def index + redirect_to latest_config_entry_path + end + + def show + redirect_to edit_path(find_entry) + end + + private + + def build_entry + if latest_config + attrs = latest_config.attributes + attrs.delete('id') + attrs[:valid_from] = latest_config.valid_from + 1 + else + attrs = new_entry_values + end + model_class.new(attrs) + end + + def latest_config_entry_path + if latest_config + edit_path(latest_config) + else + new_path + end + end + + def find_entry + group_configs.find(params[:id]) + end + + def edit_path(config) + polymorphic_path([group, config], action: :edit) + end + + def new_path + polymorphic_path([group, model_class], action: :new) + end + + def cancel_url + group_path(id: group.id) + end + + def available_configs + @available_configs ||= group_configs.list.to_a + end + + def group_configs + model_class.all + end + + def latest_config + available_configs.last + end + +end diff --git a/app/controllers/sac_membership_configs_controller.rb b/app/controllers/sac_membership_configs_controller.rb index 784b9eb46..efb2bbec5 100644 --- a/app/controllers/sac_membership_configs_controller.rb +++ b/app/controllers/sac_membership_configs_controller.rb @@ -6,111 +6,61 @@ # https://github.com/hitobito/hitobito_sac_cas class SacMembershipConfigsController < CrudController - self.nesting = Group - self.permitted_attrs =[:valid_from, - :sac_fee_adult, - :sac_fee_family, - :sac_fee_youth, - :entry_fee_adult, - :entry_fee_family, - :entry_fee_youth, - :hut_solidarity_fee_with_hut_adult, - :hut_solidarity_fee_with_hut_family, - :hut_solidarity_fee_with_hut_youth, - :hut_solidarity_fee_without_hut_adult, - :hut_solidarity_fee_without_hut_family, - :hut_solidarity_fee_without_hut_youth, - :magazine_fee_adult, - :magazine_fee_family, - :magazine_fee_youth, - :service_fee, - :magazine_postage_abroad, - :reduction_amount, - :reduction_required_membership_years, - :sac_fee_article_number, - :sac_entry_fee_article_number, - :hut_solidarity_fee_article_number, - :magazine_fee_article_number, - :section_bulletin_postage_abroad_article_number, - :service_fee_article_number, - :balancing_payment_article_number, - :course_fee_article_number, - :discount_date_1, - :discount_percent_1, - :discount_date_2, - :discount_percent_2, - :discount_date_3, - :discount_percent_3] - - decorates :sac_membership_config - helper_method :cancel_url, :available_configs - before_action :assert_root_layer + include MembershipConfigurable - def index - redirect_to latest_config_entry_path - end + self.nesting = Group + self.permitted_attrs = [:valid_from, + :sac_fee_adult, + :sac_fee_family, + :sac_fee_youth, + :entry_fee_adult, + :entry_fee_family, + :entry_fee_youth, + :hut_solidarity_fee_with_hut_adult, + :hut_solidarity_fee_with_hut_family, + :hut_solidarity_fee_with_hut_youth, + :hut_solidarity_fee_without_hut_adult, + :hut_solidarity_fee_without_hut_family, + :hut_solidarity_fee_without_hut_youth, + :magazine_fee_adult, + :magazine_fee_family, + :magazine_fee_youth, + :service_fee, + :magazine_postage_abroad, + :reduction_amount, + :reduction_required_membership_years, + :sac_fee_article_number, + :sac_entry_fee_article_number, + :hut_solidarity_fee_article_number, + :magazine_fee_article_number, + :section_bulletin_postage_abroad_article_number, + :service_fee_article_number, + :balancing_payment_article_number, + :course_fee_article_number, + :discount_date_1, + :discount_percent_1, + :discount_date_2, + :discount_percent_2, + :discount_date_3, + :discount_percent_3] - def show - redirect_to edit_path(params[:id]) - end private - def build_entry - if latest_config - attrs = latest_config.attributes - attrs.delete('id') - attrs[:valid_from] = latest_config.valid_from + 1 - else - attrs = new_entry_values - end - SacMembershipConfig.new(attrs) - end - def new_entry_values - { valid_from: Time.zone.now.year, - discount_date_1: '1.1.', - discount_date_2: '1.7.', - discount_date_3: '1.10.' + { + valid_from: Time.zone.now.year, + discount_date_1: '1.7.', + discount_date_2: '1.10.' } end - def find_entry - SacMembershipConfig.find(params[:id]) - end - - def latest_config_entry_path - if latest_config - edit_path(latest_config.id) - else - new_path - end - end - - def edit_path(id) - helpers.edit_group_sac_membership_config_path(group_id: Group.root.id, id: id) - end - - def new_path - helpers.new_group_sac_membership_config_path(group_id: Group.root.id) - end - - def cancel_url - group_path(id: Group.root.id) + def group + parent end - def available_configs - @available_configs ||= SacMembershipConfig.order(:valid_from) - end - - def latest_config - available_configs.last - end - - def assert_root_layer - return if params[:group_id].to_i == Group.root.id - - head :not_found + def assert_group_type + head :not_found unless group.root? end end diff --git a/app/controllers/sac_section_membership_configs_controller.rb b/app/controllers/sac_section_membership_configs_controller.rb index cd66f47e0..3480efb5a 100644 --- a/app/controllers/sac_section_membership_configs_controller.rb +++ b/app/controllers/sac_section_membership_configs_controller.rb @@ -6,93 +6,44 @@ # https://github.com/hitobito/hitobito_sac_cas class SacSectionMembershipConfigsController < CrudController - self.nesting = Group - self.permitted_attrs =[:valid_from, - :sac_section_fee_adult, - :sac_section_fee_family, - :sac_section_fee_youth, - :entry_fee_adult, - :entry_fee_family, - :entry_fee_youth, - :bulletin_postage_abroad, - :sac_fee_exemption_for_honorary_members, - :sac_section_fee_exemption_for_honorary_members, - :sac_fee_exemption_for_benefited_members, - :sac_section_fee_exemption_for_benefited_members, - :reduction_amount, - :reduction_required_membership_years, - :reduction_required_age] - - decorates :sac_section_membership_config - helper_method :cancel_url, :available_configs, :sac_section - - before_action :assert_sac_section_or_ortsgruppe - def index - redirect_to latest_config_entry_path - end + include MembershipConfigurable - def show - redirect_to edit_path(params[:id]) - end + self.nesting = Group + self.permitted_attrs = [:valid_from, + :section_fee_adult, + :section_fee_family, + :section_fee_youth, + :section_entry_fee_adult, + :section_entry_fee_family, + :section_entry_fee_youth, + :bulletin_postage_abroad, + :sac_fee_exemption_for_honorary_members, + :section_fee_exemption_for_honorary_members, + :sac_fee_exemption_for_benefited_members, + :section_fee_exemption_for_benefited_members, + :reduction_amount, + :reduction_required_membership_years, + :reduction_required_age] private - def build_entry - if latest_config - attrs = latest_config.attributes - attrs.delete('id') - attrs[:valid_from] = latest_config.valid_from + 1 - else - attrs = { valid_from: Time.zone.now.year } - end - SacSectionMembershipConfig.new(attrs) + def new_entry_values + { + valid_from: Time.zone.now.year, + group: group + } end - def find_entry - SacSectionMembershipConfig.find(params[:id]) + def group + @group ||= Group.find_by(id: params[:group_id], type: model_class.group_types) end - def latest_config_entry_path - if latest_config - edit_path(latest_config.id) - else - new_path - end + def group_configs + model_class.where(group_id: group.id) end - def edit_path(id) - helpers.edit_group_sac_section_membership_config_path(group_id: sac_section.id, id: id) - end - - def new_path - helpers.new_group_sac_section_membership_config_path(group_id: sac_section.id) - end - - def cancel_url - group_path(id: sac_section.id) - end - - def available_configs - @available_configs ||= - SacSectionMembershipConfig.where(group_id: sac_section.id).order(:valid_from) - end - - def latest_config - available_configs.last - end - - def sac_section - @sac_section ||= fetch_sac_section - end - - def fetch_sac_section - Group.find_by(id: params[:group_id], type: model_class.group_types) - end - - def assert_sac_section_or_ortsgruppe - return if sac_section - - head :not_found + def assert_group_type + head :not_found unless group end end diff --git a/app/decorators/sac_membership_config_decorator.rb b/app/decorators/sac_membership_config_decorator.rb deleted file mode 100644 index bc7c75bdc..000000000 --- a/app/decorators/sac_membership_config_decorator.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of -# hitobito_sac_cas and licensed under the Affero General Public License version 3 -# or later. See the COPYING file at the top-level directory or at -# https://github.com/hitobito/hitobito_sac_cas. - -class SacMembershipConfigDecorator < ApplicationDecorator - decorates SacMembershipConfig - - def to_s - "#{@object.class.model_name.human} (#{valid_from})" - end - -end diff --git a/app/decorators/sac_section_membership_config_decorator.rb b/app/decorators/sac_section_membership_config_decorator.rb deleted file mode 100644 index 7213df280..000000000 --- a/app/decorators/sac_section_membership_config_decorator.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of -# hitobito_sac_cas and licensed under the Affero General Public License version 3 -# or later. See the COPYING file at the top-level directory or at -# https://github.com/hitobito/hitobito_sac_cas. - -class SacSectionMembershipConfigDecorator < ApplicationDecorator - decorates SacSectionMembershipConfig - - def to_s - "#{@object.class.model_name.human} (#{valid_from})" - end - -end diff --git a/app/models/group/ortsgruppe.rb b/app/models/group/ortsgruppe.rb index 042edac46..92432da01 100644 --- a/app/models/group/ortsgruppe.rb +++ b/app/models/group/ortsgruppe.rb @@ -24,15 +24,17 @@ class Group::Ortsgruppe < ::Group Group::SektionsNeuanmeldungenNv, Group::SektionsTourenkommission ] - mounted_attr :foundation_year, :integer validates :foundation_year, numericality: { greater_or_equal_to: 1863, smaller_than: Time.zone.now.year + 2 } + mounted_attr :foundation_year, :integer mounted_attr :section_canton, :string, enum: Cantons.short_name_strings.map(&:upcase) mounted_attr :language, :string, enum: %w(DE FR IT), default: 'DE', null: false mounted_attr :mitglied_termination_by_section_only, :boolean, default: false, null: false + has_many :sac_section_membership_configs, dependent: :destroy + def sac_cas_self_registration_url(host) Groups::SektionSelfRegistrationLink.new(self, host).url end diff --git a/app/models/group/sac_cas.rb b/app/models/group/sac_cas.rb index 105aae4cb..bb9676021 100644 --- a/app/models/group/sac_cas.rb +++ b/app/models/group/sac_cas.rb @@ -30,7 +30,7 @@ def mount_mailing_lists(*keys) validate :assert_valid_course_admin_email - has_many :sac_membership_configs + has_many :sac_membership_configs, dependent: :destroy private diff --git a/app/models/group/sektion.rb b/app/models/group/sektion.rb index 83c9d11ba..6a4e3efd8 100644 --- a/app/models/group/sektion.rb +++ b/app/models/group/sektion.rb @@ -34,7 +34,7 @@ class Group::Sektion < ::Group mounted_attr :language, :string, enum: %w(DE FR IT), default: 'DE', null: false mounted_attr :mitglied_termination_by_section_only, :boolean, default: false, null: false - has_many :sektion_membership_configs + has_many :sac_section_membership_configs, dependent: :destroy def sac_cas_self_registration_url(host) Groups::SektionSelfRegistrationLink.new(self, host).url diff --git a/app/models/sac_membership_config.rb b/app/models/sac_membership_config.rb index d52883625..06e206c6d 100644 --- a/app/models/sac_membership_config.rb +++ b/app/models/sac_membership_config.rb @@ -44,19 +44,25 @@ # service_fee_article_number :string(255) not null # balancing_payment_article_number :string(255) not null # course_fee_article_number :string(255) not null +# magazine_postage_abroad_article_number :string(255) not null +# section_fee_article_number :string(255) not null +# section_entry_fee_article_number :string(255) not null # # class SacMembershipConfig < ApplicationRecord - validates_by_schema attr_readonly :valid_from + validates_by_schema # date format: 1.7., 1.10. validates :discount_date_1, :discount_date_2, :discount_date_3, - format: { with: /\A[0123]?\d\.[012]?\d\.\z/ }, allow_blank: true + format: { with: /\A[0123]?\d\.[012]?\d\.\z/ }, + allow_blank: true + + scope :list, -> { order(:valid_from) } def to_s - valid_from + "#{self.class.model_name.human} (#{valid_from})" end end diff --git a/app/models/sac_section_membership_config.rb b/app/models/sac_section_membership_config.rb index b69922513..eae86468e 100644 --- a/app/models/sac_section_membership_config.rb +++ b/app/models/sac_section_membership_config.rb @@ -12,46 +12,47 @@ # id :bigint not null, primary key # valid_from :integer not null # group_id :bigint -# sac_section_fee_adult :decimal(5, 2) not null -# sac_section_fee_family :decimal(5, 2) not null -# sac_section_fee_youth :decimal(5, 2) not null -# entry_fee_adult :decimal(5, 2) not null -# entry_fee_family :decimal(5, 2) not null -# entry_fee_youth :decimal(5, 2) not null +# section_fee_adult :decimal(5, 2) not null +# section_fee_family :decimal(5, 2) not null +# section_fee_youth :decimal(5, 2) not null +# section_entry_fee_adult :decimal(5, 2) not null +# section_entry_fee_family :decimal(5, 2) not null +# section_entry_fee_youth :decimal(5, 2) not null # bulletin_postage_abroad :decimal(5, 2) not null # sac_fee_exemption_for_honorary_members :boolean default(FALSE), not null -# sac_section_fee_exemption_for_honorary_members :boolean default(FALSE), not null +# section_fee_exemption_for_honorary_members :boolean default(FALSE), not null # sac_fee_exemption_for_benefited_members :boolean default(FALSE), not null -# sac_section_fee_exemption_for_benefited_members :boolean default(FALSE), not null +# section_fee_exemption_for_benefited_members :boolean default(FALSE), not null # reduction_amount :decimal(5, 2) not null # reduction_required_membership_years :integer # reduction_required_age :integer # class SacSectionMembershipConfig < ApplicationRecord - validates_by_schema attr_readonly :valid_from, :group_id belongs_to :group + validates_by_schema + validates :valid_from, uniqueness: { scope: :group_id } validate :assert_sac_section_or_ortsgruppe - validates :valid_from, uniqueness: { scope: :group_id } + scope :list, -> { order(:valid_from) } def self.group_types [Group::Sektion, Group::Ortsgruppe] end def to_s - valid_from + "#{self.class.model_name.human} (#{valid_from})" end private def assert_sac_section_or_ortsgruppe - return if group && self.class.group_types.one? {|t| group.is_a?(t) } + return if group && self.class.group_types.one? { |t| group.is_a?(t) } - errors.add(:group, 'Group must be present and Sac Section or Ortsgruppe') + errors.add(:group, :invalid) end end diff --git a/app/views/sac_membership_configs/_form.html.haml b/app/views/sac_membership_configs/_form.html.haml index 67c5a5ac5..3cc729f8f 100644 --- a/app/views/sac_membership_configs/_form.html.haml +++ b/app/views/sac_membership_configs/_form.html.haml @@ -2,190 +2,59 @@ -# hitobito_sac_cas and licensed under the Affero General Public License version 3 -# or later. See the COPYING file at the top-level directory or at -# https://github.com/hitobito/hitobito_sac_cas. -= render(SacMembershipConfigs::ValidFromSelectorComponent.new(available_configs: available_configs)) + += render(SacMembershipConfigs::ValidFromSelectorComponent.new(parent, available_configs)) = entry_form(cancel_url: cancel_url, buttons_top: false) do |f| - if entry.new_record? = field_set_tag do - = render(SacMembershipConfigs::FieldRowsComponent.new(form: f, attrs: [:valid_from])) + = f.labeled_input_field(:valid_from) = field_set_tag(t('sac_membership_configs.form.fees')) do - .container.ml-0 - .row - .col-3.p-1 - .col-3.p-1 - = t('.membership_adult') - .col-3.p-1 - = t('.membership_family') - .col-3.p-1 - = t('.membership_youth') - .row - .col-3.p-1 - = t('.sac_fee') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :sac_fee_adult - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :sac_fee_family - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :sac_fee_youth - %span.input-group-text - = t('global.currency') - .row - .col-3.p-1 - = t('.entry_fee') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :entry_fee_adult - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :entry_fee_family - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :entry_fee_youth - %span.input-group-text - = t('global.currency') - .row - .col-3.p-1 - = t('.hut_solidarity_fee_without_hut') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :hut_solidarity_fee_without_hut_adult - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :hut_solidarity_fee_without_hut_family - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :hut_solidarity_fee_without_hut_youth - %span.input-group-text - = t('global.currency') - .row - .col-3.p-1 - = t('.hut_solidarity_fee_with_hut') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :hut_solidarity_fee_with_hut_adult - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :hut_solidarity_fee_with_hut_family - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :hut_solidarity_fee_with_hut_youth - %span.input-group-text - = t('global.currency') - .row - .col-3.p-1 - = t('.magazine_fee') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :magazine_fee_adult - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :magazine_fee_family - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :magazine_fee_youth - %span.input-group-text - = t('global.currency') - .row.pt-5 - .col-3.p-1 - = SacMembershipConfig.human_attribute_name(:service_fee) - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :service_fee - %span.input-group-text - = t('global.currency') - .row - .col-3.p-1 - = SacMembershipConfig.human_attribute_name(:magazine_postage_abroad) - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :magazine_postage_abroad - %span.input-group-text - = t('global.currency') + .row.mb-2 + .d-flex.col-md-9.col-lg-8.col-xl-8.mw-63ch.offset-md-3.offset-xl-2 + - [:adult, :family, :youth].each do |category| + .col-4.mr-5 + = t(".membership_#{category}") + + - [:sac_fee, :entry_fee, :hut_solidarity_fee_without_hut, :hut_solidarity_fee_with_hut, :magazine_fee].each do |field| + = f.labeled("#{field}_adult", t(".#{field}"), class: 'd-flex') do + - [:adult, :family, :youth].each do |category| + .col-4.mr-5 + = f.with_addon(t('global.currency'), f.input_field("#{field}_#{category}")) + + .row.mt-4 + = f.labeled_input_field :magazine_postage_abroad, addon: t('global.currency') + = f.labeled_input_field :service_fee, addon: t('global.currency') = field_set_tag(t('.reductions')) do - .container.ml-0 - .row - .col-3.p-1 - = SacMembershipConfig.human_attribute_name(:reduction_amount) - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :reduction_amount - %span.input-group-text - = t('global.currency') - .row - .col-3.p-1 - = SacMembershipConfig.human_attribute_name(:reduction_required_membership_years) - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :reduction_required_membership_years - %span.input-group-text - = t('global.years') + = f.labeled_input_field :reduction_amount, addon: t('global.currency') + = f.labeled_input_field :reduction_required_membership_years, addon: t('global.years') = field_set_tag(t('.discounts')) do - .container.ml-0 - .row - .col-3.p-1 - .col-3.p-1 + .row.mb-2 + .d-flex.col-md-9.col-lg-8.col-xl-8.mw-63ch.offset-md-3.offset-xl-2 + .col-4.mr-5 = t('.discount_date') - .col-3.p-1 + .col-4 = t('.discount') - .row - .col-3.p-1 - = SacMembershipConfig.human_attribute_name(:discount_date_1) - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :discount_date_1 - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :discount_percent_1 - %span.input-group-text - = '%' - .row - .col-3.p-1 - = SacMembershipConfig.human_attribute_name(:discount_date_2) - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :discount_date_2 - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :discount_percent_2 - %span.input-group-text - = '%' - .row - .col-3.p-1 - = SacMembershipConfig.human_attribute_name(:discount_date_3) - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :discount_date_3 - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :discount_percent_3 - %span.input-group-text - = '%' + - [1, 2, 3].each do |i| + = f.labeled("discount_date_#{i}", class: 'd-flex') do + .col-4.mr-5 + = f.input_field("discount_date_#{i}") + .col-4 + = f.with_addon('%', f.input_field("discount_percent_#{i}")) = field_set_tag(t('.article_numbers')) do - = render(SacMembershipConfigs::ArticleNumberFieldRowsComponent.new(form: f)) + = f.labeled_input_fields :sac_fee_article_number, + :sac_entry_fee_article_number, + :hut_solidarity_fee_article_number, + :magazine_fee_article_number, + :magazine_postage_abroad_article_number, + :section_fee_article_number, + :section_entry_fee_article_number, + :section_bulletin_postage_abroad_article_number, + :service_fee_article_number, + :balancing_payment_article_number, + :course_fee_article_number + diff --git a/app/views/sac_section_membership_configs/_form.html.haml b/app/views/sac_section_membership_configs/_form.html.haml index 205086548..440a62907 100644 --- a/app/views/sac_section_membership_configs/_form.html.haml +++ b/app/views/sac_section_membership_configs/_form.html.haml @@ -3,67 +3,35 @@ -# or later. See the COPYING file at the top-level directory or at -# https://github.com/hitobito/hitobito_sac_cas. -= render(SacSectionMembershipConfigs::ValidFromSelectorComponent.new(available_configs: available_configs, sac_section_id: sac_section.id)) += render(SacMembershipConfigs::ValidFromSelectorComponent.new(parent, available_configs)) = entry_form(cancel_url: cancel_url, buttons_top: false) do |f| - if entry.new_record? = field_set_tag do - = render(SacMembershipConfigs::FieldRowsComponent.new(form: f, attrs: [:valid_from])) + = f.labeled_input_field :valid_from = field_set_tag(t('sac_section_membership_configs.form.fees')) do - .container.ml-0 - .row - .col-3.p-1 - .col-3.p-1 - = t('.membership_adult') - .col-3.p-1 - = t('.membership_family') - .col-3.p-1 - = t('.membership_youth') - .row - .col-3.p-1 - = t('.sac_section_fee') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :sac_section_fee_adult - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :sac_section_fee_family - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :sac_section_fee_youth - %span.input-group-text - = t('global.currency') - .row - .col-3.p-1 - = t('.entry_fee') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :entry_fee_adult - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :entry_fee_family - %span.input-group-text - = t('global.currency') - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :entry_fee_youth - %span.input-group-text - = t('global.currency') - .row.pt-5 - .col-3.p-1 - = SacSectionMembershipConfig.human_attribute_name(:bulletin_postage_abroad) - .col-3.p-1 - .input-group.input-group-sm - = f.input_field :bulletin_postage_abroad - %span.input-group-text - = t('global.currency') + .row.mb-2 + .d-flex.col-md-9.col-lg-8.col-xl-8.mw-63ch.offset-md-3.offset-xl-2 + - [:adult, :family, :youth].each do |category| + .col-4.mr-5 + = t(".membership_#{category}") + + - [:section_fee, :section_entry_fee].each do |field| + = f.labeled("#{field}_adult", t(".#{field}"), class: 'd-flex') do + - [:adult, :family, :youth].each do |category| + .col-4.mr-5 + = f.with_addon(t('global.currency'), f.input_field("#{field}_#{category}")) + + .row.mt-4 + = f.labeled_input_field :bulletin_postage_abroad, addon: t('global.currency') = field_set_tag(t('.reductions')) do - = render(SacSectionMembershipConfigs::ReductionFieldRowsComponent.new(form: f)) + = f.labeled_input_fields :sac_fee_exemption_for_honorary_members, + :section_fee_exemption_for_honorary_members, + :sac_fee_exemption_for_benefited_members, + :section_fee_exemption_for_benefited_members + = f.labeled_input_field :reduction_amount, addon: t('global.currency') + = f.labeled_input_field :reduction_required_membership_years, addon: t('global.years') + = f.labeled_input_field :reduction_required_age, addon: t('global.years') + diff --git a/config/locales/wagon.de.yml b/config/locales/wagon.de.yml index c97ab4ac1..fe9c9cdc6 100644 --- a/config/locales/wagon.de.yml +++ b/config/locales/wagon.de.yml @@ -253,17 +253,17 @@ de: magazine_postage_abroad: Porto Ausland SAC Magazin reduction_amount: Reduktionsbetrag reduction_required_membership_years: Reduktion ab Mitgliedsjahren - sac_fee_article_number: Zentralverbandsbeitrag, Artikelnummer - sac_entry_fee_article_number: Zentralverbandseintrittsgebühren, Artikelnummer - hut_solidarity_fee_article_number: Hüttensolidaritätsbeitrag, Artikelnummer - magazine_fee_article_number: Abogebühr SAC Magazin, Artikelnummer - magazine_postage_abroad_article_number: Porto Ausland SAC Magazin, Artikelnummer - section_entry_fee_article_number: Sektionseintrittsgebühren, Artikelnummer - section_fee_article_number: Sektionsbeitrag, Artikelnummer - section_bulletin_postage_abroad_article_number: Porto Ausland Sektionsbulletin, Artikelnummer - service_fee_article_number: Servicegebühr, Artikelnummer - balancing_payment_article_number: Sektionseintrittsgebühren, Artikelnummer - course_fee_article_number: Porto Ausland Sektionsbulletin, Artikelnummer + sac_fee_article_number: Zentralverbandsbeitrag + sac_entry_fee_article_number: Zentralverbandseintrittsgebühren + hut_solidarity_fee_article_number: Hüttensolidaritätsbeitrag + magazine_fee_article_number: Abogebühr SAC Magazin + magazine_postage_abroad_article_number: Porto Ausland SAC Magazin + section_entry_fee_article_number: Sektionseintrittsgebühren + section_fee_article_number: Sektionsbeitrag + section_bulletin_postage_abroad_article_number: Porto Ausland Sektionsbulletin + service_fee_article_number: Servicegebühr + balancing_payment_article_number: Ausgleichszahlungen + course_fee_article_number: Kursgebühren discount_date_1: Rabattdatum 1 discount_percent_1: Rabattprozent 1 discount_date_2: Rabattdatum 2 @@ -272,17 +272,17 @@ de: discount_percent_3: Rabattprozent 3 sac_section_membership_config: valid_from: Gültig ab Jahr - sac_section_fee_adult: Sektionsbeitrag, Mitgliedschaft Einzel - sac_section_fee_family: Sektionsbeitrag, Mitgliedschaft Familie - sac_section_fee_youth: Sektionsbeitrag, Mitgliedschaft Jugend - entry_fee_adult: Eintrittsgebühr, Mitgliedschaft Einzel - entry_fee_family: Eintrittsgebühr, Mitgliedschaft Familie - entry_fee_youth: Eintrittsgebühr, Mitgliedschaft Jugend + section_fee_adult: Sektionsbeitrag, Mitgliedschaft Einzel + section_fee_family: Sektionsbeitrag, Mitgliedschaft Familie + section_fee_youth: Sektionsbeitrag, Mitgliedschaft Jugend + section_entry_fee_adult: Eintrittsgebühr, Mitgliedschaft Einzel + section_entry_fee_family: Eintrittsgebühr, Mitgliedschaft Familie + section_entry_fee_youth: Eintrittsgebühr, Mitgliedschaft Jugend bulletin_postage_abroad: Porto Ausland Sektionsbulletin sac_fee_exemption_for_honorary_members: Zentralverbandsgebührenerlass für Ehrenmitglieder - sac_section_fee_exemption_for_honorary_members: Sektionsgebührenerlass für Ehrenmitglieder + section_fee_exemption_for_honorary_members: Sektionsgebührenerlass für Ehrenmitglieder sac_fee_exemption_for_benefited_members: Zentralverbandsgebührenerlass für Begünstigte - sac_section_fee_exemption_for_benefited_members: Sektionsgebührenerlass für Begünstigte + section_fee_exemption_for_benefited_members: Sektionsgebührenerlass für Begünstigte reduction_amount: Reduktionsbetrag Mitgliedsjahre/Alter reduction_required_membership_years: Reduktion ab Mitgliedsjahren reduction_required_age: Reduktion ab Altersjahren @@ -872,17 +872,6 @@ de: magazine_postage_abroad: Porto Ausland SAC Magazin reduction_amount: Reduktionsbetrag reduction_required_membership_years: Reduktion ab Mitgliedsjahren - sac_fee_article_number: Zentralverbandsbeitrag - sac_entry_fee_article_number: Zentralverbandseintrittsgebühren - hut_solidarity_fee_article_number: Hüttensolidaritätsbeitrag - magazine_fee_article_number: Abogebühr SAC Magazin - magazine_postage_abroad_article_number: Porto Ausland SAC Magazin - section_entry_fee_article_number: Sektionseintrittsgebühren - section_fee_article_number: Sektionsbeitrag - section_bulletin_postage_abroad_article_number: Porto Ausland Sektionsbulletin - service_fee_article_number: Servicegebühr - balancing_payment_article_number: Sektionseintrittsgebühren - course_fee_article_number: Porto Ausland Sektionsbulletin discount_date_1: Rabattdatum 1 discount_percent_1: Rabattprozent 1 discount_date_2: Rabattdatum 2 @@ -899,16 +888,16 @@ de: membership_adult: Mitgliedschaft Einzel membership_family: Mitgliedschaft Familie membership_youth: Mitgliedschaft Jugend - sac_section_fee: Sektionsbeitrag - entry_fee: Eintrittsgebühr + section_fee: Sektionsbeitrag + section_entry_fee: Eintrittsgebühr bulletin_fee: Abogebühr Sektionsbulletin reductions: Reduktionen valid_from: Gültig ab Jahr bulletin_postage_abroad: Porto Ausland Sektionsbulletin sac_fee_exemption_for_honorary_members: Zentralverbandsgebührenerlass für Ehrenmitglieder - sac_section_fee_exemption_for_honorary_members: Sektionsgebührenerlass für Ehrenmitglieder + section_fee_exemption_for_honorary_members: Sektionsgebührenerlass für Ehrenmitglieder sac_fee_exemption_for_benefited_members: Zentralverbandsgebührenerlass für Begünstigte - sac_section_fee_exemption_for_benefited_members: Sektionsgebührenerlass für Begünstigte + section_fee_exemption_for_benefited_members: Sektionsgebührenerlass für Begünstigte reduction_amount: Reduktionsbetrag Mitgliedsjahre/Alter reduction_required_membership_years: Reduktion ab Mitgliedsjahren reduction_required_age: Reduktion ab Altersjahren diff --git a/db/migrate/20240513070825_create_sac_section_membership_configs.rb b/db/migrate/20240513070825_create_sac_section_membership_configs.rb index 7e89f9db4..f4c8c6855 100644 --- a/db/migrate/20240513070825_create_sac_section_membership_configs.rb +++ b/db/migrate/20240513070825_create_sac_section_membership_configs.rb @@ -10,22 +10,22 @@ class CreateSacSectionMembershipConfigs < ActiveRecord::Migration[6.1] def change create_table :sac_section_membership_configs do |t| t.integer :valid_from, null: false, length: 4 - t.references :group + t.references :group, null: false # fees - t.decimal :sac_section_fee_adult, precision: 5, scale: 2, null: false - t.decimal :sac_section_fee_family, precision: 5, scale: 2, null: false - t.decimal :sac_section_fee_youth, precision: 5, scale: 2, null: false - t.decimal :entry_fee_adult, precision: 5, scale: 2, null: false - t.decimal :entry_fee_family, precision: 5, scale: 2, null: false - t.decimal :entry_fee_youth, precision: 5, scale: 2, null: false + t.decimal :section_fee_adult, precision: 5, scale: 2, null: false + t.decimal :section_fee_family, precision: 5, scale: 2, null: false + t.decimal :section_fee_youth, precision: 5, scale: 2, null: false + t.decimal :section_entry_fee_adult, precision: 5, scale: 2, null: false + t.decimal :section_entry_fee_family, precision: 5, scale: 2, null: false + t.decimal :section_entry_fee_youth, precision: 5, scale: 2, null: false t.decimal :bulletin_postage_abroad, precision: 5, scale: 2, null: false # reductions t.boolean :sac_fee_exemption_for_honorary_members, null: false, default: false - t.boolean :sac_section_fee_exemption_for_honorary_members, null: false, default: false + t.boolean :section_fee_exemption_for_honorary_members, null: false, default: false t.boolean :sac_fee_exemption_for_benefited_members, null: false, default: false - t.boolean :sac_section_fee_exemption_for_benefited_members, null: false, default: false + t.boolean :section_fee_exemption_for_benefited_members, null: false, default: false t.decimal :reduction_amount, precision: 5, scale: 2, null: false t.integer :reduction_required_membership_years, null: true t.integer :reduction_required_age, null: true diff --git a/db/migrate/20240521141824_change_sac_membership_configs.rb b/db/migrate/20240521141824_change_sac_membership_configs.rb index 44e355027..1d37cb32c 100644 --- a/db/migrate/20240521141824_change_sac_membership_configs.rb +++ b/db/migrate/20240521141824_change_sac_membership_configs.rb @@ -8,9 +8,9 @@ class ChangeSacMembershipConfigs < ActiveRecord::Migration[6.1] def change - add_column :sac_membership_configs, :magazine_postage_abroad_article_number, :string, null: true - add_column :sac_membership_configs, :section_entry_fee_article_number, :string, null: true - add_column :sac_membership_configs, :section_fee_article_number, :string, null: true + add_column :sac_membership_configs, :magazine_postage_abroad_article_number, :string, null: false + add_column :sac_membership_configs, :section_entry_fee_article_number, :string, null: false + add_column :sac_membership_configs, :section_fee_article_number, :string, null: false end end diff --git a/db/seeds/development/4_sac_section_membership_configs.rb b/db/seeds/development/4_sac_section_membership_configs.rb index 03c74c1ca..d6c0a71f4 100644 --- a/db/seeds/development/4_sac_section_membership_configs.rb +++ b/db/seeds/development/4_sac_section_membership_configs.rb @@ -9,17 +9,17 @@ SacSectionMembershipConfig.seed_once(:valid_from, :group_id, group_id: s.id, valid_from: '2024', - sac_section_fee_adult: 42, - sac_section_fee_family: 84, - sac_section_fee_youth: 21, - entry_fee_adult: 10, - entry_fee_family: 20, - entry_fee_youth: 5, + section_fee_adult: 42, + section_fee_family: 84, + section_fee_youth: 21, + section_entry_fee_adult: 10, + section_entry_fee_family: 20, + section_entry_fee_youth: 5, bulletin_postage_abroad: 13, sac_fee_exemption_for_honorary_members: false, - sac_section_fee_exemption_for_honorary_members: true, + section_fee_exemption_for_honorary_members: true, sac_fee_exemption_for_benefited_members: true, - sac_section_fee_exemption_for_benefited_members: false, + section_fee_exemption_for_benefited_members: false, reduction_amount: 10, reduction_required_membership_years: 50, reduction_required_age: 42) diff --git a/spec/controllers/sac_membership_configs_controller_spec.rb b/spec/controllers/sac_membership_configs_controller_spec.rb index c2e37fb52..7db398fb7 100644 --- a/spec/controllers/sac_membership_configs_controller_spec.rb +++ b/spec/controllers/sac_membership_configs_controller_spec.rb @@ -46,7 +46,7 @@ end it 'is unavailable if access by other group than root layer' do - get :index, params: { group_id: groups(:bluemlisalp) } + get :index, params: { group_id: groups(:bluemlisalp).id } expect(response).to be_not_found end diff --git a/spec/controllers/sac_section_membership_configs_controller_spec.rb b/spec/controllers/sac_section_membership_configs_controller_spec.rb index 88f02c920..319f1906b 100644 --- a/spec/controllers/sac_section_membership_configs_controller_spec.rb +++ b/spec/controllers/sac_section_membership_configs_controller_spec.rb @@ -80,6 +80,13 @@ expect(response).to be_successful end + it 'is not found for wrong group id' do + expect do + get :edit, params: { group_id: groups(:bluemlisalp_ortsgruppe_ausserberg).id, id: latest_config.id } + end.to raise_error(ActiveRecord::RecordNotFound) + end + + it 'cannot be accessed by non mitglieder verwaltung' do sign_in(people(:mitglied)) @@ -91,7 +98,7 @@ context 'PATCH update' do let(:updated_model_params) do - { sac_section_membership_config: { sac_section_fee_adult: 52 }} + { sac_section_membership_config: { section_fee_adult: 52 }} end it 'updates config and redirects to show/edit form' do @@ -101,7 +108,7 @@ .to redirect_to(group_sac_section_membership_config_path(group_id: sektion.id, id: latest_config.id)) latest_config.reload - expect(latest_config.sac_section_fee_adult).to eq(52) + expect(latest_config.section_fee_adult).to eq(52) end it 'cannot update valid_from' do diff --git a/spec/fixtures/sac_section_membership_configs.yml b/spec/fixtures/sac_section_membership_configs.yml index fef2bbcaa..8e31bca28 100644 --- a/spec/fixtures/sac_section_membership_configs.yml +++ b/spec/fixtures/sac_section_membership_configs.yml @@ -10,17 +10,17 @@ # id :bigint not null, primary key # valid_from :integer not null # group_id :bigint -# sac_section_fee_adult :decimal(5, 2) not null -# sac_section_fee_family :decimal(5, 2) not null -# sac_section_fee_youth :decimal(5, 2) not null -# entry_fee_adult :decimal(5, 2) not null -# entry_fee_family :decimal(5, 2) not null -# entry_fee_youth :decimal(5, 2) not null +# section_fee_adult :decimal(5, 2) not null +# section_fee_family :decimal(5, 2) not null +# section_fee_youth :decimal(5, 2) not null +# section_entry_fee_adult :decimal(5, 2) not null +# section_entry_fee_family :decimal(5, 2) not null +# section_entry_fee_youth :decimal(5, 2) not null # bulletin_postage_abroad :decimal(5, 2) not null # sac_fee_exemption_for_honorary_members :boolean default(FALSE), not null -# sac_section_fee_exemption_for_honorary_members :boolean default(FALSE), not null +# section_fee_exemption_for_honorary_members :boolean default(FALSE), not null # sac_fee_exemption_for_benefited_members :boolean default(FALSE), not null -# sac_section_fee_exemption_for_benefited_members :boolean default(FALSE), not null +# section_fee_exemption_for_benefited_members :boolean default(FALSE), not null # reduction_amount :decimal(5, 2) not null # reduction_required_membership_years :integer # reduction_required_age :integer @@ -29,17 +29,17 @@ '2024': group: bluemlisalp valid_from: '2024' - sac_section_fee_adult: 42 - sac_section_fee_family: 84 - sac_section_fee_youth: 21 - entry_fee_adult: 10 - entry_fee_family: 20 - entry_fee_youth: 5 + section_fee_adult: 42 + section_fee_family: 84 + section_fee_youth: 21 + section_entry_fee_adult: 10 + section_entry_fee_family: 20 + section_entry_fee_youth: 5 bulletin_postage_abroad: 13 sac_fee_exemption_for_honorary_members: false - sac_section_fee_exemption_for_honorary_members: true + section_fee_exemption_for_honorary_members: true sac_fee_exemption_for_benefited_members: true - sac_section_fee_exemption_for_benefited_members: false + section_fee_exemption_for_benefited_members: false reduction_amount: 10 reduction_required_membership_years: 50 reduction_required_age: 42 diff --git a/spec/models/sac_membership_config_spec.rb b/spec/models/sac_membership_config_spec.rb index e6e076188..47ebc4c25 100644 --- a/spec/models/sac_membership_config_spec.rb +++ b/spec/models/sac_membership_config_spec.rb @@ -59,7 +59,7 @@ expect(config).not_to be_valid - error_keys = config.errors.keys + error_keys = config.errors.attribute_names expect(error_keys.count).to eq(2) expect(error_keys).to include(:discount_date_1) expect(error_keys).to include(:discount_date_2) diff --git a/spec/models/sac_section_membership_config_spec.rb b/spec/models/sac_section_membership_config_spec.rb index ae488eb10..fd35e9320 100644 --- a/spec/models/sac_section_membership_config_spec.rb +++ b/spec/models/sac_section_membership_config_spec.rb @@ -7,17 +7,17 @@ # id :bigint not null, primary key # valid_from :integer not null # group_id :bigint -# sac_section_fee_adult :decimal(5, 2) not null -# sac_section_fee_family :decimal(5, 2) not null -# sac_section_fee_youth :decimal(5, 2) not null -# entry_fee_adult :decimal(5, 2) not null -# entry_fee_family :decimal(5, 2) not null -# entry_fee_youth :decimal(5, 2) not null +# section_fee_adult :decimal(5, 2) not null +# section_fee_family :decimal(5, 2) not null +# section_fee_youth :decimal(5, 2) not null +# section_entry_fee_adult :decimal(5, 2) not null +# section_entry_fee_family :decimal(5, 2) not null +# section_entry_fee_youth :decimal(5, 2) not null # bulletin_postage_abroad :decimal(5, 2) not null # sac_fee_exemption_for_honorary_members :boolean default(FALSE), not null -# sac_section_fee_exemption_for_honorary_members :boolean default(FALSE), not null +# section_fee_exemption_for_honorary_members :boolean default(FALSE), not null # sac_fee_exemption_for_benefited_members :boolean default(FALSE), not null -# sac_section_fee_exemption_for_benefited_members :boolean default(FALSE), not null +# section_fee_exemption_for_benefited_members :boolean default(FALSE), not null # reduction_amount :decimal(5, 2) not null # reduction_required_membership_years :integer # reduction_required_age :integer @@ -40,7 +40,7 @@ new_config.group = groups(:root) expect(new_config).not_to be_valid - error_keys = new_config.errors.keys + error_keys = new_config.errors.attribute_names expect(error_keys.count).to eq(1) expect(error_keys).to include(:group) end