peitex: Weitere Überarbeitungen
[kivitendo-erp.git] / templates / print / marei / kiviletter.sty
1 \NeedsTeXFormat{LaTeX2e}
2 \ProvidesPackage{kiviletter}[2019/10/10 Letter Layouts for Kivitendo]
3
4 \newif\if@kivi@infobox
5 \DeclareOption{reffields}{\@kivi@infoboxfalse}
6 \DeclareOption{infobox}{\@kivi@infoboxtrue}
7 \@kivi@infoboxtrue
8
9 \ProcessOptions\relax
10
11
12 \RequirePackage{expl3}
13 \RequirePackage{iftex}
14 \KOMAoptions{fontsize=12pt}
15 % Schriftart, Eingabelayout der Tastatur
16 \ifPDFTeX
17 \RequirePackage[utf8]{inputenc}% Nur notwendig, wenn Basis älter als TL2018
18 \RequirePackage[T1]{fontenc}
19 \else
20 \RequirePackage{fontspec}
21 \fi
22
23 %\RequirePackage{xltabular}
24 \RequirePackage{tabularx}
25 \RequirePackage{longtable}
26 \RequirePackage{booktabs}
27 \PassOptionsToPackage{table}{xcolor}
28
29 \RequirePackage{xcolor}
30 \RequirePackage{graphicx}
31
32 \ifPDFTeX
33 \RequirePackage{eurosym}
34 \DeclareUnicodeCharacter{20AC}{\euro}
35 \fi
36
37 \RequirePackage[fromlogo,fromalign=right,
38   firstfoot=false,%Für einheitliche Randeinstellungen
39   refline=nodate,
40         ]{scrletter}
41 \LoadLetterOption{DIN}
42
43 \newkomavar{transaction}
44 \newkomavar[\lieferschein{}~\nr]{delivery}
45 \newkomavar[\angebot{}~\nr]{quote}
46 \newkomavar{orderID}
47 \newkomavar{projectID}
48
49 \usepackage{geometry}
50
51 \ExplSyntaxOn
52 \dim_new:N \g_kivi_margin_dim
53 \dim_gset:Nn \g_kivi_margin_dim {\useplength{toaddrhpos}}
54 \geometry{a4paper,margin=\g_kivi_margin_dim,heightrounded}
55 \savegeometry{kivi.letter@default}
56 %Scratch variables
57 \int_new:N \l_kivi_tmp_int
58 \bool_new:N \l_kivi_tmp_bool
59 \bool_new:N  \g_kivi_TableFoot_bool
60 \dim_new:N \g_kivi_orig@textheight_dim
61 \int_new:N \g_PricingTabular_firstpage_int
62 \ExplSyntaxOff
63
64 \newsavebox{\shippingAddressBox}
65
66
67 \DeclareNewLayer[
68 foreground,
69 hoffset=\useplength{toaddrhpos},
70 voffset=\dimexpr\useplength{toaddrvpos}+\useplength{toaddrheight}+4\baselineskip,
71 contents={\usebox\shippingAddressBox}
72 ]{kivitendo.shippingaddress}
73
74
75 \ExplSyntaxOn
76 \DeclareNewLayer[
77 foreground,
78 mode=picture,
79 hoffset=\g_kivi_margin_dim,
80 voffset=\g_kivi_margin_dim,
81 align=tl,
82 height=\box_ht:N \g_kivi_LT@head_box,
83 contents={\box_use:N \g_kivi_LT@head_box},
84 ]{kivitendo.TableHead}
85
86
87 \DeclareNewLayer[
88 foreground,
89 textarea,
90 mode=picture,
91 voffset=\dim_eval:n {\paperheight-\g_kivi_margin_dim},
92 height=\box_ht:N \g_kivi_LT@foot_box,
93 contents=\bool_if:NT \g_kivi_TableFoot_bool {\box_use:N \g_kivi_LT@foot_box},
94 align=bl,
95 ]{kivitendo.TableFoot}
96
97 \AtBeginLetter{\dim_gset:Nn \g_kivi_orig@textheight_dim {\textheight}}
98 \ExplSyntaxOff
99
100 \newpairofpagestyles{kivitendo.letter}{}
101 \renewcommand*{\letterpagestyle}{kivitendo.letter}
102
103 \DeclareNewPageStyleByLayers{kivitendo.letter.PricingTable}{
104         kivitendo.TableHead,
105         kivitendo.TableFoot
106         kivitendo.letter.head.odd,kivitendo.letter.head.even,kivitendo.letter.head.oneside,%
107         kivitendo.letter.foot.odd,kivitendo.letter.foot.even,kivitendo.letter.foot.oneside,%
108 }
109 \DeclareNewPageStyleByLayers{kivitendo.letter.first}{
110         kivitendo.shippingaddress,
111         kivitendo.TableFoot,
112         kivitendo.letter.head.odd,kivitendo.letter.head.even,kivitendo.letter.head.oneside,%
113         kivitendo.letter.foot.odd,kivitendo.letter.foot.even,kivitendo.letter.foot.oneside,%
114 }
115
116 \setkomavar{backaddress}{\firma\ $\cdot$ \strasse\ $\cdot$ \ort}
117
118 \setkomavar{firsthead}{
119         \if@logo
120         \rlap{\usekomavar{fromlogo}}%
121         \fi
122 }
123
124 \@setplength{locwidth}{6cm}
125
126 \ExplSyntaxOn
127 \dim_new:N \g_kivi_tab_pos_dim
128 \dim_gset:Nn \g_kivi_tab_pos_dim {3.5ex}
129 \dim_new:N \g_kivi_tab_id_dim
130 \dim_gset:Nn \g_kivi_tab_id_dim {4em}
131 \dim_new:N \g_kivi_tab_num_dim
132 \dim_gset:Nn \g_kivi_tab_num_dim {5em}
133 \dim_new:N \g_kivi_tab_price_dim
134 \dim_gset:Nn \g_kivi_tab_price_dim {7em}
135 \dim_new:N \g_kivi_tab_desc_dim
136
137 \dim_new:N \g_kivi_tabcolsep_dim
138 \dim_gset:Nn \g_kivi_tabcolsep_dim {.5\tabcolsep}
139 \newcommand*{\CalcTabCols}{
140         \dim_gset:Nn \g_kivi_tab_desc_dim {\textwidth-\g_kivi_tab_pos_dim -\g_kivi_tab_id_dim-\g_kivi_tab_num_dim - 2\g_kivi_tab_price_dim - 10\g_kivi_tabcolsep_dim}
141 }
142
143 \newcolumntype{P}{>{\raggedleft\arraybackslash}p{\g_kivi_tab_price_dim}<{\,\currency}}
144
145 %\if@kivi@faketable
146 \RequirePackage{tcolorbox}
147 \tcbuselibrary{breakable, skins}
148 \seq_new:N \l_kivi_PricingTable_seq
149 \seq_new:N \g_kivi_extraDescription_seq
150 \newcommand{\FakeTable}[1]{
151         \par
152         \CalcTabCols
153         \seq_set_split:Nnn \l_kivi_PricingTable_seq {\tabularnewline} {#1}
154         \begingroup
155         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
156         \seq_map_inline:Nn \l_kivi_PricingTable_seq {
157         \seq_gclear:N \g_kivi_extraDescription_seq
158         \exp_args:NnV \use:n {\tabular[t]}\g_kivi_Pricing_colspec_tl
159         ##1
160         \endtabular
161         \seq_if_empty:NTF \g_kivi_extraDescription_seq
162         {\par\nointerlineskip}
163         {\par\nointerlineskip
164         \begin{tcolorbox}[
165                 empty,
166                 left=\dim_eval:n {\g_kivi_tab_pos_dim+ \g_kivi_tab_id_dim +4\g_kivi_tabcolsep_dim},
167                 right=\dim_eval:n {\g_kivi_tab_num_dim+ 2\g_kivi_tab_price_dim +6\g_kivi_tabcolsep_dim},top=0pt,bottom=0pt,
168                 boxsep=0pt,
169                 breakable,
170                 lines~before~break=1,
171         ]
172         \seq_use:Nn \g_kivi_extraDescription_seq {\\}
173         \end{tcolorbox}
174         \nointerlineskip
175         }
176         }
177         \endgroup
178 }
179
180
181 \tl_new:N \g_kivi_Pricing_colspec_tl
182 \tl_gset:Nn \g_kivi_Pricing_colspec_tl {@{}p{\g_kivi_tab_pos_dim}p{\g_kivi_tab_id_dim}p{\g_kivi_tab_desc_dim}>{\raggedleft\arraybackslash}p{\g_kivi_tab_num_dim}*2{P}@{}}
183
184
185 \clist_map_inline:nn {head, foot, firsthead, lastfoot} {%TODO reduce
186         \box_new:c {g_kivi_LT@#1_box}
187 }
188
189 \AtBeginDocument{
190         \csname kivi_setup_LT_boxes:\endcsname
191         \geometry{a4paper,
192                 hmargin=\g_kivi_margin_dim,
193                 top=\dim_eval:n {\g_kivi_margin_dim + \box_ht:N \g_kivi_LT@head_box},
194                 bottom=\dim_eval:n {\g_kivi_margin_dim + \box_ht:N \g_kivi_LT@foot_box},
195                 heightrounded}
196         \savegeometry{kivi.letter@table}
197         \loadgeometry{kivi.letter@default}
198 }
199
200 \cs_new:Nn \kivi_setup_LT_boxes: {
201         \CalcTabCols
202         \hbox_gset:Nn \g_kivi_LT@head_box {
203         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
204         \exp_args:NnV \use:n {\tabular[b]}\g_kivi_Pricing_colspec_tl
205         \toprule
206         \bfseries\position & \bfseries\artikelnummer & \bfseries\bezeichnung & \bfseries\menge &\multicolumn{1}{P}{\bfseries\einzelpreis}&\multicolumn{1}{P@{}}{\bfseries\gesamtpreis}\\
207         \midrule
208         \endtabular
209         }
210         \hbox_gset:Nn \g_kivi_LT@foot_box {
211         \raisebox{\depth}{
212         \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}r@{}}
213         \midrule
214         \strut\weiteraufnaechsterseite
215         \end{tabular*}
216         }
217         }
218 }
219
220
221 %Macht es sinn hier eine Variante zu machen, in der alle Spalten Belegbar sind?
222 \newenvironment{PricingTotal}{
223         \tabular[t]{@{}p{\dim_eval:n {\linewidth-\g_kivi_tab_price_dim-2\tabcolsep}}P@{}}
224         \midrule
225 }{
226         \bottomrule\endtabular
227 }
228
229 \newcommand{\ExtraDescription}[1]{\seq_gput_right:Nn \g_kivi_extraDescription_seq {#1}}
230 %\else
231 \newenvironment{PricingTabular}[1][]{
232         \begingroup
233         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
234         \CalcTabCols
235         \exp_args:NV \longtable \g_kivi_Pricing_colspec_tl
236         % Tabellenkopf
237         \toprule
238         \bfseries\position & \bfseries\artikelnummer & \bfseries\bezeichnung & \bfseries\menge &\multicolumn{1}{P}{\bfseries\einzelpreis}&\multicolumn{1}{P@{}}{\bfseries\gesamtpreis}\\
239         \midrule
240         \endhead
241         \midrule
242         \multicolumn{6}{@{}r@{}}{\weiteraufnaechsterseite}\\
243         \endfoot
244 }{
245         \endlongtable
246         \endgroup
247 }
248
249 \RequirePackage{xltabular}
250
251
252 \newenvironment{SimpleTabular}[1][\bfseries\position & \bfseries\menge & \bfseries\bezeichnung]
253 {
254         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
255         \xltabular{\linewidth}{@{}rrX@{}}
256         \toprule
257         #1\\
258         \midrule\\\endhead
259         \midrule
260         \multicolumn{3}{@{}>{\raggedright}p{\linewidth}@{}}{\weiteraufnaechsterseite}\\
261         \endfoot
262         \bottomrule
263         \endlastfoot
264         \ignorespaces
265 }{
266         \def\@currenvir{tabularx}
267         \endxltabular
268 }
269
270
271 \usepackage{afterpage}
272
273 \cs_new:cpn {PricingTabular*}{
274         \bool_gset_true:N \g_kivi_inTable_bool
275         \endgroup
276         \@nameuse{Gm@restore@@kivi.letter@table}%
277         \Gm@changelayout
278         \begingroup
279         \def \@currenvir {PricingTabular*}\edef \@currenvline {\on@line }
280         \int_gset:Nn \g_PricingTabular_firstpage_int {\c@page}
281         \addtolength{\vsize}{-\box_ht:N \g_kivi_LT@foot_box}
282         \pagegoal\vsize
283         \widowpenalty0
284         \clubpenalty0
285         \bool_gset_true:N \g_kivi_TableFoot_bool
286         \pagestyle{kivitendo.letter.PricingTable}
287         \leavevmode\box_use:N \g_kivi_LT@head_box
288         \par\nointerlineskip\ignorespaces
289 }
290
291 \cs_new:cpn {endPricingTabular*} {
292         \int_compare:nNnF \g_PricingTabular_firstpage_int = \c@page {\thispagestyle{kivitendo.letter.PricingTable}}
293         \bool_gset_false:N \g_kivi_TableFoot_bool
294         \@nameuse{Gm@restore@@kivi.letter@default}
295         \Gm@changelayout
296         \bool_gset_true:N \g_kivi_restore_geometry_bool
297         \afterpage{
298                 \kivi_conditional_restore_geometry:
299         }
300 }
301
302 \cs_new:Nn \kivi_conditional_restore_geometry: {
303         \bool_if:NT \g_kivi_restore_geometry_bool
304         {
305         \@nameuse{Gm@restore@@kivi.letter@default}
306         \Gm@changelayout
307         }
308         \bool_gset_false:N \g_kivi_restore_geometry_bool
309 }
310
311
312
313 \if@kivi@infobox
314 \setkomavar{location}{
315         \ifkomavarempty{transaction}{}{
316         \bfseries
317         \usekomavar{transaction}
318         }
319         \par
320         \medskip
321         \begin{tabularx}{\useplength{locwidth}}{@{}l<{:}>{\raggedleft\arraybackslash}X@{}}
322                 \usekomavar*{date}&\usekomavar{date}\\
323                 \ifkomavarempty{myref}{}{
324                         \usekomavar*{myref}&\usekomavar{myref}\\
325                 }
326                 \kundennummer&\usekomavar{customer}\\
327                 \ifkomavarempty{yourref}{}{
328                         \usekomavar*{yourref}&\usekomavar{yourref}\\
329                 }
330                 \ifkomavarempty{delivery}{}{
331                         \usekomavar*{delivery}&\usekomavar{delivery}\\
332                 }
333                 \ifkomavarempty{quote}{}{
334                         \usekomavar*{quote}&\usekomavar{quote}\\
335                 }
336                 \ifkomavarempty{orderID}{}{\auftragsnummer&\usekomavar{orderID}\\}
337                 \ifkomavarempty{projectID}{}{\projektnummer&\usekomavar{projectID}\\}
338                 \ansprechpartner&\usekomavar{fromname}
339                 \ifkomavarempty{fromphone}{}{\\\textTelefon&\usekomavar{fromphone}}
340                 \ifkomavarempty{fromemail}{}{\\\textEmail&\usekomavar{fromemail}}
341         \end{tabularx}
342 }
343 \removereffields
344 \AtBeginLetter{
345         \ifdim\ht\shippingAddressBox>\z@
346         \addtoplength{refvpos}{\ht\shippingAddressBox}
347         \addtoplength{refvpos}{4\baselineskip}
348         \fi
349 }
350 \ExplSyntaxOff
351 \fi
352
353
354
355 \renewcommand*{\raggedsignature}{\raggedright}
356
357 \endinput