Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 68329cf0

Von Cem Aydin vor mehr als 1 Jahr hinzugefügt

  • ID 68329cf02e6937336af6ab7e94c1d6d426160219
  • Vorgänger 30040427
  • Nachfolger d873594c

Schweizer QR-Rechnung: Aufsplitten von kombinierten Adressfelder in Helferfunktionen ausgelagert

Unterschiede anzeigen:

SL/Helper/QrBillFunctions.pm
use List::Util qw(first);
use SL::Util qw(trim);
use strict;
use warnings;
use Exporter qw(import);
our @EXPORT_OK = qw(get_qrbill_account assemble_ref_number get_ref_number_formatted
get_iban_formatted get_amount_formatted);
our @EXPORT_OK = qw(
get_street_name_from_address_line
get_building_number_from_address_line
get_postal_code_from_address_line
get_town_name_from_address_line
get_qrbill_account
assemble_ref_number
get_ref_number_formatted
get_iban_formatted
get_amount_formatted
);
use constant {
REGEX_STREET_NAME_FROM_ADDRESS_LINE => qr{^([^\d]+)\s*},
REGEX_BUILDING_NUMBER_FROM_ADDRESS_LINE => qr{(\d+.*)},
REGEX_POSTAL_CODE_FROM_ADDRESS_LINE => qr{^(\d+).*$},
REGEX_TOWN_FROM_ADDRESS_LINE => qr{^\d+\s(.*)$},
};
sub get_street_name_from_address_line {
my $address_line = $_[0];
my ($street_name) = $address_line =~ REGEX_STREET_NAME_FROM_ADDRESS_LINE;
return trim($street_name) // '';
}
sub get_building_number_from_address_line {
my $address_line = $_[0];
my ($building_number) = $address_line =~ REGEX_BUILDING_NUMBER_FROM_ADDRESS_LINE;
return trim($building_number) // '';
}
sub get_postal_code_from_address_line {
my $address_line = $_[0];
my ($postal_code) = $address_line =~ REGEX_POSTAL_CODE_FROM_ADDRESS_LINE;
return trim($postal_code) // '';
}
sub get_town_name_from_address_line {
my $address_line = $_[0];
my ($town_name) = $address_line =~ REGEX_TOWN_FROM_ADDRESS_LINE;
return trim($town_name) // '';
}
sub get_qrbill_account {
$main::lxdebug->enter_sub();
......
=over 4
=item C<get_street_name_from_address_line>
Returns the street name from a combined street name and number.
=item C<get_street_number_from_address_line>
Returns the street number from a combined street name and number.
=item C<get_postal_code_from_address_line>
Returns the postal code from an combined postal code and town.
=item C<get_town_name_from_address_line>
Returns the town name from an combined postal code and town.
=item C<get_qrbill_account>
Return the bank account flagged for the QR bill. And a string containing an
SL/Helper/QrBillParser.pm
use strict;
use warnings;
use SL::Helper::QrBillFunctions qw(
get_street_name_from_address_line
get_building_number_from_address_line
get_postal_code_from_address_line
get_town_name_from_address_line
);
use Rose::Object::MakeMethods::Generic(
scalar => [ qw(is_valid error raw_data) ],
'scalar --get_set_init' => [ qw(spec) ],
......
REGEX_TRAILER => qr{^EPD$},
REGEX_BILL_INFORMATION => qr{^.{0,140}$},
REGEX_ALTERNATIVE_SCHEME_PARAMETER => qr{^.{0,100}$},
REGEX_STREET_NAME_FROM_ADDRESS_LINE => qr{^(.*)\s+\d.*$},
REGEX_BUILDING_NUMBER_FROM_ADDRESS_LINE => qr{^.*\s+(\d+.*)$},
REGEX_POSTAL_CODE_FROM_ADDRESS_LINE => qr{^(\d+).*$},
REGEX_TOWN_FROM_ADDRESS_LINE => qr{^\d+\s(.*)$},
};
sub new {
......
sub get_creditor_field {
my $self = shift;
my ($structured_field, $extract_field, $extract_regex) = @_;
my ($structured_field, $extract_field, $extract_fn) = @_;
if ($self->{creditor}->{address_type} eq 'S') {
return $self->{creditor}->{$structured_field};
}
# extract
$self->{creditor}->{$extract_field} =~ $extract_regex;
my $r = $extract_fn->($self->{creditor}->{$extract_field});
return $1 // '';
return $r // '';
}
sub get_creditor_street_name {
# extract street name from street_or_address_line_1
# the regex matches everything until the first digit
return shift->get_creditor_field(
'street_or_address_line_1',
'street_or_address_line_1',
REGEX_STREET_NAME_FROM_ADDRESS_LINE
\&get_street_name_from_address_line
);
}
sub get_creditor_building_number {
# extract building number from street_or_address_line_1
# the regex matches the first digit and everything after
return shift->get_creditor_field(
'building_number_or_address_line_2',
'street_or_address_line_1',
REGEX_BUILDING_NUMBER_FROM_ADDRESS_LINE
\&get_building_number_from_address_line
);
}
sub get_creditor_post_code {
# extract post code from building_number_or_address_line_2
# the regex matches the first digits
return shift->get_creditor_field(
'postal_code',
'building_number_or_address_line_2',
REGEX_POSTAL_CODE_FROM_ADDRESS_LINE
\&get_postal_code_from_address_line
);
}
sub get_creditor_town_name {
# extract town name from building_number_or_address_line_2
# the regex matches everything after the first digits
return shift->get_creditor_field(
'town',
'building_number_or_address_line_2',
REGEX_TOWN_FROM_ADDRESS_LINE
\&get_town_name_from_address_line
);
}
t/helper/qrbill_functions.t
use Test::More tests => 22;
use Test::More tests => 38;
use strict;
use lib 't';
use Support::TestSetup;
use_ok('SL::Helper::QrBillFunctions', qw(assemble_ref_number get_ref_number_formatted
get_iban_formatted get_amount_formatted));
use_ok('SL::Helper::QrBillFunctions', qw(
get_street_name_from_address_line
get_building_number_from_address_line
get_postal_code_from_address_line
get_town_name_from_address_line
assemble_ref_number
get_ref_number_formatted
get_iban_formatted
get_amount_formatted
));
Support::TestSetup::login();
is(get_street_name_from_address_line('Musterstrasse 12'), 'Musterstrasse', 'get_street_name_from_address_line');
is(get_street_name_from_address_line('Musterstrasse St. Jakob 22'), 'Musterstrasse St. Jakob', 'get_street_name_from_address_line_with_multi_word_street_name');
is(get_street_name_from_address_line('Musterstrasse St. Jakob 22b'), 'Musterstrasse St. Jakob', 'get_street_name_from_address_line_with_multi_word_street_name_and_letter');
is(get_street_name_from_address_line('Musterstrasse 12a'), 'Musterstrasse', 'get_street_name_from_address_line_with_building_number');
is(get_street_name_from_address_line('Musterstrasse 12a 1234 Musterhausen'), 'Musterstrasse', 'get_street_name_from_address_line_with_building_number_and_zip');
is(get_street_name_from_address_line('Musterstrasse'), 'Musterstrasse', 'get_street_name_from_address_line_without_building_number');
is(get_building_number_from_address_line('Musterstrasse 12'), '12', 'get_building_number_from_address_line');
is(get_building_number_from_address_line('Musterstrasse 12a'), '12a', 'get_building_number_from_address_line_with_building_number');
is(get_building_number_from_address_line('Musterstrasse 12a 1234 Musterhausen'), '12a 1234 Musterhausen', 'get_building_number_from_address_line_with_building_number_and_zip');
is(get_building_number_from_address_line('Musterstrasse'), '', 'get_building_number_from_address_line_without_building_number');
is(get_postal_code_from_address_line('8000 Zürich'), '8000', 'get_postal_code_from_address_line');
is(get_postal_code_from_address_line('8000 Zürich 1'), '8000', 'get_postal_code_from_address_line_with_zip_extension');
is(get_postal_code_from_address_line('8000'), '8000', 'get_postal_code_from_address_line_without_town_name');
is(get_town_name_from_address_line('8000 Zürich'), 'Zürich', 'get_town_name_from_address_line');
is(get_town_name_from_address_line('8000 Zürich 1'), 'Zürich 1', 'get_town_name_from_address_line_with_zip_extension');
is(get_town_name_from_address_line('8000'), '', 'get_town_name_from_address_line_without_town_name');
# assemble_ref_number returns successfully
is_deeply([ assemble_ref_number('123123', 'c1', 'R2022-02') ],
[ '123123000001000000002022027', undef ],

Auch abrufbar als: Unified diff