%%% % Ticket de caisse %%% \def\filedateTicketCaisse{2024/08/04}% \def\fileversionTicketCaisse{0.1}% \message{-- \filedateTicketCaisse\space v\fileversionTicketCaisse}% % \newcounter{PfCNbInsulte}% \newcounter{PfCChoixService}% \setcounter{PfCNbInsulte}{0}% \setcounter{PfCChoixService}{0}% % \newlength\PfCTicketLarg \NewDocumentCommand\PfCPrixInsulte{sm}{% \setsepchar{,}\ignoreemptyitems% \readlist*\PfCListeInsulte{\%,!,§,\#,*,@,-}% \reademptyitems% \IfBooleanTF{#1}{% \MelangeListe{1,2,3,4,5,6,7}{5}% }{% \stepcounter{PfCNbInsulte}% \MelangeListe{1,2,3,4,5,6,7}{3}% }% \setsepchar{,}\ignoreemptyitems% \readlist*\ListeInsulteMelange{\faa}% \reademptyitems% \ifboolKV[TicketCaisse]{Solution}{\textcolor{PfCTicketCouleurSolution}{#2}}{% \xintFor* ##1 in{\xintSeq{1}{\ListeInsulteMelangelen}}\do{% \xdef\Titi{\ListeInsulteMelange[##1]}% \PfCListeInsulte[\Titi]% }% }% }% \makeatletter \NewDocumentCommand\PrixTicket{om}{% \ifboolKV[TicketCaisse]{CHF}{% \DeclareSIUnit{\Tempo}{\PfCCHF}% }{% \ifboolKV[TicketCaisse]{CFA}{% \DeclareSIUnit{\Tempo}{\PfCCFA}% }{% \ifboolKV[TicketCaisse]{CFP}{% \DeclareSIUnit{\Tempo}{\PfCCFP}% }{% \ifboolKV[TicketCaisse]{US}{% \DeclareSIUnit{\Tempo}{\Dollar}% }{% \ifboolKV[TicketCaisse]{UK}{% \DeclareSIUnit{\Tempo}{\LivreSterling}% }{% \ifboolKV[TicketCaisse]{Euro}{% \DeclareSIUnit{\Tempo}{\EuRo}% }{% \if@CHF% \setKV[TicketCaisse]{CHF}% \fi% \DeclareSIUnit{\Tempo}{\DeviseDefaut}% }% }% }% }% }% }% \IfInteger{#2}{% \ifboolKV[TicketCaisse]{CHF}{% \si{\PfCCHF}~\num{#2}.-% }{% \SI[round-mode=places,round-precision=2]{#2}{\Tempo}% }% }{% \SI[round-mode=places,round-precision=2]{#2}{\Tempo}% }% }% \makeatother \setKVdefault[TicketCaisse]{Largeur=222pt,Especes=50,Simple=false,Taxes=false,SansRendu=false,Enseigne=Au comptoir des maths,DateAchat=\today,HeureAchat=15:13:34,Taches=false,Rendu,Total,SousTotal=false,UK=false,US=false,CFA=false,CFP=false,CHF=false,Euro=false,Solution=false} \defKV[TicketCaisse]{Couleur=\colorlet{PfCTicketCouleurSolution}{#1}\setKV[TicketCaisse]{Solution}} \defKV[TicketCaisse]{Service=\setKV[TicketCaisse]{Taxes}} \NewDocumentCommand\TicketCaisse{som}{% \setcounter{PfCNbInsulte}{0}% \useKVdefault[TicketCaisse]% \setKV[TicketCaisse]{#2}% \setlength{\PfCTicketLarg}{\useKV[TicketCaisse]{Largeur}}% \setsepchar[*]{,*/}% \readlist*\ListeAchats{#3}% % On fait trois listes pour les retenir % Liste Quantités \xdef\PfCFooQuantites{}% \foreachitem\compteur\in\ListeAchats{% \StrChar{\ListeAchats[\compteurcnt,1]}{1}[\MyLetter]% \IfStrEq{\MyLetter}{!}{% \StrBehind{\ListeAchats[\compteurcnt,1]}{!}[\Titi]% \xdef\PfCFooQuantites{\PfCFooQuantites,\Titi}% }{% \xdef\PfCFooQuantites{\PfCFooQuantites,\ListeAchats[\compteurcnt,1]}% }% }% % Liste Elements \xdef\PfCFooElements{}% \foreachitem\compteur\in\ListeAchats{% \xdef\PfCFooElements{\PfCFooElements,\ListeAchats[\compteurcnt,2]}% }% % Liste Prix Unitaire \xdef\PfCFooPUnitaires{}% \foreachitem\compteur\in\ListeAchats{% \StrChar{\ListeAchats[\compteurcnt,3]}{1}[\MyLetter]% \IfStrEqCase{\MyLetter}{% {!}{% \StrBehind{\ListeAchats[\compteurcnt,3]}{!}[\Titi]% \StrChar{\Titi}{1}[\Toto]% \IfStrEq{\Toto}{*}{% \StrBehind{\ListeAchats[\compteurcnt,3]}{!*}[\Tata]% \xdef\PfCFooPUnitaires{\PfCFooPUnitaires,\Tata}% }{% \xdef\PfCFooPUnitaires{\PfCFooPUnitaires,\Titi}% }% }% {*}{\StrBehind{\ListeAchats[\compteurcnt,3]}{*}[\Titi]% \xdef\PfCFooPUnitaires{\PfCFooPUnitaires,\Titi}}% }[\xdef\PfCFooPUnitaires{\PfCFooPUnitaires,\ListeAchats[\compteurcnt,3]}]% }% % On les lit \setsepchar{,}\ignoreemptyitems% \readlist*\ListeQuantites{\PfCFooQuantites}% \readlist*\ListeElements{\PfCFooElements}% \readlist*\ListePUnitaires{\PfCFooPUnitaires}% % On calcul le coût total \xdef\PfCTCTotal{0}% \xintFor* ##1 in{\xintSeq{1}{\ListeAchatslen}}\do{% \xdef\PfCTCTotal{\fpeval{\PfCTCTotal+\ListeQuantites[##1]*\ListePUnitaires[##1]}}% }% \ifboolKV[TicketCaisse]{Taxes}{% % On décompose la clé \StrChar{\useKV[TicketCaisse]{Service}}{1}[\MyLetter]% % Si le premier caractère est !, il faut regarder si le deuxième caractère est une étoile \IfStrEq{\MyLetter}{!}{% \StrChar{\useKV[TicketCaisse]{Service}}{2}[\MyLettera]% \IfStrEq{\MyLettera}{*}{% \StrGobbleLeft{\useKV[TicketCaisse]{Service}}{2}[\PfCTCValeurService] \setcounter{PfCChoixService}{3}% }{% \StrGobbleLeft{\useKV[TicketCaisse]{Service}}{1}[\PfCTCValeurService] \setcounter{PfCChoixService}{1}% }% }{%il faut regarder si c'est une étoile \StrChar{\useKV[TicketCaisse]{Service}}{1}[\MyLettera]% \IfStrEq{\MyLettera}{*}{% \StrGobbleLeft{\useKV[TicketCaisse]{Service}}{1}[\PfCTCValeurService] \setcounter{PfCChoixService}{2} }{% \xdef\PfCTCValeurService{\useKV[TicketCaisse]{Service}}% \setcounter{PfCChoixService}{0} }% }% % On fait les calculs associés à la clé. \xdef\PfCTCSousTotal{\PfCTCTotal}% \xdef\PfCTCService{\fpeval{\PfCTCValeurService*\PfCTCSousTotal/100}}% \xdef\PfCTCTotal{\fpeval{\PfCTCSousTotal+\PfCTCService}}% }{}% % Le coût total est \PfCTCTotal\\ \IfBooleanTF{#1}{% \ttfamily \begin{tabular}{|m{0.48\PfCTicketLarg}m{0.13\PfCTicketLarg}m{0.165\PfCTicketLarg}m{0.225\PfCTicketLarg}|}% \hline &&&\\% \multicolumn{4}{|c|}{\Large\bfseries\useKV[TicketCaisse]{Enseigne}}\\% &&&\\% \hline% &&&\\% \footnotesize\sc Description&\centering \footnotesize\sc Qte.&\centering\footnotesize\sc P.u.&\hfill\footnotesize\sc Prix \ifboolKV[TicketCaisse]{Taxes}{H.T.}{Net}\\% &&&\\% \xintFor* ##1 in{\xintSeq{1}{\ListeAchatslen}}\do{% \ListeElements[##1]&% \centering \footnotesize% \StrChar{\ListeAchats[##1,1]}{1}[\MyLetter]% \IfStrEq{\MyLetter}{!}{\PfCPrixInsulte*{\ListeQuantites[##1]}}{\xintifboolexpr{\fpeval{\ListeQuantites[##1]}==1}{}{\num{\ListeQuantites[##1]}}}% & \hfill \footnotesize %Savoir si le nombre d'articles est affiché \StrChar{\ListeAchats[##1,1]}{1}[\MyLetter]% % Si le nombre d'articles n'est pas affiché, il faut impérativement afficher le prix unitaire \IfStrEq{\MyLetter}{!}{% \PrixTicket{\ListePUnitaires[##1]}% }{% % On regarde si on affiche le prix unitaire \StrChar{\ListeAchats[##1,3]}{1}[\MyLettera]% % Si c'est un !, on affiche pas % Sinon, on affiche \IfStrEq{\MyLettera}{!}{% \PfCPrixInsulte*{\PrixTicket{\ListePUnitaires[##1]}}% }{% \xintifboolexpr{\fpeval{\ListeQuantites[##1]}==1}{}{% \PrixTicket{\ListePUnitaires[##1]}% }% }% }% &\hfill \StrChar{\ListeAchats[##1,3]}{1}[\MyLetter]% % Si le premier caractère est !, il faut regarder si le deuxième caractère est une étoile \IfStrEq{\MyLetter}{!}{% \StrChar{\ListeAchats[##1,3]}{2}[\MyLettera]% \IfStrEq{\MyLettera}{*}{% \PfCPrixInsulte*{\PrixTicket{\fpeval{\ListeQuantites[##1]*\ListePUnitaires[##1]}}}% }{% \PrixTicket{\fpeval{\ListeQuantites[##1]*\ListePUnitaires[##1]}}% }% }{%il faut regarder si c'est une étoile \StrChar{\ListeAchats[##1,3]}{1}[\MyLettera]% \IfStrEq{\MyLettera}{*}{% \PfCPrixInsulte{\PrixTicket{\fpeval{\ListeQuantites[##1]*\ListePUnitaires[##1]}}}% }{% \PrixTicket{\fpeval{\ListeQuantites[##1]*\ListePUnitaires[##1]}}% }% }% \\ }% &&&\\% \hline% &&&\\ % Partie Service \ifboolKV[TicketCaisse]{Taxes}{% Total H.T.\uppercase{&}\uppercase{&}\uppercase{&}\hfill\ifboolKV[TicketCaisse]{SousTotal}{\ifnum\thePfCNbInsulte=0\relax\PrixTicket{\PfCTCSousTotal}\else\PfCPrixInsulte*{\PrixTicket{\PfCTCSousTotal}}\fi}{\PfCPrixInsulte*{\PrixTicket{\PfCTCSousTotal}}} \\% Service % \ifodd\thePfCChoixService\relax \PfCPrixInsulte{\num{\PfCTCValeurService}}\else\num{\PfCTCValeurService}\fi~\si{\percent}% &&&\hfill \ifnum\thePfCChoixService>1\relax \PfCPrixInsulte{\PrixTicket{\PfCTCService}}\else\PrixTicket{\PfCTCService}\fi% \\ &&&\\ \hline &&&\\ }{}% \ifboolKV[TicketCaisse]{Simple}{}{% Total\ifboolKV[TicketCaisse]{Taxes}{ T.T.C.}{}&&&\hfill\ifboolKV[TicketCaisse]{Total}{\ifnum\thePfCNbInsulte=0\relax\PrixTicket{\PfCTCTotal}\else\PfCPrixInsulte*{\PrixTicket{\PfCTCTotal}}\fi}{\PfCPrixInsulte*{\PrixTicket{\PfCTCTotal}}}\\% \ifboolKV[TicketCaisse]{SansRendu}{}{% Espèces&&&\hfill\PrixTicket{\useKV[TicketCaisse]{Especes}}\\% Rendu&&&\hfill\ifboolKV[TicketCaisse]{Rendu}{\PrixTicket{\fpeval{\useKV[TicketCaisse]{Especes}-\PfCTCTotal}}}{\PfCPrixInsulte*{\PrixTicket{\fpeval{\useKV[TicketCaisse]{Especes}-\PfCTCTotal}}}}\\% } &&&\\% }% \multicolumn{4}{|c|}{\footnotesize\useKV[TicketCaisse]{DateAchat}\qquad\useKV[TicketCaisse]{HeureAchat}}\\% \hline \end{tabular} }{% {\ttfamily% \begin{NiceTabular}{m{0.48\PfCTicketLarg}m{0.13\PfCTicketLarg}m{0.165\PfCTicketLarg}m{0.225\PfCTicketLarg}}% \CodeBefore \tikz\node[opacity=0.2,yshift=-1.5cm] at ($(1-|1)!0.5!(1-|last)$) {\Large\bfseries\reflectbox{ \begin{tabular}{c} Papier garanti\\ sans Phénol \end{tabular} } }; \tikz\node[opacity=0.2,anchor=center,yshift=1cm] at ($(last-|1)!0.5!(last-|last)$) {\Large\bfseries\reflectbox{% \faRecycle~Pensez à trier.% }% };% \tikz\node[opacity=0.5,anchor=center,yshift=2cm] at ($(last-|1)!0.5!(last-|last)$) {\Large\bfseries\reflectbox{ \LogoRecyclage[Couleur=0.8white]% }% };% \tikz\draw[fill=Ivory,opacity=0.5] (1-|1) rectangle (last-|last);% \Body &&&\\% \Block{1-4}{\Large\bfseries\useKV[TicketCaisse]{Enseigne}}&&&\\% \\% \Cdots\\% \\% \Block[l]{}{\footnotesize\sc Description}&\Block{}{\footnotesize\sc Qte.}&\Block{}{\footnotesize\sc P.u.}&\Block[r]{}{\footnotesize\sc Prix \ifboolKV[TicketCaisse]{Taxes}{H.T.}{Net}}\\% \\% \xintFor* ##1 in{\xintSeq{1}{\ListeAchatslen}}\do{% \ListeElements[##1]&% \Block{}{% \footnotesize% \StrChar{\ListeAchats[##1,1]}{1}[\MyLetter]% \IfStrEq{\MyLetter}{!}{\PfCPrixInsulte*{\ListeQuantites[##1]}}{\xintifboolexpr{\fpeval{\ListeQuantites[##1]}==1}{}{\num{\ListeQuantites[##1]}}}% }& \Block[r]{}{% \footnotesize %Savoir si le nombre d'articles est affiché \StrChar{\ListeAchats[##1,1]}{1}[\MyLetter]% % Si le nombre d'articles n'est pas affiché, il faut impérativement afficher le prix unitaire \IfStrEq{\MyLetter}{!}{% \PrixTicket{\ListePUnitaires[##1]}% }{% % On regarde si on affiche le prix unitaire \StrChar{\ListeAchats[##1,3]}{1}[\MyLettera]% % Si c'est un !, on affiche pas % Sinon, on affiche \IfStrEq{\MyLettera}{!}{% \PfCPrixInsulte*{\PrixTicket{\ListePUnitaires[##1]}}% }{% \xintifboolexpr{\fpeval{\ListeQuantites[##1]}==1}{}{% \PrixTicket{\ListePUnitaires[##1]}% }% }% }% }% &\Block[r]{}{% \StrChar{\ListeAchats[##1,3]}{1}[\MyLetter]% % Si le premier caractère est !, il faut regarder si le deuxième caractère est une étoile \IfStrEq{\MyLetter}{!}{% \StrChar{\ListeAchats[##1,3]}{2}[\MyLettera]% \IfStrEq{\MyLettera}{*}{% \PfCPrixInsulte*{\PrixTicket{\fpeval{\ListeQuantites[##1]*\ListePUnitaires[##1]}}}% }{% \PrixTicket{\fpeval{\ListeQuantites[##1]*\ListePUnitaires[##1]}}% }% }{%il faut regarder si c'est une étoile \StrChar{\ListeAchats[##1,3]}{1}[\MyLettera]% \IfStrEq{\MyLettera}{*}{% \PfCPrixInsulte{\PrixTicket{\fpeval{\ListeQuantites[##1]*\ListePUnitaires[##1]}}}% }{% \PrixTicket{\fpeval{\ListeQuantites[##1]*\ListePUnitaires[##1]}}% }% }% }\\ }% \\% \Cdots\\% % Partie Service \ifboolKV[TicketCaisse]{Taxes}{% Total H.T.&&&\Block[r]{}{\ifboolKV[TicketCaisse]{SousTotal}{\ifnum\thePfCNbInsulte=0\relax\PrixTicket{\PfCTCSousTotal}\else\PfCPrixInsulte*{\PrixTicket{\PfCTCSousTotal}}\fi}{\PfCPrixInsulte*{\PrixTicket{\PfCTCSousTotal}}} }\\% Service % \ifodd\thePfCChoixService\relax \PfCPrixInsulte{\num{\PfCTCValeurService}}\else\num{\PfCTCValeurService}\fi~\si{\percent}% &&&\Block[r]{}{% \ifnum\thePfCChoixService>1\relax \PfCPrixInsulte{\PrixTicket{\PfCTCService}}\else\PrixTicket{\PfCTCService}\fi% }\\ \Cdots\\ \\ }{}% \ifboolKV[TicketCaisse]{Simple}{}{% Total\ifboolKV[TicketCaisse]{Taxes}{ T.T.C.}{}&&&\Block[r]{}{\ifboolKV[TicketCaisse]{Total}{\ifnum\thePfCNbInsulte=0\relax\PrixTicket{\PfCTCTotal}\else\PfCPrixInsulte*{\PrixTicket{\PfCTCTotal}}\fi}{\PfCPrixInsulte*{\PrixTicket{\PfCTCTotal}}}}\\% \ifboolKV[TicketCaisse]{SansRendu}{}{% Espèces&&&\Block[r]{}{\PrixTicket{\useKV[TicketCaisse]{Especes}}}\\% Rendu&&&\Block[r]{}{\ifboolKV[TicketCaisse]{Rendu}{\PrixTicket{\fpeval{\useKV[TicketCaisse]{Especes}-\PfCTCTotal}}}{\PfCPrixInsulte*{\PrixTicket{\fpeval{\useKV[TicketCaisse]{Especes}-\PfCTCTotal}}}}}\\% } \\% }% \Block{1-4}{\footnotesize\useKV[TicketCaisse]{DateAchat}\qquad\useKV[TicketCaisse]{HeureAchat}}&&&\\% \end{NiceTabular} }% } }%