1 % ----------------------------------------------------------
3 % Globale Vorlage fuer Briefartige Documente LX-Office 2.6
5 % Changelog: see gitlog
6 \newcommand{\ftLetterVersion}{1.0-u (16.11.2011)}
9 % http://www.gnu.de/licenses/gpl-3.0.html
13 % Autor: Wulf Coulmann scripts_at_gpl.coulmann.de
14 % Aufgebaut auf invoice.tex 0.1 kmk@lilalaser.de
16 % ----------------------------------------------------------
18 \documentclass[letter,fontsize=11pt]{scrlttr2}
23 \@latex@warning@no@line{ #### this is letter.tex \ftLetterVersion #####}
32 \usepackage{filecontents}
36 \usepackage{longtable}
41 \usepackage{zwischensumme}
42 \ifthenelse{\isundefined{\employeecountry}}{\input{mydata}}{}
46 % Dateinamen einlesen und auswertbar machen
47 \scantokens\expandafter{%
48 \expandafter\def\expandafter\docname\expandafter{\jobname}}
50 %%%%%%%%% Report-Variablen umsetzen, damit latex sie in lxbriefkopf.tex sieht.
51 %%%% Die eigenen Daten
52 \newcommand{\employeename}{<%employee_name%>}
53 \newcommand{\employeecompany}{<%employee_company%>}
54 \newcommand{\employeeaddress}{<%employee_address%>}
55 \newcommand{\employeetel}{<%employee_tel%>}
56 \newcommand{\employeefax}{<%employee_fax%>}
57 \newcommand{\employeecoustid}{<%employee_co_ustid%>}
58 \newcommand{\employeetaxnumber}{<%employee_taxnumber%>}
59 \newcommand{\media}{<%media%>}
63 \newcommand{\name}{<%name%>}
64 \newcommand{\Shipname}{\ifthenelse{\equal{<%shiptoname%>}{\leer}}{<%name%>}{<%shiptoname%>}}
65 \newcommand{\departmentone}{<%department_1%>}
66 \newcommand{\departmenttwo}{<%department_2%>}
67 \newcommand{\cpgreeting}{<%cp_greeting%>}
68 \newcommand{\cptitle}{<%cp_title%>}
69 \newcommand{\cpgivenname}{<%cp_givenname%>}
70 \newcommand{\cpname}{<%cp_name%>}
71 \newcommand{\street}{<%street%>}
72 \newcommand{\Shipstreet}{\ifthenelse{\equal{<%shiptostreet%>}{\leer}}{<%street%>}{<%shiptostreet%>}}
73 \newcommand{\country}{<%country%>}
74 \newcommand{\Shipcountry}{\ifthenelse{\equal{<%shiptocountry%>}{\leer}}{<%country%>}{<%shiptocountry%>}}
75 \newcommand{\UstId}{<%ustid%>}
76 \newcommand{\zipcode}{<%zipcode%>}
77 \newcommand{\Shipzipcode}{\ifthenelse{\equal{<%shiptozipcode%>}{\leer}}{<%zipcode%>}{<%shiptozipcode%>}}
78 \newcommand{\city}{<%city%>}
79 \newcommand{\Shipcity}{\ifthenelse{\equal{<%shiptocity%>}{\leer}}{<%city%>}{<%shiptocity%>}}
80 \newcommand{\phone}{<%customerphone%>}
81 \newcommand{\fax}{<%customerfax%>}
83 %%%% Variablen, die sich auf das ganze Dokument beziehen
84 \newcommand{\kundennummer}{<%customernumber%>}
85 \newcommand{\vendornumber}{<%vendornumber%>}
86 \newcommand{\quonumber}{<%quonumber%>} % Angebotsnummer
87 \newcommand{\ordnumber}{<%ordnumber%>} % Auftragsnummer bei uns
88 \newcommand{\cusordnumber}{<%cusordnumber%>} % Auftragsnummer beim Kunden
89 \newcommand{\invnumber}{<%invnumber%>} % Rechnungsnummer
90 \newcommand{\donumber}{<%donumber%>} % Lieferscheinnummer
91 %\newcommand{\docnumber}{Rechnungsnummer: \invnumber}
92 \newcommand{\quodate}{<%quodate%>} % Angebotsdatum
93 \newcommand{\orddate}{<%orddate%>} % Auftragsdatum
94 \newcommand{\reqdate}{<%reqdate%>} % gewuenschtes Lieferdatum
95 \newcommand{\deliverydate}{<%deliverydate%>} % Lieferdatum
96 \newcommand{\invdate}{<%invdate%>} % Rechnungsdatum
97 \newcommand{\transdate}{<%transdate%>} % Lieferscheindatum
98 \newcommand{\terms}{<%terms%>} % Zahlungsfrist
99 \newcommand{\duedate}{<%duedate%>} % Fälligkeitsdatum
100 \newcommand{\invtotal}{<%invtotal%>} % Gesamtbetrag
101 \newcommand{\paid}{<%paid%>} % Schon bezahlt
102 \newcommand{\total}{<%total%>} % Restbetrag
103 \newcommand{\subtotal}{<%subtotal NOFORMAT%>} % Restbetrag
104 \newcommand{\paymentterms}{<%payment_terms%>} % Zahlungsbedingungen
105 \newcommand{\paymentPrivatEnd}{E} % Endung bei Privatkunden
106 \newcommand{\paymenttype}{<%payment_description%>} % name der Zahlungs-art - fuer Steuerung brutto/netto
110 \newcommand{\shiptoname}{<%shiptoname%>}
111 \newcommand{\shiptocontact}{<%shiptocontact%>}
112 \newcommand{\shiptodepartmentone}{<%shiptodepartment_1%>}
113 \newcommand{\shiptodepartmenttwo}{<%shiptodepartment_2%>}
114 \newcommand{\shiptostreet}{<%shiptostreet%>}
115 \newcommand{\shiptocity}{<%shiptocity%>}
116 \newcommand{\shiptocountry}{<%shiptocountry%>}
117 \newcommand{\shiptophone}{<%shiptophone%>}
118 \newcommand{\shiptozipcode}{<%shiptozipcode%>}
119 \newcommand{\shiptofax}{<%shiptofax%>}
121 %%%% Die Waehrungsvariable in Waehrunszeichen umsetzen
122 \newcommand{\currency}{<%currency%>}
123 \ifthenelse{\equal{\currency}{EUR}}{\let\currency\euro}{}
124 \ifthenelse{\equal{\currency}{YEN}}{\let\currency\textyen}{}
125 \ifthenelse{\equal{\currency}{GBP}}{\let\currency\pounds}{}
126 \ifthenelse{\equal{\currency}{USD}}{\let\currency\$}{}
128 %%%%%%%%%%%%% Ende Reportvariablen-Umsetzung
130 \newcommand{\NoValue}{0}
131 \newcommand{\Picklist}{0}
132 \newcommand{\PurchaseOrder}{0}
133 \newcommand{\trash}{0}
134 \newcommand{\nonemptyline}[2]{\ifthenelse{\equal{#2}{\leer}}{}{#1#2~\\}}
135 \newcommand{\MyAdress}{\IfSubStr{\docname}{sales_delivery_order}{\Shipname~\\
136 % lieferadresse wenn Lieferschein
137 \nonemptyline{\cpgreeting{ }\cpgivenname{ }}{\cpname}
138 \nonemptyline{}{\departmentone}
140 \Shipzipcode{ }\Shipcity
141 \ifthenelse{\equal{\Shipcountry}{\employeecountry}}{}{
142 \ifthenelse{\equal{\Shipcountry}{\leer}}{}{ ~\\ \Shipcountry} } % Laenderangabe wird nur gedruckt,
143 ~ % wenn der Empfaenger nicht im eigenen Land sitzt.
146 \nonemptyline{\cpgreeting{ }\cpgivenname{ }}{\cpname}
147 \nonemptyline{}{\departmentone}
150 \ifthenelse{\equal{\country} {\employeecountry}}{}{
151 \ifthenelse{\equal{\country}{\leer}}{}{ ~\\ \country} } % Laenderangabe wird nur gedruckt,
152 ~ % wenn der Empfaenger nicht im eigenen Land sitzt.
160 %%% dei folgenden Funktionen lesen den Dokumentennamen aus und _muessen_nach_ \begin{dokument} stehen.
162 % ==== statische Begriffe in der aktuellen Sprache einlesen
166 \ifthenelse{\bgPdfEmailOnly = 1 }{
167 \ifthenelse{\equal{\media}{email}}{
175 % ==== dokumenttyp ermitteln
176 \IfSubStr{\docname}{pick_list}{
178 \setkomavar{backaddress}{\DeliveryAddress}
181 \resizebox{\useplength{firstheadwidth}-50mm}{!}{%
185 \renewcommand{\NoValue}{1}
186 \renewcommand{\Picklist}{1}
187 \newcommand{\doctype}{}
188 \newcommand{\MyDocdate}{\transdate}
189 \newcommand{\DocNoTitle}{\DelorderNumber}
190 \newcommand{\docnumber}{\donumber}
191 \renewcommand{\deliverydate}{\transdate}
193 \ifthenelse{\equal{\ordnumber}{\leer}}{
194 % wenn keine Auftragsnummer -> Angebotsnummer
195 \newcommand{\SecNoTitle}{\QuotationNumber}
196 \newcommand{\secnumber}{\quonumber}
198 \newcommand{\SecNoTitle}{\OrderNumber}
199 \newcommand{\secnumber}{\ordnumber}
202 \IfSubStr{\docname}{sales_delivery_order}{
204 \renewcommand{\NoValue}{1}
205 \newcommand{\doctype}{\TitleDelorder}
206 \newcommand{\MyDocdate}{\transdate}
207 \newcommand{\DocNoTitle}{\DelorderNumber}
208 \newcommand{\docnumber}{\donumber}
209 \renewcommand{\deliverydate}{\transdate}
211 \ifthenelse{\equal{\ordnumber}{\leer}}{
212 % wenn keine Auftragsnummer -> Angebotsnummer
213 \newcommand{\SecNoTitle}{\QuotationNumber}
214 \newcommand{\secnumber}{\quonumber}
216 \newcommand{\SecNoTitle}{\OrderNumber}
217 \newcommand{\secnumber}{\ordnumber}
220 \IfSubStr{\docname}{invoice}{
222 \newcommand{\doctype}{\TitleInv}
223 \newcommand{\MyDocdate}{\invdate}
224 \newcommand{\DocNoTitle}{\InvNumber}
225 \newcommand{\docnumber}{\invnumber}
227 \ifthenelse{\equal{\ordnumber}{\leer}}{
228 % wenn keine Auftragsnummer -> Angebotsnummer
229 \newcommand{\SecNoTitle}{\QuotationNumber}
230 \newcommand{\secnumber}{\quonumber}
232 \newcommand{\SecNoTitle}{\OrderNumber}
233 \newcommand{\secnumber}{\ordnumber}
236 \IfSubStr{\docname}{proforma}{
237 \newcommand{\doctype}{\TitleProforma}
238 \newcommand{\MyDocdate}{\invdate}
239 \newcommand{\DocNoTitle}{\InvNumber}
240 \newcommand{\docnumber}{\invnumber}
242 \ifthenelse{\equal{\ordnumber}{\leer}}{
243 % wenn keine Auftragsnummer -> Angebotsnummer
244 \newcommand{\SecNoTitle}{\QuotationNumber}
245 \newcommand{\secnumber}{\quonumber}
247 \newcommand{\SecNoTitle}{\OrderNumber}
248 \newcommand{\secnumber}{\ordnumber}
251 \IfSubStr{\docname}{purchase_order}{
252 \renewcommand{\PurchaseOrder}{1}
253 \newcommand{\doctype}{\TitlePurchaseOrder}
254 \newcommand{\MyDocdate}{\orddate}
255 \newcommand{\DocNoTitle}{\RequestOrderNumber}
256 \newcommand{\docnumber}{\ordnumber}
257 \renewcommand{\deliverydate}{\reqdate}
258 \renewcommand{\DelDate}{\ReqByTitle}
259 \renewcommand{\CustomerID}{\VendorID}
260 \renewcommand{\kundennummer}{\vendornumber}
261 \newcommand{\SecNoTitle}{}
262 \newcommand{\secnumber}{}
264 \IfSubStr{\docname}{credit_note}{
265 \newcommand{\doctype}{\TitleCreditNote}
266 \newcommand{\MyDocdate}{\invdate}
267 \newcommand{\DocNoTitle}{\CredNumber}
268 \newcommand{\docnumber}{\invnumber}
269 % keine 2. Documentnummer
270 \newcommand{\SecNoTitle}{}
271 \newcommand{\secnumber}{}
273 \IfSubStr{\docname}{sales_order}{
274 % Auftragsbestaetigung
275 \newcommand{\doctype}{\TitleSalesOrder}
276 \newcommand{\MyDocdate}{\orddate}
277 \renewcommand{\deliverydate}{\reqdate}
278 \newcommand{\DocNoTitle}{\OrderNumber}
279 \newcommand{\docnumber}{\ordnumber}
281 \ifthenelse{\equal{\ordnumber}{\leer}}{
282 % wenn keine Angebotsnummer -> leer
283 \newcommand{\SecNoTitle}{}
284 \newcommand{\secnumber}{}
286 \newcommand{\SecNoTitle}{\QuotationNumber}
287 \newcommand{\secnumber}{\quonumber}
290 \IfSubStr{\docname}{sales_quotation}{
292 \newcommand{\doctype}{\TitleSalesQuotation}
293 \newcommand{\MyDocdate}{\quodate}
294 \renewcommand{\DelDate}{\ValidUntil}
295 \renewcommand{\deliverydate}{\reqdate}
296 \newcommand{\DocNoTitle}{\QuotationNumber}
297 \newcommand{\docnumber}{\quonumber}
299 \newcommand{\SecNoTitle}{}
300 \newcommand{\secnumber}{}
305 % ==== \paid auf 0.00 falls leer
306 \IfSubStr{\paid}{\DecimalSign}{}{\renewcommand{\paid}{0{\DecimalSign}00}}
313 \begin{letter}{{\ifthenelse{\isnamedefined{MyAdressfield}}{\MyAdressfield
319 %========Datum und Nummern====================================================
322 \begin{tabular*}{\textwidth+1em }{@{\extracolsep{\fill}}llllr}
323 \MakeUppercase{\tiny \DocNoTitle} &
324 \MakeUppercase{\tiny \CustomerID} &
325 \MakeUppercase{\tiny \SecNoTitle } &
326 \MakeUppercase{\tiny \DelDate } &
327 \MakeUppercase{\tiny \Date}~\\
328 \mainfont\docnumber &
329 \mainfont\kundennummer &
330 \mainfont\secnumber &
331 \mainfont\deliverydate &
332 \mainfont\MyDocdate~\\
336 \hspace{-0.5em} \DocId
342 \ifthenelse{\bgPdfFirstPageOnly = 1 }{
348 {\noindent\textbf\doctype}~\\
349 \IfEndWith{\paymenttype}{\paymentPrivatEnd}{\PriceInclTax }{ }
352 %======Die eigentliche-Tabelle========================================
354 % temporaere Datei mit Tabelle anlegen
355 \begin{filecontents}{tabelle.tex}
361 \ifthenelse{\NoValue > 0 }
362 { % Tabelle ohne Preisen
363 \ifthenelse{\Picklist = 1 }{
365 \begin{longtable}{@{}rlX@{ }rlrrrl@{}}
367 \begin{longtable}{@{}rlX@{ }rlrr@{}}
370 % Kopfzeile der Tabelle
377 \ifthenelse{\Picklist = 1 }{& {\Take} & {\Storage} }{}
382 % Tabellenkopf nach dem Umbruch
388 \ifthenelse{\Picklist = 1 }{& {\Take} & {\Storage} }{}
395 <%runningnumber%> % Laufende Positionsnummer
397 <%number%> % Artikelnummer
399 <%description%> % Kurzbeschreibung des Artikels
400 \ifthenelse{\equal{<%longdescription%>}{\leer}}{}{ \newline <%longdescription%>}
401 % Ein zeilenweises Auslieferdatum, wenn es gesetzt bei der Position hinterlegt ist.
402 \ifthenelse{\equal{<%deliverydate_oe%>}{\leer}}{}{
403 \newline \DelDate:~<%deliverydate_oe%>}
405 <%qty NOFORMAT%> % Menge
408 %\ifthenelse{\Picklist = 1 }{& {x} & {x} }{}
409 %\ifthenelse{\Picklist = 1 }{& {x} & {x} \hhline{~~~~~--} }{~\\}
410 \ifthenelse{\Picklist = 1 }{& {\underline{;~~~~~~~~~}} & {\underline{;~~~~~~~~~}}~\\ }{~\\}
413 \end{longtable} % Ende der zentralen Tabelle
414 }{ % Tabelle mit Preisen
415 \begin{longtable}{@{}rlX@{ }rlrrr@{}}
416 % Kopfzeile der Tabelle
425 {\Total} \hspace{2mm} ~\\
429 % Tabellenkopf nach dem Umbruch
437 {\Total} \hspace{2mm} ~\\
439 \multicolumn{7}{r}{ \rule{0mm}{5mm} \TabCarry{:} \MarkZwsumPos}
443 % Fuss der Teiltabellen
444 \multicolumn{7}{r}{ \rule{0mm}{5mm} \TabSubTotal{:} \MarkZwsumPos } ~\\
447 % Das Ende der Tabelle
449 \multicolumn{7}{r}{ \rule{0mm}{5mm} \TabSubTotal{:} \MarkZwsumPos} ~\\
453 <%runningnumber%> % Laufende Positionsnummer
455 <%number%> % Artikelnummer
457 <%description%> % Kurzbeschreibung des Artikels
458 \ifthenelse{\equal{<%longdescription%>}{\leer}}{}{ \newline <%longdescription%>}
459 % Ein zeilenweises Auslieferdatum, wenn es gesetzt ist.
460 \ifthenelse{\equal{<%reqdate%>}{\leer}}{}{
461 \newline \DelDate:~<%reqdate%>}
463 <%qty NOFORMAT%> % Menge
467 %\IfEndWith{\paymentterms}{_e}{EN}{\brutto{<%sellprice NOFORMAT%>}{<%qty NOFORMAT%>}{<%p_discount%>}}
468 \IfEndWith{\paymenttype}{\paymentPrivatEnd}{
469 \BruttoSellPrice{<%sellprice NOFORMAT%>}{<%tax_rate%>}
471 \ifthenelse{\equal{<%p_discount%>}{0}}{}{ -<%p_discount%>\%}
473 \BruttoWert{<%linetotal NOFORMAT%>}{<%tax_rate%>}
475 \numprint{<%sellprice NOFORMAT%>}
477 \ifthenelse{\equal{<%p_discount%>}{0}}{}{ -<%p_discount%>\%}
479 \Wert{<%linetotal NOFORMAT%>} % Zeilensumme addieren
483 \end{longtable} % Ende der zentralen Tabelle
485 \end{filecontents} % Ende der Hilfsdatei.
487 \LTXtable{\textwidth}{tabelle.tex}
489 \rule{\textwidth}{0pt} % Ein (unsichtbarer) Strich quer ueber die Seite
491 \vspace{-2em plus 10em minus 2em}~\\
492 \ifthenelse{\NoValue > 0 }
493 { % wenn keine Zahlen
499 \setlength{\tabcolsep}{0.2em}
500 \ifthenelse{\equal{\paid}{0{\DecimalSign}00} }
501 { % Wenn noch nichts gezahlt wurde
502 \IfSubStr{\invtotal}{\DecimalSign}{}{
503 \fpAdd{\invtotal}{0}{<%subtotal NOFORMAT%>}
505 \fpAdd{\invtotal}{\invtotal}{<%tax NOFORMAT%>}
509 \begin{tabular}{@{}rrr@{}}
510 %{Summe vor Steuern:}& {\numprint{<%subtotal NOFORMAT%>}} & ~\\
512 % Die unterschiedlichen Steueranteile getrennt ausweisen
514 { \IfEndWith{\paymenttype}{\paymentPrivatEnd}{\TaxInc }{ } <%taxdescription%>}
516 {\numprint{<%tax NOFORMAT%>}}& ~\\
519 {\Sum~ \currency:} & \textbf{\numprint{\invtotal}}
522 { % Wenn bereits etwas gezahlt wurde
524 \begin{tabular}{@{}rrr@{}}
526 {\EbT}& {\numprint{<%subtotal NOFORMAT%>}} & ~\\
528 % Die unterschiedlichen Steueranteile getrennt ausweisen
532 {\numprint{<%tax NOFORMAT%>}}& ~\\
535 \midrule % Ein dünner Strich
536 \Sum & \numprint{\invtotal} & ~\\
539 \AlreadyPayed~ {<%paymentdate%>}:& -{\numprint{<%payment%>}} & ~\\
542 \midrule[2pt] % Ein etwas dickerer Strich
543 {\Left~ \currency:} & \numprint{\total}
547 } %Ende des Summenkasten
550 \vfill % Den Rest-Text soweit wie möglich nach unten schieben
551 \ifthenelse{\isempty{<%notes%>}}{}{
553 \noindent <%notes%> ~\\[2em]
557 \ifthenelse{\Picklist = 0}{\noindent \ifthenelse{\equal{<%ustid%>}{\leer}}{}{\UstidTitle} \UstId}{}
558 \noindent \paymenthints % ist in translations.tex deffiniert
559 \ifthenelse{\PurchaseOrder = 0}{\noindent \paymentterms}{}