Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion src/facturx/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
__version__ = "4.2"
import logging

from .facturx import (
generate_from_binary,
generate_from_file,
Expand All @@ -14,6 +15,8 @@
xml_check_xsd,
)

__version__ = "4.2"

__all__ = [
"generate_from_binary",
"generate_from_file",
Expand All @@ -28,3 +31,15 @@
"xml_check_schematron",
"xml_check_xsd",
]

logging.getLogger("factur-x").addHandler(logging.NullHandler())


def configure_script_logging(level=logging.INFO):
logger = logging.getLogger("factur-x")
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(
"%(asctime)s [%(levelname)s] %(message)s"
))
logger.addHandler(handler)
logger.setLevel(level)
5 changes: 1 addition & 4 deletions src/facturx/facturx.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,9 @@
import mimetypes
import os.path

VERSION = importlib.metadata.version("factur-x")
FORMAT = "%(asctime)s [%(levelname)s] %(message)s"
logging.basicConfig(format=FORMAT)
logger = logging.getLogger("factur-x")
logger.setLevel(logging.INFO)

VERSION = importlib.metadata.version("factur-x")
FACTURX_FILENAME = "factur-x.xml"
ZUGFERD_FILENAMES = ["zugferd-invoice.xml", "ZUGFeRD-invoice.xml"]
ORDERX_FILENAME = "order-x.xml"
Expand Down
29 changes: 11 additions & 18 deletions src/facturx/scripts/pdfextractxml.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,19 @@

from facturx import __version__ as fxversion
from facturx import get_xml_from_pdf
from facturx.facturx import logger
from facturx import configure_script_logging

__author__ = "Alexis de Lattre <alexis.delattre@akretion.com>"
__date__ = "March 2026"
__version__ = "0.4"

logger = logging.getLogger("factur-x")


def pdfextractxml(args):
logger.info(
"pdfextractxml version %s using factur-x lib version %s", __version__, fxversion
)
if args.log_level:
log_level = args.log_level.lower()
log_map = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warn": logging.WARN,
"error": logging.ERROR,
}
if log_level in log_map:
logger.setLevel(log_map[log_level])
else:
logger.error(
"Wrong value for log level (%s). Possible values: %s",
log_level,
", ".join(log_map.keys()),
)
sys.exit(1)

pdf_filename = args.facturx_orderx_file
out_xml_filename = args.xml_file_to_create
Expand Down Expand Up @@ -88,6 +73,7 @@ def main(args=None):
default="info",
help="Set log level. Possible values: debug, info, warn, error. "
"Default value: info.",
choices=["debug", "info", "warn", "error"],
)
parser.add_argument(
"-d",
Expand All @@ -111,6 +97,13 @@ def main(args=None):
help="Filename of the XML file that will be extracted from the PDF",
)
args = parser.parse_args()
log_map = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warn": logging.WARN,
"error": logging.ERROR,
}
configure_script_logging(level=log_map[args.log_level])
pdfextractxml(args)


Expand Down
29 changes: 11 additions & 18 deletions src/facturx/scripts/pdfgen.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,19 @@

from facturx import __version__ as fxversion
from facturx import generate_from_file
from facturx.facturx import logger
from facturx import configure_script_logging

__author__ = "Alexis de Lattre <alexis.delattre@akretion.com>"
__date__ = "October 2025"
__version__ = "0.9"

logger = logging.getLogger("factur-x")


def pdfgen(args):
logger.info(
"pdfgen version %s using factur-x lib version %s", __version__, fxversion
)
if args.log_level:
log_level = args.log_level.lower()
log_map = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warn": logging.WARN,
"error": logging.ERROR,
}
if log_level in log_map:
logger.setLevel(log_map[log_level])
else:
logger.error(
"Wrong value for log level (%s). Possible values: %s",
log_level,
", ".join(log_map.keys()),
)
sys.exit(1)

pdf_filename = args.regular_pdf_file
output_pdf_filename = args.facturx_orderx_pdf_file
Expand Down Expand Up @@ -128,6 +113,7 @@ def main(args=None):
default="info",
help="Set log level. Possible values: debug, info, warn, error. "
"Default value: info.",
choices=["debug", "info", "warn", "error"],
)
parser.add_argument(
"-d",
Expand Down Expand Up @@ -257,6 +243,13 @@ def main(args=None):
help="Optional list of additionnal attachments",
)
args = parser.parse_args()
log_map = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warn": logging.WARN,
"error": logging.ERROR,
}
configure_script_logging(level=log_map[args.log_level])
pdfgen(args)


Expand Down
31 changes: 17 additions & 14 deletions src/facturx/scripts/webservice.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,16 @@

from facturx import __version__ as fxversion
from facturx import generate_from_file
from facturx.facturx import logger as fxlogger
from facturx import configure_script_logging

MAX_ATTACHMENTS = 3 # TODO make it a cmd line option
__author__ = "Alexis de Lattre <alexis.delattre@akretion.com>"
__date__ = "July 2025"
__version__ = "0.2"
app = Flask(__name__)

logger = logging.getLogger('factur-x')


@app.route("/generate_facturx", methods=["POST"])
def generate_facturx():
Expand Down Expand Up @@ -125,28 +127,29 @@ def main(args=None):
default="info",
help="Log level. Possible values: critical, error, warning, "
"info (default), debug.",
choices=["critical", "error", "warning", "info", "debug"],
)
args = parser.parse_args()
log_map = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warning": logging.WARN,
"error": logging.ERROR,
"critical": logging.CRITICAL,
}
level = log_map[args.loglevel]
if args.logfile:
formatter = logging.Formatter("[%(asctime)s] %(levelname)s %(message)s")
handler = RotatingFileHandler(args.logfile)
if args.loglevel == "debug":
level = logging.DEBUG
elif args.loglevel == "critical":
level = logging.CRITICAL
elif args.loglevel == "warning":
level = logging.WARNING
elif args.loglevel == "error":
level = logging.ERROR
else:
level = logging.INFO
handler.setLevel(level)
handler.setFormatter(formatter)
fxlogger.setLevel(level)
fxlogger.addHandler(handler)
logger.setLevel(level)
logger.addHandler(handler)
app.logger.addHandler(handler)
app.logger.info("Start webservice to generate Factur-X invoices")
fxlogger.info(
else:
configure_script_logging(level=level)
logger.info(
"webservice version %s using factur-x lib version %s", __version__, fxversion
)
app.run(debug=args.debug, port=args.port, host=args.host)
Expand Down
30 changes: 12 additions & 18 deletions src/facturx/scripts/xmlcheck.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,20 @@

from facturx import __version__ as fxversion
from facturx import xml_check_schematron, xml_check_xsd
from facturx.facturx import logger
from facturx import configure_script_logging

__author__ = "Alexis de Lattre <alexis.delattre@akretion.com>"
__date__ = "March 2026"
__version__ = "0.5"


logger = logging.getLogger("factur-x")


def xmlcheck(args):
logger.info(
"xmlcheck version %s using factur-x lib version %s", __version__, fxversion
)
if args.log_level:
log_level = args.log_level.lower()
log_map = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warn": logging.WARN,
"error": logging.ERROR,
}
if log_level in log_map:
logger.setLevel(log_map[log_level])
else:
logger.error(
"Wrong value for log level (%s). Possible values: %s",
log_level,
", ".join(log_map.keys()),
)
sys.exit(1)

if not isfile(args.xml_file):
logger.error("%s is not a filename", args.xml_file)
Expand Down Expand Up @@ -73,6 +59,7 @@ def main(args=None):
default="info",
help="Set log level. Possible values: debug, info, warn, error. "
"Default value: info.",
choices=["debug", "info", "warn", "error"],
)
parser.add_argument(
"-f",
Expand All @@ -98,6 +85,13 @@ def main(args=None):
)
parser.add_argument("xml_file", help="Factur-X or Order-X XML file to check")
args = parser.parse_args()
log_map = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warn": logging.WARN,
"error": logging.ERROR,
}
configure_script_logging(level=log_map[args.log_level])
xmlcheck(args)


Expand Down