% \iffalse meta-comment
% Droits d'auteur : Maïeul Rouquette 2011-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}
\EnableCrossrefs
\RecordChanges
\begin{document}
   \raggedbottom
  \DocInput{facture.dtx}
\end{document}
%</driver>
%\fi
% \CheckSum{453}
% \changes{v1.0}{2011/09/10}{Première version}
% \changes{v.1.1}{2011/09/13}{Laisser le choix de la marge à l'utilisateur}
% \GetFileInfo{facture.dtx}
%\changes{v1.1.2}{2014/09/16}{Possibilité de modifier la taille du tableau.}
% \title{La class \textsf{facture}\thanks{Ce document correspond à la version~1.2 de \textsf{facture},    datée du~16/09/2014.}}
%\author{Maïeul Rouquette}
%\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{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 (\emph{cf}.~section~\ref{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| (\emph{cf}. section~\ref{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}
%\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, voir section~\ref{apparence}.
%\item Pour les réglages concernant les mathématiques (arrondis par exemple), voir section~\ref{math}.
%\item Pour les textes, voir section~\ref{texte}.
%\item Pour le pieds de page, voir section~\ref{pied}.
%\item Pour l'affichage de la TVA, voir section~\ref{afficheTVA} p.~\pageref{afficheTVA}
%\item Pour la largeur des colonnes du tableau, voir section~\ref{largeurCols}.
%\end{itemize}
%
%Pour personnaliser la taille du papier et celle des marges, on peut utiliser le package \emph{geometry}.
%\StopEventually{}
%\section{Documentation du code}
%\subsection{Chargement des packages}
%<*facture>
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{facture}[2011/09/10 v1.0]
\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 sansTVA}
%    \begin{macrocode}
\newif\ifsansTVA
\sansTVAfalse
\DeclareOption{sansTVA}{\sansTVAtrue}
\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 (\emph{cf}.~section~\ref{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 (\emph{cf}.~section~\ref{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 (\emph{cf}.~section~\ref{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%    
        \begin{longtable}{|p{\largeurDescriptif}|P{\largeurChiffres}|P{\largeurChiffres}|P{\largeurChiffres}|P{\largeurChiffres}|}%
        \hline%    
        \rowcolor{entetes}\centering\textbf\produit & \centering\textbf\quantite   & \centering\textbf\prixtxt & \centering\textbf\remise & \centering\textbf\tottxt  \tabularnewline[1ex]%
    \else%        
        \begin{longtable}{|p{\largeurDescriptif}|P{\largeurChiffresAvecTVA}|P{\largeurChiffresAvecTVA}|P{\largeurChiffresAvecTVA}|P{\largeurChiffresAvecTVA}|P{\largeurChiffres}|P{\largeurChiffresAvecTVA}|}%
        \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%    
    \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. En effet, dès qu'on change de cellule, les tests conditionnels sont perdus.
%    \begin{macrocode}
\newcommand{\lignesansTVA}[5]{#1 & #2 & #3 & #4 & #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}%
        \fpSub{\HT}{\HT}{#4}%
        \xdef\HT{\HT}%retenons
        \fpAdd{\totHT}{\totHT}{\HT}%
        \xdef\totHT{\totHT}%
        % Calcul de la TVA
        \fpDiv{\centieme}{#5}{100}%
        \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} & \numprint[\unite]{#4} & \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}
%</facture>
% \PrintChanges
%\Finale
%\endinput