Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add custom address offsets #74

Merged
merged 7 commits into from
Sep 20, 2022
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
37 changes: 37 additions & 0 deletions app/domain/sww/export/pdf/address_renderers.rb
Original file line number Diff line number Diff line change
@@ -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)
left = left_offset(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_offset(group)
y_coords = pdf.bounds.top - (top.to_f.cm - page.margins[:top]) if top.present?
y_coords ||= cursor
kronn marked this conversation as resolved.
Show resolved Hide resolved

[x_coords, y_coords]
end

def left_offset(group)
group.settings(:messages_letter).left_address_offset
end

def top_offset(group)
group.settings(:messages_letter).top_address_offset
end
end
end
8 changes: 8 additions & 0 deletions app/domain/sww/export/pdf/messages/letter/membership_card.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,13 @@ def fetch_recipient(message_recipient)
when Message then message_recipient.person
end
end

def left_offset(group)
group.settings(:membership_card).left_offset
end

def top_offset(group)
group.settings(:membership_card).top_offset
end
end
end
41 changes: 41 additions & 0 deletions app/models/sww/group_setting.rb
Original file line number Diff line number Diff line change
@@ -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_offset: nil,
top_address_offset: nil
},
membership_card: {
left_offset: nil,
top_offset: nil
}
})

def left_offset_type
:number
end

def top_offset_type
:number
end

def left_address_offset_type
:number
end

def top_address_offset_type
:number
end

end

end
7 changes: 7 additions & 0 deletions config/locales/models.sww.de.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,13 @@ de:
invoice:
membership_card: Mitgliederausweis
membership_expires_on: Mitgliedschaft gültig bis
group_setting:
settings:
membership_card: Mitgliederkarten
kronn marked this conversation as resolved.
Show resolved Hide resolved
left_offset: Abstand von links (cm)
top_offset: Abstand von oben (cm)
left_address_offset: Addressabstand von links (cm)
top_address_offset: Addressabstand von oben (cm)

tags:
categories:
Expand Down
2 changes: 2 additions & 0 deletions lib/hitobito_sww/wagon.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
49 changes: 49 additions & 0 deletions spec/domain/sww/export/pdf/invoice_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,55 @@ def text_with_position
end
end

context 'rendered at custom offset' do
before do
invoice.group.settings(:messages_letter).left_address_offset = 3 # 3.cm = 85
invoice.group.settings(:messages_letter).top_address_offset = 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
Expand Down
121 changes: 74 additions & 47 deletions spec/domain/sww/export/pdf/messages/letter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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 offset' do
before do
letter.group.settings(:messages_letter).left_address_offset = 3 # 3.cm = 85
letter.group.settings(:messages_letter).top_address_offset = 5

letter.group.settings(:membership_card).left_offset = 10
letter.group.settings(:membership_card).top_offset = 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
Expand Down
51 changes: 51 additions & 0 deletions spec/domain/sww/export/pdf/messages/letter_with_invoice_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,57 @@
[346, 144, "8001 Zürich"]])
end
end

context 'rendered at custom offset' do
before do
letter.group.settings(:messages_letter).left_address_offset = 3 # 3.cm = 85
letter.group.settings(:messages_letter).top_address_offset = 5

letter.group.settings(:membership_card).left_offset = 10
letter.group.settings(:membership_card).top_offset = 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
Expand Down