diff options
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r-- | Master/texmf-dist/doc/latex/factura/README | 2 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/factura/factura-beispiel-rechnung.tex | 2 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/factura/factura-ejemplo-aux.tex | 1 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura06.tex | 2 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura09.tex | 2 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura10.tex | 7 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/factura/factura-ejemplo-prefactura.pdf | bin | 222706 -> 222706 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex | 2 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/factura/factura.pdf | bin | 2703078 -> 2707139 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/factura/factura.dtx | 1732 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/factura/factura.cls | 1671 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/factura/factura.def | 14 |
12 files changed, 1897 insertions, 1538 deletions
diff --git a/Master/texmf-dist/doc/latex/factura/README b/Master/texmf-dist/doc/latex/factura/README index bc92d7eb091..ce9cf944328 100644 --- a/Master/texmf-dist/doc/latex/factura/README +++ b/Master/texmf-dist/doc/latex/factura/README @@ -1,4 +1,4 @@ -<factura> +<factura> * Brief description in english * diff --git a/Master/texmf-dist/doc/latex/factura/factura-beispiel-rechnung.tex b/Master/texmf-dist/doc/latex/factura/factura-beispiel-rechnung.tex index 5c19d3c7fd7..dbb0f4642d9 100644 --- a/Master/texmf-dist/doc/latex/factura/factura-beispiel-rechnung.tex +++ b/Master/texmf-dist/doc/latex/factura/factura-beispiel-rechnung.tex @@ -87,7 +87,7 @@ nospanish, \def\@@DenomFactura{Rechnung} \def\@@DenomCotiza{Voranschlag} % \LetraNumeracion{\fontsize{14}{14}\bfseries} -\renewcommand{\@EstiloDenom}{\@LetraDenom\@Denominacion-\if@sinnumero\else\@LetraNumeracion Nr:\space\@Num\fi} +\renewcommand{\@EstiloDenom}{\@LetraDenom\@Denominacion-\ifsinnumero\else\@LetraNumeracion Nr:\space\@Num\fi} \renewcommand{\@EstiloNumControl}{} \makeatother diff --git a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-aux.tex b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-aux.tex index cc6e2ede898..86a00d5ac74 100644 --- a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-aux.tex +++ b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-aux.tex @@ -63,6 +63,7 @@ \begin{itemize} \DescEjemplo \end{itemize} + \catcode`\%=14 \catcode`\<=13 \catcode`\>=13 } diff --git a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura06.tex b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura06.tex index 85ef37e0f5d..c6f6b350a74 100644 --- a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura06.tex +++ b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura06.tex @@ -91,6 +91,8 @@ todosiva, \Descripcion{ + Se facturaron en total \arabic{NumItem} artículos. + En el artículo número \itemref{primeritem} se facturaron \cantref{primeritem} \descref{primeritem} por un valor de \Moneda\puref{primeritem} cada uno, dando un subtotal por este elemento de \Moneda\subtref{primeritem}; el descuento en ese artículo es del \dctoref{primeritem}\%, dando un total de \Moneda\ptref{primeritem}, y esta gravado con IVA de \ivaref{primeritem}\%. La base imponible total de esta factura es de \Moneda\numprint\BIG; el IVA es de \Moneda\numprint\AlicuotaG, el descuento presidencial en el IVA es de \Moneda\numprint\AlicuotaGDesc, y el total final es de \Moneda\numprint\Total. diff --git a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura09.tex b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura09.tex index b1f00fa3f52..0b98d92e666 100644 --- a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura09.tex +++ b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura09.tex @@ -76,7 +76,7 @@ electro, \SepCondiciones{16pt} \LineaCondiciones{0.4pt}{4pt}{3pt} -\Condiciones{La factura se emitió el \DTMusedate{FechaEmision} con crédito de \Credito{} dias, siendo su fecha de vencimiento el \DTMusedate{FechaVencimiento}.} +\Condiciones{La factura se emitió el \Fecha{} con crédito de \Credito{} dias, siendo su fecha de vencimiento el \FechaVencimiento.} \NotaPrevia{\hfill LA NOTA PREVIA} \NotaExterna{LA NOTA EXTERNA} diff --git a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura10.tex b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura10.tex index a13df5358bf..5dec81e8a34 100644 --- a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura10.tex +++ b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-factura10.tex @@ -39,6 +39,7 @@ %%<desc> %% Escribimos una factura %% Escribimos en el reverso de la factura +%% Establecemos las opciones de la clase a través de comandos %% (sinlineasv) Sin lineas verticales %% (sinlineash) Sin lineas horizontales %% (electro) Con descuento en IVA al pagar por medios electrónicos @@ -52,12 +53,14 @@ %%</desc> %% \documentclass[ +filas, % luego queda sin efecto con \filasfalse en el preámbulo sinlineasv, sinlineash, -electro, -vencimiento, +csv, % luego queda sin efecto con \csvfalse en el preámbulo ]{factura} +\electrotrue \vencimientotrue \filasfalse \csvfalse + \input{factura-ejemplo-aux.tex}% Se incluye para efectos del ejemplo, así tendremos disponible la macro \Ejemplo. \usepackage[utf8]{inputenc} diff --git a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-prefactura.pdf b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-prefactura.pdf Binary files differindex 57379561f50..49eed588527 100644 --- a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-prefactura.pdf +++ b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-prefactura.pdf diff --git a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex index 22c329adeef..2160f8ab340 100644 --- a/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex +++ b/Master/texmf-dist/doc/latex/factura/factura-ejemplo-reporte2.tex @@ -90,6 +90,8 @@ soloreporte, \begin{reporte} El reporte - página 1\newpage El reporte - página 2 \newpage El reporte - página 3. + Se facturaron en total \arabic{NumItem} artículos. + En el artículo número \itemref{primeritem} se facturaron \cantref{primeritem} \descref{primeritem} por un valor de \Moneda\puref{primeritem} cada uno, dando un subtotal por este elemento de \Moneda\subtref{primeritem}; el descuento en ese artículo es del \dctoref{primeritem}\%, dando un total de \Moneda\ptref{primeritem}, y esta gravado con IVA de \ivaref{primeritem}\%. La base imponible total de esta factura es de \Moneda\numprint\BIG; el IVA es de \Moneda\numprint\AlicuotaG, el descuento presidencial en el IVA es de \Moneda\numprint\AlicuotaGDesc, y el total final es de \Moneda\numprint\Total. diff --git a/Master/texmf-dist/doc/latex/factura/factura.pdf b/Master/texmf-dist/doc/latex/factura/factura.pdf Binary files differindex 77e014c6365..63908bf50ef 100644 --- a/Master/texmf-dist/doc/latex/factura/factura.pdf +++ b/Master/texmf-dist/doc/latex/factura/factura.pdf diff --git a/Master/texmf-dist/source/latex/factura/factura.dtx b/Master/texmf-dist/source/latex/factura/factura.dtx index a710d2cfca3..9245bc92a08 100644 --- a/Master/texmf-dist/source/latex/factura/factura.dtx +++ b/Master/texmf-dist/source/latex/factura/factura.dtx @@ -173,7 +173,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %<class>\ProvidesClass{factura} %<def>\ProvidesFile{factura.def} %<*class|def> -[2017/12/11 v3.40 +[2018/03/13 v3.44 %<class>Clase para elaborar facturas legales %<class>en la República Bolivariana de Venezuela. %<def>Archivo de valores iniciales y condiciones de borde para factura.cls @@ -398,11 +398,17 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. % v3.02 -> Esta versión v3.02 se saca porque la versión 3.9 de |fancyhdr| hizo necesaria esta actualización por un error que daba con los reportes por el uso en esta clase de la macro |\fancy@setoffs|. Lo que hacíamos con esa macro de |fancyhdr| lo hicimos ahora de otra forma mejor, dada la incompatibilidad con la nueva versión de ese paquete.%v3.02 - Esta versión se saca por los cambios en la política impositiva decretados por el Presidente en Decreto número 3085 relativos a descuentos del 3\% y 5\% en el IVA general cuando los pagos se hacen por medios electrónicos; también se corrigió la tasa de IVA adicional. + La versión 3.40 se saca por los cambios en la política impositiva decretados por el Presidente en Decreto número 3085 relativos a descuentos del 3\% y 5\% en el IVA general cuando los pagos se hacen por medios electrónicos; también se corrigió la tasa de IVA adicional.%v3.40 - Adicionalmente se agregaron nuevas opciones en cuanto al manejo de la fecha de emisión y su formato, posibilidad de facturas a crédito con fecha de vencimiento, campos nuevos adicionales para agregar más textos en la factura, posibilidad de imprimir información en el reverso de la hoja de la factura, posibilidades nuevas en cuanto al posicionamiento de los elementos fijos, diseño \tikz más versátil en los cuadros con bordes, mejor manejo del archivo |.csv|, cambios en los nombres de algunos comandos y opciones. + En la versión 3.40 se agregaron nuevas opciones en cuanto al manejo de la fecha de emisión y su formato, posibilidad de facturas a crédito con fecha de vencimiento, campos nuevos adicionales para agregar más textos en la factura, posibilidad de imprimir información en el reverso de la hoja de la factura, posibilidades nuevas en cuanto al posicionamiento de los elementos fijos, diseño \tikz más versátil en los cuadros con bordes, mejor manejo del archivo |.csv|, cambios en los nombres de algunos comandos y opciones.%v3.40 - Finalmente se cambió la estructura de la sección de los comandos en esta documentación y se agregó una página de descripción al final de cada ejemplo. + En la misma versión 3.40 se cambió la estructura de la sección de los comandos en esta documentación y se agregó una página de descripción al final de cada ejemplo.%v3.40 + + El cambio en la política impositiva reflejado en la versión 3.40 queda sin efecto para fines legales, ya no está vigente dicho descuento; sin embargo, no eliminamos el código que lo produce sino que la clase arroja una advertencia cuando se pide usar la opción de descuentos por pago electrónico.%v3.44 + + La versión actual 3.44 nos permite activar cualquier opción de la clase a través de condicionales en el preámbulo y no solamente como una opción al cargar la clase; también se puede ahora quitar el efecto de cualquier opción previamente dada al cargar la clase, esto con el propósito de hacer más versátil el uso de las opciones y así poder incluirlas también en archivos |.tex| o |.def| personalizados.%v3.44 + + Adicionalmente la versión 3.44 escribe en el archivo |.log| todas las opciones que fueron pedidas al cargar la clase.%v3.44 \section*{Agradecimientos} @@ -558,6 +564,10 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. % \changes{v3.40}{2017/12/11}{Quitada la macro \cs{mostrar}. Ahora cada texto a mostrar se hace con el mismo comando con el que se definió.} % \changes{v3.40}{2017/12/11}{Algunos condicionales cambiados.} % \changes{v3.40}{2017/12/11}{Otra vez corregida la macro interna \cs{@DescripcionAuxCmd} y arreglado el espaciado entre los ítems; ojalá que esta vez sí esté bien.} +% \changes{v3.44}{2018/03/13}{Reestructurado el archivo \texttt{.cls} para aceptar prender y apagar las opciones de la clase a través de condicionales de \TeX{} con el mismo nombre de la opción.} +% \changes{v3.44}{2018/03/13}{Se cambió un \cs{AtBeginDocument} que escribía texto en la hoja por un \cs{AfterEndPreamble}.} +% \changes{v3.44}{2018/03/13}{Se acabó el descuento del IVA. Ahora advierte cuando se usa, posibilitando su uso después si llegan a volver a activar la medida.} +% \changes{v3.44}{2018/03/13}{Cada opción cargada escribe un comentario en el archivo \texttt{.log} para depuración.} % % % \tableofcontents @@ -728,7 +738,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. % % \section{Opciones al cargar la clase\label{sec:opciones}} % -% Al cargar la clase con |\documentclass| se le puede dar opciones de la siguiente lista, para cambiar su comportamiento: +% Al cargar la clase con |\documentclass| podemos dar distintas opciones según el comportamiento que queramos; dichas opciones están descritas en esta sección y cualquier opción cargada se verá como comentario en el archivo |.log| de la compilación bajo el texto “{\ttfamily Opción cargada: }” con el nombre de la opción pedida. % % % \subsection{Sobre el tipo de documento a producir} @@ -876,6 +886,12 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. % \DescribeOption{csv} % Escribe un archivo csv con la información numérica de la factura. % +% \subsection{Activación y desactivación de opciones desde comandos} +% +% Cualquiera de estas opciones también se puede activar o desactivar en el preámbulo y así poder incluirlas dentro de archivos que vayan a ser cargados con |\input| o |\include| como se explicará en la subsección \ref{subsec:aux}. Esto significa que podremos desactivar una opción que hayamos dado en |\documentclass| o activar alguna que no hayamos activado allí. +% +% Para hacer eso debemos usar el condicional que cada opción maneja y activarlo o desactivarlo de la forma como se hace en \TeX{}. El condicional de cada opción tiene el mismo nombre de la opción. Por ejemplo, para quitar las lineas verticales (|sinlineasv|) usaríamos |\sinlineasvtrue| en el preámbulo, o para desactivar la creación del archivo |.csv|, previamente activada en |\documentclass|, usaríamos |\csvfalse|. +% % } % % @@ -1578,7 +1594,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. % % \section{Referencias a los valores establecidos y a los totales\label{sec:ref}} % -% En el preámbulo el usuario definió distintas macros, es decir, estableció la razón social del cliente, su R.I.F., la dirección, entre otras cosas. Cualquiera de esas definiciones hechas en el preámbulo puede consultarse luego en otra parte del documento usando el comando que se usó para su definición, es decir, tenemos las siguientes macros: \cs{RazonSocial}, \cs{RIF}, \cs{Direccion}, \cs{Telefono}, \cs{Email}, \cs{Contacto}, \cs{Emisor}, \cs{Conforme}, \cs{Proveedor}, \cs{Credito}, \cs{Num}, \cs{NumSerieControl}, \cs{NumControl}, \cs{Condiciones}, \cs{Resumen}, \cs{NotaPrevia}, \cs{NotaInterna}, \cs{NotaExterna}; ellas en el preámbulo funcionarán para definir valores y textos, por ejemplo, como ya sabemos, establecemos la razón social así: \cs{RazonSocial{...}}, pero si ya no estamos en el preámbulos sino dentro del cuerpo del documento y llamamos a la macro \cs{RazonSocial}\footnote{Dentro del cuerpo del documento estas macros no aceptan parámetros.}, ella nos va a escribir el texto que definimos en el preámbulo como la razón social. Eso es usable con todas las macros que acabamos de mencionar, incluyendo las que definen textos largos como las notas o las condiciones. +% En el preámbulo el usuario definió distintas macros, es decir, estableció la razón social del cliente, su R.I.F., la dirección, entre otras cosas. Cualquiera de esas definiciones hechas en el preámbulo puede consultarse luego en otra parte del documento usando el comando que se usó para su definición, es decir, tenemos las siguientes macros: \cs{RazonSocial}, \cs{RIF}, \cs{Direccion}, \cs{Telefono}, \cs{Email}, \cs{Contacto}, \cs{Emisor}, \cs{Conforme}, \cs{Proveedor}, \cs{Fecha}, \cs{FechaVencimiento}\footnote{La fecha de vencimiento no se establece en el preámbulo explícitamente sino a través de \cs{Credito} pero la clase dispone de esta interfaz para acceder a ella así como también con la interfaz dada por \texttt{datetime2}.}, \cs{Credito}, \cs{Num}, \cs{NumControl}, \cs{NumSerieControl}, \cs{Condiciones}, \cs{Resumen}, \cs{NotaPrevia}, \cs{NotaInterna}, \cs{NotaExterna}, \cs{TituloReporte}; ellas en el preámbulo funcionarán para definir valores y textos, por ejemplo, como ya sabemos, establecemos la razón social así: \cs{RazonSocial{...}}, pero si ya no estamos en el preámbulos sino dentro del cuerpo del documento y llamamos a la macro \cs{RazonSocial}\footnote{Dentro del cuerpo del documento estas macros no aceptan parámetros.}, ella nos va a escribir el texto que definimos en el preámbulo como la razón social. Eso es usable con todas las macros que acabamos de mencionar, incluyendo las que definen textos largos como las notas o las condiciones. % % Por otra parte, también el usuario puede referirse al signo monetario con el comando |\Moneda|, y a cualquiera de los totales de la siguiente tabla\footnote{Las macros de la tabla, para representarlas en el mismo formato que en la factura, debemos usar la macro \cs{numprint}.}: % @@ -1594,7 +1610,9 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. % \hline % \end{tabular} % -% También ya mencionamos que la fecha de emisión y vencimiento se pueden acceder con la interfaz dada por el paquete |datetime2|, por ejemplo, para mostrar la fecha de emisión, usaríamos \cs{DTMusedate\{FechaEmision\}} y para la fecha de vencimiento, \cs{DTMusedate\{FechaVencimiento\}}. También aclaramos ya que la cantidad de ítems en la factura lo podemos acceder via el contador |NumItem|, por ejemplo así \cs{arabic\{NumItem\}}. +% También ya mencionamos que la fecha de emisión y vencimiento se pueden acceder con la interfaz dada por el paquete |datetime2|, por ejemplo, para mostrar la fecha de emisión, podremos usar tanto \cs{Fecha} como \cs{DTMusedate\{FechaEmision\}}, y para la fecha de vencimiento, tanto \cs{FechaVencimiento} como \cs{DTMusedate\{FechaVencimiento\}}. +% +% La cantidad de ítems en la factura la podemos acceder via el contador |NumItem|, por ejemplo así \cs{arabic\{NumItem\}}. % % En los ejemplos hay casos con todas estas funciones de esta sección. % @@ -1917,37 +1935,55 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \newbool{FirmasYnegativo}% no hay FirmasXnegativo; hay X_inicial y X_final para las firmas. %% Condicionales relativos a opciones de la clase. -\newif\if@prefactura -\newif\if@cotizacion -\newif\if@nospanish -\newif\if@sinivaexpresado -\newif\if@todosiva -\newif\if@sinfirmas -\newif\if@unafirma -\newif\if@filas -\newif\if@agrupado -\newif\if@centrado -\newif\if@descuentos -\newif\if@denom -\newif\if@vencimiento -\newif\if@sinnumero -\newif\if@sintotales -\newif\if@conlineasha -\newif\if@linea -\newif\if@G -\newif\if@csv +\newif\ifagrupado +\newif\ifcentradesc +\newif\ifcentrado +\newif\ifconlineasha +\newif\ifconreporte +\newif\ifcotizacion +\newif\ifcsv +\newif\ifdcu +\newif\ifdenom +\newif\ifdescuentos +\newif\ifdosfirmas +\newif\ifduc +\newif\ifelectro +\newif\ifexpandecuadro +\newif\iffilas +\newif\ifG +\newif\ifimpdesc +\newif\ifiva +\newif\iflinea +\newif\ifnospanish +\newif\ifnumitem +\newif\ifprefactura +\newif\ifsincantidad +\newif\ifsinexpandir +\newif\ifsinfirmas +\newif\ifsiniva +\newif\ifsinivaexpresado +\newif\ifsinlineash +\newif\ifsinlineashe +\newif\ifsinlineashi +\newif\ifsinlineasv +\newif\ifsinlineasve +\newif\ifsinlineasvi +\newif\ifsinmarcas +\newif\ifsinnumero +\newif\ifsinreverso +\newif\ifsintotales +\newif\ifsoloreporte +\newif\ifsubtotal +\newif\iftodosiva +\newif\iftwoside +\newif\ifunafirma +\newif\ifvencimiento + +%% Condicionales auxiliares. \newif\if@cdu \@cdutrue -\newif\if@dcu -\newif\if@duc -\newif\if@expandecuadro \newif\if@factura \@facturatrue \newif\if@reverso \@reversotrue \newif\if@reporte -\newif\if@impdesc -\newif\if@centradesc -\newif\if@sinmarcas - -%% Condicionales auxiliares. \newif\if@FondoFactura \newif\if@FondoReporte \newif\if@FondoReporteStar @@ -1969,7 +2005,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \newif\if@DescEnum \newif\if@DescuentoTotal - %% Longitudes para uso interno. \newlength{\@TamDatos} \newlength{\@TamResumen} @@ -2053,136 +2088,68 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %% Contadores. \newcounter{@IVANoGeneral}% '0' con sólo IVA G, '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos. +\newcounter{@Firmas}% '0' para sinfirmas, '1' para unafirma, y '2' para dosfirmas. +\setcounter{@Firmas}{2} \newcounter{NumItem}% Número del ítem actual, para uso de algunas macros en el cuadro de la factura y para cuando se usa la opción 'numitem'. \newcount\AuxFecha -% Errores, advertencias e informaciones de LaTeX. +%% Errores, advertencias e informaciones de LaTeX. \newcommand{\CLASSERROR}[1]{\ClassError{factura}{** #1. **}{}} \newcommand{\CLASSWARNING}[1]{\ClassWarning{factura}{** #1. **}{}} \newcommand{\CLASSINFO}[1]{\ClassInfo{factura}{** #1. **}{}} -% Opciones de la clase. -\DeclareOption{prefactura}{\@prefacturatrue\@denomtrue\@sinfirmastrue}% La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente. -\DeclareOption{cotizacion}{\@cotizaciontrue\@denomtrue\@unafirmatrue}% Cambia la denominación a 'COTIZACIÓN' y no 'FACTURA'. -\DeclareOption{nospanish}{\@nospanishtrue}% No carga babel en castellano ni la codificación T1 de las letras. -\DeclareOption{sinfirmas}{\@sinfirmastrue}% No agrega los espacios para firmar. -\DeclareOption{unafirma}{\@unafirmatrue\@sinfirmasfalse}% No agrega el espacio para que firme quien recibe. -\DeclareOption{dosfirmas}{\@unafirmafalse\@sinfirmasfalse}% Pone las dos firmas para firmar. -\DeclareOption{descuentos}{\booltrue{Descuentos}\@descuentostrue}% Para los descuentos individuales. -\DeclareOption{iva}{\@impdesctrue\booltrue{IVA}}% Para la columna del IVA. -\DeclareOption{subtotal}{% Para la columna extra del subtotal antes del descuento. - \if@descuentos - \booltrue{Subtotal} - \else - \CLASSWARNING{La opción 'subtotal' no aplica sin descuentos individuales. Sin efecto opción 'subtotal'} - \fi} -\DeclareOption{denom}{\@denomtrue}% Agrega el texto con la denominación del documento, para las formas libres que no tienen el número de factura. -\DeclareOption{vencimiento}{\@vencimientotrue}% Escribe fecha de vencimiento, aún con facturas sin crédito. -\DeclareOption{sinnumero}{\@sinnumerotrue\@denomtrue}% Escribir el texto de la denominación del documento pero sin escribir el número. -\DeclareOption{G}{\@Gtrue}% Con esta opción sale la letra 'G' en los items con IVA general, y sale el porcentaje en la base imponible general. -\DeclareOption{filas}{\@filastrue}% Estilo de totalización en filas. -\DeclareOption{sintotales}{\@sintotalestrue% No escribe los totales al final, por ejemplo para cotizaciones de productos similares. - \if@filas - \CLASSWARNING{La opción 'sintotales' no aplica para el modo de totalización en filas. Sin efecto opción 'filas'} - \@filasfalse - \fi - \if@cotizacion - \else - \CLASSWARNING{La opción 'sintotales' no debe usarse en facturas sino en cotizaciones. No es válida una factura sin totales} - \fi} -\DeclareOption{centrado}{% Total y exento 'centrado'; sólo para estilo 'filas' - \if@filas - \@centradotrue - \else - \CLASSWARNING{La opción 'centrado' no es compatible con el modo de totalización en columnas. Sin efecto opción 'centrado'} - \fi} -\DeclareOption{agrupado}{% Agrupados los elementos totalizadores en el modo en columnas. - \if@filas - \CLASSWARNING{La opción 'agrupado' no es compatible con el modo de totalización en filas. Sin efecto opción 'agrupado'} - \else - \@agrupadotrue - \fi} -\DeclareOption{impdesc}{\@impdesctrue}% Para el tipo de impuesto en la descripción y no en el precio unitario y total. -\DeclareOption{centradesc}{\@centradesctrue}% Para centrar la descripción de cada ítem. -\DeclareOption{sinmarcas}{\@sinmarcastrue}% Para evitar que aparezcan los caracteres especiales cuando la descripción es larga. -\DeclareOption{numitem}{\booltrue{NumItem}}% Para poner una columna extra al principio con el número del ítem. -\DeclareOption{dcu}{% Descripción, luego cantidad y luego precio unitario. - \@dcutrue\@cdufalse\@ducfalse - \booltrue{DCU}\boolfalse{DUC} - \booltrue{PrimeroDescripcion}} -\DeclareOption{duc}{% Descripción, luego precio unitario y luego cantidad. - \if@dcu - \CLASSWARNING{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones} - \boolfalse{PrimeroDescripcion}\boolfalse{DCU}\@dcufalse\@cdutrue - \else - \@ductrue\@cdufalse\@dcufalse - \booltrue{DUC}\boolfalse{DCU} - \booltrue{PrimeroDescripcion} - \fi} -\DeclareOption{siniva}{\AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}}% No cobra IVA. -\DeclareOption{todosiva}{\@todosivatrue}% Con esta opción salen todos los IVA así valgan cero. -\DeclareOption{electro}{% Parche por el Decreto 3085 de Nikolài. - \booltrue{Electro} - \gdef\@NotaInterna{\@TextoDescuentoPresidencial} - \CLASSINFO{Se estableció el texto aclaratorio del descuento presidencial como 'nota interna'} - \if@filas - \CLASSWARNING{La opción 'electro' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'} - \@filasfalse - \fi} -\DeclareOption{sinivaexpresado}{% Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA. - \@sinivaexpresadotrue - \if@filas - \CLASSWARNING{La opción 'sinivaexpresado' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'} - \@filasfalse - \else - \AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}} - \fi} -\DeclareOption{sincantidad}{% Para no poner el campo de la cantidad. - \booltrue{SinCantidad} - \if@dcu - \CLASSWARNING{La opción 'sincantidad' no es compatible con 'dcu' . Sin efecto opción 'dcu'} - \@dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescripcion} - \fi - \if@duc - \CLASSWARNING{La opción 'sincantidad' no es compatible con 'duc' . Sin efecto opción 'duc'} - \@ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescripcion} - \fi} -\DeclareOption{conlineasha}{\@conlineashatrue}% Una línea horizontal para cada ítem, como las facturas a mano. -\DeclareOption{sinlineasv}{% Estilo 'sinlineasv'. - \booltrue{SinLineasVertExt}\booltrue{SinLineasVertInt}} -\DeclareOption{sinlineasvi}{\booltrue{SinLineasVertInt}}% Estilo 'sinlineasvi'. -\DeclareOption{sinlineasve}{\booltrue{SinLineasVertExt}}% Estilo 'sinlineasve'. -\DeclareOption{sinlineash}{% Estilo 'sinlineash'. - \booltrue{SinLineasHoriExt}\booltrue{SinLineasHoriInt}} -\DeclareOption{sinlineashi}{\booltrue{SinLineasHoriInt}}% Estilo 'sinlineashi'. -\DeclareOption{sinlineashe}{\booltrue{SinLineasHoriExt}}% Estilo 'sinlineashe'. -\DeclareOption{expandecuadro}{\@expandecuadrotrue\boolfalse{ExpAbajo}}% Para rellenar con líneas en blanco de manera automática. -\DeclareOption{sinexpandir}{\boolfalse{ExpAbajo}\@expandecuadrofalse}% No expande ninguna de las dos partes de la factura. -\DeclareOption{linea}{% Para la línea que protege el espacio en blanco. - \if@expandecuadro - \@lineatrue - \else - \CLASSWARNING{La opción 'linea' requiere la opción 'expandecuadro'. Sin efecto opción 'linea'} - \fi} -\DeclareOption{conreporte}{\@reportetrue}% Para imprimir factura y reporte. -\DeclareOption{soloreporte}{\@reportetrue\@facturafalse\@reversofalse}% Para imprimir sólo el reporte. -\DeclareOption{sinreverso}{\@reversofalse}% Para no imprimir el reverso de la factura. -\DeclareOption{twoside}{\PassOptionsToClass{twoside}{article}}% Opción 'twoside' de article para los reportes. -\DeclareOption{csv}{% Para la salida en modo csv también. - \if@factura - \@csvtrue - \if@sintotales\else\AtEndDocument{\@EscribeTotalesEnCSV}\fi - \else - \CLASSWARNING{La opción 'csv' require generar la factura. Sin efecto opción 'csv'} - \fi} +%% Opciones de la clase. +\DeclareOption{agrupado}{\agrupadotrue}% Agrupados los elementos totalizadores en el modo en columnas. +\DeclareOption{centradesc}{\centradesctrue}% Para centrar la descripción de cada ítem. +\DeclareOption{centrado}{\centradotrue}% Total y exento 'centrado'; sólo para estilo 'filas' +\DeclareOption{conlineasha}{\conlineashatrue}% Una línea horizontal para cada ítem, como las facturas a mano. +\DeclareOption{conreporte}{\conreportetrue}% Para imprimir factura y reporte. +\DeclareOption{cotizacion}{\cotizaciontrue}% Cambia la denominación a 'COTIZACIÓN' y no 'FACTURA'. +\DeclareOption{csv}{\csvtrue}% Para la salida en modo csv también. +\DeclareOption{dcu}{\dcutrue}% Descripción, luego cantidad y luego precio unitario. +\DeclareOption{denom}{\denomtrue}% Agrega el texto con la denominación del documento, para las formas libres que no tienen el número de factura. +\DeclareOption{descuentos}{\descuentostrue}% Para los descuentos individuales. +\DeclareOption{dosfirmas}{\dosfirmastrue}% Pone las dos firmas para firmar. +\DeclareOption{duc}{\ductrue}% Descripción, luego precio unitario y luego cantidad. +\DeclareOption{electro}{\electrotrue}% Parche por el Decreto 3085 de Nikolài. +\DeclareOption{expandecuadro}{\expandecuadrotrue}% Para rellenar con líneas en blanco de manera automática. +\DeclareOption{filas}{\filastrue}% Estilo de totalización en filas. +\DeclareOption{G}{\Gtrue}% Con esta opción sale la letra 'G' en los items con IVA general, y sale el porcentaje en la base imponible general. +\DeclareOption{impdesc}{\impdesctrue}% Para el tipo de impuesto en la descripción y no en el precio unitario y total. +\DeclareOption{iva}{\ivatrue}% Para la columna del IVA. +\DeclareOption{linea}{\lineatrue}% Para la línea que protege el espacio en blanco. +\DeclareOption{nospanish}{\nospanishtrue}% No carga babel en castellano ni la codificación T1 de las letras. +\DeclareOption{numitem}{\numitemtrue}% Para poner una columna extra al principio con el número del ítem. +\DeclareOption{prefactura}{\prefacturatrue}% La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente. +\DeclareOption{sincantidad}{\sincantidadtrue}% Para no poner el campo de la cantidad. +\DeclareOption{sinexpandir}{\sinexpandirtrue}% No expande ninguna de las dos partes de la factura. +\DeclareOption{sinfirmas}{\sinfirmastrue}% No agrega los espacios para firmar. +\DeclareOption{sinivaexpresado}{\sinivaexpresadotrue}% Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA. +\DeclareOption{siniva}{\sinivatrue}% No cobra IVA. +\DeclareOption{sinlineashe}{\sinlineashetrue}% Estilo 'sinlineashe'. +\DeclareOption{sinlineashi}{\sinlineashitrue}% Estilo 'sinlineashi'. +\DeclareOption{sinlineash}{\sinlineashtrue}% Estilo 'sinlineash'. +\DeclareOption{sinlineasve}{\sinlineasvetrue}% Estilo 'sinlineasve'. +\DeclareOption{sinlineasvi}{\sinlineasvitrue}% Estilo 'sinlineasvi'. +\DeclareOption{sinlineasv}{\sinlineasvtrue}% Estilo 'sinlineasv'. +\DeclareOption{sinmarcas}{\sinmarcastrue}% Para evitar que aparezcan los caracteres especiales cuando la descripción es larga. +\DeclareOption{sinnumero}{\sinnumerotrue}% Escribir el texto de la denominación del documento pero sin escribir el número. +\DeclareOption{sinreverso}{\sinreversotrue}% Para no imprimir el reverso de la factura. +\DeclareOption{sintotales}{\sintotalestrue}% No escribe los totales al final, por ejemplo para cotizaciones de productos similares. +\DeclareOption{soloreporte}{\soloreportetrue}% Para imprimir sólo el reporte. +\DeclareOption{subtotal}{\subtotaltrue}% Para la columna extra del subtotal antes del descuento. +\DeclareOption{todosiva}{\todosivatrue}% Con esta opción salen todos los IVA así valgan cero. +\DeclareOption{twoside}{\twosidetrue}% Opción 'twoside' de article para los reportes. +\DeclareOption{unafirma}{\unafirmatrue}% No agrega el espacio para que firme quien recibe. +\DeclareOption{vencimiento}{\vencimientotrue}% Escribe fecha de vencimiento, aún con facturas sin crédito. \ProcessOptions\relax \LoadClass[12pt]{article} +%% Cargamos algunos paquetes siempre necesarios. \RequirePackage{xparse}% Algunos comandos los definimos con \NewDocumentCommand. \RequirePackage[absolute]{textpos}% Es necesario 'textpos' para colocar texto en ubicaciones arbitrarias. -\RequirePackage{geometry}% 'geometry' para ajustar todos los márgenes. \RequirePackage{eso-pic}% Para el comando \AddToShipoutPicture. \RequirePackage{xstring}% Lo usamos sólo para tomar el menos al principio de una longitud. \RequirePackage{calc}% 'calc' para hacer aritmética con las dimensiones. @@ -2214,83 +2181,254 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \DTMfdef{ddmmyyyy}#1#2#3#4#5#6#7#8&{\DTMs{#5#6#7#8-#3#4-#1#2}} \DTMfdef{mm-dd-yyyy}#1-#2-#3&{\DTMs{#3-#1-#2}} -\AtEndPreamble{\DTMsetstyle{\@FormatoFecha}\DTMsetup{datesep=\@FechaSeparadores}\gdef\DTMinformat{\@FormatoFechaEntrada}} -\def\@Fecha{\DTMusedate{FechaEmision}} +\AtEndPreamble{ + % Establecemos los parámetros y macros relativas a la fecha. + \DTMsetstyle{\@FormatoFecha}\DTMsetup{datesep=\@FechaSeparadores}\gdef\DTMinformat{\@FormatoFechaEntrada} + + % Tomamos las acciones pertinentes dependiendo de las opciones de la clase (o condicionales activados en el preámbulo que cambian las opciones de la clase) + \ifprefactura + \ifcotizacion + \prefacturafalse + \cotizacionfalse + \CLASSWARNING{Las opciones 'prefactura' y 'cotizacion' no son compatibles. Sin efecto ambas opciones} + \else + \denomtrue\setcounter{@Firmas}{0} + \fi + \fi + \ifcotizacion\denomtrue\setcounter{@Firmas}{1}\fi + + \ifsinlineasv\booltrue{SinLineasVertExt}\booltrue{SinLineasVertInt}\fi + \ifsinlineasvi\booltrue{SinLineasVertInt}\fi + \ifsinlineasve\booltrue{SinLineasVertExt}\fi + \ifsinlineash\booltrue{SinLineasHoriExt}\booltrue{SinLineasHoriInt}\fi + \ifsinlineashi\booltrue{SinLineasHoriInt}\fi + \ifsinlineashe\booltrue{SinLineasHoriExt}\fi + + \ifdosfirmas + \setcounter{@Firmas}{2} + \ifunafirma + \unafirmafalse + \ifsinfirmas + \sinfirmasfalse + \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'} + \else + \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'} + \fi + \else + \ifsinfirmas + \sinfirmasfalse + \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'} + \fi + \fi + \fi + \ifunafirma + \setcounter{@Firmas}{1} + \ifsinfirmas + \sinfirmasfalse + \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'unafirma'} + \fi + \fi + \ifsinfirmas\setcounter{@Firmas}{0}\fi + + \ifdcu + \@cdufalse\ducfalse + \booltrue{DCU}\boolfalse{DUC} + \booltrue{PrimeroDescripcion} + \fi + \ifduc + \ifdcu + \boolfalse{PrimeroDescripcion}\boolfalse{DCU}\dcufalse\ducfalse\@cdutrue + \CLASSWARNING{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones} + \else + \ductrue\@cdufalse\dcufalse + \booltrue{DUC}\boolfalse{DCU} + \booltrue{PrimeroDescripcion} + \fi + \fi + \ifnumitem\booltrue{NumItem}\fi + \ifsincantidad + \booltrue{SinCantidad} + \ifdcu + \dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescripcion} + \CLASSWARNING{La opción 'sincantidad' no es compatible con 'dcu'. Sin efecto opción 'dcu'} + \fi + \ifduc + \ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescripcion} + \CLASSWARNING{La opción 'sincantidad' no es compatible con 'duc'. Sin efecto opción 'duc'} + \fi + \fi + \ifdescuentos\booltrue{Descuentos}\fi + \ifiva\impdesctrue\booltrue{IVA}\fi + \ifsubtotal + \ifdescuentos + \booltrue{Subtotal} + \else + \CLASSWARNING{La opción 'subtotal' no aplica sin descuentos individuales. Sin efecto opción 'subtotal'} + \fi + \fi -%% Una vez definido todo en el preámbulo los comandos usados para definir campos servirán para mostrar el campo que se definió con ese comando. -\AtEndPreamble{% - \def\RazonSocial{\@RazonSocial} - \let\Nombre\RazonSocial - \def\RIF{\@RIF} - \let\CI\RIF - \def\Direccion{\@Direccion} - \def\Telefono{\@Telefono} - \def\Email{\@Email} - \def\Contacto{\@Contacto} - \def\Emisor{\@Emisor} - \def\Conforme{\@Conforme} - \def\Proveedor{\@Proveedor} - \def\Credito{\@Credito} - \def\Num{\@Num} - \def\NumSerieControl{\@NumSerieControl} - \def\NumControl{\@NumControl} - \def\Condiciones{\@Condiciones} - \def\Resumen{\@Resumen} - \def\NotaPrevia{\@NotaPrevia} - \def\NotaInterna{\@NotaInterna} - \def\NotaExterna{\@NotaExterna}} - -\AtBeginDocument{% Efectúa distintos chequeos. - \if@reporte - \ifdefvoid{\@Num}{\CLASSWARNING{No se especificó el número de la factura. Puede dar error si el título del reporte no se especifica que aparezca en las cabeceras}}{}% - \ifdefvoid{\@Proveedor}{% - \ifdefvoid{\@Emisor} - {\CLASSERROR{Hay que definir el nombre del proveedor cuando se emite un reporte}}% - {\CLASSWARNING{Se toma el emisor como el proveedor por no haberse especificado este último}% - \let\@Proveedor=\@Emisor}} - {}% + \ifsinnumero\denomtrue\fi + \ifsintotales + \iffilas + \filasfalse + \CLASSWARNING{La opción 'sintotales' no aplica para el modo de totalización en filas. Sin efecto opción 'filas'} + \fi + \ifcotizacion + \else + \CLASSWARNING{La opción 'sintotales' no debe usarse en facturas sino en cotizaciones. No es válida una factura sin totales} + \fi \fi - \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razón social}}{}% - \if@factura - \ifdefvoid{\@RIF}{\CLASSERROR{Hay que definir el R.I.F}}{}% - \ifdefvoid{\@Direccion}{\CLASSERROR{Hay que definir la dirección fiscal}}{}% - \ifdefvoid{\@Telefono}{\CLASSWARNING{Pudiera definirse un número telefónico}}{}% - \ifdefvoid{\@Email}{\CLASSWARNING{Pudiera definirse una dirección de correo electrónico}}{}% - \ifdefvoid{\@Condiciones}{\CLASSWARNING{Pudieran definirse las condiciones del documento}}{}% - \DTMifsaveddate{FechaEmision}{}{% - \CLASSWARNING{No se especificó fecha. Asumiendo la fecha de hoy}% - \DTMsavedate{FechaEmision}{\the\year-\the\month-\the\day}}% - \if@cotizacion - \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para cotizacion se recomienda agregar el fondo}}{}% + + \ifcentrado + \iffilas + \else + \centradofalse + \CLASSWARNING{La opción 'centrado' no es compatible con el modo de totalización en columnas. Sin efecto opción 'centrado'} \fi - \if@prefactura - \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para prefactura se recomienda agregar el fondo}}{}% + \fi + \ifagrupado + \iffilas + \agrupadofalse + \CLASSWARNING{La opción 'agrupado' no es compatible con el modo de totalización en filas. Sin efecto opción 'agrupado'} \fi - \if@sinnumero - \if@cotizacion - \else - \CLASSERROR{La opción para no poner el número sólo es compatible con las cotizaciones}% - \fi + \fi + + \ifelectro + \booltrue{Electro} + \gdef\@NotaInterna{\@TextoDescuentoPresidencial} + \CLASSWARNING{Ya no está vigente el descuento en la alícuota general. Aplicándolo igual como se pidió} + \CLASSINFO{Se estableció el texto aclaratorio del descuento presidencial como 'nota interna'} + \iffilas + \filasfalse + \CLASSWARNING{La opción 'electro' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'} \fi - \if@denom - \if@sinnumero - \else - \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el número de la factura}}{}% - \fi + \fi + + \iftodosiva \@BIRtrue \@BIAtrue \@Exentotrue \Gtrue \fi + \ifsiniva\AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}\fi + \ifsinivaexpresado + \iffilas + \filasfalse + \CLASSWARNING{La opción 'sinivaexpresado' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'} + \else + \AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}} \fi \fi - \ifdefvoid{\@Contacto}{\if@Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}% -} + + \iflinea + \RequirePackage{zref-savepos} + \ifexpandecuadro + \else + \CLASSWARNING{La opción 'linea' requiere la opción 'expandecuadro'. Activando la opción 'expandecuadro'} + \fi + \fi + \ifsinmarcas \def\@CaracterCR{\mbox{}} \def\@CaracterCeldasVacias{\mbox{}} \fi + \ifnospanish + \else + \RequirePackage[spanish]{babel}% Babel en castellano. + \RequirePackage[T1]{fontenc}% Codificación T1 para las tipografías. + \IfFileExists{lmodern.sty}{\RequirePackage{lmodern}}{} + \fi + + \ifexpandecuadro + \ifsinexpandir + \expandecuadrofalse + \sinexpandirfalse + \CLASSWARNING{Las opciones 'expandecuadro' y 'sinexpandir' no son compatibles. Sin efecto ambas opciones} + \else + \boolfalse{ExpAbajo} + \RequirePackage{zref-savepos}[2016/05/21]% Para guardar la posición en 'Y'. + \fi + \fi + \ifsinexpandir\boolfalse{ExpAbajo}\expandecuadrofalse\fi + + \ifsinreverso\@reversofalse\fi + \ifconreporte + \@reportetrue + \ifsoloreporte + \soloreportefalse + \CLASSWARNING{La opción 'soloreporte' no es compatible con 'conreporte'. Sin efecto 'soloreporte'} + \fi + \fi + \ifsoloreporte\@reportetrue\@facturafalse\@reversofalse\fi + + \if@reporte + \RequirePackage{zref-savepos}% Para la firma, que debe ser cargado aquí siempre que hay reporte porque \FirmaReporte no se ejecuta desde el preámbulo. + \fi + \ifcsv + \if@factura + \newwrite\csv \immediate\openout\csv=\jobname.csv + \ifsintotales\else\AtEndDocument{\@EscribeTotalesEnCSV}\fi + \else + \csvfalse + \CLASSWARNING{La opción 'csv' require generar la factura. Sin efecto opción 'csv'} + \fi + \fi + + \iftwoside + \@twosidetrue\@mparswitchtrue + \else + \@twosidefalse\@mparswitchfalse + \fi + + % Escribimos en el .log las opciones cargadas: + \ifagrupado \CLASSINFO{Opción cargada: agrupado}\fi + \ifcentradesc \CLASSINFO{Opción cargada: centradesc}\fi + \ifcentrado \CLASSINFO{Opción cargada: centrado}\fi + \ifconlineasha \CLASSINFO{Opción cargada: conlineasha}\fi + \ifconreporte \CLASSINFO{Opción cargada: conreporte}\fi + \ifcotizacion \CLASSINFO{Opción cargada: cotizacion}\fi + \ifcsv \CLASSINFO{Opción cargada: csv}\fi + \ifdcu \CLASSINFO{Opción cargada: dcu}\fi + \ifdenom \CLASSINFO{Opción cargada: denom}\fi + \ifdescuentos \CLASSINFO{Opción cargada: descuentos}\fi + \ifdosfirmas \CLASSINFO{Opción cargada: dosfirmas}\fi + \ifduc \CLASSINFO{Opción cargada: duc}\fi + \ifelectro \CLASSINFO{Opción cargada: electro}\fi + \ifexpandecuadro \CLASSINFO{Opción cargada: expandecuadro}\fi + \iffilas \CLASSINFO{Opción cargada: filas}\fi + \ifG \CLASSINFO{Opción cargada: G}\fi + \ifimpdesc \CLASSINFO{Opción cargada: impdesc}\fi + \ifiva \CLASSINFO{Opción cargada: iva}\fi + \iflinea \CLASSINFO{Opción cargada: linea}\fi + \ifnospanish \CLASSINFO{Opción cargada: nospanish}\fi + \ifnumitem \CLASSINFO{Opción cargada: numitem}\fi + \ifprefactura \CLASSINFO{Opción cargada: prefactura}\fi + \ifsincantidad \CLASSINFO{Opción cargada: sincantidad}\fi + \ifsinexpandir \CLASSINFO{Opción cargada: sinexpandir}\fi + \ifsinfirmas \CLASSINFO{Opción cargada: sinfirmas}\fi + \ifsiniva \CLASSINFO{Opción cargada: siniva}\fi + \ifsinivaexpresado \CLASSINFO{Opción cargada: sinivaexpresado}\fi + \ifsinlineash \CLASSINFO{Opción cargada: sinlineash}\fi + \ifsinlineashe \CLASSINFO{Opción cargada: sinlineashe}\fi + \ifsinlineashi \CLASSINFO{Opción cargada: sinlineashi}\fi + \ifsinlineasv \CLASSINFO{Opción cargada: sinlineasv}\fi + \ifsinlineasve \CLASSINFO{Opción cargada: sinlineasve}\fi + \ifsinlineasvi \CLASSINFO{Opción cargada: sinlineasvi}\fi + \ifsinmarcas \CLASSINFO{Opción cargada: sinmarcas}\fi + \ifsinnumero \CLASSINFO{Opción cargada: sinnumero}\fi + \ifsinreverso \CLASSINFO{Opción cargada: sinreverso}\fi + \ifsintotales \CLASSINFO{Opción cargada: sintotales}\fi + \ifsoloreporte \CLASSINFO{Opción cargada: soloreporte}\fi + \ifsubtotal \CLASSINFO{Opción cargada: subtotal}\fi + \iftodosiva \CLASSINFO{Opción cargada: todosiva}\fi + \iftwoside \CLASSINFO{Opción cargada: twoside}\fi + \ifunafirma \CLASSINFO{Opción cargada: unafirma}\fi + \ifvencimiento \CLASSINFO{Opción cargada: vencimiento}\fi + + % Cargamos aquí 'geometry' para que sea después de haber establecido 'twoside'. + \RequirePackage{geometry}} %% Escribimos el total como comentario en el .log, y avisamos cuando la fecha no sea la de hoy. \AtEndDocument{% - \DTMsavenow{Ahora}% - \DTMsaveddatediff{FechaEmision}{Ahora}{\AuxFecha}% + \DTMifsaveddate{FechaEmision}{% + \DTMsavenow{Ahora}% + \DTMsaveddatediff{FechaEmision}{Ahora}{\AuxFecha}}{}% \ifnum\AuxFecha=0% \else \CLASSWARNING{Fecha del documento \@Fecha\space distinta de la fecha de hoy}% \fi - \if@sintotales + \ifsintotales \else \if@factura\CLASSINFO{\@@Total: \space\space\space \Moneda \Total}\fi \fi} @@ -2406,8 +2544,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \def\flechaCR{% \raisebox{-0.4ex}{% \begin{tikzpicture} - \draw[line width=0.075ex] (0,0) arc (20:70:0.75ex) + (0,0) arc (-70:-20:0.75ex) ++ (0.8ex,0.55ex) arc (0:-100:1ex); - \end{tikzpicture}}} + \draw[line width=0.075ex] (0,0) arc (20:70:0.75ex) + (0,0) arc (-70:-20:0.75ex) ++ (0.8ex,0.55ex) arc (0:-100:1ex); + \end{tikzpicture}}} %% Separación entre el inicio de una columna en la tabla y el inicio del texto. \tabcolsep=0.15cm @@ -2443,9 +2581,12 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \IfBooleanTF{#1} {\AtEndPreamble{\DTMsavedate{FechaEmision}{#2-#3-#4}}} {\AtEndPreamble{\DTMsavedatex{FechaEmision}{#2}}}} +\def\@Fecha{\DTMusedate{FechaEmision}} + \NewDocumentCommand{\FormatoFecha}{o g g}{% \IfValueT{#1}{\gdef\@FormatoFechaEntrada{#1}}\IfValueT{#2}{\gdef\@FormatoFecha{#2}}\IfValueT{#3}{\gdef\@FechaSeparadores{#3}}} -\def\Credito#1{\gdef\@Credito{#1}\@vencimientotrue} + +\def\Credito#1{\gdef\@Credito{#1}\vencimientotrue} \def\RazonSocial#1{\gdef\@RazonSocial{#1}} \def\Nombre#1{\gdef\@RazonSocial{#1}\@Nombretrue} \def\RIF#1{\gdef\@RIF{#1}} @@ -2508,6 +2649,47 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \NewDocumentCommand{\NotaExterna}{+m}{\gdef\@NotaExterna{#1}} \AtBeginDocument{% + % Efectuamos distintos chequeos. + \if@reporte + \ifdefvoid{\@Num}{\CLASSWARNING{No se especificó el número de la factura. Puede dar error si el título del reporte no se especifica que aparezca en las cabeceras}}{}% + \ifdefvoid{\@Proveedor}{% + \ifdefvoid{\@Emisor} + {\CLASSERROR{Hay que definir el nombre del proveedor cuando se emite un reporte}}% + {\CLASSWARNING{Se toma el emisor como el proveedor por no haberse especificado este último}% + \let\@Proveedor=\@Emisor}} + {}% + \fi + \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razón social}}{}% + \if@factura + \ifdefvoid{\@RIF}{\CLASSERROR{Hay que definir el R.I.F}}{}% + \ifdefvoid{\@Direccion}{\CLASSERROR{Hay que definir la dirección fiscal}}{}% + \ifdefvoid{\@Telefono}{\CLASSWARNING{Pudiera definirse un número telefónico}}{}% + \ifdefvoid{\@Email}{\CLASSWARNING{Pudiera definirse una dirección de correo electrónico}}{}% + \ifdefvoid{\@Condiciones}{\CLASSWARNING{Pudieran definirse las condiciones del documento}}{}% + \DTMifsaveddate{FechaEmision}{}{% + \CLASSWARNING{No se especificó fecha. Asumiendo la fecha de hoy}% + \DTMsavedate{FechaEmision}{\the\year-\the\month-\the\day}}% + \ifcotizacion + \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para cotizacion se recomienda agregar el fondo}}{}% + \fi + \ifprefactura + \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para prefactura se recomienda agregar el fondo}}{}% + \fi + \ifsinnumero + \ifcotizacion + \else + \CLASSERROR{La opción para no poner el número sólo es compatible con las cotizaciones}% + \fi + \fi + \ifdenom + \ifsinnumero + \else + \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el número de la factura}}{}% + \fi + \fi + \fi + \ifdefvoid{\@Contacto}{\if@Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}% + % El cálculo de la fecha de vencimiento para cuando haya crédito o fecha de vencimiento explícita. \ifdefvoid{\@Credito} {\gdef\@FechaVencimiento{\DTMusedate{FechaEmision}}} @@ -2528,7 +2710,32 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \FPupn\@DescuentoGfactor{100 \@DescuentoGporc{} /}% \FPupn\@DescuentoRfactor{100 \@DescuentoRporc{} /}% \FPupn\@DescuentoAfactor{100 \@DescuentoAporc{} /}% - \FPupn\@DescuentoEfactor{100 \@DescuentoEporc{} /}} + \FPupn\@DescuentoEfactor{100 \@DescuentoEporc{} /} + + % Una vez definido todo en el preámbulo, los comandos usados para definir campos servirán para mostrar el campo que se definió con ese comando. + \def\RazonSocial{\@RazonSocial}% + \let\Nombre\RazonSocial + \def\RIF{\@RIF}% + \let\CI\RIF + \def\Direccion{\@Direccion}% + \def\Telefono{\@Telefono}% + \def\Email{\@Email}% + \def\Contacto{\@Contacto}% + \def\Emisor{\@Emisor}% + \def\Conforme{\@Conforme}% + \def\Proveedor{\@Proveedor}% + \def\Fecha{\@Fecha}% + \def\FechaVencimiento{\@FechaVencimiento}% + \def\Credito{\@Credito}% + \def\Num{\@Num}% + \def\NumSerieControl{\@NumSerieControl}% + \def\NumControl{\@NumControl}% + \def\Condiciones{\@Condiciones}% + \def\Resumen{\@Resumen}% + \def\NotaPrevia{\@NotaPrevia}% + \def\NotaInterna{\@NotaInterna}% + \def\NotaExterna{\@NotaExterna}% + \def\TituloReporte{\@TituloReporte}} %</class> %<*class|def> @@ -2767,17 +2974,18 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %<*class> %% Comando para incluir la firma escaneada en el sitio donde va la línea de la firma del emisor. \NewDocumentCommand{\FirmaFactura}{m O{0pt} O{0pt}}{% \FirmaFactura{imagen}[x-corr][y-corr] - \if@factura - \RequirePackage{graphicx} - \ifx&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi - \ifx&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi - \savebox{\@CajaFirmaEmisor}{#1} - \AtBeginShipoutNext{% - \begin{textblock*}{\@TamLineaFirmas}% - (\textwidth+\oddsidemargin+1in-\@TamLineaFirmas/2-\wd\@CajaFirmaEmisor/2-\@PosFirmasXdos+\@FirmaFacturaXcorr,\@PosFirmasY-\ht\@CajaFirmaEmisor-\dp\@CajaFirmaEmisor+\@FirmaFacturaYcorr)% - \usebox{\@CajaFirmaEmisor}% - \end{textblock*}}% - \fi} + \AtEndPreamble{ + \if@factura + \RequirePackage{graphicx} + \ifx&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi + \ifx&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi + \savebox{\@CajaFirmaEmisor}{#1} + \AtBeginShipoutNext{% + \begin{textblock*}{\@TamLineaFirmas}% + (\textwidth+\oddsidemargin+1in-\@TamLineaFirmas/2-\wd\@CajaFirmaEmisor/2-\@PosFirmasXdos+\@FirmaFacturaXcorr,\@PosFirmasY-\ht\@CajaFirmaEmisor-\dp\@CajaFirmaEmisor+\@FirmaFacturaYcorr)% + \usebox{\@CajaFirmaEmisor}% + \end{textblock*}}% + \fi}} \NewDocumentCommand{\FirmaReporte}{O{} O{0pt} O{0pt} G{\@Proveedor} O{\@FirmaReportePosX} O{\@FirmaReporteExcesoLinea}}{% \Firma[imagen][x-corr][y-corr]{texto}[posición en X desde la derecha][tamaño linea] \renewcommand{\baselinestretch}{1}\selectfont @@ -2826,20 +3034,22 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %% Con \FondoFactura le damos el nombre del archivo que contiene el formato de la factura, por ejemplo para compilaciones con 'prefactura', 'cotizacion' o para incluir una imagen de fondo como 'marca de agua'. \newcommand{\FondoFactura}[1]{ - \if@factura - \RequirePackage{graphicx} - \@FondoFacturatrue - \gdef\@FondoFactura{#1} - \fi} + \AtEndPreamble{ + \if@factura + \RequirePackage{graphicx} + \@FondoFacturatrue + \gdef\@FondoFactura{#1} + \fi}} %% Con \FondoReporte le damos el nombre del archivo que contiene el formato del reporte. Existen dos posibilidades: que dicho fondo salga en todas las páginas o sólo en la primera. \NewDocumentCommand{\FondoReporte}{s m}{ - \if@reporte - \@FondoReportetrue - \RequirePackage{graphicx} - \gdef\@FondoReporte{#2} - \IfBooleanT{#1}{\@FondoReporteStartrue}% Con * sale en todas las páginas; sin * sale sólo en la primera página. - \fi} + \AtEndPreamble{ + \if@reporte + \@FondoReportetrue + \RequirePackage{graphicx} + \gdef\@FondoReporte{#2} + \IfBooleanT{#1}{\@FondoReporteStartrue}% Con * sale en todas las páginas; sin * sale sólo en la primera página. + \fi}} %% Comando para establecer desde el preámbulo el estilo de página (\pagestyle) del reporte, tanto para la primera página como para las siguientes. \NewDocumentCommand{\EstiloPagReporte}{o m}{ @@ -2861,43 +3071,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \input{factura.def}% Cargamos los valores predeterminados. -\if@todosiva - \@BIRtrue - \@BIAtrue - \@Exentotrue - \@Gtrue -\fi - -\if@csv% Abre el archivo csv. - \newwrite\csv - \immediate\openout\csv=\jobname.csv -\fi - -\if@nospanish -\else - \RequirePackage[spanish]{babel}% Babel en castellano. - \RequirePackage[T1]{fontenc}% Codificación T1 para las tipografías. - \IfFileExists{lmodern.sty}{\RequirePackage{lmodern}}{} -\fi - -\if@expandecuadro - \RequirePackage{zref-savepos}[2016/05/21]% Para guardar la posición en 'Y'. -\fi - -\if@reporte - \RequirePackage{zref-savepos}% Para la firma, que debe ser cargado aquí porque \FirmaReporte no se ejecuta desde el preámbulo. -\fi - -\if@sinmarcas - \def\@CaracterCR{\mbox{}} - \def\@CaracterCeldasVacias{\mbox{}} -\fi - %% Comando para escribir el encabezado en la factura. \newcommand\@EncabezadoFactura{% \ifdefvoid{\@Resumen}{\@EscribeDatos}{\@EscribeDatosResumen}% \vspace*{\@SeparaVertical}% - \if@expandecuadro\else\vfill\fi} + \ifexpandecuadro\else\vfill\fi} %% Comando para escribir el encabezado en el reporte. \newcommand\@EncabezadoReporte{% @@ -2934,11 +3112,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %% 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]{% - \if@impdesc\settowidth{\@TempDimen}{\@EscribeTipoDeImpuesto{#2}}\fi + \ifimpdesc\settowidth{\@TempDimen}{\@EscribeTipoDeImpuesto{#2}}\fi \savebox{\@CajaPrueba}{% \parbox[t]{\linewidth}{% \David@XStart - \if@centradesc\centering\arraybackslash\fi + \ifcentradesc\centering\arraybackslash\fi #1% \David@XEnd \ifdim\@TempDimen=0pt% @@ -2946,7 +3124,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \hfill\kern\@SeparaFinLineaDesc\@EscribeTipoDeImpuesto{#2}% \fi \par\global\count1=\prevgraf}}% - \if@sinmarcas + \ifsinmarcas \usebox{\@CajaPrueba}% \else \ifnum\count1=1% @@ -2958,7 +3136,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \fi \parbox[t]{\linewidth-\@TempDimen-\@SeparaFinLineaDesc}{% \David@XStart - \if@centradesc\centering\arraybackslash\fi + \ifcentradesc\centering\arraybackslash\fi #1% \David@XEnd \par @@ -2967,7 +3145,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \count2=\prevgraf \loop \ifnum\count0=\count2 - \if@impdesc + \ifimpdesc \vskip-\baselineskip \mbox{}\hfill \rlap{% @@ -3031,11 +3209,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %% Presentación de totales en modo de columnas. \newcommand{\@EscribeTotalCol}[1]{% \expandafter\FPifeq\csname Desc#1\endcsname{0}% - \if@sinivaexpresado\else\@EscribeTotalColBI{#1}\fi + \ifsinivaexpresado\else\@EscribeTotalColBI{#1}\fi \else \@EscribeTotalColSubt{#1}% \@EscribeTotalColDesc{#1}% - \if@sinivaexpresado\else\@EscribeTotalColBI{#1}\fi + \ifsinivaexpresado\else\@EscribeTotalColBI{#1}\fi \fi} %% Forma agupada para la presentación de totales en modo de columnas. @@ -3048,7 +3226,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \if@BIR\if@DescR\@EscribeTotalColDesc{R}\fi\fi \if@DescG\@EscribeTotalColDesc{G}\fi \if@BIA\if@DescA\@EscribeTotalColDesc{A}\fi\fi - \if@sinivaexpresado + \ifsinivaexpresado \else \if@Exento\@EscribeTotalColBI{E}\fi \if@BIR\@EscribeTotalColBI{R}\fi @@ -3064,7 +3242,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \@LetraTitTotales \csname @@BI#1\endcsname \ifx#1E% \else - \if@G\ \hfill(\csname @Alicuota#1porc\endcsname\%)\else\mbox{}\fi + \ifG\ \hfill(\csname @Alicuota#1porc\endcsname\%)\else\mbox{}\fi \fi & \@LetraNumTotales\numprint{\csname BI#1\endcsname} \\} @@ -3107,7 +3285,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \newcommand{\@EscribeTotalFilasBIizq}[1]{% \@LetraTitTotales\csname @@BI#1\endcsname \ifx#1G% - \if@G \ (\@AlicuotaGporc\%)\fi% Si hay otra B.I. que no sea general, escribimos el porcentaje explícito en la general. + \ifG \ (\@AlicuotaGporc\%)\fi% Si hay otra B.I. que no sea general, escribimos el porcentaje explícito en la general. \else \ifx#1E% \else @@ -3176,14 +3354,14 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \hspace*{\@SepTotales}\usebox{\@CajaAliG}% \if@Exento\hspace*{\@SepTotales}\usebox{\@CajaBIE}\fi \hspace*{\@SepTotales}\usebox{\@CajaTotal}% - \if@centrado\hspace*{\@SepTotales}\fi} + \ifcentrado\hspace*{\@SepTotales}\fi} \newcommand{\@EscribeTotalesFilasGxET}{% \if@BIR\hspace*{\@SepTotales}\usebox{\@CajaBIAliR}\fi \hspace*{\@SepTotales}\usebox{\@CajaBIAliG}% \if@BIA\hspace*{\@SepTotales}\usebox{\@CajaBIAliA}\fi \hspace*{\@SepTotales}\if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi - \if@centrado\hspace*{\@SepTotales}\fi} + \ifcentrado\hspace*{\@SepTotales}\fi} \newcommand{\@EscribeTotalesFilasRGA}{% \hspace*{\@SepTotales}\usebox{\@CajaBIAliR}% @@ -3194,12 +3372,12 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \newcommand{\@EscribeTotalesFilasRGAET}{% \@EscribeTotalesFilasRGA \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi - \if@centrado\hspace*{\@SepTotales}\fi} + \ifcentrado\hspace*{\@SepTotales}\fi} %% Escribe la letra que designa al tipo de impuesto que aplica al ítem. \NewDocumentCommand{\@EscribeTipoDeImpuesto}{m}{% % Hay que abrir un grupo de ejecución porque el cambio en la tipografía altera la celda. - {\if@G + {\ifG \@LetraTipoIVA \ifx#1G\@DenomAlicuotaG\fi \ifx#1R\@DenomAlicuotaR\fi @@ -3302,23 +3480,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. % Novena y última línea. \ifbool{SinLineasVertExt}{}{|}} -%% Comando auxiliar para abrir la tabla del cuadro de la factura y expandir completamente las columnas. -\edef\@FacturaAuxInicioCmd{\noexpand\begin{tabularx}{\textwidth}{\@FacturaAuxColumnasEval}} - -%% Comando auxiliar para abrir el '\multicolumn' para los totales en el modo de columnas y expandir completamente las columnas cuando hay o no barras verticales. -\edef\@ColumnasMultiColumnTotalesAuxCmd{% - \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|} r}\begingroup - \noexpand\ifdim \noexpand\ht\noexpand\@CajaEspacioVacio=0pt - \noexpand\else - \noexpand\if@linea\noexpand\zsaveposx{LineaNodoBCoordX}\noexpand\zsaveposy{LineaNodoBCoordY}\noexpand\fi\noexpand\fi% Fijamos la posición (x,y) final para la línea ya que estaremos justo en el punto donde escribimos el total, y hasta allí llega la línea en el modo de columnas. - \noexpand\begin{tabular}[b]{@{\noexpand\extracolsep{2\noexpand\tabcolsep}}lr \ifbool{SinLineasVertExt}{}{|}}} - -%% Comando auxiliar para abrir el '\multicolumn' de la nota interna y evalúe la presencia o no de las barras verticales. -\edef\@ColumnasMultiColumnNotaIntAuxCmd{% - \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|}l\ifbool{SinLineasVertExt}{}{|}}{% - \noexpand\parbox[t]{\linewidth-2\tabcolsep-2\arrayrulewidth}{\noexpand\@LetraNotaInterna\noexpand\@NotaInterna\noexpand\strut}}% - \noexpand\\} - %% Comando para hacer los cálculos sobre cada ítem y establecer las macros con el contenido de cada ítem introducido. \NewDocumentCommand{\@CalculaItem}{m m m o m m}{% \addtocounter{NumItem}{1}% @@ -3327,7 +3488,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \ifbool{Descuentos} {\ifx\\#6\\\FPset\Dcto{0}\else\FPupn\Dcto{#6 \@DigitosPorc{} round clip}\fi}% Fijamos en 0 el descuento si no se especifica en \Item***. {\FPset\Dcto{#6}% - \FPifeq\Dcto{0}\else\CLASSWARNING{Se pidió un descuento individual sin dar la opción de la clase 'descuentos'. No se tomará en cuenta.}\fi + \FPifeq\Dcto{0}\else\CLASSWARNING{Se pidió un descuento individual sin dar la opción de la clase 'descuentos'. No se tomará en cuenta}\fi \FPset\Dcto{0}}% También fijamos en 0 el descuento por si se especifica en \Item*** pero no se pide la opción 'descuentos'. \FPupn\PrecioS{#2 \PrecioU{} * \@DigitosMoneda{} round}% \FPupn\PrecioT{100 \Dcto{} 100 - / \PrecioS{} * \@DigitosMoneda{} round}% @@ -3383,502 +3544,519 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \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@expandecuadro - \setlength{\@EspacioVacioInicial}{\zposy{EspacioVacioInicial}sp}% - \setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}% - \global\@EspacioVacioInicial=\@EspacioVacioInicial% Hay que globalizarlas - \global\@EspacioVacioFinal=\@EspacioVacioFinal - \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{0pt}{% - \if@linea - \if@LineaCompleta - \zsaveposy{LineaNodoBCoordY}% - \else - \if@LineaHastaTotal +%% Todo esto tiene que estar dentro de \AtEndPreamble que es cuando \if@factura, \if@reverso e \if@reporte fueron ya aplicadas, y para que se evalúen adecuadamente en su momento las definiciones hechas con \edef. +\AtEndPreamble{ + % Comando auxiliar para abrir la tabla del cuadro de la factura y expandir completamente las columnas. + \edef\@FacturaAuxInicioCmd{\noexpand\begin{tabularx}{\textwidth}{\@FacturaAuxColumnasEval}} + + % Comando auxiliar para abrir el '\multicolumn' de la nota interna y evalúe la presencia o no de las barras verticales. + \edef\@ColumnasMultiColumnNotaIntAuxCmd{% + \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|}l\ifbool{SinLineasVertExt}{}{|}}{% + \noexpand\parbox[t]{\linewidth-2\tabcolsep-2\arrayrulewidth}{\noexpand\@LetraNotaInterna\noexpand\@NotaInterna\noexpand\strut}}% + \noexpand\\} + + % Comando auxiliar para abrir el '\multicolumn' para los totales en el modo de columnas y expandir completamente las columnas cuando hay o no barras verticales. + \edef\@ColumnasMultiColumnTotalesAuxCmd{% + \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|} r}\begingroup + \noexpand\ifdim \noexpand\ht\noexpand\@CajaEspacioVacio=0pt + \noexpand\else + \noexpand\iflinea\noexpand\zsaveposx{LineaNodoBCoordX}\noexpand\zsaveposy{LineaNodoBCoordY}\noexpand\fi\noexpand\fi% Fijamos la posición (x,y) final para la línea ya que estaremos justo en el punto donde escribimos el total, y hasta allí llega la línea en el modo de columnas. + \noexpand\begin{tabular}[b]{@{\noexpand\extracolsep{2\noexpand\tabcolsep}}lr \ifbool{SinLineasVertExt}{}{|}}} + + % 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]{% + \ifexpandecuadro + \setlength{\@EspacioVacioInicial}{\zposy{EspacioVacioInicial}sp}% + \setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}% + \global\@EspacioVacioInicial=\@EspacioVacioInicial% Hay que globalizarlas + \global\@EspacioVacioFinal=\@EspacioVacioFinal + \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{0pt}{% + \iflinea + \if@LineaCompleta + \zsaveposy{LineaNodoBCoordY}% \else - \zsaveposx{LineaNodoACoordX}\mbox{}\hfill \zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}% + \if@LineaHastaTotal + \else + \zsaveposx{LineaNodoACoordX}\mbox{}\hfill \zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}% + \fi \fi + \fi}}% + \ifdim \ht\@CajaEspacioVacio=0pt \global\lineafalse \fi + \fi + + \ifx\undefined\Total\relax\else\CLASSERROR{Parece ya haberse usado un entorno de factura}\fi + % + % Comandos \David@SavePos, \David@XStart, \David@XEnd, \David@XPad, \David@XLeft y \David@XRight para poder manejar el salto de línea en las columnas adyacentes a la columna 'X' del tabularx (la descripción), cuando esta ocupa más que una línea. + % Gracias a David Carlisle (Thanks to David Carlisle). + % http://tex.stackexchange.com/questions/111203/tabularx-bottom-alignment-on-r-or-l-columns-when-x-column-wraps + \def\David@SavePos##1{\leavevmode\pdfsavepos\write\@auxout{\gdef\noexpand##1{\the\pdflastypos sp}}}% + \def\David@XStart{\expandafter\David@SavePos\csname save@start@\romannumeral\value{NumItem}\endcsname}% + \def\David@XEnd{\expandafter\David@SavePos\csname save@end@\romannumeral\value{NumItem}\endcsname}% + \def\David@XPad##1##2##3{% + \vtop{% + \baselineskip\normalbaselineskip + ##2% + \expandafter + \ifx\csname save@start@##1\endcsname + \relax + \else + \dimen@\csname save@start@##1\endcsname\relax + \loop + \ifdim\dimen@>\csname save@end@##1\endcsname + \advance\dimen@-\baselineskip + \settowidth{\@TempDimen}{##3}% + \ifdim\@TempDimen=0pt\settowidth{\@TempDimen}{##2}\fi + \hbox{\parbox{\@TempDimen}{\@CaracterCeldasVacias}}% + \repeat \fi - \fi}}% - \ifdim \ht\@CajaEspacioVacio=0pt \global\@lineafalse \fi - \fi - - \ifx\undefined\Total\relax\else\CLASSERROR{Parece ya haberse usado un entorno de factura}\fi - % - % Comandos \David@SavePos, \David@XStart, \David@XEnd, \David@XPad, \David@XLeft y \David@XRight para poder manejar el salto de línea en las columnas adyacentes a la columna 'X' del tabularx (la descripción), cuando esta ocupa más que una línea. - % Gracias a David Carlisle (Thanks to David Carlisle). - % http://tex.stackexchange.com/questions/111203/tabularx-bottom-alignment-on-r-or-l-columns-when-x-column-wraps - \def\David@SavePos##1{\leavevmode\pdfsavepos\write\@auxout{\gdef\noexpand##1{\the\pdflastypos sp}}}% - \def\David@XStart{\expandafter\David@SavePos\csname save@start@\romannumeral\value{NumItem}\endcsname}% - \def\David@XEnd{\expandafter\David@SavePos\csname save@end@\romannumeral\value{NumItem}\endcsname}% - \def\David@XPad##1##2##3{% - \vtop{% - \baselineskip\normalbaselineskip - ##2% - \expandafter - \ifx\csname save@start@##1\endcsname - \relax + ##3}}% + \def\David@XLeft##1{\David@XPad{\romannumeral\value{NumItem}}{\hbox{##1}}{}}% + \def\David@XRight##1{\David@XPad{\romannumeral\value{NumItem}}{}{\hbox{##1}}}% + % + % 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 para fijar la separación extra final de cada item, lo cual viene dado por la cantidad de líneas de la descripción, + % que está alojado en \count1, definido en \@DescripcionAuxCmd. + \def\@CalculaSeparaItemsExtraFinal{% + \setlength{\@SeparaItemsExtraFinal}{\numexpr\the\count1\normalbaselineskip-\normalbaselineskip+\@SeparaItemsExtra}% + \global\@SeparaItemsExtraFinal=\@SeparaItemsExtraFinal} + % + % Comando interno general para agregar cualquier ítem. + \NewDocumentCommand{\@ITEM}{m m m o m m}{% + % 1. [R|G|A|E|X]; 2. cantidad; 3. descripción; 4. descripción para el csv (entre corchetes); 5. p/u; 6. dcto. + \@CalculaItem{##1}{##2}{##3}{##5}{##6}% + % Si no es el primer ítem, entonces hace falta \\ para terminar el ítem anterior. + \ifnum\value{NumItem}=1% Aquí, \@CalculaItem aumenta en 1 el contador NumItem, que si vale 1 significa que aún no hemos procesado la línea 1, es decir, no hay que hacer el salto de línea. La última línea se termina en otro lado. \else - \dimen@\csname save@start@##1\endcsname\relax - \loop - \ifdim\dimen@>\csname save@end@##1\endcsname - \advance\dimen@-\baselineskip - \settowidth{\@TempDimen}{##3}% - \ifdim\@TempDimen=0pt\settowidth{\@TempDimen}{##2}\fi - \hbox{\parbox{\@TempDimen}{\@CaracterCeldasVacias}}% - \repeat + \@CalculaSeparaItemsExtraFinal + \\[\@SeparaItemsExtraFinal] + \ifconlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta. \fi - ##3}}% - \def\David@XLeft##1{\David@XPad{\romannumeral\value{NumItem}}{\hbox{##1}}{}}% - \def\David@XRight##1{\David@XPad{\romannumeral\value{NumItem}}{}{\hbox{##1}}}% - % - % 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 para fijar la separación extra final de cada item, lo cual viene dado por la cantidad de líneas de la descripción, - % que está alojado en \count1, definido en \@DescripcionAuxCmd. - \def\@CalculaSeparaItemsExtraFinal{% - \setlength{\@SeparaItemsExtraFinal}{\numexpr\the\count1\normalbaselineskip-\normalbaselineskip+\@SeparaItemsExtra}% - \global\@SeparaItemsExtraFinal=\@SeparaItemsExtraFinal} - % - % Comando interno general para agregar cualquier ítem. - \NewDocumentCommand{\@ITEM}{m m m o m m}{% - % 1. [R|G|A|E|X]; 2. cantidad; 3. descripción; 4. descripción para el csv (entre corchetes); 5. p/u; 6. dcto. - \@CalculaItem{##1}{##2}{##3}{##5}{##6}% - % Si no es el primer ítem, entonces hace falta \\ para terminar el ítem anterior. - \ifnum\value{NumItem}=1% Aquí, \@CalculaItem aumenta en 1 el contador NumItem, que si vale 1 significa que aún no hemos procesado la línea 1, es decir, no hay que hacer el salto de línea. La última línea se termina en otro lado. - \else - \@CalculaSeparaItemsExtraFinal - \\[\@SeparaItemsExtraFinal] - \if@conlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta. - \fi - % Primer -opcional- campo: El número del ítem. - \ifbool{NumItem}{\David@XLeft{\@NumItemAuxCmd{\mbox{}\hfill \@LetraNumeros \arabic{NumItem}\hfill\mbox{}}}}{}% - & - % Segundo campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc). - \ifbool{SinCantidad}{}{% - \ifbool{PrimeroDescripcion} - {\@DescripcionAuxCmd{##3}{##1}}% dcu y duc. - {\David@XLeft{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}}}% cdu. - & - % Tercer campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc). - \ifbool{PrimeroDescripcion}{% - \if@dcu - \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu. - \else - \David@XRight{\@PrecioUAuxCmd{% + % Primer -opcional- campo: El número del ítem. + \ifbool{NumItem}{\David@XLeft{\@NumItemAuxCmd{\mbox{}\hfill \@LetraNumeros \arabic{NumItem}\hfill\mbox{}}}}{}% + & + % Segundo campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc). + \ifbool{SinCantidad}{}{% + \ifbool{PrimeroDescripcion} + {\@DescripcionAuxCmd{##3}{##1}}% dcu y duc. + {\David@XLeft{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}}}% cdu. + & + % Tercer campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc). + \ifbool{PrimeroDescripcion}{% + \ifdcu + \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu. + \else + \David@XRight{\@PrecioUAuxCmd{% + \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% + \else + \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU} + \fi}}% duc. + \fi} + {\@DescripcionAuxCmd{##3}{##1}}% cdu. + & + % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc). + \FPifeq\PrecioU{##5}\else\CLASSWARNING{Se está introduciendo un precio con más de dos decimales: (##3 - ##5. Redondeado a \PrecioU)}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales. + \ifbool{SinCantidad}{}{% + \ifduc + \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% duc. + \else + \David@XRight{\@PrecioUAuxCmd{% + \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% + \else + \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU} + \fi}}% dcu y cdu. + \fi}% + & % Quinto -opcional- campo: Subtotal (para luego descuentos). + \ifbool{Subtotal}{% + \David@XRight{\@PrecioSAuxCmd{% \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% \else - \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU} - \fi}}% duc. - \fi} - {\@DescripcionAuxCmd{##3}{##1}}% cdu. - & - % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc). - \FPifeq\PrecioU{##5}\else\CLASSWARNING{Se está introduciendo un precio con más de dos decimales: (##3 - ##5. Redondeado a \PrecioU)}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales. - \ifbool{SinCantidad}{}{% - \if@duc - \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% duc. - \else - \David@XRight{\@PrecioUAuxCmd{% + \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioS} + \fi}}}{} + & + % Sexto -opcional- campo: Descuento. + \ifbool{Descuentos}{% + \David@XRight{\@DescuentoAuxCmd{% \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% \else - \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU} - \fi}}% dcu y cdu. - \fi}% - & % Quinto -opcional- campo: Subtotal (para luego descuentos). - \ifbool{Subtotal}{% - \David@XRight{\@PrecioSAuxCmd{% - \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% - \else - \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioS} - \fi}}}{} - & - % Sexto -opcional- campo: Descuento. - \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. - & - % Séptimo -opcional- campo: IVA. - \ifbool{IVA}{% - \David@XRight{\@IVAAuxCmd{% + \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}% + \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq. + & + % Séptimo -opcional- campo: IVA. + \ifbool{IVA}{% + \David@XRight{\@IVAAuxCmd{% + \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% + \else + \mbox{}\hfill \@LetraNumeros \numprint{\csname @Alicuota##1porc\endcsname}\%\hfill\mbox{}% + \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq. + & + % Octavo campo: El total. + \David@XRight{\@PrecioTAuxCmd{% \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% \else - \mbox{}\hfill \@LetraNumeros \numprint{\csname @Alicuota##1porc\endcsname}\%\hfill\mbox{}% - \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq. - & - % Octavo campo: El total. - \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 - \IfValueTF{##4}{\@EscribeItemsEnCSV{##1}{##2}{##4}}{\@EscribeItemsEnCSV{##1}{##2}{##3}}% - \fi}% - % - % Comando para escribir en el .csv. - \newcommand{\@EscribeItemsEnCSV}[3]{% - \ifbool{SinCantidad} - {\if@descuentos - \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}","\PrecioU","\Dcto","\PrecioT","##1"}% + \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioT} + \fi}}% + % Escribimos al csv. + \ifcsv + \IfValueTF{##4}{\@EscribeItemsEnCSV{##1}{##2}{##4}}{\@EscribeItemsEnCSV{##1}{##2}{##3}}% + \fi}% + % + % Comando para escribir en el .csv. + \newcommand{\@EscribeItemsEnCSV}[3]{% + \ifbool{SinCantidad} + {\ifdescuentos + \immediate\write\csv{"\unexpanded{##3}","\Dcto","\PrecioT","##1"}% \else - \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}% + \immediate\write\csv{"\unexpanded{##3}","\PrecioT","##1"}% + \fi} + {\if@cdu + \ifdescuentos + \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\Dcto","\PrecioT","##1"}% + \else + \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}% + \fi \fi - \fi - \if@dcu - \if@descuentos - \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\Dcto","\PrecioT","##1"}% - \else - \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\PrecioT","##1"}% + \ifdcu + \ifdescuentos + \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\Dcto","\PrecioT","##1"}% + \else + \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\PrecioT","##1"}% + \fi \fi - \fi - \if@duc - \if@descuentos - \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\Dcto","\PrecioT","##1"}% + \ifduc + \ifdescuentos + \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\Dcto","\PrecioT","##1"}% + \else + \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\PrecioT","##1"}% + \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 el número del ítem, si aplicara. + \if@LineaDesdeInicio \hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi + \ifbool{NumItem}{\@NumItemAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@NumItem \hfill\mbox{}}}{}% + & + % Avanzamos a la cantidad, o la descripción. + \ifbool{SinCantidad}{}{\ifbool{PrimeroDescripcion}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}}}% + &% Avanzamos hasta la descripción, la cantidad o el precio unitario. + \ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}} + {\if@cdu \@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}\fi + \ifdcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}\fi + \ifduc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}% + &% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'. + \ifbool{SinCantidad}{} + {% + \mbox{}\hfill + \ifduc + \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}% \else - \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\PrecioT","##1"}% - \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 el número del ítem, si aplicara. - \if@LineaDesdeInicio \hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi - \ifbool{NumItem}{\@NumItemAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@NumItem \hfill\mbox{}}}{}% - & - % Avanzamos a la cantidad, o la descripción. - \ifbool{SinCantidad}{}{\ifbool{PrimeroDescripcion}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}}}% - &% Avanzamos hasta la descripción, la cantidad o el precio unitario. - \ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}} - {\if@cdu \@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}\fi - \if@dcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}\fi - \if@duc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}% - &% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'. - \ifbool{SinCantidad}{} - {% - \mbox{}\hfill - \if@duc - \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}% + \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}% + \fi}% + &% Avanzamos hasta el subtotal, que puede o no existir, + \ifbool{Subtotal}{\@PrecioSAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioS \space (\Moneda)\hfill\mbox{}}}{}% + &% Avanzamos hasta el descuento, que puede o no existir. + \ifdescuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Descuento \hfill\mbox{}}\fi + &% Avanzamos hasta el IVA, que puede o no existir. + \ifbool{IVA}{\@IVAAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@IVA \hfill\mbox{}}}{} + &% Avanzamos hasta el precio total. + \@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitColumnas \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}% + \if@LineaCompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi + \\ + \ifbool{SinLineasHoriInt}{}{\hline}% + % + #1% Aquí entran todos los items que el usuario declara dentro del ambiente. + \@CalculaSeparaItemsExtraFinal + \\[\@SeparaItemsExtraFinal]% El último fin de línea se hace aquí. + \ifconlineasha\hline\fi% Se verifica si hace falta una línea horizontal o no. + \iffilas + % Esto en lugar de \ifexpandecuadro para que no se haga una linea vacía en la tabla cuando la caja está vacía. + \ifdim \ht\@CajaEspacioVacio=0pt + \ifdefvoid{\@NotaInterna}{% + \ifbool{SinLineasHoriExt}{}{% + \ifconlineasha\else\hline\fi}% Verificamos si hay que poner la línea horizontal. Si está 'conlineasha' ya salió debido a esta opción. + }{\@ColumnasMultiColumnNotaIntAuxCmd\ifbool{SinLineasHoriExt}{}{\hline}}% \else - \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}% - \fi}% - &% Avanzamos hasta el subtotal, que puede o no existir, - \ifbool{Subtotal}{\@PrecioSAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioS \space (\Moneda)\hfill\mbox{}}}{}% - &% Avanzamos hasta el descuento, que puede o no existir. - \if@descuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Descuento \hfill\mbox{}}\fi - &% Avanzamos hasta el IVA, que puede o no existir. - \ifbool{IVA}{\@IVAAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@IVA \hfill\mbox{}}}{} - &% Avanzamos hasta el precio total. - \@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitColumnas \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}% - \if@LineaCompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi - \\ - \ifbool{SinLineasHoriInt}{}{\hline}% - % - #1% Aquí entran todos los items que el usuario declara dentro del ambiente. - \@CalculaSeparaItemsExtraFinal - \\[\@SeparaItemsExtraFinal]% 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@expandecuadro para que no se haga una linea vacía en la tabla cuando la caja está vacía. - \ifdim \ht\@CajaEspacioVacio=0pt - \ifdefvoid{\@NotaInterna}{% - \ifbool{SinLineasHoriExt}{}{% - \if@conlineasha\else\hline\fi}% Verificamos si hay que poner la línea horizontal. Si está 'conlineasha' ya salió debido a esta opción. - }{\@ColumnasMultiColumnNotaIntAuxCmd\ifbool{SinLineasHoriExt}{}{\hline}}% - \else - \ifbool{PrimeroDescripcion}{&\usebox{\@CajaEspacioVacio}&&&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&&&\\}% - \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}% - \ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá. - \fi - \else - \ifbool{SinLineasHoriInt}{}{\if@conlineasha\else\hline\fi}% Línea que cierra los ítems en la tabla. - % Agregamos el espacio espúreo. - \ifdim \ht\@CajaEspacioVacio=0pt - \else - % Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica. - \ifbool{SinLineasVertExt}{\multicolumn{8}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{8}{|c|}{\usebox{\@CajaEspacioVacio}}}\\ - \fi - % Si pedimos sin totalizaciones, entonces cerramos la tabla ya, si no, calculamos los totales y los escribimos - \if@sintotales + \ifbool{PrimeroDescripcion}{&\usebox{\@CajaEspacioVacio}&&&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&&&\\}% + \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}% + \ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá. + \fi \else - % Modo de columnas: Abrimos la tabla para escribir los totales, y le agregamos las líneas verticales externas, si aplica. - \@ColumnasMultiColumnTotalesAuxCmd - \@CalculaTotalesI - \if@agrupado - \@EscribeTotalColAgrupado + \ifbool{SinLineasHoriInt}{}{\ifconlineasha\else\hline\fi}% Línea que cierra los ítems en la tabla. + % Agregamos el espacio espúreo. + \ifdim \ht\@CajaEspacioVacio=0pt \else - \if@Exento \@EscribeTotalCol{E}\fi - \if@BIR\@EscribeTotalCol{R}\if@sinivaexpresado\else\@EscribeTotalColAlicuota{R}\fi\fi - \@EscribeTotalCol{G}\if@sinivaexpresado\else\@EscribeTotalColAlicuota{G}\fi - \ifbool{Electro}{\@EscribeTotalColAlicuotaGDesc}{}% - \if@BIA\@EscribeTotalCol{A}\if@sinivaexpresado\else\@EscribeTotalColAlicuota{A}\fi\fi + % Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica. + \ifbool{SinLineasVertExt}{\multicolumn{8}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{8}{|c|}{\usebox{\@CajaEspacioVacio}}}\\ \fi - \if@sinivaexpresado\else\cline{2-2}\fi - \hfill \@LetraTitTotal\@@Total & \@LetraNumTotal\numprint{\Total}\\ - \end{tabular}\endgroup - \\ - \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}% - \ifbool{SinLineasHoriExt}{}{\hline}% - \fi - \fi - \end{tabularx}% - % - % Generamos la macro \Total vacía para que no dé error en algún posible uso dentro del documento. - \if@sintotales\gdef\Total{}\fi - % Si pedimos no totalizar (sintotales), la opción filas queda desactivada. - \if@filas - \@CalculaTotalesI - \@LetraNumTotales - \vspace*{\@SeparaVertical}\par - \if@expandecuadro\else\vfill\fi - \@GeneraCajasTotalesFilas - \newbox{\@CajaTotal}% - \savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total}: \@LetraNumTotal\numprint{\Total}}% - % - \ifnum \value{@IVANoGeneral}=0% - \newbox{\@CajaGET}% - \savebox{\@CajaGET}{\@EscribeTotalesFilasGET}% - \ifdim \the\wd\@CajaGET < \textwidth - \parbox{\textwidth}{\@EscribeTotalesFilasGET}% + % Si pedimos sin totalizaciones, entonces cerramos la tabla ya, si no, calculamos los totales y los escribimos + \ifsintotales \else - \hspace*{\@SepTotales}% - \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}% - \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi - \if@centrado\hspace*{\@SepTotales}\fi + % Modo de columnas: Abrimos la tabla para escribir los totales, y le agregamos las líneas verticales externas, si aplica. + \@ColumnasMultiColumnTotalesAuxCmd + \@CalculaTotalesI + \ifagrupado + \@EscribeTotalColAgrupado + \else + \if@Exento \@EscribeTotalCol{E}\fi + \if@BIR\@EscribeTotalCol{R}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{R}\fi\fi + \@EscribeTotalCol{G}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{G}\fi + \ifbool{Electro}{\@EscribeTotalColAlicuotaGDesc}{}% + \if@BIA\@EscribeTotalCol{A}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{A}\fi\fi + \fi + \ifsinivaexpresado\else\cline{2-2}\fi + \hfill \@LetraTitTotal\@@Total & \@LetraNumTotal\numprint{\Total}\\ + \end{tabular}\endgroup + \\ + \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}% + \ifbool{SinLineasHoriExt}{}{\hline}% \fi \fi - \ifnum \value{@IVANoGeneral}=1% - \newbox{\@CajaGxET}% - \savebox{\@CajaGxET}{\@EscribeTotalesFilasGxET}% - \ifdim \the\wd\@CajaGxET < \textwidth - \@EscribeTotalesFilasGxET - \else - \hspace*{\@SepTotales}% - \if@BIR\usebox{\@CajaBIAliR}\hspace*{\@SepTotales}\fi - \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}% - \if@BIA\usebox{\@CajaBIAliA}\hspace*{\@SepTotales}\fi - \\[\@SeparaFilas]\mbox{}% - \if@centrado\hspace*{\@SepTotales}\else\hfill\fi - \if@Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}% - \if@centrado\hspace*{\@SepTotales}\fi + \end{tabularx}% + % + % Generamos la macro \Total vacía para que no dé error en algún posible uso dentro del documento. + \ifsintotales\gdef\Total{}\fi + % Si pedimos no totalizar (sintotales), la opción filas queda desactivada. + \iffilas + \@CalculaTotalesI + \@LetraNumTotales + \vspace*{\@SeparaVertical}\par + \ifexpandecuadro\else\vfill\fi + \@GeneraCajasTotalesFilas + \newbox{\@CajaTotal}% + \savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total}: \@LetraNumTotal\numprint{\Total}}% + % + \ifnum \value{@IVANoGeneral}=0% + \newbox{\@CajaGET}% + \savebox{\@CajaGET}{\@EscribeTotalesFilasGET}% + \ifdim \the\wd\@CajaGET < \textwidth + \parbox{\textwidth}{\@EscribeTotalesFilasGET}% + \else + \hspace*{\@SepTotales}% + \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}% + \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi + \ifcentrado\hspace*{\@SepTotales}\fi + \fi \fi - \fi - \ifnum \value{@IVANoGeneral}=2% - \newbox{\@CajaRGAET}% - \savebox{\@CajaRGAET}{\@EscribeTotalesFilasRGAET}% - \ifdim \the\wd\@CajaRGAET < \textwidth - \@EscribeTotalesFilasRGAET - \else - \newbox{\@CajaRGA}% - \savebox{\@CajaRGA}{\@EscribeTotalesFilasRGA}% - \ifdim \the\wd\@CajaRGA < \textwidth - \@EscribeTotalesFilasRGA + \ifnum \value{@IVANoGeneral}=1% + \newbox{\@CajaGxET}% + \savebox{\@CajaGxET}{\@EscribeTotalesFilasGxET}% + \ifdim \the\wd\@CajaGxET < \textwidth + \@EscribeTotalesFilasGxET + \else + \hspace*{\@SepTotales}% + \if@BIR\usebox{\@CajaBIAliR}\hspace*{\@SepTotales}\fi + \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}% + \if@BIA\usebox{\@CajaBIAliA}\hspace*{\@SepTotales}\fi \\[\@SeparaFilas]\mbox{}% - \if@centrado\hspace*{\@SepTotales}\else\hfill\fi + \ifcentrado\hspace*{\@SepTotales}\else\hfill\fi \if@Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}% - \if@centrado\hspace*{\@SepTotales}\fi - \else% Aquí casi cualquier cosa tiene aspecto feo. - \CLASSWARNING{Es mejor no usar la opción de totalización en filas en este caso, o disminuir los tamaños de los tipos de letra para la totalización}% - \centering{% - \begin{tabular}{r@{\hspace*{\@SeparaMinTotales}}l} - \usebox{\@CajaBIAliR} & \usebox{\@CajaBIAliA} \\[\@SeparaFilas] - \usebox{\@CajaBIAliG} & \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi - \end{tabular}}% + \ifcentrado\hspace*{\@SepTotales}\fi \fi \fi - \fi - \fi - \par - \if@expandecuadro - \vspace*{-\@EspacioVacioInicial}% - \vspace*{\@EspacioVacioFinal}% - \zsaveposy{EspacioVacioInicial}% - \fi - \vfill - \if@expandecuadro\zsaveposy{EspacioVacioFinal}\fi - \vspace*{\@SeparaVertical}\par - \ifdefvoid{\@NotaExterna}{}{\parbox[t]{\linewidth}{\@LetraNotaExterna\@NotaExterna}\vspace*{\@SeparaVertical}\par}} - - \ifbool{SinCantidad} - % Definamos todos los comandos \Item***. El descuento es opcional; por eso usamos G{0} en \NewDocumentCommand. - {% - \NewDocumentCommand{\Item}{m o m G{0}}{\@ITEM{G}{1}{#1}[#2]{#3}{#4}}% Ítem normal. - \NewDocumentCommand{\ItemR}{m o m G{0}}{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA reducido. - \NewDocumentCommand{\ItemA}{m o m G{0}}{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA adicional. - \NewDocumentCommand{\ItemE}{m o m G{0}}{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{1}{#1}[#2]{#3}{#4}}% Ítem exento de IVA. - \NewDocumentCommand{\ItemX}{m o}{\@ITEM{X}{1}{#1}[#2]{0}{0}}% Ítem sin precio. - \let\ItemG\Item - \if@csv - \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\Moneda)","\@@IVA"}% - \else - \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)","\@@IVA"}% - \fi - \fi} - {% - \NewDocumentCommand{\Item}{m m o m G{0}}{\@ITEM{G}{#1}{#2}[#3]{#4}{#5}}% Ítem normal. - \NewDocumentCommand{\ItemR}{m m o m G{0}}{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA reducido. - \NewDocumentCommand{\ItemA}{m m o m G{0}}{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA adicional. - \NewDocumentCommand{\ItemE}{m m o m G{0}}{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{#1}{#2}[#3]{#4}{#5}}% Ítem exento de IVA. - \NewDocumentCommand{\ItemX}{m m o}{\@ITEM{X}{#1}{#2}[#3]{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)","\@@IVA"}% + \ifnum \value{@IVANoGeneral}=2% + \newbox{\@CajaRGAET}% + \savebox{\@CajaRGAET}{\@EscribeTotalesFilasRGAET}% + \ifdim \the\wd\@CajaRGAET < \textwidth + \@EscribeTotalesFilasRGAET \else - \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \newbox{\@CajaRGA}% + \savebox{\@CajaRGA}{\@EscribeTotalesFilasRGA}% + \ifdim \the\wd\@CajaRGA < \textwidth + \@EscribeTotalesFilasRGA + \\[\@SeparaFilas]\mbox{}% + \ifcentrado\hspace*{\@SepTotales}\else\hfill\fi + \if@Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}% + \ifcentrado\hspace*{\@SepTotales}\fi + \else% Aquí casi cualquier cosa tiene aspecto feo. + \CLASSWARNING{Es mejor no usar la opción de totalización en filas en este caso, o disminuir los tamaños de los tipos de letra para la totalización}% + \centering{% + \begin{tabular}{r@{\hspace*{\@SeparaMinTotales}}l} + \usebox{\@CajaBIAliR} & \usebox{\@CajaBIAliA} \\[\@SeparaFilas] + \usebox{\@CajaBIAliG} & \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi + \end{tabular}}% + \fi \fi \fi - \if@dcu - \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \fi + \par + \ifexpandecuadro + \vspace*{-\@EspacioVacioInicial}% + \vspace*{\@EspacioVacioFinal}% + \zsaveposy{EspacioVacioInicial}% + \fi + \vfill + \ifexpandecuadro\zsaveposy{EspacioVacioFinal}\fi + \vspace*{\@SeparaVertical}\par + \ifdefvoid{\@NotaExterna}{}{\parbox[t]{\linewidth}{\@LetraNotaExterna\@NotaExterna}\vspace*{\@SeparaVertical}\par}} + + \ifbool{SinCantidad} + % Definamos todos los comandos \Item***. El descuento es opcional; por eso usamos G{0} en \NewDocumentCommand. + {% + \NewDocumentCommand{\Item}{m o m G{0}}{\@ITEM{G}{1}{#1}[#2]{#3}{#4}}% Ítem normal. + \NewDocumentCommand{\ItemR}{m o m G{0}}{\global\@BIRtrue\global\Gtrue\@ITEM{R}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA reducido. + \NewDocumentCommand{\ItemA}{m o m G{0}}{\global\@BIAtrue\global\Gtrue\@ITEM{A}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA adicional. + \NewDocumentCommand{\ItemE}{m o m G{0}}{\global\@Exentotrue\global\Gtrue\@ITEM{E}{1}{#1}[#2]{#3}{#4}}% Ítem exento de IVA. + \NewDocumentCommand{\ItemX}{m o}{\@ITEM{X}{1}{#1}[#2]{0}{0}}% Ítem sin precio. + \let\ItemG\Item + \ifcsv + \ifdescuentos + \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\Moneda)","\@@IVA"}% \else - \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)","\@@IVA"}% + \fi + \fi} + {% + \NewDocumentCommand{\Item}{m m o m G{0}}{\@ITEM{G}{#1}{#2}[#3]{#4}{#5}}% Ítem normal. + \NewDocumentCommand{\ItemR}{m m o m G{0}}{\global\@BIRtrue\global\Gtrue\@ITEM{R}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA reducido. + \NewDocumentCommand{\ItemA}{m m o m G{0}}{\global\@BIAtrue\global\Gtrue\@ITEM{A}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA adicional. + \NewDocumentCommand{\ItemE}{m m o m G{0}}{\global\@Exentotrue\global\Gtrue\@ITEM{E}{#1}{#2}[#3]{#4}{#5}}% Ítem exento de IVA. + \NewDocumentCommand{\ItemX}{m m o}{\@ITEM{X}{#1}{#2}[#3]{0}{0}}% Ítem sin precio. + \let\ItemG\Item + \ifcsv + \if@cdu + \ifdescuentos + \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \else + \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \fi \fi + \ifdcu + \ifdescuentos + \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \else + \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \fi + \fi + \ifduc + \ifdescuentos + \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \else + \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \fi + \fi + \fi} + + \if@factura + % Los descuentos totales no son compatibles -y no creo que lo vayan a ser- con el modo de totalización en filas. + \iffilas + \if@DescuentoTotal + \CLASSWARNING{La opción 'filas' no es compatible con los descuentos totales; sin efecto opción 'filas'} + \filasfalse \fi - \if@duc - \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \fi + \if@reverso + \else + \RenewEnviron{reverso}{} + \fi + \ifcotizacion\def\@Denominacion{\@@DenomCotiza}\else\def\@Denominacion{\@@DenomFactura}\fi% Fijamos la denominación del documento paras las cotizaciones o facturas, que son casos particulares del modo 'factura'. + \expandafter\geometry\expandafter{\@GeometriaFactura}% La geometría debe aplicarse aquí. + \AfterEndPreamble{% + \addtolength{\@PosFechaX}{\oddsidemargin+1in}% Le sumamos el margen izquierdo a las posiciones de las cosas; es importante que se haga en un \AfterEndPreamble antes de que empiecen a escribirse otras cosas en la página. + \addtolength{\@PosDenomX}{\oddsidemargin+1in}% + \addtolength{\@PosControlX}{\oddsidemargin+1in}% + \addtolength{\@PosCondicionesX}{\oddsidemargin+1in}% + \addtolength{\@PosFirmasXuno}{\oddsidemargin+1in}% + \setlength{\parindent}{0pt}% + \setlength{\lineskip}{0pt}% + \setlength{\parskip}{0pt plus 1pt}% + \expandafter\setlength{\@SepTotales}{\the\@SeparaMinTotales plus 1fill}% \@SeparaMinTotales es el mínimo espacio entre los totales en el modo 'filas', y SepTotales es una dimensión interna, estirable, con ese como su mínimo. + \thispagestyle{empty}% + \pagenumbering{roman}% + \@EncabezadoFactura + \@EscribeNotaPrevia} + \AtBeginShipoutNext{% Antes abría aquí un \AtBeginShipoutNext cuando había reporte y un \AtEndDocument cuando no. No es necesario eso. También lo modifiqué en \FirmaFactura. + \@CargaFondoFactura + \@PosicionaFechas + \ifdenom\@PosicionaDenom\fi + \ifprefactura\@PosicionaNumControl\fi + \ifnum\value{@Firmas}=0\else\@PosicionaFirmas\fi + \ifdefvoid{\@Condiciones}{}{\@PosicionaCondiciones}} + \iflinea + % Para determinar las coordenadas de la línea hay que usar \AtBeginShipoutNext porque si no se hace en el 'shipout' de la página se genera un espacio en blanco extra. + \AtBeginShipoutNext{\iflinea\@DibujaLinea\fi} + \iffilas + \ifbool{SinLineasVertInt}{\@LineaCompletatrue} \else - \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \@LineaHastaTotaltrue\@LineaDesdeIniciotrue \fi - \fi - \fi} - -\if@factura - % Los descuentos totales no son compatibles -y no creo que lo vayan a ser- con el modo de totalización en filas. - \if@filas - \if@DescuentoTotal - \CLASSWARNING{La opción 'filas' no es compatible con los descuentos totales; sin efecto opción 'filas'} - \@filasfalse \fi - \fi - \if@reverso + %% El comando para la descripción del servicio prestado. + \NewDocumentCommand{\Descripcion}{+m}{% + {% Abrimos un grupo adicional para que la redefinición del entorno 'tikzpicture' sea local. + \@LetraDescripcion + % Cuando la línea tiene grosor cero, hacemos que el entorno 'tikzpicture' sea "fake", y redefinimos \node para que obvie los parámetros que le dimos como argumento opcional. + \ifdim\@GrosorLineaDescripcion=0pt% + \setlength{\@SeparaInternaDescripcion}{0pt}\setlength{\@EsquinaLineaDescripcion}{0pt}\setlength{\@SombraDescripcion}{0pt}% + \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}% + \fi + \begin{tikzpicture} + % Expandimos después para poderle pasar el contenido de la macro como argumento opcional a \node. + \expandafter\node\expandafter[\@DescripcionTIKZ]{% + \ifbool{ExpAbajo} + {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion] + {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}% + {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}% + {\setlength{\parindent}{0.5cm}% + \setlength{\parskip}{2pt plus 8pt}% + \ifbool{ExpAbajo}{\vfill}{}% + #1% + \ifbool{ExpAbajo}{\vfill}{}}}% + \ifdim\@GrosorLineaDescripcion=0pt\else ;\fi% El fin del nodo va cuando hay el entorno tikzpicture original. + \end{tikzpicture} + \par\vspace*{\@SombraDescripcion}}}% \else - \RenewEnviron{reverso}{} - \fi - \if@cotizacion\def\@Denominacion{\@@DenomCotiza}\else\def\@Denominacion{\@@DenomFactura}\fi% Fijamos la denominación del documento paras las cotizaciones o facturas, que son casos particulares del modo 'factura'. - \AtEndPreamble{\expandafter\geometry\expandafter{\@GeometriaFactura}}% La geometría debe aplicarse aquí. - \AtBeginDocument{% - \addtolength{\@PosFechaX}{\oddsidemargin+1in}% Le sumamos el margen izquierdo a las posiciones de las cosas; importante que se haga en un \AtBeginDocument antes de que empiecen a escribirse otras cosas que también se agregan a \AtBeginDocument. - \addtolength{\@PosDenomX}{\oddsidemargin+1in}% - \addtolength{\@PosControlX}{\oddsidemargin+1in}% - \addtolength{\@PosCondicionesX}{\oddsidemargin+1in}% - \addtolength{\@PosFirmasXuno}{\oddsidemargin+1in}% - \setlength{\parindent}{0pt}% - \setlength{\lineskip}{0pt}% - \setlength{\parskip}{0pt plus 1pt}% - \expandafter\setlength{\@SepTotales}{\the\@SeparaMinTotales plus 1fill}% \@SeparaMinTotales es el mínimo espacio entre los totales en el modo 'filas', y SepTotales es una dimensión interna, estirable, con ese como su mínimo. - \thispagestyle{empty}% - \pagenumbering{roman}% - \@EncabezadoFactura - \@EscribeNotaPrevia} - \AtBeginShipoutNext{% Antes abría aquí un \AtBeginShipoutNext cuando había reporte y un \AtEndDocument cuando no. No es necesario eso. También lo modifiqué en \FirmaFactura. - \@CargaFondoFactura - \@PosicionaFechas - \if@denom\@PosicionaDenom\fi - \if@prefactura\@PosicionaNumControl\fi - \if@sinfirmas\else\@PosicionaFirmas\fi - \ifdefvoid{\@Condiciones}{}{\@PosicionaCondiciones}} - \if@linea - \RequirePackage{zref-savepos} - % Para determinar las coordenadas de la línea hay que usar \AtBeginShipoutNext porque si no se hace en el 'shipout' de la página se genera un espacio en blanco extra. - \AtBeginShipoutNext{\if@linea\@DibujaLinea\fi} - \if@filas - \ifbool{SinLineasVertInt}{\@LineaCompletatrue} - \else - \@LineaHastaTotaltrue\@LineaDesdeIniciotrue - \fi + \RenewEnviron{factura}{% + \@ZERO + \let\label\label@factura + \let\@ITEM\@CalculaItem + \BODY + \@CalculaTotalesI} + \RenewEnviron{reverso}{} + \NewDocumentCommand{\Descripcion}{+m}{} \fi - %% El comando para la descripción del servicio prestado. - \NewDocumentCommand{\Descripcion}{+m}{% - {% Abrimos un grupo adicional para que la redefinición del entorno 'tikzpicture' sea local. - \@LetraDescripcion - % Cuando la línea tiene grosor cero, hacemos que el entorno 'tikzpicture' sea "fake", y redefinimos \node para que obvie los parámetros que le dimos como argumento opcional. - \ifdim\@GrosorLineaDescripcion=0pt% - \setlength{\@SeparaInternaDescripcion}{0pt}\setlength{\@EsquinaLineaDescripcion}{0pt}\setlength{\@SombraDescripcion}{0pt}% - \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}% - \fi - \begin{tikzpicture} - % Expandimos después para poderle pasar el contenido de la macro como argumento opcional a \node. - \expandafter\node\expandafter[\@DescripcionTIKZ]{% - \ifbool{ExpAbajo} - {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion] - {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}% - {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}% - {\setlength{\parindent}{0.5cm}% - \setlength{\parskip}{2pt plus 8pt}% - \ifbool{ExpAbajo}{\vfill}{}% - #1% - \ifbool{ExpAbajo}{\vfill}{}}}% - \ifdim\@GrosorLineaDescripcion=0pt\else ;\fi% El fin del nodo va cuando hay el entorno tikzpicture original. - \end{tikzpicture} - \par\vspace*{\@SombraDescripcion}}}% -\else - \RenewEnviron{factura}{% - \@ZERO - \let\label\label@factura - \let\@ITEM\@CalculaItem - \BODY - \@CalculaTotalesI} - \RenewEnviron{reverso}{} - \NewDocumentCommand{\Descripcion}{+m}{} -\fi -\if@reporte - \ifdefvoid{\@InfoPagina}{\let\@InfoPagina\@InfoPaginaNoTitulo}{}% - \if@factura - \else - \AtEndPreamble{% - \expandafter\geometry\expandafter{\@GeometriaReporte}}% La geometría del reporte debe aplicarse aquí cuando sólo hay reporte, así se puede establecer el tamaño del papel. - \fi - \NewEnviron{reporte}{% + \if@reporte + \ifdefvoid{\@InfoPagina}{\let\@InfoPagina\@InfoPaginaNoTitulo}{}% \if@factura - \expandafter\newgeometry\expandafter{\@GeometriaReporte}\cleardoublepage% La geometría debe aplicarse aquí cuando también hay factura, pero no se puede cambiar el tamaño del papel. + \else + \expandafter\geometry\expandafter{\@GeometriaReporte}% La geometría del reporte debe aplicarse aquí cuando sólo hay reporte, así se puede establecer el tamaño del papel. \fi - \let\headwidth\textwidth - \@CargaFondoReporte - \@EncabezadoReporte - \ifdefvoid{\@EstiloPagReporteResto}{% - \if@FondoReporteStar% Si no usamos \EstiloPagReporte entonces se fijará 'soloabajo' cuando se use \FondoReporte* para que sólo use marcas de pie de página, y si no se usó \FondoReporte* entonces se fijará 'plain' que usa cabeceras y pies de página. - \pagestyle{soloabajo}% - \else - \pagestyle{plain}% - \fi} - {\pagestyle{\@EstiloPagReporteResto}}% Si usamos \EstiloPagReporte en su argumento obligatorio entonces fijamos ese estilo de página. - \ifdefvoid{\@EstiloPagReporteUno}{% - \if@FondoReporte% Si no le damos a \EstiloPagReporte su argumento opcional, entonces se fijará 'solonumpag' como el estilo de página para la primera página, pero solamente si usamos \FondoReporte, ya que el estilo de página predeterminado al usar \FondoReporte* ya se acaba de fijar y no necesita el caso especial de la primera hoja (\thispagestyle). - \if@FondoReporteStar + \NewEnviron{reporte}{% + \if@factura + \expandafter\newgeometry\expandafter{\@GeometriaReporte}\cleardoublepage% La geometría debe aplicarse aquí cuando también hay factura, pero no se puede cambiar el tamaño del papel. + \fi + \let\headwidth\textwidth + \@CargaFondoReporte + \@EncabezadoReporte + \ifdefvoid{\@EstiloPagReporteResto}{% + \if@FondoReporteStar% Si no usamos \EstiloPagReporte entonces se fijará 'soloabajo' cuando se use \FondoReporte* para que sólo use marcas de pie de página, y si no se usó \FondoReporte* entonces se fijará 'plain' que usa cabeceras y pies de página. + \pagestyle{soloabajo}% \else - \thispagestyle{solonumpag}% - \fi - \fi} - {\thispagestyle{\@EstiloPagReporteUno}}% Si usamoe el argumento opcional de \EstiloPagReporte establecemos ese estilo de página. - \pagenumbering{arabic}% - \setlength{\parindent}{0.666cm}% - \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte. - \vskip\baselineskip - \BODY\clearpage}% espacio antes de empezar con el reporte, después del título -si lo hubiera-. -\else - \NewEnviron{reporte}{} -\fi + \pagestyle{plain}% + \fi} + {\pagestyle{\@EstiloPagReporteResto}}% Si usamos \EstiloPagReporte en su argumento obligatorio entonces fijamos ese estilo de página. + \ifdefvoid{\@EstiloPagReporteUno}{% + \if@FondoReporte% Si no le damos a \EstiloPagReporte su argumento opcional, entonces se fijará 'solonumpag' como el estilo de página para la primera página, pero solamente si usamos \FondoReporte, ya que el estilo de página predeterminado al usar \FondoReporte* ya se acaba de fijar y no necesita el caso especial de la primera hoja (\thispagestyle). + \if@FondoReporteStar + \else + \thispagestyle{solonumpag}% + \fi + \fi} + {\thispagestyle{\@EstiloPagReporteUno}}% Si usamoe el argumento opcional de \EstiloPagReporte establecemos ese estilo de página. + \pagenumbering{arabic}% + \setlength{\parindent}{0.666cm}% + \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte. + \vskip\baselineskip + \BODY\clearpage}% espacio antes de empezar con el reporte, después del título -si lo hubiera-. + \else + \NewEnviron{reporte}{} + \fi} %% Comando para el diseño de la forma libre. \newcommand{\@CargaFondoFactura}{% @@ -4019,7 +4197,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \ifdim\@GrosorLineaNotaPrevia=0pt\else ;\fi \end{tikzpicture}% \par\vspace*{\@SombraNotaPrevia}\vspace*{\@SeparaVertical}% - \if@expandecuadro\else\vfill\fi}}} + \ifexpandecuadro\else\vfill\fi}}} %% Comando que coloca la caja para las condiciones, con la posibilidad de TikZ. \newcommand{\@EscribeCondiciones}{% @@ -4064,14 +4242,14 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \setlength{\@LineaNodoXf}{\zposx{LineaNodoBCoordX} sp}% \setlength{\@LineaNodoYf}{\zposy{LineaNodoBCoordY} sp}% \addtolength{\@LineaNodoYo}{\@EspacioVacioInicial-\@EspacioVacioFinal}% - \if@filas + \iffilas \else \if@DescG \addtolength{\@LineaNodoYo}{2\baselineskip}\fi \if@DescR \if@BIR \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi \if@DescA \if@BIA \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi \if@DescE \if@Exento \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi \addtolength{\@LineaNodoYo}{\baselineskip/2}% - \if@sinivaexpresado + \ifsinivaexpresado \else \addtolength{\@LineaNodoYo}{2\baselineskip}% \if@BIR\addtolength{\@LineaNodoYo}{2\baselineskip}\fi @@ -4079,7 +4257,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \if@Exento\addtolength{\@LineaNodoYo}{\baselineskip}\fi \fi \fi - \if@linea + \iflinea \begin{textblock*}{\paperwidth-\@LineaNodoXo}(\@LineaNodoXo,\paperheight-\@LineaNodoYo)% \begin{tikzpicture}% \draw (\@LineaNodoXo,\@LineaNodoYo) -- (\@LineaNodoXf,\@LineaNodoYf);% @@ -4089,7 +4267,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %% Escribimos los totales al archivo csv. \newcommand{\@EscribeTotalesEnCSV}{% - \if@csv + \ifcsv \if@Exento \if@DescE \immediate\write\csv{Totales: \@@SubtotalE: \Moneda \SubtE^^JTotales: \@@DescuentoE: \Moneda \DescE}% @@ -4150,7 +4328,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %% El diseño de las distintas partes de la hoja. \newcommand{\@EstiloFirmas}{ \@LetraFirmas - \if@unafirma + \ifnum \value{@Firmas}=1 \else \parbox{\@TamLineaFirmas}{ \rule{\@TamLineaFirmas}{\@GrosorLineaFirmas} @@ -4159,7 +4337,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \hfill \parbox{\@TamLineaFirmas}{ \rule{\@TamLineaFirmas}{\@GrosorLineaFirmas} - \centering \ifdefvoid{\@Emisor}{\if@cotizacion \@@Emisor \else \@@Pagado \fi}{\@Emisor}}} + \centering \ifdefvoid{\@Emisor}{\ifcotizacion \@@Emisor \else \@@Pagado \fi}{\@Emisor}}} \newcommand{\@EstiloNotaPrevia}{\@LetraNotaPrevia \@NotaPrevia} @@ -4174,7 +4352,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \newcommand{\@EstiloDenom}{% \@LetraDenom\@Denominacion - \if@sinnumero + \ifsinnumero \else \space\space{\@LetraNumeracion N\textordmasculine\space\@Num}% \fi} @@ -4184,7 +4362,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \setlength{\tabcolsep}{0pt}% \@LetraFecha\begin{tabular}{r@{\extracolsep{1ex}}l@{\extracolsep{0pt}}} \@@Fecha & \ttfamily\@Fecha \\[.3em] - \if@vencimiento \@@FechaVencimiento & \ttfamily\@FechaVencimiento \\ \else \vspace*{-.3em}\fi + \ifvencimiento \@@FechaVencimiento & \ttfamily\@FechaVencimiento \\ \else \vspace*{-.3em}\fi \end{tabular}} \newcommand{\@InfoPaginaNoTitulo}{\@LetraInfoPagina Reporte correspondiente a la factura n\'umero \@Num \space de fecha \@Fecha} @@ -4245,6 +4423,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %<reptres>%% (soloreporte) Generamos solamente un reporte %<factcinco|factocho>%% Escribimos factura y reporte, pero sólo producimos la factura % +%<factdiez>%% Establecemos las opciones de la clase a través de comandos +% %<factuno>%% Todo con los valores por omisión % %<reptres>%% (twoside) El reporte se imprime en las dos caras del papel @@ -4383,6 +4563,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %<factsiete>subtotal, %<factcinco>iva, %<factcuatro|factcinco|factsiete>filas, +%<factdiez>filas, % luego queda sin efecto con \filasfalse en el preámbulo %<factsiete>centrado, %<facttres>agrupado, %<factcinco|factseis|factsiete>denom, @@ -4406,16 +4587,20 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %<factcinco|factseis|factsiete>todosiva, %<factnueve>G, %<factocho>siniva, -%<factnueve|factdiez>electro, +%<factnueve>electro, +% factdiez también lleva 'electro' pero desde una opción. %<factdos>unafirma, %<prefac|cotiza>% dosfirmas, % para poner las dos firmas. %<prefac>% unafirma, % para poner la firma del emisor. %<cotiza>% sinfirmas, % para no poner firmas. %<facttres>sinfirmas, -%<factdiez>vencimiento, +% factdiez lleva 'vencimiento' pero desde una opción. %<factocho>csv, +%<factdiez>csv, % luego queda sin efecto con \csvfalse en el preámbulo %<!factuno>]{factura} +%<factdiez>\electrotrue \vencimientotrue \filasfalse \csvfalse +%<factdiez> \input{factura-ejemplo-aux.tex}% Se incluye para efectos del ejemplo, así tendremos disponible la macro \Ejemplo. \usepackage[utf8]{inputenc} %<beispiel>\usepackage[official]{eurosym} @@ -4455,7 +4640,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %<beispiel>\def\@@DenomFactura{Rechnung} %<beispiel>\def\@@DenomCotiza{Voranschlag} %<beispiel>% \LetraNumeracion{\fontsize{14}{14}\bfseries} -%<beispiel>\renewcommand{\@EstiloDenom}{\@LetraDenom\@Denominacion-\if@sinnumero\else\@LetraNumeracion Nr:\space\@Num\fi} +%<beispiel>\renewcommand{\@EstiloDenom}{\@LetraDenom\@Denominacion-\ifsinnumero\else\@LetraNumeracion Nr:\space\@Num\fi} %<beispiel>\renewcommand{\@EstiloNumControl}{} %<beispiel>\makeatother @@ -4551,7 +4736,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %<!factuno&!factcinco&!prefac&!reptres> %<cotiza>% \Denom{PRESUPUESTO} % También podemos cambiar el nombre del documento. %<!factcuatro&!factnueve&!beispiel&!reptres>\Condiciones{Las condiciones del documento...} -%<factnueve>\Condiciones{La factura se emitió el \DTMusedate{FechaEmision} con crédito de \Credito{} dias, siendo su fecha de vencimiento el \DTMusedate{FechaVencimiento}.} +%<factnueve>\Condiciones{La factura se emitió el \Fecha{} con crédito de \Credito{} dias, siendo su fecha de vencimiento el \FechaVencimiento.} %<beispiel>\Condiciones{Die Zahlungsbedingungen} %<factuno|factdos|factcinco|factocho>\Resumen{El resumen opcional} %<beispiel>\Resumen{Zusammenfassung} @@ -4600,6 +4785,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %<factcinco|factocho|repuno|repdos|reptres>\begin{reporte} %<factcinco|factocho|repuno|repdos|reptres> El reporte - página 1\newpage El reporte - página 2 \newpage El reporte - página 3. %<repdos> +%<factseis|repdos> Se facturaron en total \arabic{NumItem} artículos. +%<factseis|repdos> %<factseis|repdos> En el artículo número \itemref{primeritem} se facturaron \cantref{primeritem} \descref{primeritem} por un valor de \Moneda\puref{primeritem} cada uno, dando un subtotal por este elemento de \Moneda\subtref{primeritem}; el descuento en ese artículo es del \dctoref{primeritem}\%, dando un total de \Moneda\ptref{primeritem}, y esta gravado con IVA de \ivaref{primeritem}\%. %<factseis|repdos> %<factseis|repdos> La base imponible total de esta factura es de \Moneda\numprint\BIG; el IVA es de \Moneda\numprint\AlicuotaG, el descuento presidencial en el IVA es de \Moneda\numprint\AlicuotaGDesc, y el total final es de \Moneda\numprint\Total. @@ -4791,6 +4978,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. \begin{itemize} \DescEjemplo \end{itemize} + \catcode`\%=14 \catcode`\<=13 \catcode`\>=13 } diff --git a/Master/texmf-dist/tex/latex/factura/factura.cls b/Master/texmf-dist/tex/latex/factura/factura.cls index d8bfef76317..467826fcdaa 100644 --- a/Master/texmf-dist/tex/latex/factura/factura.cls +++ b/Master/texmf-dist/tex/latex/factura/factura.cls @@ -37,7 +37,7 @@ %% \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{factura} -[2017/12/11 v3.40 +[2018/03/13 v3.44 Clase para elaborar facturas legales en la República Bolivariana de Venezuela. ] @@ -75,37 +75,55 @@ en la República Bolivariana de Venezuela. \newbool{FirmasYnegativo}% no hay FirmasXnegativo; hay X_inicial y X_final para las firmas. %% Condicionales relativos a opciones de la clase. -\newif\if@prefactura -\newif\if@cotizacion -\newif\if@nospanish -\newif\if@sinivaexpresado -\newif\if@todosiva -\newif\if@sinfirmas -\newif\if@unafirma -\newif\if@filas -\newif\if@agrupado -\newif\if@centrado -\newif\if@descuentos -\newif\if@denom -\newif\if@vencimiento -\newif\if@sinnumero -\newif\if@sintotales -\newif\if@conlineasha -\newif\if@linea -\newif\if@G -\newif\if@csv +\newif\ifagrupado +\newif\ifcentradesc +\newif\ifcentrado +\newif\ifconlineasha +\newif\ifconreporte +\newif\ifcotizacion +\newif\ifcsv +\newif\ifdcu +\newif\ifdenom +\newif\ifdescuentos +\newif\ifdosfirmas +\newif\ifduc +\newif\ifelectro +\newif\ifexpandecuadro +\newif\iffilas +\newif\ifG +\newif\ifimpdesc +\newif\ifiva +\newif\iflinea +\newif\ifnospanish +\newif\ifnumitem +\newif\ifprefactura +\newif\ifsincantidad +\newif\ifsinexpandir +\newif\ifsinfirmas +\newif\ifsiniva +\newif\ifsinivaexpresado +\newif\ifsinlineash +\newif\ifsinlineashe +\newif\ifsinlineashi +\newif\ifsinlineasv +\newif\ifsinlineasve +\newif\ifsinlineasvi +\newif\ifsinmarcas +\newif\ifsinnumero +\newif\ifsinreverso +\newif\ifsintotales +\newif\ifsoloreporte +\newif\ifsubtotal +\newif\iftodosiva +\newif\iftwoside +\newif\ifunafirma +\newif\ifvencimiento + +%% Condicionales auxiliares. \newif\if@cdu \@cdutrue -\newif\if@dcu -\newif\if@duc -\newif\if@expandecuadro \newif\if@factura \@facturatrue \newif\if@reverso \@reversotrue \newif\if@reporte -\newif\if@impdesc -\newif\if@centradesc -\newif\if@sinmarcas - -%% Condicionales auxiliares. \newif\if@FondoFactura \newif\if@FondoReporte \newif\if@FondoReporteStar @@ -210,134 +228,68 @@ en la República Bolivariana de Venezuela. %% Contadores. \newcounter{@IVANoGeneral}% '0' con sólo IVA G, '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos. +\newcounter{@Firmas}% '0' para sinfirmas, '1' para unafirma, y '2' para dosfirmas. +\setcounter{@Firmas}{2} \newcounter{NumItem}% Número del ítem actual, para uso de algunas macros en el cuadro de la factura y para cuando se usa la opción 'numitem'. \newcount\AuxFecha +%% Errores, advertencias e informaciones de LaTeX. \newcommand{\CLASSERROR}[1]{\ClassError{factura}{** #1. **}{}} \newcommand{\CLASSWARNING}[1]{\ClassWarning{factura}{** #1. **}{}} \newcommand{\CLASSINFO}[1]{\ClassInfo{factura}{** #1. **}{}} -\DeclareOption{prefactura}{\@prefacturatrue\@denomtrue\@sinfirmastrue}% La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente. -\DeclareOption{cotizacion}{\@cotizaciontrue\@denomtrue\@unafirmatrue}% Cambia la denominación a 'COTIZACIÓN' y no 'FACTURA'. -\DeclareOption{nospanish}{\@nospanishtrue}% No carga babel en castellano ni la codificación T1 de las letras. -\DeclareOption{sinfirmas}{\@sinfirmastrue}% No agrega los espacios para firmar. -\DeclareOption{unafirma}{\@unafirmatrue\@sinfirmasfalse}% No agrega el espacio para que firme quien recibe. -\DeclareOption{dosfirmas}{\@unafirmafalse\@sinfirmasfalse}% Pone las dos firmas para firmar. -\DeclareOption{descuentos}{\booltrue{Descuentos}\@descuentostrue}% Para los descuentos individuales. -\DeclareOption{iva}{\@impdesctrue\booltrue{IVA}}% Para la columna del IVA. -\DeclareOption{subtotal}{% Para la columna extra del subtotal antes del descuento. - \if@descuentos - \booltrue{Subtotal} - \else - \CLASSWARNING{La opción 'subtotal' no aplica sin descuentos individuales. Sin efecto opción 'subtotal'} - \fi} -\DeclareOption{denom}{\@denomtrue}% Agrega el texto con la denominación del documento, para las formas libres que no tienen el número de factura. -\DeclareOption{vencimiento}{\@vencimientotrue}% Escribe fecha de vencimiento, aún con facturas sin crédito. -\DeclareOption{sinnumero}{\@sinnumerotrue\@denomtrue}% Escribir el texto de la denominación del documento pero sin escribir el número. -\DeclareOption{G}{\@Gtrue}% Con esta opción sale la letra 'G' en los items con IVA general, y sale el porcentaje en la base imponible general. -\DeclareOption{filas}{\@filastrue}% Estilo de totalización en filas. -\DeclareOption{sintotales}{\@sintotalestrue% No escribe los totales al final, por ejemplo para cotizaciones de productos similares. - \if@filas - \CLASSWARNING{La opción 'sintotales' no aplica para el modo de totalización en filas. Sin efecto opción 'filas'} - \@filasfalse - \fi - \if@cotizacion - \else - \CLASSWARNING{La opción 'sintotales' no debe usarse en facturas sino en cotizaciones. No es válida una factura sin totales} - \fi} -\DeclareOption{centrado}{% Total y exento 'centrado'; sólo para estilo 'filas' - \if@filas - \@centradotrue - \else - \CLASSWARNING{La opción 'centrado' no es compatible con el modo de totalización en columnas. Sin efecto opción 'centrado'} - \fi} -\DeclareOption{agrupado}{% Agrupados los elementos totalizadores en el modo en columnas. - \if@filas - \CLASSWARNING{La opción 'agrupado' no es compatible con el modo de totalización en filas. Sin efecto opción 'agrupado'} - \else - \@agrupadotrue - \fi} -\DeclareOption{impdesc}{\@impdesctrue}% Para el tipo de impuesto en la descripción y no en el precio unitario y total. -\DeclareOption{centradesc}{\@centradesctrue}% Para centrar la descripción de cada ítem. -\DeclareOption{sinmarcas}{\@sinmarcastrue}% Para evitar que aparezcan los caracteres especiales cuando la descripción es larga. -\DeclareOption{numitem}{\booltrue{NumItem}}% Para poner una columna extra al principio con el número del ítem. -\DeclareOption{dcu}{% Descripción, luego cantidad y luego precio unitario. - \@dcutrue\@cdufalse\@ducfalse - \booltrue{DCU}\boolfalse{DUC} - \booltrue{PrimeroDescripcion}} -\DeclareOption{duc}{% Descripción, luego precio unitario y luego cantidad. - \if@dcu - \CLASSWARNING{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones} - \boolfalse{PrimeroDescripcion}\boolfalse{DCU}\@dcufalse\@cdutrue - \else - \@ductrue\@cdufalse\@dcufalse - \booltrue{DUC}\boolfalse{DCU} - \booltrue{PrimeroDescripcion} - \fi} -\DeclareOption{siniva}{\AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}}% No cobra IVA. -\DeclareOption{todosiva}{\@todosivatrue}% Con esta opción salen todos los IVA así valgan cero. -\DeclareOption{electro}{% Parche por el Decreto 3085 de Nikolài. - \booltrue{Electro} - \gdef\@NotaInterna{\@TextoDescuentoPresidencial} - \CLASSINFO{Se estableció el texto aclaratorio del descuento presidencial como 'nota interna'} - \if@filas - \CLASSWARNING{La opción 'electro' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'} - \@filasfalse - \fi} -\DeclareOption{sinivaexpresado}{% Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA. - \@sinivaexpresadotrue - \if@filas - \CLASSWARNING{La opción 'sinivaexpresado' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'} - \@filasfalse - \else - \AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}} - \fi} -\DeclareOption{sincantidad}{% Para no poner el campo de la cantidad. - \booltrue{SinCantidad} - \if@dcu - \CLASSWARNING{La opción 'sincantidad' no es compatible con 'dcu' . Sin efecto opción 'dcu'} - \@dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescripcion} - \fi - \if@duc - \CLASSWARNING{La opción 'sincantidad' no es compatible con 'duc' . Sin efecto opción 'duc'} - \@ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescripcion} - \fi} -\DeclareOption{conlineasha}{\@conlineashatrue}% Una línea horizontal para cada ítem, como las facturas a mano. -\DeclareOption{sinlineasv}{% Estilo 'sinlineasv'. - \booltrue{SinLineasVertExt}\booltrue{SinLineasVertInt}} -\DeclareOption{sinlineasvi}{\booltrue{SinLineasVertInt}}% Estilo 'sinlineasvi'. -\DeclareOption{sinlineasve}{\booltrue{SinLineasVertExt}}% Estilo 'sinlineasve'. -\DeclareOption{sinlineash}{% Estilo 'sinlineash'. - \booltrue{SinLineasHoriExt}\booltrue{SinLineasHoriInt}} -\DeclareOption{sinlineashi}{\booltrue{SinLineasHoriInt}}% Estilo 'sinlineashi'. -\DeclareOption{sinlineashe}{\booltrue{SinLineasHoriExt}}% Estilo 'sinlineashe'. -\DeclareOption{expandecuadro}{\@expandecuadrotrue\boolfalse{ExpAbajo}}% Para rellenar con líneas en blanco de manera automática. -\DeclareOption{sinexpandir}{\boolfalse{ExpAbajo}\@expandecuadrofalse}% No expande ninguna de las dos partes de la factura. -\DeclareOption{linea}{% Para la línea que protege el espacio en blanco. - \if@expandecuadro - \@lineatrue - \else - \CLASSWARNING{La opción 'linea' requiere la opción 'expandecuadro'. Sin efecto opción 'linea'} - \fi} -\DeclareOption{conreporte}{\@reportetrue}% Para imprimir factura y reporte. -\DeclareOption{soloreporte}{\@reportetrue\@facturafalse\@reversofalse}% Para imprimir sólo el reporte. -\DeclareOption{sinreverso}{\@reversofalse}% Para no imprimir el reverso de la factura. -\DeclareOption{twoside}{\PassOptionsToClass{twoside}{article}}% Opción 'twoside' de article para los reportes. -\DeclareOption{csv}{% Para la salida en modo csv también. - \if@factura - \@csvtrue - \if@sintotales\else\AtEndDocument{\@EscribeTotalesEnCSV}\fi - \else - \CLASSWARNING{La opción 'csv' require generar la factura. Sin efecto opción 'csv'} - \fi} +%% Opciones de la clase. +\DeclareOption{agrupado}{\agrupadotrue}% Agrupados los elementos totalizadores en el modo en columnas. +\DeclareOption{centradesc}{\centradesctrue}% Para centrar la descripción de cada ítem. +\DeclareOption{centrado}{\centradotrue}% Total y exento 'centrado'; sólo para estilo 'filas' +\DeclareOption{conlineasha}{\conlineashatrue}% Una línea horizontal para cada ítem, como las facturas a mano. +\DeclareOption{conreporte}{\conreportetrue}% Para imprimir factura y reporte. +\DeclareOption{cotizacion}{\cotizaciontrue}% Cambia la denominación a 'COTIZACIÓN' y no 'FACTURA'. +\DeclareOption{csv}{\csvtrue}% Para la salida en modo csv también. +\DeclareOption{dcu}{\dcutrue}% Descripción, luego cantidad y luego precio unitario. +\DeclareOption{denom}{\denomtrue}% Agrega el texto con la denominación del documento, para las formas libres que no tienen el número de factura. +\DeclareOption{descuentos}{\descuentostrue}% Para los descuentos individuales. +\DeclareOption{dosfirmas}{\dosfirmastrue}% Pone las dos firmas para firmar. +\DeclareOption{duc}{\ductrue}% Descripción, luego precio unitario y luego cantidad. +\DeclareOption{electro}{\electrotrue}% Parche por el Decreto 3085 de Nikolài. +\DeclareOption{expandecuadro}{\expandecuadrotrue}% Para rellenar con líneas en blanco de manera automática. +\DeclareOption{filas}{\filastrue}% Estilo de totalización en filas. +\DeclareOption{G}{\Gtrue}% Con esta opción sale la letra 'G' en los items con IVA general, y sale el porcentaje en la base imponible general. +\DeclareOption{impdesc}{\impdesctrue}% Para el tipo de impuesto en la descripción y no en el precio unitario y total. +\DeclareOption{iva}{\ivatrue}% Para la columna del IVA. +\DeclareOption{linea}{\lineatrue}% Para la línea que protege el espacio en blanco. +\DeclareOption{nospanish}{\nospanishtrue}% No carga babel en castellano ni la codificación T1 de las letras. +\DeclareOption{numitem}{\numitemtrue}% Para poner una columna extra al principio con el número del ítem. +\DeclareOption{prefactura}{\prefacturatrue}% La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente. +\DeclareOption{sincantidad}{\sincantidadtrue}% Para no poner el campo de la cantidad. +\DeclareOption{sinexpandir}{\sinexpandirtrue}% No expande ninguna de las dos partes de la factura. +\DeclareOption{sinfirmas}{\sinfirmastrue}% No agrega los espacios para firmar. +\DeclareOption{sinivaexpresado}{\sinivaexpresadotrue}% Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA. +\DeclareOption{siniva}{\sinivatrue}% No cobra IVA. +\DeclareOption{sinlineashe}{\sinlineashetrue}% Estilo 'sinlineashe'. +\DeclareOption{sinlineashi}{\sinlineashitrue}% Estilo 'sinlineashi'. +\DeclareOption{sinlineash}{\sinlineashtrue}% Estilo 'sinlineash'. +\DeclareOption{sinlineasve}{\sinlineasvetrue}% Estilo 'sinlineasve'. +\DeclareOption{sinlineasvi}{\sinlineasvitrue}% Estilo 'sinlineasvi'. +\DeclareOption{sinlineasv}{\sinlineasvtrue}% Estilo 'sinlineasv'. +\DeclareOption{sinmarcas}{\sinmarcastrue}% Para evitar que aparezcan los caracteres especiales cuando la descripción es larga. +\DeclareOption{sinnumero}{\sinnumerotrue}% Escribir el texto de la denominación del documento pero sin escribir el número. +\DeclareOption{sinreverso}{\sinreversotrue}% Para no imprimir el reverso de la factura. +\DeclareOption{sintotales}{\sintotalestrue}% No escribe los totales al final, por ejemplo para cotizaciones de productos similares. +\DeclareOption{soloreporte}{\soloreportetrue}% Para imprimir sólo el reporte. +\DeclareOption{subtotal}{\subtotaltrue}% Para la columna extra del subtotal antes del descuento. +\DeclareOption{todosiva}{\todosivatrue}% Con esta opción salen todos los IVA así valgan cero. +\DeclareOption{twoside}{\twosidetrue}% Opción 'twoside' de article para los reportes. +\DeclareOption{unafirma}{\unafirmatrue}% No agrega el espacio para que firme quien recibe. +\DeclareOption{vencimiento}{\vencimientotrue}% Escribe fecha de vencimiento, aún con facturas sin crédito. \ProcessOptions\relax \LoadClass[12pt]{article} +%% Cargamos algunos paquetes siempre necesarios. \RequirePackage{xparse}% Algunos comandos los definimos con \NewDocumentCommand. \RequirePackage[absolute]{textpos}% Es necesario 'textpos' para colocar texto en ubicaciones arbitrarias. -\RequirePackage{geometry}% 'geometry' para ajustar todos los márgenes. \RequirePackage{eso-pic}% Para el comando \AddToShipoutPicture. \RequirePackage{xstring}% Lo usamos sólo para tomar el menos al principio de una longitud. \RequirePackage{calc}% 'calc' para hacer aritmética con las dimensiones. @@ -369,83 +321,254 @@ en la República Bolivariana de Venezuela. \DTMfdef{ddmmyyyy}#1#2#3#4#5#6#7#8&{\DTMs{#5#6#7#8-#3#4-#1#2}} \DTMfdef{mm-dd-yyyy}#1-#2-#3&{\DTMs{#3-#1-#2}} -\AtEndPreamble{\DTMsetstyle{\@FormatoFecha}\DTMsetup{datesep=\@FechaSeparadores}\gdef\DTMinformat{\@FormatoFechaEntrada}} -\def\@Fecha{\DTMusedate{FechaEmision}} +\AtEndPreamble{ + % Establecemos los parámetros y macros relativas a la fecha. + \DTMsetstyle{\@FormatoFecha}\DTMsetup{datesep=\@FechaSeparadores}\gdef\DTMinformat{\@FormatoFechaEntrada} -%% Una vez definido todo en el preámbulo los comandos usados para definir campos servirán para mostrar el campo que se definió con ese comando. -\AtEndPreamble{% - \def\RazonSocial{\@RazonSocial} - \let\Nombre\RazonSocial - \def\RIF{\@RIF} - \let\CI\RIF - \def\Direccion{\@Direccion} - \def\Telefono{\@Telefono} - \def\Email{\@Email} - \def\Contacto{\@Contacto} - \def\Emisor{\@Emisor} - \def\Conforme{\@Conforme} - \def\Proveedor{\@Proveedor} - \def\Credito{\@Credito} - \def\Num{\@Num} - \def\NumSerieControl{\@NumSerieControl} - \def\NumControl{\@NumControl} - \def\Condiciones{\@Condiciones} - \def\Resumen{\@Resumen} - \def\NotaPrevia{\@NotaPrevia} - \def\NotaInterna{\@NotaInterna} - \def\NotaExterna{\@NotaExterna}} - -\AtBeginDocument{% Efectúa distintos chequeos. - \if@reporte - \ifdefvoid{\@Num}{\CLASSWARNING{No se especificó el número de la factura. Puede dar error si el título del reporte no se especifica que aparezca en las cabeceras}}{}% - \ifdefvoid{\@Proveedor}{% - \ifdefvoid{\@Emisor} - {\CLASSERROR{Hay que definir el nombre del proveedor cuando se emite un reporte}}% - {\CLASSWARNING{Se toma el emisor como el proveedor por no haberse especificado este último}% - \let\@Proveedor=\@Emisor}} - {}% - \fi - \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razón social}}{}% - \if@factura - \ifdefvoid{\@RIF}{\CLASSERROR{Hay que definir el R.I.F}}{}% - \ifdefvoid{\@Direccion}{\CLASSERROR{Hay que definir la dirección fiscal}}{}% - \ifdefvoid{\@Telefono}{\CLASSWARNING{Pudiera definirse un número telefónico}}{}% - \ifdefvoid{\@Email}{\CLASSWARNING{Pudiera definirse una dirección de correo electrónico}}{}% - \ifdefvoid{\@Condiciones}{\CLASSWARNING{Pudieran definirse las condiciones del documento}}{}% - \DTMifsaveddate{FechaEmision}{}{% - \CLASSWARNING{No se especificó fecha. Asumiendo la fecha de hoy}% - \DTMsavedate{FechaEmision}{\the\year-\the\month-\the\day}}% - \if@cotizacion - \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para cotizacion se recomienda agregar el fondo}}{}% - \fi - \if@prefactura - \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para prefactura se recomienda agregar el fondo}}{}% + % Tomamos las acciones pertinentes dependiendo de las opciones de la clase (o condicionales activados en el preámbulo que cambian las opciones de la clase) + \ifprefactura + \ifcotizacion + \prefacturafalse + \cotizacionfalse + \CLASSWARNING{Las opciones 'prefactura' y 'cotizacion' no son compatibles. Sin efecto ambas opciones} + \else + \denomtrue\setcounter{@Firmas}{0} \fi - \if@sinnumero - \if@cotizacion + \fi + \ifcotizacion\denomtrue\setcounter{@Firmas}{1}\fi + + \ifsinlineasv\booltrue{SinLineasVertExt}\booltrue{SinLineasVertInt}\fi + \ifsinlineasvi\booltrue{SinLineasVertInt}\fi + \ifsinlineasve\booltrue{SinLineasVertExt}\fi + \ifsinlineash\booltrue{SinLineasHoriExt}\booltrue{SinLineasHoriInt}\fi + \ifsinlineashi\booltrue{SinLineasHoriInt}\fi + \ifsinlineashe\booltrue{SinLineasHoriExt}\fi + + \ifdosfirmas + \setcounter{@Firmas}{2} + \ifunafirma + \unafirmafalse + \ifsinfirmas + \sinfirmasfalse + \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'} \else - \CLASSERROR{La opción para no poner el número sólo es compatible con las cotizaciones}% + \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'} \fi - \fi - \if@denom - \if@sinnumero - \else - \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el número de la factura}}{}% + \else + \ifsinfirmas + \sinfirmasfalse + \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'dosfirmas'} \fi \fi \fi - \ifdefvoid{\@Contacto}{\if@Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}% -} + \ifunafirma + \setcounter{@Firmas}{1} + \ifsinfirmas + \sinfirmasfalse + \CLASSWARNING{Las opciones para las firmas son excluyentes. Permanece activada 'unafirma'} + \fi + \fi + \ifsinfirmas\setcounter{@Firmas}{0}\fi + + \ifdcu + \@cdufalse\ducfalse + \booltrue{DCU}\boolfalse{DUC} + \booltrue{PrimeroDescripcion} + \fi + \ifduc + \ifdcu + \boolfalse{PrimeroDescripcion}\boolfalse{DCU}\dcufalse\ducfalse\@cdutrue + \CLASSWARNING{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones} + \else + \ductrue\@cdufalse\dcufalse + \booltrue{DUC}\boolfalse{DCU} + \booltrue{PrimeroDescripcion} + \fi + \fi + \ifnumitem\booltrue{NumItem}\fi + \ifsincantidad + \booltrue{SinCantidad} + \ifdcu + \dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescripcion} + \CLASSWARNING{La opción 'sincantidad' no es compatible con 'dcu'. Sin efecto opción 'dcu'} + \fi + \ifduc + \ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescripcion} + \CLASSWARNING{La opción 'sincantidad' no es compatible con 'duc'. Sin efecto opción 'duc'} + \fi + \fi + \ifdescuentos\booltrue{Descuentos}\fi + \ifiva\impdesctrue\booltrue{IVA}\fi + \ifsubtotal + \ifdescuentos + \booltrue{Subtotal} + \else + \CLASSWARNING{La opción 'subtotal' no aplica sin descuentos individuales. Sin efecto opción 'subtotal'} + \fi + \fi + + \ifsinnumero\denomtrue\fi + \ifsintotales + \iffilas + \filasfalse + \CLASSWARNING{La opción 'sintotales' no aplica para el modo de totalización en filas. Sin efecto opción 'filas'} + \fi + \ifcotizacion + \else + \CLASSWARNING{La opción 'sintotales' no debe usarse en facturas sino en cotizaciones. No es válida una factura sin totales} + \fi + \fi + + \ifcentrado + \iffilas + \else + \centradofalse + \CLASSWARNING{La opción 'centrado' no es compatible con el modo de totalización en columnas. Sin efecto opción 'centrado'} + \fi + \fi + \ifagrupado + \iffilas + \agrupadofalse + \CLASSWARNING{La opción 'agrupado' no es compatible con el modo de totalización en filas. Sin efecto opción 'agrupado'} + \fi + \fi + + \ifelectro + \booltrue{Electro} + \gdef\@NotaInterna{\@TextoDescuentoPresidencial} + \CLASSWARNING{Ya no está vigente el descuento en la alícuota general. Aplicándolo igual como se pidió} + \CLASSINFO{Se estableció el texto aclaratorio del descuento presidencial como 'nota interna'} + \iffilas + \filasfalse + \CLASSWARNING{La opción 'electro' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'} + \fi + \fi + + \iftodosiva \@BIRtrue \@BIAtrue \@Exentotrue \Gtrue \fi + \ifsiniva\AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}\fi + \ifsinivaexpresado + \iffilas + \filasfalse + \CLASSWARNING{La opción 'sinivaexpresado' no es compatible con la opción 'filas'. Sin efecto la opción 'filas'} + \else + \AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}} + \fi + \fi + + \iflinea + \RequirePackage{zref-savepos} + \ifexpandecuadro + \else + \CLASSWARNING{La opción 'linea' requiere la opción 'expandecuadro'. Activando la opción 'expandecuadro'} + \fi + \fi + \ifsinmarcas \def\@CaracterCR{\mbox{}} \def\@CaracterCeldasVacias{\mbox{}} \fi + \ifnospanish + \else + \RequirePackage[spanish]{babel}% Babel en castellano. + \RequirePackage[T1]{fontenc}% Codificación T1 para las tipografías. + \IfFileExists{lmodern.sty}{\RequirePackage{lmodern}}{} + \fi + + \ifexpandecuadro + \ifsinexpandir + \expandecuadrofalse + \sinexpandirfalse + \CLASSWARNING{Las opciones 'expandecuadro' y 'sinexpandir' no son compatibles. Sin efecto ambas opciones} + \else + \boolfalse{ExpAbajo} + \RequirePackage{zref-savepos}[2016/05/21]% Para guardar la posición en 'Y'. + \fi + \fi + \ifsinexpandir\boolfalse{ExpAbajo}\expandecuadrofalse\fi + + \ifsinreverso\@reversofalse\fi + \ifconreporte + \@reportetrue + \ifsoloreporte + \soloreportefalse + \CLASSWARNING{La opción 'soloreporte' no es compatible con 'conreporte'. Sin efecto 'soloreporte'} + \fi + \fi + \ifsoloreporte\@reportetrue\@facturafalse\@reversofalse\fi + + \if@reporte + \RequirePackage{zref-savepos}% Para la firma, que debe ser cargado aquí siempre que hay reporte porque \FirmaReporte no se ejecuta desde el preámbulo. + \fi + \ifcsv + \if@factura + \newwrite\csv \immediate\openout\csv=\jobname.csv + \ifsintotales\else\AtEndDocument{\@EscribeTotalesEnCSV}\fi + \else + \csvfalse + \CLASSWARNING{La opción 'csv' require generar la factura. Sin efecto opción 'csv'} + \fi + \fi + + \iftwoside + \@twosidetrue\@mparswitchtrue + \else + \@twosidefalse\@mparswitchfalse + \fi + + % Escribimos en el .log las opciones cargadas: + \ifagrupado \CLASSINFO{Opción cargada: agrupado}\fi + \ifcentradesc \CLASSINFO{Opción cargada: centradesc}\fi + \ifcentrado \CLASSINFO{Opción cargada: centrado}\fi + \ifconlineasha \CLASSINFO{Opción cargada: conlineasha}\fi + \ifconreporte \CLASSINFO{Opción cargada: conreporte}\fi + \ifcotizacion \CLASSINFO{Opción cargada: cotizacion}\fi + \ifcsv \CLASSINFO{Opción cargada: csv}\fi + \ifdcu \CLASSINFO{Opción cargada: dcu}\fi + \ifdenom \CLASSINFO{Opción cargada: denom}\fi + \ifdescuentos \CLASSINFO{Opción cargada: descuentos}\fi + \ifdosfirmas \CLASSINFO{Opción cargada: dosfirmas}\fi + \ifduc \CLASSINFO{Opción cargada: duc}\fi + \ifelectro \CLASSINFO{Opción cargada: electro}\fi + \ifexpandecuadro \CLASSINFO{Opción cargada: expandecuadro}\fi + \iffilas \CLASSINFO{Opción cargada: filas}\fi + \ifG \CLASSINFO{Opción cargada: G}\fi + \ifimpdesc \CLASSINFO{Opción cargada: impdesc}\fi + \ifiva \CLASSINFO{Opción cargada: iva}\fi + \iflinea \CLASSINFO{Opción cargada: linea}\fi + \ifnospanish \CLASSINFO{Opción cargada: nospanish}\fi + \ifnumitem \CLASSINFO{Opción cargada: numitem}\fi + \ifprefactura \CLASSINFO{Opción cargada: prefactura}\fi + \ifsincantidad \CLASSINFO{Opción cargada: sincantidad}\fi + \ifsinexpandir \CLASSINFO{Opción cargada: sinexpandir}\fi + \ifsinfirmas \CLASSINFO{Opción cargada: sinfirmas}\fi + \ifsiniva \CLASSINFO{Opción cargada: siniva}\fi + \ifsinivaexpresado \CLASSINFO{Opción cargada: sinivaexpresado}\fi + \ifsinlineash \CLASSINFO{Opción cargada: sinlineash}\fi + \ifsinlineashe \CLASSINFO{Opción cargada: sinlineashe}\fi + \ifsinlineashi \CLASSINFO{Opción cargada: sinlineashi}\fi + \ifsinlineasv \CLASSINFO{Opción cargada: sinlineasv}\fi + \ifsinlineasve \CLASSINFO{Opción cargada: sinlineasve}\fi + \ifsinlineasvi \CLASSINFO{Opción cargada: sinlineasvi}\fi + \ifsinmarcas \CLASSINFO{Opción cargada: sinmarcas}\fi + \ifsinnumero \CLASSINFO{Opción cargada: sinnumero}\fi + \ifsinreverso \CLASSINFO{Opción cargada: sinreverso}\fi + \ifsintotales \CLASSINFO{Opción cargada: sintotales}\fi + \ifsoloreporte \CLASSINFO{Opción cargada: soloreporte}\fi + \ifsubtotal \CLASSINFO{Opción cargada: subtotal}\fi + \iftodosiva \CLASSINFO{Opción cargada: todosiva}\fi + \iftwoside \CLASSINFO{Opción cargada: twoside}\fi + \ifunafirma \CLASSINFO{Opción cargada: unafirma}\fi + \ifvencimiento \CLASSINFO{Opción cargada: vencimiento}\fi + + % Cargamos aquí 'geometry' para que sea después de haber establecido 'twoside'. + \RequirePackage{geometry}} %% Escribimos el total como comentario en el .log, y avisamos cuando la fecha no sea la de hoy. \AtEndDocument{% - \DTMsavenow{Ahora}% - \DTMsaveddatediff{FechaEmision}{Ahora}{\AuxFecha}% + \DTMifsaveddate{FechaEmision}{% + \DTMsavenow{Ahora}% + \DTMsaveddatediff{FechaEmision}{Ahora}{\AuxFecha}}{}% \ifnum\AuxFecha=0% \else \CLASSWARNING{Fecha del documento \@Fecha\space distinta de la fecha de hoy}% \fi - \if@sintotales + \ifsintotales \else \if@factura\CLASSINFO{\@@Total: \space\space\space \Moneda \Total}\fi \fi} @@ -478,9 +601,12 @@ en la República Bolivariana de Venezuela. \IfBooleanTF{#1} {\AtEndPreamble{\DTMsavedate{FechaEmision}{#2-#3-#4}}} {\AtEndPreamble{\DTMsavedatex{FechaEmision}{#2}}}} +\def\@Fecha{\DTMusedate{FechaEmision}} + \NewDocumentCommand{\FormatoFecha}{o g g}{% \IfValueT{#1}{\gdef\@FormatoFechaEntrada{#1}}\IfValueT{#2}{\gdef\@FormatoFecha{#2}}\IfValueT{#3}{\gdef\@FechaSeparadores{#3}}} -\def\Credito#1{\gdef\@Credito{#1}\@vencimientotrue} + +\def\Credito#1{\gdef\@Credito{#1}\vencimientotrue} \def\RazonSocial#1{\gdef\@RazonSocial{#1}} \def\Nombre#1{\gdef\@RazonSocial{#1}\@Nombretrue} \def\RIF#1{\gdef\@RIF{#1}} @@ -543,6 +669,47 @@ en la República Bolivariana de Venezuela. \NewDocumentCommand{\NotaExterna}{+m}{\gdef\@NotaExterna{#1}} \AtBeginDocument{% + % Efectuamos distintos chequeos. + \if@reporte + \ifdefvoid{\@Num}{\CLASSWARNING{No se especificó el número de la factura. Puede dar error si el título del reporte no se especifica que aparezca en las cabeceras}}{}% + \ifdefvoid{\@Proveedor}{% + \ifdefvoid{\@Emisor} + {\CLASSERROR{Hay que definir el nombre del proveedor cuando se emite un reporte}}% + {\CLASSWARNING{Se toma el emisor como el proveedor por no haberse especificado este último}% + \let\@Proveedor=\@Emisor}} + {}% + \fi + \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razón social}}{}% + \if@factura + \ifdefvoid{\@RIF}{\CLASSERROR{Hay que definir el R.I.F}}{}% + \ifdefvoid{\@Direccion}{\CLASSERROR{Hay que definir la dirección fiscal}}{}% + \ifdefvoid{\@Telefono}{\CLASSWARNING{Pudiera definirse un número telefónico}}{}% + \ifdefvoid{\@Email}{\CLASSWARNING{Pudiera definirse una dirección de correo electrónico}}{}% + \ifdefvoid{\@Condiciones}{\CLASSWARNING{Pudieran definirse las condiciones del documento}}{}% + \DTMifsaveddate{FechaEmision}{}{% + \CLASSWARNING{No se especificó fecha. Asumiendo la fecha de hoy}% + \DTMsavedate{FechaEmision}{\the\year-\the\month-\the\day}}% + \ifcotizacion + \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para cotizacion se recomienda agregar el fondo}}{}% + \fi + \ifprefactura + \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para prefactura se recomienda agregar el fondo}}{}% + \fi + \ifsinnumero + \ifcotizacion + \else + \CLASSERROR{La opción para no poner el número sólo es compatible con las cotizaciones}% + \fi + \fi + \ifdenom + \ifsinnumero + \else + \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el número de la factura}}{}% + \fi + \fi + \fi + \ifdefvoid{\@Contacto}{\if@Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}% + % El cálculo de la fecha de vencimiento para cuando haya crédito o fecha de vencimiento explícita. \ifdefvoid{\@Credito} {\gdef\@FechaVencimiento{\DTMusedate{FechaEmision}}} @@ -563,7 +730,32 @@ en la República Bolivariana de Venezuela. \FPupn\@DescuentoGfactor{100 \@DescuentoGporc{} /}% \FPupn\@DescuentoRfactor{100 \@DescuentoRporc{} /}% \FPupn\@DescuentoAfactor{100 \@DescuentoAporc{} /}% - \FPupn\@DescuentoEfactor{100 \@DescuentoEporc{} /}} + \FPupn\@DescuentoEfactor{100 \@DescuentoEporc{} /} + + % Una vez definido todo en el preámbulo, los comandos usados para definir campos servirán para mostrar el campo que se definió con ese comando. + \def\RazonSocial{\@RazonSocial}% + \let\Nombre\RazonSocial + \def\RIF{\@RIF}% + \let\CI\RIF + \def\Direccion{\@Direccion}% + \def\Telefono{\@Telefono}% + \def\Email{\@Email}% + \def\Contacto{\@Contacto}% + \def\Emisor{\@Emisor}% + \def\Conforme{\@Conforme}% + \def\Proveedor{\@Proveedor}% + \def\Fecha{\@Fecha}% + \def\FechaVencimiento{\@FechaVencimiento}% + \def\Credito{\@Credito}% + \def\Num{\@Num}% + \def\NumSerieControl{\@NumSerieControl}% + \def\NumControl{\@NumControl}% + \def\Condiciones{\@Condiciones}% + \def\Resumen{\@Resumen}% + \def\NotaPrevia{\@NotaPrevia}% + \def\NotaInterna{\@NotaInterna}% + \def\NotaExterna{\@NotaExterna}% + \def\TituloReporte{\@TituloReporte}} %% Posiciones (X,Y) de los objetos: i) fecha, ii) denominación, iii) condiciones, iv) número de control, v) firmas. \NewDocumentCommand{\PosFecha}{s m m}{ @@ -743,17 +935,18 @@ en la República Bolivariana de Venezuela. %% Comando para incluir la firma escaneada en el sitio donde va la línea de la firma del emisor. \NewDocumentCommand{\FirmaFactura}{m O{0pt} O{0pt}}{% \FirmaFactura{imagen}[x-corr][y-corr] - \if@factura - \RequirePackage{graphicx} - \ifx&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi - \ifx&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi - \savebox{\@CajaFirmaEmisor}{#1} - \AtBeginShipoutNext{% - \begin{textblock*}{\@TamLineaFirmas}% - (\textwidth+\oddsidemargin+1in-\@TamLineaFirmas/2-\wd\@CajaFirmaEmisor/2-\@PosFirmasXdos+\@FirmaFacturaXcorr,\@PosFirmasY-\ht\@CajaFirmaEmisor-\dp\@CajaFirmaEmisor+\@FirmaFacturaYcorr)% - \usebox{\@CajaFirmaEmisor}% - \end{textblock*}}% - \fi} + \AtEndPreamble{ + \if@factura + \RequirePackage{graphicx} + \ifx&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi + \ifx&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi + \savebox{\@CajaFirmaEmisor}{#1} + \AtBeginShipoutNext{% + \begin{textblock*}{\@TamLineaFirmas}% + (\textwidth+\oddsidemargin+1in-\@TamLineaFirmas/2-\wd\@CajaFirmaEmisor/2-\@PosFirmasXdos+\@FirmaFacturaXcorr,\@PosFirmasY-\ht\@CajaFirmaEmisor-\dp\@CajaFirmaEmisor+\@FirmaFacturaYcorr)% + \usebox{\@CajaFirmaEmisor}% + \end{textblock*}}% + \fi}} \NewDocumentCommand{\FirmaReporte}{O{} O{0pt} O{0pt} G{\@Proveedor} O{\@FirmaReportePosX} O{\@FirmaReporteExcesoLinea}}{% \Firma[imagen][x-corr][y-corr]{texto}[posición en X desde la derecha][tamaño linea] \renewcommand{\baselinestretch}{1}\selectfont @@ -802,20 +995,22 @@ en la República Bolivariana de Venezuela. %% Con \FondoFactura le damos el nombre del archivo que contiene el formato de la factura, por ejemplo para compilaciones con 'prefactura', 'cotizacion' o para incluir una imagen de fondo como 'marca de agua'. \newcommand{\FondoFactura}[1]{ - \if@factura - \RequirePackage{graphicx} - \@FondoFacturatrue - \gdef\@FondoFactura{#1} - \fi} + \AtEndPreamble{ + \if@factura + \RequirePackage{graphicx} + \@FondoFacturatrue + \gdef\@FondoFactura{#1} + \fi}} %% Con \FondoReporte le damos el nombre del archivo que contiene el formato del reporte. Existen dos posibilidades: que dicho fondo salga en todas las páginas o sólo en la primera. \NewDocumentCommand{\FondoReporte}{s m}{ - \if@reporte - \@FondoReportetrue - \RequirePackage{graphicx} - \gdef\@FondoReporte{#2} - \IfBooleanT{#1}{\@FondoReporteStartrue}% Con * sale en todas las páginas; sin * sale sólo en la primera página. - \fi} + \AtEndPreamble{ + \if@reporte + \@FondoReportetrue + \RequirePackage{graphicx} + \gdef\@FondoReporte{#2} + \IfBooleanT{#1}{\@FondoReporteStartrue}% Con * sale en todas las páginas; sin * sale sólo en la primera página. + \fi}} %% Comando para establecer desde el preámbulo el estilo de página (\pagestyle) del reporte, tanto para la primera página como para las siguientes. \NewDocumentCommand{\EstiloPagReporte}{o m}{ @@ -837,43 +1032,11 @@ en la República Bolivariana de Venezuela. \input{factura.def}% Cargamos los valores predeterminados. -\if@todosiva - \@BIRtrue - \@BIAtrue - \@Exentotrue - \@Gtrue -\fi - -\if@csv% Abre el archivo csv. - \newwrite\csv - \immediate\openout\csv=\jobname.csv -\fi - -\if@nospanish -\else - \RequirePackage[spanish]{babel}% Babel en castellano. - \RequirePackage[T1]{fontenc}% Codificación T1 para las tipografías. - \IfFileExists{lmodern.sty}{\RequirePackage{lmodern}}{} -\fi - -\if@expandecuadro - \RequirePackage{zref-savepos}[2016/05/21]% Para guardar la posición en 'Y'. -\fi - -\if@reporte - \RequirePackage{zref-savepos}% Para la firma, que debe ser cargado aquí porque \FirmaReporte no se ejecuta desde el preámbulo. -\fi - -\if@sinmarcas - \def\@CaracterCR{\mbox{}} - \def\@CaracterCeldasVacias{\mbox{}} -\fi - %% Comando para escribir el encabezado en la factura. \newcommand\@EncabezadoFactura{% \ifdefvoid{\@Resumen}{\@EscribeDatos}{\@EscribeDatosResumen}% \vspace*{\@SeparaVertical}% - \if@expandecuadro\else\vfill\fi} + \ifexpandecuadro\else\vfill\fi} %% Comando para escribir el encabezado en el reporte. \newcommand\@EncabezadoReporte{% @@ -910,11 +1073,11 @@ 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]{% - \if@impdesc\settowidth{\@TempDimen}{\@EscribeTipoDeImpuesto{#2}}\fi + \ifimpdesc\settowidth{\@TempDimen}{\@EscribeTipoDeImpuesto{#2}}\fi \savebox{\@CajaPrueba}{% \parbox[t]{\linewidth}{% \David@XStart - \if@centradesc\centering\arraybackslash\fi + \ifcentradesc\centering\arraybackslash\fi #1% \David@XEnd \ifdim\@TempDimen=0pt% @@ -922,7 +1085,7 @@ en la República Bolivariana de Venezuela. \hfill\kern\@SeparaFinLineaDesc\@EscribeTipoDeImpuesto{#2}% \fi \par\global\count1=\prevgraf}}% - \if@sinmarcas + \ifsinmarcas \usebox{\@CajaPrueba}% \else \ifnum\count1=1% @@ -934,7 +1097,7 @@ en la República Bolivariana de Venezuela. \fi \parbox[t]{\linewidth-\@TempDimen-\@SeparaFinLineaDesc}{% \David@XStart - \if@centradesc\centering\arraybackslash\fi + \ifcentradesc\centering\arraybackslash\fi #1% \David@XEnd \par @@ -943,7 +1106,7 @@ en la República Bolivariana de Venezuela. \count2=\prevgraf \loop \ifnum\count0=\count2 - \if@impdesc + \ifimpdesc \vskip-\baselineskip \mbox{}\hfill \rlap{% @@ -1007,11 +1170,11 @@ en la República Bolivariana de Venezuela. %% Presentación de totales en modo de columnas. \newcommand{\@EscribeTotalCol}[1]{% \expandafter\FPifeq\csname Desc#1\endcsname{0}% - \if@sinivaexpresado\else\@EscribeTotalColBI{#1}\fi + \ifsinivaexpresado\else\@EscribeTotalColBI{#1}\fi \else \@EscribeTotalColSubt{#1}% \@EscribeTotalColDesc{#1}% - \if@sinivaexpresado\else\@EscribeTotalColBI{#1}\fi + \ifsinivaexpresado\else\@EscribeTotalColBI{#1}\fi \fi} %% Forma agupada para la presentación de totales en modo de columnas. @@ -1024,7 +1187,7 @@ en la República Bolivariana de Venezuela. \if@BIR\if@DescR\@EscribeTotalColDesc{R}\fi\fi \if@DescG\@EscribeTotalColDesc{G}\fi \if@BIA\if@DescA\@EscribeTotalColDesc{A}\fi\fi - \if@sinivaexpresado + \ifsinivaexpresado \else \if@Exento\@EscribeTotalColBI{E}\fi \if@BIR\@EscribeTotalColBI{R}\fi @@ -1040,7 +1203,7 @@ en la República Bolivariana de Venezuela. \@LetraTitTotales \csname @@BI#1\endcsname \ifx#1E% \else - \if@G\ \hfill(\csname @Alicuota#1porc\endcsname\%)\else\mbox{}\fi + \ifG\ \hfill(\csname @Alicuota#1porc\endcsname\%)\else\mbox{}\fi \fi & \@LetraNumTotales\numprint{\csname BI#1\endcsname} \\} @@ -1083,7 +1246,7 @@ en la República Bolivariana de Venezuela. \newcommand{\@EscribeTotalFilasBIizq}[1]{% \@LetraTitTotales\csname @@BI#1\endcsname \ifx#1G% - \if@G \ (\@AlicuotaGporc\%)\fi% Si hay otra B.I. que no sea general, escribimos el porcentaje explícito en la general. + \ifG \ (\@AlicuotaGporc\%)\fi% Si hay otra B.I. que no sea general, escribimos el porcentaje explícito en la general. \else \ifx#1E% \else @@ -1152,14 +1315,14 @@ en la República Bolivariana de Venezuela. \hspace*{\@SepTotales}\usebox{\@CajaAliG}% \if@Exento\hspace*{\@SepTotales}\usebox{\@CajaBIE}\fi \hspace*{\@SepTotales}\usebox{\@CajaTotal}% - \if@centrado\hspace*{\@SepTotales}\fi} + \ifcentrado\hspace*{\@SepTotales}\fi} \newcommand{\@EscribeTotalesFilasGxET}{% \if@BIR\hspace*{\@SepTotales}\usebox{\@CajaBIAliR}\fi \hspace*{\@SepTotales}\usebox{\@CajaBIAliG}% \if@BIA\hspace*{\@SepTotales}\usebox{\@CajaBIAliA}\fi \hspace*{\@SepTotales}\if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi - \if@centrado\hspace*{\@SepTotales}\fi} + \ifcentrado\hspace*{\@SepTotales}\fi} \newcommand{\@EscribeTotalesFilasRGA}{% \hspace*{\@SepTotales}\usebox{\@CajaBIAliR}% @@ -1170,12 +1333,12 @@ en la República Bolivariana de Venezuela. \newcommand{\@EscribeTotalesFilasRGAET}{% \@EscribeTotalesFilasRGA \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi - \if@centrado\hspace*{\@SepTotales}\fi} + \ifcentrado\hspace*{\@SepTotales}\fi} %% Escribe la letra que designa al tipo de impuesto que aplica al ítem. \NewDocumentCommand{\@EscribeTipoDeImpuesto}{m}{% % Hay que abrir un grupo de ejecución porque el cambio en la tipografía altera la celda. - {\if@G + {\ifG \@LetraTipoIVA \ifx#1G\@DenomAlicuotaG\fi \ifx#1R\@DenomAlicuotaR\fi @@ -1278,23 +1441,6 @@ en la República Bolivariana de Venezuela. % Novena y última línea. \ifbool{SinLineasVertExt}{}{|}} -%% Comando auxiliar para abrir la tabla del cuadro de la factura y expandir completamente las columnas. -\edef\@FacturaAuxInicioCmd{\noexpand\begin{tabularx}{\textwidth}{\@FacturaAuxColumnasEval}} - -%% Comando auxiliar para abrir el '\multicolumn' para los totales en el modo de columnas y expandir completamente las columnas cuando hay o no barras verticales. -\edef\@ColumnasMultiColumnTotalesAuxCmd{% - \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|} r}\begingroup - \noexpand\ifdim \noexpand\ht\noexpand\@CajaEspacioVacio=0pt - \noexpand\else - \noexpand\if@linea\noexpand\zsaveposx{LineaNodoBCoordX}\noexpand\zsaveposy{LineaNodoBCoordY}\noexpand\fi\noexpand\fi% Fijamos la posición (x,y) final para la línea ya que estaremos justo en el punto donde escribimos el total, y hasta allí llega la línea en el modo de columnas. - \noexpand\begin{tabular}[b]{@{\noexpand\extracolsep{2\noexpand\tabcolsep}}lr \ifbool{SinLineasVertExt}{}{|}}} - -%% Comando auxiliar para abrir el '\multicolumn' de la nota interna y evalúe la presencia o no de las barras verticales. -\edef\@ColumnasMultiColumnNotaIntAuxCmd{% - \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|}l\ifbool{SinLineasVertExt}{}{|}}{% - \noexpand\parbox[t]{\linewidth-2\tabcolsep-2\arrayrulewidth}{\noexpand\@LetraNotaInterna\noexpand\@NotaInterna\noexpand\strut}}% - \noexpand\\} - %% Comando para hacer los cálculos sobre cada ítem y establecer las macros con el contenido de cada ítem introducido. \NewDocumentCommand{\@CalculaItem}{m m m o m m}{% \addtocounter{NumItem}{1}% @@ -1303,7 +1449,7 @@ en la República Bolivariana de Venezuela. \ifbool{Descuentos} {\ifx\\#6\\\FPset\Dcto{0}\else\FPupn\Dcto{#6 \@DigitosPorc{} round clip}\fi}% Fijamos en 0 el descuento si no se especifica en \Item***. {\FPset\Dcto{#6}% - \FPifeq\Dcto{0}\else\CLASSWARNING{Se pidió un descuento individual sin dar la opción de la clase 'descuentos'. No se tomará en cuenta.}\fi + \FPifeq\Dcto{0}\else\CLASSWARNING{Se pidió un descuento individual sin dar la opción de la clase 'descuentos'. No se tomará en cuenta}\fi \FPset\Dcto{0}}% También fijamos en 0 el descuento por si se especifica en \Item*** pero no se pide la opción 'descuentos'. \FPupn\PrecioS{#2 \PrecioU{} * \@DigitosMoneda{} round}% \FPupn\PrecioT{100 \Dcto{} 100 - / \PrecioS{} * \@DigitosMoneda{} round}% @@ -1359,502 +1505,519 @@ en la República Bolivariana de Venezuela. \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@expandecuadro - \setlength{\@EspacioVacioInicial}{\zposy{EspacioVacioInicial}sp}% - \setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}% - \global\@EspacioVacioInicial=\@EspacioVacioInicial% Hay que globalizarlas - \global\@EspacioVacioFinal=\@EspacioVacioFinal - \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{0pt}{% - \if@linea - \if@LineaCompleta - \zsaveposy{LineaNodoBCoordY}% - \else - \if@LineaHastaTotal +%% Todo esto tiene que estar dentro de \AtEndPreamble que es cuando \if@factura, \if@reverso e \if@reporte fueron ya aplicadas, y para que se evalúen adecuadamente en su momento las definiciones hechas con \edef. +\AtEndPreamble{ + % Comando auxiliar para abrir la tabla del cuadro de la factura y expandir completamente las columnas. + \edef\@FacturaAuxInicioCmd{\noexpand\begin{tabularx}{\textwidth}{\@FacturaAuxColumnasEval}} + + % Comando auxiliar para abrir el '\multicolumn' de la nota interna y evalúe la presencia o no de las barras verticales. + \edef\@ColumnasMultiColumnNotaIntAuxCmd{% + \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|}l\ifbool{SinLineasVertExt}{}{|}}{% + \noexpand\parbox[t]{\linewidth-2\tabcolsep-2\arrayrulewidth}{\noexpand\@LetraNotaInterna\noexpand\@NotaInterna\noexpand\strut}}% + \noexpand\\} + + % Comando auxiliar para abrir el '\multicolumn' para los totales en el modo de columnas y expandir completamente las columnas cuando hay o no barras verticales. + \edef\@ColumnasMultiColumnTotalesAuxCmd{% + \noexpand\multicolumn{8}{\ifbool{SinLineasVertExt}{}{|} r}\begingroup + \noexpand\ifdim \noexpand\ht\noexpand\@CajaEspacioVacio=0pt + \noexpand\else + \noexpand\iflinea\noexpand\zsaveposx{LineaNodoBCoordX}\noexpand\zsaveposy{LineaNodoBCoordY}\noexpand\fi\noexpand\fi% Fijamos la posición (x,y) final para la línea ya que estaremos justo en el punto donde escribimos el total, y hasta allí llega la línea en el modo de columnas. + \noexpand\begin{tabular}[b]{@{\noexpand\extracolsep{2\noexpand\tabcolsep}}lr \ifbool{SinLineasVertExt}{}{|}}} + + % 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]{% + \ifexpandecuadro + \setlength{\@EspacioVacioInicial}{\zposy{EspacioVacioInicial}sp}% + \setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}% + \global\@EspacioVacioInicial=\@EspacioVacioInicial% Hay que globalizarlas + \global\@EspacioVacioFinal=\@EspacioVacioFinal + \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{0pt}{% + \iflinea + \if@LineaCompleta + \zsaveposy{LineaNodoBCoordY}% \else - \zsaveposx{LineaNodoACoordX}\mbox{}\hfill \zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}% + \if@LineaHastaTotal + \else + \zsaveposx{LineaNodoACoordX}\mbox{}\hfill \zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}% + \fi \fi - \fi - \fi}}% - \ifdim \ht\@CajaEspacioVacio=0pt \global\@lineafalse \fi - \fi + \fi}}% + \ifdim \ht\@CajaEspacioVacio=0pt \global\lineafalse \fi + \fi - \ifx\undefined\Total\relax\else\CLASSERROR{Parece ya haberse usado un entorno de factura}\fi - % - % Comandos \David@SavePos, \David@XStart, \David@XEnd, \David@XPad, \David@XLeft y \David@XRight para poder manejar el salto de línea en las columnas adyacentes a la columna 'X' del tabularx (la descripción), cuando esta ocupa más que una línea. - % Gracias a David Carlisle (Thanks to David Carlisle). - % http://tex.stackexchange.com/questions/111203/tabularx-bottom-alignment-on-r-or-l-columns-when-x-column-wraps - \def\David@SavePos##1{\leavevmode\pdfsavepos\write\@auxout{\gdef\noexpand##1{\the\pdflastypos sp}}}% - \def\David@XStart{\expandafter\David@SavePos\csname save@start@\romannumeral\value{NumItem}\endcsname}% - \def\David@XEnd{\expandafter\David@SavePos\csname save@end@\romannumeral\value{NumItem}\endcsname}% - \def\David@XPad##1##2##3{% - \vtop{% - \baselineskip\normalbaselineskip - ##2% - \expandafter - \ifx\csname save@start@##1\endcsname - \relax + \ifx\undefined\Total\relax\else\CLASSERROR{Parece ya haberse usado un entorno de factura}\fi + % + % Comandos \David@SavePos, \David@XStart, \David@XEnd, \David@XPad, \David@XLeft y \David@XRight para poder manejar el salto de línea en las columnas adyacentes a la columna 'X' del tabularx (la descripción), cuando esta ocupa más que una línea. + % Gracias a David Carlisle (Thanks to David Carlisle). + % http://tex.stackexchange.com/questions/111203/tabularx-bottom-alignment-on-r-or-l-columns-when-x-column-wraps + \def\David@SavePos##1{\leavevmode\pdfsavepos\write\@auxout{\gdef\noexpand##1{\the\pdflastypos sp}}}% + \def\David@XStart{\expandafter\David@SavePos\csname save@start@\romannumeral\value{NumItem}\endcsname}% + \def\David@XEnd{\expandafter\David@SavePos\csname save@end@\romannumeral\value{NumItem}\endcsname}% + \def\David@XPad##1##2##3{% + \vtop{% + \baselineskip\normalbaselineskip + ##2% + \expandafter + \ifx\csname save@start@##1\endcsname + \relax + \else + \dimen@\csname save@start@##1\endcsname\relax + \loop + \ifdim\dimen@>\csname save@end@##1\endcsname + \advance\dimen@-\baselineskip + \settowidth{\@TempDimen}{##3}% + \ifdim\@TempDimen=0pt\settowidth{\@TempDimen}{##2}\fi + \hbox{\parbox{\@TempDimen}{\@CaracterCeldasVacias}}% + \repeat + \fi + ##3}}% + \def\David@XLeft##1{\David@XPad{\romannumeral\value{NumItem}}{\hbox{##1}}{}}% + \def\David@XRight##1{\David@XPad{\romannumeral\value{NumItem}}{}{\hbox{##1}}}% + % + % 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 para fijar la separación extra final de cada item, lo cual viene dado por la cantidad de líneas de la descripción, + % que está alojado en \count1, definido en \@DescripcionAuxCmd. + \def\@CalculaSeparaItemsExtraFinal{% + \setlength{\@SeparaItemsExtraFinal}{\numexpr\the\count1\normalbaselineskip-\normalbaselineskip+\@SeparaItemsExtra}% + \global\@SeparaItemsExtraFinal=\@SeparaItemsExtraFinal} + % + % Comando interno general para agregar cualquier ítem. + \NewDocumentCommand{\@ITEM}{m m m o m m}{% + % 1. [R|G|A|E|X]; 2. cantidad; 3. descripción; 4. descripción para el csv (entre corchetes); 5. p/u; 6. dcto. + \@CalculaItem{##1}{##2}{##3}{##5}{##6}% + % Si no es el primer ítem, entonces hace falta \\ para terminar el ítem anterior. + \ifnum\value{NumItem}=1% Aquí, \@CalculaItem aumenta en 1 el contador NumItem, que si vale 1 significa que aún no hemos procesado la línea 1, es decir, no hay que hacer el salto de línea. La última línea se termina en otro lado. \else - \dimen@\csname save@start@##1\endcsname\relax - \loop - \ifdim\dimen@>\csname save@end@##1\endcsname - \advance\dimen@-\baselineskip - \settowidth{\@TempDimen}{##3}% - \ifdim\@TempDimen=0pt\settowidth{\@TempDimen}{##2}\fi - \hbox{\parbox{\@TempDimen}{\@CaracterCeldasVacias}}% - \repeat + \@CalculaSeparaItemsExtraFinal + \\[\@SeparaItemsExtraFinal] + \ifconlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta. \fi - ##3}}% - \def\David@XLeft##1{\David@XPad{\romannumeral\value{NumItem}}{\hbox{##1}}{}}% - \def\David@XRight##1{\David@XPad{\romannumeral\value{NumItem}}{}{\hbox{##1}}}% - % - % 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 para fijar la separación extra final de cada item, lo cual viene dado por la cantidad de líneas de la descripción, - % que está alojado en \count1, definido en \@DescripcionAuxCmd. - \def\@CalculaSeparaItemsExtraFinal{% - \setlength{\@SeparaItemsExtraFinal}{\numexpr\the\count1\normalbaselineskip-\normalbaselineskip+\@SeparaItemsExtra}% - \global\@SeparaItemsExtraFinal=\@SeparaItemsExtraFinal} - % - % Comando interno general para agregar cualquier ítem. - \NewDocumentCommand{\@ITEM}{m m m o m m}{% - % 1. [R|G|A|E|X]; 2. cantidad; 3. descripción; 4. descripción para el csv (entre corchetes); 5. p/u; 6. dcto. - \@CalculaItem{##1}{##2}{##3}{##5}{##6}% - % Si no es el primer ítem, entonces hace falta \\ para terminar el ítem anterior. - \ifnum\value{NumItem}=1% Aquí, \@CalculaItem aumenta en 1 el contador NumItem, que si vale 1 significa que aún no hemos procesado la línea 1, es decir, no hay que hacer el salto de línea. La última línea se termina en otro lado. - \else - \@CalculaSeparaItemsExtraFinal - \\[\@SeparaItemsExtraFinal] - \if@conlineasha\hline\fi% Líneas para separar cada ítem, si hiciera falta. - \fi - % Primer -opcional- campo: El número del ítem. - \ifbool{NumItem}{\David@XLeft{\@NumItemAuxCmd{\mbox{}\hfill \@LetraNumeros \arabic{NumItem}\hfill\mbox{}}}}{}% - & - % Segundo campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc). - \ifbool{SinCantidad}{}{% - \ifbool{PrimeroDescripcion} - {\@DescripcionAuxCmd{##3}{##1}}% dcu y duc. - {\David@XLeft{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}}}% cdu. - & - % Tercer campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc). - \ifbool{PrimeroDescripcion}{% - \if@dcu - \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu. - \else - \David@XRight{\@PrecioUAuxCmd{% + % Primer -opcional- campo: El número del ítem. + \ifbool{NumItem}{\David@XLeft{\@NumItemAuxCmd{\mbox{}\hfill \@LetraNumeros \arabic{NumItem}\hfill\mbox{}}}}{}% + & + % Segundo campo: Acá puede ir la cantidad (cdu) o la descripción (dcu y duc). + \ifbool{SinCantidad}{}{% + \ifbool{PrimeroDescripcion} + {\@DescripcionAuxCmd{##3}{##1}}% dcu y duc. + {\David@XLeft{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}}}% cdu. + & + % Tercer campo: Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc). + \ifbool{PrimeroDescripcion}{% + \ifdcu + \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu. + \else + \David@XRight{\@PrecioUAuxCmd{% + \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% + \else + \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU} + \fi}}% duc. + \fi} + {\@DescripcionAuxCmd{##3}{##1}}% cdu. + & + % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc). + \FPifeq\PrecioU{##5}\else\CLASSWARNING{Se está introduciendo un precio con más de dos decimales: (##3 - ##5. Redondeado a \PrecioU)}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales. + \ifbool{SinCantidad}{}{% + \ifduc + \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% duc. + \else + \David@XRight{\@PrecioUAuxCmd{% + \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% + \else + \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU} + \fi}}% dcu y cdu. + \fi}% + & % Quinto -opcional- campo: Subtotal (para luego descuentos). + \ifbool{Subtotal}{% + \David@XRight{\@PrecioSAuxCmd{% \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% \else - \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU} - \fi}}% duc. - \fi} - {\@DescripcionAuxCmd{##3}{##1}}% cdu. - & - % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc). - \FPifeq\PrecioU{##5}\else\CLASSWARNING{Se está introduciendo un precio con más de dos decimales: (##3 - ##5. Redondeado a \PrecioU)}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales. - \ifbool{SinCantidad}{}{% - \if@duc - \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% duc. - \else - \David@XRight{\@PrecioUAuxCmd{% + \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioS} + \fi}}}{} + & + % Sexto -opcional- campo: Descuento. + \ifbool{Descuentos}{% + \David@XRight{\@DescuentoAuxCmd{% \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% \else - \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioU} - \fi}}% dcu y cdu. - \fi}% - & % Quinto -opcional- campo: Subtotal (para luego descuentos). - \ifbool{Subtotal}{% - \David@XRight{\@PrecioSAuxCmd{% - \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% - \else - \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioS} - \fi}}}{} - & - % Sexto -opcional- campo: Descuento. - \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. - & - % Séptimo -opcional- campo: IVA. - \ifbool{IVA}{% - \David@XRight{\@IVAAuxCmd{% + \mbox{}\hfill \@LetraNumeros \numprint{\Dcto}\%\hfill\mbox{}% + \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq. + & + % Séptimo -opcional- campo: IVA. + \ifbool{IVA}{% + \David@XRight{\@IVAAuxCmd{% + \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% + \else + \mbox{}\hfill \@LetraNumeros \numprint{\csname @Alicuota##1porc\endcsname}\%\hfill\mbox{}% + \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq. + & + % Octavo campo: El total. + \David@XRight{\@PrecioTAuxCmd{% \ifx##1X \hfill \@CaracterItemXVacio \hfill\mbox{}% \else - \mbox{}\hfill \@LetraNumeros \numprint{\csname @Alicuota##1porc\endcsname}\%\hfill\mbox{}% - \fi}}}{}% Tenemos que usar un condicional booleano porque si no da problemas con el condicional \FPifeq. - & - % Octavo campo: El total. - \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 - \IfValueTF{##4}{\@EscribeItemsEnCSV{##1}{##2}{##4}}{\@EscribeItemsEnCSV{##1}{##2}{##3}}% - \fi}% - % - % Comando para escribir en el .csv. - \newcommand{\@EscribeItemsEnCSV}[3]{% - \ifbool{SinCantidad} - {\if@descuentos - \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}","\PrecioU","\Dcto","\PrecioT","##1"}% + \ifimpdesc\else\@EscribeTipoDeImpuesto{##1}\fi \hfill \@LetraNumeros \numprint{\PrecioT} + \fi}}% + % Escribimos al csv. + \ifcsv + \IfValueTF{##4}{\@EscribeItemsEnCSV{##1}{##2}{##4}}{\@EscribeItemsEnCSV{##1}{##2}{##3}}% + \fi}% + % + % Comando para escribir en el .csv. + \newcommand{\@EscribeItemsEnCSV}[3]{% + \ifbool{SinCantidad} + {\ifdescuentos + \immediate\write\csv{"\unexpanded{##3}","\Dcto","\PrecioT","##1"}% \else - \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}% + \immediate\write\csv{"\unexpanded{##3}","\PrecioT","##1"}% + \fi} + {\if@cdu + \ifdescuentos + \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\Dcto","\PrecioT","##1"}% + \else + \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}% + \fi \fi - \fi - \if@dcu - \if@descuentos - \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\Dcto","\PrecioT","##1"}% - \else - \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\PrecioT","##1"}% + \ifdcu + \ifdescuentos + \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\Dcto","\PrecioT","##1"}% + \else + \immediate\write\csv{"\unexpanded{##3}","##2","\PrecioU","\PrecioT","##1"}% + \fi \fi - \fi - \if@duc - \if@descuentos - \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\Dcto","\PrecioT","##1"}% + \ifduc + \ifdescuentos + \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\Dcto","\PrecioT","##1"}% + \else + \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\PrecioT","##1"}% + \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 el número del ítem, si aplicara. + \if@LineaDesdeInicio \hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi + \ifbool{NumItem}{\@NumItemAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@NumItem \hfill\mbox{}}}{}% + & + % Avanzamos a la cantidad, o la descripción. + \ifbool{SinCantidad}{}{\ifbool{PrimeroDescripcion}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}}}% + &% Avanzamos hasta la descripción, la cantidad o el precio unitario. + \ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}} + {\if@cdu \@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}\fi + \ifdcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}\fi + \ifduc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}% + &% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'. + \ifbool{SinCantidad}{} + {% + \mbox{}\hfill + \ifduc + \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}% \else - \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\PrecioT","##1"}% - \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 el número del ítem, si aplicara. - \if@LineaDesdeInicio \hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi - \ifbool{NumItem}{\@NumItemAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@NumItem \hfill\mbox{}}}{}% - & - % Avanzamos a la cantidad, o la descripción. - \ifbool{SinCantidad}{}{\ifbool{PrimeroDescripcion}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}}}% - &% Avanzamos hasta la descripción, la cantidad o el precio unitario. - \ifbool{SinCantidad}{\@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}} - {\if@cdu \@DescripcionAuxCmd{\@LetraTitColumnas \@@Descripcion}{}\fi - \if@dcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}\fi - \if@duc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}% - &% Avanzamos hasta el precio unitario, o la cantidad, o columna fantasma cuando es 'sincantidad'. - \ifbool{SinCantidad}{} - {% - \mbox{}\hfill - \if@duc - \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}% + \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}% + \fi}% + &% Avanzamos hasta el subtotal, que puede o no existir, + \ifbool{Subtotal}{\@PrecioSAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioS \space (\Moneda)\hfill\mbox{}}}{}% + &% Avanzamos hasta el descuento, que puede o no existir. + \ifdescuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Descuento \hfill\mbox{}}\fi + &% Avanzamos hasta el IVA, que puede o no existir. + \ifbool{IVA}{\@IVAAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@IVA \hfill\mbox{}}}{} + &% Avanzamos hasta el precio total. + \@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitColumnas \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}% + \if@LineaCompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi + \\ + \ifbool{SinLineasHoriInt}{}{\hline}% + % + #1% Aquí entran todos los items que el usuario declara dentro del ambiente. + \@CalculaSeparaItemsExtraFinal + \\[\@SeparaItemsExtraFinal]% El último fin de línea se hace aquí. + \ifconlineasha\hline\fi% Se verifica si hace falta una línea horizontal o no. + \iffilas + % Esto en lugar de \ifexpandecuadro para que no se haga una linea vacía en la tabla cuando la caja está vacía. + \ifdim \ht\@CajaEspacioVacio=0pt + \ifdefvoid{\@NotaInterna}{% + \ifbool{SinLineasHoriExt}{}{% + \ifconlineasha\else\hline\fi}% Verificamos si hay que poner la línea horizontal. Si está 'conlineasha' ya salió debido a esta opción. + }{\@ColumnasMultiColumnNotaIntAuxCmd\ifbool{SinLineasHoriExt}{}{\hline}}% \else - \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioU \space (\Moneda)\hfill\mbox{}}% - \fi}% - &% Avanzamos hasta el subtotal, que puede o no existir, - \ifbool{Subtotal}{\@PrecioSAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@PrecioS \space (\Moneda)\hfill\mbox{}}}{}% - &% Avanzamos hasta el descuento, que puede o no existir. - \if@descuentos \@DescuentoAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Descuento \hfill\mbox{}}\fi - &% Avanzamos hasta el IVA, que puede o no existir. - \ifbool{IVA}{\@IVAAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@IVA \hfill\mbox{}}}{} - &% Avanzamos hasta el precio total. - \@PrecioTAuxCmd{\mbox{}\hfill \@LetraTitColumnas \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}% - \if@LineaCompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi - \\ - \ifbool{SinLineasHoriInt}{}{\hline}% - % - #1% Aquí entran todos los items que el usuario declara dentro del ambiente. - \@CalculaSeparaItemsExtraFinal - \\[\@SeparaItemsExtraFinal]% 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@expandecuadro para que no se haga una linea vacía en la tabla cuando la caja está vacía. - \ifdim \ht\@CajaEspacioVacio=0pt - \ifdefvoid{\@NotaInterna}{% - \ifbool{SinLineasHoriExt}{}{% - \if@conlineasha\else\hline\fi}% Verificamos si hay que poner la línea horizontal. Si está 'conlineasha' ya salió debido a esta opción. - }{\@ColumnasMultiColumnNotaIntAuxCmd\ifbool{SinLineasHoriExt}{}{\hline}}% - \else - \ifbool{PrimeroDescripcion}{&\usebox{\@CajaEspacioVacio}&&&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&&&\\}% - \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}% - \ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá. - \fi - \else - \ifbool{SinLineasHoriInt}{}{\if@conlineasha\else\hline\fi}% Línea que cierra los ítems en la tabla. - % Agregamos el espacio espúreo. - \ifdim \ht\@CajaEspacioVacio=0pt - \else - % Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica. - \ifbool{SinLineasVertExt}{\multicolumn{8}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{8}{|c|}{\usebox{\@CajaEspacioVacio}}}\\ - \fi - % Si pedimos sin totalizaciones, entonces cerramos la tabla ya, si no, calculamos los totales y los escribimos - \if@sintotales + \ifbool{PrimeroDescripcion}{&\usebox{\@CajaEspacioVacio}&&&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&&&\\}% + \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}% + \ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá. + \fi \else - % Modo de columnas: Abrimos la tabla para escribir los totales, y le agregamos las líneas verticales externas, si aplica. - \@ColumnasMultiColumnTotalesAuxCmd - \@CalculaTotalesI - \if@agrupado - \@EscribeTotalColAgrupado + \ifbool{SinLineasHoriInt}{}{\ifconlineasha\else\hline\fi}% Línea que cierra los ítems en la tabla. + % Agregamos el espacio espúreo. + \ifdim \ht\@CajaEspacioVacio=0pt \else - \if@Exento \@EscribeTotalCol{E}\fi - \if@BIR\@EscribeTotalCol{R}\if@sinivaexpresado\else\@EscribeTotalColAlicuota{R}\fi\fi - \@EscribeTotalCol{G}\if@sinivaexpresado\else\@EscribeTotalColAlicuota{G}\fi - \ifbool{Electro}{\@EscribeTotalColAlicuotaGDesc}{}% - \if@BIA\@EscribeTotalCol{A}\if@sinivaexpresado\else\@EscribeTotalColAlicuota{A}\fi\fi + % Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica. + \ifbool{SinLineasVertExt}{\multicolumn{8}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{8}{|c|}{\usebox{\@CajaEspacioVacio}}}\\ \fi - \if@sinivaexpresado\else\cline{2-2}\fi - \hfill \@LetraTitTotal\@@Total & \@LetraNumTotal\numprint{\Total}\\ - \end{tabular}\endgroup - \\ - \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}% - \ifbool{SinLineasHoriExt}{}{\hline}% - \fi - \fi - \end{tabularx}% - % - % Generamos la macro \Total vacía para que no dé error en algún posible uso dentro del documento. - \if@sintotales\gdef\Total{}\fi - % Si pedimos no totalizar (sintotales), la opción filas queda desactivada. - \if@filas - \@CalculaTotalesI - \@LetraNumTotales - \vspace*{\@SeparaVertical}\par - \if@expandecuadro\else\vfill\fi - \@GeneraCajasTotalesFilas - \newbox{\@CajaTotal}% - \savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total}: \@LetraNumTotal\numprint{\Total}}% - % - \ifnum \value{@IVANoGeneral}=0% - \newbox{\@CajaGET}% - \savebox{\@CajaGET}{\@EscribeTotalesFilasGET}% - \ifdim \the\wd\@CajaGET < \textwidth - \parbox{\textwidth}{\@EscribeTotalesFilasGET}% + % Si pedimos sin totalizaciones, entonces cerramos la tabla ya, si no, calculamos los totales y los escribimos + \ifsintotales \else - \hspace*{\@SepTotales}% - \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}% - \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi - \if@centrado\hspace*{\@SepTotales}\fi + % Modo de columnas: Abrimos la tabla para escribir los totales, y le agregamos las líneas verticales externas, si aplica. + \@ColumnasMultiColumnTotalesAuxCmd + \@CalculaTotalesI + \ifagrupado + \@EscribeTotalColAgrupado + \else + \if@Exento \@EscribeTotalCol{E}\fi + \if@BIR\@EscribeTotalCol{R}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{R}\fi\fi + \@EscribeTotalCol{G}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{G}\fi + \ifbool{Electro}{\@EscribeTotalColAlicuotaGDesc}{}% + \if@BIA\@EscribeTotalCol{A}\ifsinivaexpresado\else\@EscribeTotalColAlicuota{A}\fi\fi + \fi + \ifsinivaexpresado\else\cline{2-2}\fi + \hfill \@LetraTitTotal\@@Total & \@LetraNumTotal\numprint{\Total}\\ + \end{tabular}\endgroup + \\ + \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}% + \ifbool{SinLineasHoriExt}{}{\hline}% \fi \fi - \ifnum \value{@IVANoGeneral}=1% - \newbox{\@CajaGxET}% - \savebox{\@CajaGxET}{\@EscribeTotalesFilasGxET}% - \ifdim \the\wd\@CajaGxET < \textwidth - \@EscribeTotalesFilasGxET - \else - \hspace*{\@SepTotales}% - \if@BIR\usebox{\@CajaBIAliR}\hspace*{\@SepTotales}\fi - \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}% - \if@BIA\usebox{\@CajaBIAliA}\hspace*{\@SepTotales}\fi - \\[\@SeparaFilas]\mbox{}% - \if@centrado\hspace*{\@SepTotales}\else\hfill\fi - \if@Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}% - \if@centrado\hspace*{\@SepTotales}\fi + \end{tabularx}% + % + % Generamos la macro \Total vacía para que no dé error en algún posible uso dentro del documento. + \ifsintotales\gdef\Total{}\fi + % Si pedimos no totalizar (sintotales), la opción filas queda desactivada. + \iffilas + \@CalculaTotalesI + \@LetraNumTotales + \vspace*{\@SeparaVertical}\par + \ifexpandecuadro\else\vfill\fi + \@GeneraCajasTotalesFilas + \newbox{\@CajaTotal}% + \savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total}: \@LetraNumTotal\numprint{\Total}}% + % + \ifnum \value{@IVANoGeneral}=0% + \newbox{\@CajaGET}% + \savebox{\@CajaGET}{\@EscribeTotalesFilasGET}% + \ifdim \the\wd\@CajaGET < \textwidth + \parbox{\textwidth}{\@EscribeTotalesFilasGET}% + \else + \hspace*{\@SepTotales}% + \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}% + \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi + \ifcentrado\hspace*{\@SepTotales}\fi + \fi \fi - \fi - \ifnum \value{@IVANoGeneral}=2% - \newbox{\@CajaRGAET}% - \savebox{\@CajaRGAET}{\@EscribeTotalesFilasRGAET}% - \ifdim \the\wd\@CajaRGAET < \textwidth - \@EscribeTotalesFilasRGAET - \else - \newbox{\@CajaRGA}% - \savebox{\@CajaRGA}{\@EscribeTotalesFilasRGA}% - \ifdim \the\wd\@CajaRGA < \textwidth - \@EscribeTotalesFilasRGA + \ifnum \value{@IVANoGeneral}=1% + \newbox{\@CajaGxET}% + \savebox{\@CajaGxET}{\@EscribeTotalesFilasGxET}% + \ifdim \the\wd\@CajaGxET < \textwidth + \@EscribeTotalesFilasGxET + \else + \hspace*{\@SepTotales}% + \if@BIR\usebox{\@CajaBIAliR}\hspace*{\@SepTotales}\fi + \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}% + \if@BIA\usebox{\@CajaBIAliA}\hspace*{\@SepTotales}\fi \\[\@SeparaFilas]\mbox{}% - \if@centrado\hspace*{\@SepTotales}\else\hfill\fi + \ifcentrado\hspace*{\@SepTotales}\else\hfill\fi \if@Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}% - \if@centrado\hspace*{\@SepTotales}\fi - \else% Aquí casi cualquier cosa tiene aspecto feo. - \CLASSWARNING{Es mejor no usar la opción de totalización en filas en este caso, o disminuir los tamaños de los tipos de letra para la totalización}% - \centering{% - \begin{tabular}{r@{\hspace*{\@SeparaMinTotales}}l} - \usebox{\@CajaBIAliR} & \usebox{\@CajaBIAliA} \\[\@SeparaFilas] - \usebox{\@CajaBIAliG} & \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi - \end{tabular}}% + \ifcentrado\hspace*{\@SepTotales}\fi \fi \fi - \fi - \fi - \par - \if@expandecuadro - \vspace*{-\@EspacioVacioInicial}% - \vspace*{\@EspacioVacioFinal}% - \zsaveposy{EspacioVacioInicial}% - \fi - \vfill - \if@expandecuadro\zsaveposy{EspacioVacioFinal}\fi - \vspace*{\@SeparaVertical}\par - \ifdefvoid{\@NotaExterna}{}{\parbox[t]{\linewidth}{\@LetraNotaExterna\@NotaExterna}\vspace*{\@SeparaVertical}\par}} - - \ifbool{SinCantidad} - % Definamos todos los comandos \Item***. El descuento es opcional; por eso usamos G{0} en \NewDocumentCommand. - {% - \NewDocumentCommand{\Item}{m o m G{0}}{\@ITEM{G}{1}{#1}[#2]{#3}{#4}}% Ítem normal. - \NewDocumentCommand{\ItemR}{m o m G{0}}{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA reducido. - \NewDocumentCommand{\ItemA}{m o m G{0}}{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA adicional. - \NewDocumentCommand{\ItemE}{m o m G{0}}{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{1}{#1}[#2]{#3}{#4}}% Ítem exento de IVA. - \NewDocumentCommand{\ItemX}{m o}{\@ITEM{X}{1}{#1}[#2]{0}{0}}% Ítem sin precio. - \let\ItemG\Item - \if@csv - \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\Moneda)","\@@IVA"}% - \else - \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)","\@@IVA"}% - \fi - \fi} - {% - \NewDocumentCommand{\Item}{m m o m G{0}}{\@ITEM{G}{#1}{#2}[#3]{#4}{#5}}% Ítem normal. - \NewDocumentCommand{\ItemR}{m m o m G{0}}{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA reducido. - \NewDocumentCommand{\ItemA}{m m o m G{0}}{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA adicional. - \NewDocumentCommand{\ItemE}{m m o m G{0}}{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{#1}{#2}[#3]{#4}{#5}}% Ítem exento de IVA. - \NewDocumentCommand{\ItemX}{m m o}{\@ITEM{X}{#1}{#2}[#3]{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)","\@@IVA"}% + \ifnum \value{@IVANoGeneral}=2% + \newbox{\@CajaRGAET}% + \savebox{\@CajaRGAET}{\@EscribeTotalesFilasRGAET}% + \ifdim \the\wd\@CajaRGAET < \textwidth + \@EscribeTotalesFilasRGAET \else - \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \newbox{\@CajaRGA}% + \savebox{\@CajaRGA}{\@EscribeTotalesFilasRGA}% + \ifdim \the\wd\@CajaRGA < \textwidth + \@EscribeTotalesFilasRGA + \\[\@SeparaFilas]\mbox{}% + \ifcentrado\hspace*{\@SepTotales}\else\hfill\fi + \if@Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}% + \ifcentrado\hspace*{\@SepTotales}\fi + \else% Aquí casi cualquier cosa tiene aspecto feo. + \CLASSWARNING{Es mejor no usar la opción de totalización en filas en este caso, o disminuir los tamaños de los tipos de letra para la totalización}% + \centering{% + \begin{tabular}{r@{\hspace*{\@SeparaMinTotales}}l} + \usebox{\@CajaBIAliR} & \usebox{\@CajaBIAliA} \\[\@SeparaFilas] + \usebox{\@CajaBIAliG} & \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi + \end{tabular}}% + \fi \fi \fi - \if@dcu - \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \fi + \par + \ifexpandecuadro + \vspace*{-\@EspacioVacioInicial}% + \vspace*{\@EspacioVacioFinal}% + \zsaveposy{EspacioVacioInicial}% + \fi + \vfill + \ifexpandecuadro\zsaveposy{EspacioVacioFinal}\fi + \vspace*{\@SeparaVertical}\par + \ifdefvoid{\@NotaExterna}{}{\parbox[t]{\linewidth}{\@LetraNotaExterna\@NotaExterna}\vspace*{\@SeparaVertical}\par}} + + \ifbool{SinCantidad} + % Definamos todos los comandos \Item***. El descuento es opcional; por eso usamos G{0} en \NewDocumentCommand. + {% + \NewDocumentCommand{\Item}{m o m G{0}}{\@ITEM{G}{1}{#1}[#2]{#3}{#4}}% Ítem normal. + \NewDocumentCommand{\ItemR}{m o m G{0}}{\global\@BIRtrue\global\Gtrue\@ITEM{R}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA reducido. + \NewDocumentCommand{\ItemA}{m o m G{0}}{\global\@BIAtrue\global\Gtrue\@ITEM{A}{1}{#1}[#2]{#3}{#4}}% Ítem con IVA adicional. + \NewDocumentCommand{\ItemE}{m o m G{0}}{\global\@Exentotrue\global\Gtrue\@ITEM{E}{1}{#1}[#2]{#3}{#4}}% Ítem exento de IVA. + \NewDocumentCommand{\ItemX}{m o}{\@ITEM{X}{1}{#1}[#2]{0}{0}}% Ítem sin precio. + \let\ItemG\Item + \ifcsv + \ifdescuentos + \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\Moneda)","\@@IVA"}% \else - \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)","\@@IVA"}% + \fi + \fi} + {% + \NewDocumentCommand{\Item}{m m o m G{0}}{\@ITEM{G}{#1}{#2}[#3]{#4}{#5}}% Ítem normal. + \NewDocumentCommand{\ItemR}{m m o m G{0}}{\global\@BIRtrue\global\Gtrue\@ITEM{R}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA reducido. + \NewDocumentCommand{\ItemA}{m m o m G{0}}{\global\@BIAtrue\global\Gtrue\@ITEM{A}{#1}{#2}[#3]{#4}{#5}}% Ítem con IVA adicional. + \NewDocumentCommand{\ItemE}{m m o m G{0}}{\global\@Exentotrue\global\Gtrue\@ITEM{E}{#1}{#2}[#3]{#4}{#5}}% Ítem exento de IVA. + \NewDocumentCommand{\ItemX}{m m o}{\@ITEM{X}{#1}{#2}[#3]{0}{0}}% Ítem sin precio. + \let\ItemG\Item + \ifcsv + \if@cdu + \ifdescuentos + \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \else + \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \fi + \fi + \ifdcu + \ifdescuentos + \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \else + \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \fi \fi + \ifduc + \ifdescuentos + \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \else + \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \fi + \fi + \fi} + + \if@factura + % Los descuentos totales no son compatibles -y no creo que lo vayan a ser- con el modo de totalización en filas. + \iffilas + \if@DescuentoTotal + \CLASSWARNING{La opción 'filas' no es compatible con los descuentos totales; sin efecto opción 'filas'} + \filasfalse \fi - \if@duc - \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \fi + \if@reverso + \else + \RenewEnviron{reverso}{} + \fi + \ifcotizacion\def\@Denominacion{\@@DenomCotiza}\else\def\@Denominacion{\@@DenomFactura}\fi% Fijamos la denominación del documento paras las cotizaciones o facturas, que son casos particulares del modo 'factura'. + \expandafter\geometry\expandafter{\@GeometriaFactura}% La geometría debe aplicarse aquí. + \AfterEndPreamble{% + \addtolength{\@PosFechaX}{\oddsidemargin+1in}% Le sumamos el margen izquierdo a las posiciones de las cosas; es importante que se haga en un \AfterEndPreamble antes de que empiecen a escribirse otras cosas en la página. + \addtolength{\@PosDenomX}{\oddsidemargin+1in}% + \addtolength{\@PosControlX}{\oddsidemargin+1in}% + \addtolength{\@PosCondicionesX}{\oddsidemargin+1in}% + \addtolength{\@PosFirmasXuno}{\oddsidemargin+1in}% + \setlength{\parindent}{0pt}% + \setlength{\lineskip}{0pt}% + \setlength{\parskip}{0pt plus 1pt}% + \expandafter\setlength{\@SepTotales}{\the\@SeparaMinTotales plus 1fill}% \@SeparaMinTotales es el mínimo espacio entre los totales en el modo 'filas', y SepTotales es una dimensión interna, estirable, con ese como su mínimo. + \thispagestyle{empty}% + \pagenumbering{roman}% + \@EncabezadoFactura + \@EscribeNotaPrevia} + \AtBeginShipoutNext{% Antes abría aquí un \AtBeginShipoutNext cuando había reporte y un \AtEndDocument cuando no. No es necesario eso. También lo modifiqué en \FirmaFactura. + \@CargaFondoFactura + \@PosicionaFechas + \ifdenom\@PosicionaDenom\fi + \ifprefactura\@PosicionaNumControl\fi + \ifnum\value{@Firmas}=0\else\@PosicionaFirmas\fi + \ifdefvoid{\@Condiciones}{}{\@PosicionaCondiciones}} + \iflinea + % Para determinar las coordenadas de la línea hay que usar \AtBeginShipoutNext porque si no se hace en el 'shipout' de la página se genera un espacio en blanco extra. + \AtBeginShipoutNext{\iflinea\@DibujaLinea\fi} + \iffilas + \ifbool{SinLineasVertInt}{\@LineaCompletatrue} \else - \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@PrecioT \space (\Moneda)","\@@IVA"}% + \@LineaHastaTotaltrue\@LineaDesdeIniciotrue \fi - \fi - \fi} - -\if@factura - % Los descuentos totales no son compatibles -y no creo que lo vayan a ser- con el modo de totalización en filas. - \if@filas - \if@DescuentoTotal - \CLASSWARNING{La opción 'filas' no es compatible con los descuentos totales; sin efecto opción 'filas'} - \@filasfalse \fi - \fi - \if@reverso - \else - \RenewEnviron{reverso}{} - \fi - \if@cotizacion\def\@Denominacion{\@@DenomCotiza}\else\def\@Denominacion{\@@DenomFactura}\fi% Fijamos la denominación del documento paras las cotizaciones o facturas, que son casos particulares del modo 'factura'. - \AtEndPreamble{\expandafter\geometry\expandafter{\@GeometriaFactura}}% La geometría debe aplicarse aquí. - \AtBeginDocument{% - \addtolength{\@PosFechaX}{\oddsidemargin+1in}% Le sumamos el margen izquierdo a las posiciones de las cosas; importante que se haga en un \AtBeginDocument antes de que empiecen a escribirse otras cosas que también se agregan a \AtBeginDocument. - \addtolength{\@PosDenomX}{\oddsidemargin+1in}% - \addtolength{\@PosControlX}{\oddsidemargin+1in}% - \addtolength{\@PosCondicionesX}{\oddsidemargin+1in}% - \addtolength{\@PosFirmasXuno}{\oddsidemargin+1in}% - \setlength{\parindent}{0pt}% - \setlength{\lineskip}{0pt}% - \setlength{\parskip}{0pt plus 1pt}% - \expandafter\setlength{\@SepTotales}{\the\@SeparaMinTotales plus 1fill}% \@SeparaMinTotales es el mínimo espacio entre los totales en el modo 'filas', y SepTotales es una dimensión interna, estirable, con ese como su mínimo. - \thispagestyle{empty}% - \pagenumbering{roman}% - \@EncabezadoFactura - \@EscribeNotaPrevia} - \AtBeginShipoutNext{% Antes abría aquí un \AtBeginShipoutNext cuando había reporte y un \AtEndDocument cuando no. No es necesario eso. También lo modifiqué en \FirmaFactura. - \@CargaFondoFactura - \@PosicionaFechas - \if@denom\@PosicionaDenom\fi - \if@prefactura\@PosicionaNumControl\fi - \if@sinfirmas\else\@PosicionaFirmas\fi - \ifdefvoid{\@Condiciones}{}{\@PosicionaCondiciones}} - \if@linea - \RequirePackage{zref-savepos} - % Para determinar las coordenadas de la línea hay que usar \AtBeginShipoutNext porque si no se hace en el 'shipout' de la página se genera un espacio en blanco extra. - \AtBeginShipoutNext{\if@linea\@DibujaLinea\fi} - \if@filas - \ifbool{SinLineasVertInt}{\@LineaCompletatrue} - \else - \@LineaHastaTotaltrue\@LineaDesdeIniciotrue - \fi - \fi - %% El comando para la descripción del servicio prestado. - \NewDocumentCommand{\Descripcion}{+m}{% - {% Abrimos un grupo adicional para que la redefinición del entorno 'tikzpicture' sea local. - \@LetraDescripcion - % Cuando la línea tiene grosor cero, hacemos que el entorno 'tikzpicture' sea "fake", y redefinimos \node para que obvie los parámetros que le dimos como argumento opcional. - \ifdim\@GrosorLineaDescripcion=0pt% - \setlength{\@SeparaInternaDescripcion}{0pt}\setlength{\@EsquinaLineaDescripcion}{0pt}\setlength{\@SombraDescripcion}{0pt}% - \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}% - \fi - \begin{tikzpicture} - % Expandimos después para poderle pasar el contenido de la macro como argumento opcional a \node. - \expandafter\node\expandafter[\@DescripcionTIKZ]{% - \ifbool{ExpAbajo} - {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion] - {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}% - {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}% - {\setlength{\parindent}{0.5cm}% - \setlength{\parskip}{2pt plus 8pt}% - \ifbool{ExpAbajo}{\vfill}{}% - #1% - \ifbool{ExpAbajo}{\vfill}{}}}% - \ifdim\@GrosorLineaDescripcion=0pt\else ;\fi% El fin del nodo va cuando hay el entorno tikzpicture original. - \end{tikzpicture} - \par\vspace*{\@SombraDescripcion}}}% -\else - \RenewEnviron{factura}{% - \@ZERO - \let\label\label@factura - \let\@ITEM\@CalculaItem - \BODY - \@CalculaTotalesI} - \RenewEnviron{reverso}{} - \NewDocumentCommand{\Descripcion}{+m}{} -\fi - -\if@reporte - \ifdefvoid{\@InfoPagina}{\let\@InfoPagina\@InfoPaginaNoTitulo}{}% - \if@factura + %% El comando para la descripción del servicio prestado. + \NewDocumentCommand{\Descripcion}{+m}{% + {% Abrimos un grupo adicional para que la redefinición del entorno 'tikzpicture' sea local. + \@LetraDescripcion + % Cuando la línea tiene grosor cero, hacemos que el entorno 'tikzpicture' sea "fake", y redefinimos \node para que obvie los parámetros que le dimos como argumento opcional. + \ifdim\@GrosorLineaDescripcion=0pt% + \setlength{\@SeparaInternaDescripcion}{0pt}\setlength{\@EsquinaLineaDescripcion}{0pt}\setlength{\@SombraDescripcion}{0pt}% + \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}% + \fi + \begin{tikzpicture} + % Expandimos después para poderle pasar el contenido de la macro como argumento opcional a \node. + \expandafter\node\expandafter[\@DescripcionTIKZ]{% + \ifbool{ExpAbajo} + {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion] + {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}% + {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}% + {\setlength{\parindent}{0.5cm}% + \setlength{\parskip}{2pt plus 8pt}% + \ifbool{ExpAbajo}{\vfill}{}% + #1% + \ifbool{ExpAbajo}{\vfill}{}}}% + \ifdim\@GrosorLineaDescripcion=0pt\else ;\fi% El fin del nodo va cuando hay el entorno tikzpicture original. + \end{tikzpicture} + \par\vspace*{\@SombraDescripcion}}}% \else - \AtEndPreamble{% - \expandafter\geometry\expandafter{\@GeometriaReporte}}% La geometría del reporte debe aplicarse aquí cuando sólo hay reporte, así se puede establecer el tamaño del papel. + \RenewEnviron{factura}{% + \@ZERO + \let\label\label@factura + \let\@ITEM\@CalculaItem + \BODY + \@CalculaTotalesI} + \RenewEnviron{reverso}{} + \NewDocumentCommand{\Descripcion}{+m}{} \fi - \NewEnviron{reporte}{% + + \if@reporte + \ifdefvoid{\@InfoPagina}{\let\@InfoPagina\@InfoPaginaNoTitulo}{}% \if@factura - \expandafter\newgeometry\expandafter{\@GeometriaReporte}\cleardoublepage% La geometría debe aplicarse aquí cuando también hay factura, pero no se puede cambiar el tamaño del papel. + \else + \expandafter\geometry\expandafter{\@GeometriaReporte}% La geometría del reporte debe aplicarse aquí cuando sólo hay reporte, así se puede establecer el tamaño del papel. \fi - \let\headwidth\textwidth - \@CargaFondoReporte - \@EncabezadoReporte - \ifdefvoid{\@EstiloPagReporteResto}{% - \if@FondoReporteStar% Si no usamos \EstiloPagReporte entonces se fijará 'soloabajo' cuando se use \FondoReporte* para que sólo use marcas de pie de página, y si no se usó \FondoReporte* entonces se fijará 'plain' que usa cabeceras y pies de página. - \pagestyle{soloabajo}% - \else - \pagestyle{plain}% - \fi} - {\pagestyle{\@EstiloPagReporteResto}}% Si usamos \EstiloPagReporte en su argumento obligatorio entonces fijamos ese estilo de página. - \ifdefvoid{\@EstiloPagReporteUno}{% - \if@FondoReporte% Si no le damos a \EstiloPagReporte su argumento opcional, entonces se fijará 'solonumpag' como el estilo de página para la primera página, pero solamente si usamos \FondoReporte, ya que el estilo de página predeterminado al usar \FondoReporte* ya se acaba de fijar y no necesita el caso especial de la primera hoja (\thispagestyle). - \if@FondoReporteStar + \NewEnviron{reporte}{% + \if@factura + \expandafter\newgeometry\expandafter{\@GeometriaReporte}\cleardoublepage% La geometría debe aplicarse aquí cuando también hay factura, pero no se puede cambiar el tamaño del papel. + \fi + \let\headwidth\textwidth + \@CargaFondoReporte + \@EncabezadoReporte + \ifdefvoid{\@EstiloPagReporteResto}{% + \if@FondoReporteStar% Si no usamos \EstiloPagReporte entonces se fijará 'soloabajo' cuando se use \FondoReporte* para que sólo use marcas de pie de página, y si no se usó \FondoReporte* entonces se fijará 'plain' que usa cabeceras y pies de página. + \pagestyle{soloabajo}% \else - \thispagestyle{solonumpag}% - \fi - \fi} - {\thispagestyle{\@EstiloPagReporteUno}}% Si usamoe el argumento opcional de \EstiloPagReporte establecemos ese estilo de página. - \pagenumbering{arabic}% - \setlength{\parindent}{0.666cm}% - \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte. - \vskip\baselineskip - \BODY\clearpage}% espacio antes de empezar con el reporte, después del título -si lo hubiera-. -\else - \NewEnviron{reporte}{} -\fi + \pagestyle{plain}% + \fi} + {\pagestyle{\@EstiloPagReporteResto}}% Si usamos \EstiloPagReporte en su argumento obligatorio entonces fijamos ese estilo de página. + \ifdefvoid{\@EstiloPagReporteUno}{% + \if@FondoReporte% Si no le damos a \EstiloPagReporte su argumento opcional, entonces se fijará 'solonumpag' como el estilo de página para la primera página, pero solamente si usamos \FondoReporte, ya que el estilo de página predeterminado al usar \FondoReporte* ya se acaba de fijar y no necesita el caso especial de la primera hoja (\thispagestyle). + \if@FondoReporteStar + \else + \thispagestyle{solonumpag}% + \fi + \fi} + {\thispagestyle{\@EstiloPagReporteUno}}% Si usamoe el argumento opcional de \EstiloPagReporte establecemos ese estilo de página. + \pagenumbering{arabic}% + \setlength{\parindent}{0.666cm}% + \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte. + \vskip\baselineskip + \BODY\clearpage}% espacio antes de empezar con el reporte, después del título -si lo hubiera-. + \else + \NewEnviron{reporte}{} + \fi} %% Comando para el diseño de la forma libre. \newcommand{\@CargaFondoFactura}{% @@ -1995,7 +2158,7 @@ en la República Bolivariana de Venezuela. \ifdim\@GrosorLineaNotaPrevia=0pt\else ;\fi \end{tikzpicture}% \par\vspace*{\@SombraNotaPrevia}\vspace*{\@SeparaVertical}% - \if@expandecuadro\else\vfill\fi}}} + \ifexpandecuadro\else\vfill\fi}}} %% Comando que coloca la caja para las condiciones, con la posibilidad de TikZ. \newcommand{\@EscribeCondiciones}{% @@ -2040,14 +2203,14 @@ en la República Bolivariana de Venezuela. \setlength{\@LineaNodoXf}{\zposx{LineaNodoBCoordX} sp}% \setlength{\@LineaNodoYf}{\zposy{LineaNodoBCoordY} sp}% \addtolength{\@LineaNodoYo}{\@EspacioVacioInicial-\@EspacioVacioFinal}% - \if@filas + \iffilas \else \if@DescG \addtolength{\@LineaNodoYo}{2\baselineskip}\fi \if@DescR \if@BIR \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi \if@DescA \if@BIA \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi \if@DescE \if@Exento \addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi \addtolength{\@LineaNodoYo}{\baselineskip/2}% - \if@sinivaexpresado + \ifsinivaexpresado \else \addtolength{\@LineaNodoYo}{2\baselineskip}% \if@BIR\addtolength{\@LineaNodoYo}{2\baselineskip}\fi @@ -2055,7 +2218,7 @@ en la República Bolivariana de Venezuela. \if@Exento\addtolength{\@LineaNodoYo}{\baselineskip}\fi \fi \fi - \if@linea + \iflinea \begin{textblock*}{\paperwidth-\@LineaNodoXo}(\@LineaNodoXo,\paperheight-\@LineaNodoYo)% \begin{tikzpicture}% \draw (\@LineaNodoXo,\@LineaNodoYo) -- (\@LineaNodoXf,\@LineaNodoYf);% @@ -2065,7 +2228,7 @@ en la República Bolivariana de Venezuela. %% Escribimos los totales al archivo csv. \newcommand{\@EscribeTotalesEnCSV}{% - \if@csv + \ifcsv \if@Exento \if@DescE \immediate\write\csv{Totales: \@@SubtotalE: \Moneda \SubtE^^JTotales: \@@DescuentoE: \Moneda \DescE}% diff --git a/Master/texmf-dist/tex/latex/factura/factura.def b/Master/texmf-dist/tex/latex/factura/factura.def index 87c237dd224..f594b6396b8 100644 --- a/Master/texmf-dist/tex/latex/factura/factura.def +++ b/Master/texmf-dist/tex/latex/factura/factura.def @@ -36,7 +36,7 @@ %% factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %% \ProvidesFile{factura.def} -[2017/12/11 v3.40 +[2018/03/13 v3.44 Archivo de valores iniciales y condiciones de borde para factura.cls ] @@ -137,8 +137,8 @@ Archivo de valores iniciales y condiciones de borde para factura.cls \def\flechaCR{% \raisebox{-0.4ex}{% \begin{tikzpicture} - \draw[line width=0.075ex] (0,0) arc (20:70:0.75ex) + (0,0) arc (-70:-20:0.75ex) ++ (0.8ex,0.55ex) arc (0:-100:1ex); - \end{tikzpicture}}} + \draw[line width=0.075ex] (0,0) arc (20:70:0.75ex) + (0,0) arc (-70:-20:0.75ex) ++ (0.8ex,0.55ex) arc (0:-100:1ex); + \end{tikzpicture}}} %% Separación entre el inicio de una columna en la tabla y el inicio del texto. \tabcolsep=0.15cm @@ -302,7 +302,7 @@ Archivo de valores iniciales y condiciones de borde para factura.cls %% El diseño de las distintas partes de la hoja. \newcommand{\@EstiloFirmas}{ \@LetraFirmas - \if@unafirma + \ifnum \value{@Firmas}=1 \else \parbox{\@TamLineaFirmas}{ \rule{\@TamLineaFirmas}{\@GrosorLineaFirmas} @@ -311,7 +311,7 @@ Archivo de valores iniciales y condiciones de borde para factura.cls \hfill \parbox{\@TamLineaFirmas}{ \rule{\@TamLineaFirmas}{\@GrosorLineaFirmas} - \centering \ifdefvoid{\@Emisor}{\if@cotizacion \@@Emisor \else \@@Pagado \fi}{\@Emisor}}} + \centering \ifdefvoid{\@Emisor}{\ifcotizacion \@@Emisor \else \@@Pagado \fi}{\@Emisor}}} \newcommand{\@EstiloNotaPrevia}{\@LetraNotaPrevia \@NotaPrevia} @@ -326,7 +326,7 @@ Archivo de valores iniciales y condiciones de borde para factura.cls \newcommand{\@EstiloDenom}{% \@LetraDenom\@Denominacion - \if@sinnumero + \ifsinnumero \else \space\space{\@LetraNumeracion N\textordmasculine\space\@Num}% \fi} @@ -336,7 +336,7 @@ Archivo de valores iniciales y condiciones de borde para factura.cls \setlength{\tabcolsep}{0pt}% \@LetraFecha\begin{tabular}{r@{\extracolsep{1ex}}l@{\extracolsep{0pt}}} \@@Fecha & \ttfamily\@Fecha \\[.3em] - \if@vencimiento \@@FechaVencimiento & \ttfamily\@FechaVencimiento \\ \else \vspace*{-.3em}\fi + \ifvencimiento \@@FechaVencimiento & \ttfamily\@FechaVencimiento \\ \else \vspace*{-.3em}\fi \end{tabular}} \newcommand{\@InfoPaginaNoTitulo}{\@LetraInfoPagina Reporte correspondiente a la factura n\'umero \@Num \space de fecha \@Fecha} |