summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/factura
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2015-03-30 23:04:03 +0000
committerKarl Berry <karl@freefriends.org>2015-03-30 23:04:03 +0000
commit0d7d6ceda5d28a3493013ee490037ce2f44ddcae (patch)
treea9faec96d6a546ab4611a8ae5a27f2fc54f898b4 /Master/texmf-dist/tex/latex/factura
parent6975cb301d2e0be4f88a85bed1b3cebd3367e9f9 (diff)
factura (30mar15)
git-svn-id: svn://tug.org/texlive/trunk@36679 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/factura')
-rw-r--r--Master/texmf-dist/tex/latex/factura/factura.cls2074
-rw-r--r--Master/texmf-dist/tex/latex/factura/factura.def352
2 files changed, 1652 insertions, 774 deletions
diff --git a/Master/texmf-dist/tex/latex/factura/factura.cls b/Master/texmf-dist/tex/latex/factura/factura.cls
index 75ef5e549c4..7822e805d84 100644
--- a/Master/texmf-dist/tex/latex/factura/factura.cls
+++ b/Master/texmf-dist/tex/latex/factura/factura.cls
@@ -1,238 +1,623 @@
%%
%% This is file `factura.cls',
-%% *NOT* generated with the docstrip utility.
+%% generated with the docstrip utility.
%%
-%% Copyright 2013 Emilio Lazo Zaia
+%% The original source files were:
%%
+%% factura.dtx (with options: `class')
+%%
+%% Copyright 2015 Emilio Lazo Zaia <emiliolazozaia@gmail.com>
+%%
%% This work may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3 or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
-%%
-%% This work has the LPPL maintenance status "maintained".
-%%
-%% This Current Maintainer of this work is Emilio Lazo Zaia.
-%%
-%% This work consists of the files factura.cls, factura.def,
-%% and factura-modelo.tex, factura-modelo-ya.tex and README.
-%%
-%% Emilio Lazo Zaia <emiliolazozaia@gmail.com>
-%%
-%% This file is in UTF-8 format with Unix-like line breaks (LF only).
-%% Commands and commentaries are in spanish.
-%%
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. This version of this license is in
+%% http://www.latex-project.org/lppl/lppl-1-3c.{html|txt|tex|pdf}
+%% and the latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Emilio Lazo Zaia.
+%%
+%% 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-reporte1.tex,
+%% factura-ejemplo-reporte2.tex, factura-ejemplo-reporte3.tex,
+%% and factura-beispiel-rechnung.tex.
+%%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesClass{factura}[2013/04/29 v1.0
-^^J^^J
-Clase para elaborar facturas legales en la
-República Bolivariana de Venezuela.]
+\ProvidesClass{factura}
+[2015/03/30 v2.00^^J
+Clase para elaborar facturas legales en la^^J
+República Bolivariana de Venezuela.
+]
-\newif\if@prefactura \@prefacturafalse
-\newif\if@presupuesto \@presupuestofalse
+\newif\if@prefactura
+\newif\if@cotizacion
\newif\if@spanish \@spanishtrue
-\newif\if@marco \@marcofalse
\newif\if@ivaexplicito \@ivaexplicitotrue
-\newif\if@todosiva \@todosivafalse
+\newif\if@todosiva
\newif\if@confirmas \@confirmastrue
+\newif\if@unafirma \@unafirmafalse
\newif\if@concondiciones \@concondicionestrue
-\newif\if@filas \@filasfalse
-\newif\if@centrado \@centradofalse
-\newif\if@denom \@denomfalse
-\newif\if@lineaitem \@lineaitemfalse
-\newif\if@linea \@lineafalse
-\newif\if@G \@Gfalse
-\newif\if@BIA \@BIAfalse
-\newif\if@BIR \@BIRfalse
-\newif\if@Exento \@Exentofalse
-\newif\if@csv \@csvfalse
+\newif\if@filas
+\newif\if@agrupado
+\newif\if@centrado
+\newif\if@descuentos
+\newif\if@denom
+\newif\if@sinnumero
+\newif\if@lineaitem
+\newif\if@linea
+\newif\if@G
+\newif\if@BIR
+\newif\if@BIA
+\newif\if@Exento
+\newif\if@DescG
+\newif\if@DescR
+\newif\if@DescA
+\newif\if@DescE
+\newif\if@csv
+\newif\if@cdu \@cdutrue
+\newif\if@dcu
+\newif\if@duc
+\newif\if@relleno
+\newif\if@fondofactura
+\newif\if@fondoreporte
+\newif\if@fondoreportestar
+\newif\if@factura \@facturatrue
+\newif\if@reporte
+\newif\if@nombre
+\newif\if@impdesc
-\LoadClass[12pt]{article}
-
-\RequirePackage[absolute]{textpos}% Es necesario 'textpos' para colocar texto en ubicaciones arbitrarias.
-\RequirePackage{geometry}% 'geometry' para ajustar el tamaño de la página.
-\RequirePackage{calc}% 'calc' para hacer aritmética con las dimensiones.
-\RequirePackage{fp-upn}% Fundamental el paquete 'fp-upn' para todos los cálculos.
-\RequirePackage{numprint}% Con 'numprint' expresamos los totales en el formato requerido.
-\RequirePackage{fancybox}% El cuadro de la descripción lo hacemos con 'fancybox'.
-\RequirePackage[dvipsnames]{xcolor}% Para el color en la numeración.
\RequirePackage{xifthen}% 'xifthen' para algunos de los condicionales.
\RequirePackage{etoolbox}% 'etoolbox' para los condicionales binarios.
-\RequirePackage{expl3}% Para poder hacer el loop que uso en las líneas en blanco.
-\RequirePackage{tabularx}% Con 'tabularx' hacemos la tabla.
-\RequirePackage{environ}% Con 'environ' podemos usar tabularx dentro del ambiente de la factura y colocar texto en el enddef.
-% Gracias a Joseph Wright (Thanks to Joseph Wright):
-% http://tex.stackexchange.com/questions/16189/repeat-command-n-times
-\ExplSyntaxOn
-\cs_new_eq:NN \Repeat \prg_replicate:nn
-\ExplSyntaxOff
-
-\newboolean{Separado} \boolfalse{Separado}
-\newboolean{SinCantidad} \boolfalse{SinCantidad}
-\newboolean{Filas} \boolfalse{Filas}
-\newboolean{G} \boolfalse{G}
-\newboolean{SinLineasV} \boolfalse{SinLineasV}
-% Condicional binario auxiliar para el separado en el estido 'sinlineasv'.
-\newboolean{SeparadoSinLineasV} \boolfalse{SeparadoSinLineasV}
-% Condicional auxiliar para hacer que la línea oblicua vaya desde el campo de la cantidad, en los casos de los estilos 'sinlineasv' y 'separado'.
-\newboolean{LineaDesdeCantidad}
-% Otro para que la línea vaya hasta el precio total, en el caso de 'sinlineasv' con 'filas'.
-\newboolean{LineaHastaPT}
-
-% Se utiliza '\@Impuesto' como el factor del impuesto, el cual viene predefinido en '\@Alicuota'.
-\def\@ImpuestoG{\@AlicuotaG}
-\def\@ImpuestoR{\@AlicuotaR}
-\def\@ImpuestoA{\@AlicuotaA}
+\newboolean{Descuentos}
+\newboolean{SinCantidad}
+\newboolean{Filas}
+\newboolean{G}
+\newboolean{SinLineasV}
+\newboolean{DCU}
+\newboolean{DUC}
+\newboolean{PrimeroDesc}
+%% Condicionales auxiliares para hacer que la línea oblicua salga donde corresponde.
+\newboolean{LineaDesdeColUno}
+\newboolean{LineaDesdeColDos}
+\newboolean{LineaHastaColUno}
+\newboolean{LineaHastaColDos}
+\newboolean{LineaHastaFinal}
+\newboolean{LineaHastaTotal}
+%% Condicionales auxiliares para la posición de los objetos fijos cuando son medidos desde la derecha, o desde abajo.
+\newboolean{FechaXnegativo}
+\newboolean{FechaYnegativo}
+\newboolean{CondYnegativo}% no hay CondXnegativo.
+\newboolean{DenomXnegativo}
+\newboolean{DenomYnegativo}
+\newboolean{ControlXnegativo}
+\newboolean{ControlYnegativo}
+\newboolean{FirmasYnegativo}% no hay FirmasXnegativo; hay X_inicial y X_final para las firmas.
-\DeclareOption{prefactura}{\@prefacturatrue}% La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente.
-\DeclareOption{presupuesto}{\@presupuestotrue}% Cambia la denominación a 'PRESUPUESTO' y no 'FACTURA'.
-\DeclareOption{nospanish}{\@spanishfalse}% No carga babel en castellano ni la codificación T1 de las letras.
+\DeclareOption{prefactura}{\@prefacturatrue\@denomtrue}% La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente.
+\DeclareOption{cotizacion}{\@cotizaciontrue\@denomtrue}% 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{sincantidad}{\booltrue{SinCantidad}}% Para no colocar el campo de la cantidad.
+\DeclareOption{unafirma}{\@unafirmatrue\@confirmastrue}% No agrega el espacio para que firme quien recibe.
+\DeclareOption{descuentos}{\booltrue{Descuentos}\@descuentostrue}% Para los descuentos individuales.
\DeclareOption{sincond}{\@concondicionesfalse}% No agrega la línea de las condiciones de pago.
\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{siniva}{\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{ivanoexplicito}{\@ivaexplicitofalse}% Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA.
-% Para la 'G' del IVA general y el porcentaje en su base imponible.
+\DeclareOption{sinnumero}{\@sinnumerotrue\@denomtrue}% Coloca el texto de la denominación del documento pero sin colocar el número.
\DeclareOption{G}{\@Gtrue\booltrue{G}}% Con esta opción sale la letra 'G' en los items con IVA general, y sale el porcentaje en la base imponible general.
\DeclareOption{lineaitem}{\@lineaitemtrue}% Una línea en cada ítem.
-\DeclareOption{linea}{\@lineatrue}% Para la línea que protege el espacio en blanco.
-\DeclareOption{separado}{\booltrue{LineaDesdeCantidad}\booltrue{Separado}\booltrue{SeparadoSinLineasV}}% Encierra en un separado los totales de los items.
-\DeclareOption{filas}{% Estilo de totalización en filas.
- \ifbool{Separado}{\ClassWarning{factura}{La opción 'filas' no es compatible con la opción 'separado'. Sin efecto opción 'separado'}{}}{}%
- \if@ivaexplicito\else%
- \ClassWarning{factura}{La opción 'filas' no es compatible con la opción 'ivanoexplicito'. Sin efecto opción 'ivanoexplicito'.}{}%
- \@ivaexplicitotrue%
- \fi%
- \@filastrue\booltrue{Filas}%
- \boolfalse{LineaDesdeCantidad}% Quitamos esto porque la línea diagonal se coloca dentro del renglón de la factura en el modo 'filas', entonces es desde la descripción a menos que se use 'sinlineasv'.
-}
+\DeclareOption{filas}{\@filastrue\booltrue{Filas}}% Estilo de totalización en filas.
\DeclareOption{centrado}{% Total y exento 'centrado'; sólo para estilo 'filas'
- \if@filas%
- \@centradotrue%
- \else%
+ \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'.}{}
\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'.}{}
+ \else
+ \@agrupadotrue
+ \fi}
+\DeclareOption{impdesc}{\@impdesctrue}% Para el tipo de impuesto en la descripción y no en el precio unitario y total.
+\DeclareOption{dcu}{% Descripción, luego cantidad y luego precio unitario.
+ \@dcutrue\@cdufalse\@ducfalse
+ \booltrue{DCU}\boolfalse{DUC}
+ \booltrue{PrimeroDesc}}
+\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{PrimeroDesc}\boolfalse{DCU}\@dcufalse\@cdutrue
+ \else
+ \@ductrue\@cdufalse\@dcufalse
+ \booltrue{DUC}\boolfalse{DCU}
+ \booltrue{PrimeroDesc}
+ \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{ivanoexplicito}{% Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA.
+ \if@filas
+ \ClassWarning{factura}{La opción 'ivanoexplicito' 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}}
+ \@ivaexplicitofalse
+ \fi}
+\DeclareOption{sincantidad}{% Para no colocar 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{PrimeroDesc}
+ \fi
+ \if@duc
+ \ClassWarning{factura}{La opción 'sincantidad' no es compatible con 'duc' . Sin efecto opción 'duc'}{}
+ \@ducfalse\@cdutrue\boolfalse{DUC}\boolfalse{PrimeroDesc}
+ \fi}
+
\DeclareOption{sinlineasv}{% Estilo 'sinlineasv'.
- \booltrue{SinLineasV}%
- \booltrue{LineaDesdeCantidad}%
- \boolfalse{Separado}%
- \if@filas\booltrue{LineaHastaPT}\fi}
-\DeclareOption{csv}{\@csvtrue}% Para la salida en modo csv también.
+ \booltrue{SinLineasV}}
+\DeclareOption{relleno}{\@rellenotrue}% Para rellenar con líneas en blanco de manera automática.
+\DeclareOption{linea}{% Para la línea que protege el espacio en blanco.
+ \if@relleno
+ \@lineatrue
+ \else
+ \ClassWarning{factura}{La opción 'linea' requiere la opción 'relleno'. 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{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
+ \AtEndDocument{\@EscribeTotalesEnCSV}
+ \else
+ \ClassWarning{factura}{La opción 'csv' require generar la factura. Sin efecto opción 'csv'.}{}
+ \fi}
\ProcessOptions\relax
-\AtBeginDocument{%
- % Da error si algún campo necesario no está definido.
- \ifx \@undefined \@Nombre \ClassError{factura}{** Hay que definir la razón social **}{} \fi%
- \ifx \@undefined \@RIF \ClassError{factura}{** Hay que definir el R.I.F. **}{} \fi%
- \ifx \@undefined \@Direccion \ClassError{factura}{** Hay que definir la dirección fiscal **}{} \fi%
- \ifx \@undefined \@Tel \ClassError{factura}{** Hay que definir un número telefónico **}{} \fi%
- \ifx \@undefined \@Email \ClassWarning{factura}{** Pudiera definirse una dirección de correo electrónico **}{} \fi%
- \ifx \@undefined \@Fecha \ClassError{factura}{** Hay que definir la fecha de emisión **}{} \fi
- \if@concondiciones%
- \ifx \@undefined \@Condiciones \ClassError{factura}{** Hay que definir las condiciones de pago o usar la opción 'sincond' **}{} \fi%
- \fi%
- \if@confirmas%
- \ifx \@undefined \@Emisor \ClassError{factura}{** Hay que definir el nombre del emisor cuando no se omite (con la opción 'sinfirmas') el espacio para firmar. **}{} \fi%
- \fi%
- \if@marco%
- \ifx \@undefined \@Marco \ClassError{factura}{** Hay que definir el marco **}{} \fi%
- \fi%
- \if@denom%
- \ifx \@undefined \@Num \ClassError{factura}{** Hay que definir el número de la factura **}{} \fi%
- \fi}
+\LoadClass[12pt]{article}
-% Tamaño de la página con 'geometry', página limpia y sin sangre.
-\pagestyle{empty}
-\setlength\parindent{0pt}
+\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{xstring}% Lo usamos sólo para tomar el menos al principio de una longitud.
+\RequirePackage{pbox}% Para la caja autoajustable.
+\RequirePackage{calc}% 'calc' para hacer aritmética con las dimensiones.
+\RequirePackage{fp-upn}% Fundamental el paquete 'fp-upn' para todos los cálculos.
+\RequirePackage{numprint}% Con 'numprint' expresamos los totales en el formato requerido.
+\RequirePackage{tikz}% Para los recuadros del encabezado,
+\usetikzlibrary{shadows}% y para el de la descripción.
+\RequirePackage{tabularx}% Con 'tabularx' hacemos la tabla.
+\RequirePackage{environ}% Con 'environ' podemos usar tabularx dentro del ambiente de la factura y colocar texto en el enddef.
+\RequirePackage{fancyhdr}% Los encabezados fancy; así se use solamente en reporte, hay que cargarlo siempre.
+
+\AtBeginDocument{% Da error si algún campo necesario no está definido.
+ \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{\@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 **}{}%
+ \let\@Proveedor=\@Emisor}}
+ {}%
+ \fi
+ \ifdefvoid{\@RazonSocial}{\ClassError{factura}{** 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 de pago o usar la opción 'sincond' **}{}}{}%
+ \fi
+ \if@confirmas
+ \ifdefvoid{\@Emisor}{\ClassError{factura}{** Hay que definir el nombre del emisor cuando no se omite (con la opción 'sinfirmas') el espacio para firmar. **}{}}{}%
+ \fi
+ \if@cotizacion
+ \ifdefvoid{\@FondoFactura}{\ClassWarning{factura}{** 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 **}{}}{}%
+ \fi
+ \if@sinnumero
+ \if@cotizacion
+ \else
+ \ClassError{factura}{** 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 **}{}}{}%
+ \fi
+ \fi
+ \fi
+ \ifdefvoid{\@Contacto}{\if@nombre\else\ClassWarning{factura}{** Pudiera definirse una persona de contacto **}{}\fi}{}%
+}
+
+%% Escribimos el total como comentario en el .log.
+\AtEndDocument{\if@factura\ClassInfo{factura}{\@@Total: \space\space\space \@Moneda \Total}{}\fi}
+
+%% La geometría en formato de factura y de reporte.
+%% El margen superior está definido desde el encabezado con los datos del cliente.
+%% El margen inferior está definido hasta el final de la descripción (o del renglón de la factura si no hay descripción).
+%% Hay elementos que salen fuera de estos márgenes, como las firmas, las condiciones de pago, la numeración y la fecha.
+\def\GeometriaFactura#1{\gdef\@GeometriaFactura{#1}}
+\def\GeometriaReporte#1{\gdef\@GeometriaReporte{#1}}
-% \Fecha, \Nombre (\RS), \RIF, \CI, \Dirección, \Tel, \Email, \Emisor.
+%% Se utiliza '\@Impuesto' como el factor del impuesto, el cual viene predefinido en '\@Alicuota'.
+\def\@ImpuestoG{\@AlicuotaG}
+\def\@ImpuestoR{\@AlicuotaR}
+\def\@ImpuestoA{\@AlicuotaA}
+
+%% Fijamos en cero los descuentos totales (necesario).
+\def\@DescuentoGPorc{0}
+\def\@DescuentoRPorc{0}
+\def\@DescuentoAPorc{0}
+\def\@DescuentoEPorc{0}
+
+%% \Fecha, \RazonSocial, \Nombre, \RIF, \CI, \Contacto, \Dirección, \Telefono, \Email, \Emisor, \Proveedor.
\def\Fecha#1{\gdef\@Fecha{#1}}
-\def\Nombre#1{\gdef\@Nombre{#1}}
-\let\RS\Nombre
+\def\RazonSocial#1{\gdef\@RazonSocial{#1}}
+\let\RS\RazonSocial
+\def\Nombre#1{\gdef\@RazonSocial{#1}\@nombretrue}
\def\RIF#1{\gdef\@RIF{#1}}
-\def\CI#1{\let\@@RIF\@@CI\gdef\@RIF{#1}}
+\def\CI#1{\gdef\@RIF{#1}\let\@@RIF\@@CI\let\@CI\@RIF}
+\def\Contacto#1{\gdef\@Contacto{#1}}
\def\Direccion#1{\gdef\@Direccion{#1}}
-\def\Tel#1{\gdef\@Tel{#1}}
+\def\Telefono#1{\gdef\@Telefono{#1}}
+\let\Tel\Telefono
\def\Email#1{\gdef\@Email{#1}}
\def\Emisor#1{\gdef\@Emisor{#1}}
+\def\Proveedor#1{\gdef\@Proveedor{#1}}
-\def\Resumen#1{\gdef\@Resumen{#1}}% Resumen opcional que va colocado a la derecha en un óvalo.
-\def\Marco#1{\gdef\@Marco{#1}}% Con \Marco le damos el nombre del archivo que contiene el formato de la factura para compilaciones con 'prefactura', 'presupuesto'.
-\def\Denom#1{\gdef\@Denominacion{#1}}% La denominación puede ser 'FACTURA', 'PRESUPUESTO' u otra.
+%% Los descuentos.
+\def\Descuento#1{\gdef\@DescuentoGPorc{#1}\gdef\@DescuentoRPorc{#1}\gdef\@DescuentoAPorc{#1}\gdef\@DescuentoEPorc{#1}}
+\def\DescuentoG#1{\gdef\@DescuentoGPorc{#1}}
+\def\DescuentoR#1{\gdef\@DescuentoRPorc{#1}}
+\def\DescuentoA#1{\gdef\@DescuentoAPorc{#1}}
+\def\DescuentoE#1{\gdef\@DescuentoEPorc{#1}}
+
+\def\Denom#1{\gdef\@Denominacion{#1}}% La denominación puede ser 'FACTURA', 'COTIZACIÓN' u otra.
\def\@Denominacion{\@@DenomFactura}% Se predetermina la factura.
-% Número de la factura con \Num.
+%% Número de la factura con \Num, número de control con \NumControl, y número de serie de control \NumSerieControl.
\def\Num#1{\gdef\@Num{\nplpadding{\@DigitosNumeracion}\npthousandsep{}\numprint{#1}}}
-% También puede escribirse el número de control (\NumControl), sólo en las 'prefacturas', y el número de serie de control puede fijarse con \NumSerieControl.
-% Si el número de control no se especifica, toma el mismo que el de la factura, y si el número de serie de control no se especifica, toma '00'.
-\def\NumControl#1{\gdef\@NumControl{\nplpadding{\@DigitosNumeracion}\npthousandsep{}\numprint{#1}}}
-\def\NumSerieControl#1{\gdef\@NumSerieControl{#1}}
+\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'.
+
+%% Estilo de cabeceras de páginas o piés de página.
+\def\EstiloPag#1{\gdef\@EstiloPag{#1}}
+
+%% Texto que esclarece las condiciones de pago.
+\NewDocumentCommand{\Condiciones}{+m}{\gdef\@Condiciones{#1}}
+
+%% Resumen opcional que va colocado a la derecha de los datos del cliente.
+\NewDocumentCommand{\Resumen}{+m}{\gdef\@Resumen{#1}}
+
\AtBeginDocument{%
- \ifx\@undefined\@NumControl\let\@NumControl\@Num\fi%
- \ifx\@undefined\@NumSerieControl\gdef\@NumSerieControl{00}\fi}
-
-% Cantidad de líneas en blanco al final del renglón de la factura.
-\def\Lineas#1{\setcounter{Lineas}{#1}}
-
-% Texto que esclarece las condiciones de pago.
-\def\Condiciones#1{\gdef\@Condiciones{#1}}
-
-% Longitudes para uso interno.
-\newlength{\TamDatos}
-\newlength{\TamResumen}
-\newlength{\TamFinalOvalos}
-\newlength{\TamLineaFirmas}
-\newlength{\EspesorLineaFirmas}
-\newlength{\NodoX}
-\newlength{\NodoY}
-\newlength{\NodoXX}
-\newlength{\NodoYY}
-\newlength{\SepTotales}
-
-% Longitudes que podemos cambiar, para la posición de varios elementos en la factura.
-\newlength{\XInicioFecha}
-\newlength{\YInicioFecha}
-\newlength{\XInicioDenom}
-\newlength{\YInicioDenom}
-\newlength{\XInicioFirmas}
-\newlength{\XFinFirmas}
-\newlength{\YInicioFirmas}
-\newlength{\XInicioCond}
-\newlength{\XFinCond}
-\newlength{\YInicioCond}
-\newlength{\XInicioControl}
-\newlength{\YInicioControl}
-\newlength{\TamControl}
-\newlength{\SepOvalos}
-\newlength{\SepElementos}
-\newlength{\SepMinTotales}
-
-% Cajas para uso interno.
-\newbox{\CajaDatos}
-\newbox{\CajaResumen}
-\newbox{\CajaFirma}
-
-% Para las líneas en blanco en la factura.
-\newcounter{Lineas}%
-
-% '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos.
-\newcounter{IVANoGeneral}%
+ \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}%
+ \FPupn\@DescuentoGPorc{\@DescuentoGPorc{} \@DigitosPorc{} round clip}%
+ \FPupn\@DescuentoRPorc{\@DescuentoRPorc{} \@DigitosPorc{} round clip}%
+ \FPupn\@DescuentoAPorc{\@DescuentoAPorc{} \@DigitosPorc{} round clip}%
+ \FPupn\@DescuentoEPorc{\@DescuentoEPorc{} \@DigitosPorc{} round clip}%
+ \FPupn\@DescuentoGFactor{100 \@DescuentoGPorc{} / \@DigitosPorc{} round}%
+ \FPupn\@DescuentoRFactor{100 \@DescuentoRPorc{} / \@DigitosPorc{} round}%
+ \FPupn\@DescuentoAFactor{100 \@DescuentoAPorc{} / \@DigitosPorc{} round}%
+ \FPupn\@DescuentoEFactor{100 \@DescuentoEPorc{} / \@DigitosPorc{} round}%
+ \FPifeq\@DescuentoGPorc{0}\else\@DescGtrue\fi
+ \FPifeq\@DescuentoRPorc{0}\else\@DescRtrue\fi
+ \FPifeq\@DescuentoAPorc{0}\else\@DescAtrue\fi
+ \FPifeq\@DescuentoEPorc{0}\else\@DescEtrue\fi}
-\input{factura.def}% Cargamos los valores predeterminados.
+%% 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}}%
+ \IfBeginWith{#2}{-}
+ {\StrBehind{#2}{-}[\templeng]\setlength{\@PosFechaY}{-\templeng}\booltrue{FechaYnegativo}}
+ {\boolfalse{FechaYnegativo}\setlength{\@PosFechaY}{#2}}}
+
+\def\PosDenom#1#2{%
+ \IfBeginWith{#1}{-}
+ {\StrBehind{#1}{-}[\templeng]\setlength{\@PosDenomX}{-\templeng}\booltrue{DenomXnegativo}}
+ {\boolfalse{DenomXnegativo}\setlength{\@PosDenomX}{#1}}%
+ \IfBeginWith{#2}{-}
+ {\StrBehind{#2}{-}[\templeng]\setlength{\@PosDenomY}{-\templeng}\booltrue{DenomYnegativo}}
+ {\boolfalse{DenomYnegativo}\setlength{\@PosDenomY}{#2}}}
+
+\def\PosControl#1#2{%
+ \IfBeginWith{#1}{-}
+ {\StrBehind{#1}{-}[\templeng]\setlength{\@PosControlX}{-\templeng}\booltrue{ControlXnegativo}}
+ {\boolfalse{ControlXnegativo}\setlength{\@PosControlX}{#1}}%
+ \IfBeginWith{#2}{-}
+ {\StrBehind{#2}{-}[\templeng]\setlength{\@PosControlY}{-\templeng}\booltrue{ControlYnegativo}}
+ {\boolfalse{ControlYnegativo}\setlength{\@PosControlY}{#2}}}
+
+\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.
+
+\def\PosFirmas#1#2#3{%
+ \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 espesor de la línea de las firmas.
+\def\LineaFirmas#1#2{%
+ \setlength{\@TamLineaFirmas}{#1}%
+ \setlength{\@EspesorLineaFirmas}{#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 renglón de la 'factura', luego desde dicho renglón hasta la descripción, o hasta los totales en modo de filas).
+\def\SepElementos#1{\setlength{\@SeparaElementos}{#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 descripción.
+\def\SepDescrip#1{\setlength{\@SeparaInternaDescrip}{#1}}
+
+%% Espesor de la línea de las cajas del encabezado, curvatura de la esquina y sombra.
+\def\LineaEncabez#1#2#3{\setlength{\@EspesorLineaEncabez}{#1}\setlength{\@EsquinaLineaEncabez}{#2}\setlength{\@SombraEncabez}{#3}}
+
+%% Espesor de la línea de la descripción, curvatura de la esquina y sombra.
+\def\LineaDescrip#1#2#3{\setlength{\@EspesorLineaDescrip}{#1}\setlength{\@EsquinaLineaDescrip}{#2}\setlength{\@SombraDescrip}{#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{\@InicioRep}{#1}}
-% Establecemos los porcentajes de las alícuotas a través del factor, tomado del archivo .def.
-\FPupn\@AlicuotaGPorc{\@AlicuotaG{} 100 * 2 round clip}
-\FPupn\@AlicuotaRPorc{\@AlicuotaR{} 100 * 2 round clip}
-\FPupn\@AlicuotaAPorc{\@AlicuotaA{} 100 * 2 round clip}
+%% Tipos de letra para cada elemento posible:
+%% 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}}
-% \SepMinTotales es el mínimo espacio entre los totales en el modo 'filas', y SepTotales es una dimensión estirable, con ese como su mínimo.
-\expandafter\setlength{\SepTotales}{\the\SepMinTotales plus 1fill}
+%% Con este comando se cambia la etra del título de la tabla, es decir, los textos 'Cantidad, 'Descripción', etc...
+\def\LetraTitRenglon#1{\gdef\@LetraTitRenglon{#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}}
+
+%% Letra con la que salen los totales parciales, es decir, los números, exceptuando el total general.
+\def\LetraNumTotales#1{\gdef\@LetraNumTotales{#1\selectfont}}
+
+%% Letra con la que sale la palabra 'TOTAL'.
+\def\LetraTitTotal#1{\gdef\@LetraTitTotal{#1\selectfont}}
+
+%% Letra para el total general, el monto.
+\def\LetraNumTotal#1{\gdef\@LetraNumTotal{#1\selectfont}}
+
+%% Tipo de letra para los títulos de las cajas del encabezado, por ejemplo: 'Datos del cliente'.
+\def\LetraTitEnc#1{\gdef\@LetraTitEnc{#1\selectfont}}
+
+%% Tipo de letra para el texto en el encabezado de la factura.
+\def\LetraEncFactura#1{\gdef\@LetraEncFactura{#1\selectfont}}
+
+%% Tipo de letra para los datos en el modo reporte.
+\def\LetraDatosReporte#1{\gdef\@LetraDatosReporte{#1\selectfont}}
+
+%% Letra para los montos individuales de la factura y las cantidades.
+\def\LetraNumeros#1{\gdef\@LetraNumeros{#1\selectfont}}
+
+%% El tipo de IVA ('G', 'R', 'A' o '(E)') también tiene su tipo de letra.
+\def\LetraTipoIVA#1{\gdef\@LetraTipoIVA{#1\selectfont}}
+
+%% Letra para la descripción general (comando \desc).
+\def\LetraDescripcion#1{\gdef\@LetraDescripcion{#1\selectfont}}
+
+%% Tipo de letra para el texto bajo las líneas para firmar.
+\def\LetraFirmas#1{\gdef\@LetraFirmas{#1\selectfont}}
+
+%% Tipo de letra para las condiciones de pago.
+\def\LetraCondiciones#1{\gdef\@LetraCondiciones{#1\selectfont}}
+
+%% Letra para la denominación del documento ('FACTURA', 'COTIZACIÓN',...).
+\def\LetraDenom#1{\gdef\@LetraDenom{#1\selectfont}}
+
+%% Letra para la numeración de la factura.
+\def\LetraNumeracion#1{\gdef\@LetraNumeracion{#1\selectfont}}
+
+%% Letra para la fecha de emisión.
+\def\LetraFecha#1{\gdef\@LetraFecha{#1\selectfont}}
+
+%% Letra para el título del reporte.
+\def\LetraTitReporte#1{\gdef\@LetraTitReporte{#1\selectfont}}
+
+%% Letra para los encabezados de las páginas en el modo reporte.
+\def\LetraEncReporte#1{\gdef\@LetraEncReporte{#1\selectfont}}
+
+%% Letra para el reporte.
+\def\LetraReporte#1{\gdef\@LetraReporte{#1\selectfont}}
+
+%% Comando para incluir la firma escaneada en el sitio donde va la línea de la firma del emisor.
+\NewDocumentCommand{\FirmaFactura}{m O{0pt} O{0pt}}{% \FirmaFactura{imagen}[x-corr][y-corr]
+ \if@factura
+ \RequirePackage{graphicx}%
+ \ifx&#2&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi
+ \ifx&#3&\else\setlength{\@FirmaFacturaYcorr}{#3}\fi
+ \savebox{\@CajaFirmaEmisor}{#1}%
+ \if@reporte
+ \expandafter\AtBeginDocument
+ \else
+ \expandafter\AtEndDocument
+ \fi
+ {%
+ \begin{textblock*}{\@TamLineaFirmas}%
+ (\textwidth+\oddsidemargin+1in-\@TamLineaFirmas/2-\wd\@CajaFirmaEmisor/2-\@PosFirmasXdos+\@FirmaFacturaXcorr,\@PosFirmasY-\ht\@CajaFirmaEmisor-\dp\@CajaFirmaEmisor+\@FirmaFacturaYcorr)%
+ \usebox{\@CajaFirmaEmisor}%
+ \end{textblock*}}
+ \fi}
+
+\let\Firma\FirmaFactura
+
+\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]
+ \renewcommand{\baselinestretch}{1}\selectfont
+ \newif\if@firma@dibujo
+ \newbox{\TextoFirma}%
+ \newbox{\DibujoFirma}%
+ \ifx&#1&\else\savebox{\DibujoFirma}{#1}\@firma@dibujotrue\fi
+ \ifx&#2&\else\setlength{\@FirmaReporteXcorr}{#2}\fi
+ \ifx&#3&\else\setlength{\@FirmaReporteYcorr}{#3}\fi
+ \savebox{\TextoFirma}{\pbox[t]{\linewidth}{#4}}%
+ \ifx&#5&\setlength{\@FirmaReporteTextPos}{2cm}\else\setlength{\@FirmaReporteTextPos}{#5}\fi
+ \ifx&#6&\setlength{\@FirmaReporteTamLinea}{1.5cm}\else\setlength{\@FirmaReporteTamLinea}{#6}\fi
+ \@LetraFirmas
+ \if@firma@dibujo
+ \newlength{\@FirmaReporteoddeven}%
+ \setlength{\@FirmaReporteFirmaPos}{\zposy{Firma@zref@PosY}sp}%
+ \fi
+ \ifdim\wd\DibujoFirma>\wd\TextoFirma
+ \setlength{\@FirmaReporteTamLinea}{\@FirmaReporteTamLinea+\wd\DibujoFirma}%
+ \else
+ \setlength{\@FirmaReporteTamLinea}{\@FirmaReporteTamLinea+\wd\TextoFirma}%
+ \fi
+ \par
+ \vspace*{\ht\DibujoFirma}%
+ \vspace*{\dp\DibujoFirma}%
+ \hfill
+ \parbox{\@FirmaReporteTamLinea}{%
+ \if@firma@dibujo\zsaveposy{Firma@zref@PosY}\fi
+ \rule{\@FirmaReporteTamLinea}{\@EspesorLineaFirmas}\\
+ \centering{\usebox{\TextoFirma}}}%
+ \hspace*{\@FirmaReporteTextPos}\par
+ \if@firma@dibujo
+ \mbox{}%
+ \par
+ \ifodd\c@page
+ \setlength{\@FirmaReporteoddeven}{\oddsidemargin}%
+ \else
+ \setlength{\@FirmaReporteoddeven}{\evensidemargin}%
+ \fi
+ \begin{textblock*}{\@FirmaReporteTamLinea}
+ (\textwidth+\@FirmaReporteoddeven+1in-0.5\@FirmaReporteTamLinea-0.5\wd\DibujoFirma-\@FirmaReporteTextPos+\@FirmaReporteXcorr,
+ \paperheight-\@FirmaReporteFirmaPos-\ht\DibujoFirma-\dp\DibujoFirma+\@FirmaReporteYcorr)
+ \noindent\usebox{\DibujoFirma}%
+ \end{textblock*}
+ \fi}
+
+%% Con \FondoFactura le damos el nombre del archivo que contiene el formato de la factura, por ejemplo para compilaciones con 'prefactura', 'cotizacion' o para incluir una imagen de fondo como ``marca de agua''.
+\newcommand{\FondoFactura}[1]{%
+ \if@factura
+ \RequirePackage{graphicx}%
+ \@fondofacturatrue
+ \gdef\@FondoFactura{#1}%
+ \fi}
+
+\let\Fondo\FondoFactura
+
+%% Con \FondoReporte le damos el nombre del archivo que contiene el formato del reporte. Existen dos posibilidades: que dicho fondo salga en todas las páginas o sólo en la primera.
+\NewDocumentCommand{\FondoReporte}{s m}{%
+ \if@reporte
+ \@fondoreportetrue
+ \RequirePackage{graphicx}%
+ \gdef\@FondoReporte{#2}%
+ \IfBooleanT{#1}{\@fondoreportestartrue}% Con * sale en todas las páginas; sin * sale sólo en la primera página.
+ \fi}
+
+%% El título para el reporte.
+\NewDocumentCommand{\TituloReporte}{s m}{%
+ \gdef\@TituloReporte{#2}%
+ \IfBooleanTF{#1}{% Con '*' sale el título salga en el estilo de la página. Sin * no sale allí.
+ \gdef\@EstiloPag{\let\\\relax\@EstiloPagTitulo}}%
+ {\let\@EstiloPag\@EstiloPagNoTitulo}}
+
+\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{\@EspesorLineaFirmas}
+\newlength{\@EspesorLineaEncabez}
+\newlength{\@EspesorLineaDescrip}
+\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{\@SeparaInternaEncabez}
+\newlength{\@SeparaInternaDescrip}
+\newlength{\@SeparaElementos}
+\newlength{\@SeparaMinTotales}
+\newlength{\@SeparaFilas}
+\newlength{\@InicioRep}
+\newlength{\@FirmaFacturaXcorr}
+\newlength{\@FirmaFacturaYcorr}
+\newlength{\@FirmaReporteXcorr}
+\newlength{\@FirmaReporteYcorr}
+\newlength{\@FirmaReporteTextPos}
+\newlength{\@FirmaReporteFirmaPos}
+\newlength{\@FirmaReporteTamLinea}
+
+%% Cajas para uso interno.
+\newbox{\@CajaDatos}
+\newbox{\@CajaResumen}
+\newbox{\@CajaFirmaEmisor}
+\newbox{\@CajaFirmas}
+\newbox{\@CajaFecha}
+\newbox{\@CajaDenom}
+\newbox{\@CajaControl}
+\newbox{\@CajaCond}
+\newbox{\@CajaEspacioVacio}
+
+%% Contador para uso interno: '1' cuando hay IVA R o IVA A, y '2' cuando hay ambos.
+\newcounter{IVANoGeneral}
+
+\input{factura.def}% Cargamos los valores predeterminados.
+
+%% \@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.
+\AtBeginDocument{\expandafter\setlength{\@SepTotales}{\the\@SeparaMinTotales plus 1fill}}
\if@todosiva
\@BIRtrue
@@ -241,601 +626,960 @@ República Bolivariana de Venezuela.]
\@Gtrue
\fi
+\if@csv% Abre el archivo csv.
+ \newwrite\csv
+ \immediate\openout\csv=\jobname.csv
+\fi
+
\if@spanish
\RequirePackage[spanish]{babel}% Babel en castellano.
\RequirePackage[T1]{fontenc}% Codificación T1 para las tipografías.
+ \RequirePackage[utf8]{inputenc}% UTF-8.
+ \IfFileExists{lmodern.sty}{\RequirePackage{lmodern}}{}
\fi
-\if@linea
- \RequirePackage{tikz}% Para la línea.
- \RequirePackage{zref-savepos}% También determinar las coordenadas de la línea.
- \AtEndDocument{\@Linea}
-\fi
-
-\if@prefactura
- \@marcotrue
- \RequirePackage{graphicx}
- \AtEndDocument{\@MARCO\@NUMCONTROL}
- \@denomtrue
-\fi
-
-\if@presupuesto
- \@marcotrue
- \RequirePackage{graphicx}
- \AtEndDocument{\@MARCO}
- \@denomtrue
- \def\@Denominacion{\@@DenomPresupuesto}
+\if@relleno
+ \RequirePackage{zref-savepos}% Para guardar la posición en 'Y'.
\fi
-\AtBeginDocument{\@Encabezado}
-
-\if@denom% Coloca el texto de la denominación.
- \AtEndDocument{\@DENOMINACION}
+\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@confirmas% Coloca las firmas.
- \AtEndDocument{\@FIRMAS}
-\fi
+%% Comando para escribir el encabezado en el modo de factura.
+\newcommand\@EncabezadoFactura{%
+ \ifdefvoid{\@Resumen}{\@EscribeDatos}{\@EscribeDatosResumen}%
+ \vspace*{\@SeparaElementos}%
+ \if@relleno\else\vfill\fi}
-\if@concondiciones% Coloca las condiciones de pago.
- \AtEndDocument{\@CONDICIONES}
-\fi
-
-\if@csv% Abre el archivo csv.
- \newwrite\csv
- \immediate\openout\csv=\jobname.csv
-\fi
+%% Comando para escribir el encabezado en el modo de reporte.
+\newcommand\@EncabezadoReporte{%
+ \vspace*{-\topskip}% TODO: ¿se coloca o no?
+ \vspace*{\@InicioRep}%
+ \@EscribeDatosReporte
+ \@LetraReporte}
-\AtBeginDocument{\AtEndDocument{%
- % La factura no puede ocupar más que una página.
- \clearpage\ifthenelse{\value{page}>2}{\ClassError{factura}{** La factura ocupa más que una página **}{}}{\relax}
- % Escribimos los totales al archivo csv.
- \if@csv%
- \if@Exento \write\csv{Totales: \space\space \@@BIE: \@Moneda \BIE} \fi%
- \if@BIR%
- \write\csv{Totales: \space\space \@@BIR: \@Moneda \BIR}%
- \write\csv{Totales: \space\space\space \@@AlicuotaR: \@Moneda \AlicuotaR}%
- \fi%
- \write\csv{Totales: \space\space \@@BIG: \@Moneda \BIG}%
- \write\csv{Totales: \space\space\space \@@AlicuotaG: \@Moneda \AlicuotaG}%
- \if@BIA%
- \write\csv{Totales: \space\space \@@BIA: \@Moneda \BIA}%
- \write\csv{Totales: \space\space\space \@@AlicuotaA: \@Moneda \AlicuotaA}%
- \fi%
- \write\csv{Totales: \space\space\space \@@Total: \@Moneda \Total}%
- \closeout\csv%
- \fi}}
-
-% Comando para incluir la firma escaneada en el puesto donde va la línea de la firma del emisor.
-% El primer parámetro es la posición en X, el segundo parámetro es la posición en Y, y
-% el tercer parámeto deberá ser la inclusión del gráfico.
-\newcommand{\Firma}[3]{%
- \RequirePackage{graphicx}%
- \def\tempX{#1}%
- \def\tempY{#2}%
- \ifthenelse{\equal{\tempX}{\empty}}{\def\tempX{0pt}}{}%
- \ifthenelse{\equal{\tempY}{\empty}}{\def\tempY{0pt}}{}%
- \savebox{\CajaFirma}{#3}%
- \AtEndDocument{%
- \begin{textblock*}{\TamLineaFirmas}(\textwidth+\oddsidemargin+1in-\TamLineaFirmas/2-\wd\CajaFirma/2-\XFinFirmas+\tempX,\YInicioFirmas-\ht\CajaFirma-\dp\CajaFirma+\tempY)%
- \usebox{\CajaFirma}%
- \end{textblock*}}}%
-
-\newcommand{\cliente}[1]{\input{#1.def}}% Para cada cliente se puede tener un archivo .def con su nombre y alguna macro cargada. Ese archivo lo ponemos incluir con '\cliente' en lugar de usar \input o \include, y la extensión deberá ser .def.
-
-% 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).
-% http://tex.stackexchange.com/questions/108565/know-the-cell-width-with-tabular-or-include-a-paragraph-box-without-specifying
+%% 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).
+%% 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}%
+ \expandafter\@FacturaAuxCmd\expandafter{\BODY}%
+ \if@linea\@DibujaLinea\fi
+ \ifnum\value{page}=1\else\ClassError{factura}{** La factura ocupa mas que una pagina **}{}\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]
-{%
- \ifx\undefined\Total\relax\else\ClassError{factura}{** Parece ya haber un renglón de montos **}{}\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@relleno
+ \setlength{\@EspacioVacioInicial}{\zposy{EspacioVacioInicial}sp}%
+ \setlength{\@EspacioVacioFinal}{\zposy{EspacioVacioFinal}sp}%
+ \global\@EspacioVacioInicial=\@EspacioVacioInicial% ¿por qué tendré que globalizarlas?
+ \global\@EspacioVacioFinal=\@EspacioVacioFinal
+ \savebox{\@CajaEspacioVacio}{\parbox[b][\@EspacioVacioInicial-\@EspacioVacioFinal]{1pt}{\mbox{}}}%
+ \ifdim \ht\@CajaEspacioVacio=0pt \global\@lineafalse \fi
+ \fi
+ \ifx\undefined\Total\relax\else\ClassError{factura}{** Parece ya haber un renglón de montos **}{}\fi
%
- \renewcommand{\tabularxcolumn}[1]{m{##1}}% TODO: Alineación vertical cuando hay más de una línea.
% http://tex.stackexchange.com/questions/111203/tabularx-bottom-alignment-on-r-or-l-columns-when-x-column-wraps
+ \renewcommand{\tabularxcolumn}[1]{m{##1}}% TODO: Alineación vertical cuando hay más de una línea.
% Comando para poner en cero los contadores de los totales porque el ambiente de la factura se evalúa tres veces y los totales se sumarían todos tres veces.
\newcommand{\@ZERO}{%
- \FPset\BIG{0}\global\let\BIG\BIG%
- \FPset\BIR{0}\global\let\BIR\BIR%
- \FPset\BIA{0}\global\let\BIA\BIA%
- \FPset\BIE{0}\global\let\BIE\BIE%
- \FPset\AlicuotaG{0}\global\let\AlicuotaG\AlicuotaG%
- \FPset\AlicuotaR{0}\global\let\AlicuotaR\AlicuotaR%
- \FPset\AlicuotaA{0}\global\let\AlicuotaA\AlicuotaA%
- }%
+ \FPset\BIG{0}\global\let\BIG\BIG
+ \FPset\BIR{0}\global\let\BIR\BIR
+ \FPset\BIA{0}\global\let\BIA\BIA
+ \FPset\BIE{0}\global\let\BIE\BIE
+ \FPset\SubtE{0}\global\let\SubtE\SubtE
+ \FPset\SubtG{0}\global\let\SubtG\SubtG
+ \FPset\SubtR{0}\global\let\SubtR\SubtR
+ \FPset\SubtA{0}\global\let\SubtA\SubtA
+ \FPset\DescE{0}\global\let\DescE\DescE
+ \FPset\DescG{0}\global\let\DescG\DescG
+ \FPset\DescR{0}\global\let\DescR\DescR
+ \FPset\DescA{0}\global\let\DescA\DescA
+ \FPset\AlicuotaG{0}\global\let\AlicuotaG\AlicuotaG
+ \FPset\AlicuotaR{0}\global\let\AlicuotaR\AlicuotaR
+ \FPset\AlicuotaA{0}\global\let\AlicuotaA\AlicuotaA}%
%
% Escribe la letra que designa al tipo de impuesto que aplica al ítem.
- \newcommand\EscribeTipoDeImpuesto[1]{%
- \if@G\letratipoiva\ \fi% El espacio antes de la letra.
+ \newcommand\@EscribeTipoDeImpuesto[1]{%
+ \if@G\@LetraTipoIVA\ \fi% El espacio antes de la letra.
\ifthenelse{\equal{##1}{E}}{\@DenomAlicuotaE\hfill}{}% Si está exento, escribimos '(E)' al lado del p/t también.
\ifthenelse{\equal{##1}{R}}{\@DenomAlicuotaR\hfill}{}% Si tiene IVA reducido, escribimos 'R'.
\ifthenelse{\equal{##1}{A}}{\@DenomAlicuotaA\hfill}{}% Si tiene IVA adicional, escribimos 'A'.
\ifthenelse{\equal{##1}{G}}{\if@G\@DenomAlicuotaG\hfill\fi}{}% Una 'G' para IVA general si hace falta.
- \if@G\ \fi} % El espacio entre el tipo de impuesto y el precio.
+ \if@G\ \fi}% El espacio entre el tipo de impuesto y el precio.
%
% Suma el ítem actual a la base imponible acumulada.
\newcommand{\@TotalizaItem}[1]{%
- \expandafter\FPupn\csname BI##1\endcsname{\PrecioT{} \expandafter\csname BI##1\endcsname{} + 2 round}% Agregamos a la base imponible.
- \global\expandafter\let\csname BI##1\expandafter\endcsname\csname BI##1\endcsname%
+ \expandafter\FPupn\csname Subt##1\endcsname{\PrecioT{} \expandafter\csname Subt##1\endcsname{} + \@DigitosMoneda{} round}% Agregamos al subtotal.
+ \global\expandafter\let\csname Subt##1\expandafter\endcsname\csname Subt##1\endcsname
+ \expandafter\FPupn\csname Desc##1\endcsname{\PrecioT{} \expandafter\csname @Descuento##1Factor\endcsname{} * \expandafter\csname Desc##1\endcsname{} + \@DigitosMoneda{} round}% Agregamos al descuento.
+ \global\expandafter\let\csname Desc##1\expandafter\endcsname\csname Desc##1\endcsname
+ \expandafter\FPupn\csname BI##1\endcsname{\PrecioT{} \expandafter\csname @Descuento##1Factor\endcsname{} * \PrecioT{} - \expandafter\csname BI##1\endcsname{} + \@DigitosMoneda{} round}% Agregamos a la base imponible.
+ \global\expandafter\let\csname BI##1\expandafter\endcsname\csname BI##1\endcsname
% Si es un ítem exento, no hay alícuota a agregar.
\ifthenelse{\equal{##1}{E}}{}{%
- \expandafter\FPupn\csname Alicuota##1\endcsname{\PrecioT{} \expandafter\csname @Impuesto##1\endcsname{} * \expandafter\csname Alicuota##1\endcsname{} + 2 round}% Agregamos al IVA.
+ \expandafter\FPupn\csname Alicuota##1\endcsname{\PrecioT{} \expandafter\csname @Descuento##1Factor\endcsname{} * \PrecioT{} - \expandafter\csname @Impuesto##1\endcsname{} * \expandafter\csname Alicuota##1\endcsname{} + \@DigitosMoneda{} round}% Agregamos al IVA.
\global\expandafter\let\csname Alicuota##1\expandafter\endcsname\csname Alicuota##1\endcsname}}%
%
% Comando para sumar todos los totales y general el total general.
\newcommand{\@TotalTotal}{%
- \FPupn{\Total}{\BIE{} \BIR{} + \BIG{} + \BIA{} + \AlicuotaR{} + \AlicuotaG{} + \AlicuotaA{} + 2 round}%
+ \FPupn{\Total}{\BIE{} \BIR{} + \BIG{} + \BIA{} + \AlicuotaR{} + \AlicuotaG{} + \AlicuotaA{} + \@DigitosMoneda{} round}%
\global\let\Total\Total}%
%
% Presentación de totales en modo de columnas.
+ \newcommand{\@EscribeTotalCol}[1]{%
+ \csname
+ if@Desc##1\endcsname%
+ \@EscribeTotalColSubt{##1}%
+ \@EscribeTotalColDesc{##1}%
+ \if@ivaexplicito\@EscribeTotalColBI{##1}\fi
+ \else
+ \if@ivaexplicito\@EscribeTotalColBI{##1}\fi
+ \fi}%
+ % Forma agupada para la presentación de totales en modo de columnas.
+ \newcommand{\@EscribeTotalColAgrupado}{%
+ \if@Exento\if@DescE\@EscribeTotalColSubt{E}\fi\fi
+ \if@BIR\if@DescR\@EscribeTotalColSubt{R}\fi\fi
+ \if@DescG\@EscribeTotalColSubt{G}\fi
+ \if@BIA\if@DescA\@EscribeTotalColSubt{A}\fi\fi
+ \if@Exento\if@DescE\@EscribeTotalColDesc{E}\fi\fi
+ \if@BIR\if@DescR\@EscribeTotalColDesc{R}\fi\fi
+ \if@DescG\@EscribeTotalColDesc{G}\fi
+ \if@BIA\if@DescA\@EscribeTotalColDesc{A}\fi\fi
+ \if@Exento\@EscribeTotalColBI{E}\fi
+ \if@BIR\@EscribeTotalColBI{R}\fi
+ \@EscribeTotalColBI{G}%
+ \if@BIA\@EscribeTotalColBI{A}\fi
+ \if@ivaexplicito
+ \if@BIR\@EscribeTotalColAlicuota{R}\fi
+ \@EscribeTotalColAlicuota{G}%
+ \if@BIA\@EscribeTotalColAlicuota{A}\fi
+ \fi}
+ %
\newcommand{\@EscribeTotalColBI}[1]{%
- \ifbool{Separado}{\multicolumn{2}{|c}{}&\multicolumn{1}{r}}{&&}%
- {\ \letratittotales \csname @@BI##1\endcsname%
+ {\ \@LetraTitTotales \csname @@BI##1\endcsname
\ifthenelse{\equal{##1}{G}}{%
% Colocamos el porcentaje explícito en la base imponible general si es requerido.
- \if@G\ \hfill(\@AlicuotaGPorc\%)\else\mbox{}\fi}
+ \if@G\ \hfill(\@AlicuotaGPorc\%)\else\mbox{}\fi}%
{\hfill\ifthenelse{\equal{##1}{E}}{}{\ (\csname @Alicuota##1Porc\endcsname\%)}}}%
- & \letratotales\numprint{\csname BI##1\endcsname} \\}%
+ & \@LetraNumTotales\numprint{\csname BI##1\endcsname} \\}%
%
\newcommand{\@EscribeTotalColAlicuota}[1]{%
- \ifbool{Separado}{\multicolumn{2}{|c}{}&\multicolumn{1}{r}}{&&}%
- {\ \letratittotales \csname @@Alicuota##1\endcsname\ \hfill (\csname @Alicuota##1Porc\endcsname\%)}%
- & \letratotales\numprint{\csname Alicuota##1\endcsname} \\}%
+ {\ \@LetraTitTotales \csname @@Alicuota##1\endcsname\ \hfill (\csname @Alicuota##1Porc\endcsname\%)}%
+ & \@LetraNumTotales\numprint{\csname Alicuota##1\endcsname} \\}%
+ %
+ \newcommand{\@EscribeTotalColSubt}[1]{%
+ {\ \@LetraTitTotales \csname @@Subtotal##1\endcsname}%
+ & \@LetraNumTotales\numprint{\csname Subt##1\endcsname} \\}%
+ %
+ \newcommand{\@EscribeTotalColDesc}[1]{%
+ {\ \@LetraTitTotales \csname @@Descuento##1\endcsname \ \hfill (\csname @Descuento##1Porc\endcsname\%)}%
+ & \@LetraNumTotales\numprint{\csname Desc##1\endcsname} \\}%
%
% Presentación de totales en modo filas.
\newcommand{\@EscribeTotalFilasBI}[1]{%
\@EscribeTotalFilasBIizq{##1}: & \@EscribeTotalFilasBIder{##1}}%
%
+ \newcommand{\@EscribeTotalFilasAlicuota}[1]{%
+ \@EscribeTotalFilasAlicuotaizq{##1}: & \@EscribeTotalFilasAlicuotader{##1}}%
+ %
+ \newcommand{\@EscribeTotalFilasDesc}[1]{%
+ \@EscribeTotalFilasDescizq{##1}: & \@EscribeTotalFilasDescder{##1}}%
+ %
\newcommand{\@EscribeTotalFilasSoloBI}[1]{%
- {\letratittotales\@EscribeTotalFilasBIizq{##1}:} {\letratotales\@EscribeTotalFilasBIder{##1}}}%
+ {\@LetraTitTotales\@EscribeTotalFilasBIizq{##1}:} {\@LetraNumTotales\@EscribeTotalFilasBIder{##1}}}%
+ %
+ \newcommand{\@EscribeTotalFilasSoloDesc}[1]{%
+ {\@LetraTitTotales\@EscribeTotalFilasDescizq{##1}:} {\@LetraNumTotales\@EscribeTotalFilasDescder{##1}}}%
+ %
+ \newcommand{\@EscribeTotalFilasSoloAlicuota}[1]{%
+ {\@LetraTitTotales\@EscribeTotalFilasAlicuotaizq{##1}:} {\@LetraNumTotales\@EscribeTotalFilasAlicuotader{##1}}}%
%
\newcommand{\@EscribeTotalFilasBIizq}[1]{%
- \letratittotales\csname @@BI##1\endcsname%
- \ifthenelse{\equal{##1}{G}}%
+ \@LetraTitTotales\csname @@BI##1\endcsname
+ \ifthenelse{\equal{##1}{G}}
{\if@G \ (\@AlicuotaGPorc\%)\fi}% Si hay otra B.I. que no sea general, colocamos el porcentaje explícito en la general.
{\ifthenelse{\equal{##1}{E}}{}{\ (\csname @Alicuota##1Porc\endcsname\%)}}}%
%
\newcommand{\@EscribeTotalFilasBIder}[1]{%
- \letratotales\numprint{\csname BI##1\endcsname}}%
- %
- \newcommand{\@EscribeTotalFilasAlicuota}[1]{%
- \@EscribeTotalFilasAlicuotaizq{##1}: & \@EscribeTotalFilasAlicuotader{##1}}%
- %
- \newcommand{\@EscribeTotalFilasSoloAlicuota}[1]{%
- {\letratittotales\@EscribeTotalFilasAlicuotaizq{##1}:} {\letratotales\@EscribeTotalFilasAlicuotader{##1}}}%
+ \@LetraNumTotales\numprint{\csname BI##1\endcsname}}%
%
\newcommand{\@EscribeTotalFilasAlicuotaizq}[1]{%
- \letratittotales\csname @@Alicuota##1\endcsname \ (\csname @Alicuota##1Porc\endcsname\%)}%
+ \@LetraTitTotales\csname @@Alicuota##1\endcsname \ (\csname @Alicuota##1Porc\endcsname\%)}%
%
\newcommand{\@EscribeTotalFilasAlicuotader}[1]{%
- \letratotales\numprint{\csname Alicuota##1\endcsname}}%
+ \@LetraNumTotales\numprint{\csname Alicuota##1\endcsname}}%
+ %
+ \newcommand{\@EscribeTotalFilasDescizq}[1]{%
+ \@LetraTitTotales\csname @@Descuento##1\endcsname \ (\csname @Descuento##1Porc\endcsname\%)}%
+ %
+ \newcommand{\@EscribeTotalFilasDescder}[1]{%
+ \@LetraNumTotales\numprint{\csname Desc##1\endcsname}}%
%
\newcommand{\@EscribeTotalFilas}[2][]{%
\@EscribeTotalFilasAuxTabla{%
\csname @EscribeTotalFilasBI\endcsname{##2}%
\ifthenelse{\equal{##2}{E}}{%
\ifthenelse{\equal{##1}{T}}{%
- \\%
- \letratittotal\@@Total: & \letratotal\numprint{\Total}}{}}%
- {\\%
+ \\[\@SeparaFilas]%
+ \@LetraTitTotal\@@Total: & \@LetraNumTotal\numprint{\Total}}{}}%
+ {\\[\@SeparaFilas]%
\csname @EscribeTotalFilasAlicuota\endcsname{##2}}}}%
%
\newcommand{\@GeneraCajasTotalesFilas}{%
- \if@Exento%
- \newbox{\CajaBIE}\newbox{\CajaBIET}%
- \savebox{\CajaBIE}{\@EscribeTotalFilasSoloBI{E}}%
- \savebox{\CajaBIET}{\@EscribeTotalFilas[T]{E}}%
- \fi%
- \if@BIR%
+ \if@Exento
+ \newbox{\@CajaBIE}\newbox{\@CajaBIET}%
+ \savebox{\@CajaBIE}{\@EscribeTotalFilasSoloBI{E}}%
+ \savebox{\@CajaBIET}{\@EscribeTotalFilas[T]{E}}%
+ \fi
+ \if@BIR
\addtocounter{IVANoGeneral}{1}%
- \newbox{\CajaBIR}\newbox{\CajaAliR}\newbox{\CajaBIAliR}%
- \savebox{\CajaBIR}{\@EscribeTotalFilasSoloBI{R}}%
- \savebox{\CajaAliR}{\@EscribeTotalFilasSoloAlicuota{R}}%
- \savebox{\CajaBIAliR}{\@EscribeTotalFilas{R}}%
- \fi%
- \newbox{\CajaBIG}\newbox{\CajaAliG}\newbox{\CajaBIAliG}%
- \savebox{\CajaBIG}{\@EscribeTotalFilasSoloBI{G}}%
- \savebox{\CajaAliG}{\@EscribeTotalFilasSoloAlicuota{G}}%
- \savebox{\CajaBIAliG}{\@EscribeTotalFilas{G}}%
- \if@BIA%
+ \newbox{\@CajaBIR}\newbox{\@CajaAliR}\newbox{\@CajaBIAliR}%
+ \savebox{\@CajaBIR}{\@EscribeTotalFilasSoloBI{R}}%
+ \savebox{\@CajaAliR}{\@EscribeTotalFilasSoloAlicuota{R}}%
+ \savebox{\@CajaBIAliR}{\@EscribeTotalFilas{R}}%
+ \fi
+ \newbox{\@CajaBIG}\newbox{\@CajaAliG}\newbox{\@CajaBIAliG}%
+ \savebox{\@CajaBIG}{\@EscribeTotalFilasSoloBI{G}}%
+ \savebox{\@CajaAliG}{\@EscribeTotalFilasSoloAlicuota{G}}%
+ \savebox{\@CajaBIAliG}{\@EscribeTotalFilas{G}}%
+ \if@BIA
\addtocounter{IVANoGeneral}{1}%
- \newbox{\CajaBIA}\newbox{\CajaAliA}\newbox{\CajaBIAliA}%
- \savebox{\CajaBIA}{\@EscribeTotalFilasSoloBI{A}}%
- \savebox{\CajaAliA}{\@EscribeTotalFilasSoloAlicuota{A}}%
- \savebox{\CajaBIAliA}{\@EscribeTotalFilas{A}}%
- \fi}%
+ \newbox{\@CajaBIA}\newbox{\@CajaAliA}\newbox{\@CajaBIAliA}%
+ \savebox{\@CajaBIA}{\@EscribeTotalFilasSoloBI{A}}%
+ \savebox{\@CajaAliA}{\@EscribeTotalFilasSoloAlicuota{A}}%
+ \savebox{\@CajaBIAliA}{\@EscribeTotalFilas{A}}%
+ \fi}
%
\newcommand{\@EscribeTotalesFilasGET}{%
- \hspace*{\SepTotales}\usebox{\CajaBIG}%
- \hspace*{\SepTotales}\usebox{\CajaAliG}%
- \if@Exento\hspace*{\SepTotales}\usebox{\CajaBIE}\fi%
- \hspace*{\SepTotales}\usebox{\CajaTotal}%
- \if@centrado\hspace*{\SepTotales}\fi}%
+ \hspace*{\@SepTotales}\usebox{\@CajaBIG}%
+ \hspace*{\@SepTotales}\usebox{\@CajaAliG}%
+ \if@Exento\hspace*{\@SepTotales}\usebox{\@CajaBIE}\fi
+ \hspace*{\@SepTotales}\usebox{\@CajaTotal}%
+ \if@centrado\hspace*{\@SepTotales}\fi}
%
\newcommand{\@EscribeTotalesFilasGxET}{%
- \if@BIR\hspace*{\SepTotales}\usebox{\CajaBIAliR}\fi%
- \hspace*{\SepTotales}\usebox{\CajaBIAliG}%
- \if@BIA\hspace*{\SepTotales}\usebox{\CajaBIAliA}\fi%
- \hspace*{\SepTotales}\if@Exento\usebox{\CajaBIET}\else\usebox{\CajaTotal}\fi%
- \if@centrado\hspace*{\SepTotales}\fi}%
+ \if@BIR\hspace*{\@SepTotales}\usebox{\@CajaBIAliR}\fi
+ \hspace*{\@SepTotales}\usebox{\@CajaBIAliG}%
+ \if@BIA\hspace*{\@SepTotales}\usebox{\@CajaBIAliA}\fi
+ \hspace*{\@SepTotales}\if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
+ \if@centrado\hspace*{\@SepTotales}\fi}%
%
\newcommand{\@EscribeTotalesFilasRGA}{%
- \hspace*{\SepTotales}\usebox{\CajaBIAliR}%
- \hspace*{\SepTotales}\usebox{\CajaBIAliG}%
- \hspace*{\SepTotales}\usebox{\CajaBIAliA}%
- \hspace*{\SepTotales}}%
+ \hspace*{\@SepTotales}\usebox{\@CajaBIAliR}%
+ \hspace*{\@SepTotales}\usebox{\@CajaBIAliG}%
+ \hspace*{\@SepTotales}\usebox{\@CajaBIAliA}%
+ \hspace*{\@SepTotales}}%
%
\newcommand{\@EscribeTotalesFilasRGAET}{%
- \@EscribeTotalesFilasRGA%
- \if@Exento\usebox{\CajaBIET}\else\usebox{\CajaTotal}\fi%
- \if@centrado\hspace*{\SepTotales}\fi}%
+ \@EscribeTotalesFilasRGA
+ \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
+ \if@centrado\hspace*{\@SepTotales}\fi}%
%
\newcommand{\@EscribeTotalFilasAuxTabla}[1]{%
- \begin{tabular}{@{}l@{\extracolsep{4pt}}r@{}}%
- ##1%
+ \begin{tabular}[b]{@{}l@{\extracolsep{1ex}}r@{}}% ¡Esta tabla tiene que abrir hacia abajo para que la separación entre las filas se pueda colocar con \@SeparaFilas!
+ ##1
\end{tabular}}%
%
+ % Comando que graba la posición en X para el nodo A de la línea.
+ \newcommand{\@LineaNodoACoordX}{\hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}}%
+ % Comando que graba la posición en X para el nodo B de la línea.
+ \newcommand{\@LineaNodoBCoordX}{\hspace*{-\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{\tabcolsep}}%
+ %
% Comando interno para el ítem.
- \newcommand{\@ITEM}[4]{% 1. [R|G|A|E]; 2. cantidad; 3. descripción; 4. p/u.
+ \newcommand{\@ITEM}[5]{% 1. [R|G|A|E]; 2. cantidad; 3. descripción; 4. p/u; 5. dcto.
+ % Calculamos.
+ \FPupn\PrecioU{##4 \@DigitosMoneda{} round}%
+ \ifx\\##5\\\FPset\Dcto{0}\else\FPupn\Dcto{##5 \@DigitosPorc{} round clip}\fi% Fijamos en 0 el descuento si no se especifica.
+ \FPupn\PrecioT{100 \Dcto{} 100 - / ##2 * ##4 * \@DigitosMoneda{} round}%
+ \global\let\PrecioU\PrecioU
+ \global\let\Dcto\Dcto
+ \global\let\PrecioT\PrecioT
+ % Primer campo - Acá puede ir la cantidad (cdu) o la descripción (dcu y duc).
\ifbool{SinCantidad}{}{%
- \letranumeros\numprint{##2}}% Se escribe la cantidad.
- &%
- ##3% Se escribe la descripción.
- &%
- \FPupn\PrecioU{##4 2 round}%
- % Advertimos si el precio unitario tiene tres decimales.
- \FPifeq\PrecioU{##4}\else\ClassWarning{factura}{** Se está introduciendo un precio con tres decimales: (##3 -> ##4) **}{}\fi%
+ \ifbool{PrimeroDesc}
+ {##3% dcu y duc.
+ \if@impdesc\hfill\@EscribeTipoDeImpuesto{##1}\fi}% dcu y duc.
+ {\@LetraNumeros\numprint{##2}}}% cdu.
+ &
+ % Segundo campo - Acá puede ir la descripción (cdu), la cantidad (dcu), o el precio unitario (duc).
+ \ifbool{PrimeroDesc}{%
+ \if@dcu
+ \@LetraNumeros\numprint{##2}% dcu.
+ \else
+ \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi% duc.
+ \@LetraNumeros\numprint{\PrecioU}% duc.
+ \fi}%
+ {##3% cdu.
+ \if@impdesc\hfill\@EscribeTipoDeImpuesto{##1}\fi}% cdu.
+ &
+ % Tercer 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) **}{}\fi% Advertimos cuando el precio unitario tiene más de dos decimales.
\ifbool{SinCantidad}{}{%
- {\EscribeTipoDeImpuesto{##1}}%
- \letranumeros\numprint{\PrecioU}}%
- &%
- {\EscribeTipoDeImpuesto{##1}}%
- \FPupn\PrecioT{##2 ##4 * 2 round}%
- \global\let\PrecioT\PrecioT%
- \letranumeros\numprint{\PrecioT}%
- \ifbool{SinCantidad}
- % Escribimos al .log el ítem.
- {\if@csv\write\csv{"##3","##1","\PrecioT"}\fi}%
- {\if@csv\write\csv{"##2","##3","##1 ##4","##1 \PrecioT"}\fi}%
+ \if@duc
+ % El tercer campo está alineado a la derecha, entonces tenemos que centrar los números de esta forma.
+ % ¡Está alineado a la derecha para que la totalización no se descuadre!
+ \mbox{}\hfill\@LetraNumeros\numprint{##2}\hfill\mbox{}% duc.
+ \else
+ \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi% dcu y cdu.
+ \@LetraNumeros\numprint{\PrecioU}% dcu y cdu.
+ \fi}%
+ &
+ % Cuatro campo - Descuento.
+ \ifbool{Descuentos}{\FPifeq\Dcto{0}\else\@LetraNumeros\numprint{\Dcto}\%\fi}{}%
+ &
+ % Quinto campo - El total.
+ \if@impdesc\else\@EscribeTipoDeImpuesto{##1}\fi%
+ \@LetraNumeros\numprint{\PrecioT}%
+ % Escribimos al csv.
+ \if@csv
+ \ifbool{SinCantidad}
+ {\if@descuentos
+ \immediate\write\csv{"\unexpanded{##3}","##5","\PrecioT","##1"}
+ \else
+ \immediate\write\csv{"\unexpanded{##3}","\PrecioT","##1"}
+ \fi}
+ {\if@cdu
+ \if@descuentos
+ \immediate\write\csv{"##2","\unexpanded{##3}","##4","##5","\PrecioT","##1"}%
+ \else
+ \immediate\write\csv{"##2","\unexpanded{##3}","##4","\PrecioT","##1"}%
+ \fi
+ \fi
+ \if@dcu
+ \if@descuentos
+ \immediate\write\csv{"\unexpanded{##3}","##2","##4","##5","\PrecioT","##1"}%
+ \else
+ \immediate\write\csv{"\unexpanded{##3}","##2","##4","\PrecioT","##1"}%
+ \fi
+ \fi
+ \if@duc
+ \if@descuentos
+ \immediate\write\csv{"\unexpanded{##3}","##4","##2","##5","\PrecioT","##1"}%
+ \else
+ \immediate\write\csv{"\unexpanded{##3}","##4","##2","\PrecioT","##1"}%
+ \fi
+ \fi}%
+ \fi
%
\@TotalizaItem{##1}%
- \\%
+ \\
\if@lineaitem\hline\fi}%
%
\ifbool{SinCantidad}
- {%
- % Ítem normal.
- \newcommand{\Item}[2]{\@ITEM{G}{1}{##1}{##2}}%
- % Ítem con IVA reducido.
- \newcommand{\ItemR}[2]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{##1}{##2}}%
- % Ítem con IVA adicional.
- \newcommand{\ItemA}[2]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{##1}{##2}}%
- % Ítem exento de IVA.
- \newcommand{\ItemE}[2]{\global\@Exentotrue\@ITEM{E}{1}{##1}{##2}}%
- % Ítem sin precio.
- \newcommand{\ItemX}[1]{%
- \if@csv\write\csv{"##1","0"}\fi%
- & ##1 && \hfill ... \hfill\mbox{} \\}}%
- {%
- % Ítem normal.
- \newcommand{\Item}[3]{\@ITEM{G}{##1}{##2}{##3}}%
- % Ítem con IVA reducido.
- \newcommand{\ItemR}[3]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{##1}{##2}{##3}}%
- % Ítem con IVA adicional.
- \newcommand{\ItemA}[3]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{##1}{##2}{##3}}%
- % Ítem exento de IVA.
- \newcommand{\ItemE}[3]{\global\@Exentotrue\@ITEM{E}{##1}{##2}{##3}}%
- % Ítem sin precio.
- \newcommand{\ItemX}[2]{%
- \if@csv\write\csv{"##1","##2","0","0"}\fi%
- \letranumeros\numprint{##1} &%
- ##2 & \hfill ... \hfill\mbox{} & \hfill ... \hfill\mbox{} \\}}%
- % Ya definimos todos los comandos; ahora agregamos el espacio dinámico entre los óvalos y el renglón de la factura.
- \vfill%
- % Este es el tipo de letra que tendrán los items, y en este tipo de letra se define el \baselineskip de toda la factura.
- \letraitems%
+ % Definamos todos los comandos.
+ {% Sin cantidad:
+ \if@descuentos
+ \newcommand{\Item}[3]{\@ITEM{G}{1}{##1}{##2}{##3}}% Ítem normal.
+ \newcommand{\ItemR}[3]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{1}{##1}{##2}{##3}}% Ítem con IVA reducido.
+ \newcommand{\ItemA}[3]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{1}{##1}{##2}{##3}}% Ítem con IVA reducido.
+ \newcommand{\ItemE}[3]{\global\@Exentotrue\@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\@ITEM{E}{1}{##1}{##2}{0}}% Ítem con IVA reducido.
+ \fi
+ \let\ItemG\Item
+ \newcommand{\ItemX}[1]{% Ítem sin precio.
+ \if@csv\immediate\write\csv{"\unexpanded{##1}"}\fi
+ & ##1 && \if@descuentos ... \fi & \hfill ... \hfill\mbox{}\\}}
+ {% Con cantidad:
+ \if@descuentos
+ \newcommand{\Item}[4]{\@ITEM{G}{##1}{##2}{##3}{##4}}% Ítem normal.
+ \newcommand{\ItemR}[4]{\global\@BIRtrue\global\@Gtrue\@ITEM{R}{##1}{##2}{##3}{##4}}% Ítem con IVA reducido.
+ \newcommand{\ItemA}[4]{\global\@BIAtrue\global\@Gtrue\@ITEM{A}{##1}{##2}{##3}{##4}}% Ítem con IVA adicional.
+ \newcommand{\ItemE}[4]{\global\@Exentotrue\@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\@ITEM{E}{##1}{##2}{##3}{0}}% Ítem exento de IVA.
+ \fi
+ \let\ItemG\Item
+ \newcommand{\ItemX}[2]{% Ítem sin precio.
+ \if@cdu
+ \if@csv\immediate\write\csv{"##1","\unexpanded{##2}",""}\fi
+ \@LetraNumeros\numprint{##1} & ##2 & \hfill ... \hfill\mbox{} & \if@descuentos ... \fi & \hfill ... \hfill\mbox{} \\
+ \fi
+ \if@dcu
+ \if@csv\immediate\write\csv{"\unexpanded{##2}","##1",""}\fi
+ ##2 & \@LetraNumeros\numprint{##1} & \hfill ... \hfill\mbox{} & \if@descuentos ... \fi & \hfill ... \hfill\mbox{} \\
+ \fi
+ \if@duc
+ \if@csv\immediate\write\csv{"\unexpanded{##2}","","##1"}\fi
+ ##2 & \hfill ... \hfill\mbox{} & \@LetraNumeros\numprint{##1} & \if@descuentos ... \fi & \hfill ... \hfill\mbox{} \\
+ \fi}}%
+ \@LetraItems% Este es el tipo de letra que tendrán los items, y en este tipo de letra se define el \baselineskip de toda la factura.
\ifbool{SinCantidad}
- {%
+ % Abramos la tabla.
+ {% Sin cantidad:
\ifbool{SinLineasV}
- {\begin{tabularx}{\textwidth}{ l@{\extracolsep{0pt}}Xr r }}
- {\begin{tabularx}{\textwidth}{|l@{\extracolsep{0pt}}Xr|r|}}%
- % Antes, con tabular*:
- % \begin{tabular*}{\textwidth}{|l@{\extracolsep{0pt}}l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}r|r|}%
- \hline%
- \@ZERO%
- \if@csv\write\csv{"\@@Descripcion","\@@Precio (\@Moneda"}\fi%
+ {\ifbool{Descuentos}
+ {\begin{tabularx}{\textwidth}{ l@{\extracolsep{0pt}} X r c r }}
+ {\begin{tabularx}{\textwidth}{ l@{\extracolsep{0pt}} X r r@{\extracolsep{0pt}} r }}}
+ {\ifbool{Descuentos}
+ {\begin{tabularx}{\textwidth}{|l@{\extracolsep{0pt}} X r|c|r|}}%
+ {\begin{tabularx}{\textwidth}{|l@{\extracolsep{0pt}} X r|r@{\extracolsep{0pt}} r|}}}%
+ \hline
+ \@ZERO
+ \if@csv
+ \if@descuentos
+ \immediate\write\csv{"\@@Descripcion","\@@Descuento","\@@Precio \space (\@Moneda)"}
+ \else
+ \immediate\write\csv{"\@@Descripcion","\@@Precio \space (\@Moneda)"}
+ \fi
+ \fi
&% Avanzamos hasta la descripción.
- % Guardamos la posición X del nodo A de la línea, si hace falta.
- \if@linea\hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}\fi%
- \letratitrenglon \@@Descripcion%
- &% Avanzamos hasta la columna fantasma del precio unitario, y guardamos la posición X del nodo B de la línea, si hiciera falta.
- \if@linea%
- \if@filas\hfill\mbox{}\fi% Si el estilo es 'filas' la línea va hasta el precio total.
- \ifbool{LineaHastaPT}{}
- {\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}
- \fi%
- \if@filas\else\hfill\mbox{}\fi% Si el estilo no es 'filas' la línea va hasta el principio de la columna fantasma.
+ \ifbool{LineaDesdeColDos}{\@LineaNodoACoordX}{}%
+ \@LetraTitRenglon \@@Descripcion
+ &% Avanzamos hasta la columna fantasma del precio unitario.
+ \ifbool{LineaHastaColDos}{\zsaveposx{LineaNodoBCoordX}}{}%
+ \if@filas\else\hfill\mbox{}\fi
+ &% Avanzamos hasta el descuento, que puede o no existir.
+ \if@descuentos
+ \@LetraTitRenglon \@@Descuento \hfill\mbox{}%
+ \fi
&% Avanzamos hasta el precio total.
- \mbox{}\hfill\letratitrenglon \@@Precio \space (\@Moneda)\hfill\mbox{}%
- \if@linea%
- \ifbool{LineaHastaPT}
- {\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}{}%
- \fi%
- \\%
- \hline}
- {%
+ \mbox{}\hfill
+ \@LetraTitRenglon \@@Precio \space (\@Moneda)\hfill\mbox{}%
+ \ifbool{LineaHastaFinal}{\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}{}%
+ \\\hline}
+ {% Con cantidad:
\ifbool{SinLineasV}
- {\begin{tabularx}{\textwidth}{ c X r r }}
- {\begin{tabularx}{\textwidth}{|c|X|r|r|}}%
- % Antes, con tabular*:
- % \begin{tabular*}{\textwidth}{|c|l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}|r|r|}%
- \hline%
- \@ZERO%
- \if@csv\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\@Moneda)","\@@PrecioT \space (\@Moneda)"}\fi%
- % Guardamos la posición X del nodo A de la línea, si hace falta; y lo hacemos desde aquí si el estilo que se está usando no es 'sinlineasv', así la línea diagonal comienza en la descripción.
- \if@linea\ifbool{LineaDesdeCantidad}{\hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}}{}\fi%
- \letratitrenglon \@@Cantidad%
- &% Avanzamos hasta la descripción.
- % Guardamos la posición X del nodo A de la línea, si hace falta; y lo hacemos dsede aquí si el estilo 'sinlineasv' se está usando para que la línea diagonal comience desde la cantidad y no desde la descripción.
- \if@linea\ifbool{LineaDesdeCantidad}{}{\hspace*{-\tabcolsep}\zsaveposx{LineaNodoACoordX}\hspace*{\tabcolsep}}\fi%
- \letratitrenglon \@@Descripcion%
- &% Avanzamos hasta el precio unitario.
- % Guardamos la posición X del nodo B de la línea.
- % Ya que ya estamos en una columna fantasma no usada que es la del precio unitario, debemos retroceder a la columna anterior (-\tabcolsep) atravesando la línea vertical (-\arrayrulewidth).
- \if@linea%
- \ifbool{LineaHastaPT}
- {}{%
- \hspace*{-\tabcolsep}%
- \ifbool{LineaDesdeCantidad}{}{\hspace*{-\arrayrulewidth}}%
- \zsaveposx{LineaNodoBCoordX}%
- \hspace*{\tabcolsep}%
- \ifbool{LineaDesdeCantidad}{}{\hspace*{\arrayrulewidth}}}%
- \fi%
- \mbox{}\hfill%
- \letratitrenglon \@@PrecioU \space (\@Moneda)\hfill\mbox{}%
+ {\ifbool{DCU}
+ {\ifbool{Descuentos}
+ {\begin{tabularx}{\textwidth}{X c r c r}}% dcu.
+ {\begin{tabularx}{\textwidth}{X c r r@{\extracolsep{0pt}} r}}}% dcu.
+ {\ifbool{DUC}
+ {\ifbool{Descuentos}
+ {\begin{tabularx}{\textwidth}{X r c c r}}% duc.
+ {\begin{tabularx}{\textwidth}{X r c r@{\extracolsep{0pt}} r}}}% duc.
+ {\ifbool{Descuentos}
+ {\begin{tabularx}{\textwidth}{c X r c r}}% cdu.
+ {\begin{tabularx}{\textwidth}{c X r r@{\extracolsep{0pt}} r}}}}}% cdu.
+ {\ifbool{DCU}
+ {\ifbool{Descuentos}
+ {\begin{tabularx}{\textwidth}{|X|c|r|c|r|}}% dcu.
+ {\begin{tabularx}{\textwidth}{|X|c|r|r@{\extracolsep{0pt}} r|}}}% dcu.
+ {\ifbool{DUC}
+ {\ifbool{Descuentos}
+ {\begin{tabularx}{\textwidth}{|X|r|c|c|r|}}% duc.
+ {\begin{tabularx}{\textwidth}{|X|r|c|r@{\extracolsep{0pt}} r|}}}% duc.
+ {\ifbool{Descuentos}
+ {\begin{tabularx}{\textwidth}{|c|X|r|c|r|}}% cdu.
+ {\begin{tabularx}{\textwidth}{|c|X|r|r@{\extracolsep{0pt}} r|}}}}}% cdu.
+ \hline
+ \@ZERO
+ \if@csv
+ \if@cdu
+ \if@descuentos
+ \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\@Moneda)","\@@Descuento","\@@PrecioT \space (\@Moneda)"}%
+ \else
+ \immediate\write\csv{"\@@Cantidad","\@@Descripcion","\@@PrecioU \space (\@Moneda)","\@@PrecioT \space (\@Moneda)"}%
+ \fi
+ \fi
+ \if@dcu
+ \if@descuentos
+ \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\@Moneda)","\@@Descuento","\@@PrecioT \space (\@Moneda)"}%
+ \else
+ \immediate\write\csv{"\@@Descripcion","\@@Cantidad","\@@PrecioU \space (\@Moneda)","\@@PrecioT \space (\@Moneda)"}%
+ \fi
+ \fi
+ \if@duc
+ \if@descuentos
+ \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\@Moneda)","\@@Cantidad","\@@Descuento","\@@PrecioT \space (\@Moneda)"}%
+ \else
+ \immediate\write\csv{"\@@Descripcion","\@@PrecioU \space (\@Moneda)","\@@Cantidad","\@@PrecioT \space (\@Moneda)"}%
+ \fi
+ \fi
+ \fi
+ \ifbool{LineaDesdeColUno}{\@LineaNodoACoordX}{}%
+ \ifbool{PrimeroDesc}{\@LetraTitRenglon \@@Descripcion}{\@LetraTitRenglon \@@Cantidad}%
+ &
+ \ifbool{LineaHastaColUno}{\hspace*{-\arrayrulewidth}\@LineaNodoBCoordX\hspace*{\arrayrulewidth}}{}%
+ \ifbool{LineaDesdeColDos}{\@LineaNodoACoordX}{}%
+ \if@cdu \@LetraTitRenglon \@@Descripcion \fi
+ \if@dcu \@LetraTitRenglon \@@Cantidad \fi
+ \if@duc \mbox{}\hfill \@LetraTitRenglon \@@PrecioU \space (\@Moneda)\hfill\mbox{}\fi
+ &
+ \ifbool{LineaHastaColDos}{\hspace*{-\arrayrulewidth}\@LineaNodoBCoordX\hspace*{\arrayrulewidth}}{}%
+ \mbox{}\hfill
+ \if@duc
+ \@LetraTitRenglon \@@Cantidad
+ \else
+ \@LetraTitRenglon \@@PrecioU \space (\@Moneda)%
+ \fi
+ \hfill\mbox{}
+ &% Avanzamos hasta el descuento, que puede o no existir.
+ \if@descuentos
+ \@LetraTitRenglon \@@Descuento \hfill\mbox{}%
+ \fi
&% Avanzamos hasta el precio total.
- \mbox{}\hfill \letratitrenglon \@@PrecioT \space (\@Moneda)\hfill\mbox{}%
- \if@linea%
- \ifbool{LineaHastaPT}
- {\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}{}%
- \fi%
- \\%
- \hline%
+ \mbox{}\hfill
+ \@LetraTitRenglon \@@PrecioT \space (\@Moneda)\hfill\mbox{}%
+ \ifbool{LineaHastaFinal}
+ {\hspace*{\tabcolsep}\zsaveposx{LineaNodoBCoordX}\hspace*{-\tabcolsep}}
+ {}%
+ \\
+ \hline
}%
%
#1% Aquí entran todos los items que el usuario declara dentro del ambiente.
- \if@filas%
- % Si hay líneas en blanco se colocan todas menos la última que debe ponerse a mano para poder fijar las coordenadas.
- \ifnum\value{Lineas}>0
- \Repeat{\value{Lineas}-1}{&&&\\}%
- \if@linea\zsaveposy{LineaNodoBCoordY}\fi% Se guarda la coordenada Y del punto de la derecha de la línea diagonal.
- &&&\\%
- \fi%
- \hline%
- \else%
- % Si usamos el estilo 'separado', o 'sinlineasv' junto con 'separado' debemos cerrar primero con la línea horizontal.
- \ifbool{SeparadoSinLineasV}{\if@lineaitem\else\hline\fi}{}%
- % Agregamos las líneas espúreas.
- \ifbool{Separado}
- {\Repeat{\value{Lineas}}{\multicolumn{4}{|c|}{}\\}}
- {\Repeat{\value{Lineas}}{&&&\\}}%
- \if@ivaexplicito%
- \if@Exento \@EscribeTotalColBI{E}\fi%
- \if@BIR \@EscribeTotalColBI{R} \@EscribeTotalColAlicuota{R}\fi%
- \@EscribeTotalColBI{G} \@EscribeTotalColAlicuota{G}%
- \if@BIA \@EscribeTotalColBI{A} \@EscribeTotalColAlicuota{A}\fi%
- \cline{4-4}%
- \fi% Se acaba el condicional del IVA explícito (\if@ivaexplicito ... \fi).
- \ifbool{Separado}
- {\multicolumn{2}{|c}{}&\multicolumn{1}{r}}{&&}% Si usamos el estilo 'separado' debemos quitar las líneas verticales desde la cantidad hasta el precio total.
- % Guardamos la coordenada Y del nodo B de la línea diagonal, si se pide que aparezca.
- {\if@linea\zsaveposy{LineaNodoBCoordY}\fi%
- \letratittotal\@@Total} & \@TotalTotal\letratotal\numprint{\Total} \\%
- \hline%
- \fi%
+ \if@filas
+ % Esto en lugar de \if@relleno para que no se haga una linea vacía en la tabla cuando la caja está vacía.
+ \ifdim \ht\@CajaEspacioVacio=0pt
+ \if@lineaitem\else\hline\fi% Verificamos si hay que poner la línea horizontal. Si está 'lineaitem' ya salió debido a esta opción.
+ \else
+ \usebox{\@CajaEspacioVacio}%
+ \if@linea\mbox{}\zsaveposy{LineaNodoBCoordY}\fi% Se guarda la coordenada Y del punto de la derecha de la línea diagonal. Tiene que haber \mbox{}.
+ &&&&\\
+ \hline% Siempre que hay relleno se pone la línea acá.
+ \fi
+ \else
+ \if@lineaitem\else\hline\fi
+ % Agregamos el espacio espúreo.
+ \ifdim \ht\@CajaEspacioVacio=0pt
+ \else
+ \ifbool{SinLineasV}{\multicolumn{5}{c}{\usebox{\@CajaEspacioVacio}}}{\multicolumn{5}{|c|}{\usebox{\@CajaEspacioVacio}}}\\
+ \fi
+ \ifbool{SinLineasV}
+ {\multicolumn{5}{r}\begingroup
+ \ifdim \ht\@CajaEspacioVacio=0pt \else \if@linea\zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}\fi\fi
+ \begin{tabular}[b]{@{\extracolsep{2\tabcolsep}}lr}}
+ {\multicolumn{5}{|r}\begingroup
+ \ifdim \ht\@CajaEspacioVacio=0pt \else \if@linea\zsaveposx{LineaNodoBCoordX}\zsaveposy{LineaNodoBCoordY}\fi\fi
+ \begin{tabular}[b]{@{\extracolsep{2\tabcolsep}}lr|}}% Una vaina loca... tuve que meter también el tabular con la línea '|' porque no pude poner esa línea en el multicolumn.
+ \if@agrupado
+ \@EscribeTotalColAgrupado
+ \else
+ \if@Exento \@EscribeTotalCol{E}\fi
+ \if@BIR\@EscribeTotalCol{R}\if@ivaexplicito\@EscribeTotalColAlicuota{R}\fi\fi
+ \@EscribeTotalCol{G}\if@ivaexplicito\@EscribeTotalColAlicuota{G}\fi
+ \if@BIA\@EscribeTotalCol{A}\if@ivaexplicito\@EscribeTotalColAlicuota{A}\fi\fi
+ \fi
+ \cline{2-2}%
+ \hfill \@LetraTitTotal\@@Total & \@TotalTotal\@LetraNumTotal\numprint{\Total}\\
+ \end{tabular}\endgroup%
+ \\\hline
+ \fi
\end{tabularx}%
%
- \if@filas%
- \vfill%
- \@TotalTotal%
- \@GeneraCajasTotalesFilas%
- \newbox{\CajaTotal}%
- \savebox{\CajaTotal}{{\letratittotal\@@Total}: \letratotal\numprint{\Total}}%
+ \if@filas
+ \@LetraNumTotales
+ \vspace*{\@SeparaElementos}\par
+ \if@relleno\else\vfill\fi
+ \@TotalTotal
+ \@GeneraCajasTotalesFilas
+ \newbox{\@CajaTotal}%
+ \savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total}: \@LetraNumTotal\numprint{\Total}}%
%
\ifnum \value{IVANoGeneral}=0%
- \newbox{\CajaGET}%
- \savebox{\CajaGET}{\@EscribeTotalesFilasGET}%
- \ifdim \the\wd\CajaGET < \textwidth%
+ \newbox{\@CajaGET}%
+ \savebox{\@CajaGET}{\@EscribeTotalesFilasGET}%
+ \ifdim \the\wd\@CajaGET < \textwidth
\parbox{\textwidth}{\@EscribeTotalesFilasGET}%
- \else%
- \hspace*{\SepTotales}%
- \usebox{\CajaBIAliG}\hspace*{\SepTotales}%
- \if@Exento\usebox{\CajaBIET}\else\usebox{\CajaTotal}\fi%
- \if@centrado\hspace*{\SepTotales}\fi%
- \fi%
- \fi%
+ \else
+ \hspace*{\@SepTotales}%
+ \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}%
+ \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
+ \if@centrado\hspace*{\@SepTotales}\fi
+ \fi
+ \fi
\ifnum \value{IVANoGeneral}=1%
- \newbox{\CajaGxET}%
- \savebox{\CajaGxET}{\@EscribeTotalesFilasGxET}%
- \ifdim \the\wd\CajaGxET < \textwidth%
- \@EscribeTotalesFilasGxET%
- \else%
- \hspace*{\SepTotales}%
- \if@BIR\usebox{\CajaBIAliR}\hspace*{\SepTotales}\fi%
- \usebox{\CajaBIAliG}\hspace*{\SepTotales}%
- \if@BIA\usebox{\CajaBIAliA}\hspace*{\SepTotales}\fi%
- \par%
- \if@centrado\hspace*{\SepTotales}\else\hfill\fi%
- \if@Exento\usebox{\CajaBIE}\hspace*{\SepMinTotales}\fi\usebox{\CajaTotal}%
- \if@centrado\hspace*{\SepTotales}\fi%
- \fi%
- \fi%
+ \newbox{\@CajaGxET}%
+ \savebox{\@CajaGxET}{\@EscribeTotalesFilasGxET}%
+ \ifdim \the\wd\@CajaGxET < \textwidth
+ \@EscribeTotalesFilasGxET
+ \else
+ \hspace*{\@SepTotales}%
+ \if@BIR\usebox{\@CajaBIAliR}\hspace*{\@SepTotales}\fi
+ \usebox{\@CajaBIAliG}\hspace*{\@SepTotales}%
+ \if@BIA\usebox{\@CajaBIAliA}\hspace*{\@SepTotales}\fi
+ \\[\@SeparaFilas]\mbox{}%
+ \if@centrado\hspace*{\@SepTotales}\else\hfill\fi
+ \if@Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}%
+ \if@centrado\hspace*{\@SepTotales}\fi
+ \fi
+ \fi
\ifnum \value{IVANoGeneral}=2%
- \newbox{\CajaRGAET}%
- \savebox{\CajaRGAET}{\@EscribeTotalesFilasRGAET}%
- \ifdim \the\wd\CajaRGAET < \textwidth%
- \@EscribeTotalesFilasRGAET%
- \else%
- \newbox{\CajaRGA}%
- \savebox{\CajaRGA}{\@EscribeTotalesFilasRGA}%
- \ifdim \the\wd\CajaRGA < \textwidth%
- \@EscribeTotalesFilasRGA%
- \par%
- \if@centrado\hspace*{\SepTotales}\else\hfill\fi%
- \if@Exento\usebox{\CajaBIE}\hspace*{\SepMinTotales}\fi\usebox{\CajaTotal}%
- \if@centrado\hspace*{\SepTotales}\fi%
+ \newbox{\@CajaRGAET}%
+ \savebox{\@CajaRGAET}{\@EscribeTotalesFilasRGAET}%
+ \ifdim \the\wd\@CajaRGAET < \textwidth
+ \@EscribeTotalesFilasRGAET
+ \else
+ \newbox{\@CajaRGA}%
+ \savebox{\@CajaRGA}{\@EscribeTotalesFilasRGA}%
+ \ifdim \the\wd\@CajaRGA < \textwidth
+ \@EscribeTotalesFilasRGA
+ \\[\@SeparaFilas]\mbox{}%
+ \if@centrado\hspace*{\@SepTotales}\else\hfill\fi
+ \if@Exento\usebox{\@CajaBIE}\hspace*{\@SeparaMinTotales}\fi\usebox{\@CajaTotal}%
+ \if@centrado\hspace*{\@SepTotales}\fi
\else% Aquí casi cualquier cosa tiene aspecto feo.
\ClassWarning{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}{}%
\centering{%
- \begin{tabular}{r@{\hspace*{\SepMinTotales}}l}
- \usebox{\CajaBIAliR} & \usebox{\CajaBIAliA} \\
- \usebox{\CajaBIAliG} & \if@Exento\usebox{\CajaBIET}\else\usebox{\CajaTotal}\fi
+ \begin{tabular}{r@{\hspace*{\@SeparaMinTotales}}l}
+ \usebox{\@CajaBIAliR} & \usebox{\@CajaBIAliA} \\[\@SeparaFilas]
+ \usebox{\@CajaBIAliG} & \if@Exento\usebox{\@CajaBIET}\else\usebox{\@CajaTotal}\fi
\end{tabular}}%
- \fi%
- \fi%
- \fi%
- \fi%
- \vfill%
-}
+ \fi
+ \fi
+ \fi
+ \fi
+ \par
+ \if@relleno
+ \vspace*{-\@EspacioVacioInicial}%
+ \vspace*{\@EspacioVacioFinal}%
+ \zsaveposy{EspacioVacioInicial}%
+ \fi
+ \vfill
+ \if@relleno\zsaveposy{EspacioVacioFinal}\fi
+ \vspace*{\@SeparaElementos}\par}
+
+\if@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 a la factura aplica \thispagestyle en empty luego, aunque quedará \pagestyle aplicado.
+ \if@fondoreporte
+ \if@fondoreportestar
+ \pagestyle{solopie}%
+ \else
+ \pagestyle{plain}%
+ \fi
+ \else
+ \pagestyle{empty}%
+ \fi
+ \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{\@PosFirmasXuno}{\oddsidemargin+1in}%
+ \setlength{\parindent}{0pt}%
+ \setlength{\lineskip}{0pt}%
+ \setlength{\parskip}{0pt plus 1pt}%
+ \thispagestyle{empty}%
+ \pagenumbering{roman}%
+ \@EncabezadoFactura}
+ \if@reporte
+ \expandafter\AtBeginDocument
+ \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
+ {%
+ \@CargaFondoFactura
+ \@PosicionaFecha
+ \if@cotizacion\def\@Denominacion{\@@DenomCotiza}\fi
+ \if@denom\@PosicionaDenom\fi
+ \if@confirmas\@PosicionaFirmas\fi
+ \if@concondiciones\@PosicionaCondiciones\fi
+ \if@prefactura\@PosicionaNumControl\fi}
+
+ \if@linea
+ \RequirePackage{zref-savepos}% Para determinar las coordenadas de la línea.
+ \if@filas
+ \ifbool{SinLineasV}
+ {\booltrue{LineaDesdeColUno}\booltrue{LineaHastaFinal}}
+ {\ifbool{PrimeroDesc}
+ {\booltrue{LineaDesdeColUno}\booltrue{LineaHastaColUno}}
+ {\booltrue{LineaDesdeColDos}\booltrue{LineaHastaColDos}}}
+ \else
+ \ifbool{SinCantidad}{\booltrue{LineaDesdeColDos}}{\booltrue{LineaDesdeColUno}}
+ \booltrue{LineaHastaTotal}
+ \fi
+ \fi
-% El comando para la descripción del servicio prestado en esta factura.
-\newcommand{\desc}[2][]{%
- \letradescrip%
- \shadowbox{%
- \parbox[t][\textheight-\pagetotal-2\fboxsep-2\fboxrule-\shadowsize-\SepElementos]
- {\textwidth-\shadowsize-\fboxsep*2-\fboxrule*2}{%
- \setlength{\parindent}{0.5cm}%
- \setlength{\parskip}{10pt}%
- \ifthenelse{\equal{#1}{*}}{}{\vfill}%
- #2%
- \ifthenelse{\equal{#1}{*}}{}{\vfill}%
- }}%
- \vspace*{-\baselineskip}%
- \par}
-
-% Comando para escribir el encabezado.
-\newcommand\@Encabezado{%
- \@FECHA%
- \ifx\@undefined\@Resumen%
- \@DATOSCLIENTE%
- \else%
- \@DATOSCLIENTERESUMEN%
+ %% El comando para la descripción del servicio prestado.
+ \NewDocumentCommand{\Descripcion}{s +m}{%
+ \@LetraDescripcion
+ \begin{tikzpicture}
+ \node[draw=black, fill=white, inner sep=\@SeparaInternaDescrip, line width=\@EspesorLineaDescrip, rounded corners=\@EsquinaLineaDescrip,
+ copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraDescrip, shadow yshift=-\@SombraDescrip}]{%
+ \IfBooleanTF{#1}%
+ {\parbox[t]{\textwidth-\@SombraDescrip-2\@SeparaInternaDescrip-2\@EspesorLineaDescrip}}%
+ {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescrip-\@EspesorLineaDescrip-\@SombraDescrip]
+ {\textwidth-2\@SeparaInternaDescrip-\@EspesorLineaDescrip-\@SombraDescrip}}%
+ {\setlength{\parindent}{0.5cm}%
+ \setlength{\parskip}{2pt plus 8pt}%
+ \IfBooleanF{#1}{\vfill}%
+ #2%
+ \IfBooleanF{#1}{\vfill}%
+ }};
+ \end{tikzpicture}
+ \par\vspace*{\@SombraDescrip}}%
+\else
+ \RenewEnviron{factura}{}
+ \NewDocumentCommand{\Descripcion}{s m}{}
+\fi
+
+\let\desc\Descripcion
+
+\if@reporte
+ \ifdefvoid{\@EstiloPag}{\let\@EstiloPag\@EstiloPagNoTitulo}{}%
+ \if@factura
+ \else
+ \AtEndPreamble{%
+ \expandafter\geometry\expandafter{\@GeometriaReporte}}% La geometría del reporte debe aplicarse aquí cuando sólo hay reporte, así se puede establecer el tamaño del papel.
+ \fi
+ \NewEnviron{reporte}{%
+ \if@factura
+ \expandafter\newgeometry\expandafter{\@GeometriaReporte}\cleardoublepage% La geometría debe aplicarse aquí cuando también hay factura, pero no se puede cambiar el tamaño del papel.
+ \fi
+ \fancy@setoffs
+ \@CargaFondoReporte
+ \@EncabezadoReporte%
+ \if@fondoreporte
+ \if@fondoreportestar
+ \pagestyle{solopie}%
+ \else
+ \pagestyle{plain}%
+ \thispagestyle{solonumpag}%
+ \fi
+ \fi
+ \pagenumbering{arabic}%
+ \setlength{\parindent}{0.666cm}%
+ \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte.
+ \vskip\baselineskip
+ \BODY\clearpage}% espacio antes de empezar con el reporte, después del título -si lo hubiera-.
+\else
+ \NewEnviron{reporte}{}
+\fi
+
+%% Comando para el diseño de la forma libre.
+\newcommand{\@CargaFondoFactura}{%
+ \if@fondofactura
+ \begin{textblock*}{\paperwidth}(0pt,0pt)%
+ \includegraphics{\@FondoFactura}%
+ \end{textblock*}%
\fi}
-% Comando para el diseño de la forma libre.
-\newcommand\@MARCO{%
- \begin{textblock*}{\paperwidth}(0pt,0pt)%
- \includegraphics{\@Marco}%
- \end{textblock*}}
+%% Comando para el fondo del reporte.
+\newcommand{\@CargaFondoReporte}{%
+ \if@fondoreporte
+ \if@fondoreportestar
+ \AddToShipoutPictureBG{\includegraphics{\@FondoReporte}}%
+ \else
+ \begin{textblock*}{\paperwidth}(0pt,0pt)%
+ \noindent\includegraphics{\@FondoReporte}%
+ \end{textblock*}%
+ \fi
+ \fi}
-% Comando que coloca la firma escaneada.
-\newcommand\@FIRMAS{%
- \begin{textblock*}{\textwidth+\oddsidemargin+1in-\XInicioFirmas-\XFinFirmas}(\XInicioFirmas,\YInicioFirmas)%
- \letrafirmas%
- \parbox{\TamLineaFirmas}{%
- \rule{\TamLineaFirmas}{\EspesorLineaFirmas}
- \centering \@@Conforme}%
- \hfill%
- \parbox{\TamLineaFirmas}{%
- \rule{\TamLineaFirmas}{\EspesorLineaFirmas}
- \centering \@Emisor}% La línea de arriba no puede terminar en '%'.
+%% Comando que coloca las firmas.
+\newcommand{\@PosicionaFirmas}{%
+ \savebox{\@CajaFirmas}{%
+ \parbox{\textwidth+\oddsidemargin+1in-\@PosFirmasXuno-\@PosFirmasXdos}{\@EstiloFirmas}}%
+ \ifbool{FirmasYnegativo}
+ {\addtolength{\@PosFirmasY}{\paperheight-\ht\@CajaFirmas-\dp\@CajaFirmas}}
+ {}%
+ \begin{textblock*}{\wd\@CajaFirmas}(\@PosFirmasXuno,\@PosFirmasY)%
+ \usebox{\@CajaFirmas}%
\end{textblock*}}
-% Comando que coloca las condiciones de pago.
-\newcommand\@CONDICIONES{%
- \begin{textblock*}{\textwidth+\oddsidemargin+1in-\XInicioCond-\XFinCond}(\XInicioCond,\YInicioCond)%
- \letracondiciones%
- \@Condiciones%
+%% Comando que coloca las condiciones de pago.
+\newcommand{\@PosicionaCondiciones}{%
+ \savebox{\@CajaCond}{%
+ \parbox{\textwidth+\oddsidemargin+1in-\@PosCondX}{\@EstiloCondiciones}}%
+ \ifbool{CondYnegativo}
+ {\addtolength{\@PosCondY}{\paperheight}}% TODO: ¿como los demás o lo dejo así?
+ {}%
+ \begin{textblock*}{\wd\@CajaCond}(\@PosCondX,\@PosCondY)%
+ \usebox{\@CajaCond}%
\end{textblock*}}
-% Comando que coloca el número de control.
-\newcommand\@NUMCONTROL{%
- \begin{textblock*}{\TamControl}(\XInicioControl,\YInicioControl)%
- {\letradenom \@@Control \par \@NumSerieControl-}\space{\letranumeracion\@NumControl}%
+%% Comando que coloca el número de control.
+\newcommand{\@PosicionaNumControl}{%
+ \savebox{\@CajaControl}{%
+ \pbox{\textwidth}{\@EstiloNumControl}}%
+ \ifbool{ControlXnegativo}
+ {\addtolength{\@PosControlX}{\textwidth-\wd\@CajaControl}}
+ {}%
+ \ifbool{ControlYnegativo}
+ {\addtolength{\@PosControlY}{\paperheight-\ht\@CajaControl-\dp\@CajaControl}}
+ {}%
+ \begin{textblock*}{\wd\@CajaControl}(\@PosControlX,\@PosControlY)%
+ \usebox{\@CajaControl}%
\end{textblock*}}
-% Comando que coloca la denominación del documento.
-\newcommand\@DENOMINACION{%
- \begin{textblock*}{\textwidth}(\XInicioDenom,\YInicioDenom)%
- {\letradenom\@Denominacion}\space\space{\letranumeracion N\textordmasculine\space\@Num}%
+%% 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}}
+ {}%
+ \begin{textblock*}{\wd\@CajaDenom}(\@PosDenomX,\@PosDenomY)%
+ \usebox{\@CajaDenom}%
\end{textblock*}}
-% Comando que coloca la fecha.
-\newcommand\@FECHA{%
- \begin{textblock*}{\textwidth}(\XInicioFecha,\YInicioFecha)%
- \hfill\letrafecha\@@Fecha{\ttfamily\ \@Fecha}%
+%% 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}}
+ {}%
+ \begin{textblock*}{\wd\@CajaFecha}(\@PosFechaX,\@PosFechaY)%
+ \usebox{\@CajaFecha}%
\end{textblock*}}
-% Comando que coloca el óvalo con los datos del cliente.
-\newcommand\@DATOSCLIENTE{%
- \letraovalos%
- \ovalbox{%
- \parbox{\textwidth-\fboxsep*2-1pt}{%
- \hfill {\letratitovalos \@@Datos} \hfill \mbox{}\par%
- {\bfseries \@@Nombre} \@Nombre%
- \dotfill%
- {\bfseries \@@RIF} {\ttfamily \@RIF}%
- \par%
- {\bfseries \@@Direccion} \@Direccion%
- \par%
- {\bfseries \@@Tel} {\ttfamily \@Tel}%
- \ifx\@undefined\@Email\relax\else%
- \hspace*{0.2cm}$\diamond$\hspace*{0.2cm}{\bfseries \@@Email} {\ttfamily \@Email}\fi}}%
- \par}% Para que textblock* esté en modo vertical.
-
-% Comando que coloca los dos óvalos, con los datos del cliente y el resumen.
-\newcommand\@DATOSCLIENTERESUMEN{%
- \letraovalos%
- \savebox{\CajaDatos}{%
- \parbox[t]{\textwidth/2-\SepOvalos-\fboxsep*2}{%
- \hfill {\letratitovalos \@@Datos} \hfill \mbox{}\par%
- {\bfseries \@@Nombre} \@Nombre \par%
- {\bfseries \@@RIF} {\ttfamily \@RIF} \par%
- {\bfseries \@@Direccion} \@Direccion \par%
- {\bfseries \@@Tel} {\ttfamily \@Tel} \hfill \par%
- \ifx\@undefined\@Email\relax\else%
- {\bfseries \@@Email} {\ttfamily \@Email}\fi}}%
- \savebox{\CajaResumen}{%
- \parbox[t]{\textwidth/2-\SepOvalos-\fboxsep*2}{%
- \hfill {\letratitovalos \@@Resumen} \hfill \mbox{}\par%
- \null\vfill\@Resumen\vfill\null}}%
- \setlength{\TamDatos}{\ht\CajaDatos+\dp\CajaDatos}%
- \setlength{\TamResumen}{\ht\CajaResumen+\dp\CajaResumen}%
- \ifthenelse{\TamDatos>\TamResumen}
- {\setlength{\TamFinalOvalos}{\TamDatos}}
- {\setlength{\TamFinalOvalos}{\TamResumen}}%
- \ovalbox{\parbox[t][\TamFinalOvalos]{\textwidth/2-\SepOvalos-\fboxsep*2}{\usebox{\CajaDatos}}}%
- \hfill%
- \ovalbox{\parbox[t][\TamFinalOvalos]{\textwidth/2-\SepOvalos-\fboxsep*2}{\usebox{\CajaResumen}}}%
- \par}% Para que textblock* esté en modo vertical.
-
-% Comando que coloca la línea diagonal.
-\newcommand\@Linea{%
- \letraitems% Volvemos a fijar el \baselineskip de la tabla.
- \setlength{\NodoX}{\zposx{LineaNodoACoordX} sp}%
- \setlength{\NodoY}{\zposy{LineaNodoBCoordY} sp}%
- \setlength{\NodoXX}{\zposx{LineaNodoBCoordX} sp}%
- \setlength{\NodoYY}{\zposy{LineaNodoBCoordY} sp}%
- \addtolength{\NodoY}{\baselineskip/2}%
- \if@filas%
- \addtolength{\NodoY}{\arabic{Lineas}\baselineskip-\baselineskip}%
- \else%
- \addtolength{\NodoY}{\arabic{Lineas}\baselineskip}%
- \if@ivaexplicito%
- \addtolength{\NodoY}{2\baselineskip}%
- \if@Exento\addtolength{\NodoY}{\baselineskip}\fi%
- \if@BIR\addtolength{\NodoY}{2\baselineskip}\fi%
- \if@BIA\addtolength{\NodoY}{2\baselineskip}\fi%
- \fi%
- \fi%
- \begin{textblock*}{\paperwidth-\NodoX}(\NodoX,\paperheight-\NodoY)%
- \begin{tikzpicture}%
- \draw (\NodoX,\NodoY) --(\NodoXX,\NodoYY);%
+%% Comando que coloca los datos en el modo de reporte.
+\newcommand{\@EscribeDatosReporte}{%
+ {\@LetraDatosReporte
+ \setlength{\parindent}{0pt}%
+ {\bfseries \@@Proveedor} \@Proveedor \par
+ {\bfseries \@@Cliente} \@RazonSocial \par
+ \ifdefvoid{\@Contacto}{}{{\bfseries \@@Contacto} \@Contacto \par}%
+ \ifdefvoid{\@TituloReporte}{}{\vspace*{\baselineskip}{\@LetraTitReporte \centering \@TituloReporte \par}}}}
+
+%% Comando que coloca la caja con los datos del cliente.
+\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=\@EspesorLineaEncabez, rounded corners=\@EsquinaLineaEncabez,
+ copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraEncabez, shadow yshift=-\@SombraEncabez}]{%
+ \parbox{\textwidth-\@SombraEncabez-2\@SeparaInternaEncabez-\@EspesorLineaEncabez}{%
+ \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.2cm}$\diamond$\hspace*{0.2cm}{\bfseries \@@Email} {\ttfamily \@Email}}}};%
\end{tikzpicture}%
- \end{textblock*}}
+ \par\vspace*{\@SombraEncabez}}}% Para que textblock* esté en modo vertical.
+
+%% 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.
+ \savebox{\@CajaDatos}{%
+ \parbox[t]{\textwidth/2-\@SeparaEncabez/2-2\@SeparaInternaEncabez-\@EspesorLineaEncabez-\@SombraEncabez}{%
+ \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}}}}%
+ \savebox{\@CajaResumen}{%
+ \parbox[t]{\textwidth/2-\@SeparaEncabez/2-2\@SeparaInternaEncabez-\@EspesorLineaEncabez-\@SombraEncabez}{%
+ \hfill {\@LetraTitEnc \@@Resumen} \hfill \mbox{}%
+ \null\vfill\@Resumen}}%
+ \setlength{\@TamDatos}{\ht\@CajaDatos+\dp\@CajaDatos}%
+ \setlength{\@TamResumen}{\ht\@CajaResumen+\dp\@CajaResumen}%
+ \ifthenelse{\@TamDatos>\@TamResumen}
+ {\setlength{\@TamFinalEncabez}{\@TamDatos}}
+ {\setlength{\@TamFinalEncabez}{\@TamResumen}}%
+ \begin{tikzpicture}
+ \node[draw=black, fill=white, inner sep=\@SeparaInternaEncabez, line width=\@EspesorLineaEncabez, rounded corners=\@EsquinaLineaEncabez,
+ copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraEncabez, shadow yshift=-\@SombraEncabez}]{%
+ \usebox{\@CajaDatos}};%
+ \end{tikzpicture}%
+ \hspace*{\@SeparaEncabez}\hspace*{\@SombraEncabez}%
+ \begin{tikzpicture}
+ \node[draw=black, fill=white, inner sep=\@SeparaInternaEncabez, line width=\@EspesorLineaEncabez, 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-\@EspesorLineaEncabez-\@SombraEncabez}{% Tenemos que rehacer la caja por los espacios dinámicos que deben volver a calcularse cuando ya la caja tiene un tamaño vertical definitivo.
+ \hfill {\@LetraTitEnc \@@Resumen} \hfill \mbox{}%
+ \null\vfill\@Resumen\vfill\null}};%
+ \end{tikzpicture}%
+ \par\vspace*{\@SombraEncabez}}}% El \par es para que textblock* esté en modo vertical.
+
+%% Comando que coloca la línea diagonal.
+\newcommand{\@DibujaLinea}{%
+ \@LetraItems% Volvemos a fijar el \baselineskip de la tabla.
+ \setlength{\@LineaNodoXo}{\zposx{LineaNodoACoordX} sp}%
+ \setlength{\@LineaNodoYo}{\zposy{LineaNodoBCoordY} sp}%
+ \setlength{\@LineaNodoXf}{\zposx{LineaNodoBCoordX} sp}%
+ \setlength{\@LineaNodoYf}{\zposy{LineaNodoBCoordY} sp}%
+ \addtolength{\@LineaNodoYo}{\@EspacioVacioInicial-\@EspacioVacioFinal}%
+ \if@filas
+ \else
+ % \FPifeq no se puede meter en un \else... (?) Por eso el uso de \ifthenelse. Katastrophal.
+ \ifthenelse{\equal{\@DescuentoGPorc}{0}}{}{\addtolength{\@LineaNodoYo}{2\baselineskip}}%
+ \ifthenelse{\equal{\@DescuentoRPorc}{0}}{}{\if@BIR\addtolength{\@LineaNodoYo}{2\baselineskip}\fi}%
+ \ifthenelse{\equal{\@DescuentoAPorc}{0}}{}{\if@BIA\addtolength{\@LineaNodoYo}{2\baselineskip}\fi}%
+ \ifthenelse{\equal{\@DescuentoEPorc}{0}}{}{\if@Exento\addtolength{\@LineaNodoYo}{2\baselineskip}\fi}%
+%% \FPifeq\@DescuentoGPorc{0}\else\addtolength{\@LineaNodoYo}{2\baselineskip}\fi
+%% \FPifeq\@DescuentoRPorc{0}\else\if@BIR\addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi
+%% \FPifeq\@DescuentoAPorc{0}\else\if@BIA\addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi
+%% \FPifeq\@DescuentoEPorc{0}\else\if@Exento\addtolength{\@LineaNodoYo}{2\baselineskip}\fi\fi
+ \addtolength{\@LineaNodoYo}{\baselineskip/2}%
+ \if@ivaexplicito
+ \addtolength{\@LineaNodoYo}{2\baselineskip}%
+ \if@BIR\addtolength{\@LineaNodoYo}{2\baselineskip}\fi
+ \if@BIA\addtolength{\@LineaNodoYo}{2\baselineskip}\fi
+ \if@Exento\addtolength{\@LineaNodoYo}{\baselineskip}\fi
+ \fi
+ \fi
+ \if@linea
+ \begin{textblock*}{\paperwidth-\@LineaNodoXo}(\@LineaNodoXo,\paperheight-\@LineaNodoYo)%
+ \begin{tikzpicture}%
+ \draw (\@LineaNodoXo,\@LineaNodoYo) -- (\@LineaNodoXf,\@LineaNodoYf);%
+ \end{tikzpicture}%
+ \end{textblock*}%
+ \fi}
+
+%% Escribimos los totales al archivo csv.
+\newcommand{\@EscribeTotalesEnCSV}{%
+ \if@csv
+ \if@Exento
+ \if@DescE
+ \immediate\write\csv{Totales: \@@SubtotalE: \@Moneda \SubtE}%
+ \immediate\write\csv{Totales: \@@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}%
+ \fi
+ \immediate\write\csv{Totales: \@@BIR: \@Moneda \BIR}%
+ \immediate\write\csv{Totales: \@@AlicuotaR: \@Moneda \AlicuotaR}%
+ \fi
+ \if@DescG
+ \immediate\write\csv{Totales: \@@SubtotalG: \@Moneda \SubtG}%
+ \immediate\write\csv{Totales: \@@DescuentoG: \@Moneda \DescG}%
+ \fi
+ \immediate\write\csv{Totales: \@@BIG: \@Moneda \BIG}%
+ \immediate\write\csv{Totales: \@@AlicuotaG: \@Moneda \AlicuotaG}%
+ \if@BIA
+ \if@DescA
+ \immediate\write\csv{Totales: \@@SubtotalA: \@Moneda \SubtA}%
+ \immediate\write\csv{Totales: \@@DescuentoA: \@Moneda \DescA}%
+ \fi
+ \immediate\write\csv{Totales: \@@BIA: \@Moneda \BIA}%
+ \immediate\write\csv{Totales: \@@AlicuotaA: \@Moneda \AlicuotaA}%
+ \fi
+ \immediate\write\csv{Totales: \@@Total: \@Moneda \Total}%
+ \immediate\closeout\csv
+ \fi}
+
+%% Hubo que redefinir \cleardoublepage agregándole \thispagestyle{empty} porque si no queda una página en blanco con encabezados usando twoside.
+\def\cleardoublepage{%
+ \clearpage
+ \if@twoside
+ \ifodd\c@page
+ \else
+ \hbox{}\thispagestyle{empty}\newpage
+ \if@twocolumn
+ \hbox{}\newpage
+ \fi
+ \fi
+ \fi}
-\endinput \ No newline at end of file
+\let\headrulebak\headrule% Para poder volver a poner la línea de fancyhdr si algún estilo de página la quitó.
+
+\endinput
+%%
+%% End of file `factura.cls'.
diff --git a/Master/texmf-dist/tex/latex/factura/factura.def b/Master/texmf-dist/tex/latex/factura/factura.def
index 09e7158a535..df7feb6f06c 100644
--- a/Master/texmf-dist/tex/latex/factura/factura.def
+++ b/Master/texmf-dist/tex/latex/factura/factura.def
@@ -1,64 +1,74 @@
%%
%% This is file `factura.def',
-%% *NOT* generated with the docstrip utility.
+%% generated with the docstrip utility.
%%
-%% Copyright 2013 Emilio Lazo Zaia
+%% The original source files were:
%%
+%% factura.dtx (with options: `def')
+%%
+%% Copyright 2015 Emilio Lazo Zaia <emiliolazozaia@gmail.com>
+%%
%% This work may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3 or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
-%%
-%% This work has the LPPL maintenance status "maintained".
-%%
-%% This Current Maintainer of this work is Emilio Lazo Zaia.
-%%
-%% This work consists of the files factura.cls, factura.def,
-%% and factura-modelo.tex, factura-modelo-ya.tex and README.
-%%
-%% Emilio Lazo Zaia <emiliolazozaia@gmail.com>
-%%
-%% This file is in UTF-8 format with Unix-like line breaks (LF only).
-%% Commands and commentaries are in spanish.
-%%
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesFile{factura.def}[2013/04/29 v1.0 Archivo de valores iniciales para factura.cls]
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. This version of this license is in
+%% http://www.latex-project.org/lppl/lppl-1-3c.{html|txt|tex|pdf}
+%% and the latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2008/05/04 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Emilio Lazo Zaia.
+%%
+%% 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-reporte1.tex,
+%% factura-ejemplo-reporte2.tex, factura-ejemplo-reporte3.tex,
+%% and factura-beispiel-rechnung.tex.
+%%
+\ProvidesFile{factura.def}
+[2015/03/30 v2.00^^J
+Archivo valores iniciales y condiciones de borde para factura.cls
+]
-% Porcentajes de los distintos IVA (General, Reducido y Adicional):
+%% 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 renglón de la factura si no hay descripción).
+%% Hay elementos que salen fuera de estos márgenes, como las firmas, las condiciones de pago, la numeración y la fecha.
+\GeometriaFactura{letterpaper,vmargin={5cm,5.5cm}, hmargin={1cm,1cm},footskip=0pt, 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):
\def\@AlicuotaG{0.12}
\def\@AlicuotaR{0.08}
\def\@AlicuotaA{0.22}
-% Al lado de cada ítem va la letra que designa el gravámen que aplica sobre él:
+%% 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 la numeración de la factura:
+\npthousandsep{.}
+\npdecimalsign{,}
+\def\@DigitosMoneda{2}
+\def\@DigitosPorc{2}
+\def\@DigitosNumeracion{5}
+
+%% La moneda:
+\def\@Moneda{Bs.}
+
+%% Al lado de cada ítem va la letra que designa el gravámen que aplica sobre él:
\def\@DenomAlicuotaG{G}
\def\@DenomAlicuotaR{R}
\def\@DenomAlicuotaA{A}
\def\@DenomAlicuotaE{(E)}
-% Moneda, separadores de miles y decimal:
-\def\@Moneda{Bs.}
-\npthousandsep{.}
-\npdecimalsign{,}
-
-% La numeración de la factura tiene esta cantidad de dígitos:
-\def\@DigitosNumeracion{5}
-
-% Tamaño de la página con 'geometry':
-% El margen superior está definido desde el óvalo de los datos del cliente.
-% El margen inferior está definido hasta el final de la descripción (o del renglón de la factura si no hay descripción). Hay elementos que salen fuera de estos márgenes, como las firmas, las condiciones de pago, la numeración y la fecha.
-\geometry{letterpaper,vmargin={5cm,4.7cm},hmargin={1cm,1cm},footskip=0pt,headsep=0pt,headheight=0pt}
-% Borde de las cajas ovaladas:
-\cornersize*{1cm}
-% \cornersize{0}
-% Separación entre la línea de las cajas de y el texto que hay dentro:
-\fboxsep=7pt%
-
-% Macros cuya definición es un texto, y no suele ser necesario cambiarlas:
+%% Macros cuya definición es un texto, y no suele ser necesario cambiarlas:
\def\@@Fecha{Fecha de emisi\'on:}
-\def\@@Nombre{Raz\'on social:}
+\def\@@RazonSocial{Raz\'on social:}
\def\@@Cantidad{Cantidad}
\def\@@Descripcion{Descripci\'on}
\def\@@PrecioU{Precio U.}
@@ -67,79 +77,203 @@
\def\@@AlicuotaG{IVA G}
\def\@@AlicuotaR{IVA R}
\def\@@AlicuotaA{IVA A}
-\def\@@BIG{B.I. G}
-\def\@@BIR{B.I. R}
-\def\@@BIA{B.I. A}
+\def\@@BIG{BI G}
+\def\@@BIR{BI R}
+\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}
+\def\@@DescuentoE{Descuento E}
+\def\@@SubtotalG{Subtotal G}
+\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\@@Tel{Tel\'efono:}
+\def\@@Telefono{Tel\'efono:}
\def\@@Email{E-mail:}
\def\@@Datos{Datos del cliente}
\def\@@Resumen{Resumen del servicio}
\def\@@Conforme{Recib\'i conforme}
\def\@@DenomFactura{FACTURA}
-\def\@@DenomPresupuesto{PRESUPUESTO}
+\def\@@DenomCotiza{COTIZACI\'ON}
\def\@@Control{N\textordmasculine\space CONTROL}
+\def\@@Proveedor{Proveedor:}
+\def\@@Cliente{Cliente:}
+
+%% Separación entre el inicio de una columna en la tabla y el inicio del texto.
+\tabcolsep=0.15cm
+
+%% 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.
+\PosFirmas{5cm}{1cm}{-2.4cm}
+%% La firma se define con un X_inicial, un X_final y un Y_inicial (Xo,Xf,Y)
+
+%% Tamaño y espesor de la línea de las firmas.
+\LineaFirmas{5.5cm}{0.7pt}
+
+%% Separación mínima horizontal entre los totales en modo de filas y distancia vertical entre esas líneas, fija.
+\SepFilas{0.8cm}{2.5pt}
+
+%% Separación vertical entre los elementos de la factura (entre el encabezado y el renglón de la 'factura', luego desde dicho renglón hasta la descripción, o hasta los totales en modo de filas).
+\SepElementos{0.2cm}
+
+%% Separación horizontal entre las cajas del encabezado y separación interna entre la línea y el texto.
+\SepEncabez{0.2cm}{4pt}
+
+%% Separación interna entre la línea y el texto de la descripción.
+\SepDescrip{4pt}
+
+%% Espesor de la línea de las cajas del encabezado, curvatura de la esquina y sombra.
+\LineaEncabez{0.4pt}{10pt}{0pt}
+
+%% Espesor de la línea de la descripción, curvatura de la esquina y sombra.
+\LineaDescrip{0.4pt}{0pt}{4pt}
+
+%% 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}
+
+%% Tipos de letra para cada elemento posible:
+%% 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}}
+
+%% Con este comando se cambia la etra del título de la tabla, es decir, los textos 'Cantidad, 'Descripción', etc...
+\LetraTitRenglon{\fontsize{10}{10}\bfseries}
-% Líneas en blanco al finalizar los items:
-\setcounter{Lineas}{0}%
-
-% Separación entre los óvalos:
-\setlength{\SepOvalos}{0.25cm}
-
-% Separación mínima entre los totales en el modo de totalización en filas:
-\setlength{\SepMinTotales}{0.8cm}
-
-% Suma de todos los espacios verticales entre los elementos en la factura, por ejemplo, entre los óvalos y el renglón de la 'factura', luego entre dicho renglón y la descripción. Si se define 0,4cm, habrá 0,2cm en estos espacios mencionados.
-\setlength{\SepElementos}{0.4cm}
-
-% Posición (X,Y) de la fecha.
-\setlength{\XInicioFecha}{1cm}
-\setlength{\YInicioFecha}{4.3cm}
-
-% Posición (X,Y) de la denominación y el número.
-\setlength{\XInicioDenom}{1cm}
-\setlength{\YInicioDenom}{4.3cm}
-
-% Separación entre el inicio de una columna en la tabla y el inicio del texto.
-\setlength{\tabcolsep}{0.15cm}
-
-% Posición (X,Y) de las firmas, tamaño y espesor de las líneas.
-\setlength{\XInicioFirmas}{6cm}
-\setlength{\XFinFirmas}{1cm}
-\setlength{\YInicioFirmas}{25.2cm}
-\setlength{\TamLineaFirmas}{5.5cm}
-\setlength{\EspesorLineaFirmas}{1pt}
-
-% Posición (X,Y) de las condiciones de pago.
-\setlength{\XInicioCond}{1cm}
-\setlength{\XFinCond}{1cm}
-\setlength{\YInicioCond}{23.6cm}
-
-% Posición (X,Y) del texto del número de control y el tamaño de su caja.
-\setlength{\XInicioControl}{1cm}
-\setlength{\YInicioControl}{24.5cm}
-\setlength{\TamControl}{4cm}
-
-% Un tipo de letra diferente para cada elemento a mostrar:
-\newcommand{\letraitems}{\fontsize{14}{18}\selectfont}% 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).
-\newcommand{\letratitrenglon}{\fontsize{10}{10}\selectfont\bfseries}% Con este comando se cambia la letra del título de la tabla, es decir, los textos 'Cantidad, 'Descripción', etc...
-\newcommand{\letratittotales}{\fontsize{12}{12}\selectfont\bfseries}% Tipo de letra de los títulos de los totales, por ejemplo los textos: 'B.I. G', 'IVA G'.
-\newcommand{\letratotales}{\fontsize{14}{14}\selectfont}% Letra con la que salen los totales parciales, es decir, los números, exceptuando el total general.
-\newcommand{\letratittotal}{\fontsize{12}{12}\selectfont\bfseries}% Letra con la que sale la palabra 'TOTAL'.
-\newcommand{\letratotal}{\fontsize{14}{14}\selectfont\bfseries}% Letra para el total general, el monto.
-\newcommand{\letratitovalos}{\fontsize{12}{13}\selectfont\slshape}% Tipo de letra para los títulos de los óvalos, por ejemplo: 'Datos del cliente'.
-\newcommand{\letraovalos}{\fontsize{12}{13}\selectfont}% Tipo de letra para el texto en los óvalos.
-\newcommand{\letranumeros}{\fontsize{14}{14}\selectfont}% Letra para los montos individuales de la factura y las cantidades.
-\newcommand{\letratipoiva}{\fontsize{12}{12}\selectfont}% El tipo de IVA ('G', 'R', 'A' o '(E)') también tiene su tipo de letra.
-\newcommand{\letradescrip}{\fontsize{14}{16.8}\selectfont}% Letra para la descripción general (comando \desc).
-\newcommand{\letrafirmas}{\fontsize{12}{12}\selectfont}% Tipo de letra para el texto bajo las líneas para firmar.
-\newcommand{\letracondiciones}{\fontsize{12}{12}\selectfont}% Tipo de letra para las condiciones de pago.
-\newcommand{\letradenom}{\fontsize{14}{14}\selectfont\bfseries}% Letra para la denominación del documento ('FACTURA', 'PRESUPUESTO',...).
-\newcommand{\letranumeracion}{\fontsize{14}{14}\selectfont\bfseries\color{Red}}% Letra para la numeración de la factura.
-\newcommand{\letrafecha}{\fontsize{12}{12}\selectfont}% Letra para la fecha de emisión.
-
-\endinput \ No newline at end of file
+%% Tipo de letra de los títulos de los totales, por ejemplo los textos: 'B.I. G', 'IVA G'.
+\LetraTitTotales{\fontsize{12}{12}\bfseries}
+
+%% Letra con la que salen los totales parciales, es decir, los números, exceptuando el total general.
+\LetraNumTotales{\fontsize{14}{12}}
+
+%% Letra con la que sale la palabra 'TOTAL'.
+\LetraTitTotal{\fontsize{12}{12}\bfseries}
+
+%% Letra para el total general, el monto.
+\LetraNumTotal{\fontsize{14}{14}\bfseries}
+
+%% Tipo de letra para los títulos de las cajas del encabezado, por ejemplo: 'Datos del cliente'.
+\LetraTitEnc{\fontsize{11}{12.5}\slshape}
+
+%% Tipo de letra para el texto en el encabezado de la factura.
+\LetraEncFactura{\fontsize{11}{12.5}}
+
+%% Tipo de letra para los datos en el modo reporte.
+\LetraDatosReporte{\fontsize{13}{16}}
+
+%% Letra para los montos individuales de la factura y las cantidades.
+\LetraNumeros{\fontsize{14}{14}}
+
+%% El tipo de IVA ('G', 'R', 'A' o '(E)') también tiene su tipo de letra.
+\LetraTipoIVA{\fontsize{12}{12}}
+
+%% Letra para la descripción general (comando \desc).
+\LetraDescripcion{\fontsize{14}{16.8}}
+
+%% Tipo de letra para el texto bajo las líneas para firmar.
+\LetraFirmas{\fontsize{12}{12}}
+
+%% Tipo de letra para las condiciones de pago.
+\LetraCondiciones{\fontsize{12}{12}}
+
+%% Letra para la denominación del documento ('FACTURA', 'COTIZACIÓN',...).
+\LetraDenom{\fontsize{14}{14}\bfseries}
+
+%% 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 el título del reporte.
+\LetraTitReporte{\fontsize{16}{22}\bfseries}
+
+%% Letra para los encabezados de las páginas en el modo reporte.
+\LetraEncReporte{\fontsize{12}{12}\slshape}
+
+%% Letra para el reporte.
+\LetraReporte{\fontsize{12}{20}}
+
+%% El diseño de las distintas partes de la hoja.
+\newcommand{\@EstiloFirmas}{%
+ \@LetraFirmas
+ \if@unafirma
+ \else
+ \parbox{\@TamLineaFirmas}{%
+ \rule{\@TamLineaFirmas}{\@EspesorLineaFirmas}
+ \centering \@@Conforme}%
+ \fi
+ \hfill
+ \parbox{\@TamLineaFirmas}{%
+ \rule{\@TamLineaFirmas}{\@EspesorLineaFirmas}
+ \centering \@Emisor}}
+
+\newcommand{\@EstiloCondiciones}{\@LetraCondiciones \@Condiciones}
+
+\newcommand{\@EstiloNumControl}{%
+ \begin{tabular}{@{\extracolsep{0pt}}l}
+ \@LetraDenom \@@Control \\
+ {\@LetraDenom\@NumSerieControl-}\space\@LetraNumeracion\@NumControl
+ \end{tabular}}
+
+\newcommand{\@EstiloDenom}{%
+ \@LetraDenom\@Denominacion
+ \if@sinnumero
+ \else
+ \space\space{\@LetraNumeracion N\textordmasculine\space\@Num}%
+ \fi}
+
+\newcommand{\@EstiloFecha}{\@LetraFecha\@@Fecha{\ttfamily\ \@Fecha}}
+
+\newcommand{\@EstiloPagNoTitulo}{\@LetraEncReporte Reporte correspondiente a la factura n\'umero \@Num \space de fecha \@Fecha}
+
+\newcommand{\@EstiloPagTitulo}{\@LetraEncReporte \@TituloReporte \space - \@Proveedor \space - \@Fecha}
+
+%% Estilos de página: normal, sólo encabezados, sólo piés de página y sólo número de página al pié.
+\fancypagestyle{plain}{%
+ \expandafter\ps@fancy
+ \fancyhf{}%
+ \renewcommand{\headrule}{\headrulebak}%
+ \fancyhead[LEO]{\@EstiloPag}%
+ \fancyfoot[C]{\thepage}}
+
+\fancypagestyle{soloenc}{%
+ \expandafter\ps@fancy
+ \fancyhf{}%
+ \renewcommand{\headrule}{\headrulebak}%
+ \fancyhead[LO]{\@EstiloPag}%
+ \fancyhead[RO]{\thepage}%
+ \if@twoside
+ \fancyhead[LE]{\thepage}%
+ \fancyhead[RE]{\@EstiloPag}%
+ \fi}
+
+\fancypagestyle{solopie}{%
+ \expandafter\ps@fancy
+ \fancyhf{}%
+ \renewcommand{\headrule}{}%
+ \fancyfoot[LO]{\@EstiloPag}%
+ \fancyfoot[RO]{\thepage}%
+ \if@twoside
+ \fancyfoot[RE]{\@EstiloPag}%
+ \fancyfoot[LE]{\thepage}%
+ \fi}
+
+\fancypagestyle{solonumpag}{%
+ \expandafter\ps@fancy
+ \fancyhf{}%
+ \renewcommand{\headrule}{}%
+ \fancyfoot[C]{\thepage}}
+
+\endinput
+%%
+%% End of file `factura.def'.