Druckvorlagen marei: Leistungsdatum in Rechnung und Auftrag drucken
[kivitendo-erp.git] / templates / print / marei / kiviletter.sty
1 \NeedsTeXFormat{LaTeX2e}
2 \ProvidesPackage{kiviletter}[2020/04/24 Letter Layouts for Kivitendo]
3
4 \RequirePackage{l3keys2e}
5
6 %Optionen vor den eigenen Paketoptionen hinzufügen, damit spätere diese ggf. überschreiben
7 \PassOptionsToPackage{
8   fromlogo,
9   fromalign=right,
10   firstfoot=false,%Für einheitliche Randeinstellungen
11   refline=nodate,
12 }{scrletter}
13
14 \ExplSyntaxOn
15 \newif\if@kivi@infobox
16 \newif\if@kivi@footer
17 \keys_define:nn {kiviletter} {
18   infobox .choices:nn = {true,false} {\use:c {@kivi@infobox\l_keys_choice_tl}},
19   infobox .default:n = true,
20   infobox .initial:n = true,
21   reffields .meta:n = {infobox=false},
22   footer .choices:nn = {true,false} {\use:c {@kivi@footer\l_keys_choice_tl}},
23   footer .default:n = true,
24   footer .initial:n = true,
25   nofooter .meta:n = {footer=false},
26   unknown .code:n = \PassOptionsToPackage{\l_keys_key_str=#1}{scrletter},
27 }
28 \ExplSyntaxOff
29
30 \ProcessKeysOptions{kiviletter}
31
32 \RequirePackage{xparse}
33 \RequirePackage{iftex}
34
35 % Schriftart, Eingabelayout der Tastatur
36 \ifPDFTeX
37   \RequirePackage[utf8]{inputenc}% Nur notwendig, wenn Basis älter als TL2018
38   \RequirePackage[T1]{fontenc}
39   \RequirePackage{lmodern}
40
41   \RequirePackage{eurosym}
42   \DeclareUnicodeCharacter{20AC}{\euro}
43 \else
44   \RequirePackage{fontspec}
45 \fi
46
47 \RequirePackage{xltabular}
48 \RequirePackage{booktabs}
49 \RequirePackage{graphicx}
50
51 \RequirePackage{scrletter}
52 \LoadLetterOption{DIN}
53
54 \newkomavar{taxpoint}
55 \newkomavar{transaction}
56 \newkomavar[\lieferschein{}~\nr]{delivery}
57 \newkomavar[\angebot{}~\nr]{quote}
58 \newkomavar[\auftragsnummer]{orderID}
59 \newkomavar[\projektnummer]{projectID}
60 \setkomavar*{fromphone}{\textTelefon}
61 \setkomavar*{fromemail}{\textEmail}
62 \setkomavar*{fromfax}{\textFax}
63 \setkomavar*{customer}{\kundennummer}
64
65
66 \usepackage{geometry}
67
68 \ExplSyntaxOn
69 \dim_new:N \g_kivi_margin_dim
70 \dim_gset:Nn \g_kivi_margin_dim {\useplength{toaddrhpos}}
71 \geometry{a4paper,margin=\g_kivi_margin_dim,heightrounded}
72 %Scratch variables
73 \int_new:N \l_kivi_tmp_int
74 \bool_new:N \l_kivi_tmp_bool
75 \bool_new:N  \g_kivi_TableFoot_bool
76 \dim_new:N \g_kivi_orig@textheight_dim
77 \ExplSyntaxOff
78
79 \newsavebox{\shippingAddressBox}
80
81
82 \DeclareNewLayer[
83   foreground,
84   hoffset=\useplength{toaddrhpos},
85   voffset=\dimexpr\useplength{toaddrvpos}+\useplength{toaddrheight}+4\baselineskip,%sep to shippingaddressbox
86   contents={\usebox\shippingAddressBox}
87 ]{kivitendo.shippingaddress}
88
89 \newpairofpagestyles{kivitendo.letter}{}
90
91 \renewcommand*{\letterpagestyle}{kivitendo.letter}
92
93 \DeclareNewPageStyleByLayers{kivitendo.letter.first}{
94   kivitendo.shippingaddress,
95   plain.kivitendo.letter.head.odd,plain.kivitendo.letter.head.even,plain.kivitendo.letter.head.oneside,%
96   plain.kivitendo.letter.foot.odd,plain.kivitendo.letter.foot.even,plain.kivitendo.letter.foot.oneside,%
97 }
98
99 \setkomavar{backaddress}{\firma\ $\cdot$ \strasse\ $\cdot$ \ort}
100
101 \setkomavar{firsthead}{
102   \if@logo
103     \rlap{\usekomavar{fromlogo}}%
104   \fi
105 }
106
107 \@setplength{locwidth}{6cm}
108
109 \ExplSyntaxOn
110 \dim_new:N \l_kivi_tab_desc_leftskip_dim
111
112
113
114 \cs_new:Nn \__kivi_set_colwidth:nn  {
115   \dim_set:cn {l_kivi_tab_#1_dim} {#2}
116 }
117
118
119 \cs_new:Nn \__kivi_initialize_columns: {
120   \clist_map_inline:Nn \g_kivi_pricingtable_col_clist {
121     \bool_if_exist:cF {l_kivi_col_##1_bool}
122     {
123       \bool_new:c {l_kivi_col_##1_bool}
124       \dim_new:c {l_kivi_tab_##1_dim}
125       \keys_define:nn {kivi/PricingTable} {
126         ##1 .choice:,
127         ##1 / true .code:n = \bool_set_true:c {l_kivi_col_##1_bool},
128         ##1 / false .code:n = \bool_set_false:c {l_kivi_col_##1_bool},
129         ##1 / unknown .code:n = {
130             \bool_set_true:c {l_kivi_col_##1_bool}
131             \dim_set:cn {l_kivi_tab_##1_dim} {####1}
132           },
133         ##1 .default:n = true,
134         ##1 .initial:n = true,
135         ##1 / header .prop_put:c = {l_kivi_col_##1_prop},
136         ##1 / colspec .prop_put:c = {l_kivi_col_##1_prop},
137       }
138     }
139   }
140 }
141
142 \clist_new:N \g_kivi_pricingtable_col_clist
143
144 \keys_define:nn {kivi/PricingTable} {
145   columns .code:n =
146   \clist_gset:Nn \g_kivi_pricingtable_col_clist {#1}
147   \__kivi_initialize_columns:,
148   columns .initial:n = {pos, id, desc, amount, price, pricetotal},
149   unknown .code:n = \keys_set:no {kivi/Tabular} {\l_keys_key_str=#1}
150 }
151
152 % set default values for colwidth
153 \keys_set:nn {kivi/PricingTable} {
154   pos=5ex,
155   id=4em,
156   amount=5em,
157   price=7em,
158   pricetotal=7em,
159   %  desc=auto,
160   pos/header=\position,
161   id/header=\artikelnummer,
162   desc/header=\bezeichnung,
163   amount/header=\menge,
164   price/header=\einzelpreis,
165   pricetotal/header=\gesamtpreis,
166   price / colspec = Price,
167   pricetotal / colspec = Price ,
168 }
169
170 \dim_new:N \g_kivi_tabcolsep_dim
171 \dim_gset:Nn \g_kivi_tabcolsep_dim {.5\tabcolsep}
172 \setlength\tabcolsep{.5\tabcolsep}
173
174 \prg_new_conditional:Nnn \kivi_if_Price_col:n {T} {
175   \prop_get:cnN {l_kivi_col_#1_prop} {colspec} \l_tmpa_tl
176   \exp_args:NV \tl_if_eq:nnTF \l_tmpa_tl {Price}
177   {\prg_return_true:}
178   {\prg_return_false:}
179 }
180
181
182 \cs_new:Nn \__kivi_calc_desc_column: {
183   \bool_if:NTF \g__kivi_Tabular_rowcolor_bool
184   {\dim_set:Nn \l_kivi_tab_desc_leftskip_dim {2\g_kivi_tabcolsep_dim}}
185   {\dim_zero:N \l_kivi_tab_desc_leftskip_dim}
186   \dim_zero:N \l_kivi_tab_desc_dim
187   \bool_set_false:N \l_tmpa_bool
188   \tl_gclear:N \g_kivi_Pricing_colspec_tl
189   \clist_map_inline:Nn \g_kivi_pricingtable_col_clist {
190     \tl_if_eq:nnTF {##1} {desc}  {
191       \dim_set:Nn \l_kivi_tab_desc_dim {
192         \textwidth-\l_kivi_tab_desc_leftskip_dim
193       }
194       \bool_set_true:N \l_tmpa_bool
195       \tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {p{\l_kivi_tab_desc_dim}}
196     }{
197       \bool_if:cT {l_kivi_col_##1_bool} {
198         \bool_if:NTF \l_tmpa_bool {
199           \dim_sub:Nn \l_kivi_tab_desc_dim {
200             \dim_use:c {l_kivi_tab_##1_dim}+2\g_kivi_tabcolsep_dim
201           }
202         }{
203           \dim_add:Nn \l_kivi_tab_desc_leftskip_dim {
204             \dim_use:c {l_kivi_tab_##1_dim}+2\g_kivi_tabcolsep_dim
205           }
206         }
207         \tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {K{\dim_use:c {l_kivi_tab_##1_dim}}}
208         \kivi_if_Price_col:nT {##1} {\tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {<{\__kivi_tab_column_currency:}}}
209       }
210     }
211   }
212   \bool_if:NF \g__kivi_Tabular_rowcolor_bool {
213     \tl_gput_left:Nn \g_kivi_Pricing_colspec_tl {@{}}
214     \tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {@{}}
215   }
216 }
217
218 \newcolumntype{K}[1]{>{\raggedleft\arraybackslash}p{#1}}
219 \newcolumntype{P}[1]{K{#1}<{\__kivi_tab_column_currency:}}
220
221 \RequirePackage{tcolorbox}
222 \tcbuselibrary{breakable, skins}
223
224 \tcb@new@skin{kivi@LT}{base@unbroken,%
225   frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,%
226   skin~first=kivi@LT@first,skin~middle=kivi@LT@middle,skin~last=kivi@LT@last,
227   underlay~first~and~middle={
228     \node[anchor=north]  at (interior.north)  {\csname box_use:c\endcsname  {g_kivi_LT@head_box}};
229     \node[anchor=south]  at (interior.south)  {\csname box_use:c\endcsname  {g_kivi_LT@foot_box}};
230 },
231   underlay~unbroken~and~last={
232     \node[anchor=north]  at (interior.north)  {\csname box_use:c\endcsname  {g_kivi_LT@head_box}};
233     \node[anchor=south]  at (interior.south)  {\csname box_use:c\endcsname  {g_kivi_LT@lastfoot_box}};
234   },
235   boxsep=0pt,
236   boxrule=0pt,
237   left=0pt,
238   right=0pt,
239   bottom=\box_ht:N  \g_kivi_LT@foot_box+\box_dp:N  \g_kivi_LT@foot_box + \aboverulesep,
240   top=\box_ht:N  \g_kivi_LT@head_box+\box_dp:N  \g_kivi_LT@head_box +\belowrulesep,
241   parbox=false,
242 }
243
244 \tcb@new@skin{kivi@LT@first}{base@first,%
245   frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,%
246   skin~first=kivi@LT@first,skin~middle=kivi@LT@middle,skin~last=kivi@LT@middle,
247 }
248
249 \tcb@new@skin{kivi@LT@middle}{base@middle,%
250   frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,%
251   skin~first=kivi@LT@middle,skin~middle=kivi@LT@middle,skin~last=kivi@LT@middle,
252 }
253
254 \tcb@new@skin{kivi@LT@last}{base@last,%
255   frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,%
256   skin~first=kivi@LT@middle,skin~middle=kivi@LT@middle,skin~last=kivi@LT@last,
257 }
258
259 \tcbset{kivi@LT/.style={skin=kivi@LT}}%
260
261 \seq_new:N \l_kivi_PricingTable_seq
262 \seq_new:N \l_kivi_columns_seq
263 \seq_new:N \g_kivi_extraDescription_seq
264
265 \int_new:N \g__kivi_PricingTable_rowcolor_int
266 \dim_new:N \l__kivi_fboxsep_dim
267 \dim_set:Nn \l__kivi_fboxsep_dim {\g_kivi_tabcolsep_dim}
268
269 %colorbox variant to only add vertical spacing
270 %based on colorbox definition from xcolor.sty
271 %% ----------------------------------------------------------------
272 %% Copyright (C) 2003-2016 by Dr. Uwe Kern <xcolor at ukern dot de>
273 %% ----------------------------------------------------------------
274 %% This variant of colorbox adds a space of \l__kivi_fboxsep_dim along the vertical axes but no horizontal space
275 \def\kivi@tabcolorbox#1#{\protect\kivi@tabcolor@box{#1}}
276
277 \def\kivi@tabcolor@box#1#2{
278   \tl_if_empty:oTF {#2}
279   \kivi@nocolor@b@x
280   \kivi@color@b@x
281   \relax{\color#1{#2}}
282 }
283 \long\def\kivi@color@b@x#1#2#3%
284 {\leavevmode
285   \setbox\z@\hbox{{\set@color#3}}%
286   \dimen@\ht\z@\advance\dimen@\l__kivi_fboxsep_dim\ht\z@\dimen@
287   \dimen@\dp\z@\advance\dimen@\l__kivi_fboxsep_dim\dp\z@\dimen@
288   {#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}}
289
290 \long\def\kivi@nocolor@b@x#1#2#3%
291 {\leavevmode
292   \setbox\z@\hbox{#3}%
293   \dimen@\ht\z@\advance\dimen@\l__kivi_fboxsep_dim\ht\z@\dimen@
294   \dimen@\dp\z@\advance\dimen@\l__kivi_fboxsep_dim\dp\z@\dimen@
295   {\box\z@}}
296
297 %%%
298
299
300 \newcommand{\FakeTable}[1]{
301   \par
302   \seq_set_split:Nnn \l_kivi_PricingTable_seq {\tabularnewline} {#1}
303   \seq_remove_all:Nn \l_kivi_PricingTable_seq {}
304   \begingroup
305   \setlength{\parskip}{\c_zero_dim}
306   \let\ExtraDescription\__kivi_addExtraDescription:n
307   \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
308   \seq_map_inline:Nn \l_kivi_PricingTable_seq {
309     \bool_if:NT \g__kivi_Tabular_rowcolor_bool {
310       \int_gincr:N \g__kivi_PricingTable_rowcolor_int
311       \int_if_odd:nTF {\g__kivi_PricingTable_rowcolor_int}
312       {\nointerlineskip\kivi@tabcolorbox{\g__kivi_Tabular_rowcolor_odd_tl}}
313       {\nointerlineskip\kivi@tabcolorbox{\g__kivi_Tabular_rowcolor_even_tl}}
314     }
315     {\parbox{\linewidth}{
316         \seq_set_split:Nnn  \l_kivi_columns_seq {&} {##1}
317         \seq_gclear:N \g_kivi_extraDescription_seq
318         \exp_args:Nnx \use:n {\tabular[t]}\g_kivi_Pricing_colspec_tl
319         \seq_pop_left:NN \__l_FakeTable_columns_seq \l_tmpa_tl
320         \seq_item:Nn \l_kivi_columns_seq {\l_tmpa_tl}
321         \seq_map_inline:Nn \__l_FakeTable_columns_seq {
322           &\seq_item:Nn \l_kivi_columns_seq {####1}
323         }
324         \endtabular
325         \seq_if_empty:NTF \g_kivi_extraDescription_seq
326         {\par}
327         {\par\nopagebreak
328           \begingroup
329           \setlength{\leftskip}{\dim_eval:n {\bool_if:NT \g__kivi_Tabular_rowcolor_bool {-\tabcolsep} +\l_kivi_tab_desc_leftskip_dim}}
330           \setlength{\hsize}{\dim_eval:n {\l_kivi_tab_desc_dim+\leftskip}}
331           \usekomafont{extraDescription}
332           \seq_use:Nn \g_kivi_extraDescription_seq {\\}
333           \par
334           \endgroup
335         }
336       }}
337   }
338   \endgroup\par
339   \l__kivi_Tabular_rowsep_tl
340 }
341
342
343 \seq_new:N  \__l_FakeTable_columns_seq
344 \cs_new:Nn \__kivi_setup_FakeTable: {
345   \seq_clear:N \__l_FakeTable_columns_seq
346   \int_zero:N \l_tmpa_int
347   \clist_map_inline:Nn \g_kivi_pricingtable_col_clist {
348     \int_incr:N \l_tmpa_int
349     \bool_if:cT {l_kivi_col_##1_bool} {\seq_put_right:Nx \__l_FakeTable_columns_seq {\int_use:N \l_tmpa_int}}
350   }
351 }
352
353 \tl_new:N \g_kivi_Pricing_colspec_tl
354 \tl_gset:Nn \g_kivi_Pricing_colspec_tl {
355   \bool_if:NF \g__kivi_Tabular_rowcolor_bool {@{}}
356   \bool_if:NT \l_kivi_col_pos_bool {p{\l_kivi_tab_pos_dim}}
357   \bool_if:NT \l_kivi_col_id_bool {p{\l_kivi_tab_id_dim}}
358   p{\l_kivi_tab_desc_dim}
359   \bool_if:NT \l_kivi_col_amount_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_amount_dim}}}
360   \bool_if:NT \l_kivi_col_price_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_price_dim}<{\__kivi_tab_column_currency:}}}
361   \bool_if:NT \l_kivi_col_pricetotal_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_pricetotal_dim}<{\__kivi_tab_column_currency:}}}
362   \bool_if:NF \g__kivi_Tabular_rowcolor_bool {@{}}
363 }
364
365 \cs_new_protected:Nn \__kivi_tab_column_currency: {\,\currency}
366 \def\tabcurrency{\__kivi_tab_column_currency:}
367 \cs_set:Nn \__kivi_tab_column_header_currency: {}
368 \cs_set_eq:NN \__kivi_tab_column_body_currency:  \__kivi_tab_column_currency:
369
370 \clist_map_inline:nn {head, foot, firsthead, lastfoot} {%TODO reduce
371   \box_new:c {g_kivi_LT@#1_box}
372 }
373
374 \newkomafont{PricingTableHeader}{\bfseries}
375
376 \cs_new:Nn \__kivi_setup_LT_boxes: {
377   \__kivi_calc_desc_column:
378   \hbox_gset:Nn \g_kivi_LT@head_box {
379     \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
380     \bool_if:NT \g__kivi_Tabular_rowcolor_bool {\kivi@tabcolorbox{\g__kivi_Tabular_rowcolor_header_tl}}%
381     {
382       \exp_args:Nnx \use:n {\tabular[b]}\g_kivi_Pricing_colspec_tl
383       \__kivi_PricingTabular_header:
384       \endtabular
385     }
386   }
387   \hbox_gset:Nn \g_kivi_LT@foot_box {
388     \begin{tabular*}{\textwidth}[t]{@{\extracolsep{\fill}}r@{\bool_if:NT \g__kivi_Tabular_rowcolor_bool {\hskip\tabcolsep}}}
389       \bool_if:NTF \g__kivi_Tabular_rowcolor_bool
390       {\hline\noalign{\vskip1pt}}
391       \midrule
392       \strut\weiteraufnaechsterseite
393     \end{tabular*}
394   }
395   \hbox_gset:Nn \g_kivi_LT@lastfoot_box {
396     \raisebox{\dimexpr\depth+\baselineskip}[0pt][0pt]{
397       \begin{tabular*}{\textwidth}{@{\bool_if:NT \g__kivi_Tabular_rowcolor_bool {\hskip\tabcolsep}\extracolsep{\fill}}r@{\bool_if:NT \g__kivi_Tabular_rowcolor_bool {\hskip\tabcolsep}}}
398         \bool_if:NF \g__kivi_Tabular_rowcolor_bool \bottomrule
399       \end{tabular*}
400     }
401   }
402 }
403
404
405 %Macht es sinn hier eine Variante zu machen, in der alle Spalten Belegbar sind?
406 \NewDocumentEnvironment{PricingTotal}{+b}{
407   \par\nointerlineskip
408 }{
409   \bool_if:NT \g__kivi_Tabular_rowcolor_bool   {\nointerlineskip\kivi@tabcolorbox{\g__kivi_Tabular_rowcolor_PricingTotal_tl}}
410   {
411     \tabular[t]{
412       @{\bool_if:NT \g__kivi_Tabular_rowcolor_bool {\hskip\tabcolsep}}
413       p{\dim_eval:n {\linewidth-\l_kivi_tab_pricetotal_dim-\bool_if:NTF \g__kivi_Tabular_rowcolor_bool {4}{2}\tabcolsep}}P{\l_kivi_tab_pricetotal_dim}@{\bool_if:NT \g__kivi_Tabular_rowcolor_bool {\hskip\tabcolsep}}
414     }
415     \l__kivi_Tabular_PricingTotal_topsep_tl
416     #1
417     \endtabular
418   }
419 }
420
421 \tl_new:N \l__kivi_Tabular_PricingTotal_topsep_tl
422 %TODO
423 \tl_set:Nn \l__kivi_Tabular_PricingTotal_topsep_tl {\bool_if:NF \g__kivi_Tabular_rowcolor_bool \midrule}
424
425 \newcommand*\ExtraDescription{
426   \PackageError{kiviletter}{The~command~\string\ExtraDescription\space~may~be~only~used~inside~the~\string\FakeTable\space~environment.}{See~documentation~for~details}
427 }
428
429
430 \cs_new:Nn \__kivi_addExtraDescription:n {\seq_gput_right:Nn \g_kivi_extraDescription_seq {#1}}
431
432 \newenvironment{PricingTabular}[1][]{
433   \begingroup
434   \dim_set:Nn \parskip {\c_zero_dim}
435   \tl_if_empty:nF {#1} {\keys_set:nn {kivi/PricingTable} {#1}}
436   \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
437   \__kivi_calc_desc_column:
438   \exp_args:Nx \longtable \g_kivi_Pricing_colspec_tl
439   % Tabellenkopf
440   \__kivi_PricingTabular_header:
441   \endhead
442   \midrule
443   \rlap{\makebox[\textwidth][r]{\weiteraufnaechsterseite}}\\
444   \endfoot
445   \bool_if:NF \g__kivi_Tabular_rowcolor_bool \bottomrule
446   \endlastfoot
447 }{
448   \endlongtable
449   \endgroup
450 }
451
452 \cs_set:Nn \__kivi_PricingTabular_header: {
453   \bool_if:NTF \g__kivi_Tabular_rowcolor_bool {\noalign{\skip_vertical:n {\dp\strutbox}}}\toprule
454   \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_header_currency:
455   \bool_set_false:N \l_tmpa_bool
456   \clist_map_inline:Nn \g_kivi_pricingtable_col_clist  {
457     \bool_if:cT {l_kivi_col_##1_bool} {
458       \bool_if:NT \l_tmpa_bool {&}
459       \bool_set_true:N \l_tmpa_bool
460       \usekomafont{PricingTableHeader}
461       \prop_item:cn {l_kivi_col_##1_prop} {header}
462     }
463   }
464   \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_body_currency:
465   \\
466   \bool_if:NF \g__kivi_Tabular_rowcolor_bool \midrule
467 }
468
469 \newkomafont{tablehead}{\bfseries}
470
471 \keys_define:nn {kivi/SimpleTabular} {
472   colspec .tl_set:N =\l_kivi_SimpleTabular_colspec_tl,
473   colspec .initial:n = {rrX},
474   headline .tl_set:N = \l_kivi_SimpleTabular_headline_tl,
475   headline .initial:n = {\usekomafont{tablehead}\position & \usekomafont{tablehead}\menge & \usekomafont{tablehead}\bezeichnung},
476 }
477
478 \keys_define:nn {kivi/Tabular} {
479   color-rows .bool_gset:N =  \g__kivi_Tabular_rowcolor_bool ,
480   color-rows .initial:n = false,
481   color-rows .default:n = true,
482   rowcolor-odd .tl_gset:N = \g__kivi_Tabular_rowcolor_odd_tl,
483   rowcolor-odd .initial:n = black!10,
484   rowcolor-even .tl_gset:N = \g__kivi_Tabular_rowcolor_even_tl,
485   rowcolor-even .initial:n =,
486   rowcolor-header .tl_gset:N = \g__kivi_Tabular_rowcolor_header_tl,
487   rowcolor-header .initial:n = black!35,
488   rowcolor-total .tl_gset:N = \g__kivi_Tabular_rowcolor_PricingTotal_tl,
489   rowcolor-total .initial:n = black!35,
490   rowsep .tl_set:N =\l__kivi_Tabular_rowsep_tl,
491   rowsep .initial:n = ,
492   hrule .meta:n = {
493     rowsep={
494       \vskip\aboverulesep
495       \leavevmode\hrule\@height\lightrulewidth
496       \vskip\belowrulesep}},
497 }
498
499 \newcommand*{\SetupSimpleTabular}[1]{\keys_set:nn {kivi/SimpleTabular} {#1}}
500 \newcommand*{\SetupPricingTabular}[1]{\keys_set:nn {kivi/PricingTable} {#1}}
501
502 \newenvironment{SimpleTabular}[1][]
503 {
504   \tl_if_in:nnTF {#1} {=} {\keys_set:nn {kivi/SimpleTabular} {#1}} {\tl_if_empty:nF {#1} {\tl_set:Nn \l_kivi_SimpleTabular_headline_tl {#1}}}
505   \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
506   \dim_set:Nn \parskip {\c_zero_dim}
507   \bool_if:NF \g__kivi_Tabular_rowcolor_bool {
508     \tl_put_right:Nn \l_kivi_SimpleTabular_colspec_tl {@{}}
509     \tl_put_left:Nn \l_kivi_SimpleTabular_colspec_tl {@{}}
510   }
511   \exp_args:NnV \xltabular{\linewidth}\l_kivi_SimpleTabular_colspec_tl
512   \toprule
513   \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_header_currency:
514   \l_kivi_SimpleTabular_headline_tl
515   \\
516   \noalign{\cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_body_currency:}
517   \midrule
518   \endhead
519   \midrule
520   \rlap{\makebox[\textwidth][r]{\weiteraufnaechsterseite}}\\
521   \endfoot
522   \bool_if:NF \g__kivi_Tabular_rowcolor_bool \bottomrule
523   \endlastfoot
524   \ignorespaces
525 }{
526   \def\@currenvir{tabularx}
527   \endxltabular
528 }
529
530 %PricingTabular* kann automatisch spalten ignorieren
531 % \begin{PricingTabular*}[id=false]
532 % deaktiviert damit die Spalte der Produktnummer
533 % analog ist dies für pos, amount, price, pricetotal möglich.
534 % Die Spalte der Bezeichnung ist nicht deaktivierbar
535 \newenvironment{PricingTabular*}[1][]{
536   \int_gzero:N \g__kivi_PricingTable_rowcolor_int
537   \tl_if_empty:nF {#1} {\keys_set:nn {kivi/PricingTable} {#1}}
538   \__kivi_setup_LT_boxes:
539   \__kivi_setup_FakeTable:
540   \dim_set:Nn \parskip {\c_zero_dim}
541   \PricingTabularBox\ignorespaces
542 }{\endPricingTabularBox
543   %compensate footer spacing
544   \skip_vertical:n {-\box_ht:N  \g_kivi_LT@foot_box-\box_dp:N  \g_kivi_LT@foot_box}
545 }
546
547 \newtcolorbox{PricingTabularBox}{breakable,skin=kivi@LT}
548
549 \if@kivi@infobox
550
551   \def\locationsep{:}
552
553   \NewDocumentCommand{\locationentry}{som}{
554     \Ifkomavarempty{#3}{}{
555       \IfBooleanTF {#1} {
556         \strut
557         \IfNoValueTF {#2}
558         {\usekomavar*{#3}}
559         {#2}
560         \locationsep
561         \hfill\strut\space
562         \hbox_set:Nn \l_tmpa_box {\usekomavar{#3}}
563         \dim_compare:nTF {\box_wd:N \l_tmpa_box>\linewidth}
564         {\newline\hspace*{\fill}\llap}
565         {\hspace*{\fill}}
566         {\box_use:N \l_tmpa_box\strut}
567       }{
568         \@hangfrom{\strut
569           \IfNoValueTF {#2}
570           {\usekomavar*{#3}}
571           {#2}\locationsep~
572         }{
573           \parbox[t]{\dimexpr\linewidth-\hangindent}{
574             \raggedleft
575             \usekomavar{#3}\strut
576           }
577         }
578       }
579     }
580     \par
581   }
582
583   \newkomafont{transaction}{\bfseries}
584
585   \setkomavar{location}{
586     \Ifkomavarempty{transaction}{}{{
587           \usekomafont{transaction}
588           \usekomavar{transaction}
589         }
590     }
591     \par
592     \medskip
593     \parbox{\useplength{locwidth}}{
594       \locationentry{date}
595       \locationentry{myref}
596       \locationentry{customer}
597       \locationentry{yourref}
598       \locationentry{delivery}
599       \locationentry{quote}
600       \locationentry{orderID}
601       \locationentry{projectID}
602       \locationentry[\ansprechpartner]{fromname}
603       \locationentry{fromphone}
604       \locationentry*{fromemail}
605     }
606   }
607   \removereffields
608   \AtBeginLetter{
609     \ifdim\ht\shippingAddressBox>\z@
610       \@addtoplength{refvpos}{\dimexpr\ht\shippingAddressBox+\dp\shippingAddressBox}
611       \@addtoplength{refvpos}{4\baselineskip}%sep between address boxes
612     \fi
613   }
614
615 \fi
616
617 %Fallback for older KOMA-Script-Versions
618 \cs_if_exist:NF \Ifstr {\let\Ifstr\ifstr}
619 \cs_if_exist:NF \Ifkomavarempty {\let\Ifkomavarempty\ifkomavarempty}
620
621 %Definitionen für die insettings.tex
622
623 \newcommand*{\setupIdentpath}[1]{
624   \int_set:Nn \l_kivi_tmp_int {1}
625   \bool_set_true:N \l_kivi_tmp_bool
626   \bool_while_do:Nn \l_kivi_tmp_bool {
627     \file_if_exist:nTF {firma\int_use:N \l_kivi_tmp_int/ident.tex}
628     {
629       \exp_args:Nf \str_if_in:nnTF {#1} {Firma\int_use:N \l_kivi_tmp_int}
630       {
631         \newcommand*{\identpath}{firma\int_use:N \l_kivi_tmpa_int}
632         \bool_set_false:N \l_kivi_tmp_bool
633       }
634       {\int_incr:N \l_kivi_tmp_int}
635     }
636     {
637       \bool_set_false:N \l_kivi_tmp_bool
638       \newcommand*{\identpath}{firma}
639     }
640   }
641 }
642
643 \newcommand*{\setupCurrencyConfig}[2]{
644   \tl_new:N \g_kivi_currency_tl
645   \exp_args:Nf \str_if_in:nnT {#2} {USD} {\tl_gset:Nn \g_kivi_currency_tl {usd}}
646   \exp_args:Nf \str_if_in:nnT {#2} {CHF} {\tl_gset:Nn \g_kivi_currency_tl {chf}}
647   \exp_args:Nf \str_if_in:nnT {#2} {EUR} {\tl_gset:Nn \g_kivi_currency_tl {euro}}
648   \tl_if_empty:NT  \g_kivi_currency_tl {
649     \tl_gset:Nn \g_kivi_currency_tl {default}
650     \edef \currency {\tl_to_str:N \lxcurrency}
651   }
652   \input{#1/\g_kivi_currency_tl _account.tex}
653 }
654
655 \ExplSyntaxOff
656
657
658 \renewcommand*{\raggedsignature}{\raggedright}
659
660 \newkomafont{extraDescription}{}
661 \newkomafont{subtotal}{}
662 \newkomafont{total}{}
663
664 \endinput