From 079c91d5a281f1bbf4c93681e3ccab4208271a0e Mon Sep 17 00:00:00 2001 From: Cem Aydin Date: Thu, 23 Dec 2021 22:51:36 +0100 Subject: [PATCH] Swiss QR-Bill: In Druckablauf OpenDocument/OASIS integrieren MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - Feature in Mandantenkonfiguration einschaltbar - Aufruf zum Erzeugen von QR-Code PNG (Steven Schubiger) - Vorlage hinzugefügt (rev-odt/invoice_qr.odt) - PNG Bild CH-Kreuz hinzugefügt - Übersetzungen hinzugefügt, locales Script ausgeführt de/en - changelog Eintrag --- SL/Template/OpenDocument.pm | 291 ++++++++++++++++++ doc/changelog | 11 +- image/CH-Kreuz_7mm.png | Bin 0 -> 14703 bytes locale/de/all | 14 + locale/en/all | 14 + templates/print/rev-odt/invoice_qr.odt | Bin 0 -> 61023 bytes .../webpages/client_config/_features.html | 5 + 7 files changed, 330 insertions(+), 5 deletions(-) create mode 100644 image/CH-Kreuz_7mm.png create mode 100644 templates/print/rev-odt/invoice_qr.odt diff --git a/SL/Template/OpenDocument.pm b/SL/Template/OpenDocument.pm index e57032189..7a9f95207 100644 --- a/SL/Template/OpenDocument.pm +++ b/SL/Template/OpenDocument.pm @@ -6,15 +6,21 @@ use Archive::Zip; use Encode; use HTML::Entities; use POSIX 'setsid'; +use XML::LibXML; use SL::Iconv; use SL::Template::OpenDocument::Styles; +use SL::DB::BankAccount; +use SL::Helper::QrBill; +use SL::Helper::ISO3166; + use Cwd; # use File::Copy; # use File::Spec; # use File::Temp qw(:mktemp); use IO::File; +use List::Util qw(first); use strict; @@ -346,11 +352,20 @@ sub parse_block { sub parse { $main::lxdebug->enter_sub(); my $self = $_[0]; + local *OUT = $_[1]; my $form = $self->{"form"}; close(OUT); + my $qr_image_path; + if ($::instance_conf->get_create_qrbill_invoices) { + # the biller account information, biller address and the reference number, + # are needed in the template aswell as in the qr-code generation, therefore + # assemble these and add to $::form + $qr_image_path = $self->generate_qr_code; + } + my $file_name; if ($form->{"IN"} =~ m|^/|) { $file_name = $form->{"IN"}; @@ -420,6 +435,28 @@ sub parse { $zip->contents("styles.xml", Encode::encode('utf-8-strict', $new_styles)); } + if ($::instance_conf->get_create_qrbill_invoices) { + # get placeholder path from odt XML + my $qr_placeholder_path; + my $dom = XML::LibXML->load_xml(string => $contents); + my @nodelist = $dom->getElementsByTagName("draw:frame"); + for my $node (@nodelist) { + my $attr = $node->getAttribute('draw:name'); + if ($attr eq 'QRCodePlaceholder') { + my @children = $node->getChildrenByTagName('draw:image'); + $qr_placeholder_path = $children[0]->getAttribute('xlink:href'); + } + } + if (!defined($qr_placeholder_path)) { + $::form->error($::locale->text('QR-Code placeholder image: QRCodePlaceholder not found in template.')); + } + # replace QR-Code Placeholder Image in zip file (odt) with generated one + $zip->updateMember( + $qr_placeholder_path, + $qr_image_path + ); + } + $zip->writeToFileNamed($form->{"tmpfile"}, 1); my $res = 1; @@ -431,6 +468,260 @@ sub parse { return $res; } +sub get_qrbill_account { + $main::lxdebug->enter_sub(); + my ($self) = @_; + + my $qr_account; + + my $bank_accounts = SL::DB::Manager::BankAccount->get_all; + $qr_account = scalar(@{ $bank_accounts }) == 1 ? + $bank_accounts->[0] : + first { $_->use_for_qrbill } @{ $bank_accounts }; + + if (!$qr_account) { + $::form->error($::locale->text('No bank account flagged for QRBill usage was found.')); + } + + $main::lxdebug->leave_sub(); + return $qr_account; +} + +sub remove_letters_prefix { + my $s = $_[0]; + $s =~ s/^[a-zA-Z]+//; + return $s; +} + +sub check_digits_and_max_length { + my $s = $_[0]; + my $length = $_[1]; + + return 0 if (!($s =~ /^\d*$/) || length($s) > $length); + return 1; +} + +sub calculate_check_digit { + # calculate ESR check digit using algorithm: "modulo 10, recursive" + my $ref_number_str = $_[0]; + + my @m = (0, 9, 4, 6, 8, 2, 7, 1, 3, 5); + my $carry = 0; + + my @ref_number_split = map int($_), split(//, $ref_number_str); + + for my $v (@ref_number_split) { + $carry = @m[($carry + $v) % 10]; + } + + return (10 - $carry) % 10; +} + +sub assemble_ref_number { + $main::lxdebug->enter_sub(); + + my $bank_id = $_[0]; + my $customer_number = $_[1]; + my $order_number = $_[2] // "0"; + my $invoice_number = $_[3] // "0"; + + # check values (analog to checks in makro) + # - bank_id + # input: 6 digits, only numbers + # output: 6 digits, only numbers + if (!($bank_id =~ /^\d*$/) || length($bank_id) != 6) { + $::form->error($::locale->text('Bank account id number invalid. Must be 6 digits.')); + } + + # - customer_number + # input: prefix (letters) + up to 6 digits (numbers) + # output: prefix removed, 6 digits, filled with leading zeros + $customer_number = remove_letters_prefix($customer_number); + if (!check_digits_and_max_length($customer_number, 6)) { + $::form->error($::locale->text('Customer number invalid. Must be less then or equal to 6 digits after prefix.')); + } + # fill with zeros + $customer_number = sprintf "%06d", $customer_number; + + # - order_number + # input: prefix (letters) + up to 7 digits, may be zero + # output: prefix removed, 7 digits, filled with leading zeros + $order_number = remove_letters_prefix($order_number); + if (!check_digits_and_max_length($order_number, 7)) { + $::form->error($::locale->text('Order number invalid. Must be less then or equal to 7 digits after prefix.')); + } + # fill with zeros + $order_number = sprintf "%07d", $order_number; + + # - invoice_number + # input: prefix (letters) + up to 7 digits, may be zero + # output: prefix removed, 7 digits, filled with leading zeros + $invoice_number = remove_letters_prefix($invoice_number); + if (!check_digits_and_max_length($invoice_number, 7)) { + $::form->error($::locale->text('Invoice number invalid. Must be less then or equal to 7 digits after prefix.')); + } + # fill with zeros + $invoice_number = sprintf "%07d", $invoice_number; + + # assemble ref. number + my $ref_number = $bank_id . $customer_number . $order_number . $invoice_number; + + # calculate check digit + my $ref_number_cpl = $ref_number . calculate_check_digit($ref_number); + + $main::lxdebug->leave_sub(); + return $ref_number_cpl; +} + +sub get_ref_number_formatted { + $main::lxdebug->enter_sub(); + + my $ref_number = $_[0]; + + # create ref. number in format: + # 'XX XXXXX XXXXX XXXXX XXXXX XXXXX' (2 digits + 5 x 5 digits) + my $ref_number_spaced = substr($ref_number, 0, 2) . ' ' . + substr($ref_number, 2, 5) . ' ' . + substr($ref_number, 7, 5) . ' ' . + substr($ref_number, 12, 5) . ' ' . + substr($ref_number, 17, 5) . ' ' . + substr($ref_number, 22, 5); + + $main::lxdebug->leave_sub(); + return $ref_number_spaced; +} + +sub get_iban_formatted { + $main::lxdebug->enter_sub(); + + my $iban = $_[0]; + + # create iban number in format: + # 'XXXX XXXX XXXX XXXX XXXX X' (5 x 4 + 1digits) + my $iban_spaced = substr($iban, 0, 4) . ' ' . + substr($iban, 4, 4) . ' ' . + substr($iban, 8, 4) . ' ' . + substr($iban, 12, 4) . ' ' . + substr($iban, 16, 4) . ' ' . + substr($iban, 20, 1); + + $main::lxdebug->leave_sub(); + return $iban_spaced; +} + +sub get_amount_formatted { + $main::lxdebug->enter_sub(); + + unless ($_[0] =~ /^\d+\.\d{2}$/) { + $::form->error($::locale->text('Amount has wrong format.')); + } + + local $_ = shift; + $_ = reverse split //; + m/^\d{2}\./g; + s/\G(\d{3})(?=\d)/$1 /g; + + $main::lxdebug->leave_sub(); + return scalar reverse split //; +} + +sub generate_qr_code { + $main::lxdebug->enter_sub(); + my $self = $_[0]; + my $form = $self->{"form"}; + + # assemble data for QR-Code + + # get qr-account data + my $qr_account = $self->get_qrbill_account(); + + my %biller_information = ( + 'iban' => $qr_account->{'iban'} + ); + + my $biller_countrycode = SL::Helper::ISO3166::map_name_to_alpha_2_code( + $::instance_conf->get_address_country() + ); + if (!$biller_countrycode) { + $::form->error($::locale->text('Error mapping biller countrycode.')); + } + my %biller_data = ( + 'address_type' => 'K', + 'company' => $::instance_conf->get_company(), + 'address_row1' => $::instance_conf->get_address_street1(), + 'address_row2' => $::instance_conf->get_address_zipcode() . ' ' . $::instance_conf->get_address_city(), + 'countrycode' => $biller_countrycode, + ); + + my %payment_information = ( + 'amount' => sprintf("%.2f", $form->parse_amount(\%::myconfig, $form->{'total'})), + 'currency' => $form->{'currency'}, + ); + + my $customer_countrycode = SL::Helper::ISO3166::map_name_to_alpha_2_code($form->{'country'}); + if (!$customer_countrycode) { + $::form->error($::locale->text('Error mapping customer countrycode.')); + } + my %invoice_recipient_data = ( + 'address_type' => 'K', + 'name' => $form->{'name'}, + 'address_row1' => $form->{'street'}, + 'address_row2' => $form->{'zipcode'} . ' ' . $form->{'city'}, + 'countrycode' => $customer_countrycode, + ); + + # generate ref.-no. with check digit + my $ref_number = assemble_ref_number( + $qr_account->{'bank_account_id'}, + $form->{'customernumber'}, + $form->{'ordnumber'}, + $form->{'invnumber'}, + ); + + my %ref_nr_data = ( + 'type' => 'QRR', + 'ref_number' => $ref_number, + ); + + # set into form for template processing + $form->{'biller_information'} = \%biller_information; + $form->{'biller_data'} = \%biller_data; + $form->{'ref_number'} = $ref_number; + + # get ref. number/iban formatted with spaces + $form->{'ref_number_formatted'} = get_ref_number_formatted($ref_number); + $form->{'iban_formatted'} = get_iban_formatted($qr_account->{'iban'}); + + # format amount for template + $form->{'amount_formatted'} = get_amount_formatted( + sprintf( + "%.2f", + $form->parse_amount(\%::myconfig, $form->{'total'}) + ) + ); + + # set outfile + my $outfile = $form->{"tmpdir"} . '/' . 'qr-code.png'; + + # generate QR-Code Image + eval { + my $qr_image = SL::Helper::QrBill->new( + \%biller_information, + \%biller_data, + \%payment_information, + \%invoice_recipient_data, + \%ref_nr_data, + ); + $qr_image->generate($outfile); + } or do { + local $_ = $@; chomp; my $error = $_; + $::form->error($::locale->text('QR-Image generation failed: ' . $error)); + }; + + $main::lxdebug->leave_sub(); + return $outfile; +} + sub is_xvfb_running { $main::lxdebug->enter_sub(); diff --git a/doc/changelog b/doc/changelog index a06a2a826..8d2b19ba1 100644 --- a/doc/changelog +++ b/doc/changelog @@ -15,11 +15,12 @@ von kivitendo. Mittelgroße neue Features: -In Kundenstammdaten können nun abweichende Rechnungsadressen analog zu -Lieferadressen verwaltet werden. Diese können in Verkaufsbelegen -ausgewählt werden. Sie stehen den Druckvorlagen als eigene Variablen -zur Verfügung. - +- In Kundenstammdaten können nun abweichende Rechnungsadressen analog zu + Lieferadressen verwaltet werden. Diese können in Verkaufsbelegen + ausgewählt werden. Sie stehen den Druckvorlagen als eigene Variablen + zur Verfügung. +- Unterstützung für Schweizer QR-Rechnung mit OpenDocument Vorlagen. + Variante: QR-IBAN mit QR-Referenz Kleinere neue Features und Detailverbesserungen: diff --git a/image/CH-Kreuz_7mm.png b/image/CH-Kreuz_7mm.png new file mode 100644 index 0000000000000000000000000000000000000000..41d3c5f9478099e4305c25c898f56ef0494d041d GIT binary patch literal 14703 zcmeI3PmB{)9LHxhXk5Txl!G2{7!E?Po#}Mj-Hz>$rL(vj99+ALbfZybXI^(Fv@_$( zEbVS2Y#;=P7>yx8LKF`MgCue>5yF8)B2i=1pd2J1MlVK8G%@jjG4ahzxBa!-^1yI> z&9?pRd*AQx_vZ8dbS`snbj#Drdmrm%7-sp%uu{O^CxUkm{$OfU#acntI6 zrr_Q4$l?4T!wd-Kc+oGa&q%smiED;EiQ=`26S$b{hMJ@4JCM&#qAAnLaetgU&#|VF zOWmiGLiofttKX-B6wKIUA=FXnv>I#Dd_1sc2qOF*n*zO7A}QohO+otrM!zY-*(4syDUemY;*x3 zo6iTUDiu$$YgJ7*t$^&hEZ=Tx&UrHj zUDq{a^iNLqmqLiD3hj$hE4Drp?3j9L;|@~;`=Zp(x+XsDv@*~HqrcM<9nvf+HEeo# zjn0C#i&t=Xo{gbbT3Z)7%4T>jIhyOCVAtiig>Bb3$QtKV;0brHr0KzlChNhbKt`5t zX>AUx;jG)t|2u(EeqirjqdJYOTWzQ)RjBHo#Is9&Rddnc6kZdzyWgYCt=9GuSw8p` zD4VU55w*6?(ZZ@-Jg3>k-iwrYk4Nrr-ksvCxWlK7xuS% zCkS5H-|lT%w_2tzi}iAC&A=6$!O`I`hHn>;oKB^ZsVv{#-0m1PYp7gQOuUP|U~MMS z>AI=Cr=xSCs}uCpozZlGpZ0JzqgH(5fbUuO#!XA>L^n3XT@IR;be9vubhHShL5wLb zA|fcDxF8K;OmPtrK>@`DX%J(Ii--scC@x5Y7*kwCL{LC+K^nxE;vyn~0*VXLAjT9I z5fKznT#yDarnrcRpn&3nG>9?9MMMMz6c?mHj43W6A}FA^APr(naS;(g0mTJr5Mzpq zhzJTOE=YqIQ(QzuP(X1(8pN35A|iqUiVM;p#uOJ35fo5dkOncPxQK|LfZ~EQh%v=Q zL<9vC7owsiM3}( zl)>@ZmEVtSe(+OanNr!m>y5*wy!YLCzxb#5(2vXZPP}KV%uVbR-#zo;g|}8ddbRM| zx}jA!loXf#VDHIN@%r}rpNnmK;y`i5O>tH|vHHeO%6Nn?@f!#m9d~w&hijumx z>&@$>e@>36fAikb^#ymu?6IrA9FvyLU;gUmwF|Eg9F;fkIrG``-><&*)Yk7lf9-4G zz)P=cbMpCp`!heRKDBD-o#XzcBQta5xP1BO$A`Y$y>|D;)Auq5PYpiI%VC0DoWme*gdg literal 0 HcmV?d00001 diff --git a/locale/de/all b/locale/de/all index 7e4c709e5..79188448f 100755 --- a/locale/de/all +++ b/locale/de/all @@ -311,6 +311,7 @@ $self->{texts} = { 'Amount BT' => 'Betrag Bank', 'Amount Due' => 'Betrag fällig', 'Amount and net amount are calculated by kivitendo. "verify_amount" and "verify_netamount" can be used for sanity checks.' => 'Betrag und Nettobetrag werden von kivitendo berechnet. "verify_amount" und "verify_netamount" können für Plausibilitätsprüfungen angegeben werden.', + 'Amount has wrong format.' => 'Betrag hat falsches Format.', 'Amount less skonto' => 'Betrag abzgl. Skonto', 'Amount payable' => 'Noch zu bezahlender Betrag', 'Amount payable less discount' => 'Noch zu bezahlender Betrag abzüglich Skonto', @@ -429,6 +430,7 @@ $self->{texts} = { 'Balances' => 'Salden', 'Balancing' => 'Bilanzierung', 'Bank' => 'Bank', + 'Bank Account Id Number (Swiss)' => 'Bankkonto Identifikationsnummer (Schweiz)', 'Bank Code' => 'BLZ', 'Bank Code (long)' => 'Bankleitzahl (BLZ)', 'Bank Code Number' => 'Bankleitzahl', @@ -438,6 +440,7 @@ $self->{texts} = { 'Bank Transaction' => 'Bankkonto', 'Bank Transaction is in a closed period.' => 'Die Bankbewegung befindet sich innerhalb eines geschlossenen Zeitraums.', 'Bank account' => 'Bankkonto', + 'Bank account id number invalid. Must be 6 digits.' => 'Bank Identifikationsnummer ungültig. (6-stellig)', 'Bank accounts' => 'Bankkonten', 'Bank code' => 'Bankleitzahl', 'Bank code of the goal/source' => 'Bankleitzahl von Ziel- oder Quellkonto', @@ -812,6 +815,7 @@ $self->{texts} = { 'Create one from the context menu by right-clicking on this text.' => 'Erstellen Sie einen aus dem Kontextmenü, indem Sie auf diesen Text rechtsklicken.', 'Create order' => 'Auftrag erstellen', 'Create sales invoices with Factur-X/ZUGFeRD data' => 'Verkaufsrechnungen mit Factur-X-/ZUGFeRD-Daten erzeugen', + 'Create sales invoices with Swiss QR-Bill' => 'Verkaufsrechnungen mit Schweizer QR-Rechnung erzeugen', 'Create tables' => 'Tabellen anlegen', 'Create with profile \'Factur-X 1.0.05/ZUGFeRD 2.1.1 extended\'' => 'Mit Profil »Factur-X 1.0.05/ZUGFeRD 2.1.1 extended«', 'Create with profile \'Factur-X 1.0.05/ZUGFeRD 2.1.1 extended\' (test mode)' => 'Mit Profil »Factur-X 1.0.05/ZUGFeRD 2.1.1 extended« (Test-Modus)', @@ -886,6 +890,7 @@ $self->{texts} = { 'Customer missing!' => 'Kundenname fehlt!', 'Customer must not be empty.' => 'Kunden darf nicht leer sein.', 'Customer not found' => 'Kunde nicht gefunden', + 'Customer number invalid. Must be less then or equal to 6 digits after prefix.' => 'Kundennummer ungültig. (kleiner/gleich 6 Stellen nach Prefix)', 'Customer of assigned order must match customer.' => 'Kunde des zugeordneten Auftrags muss mit dem gewählten Kunden übereinstimmen.', 'Customer of assigned project must match customer.' => 'Kunde des zugeordneten Projekts muss mit dem gewählten Kunden übereinstimmen.', 'Customer saved' => 'Kunde gespeichert', @@ -1356,6 +1361,8 @@ $self->{texts} = { 'Error in position #1: You must either assign no stock at all or the full quantity of #2 #3.' => 'Fehler in Position #1: Sie müssen einer Position entweder gar keinen Lagereingang oder die vollständige im Lieferschein vermerkte Menge von #2 #3 zuweisen.', 'Error in position #1: You must either assign no transfer at all or the full quantity of #2 #3.' => 'Fehler in Position #1: Sie müssen einer Position entweder gar keinen Lagerausgang oder die vollständige im Lieferschein vermerkte Menge von #2 #3 zuweisen.', 'Error in row #1: The quantity you entered is bigger than the stocked quantity.' => 'Fehler in Zeile #1: Die angegebene Menge ist größer als die vorhandene Menge.', + 'Error mapping biller countrycode.' => 'Fehler beim Erzeugen des Ländercodes für Rechnungssteller.', + 'Error mapping customer countrycode.' => 'Fehler beim Erzeugen des Ländercodes für Kunden.', 'Error message from the database driver:' => 'Fehlermeldung des Datenbanktreibers:', 'Error message from the database: #1' => 'Fehlermeldung der Datenbank: #1', 'Error message from the webshop api:' => 'Fehlermeldung der Webshop Api', @@ -1714,6 +1721,7 @@ $self->{texts} = { 'If enabled a warning will be shown in sales delivery orders on workflow to invoices if positions are not stocked out.' => 'Falls aktiviert, wird eine Warnung beim Workflow von Verkaufslieferscheinen zu Rechnungen ausgegeben, wenn die Positionen noch nicht ausgelagert sind.', 'If enabled only those projects that are assigned to the currently selected customer are offered for selection in sales records.' => 'Wenn eingeschaltet, so werden in Verkaufsbelegen nur diejenigen Projekte zur Auswahl angeboten, die dem aktuell ausgewählten Kunden zugewiesen wurden.', 'If enabled purchase and sales records cannot be saved if no transaction description has been entered.' => 'Wenn angeschaltet, so können Einkaufs- und Verkaufsbelege nicht gespeichert werden, solange keine Vorgangsbezeichnung eingegeben wurde.', + 'If enabled sales invoices created using OpenDocument/OASIS format will include data for Swiss QR-Bill creation.' => 'Falls aktiviert, enthalten Rechnungen im OpenDocument/OASIS Format, Daten zur Schweizer QR-Rechnung.', 'If enabled the record links view starts always from the sales order including all sublevels' => 'Falls aktiv, werden die verknüpften Belege immer vom Verkaufsauftrag inkl. aller darunterliegenden Belege angezeigt', 'If item not found, allow creation of new item' => 'Falls Artikel nicht gefunden, erlaube Erfassen eines Neuen', 'If left empty the default sender from the kivitendo configuration will be used (key \'email_from\' in section \'periodic_invoices\'; current value: #1).' => 'Falls leer, so wird der Standardabsender aus der kivitendo-Konfiguration genutzt (Schlüssel »email_from« in Abschnitt »periodic_invoices«; aktueller Wert: #1).', @@ -1857,6 +1865,7 @@ $self->{texts} = { 'Invoice for fees' => 'Rechnung über Gebühren', 'Invoice has already been storno\'d!' => 'Diese Rechnung wurde bereits storniert.', 'Invoice number' => 'Rechnungsnummer', + 'Invoice number invalid. Must be less then or equal to 7 digits after prefix.' => 'Rechnungsnummer ungültig. (kleiner/gleich 7 Stellen nach Prefix)', 'Invoice to:' => 'Rechnung an:', 'Invoice total' => 'Die Rechnungssumme', 'Invoice total less discount' => 'Rechnungssumme abzüglich Skonto', @@ -2163,6 +2172,7 @@ $self->{texts} = { 'No bank account chosen!' => 'Kein Bankkonto ausgewählt!', 'No bank account configured for bank code/BIC #1, account number/IBAN #2.' => 'Kein Bankkonto für BLZ/BIC #1, Kontonummer/IBAN #2 konfiguriert.', 'No bank account flagged for Factur-X/ZUGFeRD usage was found.' => 'Es wurde kein Bankkonto gefunden, das für Nutzung mit Factur-X/ZUGFeRD markiert ist.', + 'No bank account flagged for QRBill usage was found.' => 'Kein Bankkonto markiert für QR-Rechnung gefunden.', 'No bank information has been entered in this customer\'s master data entry. You cannot create bank collections unless you enter bank information.' => 'Für diesen Kunden wurden in seinen Stammdaten keine Kontodaten hinterlegt. Solange dies nicht geschehen ist, können Sie keine Überweisungen für den Lieferanten anlegen.', 'No bank information has been entered in this vendor\'s master data entry. You cannot create bank transfers unless you enter bank information.' => 'Für diesen Lieferanten wurden in seinen Stammdaten keine Kontodaten hinterlegt. Solange dies nicht geschehen ist, können Sie keine Überweisungen für den Lieferanten anlegen.', 'No bins have been added to this warehouse yet.' => 'Es wurden zu diesem Lager noch keine Lagerplätze angelegt.', @@ -2339,6 +2349,7 @@ $self->{texts} = { 'Order amount' => 'Auftragswert', 'Order deleted!' => 'Auftrag gelöscht!', 'Order item search' => 'Auftragsartikelsuche', + 'Order number invalid. Must be less then or equal to 7 digits after prefix.' => 'Auftragsnummer ungültig. (kleiner/gleich 7 Stellen nach Prefix)', 'Order probability' => 'Auftragswahrscheinlichkeit', 'Order probability & expected billing date' => 'Auftragswahrscheinlichkeit & vorrauss. Abrechnungsdatum', 'Order value periodicity' => 'Auftragswert basiert auf Periodizität', @@ -2695,6 +2706,8 @@ $self->{texts} = { 'Purpose' => 'Verwendungszweck', 'Purpose (if field names purpose, purpose1, purpose2 ... exist they will all combined into the field "purpose")' => 'Verwendungszweck (wenn die Spalten purpose, purpose1, purpose2 ... existieren werden diese zum Feld "purpose" zusammengefügt)', 'Purpose/Reference' => 'Verwendungszweck und Referenz', + 'QR-Code placeholder image: QRCodePlaceholder not found in template.' => 'QR-Code Platzhalter Bild: QRCodePlaceholder nicht gefunden.', + 'QR-Image generation failed: ' => 'QR-Code Erzeugung fehlgeschlagen: ', 'QUEUED' => 'In Warteschlange', 'Qty' => 'Menge', 'Qty according to delivery order' => 'Menge laut Lieferschein', @@ -4056,6 +4069,7 @@ $self->{texts} = { 'Use default booking group because wanted is missing' => 'Fehlende Buchungsgruppe, deshalb Standardbuchungsgruppe', 'Use existing templates' => 'Vorhandene Druckvorlagen verwenden', 'Use for Factur-X/ZUGFeRD' => 'Nutzung mit Factur-X/ZUGFeRD', + 'Use for Swiss QR-Bill' => 'Nutzung mit Schweizer QR-Rechnung', 'Use master default bin for Default Transfer, if no default bin for the part is configured' => 'Standardlagerplatz für Ein- / Auslagern über Standard-Lagerplatz, falls für die Ware kein expliziter Lagerplatz konfiguriert ist', 'Use settings from client configuration' => 'Einstellungen aus Mandantenkonfiguration folgen', 'Use text field for department of contacts' => 'Textfeld für Abteilungen von Ansprechpersonen verwenden', diff --git a/locale/en/all b/locale/en/all index 3d05e6dcc..dc99bfcfd 100644 --- a/locale/en/all +++ b/locale/en/all @@ -311,6 +311,7 @@ $self->{texts} = { 'Amount BT' => '', 'Amount Due' => '', 'Amount and net amount are calculated by kivitendo. "verify_amount" and "verify_netamount" can be used for sanity checks.' => '', + 'Amount has wrong format.' => '', 'Amount less skonto' => '', 'Amount payable' => '', 'Amount payable less discount' => '', @@ -429,6 +430,7 @@ $self->{texts} = { 'Balances' => '', 'Balancing' => '', 'Bank' => '', + 'Bank Account Id Number (Swiss)' => '', 'Bank Code' => '', 'Bank Code (long)' => '', 'Bank Code Number' => '', @@ -438,6 +440,7 @@ $self->{texts} = { 'Bank Transaction' => '', 'Bank Transaction is in a closed period.' => '', 'Bank account' => '', + 'Bank account id number invalid. Must be 6 digits.' => '', 'Bank accounts' => '', 'Bank code' => '', 'Bank code of the goal/source' => '', @@ -812,6 +815,7 @@ $self->{texts} = { 'Create one from the context menu by right-clicking on this text.' => '', 'Create order' => '', 'Create sales invoices with Factur-X/ZUGFeRD data' => '', + 'Create sales invoices with Swiss QR-Bill' => '', 'Create tables' => '', 'Create with profile \'Factur-X 1.0.05/ZUGFeRD 2.1.1 extended\'' => '', 'Create with profile \'Factur-X 1.0.05/ZUGFeRD 2.1.1 extended\' (test mode)' => '', @@ -886,6 +890,7 @@ $self->{texts} = { 'Customer missing!' => '', 'Customer must not be empty.' => '', 'Customer not found' => '', + 'Customer number invalid. Must be less then or equal to 6 digits after prefix.' => '', 'Customer of assigned order must match customer.' => '', 'Customer of assigned project must match customer.' => '', 'Customer saved' => '', @@ -1356,6 +1361,8 @@ $self->{texts} = { 'Error in position #1: You must either assign no stock at all or the full quantity of #2 #3.' => '', 'Error in position #1: You must either assign no transfer at all or the full quantity of #2 #3.' => '', 'Error in row #1: The quantity you entered is bigger than the stocked quantity.' => '', + 'Error mapping biller countrycode.' => '', + 'Error mapping customer countrycode.' => '', 'Error message from the database driver:' => '', 'Error message from the database: #1' => '', 'Error message from the webshop api:' => '', @@ -1714,6 +1721,7 @@ $self->{texts} = { 'If enabled a warning will be shown in sales delivery orders on workflow to invoices if positions are not stocked out.' => '', 'If enabled only those projects that are assigned to the currently selected customer are offered for selection in sales records.' => '', 'If enabled purchase and sales records cannot be saved if no transaction description has been entered.' => '', + 'If enabled sales invoices created using OpenDocument/OASIS format will include data for Swiss QR-Bill creation.' => '', 'If enabled the record links view starts always from the sales order including all sublevels' => '', 'If item not found, allow creation of new item' => '', 'If left empty the default sender from the kivitendo configuration will be used (key \'email_from\' in section \'periodic_invoices\'; current value: #1).' => '', @@ -1857,6 +1865,7 @@ $self->{texts} = { 'Invoice for fees' => '', 'Invoice has already been storno\'d!' => '', 'Invoice number' => '', + 'Invoice number invalid. Must be less then or equal to 7 digits after prefix.' => '', 'Invoice to:' => '', 'Invoice total' => '', 'Invoice total less discount' => '', @@ -2163,6 +2172,7 @@ $self->{texts} = { 'No bank account chosen!' => '', 'No bank account configured for bank code/BIC #1, account number/IBAN #2.' => '', 'No bank account flagged for Factur-X/ZUGFeRD usage was found.' => '', + 'No bank account flagged for QRBill usage was found.' => '', 'No bank information has been entered in this customer\'s master data entry. You cannot create bank collections unless you enter bank information.' => '', 'No bank information has been entered in this vendor\'s master data entry. You cannot create bank transfers unless you enter bank information.' => '', 'No bins have been added to this warehouse yet.' => '', @@ -2339,6 +2349,7 @@ $self->{texts} = { 'Order amount' => '', 'Order deleted!' => '', 'Order item search' => '', + 'Order number invalid. Must be less then or equal to 7 digits after prefix.' => '', 'Order probability' => '', 'Order probability & expected billing date' => '', 'Order value periodicity' => '', @@ -2695,6 +2706,8 @@ $self->{texts} = { 'Purpose' => '', 'Purpose (if field names purpose, purpose1, purpose2 ... exist they will all combined into the field "purpose")' => '', 'Purpose/Reference' => '', + 'QR-Code placeholder image: QRCodePlaceholder not found in template.' => '', + 'QR-Image generation failed: ' => '', 'QUEUED' => '', 'Qty' => '', 'Qty according to delivery order' => '', @@ -4055,6 +4068,7 @@ $self->{texts} = { 'Use default booking group because wanted is missing' => '', 'Use existing templates' => '', 'Use for Factur-X/ZUGFeRD' => '', + 'Use for Swiss QR-Bill' => '', 'Use master default bin for Default Transfer, if no default bin for the part is configured' => '', 'Use settings from client configuration' => '', 'Use text field for department of contacts' => '', diff --git a/templates/print/rev-odt/invoice_qr.odt b/templates/print/rev-odt/invoice_qr.odt new file mode 100644 index 0000000000000000000000000000000000000000..2b0688aeecbbee062a2d2b1f08ad6f9889744290 GIT binary patch literal 61023 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 GI{QBuQxgjS literal 0 HcmV?d00001 diff --git a/templates/webpages/client_config/_features.html b/templates/webpages/client_config/_features.html index 1585eba45..46d8a37e9 100644 --- a/templates/webpages/client_config/_features.html +++ b/templates/webpages/client_config/_features.html @@ -277,6 +277,11 @@ [% LxERP.t8("If the test mode is enabled, the Factur-X/ZUGFeRD invoices will be flagged so that they're only fit to be used for testing purposes.") %] + + [% LxERP.t8("Create sales invoices with Swiss QR-Bill") %] + [% L.yes_no_tag("defaults.create_qrbill_invoices", SELF.defaults.create_qrbill_invoices) %] + [% LxERP.t8("If enabled sales invoices created using OpenDocument/OASIS format will include data for Swiss QR-Bill creation.") %] + [% LxERP.t8("E-mail") %] -- 2.20.1