diff options
author | Karl Berry <karl@freefriends.org> | 2015-03-30 23:04:03 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2015-03-30 23:04:03 +0000 |
commit | 0d7d6ceda5d28a3493013ee490037ce2f44ddcae (patch) | |
tree | a9faec96d6a546ab4611a8ae5a27f2fc54f898b4 /Master/texmf-dist/tex/latex/factura/factura.cls | |
parent | 6975cb301d2e0be4f88a85bed1b3cebd3367e9f9 (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/factura.cls')
-rw-r--r-- | Master/texmf-dist/tex/latex/factura/factura.cls | 2074 |
1 files changed, 1409 insertions, 665 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&\else\setlength{\@FirmaFacturaXcorr}{#2}\fi + \ifx&\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&\else\savebox{\DibujoFirma}{#1}\@firma@dibujotrue\fi + \ifx&\else\setlength{\@FirmaReporteXcorr}{#2}\fi + \ifx&\else\setlength{\@FirmaReporteYcorr}{#3}\fi + \savebox{\TextoFirma}{\pbox[t]{\linewidth}{#4}}% + \ifx&\setlength{\@FirmaReporteTextPos}{2cm}\else\setlength{\@FirmaReporteTextPos}{#5}\fi + \ifx&\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'. |