]> wagnertech.de Git - mfinanz.git/commitdiff
Drucken: Variablen in Positionen interpolieren
authorMoritz Bunkus <m.bunkus@linet-services.de>
Thu, 14 Feb 2019 13:48:38 +0000 (14:48 +0100)
committerMoritz Bunkus <m.bunkus@linet.de>
Wed, 10 Nov 2021 15:06:56 +0000 (16:06 +0100)
Alle Variablen, die in Schleifen ausgegeben
werden (z.B. Artikelbeschreibung, Langtext, aber auch die Steuern)
werden nun ebenfalls der Interpolation unterzogen, sodass
z.B. in wiederkehrenden Rechnungen <%current_quarter%> in
Artikelbeschreibungen genutzt werden kann — aber auch Belegfelder.

SL/BackgroundJob/CreatePeriodicInvoices.pm
SL/DB/MetaSetup/Default.pm
SL/Form.pm
bin/mozilla/io.pl
doc/changelog
locale/de/all
sql/Pg-upgrade2/defaults_print_interpolate_variables_in_positions.sql [new file with mode: 0644]
templates/webpages/client_config/_miscellaneous.html

index 6151ec158581d46c8bc6fe8e0221063a6b1a91bb..58f1febab45c3e9c11bae1b2d4a75b1e6f969f5e 100644 (file)
@@ -143,8 +143,10 @@ sub _replace_vars {
   my $sub_fmt  = lc($params{attribute_format} // 'text');
 
   my ($start_tag, $end_tag) = $sub_fmt eq 'html' ? ('&lt;%', '%&gt;') : ('<%', '%>');
+  my @invoice_keys          = $params{invoice} ? (map { $_->name } $params{invoice}->meta->columns) : ();
+  my $key_name_re           = join '|', map { quotemeta } (@invoice_keys, keys %{ $params{vars} });
 
-  $str =~ s{ ${start_tag} ([a-z0-9_]+) ( \s+ format \s*=\s* (.*?) \s* )? ${end_tag} }{
+  $str =~ s{ ${start_tag} ($key_name_re) ( \s+ format \s*=\s* (.*?) \s* )? ${end_tag} }{
     my ($key, $format) = ($1, $3);
     $key               = $::locale->unquote_special_chars('html', $key) if $sub_fmt eq 'html';
     my $new_value;
index 97e3b705818189919da3bf009bf4a41f72b2ff34..86da0f8356656963a54b8e1e82cc62937feff164 100644 (file)
@@ -131,6 +131,7 @@ __PACKAGE__->meta->columns(
   pdonumber                                 => { type => 'text' },
   ponumber                                  => { type => 'text' },
   precision                                 => { type => 'numeric', default => '0.01', not_null => 1, precision => 15, scale => 5 },
+  print_interpolate_variables_in_positions  => { type => 'boolean', default => 'true', not_null => 1 },
   produce_assembly_same_warehouse           => { type => 'boolean', default => 'true' },
   produce_assembly_transfer_service         => { type => 'boolean', default => 'false' },
   profit_carried_forward_chart_id           => { type => 'integer' },
index 06c0b2317f89730ed63791b1b3094f153d0d1eeb..a95f4e0db103ec6a4682ab3cc64674a56cc51423 100644 (file)
@@ -3214,6 +3214,32 @@ sub prepare_for_printing {
     today     => DateTime->today,
   };
 
+  if ($defaults->print_interpolate_variables_in_positions) {
+    $self->substitute_placeholders_in_template_arrays({ field => 'description', type => 'text' }, { field => 'longdescription', type => 'html' });
+  }
+
+  return $self;
+}
+
+sub substitute_placeholders_in_template_arrays {
+  my ($self, @fields) = @_;
+
+  foreach my $spec (@fields) {
+    $spec     = { field => $spec, type => 'text' } if !ref($spec);
+    my $field = $spec->{field};
+
+    next unless exists $self->{TEMPLATE_ARRAYS} && exists $self->{TEMPLATE_ARRAYS}->{$field};
+
+    my $tag_start = $spec->{type} eq 'html' ? '&lt;%' : '<%';
+    my $tag_end   = $spec->{type} eq 'html' ? '%&gt;' : '%>';
+    my $formatter = $spec->{type} eq 'html' ? sub { $::locale->quote_special_chars('html', $_[0] // '') } : sub { $_[0] };
+
+    $self->{TEMPLATE_ARRAYS}->{$field} = [
+      apply { s{${tag_start}(.+?)${tag_end}}{ $formatter->($self->{$1}) }eg }
+        @{ $self->{TEMPLATE_ARRAYS}->{$field} }
+    ];
+  }
+
   return $self;
 }
 
index a69521b12f311ac97c62539a79cdd2d6010b6bca..917720c9d21717ff32f1374a92e0201e4ee9cbb3 100644 (file)
@@ -1570,6 +1570,10 @@ sub print_form {
     today     => DateTime->today,
   };
 
+  if ($defaults->print_interpolate_variables_in_positions) {
+    $form->substitute_placeholders_in_template_arrays({ field => 'description', type => 'text' }, { field => 'longdescription', type => 'html' });
+  }
+
   $form->parse_template(\%myconfig);
 
   $form->{callback} = "";
index 3004a0df27dfc4dcd0301b13bd81a8f047bebe41..9443ffd93150e90825a4d91cbf97feed1c4c0b1d 100644 (file)
@@ -35,6 +35,10 @@ Kleinere neue Features und Detailverbesserungen:
 - Pflichtenhefte: wenn in einem Auftrag, das mit einem Pflichtenheft
   verknüpft ist, ein Projekt ausgewählt, so wird dieses Projekt auch
   automatisch beim verknüpften Pflichtenheft eingetragen.
+- Druckvorlagen: die in Positionen verwendeten Variablen können nun
+  Platzhalter enthalten, die vom Beleg selber stammen. So könnte
+  z.B. in der Artikelbeschreibung automatisch die Rechnungsnummer
+  ersetzt werden. Beispiel: »Abrechnungszeitraum bis <%invnumber%>«
 
 Bugfixes (Tracker: https://www.kivitendo.de/redmine):
 
index fbc82037bdde563bf0eb8b7dcad9085607d6f3fd..291b30ad1e62b8d2f3d0f352f39328c69855cfd2 100755 (executable)
@@ -1798,6 +1798,7 @@ $self->{texts} = {
   'Internal Phone List'         => 'Interne Telefonliste',
   'Internal comment'            => 'Interne Bemerkungen',
   'Internet'                    => 'Internet',
+  'Interpolate variables in texts of positions' => 'Variablen in Positionstexten interpolieren',
   'Into bin'                    => 'Eingelagert',
   'Intra-Community supply'      => 'Gelangensbestätigung',
   'Introduction of clients'     => 'Einführung von Mandanten',
@@ -4150,6 +4151,7 @@ $self->{texts} = {
   'What this template contains' => 'Was diese Vorlage enthält',
   'What type of item is this?'  => 'Was ist dieser Artikel?',
   'When converting a requirement spec into a quotation or an oder each section gets converted into a line position in the new record. This is the article used by default for this conversion.' => 'Wenn ein Pflichtenheft in ein Angebot oder Auftrag umgewandelt wird, wird für jeden Abschnitt eine Position im neuen Beleg angelegt. Dies ist der Artikel, der standardmäßig bei dieser Umwandlung genutzt wird.',
+  'Whether or not to replace variable placeholders such as "<%invdate%>" in texts in positions such as the part description by the record\'s actual value' => 'Ob Variablenplatzhalter wie z.B. <%invdate%> in Positionstexten wie der Artikelbeschreibung durch den tatsächlichen Wert aus dem Beleg ersetzt werden sollen',
   'Which is located at doc/kivitendo-Dokumentation.pdf. Click here: ' => 'Diese befindet sich unter doc/kivitendo-Dokumentation.pdf. Klicken Sie hier:',
   'With Attachments'            => 'Journal mit Anhängen',
   'With Extension Of Time'      => 'mit Dauerfristverlängerung',
diff --git a/sql/Pg-upgrade2/defaults_print_interpolate_variables_in_positions.sql b/sql/Pg-upgrade2/defaults_print_interpolate_variables_in_positions.sql
new file mode 100644 (file)
index 0000000..04aa917
--- /dev/null
@@ -0,0 +1,6 @@
+-- @tag: defaults_print_interpolate_variables_in_positions
+-- @description: Drucken: Variablen in Belegpositionen interpolieren (abschaltbar via Mandantenkonfiguration)
+-- @depends: release_3_5_8
+ALTER TABLE defaults
+ADD COLUMN print_interpolate_variables_in_positions BOOLEAN
+DEFAULT TRUE NOT NULL;
index f938f7268614d09e89fa8d4f3783811770260e88..06067676e28a7aff21a2ab0b86346f6e8b4bdf3a 100644 (file)
    </td>
   </tr>
 
+  <tr>
+   <td align="right">[% LxERP.t8('Interpolate variables in texts of positions') %]</td>
+   <td>[% L.yes_no_tag('defaults.print_interpolate_variables_in_positions', SELF.defaults.print_interpolate_variables_in_positions) %]</td>
+   <td>[% LxERP.t8('Whether or not to replace variable placeholders such as "<%invdate%>" in texts in positions such as the part description by the record\'s actual value') %]</td>
+  </tr>
+
   <tr><td class="listheading" colspan="4">[% LxERP.t8("Currencies") %]</td></tr>
 
   <tr>