diff --git a/CHANGELOG.md b/CHANGELOG.md index be715f0..8fc502e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Version 1.28 - Drucken eines Mitgliederausweises mittels Sammelrechnung (hitobito_sww#63) +- Neu ist es möglich in den Gruppeneinstellungen die Position der Addresse und Mitgliederausweisen beim Brief- und Rechnungsdruck zu definieren (hitobito_sww#68) ## Version 1.27 - Drucken eines Mitgliederausweises mittels Brief oder Rechnungsbrief (hitobito_sww#27) diff --git a/app/domain/sww/export/pdf/address_renderers.rb b/app/domain/sww/export/pdf/address_renderers.rb new file mode 100644 index 0000000..e0dabb9 --- /dev/null +++ b/app/domain/sww/export/pdf/address_renderers.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +# Copyright (c) 2022, Schweizer Wanderwege. This file is part of +# hitobito_die_mitte 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_die_mitte. + +module Sww::Export::Pdf::AddressRenderers + extend ActiveSupport::Concern + + included do + def address_position(group) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize + left = left_position(group) + x_coords = left.to_f.cm - page.margins[:left] if left.present? + + x_coords ||= { + left: self.class::LEFT_ADDRESS_X, + right: self.class::RIGHT_ADDRESS_X + }[group.settings(:messages_letter).address_position&.to_sym] + x_coords ||= 0 + + top = top_position(group) + y_coords = pdf.bounds.top - (top.to_f.cm - page.margins[:top]) if top.present? + y_coords ||= cursor + + [x_coords, y_coords] + end + + def left_position(group) + group.settings(:messages_letter).left_address_position + end + + def top_position(group) + group.settings(:messages_letter).top_address_position + end + end +end diff --git a/app/domain/sww/export/pdf/messages/letter/membership_card.rb b/app/domain/sww/export/pdf/messages/letter/membership_card.rb index a1a5479..d280551 100644 --- a/app/domain/sww/export/pdf/messages/letter/membership_card.rb +++ b/app/domain/sww/export/pdf/messages/letter/membership_card.rb @@ -49,5 +49,13 @@ def fetch_recipient(message_recipient) when Message then message_recipient.person end end + + def left_position(group) + group.settings(:membership_card).left_position + end + + def top_position(group) + group.settings(:membership_card).top_position + end end end diff --git a/app/models/sww/group_setting.rb b/app/models/sww/group_setting.rb new file mode 100644 index 0000000..da8cad6 --- /dev/null +++ b/app/models/sww/group_setting.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +# Copyright (c) 2022, Schweizer Wanderwege. This file is part of +# hitobito_die_mitte 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_die_mitte. + +module Sww::GroupSetting + extend ActiveSupport::Concern + + included do + GroupSetting::SETTINGS.deep_merge!( + messages_letter: { + left_address_position: nil, + top_address_position: nil + }, + membership_card: { + left_position: nil, + top_position: nil + } + ) + + def left_position_type + :number + end + + def top_position_type + :number + end + + def left_address_position_type + :number + end + + def top_address_position_type + :number + end + + end + +end diff --git a/config/locales/models.sww.de.yml b/config/locales/models.sww.de.yml index c3304ce..ce9821c 100644 --- a/config/locales/models.sww.de.yml +++ b/config/locales/models.sww.de.yml @@ -82,7 +82,7 @@ de: group/mitglieder/spender: one: Spender group/mitglieder/magazin_abonnent: - one: Magazin Abonnent + one: Magazin Abonnent salutation: available: @@ -112,6 +112,13 @@ de: invoice: membership_card: Mitgliederausweis membership_expires_on: Mitgliedschaft gültig bis + group_setting: + settings: + membership_card: Mitgliederausweise + left_position: Abstand von links (cm) + top_position: Abstand von oben (cm) + left_address_position: Addressabstand von links (cm) + top_address_position: Addressabstand von oben (cm) tags: categories: diff --git a/lib/hitobito_sww/wagon.rb b/lib/hitobito_sww/wagon.rb index 967ac56..1cdd2e9 100644 --- a/lib/hitobito_sww/wagon.rb +++ b/lib/hitobito_sww/wagon.rb @@ -22,9 +22,11 @@ class Wagon < Rails::Engine config.to_prepare do # extend application classes here + GroupSetting.include Sww::GroupSetting Group.include Sww::Group Person.include Sww::Person + Export::Pdf::AddressRenderers.include Sww::Export::Pdf::AddressRenderers Export::Pdf::Invoice.prepend Sww::Export::Pdf::Invoice Export::Pdf::Invoice::ReceiverAddress.prepend Sww::Export::Pdf::Invoice::ReceiverAddress Export::Pdf::Invoice::InvoiceInformation.prepend Sww::Export::Pdf::Invoice::InvoiceInformation diff --git a/spec/domain/sww/export/pdf/invoice_spec.rb b/spec/domain/sww/export/pdf/invoice_spec.rb index bc5f7b4..4f7d00d 100644 --- a/spec/domain/sww/export/pdf/invoice_spec.rb +++ b/spec/domain/sww/export/pdf/invoice_spec.rb @@ -116,6 +116,55 @@ def text_with_position end end + context 'rendered at custom position' do + before do + invoice.group.settings(:messages_letter).left_address_position = 3 # 3.cm = 85 + invoice.group.settings(:messages_letter).top_address_position = 5 + invoice.group.save! + end + + it 'renders membership_card when true' do + invoice.update!(membership_card: true, membership_expires_on: Date.parse('2022-10-01')) + expect(text_with_position).to eq([[346, 721, "Mitgliederausweis"], + [346, 698, "Bob Foo"], + [511, 710, "Gültig bis"], + [517, 698, "10.2022"], + [406, 530, "Rechnungsdatum: 15.06.2022"], + [85, 691, "Max Muster"], + [85, 679, "Belpstrasse 37"], + [85, 668, "3007 Bern"], + [57, 530, "Invoice"], + [57, 497, "Rechnungsnummer: 636980692-2"], + [363, 497, "Anzahl"], + [419, 497, "Preis"], + [464, 497, "Betrag"], + [515, 497, "MwSt."], + [436, 484, "Zwischenbetrag"], + [505, 484, "0.00 CHF"], + [436, 467, "Gesamtbetrag"], + [505, 467, "0.00 CHF"], + [57, 468, "Fällig bis: 01.08.2022"], + [72, 171, "636980692-4"], + [252, 171, "636980692-4"], + [352, 196, "00 00376 80338 90000 00000 00021"], + [7, 116, "00 00376 80338 90000 00000 00021"], + [7, 103, "Max Muster"], + [7, 87, "Belpstrasse 37"], + [7, 71, "3007 Bern"], + [352, 147, "Max Muster"], + [352, 131, "Belpstrasse 37"], + [352, 115, "3007 Bern"], + [220, 45, "042>000063698069200000000000022+ 636980692000004>"]]) + end + + it 'renders receiver address' do + expect(text_with_position).to include([85, 691, "Max Muster"], + [85, 679, "Belpstrasse 37"], + [85, 668, "3007 Bern"]) + end + end + + it 'renders invoice information to the right' do expect(text_with_position).to include([406, 530, "Rechnungsdatum: 15.06.2022"]) end diff --git a/spec/domain/sww/export/pdf/messages/letter_spec.rb b/spec/domain/sww/export/pdf/messages/letter_spec.rb index fef6e8d..331df09 100644 --- a/spec/domain/sww/export/pdf/messages/letter_spec.rb +++ b/spec/domain/sww/export/pdf/messages/letter_spec.rb @@ -23,60 +23,87 @@ let (:recipient) { people(:top_leader) } - subject { Export::Pdf::Messages::Letter.new(letter, options) } + subject { Export::Pdf::Messages::Letter.new(letter, options) } + before do + Messages::LetterDispatch.new(letter).run + end + + let(:letter) { messages(:membership_card_letter) } + + context 'rendered left' do before do - Messages::LetterDispatch.new(letter).run + letter.group.settings(:messages_letter).address_position = :left + letter.group.save! end - let(:letter) { messages(:membership_card_letter) } - - context 'rendered left' do - before do - letter.group.settings(:messages_letter).address_position = :left - letter.group.save! - end - - it 'renders membership card in addition to letter' do - expect(text_with_position).to eq([[346, 721, "Mitgliederausweis"], - [346, 698, "Alice Bar"], - [511, 710, "Gültig bis"], - [517, 698, "12.2042"], - [57, 704, "P.P. | POST CH AG"], - [57, 682, "Alice Bar"], - [57, 672, "Belpstrasse 37"], - [57, 662, "8001 Zürich"], - [420, 517, "Bern, 17. Mai 2022"], - [57, 491, "MITGLIEDERAUSWEIS 2022 WANDERN.CH"], - [57, 463, "Hallo"], - [57, 442, "Gerne stellen wir Ihnen Ihren Mitgliederausweis zu! "], - [57, 422, "Bis bald"]]) - - end + it 'renders membership card in addition to letter' do + expect(text_with_position).to eq([[346, 721, "Mitgliederausweis"], + [346, 698, "Alice Bar"], + [511, 710, "Gültig bis"], + [517, 698, "12.2042"], + [57, 704, "P.P. | POST CH AG"], + [57, 682, "Alice Bar"], + [57, 672, "Belpstrasse 37"], + [57, 662, "8001 Zürich"], + [420, 517, "Bern, 17. Mai 2022"], + [57, 491, "MITGLIEDERAUSWEIS 2022 WANDERN.CH"], + [57, 463, "Hallo"], + [57, 442, "Gerne stellen wir Ihnen Ihren Mitgliederausweis zu! "], + [57, 422, "Bis bald"]]) + + end + end + + context 'rendered right' do + before do + letter.group.settings(:messages_letter).address_position = :right + letter.group.save! end - context 'rendered right' do - before do - letter.group.settings(:messages_letter).address_position = :right - letter.group.save! - end - - it 'renders membership card in addition to letter' do - expect(text_with_position).to eq([[57, 721, "Mitgliederausweis"], - [57, 698, "Alice Bar"], - [222, 710, "Gültig bis"], - [227, 698, "12.2042"], - [346, 704, "P.P. | POST CH AG"], - [346, 682, "Alice Bar"], - [346, 672, "Belpstrasse 37"], - [346, 662, "8001 Zürich"], - [420, 517, "Bern, 17. Mai 2022"], - [57, 491, "MITGLIEDERAUSWEIS 2022 WANDERN.CH"], - [57, 463, "Hallo"], - [57, 442, "Gerne stellen wir Ihnen Ihren Mitgliederausweis zu! "], - [57, 422, "Bis bald"]]) - end + it 'renders membership card in addition to letter' do + expect(text_with_position).to eq([[57, 721, "Mitgliederausweis"], + [57, 698, "Alice Bar"], + [222, 710, "Gültig bis"], + [227, 698, "12.2042"], + [346, 704, "P.P. | POST CH AG"], + [346, 682, "Alice Bar"], + [346, 672, "Belpstrasse 37"], + [346, 662, "8001 Zürich"], + [420, 517, "Bern, 17. Mai 2022"], + [57, 491, "MITGLIEDERAUSWEIS 2022 WANDERN.CH"], + [57, 463, "Hallo"], + [57, 442, "Gerne stellen wir Ihnen Ihren Mitgliederausweis zu! "], + [57, 422, "Bis bald"]]) end + end + + context 'rendered at custom position' do + before do + letter.group.settings(:messages_letter).left_address_position = 3 # 3.cm = 85 + letter.group.settings(:messages_letter).top_address_position = 5 + + letter.group.settings(:membership_card).left_position = 10 + letter.group.settings(:membership_card).top_position = 5 + letter.group.save! + end + + it 'renders membership card in addition to letter' do + expect(text_with_position).to eq([[283, 693, "Mitgliederausweis"], + [283, 670, "Alice Bar"], + [449, 682, "Gültig bis"], + [454, 670, "12.2042"], + [85, 695, "P.P. | POST CH AG"], + [85, 674, "Alice Bar"], + [85, 663, "Belpstrasse 37"], + [85, 653, "8001 Zürich"], + [420, 517, "Bern, 17. Mai 2022"], + [57, 491, "MITGLIEDERAUSWEIS 2022 WANDERN.CH"], + [57, 463, "Hallo"], + [57, 442, "Gerne stellen wir Ihnen Ihren Mitgliederausweis zu! "], + [57, 422, "Bis bald"]]) + end + end end private diff --git a/spec/domain/sww/export/pdf/messages/letter_with_invoice_spec.rb b/spec/domain/sww/export/pdf/messages/letter_with_invoice_spec.rb index d2fd860..02540fa 100644 --- a/spec/domain/sww/export/pdf/messages/letter_with_invoice_spec.rb +++ b/spec/domain/sww/export/pdf/messages/letter_with_invoice_spec.rb @@ -25,9 +25,9 @@ subject { Export::Pdf::Messages::LetterWithInvoice.new(letter, options) } - let!(:invoice_config) { + let!(:invoice_config) { InvoiceConfig.create!(group: letter.group, - sequence_number: 1, + sequence_number: 1, address: "Puzzle\nBelpstrasse 37\n3007 Bern", iban: 'CH93 0030 0111 6238 5295 7', account_number: '10-5318-5', @@ -148,6 +148,57 @@ [346, 144, "8001 Zürich"]]) end end + + context 'rendered at custom position' do + before do + letter.group.settings(:messages_letter).left_address_position = 3 # 3.cm = 85 + letter.group.settings(:messages_letter).top_address_position = 5 + + letter.group.settings(:membership_card).left_position = 10 + letter.group.settings(:membership_card).top_position = 5 + letter.group.save! + end + + it 'renders membership card in addition to letter' do + expect(text_with_position).to eq([[283, 693, "Mitgliederausweis"], + [283, 670, "Alice Bar"], + [449, 682, "Gültig bis"], + [454, 670, "12.2042"], + [85, 695, "P.P. | POST CH AG"], + [85, 674, "Alice Bar"], + [85, 663, "Belpstrasse 37"], + [85, 653, "8001 Zürich"], + [420, 517, "Bern, 17. Mai 2022"], + [57, 495, "Hallo"], + [57, 474, "Gerne stellen wir Ihnen Ihren Mitgliederausweis zu! "], + [57, 454, "Bis bald"], + [14, 276, "Empfangsschein"], + [14, 251, "Konto / Zahlbar an"], + [14, 239, "CH93 0030 0111 6238 5295 7"], + [14, 228, "Puzzle ITC"], + [14, 173, "Zahlbar durch"], + [14, 161, "Alice Bar"], + [14, 150, "Belpstrasse 37"], + [14, 138, "8001 Zürich"], + [14, 89, "Währung"], + [71, 89, "Betrag"], + [14, 78, "CHF"], + [105, 39, "Annahmestelle"], + [190, 276, "Zahlteil"], + [190, 89, "Währung"], + [247, 89, "Betrag"], + [190, 78, "CHF"], + [346, 278, "Konto / Zahlbar an"], + [346, 266, "CH93 0030 0111 6238 5295 7"], + [346, 255, "Puzzle ITC"], + [346, 211, "Referenznummer"], + [346, 200, "00 00542 00303 80000 00000 00019"], + [346, 178, "Zahlbar durch"], + [346, 167, "Alice Bar"], + [346, 155, "Belpstrasse 37"], + [346, 144, "8001 Zürich"]]) + end + end end private