QR-factures pour la Suisse

Bonjour,

@ Steelson

Je ne sais pas trop quel résultat tu me demandes.

Sur le fichier que tu avais placé hier à 15:39 et que tu as enlevé entre temps, j’avais d’abord la page Internet qui s’ouvrait automatiquement sur laquelle je pouvais lire le texte qui aurait dû apparaitre dans le QR-Code, mais aucun QR-Code n’était formé et la page Internet restait bloquée là-dessus. Une fois de retour manuellement sur Excel, la fenêtre du débogueur s’était ouverte et je pouvais aller constater la ligne qui bloquait (mais je ne suis plus certain sur laquelle ça bloquait et je ne peux plus refaire l’essai vu ta suppression).

Si tu parlais du fichier ‘’ image64.xlsm‘’ que tu as placé hier à 10 heures 18, je n’avais pas remarqué jusqu’à aujourd’hui qu’il contenait un bouton permettant de créer un QR-Code. A l’instant j’ai fait cet essai et ai placé ce QR-Code sur les deux sites de contrôles SIX et PostFinance ; des deux côtés ça a été refusé.

capture 08 02 4

@ Steelson et Bifrons

J’ai par hasard dû demander un (et pas deux) bulletin de versement pour mon compte privé à la Banque Raiffeisen (2 ou 3ème banque suisse ?) début aout 2020 - pour une seule personne qui devait me verser de l’argent - et cet institut financier a refusé avec insistance de m’envoyer un ancien bulletin, arguant que depuis le 1er juillet la Suisse était passée aux QR-Factures. C’est un signe quand même qu'on va donc gentiment y venir malgré tout.

Il est cependant vrai que le nombre de QR-Factures en circulation est encore très bas – je n’en ai encore jamais reçues en privé – et j’ai bien compris que la plupart de nos 700 membres n’en avaient jamais reçues avant la nôtre. Je reçois parfois des factures de prestataires qui ont leur compte à la Raiffeisen et qui envoient toujours d’anciens bulletins de versement. Je présume qu’ils vivent sur leur réserve ??

Oui, l’envoi des QR-Factures avec le fichier ‘’Version Python’’ couvre le 99 % des besoins (car probablement plus de la moitié des personnes utilisent les autres références aussi à disposition en plus du QR-Codes, que celles qui utilisent les QR-Code sont clientes d’autres institutions que PostFinance, que les clients de PostFinance n’ont pas tous des signes spéciaux dans leurs données et que tous les lecteurs de PostFinance ne fonctionnent pas identiquement), mais si l’on pouvait couvrir le 100 % des besoins ce serait quand même mieux, non ? Normalement Steelson est de mon avis

Cordialement

Yvouille,

oui je l'ai ôté car il ne me satisfaisait pas.

et oui je suis de ton avis ... car cela me permet de bien décrasser mes neurones et au passage relever de nouveaux challenges !

Voici une dernière version (je l'ai envoyée aussi en mp à Sébastien en lui demandant s'il avait d'autres pistes), mais cette version fonctionne très bien chez moi. J'espère ne pas avoir d'incompatibilité chez les uns et les autres. C'est encore une maquette.

Mieux vaut avoir un double écran ou mettre le navigateur en petit pour voir ce qui se passe ...

edit : suppression de cette version qui ne convient pas à PostFinance (m^me si ici les caractères sont bien codés)

Bon, j'ai encore une idée*, mais mieux s'arrêter là si cela fonctionne ! (Le mieux est l'ennemi du bien)

(*) éditer la facture avec une page local html et son script de production du QRCode

Si tu parlais du fichier ‘’ image64.xlsm‘’ que tu as placé hier à 10 heures 18, je n’avais pas remarqué jusqu’à aujourd’hui qu’il contenait un bouton permettant de créer un QR-Code. A l’instant j’ai fait cet essai et ai placé ce QR-Code sur les deux sites de contrôles SIX et PostFinance ; des deux côtés ça a été refusé.

capture 08 02 4

il a pu être refusé à cause des lignes d'encadrement des cellules et l'absence du logo ... j'espère !

Wow Apparemment de très bonnes nouvelles.

J'ai eu un peu peur car lors de mon premier essai, le QR-Code ci-dessous a été refusé des deux côtés.

08 02 1

Puis j'ai insisté et ça a finalement passé, avec plusieurs essais ! Par exemple :

capture helene bis postfinance

La croix suisse, bien que faisant très, très joli, semble ne servir à rien. Le même code sans elle passe également la rampe.

capture helene sans croix postfinance

D'ailleurs je vous conseille de mettre des croix françaises sur vos QR-Codes également

J'avais déjà constaté, mais j'ai à nouveau fait l'essai : les lecteurs de contrôle ne sont pas dérangés par le quadrillage Excel, je présume pour autant qu'il ne soit pas trop important, comme sur l'image ci-dessous qui a allègrement passé les tests :

capture avec quadrillage

Je suis soufflé par ton travail et attends la suite de ton développement (si je n'abuse !).

Bien à toi.

Quel est ton point de vue sur l'aspect ergonomique ? acceptable pour 700 factures ? parce que, on verra l'avis de Sébastien, mais ce qui me reste est de l'intégrer à ton fichier, sauf corrections de dimension pour qu'il soit carré à l'impression..

La durée d'impression des 700 factures annuelles est selon moi secondaire.

Le fait que tous les QR-Codes soient acceptés - et donc ne fassent pas d'histoires à plusieurs niveaux - est bien plus important.

Bonsoir,

J'utilise la procédure de Steelson (python) pour mes factures et je l'en remercie encore vivement. Je n'ai eu pour l'instant aucun refus (mais seulement une cinquantaine de factures émises).

J'ai aussi créé une facture avec nom et adresse fantaisiste comme Yvouille.

Je l'ai passé sans problème sur SIX et sur Postfinance. Même si chez Postfinance il mentionne une erreur sur le IBAN (normal, c'est un IBAN de banque)

Je mets le QR code lu chez Postfinance ainsi que les deux protocoles de SIX et Postfinance.

qr lu postfinance protocole qr six

Comment je procède : je génère le code QR, je copie et colle l'image en en .png dans un document Word puis je l'enregistre en tant qu'image .png. C'est cette image que je passe dans les différentes plateforme de test.

Quant à mes QR factures, je n'ai ni problème de dimensions ni de centrage car j'imprime directement à partir du fichier Excel (chaque client à son fichier).

Bonne soirée à tous et merci encore.

protocole qr postfinance

Protocole de Postfinance ci-dessus

Salut Sandra et merci pour ton info.

J'ai copié ton code et l'ai passé au contrôle PostFinance selon mes habitudes et j'ai des erreurs qui sont mentionnées.

Voici ma manière d'effectuer les contrôles :

capture 09 02 01

Et toi, as-tu créé - ou as-tu déjà, si tu es également cliente de PostFinance - ce ''compte'' qui est proposé et qui permet d'effectuer d'autres essais que les miens. Mais bon, dans un autre sens, je ne comprendrais pas qu'un QR-Code serait lu différemment pour les clients et non-clients de PostFinance.

Je te pose cette question car avec la manière indiquée ci-dessus, je n'obtiens, à ma connaissance, pas de protocole d'erreur alors que tu nous en montre un.

Cordialement.

Bonjour,

Non, je ne suis pas cliente de Post finance. En capture d'écran, je te montre ce que j'obtiens avec ma manière de procéder :

capture post finance

Tu trouves le protocole à télécharger en dessous du QR :

capture protocole

Et c'est en téléchargeant ce protocole que l'erreur d'IBAN est mentionnée.

Cordialement

Sandra

Si je fais une capture d'écran de mon propre code "original" qui est bien lu par post finance... alors là j'obtiens également des erreurs

capture qr

C'est très intéressant ta démo Sandra !! de quoi mettre cela sous le nez de PostFinance en réponse à la lettre envoyée à Yvouille ... ils auraient 2 décodeurs dont un à spectre limitée !

Je me posais aussi du coup la question de la différence de lecture qu'il pourrait y avoir chez eux entre

  • un paiement à distance (e-banking, mobile banking)
  • un paiement sur place (guichet ou automate)
  • un envoi sous enveloppe

On aurait pu imaginer que quelqu'un paye une facture via e-banking et via guichet/enveloppe auprès de PostFinance, les deux étant identiques en terme de noms (avec accents) et produites en utilisant python. Ce n'est peut-être pas possible ...

@ Sandra¨

Merci pour ta réponse. Tu as écrit :

Comment je procède : je génère le code QR, je copie et colle l'image en en .png dans un document Word puis je l'enregistre en tant qu'image .png.

J'ai essayé de généré un code, de sélectionner l'image du QR-Code et celle de la croix ensemble, de les copier et de les coller dans Word. Mais comment fais-tu pour transformer ton doc Word en PNG. J'ai cherché sur Internet, mais il semble qu'il faudrait télécharger un convertisseur ? Ce document Word, c'est la base de ta facture ou - dans une situation normale - tu imprimes ta facture par Excel ? J'imprime moi mes factures par Excel.

Jusqu'à maintenant, je n'ai jamais fais mes essais sur SIX et sur PostFinance qu'à l'aide de copies d'écran au format PNG et certaines passent d'autres pas. Ce serait quand même fort de café qu'il y ait une différence entre ta méthode et la mienne. Pour autant qu'il ne soit pas de qualité très basse, un QR-Code est un QR-Code, non ?

Bonjour à tous,

@ Yvouilles,

Sur Word, si tu fais un clic droit sur une image, tu as "enregistrer en tant qu'image". Et hop ! (normalement)

@Yvouille

Oui, je fais exactement comme l'a écrit JoyeuxNoël.

Non, j'ai utilisé cette technique uniquement pour faire valider mes qr code sur les différentes plate-formes. Sinon j'utilise excel et j'imprime directement la feuille Excel pour le récépissé de mes factures.

Oui un qr code est un qr code; mais assurément il se passe quelque chose au niveau de la plate-forme Post finance quand le fichier png est enregistré en tant qu'image depuis Word et une capture d'écran... mais quoi ? Mystère... Reste encore l'hypothèse de l'aléatoire... mais que je n'ai pas testé.

Dernière précision encore : le qr code qui est bien lu par posrfinance quand c'est un fichier .png (depuis word) et qui est mal lu quand c'est une capture d'écran en .png est très bien lu, avec les bons accents avec un lecteur qr depuis mon téléphone... donc

@ JoyeuxNoel

Effectivement que ça fonctionne ainsi. Je peux également enregistré deux images juxtaposées après les avoir groupées. Merci bien pour ton info.

@ Sandra

Merci également pour ton retour. Tu as placé sur Word et dans ton document PNG à la suite le QR-Code avec la croix ; l'as-tu fait comme je l'indique ci-dessus, par groupement d'images ?

Il y a quand même des QR-Codes générés avec une capture d'écran qui passent la rampe

Oui, les puristes crieront au scandale, mais en connaissant bien Word, on peut faire du photomontage assez facilement et le rendu est plutôt sympa quand même.

(non, ce n'est pas du vectoriel, non, ça ne vaut pas photoshop, mais c'est divertissant ^^)

Une piste éventuelle ... Le centrage du QR dans l'image ?
En faisant un copier/coller depuis word, on obtient chaque fois une image avec les mêmes marges autour du QR ce qui n'est pas le cas avec une capture d'écran qui est très aléatoire à ce niveau (marges et taille), l'image est normalement parfaitement carrée avec un copier/coller mais pas avec une capture
Leurs procédures de validation tient peut-être compte de ça ? Raison potentielle de la non validation d'une capture d'écran mais qui passe avec un copier/coller depuis word, faudrait tester les 2 solutions avec 2-3 QR différents et contenant des caractères spéciaux.

Bonjour,

Pour répondre aux exigences de PostFinance, avec l'aide de Yvouille, j'ai développé une nouvelle version utilisant le code javascript "Project Nayuki". Le code a été retouché pour pouvoir capter l'image produite en xml svg.

Cette version est basée sur un code javascript et donc monopolisera votre navigateur pour le faire fonctionner. L'image du QRCode est au format svg (image vectorielle) => XL2016 minimum

Conditions requises :

  • mettre dans un même dossier le fichier excel, les 2 fichiers .js et le fichier .css
  • un onglet htm
  • une zone QRValeur
  • une zone iciQRCode
  • la croix suisse dénommée "croix"
' mike steelson
' https://forum.excel-pratique.com/excel/qr-factures-pour-la-suisse-105696

Option Explicit

#If VBA7 Then
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If

Sub ProduireQRCode()

Dim nav As Long, MyData As DataObject, fichier As String, i%, compteur%, txt As String, imagesvg As String, xq%, yq%, wq%, hq%, cptr%, test As Boolean
Set MyData = New DataObject

    On Error Resume Next
        ' effacement de l'image le cas échéant
        ActiveSheet.Shapes.Range(Array("myQRCode")).Delete
    On Error GoTo 0

    ' écriture fichier html
    Close #1
    fichier = ThisWorkbook.Path & "\" & "myQRCode" & ".htm"
    Open fichier For Output As #1
        With Sheets("html")
            For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
                Print #1, .Cells(i, 1)
            Next
        End With
    Close #1

    ' vidage presse-papier
    MyData.SetText "vide"
    MyData.PutInClipboard

    ' lancement
    ShellExecute 0, "open", fichier, vbNullString, Environ("TEMP") & "\", 1 'SW_SHOWNORMAL

On Error GoTo messageErreur

    ' traitement du presse-papier renseigné par le code javascript du fichier html
    cptr = 0
    Do
        MyData.GetFromClipboard
        txt = MyData.GetText(1)
        Delay 500
        cptr = cptr + 1
        test = (txt Like "*DOCTYPE svg PUBLIC*")
    Loop Until test Or cptr > 20
    Debug.Print cptr * 500 / 1000 & " secondes", test
    If Not test Then
        MsgBox "QRCode non intercepté en 10 secondes - refaites un essai !"
        Exit Sub
    End If

    ' écriture du fichier image vectorielle
    imagesvg = ThisWorkbook.Path & "\" & "myQRCode" & ".svg"
    Open imagesvg For Output As #1
        Print #1, txt
    Close #1

    ' fermeture du navigateur
    SendKeys "%{F4}", True

    ' lieu de mise en place du QRCode
    With ActiveSheet.Range("iciQRCode")
        yq = .Top - 9: xq = .Left - 9
    End With
    wq = 146: hq = 146

    ' importation de la nouvelle image QRCode
    With ActiveSheet.Pictures.Insert(imagesvg)
        .Width = wq: .Height = hq
        .Left = xq: .Top = yq
        .Name = "myQRCode"
    End With

    ' mise en place de la croix
    With ActiveSheet.Shapes.Range("croix")
        .Left = xq: .Top = yq
        .IncrementLeft (wq - .Width) / 2
        .IncrementTop (hq - .Height) / 2
        .ZOrder msoBringToFront
    End With

    Kill imagesvg
    Kill fichier

    Exit Sub

messageErreur:
    'indique le numéro et la description de l'erreur survenue
    MsgBox "Erreur survenue ... " & "#" & vbCrLf & Err.Number & vbLf & Err.Description
    Exit Sub

End Sub

Function Delay(ms)
    Delay = Timer + ms / 1000
    While Timer < Delay: DoEvents: Wend
End Function

Public Function Encode_UTF8(astr)
    Dim c
    Dim n
    Dim utftext

    utftext = ""
    n = 1
    Do While n <= Len(astr)
        c = AscW(Mid(astr, n, 1))
        If c < 128 Then
            utftext = utftext + Chr(c)
        ElseIf ((c >= 128) And (c < 2048)) Then
            utftext = utftext + Chr(((c \ 64) Or 192))
            utftext = utftext + Chr(((c And 63) Or 128))
        ElseIf ((c >= 2048) And (c < 65536)) Then
            utftext = utftext + Chr(((c \ 4096) Or 224))
            utftext = utftext + Chr((((c \ 64) And 63) Or 128))
            utftext = utftext + Chr(((c And 63) Or 128))
        Else ' c >= 65536
            utftext = utftext + Chr(((c \ 262144) Or 240))
            utftext = utftext + Chr(((((c \ 4096) And 63)) Or 128))
            utftext = utftext + Chr((((c \ 64) And 63) Or 128))
            utftext = utftext + Chr(((c And 63) Or 128))
        End If
        n = n + 1
    Loop
    Encode_UTF8 = utftext
End Function

Sub dimensionnerCroix()
    With ActiveSheet.Shapes.Range("croix")
        .Width = 19
        .LockAspectRatio = msoFalse
        .Height = 19
        Debug.Print .Width, .Height
    End With
End Sub

Fonctionnement automatique de la macro :

  • la macro crée un fichier html temporaire et le lance
  • recueille le code image vectorielle et crée un fichier temporaire .svg
  • télécharge l'image et repositionne la croix au centre
  • supprime les fichiers temporaires

code de la page html générée (clone simplifié de la page de Nayuki) :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta charset="UTF-8"/>
<title>QR Code generator library</title>
<meta http-equiv="Content-Style-Type" content="text/css"/>
<meta http-equiv="Content-Script-Type" content="application/javascript"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<link rel="stylesheet" href="style.css" type="text/css"/>
<style type="text/css">
article input[type=radio] + label, article input[type=checkbox] + label {
margin-right: 0.8em;
padding-left: 0.2em;
}
article canvas, article svg {
padding: 1.0em;
background-color: #E8E8E8;
}
article form table td:first-child {
white-space: pre;
}
</style>
</head>
<body>
<div class="vert-main">
<div class="horz-main">
<article>

<form onsubmit="event.preventDefault();">
<div id="loading"></div>
<div id="loaded"></div>
<table class="noborder" style="width:100%">
<tbody>
<tr>
<td><label for="text-input"><strong>Text string:</strong></label></td>
="<td style=""width:100%""><textarea placeholder=""Data ici"" id=""text-input"" style=""width:100%; max-width:30em; height:5em; font-family:inherit"">"&Encode_UTF8(QRValeur)&"</textarea></td>"
</tr>
<tr>
<td><strong>QR Code:</strong></td>
<td>
<canvas id="qrcode-canvas" style="display:none"></canvas>
<svg xmlns="http://www.w3.org/2000/svg" id="qrcode-svg" style="width:30em; height:30em; display:none" stroke="none">
<rect width="100%" height="100%" fill="#FFFFFF"/>
<path d="" fill="#000000"/>
</svg>
</td>
</tr>
<tr>
<td><strong>Error correction:</strong></td>
<td>
<input type="radio" name="errcorlvl" id="errcorlvl-low" /><label for="errcorlvl-low">Low</label>
<input type="radio" name="errcorlvl" id="errcorlvl-medium"checked="checked" /><label for="errcorlvl-medium">Medium</label>
<input type="radio" name="errcorlvl" id="errcorlvl-quartile" /><label for="errcorlvl-quartile">Quartile</label>
<input type="radio" name="errcorlvl" id="errcorlvl-high" /><label for="errcorlvl-high">High</label>
</td>
</tr>
<tr>
<td>Output format:</td>
<td>
<input type="radio" name="output-format" id="output-format-bitmap" /><label for="output-format-bitmap">Bitmap</label>
<input type="radio" name="output-format" id="output-format-vector" checked="checked" /><label for="output-format-vector">Vector</label>
</td>
</tr>
<tr>
<td><label for="border-input">Border:</label></td>
<td><input type="number" min="0" max="100" step="1" value="4" id="border-input" style="width:4em"/> modules</td>
</tr>
<tr id="scale-row">
<td><label for="scale-input">Scale:</label></td>
<td><input type="number" min="1" max="30" step="1" value="8" id="scale-input" style="width:4em"/> pixels per module</td>
</tr>
<tr>
<td>Version range:</td>
<td>
Minimum = <input type="number" min="1" max="40" step="1" value="1"  id="version-min-input" style="width:4em" oninput="app.handleVersionMinMax('min');"/>,
maximum = <input type="number" min="1" max="40" step="1" value="40" id="version-max-input" style="width:4em" oninput="app.handleVersionMinMax('max');"/>
</td>
</tr>
<tr>
<td><label for="mask-input">Mask pattern:</label></td>
<td><input type="number" min="-1" max="7" step="1" value="-1" id="mask-input" style="width:4em"/> (−1 for automatic, 0 to 7 for manual)</td>
</tr>
<tr>
<td>Boost ECC:</td>
<td><input type="checkbox" checked="checked" id="boost-ecc-input"/><label for="boost-ecc-input">Increase <abbr title="error-correcting code">ECC</abbr> level within same version</label></td>
</tr>
<tr>
<td>Statistics:</td>
<td id="statistics-output" style="white-space:pre"></td>
</tr>
<tr id="svg-xml-row" style="display:none">
<td>SVG XML code:</td>
<td>
<textarea id="svg-xml-output" readonly="readonly" style="width:100%; height:15em; font-family:'Courier 10 Pitch BT',monospace; font-size:80%"></textarea>
</td>
</tr>
</tbody>
</table>
</form>
</article>
</div>
</div>
<script src="qrcodegen.js"></script>
<script src="qrcodegen-input-demo.js"></script>
</body>
</html>
Rechercher des sujets similaires à "factures suisse"