% \iffalse meta-comment % Droits d'auteur : % - Maïeul Rouquette 2011-2014 % - Joël Gombin 2014 % Licence Creative Commons - Paternité -Partage des Conditions Initiales à l'identique % http://creativecommons.org/licenses/by-sa/2.0/fr/ % \fi % \iffalse %<*driver> \ProvidesFile{facture.dtx} \documentclass{ltxdoc} \usepackage{fontspec} \usepackage{xunicode} \usepackage[frenchb]{babel} \usepackage{hyperref} \usepackage{csquotes} \usepackage{bidi} % Pour l'impression du changement \makeatletter \def\glossary@prologue{% \section{Historique des changements}% } \makeatother \EnableCrossrefs \RecordChanges % Pour les renvois internes \newcommand{\renvoi}[1]{voir section~\ref{#1} p.~\pageref{#1}} \begin{document} \raggedbottom \DocInput{facture.dtx} \end{document} % %\fi % \CheckSum{527} % \changes{v1.0}{2011/09/10}{Première version} % \changes{v1.1}{2014/09/16}{Laisser le choix de la marge à l'utilisateur} % \changes{v1.1}{2014/09/16}{Possibilité de modifier la taille du tableau.} % \changes{v1.2}{2015/01/16}{Possibilité de produire des factures sans la colonne remise.} % \def\filedate{16/01/2015} % \def\fileversion{1.2} % \date{\filedate} % \title{La class \textsf{facture}\thanks{Ce document correspond à la version~\fileversion de \textsf{facture} datée du \filedate.}} %\author{Maïeul Rouquette et Joël Gombin} %\maketitle %\begin{abstract} %Cette classe permet de rédiger factures et devis, avec ou sans TVA, en calculant automatiquement les sommes. % % Elle fonctionne avec \XeLaTeX{} et non pas \LaTeX{}. % % Elle est sous licence Creative Commons - Paternité - Partage des Conditions Initiales à l'identique\footnote{\url{http://creativecommons.org/licenses/by-sa/2.0/fr/}.}. % % Pour tout demande de corrections ou d'améliorations, merci d'ouvrir un ticket sur Github : \url{https://github.com/maieul/facture/issues}. %\end{abstract} %\tableofcontents %\section{Chargement et configuration}\label{meta} %\subsection{Avec ou sans TVA ?}\label{TVA} % La classe se charge comme toutes les classes. Une option \verb|sansTVA| permet de produire des factures sans gestion de la TVA. Typiquement pour des auto-entrepreneurs. % Ainsi : %\begin{verbatim} %\documentclass[sansTVA]{facture} %\end{verbatim} % % Permet de générer une facture sans gestion de la TVA. À contrario, %\begin{verbatim} %\documentclass{facture} %\end{verbatim} % % Permet de générer une facture avec TVA. Celle-ci est définie par défaut à 19,6~\%, mais il est possible de modifier le taux, grâce à la commande \DescribeMacro{\TVAdefaut}\cmd{\TVAdefaut}\marg{taux}. Par exemple pour avoir un taux de 5,5~\% : %\begin{verbatim} %\TVAdefaut{5,5} %\end{verbatim} % \subsection{Avec ou sans remise ?}\label{remise} % Une option \verb|sansremise| permet de produire des factures sans gestion des remises. %\subsection{Information sur document} %Cette classe permet de fabriquer des factures et des devis. Par défaut, elle fabrique des factures. La commande \DescribeMacro{\type}\cmd{\type}\marg{type} permet d'indiquer si on souhaite fabriquer une facture ou autre chose : %\begin{verbatim} %\type{Devis} %\end{verbatim} % % À noter que \meta{type} peut prendre n'importe quelle valeur. % % Le document peut avoir un numéro, défini par la commande \DescribeMacro{\numero}\cmd{\numero}\marg{numero}. % % Le document est automatiquement daté du jour de la compilation. Toutefois on peut utiliser la commande \DescribeMacro{\date}\cmd{\date}\marg{JJ/MM/AAAA} pour spécifier une date. Il est possible d'indiquer une date limite de paiement via la commande \DescribeMacro{\datelimite}\cmd{\datelimite}\marg{nbjours}. La date limite est calculée en ajoutant \meta{nbjours} à la date du document. %\subsection{Information sur l'émetteur} % La commande \DescribeMacro{\nomemet}\cmd{\nomemet}\marg{texte} permet d'indiquer le nom de l'émetteur, qui apparaîtra dans l'entête\footnote{On se reportera au fichier \href{exemple.pdf}{exemple} pour des … exemples}. Pour indiquer son adresse, qui apparaîtra dans l'entête mais à droite, on utilise \DescribeMacro{\adresseemet}\cmd{\adresseemet}\marg{texte}. On indique les retours à la ligne par \verb|\\|. % % Il existe également une commande \DescribeMacro{\pied}\cmd{\pied}\marg{texte} qui provoque l'affichage de \meta{texte} à droite du pied de page, sur toutes les pages. % %\subsection{Information sur le destinataire}%\label{dest} % Le destinataire peut avoir deux adresses : une adresse de livraison et une de facturation. Seule la première est obligatoire. Si la seconde est absente, la classe considère qu'il s'agit de la même adresse. À la différence de l'émetteur, le nom du destinataire s'indique en même temps que l'adresse. % %L'adresse de livraison se définie via la commande \DescribeMacro{\dest}\cmd{\dest}\marg{adresse}, l'adresse de facturation via \DescribeMacro{\fact}\marg{adresse}. Encore une fois, les différentes lignes de l'adresse doivent être séparées par \verb|\\|. % % Il est possible d'affecter un code au client, via la commande \DescribeMacro{\codeclient}\cmd{\codeclient}\marg{code}. %\subsection{Affichage des méta-données} %Toutes ces méta-données, à l'exception du taux de TVA et du pied de page sont affichées dans une zolie présentation avec la commande. \DescribeMacro{\entete}\cmd{\entete}. %\section{Insertion de texte} % La classe étant dérivée de la classe \emph{article}, il est possible d'insérer du texte sectionnable avec les commandes de \emph{article}. Il n'y a pas d'endroit obligatoire pour l'afficher. %\section{Insertion de la facture} % Une facture est constituée de lignes indiquant les prix et quantités des différents produits. Chaque ligne s'appelle au sein de l'environnement \DescribeEnv{facture}\emph{facture}, via la commande \DescribeMacro{\ligne}\cmd{\ligne}\marg{produit}\oarg{quantité}\marg{prix unitaire HT}\oarg{remise}\oarg{taux de TVA}. % %\meta{produit} est le nom du produit. %\meta{quantité} est la quantité souhaitée. Le nombre peut être entier ou décimal. En l'absence de cet argument, on suppose que le produit n'est présent qu'une fois. %\meta{prix unitaire HT} n'est pas à décrire. %\meta{remise} s'applique sur le prix total HT. %\meta{taux de TVA}: si un produit n'a pas le même taux que celui par défaut (\renvoi{TVA}), cet argument permet d'indiquer le taux. Il est exprimé en pourcentage, mais sans le signe \%. % % %Tout les nombres décimaux s'expriment en utilisant la virgule, même si l'usage du point fonctionne également. % % La commande se charge automatiquement de calculer et d'afficher le prix total HT, la TVA et le prix total TTC. % Le total des produits est affiché avec la fermeture de l'environnement \emph{facture}. Exemple (voir le fichier \href{exemple.pdf}{exemple.pdf} pour le résultat): %\begin{verbatim} %\begin{facture} %\ligne{Produit 1}[2]{25} %\ligne{Produit 2}{10}[2] %\end{facture} %\end{verbatim} % % Dans le cas où l'option \verb|sansTVA| (\renvoi{TVA}) a été passée lors de l'appel à la classe, les colonnes ne sont pas les mêmes. Exemple (voir le fichier \href{exemplesansTVA.pdf}{exemplesansTVA.pdf} pour le résultat): %\begin{verbatim} %\begin{facture} %\ligne{Produit 1}[2]{25} %\ligne{Produit 2}{10}[][2] %\end{facture} %\end{verbatim} % % Si l'option \verb|sansremise| a été passée lors de l'appel à la classe, le quatrième argument de la colonne correspond au taux de TVA. %\subsection{Texte en dessous des totaux} % Dans le cas d'une facture sans TVA, l'environnement \emph{facture} indique le texte \enquote{TVA non applicable, art. 293 B}. Il est possible de modifier ce texte, ou d'en ajouter un pour les documents avec TVA, en redéclarant la commande \DescribeMacro{\postTotaux}\cmd{\postTotaux}\marg{texte}. %\begin{verbatim} %\renewcommand{\postTotaux}{\hfill un joli texte} %\end{verbatim} %\section{Personnalisation} % Plusieurs possibilités de personnalisation existent, en redéfinissant des commandes et/ou des couleurs. J'invite à lire le code pour savoir lesquels. %\begin{itemize} %\item Pour les couleurs, les traits et les mise en valeurs des textes, \renvoi{apparence}. %\item Pour les réglages concernant les mathématiques (arrondis par exemple), \renvoi{math}. %\item Pour les textes, \renvoi{texte}. %\item Pour le pieds de page, \renvoi{pied}. %\item Pour l'affichage de la TVA, \renvoi{afficheTVA}. %\item Pour la largeur des colonnes du tableau, \renvoi{largeurCols}. %\end{itemize} % %Pour personnaliser la taille du papier et celle des marges, on peut utiliser le package \emph{geometry}. %\StopEventually{} %\appendix% %\section{Documentation du code} %\subsection{Chargement des packages} %<*facture> % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesClass{facture}[16/01/2015 v1.2] \LoadClass[a4paper]{article}%On se base sur la classe article \RequirePackage{fontspec} \RequirePackage{xunicode} \RequirePackage{polyglossia} \setmainlanguage{french} \RequirePackage{numprint}%Pour gérer l'affichage des nombres \RequirePackage{fltpoint}% Pour faire les calculs dans le tableau \RequirePackage{tikz} % tikz est utilisé pour tracer des boites, par exemple \RequirePackage{graphicx} % Pour insérer des images. Utiliser le format jpg pour plus de simplicité. \RequirePackage{fancyhdr} % Pour entête et pied de page \RequirePackage{array} \RequirePackage{longtable} \RequirePackage{colortbl} \RequirePackage{advdate}%Pour manipuler les dates \RequirePackage{xargs}%Pour des arguments conditionnels % \end{macrocode} %\subsection{Option sansreduction} % \begin{macrocode} \newif\ifsansreduction \DeclareOption{sansreduction}{\sansreductiontrue} % \end{macrocode} %\subsection{Option sansTVA} % \begin{macrocode} \newif\ifsansTVA \DeclareOption{sansTVA}{\sansTVAtrue} % \end{macrocode} %\subsection{Option sansremise} % \begin{macrocode} \newif\ifsansremise \DeclareOption{sansremise}{\sansremisetrue} % \end{macrocode} %\subsection{Exécution des options} % \begin{macrocode} \ProcessOptions % \end{macrocode} %\subsection{Apparence}\label{apparence} % On définit ici les couleurs, l'écartement des colonnes, et l'apparences des libellés. % \begin{macrocode} \definecolor{entetes}{HTML}{888888} \definecolor{encadre}{RGB}{111,111,111} \newcommand{\libelle}[1]{\textcolor{entetes}{\textbf#1}} \setlength{\tabcolsep}{1pt} \newlength{\epaisseurcadre} \setlength{\epaisseurcadre}{1.5mm} % \end{macrocode} %\subsection{Textes}\label{texte} %\subsubsection{Invariants} % \begin{macrocode} \newcommand{\codeclient}{Code client :} \newcommand{\datetxt}{Date:} \newcommand{\datelimitetxt}{À payer avant:} \newcommand{\facturation}{Facturation} \newcommand{\facturetxt}{Facture} \newcommand{\livraison}{Livraison} \newcommand{\livraisonfacturation}{Livraison et Facturation} \newcommand{\ntxt}{~n°} \newcommand{\produit}{Produit} \newcommand{\quantite}{Quantité} \newcommand{\remise}{Remise} \newcommand{\unite}{€} % \end{macrocode} %\subsubsection{Dépend du réglage sur la TVA (\renvoi{TVA})} % \begin{macrocode} \ifsansTVA% \newcommand{\tottxt}{Total} \newcommand{\prixtxt}{Prix} \newcommand{\postTotaux}{\hfill TVA non applicable, art. 293 B} \else% \newcommand{\prixHT}{Prix HT} \newcommand{\TVAtxt}{TVA} \newcommand{\prixTTC}{Prix TTC} \newcommand{\totHTtxt}{Total HT} \newcommand{\totTVAtxt}{Total TVA} \newcommand{\totTTCtxt}{Total TTC} \newcommand{\postTotaux}{} \fi % \end{macrocode} %\subsection{Largeur des colonnes}\label{largeurCols} % On peut redéfinir les commandes ci-dessous pour modifier la largeur des commandes. Attention à ne pas dépasser un total de 1\cmd{\textwidth} ! % \begin{macrocode} \newcommand{\largeurDescriptif}{0.2\textwidth} \newcommand{\largeurChiffres}{0.2\textwidth} \newcommand{\largeurChiffresAvecTVA}{0.1\textwidth} % \end{macrocode} % %\subsection{Réglages mathématiques}\label{math} %On régle ici les paramètres mathématiques, définissables avec le package \emph{numprint}. % Tout d'abord on dit qu'on veut avoir les zéros finaux. % \begin{macrocode} \npaddmissingzero % \end{macrocode} % Puis on dit qu'on arrondit à deux chiffres après la virgule. % \begin{macrocode} \nprounddigits{2} % \end{macrocode} %\subsection{Quelques réglages standards} % Ici on régle la TVA par défaut et le type de document % \begin{macrocode} \def\@TVAdefaut{19,6} \def\@type{\facturetxt} % \end{macrocode} %\subsection{Méta-données} %Toutes ces commandes sont appelées par l'utilisateurs au tout début (\renvoi{meta}). La plupart stockent dans une commande commençant par @ le code qui est passé. % \begin{macrocode} \renewcommand{\date}[1]{\SetDate[#1]} \newcommand{\TVAdefaut}[1]{\def\@TVAdefaut{#1}} \newcommand{\datelimite}[1]{\def\@datelimite{#1}} \newcommand{\dest}[1]{\def\@dest{#1}} \newcommand{\fact}[1]{\def\@fact{#1}} \newcommand{\adresseemet}[1]{\def\@adresseemet{#1}} \newcommand{\nomemet}[1]{\def\@nomemet{#1}} \newcommand{\type}[1]{\def\@type{#1}} \newcommand{\numero}[1]{\def\@numero{#1}} \newcommand{\codedest}[1]{\def\@codedest{#1}} % \end{macrocode} %\subsection{Génération de l'entête} % On se base sur le package \emph{TikZ} pour le générer. % % Tout d'abord afficher le nom et l'adresse de l'émetteur % \begin{macrocode} \newcommand{\entete}{ \noindent\begin{tikzpicture} \noindent\node [font=\bf\Huge,text width=0.5\textwidth,text=entetes,text centered]{% \@nomemet% }; \noindent\node (b)[xshift=0.5\textwidth,text width=0.5\textwidth, right]{% \@adresseemet% }; % \end{macrocode} % %Ensuite déterminer la place que cela prend, puis tracer l'encadré. % \begin{macrocode} \coordinate[xshift=-1\textwidth,yshift=1ex] (a) at (b.north); \coordinate[xshift=1em,yshift=-1ex] (c) at (b.south); \draw[color=encadre,line width=\epaisseurcadre] (a) rectangle (c); \end{tikzpicture} % \end{macrocode} % %Ensuite afficher le titre, avec un peu d'espace avant et après, en le chassant à droite. % \begin{macrocode} \vspace{3ex} \begin{flushright} {\Huge\libelle{\@type}} \end{flushright} \vspace{3ex} \begin{tikzpicture} % \end{macrocode} % %Ensuite afficher les informations sur le destinataire. Des tests permettent d'afficher ou non la livraison séparement de la facture, en fonction de ce qu'a défini l'utilisateur (\renvoi{dest}). % \begin{macrocode} \ifdef{\@fact}{ \node[text width=0.33\textwidth,anchor=base]{ \libelle{\facturation} \@fact }; }{} \node[xshift=0.33\textwidth,text width=0.33\textwidth,anchor=base]{\ifdef{\@fact}{ \libelle{\livraison}} {\libelle{\livraisonfacturation}} \@dest }; % \end{macrocode} % % On affiche finalement les dates, le numéro de la facture et le code client. % \begin{macrocode} \node[text width=0.33\textwidth,xshift=0.66\textwidth,anchor=base]{ \libelle{{\datetxt}} \today \\ \ifdef{\@numero}{% \libelle{{\@type\ntxt}} \@numero }{} \\ \ifdef{\@codedest}{% \libelle{{\codeclient}} \@codedest }{} \ifdef{\@datelimite}{\\\AdvanceDate[\@datelimite]\libelle{{\datelimitetxt}} \today}{} }; \end{tikzpicture} } % \end{macrocode} %\subsection{Le tableau de facturation} % On commence par définir des variables globales qui servent à stocker les totaux généraux % \begin{macrocode} \ifsansTVA \xdef\tot{} \else \xdef\totTVA{} \xdef\totHT{} \xdef\totTTC{} \fi % \end{macrocode} % %On définit ensuite un nouveau type de colonne, avec un alignement à droite % \begin{macrocode} \newcolumntype{P}[1]{>{\raggedleft}p{#1}} % \end{macrocode} %On définit ensuite l'environnement \emph{facture}. %\begin{environment}{facture} % Tout d'abord on affiche l'entête, selon qu'on soit avec ou sans TVA % \begin{macrocode} \newenvironment{facture}{% \setlength{\extrarowheight}{0.5ex} \setlength{\tabcolsep}{0.5em} \arrayrulecolor{encadre} \ifsansTVA% \ifsansremise% \begin{longtable}{% |p{\largeurDescriptif}%Descriptif |P{\largeurChiffres}%Qt |P{\largeurChiffres}%Prix |P{\largeurChiffres}|%Total }% \hline% \rowcolor{entetes}% \centering\textbf\produit &% \centering\textbf\quantite &% \centering\textbf\prixtxt &% \centering\textbf\tottxt% \tabularnewline[1ex]% \else% \begin{longtable}{% |p{\largeurDescriptif}%Descriptif |P{\largeurChiffres}%Qt |P{\largeurChiffres}%Prix |P{\largeurChiffres}%Remise |P{\largeurChiffres}|%Total }% \hline% \rowcolor{entetes}% \centering\textbf\produit &% \centering\textbf\quantite &% \centering\textbf\prixtxt &% \centering\textbf\remise &% \centering\textbf\tottxt% \tabularnewline[1ex]% \fi% \else% \ifsansremise% \begin{longtable}{% |p{\largeurDescriptif}|%Descriptif P{\largeurChiffresAvecTVA}|%Qt P{\largeurChiffresAvecTVA}|%HT unitaire P{\largeurChiffresAvecTVA}|%Totalht P{\largeurChiffresAvecTVA}|%TVA P{\largeurChiffresAvecTVA}|%Total TTC }% \hline% \rowcolor{entetes} \centering\textbf\produit &% \centering\textbf\quantite &% \centering\textbf\prixHT &% \centering\textbf\totHTtxt &% \centering\textbf\TVAtxt &% \textbf\prixTTC \tabularnewline[1ex]% \else% \begin{longtable}{% |p{\largeurDescriptif}|%Descriptif P{\largeurChiffresAvecTVA}|%Qt P{\largeurChiffresAvecTVA}|%HT unitaire P{\largeurChiffresAvecTVA}|%Remise P{\largeurChiffresAvecTVA}|%Totalht P{\largeurChiffresAvecTVA}|%TVA P{\largeurChiffresAvecTVA}|%Total TTC }% \hline% \rowcolor{entetes} \centering\textbf\produit &% \centering\textbf\quantite &% \centering\textbf\prixHT &% \centering\textbf\remise &% \centering\textbf\totHTtxt &% \centering\textbf\TVAtxt &% \textbf\prixTTC \tabularnewline[1ex]% \fi% \fi% \endhead% \endfoot% }% % \end{macrocode} %Le contenu du tableau est généré par les commandes \cmd{\ligne}. Lorsqu'on ferme l'environnement \emph{facture}, on ferme le tableau % \begin{macrocode} {% \end{longtable} % \end{macrocode} %On affiche ensuite les totaux, qu'on place grâce à \emph{TikZ}. Le cercle de 0,001 de diamètre sert à faire prendre à la figure beamer le plus de place possible, pour que les textes soient alignés à droite. % \begin{macrocode} \begin{tikzpicture} \draw[color=white] (0,0) circle (0.001); \node[right,xshift=0.66\textwidth,text width=0.33\textwidth]{% \ifsansTVA% \hfill \libelle{\tottxt:} \numprint[\unite]{\tot}\\% \else% \libelle{\totHTtxt:}\hfill \numprint[\unite]{\totHT} \\% \libelle{\totTVAtxt:}\hfill \numprint[\unite]{\totTVA} \\% \libelle{\totTTCtxt:}\hfill \numprint[\unite]{\totTTC} \\ \fi \postTotaux}; \end{tikzpicture} } % \end{macrocode} %\end{environment} % On a besoin de définir une commande \cmd{\lignesansTVA} pour afficher le contenu d'une ligne lorsqu'on n'a pas de TVA. % \begin{macrocode} \newcommand{\lignesansTVA}[5]{ #1 & #2 & #3 & \unless\ifsansremise #4 & \fi #5 \tabularnewline[1ex]} % \end{macrocode} % La commande \cmd{\afficheTVA} sert à afficher la TVA dans le tableau. En ne l'indiquant pas directement dans le code de \cmd{\ligne}, on permet de personnaliser plus facilement l'affichage de la TVA. \label{afficheTVA} % \begin{macrocode} \newcommand{\afficheTVA}[1]{\raggedleft{\numprint[\%]{#1}} \hfill $\triangleright$ \numprint[\unite]{\TVA}} % \end{macrocode} % % Voici maintenant la commande \cmd{\ligne}. Pour gérer les arguments optionnels, on se sert du package \emph{xargs}. % \begin{macrocode} \newcommandx{\ligne}[5][2=1,5=\@TVAdefaut,4=0,usedefault]{% % \end{macrocode} % On procède aux calculs grâce au package \emph{fltpoint}, on affiche les résultat grâce au package \emph{numprint}. % \begin{macrocode} \ifsansTVA \fpMul{\prix}{#3}{#2}% \fpSub{\prix}{\prix}{#4}% \fpAdd{\tot}{\prix}{\tot}% \xdef\tot{\tot}% \xdef\prix{\prix}% %Affichage \lignesansTVA{#1}{#2}{\numprint[\unite]{#3}}{\numprint[\unite]{#4}}{\numprint[\unite]{\prix}}% \else % Prix hors taxe \fpMul{\HT}{#3}{#2}% \unless\ifsansremise% \fpSub{\HT}{\HT}{#4}% \fi% \xdef\HT{\HT}%retenons \fpAdd{\totHT}{\totHT}{\HT}% \xdef\totHT{\totHT}% % Calcul de la TVA \ifsansremise% \fpDiv{\centieme}{#4}{100}% \else% \fpDiv{\centieme}{#5}{100}% \fi \fpMul{\TVA}{\centieme}{\HT}% \xdef\TVA{\TVA}%retenons \fpAdd{\totTVA}{\totTVA}{\TVA}% \xdef\totTVA{\totTVA}% % Prix TTC \fpAdd{\TTC}{\HT}{\TVA}% \xdef\TTC{\TTC}% \fpAdd{\totTTC}{\totTTC}{\TTC}% \xdef\totTTC{\totTTC}% % Affichage #1 & #2 & \numprint[\unite]{#3} & \unless\ifsansremise \numprint[\unite]{#4} & \fi \numprint[\unite]{\HT} & \afficheTVA{#5} & \numprint[\unite]{\TTC} \tabularnewline[1ex]% \fi \hline } % \end{macrocode} %\subsection{Apparence du pied}\label{pied} %On se base sur le package \emph{fancyhdr} pour personnaliser le pied. % \begin{macrocode} \AtBeginDocument{ \pagestyle{fancy} \fancyhf{} \renewcommand{\headrule}{}%Pas de règle après l'entête \lfoot{\ifnum \value{page}>1 \thepage\fi}%Indiquer le numéro de page, sauf sur la première \rfoot{\@pied} } \newcommand{\pied}[1]{\def\@pied{#1}}%Le pied définissable par l'utilisateur % \end{macrocode} % % \PrintChanges %\Finale %\endinput