From 91d51382ec7c06c4506cf8f0ea1e3089a176f0cc Mon Sep 17 00:00:00 2001 From: Mountain Star Date: Thu, 2 May 2024 16:22:32 +0200 Subject: [PATCH] Wip ... --- .../hitobito/customizable/_wagon.scss | 14 +++ .../sac_membership_configs_controller.rb | 28 +++++ .../sac_membership_config_decorator.rb | 15 +++ app/helpers/sac_cas/dropdown/group_edit.rb | 17 +++ app/helpers/sheet/sac_membership_config.rb | 12 ++ app/models/sac_membership_config.rb | 10 ++ .../sac_membership_configs/_form.html.haml | 113 ++++++++++++++++++ config/locales/wagon.de.yml | 58 +++++++++ config/routes.rb | 1 + ...502124158_create_sac_membership_configs.rb | 49 ++++++++ db/seeds/sac_membership_configs.rb | 36 ++++++ lib/hitobito_sac_cas/wagon.rb | 1 + 12 files changed, 354 insertions(+) create mode 100644 app/controllers/sac_membership_configs_controller.rb create mode 100644 app/decorators/sac_membership_config_decorator.rb create mode 100644 app/helpers/sac_cas/dropdown/group_edit.rb create mode 100644 app/helpers/sheet/sac_membership_config.rb create mode 100644 app/models/sac_membership_config.rb create mode 100644 app/views/sac_membership_configs/_form.html.haml create mode 100644 db/migrate/20240502124158_create_sac_membership_configs.rb create mode 100644 db/seeds/sac_membership_configs.rb diff --git a/app/assets/stylesheets/hitobito/customizable/_wagon.scss b/app/assets/stylesheets/hitobito/customizable/_wagon.scss index 0ccb938b..7ee6a890 100644 --- a/app/assets/stylesheets/hitobito/customizable/_wagon.scss +++ b/app/assets/stylesheets/hitobito/customizable/_wagon.scss @@ -49,3 +49,17 @@ } } } + +.sac-field-container { + width: 1000px; + .sac-field-row { + display: flex; + flex-direction: row; + padding: 5px; + .sac-field-column { + display: flex; + flex-direction: column; + flex: 1; + } + } +} diff --git a/app/controllers/sac_membership_configs_controller.rb b/app/controllers/sac_membership_configs_controller.rb new file mode 100644 index 00000000..4d447306 --- /dev/null +++ b/app/controllers/sac_membership_configs_controller.rb @@ -0,0 +1,28 @@ +# 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 SacMembershipConfigsController < CrudController + self.nesting = Group + + decorates :sac_membership_config + + def index + redirect_to latest_config_entry_path + end + + private + + def find_entry + SacMembershipConfig.find(params[:id]) + end + + def latest_config_entry_path + latest_config = SacMembershipConfig.all.order(valid_from: :desc).limit(1).first + helpers.edit_group_sac_membership_config_path(group_id: Group.root.id, id: latest_config.id) + end + +end diff --git a/app/decorators/sac_membership_config_decorator.rb b/app/decorators/sac_membership_config_decorator.rb new file mode 100644 index 00000000..bc7c75bd --- /dev/null +++ b/app/decorators/sac_membership_config_decorator.rb @@ -0,0 +1,15 @@ +# 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/helpers/sac_cas/dropdown/group_edit.rb b/app/helpers/sac_cas/dropdown/group_edit.rb new file mode 100644 index 00000000..d3025bb0 --- /dev/null +++ b/app/helpers/sac_cas/dropdown/group_edit.rb @@ -0,0 +1,17 @@ +# 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 SacCas::Dropdown::GroupEdit + def initialize(template, group) + super(template, group) + if group.root? + add_item(translate(:sac_membership_configs), + template.group_sac_membership_configs_path( + group_id: Group.root.id)) + end + end +end diff --git a/app/helpers/sheet/sac_membership_config.rb b/app/helpers/sheet/sac_membership_config.rb new file mode 100644 index 00000000..995c1f83 --- /dev/null +++ b/app/helpers/sheet/sac_membership_config.rb @@ -0,0 +1,12 @@ +# 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 Sheet + class SacMembershipConfig < Base + self.parent_sheet = Sheet::Group + end +end diff --git a/app/models/sac_membership_config.rb b/app/models/sac_membership_config.rb new file mode 100644 index 00000000..c7337630 --- /dev/null +++ b/app/models/sac_membership_config.rb @@ -0,0 +1,10 @@ +# 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 SacMembershipConfig < ApplicationRecord + attr_readonly :valid_from +end diff --git a/app/views/sac_membership_configs/_form.html.haml b/app/views/sac_membership_configs/_form.html.haml new file mode 100644 index 00000000..ab71a2ea --- /dev/null +++ b/app/views/sac_membership_configs/_form.html.haml @@ -0,0 +1,113 @@ +-# 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. + += entry_form do |f| + = field_set_tag do + - if entry.new_record? + = f.labeled_input_field :sac_fee_adult + + = field_set_tag(t('sac_membership_configs.form.fees')) do + .sac-field-container + .sac-field-row + .sac-field-column + .sac-field-column + = t('sac_membership_configs.form.membership_adult') + .sac-field-column + = t('sac_membership_configs.form.membership_family') + .sac-field-column + = t('sac_membership_configs.form.membership_youth') + .sac-field-row + .sac-field-column + = t('sac_membership_configs.form.sac_fee') + .sac-field-column + .input-group.input-group-sm + = f.input_field :sac_fee_adult + %span.input-group-text + = t('global.currency') + .sac-field-column + .input-group.input-group-sm + = f.input_field :sac_fee_family + %span.input-group-text + = t('global.currency') + .sac-field-column + .input-group.input-group-sm + = f.input_field :sac_fee_youth + %span.input-group-text + = t('global.currency') + .sac-field-row + .sac-field-column + = t('sac_membership_configs.form.entry_fee') + .sac-field-column + .input-group.input-group-sm + = f.input_field :entry_fee_adult + %span.input-group-text + = t('global.currency') + .sac-field-column + .input-group.input-group-sm + = f.input_field :entry_fee_family + %span.input-group-text + = t('global.currency') + .sac-field-column + .input-group.input-group-sm + = f.input_field :entry_fee_youth + %span.input-group-text + = t('global.currency') + .sac-field-row + .sac-field-column + = t('sac_membership_configs.form.hut_solidarity_fee_without_hut') + .sac-field-column + .input-group.input-group-sm + = f.input_field :hut_solidarity_fee_without_hut_adult + %span.input-group-text + = t('global.currency') + .sac-field-column + .input-group.input-group-sm + = f.input_field :hut_solidarity_fee_without_hut_family + %span.input-group-text + = t('global.currency') + .sac-field-column + .input-group.input-group-sm + = f.input_field :hut_solidarity_fee_without_hut_youth + %span.input-group-text + = t('global.currency') + .sac-field-row + .sac-field-column + = t('sac_membership_configs.form.hut_solidarity_fee_with_hut') + .sac-field-column + .input-group.input-group-sm + = f.input_field :hut_solidarity_fee_with_hut_adult + %span.input-group-text + = t('global.currency') + .sac-field-column + .input-group.input-group-sm + = f.input_field :hut_solidarity_fee_with_hut_family + %span.input-group-text + = t('global.currency') + .sac-field-column + .input-group.input-group-sm + = f.input_field :hut_solidarity_fee_with_hut_youth + %span.input-group-text + = t('global.currency') + .sac-field-row + .sac-field-column + = t('sac_membership_configs.form.magazine_fee') + .sac-field-column + .input-group.input-group-sm + = f.input_field :magazine_fee_adult + %span.input-group-text + = t('global.currency') + .sac-field-column + .input-group.input-group-sm + = f.input_field :magazine_fee_family + %span.input-group-text + = t('global.currency') + .sac-field-column + .input-group.input-group-sm + = f.input_field :magazine_fee_youth + %span.input-group-text + = t('global.currency') + + = field_set_tag(t('sac_membership_configs.form.article_numbers')) do + hasdf diff --git a/config/locales/wagon.de.yml b/config/locales/wagon.de.yml index d0b23f25..ece48681 100644 --- a/config/locales/wagon.de.yml +++ b/config/locales/wagon.de.yml @@ -217,6 +217,41 @@ de: tourenchef_may_edit: Von Tourenchef bearbeitbar qualification: finish_at: Bis + sac_membership_config: + valid_from: Gültig ab Jahr + sac_fee_adult: Nationalverbandsbeitrag, Mitgliedschaft Einzel + sac_fee_family: Nationalverbandsbeitrag, Mitgliedschaft Familie + sac_fee_youth: Nationalverbandsbeitrag, Mitgliedschaft Jugend + entry_fee_adult: Eintrittsgebühr, Mitgliedschaft Einzel + entry_fee_family: Eintrittsgebühr, Mitgliedschaft Familie + entry_fee_youth: Eintrittsgebühr, Mitgliedschaft Jugend + hut_solidarity_fee_with_hut_adult: Hüttensolidaritätsbeitrag Sektion mit Hütten, Mitgliedschaft Einzel + hut_solidarity_fee_with_hut_family: Hüttensolidaritätsbeitrag Sektion mit Hütten, Mitgliedschaft Familie + hut_solidarity_fee_with_hut_youth: Hüttensolidaritätsbeitrag Sektion mit Hütten, Mitgliedschaft Jugend + hut_solidarity_fee_without_hut_adult: Hüttensolidaritätsbeitrag Sektion ohne Hütten, Mitgliedschaft Einzel + hut_solidarity_fee_without_hut_family: Hüttensolidaritätsbeitrag Sektion ohne Hütten, Mitgliedschaft Familie + hut_solidarity_fee_without_hut_youth: Hüttensolidaritätsbeitrag Sektion ohne Hütten, Mitgliedschaft Jugend + magazine_fee_adult: Abogebühr SAC Magazin, Mitgliedschaft Einzel + magazine_fee_family: Abogebühr SAC Magazin, Mitgliedschaft Familie + magazine_fee_youth: Abogebühr SAC Magazin, Mitgliedschaft Jugend + service_fee: Dienstleistungsgebühr + magazine_postage_abroad: Porto Ausland SAC Magazin + reduction_amount: Reduktionsbetrag + reduction_required_membership_years: Reduktion ab Mitgliedsjahren + sac_fee_article_number: Nationalverbandsbeitrag, Artikelnummer + sac_entry_fee_article_number: Nationalverbandseintrittsgebühren, Artikelnummer + hut_solidarity_fee_article_number: Hüttensolidaritätsbeitrag, Artikelnummer + magazine_fee_article_number: Abogebühr SAC Magazin, Artikelnummer + section_bulletin_postage_abroad_article: Porto Ausland SAC Magazin, Artikelnummer + service_fee_article_number: Servicegebühr, Artikelnummer + balancing_payment_article_number: Sektionseintrittsgebühren, Artikelnummer + course_fee_article_number: Porto Ausland Sektionsbulletin, Artikelnummer + discount_date_1: Rabattdatum 1 + discount_percent_1: Rabattprozent 1 + discount_date_2: Rabattdatum 2 + discount_percent_2: Rabattprozent 2 + discount_date_3: Rabattdatum 3 + discount_percent_3: Rabattprozent 3 errors: messages: @@ -259,6 +294,9 @@ de: external_training: one: Externe Ausbildung other: Externe Ausbildungen + sac_membership_config: + one: SAC Mitgliedschafts-Parameter + other: SAC Mitgliedschafts-Parameter ### GROUPS group/sac_cas: @@ -448,6 +486,9 @@ de: dropdown/people_export: recipients: Empfänger + dropdown/group_edit: + sac_membership_configs: SAC Mitgliedschafts-Parameter + event: kinds: push_down: @@ -543,6 +584,7 @@ de: global: phone_placeholder: +41 77 123 45 67 + currency: CHF mitglieder_exports: export_enqueued: "Export wird im Hintergrund gestartet und nach Fertigstellung heruntergeladen." @@ -740,6 +782,7 @@ de: file_name_prefix: SAC-Mitgliederausweis membership_years: Mitgliederjahre title: Mitgliederausweis + mounted_attributes: form_tabs: group/sac_cas: @@ -748,3 +791,18 @@ de: default: Sektions Attribute group/ortsgruppe: default: Ortsgruppen Attribute + + sac_membership_configs: + form: + fees: Gebühren + reductions: Reduktionen + discounts: Rabatte für Eintritte innerhalb des Jahres + article_numbers: Artikelnummern Abacus + sac_fee: Nationalverbandsbeitrag + entry_fee: Eintrittsgebühr + hut_solidarity_fee_without_hut: Hüttensolidaritätsbeitrag ohne Hütten + hut_solidarity_fee_with_hut: Hüttensolidaritätsbeitrag mit Hütten + magazine_fee: Abogebühr SAC Magazin + membership_adult: Mitgliedschaft Einzel + membership_family: Mitgliedschaft Familie + membership_youth: Mitgliedschaft Jugend diff --git a/config/routes.rb b/config/routes.rb index c9ff6bf7..681d8eb7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -21,6 +21,7 @@ resources :groups, only: [] do post 'self_inscription/confirm' => 'groups/self_inscription#confirm' + resources :sac_membership_configs, except: [:show, :destroy] resources :events, only: [] do scope module: 'event' do diff --git a/db/migrate/20240502124158_create_sac_membership_configs.rb b/db/migrate/20240502124158_create_sac_membership_configs.rb new file mode 100644 index 00000000..0466878c --- /dev/null +++ b/db/migrate/20240502124158_create_sac_membership_configs.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +# Copyright (c) 2012-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 CreateSacMembershipConfigs < ActiveRecord::Migration[6.1] + + def change + create_table :sac_membership_configs do |t| + t.integer :valid_from, null: false, length: 4, index: { unique: true } + t.decimal :sac_fee_adult, precision: 5, scale: 2, null: false + t.decimal :sac_fee_family, precision: 5, scale: 2, null: false + t.decimal :sac_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 :hut_solidarity_fee_with_hut_adult, precision: 5, scale: 2, null: false + t.decimal :hut_solidarity_fee_with_hut_family, precision: 5, scale: 2, null: false + t.decimal :hut_solidarity_fee_with_hut_youth, precision: 5, scale: 2, null: false + t.decimal :hut_solidarity_fee_without_hut_adult, precision: 5, scale: 2, null: false + t.decimal :hut_solidarity_fee_without_hut_family, precision: 5, scale: 2, null: false + t.decimal :hut_solidarity_fee_without_hut_youth, precision: 5, scale: 2, null: false + t.decimal :magazine_fee_adult, precision: 5, scale: 2, null: false + t.decimal :magazine_fee_family, precision: 5, scale: 2, null: false + t.decimal :magazine_fee_youth, precision: 5, scale: 2, null: false + t.decimal :service_fee, precision: 5, scale: 2, null: false + t.decimal :magazine_postage_abroad, precision: 5, scale: 2, null: false + t.decimal :reduction_amount, precision: 5, scale: 2, null: false + t.integer :reduction_required_membership_years, null: true + t.string :sac_fee_article_number, null: false + t.string :sac_entry_fee_article_number, null: false + t.string :hut_solidarity_fee_article_number, null: false + t.string :magazine_fee_article_number, null: false + t.string :section_bulletin_postage_abroad_article_number, null: false + t.string :service_fee_article_number, null: false + t.string :balancing_payment_article_number, null: false + t.string :course_fee_article_number, null: false + t.string :discount_date_1, null: true + t.integer :discount_percent_1, null: true, length: 2 + t.string :discount_date_2, null: true + t.integer :discount_percent_2, null: true, length: 2 + t.string :discount_date_3, null: true + t.integer :discount_percent_3, null: true, length: 2 + end + end + +end diff --git a/db/seeds/sac_membership_configs.rb b/db/seeds/sac_membership_configs.rb new file mode 100644 index 00000000..e6baf151 --- /dev/null +++ b/db/seeds/sac_membership_configs.rb @@ -0,0 +1,36 @@ +# 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. + +SacMembershipConfig.seed_once(:valid_from, + valid_from: '2024', + sac_fee_adult: 10, + sac_fee_family: 10, + sac_fee_youth: 10, + entry_fee_adult: 10, + entry_fee_family: 10, + entry_fee_youth: 10, + hut_solidarity_fee_with_hut_adult: 10, + hut_solidarity_fee_with_hut_family: 10, + hut_solidarity_fee_with_hut_youth: 10, + hut_solidarity_fee_without_hut_adult: 10, + hut_solidarity_fee_without_hut_family: 10, + hut_solidarity_fee_without_hut_youth: 10, + magazine_fee_adult: 10, + magazine_fee_family: 10, + magazine_fee_youth: 10, + service_fee: 10, + magazine_postage_abroad: 10, + reduction_amount: 10, + reduction_required_membership_years: 50, + sac_fee_article_number: 42, + sac_entry_fee_article_number: 43, + hut_solidarity_fee_article_number: 44, + magazine_fee_article_number: 45, + section_bulletin_postage_abroad_article_number: 46, + service_fee_article_number: 47, + balancing_payment_article_number: 48, + course_fee_article_number: 49) diff --git a/lib/hitobito_sac_cas/wagon.rb b/lib/hitobito_sac_cas/wagon.rb index f80ef38a..d8c95b62 100644 --- a/lib/hitobito_sac_cas/wagon.rb +++ b/lib/hitobito_sac_cas/wagon.rb @@ -94,6 +94,7 @@ class Wagon < Rails::Engine MountedAttrs::EnumSelect.prepend SacCas::MountedAttrs::EnumSelect Dropdown::PeopleExport.prepend SacCas::Dropdown::PeopleExport Dropdown::TableDisplays.prepend SacCas::Dropdown::TableDisplays + Dropdown::GroupEdit.prepend SacCas::Dropdown::GroupEdit Event::ParticipationButtons.prepend SacCas::Event::ParticipationButtons admin_item = NavigationHelper::MAIN.find { |item| item[:label] == :admin }