texlive[72792] Master/texmf-dist: zugferd (7nov24)
commits+karl at tug.org
commits+karl at tug.org
Thu Nov 7 21:26:13 CET 2024
Revision: 72792
https://tug.org/svn/texlive?view=revision&revision=72792
Author: karl
Date: 2024-11-07 21:26:13 +0100 (Thu, 07 Nov 2024)
Log Message:
-----------
zugferd (7nov24)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/zugferd/DEMO-rechnung-zugferd.tex
trunk/Master/texmf-dist/doc/latex/zugferd/README.md
trunk/Master/texmf-dist/doc/latex/zugferd/zugferd.pdf
trunk/Master/texmf-dist/source/latex/zugferd/zugferd.dtx
trunk/Master/texmf-dist/tex/latex/zugferd/zugferd-invoice.sty
trunk/Master/texmf-dist/tex/latex/zugferd/zugferd.sty
Modified: trunk/Master/texmf-dist/doc/latex/zugferd/DEMO-rechnung-zugferd.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/zugferd/DEMO-rechnung-zugferd.tex 2024-11-07 20:26:03 UTC (rev 72791)
+++ trunk/Master/texmf-dist/doc/latex/zugferd/DEMO-rechnung-zugferd.tex 2024-11-07 20:26:13 UTC (rev 72792)
@@ -1,7 +1,7 @@
% !TeX Program=lualatex
%
% Demo file for the LaTeX-ZUGFeRD project
-% This file corresponds to version 0.9 (2024-10-23)
+% This file corresponds to version 0.9a (2024-11-07)
%
% Copyright (C) 2024 Marei Peischl <marei at peitex.de>
% ---------------------------------------------------------
@@ -79,8 +79,9 @@
hiermit stelle ich Ihnen meine Arbeit im Rahmen des Projektes XX in Rechnung. Die Leistung wurde im Januar 2024 erbracht.
\AddInvoiceItem{3}{Weiterentwicklung/funktionale Erweiterung}{90}
-\AddInvoiceItem[7]{3}{Support}{90}
+\AddInvoiceItem<unit=piece>[7]{3}{Support}{90}
\AddInvoiceItem{2}{Support an Feiertagen/Wochenende}{180}
+\AddInvoiceItem{3.25}{Rundungstest}{95.38}
\PrintInvoiceTabular
Modified: trunk/Master/texmf-dist/doc/latex/zugferd/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/zugferd/README.md 2024-11-07 20:26:03 UTC (rev 72791)
+++ trunk/Master/texmf-dist/doc/latex/zugferd/README.md 2024-11-07 20:26:13 UTC (rev 72792)
@@ -2,7 +2,7 @@
Copyright (C) 2023–2024 by Marei Peischl (peiTeX) <marei at peitex.de>
-zugferd version 0.9 (2024-10-23)
+zugferd version 0.9a (2024-11-07)
***************************************************************************
@@ -23,6 +23,9 @@
## Version History
+ * 0.9a (2024-11-07)
+ - Add support for MINIMUM profile
+ - Bugfix in demo package concerning rounding of non integer units.
* 0.9 (2024-10-23)
- Improve validation in testing of the development status.
- Add support for BillingSpecifiedPeriod
Modified: trunk/Master/texmf-dist/doc/latex/zugferd/zugferd.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/source/latex/zugferd/zugferd.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/zugferd/zugferd.dtx 2024-11-07 20:26:03 UTC (rev 72791)
+++ trunk/Master/texmf-dist/source/latex/zugferd/zugferd.dtx 2024-11-07 20:26:13 UTC (rev 72792)
@@ -16,14 +16,14 @@
% \fi
% \iffalse
%<*driver>
-\ProvidesFile{zugferd.dtx}[2024-10-23 v0.9 ZUGFerd Invoice and Faktur-X]
+\ProvidesFile{zugferd.dtx}[2024-11-07 v0.9a ZUGFerd Invoice and Faktur-X]
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[2023-11-01]
-%<package>\ProvidesExplPackage{zugferd}{2024-10-23}{0.9}{Create ZUGFerd invoices using LaTeX}
+%<package>\ProvidesExplPackage{zugferd}{2024-11-07}{0.9a}{Create ZUGFerd invoices using LaTeX}
%<*driver>
\DocumentMetadata{pdfstandard=a-3b,lang=en}
\documentclass[lm-default=false,cs-break-nohyphen]{l3doc}
-\usepackage{zugferd}[2024-10-23]
+\usepackage{zugferd}[2024-11-07]
\EnableCrossrefs
%\CodelineIndex
\RecordChanges
@@ -214,6 +214,12 @@
url={https://xeinkauf.de/faq/xrechnung#leitweg-id},
urldate={2024-09-04}
}
+ at online{LaTeX-ZUGFeRD-GitHub,
+ title={ZUGFeRD - Create ZUGFeRD and other kinds of E-invoices using \LaTeX},
+ subtitle={GitHub Repository},
+ author={Peischl, Marei},
+ url={https://github.com/TeXhackse/LaTeX-ZUGFeRD}
+}
\end{filecontents}
\addbibresource{zugferd.bib}
\nocite{cl-recommendations}
@@ -222,6 +228,12 @@
\newcommand*{\XML}{XML\xspace}
\newcommand*{\XMLfile}{\XML file}
+\newcommand*{\issue}[1]{%
+ {\DeclareFieldFormat{citeurlpostfix}{\href{##1/issues/#1}{\##1}}\citefield{LaTeX-ZUGFeRD-GitHub}[citeurlpostfix]{url}}%
+}
+\newcommand*{\version}[1]{v#1}
+
+
\begin{document}
\EnableDocumentation\DisableImplementation
\DocInput{zugferd.dtx}
@@ -283,7 +295,7 @@
% In the appendix I will add some notes on my setup and how I use it within pipelines.
%
% The Bundle provides an example file called \file{DEMO-rechnung-zugferd.tex}.
-% This includes a basic setup for a valid X-Rechnung currently matching Version 3.0.1 of the standard.
+% This includes a basic setup for a valid X-Rechnung currently matching Version 3.0.2 of the standard.
% Details on the requirements can be found in the documentation at \cite{x-rechnung}.
%
% \subsection{Disclaimer concerning the \pkg{zugferd-invoice} Package}
@@ -325,7 +337,7 @@
% \fi
% \begin{implementation}
% \section{Implementation}
-% \begin{variable}{\l_@@_tmp_tl,\g_@@_format_str,\g_@@_businessProcessId_str,\g_@@_writeTradeContact_bool,\g_@@_writePaymentMeans_bool,\g_@@_conformance_level_str}
+% \begin{variable}{\l_@@_tmp_tl,\g_@@_format_str,\g_@@_businessProcessId_str,\g_@@_writeTradeContact_bool,\g_@@_writePaymentMeans_bool,\g_@@_minimum_bool,\g_@@_conformance_level_str}
% \begin{macrocode}
\tl_new:N \l_@@_tmp_tl
\str_new:N \g_@@_format_str
@@ -332,6 +344,7 @@
\str_new:N \g_@@_businessProcessId_str
\bool_new:N \g_@@_writeTradeContact_bool
\bool_new:N \g_@@_writePaymentMeans_bool
+\bool_new:N \g_@@_minimum_bool
\str_new:N \g_@@_conformance_level_str
% \end{macrocode}
% \end{variable}
@@ -341,9 +354,9 @@
% The package supports a few fundamental settings.
% These have to be set when the package is loaded as they are used internally to setup the scheme or activate the \XML mechanism.
%
-% \DescribeKeyOption{format=xrechnung/xrechnung3.0/xrechnung2.3/basic}{xrechunng}
+% \DescribeKeyOption{format=xrechnung/xrechnung3.0/xrechnung2.3/basic/minimum}{xrechunng}
% \option{format} selects the scheme to be used for the zugferd invoice.
-% Currently xrechnung3.0, xrechnung2.3 and the basic scheme are supported.
+% Currently xrechnung3.0, xrechnung2.3, and the basic and minimum schemes are supported.
%
% The value \option{xrechnung} is set as an alias to |xrechnung3.0| and will always use the latest version supported by \pkg{zugferd}.
%
@@ -373,6 +386,7 @@
% \end{documentation}
% \begin{implementation}
% \begin{optionenv}{format,xrechnung,write-xml,zugferd,xml-file,auto-exemption}
+% \changes{v0.9a}{2024-11-07}{Add support for format=minimum}
% \changes{v0.7}{2024-09-10}{Added auto-exemption option}
% \begin{macrocode}
\char_set_catcode_other:N \#%
@@ -406,6 +420,15 @@
\bool_gset_false:N \g_@@_writePaymentMeans_bool
\str_gset:Nn \g_@@_conformance_level_str {BASIC}
},
+ format / minimum .code:n = {
+ \str_gset:Nx \g_@@_format_str {
+ urn:factur-x.eu:1p0:minimum
+ }
+ \bool_gset_true:N \g_@@_minimum_bool
+ \bool_gset_false:N \g_@@_writeTradeContact_bool
+ \bool_gset_false:N \g_@@_writePaymentMeans_bool
+ \str_gset:Nn \g_@@_conformance_level_str {MINIMUM}
+ },
format / xrechnung .meta:n = { format = xrechnung3.0 },
format .initial:n = xrechnung,
format .usage:n = load,
@@ -451,8 +474,18 @@
} {
See~ZUGFeRD~or~PDFmanagement~documentation~for~more~information.
}
- \msg_error:nn{zugferd} {PDFmanagement-not-active}
+ \msg_error:nn {zugferd} {PDFmanagement-not-active}
}
+% \end{macrocode}
+% \changes{v0.9a}{2024-11-07}{Add error message if pdfmanagement is outdated.}
+% \begin{macrocode}
+ \IfPackageAtLeastF{pdfmanagement-testphase}{2024/09/13}{
+ \msg_new:nnn {zugferd} {PDFmanagement-too-old} {
+ Your~version~of~\LaTeX's~PDF~management~is~too~old.
+ You~need~to~update~your~LaTeX~distribution~to~be~able~to~use~the~zugferd~package~correctly.
+ }
+ \msg_error:nn{zugferd} {PDFmanagement-too-old}
+ }
%% based on experiments for l3pdfmeta by Ulrike Fischer
\pdfmeta_xmp_xmlns_new:nn {fx}{
urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0\c_hash_str
@@ -840,8 +873,12 @@
\cs_gset:Nn \zugferd_write_Footer: {
\_@@_insert_Footer:
}
- \cs_gset_eq:NN \zugferd_write_Item:nnnnnn
- \_@@_insert_TradeLineItem:nnnnnn
+ \bool_if:NTF \g_@@_minimum_bool {
+ \cs_gset_eq:NN \zugferd_write_Item:nnnnnn \use_none:nnnnnn
+ }{
+ \cs_gset_eq:NN \zugferd_write_Item:nnnnnn
+ \_@@_insert_TradeLineItem:nnnnnn
+ }
\cs_gset:Nn \zugferd_startInvoiceSums: {
\_@@_ApplicableHeaderTradeAgreement:
\_@@_ApplicableHeaderTradeSettlement_start:
@@ -850,7 +887,11 @@
\cs_gset:Nn \zugferd_stopInvoiceSums: {
\_@@_ApplicableHeaderTradeSettlement_stop:
}
- \cs_gset_eq:NN \zugferd_write_TaxEntry:nnnn \_@@_ApplicableTradeTax:nnnn
+ \bool_if:NTF \g_@@_minimum_bool {
+ \cs_gset_eq:NN \zugferd_write_TaxEntry:nnnn \use_none:nnnn
+ } {
+ \cs_gset_eq:NN \zugferd_write_TaxEntry:nnnn \_@@_ApplicableTradeTax:nnnn
+ }
\cs_gset:Nn \zugferd_write_Summation:nnnnnnnn {
\_@@_SpecifiedTradePaymentTerms:
\_@@_SpecifiedTradeSettlementHeaderMonetarySummation:nnnnnnnn
@@ -905,7 +946,8 @@
% \end{macrocode}
% \end{function}
% \subsection{Number rounding}
-% As \pkg{siunitx} is implementing this, we use it instead of building our own mechanism.
+% As \pkg{siunitx} is implementing this, \pkg{zugferd} uses it instead of building our own mechanism.
+% In version \version{0.9a} a public interface was added, as described in section \ref{sec:rounding-interface}.
% \begin{macrocode}
\RequirePackage{siunitx}
% \end{macrocode}
@@ -1129,6 +1171,39 @@
% \end{function}
% \end{implementation}
% \begin{documentation}
+% \subsection{Rounding Interface}
+% \label{sec:rounding-interface}
+% \changes{v0.9a}{2024-11-07}{Add public interface for the rounding mechanism.}
+% The demo package's implementation is also doing VAT calculations.
+% This rounding mechanism might have side effects if only the final values are rounded as reported in \issue{17} .
+% It is only an issue if fractions of units are used, but was fixed in \version{0.9a}.
+% To avoid this generally there now exists an interface to be used to do the rounding before the summation.
+%
+% \DescribeMacro{\zugferd_fp_set_rounded:Nn}
+% \DescribeMacro{\zugferd_fp_gset_rounded:Nn}
+% This command can be used to access the \pkg{siunitx}'s rounding mechanism within \pkg{zugferd}.
+% The command is based on \cs[no-index]{fp_set:Nn} just is doing the rounding before the assignment.
+%
+% \begin{examplecode}
+% \zugferd_fp_gset_rounded:Nn \g_tmpa_fp {|\meta{amount}|* (|\meta{VAT rate}|/100) * |\meta{unit price}|}
+% \end{examplecode}
+% \end{documentation}
+% \begin{implementation}
+% \begin{function}{\zugferd_fp_set_rounded:Nn, \zugferd_fp_gset_rounded:Nn}
+% \begin{macrocode}
+% \begin{function}{\zugferd_fp_set_rounded:Nn, \zugferd_fp_gset_rounded:Nn}
+\cs_set:Nn \zugferd_fp_set_rounded:Nn {
+ \_@@_number_format:nNn {2} \l_@@_tmp_tl {\fp_eval:n {#2}}
+ \fp_set:Nn #1 {\l_@@_tmp_tl }
+}
+\cs_set:Nn \zugferd_fp_gset_rounded:Nn {
+ \_@@_number_format:nNn {2} \l_@@_tmp_tl {\fp_eval:n {#2}}
+ \fp_gset:Nn #1 {\l_@@_tmp_tl }
+}
+% \end{macrocode}
+% \end{function}
+% \end{implementation}
+% \begin{documentation}
% \section{Adding data to the XML}
% All data which does not directly depend on amounts or specific items is provided using a key-value interface.
% For some fields there is the option to define a global preset but locally overwrite it for a specific item.
@@ -1141,8 +1216,7 @@
% Therefore it might be necessary to escape special characters, like |&| to |&|.
% This also applies to |<|, |>|, |"| and |'|.
% It's technically possible to do this either via active characters or string replacements.
-% But since it's adjusting the content this feature would never be enabled by default.
-% The corresponding issue can be found at \url{https://github.com/TeXhackse/LaTeX-ZUGFeRD/issues/9}.
+% But since it's adjusting the content this feature would never be enabled by default (Issue \issue{9}).
%
% In most cases this functionality will be used to change the tax setting or unit for a single item.
% \autoref{sec:xml-interfaces} also provided an example for this.
@@ -1508,24 +1582,29 @@
% \begin{macrocode}
\_@@_define_xml_content:Nn \_@@_PostalTradeAddress:nnnnn {%
<ram:PostalTradeAddress>
- \_@@_indent: <ram:PostcodeCode>#1</ram:PostcodeCode>
- \tl_if_blank:nF {#2} {%
- \_@@_indent: <ram:LineOne>#2</ram:LineOne>
+ \bool_if:NF \g_@@_minimum_bool {%
+ \_@@_indent: <ram:PostcodeCode>#1</ram:PostcodeCode>
+ \tl_if_blank:nF {#2} {%
+ \_@@_indent: <ram:LineOne>#2</ram:LineOne>
+ }%
+ \tl_if_blank:nF {#3} {%
+ \_@@_indent: <ram:LineTwo>#3</ram:LineTwo>
+ }%
+ \_@@_indent: <ram:CityName>#4</ram:CityName>
}%
- \tl_if_blank:nF {#3} {%
- \_@@_indent: <ram:LineTwo>#3</ram:LineTwo>
- }%
- \_@@_indent: <ram:CityName>#4</ram:CityName>
\_@@_indent: <ram:CountryID>#5</ram:CountryID>
</ram:PostalTradeAddress>%
}
\_@@_define_xml_content:Nn \_@@_PostalTradeAddress:nnnnnnn {%
- \_@@_PostalTradeAddress:nnnnn {#1} {#2} {#3} {#4} {#5}
- \tl_if_empty:nF {#6} {%
- <ram:URIUniversalCommunication>
- \_@@_indent: <ram:URIID~schemeID="EM">#6</ram:URIID>
- </ram:URIUniversalCommunication>%
- }%
+ \_@@_PostalTradeAddress:nnnnn {#1} {#2} {#3} {#4} {#5}%
+ \bool_lazy_or:nnF {\g_@@_minimum_bool}%
+ {\tl_if_blank_p:n {#6}}%
+ {%
+ \_@@_xml_newline_indent:%
+ <ram:URIUniversalCommunication>
+ \_@@_indent: <ram:URIID~schemeID="EM">#6</ram:URIID>
+ </ram:URIUniversalCommunication>%
+ }%
% TODO add support local tax id: schemaID="FC"
\tl_if_empty:nF {#7} {
<ram:SpecifiedTaxRegistration>
@@ -1561,10 +1640,15 @@
\_@@_define_xml_writer:Nn \_@@_ApplicableHeaderTradeAgreement: {%
\_@@_write_xml:n {<ram:ApplicableHeaderTradeAgreement>}%
\int_gincr:N \g_@@_indent_int%
- \_@@_write_xml:e {%
- <ram:BuyerReference>\g_@@_buyer_reference_tl</ram:BuyerReference>
- <ram:SellerTradeParty>%
+ \bool_lazy_and:nnF%
+ {\tl_if_blank_p:V \g_@@_buyer_reference_tl}%
+ {\g_@@_minimum_bool}%
+ {%
+ \_@@_write_xml:e {%
+ <ram:BuyerReference>\g_@@_buyer_reference_tl</ram:BuyerReference>
+ }
}%
+ \_@@_write_xml:n {<ram:SellerTradeParty>}%
\int_gincr:N \g_@@_indent_int%
\_@@_write_xml:e {%
<ram:Name>\prop_item:Nn \g_@@_seller_AddressData_prop {name}</ram:Name>
@@ -1578,15 +1662,19 @@
}%
\int_gincr:N \g_@@_indent_int%
\_@@_write_xml:e {%
- <ram:Name>\prop_item:Nn \g_@@_buyer_AddressData_prop {name}</ram:Name>
- \_@@_DefinedTradeContact:N \g_@@_buyer_AddressData_prop%
- \_@@_PostalTradeAddress:N \g_@@_buyer_AddressData_prop%
+ <ram:Name>\prop_item:Nn \g_@@_buyer_AddressData_prop {name}</ram:Name>%
+ \bool_if:NF \g_@@_minimum_bool {
+ \_@@_DefinedTradeContact:N \g_@@_buyer_AddressData_prop%
+ \_@@_PostalTradeAddress:N \g_@@_buyer_AddressData_prop%
+ }%
}%
\int_gdecr:N \g_@@_indent_int%
\_@@_write_xml:n {</ram:BuyerTradeParty>}%
\int_gdecr:N \g_@@_indent_int%
\_@@_write_xml:n {</ram:ApplicableHeaderTradeAgreement>}%
- \_@@_ApplicableHeaderTradeDelivery:V \g_@@_delivery_date_tl%
+ \bool_if:NTF \g_@@_minimum_bool%
+ {\_@@_write_xml:n {<ram:ApplicableHeaderTradeDelivery/>}}%
+ {\_@@_ApplicableHeaderTradeDelivery:V \g_@@_delivery_date_tl}%
}%
%
%
@@ -1972,7 +2060,7 @@
% \begin{documentation}
% \DescribeKeyOption*{item/start-date=\meta{date formatted as YYYYMMDD}}{}*
% \DescribeKeyOption*{item/end-date=\meta{date formatted as YYYYMMDD}}{}*
-% With version 0.00 support for |BillingSpecifiedPeriod| was added.
+% With version \version{0.9} support for |BillingSpecifiedPeriod| was added.
% This supports setting |start-date| and |end-date| per item.
% As this is optional, there is no default.
% The element will be printed if both dates are set, as setting a single one will enforce the element to be invalid.
@@ -2001,20 +2089,23 @@
}
\cctab_begin:N \g_@@_xml_cctab%
%
-\_@@_define_xml_writer:Nn \_@@_write_note:n {%
- \begingroup%
- \let\\\iow_newline:%
- \_@@_write_xml:e {%
- <ram:IncludedNote>
- \_@@_indent: <ram:Content>
- #1
- \_@@_indent: </ram:Content>
- </ram:IncludedNote>%
- }%
- \endgroup%
+\bool_if:NTF \g_@@_minimum_bool {%
+ \cs_set_eq:NN \_@@_write_note:n \use_none:n%
+} {%
+ \_@@_define_xml_writer:Nn \_@@_write_note:n {%
+ \begingroup%
+ \let\\\iow_newline:%
+ \_@@_write_xml:e {%
+ <ram:IncludedNote>
+ \_@@_indent: <ram:Content>
+ #1
+ \_@@_indent: </ram:Content>
+ </ram:IncludedNote>%
+ }%
+ \endgroup%
+ }%
}%
%
-%
\begingroup%
\char_set_catcode_other:N \#%
\char_set_catcode:nn {32}{10}%
@@ -2156,7 +2247,7 @@
\int_gincr:N \g_@@_indent_int%
\_@@_write_xml:e {\_@@_Line_ApplicableTradeTax:nn {#1} {#2}}%
\_@@_write_xml:e {\_@@_BillingSpecifiedPeriod:VV \l_@@_start_date_tl \l_@@_end_date_tl}%
- \_@@_write_xml:e {\_@@_SpecifiedTradeSettlementLineMonetarySummation:n {#3}}%
+ \_@@_write_xml:e {\_@@_SpecifiedTradeSettlementLineMonetarySummation:n {#3}}%
\int_gdecr:N \g_@@_indent_int%
\_@@_write_xml:n {</ram:SpecifiedLineTradeSettlement>}%
}%
@@ -2182,7 +2273,7 @@
\_@@_indent:<ram:EndDateTime>
\_@@_indent:n {2} <udt:DateTimeString~format="102">#2</udt:DateTimeString>
\_@@_indent:</ram:EndDateTime>
- </ram:BillingSpecifiedPeriod>
+ </ram:BillingSpecifiedPeriod>%
}%
}%
\_@@_define_xml_content:Nn \_@@_SpecifiedTradeSettlementLineMonetarySummation:n {%
@@ -2189,7 +2280,7 @@
<ram:SpecifiedTradeSettlementLineMonetarySummation>
% BT-131
\_@@_indent: <ram:LineTotalAmount>#1</ram:LineTotalAmount>
- </ram:SpecifiedTradeSettlementLineMonetarySummation>
+ </ram:SpecifiedTradeSettlementLineMonetarySummation>%
}
% \end{macrocode}
@@ -2250,13 +2341,17 @@
\_@@_define_xml_writer:Nn \_@@_SpecifiedTradeSettlementHeaderMonetarySummation:nnnnnnnn {%
\_@@_write_xml:n {<ram:SpecifiedTradeSettlementHeaderMonetarySummation>}%
\int_gincr:N \g_@@_indent_int%
- \_@@_write_rounded:nnn {2} {LineTotalAmount} {#1}
- \_@@_write_rounded:nnn {2} {ChargeTotalAmount} {#2}
- \_@@_write_rounded:nnn {2} {AllowanceTotalAmount} {#3}
+ \bool_if:NF \g_@@_minimum_bool {
+ \_@@_write_rounded:nnn {2} {LineTotalAmount} {#1}
+ \_@@_write_rounded:nnn {2} {ChargeTotalAmount} {#2}
+ \_@@_write_rounded:nnn {2} {AllowanceTotalAmount} {#3}
+ }
\_@@_write_rounded:nnn {2} {TaxBasisTotalAmount} {#4}
\_@@_write_rounded:nnnn {2} {TaxTotalAmount} {~currencyID="\l_@@_currency_tl "} {#5}
\_@@_write_rounded:nnn {2} {GrandTotalAmount} {#6}
- \_@@_write_rounded:nnn {2} {TotalPrepaidAmount} {#7}
+ \bool_if:NF \g_@@_minimum_bool {
+ \_@@_write_rounded:nnn {2} {TotalPrepaidAmount} {#7}
+ }
\_@@_write_rounded:nnn {2} {DuePayableAmount} {#8}
\int_gdecr:N \g_@@_indent_int%
\_@@_write_xml:n {</ram:SpecifiedTradeSettlementHeaderMonetarySummation>}%
@@ -2349,7 +2444,9 @@
\cctab_end:
\cs_generate_variant:Nn \_@@_SpecifiedTradePaymentTerms:nn {VV}
\_@@_define_xml_writer:Nn \_@@_SpecifiedTradePaymentTerms: {
- \_@@_SpecifiedTradePaymentTerms:VV \g_@@_payment_terms_str \g_@@_due_date_tl
+ \bool_if:NF \g_@@_minimum_bool {
+ \_@@_SpecifiedTradePaymentTerms:VV \g_@@_payment_terms_str \g_@@_due_date_tl
+ }
}
% \end{macrocode}
% \begin{function}{\_@@_SpecifiedTradeSettlementPaymentMeans:}
Modified: trunk/Master/texmf-dist/tex/latex/zugferd/zugferd-invoice.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/zugferd/zugferd-invoice.sty 2024-11-07 20:26:03 UTC (rev 72791)
+++ trunk/Master/texmf-dist/tex/latex/zugferd/zugferd-invoice.sty 2024-11-07 20:26:13 UTC (rev 72792)
@@ -12,7 +12,7 @@
% and version 1.3c or later is part of all distributions of LaTeX
% version 2008-05-04 or later.
%
-\ProvidesExplPackage{zugferd-invoice}{2024-10-23}{0.9}{Invoice wrapper example package for the factur-x to create ZUGFerD invoices}
+\ProvidesExplPackage{zugferd-invoice}{2024-11-07}{0.9a}{Invoice wrapper example package for the factur-x to create ZUGFerD invoices}
\keys_define:nn {zugferd/invoice}{
default-vat .tl_set:N = \defaultVAT,
@@ -147,8 +147,8 @@
\newcommand*{\PrintInvoiceItem}[5]{%
\stepcounter{invoiceitem}%
\theinvoiceitem%Positionsnummer
- \fp_gset:Nn \g__ptxcd_invoice_item_vat_fp {#2 * (#1/100) * #4}
- \fp_gset:Nn \g__ptxcd_invoice_item_fp {#2 * #4}
+ \zugferd_fp_gset_rounded:Nn \g__ptxcd_invoice_item_vat_fp {#2 * (#1/100) * #4}
+ \zugferd_fp_gset_rounded:Nn \g__ptxcd_invoice_item_fp {#2 * #4}
\fp_gadd:cn {g__ptxcd_invoice_base_vat#1_fp} {\g__ptxcd_invoice_item_fp}
\fp_gadd:cn {g__ptxcd_invoice_sum_vat#1_fp} {\g__ptxcd_invoice_item_vat_fp}
\fp_gadd:Nn \g__ptxcd_invoice_sum_fp {\g__ptxcd_invoice_item_fp}
Modified: trunk/Master/texmf-dist/tex/latex/zugferd/zugferd.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/zugferd/zugferd.sty 2024-11-07 20:26:03 UTC (rev 72791)
+++ trunk/Master/texmf-dist/tex/latex/zugferd/zugferd.sty 2024-11-07 20:26:13 UTC (rev 72792)
@@ -9,12 +9,13 @@
%% Copyright (C) 2023--2024 by Marei Peischl (peiTeX) <marei at peitex.de>
%%
\NeedsTeXFormat{LaTeX2e}[2023-11-01]
-\ProvidesExplPackage{zugferd}{2024-10-23}{0.9}{Create ZUGFerd invoices using LaTeX}
+\ProvidesExplPackage{zugferd}{2024-11-07}{0.9a}{Create ZUGFerd invoices using LaTeX}
\tl_new:N \l__zugferd_tmp_tl
\str_new:N \g__zugferd_format_str
\str_new:N \g__zugferd_businessProcessId_str
\bool_new:N \g__zugferd_writeTradeContact_bool
\bool_new:N \g__zugferd_writePaymentMeans_bool
+\bool_new:N \g__zugferd_minimum_bool
\str_new:N \g__zugferd_conformance_level_str
\char_set_catcode_other:N \#%
\keys_define:nn {zugferd} {
@@ -47,6 +48,15 @@
\bool_gset_false:N \g__zugferd_writePaymentMeans_bool
\str_gset:Nn \g__zugferd_conformance_level_str {BASIC}
},
+format / minimum .code:n = {
+\str_gset:Nx \g__zugferd_format_str {
+urn:factur-x.eu:1p0:minimum
+}
+\bool_gset_true:N \g__zugferd_minimum_bool
+\bool_gset_false:N \g__zugferd_writeTradeContact_bool
+\bool_gset_false:N \g__zugferd_writePaymentMeans_bool
+\str_gset:Nn \g__zugferd_conformance_level_str {MINIMUM}
+},
format / xrechnung .meta:n = { format = xrechnung3.0 },
format .initial:n = xrechnung,
format .usage:n = load,
@@ -78,8 +88,15 @@
} {
See~ZUGFeRD~or~PDFmanagement~documentation~for~more~information.
}
-\msg_error:nn{zugferd} {PDFmanagement-not-active}
+\msg_error:nn {zugferd} {PDFmanagement-not-active}
}
+\IfPackageAtLeastF{pdfmanagement-testphase}{2024/09/13}{
+\msg_new:nnn {zugferd} {PDFmanagement-too-old} {
+Your~version~of~\LaTeX's~PDF~management~is~too~old.
+You~need~to~update~your~LaTeX~distribution~to~be~able~to~use~the~zugferd~package~correctly.
+}
+\msg_error:nn{zugferd} {PDFmanagement-too-old}
+}
%% based on experiments for l3pdfmeta by Ulrike Fischer
\pdfmeta_xmp_xmlns_new:nn {fx}{
urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0\c_hash_str
@@ -234,8 +251,12 @@
\cs_gset:Nn \zugferd_write_Footer: {
\__zugferd_insert_Footer:
}
+\bool_if:NTF \g__zugferd_minimum_bool {
+\cs_gset_eq:NN \zugferd_write_Item:nnnnnn \use_none:nnnnnn
+}{
\cs_gset_eq:NN \zugferd_write_Item:nnnnnn
\__zugferd_insert_TradeLineItem:nnnnnn
+}
\cs_gset:Nn \zugferd_startInvoiceSums: {
\__zugferd_ApplicableHeaderTradeAgreement:
\__zugferd_ApplicableHeaderTradeSettlement_start:
@@ -244,7 +265,11 @@
\cs_gset:Nn \zugferd_stopInvoiceSums: {
\__zugferd_ApplicableHeaderTradeSettlement_stop:
}
+\bool_if:NTF \g__zugferd_minimum_bool {
+\cs_gset_eq:NN \zugferd_write_TaxEntry:nnnn \use_none:nnnn
+} {
\cs_gset_eq:NN \zugferd_write_TaxEntry:nnnn \__zugferd_ApplicableTradeTax:nnnn
+}
\cs_gset:Nn \zugferd_write_Summation:nnnnnnnn {
\__zugferd_SpecifiedTradePaymentTerms:
\__zugferd_SpecifiedTradeSettlementHeaderMonetarySummation:nnnnnnnn
@@ -438,6 +463,14 @@
\hook_use:n {zugferd/disable-macros}
}
\hook_new:n {zugferd/disable-macros}
+\cs_set:Nn \zugferd_fp_set_rounded:Nn {
+\__zugferd_number_format:nNn {2} \l__zugferd_tmp_tl {\fp_eval:n {#2}}
+\fp_set:Nn #1 {\l__zugferd_tmp_tl }
+}
+\cs_set:Nn \zugferd_fp_gset_rounded:Nn {
+\__zugferd_number_format:nNn {2} \l__zugferd_tmp_tl {\fp_eval:n {#2}}
+\fp_gset:Nn #1 {\l__zugferd_tmp_tl }
+}
\seq_new:N \g__zugferd_notes_seq
\tl_new:N \g__zugferd_id_tl
\tl_new:N \g__zugferd_date_tl
@@ -577,6 +610,7 @@
\cctab_begin:N \g__zugferd_xml_cctab%
\__zugferd_define_xml_content:Nn \__zugferd_PostalTradeAddress:nnnnn {%
<ram:PostalTradeAddress>
+\bool_if:NF \g__zugferd_minimum_bool {%
\__zugferd_indent: <ram:PostcodeCode>#1</ram:PostcodeCode>
\tl_if_blank:nF {#2} {%
\__zugferd_indent: <ram:LineOne>#2</ram:LineOne>
@@ -585,12 +619,16 @@
\__zugferd_indent: <ram:LineTwo>#3</ram:LineTwo>
}%
\__zugferd_indent: <ram:CityName>#4</ram:CityName>
+}%
\__zugferd_indent: <ram:CountryID>#5</ram:CountryID>
</ram:PostalTradeAddress>%
}
\__zugferd_define_xml_content:Nn \__zugferd_PostalTradeAddress:nnnnnnn {%
-\__zugferd_PostalTradeAddress:nnnnn {#1} {#2} {#3} {#4} {#5}
-\tl_if_empty:nF {#6} {%
+\__zugferd_PostalTradeAddress:nnnnn {#1} {#2} {#3} {#4} {#5}%
+\bool_lazy_or:nnF {\g__zugferd_minimum_bool}%
+{\tl_if_blank_p:n {#6}}%
+{%
+\__zugferd_xml_newline_indent:%
<ram:URIUniversalCommunication>
\__zugferd_indent: <ram:URIID~schemeID="EM">#6</ram:URIID>
</ram:URIUniversalCommunication>%
@@ -625,10 +663,15 @@
\__zugferd_define_xml_writer:Nn \__zugferd_ApplicableHeaderTradeAgreement: {%
\__zugferd_write_xml:n {<ram:ApplicableHeaderTradeAgreement>}%
\int_gincr:N \g__zugferd_indent_int%
+\bool_lazy_and:nnF%
+{\tl_if_blank_p:V \g__zugferd_buyer_reference_tl}%
+{\g__zugferd_minimum_bool}%
+{%
\__zugferd_write_xml:e {%
<ram:BuyerReference>\g__zugferd_buyer_reference_tl</ram:BuyerReference>
-<ram:SellerTradeParty>%
+}
}%
+\__zugferd_write_xml:n {<ram:SellerTradeParty>}%
\int_gincr:N \g__zugferd_indent_int%
\__zugferd_write_xml:e {%
<ram:Name>\prop_item:Nn \g__zugferd_seller_AddressData_prop {name}</ram:Name>
@@ -642,15 +685,19 @@
}%
\int_gincr:N \g__zugferd_indent_int%
\__zugferd_write_xml:e {%
-<ram:Name>\prop_item:Nn \g__zugferd_buyer_AddressData_prop {name}</ram:Name>
+<ram:Name>\prop_item:Nn \g__zugferd_buyer_AddressData_prop {name}</ram:Name>%
+\bool_if:NF \g__zugferd_minimum_bool {
\__zugferd_DefinedTradeContact:N \g__zugferd_buyer_AddressData_prop%
\__zugferd_PostalTradeAddress:N \g__zugferd_buyer_AddressData_prop%
}%
+}%
\int_gdecr:N \g__zugferd_indent_int%
\__zugferd_write_xml:n {</ram:BuyerTradeParty>}%
\int_gdecr:N \g__zugferd_indent_int%
\__zugferd_write_xml:n {</ram:ApplicableHeaderTradeAgreement>}%
-\__zugferd_ApplicableHeaderTradeDelivery:V \g__zugferd_delivery_date_tl%
+\bool_if:NTF \g__zugferd_minimum_bool%
+{\__zugferd_write_xml:n {<ram:ApplicableHeaderTradeDelivery/>}}%
+{\__zugferd_ApplicableHeaderTradeDelivery:V \g__zugferd_delivery_date_tl}%
}%
\__zugferd_define_xml_content:Nn \__zugferd_ApplicableHeaderTradeDelivery:n {%
\bool_lazy_and:nnF {\prop_if_empty_p:N \g__zugferd_shipto_AddressData_prop}%
@@ -892,6 +939,9 @@
\__zugferd_indent: \__zugferd_write_inline:nn {#1} {#2}
}
\cctab_begin:N \g__zugferd_xml_cctab%
+\bool_if:NTF \g__zugferd_minimum_bool {%
+\cs_set_eq:NN \__zugferd_write_note:n \use_none:n%
+} {%
\__zugferd_define_xml_writer:Nn \__zugferd_write_note:n {%
\begingroup%
\let\\\iow_newline:%
@@ -904,6 +954,7 @@
}%
\endgroup%
}%
+}%
\begingroup%
\char_set_catcode_other:N \#%
\char_set_catcode:nn {32}{10}%
@@ -1003,7 +1054,7 @@
\int_gincr:N \g__zugferd_indent_int%
\__zugferd_write_xml:e {\__zugferd_Line_ApplicableTradeTax:nn {#1} {#2}}%
\__zugferd_write_xml:e {\__zugferd_BillingSpecifiedPeriod:VV \l__zugferd_start_date_tl \l__zugferd_end_date_tl}%
- \__zugferd_write_xml:e {\__zugferd_SpecifiedTradeSettlementLineMonetarySummation:n {#3}}%
+\__zugferd_write_xml:e {\__zugferd_SpecifiedTradeSettlementLineMonetarySummation:n {#3}}%
\int_gdecr:N \g__zugferd_indent_int%
\__zugferd_write_xml:n {</ram:SpecifiedLineTradeSettlement>}%
}%
@@ -1026,13 +1077,13 @@
\__zugferd_indent:<ram:EndDateTime>
\__zugferd_indent:n {2} <udt:DateTimeString~format="102">#2</udt:DateTimeString>
\__zugferd_indent:</ram:EndDateTime>
- </ram:BillingSpecifiedPeriod>
+ </ram:BillingSpecifiedPeriod>%
}%
}%
\__zugferd_define_xml_content:Nn \__zugferd_SpecifiedTradeSettlementLineMonetarySummation:n {%
<ram:SpecifiedTradeSettlementLineMonetarySummation>
\__zugferd_indent: <ram:LineTotalAmount>#1</ram:LineTotalAmount>
- </ram:SpecifiedTradeSettlementLineMonetarySummation>
+ </ram:SpecifiedTradeSettlementLineMonetarySummation>%
}
\cctab_end:
@@ -1071,13 +1122,17 @@
\__zugferd_define_xml_writer:Nn \__zugferd_SpecifiedTradeSettlementHeaderMonetarySummation:nnnnnnnn {%
\__zugferd_write_xml:n {<ram:SpecifiedTradeSettlementHeaderMonetarySummation>}%
\int_gincr:N \g__zugferd_indent_int%
+\bool_if:NF \g__zugferd_minimum_bool {
\__zugferd_write_rounded:nnn {2} {LineTotalAmount} {#1}
\__zugferd_write_rounded:nnn {2} {ChargeTotalAmount} {#2}
\__zugferd_write_rounded:nnn {2} {AllowanceTotalAmount} {#3}
+}
\__zugferd_write_rounded:nnn {2} {TaxBasisTotalAmount} {#4}
\__zugferd_write_rounded:nnnn {2} {TaxTotalAmount} {~currencyID="\l__zugferd_currency_tl "} {#5}
\__zugferd_write_rounded:nnn {2} {GrandTotalAmount} {#6}
+\bool_if:NF \g__zugferd_minimum_bool {
\__zugferd_write_rounded:nnn {2} {TotalPrepaidAmount} {#7}
+}
\__zugferd_write_rounded:nnn {2} {DuePayableAmount} {#8}
\int_gdecr:N \g__zugferd_indent_int%
\__zugferd_write_xml:n {</ram:SpecifiedTradeSettlementHeaderMonetarySummation>}%
@@ -1158,8 +1213,10 @@
\cctab_end:
\cs_generate_variant:Nn \__zugferd_SpecifiedTradePaymentTerms:nn {VV}
\__zugferd_define_xml_writer:Nn \__zugferd_SpecifiedTradePaymentTerms: {
+\bool_if:NF \g__zugferd_minimum_bool {
\__zugferd_SpecifiedTradePaymentTerms:VV \g__zugferd_payment_terms_str \g__zugferd_due_date_tl
}
+}
\cs_generate_variant:Nn \__zugferd_SpecifiedTradeSettlementPaymentMeans:nnn {vvv}
\__zugferd_define_xml_writer:Nn \__zugferd_SpecifiedTradeSettlementPaymentMeans: {
\tl_if_blank:VF \g__zugferd_payment_means_tl {
More information about the tex-live-commits
mailing list.