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

Posté par  . Licence CC By‑SA.
Étiquettes :
2
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 script

            '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 …

  • # Ici ?

    Posté par  . Évalué à 5 (+3/-0).

    dernière màj il y a 10 mois:

    https://github.com/akretion/factur-x-libreoffice-extension/

    This extension has been initially developped by Alexis de Lattre from Akretion France. It is published under the GPL licence.

    "Si tous les cons volaient, il ferait nuit" F. Dard

    • [^] # Re: Ici ?

      Posté par  . Évalué à 1 (+0/-0).

      Oui bien évidemment mais il manque dans la version d'Alexis de Latte le nom automatique du fichier factur X et son archivage dans des répertoires spécifiques.

      Ainsi mes factur X sont toutes enregistrées en aaynt comme nom la date et le numero de factures Et elles sont enresitrées dans des répertoires mois par mois.

      Celles de Novembre 2025 en Novembre 2025 etc .

      Et c'est totalement automatique et transparent. Je pense que cela peut servir à d'autres. Enfin c'est ce que je pense mes amis ont apprécié cette facilité..
      Bon courage à tous

      • [^] # Re: Ici ?

        Posté par  (site web personnel) . Évalué à 2 (+0/-0). Dernière modification le 28 novembre 2025 à 18:17.

        l'idée était aussi de remonter tes propositions comme une pull-request sur github :-)

        puis bon le nommage avec le nom du mois n'est pas trié dans l'ordre (outre qu'une espace dans un nom de répertoire n'est pas optimal) et ne respecte pas ISO-8601 qui donnerait des répertoires triés selon AAAA-MM-JJ soit 2026-11-28 pour aujourd'hui (bon, ok, ça ne passe pas bien l'an 10k mais bon Y10K ya du temps :p.

        Tu le fais pourtant pour le nom du fichier avec strftime('%Y-%m-%d') o_O

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.