Forum général.cherche-logiciel Factur X Extension réalisée par Alexis de Lattre

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
27
nov.
2025

Bonjour à tous.
J'utilise l'extension Factur X réalisée par Alexis de Lattre avec libre office sous ubuntu.

Je l'ai intégré dans un programme de facturation qui contient toutes les macros en oobasic.

Rappel de facture,journal, archivage, envoie automatique etc.

En fait il est plus complet que les programmes du commerce et fonctionne à merveille depuis de nombreuses années.
La factur X ne me convenait pas totalement car le nom n'atait pas automatiquement mentionné et les factures X n'étaient pas indexées dans des répertoires spécifiques par mois.
Dans la feuille 2 'ligne 35 j'ai indiqué le chemin relatif et j'ai modifié le scripte Python
ligne 293 du scripte 'invoice_path': {
'type': 'char',
'required': True,
'line': 35,
Et ligne 402 à 500 pour indiquer le chemin relatif de sauvegarde.

adaptation arc fiduciaire par Patrice Lemmonnier ligne 402 à 500

def generate_facturx_invoice_v1(button_arg=None):
doc = XSCRIPTCONTEXT.getDocument()
macro_path = os.path.dirname(uno.fileUrlToSystemPath(file))
localedir = os.path.join(macro_path, 'i18n')
gettext.bindtextdomain('facturx_macro', localedir=localedir)
gettext.textdomain('facturx_macro')

if len(doc.Sheets) < 2:
return msg_box(doc, _("The spreadsheet must contain at least 2 tabs."))
inv_sheet = doc.Sheets[0]
data_sheet = doc.Sheets[1]
```

filter data

data = get_and_check_data(doc, data_sheet)
if not data:
return
# prepare LO PDF export
pdf_option1 = PropertyValue()
pdf_option1.Name = "SelectPdfVersion"
pdf_option1.Value = 1

pdf_option2 = PropertyValue()
pdf_option2.Name = "Selection"
pdf_option2.Value = inv_sheet
pdf_options = (pdf_option1, pdf_option2)

pdf_export_arg1 = PropertyValue()
pdf_export_arg1.Name = "FilterName"
pdf_export_arg1.Value = "calc_pdf_Export"
pdf_export_arg2 = PropertyValue()
pdf_export_arg2.Name = "FilterData"
pdf_export_arg2.Value = uno.Any("[]com.sun.star.beans.PropertyValue", pdf_options)

pdf_export_args = (pdf_export_arg1, pdf_export_arg2)
pdf_tmp_file = NamedTemporaryFile('w', prefix='libo-fx-', suffix='.pdf')
pdf_tmp_file_url = uno.systemPathToFileUrl(pdf_tmp_file.name)
doc.storeToURL(pdf_tmp_file_url, pdf_export_args)

generate XML

xml_byte = generate_facturx_xml(data)
if not xml_byte:
return
``` # Additional attachments
additional_attachments = {}
if data.get('attachment_count'):
for a in range(data['attachment_count']):
attach_title = _('Select attachment No. %d') % (a + 1)
attachment_url = open_filepicker(attach_title, mode=0)
if attachment_url:
attach_filename = uno.fileUrlToSystemPath(attachment_url)
additional_attachments[attach_filename] = ''

# ----------------------------------------------------
# Enregistrement automatique sans boîte de dialogue
# ----------------------------------------------------
output_dir = data['invoice_path']

# output_dir = os.path.expanduser(output_dir)
# output_dir = os.path.expanduser("~/'invoice_path'/FACTURE X")
if not os.path.exists(output_dir):
os.makedirs(output_dir)

auto_filename = f"FACTURE_{data['invoice_date'].strftime('%Y-%m-%d')}_{data['invoice_number']}.pdf"
fx_pdf_filename = os.path.join(output_dir, auto_filename)
fx_pdf_filename_url = uno.systemPathToFileUrl(fx_pdf_filename)
```

PDF metadata

pdf_metadata = {
'author': data['issuer_name'],
'keywords': ','.join(['Factur-X', _('Invoice')]),
'title': _('%s: Invoice %s') % (
data['issuer_name'], data['invoice_number']),
'subject': _('Factur-X invoice %s issued by %s') % (
data['invoice_number'], data['issuer_name']),
}
generate_facturx_from_file(
pdf_tmp_file.name, xml_byte, facturx_level='minimum',
check_xsd=False, pdf_metadata=pdf_metadata,
output_pdf_file=fx_pdf_filename,
additional_attachments=additional_attachments)

pdf_tmp_file.close()
```

J'ai adressé mon scripte à Alexis de Lattre pour qu'il l'intègre à sa prochaine mise à jour.

En tous cas l'envoie de mes factur X sur le Partenaire Agrée ets presque transparent puisqu'il suffit de sélectionner les fichiers des répertoires classés par mois et année et de les importer.

Tout pourrait être automatisé mais c'est déja top.
Bon courage à tous …

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.