Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision f0e9585f

Von wulf@coulmann.de vor etwa 13 Jahren hinzugefügt

  • ID f0e9585f5e47401746e78b8b939078d80a848120
  • Vorgänger 2828d156
  • Nachfolger c8bdac22

fancy LaTeX initial
siehe doc/2011-12-14_alternatives_vorlagensystem_f-tex.txt

Unterschiede anzeigen:

doc/2011-12-14_alternatives_vorlagensystem_f-tex.txt
README lx-office Fancy-LaTeX (f-tex)
# Revision 1.0-u (16.11.2011)
# Revision 0.9 (13.11.2011)
# Revision 0.8 (12.09.2011)
# Revision 0.7 (12.07.2011)
# Revision 0.6 (16.06.2011)
# Revision 0.5 (15.04.2011)
# Revision 0.4 (14.02.2011)
# Revision 0.3 (03.01.2011)
# Revision 0.2 (24.12.2010)
# Revision 0.1 (03.11.2009)
# Einleitung
Es gibt ein alternatives LaTeX Vorlagensystem im Verzeichnis
templates/f-tex
Fuer das Einrichten der Vorlagen gibt es ein Setup-Script
# Voraussetzung:
- funktionierende Lx-Office Intallation
- mindestens eine Mandantendatenbank
weiter ist es hilfreich:
- mindestens einen Benutzer mit Verweis auf ein Vorlagenverzeichs
- Bereits angelegte Sprachkuerzel, wenn mehrsprachige Dokumente erstellt
werden sollen.
# Feature Uebersicht
- einfach Nutzung durch mitgeliefertes Setup-Script
- Keine Retundanz. Es wird ein und die selbe Latex-Vorlage fuer alle
briefartigen Dokumente verwendet. Also Angebot, Rechnung,
Performarechnung, Lieferschein, aber eben nicht fuer Paketaufkleber
etc..
- Leichte Anpassung an das Firmen Layout durch verwendung eines Hintergrund-PDF
dieses kann leicht mit dem eigenen Lieblingsprogramm erstellt werden
(Openoffice, Inkscape, Gimp, Adobe*)
- Hintergrundpdf um schaltbar auf "nur erste Seite" (default) oder "alle Seiten"
(option "bgPdfFirstPageOnly" in Datei letter.lco)
- Hintergrundpdf fuer Ausdruck auf bereits bedrucktem Briefpapier Abschaltbar,
es wird dann nur bei per email versendeten Dokumenten eingebunden.
(Option "bgPdfEmailOnly" in Datei letter.lco)
- Nutzung der Layout-Funktionen von Latex fuer Seitenumbruch,
wiederholung von Kopfzeilen, Zwischensummen etc. (danke an Kai-Martin fuer
die Vorarbeit)
- Anzeige des Empfaengerlandes im Adressfeld nur, wenn es vom Land des
eigenen Unternehmens abweicht (also die Rechnung das Land verlaesst).
- Multisprachfaehig leicht um weitere Sprachen zu erweitern, alle
Übersetzungen in der Datei translatinos.tex.
- Auflistung von Bruttopreisen fuer Endverbraucher.
# die Installation
Wenn es noch keine LaTeX installation gibt, installiere die folgenden Pakete
(Debian)
aptitude install \
texlive-base-bin \
texlive-latex-recommended \
texlive-fonts-recommended \
texlive-latex-extra \
texlive-lang-german \
texlive-generic-extra
(Info fuer != Debian Installationen: die Abhaengigkeiten werden waehrend des
Setups nochmals geprueft)
Rufe das folgende Script auf:
[lxo-home]/templates/f-tex/setup.sh
und folge den Anweisungen.
Erstelle eine pdf-Hintergrund Datei und verlinke sie nach ./letter_head.pdf
Editiere den Bereich "settings" in der datei letter.lco ""
# oder etwas Detaillierter:
Es wird eine Datei sample.lco erstellt und diese nach letter.lco verlinkt.
Eigentlich ist dies die Datei die fuer die Firmenspezifischen Anpassungen
gedacht ist. Da die Einstiegshuerde in LaTeX nicht ganz niedrig ist, wird in
dieser Datei auf ein Hintergrundpdf verwiesen. Ich empfehle ueber dieses pdf
die persoenlichen Layoutanpassungen vorzunehmen und sample.lco unveraendert zu
lassen. Die die Anpassung ueber eine *.lco Datei die letztlich auf letter.lco
verlinkt ist ist aber auch moeglich.
Es wird eine Datei sample_head.pdf mit ausgeliefert, diese wird nach
letter_head.pdf verlinkt. Damit gibt es schon mal eine Funktionsfaehige
Vorlage. Schau Dir nach Abschluss der Installation die Datei sample_haed.pdf
an und erstelle ein entsprechendes pdf passend zum Briefkopf Deiner Firma,
diese dann im Template Verzeichniss ablegen und statt sample_head.pdf nach
letter_head.pdf verlinken.
per default erstellt das Setupscript einen symbolischen Link
./sample_head.pdf -> ./letter_head.pdf
letzlich muss ./letter_head.pdf auf das passende Hintergrundpdf verweisen,
welches gewuenschten Briefkopf enthaelt. Bei Updates oder nach erneutem
Aufruf des setup Scripts werden bestehende Links nicht ohne Rueckfrage
ersetzt, wer also schon seinen Briefkopf verlinkt hat, braucht diesen Link
nicht immer wieder neu anlegen. Das gleiche Prinzip gilt fuer letter.lco.
Es wird eine Datei mydata.tex erstellt, sie ist mit der aus
lp (Label Print in erp) kompatibel. Diese braucht man also nur einmal
fuer jedes template Verzeichnis zu generieren.
Bei Formatierungsschwierigkeiten bitte mit
[lxo-home]/templates/f-tex/mydata.tex.example vergleichen.
Alle Anpassungen zum Briefkopf, Fusszeilen, Firmenlogos, etc.
sollten ueber die Hintergrund pdf datei oder die *.lco Datei erfolgen.
# einheitliche Latex-Vorlagen -- Background
Das Konzept von lx-office sieht vor, fuer jedes Dokument
(Auftragsbestaetigung, Lieferschein, Rechnung, etc.) eine
Latex-Vorlage vorzuhalten, dies ist sehr Wartungsunfreundlich. Auch
das Einlesen einer einheitlichen Quelle fuer den Briefkopf bringt nur
bedingte Vorteile, da hier leicht die Pflege der Artikel-Tabellen aus
dem Ruder laeuft. Bei dem vorliegenden Ansatz wird fuer alle
Briefartigen Dokumente mit Artikel-Tabellen eine einheitliche
Latexvorlage verwendet, welche ueber Codeweichen die Besonderheiten
der jeweiligen Dokumente Beruecksichtigt
- Tabellen mit oder ohne Preis
- Sprache der Tabellenueberschriften etc.
- Anpassung der Bezugs-Zeile (z.B. Rechnungsnummer versus
Angebotsnummer)
- Darstellung von Brutto oder Netto-Preisen in der Auflistung
(Endverbraucher versus Gewerblicher Kunde)
Dies laesst sich in lx-office nur ueber einen Kunstgriff realisieren,
da zum einen die perl-Anwendung nach latex-Vorlagen mit bestimmten
Namen sucht (z.B. sales_order_de.tex fuer die deutschsprachige
Auftragsbestaetigung -- wenn deutsch mit dem Vorlagenkuerzel de
angelegt wurde) und zum Anderen die Information um welches Dokument es
sich handelt nicht direkt innerhalb von Latex zur Verfuegung steht.
Umgesetzt wurde dies hier nun ueber symbolische Links im Dateisystem. Es
gibt also eine Vorlage letter.tex (die ihrerseits weitere tex-Dateien
einbindet) und fuer jeden Dokumenttyp der durch letter.tex abgedeckt on von
jedem dieser wiederum in jeder verfuegbaren Sprache legt das setup Script einen
link in der lx-office Namenskonvention an, der auf die Datei letter.tex
verweist. Die Datei letter.tex wertet den Namen der Aufgerufenen Datei aus und
passt ihre Ausgabe dementsprechend an. Wenn zum Beispiel lx-office die Datei
packing_list_de.tex aufruft (die ja nur ein Link nach letter.tex ist) liegt die
Information des aktuellen Dokumentnamen (packing_list_de.tex) vor und latex
weiss, keine Preise, Lieferscheinnummer anzeigen, deutsche sprachumgebung, usw.
Es liegt mit der Datei setup.sh ein script vor, welches die Abhaengigkeiten
im System prueft und die benotigten Dateien und symbolischen Links erstellt.
Das script ist so aufgebaut, dass es bei Updates auch auf bestehende f-tex
Vorlagenordner angewendet werden kann, ohne vorhandene Personalisierungen zu
ueberschreiben. Die Benoetigten Informationen wie Template-Verzeichniss,
vorhandene Sprachkuerzel, etc werden waerend des setupprozesses abgefragt. Der
Setupprozess kann also sooft wie benoetigt wiederholt werden, auch wenn bereits
ein templateverzeichniss existiert.
Nachteil:
Ja, alles hat seinen Preis ...
Latex hat ohnehin eine sehr steile Lehrnkurve. Die Datei letter.tex
ist sehr komplex und verstaerkt damit diesen Effekt noch einmal erheblich.
Wer Latex-Erfahrung hat, oder geuebt ist Scriptsparachen nachzuvollziehen kann
natuerlich auch innerhalb der Tabellendarstellung gut persoenliche Anpassungen
vornehmen. Aber man kann sich hier bei Veraenderungen sehr schnell haeftig in
den Fuss schiessen.
Wer nicht so tief in die Materie einsteigen will oder leicht zu
frustrieren ist, sollte sein Hintergrund PDF auf Basis der mitglieferten
Datei sample_head.pdf erstellen, und sich an der Form der dargestellten Tabellen
wie sie ausgeliefert werden, erfreuen.
Kleiner Tipp:
Nicht zu viel auf einmal wollen, lieber kleine kontinuierliche
Schritte gehen.
Alternativ kann man sich natuerlich fuer die Latex-Vorlagen
professionelle Hilfe hohlen.
Bruttopreise fuer Endvorbraucher
Der auszuweisende Bruttopreis wird innerhalb der LaTeX Umgebung berechnet.
- Background:
es gibt zwar ein Feld um bei Auftraegen "alle Preise Brutto" auszuwaehlen,
aber:
- hierfuer muessen die Preise auch in Brutto in der Datenbank stehen
(ja -- das laesst sich ueber die Preisgruppen und die Zuordung einer Default-Preisgruppe
handhaben)
- man darf beim Anlegen des Vorgangs nicht vergessen Dieses Haekchen zu setzen.
(das ist in der Praxis wenn man sowohl Endverbraucher- wie Gewerbekunden beliefert
der eigentliche Knackpunkt)
Es gibt mit f-tex eine weitere Alternative. Die Information ob Brutto oder
Nettorechnung wird mit den Zahlarten verknuepft. Zahlarten bei denen
Rechnungen, Angebote, etc, in Brutto ausgegeben werden sollen enden mit "_E"
(fuer Endverbraucher) Falls identische Zahlarten fuer Gewerbekunden und
Endverbraucher vorhanden sind legt man diese einfach doppelt an (einmal mit
der Namensendung "_E")
- Gewinn:
- die Entscheidung ob Netopreise ausgewiesen werden ist nicht mehr fix
mit einer Preisliste Verbunden.
- die Default-Zahlart kann im Kundendatensatz hinterlegt werden und man
muss nicht mehr daran denken "alle Preise Netto" auszuwaehlen.
- Die Entscheidung ob Netto/Oder Bruttopreise ausgewiesen werden kann direkt
beim Drucken reviediert werden, ohne dass sich der Auftragswert aendert.
Lieferadressen
- in Lieferscheinen kommen shipto* -Variablen im Adressfeld zum Einsatz
- wenn die shipto*variable leer ist wird die entsprechende
Adressvariable eingesetzt. Wenn Also die Lieferadresse in Strasse,
Hausnummer und Ort abweicht, muessen auch nur diese Felder in der
Lieferadresse ausgefuellt werden. Fuer den Firmenname wird der Wert der
Hauptadresse angezeigt.
Troubleshooting -- Fehler suchen:
Wenn sich das Problem nicht auf Grund der ausgabe im Webbrowser verifizieren laesst:
editiere [flxo-home]/config/lx_office.conf und aendere "keep_tmp_files" auf 1
keep_temp_files = 1;
bei fastcgi oder mod_perl den Webserver neu Starten
Nochmal einen Druckversuch im Webfrontend ausloesen
wechsele in das users Verzeichnis von lxo
cd [lxo-home]/users
LaTeX Suchpfad anpassen:
export TEXINPUTS=".:[lxo-home]/templates/[aktuelles_template_verzeichniss]:"
Finde herraus welche datei lxo beim letzten Durchlauf erstellt hat
ls -lahtr ./1*.tex
Es sollte die letzte Datei ganz unten sein
fuer besseren Hinweis auf Fehler texdatei nochmals uebersetzen
pdflatex ./1*.tex
in der *.tex datei nach dem Fehler suchen.
Changelogeintrag fuer offiziellen tree:
Kleine Verbesserungen:
Zusaetzliches alternatives LaTeX Templatesystem
doc/changelog
# Veränderungen von Lx-Office ERP #
###################################
- Alternatives Vorlagenstemsystem f-tex
* Setup Script
* mehrsprachig
* leichte Integration des Firmenbriefkopfs
* Ausgabe von Bruttopreisen in den Positionen fuer Endverbraucher moeglich
siehe doc/2011-12-14_alternatives_vorlagensystem_f-tex.txt
- Ein neuer Vorlagensatz RB kam hinzu, der einige Ideen aufgreift, die
in folgendem Vortrag erwähnt wurden:
http://www.lx-office.org/uploads/media/Lx-Office_Anwendertreffen_LaTeX-Druckvorlagen-31.01.2011_01.pdf
templates/f-tex/letter.tex
% ----------------------------------------------------------
% letter.tex
% Globale Vorlage fuer Briefartige Documente LX-Office 2.6
%
% Changelog: see gitlog
\newcommand{\ftLetterVersion}{1.0-u (16.11.2011)}
%
% Lizenz
% http://www.gnu.de/licenses/gpl-3.0.html
%
% Siehe ./README
%
% Autor: Wulf Coulmann scripts_at_gpl.coulmann.de
% Aufgebaut auf invoice.tex 0.1 kmk@lilalaser.de
%
% ----------------------------------------------------------
\documentclass[letter,fontsize=11pt]{scrlttr2}
\begingroup
\makeatletter
\@latex@warning@no@line{ #### this is letter.tex \ftLetterVersion #####}
\endgroup
\usepackage{ifpdf}
\usepackage{graphicx}
\usepackage{german}
\usepackage{textcomp}
\usepackage{lastpage}
\usepackage{filecontents}
\usepackage{etex}
\usepackage{ltxtable}
\usepackage{tabularx}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{numprint}
\usepackage{xstring}
\newcommand{\leer}{}
\usepackage{zwischensumme}
\ifthenelse{\isundefined{\employeecountry}}{\input{mydata}}{}
% Dateinamen einlesen und auswertbar machen
\scantokens\expandafter{%
\expandafter\def\expandafter\docname\expandafter{\jobname}}
%%%%%%%%% Report-Variablen umsetzen, damit latex sie in lxbriefkopf.tex sieht.
%%%% Die eigenen Daten
\newcommand{\employeename}{<%employee_name%>}
\newcommand{\employeecompany}{<%employee_company%>}
\newcommand{\employeeaddress}{<%employee_address%>}
\newcommand{\employeetel}{<%employee_tel%>}
\newcommand{\employeefax}{<%employee_fax%>}
\newcommand{\employeecoustid}{<%employee_co_ustid%>}
\newcommand{\employeetaxnumber}{<%employee_taxnumber%>}
\newcommand{\media}{<%media%>}
%%%% Adressat
\newcommand{\name}{<%name%>}
\newcommand{\Shipname}{\ifthenelse{\equal{<%shiptoname%>}{\leer}}{<%name%>}{<%shiptoname%>}}
\newcommand{\departmentone}{<%department_1%>}
\newcommand{\departmenttwo}{<%department_2%>}
\newcommand{\cpgreeting}{<%cp_greeting%>}
\newcommand{\cptitle}{<%cp_title%>}
\newcommand{\cpgivenname}{<%cp_givenname%>}
\newcommand{\cpname}{<%cp_name%>}
\newcommand{\street}{<%street%>}
\newcommand{\Shipstreet}{\ifthenelse{\equal{<%shiptostreet%>}{\leer}}{<%street%>}{<%shiptostreet%>}}
\newcommand{\country}{<%country%>}
\newcommand{\Shipcountry}{\ifthenelse{\equal{<%shiptocountry%>}{\leer}}{<%country%>}{<%shiptocountry%>}}
\newcommand{\UstId}{<%ustid%>}
\newcommand{\zipcode}{<%zipcode%>}
\newcommand{\Shipzipcode}{\ifthenelse{\equal{<%shiptozipcode%>}{\leer}}{<%zipcode%>}{<%shiptozipcode%>}}
\newcommand{\city}{<%city%>}
\newcommand{\Shipcity}{\ifthenelse{\equal{<%shiptocity%>}{\leer}}{<%city%>}{<%shiptocity%>}}
\newcommand{\phone}{<%customerphone%>}
\newcommand{\fax}{<%customerfax%>}
%%%% Variablen, die sich auf das ganze Dokument beziehen
\newcommand{\kundennummer}{<%customernumber%>}
\newcommand{\vendornumber}{<%vendornumber%>}
\newcommand{\quonumber}{<%quonumber%>} % Angebotsnummer
\newcommand{\ordnumber}{<%ordnumber%>} % Auftragsnummer bei uns
\newcommand{\cusordnumber}{<%cusordnumber%>} % Auftragsnummer beim Kunden
\newcommand{\invnumber}{<%invnumber%>} % Rechnungsnummer
\newcommand{\donumber}{<%donumber%>} % Lieferscheinnummer
%\newcommand{\docnumber}{Rechnungsnummer: \invnumber}
\newcommand{\quodate}{<%quodate%>} % Angebotsdatum
\newcommand{\orddate}{<%orddate%>} % Auftragsdatum
\newcommand{\reqdate}{<%reqdate%>} % gewuenschtes Lieferdatum
\newcommand{\deliverydate}{<%deliverydate%>} % Lieferdatum
\newcommand{\invdate}{<%invdate%>} % Rechnungsdatum
\newcommand{\transdate}{<%transdate%>} % Lieferscheindatum
\newcommand{\terms}{<%terms%>} % Zahlungsfrist
\newcommand{\duedate}{<%duedate%>} % Fälligkeitsdatum
\newcommand{\invtotal}{<%invtotal%>} % Gesamtbetrag
\newcommand{\paid}{<%paid%>} % Schon bezahlt
\newcommand{\total}{<%total%>} % Restbetrag
\newcommand{\subtotal}{<%subtotal NOFORMAT%>} % Restbetrag
\newcommand{\paymentterms}{<%payment_terms%>} % Zahlungsbedingungen
\newcommand{\paymentPrivatEnd}{E} % Endung bei Privatkunden
\newcommand{\paymenttype}{<%payment_description%>} % name der Zahlungs-art - fuer Steuerung brutto/netto
%%%% Lieferadresse
\newcommand{\shiptoname}{<%shiptoname%>}
\newcommand{\shiptocontact}{<%shiptocontact%>}
\newcommand{\shiptodepartmentone}{<%shiptodepartment_1%>}
\newcommand{\shiptodepartmenttwo}{<%shiptodepartment_2%>}
\newcommand{\shiptostreet}{<%shiptostreet%>}
\newcommand{\shiptocity}{<%shiptocity%>}
\newcommand{\shiptocountry}{<%shiptocountry%>}
\newcommand{\shiptophone}{<%shiptophone%>}
\newcommand{\shiptozipcode}{<%shiptozipcode%>}
\newcommand{\shiptofax}{<%shiptofax%>}
%%%% Die Waehrungsvariable in Waehrunszeichen umsetzen
\newcommand{\currency}{<%currency%>}
\ifthenelse{\equal{\currency}{EUR}}{\let\currency\euro}{}
\ifthenelse{\equal{\currency}{YEN}}{\let\currency\textyen}{}
\ifthenelse{\equal{\currency}{GBP}}{\let\currency\pounds}{}
\ifthenelse{\equal{\currency}{USD}}{\let\currency\$}{}
%%%%%%%%%%%%% Ende Reportvariablen-Umsetzung
\newcommand{\NoValue}{0}
\newcommand{\Picklist}{0}
\newcommand{\PurchaseOrder}{0}
\newcommand{\trash}{0}
\newcommand{\nonemptyline}[2]{\ifthenelse{\equal{#2}{\leer}}{}{#1#2~\\}}
\newcommand{\MyAdress}{\IfSubStr{\docname}{sales_delivery_order}{\Shipname~\\
% lieferadresse wenn Lieferschein
\nonemptyline{\cpgreeting{ }\cpgivenname{ }}{\cpname}
\nonemptyline{}{\departmentone}
\Shipstreet ~\\
\Shipzipcode{ }\Shipcity
\ifthenelse{\equal{\Shipcountry}{\employeecountry}}{}{
\ifthenelse{\equal{\Shipcountry}{\leer}}{}{ ~\\ \Shipcountry} } % Laenderangabe wird nur gedruckt,
~ % wenn der Empfaenger nicht im eigenen Land sitzt.
}{
\name~\\
\nonemptyline{\cpgreeting{ }\cpgivenname{ }}{\cpname}
\nonemptyline{}{\departmentone}
\street ~\\
\zipcode{ }\city
\ifthenelse{\equal{\country} {\employeecountry}}{}{
\ifthenelse{\equal{\country}{\leer}}{}{ ~\\ \country} } % Laenderangabe wird nur gedruckt,
~ % wenn der Empfaenger nicht im eigenen Land sitzt.
}
}
\begin{document}
%%% dei folgenden Funktionen lesen den Dokumentennamen aus und _muessen_nach_ \begin{dokument} stehen.
% ==== statische Begriffe in der aktuellen Sprache einlesen
\input{translations}
\ifthenelse{\bgPdfEmailOnly = 1 }{
\ifthenelse{\equal{\media}{email}}{
}{
\firsthead{}
\watermark{}
}
}{}
% ==== dokumenttyp ermitteln
\IfSubStr{\docname}{pick_list}{
% Sammelliste
\setkomavar{backaddress}{\DeliveryAddress}
\firsthead{
\hspace{-3mm}
\resizebox{\useplength{firstheadwidth}-50mm}{!}{%
\huge \TitlePicklist
}
}
\renewcommand{\NoValue}{1}
\renewcommand{\Picklist}{1}
\newcommand{\doctype}{}
\newcommand{\MyDocdate}{\transdate}
\newcommand{\DocNoTitle}{\DelorderNumber}
\newcommand{\docnumber}{\donumber}
\renewcommand{\deliverydate}{\transdate}
% 2. Documentnummer
\ifthenelse{\equal{\ordnumber}{\leer}}{
% wenn keine Auftragsnummer -> Angebotsnummer
\newcommand{\SecNoTitle}{\QuotationNumber}
\newcommand{\secnumber}{\quonumber}
}{
\newcommand{\SecNoTitle}{\OrderNumber}
\newcommand{\secnumber}{\ordnumber}
}
}{}
\IfSubStr{\docname}{sales_delivery_order}{
% Lieferschein
\renewcommand{\NoValue}{1}
\newcommand{\doctype}{\TitleDelorder}
\newcommand{\MyDocdate}{\transdate}
\newcommand{\DocNoTitle}{\DelorderNumber}
\newcommand{\docnumber}{\donumber}
\renewcommand{\deliverydate}{\transdate}
% 2. Documentnummer
\ifthenelse{\equal{\ordnumber}{\leer}}{
% wenn keine Auftragsnummer -> Angebotsnummer
\newcommand{\SecNoTitle}{\QuotationNumber}
\newcommand{\secnumber}{\quonumber}
}{
\newcommand{\SecNoTitle}{\OrderNumber}
\newcommand{\secnumber}{\ordnumber}
}
}{}
\IfSubStr{\docname}{invoice}{
% Rechnung
\newcommand{\doctype}{\TitleInv}
\newcommand{\MyDocdate}{\invdate}
\newcommand{\DocNoTitle}{\InvNumber}
\newcommand{\docnumber}{\invnumber}
% 2. Documentnummer
\ifthenelse{\equal{\ordnumber}{\leer}}{
% wenn keine Auftragsnummer -> Angebotsnummer
\newcommand{\SecNoTitle}{\QuotationNumber}
\newcommand{\secnumber}{\quonumber}
}{
\newcommand{\SecNoTitle}{\OrderNumber}
\newcommand{\secnumber}{\ordnumber}
}
}{}
\IfSubStr{\docname}{proforma}{
\newcommand{\doctype}{\TitleProforma}
\newcommand{\MyDocdate}{\invdate}
\newcommand{\DocNoTitle}{\InvNumber}
\newcommand{\docnumber}{\invnumber}
% 2. Documentnummer
\ifthenelse{\equal{\ordnumber}{\leer}}{
% wenn keine Auftragsnummer -> Angebotsnummer
\newcommand{\SecNoTitle}{\QuotationNumber}
\newcommand{\secnumber}{\quonumber}
}{
\newcommand{\SecNoTitle}{\OrderNumber}
\newcommand{\secnumber}{\ordnumber}
}
}{}
\IfSubStr{\docname}{purchase_order}{
\renewcommand{\PurchaseOrder}{1}
\newcommand{\doctype}{\TitlePurchaseOrder}
\newcommand{\MyDocdate}{\orddate}
\newcommand{\DocNoTitle}{\RequestOrderNumber}
\newcommand{\docnumber}{\ordnumber}
\renewcommand{\deliverydate}{\reqdate}
\renewcommand{\DelDate}{\ReqByTitle}
\renewcommand{\CustomerID}{\VendorID}
\renewcommand{\kundennummer}{\vendornumber}
\newcommand{\SecNoTitle}{}
\newcommand{\secnumber}{}
}{}
\IfSubStr{\docname}{credit_note}{
\newcommand{\doctype}{\TitleCreditNote}
\newcommand{\MyDocdate}{\invdate}
\newcommand{\DocNoTitle}{\CredNumber}
\newcommand{\docnumber}{\invnumber}
% keine 2. Documentnummer
\newcommand{\SecNoTitle}{}
\newcommand{\secnumber}{}
}{}
\IfSubStr{\docname}{sales_order}{
% Auftragsbestaetigung
\newcommand{\doctype}{\TitleSalesOrder}
\newcommand{\MyDocdate}{\orddate}
\renewcommand{\deliverydate}{\reqdate}
\newcommand{\DocNoTitle}{\OrderNumber}
\newcommand{\docnumber}{\ordnumber}
% 2. Documentnummer
\ifthenelse{\equal{\ordnumber}{\leer}}{
% wenn keine Angebotsnummer -> leer
\newcommand{\SecNoTitle}{}
\newcommand{\secnumber}{}
}{
\newcommand{\SecNoTitle}{\QuotationNumber}
\newcommand{\secnumber}{\quonumber}
}
}{ }
\IfSubStr{\docname}{sales_quotation}{
% Angebot
\newcommand{\doctype}{\TitleSalesQuotation}
\newcommand{\MyDocdate}{\quodate}
\renewcommand{\DelDate}{\ValidUntil}
\renewcommand{\deliverydate}{\reqdate}
\newcommand{\DocNoTitle}{\QuotationNumber}
\newcommand{\docnumber}{\quonumber}
% 2. Documentnummer
\newcommand{\SecNoTitle}{}
\newcommand{\secnumber}{}
}{ }
% ==== \paid auf 0.00 falls leer
\IfSubStr{\paid}{\DecimalSign}{}{\renewcommand{\paid}{0{\DecimalSign}00}}
\setkomavar{date}{}
\begin{letter}{{\ifthenelse{\isnamedefined{MyAdressfield}}{\MyAdressfield
}{\MyAdress
}}
}
\opening{}
%========Datum und Nummern====================================================
\newcommand{\DocId}{
\begin{tabular*}{\textwidth+1em }{@{\extracolsep{\fill}}llllr}
\MakeUppercase{\tiny \DocNoTitle} &
\MakeUppercase{\tiny \CustomerID} &
\MakeUppercase{\tiny \SecNoTitle } &
\MakeUppercase{\tiny \DelDate } &
\MakeUppercase{\tiny \Date}~\\
\mainfont\docnumber &
\mainfont\kundennummer &
\mainfont\secnumber &
\mainfont\deliverydate &
\mainfont\MyDocdate~\\
\end{tabular*} ~\\
}
\hspace{-0.5em} \DocId
\nexthead{
\ifthenelse{\bgPdfFirstPageOnly = 1 }{
\hspace{-4mm} \DocId
}{}
}
\vspace{ 5mm}
{\noindent\textbf\doctype}~\\
\IfEndWith{\paymenttype}{\paymentPrivatEnd}{\PriceInclTax }{ }
%======Die eigentliche-Tabelle========================================
% temporaere Datei mit Tabelle anlegen
\begin{filecontents}{tabelle.tex}
\mainfont
\resetlaufsumme
\ifthenelse{\NoValue > 0 }
{ % Tabelle ohne Preisen
\ifthenelse{\Picklist = 1 }{
\begin{longtable}{@{}rlX@{ }rlrrrl@{}}
}{
\begin{longtable}{@{}rlX@{ }rlrr@{}}
}
% Kopfzeile der Tabelle
{\Pos} &
{\Number} &
{\ItemNo} &
{\Count} &
{\Unit} \hspace{2mm}
\ifthenelse{\Picklist = 1 }{& {\Take} & {\Storage} }{}
~\\
\midrule
\endfirsthead
% Tabellenkopf nach dem Umbruch
{\Pos} &
{\Number} &
{\ItemNo} &
{\Count} &
{\Unit} \hspace{2mm}
\ifthenelse{\Picklist = 1 }{& {\Take} & {\Storage} }{}
~\\
\midrule
\endhead
<%foreach number%>
<%runningnumber%> % Laufende Positionsnummer
&
<%number%> % Artikelnummer
&
<%description%> % Kurzbeschreibung des Artikels
\ifthenelse{\equal{<%longdescription%>}{\leer}}{}{ \newline <%longdescription%>}
% Ein zeilenweises Auslieferdatum, wenn es gesetzt bei der Position hinterlegt ist.
\ifthenelse{\equal{<%deliverydate_oe%>}{\leer}}{}{
\newline \DelDate:~<%deliverydate_oe%>}
&
<%qty NOFORMAT%> % Menge
&
<%unit%> % Einheit
%\ifthenelse{\Picklist = 1 }{& {x} & {x} }{}
%\ifthenelse{\Picklist = 1 }{& {x} & {x} \hhline{~~~~~--} }{~\\}
\ifthenelse{\Picklist = 1 }{& {\underline{;~~~~~~~~~}} & {\underline{;~~~~~~~~~}}~\\ }{~\\}
%~\\ %
<%end number%>
\end{longtable} % Ende der zentralen Tabelle
}{ % Tabelle mit Preisen
\begin{longtable}{@{}rlX@{ }rlrrr@{}}
% Kopfzeile der Tabelle
{\Pos} &
{\Number} &
{\ItemNo} &
{\Count} &
{\Unit} &
{\Fee} &
{\Dis} &
{\Total} \hspace{2mm} ~\\
\midrule
\endfirsthead
% Tabellenkopf nach dem Umbruch
{\Pos} &
{\Number} &
{\ItemNo} &
{\Count} &
{\Unit} &
{\Fee} &
{\Dis} &
{\Total} \hspace{2mm} ~\\
\midrule
\multicolumn{7}{r}{ \rule{0mm}{5mm} \TabCarry{:} \MarkZwsumPos}
\endhead
% Fuss der Teiltabellen
\multicolumn{7}{r}{ \rule{0mm}{5mm} \TabSubTotal{:} \MarkZwsumPos } ~\\
\endfoot
% Das Ende der Tabelle
\midrule
\multicolumn{7}{r}{ \rule{0mm}{5mm} \TabSubTotal{:} \MarkZwsumPos} ~\\
\endlastfoot
<%foreach number%>
<%runningnumber%> % Laufende Positionsnummer
&
<%number%> % Artikelnummer
&
<%description%> % Kurzbeschreibung des Artikels
\ifthenelse{\equal{<%longdescription%>}{\leer}}{}{ \newline <%longdescription%>}
% Ein zeilenweises Auslieferdatum, wenn es gesetzt ist.
\ifthenelse{\equal{<%reqdate%>}{\leer}}{}{
\newline \DelDate:~<%reqdate%>}
&
<%qty NOFORMAT%> % Menge
&
<%unit%> % Einheit
&
%\IfEndWith{\paymentterms}{_e}{EN}{\brutto{<%sellprice NOFORMAT%>}{<%qty NOFORMAT%>}{<%p_discount%>}}
\IfEndWith{\paymenttype}{\paymentPrivatEnd}{
\BruttoSellPrice{<%sellprice NOFORMAT%>}{<%tax_rate%>}
&
\ifthenelse{\equal{<%p_discount%>}{0}}{}{ -<%p_discount%>\%}
&
\BruttoWert{<%linetotal NOFORMAT%>}{<%tax_rate%>}
}{
\numprint{<%sellprice NOFORMAT%>}
&
\ifthenelse{\equal{<%p_discount%>}{0}}{}{ -<%p_discount%>\%}
&
\Wert{<%linetotal NOFORMAT%>} % Zeilensumme addieren
}
~\\ %
<%end number%>
\end{longtable} % Ende der zentralen Tabelle
}
\end{filecontents} % Ende der Hilfsdatei.
\LTXtable{\textwidth}{tabelle.tex}
\rule{\textwidth}{0pt} % Ein (unsichtbarer) Strich quer ueber die Seite
\vspace{ 5mm}
\vspace{-2em plus 10em minus 2em}~\\
\ifthenelse{\NoValue > 0 }
{ % wenn keine Zahlen
}{ % Wenn Zahlen
\parbox{\textwidth}{
\mainfont
%
%
\setlength{\tabcolsep}{0.2em}
\ifthenelse{\equal{\paid}{0{\DecimalSign}00} }
{ % Wenn noch nichts gezahlt wurde
\IfSubStr{\invtotal}{\DecimalSign}{}{
\fpAdd{\invtotal}{0}{<%subtotal NOFORMAT%>}
<%foreach tax%>
\fpAdd{\invtotal}{\invtotal}{<%tax NOFORMAT%>}
<%end tax%>
}
\hfill
\begin{tabular}{@{}rrr@{}}
%{Summe vor Steuern:}& {\numprint{<%subtotal NOFORMAT%>}} & ~\\
% Die unterschiedlichen Steueranteile getrennt ausweisen
<%foreach tax%>
{ \IfEndWith{\paymenttype}{\paymentPrivatEnd}{\TaxInc }{ } <%taxdescription%>}
&
{\numprint{<%tax NOFORMAT%>}}& ~\\
<%end tax%>
\midrule[1pt]
{\Sum~ \currency:} & \textbf{\numprint{\invtotal}}
\end{tabular}
}
{ % Wenn bereits etwas gezahlt wurde
\hfill
\begin{tabular}{@{}rrr@{}}
{\EbT}& {\numprint{<%subtotal NOFORMAT%>}} & ~\\
% Die unterschiedlichen Steueranteile getrennt ausweisen
<%foreach tax%>
{<%taxdescription%>}
&
{\numprint{<%tax NOFORMAT%>}}& ~\\
<%end tax%>
\midrule % Ein dünner Strich
\Sum & \numprint{\invtotal} & ~\\
<%foreach payment%>
\AlreadyPayed~ {<%paymentdate%>}:& -{\numprint{<%payment%>}} & ~\\
<%end paymentdate%>
\midrule[2pt] % Ein etwas dickerer Strich
{\Left~ \currency:} & \numprint{\total}
\end{tabular}
}% ende ithenelse
} %Ende des Summenkasten
}
\vfill % Den Rest-Text soweit wie möglich nach unten schieben
\ifthenelse{\isempty{<%notes%>}}{}{
\mainfont
\noindent <%notes%> ~\\[2em]
}%
\small
\noindent \YourOrder
\ifthenelse{\Picklist = 0}{\noindent \ifthenelse{\equal{<%ustid%>}{\leer}}{}{\UstidTitle} \UstId}{}
\noindent \paymenthints % ist in translations.tex deffiniert
\ifthenelse{\PurchaseOrder = 0}{\noindent \paymentterms}{}
\end{letter}
\end{document}
templates/f-tex/mydata.tex.example
% \employeecountry wird fuer lxo fancy LaTeX benoetigt
\newcommand{\employeecountry}{Deutschland}
% die folgenden definitionen koennten auch direkt in der Steuerdatei *.lco stehen
\newcommand{\MYfromname}{Die globalen Problemlöser}
\newcommand{\MYaddrsecrow}{Gesellschaft für anderer Leute Sorgen mbH}
\newcommand{\MYrechtsform}{Handelsregister: HRA 123456789 }
\newcommand{\MYfromaddress}{Hauptstraße 5\\12345 Hier}
\newcommand{\MYfromphone}{Tel: +49 (0)12 3456780}
\newcommand{\MYfromfax}{Fax: +49 (0)12 3456781}
\newcommand{\MYfromemail}{mail@g-problemloeser.com}
\newcommand{\MYsignature}{Herbert Wichtig - Geschäftsführer}
\newcommand{\MYustid}{UstID: DE 123 456 789}
\newcommand{\MYfrombank}{Bankverbindung\\
Ensifera Bank\\
Kto 1234567800\\
BLZ 123 456 78
}
templates/f-tex/sample.lco
% ----------------------------------------------------------
% letter.lco
% Steuerdatei Briefklasse f-tex
%
% Changelog: see gitlog
\newcommand{\ftLcoVTversion}{1.0-u (16.11.2011)}
%
% Lizenz
% http://www.gnu.de/licenses/gpl-3.0.html
%
% Siehe ./README
%
% Autor: Wulf Coulmann scripts_at_gpl.coulmann.de
%
%
% ----------------------------------------------------------
\begingroup
\makeatletter
\@latex@warning@no@line{ #### this is letter.lco \ftLcoVTversion #####}
\endgroup
\ProvidesFile{letter.lco}[%
2002/07/09 v0.9a LaTeX2e unsupported letter-class-option]
\KOMAoptions{foldmarks=false}
\usepackage{graphicx}
\usepackage[utf8]{inputenc}
\usepackage{ngerman}
\usepackage{lmodern}
\usepackage{xcolor}
\usepackage{watermark}
\usepackage{xifthen}
% ================== settings ==============================
% Name der pdf Datei die den Briefkopf enthaelt
\newcommand{\bgPdfName}{letter_head.pdf}
% Hintergrund pdf nur bei erster Dokumentseite [1|0]
\newcommand{\bgPdfFirstPageOnly}{1}
% Hintergrundpdf nur bei versand per email [1|0]
% (setze diesen Wert auf 1, wenn auf bereits Bedruktes Briefpapier ausgedruckt werden soll)
\newcommand{\bgPdfEmailOnly}{0}
% Trennlienie unter der Seitenkopfzeile ab Seite 2 ff.
\KOMAoptions{headsepline=on}
% der Abstand zu den Fusszeilen
\addtolength{\textheight}{23mm}
% zusaetzlicher Zwischenraum zur Fusszeile ab Seite 2 ff.
% (nur bei bgPdfFirstPageOnly = 1)
\addtolength{\footskip}{10mm}
% ================== end settings ==============================
\setkomavar{backaddress}{}
\setkomavar{fromname}{\MYfromname}
\newcommand\addrsecrow{\MYaddrsecrow}
\newcommand\rechtsform{\MYrechtsform}
\setkomavar{fromaddress}{\MYfromaddress}
\setkomavar{fromphone}{\MYfromphone}
\setkomavar{fromfax}{\MYfromfax}
\setkomavar{fromemail}{\MYfromemail}
\setkomavar{signature}{\MYsignature}
\newcommand\ustid{\MYustid}
\setkomavar{frombank}{\MYfrombank}
\renewcommand{\rmdefault}{cmss}
\newlength\entrytblsub
\setlength\entrytblsub{\dimexpr\tabcolsep+1.3mm+\arrayrulewidth\relax}
\setlength\textwidth{166mm}
\oddsidemargin -0.4mm
\KOMAoptions{headsepline=on}
\pagestyle{myheadings}
\@addtoplength{firstfootvpos}{18mm}
\@addtoplength{foldmarkhpos}{5mm}
\@setplength{firstheadvpos}{0mm}
\@setplength{firstheadwidth}{165mm}
\@setplength{firstfootwidth}{165mm}
\@setplength{toaddrhpos}{25mm}
\@setplength{toaddrvpos}{38mm}
\@setplength{refhpos}{26mm}
\@addtoplength{refvpos}{-18mm}
\font\mainfont=cmss9
\ifthenelse{\bgPdfFirstPageOnly = 0 }{
\addtolength{\headheight}{50mm}
\watermark{
\setlength{\unitlength}{1mm}
\put(-22,-226){
\includegraphics[width=210mm]{\bgPdfName}
}
}
}{}
\firsthead{
\ifthenelse{\bgPdfFirstPageOnly = 1 }{
\put(-69,0){ % Mit diesem put-Befehl wird die Position des Logos bestimmt.
\includegraphics[width=210mm]{\bgPdfName}
}
}{}
}
\firstfoot{%
}
\nextfoot{%
\parbox{\useplength{firstfootwidth}}{
\hspace{-\entrytblsub}
\begin{tabular}{l}
\usekomavar{fromname}
\end{tabular}\hfill
\begin{tabular}{r}
\thepage
\end{tabular}
\hspace{-\entrytblsub}
}
\vspace{10mm}
}
\endinput
% vim: set filetype=tex :EOF
templates/f-tex/setup.sh
#!/bin/bash
# Setup script fuer die Nutzung der fancy-LaTeX Umgebung oder
# der Label-Print erweiterung (lp) in LX-Office-erp.
# Welches Setup ist von der Position innerhalb des Dateisystems abhaengig.
# Das Script kann auch nach erfolgtem Setup erneut aufgerufen werden
# see ./setup.sh -h
# Revision 0.2 (13.02.2011) add lp
# setup add determination of company data
# Revision 0.1 (19.12.2010) initial script create
# config
DB_AUTH='../../config/lx_office.conf'
FILE_LIST_FTEX='
letter.tex
sample.lco
sample_head.pdf
translations.tex
xstring.sty
zwischensumme.sty
'
FILE_LIST_LP='
label_abs_a7_de.tex
label_nn_brief_a4_de.tex
zweckform_3427.tdf
zweckform_3483.tdf
'
DOC_TYPE_FTEX='
invoice
proforma
sales_quotation
sales_order
sales_delivery_order
credit_note
pick_list
purchase_order
'
LXO_DETERMINE='
../../SL/Form.pm
../../config/lx_office.conf.default
../../doc/changelog
'
CHK_RAWNUMBER_PATCH='
../../SL/DO.pm
../../SL/IS.pm
../../SL/OE.pm
'
MY_DATA='
employeecountry
labelcompanyname
labelbankname
labelbankcode
labelbankaccount
MYfromname
MYaddrsecrow
MYrechtsform
MYfromaddress
MYfromphone
MYfromfax
MYfromemail
MYsignature
MYustid
MYfrombank
'
BASE_DIR=`readlink -f $0 | sed 's/setup\.sh$//'`
MODUL=`basename ${BASE_DIR}`
export TEXINPUTS=".:${BASE_DIR}:"
OK='...... [ok]'
MARK='\033[1;34m'
UNMARK='\033[0m'
TIME=`date +%s`
USAGE="\n\n setup LaTeX templates for lx-office erp (www.lx-office.org)
\n\n USAGE: ./`basename $0` [OPTION] \n
\n
-h print this Help\n
\n
\n
OPTIONS for trouble shooting:\n\n
-D don't connect to any database\n
-C no colored output (don't use any terminal escape character)\n
\n\n
RECOMMENDED USE ./setup.sh
\n
"
# script control
DATABASE=1
while getopts "hDC" flag
do
case $flag in
h)
echo -e ${USAGE}
exit
;;
D)
DATABASE=0
;;
C)
NO_COLOR=1
;;
esac
done
# Disclaim
cat << EOD
##########################################################################
# Disclaimer #
##########################################################################
# #
# Dies ist ein Script zum Einrichten von LaTeX Templates #
# (fancy-latex (f-tex)) oder (label-print (lp) fuer #
# #
# lx-office erp (www.lx-erp.org) #
# #
# Obwohl LX-Office sich an deutschsprachige Anwender richtet ist dieses #
# Script in Englisch und soll auch nicht uebersetzt werden. #
# #
# * es richtet sich an System-Administratoren #
# * da es das Script nur in einer Sprache gibt, ist es viel leichter #
# bei Fehlern und Fehlermeldungen aus dem Script selbst, im Internet #
# nach Loesungen zu suchen. #
# #
##########################################################################
# #
# This script provides an easy to use setup for the fancy LaTeX #
# environment of lx-office erp (templates/f-tex) #
# #
# Normal use is to run ./setup.sh without any parameter. You may also #
# check #
# ./setup.sh -h #
# for help. #
# #
# The script tries to be as save as possible to avoid unwanted file #
# overwriting by being very interactive. It's designed to be invoked #
# multiple times inside the same template directory. So it is possible #
# to rerun the script if there are updates available or after you break #
# your LaTeX templates by any changes. #
# #
# I recommend to backup your installation and database before you run #
# this script. #
# #
# ANYHOW: I do not take responsibility for any harm initiated by this #
# script. (Wulf Coulmann -- scripts_at_gpl.coulmann.de) #
# #
##########################################################################
EOD
QUESTION=' I understand the above warnings [YES/NO/Q]:'
echo -n "${QUESTION} "
[ "${NO_COLOR}" = 1 ] || echo -ne ${MARK}
read ANSWER
[ "${NO_COLOR}" = 1 ] || echo -ne "${UNMARK}"
until [ "${ANSWER}" = YES ]\
|| [ "${ANSWER}" = NO ] \
|| [ "${ANSWER}" = N ] \
|| [ "${ANSWER}" = n ] \
|| [ "${ANSWER}" = q ] \
|| [ "${ANSWER}" = Q ] ; do
echo -n "${QUESTION} "
[ "${NO_COLOR}" = 1 ] || echo -ne ${MARK}
read ANSWER
[ "${NO_COLOR}" = 1 ] || echo -ne "${UNMARK}"
done
case ${ANSWER} in
YES)
echo -n ' accepted'
;;
NO|n|N|q|Q)
echo
echo ' script aborted by user input'
exit 72
;;
esac
FEEDBACK='################################\n # FEEDBACK:\n
'
# load functions
function error {
echo '[error]' ...... $1 ...... '[terminate script]'
exit 72
}
function mark {
[ "${NO_COLOR}" = 1 ] || echo -ne "${MARK}"
echo -n "${1}"
[ "${NO_COLOR}" = 1 ] || echo -ne "${UNMARK}"
}
function ask_yn {
local QUESTION=$1
until [ "${ANSWER}" = y ]\
|| [ "${ANSWER}" = Y ] \
|| [ "${ANSWER}" = j ] \
|| [ "${ANSWER}" = J ] \
|| [ "${ANSWER}" = n ] \
|| [ "${ANSWER}" = N ] \
|| [ "${ANSWER}" = Q ] \
|| [ "${ANSWER}" = q ] ; do
echo -n "${QUESTION}"
read ANSWER
done
case ${ANSWER} in
y|Y|j|J)
return
;;
n|N)
return
;;
q|Q)
[ "${NO_COLOR}" = 1 ] || echo -ne "${UNMARK}"
echo
echo ' script aborted by user input'
exit 72
;;
esac
}
function latex_pack_check {
echo ' -> search LaTeX package '$1' '
echo -n ' '
if [ ! `kpsewhich ${1}.sty` ] ; then
echo
echo " can't find package ${1}"
echo " on debian systems you may install apt-file"
echo " aptitude install apt-file"
echo " apt-file update"
echo " apt-file search ${1}.sty"
echo " this will show which package contains the needet LaTeX .sty file"
echo " on other systems, please refer to their documentation on how to "
echo " find matching packages."
echo
echo " If you are done, rerun this script"
echo " [unsatisfied dependencies]' ...... ${1} ...... [terminate script]"
exit 72
else
echo \ \ ${OK}
fi
}
function check_accepted_names {
echo ' -> check for suspect characters in '${2}
echo -n ${1} | egrep '[^-_\.!A-Za-z0-9]' && echo ' [suspect characters found] in ... '${2}' ... [terminate script]' && exit 72
}
function check_int {
echo ' -> check for suspect characters in '${2}
echo -n ${1} | egrep '[^0-9]' && echo ' [suspect characters found] in ... '${2}' ... [terminate script]' && exit 72
}
function create_file {
ANSWER=0
if [ "${1}" = ln ] ;then
DO=1
echo -n ' -> try to create symbolic link '${3}
if [ -e "${3}" ] ; then
if [ -L "${3}" ] ; then
if [ "`ls -l ${3} | awk '{print $10}'`" = "${2}" ]; then
echo ' ... symbolic link already exists, nothing to do!'
DO=0
else
echo ' ... symbolic link with different target exist!'
ls -lah "${3}"
echo ' you may'
echo ' [d] delete and replace the current link'
echo ' [m] move current link to '${3}.${TIME}.old
echo ' [s] skip -- leave it as it is'
echo ' [q] abort setup.sh'
QUESTION=' what do do? [d/m/s/q]: '
echo -en ${QUESTION}
[ "${NO_COLOR}" = 1 ] || echo -ne ${MARK}
read ANSWER
[ "${NO_COLOR}" = 1 ] || echo -ne ${UNMARK}
until [ "${ANSWER}" = D ] \
|| [ "${ANSWER}" = d ] \
|| [ "${ANSWER}" = m ] \
|| [ "${ANSWER}" = s ] \
|| [ "${ANSWER}" = q ] ; do
echo -n "${QUESTION}"
read ANSWER
done
case ${ANSWER} in
d)
rm -f ${3} || error ' unable to delete symbolic link '${3}
;;
m)
mv -f ${3} ${3}.${TIME}.old || error ' unable to move symbolic link '${3}
;;
s)
echo ' as you decide, we leave it as it is!'
DO=0
;;
q)
[ "${NO_COLOR}" = 1 ] || echo -ne "${UNMARK}"
echo
echo ' script aborted by user input'
exit 72
;;
esac
fi
else
echo ' ... file already exists where I tried to create a symbolic link!'
ls -lah "${3}"
echo ' you may'
echo ' [S] show the file (exit file display with "q")'
echo ' [m] move current file to '${3}.${TIME}.old
echo ' [d] delete and replace the file with symbolic link'
echo ' [s] skip -- leave it as it is'
echo ' [q] abort setup.sh'
QUESTION='what to do? [S/d/m/s/q]:'
echo -en " ${QUESTION} "
[ "${NO_COLOR}" = 1 ] || echo -ne ${MARK}
read ANSWER
[ "${NO_COLOR}" = 1 ] || echo -ne ${UNMARK}
until [ "${ANSWER}" = S ] \
|| [ "${ANSWER}" = d ] \
|| [ "${ANSWER}" = m ] \
|| [ "${ANSWER}" = s ] \
|| [ "${ANSWER}" = q ] ; do
echo -n " ${QUESTION} "
read ANSWER
done
case ${ANSWER} in
S)
echo
echo
less "${3}"
echo
echo
create_file "${1}" "${2}" "${3}"
return
;;
m)
mv -f ${3} ${3}.${TIME}.old || error ' unable to move file '${3}
;;
d)
rm -f ${3} || error ' unable to delete file '${3}
;;
s)
echo ' as you decide, we leave it as it is!'
DO=0
;;
q)
[ "${NO_COLOR}" = 1 ] || echo -ne "${UNMARK}"
echo
echo ' script aborted by user input'
exit 72
;;
esac
fi
fi
if [ "${DO}" = "1" ] ;then ln -s "${2}" "${3}" || error ' failed to create symbolic link '${3} ; fi
[ "${DO}" = "1" ] && echo \ \ ${OK}
fi
if [ "${1}" = cp ] ;then
echo -n ' -> try to copy file '${3}
DO=1
if [ -e "${3}" ] ; then
echo ' ... file already exists!'
diff "${2}" "${3}" >/dev/null
if [ "$?" = 0 ] ; then
echo ' files are equal, we leave it as it is!'
DO=0
else
ls -lah "${3}"
echo ' you may'
echo ' [D] show a diff between the new and current file'
echo ' [m] move current file to '${3}.${TIME}.old
echo ' [d] delete and replace with new file'
echo ' [s] skip -- leave it as it is'
echo ' [q] abort setup.sh'
QUESTION='what to do? [D/m/d/s/q]:'
echo -en " ${QUESTION} "
[ "${NO_COLOR}" = 1 ] || echo -ne ${MARK}
read ANSWER
[ "${NO_COLOR}" = 1 ] || echo -ne ${UNMARK}
until [ "${ANSWER}" = D ] \
|| [ "${ANSWER}" = d ] \
|| [ "${ANSWER}" = m ] \
|| [ "${ANSWER}" = s ] \
|| [ "${ANSWER}" = q ] ; do
echo -n " ${QUESTION} "
read ANSWER
done
case ${ANSWER} in
D)
echo
echo
[ "${NO_COLOR}" = 1 ] || echo -ne ${MARK}
echo '---------------------------------------'
[ "${NO_COLOR}" = 1 ] || echo -ne ${UNMARK}
diff -C 3 "${2}" "${3}"
[ "${NO_COLOR}" = 1 ] || echo -ne ${MARK}
echo '---------------------------------------'
[ "${NO_COLOR}" = 1 ] || echo -ne ${UNMARK}
echo
echo
create_file "${1}" "${2}" "${3}"
;;
m)
mv -f ${3} ${3}.${TIME}.old || error ' unable to move file '${3}
;;
d)
rm -f ${3} || error ' unable to delete file '${3}
;;
s)
echo ' as you decide, we leave it as it is!'
DO=0
;;
q)
[ "${NO_COLOR}" = 1 ] || echo -ne "${UNMARK}"
echo
echo ' script aborted by user input'
exit 72
;;
esac
fi
fi
if [ "${DO}" = "1" ] ;then cp "${2}" "${3}" || error ' failed to copy '${3} ; fi
[ "${DO}" = "1" ] && echo \ \ ${OK}
fi
}
function create_mydata {
... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.

Auch abrufbar als: Unified diff