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.