diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/factura')
-rw-r--r-- | Master/texmf-dist/tex/latex/factura/factura.cls | 1424 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/factura/factura.def | 203 |
2 files changed, 975 insertions, 652 deletions
diff --git a/Master/texmf-dist/tex/latex/factura/factura.cls b/Master/texmf-dist/tex/latex/factura/factura.cls index 950c5ec1a5d..d8bfef76317 100644 --- a/Master/texmf-dist/tex/latex/factura/factura.cls +++ b/Master/texmf-dist/tex/latex/factura/factura.cls @@ -24,44 +24,96 @@ %% %% This work consists of the files README and factura.dtx %% with its derived files factura.ins, factura.cls, factura.def, -%% factura-ejemplo-firma.tex, factura-ejemplo-fondo.tex, -%% factura-ejemplo-membrete.tex, factura-ejemplo-cotizacion.tex, -%% factura-ejemplo-prefactura.tex, factura-ejemplo-factura1.tex -%% factura-ejemplo-factura2.tex, factura-ejemplo-factura3.tex, -%% factura-ejemplo-factura4.tex, factura-ejemplo-factura5.tex, -%% factura-ejemplo-factura6.tex, factura-ejemplo-factura7.tex, -%% factura-ejemplo-factura8.tex, factura-ejemplo-reporte1.tex, -%% factura-ejemplo-reporte2.tex, factura-ejemplo-reporte3.tex, -%% and factura-beispiel-rechnung.tex. +%% factura-ejemplo-aux.tex, factura-ejemplo-firma.tex, +%% factura-ejemplo-fondo.tex, factura-ejemplo-membrete.tex, +%% factura-ejemplo-cotizacion.tex, factura-ejemplo-prefactura.tex, +%% factura-ejemplo-factura01.tex, factura-ejemplo-factura02.tex, +%% factura-ejemplo-factura03.tex, factura-ejemplo-factura04.tex, +%% factura-ejemplo-factura05.tex, factura-ejemplo-factura06.tex, +%% factura-ejemplo-factura07.tex, factura-ejemplo-factura08.tex, +%% factura-ejemplo-factura09.tex, factura-ejemplo-factura10.tex, +%% factura-ejemplo-reporte1.tex, factura-ejemplo-reporte2.tex, +%% factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %% \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{factura} -[2017/07/16 v3.02 +[2017/12/11 v3.40 Clase para elaborar facturas legales en la República Bolivariana de Venezuela. ] +\RequirePackage{etoolbox}% 'etoolbox' para los condicionales binarios y para \AtEndPreamble. + +%% Condicionales auxiliares que sólo pueden ser usados dentro de un grupo. +\newbool{Electro} +\newbool{Descuentos} +\newbool{IVA} +\newbool{Subtotal} +\newbool{SinCantidad} +\newbool{SinLineasVertInt} +\newbool{SinLineasVertExt} +\newbool{SinLineasHoriInt} +\newbool{SinLineasHoriExt} +\newbool{DCU} +\newbool{DUC} +\newbool{NumItem} +\newbool{PrimeroDescripcion} +\newbool{ExpAbajo}\booltrue{ExpAbajo} + +%% Condicionales auxiliares para la posición de los objetos fijos cuando son medidos desde la derecha, o desde abajo. +\newbool{FechaXnegativo} +\newbool{FechaYnegativo} +\newbool{FechaYarriba} +\newbool{CondYnegativo}% no hay CondXnegativo. +\newbool{CondYarriba} +\newbool{DenomXnegativo} +\newbool{DenomYnegativo} +\newbool{DenomYarriba} +\newbool{ControlXnegativo} +\newbool{ControlYnegativo} +\newbool{ControlYarriba} +\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@spanish \@spanishtrue -\newif\if@ivaexpresado \@ivaexpresadotrue +\newif\if@nospanish +\newif\if@sinivaexpresado \newif\if@todosiva -\newif\if@confirmas \@confirmastrue -\newif\if@unafirma \@unafirmafalse -\newif\if@concondiciones \@concondicionestrue +\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@lineacompleta -\newif\if@lineahastatotal -\newif\if@lineadesdeinicio \newif\if@G +\newif\if@csv +\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 +\newif\if@Nombre +\newif\if@PruebaRef +\newif\if@LineaCompleta +\newif\if@LineaHastaTotal +\newif\if@LineaDesdeInicio \newif\if@BIR \newif\if@BIA \newif\if@Exento @@ -73,85 +125,135 @@ en la República Bolivariana de Venezuela. \newif\if@DescRnum \newif\if@DescAnum \newif\if@DescEnum -\newif\if@Descuentos -\newif\if@csv -\newif\if@cdu \@cdutrue -\newif\if@dcu -\newif\if@duc -\newif\if@exparriba -\newif\if@fondofactura -\newif\if@fondoreporte -\newif\if@fondoreportestar -\newif\if@factura \@facturatrue -\newif\if@reporte -\newif\if@nombre -\newif\if@pagado -\newif\if@impdesc -\newif\if@centradesc -\newif\if@sinmarcas -\newif\if@pruebaref +\newif\if@DescuentoTotal + +%% Longitudes para uso interno. +\newlength{\@TamDatos} +\newlength{\@TamResumen} +\newlength{\@TamFinalEncabezado} +\newlength{\@TamLineaFirmas} +\newlength{\@TamNumItem} +\newlength{\@TamCantidad} +\newlength{\@TamPrecioU} +\newlength{\@TamPrecioS} +\newlength{\@TamDescuento} +\newlength{\@TamIVA} +\newlength{\@TamPrecioT} +\newlength{\@GrosorLineaFirmas} +\newlength{\@GrosorLineaEncabezado} +\newlength{\@GrosorLineaNotaPrevia} +\newlength{\@GrosorLineaDescripcion} +\newlength{\@GrosorLineaCondiciones} +\newlength{\@GrosorLineaInfoPag} +\newlength{\@EsquinaLineaEncabezado} +\newlength{\@EsquinaLineaNotaPrevia} +\newlength{\@EsquinaLineaDescripcion} +\newlength{\@EsquinaLineaCondiciones} +\newlength{\@SombraEncabezado} +\newlength{\@SombraNotaPrevia} +\newlength{\@SombraDescripcion} +\newlength{\@SombraCondiciones} +\newlength{\@LineaNodoXo} +\newlength{\@LineaNodoYo} +\newlength{\@LineaNodoXf} +\newlength{\@LineaNodoYf} +\newlength{\@SepTotales} +\newlength{\@PosFechaX} +\newlength{\@PosFechaY} +\newlength{\@PosDenomX} +\newlength{\@PosDenomY} +\newlength{\@PosFirmasXuno} +\newlength{\@PosFirmasXdos} +\newlength{\@PosFirmasY} +\newlength{\@PosCondicionesX} +\newlength{\@PosCondicionesY} +\newlength{\@PosControlX} +\newlength{\@PosControlY} +\newlength{\@EspacioVacioInicial} +\newlength{\@EspacioVacioFinal} +\newlength{\@SeparaItemsExtra} +\newlength{\@SeparaItemsExtraFinal} +\newlength{\@SeparaInternaEncabezado} +\newlength{\@SeparaInternaNotaPrevia} +\newlength{\@SeparaInternaDescripcion} +\newlength{\@SeparaInternaCondiciones} +\newlength{\@SeparaDatosResumen} +\newlength{\@SeparaVertical} +\newlength{\@SeparaMinTotales} +\newlength{\@SeparaFilas} +\newlength{\@SeparaFinLineaDesc} +\newlength{\@SeparaTelefonoEmail} +\newlength{\@InicioReporte} +\newlength{\@FirmaFacturaXcorr} +\newlength{\@FirmaFacturaYcorr} +\newlength{\@FirmaReporteXcorr} +\newlength{\@FirmaReporteYcorr} +\newlength{\@FirmaReporteTextPos} +\newlength{\@FirmaReporteFirmaPos} +\newlength{\@FirmaReporteTamLinea} +\newlength{\@FirmaReportePosX} +\newlength{\@FirmaReporteExcesoLinea} +\newlength{\@TempDimen} -\RequirePackage{etoolbox}% 'etoolbox' para los condicionales binarios. +%% Cajas para uso interno. +\newbox{\@CajaDatos} +\newbox{\@CajaResumen} +\newbox{\@CajaFirmaEmisor} +\newbox{\@CajaFirmas} +\newbox{\@CajaFecha} +\newbox{\@CajaDenom} +\newbox{\@CajaControl} +\newbox{\@CajaCond} +\newbox{\@CajaEspacioVacio} +\newbox{\@CajaPrueba} +\newbox{\@CajaCaracterCR} -\newbool{Descuentos} -\newbool{Subtotal} -\newbool{SinCantidad} -\newbool{SinLineasVertInt} -\newbool{SinLineasVertExt} -\newbool{SinLineasHoriInt} -\newbool{SinLineasHoriExt} -\newbool{DCU} -\newbool{DUC} -\newbool{NumItem} -\newbool{PrimeroDescrip} -\newbool{ExpAbajo}\booltrue{ExpAbajo} +%% Contadores. +\newcounter{@IVANoGeneral}% '0' con sólo IVA G, '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos. +\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 -%% Condicionales auxiliares para la posición de los objetos fijos cuando son medidos desde la derecha, o desde abajo. -\newbool{FechaXnegativo} -\newbool{FechaYnegativo} -\newbool{CondYnegativo}% no hay CondXnegativo. -\newbool{DenomXnegativo} -\newbool{DenomYnegativo} -\newbool{ControlXnegativo} -\newbool{ControlYnegativo} -\newbool{FirmasYnegativo}% no hay FirmasXnegativo; hay X_inicial y X_final para las firmas. +\newcommand{\CLASSERROR}[1]{\ClassError{factura}{** #1. **}{}} +\newcommand{\CLASSWARNING}[1]{\ClassWarning{factura}{** #1. **}{}} +\newcommand{\CLASSINFO}[1]{\ClassInfo{factura}{** #1. **}{}} -\DeclareOption{prefactura}{\@prefacturatrue\@denomtrue\@confirmasfalse}% La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente. +\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}{\@spanishfalse}% No carga babel en castellano ni la codificación T1 de las letras. -\DeclareOption{sinfirmas}{\@confirmasfalse}% No agrega los espacios para firmar. -\DeclareOption{unafirma}{\@unafirmatrue\@confirmastrue}% No agrega el espacio para que firme quien recibe. -\DeclareOption{dosfirmas}{\@unafirmafalse\@confirmastrue}% Pone las dos firmas para firmar. +\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{factura}{La opción 'subtotal' no aplica sin descuentos individuales. Sin efecto opción 'subtotal'}{} + \CLASSWARNING{La opción 'subtotal' no aplica sin descuentos individuales. Sin efecto opción 'subtotal'} \fi} -\DeclareOption{sincondiciones}{\@concondicionesfalse}% No agrega el texto con las condiciones del documento. \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{factura}{La opción 'sintotales' no aplica para el modo de totalización en filas. Sin efecto opción '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{factura}{La opción 'sintotales' no debe usarse en facturas sino en cotizaciones. No es válida una factura sin totales.}{} + \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{factura}{La opción 'centrado' no es compatible con el modo de totalización en columnas. Sin efecto opción 'centrado'.}{} + \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{factura}{La opción 'agrupado' no es compatible con el modo de totalización en filas. Sin efecto opción 'agrupado'.}{} + \CLASSWARNING{La opción 'agrupado' no es compatible con el modo de totalización en filas. Sin efecto opción 'agrupado'} \else \@agrupadotrue \fi} @@ -162,22 +264,30 @@ en la República Bolivariana de Venezuela. \DeclareOption{dcu}{% Descripción, luego cantidad y luego precio unitario. \@dcutrue\@cdufalse\@ducfalse \booltrue{DCU}\boolfalse{DUC} - \booltrue{PrimeroDescrip}} + \booltrue{PrimeroDescripcion}} \DeclareOption{duc}{% Descripción, luego precio unitario y luego cantidad. \if@dcu - \ClassWarning{factura}{Las opciones 'duc' y 'dcu' no son compatibles. Sin efecto ambas opciones}{} - \boolfalse{PrimeroDescrip}\boolfalse{DCU}\@dcufalse\@cdutrue + \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{PrimeroDescrip} + \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. - \@ivaexpresadofalse + \@sinivaexpresadotrue \if@filas - \ClassWarning{factura}{La opción 'sinivaexpresado' no es compatible con la opción 'filas'. Sin efecto la opción '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}} @@ -185,14 +295,13 @@ en la República Bolivariana de Venezuela. \DeclareOption{sincantidad}{% Para no poner el campo de la cantidad. \booltrue{SinCantidad} \if@dcu - \ClassWarning{factura}{La opción 'sincantidad' no es compatible con 'dcu' . Sin efecto opción 'dcu'}{} - \@dcufalse\@cdutrue\boolfalse{DCU}\boolfalse{PrimeroDescrip} + \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{factura}{La opción 'sincantidad' no es compatible con 'duc' . Sin efecto opción 'duc'}{} - \@ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDescrip} + \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}} @@ -202,23 +311,24 @@ en la República Bolivariana de Venezuela. \booltrue{SinLineasHoriExt}\booltrue{SinLineasHoriInt}} \DeclareOption{sinlineashi}{\booltrue{SinLineasHoriInt}}% Estilo 'sinlineashi'. \DeclareOption{sinlineashe}{\booltrue{SinLineasHoriExt}}% Estilo 'sinlineashe'. -\DeclareOption{exparriba}{\@exparribatrue\boolfalse{ExpAbajo}}% Para rellenar con líneas en blanco de manera automática. -\DeclareOption{sinexpandir}{\boolfalse{ExpAbajo}\@exparribafalse}% No expande ninguna de las dos partes de la factura. +\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@exparriba + \if@expandecuadro \@lineatrue \else - \ClassWarning{factura}{La opción 'linea' requiere la opción 'exparriba'. Sin efecto opción 'linea'.}{} + \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}% Para imprimir sólo el 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{factura}{La opción 'csv' require generar la factura. Sin efecto opción 'csv'.}{} + \CLASSWARNING{La opción 'csv' require generar la factura. Sin efecto opción 'csv'} \fi} \ProcessOptions\relax @@ -228,6 +338,7 @@ en la República Bolivariana de Venezuela. \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. \RequirePackage{fp-upn}% Fundamental el paquete 'fp-upn' para todos los cálculos. @@ -237,71 +348,114 @@ en la República Bolivariana de Venezuela. \RequirePackage{tabularx}% Con 'tabularx' hacemos la tabla. \RequirePackage{environ}% Con 'environ' podemos usar tabularx dentro del ambiente de la factura y escribir texto en el enddef. \RequirePackage{fancyhdr}% Las cabeceras fancy; así se use solamente en reporte, hay que cargarlo siempre. +\RequirePackage[calc]{datetime2}% Para calcular la fecha del vencimiento del crédito. -\AtBeginDocument{% Da error si algún campo necesario no está definido. +%% Gracias a Alan Munn y a wipet (Thanks to Alan Munn and wipet). +%% (https://tex.stackexchange.com/questions/396363/input-a-date-to-datetime2-in-a-format-different-than-iso) +\def\DTMsavedatex#1#2{% + \expandafter \ifx \csname f=\DTMinformat\endcsname \relax + \CLASSERROR{\string\DTMsavedatex: formato "\DTMinformat" desconocido}% + \else + \csname f=\DTMinformat\expandafter\endcsname#2&{#1}% + \fi +} +\def\DTMfdef#1{\expandafter\def\csname f=#1\endcsname} +\def\DTMs#1#2{\DTMsavedate{#2}{#1}} +\DTMfdef{yyyy-mm-dd}#1-#2-#3&{\DTMs{#1-#2-#3}} +\DTMfdef{yyyy.mm.dd}#1.#2.#3&{\DTMs{#1-#2-#3}} +\DTMfdef{yyyymmdd}#1#2#3#4#5#6#7#8&{\DTMs{#1#2#3#4-#5#6-#7#8}} +\DTMfdef{dd-mm-yyyy}#1-#2-#3&{\DTMs{#3-#2-#1}} +\DTMfdef{dd.mm.yyyy}#1.#2.#3&{\DTMs{#3-#2-#1}} +\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}} + +%% 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{\@Fecha}{\ClassWarning{factura}{** No se especificó una fecha. Puede dar error si el título del reporte no se especifica que aparezca en las cabeceras **}{}}{}% - \ifdefvoid{\@Num}{\ClassWarning{factura}{** 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{\@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{factura}{** Hay que definir el nombre del proveedor cuando se emite un reporte **}{}}% - {\ClassWarning{factura}{** Se toma el emisor como el proveedor por no haberse especificado este último **}{}% + {\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{factura}{** Hay que definir la razón social **}{}}{}% + \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razón social}}{}% \if@factura - \ifdefvoid{\@RIF}{\ClassError{factura}{** Hay que definir el R.I.F. **}{}}{}% - \ifdefvoid{\@Direccion}{\ClassError{factura}{** Hay que definir la dirección fiscal **}{}}{}% - \ifdefvoid{\@Telefono}{\ClassError{factura}{** Hay que definir un número telefónico **}{}}{}% - \ifdefvoid{\@Email}{\ClassWarning{factura}{** Pudiera definirse una dirección de correo electrónico **}{}}{}% - \ifdefvoid{\@Fecha}{\ClassError{factura}{** Hay que definir la fecha de emisión **}{}}{}% - \if@concondiciones - \ifdefvoid{\@Condiciones}{\ClassError{factura}{** Hay que definir las condiciones del documento o usar la opción 'sincondiciones' **}{}}{}% - \fi + \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{factura}{** En la opción para cotizacion se recomienda agregar el fondo **}{}}{}% + \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para cotizacion se recomienda agregar el fondo}}{}% \fi \if@prefactura - \ifdefvoid{\@FondoFactura}{\ClassWarning{factura}{** En la opción para prefactura se recomienda agregar el fondo **}{}}{}% + \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opción para prefactura se recomienda agregar el fondo}}{}% \fi \if@sinnumero \if@cotizacion \else - \ClassError{factura}{** La opción para no poner el número sólo es compatible con las cotizaciones **}{}% + \CLASSERROR{La opción para no poner el número sólo es compatible con las cotizaciones}% \fi \fi \if@denom \if@sinnumero \else - \ifdefvoid{\@Num}{\ClassError{factura}{** Hay que definir el número de la factura **}{}}{}% + \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el número de la factura}}{}% \fi \fi \fi - \ifdefvoid{\@Contacto}{\if@nombre\else\ClassWarning{factura}{** Pudiera definirse una persona de contacto **}{}\fi}{}% + \ifdefvoid{\@Contacto}{\if@Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}% } %% Escribimos el total como comentario en el .log, y avisamos cuando la fecha no sea la de hoy. \AtEndDocument{% - \edef\@Hoy{\ifnum\number\day<10 0\fi\the\day-\ifnum\number\month<10 0\fi\the\month-\the\year}% - \ifx\undefined\@Fecha + \DTMsavenow{Ahora}% + \DTMsaveddatediff{FechaEmision}{Ahora}{\AuxFecha}% + \ifnum\AuxFecha=0% \else - \edef\@Fecha{\@Fecha}% - \ifx\@Fecha\@Hoy - \else - \ClassWarning{factura}{** Fecha del documento\space \@Fecha\space distinta de la fecha de hoy. **}{}% - \fi + \CLASSWARNING{Fecha del documento \@Fecha\space distinta de la fecha de hoy}% \fi \if@sintotales \else - \if@factura\ClassInfo{factura}{\@@Total: \space\space\space \Moneda \Total}{}\fi + \if@factura\CLASSINFO{\@@Total: \space\space\space \Moneda \Total}\fi \fi} -%% La geometría en formato de factura y de reporte. -%% El margen superior está definido desde el encabezado con los datos del cliente. -%% El margen inferior está definido hasta el final de la descripción (o del cuadro de la factura si no hay descripción). -%% Hay elementos que salen fuera de estos márgenes, como las firmas, las condiciones del documento, la numeración y la fecha. +%% La geometría para la factura, su reverso, y el reporte. +%% Para la factura, el margen superior está definido desde el encabezado con los datos del cliente; +%% el margen inferior está definido hasta el final de la descripción (o del cuadro de la factura si no hay descripción). +%% Hay elementos que salen fuera de estos márgenes, como las firmas, las condiciones del documento, la numeración y la fecha. \def\GeometriaFactura#1{\gdef\@GeometriaFactura{#1}} +\def\GeometriaReverso#1{\gdef\@GeometriaReverso{#1}} \def\GeometriaReporte#1{\gdef\@GeometriaReporte{#1}} %% Se utiliza '\@Impuesto' como el factor del impuesto, el cual viene predefinido en '\@Alicuota'. @@ -319,10 +473,16 @@ en la República Bolivariana de Venezuela. \def\@DescuentoAnum{0} \def\@DescuentoEnum{0} -%% \Fecha, \RazonSocial, \Nombre, \RIF, \CI, \Contacto, \Dirección, \Telefono, \Email, \Emisor, \Proveedor. -\def\Fecha#1{\gdef\@Fecha{#1}} +%% \Fecha, \FormatoFecha, \Credito, \RazonSocial, \Nombre, \RIF, \CI, \Contacto, \Dirección, \Telefono, \Email, \Conforme, \Emisor, \Proveedor. +\NewDocumentCommand{\Fecha}{s m g g}{% + \IfBooleanTF{#1} + {\AtEndPreamble{\DTMsavedate{FechaEmision}{#2-#3-#4}}} + {\AtEndPreamble{\DTMsavedatex{FechaEmision}{#2}}}} +\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\RazonSocial#1{\gdef\@RazonSocial{#1}} -\def\Nombre#1{\gdef\@RazonSocial{#1}\@nombretrue} +\def\Nombre#1{\gdef\@RazonSocial{#1}\@Nombretrue} \def\RIF#1{\gdef\@RIF{#1}} \def\CI#1{\gdef\@RIF{#1}\let\@@RIF\@@CI\let\@CI\@RIF} \def\Contacto#1{\gdef\@Contacto{#1}} @@ -340,23 +500,23 @@ en la República Bolivariana de Venezuela. \gdef\@DescuentoGnum{#2}\gdef\@DescuentoRnum{#2}\gdef\@DescuentoAnum{#2}\gdef\@DescuentoEnum{#2}} {\@DescGnumfalse\@DescRnumfalse\@DescAnumfalse\@DescEnumfalse \gdef\@DescuentoGporc{#2}\gdef\@DescuentoRporc{#2}\gdef\@DescuentoAporc{#2}\gdef\@DescuentoEporc{#2}}% - \@DescGtrue\@DescRtrue\@DescAtrue\@DescEtrue\@Descuentostrue} + \@DescGtrue\@DescRtrue\@DescAtrue\@DescEtrue\@DescuentoTotaltrue} \NewDocumentCommand{\DescuentoG}{s m}{% \IfBooleanTF{#1}{\@DescGnumtrue\gdef\@DescuentoGnum{#2}}{\@DescGnumfalse\gdef\@DescuentoGporc{#2}}% - \@DescGtrue\@Descuentostrue} + \@DescGtrue\@DescuentoTotaltrue} \NewDocumentCommand{\DescuentoR}{s m}{% \IfBooleanTF{#1}{\@DescRnumtrue\gdef\@DescuentoRnum{#2}}{\@DescRnumfalse\gdef\@DescuentoRporc{#2}}% - \@DescRtrue\@Descuentostrue} + \@DescRtrue\@DescuentoTotaltrue} \NewDocumentCommand{\DescuentoA}{s m}{% \IfBooleanTF{#1}{\@DescAnumtrue\gdef\@DescuentoAnum{#2}}{\@DescAnumfalse\gdef\@DescuentoAporc{#2}}% - \@DescAtrue\@Descuentostrue} + \@DescAtrue\@DescuentoTotaltrue} \NewDocumentCommand{\DescuentoE}{s m}{% \IfBooleanTF{#1}{\@DescEnumtrue\gdef\@DescuentoEnum{#2}}{\@DescEnumfalse\gdef\@DescuentoEporc{#2}}% - \@DescEtrue\@Descuentostrue} + \@DescEtrue\@DescuentoTotaltrue} \def\Denom#1{\gdef\@Denominacion{#1}}% La denominación puede ser 'FACTURA', 'COTIZACIÓN' u otra. Se predetermina una de estas dos según las opciones de la clase. @@ -365,7 +525,7 @@ en la República Bolivariana de Venezuela. \def\NumControl#1{\gdef\@NumControl{\nplpadding{\@DigitosNumeracion}\npthousandsep{}\numprint{#1}}}% Si el número de control no se especifica, toma el mismo que el de la factura \def\NumSerieControl#1{\gdef\@NumSerieControl{#1}}% Si el número de serie de control no se especifica, toma '00'. -%% Información de página: cabeceras de páginas o piés de página. +%% Información de página: cabeceras de páginas o pies de página. \def\InfoPagina#1{\gdef\@InfoPagina{#1}} %% Texto que esclarece las condiciones del documento. @@ -374,13 +534,28 @@ en la República Bolivariana de Venezuela. %% Resumen opcional que va a la derecha de los datos del cliente. \NewDocumentCommand{\Resumen}{+m}{\gdef\@Resumen{#1}} +\NewDocumentCommand{\NotaPrevia}{+m}{\gdef\@NotaPrevia{#1}} + +%% Nota interna al cuadro de la factura y nota externa a él (que sale antes de \Descripcion). +\NewDocumentCommand{\NotaInterna}{+m}{% + \ifdefvoid{\@NotaInterna}{}{\CLASSWARNING{Se sobreescribió la nota interna automática aclaratoria del descuento presidencial}}% + \gdef\@NotaInterna{#1}} +\NewDocumentCommand{\NotaExterna}{+m}{\gdef\@NotaExterna{#1}} + \AtBeginDocument{% + % 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}}} + {\DTMsaveddateoffsettojulianday{FechaEmision}{\@Credito}{\AuxFecha}% + \DTMsavejulianday{FechaVencimiento}{\number\AuxFecha}% + \gdef\@FechaVencimiento{\DTMusedate{FechaVencimiento}}}% \ifx\@undefined\@NumControl\let\@NumControl\@Num\fi \ifx\@undefined\@NumSerieControl\gdef\@NumSerieControl{00}\fi % Establecemos los porcentajes de las alícuotas, y redondeamos los descuentos. \FPupn\@AlicuotaGporc{\@AlicuotaG{} 100 * \@DigitosPorc{} round clip}% \FPupn\@AlicuotaRporc{\@AlicuotaR{} 100 * \@DigitosPorc{} round clip}% \FPupn\@AlicuotaAporc{\@AlicuotaA{} 100 * \@DigitosPorc{} round clip}% + \FPset\@AlicuotaEporc{0}% \FPupn\@DescuentoGporc{\@DescuentoGporc{} \@DigitosPorc{} round clip}% \FPupn\@DescuentoRporc{\@DescuentoRporc{} \@DigitosPorc{} round clip}% \FPupn\@DescuentoAporc{\@DescuentoAporc{} \@DigitosPorc{} round clip}% @@ -391,70 +566,104 @@ en la República Bolivariana de Venezuela. \FPupn\@DescuentoEfactor{100 \@DescuentoEporc{} /}} %% Posiciones (X,Y) de los objetos: i) fecha, ii) denominación, iii) condiciones, iv) número de control, v) firmas. -\def\PosFecha#1#2{% - \IfBeginWith{#1}{-} - {\StrBehind{#1}{-}[\templeng]\setlength{\@PosFechaX}{-\templeng}\booltrue{FechaXnegativo}} - {\boolfalse{FechaXnegativo}\setlength{\@PosFechaX}{#1}} +\NewDocumentCommand{\PosFecha}{s m m}{ + \IfBooleanTF{#1}{\booltrue{FechaYarriba}}{\boolfalse{FechaYarriba}} \IfBeginWith{#2}{-} - {\StrBehind{#2}{-}[\templeng]\setlength{\@PosFechaY}{-\templeng}\booltrue{FechaYnegativo}} - {\boolfalse{FechaYnegativo}\setlength{\@PosFechaY}{#2}}} + {\StrBehind{#2}{-}[\templeng]\setlength{\@PosFechaX}{-\templeng}\booltrue{FechaXnegativo}} + {\boolfalse{FechaXnegativo}\setlength{\@PosFechaX}{#2}} + \IfBeginWith{#3}{-} + {\StrBehind{#3}{-}[\templeng]\setlength{\@PosFechaY}{-\templeng}\booltrue{FechaYnegativo}} + {\boolfalse{FechaYnegativo}\setlength{\@PosFechaY}{#3}}} -\def\PosDenom#1#2{% - \IfBeginWith{#1}{-} - {\StrBehind{#1}{-}[\templeng]\setlength{\@PosDenomX}{-\templeng}\booltrue{DenomXnegativo}} - {\boolfalse{DenomXnegativo}\setlength{\@PosDenomX}{#1}} +\NewDocumentCommand{\PosDenom}{s m m}{ + \IfBooleanTF{#1}{\booltrue{DenomYarriba}}{\boolfalse{DenomYarriba}} \IfBeginWith{#2}{-} - {\StrBehind{#2}{-}[\templeng]\setlength{\@PosDenomY}{-\templeng}\booltrue{DenomYnegativo}} - {\boolfalse{DenomYnegativo}\setlength{\@PosDenomY}{#2}}} + {\StrBehind{#2}{-}[\templeng]\setlength{\@PosDenomX}{-\templeng}\booltrue{DenomXnegativo}} + {\boolfalse{DenomXnegativo}\setlength{\@PosDenomX}{#2}} + \IfBeginWith{#3}{-} + {\StrBehind{#3}{-}[\templeng]\setlength{\@PosDenomY}{-\templeng}\booltrue{DenomYnegativo}} + {\boolfalse{DenomYnegativo}\setlength{\@PosDenomY}{#3}}} -\def\PosControl#1#2{% - \IfBeginWith{#1}{-} - {\StrBehind{#1}{-}[\templeng]\setlength{\@PosControlX}{-\templeng}\booltrue{ControlXnegativo}} - {\boolfalse{ControlXnegativo}\setlength{\@PosControlX}{#1}} +\NewDocumentCommand{\PosControl}{s m m}{ + \IfBooleanTF{#1}{\booltrue{ControlYarriba}}{\boolfalse{ControlYarriba}} \IfBeginWith{#2}{-} - {\StrBehind{#2}{-}[\templeng]\setlength{\@PosControlY}{-\templeng}\booltrue{ControlYnegativo}} - {\boolfalse{ControlYnegativo}\setlength{\@PosControlY}{#2}}} + {\StrBehind{#2}{-}[\templeng]\setlength{\@PosControlX}{-\templeng}\booltrue{ControlXnegativo}} + {\boolfalse{ControlXnegativo}\setlength{\@PosControlX}{#2}} + \IfBeginWith{#3}{-} + {\StrBehind{#3}{-}[\templeng]\setlength{\@PosControlY}{-\templeng}\booltrue{ControlYnegativo}} + {\boolfalse{ControlYnegativo}\setlength{\@PosControlY}{#3}}} -\def\PosCond#1#2{% - \setlength{\@PosCondX}{#1}% - \IfBeginWith{#2}{-} - {\StrBehind{#2}{-}[\templeng]\setlength{\@PosCondY}{-\templeng}\booltrue{CondYnegativo}} - {\boolfalse{CondYnegativo}\setlength{\@PosCondY}{#2}}} -%% 'X' no acepta valores negativos en \PosCond. +\NewDocumentCommand{\PosCondiciones}{s m m}{ + \IfBooleanTF{#1}{\booltrue{CondYarriba}}{\boolfalse{CondYarriba}} + \setlength{\@PosCondicionesX}{#2}% + \IfBeginWith{#3}{-} + {\StrBehind{#3}{-}[\templeng]\setlength{\@PosCondicionesY}{-\templeng}\booltrue{CondYnegativo}} + {\boolfalse{CondYnegativo}\setlength{\@PosCondicionesY}{#3}}} +%% 'X' no acepta valores negativos en \PosCondiciones. -\def\PosFirmas#1#2#3{% - \setlength{\@PosFirmasXuno}{#1}% - \setlength{\@PosFirmasXdos}{#2}% +\NewDocumentCommand{\PosFirmas}{m m m}{ + \setlength{\@PosFirmasXuno}{#1} + \setlength{\@PosFirmasXdos}{#2} \IfBeginWith{#3}{-} {\StrBehind{#3}{-}[\templeng]\setlength{\@PosFirmasY}{-\templeng}\booltrue{FirmasYnegativo}} {\boolfalse{FirmasYnegativo}\setlength{\@PosFirmasY}{#3}}} %% La firma se define con un X_inicial, un X_final y un Y_inicial (Xo,Xf,Y) %% Tamaño y grosor de la línea de las firmas. -\def\LineaFirmas#1#2{% - \setlength{\@TamLineaFirmas}{#1}% +\def\LineaFirmas#1#2{ + \setlength{\@TamLineaFirmas}{#1} \setlength{\@GrosorLineaFirmas}{#2}} %% Separación mínima horizontal entre los totales en modo de filas y distancia vertical entre esas líneas, fija. \def\SepFilas#1#2{\setlength{\@SeparaMinTotales}{#1}\setlength{\@SeparaFilas}{#2}} %% Separación vertical entre los elementos de la factura (entre el encabezado y el cuadro de la 'factura', luego desde dicho cuadro hasta la descripción, o hasta los totales en modo de filas). -\def\SepElementos#1{\setlength{\@SeparaElementos}{#1}} +\def\SepVertical#1{\setlength{\@SeparaVertical}{#1}} + +%% Separación horizontal entre la caja de los datos del cliente y la caja del resumen. +\def\SepDatosResumen#1{\setlength{\@SeparaDatosResumen}{#1}} + +%% Separación horizontal interna entre la línea y el texto en los datos del cliente y en el resumen. +\def\SepEncabezado#1{\setlength{\@SeparaInternaEncabezado}{#1}} -%% Separación horizontal entre las cajas del encabezado y separación interna entre la línea y el texto. -\def\SepEncabez#1#2{\setlength{\@SeparaEncabez}{#1}\setlength{\@SeparaInternaEncabez}{#2}} +%% Separación interna entre la línea y el texto de la nota previa. +\def\SepNotaPrevia#1{\setlength{\@SeparaInternaNotaPrevia}{#1}} %% Separación extra entre los elementos en la factura. \def\SepItemsExtra#1{\setlength{\@SeparaItemsExtra}{#1}} %% Separación interna entre la línea y el texto de la descripción. -\def\SepDescrip#1{\setlength{\@SeparaInternaDescrip}{#1}} +\def\SepDescripcion#1{\setlength{\@SeparaInternaDescripcion}{#1}} + +\def\SepCondiciones#1{\setlength{\@SeparaInternaCondiciones}{#1}} %% Grosor de la línea de las cajas del encabezado, curvatura de la esquina y sombra. -\def\LineaEncabez#1#2#3{\setlength{\@GrosorLineaEncabez}{#1}\setlength{\@EsquinaLineaEncabez}{#2}\setlength{\@SombraEncabez}{#3}} +%% (si pedimos linea de 0pt, todo queda en cero y no se abre el ambiente TikZ). +\NewDocumentCommand{\LineaEncabezado}{m g g}{ + \setlength{\@GrosorLineaEncabezado}{#1} + \IfValueT{#2}{\setlength{\@EsquinaLineaEncabezado}{#2}} + \IfValueT{#3}{\setlength{\@SombraEncabezado}{#3}}} + +%% Grosor de la línea de la nota previa, curvatura de la esquina y sombra. +%% (si pedimos linea de 0pt, todo queda en cero y no se abre el ambiente TikZ). +\NewDocumentCommand{\LineaNotaPrevia}{m g g}{ + \setlength{\@GrosorLineaNotaPrevia}{#1} + \IfValueT{#2}{\setlength{\@EsquinaLineaNotaPrevia}{#2}} + \IfValueT{#3}{\setlength{\@SombraNotaPrevia}{#3}}} %% Grosor de la línea de la descripción, curvatura de la esquina y sombra. -\def\LineaDescrip#1#2#3{\setlength{\@GrosorLineaDescrip}{#1}\setlength{\@EsquinaLineaDescrip}{#2}\setlength{\@SombraDescrip}{#3}} +%% (si pedimos linea de 0pt, todo queda en cero y no se abre el ambiente TikZ). +\NewDocumentCommand{\LineaDescripcion}{m g g}{ + \setlength{\@GrosorLineaDescripcion}{#1} + \IfValueT{#2}{\setlength{\@EsquinaLineaDescripcion}{#2}} + \IfValueT{#3}{\setlength{\@SombraDescripcion}{#3}}} + +%% Grosor de la línea de las condiciones, curvatura de la esquina y sombra. +%% (si pedimos linea de 0pt, todo queda en cero y no se abre el ambiente TikZ). +\NewDocumentCommand{\LineaCondiciones}{m g g}{ + \setlength{\@GrosorLineaCondiciones}{#1} + \IfValueT{#2}{\setlength{\@EsquinaLineaCondiciones}{#2}} + \IfValueT{#3}{\setlength{\@SombraCondiciones}{#3}}} %% El espacio vertical que hay que avanzar sólo en la primera página del reporte antes de empezar a escribir sobre él. Usable cuando la primera página tiene un membrete y las demás no, es decir, cuando se usa \FondoReporte y no \FondoReporte*. \def\InicioReporte#1{\setlength{\@InicioReporte}{#1}} @@ -463,8 +672,14 @@ en la República Bolivariana de Venezuela. %% Esta es la letra de la descripción de los items; y el espacio \baselineskip de *toda* la tabla de la factura se fija en este comando únicamente (se predeterminó 18pt). \def\LetraItems#1{\gdef\@LetraItems{#1\selectfont}} +%% Tipo de letra para la nota interna: +\def\LetraNotaInterna#1{\gdef\@LetraNotaInterna{#1\selectfont}} + +%% Tipo de letra para la nota externa: +\def\LetraNotaExterna#1{\gdef\@LetraNotaExterna{#1\selectfont}} + %% Con este comando se cambia la etra del título de la tabla, es decir, los textos 'Cantidad, 'Descripción', etc... -\def\LetraTitCuadro#1{\gdef\@LetraTitCuadro{#1\selectfont}} +\def\LetraTitColumnas#1{\gdef\@LetraTitColumnas{#1\selectfont}} %% Tipo de letra de los títulos de los totales, por ejemplo los textos: 'B.I. G', 'IVA G'. \def\LetraTitTotales#1{\gdef\@LetraTitTotales{#1\selectfont}} @@ -499,6 +714,9 @@ en la República Bolivariana de Venezuela. %% Tipo de letra para el texto bajo las líneas para firmar. \def\LetraFirmas#1{\gdef\@LetraFirmas{#1\selectfont}} +%% Tipo de letra para la nota previa. +\def\LetraNotaPrevia#1{\gdef\@LetraNotaPrevia{#1\selectfont}} + %% Tipo de letra para las condiciones del documento. \def\LetraCondiciones#1{\gdef\@LetraCondiciones{#1\selectfont}} @@ -508,7 +726,7 @@ en la República Bolivariana de Venezuela. %% Letra para la numeración de la factura. \def\LetraNumeracion#1{\gdef\@LetraNumeracion{#1\selectfont}} -%% Letra para la fecha de emisión. +%% Letra para las fechas (emisión y vencimiento). \def\LetraFecha#1{\gdef\@LetraFecha{#1\selectfont}} %% Letra para el título del reporte. @@ -517,6 +735,9 @@ en la República Bolivariana de Venezuela. %% Letra para las cabeceras de las páginas en el modo reporte. \def\LetraInfoPagina#1{\gdef\@LetraInfoPagina{#1\selectfont}} +%% Letra para el reverso de la factura. +\def\LetraReverso#1{\gdef\@LetraReverso{#1\selectfont}} + %% Letra para el reporte. \def\LetraReporte#1{\gdef\@LetraReporte{#1\selectfont}} @@ -527,31 +748,26 @@ en la República Bolivariana de Venezuela. \ifx&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi \ifx&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi \savebox{\@CajaFirmaEmisor}{#1} - \if@reporte - \expandafter\AtBeginShipoutNext - \else - \expandafter\AtEndDocument - \fi - {% + \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{2cm} O{1.5cm}}{% \Firma[imagen][x-corr][y-corr]{texto}[posición en X desde la derecha][tamaño linea] +\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 - \newif\if@firma@dibujo + \newif\if@Firma@Dibujo \newbox{\TextoFirma}% \newbox{\DibujoFirma}% - \ifx&\else\savebox{\DibujoFirma}{#1}\@firma@dibujotrue\fi - \ifx&\else\setlength{\@FirmaReporteXcorr}{#2}\fi - \ifx&\else\setlength{\@FirmaReporteYcorr}{#3}\fi + \ifx&\else\savebox{\DibujoFirma}{#1}\@Firma@Dibujotrue\fi + \setlength{\@FirmaReporteXcorr}{#2}% + \setlength{\@FirmaReporteYcorr}{#3}% \savebox{\TextoFirma}{#4}% - \ifx&\setlength{\@FirmaReporteTextPos}{2cm}\else\setlength{\@FirmaReporteTextPos}{#5}\fi - \ifx&\setlength{\@FirmaReporteTamLinea}{1.5cm}\else\setlength{\@FirmaReporteTamLinea}{#6}\fi + \setlength{\@FirmaReporteTextPos}{#5}% + \setlength{\@FirmaReporteTamLinea}{#6}% \@LetraFirmas - \if@firma@dibujo + \if@Firma@Dibujo \newlength{\@FirmaReporteoddeven}% \setlength{\@FirmaReporteFirmaPos}{\zposy{Firma@zref@PosY}sp}% \fi @@ -565,11 +781,11 @@ en la República Bolivariana de Venezuela. \vspace*{\dp\DibujoFirma}% \hfill \parbox{\@FirmaReporteTamLinea}{% - \if@firma@dibujo\zsaveposy{Firma@zref@PosY}\fi + \if@Firma@Dibujo\zsaveposy{Firma@zref@PosY}\fi \rule{\@FirmaReporteTamLinea}{\@GrosorLineaFirmas}\\ \centering{\usebox{\TextoFirma}}}% \hspace*{\@FirmaReporteTextPos}\par - \if@firma@dibujo + \if@Firma@Dibujo \mbox{}% \par \ifodd\c@page @@ -588,17 +804,17 @@ en la República Bolivariana de Venezuela. \newcommand{\FondoFactura}[1]{ \if@factura \RequirePackage{graphicx} - \@fondofacturatrue + \@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 + \@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. + \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. @@ -609,7 +825,7 @@ en la República Bolivariana de Venezuela. %% El título para el reporte. \NewDocumentCommand{\TituloReporte}{s m}{ \gdef\@TituloReporte{#2}% - \IfBooleanTF{#1}{% Con '*' sale el título en las cabeceras o piés. Sin '*' no. + \IfBooleanTF{#1}{% Con '*' sale el título en las cabeceras o pies. Sin '*' no. \gdef\@InfoPagina{\let\\\relax\@InfoPaginaTitulo}}% {\let\@InfoPagina\@InfoPaginaNoTitulo}} @@ -617,83 +833,7 @@ en la República Bolivariana de Venezuela. \newcommand{\Cliente}[1]{% \IfFileExists{#1.def}{\input{#1.def}}{ \IfFileExists{#1.tex}{\input{#1.tex}}{ - \ClassError{factura}{** No existe #1.def ni #1.tex **}{}}}} - -%% Comando para mostrar macros con '@'. -\newcommand{\mostrar}[1]{\csname #1\endcsname} - -%% Longitudes para uso interno. -\newlength{\@TamDatos} -\newlength{\@TamResumen} -\newlength{\@TamFinalEncabez} -\newlength{\@TamLineaFirmas} -\newlength{\@TamNumItem} -\newlength{\@TamCantidad} -\newlength{\@TamDescrip} -\newlength{\@TamPrecioU} -\newlength{\@TamPrecioS} -\newlength{\@TamDescuento} -\newlength{\@TamPrecioT} -\newlength{\@GrosorLineaFirmas} -\newlength{\@GrosorLineaEncabez} -\newlength{\@GrosorLineaDescrip} -\newlength{\@EsquinaLineaEncabez} -\newlength{\@EsquinaLineaDescrip} -\newlength{\@SombraEncabez} -\newlength{\@SombraDescrip} -\newlength{\@LineaNodoXo} -\newlength{\@LineaNodoYo} -\newlength{\@LineaNodoXf} -\newlength{\@LineaNodoYf} -\newlength{\@SepTotales} -\newlength{\@PosFechaX} -\newlength{\@PosFechaY} -\newlength{\@PosDenomX} -\newlength{\@PosDenomY} -\newlength{\@PosFirmasXuno} -\newlength{\@PosFirmasXdos} -\newlength{\@PosFirmasY} -\newlength{\@PosCondX} -\newlength{\@PosCondY} -\newlength{\@PosControlX} -\newlength{\@PosControlY} -\newlength{\@EspacioVacioInicial} -\newlength{\@EspacioVacioFinal} -\newlength{\@SeparaEncabez} -\newlength{\@SeparaItemsExtra} -\newlength{\@SeparaItemsExtraFinal} -\newlength{\@SeparaInternaEncabez} -\newlength{\@SeparaInternaDescrip} -\newlength{\@SeparaElementos} -\newlength{\@SeparaMinTotales} -\newlength{\@SeparaFilas} -\newlength{\@SeparaFinLineaDesc} -\newlength{\@InicioReporte} -\newlength{\@FirmaFacturaXcorr} -\newlength{\@FirmaFacturaYcorr} -\newlength{\@FirmaReporteXcorr} -\newlength{\@FirmaReporteYcorr} -\newlength{\@FirmaReporteTextPos} -\newlength{\@FirmaReporteFirmaPos} -\newlength{\@FirmaReporteTamLinea} -\newlength{\@TempDimen} - -%% Cajas para uso interno. -\newbox{\@CajaDatos} -\newbox{\@CajaResumen} -\newbox{\@CajaFirmaEmisor} -\newbox{\@CajaFirmas} -\newbox{\@CajaFecha} -\newbox{\@CajaDenom} -\newbox{\@CajaControl} -\newbox{\@CajaCond} -\newbox{\@CajaEspacioVacio} -\newbox{\@CajaPrueba} -\newbox{\@CajaCaracterCR} - -%% Contadores para uso interno para uso interno: -\newcounter{@IVANoGeneral}% '0' con sólo IVA G, '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos. -\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'. + \CLASSERROR{No existe #1.def ni #1.tex}}}} \input{factura.def}% Cargamos los valores predeterminados. @@ -709,23 +849,22 @@ en la República Bolivariana de Venezuela. \immediate\openout\csv=\jobname.csv \fi -\if@spanish +\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@exparriba +\if@expandecuadro \RequirePackage{zref-savepos}[2016/05/21]% Para guardar la posición en 'Y'. \fi \if@reporte - \RequirePackage{eso-pic}% Para el comando \AddToShipoutPicture. \RequirePackage{zref-savepos}% Para la firma, que debe ser cargado aquí porque \FirmaReporte no se ejecuta desde el preámbulo. \fi \if@sinmarcas - \setlength{\@SeparaFinLineaDesc}{0pt} \def\@CaracterCR{\mbox{}} \def\@CaracterCeldasVacias{\mbox{}} \fi @@ -733,14 +872,14 @@ en la República Bolivariana de Venezuela. %% Comando para escribir el encabezado en la factura. \newcommand\@EncabezadoFactura{% \ifdefvoid{\@Resumen}{\@EscribeDatos}{\@EscribeDatosResumen}% - \vspace*{\@SeparaElementos}% - \if@exparriba\else\vfill\fi} + \vspace*{\@SeparaVertical}% + \if@expandecuadro\else\vfill\fi} %% Comando para escribir el encabezado en el reporte. \newcommand\@EncabezadoReporte{% \vspace*{-\topskip}% - \if@fondoreporte - \if@fondoreportestar + \if@FondoReporte + \if@FondoReporteStar \else \vspace*{\@InicioReporte}% \fi @@ -749,49 +888,84 @@ en la República Bolivariana de Venezuela. \@LetraReporte} %% El ambiente 'factura', usando el paquete 'environ' para su definición, y el comando auxiliar \@FacturaAuxCmd. -%% Gracias a Heiko Oberdiek y David Carlisle (Thanks to Heiko Oberdiek and David Carlisle). +%% Gracias a Heiko Oberdiek y a David Carlisle (Thanks to Heiko Oberdiek and David Carlisle). %% http://tex.stackexchange.com/questions/108565/know-the-cell-width-with-tabular-or-include-a-paragraph-box-without-specifying \NewEnviron{factura}{% \expandafter\@FacturaAuxCmd\expandafter{\BODY}% - \ifnum\value{page}=1\else\ClassError{factura}{** La factura ocupa mas que una pagina **}{}\fi -} + \ifnum\value{page}=1\else\CLASSERROR{La factura ocupa mas que una pagina}\fi} + +\NewEnviron{reverso}{% + \if@factura + \expandafter\newgeometry\expandafter{\@GeometriaReverso}% + \topskip1sp% ¡¡No puedo poner 0 porque se genera una página en blanco extra!! + \begin{minipage}[t][\textheight-\pagetotal]{\linewidth}% + \thispagestyle{empty}% + \@LetraReverso\BODY + \end{minipage} + \clearpage + \fi} %% Comando auxiliar para agregar un carácter al final de cada línea en la descripción dentro del cuadro de la factura si ocupa ésta más de una línea. -%% Gracias a Gustavo Mezzetti y David Carlisle (Thanks to Gustavo Mezzetti and David Carlisle) +%% Gracias a Gustavo Mezzetti y a David Carlisle (Thanks to Gustavo Mezzetti and David Carlisle). %% 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]{% - \immediate\write\@auxout{\gdef\noexpand\@TamDescrip{\the\linewidth}}% Para poder establecer la línea diagonal hay que saber el tamaño del campo de la descripción. - \setbox0\hbox{\parbox[t]{\linewidth}{\if@centradesc\centering\arraybackslash\fi#1% - \if@impdesc\hfill\ \@EscribeTipoDeImpuesto{#2}\fi% - \par\global\count1=\prevgraf}}% - \ifnum\count1 = 1 - \if@centradesc\centering\arraybackslash\fi#1% - \if@impdesc\vskip-\baselineskip\hfill\ \@EscribeTipoDeImpuesto{#2}\fi - \else - \parbox[t]{\linewidth-\wd\@CajaCaracterCR-\@SeparaFinLineaDesc}{% + \if@impdesc\settowidth{\@TempDimen}{\@EscribeTipoDeImpuesto{#2}}\fi + \savebox{\@CajaPrueba}{% + \parbox[t]{\linewidth}{% \David@XStart \if@centradesc\centering\arraybackslash\fi #1% \David@XEnd - \par - \count0=\prevgraf - \count2=\prevgraf - \loop - \ifnum\count0=\count2 - \if@impdesc - \vskip-\baselineskip - \mbox{}\hfill\rlap{\hspace*{\wd\@CajaCaracterCR}\hspace*{\@SeparaFinLineaDesc}\llap{\@EscribeTipoDeImpuesto{#2}}}% + \ifdim\@TempDimen=0pt% + \else + \hfill\kern\@SeparaFinLineaDesc\@EscribeTipoDeImpuesto{#2}% + \fi + \par\global\count1=\prevgraf}}% + \if@sinmarcas + \usebox{\@CajaPrueba}% + \else + \ifnum\count1=1% + \usebox{\@CajaPrueba}% + \else + \ifdim\@TempDimen>\wd\@CajaCaracterCR + \else + \setlength{\@TempDimen}{\wd\@CajaCaracterCR}% + \fi + \parbox[t]{\linewidth-\@TempDimen-\@SeparaFinLineaDesc}{% + \David@XStart + \if@centradesc\centering\arraybackslash\fi + #1% + \David@XEnd + \par + \global\count1=\prevgraf% Esto lo necesitamos en otro lado para calcular el espacio extra en los ítems. + \count0=\prevgraf + \count2=\prevgraf + \loop + \ifnum\count0=\count2 + \if@impdesc + \vskip-\baselineskip + \mbox{}\hfill + \rlap{% + \hspace*{\@TempDimen}% + \hspace*{\@SeparaFinLineaDesc}% + \llap{\@EscribeTipoDeImpuesto{#2}}}% + \fi + \else + \mbox{}\hfill + \rlap{% + \hspace*{\@TempDimen}% + \hspace*{\@SeparaFinLineaDesc}% + \hspace*{-\wd\@CajaCaracterCR}% + \usebox{\@CajaCaracterCR}}% \fi - \else - \mbox{}\hfill\rlap{\hspace*{\@SeparaFinLineaDesc}\usebox{\@CajaCaracterCR}}% - \fi - \vskip-2\baselineskip - \advance\count0 -1 - \ifnum\count0 > 0 - \repeat - \kern\count2\baselineskip\mbox{}% - \strut}% + \vskip-2\baselineskip + \advance\count0 -1 + \ifnum\count0 > 0 + \repeat + \kern\count2\baselineskip\mbox{}% + \strut}% + \fi \fi} %% Comandos auxiliares para colocar en \parbox cada celda. @@ -820,6 +994,11 @@ en la República Bolivariana de Venezuela. \ifdim\wd\@CajaPrueba > \@TamDescuento \global\@TamDescuento=\wd\@CajaPrueba\fi \parbox[t]{\@TamDescuento}{#1}} +\newcommand{\@IVAAuxCmd}[1]{% + \savebox{\@CajaPrueba}{#1}% + \ifdim\wd\@CajaPrueba > \@TamIVA \global\@TamIVA=\wd\@CajaPrueba\fi + \parbox[t]{\@TamIVA}{#1}} + \newcommand{\@PrecioTAuxCmd}[1]{% \savebox{\@CajaPrueba}{#1}% \ifdim\wd\@CajaPrueba > \@TamPrecioT \global\@TamPrecioT=\wd\@CajaPrueba\fi @@ -828,11 +1007,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@ivaexpresado\@EscribeTotalColBI{#1}\fi + \if@sinivaexpresado\else\@EscribeTotalColBI{#1}\fi \else \@EscribeTotalColSubt{#1}% \@EscribeTotalColDesc{#1}% - \if@ivaexpresado\@EscribeTotalColBI{#1}\fi + \if@sinivaexpresado\else\@EscribeTotalColBI{#1}\fi \fi} %% Forma agupada para la presentación de totales en modo de columnas. @@ -845,7 +1024,8 @@ 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@ivaexpresado + \if@sinivaexpresado + \else \if@Exento\@EscribeTotalColBI{E}\fi \if@BIR\@EscribeTotalColBI{R}\fi \@EscribeTotalColBI{G}% @@ -853,6 +1033,7 @@ en la República Bolivariana de Venezuela. \if@BIR\@EscribeTotalColAlicuota{R}\fi \@EscribeTotalColAlicuota{G}% \if@BIA\@EscribeTotalColAlicuota{A}\fi + \ifbool{Electro}{\@EscribeTotalColAlicuotaGDesc}{}% \fi} \newcommand{\@EscribeTotalColBI}[1]{% @@ -867,6 +1048,10 @@ en la República Bolivariana de Venezuela. {\@LetraTitTotales \csname @@Alicuota#1\endcsname\ \hfill (\csname @Alicuota#1porc\endcsname\%)} & \@LetraNumTotales\numprint{\csname Alicuota#1\endcsname} \\} +\newcommand{\@EscribeTotalColAlicuotaGDesc}{% + {\@LetraTitTotales \@@AlicuotaGDesc\ \hfill (\@AlicuotaGDescPorc\%)} + & \@LetraNumTotales\numprint{\AlicuotaGDesc} \\} + \newcommand{\@EscribeTotalColSubt}[1]{% {\@LetraTitTotales \csname @@Subtotal#1\endcsname} & \@LetraNumTotales\numprint{\csname Subt#1\endcsname} \\} @@ -992,10 +1177,10 @@ en la República Bolivariana de Venezuela. % Hay que abrir un grupo de ejecución porque el cambio en la tipografía altera la celda. {\if@G \@LetraTipoIVA - \ifx#1G\@DenomAlicuotaG\fi% Si tiene IVA general escribimos 'G'. - \ifx#1E\@DenomAlicuotaE\fi% Si está exento escribimos '(E)'. - \ifx#1R\@DenomAlicuotaR\fi% Si tiene IVA reducido escribimos 'R'. - \ifx#1A\@DenomAlicuotaA\fi% Si tiene IVA adicional escribimos 'A'. + \ifx#1G\@DenomAlicuotaG\fi + \ifx#1R\@DenomAlicuotaR\fi + \ifx#1A\@DenomAlicuotaA\fi + \ifx#1E\@DenomAlicuotaE\fi \fi}} %% Comando para poner en cero los contadores de los totales porque el ambiente de la factura se evalúa tres veces y los totales se sumarían todos tres veces. @@ -1015,6 +1200,7 @@ en la República Bolivariana de Venezuela. \FPset\DescA{0}\global\let\DescA\DescA \FPset\DescX{0}\global\let\DescX\DescX \FPset\AlicuotaG{0}\global\let\AlicuotaG\AlicuotaG + \FPset\AlicuotaGDesc{0}\global\let\AlicuotaGDesc\AlicuotaGDesc \FPset\AlicuotaR{0}\global\let\AlicuotaR\AlicuotaR \FPset\AlicuotaA{0}\global\let\AlicuotaA\AlicuotaA} @@ -1024,7 +1210,18 @@ en la República Bolivariana de Venezuela. \FPifeq\SubtR{0}\else\@CalculaTotalesII{R}\fi \FPifeq\SubtA{0}\else\@CalculaTotalesII{A}\fi \FPifeq\SubtE{0}\else\@CalculaTotalesII{E}\fi - \FPupn\Total{\BIE{} \BIR{} + \BIG{} + \BIA{} + \AlicuotaR{} + \AlicuotaG{} + \AlicuotaA{} + \@DigitosMoneda{} round}% + \ifbool{Electro}{% + \FPiflt\BIG\@AlicuotaGDescLimite + \let\@AlicuotaGDesc\@AlicuotaGDescBajo + \else + \let\@AlicuotaGDesc\@AlicuotaGDescAlto + \fi + \FPupn\@AlicuotaGDescPorc{\@AlicuotaGDesc{} 100 * \@DigitosPorc{} round clip}% + \FPupn\AlicuotaGDesc{\BIG{} \@AlicuotaGDesc{} * \@DigitosMoneda{} round}% + \global\let\AlicuotaGDesc\AlicuotaGDesc + \global\let\@AlicuotaGDescPorc\@AlicuotaGDescPorc + \global\let\@AlicuotaGDesc\@AlicuotaGDesc}{}% + \FPupn\Total{\BIE{} \BIR{} + \BIG{} + \BIA{} + \AlicuotaR{} + \AlicuotaG{} + \AlicuotaA{} + \AlicuotaGDesc{} sub \@DigitosMoneda{} round}% \global\let\Total\Total} \newcommand{\@CalculaTotalesII}[1]{% @@ -1050,7 +1247,7 @@ en la República Bolivariana de Venezuela. % Segunda línea, que sale solamente cuando se usa la opción 'numitem' \ifbool{NumItem}{\ifbool{SinLineasVertInt}{}{|}}{} % Columna 'X' con DCU, columna fantasma con 'sincantidad' y columna 'c' con CDU. - \ifbool{PrimeroDescrip}{X}{ + \ifbool{PrimeroDescripcion}{X}{ \ifbool{SinCantidad}{l@{\extracolsep{0pt}}}{c}} % Tercera línea. \ifbool{SinCantidad}{}{\ifbool{SinLineasVertInt}{}{|}} @@ -1072,9 +1269,13 @@ en la República Bolivariana de Venezuela. \ifbool{Descuentos}{c}{r@{\extracolsep{0pt}}} % Séptima línea, que sale solamente cuando hay descuentos. \ifbool{Descuentos}{\ifbool{SinLineasVertInt}{}{|}}{} + % Columna 'c' para 'iva' y columna 'r' sin espacio si no hay columna de IVA. + \ifbool{IVA}{c}{r@{\extracolsep{0pt}}} + % Octava línea, que sale solamente cuando hay columna de IVA. + \ifbool{IVA}{\ifbool{SinLineasVertInt}{}{|}}{} % Columna 'r' siempre. r - % Octava y última línea. + % Novena y última línea. \ifbool{SinLineasVertExt}{}{|}} %% Comando auxiliar para abrir la tabla del cuadro de la factura y expandir completamente las columnas. @@ -1082,18 +1283,28 @@ en la República Bolivariana de Venezuela. %% 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{7}{\ifbool{SinLineasVertExt}{}{|} r}\begingroup + \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. -\newcommand{\@CalculaItem}[5]{% - \addtocounter{@NumItem}{1}% +\NewDocumentCommand{\@CalculaItem}{m m m o m m}{% + \addtocounter{NumItem}{1}% % Calculamos. - \FPupn\PrecioU{#4 \@DigitosMoneda{} round}% - \ifx\\#5\\\FPset\Dcto{0}\else\FPupn\Dcto{#5 \@DigitosPorc{} round clip}\fi% Fijamos en 0 el descuento si no se especifica. + \FPupn\PrecioU{#5 \@DigitosMoneda{} round}% + \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 + \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}% \global\let\PrecioU\PrecioU @@ -1104,57 +1315,63 @@ en la República Bolivariana de Venezuela. \expandafter\FPupn\csname Subt#1\endcsname{\PrecioT{} \csname Subt#1\endcsname{} + \@DigitosMoneda{} round}% \global\expandafter\let\csname Subt#1\expandafter\endcsname\csname Subt#1\endcsname % Guardamos en macros cada elemento agregado a la factura; por ejemplo: \@Item@i@Cantidad contiene la cantidad que se introdujo para el primer ítem; así mismo con ii@, @iii@, y así mismo también con @Descripcion, @PrecioU, @Descuento y @PrecioT. - \expandafter\gdef\csname @Item@\romannumeral\value{@NumItem}@Cantidad\endcsname{\numprint{#2}}% - \expandafter\gdef\csname @Item@\romannumeral\value{@NumItem}@Descripcion\endcsname{#3}% - \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{@NumItem}@PrecioU\endcsname{\noexpand\numprint{\PrecioU}}% - \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{@NumItem}@PrecioS\endcsname{\noexpand\numprint{\PrecioS}}% - \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{@NumItem}@Descuento\endcsname{\noexpand\numprint{\Dcto}}% - \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{@NumItem}@PrecioT\endcsname{\noexpand\numprint{\PrecioT}}} - + \expandafter\gdef\csname @Item@\romannumeral\value{NumItem}@Cantidad\endcsname{\numprint{#2}}% + \expandafter\gdef\csname @Item@\romannumeral\value{NumItem}@Descripcion\endcsname{#3}% + \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{NumItem}@PrecioU\endcsname{\noexpand\numprint{\PrecioU}}% + \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{NumItem}@PrecioS\endcsname{\noexpand\numprint{\PrecioS}}% + \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{NumItem}@Descuento\endcsname{\noexpand\numprint{\Dcto}}% + \expandafter\global\expandafter\expandafter\edef\csname @Item@\romannumeral\value{NumItem}@IVA\endcsname{% + \noexpand\numprint\expandafter{\csname @Alicuota#1porc\endcsname}}% + \expandafter\global\expandafter\edef\csname @Item@\romannumeral\value{NumItem}@PrecioT\endcsname{\noexpand\numprint{\PrecioT}}} + +%% Macro interna para saber si una etiqueta existe o no. \gdef\@pruebaref#1{% \expandafter\ifx\csname @Etiqueta@#1\endcsname\relax - \ClassWarning{factura}{La etiqueta `#1' no está definida}{}\ignorespaces - \@pruebareffalse + \CLASSWARNING{La etiqueta `#1' no está definida}\ignorespaces + \@PruebaReffalse \else - \@pruebareftrue + \@PruebaReftrue \fi} +%% Comandos para las referencias: i) referencia al número de ítem, ii) a la cantidad, iii) a la descripción, iv) al precio unitario, v) al descuento, vi) al precio total. \gdef\itemref#1{% - \ifbool{NumItem}{}{\ClassWarning{factura}{Es recomendable usar la opción 'numitem' para enumerar los ítems}{}}% - \@pruebaref{#1}\if@pruebaref \csname @Etiqueta@#1\endcsname \fi} -\gdef\cantref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Cantidad\endcsname \fi} -\gdef\descref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descripcion\endcsname \fi} -\gdef\puref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioU\endcsname \fi} -\gdef\subtref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioS\endcsname \fi} -\gdef\dctoref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descuento\endcsname \fi} -\gdef\ptref#1{\@pruebaref{#1}\if@pruebaref \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioT\endcsname \fi} - + \ifbool{NumItem}{}{\CLASSWARNING{Es recomendable usar la opción 'numitem' para enumerar los ítems}}% + \@pruebaref{#1}\if@PruebaRef \csname @Etiqueta@#1\endcsname \fi} +\gdef\cantref#1{\@pruebaref{#1}\if@PruebaRef \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Cantidad\endcsname \fi} +\gdef\descref#1{\@pruebaref{#1}\if@PruebaRef \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descripcion\endcsname \fi} +\gdef\puref#1{\@pruebaref{#1}\if@PruebaRef \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioU\endcsname \fi} +\gdef\subtref#1{\@pruebaref{#1}\if@PruebaRef \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioS\endcsname \fi} +\gdef\dctoref#1{\@pruebaref{#1}\if@PruebaRef \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @Descuento\endcsname \fi} +\gdef\ivaref#1{\@pruebaref{#1}\if@PruebaRef \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @IVA\endcsname \fi} +\gdef\ptref#1{\@pruebaref{#1}\if@PruebaRef \csname @Item@\expandafter\romannumeral\csname @Etiqueta@#1\endcsname @PrecioT\endcsname \fi} + +%% Definimos un comando para la etiqueta, que se define dentro del entorno de la factura para que tenga alcance local; cuando se acaba dicho entorno, el comando \label vuelve a ser lo que está definido en latex.ltx. \newcommand{\label@factura}[1]{% \expandafter\ifx\csname @Etiqueta@#1\endcsname\relax - \expandafter\global\expandafter\edef\csname @Etiqueta@#1\endcsname{\arabic{@NumItem}}\ignorespaces - \ClassInfo{factura}{Etiqueta `#1' definida para el ítem \arabic{@NumItem}}{}% + \expandafter\global\expandafter\edef\csname @Etiqueta@#1\endcsname{\arabic{NumItem}}\ignorespaces + \CLASSINFO{Etiqueta `#1' definida para el ítem \arabic{NumItem}}% \else \edef\@label@test@uno{\csname @Etiqueta@#1\endcsname}% - \edef\@label@test@dos{\the@NumItem}% + \edef\@label@test@dos{\theNumItem}% \ifx\@label@test@uno\@label@test@dos \else - \ClassWarning{factura}{La etiqueta `#1' se definió más de una vez}{}\ignorespaces + \CLASSWARNING{La etiqueta `#1' se definió más de una vez}\ignorespaces \fi \fi} %% Comando auxiliar para la definición del ambiente de la factura; al final de este comando está el texto que va en el enddef del ambiente de la factura. \newcommand{\@FacturaAuxCmd}[1]{% - \if@exparriba + \if@expandecuadro \setlength{\@EspacioVacioInicial}{\zposy{EspacioVacioInicial}sp}% \setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}% - \global\@EspacioVacioInicial=\@EspacioVacioInicial% ¿por qué tendré que globalizarlas? + \global\@EspacioVacioInicial=\@EspacioVacioInicial% Hay que globalizarlas \global\@EspacioVacioFinal=\@EspacioVacioFinal - \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{\@TamDescrip}{% + \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{0pt}{% \if@linea - \if@lineacompleta + \if@LineaCompleta \zsaveposy{LineaNodoBCoordY}% \else - \if@lineahastatotal + \if@LineaHastaTotal \else \zsaveposx{LineaNodoACoordX}\mbox{}\hfill \zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}% \fi @@ -1163,14 +1380,14 @@ en la República Bolivariana de Venezuela. \ifdim \ht\@CajaEspacioVacio=0pt \global\@lineafalse \fi \fi - \ifx\undefined\Total\relax\else\ClassError{factura}{** Parece ya haberse usado un entorno de factura **}{}\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@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 @@ -1189,33 +1406,40 @@ en la República Bolivariana de Venezuela. \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}}}% + \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. - \newcommand{\@ITEM}[5]{% 1. [R|G|A|E|X]; 2. cantidad; 3. descripción; 4. p/u; 5. dcto. - \@CalculaItem{##1}{##2}{##3}{##4}{##5}% + \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% + \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 - \setlength{\@SeparaItemsExtraFinal}{\numexpr\the\count1\normalbaselineskip-\normalbaselineskip+\@SeparaItemsExtra}% + \@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{}}}}{}% + \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{PrimeroDescrip} + \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{PrimeroDescrip}{% + \ifbool{PrimeroDescripcion}{% \if@dcu \David@XRight{\@CantidadAuxCmd{\mbox{}\hfill \@LetraNumeros \numprint{##2}\hfill\mbox{}}}% dcu. \else @@ -1228,7 +1452,7 @@ en la República Bolivariana de Venezuela. {\@DescripcionAuxCmd{##3}{##1}}% cdu. & % Cuarto campo: Acá puede ir el precio unitario (cdu y dcu) o la cantidad (duc). - \FPifeq\PrecioU{##4}\else\ClassWarning{factura}{** Se está introduciendo un precio con más de dos decimales: (##3 - ##4. Redondeado a \PrecioU) **}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales. + \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. @@ -1255,7 +1479,15 @@ en la República Bolivariana de Venezuela. \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 campo: El total. + % 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 @@ -1263,34 +1495,38 @@ en la República Bolivariana de Venezuela. \fi}}% % Escribimos al csv. \if@csv - \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"}% - \else - \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}% - \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"}% - \fi - \fi - \if@duc - \if@descuentos - \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\Dcto","\PrecioT","##1"}% - \else - \immediate\write\csv{"\unexpanded{##3}","\PrecioU","##2","\PrecioT","##1"}% - \fi - \fi}% - \fi}% + \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"}% + \else + \immediate\write\csv{"##2","\unexpanded{##3}","\PrecioU","\PrecioT","##1"}% + \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"}% + \fi + \fi + \if@duc + \if@descuentos + \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 @@ -1299,44 +1535,51 @@ en la República Bolivariana de Venezuela. \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 \@LetraTitCuadro \@@NumItem \hfill\mbox{}}}{}% + \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{PrimeroDescrip}{\@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}}{\@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}}}% + \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{\@LetraTitCuadro \@@Descripcion}{}} - {\if@cdu \@DescripcionAuxCmd{\@LetraTitCuadro \@@Descripcion}{}\fi - \if@dcu \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}\fi - \if@duc \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@PrecioU \space (\Moneda)\hfill\mbox{}}\fi}% + \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 \@LetraTitCuadro \@@Cantidad \hfill\mbox{}}% + \@CantidadAuxCmd{\mbox{}\hfill \@LetraTitColumnas \@@Cantidad \hfill\mbox{}}% \else - \@PrecioUAuxCmd{\mbox{}\hfill \@LetraTitCuadro \@@PrecioU \space (\Moneda)\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 \@LetraTitCuadro \@@PrecioS \space (\Moneda)\hfill\mbox{}}}{}% + \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 \@LetraTitCuadro \@@Descuento \hfill\mbox{}}\fi + \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 \@LetraTitCuadro \ifbool{SinCantidad}{\@@Precio}{\@@PrecioT}\space (\Moneda)\hfill\mbox{}}% - \if@lineacompleta \hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}\fi + \@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. - \\% El último fin de línea se hace aquí. + \@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@exparriba para que no se haga una linea vacía en la tabla cuando la caja está vacía. + % 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 - \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. + \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{PrimeroDescrip}{&\usebox{\@CajaEspacioVacio}&&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&&\\}% + \ifbool{PrimeroDescripcion}{&\usebox{\@CajaEspacioVacio}&&&&&&\\}{&&\usebox{\@CajaEspacioVacio}&&&&&\\}% + \ifdefvoid{\@NotaInterna}{}{\@ColumnasMultiColumnNotaIntAuxCmd}% \ifbool{SinLineasHoriExt}{}{\hline}% Siempre que hay relleno se pone la línea acá. \fi \else @@ -1345,7 +1588,7 @@ en la República Bolivariana de Venezuela. \ifdim \ht\@CajaEspacioVacio=0pt \else % Rellenamos la tabla con espacio espúreo, y le agregamos las lineas externas, si aplica. - \ifbool{SinLineasVertExt}{\multicolumn{7}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{7}{|c|}{\usebox{\@CajaEspacioVacio}}}\\ + \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 @@ -1357,14 +1600,16 @@ en la República Bolivariana de Venezuela. \@EscribeTotalColAgrupado \else \if@Exento \@EscribeTotalCol{E}\fi - \if@BIR\@EscribeTotalCol{R}\if@ivaexpresado\@EscribeTotalColAlicuota{R}\fi\fi - \@EscribeTotalCol{G}\if@ivaexpresado\@EscribeTotalColAlicuota{G}\fi - \if@BIA\@EscribeTotalCol{A}\if@ivaexpresado\@EscribeTotalColAlicuota{A}\fi\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 \fi - \if@ivaexpresado\cline{2-2}\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 @@ -1376,8 +1621,8 @@ en la República Bolivariana de Venezuela. \if@filas \@CalculaTotalesI \@LetraNumTotales - \vspace*{\@SeparaElementos}\par - \if@exparriba\else\vfill\fi + \vspace*{\@SeparaVertical}\par + \if@expandecuadro\else\vfill\fi \@GeneraCajasTotalesFilas \newbox{\@CajaTotal}% \savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total}: \@LetraNumTotal\numprint{\Total}}% @@ -1425,7 +1670,7 @@ en la República Bolivariana de Venezuela. \if@Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}% \if@centrado\hspace*{\@SepTotales}\fi \else% Aquí casi cualquier cosa tiene aspecto feo. - \ClassWarning{factura}{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}{}% + \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] @@ -1436,97 +1681,82 @@ en la República Bolivariana de Venezuela. \fi \fi \par - \if@exparriba + \if@expandecuadro \vspace*{-\@EspacioVacioInicial}% \vspace*{\@EspacioVacioFinal}% \zsaveposy{EspacioVacioInicial}% \fi \vfill - \if@exparriba\zsaveposy{EspacioVacioFinal}\fi - \vspace*{\@SeparaElementos}\par} + \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. {% - \if@descuentos - \NewDocumentCommand{\Item}{m m G{0}}{\@ITEM{G}{1}{#1}{#2}{#3}}% Ítem normal. - \NewDocumentCommand{\ItemR}{m m G{0}}{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{#1}{#2}{#3}}% Ítem con IVA reducido. - \NewDocumentCommand{\ItemA}{m m G{0}}{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{#1}{#2}{#3}}% Ítem con IVA reducido. - \NewDocumentCommand{\ItemE}{m m G{0}}{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{1}{#1}{#2}{#3}}% Ítem con IVA reducido. - \else - \newcommand{\Item}[2]{\@ITEM{G}{1}{#1}{#2}{0}}% Ítem normal. - \newcommand{\ItemR}[2]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{#1}{#2}{0}}% Ítem con IVA reducido. - \newcommand{\ItemA}[2]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{#1}{#2}{0}}% Ítem con IVA reducido. - \newcommand{\ItemE}[2]{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{1}{#1}{#2}{0}}% Ítem con IVA reducido. - \fi - \newcommand{\ItemX}[1]{\@ITEM{X}{1}{#1}{0}{0}}% Ítem sin precio. + \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)"} + \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\Moneda)","\@@IVA"}% \else - \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)"} + \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\Moneda)","\@@IVA"}% \fi \fi} {% - \if@descuentos - \NewDocumentCommand{\Item}{m m m G{0}}{\@ITEM{G}{#1}{#2}{#3}{#4}}% Ítem normal. - \NewDocumentCommand{\ItemR}{m m m G{0}}{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{#1}{#2}{#3}{#4}}% Ítem con IVA reducido. - \NewDocumentCommand{\ItemA}{m m m G{0}}{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{#1}{#2}{#3}{#4}}% Ítem con IVA adicional. - \NewDocumentCommand{\ItemE}{m m m G{0}}{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{#1}{#2}{#3}{#4}}% Ítem exento de IVA. - \else - \newcommand{\Item}[3]{\@ITEM{G}{#1}{#2}{#3}{0}}% Ítem normal. - \newcommand{\ItemR}[3]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{#1}{#2}{#3}{0}}% Ítem con IVA reducido. - \newcommand{\ItemA}[3]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{#1}{#2}{#3}{0}}% Ítem con IVA adicional. - \newcommand{\ItemE}[3]{\global\@Exentotrue\global\@Gtrue\@ITEM{E}{#1}{#2}{#3}{0}}% Ítem exento de IVA. - \fi - \newcommand{\ItemX}[2]{\@ITEM{X}{#1}{#2}{0}{0}}% Ítem sin precio. + \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)"}% + \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)"}% + \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}% \fi \fi \if@dcu \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@Descuento","\@@PrecioT \space (\Moneda)"}% + \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)"}% + \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\Moneda)","\@@PrecioT \space (\Moneda)","\@@IVA"}% \fi \fi \if@duc \if@descuentos - \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\Moneda)"}% + \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)"}% + \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 sé si lo serán- con el modo de totalización en filas. + % 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@Descuentos - \ClassWarning{factura}{La opción 'filas' no es compatible con los descuentos totales; sin efecto opción '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{% La geometría debe aplicarse aquí. - \expandafter\geometry\expandafter{\@GeometriaFactura}} - \AtBeginDocument{% Aquí en la factura hay que cargar el estilo de página del reporte, pero con la factura se aplicará \thispagestyle{empty} luego, aunque quedará \pagestyle aplicado desde ahora. - \if@fondoreportestar - \pagestyle{soloabajo}% Cuando el fondo es con '*' la información de página va sólo abajo. - \else - \pagestyle{plain}% Esto aplica para cuando se define un fondo sin '*' y cuando no se define fondo en el reporte. - \fi + \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{\@PosCondX}{\oddsidemargin+1in}% + \addtolength{\@PosCondicionesX}{\oddsidemargin+1in}% \addtolength{\@PosFirmasXuno}{\oddsidemargin+1in}% \setlength{\parindent}{0pt}% \setlength{\lineskip}{0pt}% @@ -1534,48 +1764,49 @@ en la República Bolivariana de Venezuela. \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} - \if@reporte - \expandafter\AtBeginShipoutNext - \else - \expandafter\AtEndDocument% Para la factura no puede estar lo que viene en un \AtBeginDocument porque se inserta un espacio extra que genera una página extra; tiene que estar en \AtEndDocument. - \fi - {% + \@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 - \@PosicionaFecha + \@PosicionaFechas \if@denom\@PosicionaDenom\fi - \if@confirmas\@PosicionaFirmas\fi - \if@concondiciones\@PosicionaCondiciones\fi - \if@prefactura\@PosicionaNumControl\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. - \RequirePackage{eso-pic}% Para poder usar \AtBeginShipoutNext porque si no se hace en el 'shipout' de la página se genera un espacio en blanco extra. + \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} + \ifbool{SinLineasVertInt}{\@LineaCompletatrue} \else - \@lineahastatotaltrue\@lineadesdeiniciotrue + \@LineaHastaTotaltrue\@LineaDesdeIniciotrue \fi \fi - %% El comando para la descripción del servicio prestado. \NewDocumentCommand{\Descripcion}{+m}{% - \@LetraDescripcion - \begin{tikzpicture} - \node[draw=black, fill=white, inner sep=\@SeparaInternaDescrip, line width=\@GrosorLineaDescrip, rounded corners=\@EsquinaLineaDescrip, - copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraDescrip, shadow yshift=-\@SombraDescrip}]{% - \ifbool{ExpAbajo} - {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescrip-\@GrosorLineaDescrip-\@SombraDescrip] - {\textwidth-2\@SeparaInternaDescrip-\@GrosorLineaDescrip-\@SombraDescrip}}% - {\parbox[t]{\textwidth-\@SombraDescrip-2\@SeparaInternaDescrip-2\@GrosorLineaDescrip}}% - {\setlength{\parindent}{0.5cm}% - \setlength{\parskip}{2pt plus 8pt}% - \ifbool{ExpAbajo}{\vfill}{}% - #1% - \ifbool{ExpAbajo}{\vfill}{}}};% - \end{tikzpicture} - \par\vspace*{\@SombraDescrip}}% + {% 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 @@ -1583,6 +1814,7 @@ en la República Bolivariana de Venezuela. \let\@ITEM\@CalculaItem \BODY \@CalculaTotalesI} + \RenewEnviron{reverso}{} \NewDocumentCommand{\Descripcion}{+m}{} \fi @@ -1601,15 +1833,15 @@ en la República Bolivariana de Venezuela. \@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 piés de página. + \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 + \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 @@ -1626,7 +1858,7 @@ en la República Bolivariana de Venezuela. %% Comando para el diseño de la forma libre. \newcommand{\@CargaFondoFactura}{% - \if@fondofactura + \if@FondoFactura \begin{textblock*}{\paperwidth}(0pt,0pt)% \includegraphics{\@FondoFactura}% \end{textblock*}% @@ -1635,8 +1867,8 @@ en la República Bolivariana de Venezuela. %% Comando para el fondo del reporte. \newcommand{\@CargaFondoReporte}{% \begin{textblock*}{\paperwidth}(0pt,0pt)% Tuve que abrir el textblock* aquí para que aplique siempre; de esta manera se corrige un defecto que se produce cuando se usa \vspace* al inicio de la página (dentro de \@EncabezadoReporte). - \if@fondoreporte - \if@fondoreportestar + \if@FondoReporte + \if@FondoReporteStar \AddToShipoutPictureBG{\includegraphics{\@FondoReporte}}% \else \noindent\includegraphics{\@FondoReporte}% @@ -1648,9 +1880,7 @@ en la República Bolivariana de Venezuela. \newcommand{\@PosicionaFirmas}{% \savebox{\@CajaFirmas}{% \parbox{\textwidth+\oddsidemargin+1in-\@PosFirmasXuno-\@PosFirmasXdos}{\@EstiloFirmas}}% - \ifbool{FirmasYnegativo} - {\addtolength{\@PosFirmasY}{\paperheight-\ht\@CajaFirmas-\dp\@CajaFirmas}} - {}% + \ifbool{FirmasYnegativo}{\addtolength{\@PosFirmasY}{\paperheight-\ht\@CajaFirmas-\dp\@CajaFirmas}}{}% \begin{textblock*}{\wd\@CajaFirmas}(\@PosFirmasXuno,\@PosFirmasY)% \usebox{\@CajaFirmas}% \end{textblock*}} @@ -1658,23 +1888,19 @@ en la República Bolivariana de Venezuela. %% Comando que coloca las condiciones del documento. \newcommand{\@PosicionaCondiciones}{% \savebox{\@CajaCond}{% - \parbox{\textwidth+\oddsidemargin+1in-\@PosCondX}{\@EstiloCondiciones}}% - \ifbool{CondYnegativo} - {\addtolength{\@PosCondY}{\paperheight}}% Aquí la caja abre hacia abajo, por eso no restamos el tamaño de la caja (\ht y \dp). - {}% - \begin{textblock*}{\wd\@CajaCond}(\@PosCondX,\@PosCondY)% + \parbox{\textwidth+\oddsidemargin+1in-\@PosCondicionesX}{\@EscribeCondiciones}}% + \ifbool{CondYnegativo}{\addtolength{\@PosCondicionesY}{\paperheight}}{}% + \ifbool{CondYarriba}{\addtolength{\@PosCondicionesY}{-\ht\@CajaCond-\dp\@CajaCond}}{}% Aquí la caja abre hacia abajo, a menos de que usemos \PosCondiciones* + \begin{textblock*}{\wd\@CajaCond}(\@PosCondicionesX,\@PosCondicionesY)% \usebox{\@CajaCond}% \end{textblock*}} %% Comando que coloca el número de control. \newcommand{\@PosicionaNumControl}{% \savebox{\@CajaControl}{\@EstiloNumControl}% - \ifbool{ControlXnegativo} - {\addtolength{\@PosControlX}{\textwidth-\wd\@CajaControl}} - {}% - \ifbool{ControlYnegativo} - {\addtolength{\@PosControlY}{\paperheight-\ht\@CajaControl-\dp\@CajaControl}} - {}% + \ifbool{ControlXnegativo}{\addtolength{\@PosControlX}{\textwidth-\wd\@CajaControl}}{}% + \ifbool{ControlYnegativo}{\addtolength{\@PosControlY}{\paperheight}}{}% + \ifbool{ControlYarriba}{\addtolength{\@PosControlY}{-\ht\@CajaControl-\dp\@CajaControl}}{}% \begin{textblock*}{\wd\@CajaControl}(\@PosControlX,\@PosControlY)% \usebox{\@CajaControl}% \end{textblock*}} @@ -1682,25 +1908,19 @@ en la República Bolivariana de Venezuela. %% Comando que coloca la denominación del documento. \newcommand{\@PosicionaDenom}{% \savebox{\@CajaDenom}{\@EstiloDenom}% - \ifbool{DenomXnegativo} - {\addtolength{\@PosDenomX}{\textwidth-\wd\@CajaDenom}} - {}% - \ifbool{DenomYnegativo} - {\addtolength{\@PosDenomY}{\paperheight-\ht\@CajaDenom-\dp\@CajaDenom}} - {}% + \ifbool{DenomXnegativo}{\addtolength{\@PosDenomX}{\textwidth-\wd\@CajaDenom}}{}% + \ifbool{DenomYnegativo}{\addtolength{\@PosDenomY}{\paperheight}}{}% + \ifbool{DenomYarriba}{\addtolength{\@PosDenomY}{-\ht\@CajaDenom-\dp\@CajaDenom}}{}% \begin{textblock*}{\wd\@CajaDenom}(\@PosDenomX,\@PosDenomY)% \usebox{\@CajaDenom}% \end{textblock*}} -%% Comando que coloca la fecha. -\newcommand{\@PosicionaFecha}{% - \savebox{\@CajaFecha}{\@EstiloFecha}% - \ifbool{FechaXnegativo} - {\addtolength{\@PosFechaX}{\textwidth-\wd\@CajaFecha}} - {}% - \ifbool{FechaYnegativo} - {\addtolength{\@PosFechaY}{\paperheight-\ht\@CajaFecha-\dp\@CajaFecha}} - {}% +%% Comando que coloca la(s) fecha(s). +\newcommand{\@PosicionaFechas}{% + \savebox{\@CajaFecha}{\@EstiloFechas}% + \ifbool{FechaXnegativo}{\addtolength{\@PosFechaX}{\textwidth-\wd\@CajaFecha}}{}% + \ifbool{FechaYnegativo}{\addtolength{\@PosFechaY}{\paperheight}}{}% + \ifbool{FechaYarriba}{\addtolength{\@PosFechaY}{-\ht\@CajaFecha-\dp\@CajaFecha}}{}% \begin{textblock*}{\wd\@CajaFecha}(\@PosFechaX,\@PosFechaY)% \usebox{\@CajaFecha}% \end{textblock*}} @@ -1714,72 +1934,103 @@ en la República Bolivariana de Venezuela. \ifdefvoid{\@Contacto}{}{{\bfseries \@@Contacto} \@Contacto \par}% \ifdefvoid{\@TituloReporte}{}{\vspace*{\baselineskip}{\@LetraTitReporte \centering \@TituloReporte \par}}}} -%% Comando que coloca la caja con los datos del cliente. +%% Comando que coloca las dos cajas del encabezado: la de los datos del cliente y la del resumen. \newcommand{\@EscribeDatos}{% - {\@LetraEncFactura% Abrimos un nuevo grupo para que el cambio de tipografía sea sólo local. - \begin{tikzpicture} - \node[draw=black, fill=white, inner sep=\@SeparaInternaEncabez, line width=\@GrosorLineaEncabez, rounded corners=\@EsquinaLineaEncabez, - copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraEncabez, shadow yshift=-\@SombraEncabez}]{% - \parbox{\textwidth-\@SombraEncabez-2\@SeparaInternaEncabez-\@GrosorLineaEncabez}{% - \hfill {\@LetraTitEnc \@@Datos} \hfill \mbox{}\par - {\bfseries \@@RazonSocial} \@RazonSocial - \dotfill - {\bfseries \@@RIF} {\ttfamily \@RIF}% - \par - \ifdefvoid{\@Contacto}{}{{\bfseries \@@Contacto} \@Contacto \par}% - {\bfseries \@@Direccion} \@Direccion - \par - {\bfseries \@@Telefono} {\ttfamily \@Telefono}% - \ifdefvoid{\@Email}{}{\hspace*{0.666em}\@CaracterSeparaTelefonoEmail\hspace*{0.666em}{\bfseries \@@Email} {\ttfamily \@Email}}}};% + {\@LetraEncFactura% Abrimos un nuevo grupo para que el cambio de tipografía y la redefinición del entorno 'tikzpicture' sean locales. + \ifdim\@GrosorLineaEncabezado=0pt% + \setlength{\@SeparaInternaEncabezado}{0pt}\setlength{\@EsquinaLineaEncabezado}{0pt}\setlength{\@SombraEncabezado}{0pt}% + \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}% + \fi + \begin{tikzpicture}% + \expandafter\node\expandafter[\@DatosTIKZ]{% + \parbox{\textwidth-\@SombraEncabezado-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado}{\@DatosAux}}% + \ifdim\@GrosorLineaEncabezado=0pt\else ;\fi \end{tikzpicture}% - \par\vspace*{\@SombraEncabez}}}% Para que textblock* esté en modo vertical. + \par\vspace*{\@SombraEncabezado}}}% Para que textblock* esté en modo vertical. -%% Comandos auxiliares para los datos y el resumen. -\newcommand{\@DatosAux}{% - \vfill - \hfill {\@LetraTitEnc \@@Datos}\hfill \mbox{}\par - {\bfseries \@@RazonSocial} \@RazonSocial \par - {\bfseries \@@RIF} {\ttfamily \@RIF} \par - \ifdefvoid{\@Contacto}{}{{\bfseries \@@Contacto} \@Contacto \par}% - {\bfseries \@@Direccion} \@Direccion \par - {\bfseries \@@Telefono} {\ttfamily \@Telefono} \hfill \par - \ifdefvoid{\@Email}{}{{\bfseries \@@Email} {\ttfamily \@Email}}% - \vfill} - -\newcommand{\@ResumenAux}{% - \hfill {\@LetraTitEnc \@@Resumen}\hfill \mbox{}% - \vfill\@Resumen\vfill} - -%% Comando que coloca las dos cajas del encabezado: la de los datos del cliente y la del resumen. \newcommand{\@EscribeDatosResumen}{% - {\@LetraEncFactura% Abrimos un nuevo grupo para que el cambio de tipografía sea sólo local. + {\@LetraEncFactura% Abrimos un nuevo grupo para que el cambio de tipografía y la redefinición del entorno 'tikzpicture' sean locales. + \ifdim\@GrosorLineaEncabezado=0pt% + \setlength{\@SeparaInternaEncabezado}{0pt}\setlength{\@EsquinaLineaEncabezado}{0pt}\setlength{\@SombraEncabezado}{0pt}% + \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}% + \fi \savebox{\@CajaDatos}{% - \parbox[t]{\textwidth/2-\@SeparaEncabez/2-2\@SeparaInternaEncabez-\@GrosorLineaEncabez-\@SombraEncabez}{% - \@DatosAux}}% + \parbox[t]{\textwidth/2-\@SeparaDatosResumen/2-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado-\@SombraEncabezado}{\@DatosAux*}}% \savebox{\@CajaResumen}{% - \parbox[t]{\textwidth/2-\@SeparaEncabez/2-2\@SeparaInternaEncabez-\@GrosorLineaEncabez-\@SombraEncabez}{% - \@ResumenAux}}% + \parbox[t]{\textwidth/2-\@SeparaDatosResumen/2-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado-\@SombraEncabezado}{\@ResumenAux}}% \setlength{\@TamDatos}{\ht\@CajaDatos+\dp\@CajaDatos}% \setlength{\@TamResumen}{\ht\@CajaResumen+\dp\@CajaResumen}% \ifdim\@TamDatos>\@TamResumen - \setlength{\@TamFinalEncabez}{\@TamDatos}% + \setlength{\@TamFinalEncabezado}{\@TamDatos}% \else - \setlength{\@TamFinalEncabez}{\@TamResumen}% + \setlength{\@TamFinalEncabezadoado}{\@TamResumen}% \fi - \begin{tikzpicture} - \node[draw=black, fill=white, inner sep=\@SeparaInternaEncabez, line width=\@GrosorLineaEncabez, rounded corners=\@EsquinaLineaEncabez, - copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraEncabez, shadow yshift=-\@SombraEncabez}]{% - \parbox[t][\@TamFinalEncabez]{\textwidth/2-\@SeparaEncabez/2-2\@SeparaInternaEncabez-\@GrosorLineaEncabez-\@SombraEncabez}{% - \@DatosAux}};% + \begin{tikzpicture}% + \expandafter\node\expandafter[\@DatosTIKZ]{% + \parbox[t][\@TamFinalEncabezado]{\textwidth/2-\@SeparaDatosResumen/2-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado-\@SombraEncabezado}{% + \@DatosAux*}}% + \ifdim\@GrosorLineaEncabezado=0pt\else ;\fi + \end{tikzpicture}% + \hspace*{\@SeparaDatosResumen}\hspace*{\@SombraEncabezado}% + \begin{tikzpicture}% + \expandafter\node\expandafter[\@ResumenTIKZ]{% + \parbox[t][\@TamFinalEncabezado]{\textwidth/2-\@SeparaDatosResumen/2-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado-\@SombraEncabezado}{% + \@ResumenAux}}% + \ifdim\@GrosorLineaEncabezado=0pt\else ;\fi \end{tikzpicture}% - \hspace*{\@SeparaEncabez}\hspace*{\@SombraEncabez}% - \begin{tikzpicture} - \node[draw=black, fill=white, inner sep=\@SeparaInternaEncabez, line width=\@GrosorLineaEncabez, rounded corners=\@EsquinaLineaEncabez, - copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraEncabez, shadow yshift=-\@SombraEncabez}]{% - \parbox[t][\@TamFinalEncabez]{\textwidth/2-\@SeparaEncabez/2-2\@SeparaInternaEncabez-\@GrosorLineaEncabez-\@SombraEncabez}{% - \@ResumenAux}};% + \par\vspace*{\@SombraEncabezado}}}% El \par es para que textblock* esté en modo vertical. + +%% Comando que coloca la caja para la nota previa, con la posibilidad de TikZ. +\newcommand{\@EscribeNotaPrevia}{% + {% Abrimos un nuevo grupo para que la redefinición del entorno 'tikzpicture' sea local. + \baselineskip0pt + \ifdefvoid{\@NotaPrevia}{}{% + \ifdim\@GrosorLineaNotaPrevia=0pt% + \setlength{\@SeparaInternaNotaPrevia}{0pt}\setlength{\@EsquinaLineaNotaPrevia}{0pt}\setlength{\@SombraNotaPrevia}{0pt}% + \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}% + \fi + \begin{tikzpicture}% + \expandafter\node\expandafter[\@NotaPreviaTIKZ]{% + \parbox{\textwidth-\@SombraNotaPrevia-2\@SeparaInternaNotaPrevia-\@GrosorLineaNotaPrevia}{\@EstiloNotaPrevia}}% + \ifdim\@GrosorLineaNotaPrevia=0pt\else ;\fi + \end{tikzpicture}% + \par\vspace*{\@SombraNotaPrevia}\vspace*{\@SeparaVertical}% + \if@expandecuadro\else\vfill\fi}}} + +%% Comando que coloca la caja para las condiciones, con la posibilidad de TikZ. +\newcommand{\@EscribeCondiciones}{% + {% Abrimos un nuevo grupo para que la redefinición del entorno 'tikzpicture' sea local. + \ifdim\@GrosorLineaCondiciones=0pt% + \setlength{\@SeparaInternaCondiciones}{0pt}\setlength{\@EsquinaLineaCondiciones}{0pt}\setlength{\@SombraCondiciones}{0pt}% + \renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}% + \fi + \begin{tikzpicture}% + \expandafter\node\expandafter[\@CondicionesTIKZ]{% + \parbox{\textwidth-\@SombraCondiciones-2\@SeparaInternaCondiciones-\@GrosorLineaCondiciones}{\@EstiloCondiciones}}% + \ifdim\@GrosorLineaCondiciones=0pt\else ;\fi \end{tikzpicture}% - \par\vspace*{\@SombraEncabez}}}% El \par es para que textblock* esté en modo vertical. + \par\vspace*{\@SombraCondiciones}}} + +%% Comandos auxiliares para los datos y el resumen. +%% En el caso de los datos, la versión \@DatosAux se ejecuta cuando no hay resumen, y la versión \@DatosAux* se ejecuta cuando hay resumen. +\NewDocumentCommand{\@DatosAux}{s}{% + \hfill {\@LetraTitEnc \@@Datos}\hfill \mbox{}\par + \IfBooleanT{#1}{\vfill}% + {\bfseries \if@Nombre \@@Nombre \else \@@RazonSocial \fi} \@RazonSocial + \IfBooleanTF{#1}{\par}{\dotfill}% + {\bfseries \@@RIF} {\ttfamily \@RIF}\par + \ifdefvoid{\@Contacto}{}{{\bfseries \@@Contacto} \@Contacto \par}% + {\bfseries \@@Direccion} \@Direccion \par + \ifdefvoid{\@Telefono}{}{{\bfseries \@@Telefono} {\ttfamily \@Telefono}}% + \ifdefvoid{\@Email} + {\par} + {\IfBooleanTF{#1} + {\par} + {\ifdefvoid{\@Telefono}{}{\hspace*{\@SeparaTelefonoEmail}\@CaracterSeparaTelefonoEmail\hspace*{\@SeparaTelefonoEmail}}}% + {\bfseries \@@Email} {\ttfamily \@Email}}% + \IfBooleanT{#1}{\vfill}} + +\newcommand{\@ResumenAux}{\hfill {\@LetraTitEnc \@@Resumen}\hfill \mbox{}\vfill\@Resumen\vfill} %% Comando que coloca la línea diagonal. \newcommand{\@DibujaLinea}{% @@ -1796,7 +2047,8 @@ en la República Bolivariana de Venezuela. \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@ivaexpresado + \if@sinivaexpresado + \else \addtolength{\@LineaNodoYo}{2\baselineskip}% \if@BIR\addtolength{\@LineaNodoYo}{2\baselineskip}\fi \if@BIA\addtolength{\@LineaNodoYo}{2\baselineskip}\fi @@ -1816,32 +2068,26 @@ en la República Bolivariana de Venezuela. \if@csv \if@Exento \if@DescE - \immediate\write\csv{Totales: \@@SubtotalE: \Moneda \SubtE}% - \immediate\write\csv{Totales: \@@DescuentoE: \Moneda \DescE}% + \immediate\write\csv{Totales: \@@SubtotalE: \Moneda \SubtE^^JTotales: \@@DescuentoE: \Moneda \DescE}% \fi \immediate\write\csv{Totales: \@@BIE: \Moneda \BIE}% \fi \if@BIR \if@DescE - \immediate\write\csv{Totales: \@@SubtotalR: \Moneda \SubtR}% - \immediate\write\csv{Totales: \@@DescuentoR: \Moneda \DescR}% + \immediate\write\csv{Totales: \@@SubtotalR: \Moneda \SubtR^^JTotales: \@@DescuentoR: \Moneda \DescR}% \fi - \immediate\write\csv{Totales: \@@BIR: \Moneda \BIR}% - \immediate\write\csv{Totales: \@@AlicuotaR: \Moneda \AlicuotaR}% + \immediate\write\csv{Totales: \@@BIR: \Moneda \BIR^^JTotales: \@@AlicuotaR: \Moneda \AlicuotaR}% \fi \if@DescG - \immediate\write\csv{Totales: \@@SubtotalG: \Moneda \SubtG}% - \immediate\write\csv{Totales: \@@DescuentoG: \Moneda \DescG}% + \immediate\write\csv{Totales: \@@SubtotalG: \Moneda \SubtG^^JTotales: \@@DescuentoG: \Moneda \DescG}% \fi - \immediate\write\csv{Totales: \@@BIG: \Moneda \BIG}% - \immediate\write\csv{Totales: \@@AlicuotaG: \Moneda \AlicuotaG}% + \immediate\write\csv{Totales: \@@BIG: \Moneda \BIG^^JTotales: \@@AlicuotaG: \Moneda \AlicuotaG}% + \FPifeq\AlicuotaGDesc{0}\else\immediate\write\csv{Totales: \@@AlicuotaGDesc: \Moneda \AlicuotaGDesc}\fi \if@BIA \if@DescA - \immediate\write\csv{Totales: \@@SubtotalA: \Moneda \SubtA}% - \immediate\write\csv{Totales: \@@DescuentoA: \Moneda \DescA}% + \immediate\write\csv{Totales: \@@SubtotalA: \Moneda \SubtA^^JTotales: \@@DescuentoA: \Moneda \DescA}% \fi - \immediate\write\csv{Totales: \@@BIA: \Moneda \BIA}% - \immediate\write\csv{Totales: \@@AlicuotaA: \Moneda \AlicuotaA}% + \immediate\write\csv{Totales: \@@BIA: \Moneda \BIA^^JTotales: \@@AlicuotaA: \Moneda \AlicuotaA}% \fi \immediate\write\csv{Totales: \@@Total: \Moneda \Total}% \immediate\closeout\csv diff --git a/Master/texmf-dist/tex/latex/factura/factura.def b/Master/texmf-dist/tex/latex/factura/factura.def index 6950af34021..87c237dd224 100644 --- a/Master/texmf-dist/tex/latex/factura/factura.def +++ b/Master/texmf-dist/tex/latex/factura/factura.def @@ -24,39 +24,47 @@ %% %% This work consists of the files README and factura.dtx %% with its derived files factura.ins, factura.cls, factura.def, -%% factura-ejemplo-firma.tex, factura-ejemplo-fondo.tex, -%% factura-ejemplo-membrete.tex, factura-ejemplo-cotizacion.tex, -%% factura-ejemplo-prefactura.tex, factura-ejemplo-factura1.tex -%% factura-ejemplo-factura2.tex, factura-ejemplo-factura3.tex, -%% factura-ejemplo-factura4.tex, factura-ejemplo-factura5.tex, -%% factura-ejemplo-factura6.tex, factura-ejemplo-factura7.tex, -%% factura-ejemplo-factura8.tex, factura-ejemplo-reporte1.tex, -%% factura-ejemplo-reporte2.tex, factura-ejemplo-reporte3.tex, -%% and factura-beispiel-rechnung.tex. +%% factura-ejemplo-aux.tex, factura-ejemplo-firma.tex, +%% factura-ejemplo-fondo.tex, factura-ejemplo-membrete.tex, +%% factura-ejemplo-cotizacion.tex, factura-ejemplo-prefactura.tex, +%% factura-ejemplo-factura01.tex, factura-ejemplo-factura02.tex, +%% factura-ejemplo-factura03.tex, factura-ejemplo-factura04.tex, +%% factura-ejemplo-factura05.tex, factura-ejemplo-factura06.tex, +%% factura-ejemplo-factura07.tex, factura-ejemplo-factura08.tex, +%% factura-ejemplo-factura09.tex, factura-ejemplo-factura10.tex, +%% factura-ejemplo-reporte1.tex, factura-ejemplo-reporte2.tex, +%% factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex. %% \ProvidesFile{factura.def} -[2017/07/16 v3.02 -Archivo valores iniciales y condiciones de borde para factura.cls +[2017/12/11 v3.40 +Archivo de valores iniciales y condiciones de borde para factura.cls ] -%% La geometría en formato de factura y de reporte. -%% El margen superior está definido desde el encabezado con los datos del cliente. -%% El margen inferior está definido hasta el final de la descripción (o del cuadro de la factura si no hay descripción). -%% Hay elementos que salen fuera de estos márgenes, como las firmas, las condiciones del documento, la numeración y la fecha. -\GeometriaFactura{letterpaper,vmargin={5cm,5.5cm}, hmargin={1cm,1cm},footskip=0pt, headsep=0pt, headheight=0pt} +%% La geometría para la factura, su reverso, y el reporte. +%% Para la factura, el margen superior está definido desde el encabezado con los datos del cliente; +%% el margen inferior está definido hasta el final de la descripción (o del cuadro de la factura si no hay descripción). +%% Hay elementos que salen fuera de estos márgenes, como las firmas, las condiciones del documento, la numeración y la fecha. +\GeometriaFactura{letterpaper,vmargin={5.2cm,5.5cm},hmargin={1cm,1cm},footskip=0pt, headsep=0pt, headheight=0pt} +\GeometriaReverso{letterpaper,vmargin={1cm,1cm}, hmargin={1cm,1cm},footskip=0cm, headsep=0pt, headheight=0pt} \GeometriaReporte{letterpaper,vmargin={2.8cm,2.5cm},hmargin={3cm,2cm},footskip=1.2cm,headsep=0.777cm,headheight=1.5cm} -%% Porcentajes de los distintos IVA (general, reducido y adicional): +%% Factores para los distintos IVA y el límite para el descuento: \def\@AlicuotaG{0.12} +\def\@AlicuotaGDescBajo{0.03} +\def\@AlicuotaGDescAlto{0.05} +\def\@AlicuotaGDescLimite{2000000} \def\@AlicuotaR{0.08} -\def\@AlicuotaA{0.22} +\def\@AlicuotaA{0.27} -%% i) separador de miles, ii) separador decimal, iii) número de decimales para la moneda iv) y para los porcentajes, v) número de dígitos de la numeración de la factura: +%% i) separador de miles, ii) separador decimal, iii) número de decimales para la moneda iv) y para los porcentajes, v) número de dígitos de la numeración de la factura, vi) formato de la fecha, vii) separadores para la fecha. \npthousandsep{.} \npdecimalsign{,} \def\@DigitosMoneda{2} \def\@DigitosPorc{2} \def\@DigitosNumeracion{5} +\def\@FormatoFecha{ddmmyyyy} +\def\@FormatoFechaEntrada{dd-mm-yyyy} +\def\@FechaSeparadores{-} %% La moneda: \def\Moneda{Bs.} @@ -67,17 +75,41 @@ Archivo valores iniciales y condiciones de borde para factura.cls \def\@DenomAlicuotaA{A} \def\@DenomAlicuotaE{(E)} +%% El texto predeterminado para la nota interna por el descuento presidencial. +\def\@TextoDescuentoPresidencial{Se aplica un descuento del \@AlicuotaGDescPorc\% al IVA General seg\'un Decreto Presidencial 3085 en Gaceta Oficial 41239.} + %% Macros que guardan textos que corresponden a nombres de campos: \def\@@Fecha{Fecha de emisi\'on:} +\def\@@FechaVencimiento{Fecha de vencimiento:} +\def\@@Control{N\textordmasculine\space CONTROL} +\def\@@Datos{Datos del cliente} +\def\@@Resumen{Resumen del servicio} +\def\@@DenomFactura{FACTURA} +\def\@@DenomCotiza{COTIZACI\'ON} \def\@@RazonSocial{Raz\'on social:} +\def\@@Nombre{Nombre:} +\def\@@RIF{R.I.F.:} +\def\@@CI{C.I.:} +\def\@@Direccion{Direcci\'on fiscal:} +\def\@@Telefono{Tel\'efono:} +\def\@@Email{E-mail:} +\def\@@Contacto{Persona de contacto:} +\def\@@Proveedor{Proveedor:} +\def\@@Cliente{Cliente:} +\def\@@Emisor{Por el emisor} +\def\@@Conforme{Recib\'i conforme} +\def\@@Pagado{PAGADO} \def\@@NumItem{\#} \def\@@Cantidad{Cantidad} \def\@@Descripcion{Descripci\'on} +\def\@@Precio{Precio} \def\@@PrecioU{Precio U.} \def\@@PrecioS{Subtotal} +\def\@@Descuento{Dcto.} +\def\@@IVA{IVA} \def\@@PrecioT{Precio T.} -\def\@@Precio{Precio} \def\@@AlicuotaG{IVA G} +\def\@@AlicuotaGDesc{Descuento IVA G} \def\@@AlicuotaR{IVA R} \def\@@AlicuotaA{IVA A} \def\@@BIG{BI G} @@ -85,7 +117,6 @@ Archivo valores iniciales y condiciones de borde para factura.cls \def\@@BIA{BI A} \def\@@BIE{Exento}% La base imponible exenta. ;) \def\@@Total{TOTAL} -\def\@@Descuento{Dcto.} \def\@@DescuentoG{Descuento G} \def\@@DescuentoR{Descuento R} \def\@@DescuentoA{Descuento A} @@ -94,22 +125,6 @@ Archivo valores iniciales y condiciones de borde para factura.cls \def\@@SubtotalR{Subtotal R} \def\@@SubtotalA{Subtotal A} \def\@@SubtotalE{Subtotal E} -\def\@@RIF{R.I.F.:} -\def\@@CI{C.I.:} -\def\@@Contacto{Persona de contacto:} -\def\@@Direccion{Direcci\'on fiscal:} -\def\@@Telefono{Tel\'efono:} -\def\@@Email{E-mail:} -\def\@@Datos{Datos del cliente} -\def\@@Resumen{Resumen del servicio} -\def\@@Conforme{Recib\'i conforme} -\def\@@Emisor{Por el emisor} -\def\@@Pagado{PAGADO} -\def\@@DenomFactura{FACTURA} -\def\@@DenomCotiza{COTIZACI\'ON} -\def\@@Control{N\textordmasculine\space CONTROL} -\def\@@Proveedor{Proveedor:} -\def\@@Cliente{Cliente:} %% i) carácter para separar el teléfono del e-mail del cliente, %% ii) carácter para los campos vacíos cuando se usa \ItemX, @@ -125,21 +140,29 @@ Archivo valores iniciales y condiciones de borde para factura.cls \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 la última letra y el carácter que indica que se continúa en la línea siguiente en la descripción cuando ocupa más de una línea. No vale la pena hacer una macro para cambiar esto. -\setlength{\@SeparaFinLineaDesc}{0.05cm} - %% Separación entre el inicio de una columna en la tabla y el inicio del texto. \tabcolsep=0.15cm +%% Separación entre la última letra y el carácter que indica que se continúa en la línea siguiente en la descripción cuando ocupa más de una línea. +\setlength{\@SeparaFinLineaDesc}{0.15cm} + +%% Separación entre el teléfono y el carácter \@CaracterSeparaTelefonoEmail, y luego desde ese carácter hasta el email, +%% para cuando no hay resumen. +\setlength{\@SeparaTelefonoEmail}{0.666em} + %% Grosor de la línea de 'fancyhdr' para las cabeceras, en aquellas donde haya línea. -\def\@GrosorLineaInfoPag{0.4pt} +\setlength{\@GrosorLineaInfoPag}{0.4pt} + +%% Posición en X desde la derecha y excedente en la línea de la firma. +\setlength{\@FirmaReportePosX}{2cm} +\setlength{\@FirmaReporteExcesoLinea}{1.5cm} %% Posiciones (X,Y) de los objetos: i) fecha, ii) denominación, iii) condiciones, iv) número de control, v) firmas. -\PosFecha{-0cm}{4.3cm} -\PosDenom{0cm}{4.3cm} -\PosControl{0cm}{-2.5cm} -\PosCond{0cm}{-5.3cm} -%% 'X' no acepta valores negativos en \PosCond. +\PosFecha*{-0cm}{5cm} +\PosDenom*{0cm}{5cm} +\PosControl*{0cm}{-2.4cm} +\PosCondiciones{0cm}{-5.3cm} +%% 'X' no acepta valores negativos en \PosCondiciones. \PosFirmas{5cm}{1cm}{-2.4cm} %% La firma se define con un X_inicial, un X_final y un Y_inicial (Xo,Xf,Y) @@ -150,22 +173,40 @@ Archivo valores iniciales y condiciones de borde para factura.cls \SepFilas{0.8cm}{2.5pt} %% Separación vertical entre los elementos de la factura (entre el encabezado y el cuadro de la 'factura', luego desde dicho cuadro hasta la descripción, o hasta los totales en modo de filas). -\SepElementos{0.2cm} +\SepVertical{0.2cm} + +%% Separación horizontal entre la caja de los datos del cliente y la caja del resumen. +\SepDatosResumen{0.2cm} + +%% Separación horizontal interna entre la línea y el texto en los datos del cliente y en el resumen. +\SepEncabezado{6pt} -%% Separación horizontal entre las cajas del encabezado y separación interna entre la línea y el texto. -\SepEncabez{0.2cm}{6pt} +%% Separación interna entre la línea y el texto de la nota previa. +\SepNotaPrevia{6pt} %% Separación extra entre los elementos en la factura. \SepItemsExtra{0pt} %% Separación interna entre la línea y el texto de la descripción. -\SepDescrip{6pt} +\SepDescripcion{6pt} + +\SepCondiciones{5pt} %% Grosor de la línea de las cajas del encabezado, curvatura de la esquina y sombra. -\LineaEncabez{0.4pt}{10pt}{0pt} +%% (si pedimos linea de 0pt, todo queda en cero y no se abre el ambiente TikZ). +\LineaEncabezado{0.4pt}{10pt}{0pt} + +%% Grosor de la línea de la nota previa, curvatura de la esquina y sombra. +%% (si pedimos linea de 0pt, todo queda en cero y no se abre el ambiente TikZ). +\LineaNotaPrevia{0.4pt}{7pt}{0pt} %% Grosor de la línea de la descripción, curvatura de la esquina y sombra. -\LineaDescrip{0.4pt}{0pt}{4pt} +%% (si pedimos linea de 0pt, todo queda en cero y no se abre el ambiente TikZ). +\LineaDescripcion{0.4pt}{0pt}{4pt} + +%% Grosor de la línea de las condiciones, curvatura de la esquina y sombra. +%% (si pedimos linea de 0pt, todo queda en cero y no se abre el ambiente TikZ). +\LineaCondiciones{0pt}{0pt}{0pt} %% El espacio vertical que hay que avanzar sólo en la primera página del reporte antes de empezar a escribir sobre él. Usable cuando la primera página tiene un membrete y las demás no, es decir, cuando se usa \FondoReporte y no \FondoReporte*. \InicioReporte{1.6cm} @@ -174,8 +215,14 @@ Archivo valores iniciales y condiciones de borde para factura.cls %% Esta es la letra de la descripción de los items; y el espacio \baselineskip de *toda* la tabla de la factura se fija en este comando únicamente (se predeterminó 18pt). \LetraItems{\fontsize{14}{18}} +%% Tipo de letra para la nota interna: +\LetraNotaInterna{\fontsize{11}{13}\itshape} + +%% Tipo de letra para la nota externa: +\LetraNotaExterna{\fontsize{14}{16.8}} + %% Con este comando se cambia la etra del título de la tabla, es decir, los textos 'Cantidad, 'Descripción', etc... -\LetraTitCuadro{\fontsize{10}{10}\bfseries} +\LetraTitColumnas{\fontsize{10}{10}\bfseries} %% Tipo de letra de los títulos de los totales, por ejemplo los textos: 'B.I. G', 'IVA G'. \LetraTitTotales{\fontsize{12}{12}\bfseries} @@ -210,6 +257,9 @@ Archivo valores iniciales y condiciones de borde para factura.cls %% Tipo de letra para el texto bajo las líneas para firmar. \LetraFirmas{\fontsize{12}{12}} +%% Tipo de letra para la nota previa. +\LetraNotaPrevia{\fontsize{11}{12.5}} + %% Tipo de letra para las condiciones del documento. \LetraCondiciones{\fontsize{12}{12}} @@ -219,8 +269,8 @@ Archivo valores iniciales y condiciones de borde para factura.cls %% Letra para la numeración de la factura. \LetraNumeracion{\fontsize{14}{14}\bfseries\color{red}} -%% Letra para la fecha de emisión. -\LetraFecha{\fontsize{14}{14}} +%% Letra para las fechas (emisión y vencimiento). +\LetraFecha{\fontsize{14}{15}} %% Letra para el título del reporte. \LetraTitReporte{\fontsize{16}{22}\bfseries} @@ -228,29 +278,50 @@ Archivo valores iniciales y condiciones de borde para factura.cls %% Letra para las cabeceras de las páginas en el modo reporte. \LetraInfoPagina{\fontsize{12}{12}\slshape} +%% Letra para el reverso de la factura. +\LetraReverso{\fontsize{10}{12}} + %% Letra para el reporte. \LetraReporte{\fontsize{12}{20}} +%% Diseño hecho en TikZ para los datos del cliente, el resumen, la nota previa, la descripción y las condiciones. +\def\@DatosTIKZ{% + draw=black, fill=white, inner sep=\@SeparaInternaEncabezado, line width=\@GrosorLineaEncabezado, rounded corners=\@EsquinaLineaEncabezado, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraEncabezado, shadow yshift=-\@SombraEncabezado}} + +\let\@ResumenTIKZ\@DatosTIKZ + +\def\@NotaPreviaTIKZ{% + draw=black, fill=white, inner sep=\@SeparaInternaNotaPrevia, line width=\@GrosorLineaNotaPrevia, rounded corners=\@EsquinaLineaNotaPrevia, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraNotaPrevia, shadow yshift=-\@SombraNotaPrevia}} + +\def\@DescripcionTIKZ{% + draw=black, fill=white, inner sep=\@SeparaInternaDescripcion, line width=\@GrosorLineaDescripcion, rounded corners=\@EsquinaLineaDescripcion, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraDescripcion, shadow yshift=-\@SombraDescripcion}} + +\def\@CondicionesTIKZ{% + draw=black, fill=white, inner sep=\@SeparaInternaCondiciones, line width=\@GrosorLineaCondiciones, rounded corners=\@EsquinaLineaCondiciones, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraCondiciones, shadow yshift=-\@SombraCondiciones}} + %% El diseño de las distintas partes de la hoja. -\newcommand{\@EstiloFirmas}{% +\newcommand{\@EstiloFirmas}{ \@LetraFirmas \if@unafirma \else - \parbox{\@TamLineaFirmas}{% + \parbox{\@TamLineaFirmas}{ \rule{\@TamLineaFirmas}{\@GrosorLineaFirmas} - \centering \ifdefvoid{\@Conforme}{\@@Conforme}{\@Conforme}}% + \centering \ifdefvoid{\@Conforme}{\@@Conforme}{\@Conforme}} \fi \hfill - \parbox{\@TamLineaFirmas}{% + \parbox{\@TamLineaFirmas}{ \rule{\@TamLineaFirmas}{\@GrosorLineaFirmas} \centering \ifdefvoid{\@Emisor}{\if@cotizacion \@@Emisor \else \@@Pagado \fi}{\@Emisor}}} +\newcommand{\@EstiloNotaPrevia}{\@LetraNotaPrevia \@NotaPrevia} + \newcommand{\@EstiloCondiciones}{\@LetraCondiciones \@Condiciones} \newcommand{\@EstiloNumControl}{% + \renewcommand{\baselinestretch}{0}\selectfont \begin{tabular}{@{\extracolsep{0pt}}l} - \@LetraDenom \@@Control \\ - {\@LetraDenom\@NumSerieControl-}\space\@LetraNumeracion\@NumControl + \@LetraDenom \@@Control \\[.4em] + {\@LetraDenom\@NumSerieControl-}\space\@LetraNumeracion\@NumControl \\ \end{tabular}} \newcommand{\@EstiloDenom}{% @@ -260,13 +331,19 @@ Archivo valores iniciales y condiciones de borde para factura.cls \space\space{\@LetraNumeracion N\textordmasculine\space\@Num}% \fi} -\newcommand{\@EstiloFecha}{\@LetraFecha\@@Fecha{\ttfamily\ \@Fecha}} +\newcommand*{\@EstiloFechas}{% + \renewcommand{\baselinestretch}{0}% + \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 + \end{tabular}} \newcommand{\@InfoPaginaNoTitulo}{\@LetraInfoPagina Reporte correspondiente a la factura n\'umero \@Num \space de fecha \@Fecha} \newcommand{\@InfoPaginaTitulo}{\@LetraInfoPagina \@TituloReporte \space - \@Proveedor \space - \@Fecha} -%% Estilos de página: normal, sólo cabeceras, sólo piés de página y sólo número de página al pié. +%% Estilos de página: normal, sólo cabeceras, sólo pies de página y sólo número de página al pie. \fancypagestyle{plain}{% \expandafter\ps@fancy \fancyhf{}% |