diff options
author | Karl Berry <karl@freefriends.org> | 2016-05-16 20:36:12 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2016-05-16 20:36:12 +0000 |
commit | 5a4815a1e4e22f0b4bf7358647c51bb9ec342fe0 (patch) | |
tree | 01f384a3e983e713b06d43bab04245238c59d4e4 /Master/texmf-dist/tex | |
parent | c1224c35298e95661e09676cbab3d5830612ce87 (diff) |
factura (16may16)
git-svn-id: svn://tug.org/texlive/trunk@41202 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/factura/factura.cls | 358 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/factura/factura.def | 18 |
2 files changed, 216 insertions, 160 deletions
diff --git a/Master/texmf-dist/tex/latex/factura/factura.cls b/Master/texmf-dist/tex/latex/factura/factura.cls index bb8c10b67e5..12f553c9579 100644 --- a/Master/texmf-dist/tex/latex/factura/factura.cls +++ b/Master/texmf-dist/tex/latex/factura/factura.cls @@ -36,7 +36,7 @@ %% \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{factura} -[2016/02/07 v2.6 +[2016/05/16 v2.72 Clase para elaborar facturas legales en la República Bolivariana de Venezuela. ] @@ -83,6 +83,7 @@ en la República Bolivariana de Venezuela. \newif\if@nombre \newif\if@pagado \newif\if@impdesc +\newif\if@pruebaref \RequirePackage{etoolbox}% 'etoolbox' para los condicionales binarios. @@ -218,6 +219,7 @@ en la República Bolivariana de Venezuela. \RequirePackage{tabularx}% Con 'tabularx' hacemos la tabla. \RequirePackage{environ}% Con 'environ' podemos usar tabularx dentro del ambiente de la factura y escribir texto en el enddef. \RequirePackage{fancyhdr}% Las cabeceras fancy; así se use solamente en reporte, hay que cargarlo siempre. +\RequirePackage{MnSymbol}% Para el símbolo $\lcurvearrowsw$ cuando la descripción ocupa más de una línea. \AtBeginDocument{% Da error si algún campo necesario no está definido. \if@reporte @@ -273,7 +275,7 @@ en la República Bolivariana de Venezuela. \ClassWarning{factura}{** Fecha del documento\space \@Fecha\space distinta de la fecha de hoy. **}{}% \fi \fi - \if@factura\ClassInfo{factura}{\@@Total: \space\space\space \@Moneda \Total}{}\fi} + \if@factura\ClassInfo{factura}{\@@Total: \space\space\space \Moneda \Total}{}\fi} %% La geometría en formato de factura y de reporte. %% El margen superior está definido desde el encabezado con los datos del cliente. @@ -637,6 +639,7 @@ en la República Bolivariana de Venezuela. \newlength{\@SeparaElementos} \newlength{\@SeparaMinTotales} \newlength{\@SeparaFilas} +\newlength{\@SeparaFinLineaDesc} \newlength{\@InicioReporte} \newlength{\@FirmaFacturaXcorr} \newlength{\@FirmaFacturaYcorr} @@ -658,6 +661,7 @@ en la República Bolivariana de Venezuela. \newbox{\@CajaCond} \newbox{\@CajaEspacioVacio} \newbox{\@CajaPrueba} +\newbox{\@CajaCaracterCR} %% Contadores para uso interno para uso interno: \newcounter{@IVANoGeneral}% '0' con sólo IVA G, '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos. @@ -723,11 +727,14 @@ en la República Bolivariana de Venezuela. %% http://tex.stackexchange.com/questions/296035/insert-a-special-character-at-each-end-of-line-in-a-paragraph %% http://tex.stackexchange.com/questions/248944/how-to-put-before-lines \newcommand{\@DescripcionAuxCmd}[2]{% - \setbox0\hbox{\parbox[t]{\linewidth}{#1\par\global\count1=\prevgraf}}% + \setbox0\hbox{\parbox[t]{\linewidth}{#1% + \if@impdesc\hfill\ \@EscribeTipoDeImpuesto{#2}\fi% + \par\global\count1=\prevgraf}}% \ifnum\count1 = 1 - #1\if@impdesc\hfill\ \@EscribeTipoDeImpuesto*{#2}\fi + #1% + \if@impdesc\hfill\ \@EscribeTipoDeImpuesto{#2}\fi \else - \parbox[t]{\linewidth-1em}{% + \parbox[t]{\linewidth-\wd\@CajaCaracterCR-\@SeparaFinLineaDesc}{% \David@XStart#1\David@XEnd \par \count0=\prevgraf @@ -736,10 +743,10 @@ en la República Bolivariana de Venezuela. \ifnum\count0=\count2 \if@impdesc \vskip-\baselineskip - \mbox{}\hfill\rlap{\hspace*{1em}\llap{\@EscribeTipoDeImpuesto*{#2}}}% + \mbox{}\hfill\rlap{\hspace*{\wd\@CajaCaracterCR}\hspace*{\@SeparaFinLineaDesc}\llap{\@EscribeTipoDeImpuesto{#2}}}% \fi \else - \mbox{}\hfill\rlap{\hspace*{0.1em}\@CaracterEOL}% + \mbox{}\hfill\rlap{\hspace*{\@SeparaFinLineaDesc}\usebox{\@CajaCaracterCR}}% \fi \vskip-2\baselineskip \advance\count0 -1 @@ -747,9 +754,7 @@ en la República Bolivariana de Venezuela. \repeat \kern\count2\baselineskip\mbox{}% \strut}% - \fi - \global\expandafter\newcount\csname c@Item\expandafter\romannumeral\value{@NumItem}Lineas\endcsname - \global\expandafter\csname c@Item\expandafter\romannumeral\value{@NumItem}Lineas\endcsname=\count1} + \fi} %% Comandos auxiliares para colocar en \parbox cada celda. \newcommand{\@CantidadAuxCmd}[1]{% @@ -940,22 +945,15 @@ en la República Bolivariana de Venezuela. \newcommand{\@LineaNodoBCoordX}{\hspace*{-\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{\tabcolsep}} %% Escribe la letra que designa al tipo de impuesto que aplica al ítem. -\NewDocumentCommand{\@EscribeTipoDeImpuesto}{s m}{% +\NewDocumentCommand{\@EscribeTipoDeImpuesto}{m}{% % Hay que abrir un grupo de ejecución porque el cambio en la tipografía altera la celda. - \ifx#2G{% - \if@G - {\@LetraTipoIVA\@DenomAlicuotaG}% Si tiene IVA general escribimos 'G' si se solicita. - \IfBooleanF{#1}{\ \hfill}% - \else - \hfill - \fi}\fi - {\if@G - {\@LetraTipoIVA - \ifx#2E\@DenomAlicuotaE\fi% Si está exento escribimos '(E)'. - \ifx#2R\@DenomAlicuotaR\fi% Si tiene IVA reducido escribimos 'R'. - \ifx#2A\@DenomAlicuotaA\fi% Si tiene IVA adicional escribimos 'A'. - \IfBooleanF{#1}{\ \hfill}}% - \fi}} + {\if@G + \@LetraTipoIVA + \ifx#1G\@DenomAlicuotaG\fi% Si tiene IVA general escribimos 'G'. + \ifx#1E\@DenomAlicuotaE\fi% Si está exento escribimos '(E)'. + \ifx#1R\@DenomAlicuotaR\fi% Si tiene IVA reducido escribimos 'R'. + \ifx#1A\@DenomAlicuotaA\fi% Si tiene IVA adicional escribimos 'A'. + \fi}} %% Comando para poner en cero los contadores de los totales porque el ambiente de la factura se evalúa tres veces y los totales se sumarían todos tres veces. \newcommand{\@ZERO}{% @@ -967,10 +965,12 @@ en la República Bolivariana de Venezuela. \FPset\SubtG{0}\global\let\SubtG\SubtG \FPset\SubtR{0}\global\let\SubtR\SubtR \FPset\SubtA{0}\global\let\SubtA\SubtA + \FPset\SubtX{0}\global\let\SubtX\SubtX \FPset\DescE{0}\global\let\DescE\DescE \FPset\DescG{0}\global\let\DescG\DescG \FPset\DescR{0}\global\let\DescR\DescR \FPset\DescA{0}\global\let\DescA\DescA + \FPset\DescX{0}\global\let\DescX\DescX \FPset\AlicuotaG{0}\global\let\AlicuotaG\AlicuotaG \FPset\AlicuotaR{0}\global\let\AlicuotaR\AlicuotaR \FPset\AlicuotaA{0}\global\let\AlicuotaA\AlicuotaA} @@ -1002,7 +1002,7 @@ en la República Bolivariana de Venezuela. \def\@FacturaAuxColumnasEval{ % Primera línea. \ifbool{SinLineasVertExt}{}{|} - % Columna 'X' con DCU, columna fantasma con 'sincantidad' y columa 'c' con CDU. + % Columna 'X' con DCU, columna fantasma con 'sincantidad' y columna 'c' con CDU. \ifbool{PrimeroDesc}{X}{ \ifbool{SinCantidad}{l@{\extracolsep{0pt}}}{c}} % Segunda línea. @@ -1028,6 +1028,52 @@ en la República Bolivariana de Venezuela. \edef\@FacturaAuxInicioCmd{\noexpand\begin{tabularx}{\textwidth}{\@FacturaAuxColumnasEval}} +%% Comando para hacer los cálculos sobre cada ítem y establecer las macros con el contenido de cada ítem introducido. +\newcommand{\@CalculaItem}[5]{% + \addtocounter{@NumItem}{1}% + % Calculamos. + \FPupn\PrecioU{#4 \@DigitosMoneda{} round}% + \ifx\\#5\\\FPset\Dcto{0}\else\FPupn\Dcto{#5 \@DigitosPorc{} round clip}\fi% Fijamos en 0 el descuento si no se especifica. + \FPupn\PrecioT{100 \Dcto{} 100 - / #2 * \PrecioU{} * \@DigitosMoneda{} round}% + \global\let\PrecioU\PrecioU + \global\let\Dcto\Dcto + \global\let\PrecioT\PrecioT + % Suma el elemento actual al subtotal acumulado. + \expandafter\FPupn\csname Subt#1\endcsname{\PrecioT{} \csname Subt#1\endcsname{} + \@DigitosMoneda{} round}% + \global\expandafter\let\csname Subt#1\expandafter\endcsname\csname Subt#1\endcsname + % Guardamos en macros cada elemento agregado a la factura; por ejemplo: \@Item@i@Cantidad contiene la cantidad que se introdujo para el primer ítem; así mismo con ii@, @iii@, y así mismo también con @Descripcion, @PrecioU, @Descuento y @PrecioT. + \expandafter\gdef\csname @Item@\romannumeral\value{@NumItem}@Cantidad\endcsname{\numprint{#2}}% + \expandafter\gdef\csname @Item@\romannumeral\value{@NumItem}@Descripcion\endcsname{#3}% + \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{@NumItem}@PrecioU\endcsname{\noexpand\numprint{\PrecioU}}% + \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{@NumItem}@Descuento\endcsname{\noexpand\numprint{\Dcto}}% + \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{@NumItem}@PrecioT\endcsname{\noexpand\numprint{\PrecioT}}} + +\gdef\@pruebaref#1{% + \expandafter\ifx\csname @Etiqueta@@#1\endcsname\relax + \ClassWarning{factura}{La etiqueta `#1' no está definida}{}\ignorespaces + \@pruebareffalse + \else + \@pruebareftrue + \fi} + +\gdef\itemref#1{\@pruebaref{#1}\if@pruebaref \csname @Etiqueta@@#1\endcsname \fi} +\gdef\cantref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Cantidad\endcsname \fi} +\gdef\descref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Descripcion\endcsname \fi} +\gdef\puref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @PrecioU\endcsname \fi} +\gdef\dctoref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @Descuento\endcsname \fi} +\gdef\ptref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@@#1\endcsname @PrecioT\endcsname \fi} + +\newcommand{\label@factura}[1]{% + \expandafter\ifx\csname @Etiqueta@@#1\endcsname\relax + \expandafter\global\expandafter\edef\csname @Etiqueta@@#1\endcsname{\arabic{@NumItem}}\ignorespaces + \else + \expandafter\if\csname @Etiqueta@@#1\endcsname\the@NumItem + \ClassInfo{factura}{Etiqueta `#1' definida para el ítem \arabic{@NumItem}}{}% + \else + \ClassWarning{factura}{La etiqueta `#1' se definió más de una vez}{}\ignorespaces + \fi + \fi} + %% Comando auxiliar para la definición del ambiente de la factura; al final de este comando está el texto que va en el enddef del ambiente de la factura. \newcommand{\@FacturaAuxCmd}[1]{% \if@exparriba @@ -1067,16 +1113,18 @@ en la República Bolivariana de Venezuela. \def\David@XLeft##1{\David@XPad{\romannumeral\value{@NumItem}}{\hbox{##1}}{}}% \def\David@XRight##1{\David@XPad{\romannumeral\value{@NumItem}}{}{\hbox{##1}}}% % - % Comando interno para todos los ítems. - \newcommand{\@ITEM}[5]{% 1. [R|G|A|E]; 2. cantidad; 3. descripción; 4. p/u; 5. dcto. - \addtocounter{@NumItem}{1}% - % Calculamos. - \FPupn\PrecioU{##4 \@DigitosMoneda{} round}% - \ifx\\##5\\\FPset\Dcto{0}\else\FPupn\Dcto{##5 \@DigitosPorc{} round clip}\fi% Fijamos en 0 el descuento si no se especifica. - \FPupn\PrecioT{100 \Dcto{} 100 - / ##2 * \PrecioU{} * \@DigitosMoneda{} round}% - \global\let\PrecioU\PrecioU - \global\let\Dcto\Dcto - \global\let\PrecioT\PrecioT + % Caja auxiliar para el caracter de retorno de carro y poder saber si tamaño en el campo de la descripción. + \savebox{\@CajaCaracterCR}{\@LetraItems\@CaracterCR} + % + % Comando interno general para agregar cualquier ítem. + \newcommand{\@ITEM}[5]{% 1. [R|G|A|E|X]; 2. cantidad; 3. descripción; 4. p/u; 5. dcto. + \@CalculaItem{##1}{##2}{##3}{##4}{##5}% + % Si no es el primer ítem, entonces hace falta \\ para terminar el ítem anterior. + \ifnum\value{@NumItem}=1% + \else + \\ + \if@conlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta. + \fi % Primer campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc). \ifbool{SinCantidad}{}{% \ifbool{PrimeroDesc} @@ -1088,7 +1136,11 @@ en la República Bolivariana de Venezuela. \if@dcu \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu. \else - \David@XRight{\@PrecioUAuxCmd{\if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \@LetraNumeros \numprint{\PrecioU}}}% duc. + \David@XRight{\@PrecioUAuxCmd{% + \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% + \else + \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU} + \fi}}% duc. \fi} {\@DescripcionAuxCmd{##3}{##1}}% cdu. & @@ -1098,132 +1150,65 @@ en la República Bolivariana de Venezuela. \if@duc \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% duc. \else - \David@XRight{\@PrecioUAuxCmd{\if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \@LetraNumeros \numprint{\PrecioU}}}% dcu y cdu. + \David@XRight{\@PrecioUAuxCmd{% + \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% + \else + \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU} + \fi}}% dcu y cdu. \fi}% & % Cuarto campo: Descuento. - \ifbool{Descuentos}{\FPifeq\Dcto{0}\else\David@XRight{\@DescuentoAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}}}\fi}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq. + \ifbool{Descuentos}{% + \David@XRight{\@DescuentoAuxCmd{% + \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% + \else + \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{} + \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq. & % Quinto campo: El total. - \David@XRight{\@PrecioTAuxCmd{\if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \@LetraNumeros \numprint{\PrecioT}}}% + \David@XRight{\@PrecioTAuxCmd{% + \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% + \else + \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioT} + \fi}}% % Escribimos al csv. \if@csv \ifbool{SinCantidad} {\if@descuentos - \immediate\write\csv{"\unexpanded{##3}","##5","\PrecioT","##1"}% + \immediate\write\csv{"\unexpanded{##3}","\Dcto","\PrecioT","##1"}% \else \immediate\write\csv{"\unexpanded{##3}","\PrecioT","##1"}% \fi} {\if@cdu \if@descuentos - \immediate\write\csv{"##2","\unexpanded{##3}","##4","##5","\PrecioT","##1"}% + \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\Dcto","\PrecioT","##1"}% \else - \immediate\write\csv{"##2","\unexpanded{##3}","##4","\PrecioT","##1"}% + \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}% \fi \fi \if@dcu \if@descuentos - \immediate\write\csv{"\unexpanded{##3}","##2","##4","##5","\PrecioT","##1"}% + \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\Dcto","\PrecioT","##1"}% \else - \immediate\write\csv{"\unexpanded{##3}","##2","##4","\PrecioT","##1"}% + \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\PrecioT","##1"}% \fi \fi \if@duc \if@descuentos - \immediate\write\csv{"\unexpanded{##3}","##4","##2","##5","\PrecioT","##1"}% + \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\Dcto","\PrecioT","##1"}% \else - \immediate\write\csv{"\unexpanded{##3}","##4","##2","\PrecioT","##1"}% + \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\PrecioT","##1"}% \fi \fi}% - \fi - % Suma el elemento actual al subtotal acumulado. - \expandafter\FPupn\csname Subt##1\endcsname{\PrecioT{} \csname Subt##1\endcsname{} + \@DigitosMoneda{} round}% - \global\expandafter\let\csname Subt##1\expandafter\endcsname\csname Subt##1\endcsname - \\ - \if@conlineasha\hline\fi}% - % - \ifbool{SinCantidad} - % Definamos todos los comandos \Item***. - {% - \if@descuentos - \newcommand{\Item}[3]{\@ITEM{G}{1}{##1}{##2}{##3}}% Ítem normal. - \newcommand{\ItemR}[3]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{##1}{##2}{##3}}% Ítem con IVA reducido. - \newcommand{\ItemA}[3]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{##1}{##2}{##3}}% Ítem con IVA reducido. - \newcommand{\ItemE}[3]{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{1}{##1}{##2}{##3}}% Ítem con IVA reducido. - \else - \newcommand{\Item}[2]{\@ITEM{G}{1}{##1}{##2}{0}}% Ítem normal. - \newcommand{\ItemR}[2]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{##1}{##2}{0}}% Ítem con IVA reducido. - \newcommand{\ItemA}[2]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{##1}{##2}{0}}% Ítem con IVA reducido. - \newcommand{\ItemE}[2]{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{1}{##1}{##2}{0}}% Ítem con IVA reducido. - \fi - \let\ItemG\Item - \newcommand{\ItemX}[1]{% Ítem sin precio. - \if@csv\immediate\write\csv{"\unexpanded{##1}"}\fi - & ##1 && \if@descuentos \@CaracterItemXVacio \fi & \hfill \@CaracterItemXVacio \hfill\mbox{}\\ - \if@conlineasha\hline\fi}% - \if@csv - \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\@Moneda)"} - \else - \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\@Moneda)"} - \fi - \fi} - {% - \if@descuentos - \newcommand{\Item}[4]{\@ITEM{G}{##1}{##2}{##3}{##4}}% Ítem normal. - \newcommand{\ItemR}[4]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{##1}{##2}{##3}{##4}}% Ítem con IVA reducido. - \newcommand{\ItemA}[4]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{##1}{##2}{##3}{##4}}% Ítem con IVA adicional. - \newcommand{\ItemE}[4]{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{##1}{##2}{##3}{##4}}% Ítem exento de IVA. - \else - \newcommand{\Item}[3]{\@ITEM{G}{##1}{##2}{##3}{0}}% Ítem normal. - \newcommand{\ItemR}[3]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{##1}{##2}{##3}{0}}% Ítem con IVA reducido. - \newcommand{\ItemA}[3]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{##1}{##2}{##3}{0}}% Ítem con IVA adicional. - \newcommand{\ItemE}[3]{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{##1}{##2}{##3}{0}}% Ítem exento de IVA. - \fi - \let\ItemG\Item - \newcommand{\ItemX}[2]{% Ítem sin precio. - \if@cdu - \if@csv\immediate\write\csv{"##1","\unexpanded{##2}",""}\fi - \@LetraNumeros\numprint{##1} & ##2 & \hfill \@CaracterItemXVacio \hfill\mbox{} & \if@descuentos \@CaracterItemXVacio \fi & \hfill \@CaracterItemXVacio \hfill\mbox{} \\ - \fi - \if@dcu - \if@csv\immediate\write\csv{"\unexpanded{##2}","##1",""}\fi - ##2 & \@LetraNumeros\numprint{##1} & \hfill \@CaracterItemXVacio \hfill\mbox{} & \if@descuentos \@CaracterItemXVacio \fi & \hfill \@CaracterItemXVacio \hfill\mbox{} \\ - \fi - \if@duc - \if@csv\immediate\write\csv{"\unexpanded{##2}","","##1"}\fi - ##2 & \hfill \@CaracterItemXVacio \hfill\mbox{} & \@LetraNumeros\numprint{##1} & \if@descuentos \@CaracterItemXVacio \fi & \hfill \@CaracterItemXVacio \hfill\mbox{} \\ - \fi - \if@conlineasha\hline\fi}% - \if@csv - \if@cdu - \if@descuentos - \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\@Moneda)","\@@Descuento","\@@PrecioT \space (\@Moneda)"}% - \else - \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\@Moneda)","\@@PrecioT \space (\@Moneda)"}% - \fi - \fi - \if@dcu - \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\@Moneda)","\@@Descuento","\@@PrecioT \space (\@Moneda)"}% - \else - \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\@Moneda)","\@@PrecioT \space (\@Moneda)"}% - \fi - \fi - \if@duc - \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\@Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\@Moneda)"}% - \else - \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\@Moneda)","\@@Cantidad","\@@PrecioT \space (\@Moneda)"}% - \fi - \fi - \fi} + \fi}% % + % Usamos la definición de \label@factura dentro del entorno de la factura para que sea local aquí nada más. + \let\label\label@factura \@LetraItems% Este es el tipo de letra que tendrán los ítems, y en este tipo de letra se define el \baselineskip de toda la factura. \@FacturaAuxInicioCmd \ifbool{SinLineasHoriExt}{}{\hline}% \@ZERO - % Estamos en la cantidad o la descripción. + % Estamos en la cantidad, o la descripción. \ifbool{LineaDesdeColUno}{\@LineaNodoACoordX}{}% \ifbool{SinCantidad}{}{\ifbool{PrimeroDesc}{\@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}}}% &% Avanzamos hasta la descripción, la cantidad o el precio unitario. @@ -1232,7 +1217,7 @@ en la República Bolivariana de Venezuela. \ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}} {\if@cdu \@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}\fi \if@dcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}\fi - \if@duc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@PrecioU \hfill\mbox{}}\fi}% + \if@duc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}% &% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'. \ifbool{SinCantidad}{% \ifbool{LineaHastaColDos}{\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}{}}% @@ -1241,18 +1226,19 @@ en la República Bolivariana de Venezuela. \if@duc \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}% \else - \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@PrecioU \space (\@Moneda)\hfill\mbox{}}% + \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@PrecioU \space (\Moneda)\hfill\mbox{}}% \fi}% &% Avanzamos hasta el descuento, que puede o no existir. \if@descuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Descuento \hfill\mbox{}}\fi &% Avanzamos hasta el precio total. - \@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitCuadro \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\@Moneda)\hfill\mbox{}}% + \@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitCuadro \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}% \ifbool{LineaHastaFinal}{\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}{}% \\ \ifbool{SinLineasHoriInt}{}{\hline}% % #1% Aquí entran todos los items que el usuario declara dentro del ambiente. - % + \\% El último fin de línea se hace aquí. + \if@conlineasha\hline\fi% Se verifica si hace falta una línea horizontal o no. \if@filas % Esto en lugar de \if@exparriba para que no se haga una linea vacía en la tabla cuando la caja está vacía. \ifdim \ht\@CajaEspacioVacio=0pt @@ -1368,6 +1354,67 @@ en la República Bolivariana de Venezuela. \if@exparriba\zsaveposy{EspacioVacioFinal}\fi \vspace*{\@SeparaElementos}\par} + \ifbool{SinCantidad} + % Definamos todos los comandos \Item***. + {% + \if@descuentos + \newcommand{\Item}[3]{\@ITEM{G}{1}{#1}{#2}{#3}}% Ítem normal. + \newcommand{\ItemR}[3]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{#1}{#2}{#3}}% Ítem con IVA reducido. + \newcommand{\ItemA}[3]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{#1}{#2}{#3}}% Ítem con IVA reducido. + \newcommand{\ItemE}[3]{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{1}{#1}{#2}{#3}}% Ítem con IVA reducido. + \else + \newcommand{\Item}[2]{\@ITEM{G}{1}{#1}{#2}{0}}% Ítem normal. + \newcommand{\ItemR}[2]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{#1}{#2}{0}}% Ítem con IVA reducido. + \newcommand{\ItemA}[2]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{#1}{#2}{0}}% Ítem con IVA reducido. + \newcommand{\ItemE}[2]{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{1}{#1}{#2}{0}}% Ítem con IVA reducido. + \fi + \newcommand{\ItemX}[1]{\@ITEM{X}{1}{#1}{0}{0}}% Ítem sin precio. + \let\ItemG\Item + \if@csv + \if@descuentos + \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\Moneda)"} + \else + \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)"} + \fi + \fi} + {% + \if@descuentos + \newcommand{\Item}[4]{\@ITEM{G}{#1}{#2}{#3}{#4}}% Ítem normal. + \newcommand{\ItemR}[4]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{#1}{#2}{#3}{#4}}% Ítem con IVA reducido. + \newcommand{\ItemA}[4]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{#1}{#2}{#3}{#4}}% Ítem con IVA adicional. + \newcommand{\ItemE}[4]{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{#1}{#2}{#3}{#4}}% Ítem exento de IVA. + \else + \newcommand{\Item}[3]{\@ITEM{G}{#1}{#2}{#3}{0}}% Ítem normal. + \newcommand{\ItemR}[3]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{#1}{#2}{#3}{0}}% Ítem con IVA reducido. + \newcommand{\ItemA}[3]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{#1}{#2}{#3}{0}}% Ítem con IVA adicional. + \newcommand{\ItemE}[3]{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{#1}{#2}{#3}{0}}% Ítem exento de IVA. + \fi + \newcommand{\ItemX}[2]{\@ITEM{X}{#1}{#2}{0}{0}}% Ítem sin precio. + \let\ItemG\Item + \if@csv + \if@cdu + \if@descuentos + \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)"}% + \else + \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)"}% + \fi + \fi + \if@dcu + \if@descuentos + \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)"}% + \else + \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)"}% + \fi + \fi + \if@duc + \if@descuentos + \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\Moneda)"}% + \else + \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@PrecioT \space (\Moneda)"}% + \fi + \fi + \fi} + \if@factura % Los descuentos totales no son compatibles -y no sé si lo serán- con el modo de totalización en filas. \if@filas @@ -1444,8 +1491,13 @@ en la República Bolivariana de Venezuela. \end{tikzpicture} \par\vspace*{\@SombraDescrip}}% \else - \RenewEnviron{factura}{} - \NewDocumentCommand{\Descripcion}{s m}{} + \RenewEnviron{factura}{% + \@ZERO + \let\label\label@factura + \let\@ITEM\@CalculaItem + \BODY + \@CalculaTotalesI} + \NewDocumentCommand{\Descripcion}{s +m}{} \fi \if@reporte @@ -1678,34 +1730,34 @@ en la República Bolivariana de Venezuela. \if@csv \if@Exento \if@DescE - \immediate\write\csv{Totales: \@@SubtotalE: \@Moneda \SubtE}% - \immediate\write\csv{Totales: \@@DescuentoE: \@Moneda \DescE}% + \immediate\write\csv{Totales: \@@SubtotalE: \Moneda \SubtE}% + \immediate\write\csv{Totales: \@@DescuentoE: \Moneda \DescE}% \fi - \immediate\write\csv{Totales: \@@BIE: \@Moneda \BIE}% + \immediate\write\csv{Totales: \@@BIE: \Moneda \BIE}% \fi \if@BIR \if@DescE - \immediate\write\csv{Totales: \@@SubtotalR: \@Moneda \SubtR}% - \immediate\write\csv{Totales: \@@DescuentoR: \@Moneda \DescR}% + \immediate\write\csv{Totales: \@@SubtotalR: \Moneda \SubtR}% + \immediate\write\csv{Totales: \@@DescuentoR: \Moneda \DescR}% \fi - \immediate\write\csv{Totales: \@@BIR: \@Moneda \BIR}% - \immediate\write\csv{Totales: \@@AlicuotaR: \@Moneda \AlicuotaR}% + \immediate\write\csv{Totales: \@@BIR: \Moneda \BIR}% + \immediate\write\csv{Totales: \@@AlicuotaR: \Moneda \AlicuotaR}% \fi \if@DescG - \immediate\write\csv{Totales: \@@SubtotalG: \@Moneda \SubtG}% - \immediate\write\csv{Totales: \@@DescuentoG: \@Moneda \DescG}% + \immediate\write\csv{Totales: \@@SubtotalG: \Moneda \SubtG}% + \immediate\write\csv{Totales: \@@DescuentoG: \Moneda \DescG}% \fi - \immediate\write\csv{Totales: \@@BIG: \@Moneda \BIG}% - \immediate\write\csv{Totales: \@@AlicuotaG: \@Moneda \AlicuotaG}% + \immediate\write\csv{Totales: \@@BIG: \Moneda \BIG}% + \immediate\write\csv{Totales: \@@AlicuotaG: \Moneda \AlicuotaG}% \if@BIA \if@DescA - \immediate\write\csv{Totales: \@@SubtotalA: \@Moneda \SubtA}% - \immediate\write\csv{Totales: \@@DescuentoA: \@Moneda \DescA}% + \immediate\write\csv{Totales: \@@SubtotalA: \Moneda \SubtA}% + \immediate\write\csv{Totales: \@@DescuentoA: \Moneda \DescA}% \fi - \immediate\write\csv{Totales: \@@BIA: \@Moneda \BIA}% - \immediate\write\csv{Totales: \@@AlicuotaA: \@Moneda \AlicuotaA}% + \immediate\write\csv{Totales: \@@BIA: \Moneda \BIA}% + \immediate\write\csv{Totales: \@@AlicuotaA: \Moneda \AlicuotaA}% \fi - \immediate\write\csv{Totales: \@@Total: \@Moneda \Total}% + \immediate\write\csv{Totales: \@@Total: \Moneda \Total}% \immediate\closeout\csv \fi} diff --git a/Master/texmf-dist/tex/latex/factura/factura.def b/Master/texmf-dist/tex/latex/factura/factura.def index 272cd2a0300..676d18e0aa9 100644 --- a/Master/texmf-dist/tex/latex/factura/factura.def +++ b/Master/texmf-dist/tex/latex/factura/factura.def @@ -35,7 +35,7 @@ %% and factura-beispiel-rechnung.tex. %% \ProvidesFile{factura.def} -[2016/02/07 v2.6 +[2016/05/16 v2.72 Archivo valores iniciales y condiciones de borde para factura.cls ] @@ -59,7 +59,7 @@ Archivo valores iniciales y condiciones de borde para factura.cls \def\@DigitosNumeracion{5} %% La moneda: -\def\@Moneda{Bs.} +\def\Moneda{Bs.} %% Al lado de cada ítem va la letra que designa el gravamen que aplica sobre él: \def\@DenomAlicuotaG{G} @@ -109,14 +109,18 @@ Archivo valores iniciales y condiciones de borde para factura.cls \def\@@Proveedor{Proveedor:} \def\@@Cliente{Cliente:} -%% i) Carácter de fin de línea en el cuadro de la factura, -%% ii) carácter para separar el teléfono del e-mail del cliente, -%% iii) carácter para los campos vacíos cuando se usa \ItemX, -%% iv) carácter para las celdas vacíos cuando la descripción del ítem ocupa más que una línea. -\def\@CaracterEOL{$\hookleftarrow$} +%% i) carácter para separar el teléfono del e-mail del cliente, +%% ii) carácter para los campos vacíos cuando se usa \ItemX, +%% iii) carácter para las celdas vacíos cuando la descripción del ítem ocupa más que una línea. +%% iv) carácter de retorno de carro en el cuadro de la factura, \def\@CaracterSeparaTelefonoEmail{$\diamond$} \def\@CaracterItemXVacio{...} \def\@CaracterCeldasVacias{$\cdot$} +\def\@CaracterCR{$\lcurvearrowsw\!$}% (del paquete MnSymbol) +%% \def\@CaracterCR{$\hookleftarrow$}% también puede usarse este. + +%% Separación entre la última letra y el carácter que indica que se continúa en la línea siguiente en la descripción cuando ocupa más de una línea. No vale la pena hacer una macro para cambiar esto. +\setlength{\@SeparaFinLineaDesc}{0.05cm} %% Separación entre el inicio de una columna en la tabla y el inicio del texto. \tabcolsep=0.15cm |