my $sub_fmt = lc($params{attribute_format} // 'text');
my ($start_tag, $end_tag) = $sub_fmt eq 'html' ? ('<%', '%>') : ('<%', '%>');
+ 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;
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' },
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' ? '<%' : '<%';
+ my $tag_end = $spec->{type} eq 'html' ? '%>' : '%>';
+ 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;
}
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} = "";
- 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):
'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',
'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',
--- /dev/null
+-- @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;
</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>