E-faktura — Bankgirot / Nets, la facture consommateur
E-faktura est le système historique suédois de facturation électronique pour les particuliers, lancé en 1995 par Bankgirot. Avec ~12 millions d'utilisateurs et ~250 millions de factures par an, c'est le réseau B2C le plus mature d'Europe. À ne pas confondre avec PEPPOL (B2B/B2G) : les deux coexistent sans recouvrement fonctionnel.
Historique — 30 ans de Bankgirot
Le système E-faktura est le fruit de 30 ans d'innovation paiements en Suède :
- 1959 : création de Bankgirocentralen (BgC) par les banques suédoises pour gérer les virements interbancaires domestiques.
- 1971 : introduction du système Bankgiro (numéros 7-8 chiffres) pour les paiements de factures, alternative à Plusgiro (poste).
- 1995 : lancement de E-faktura BgC — première offre mondiale de "facture présentée dans la banque en ligne", pionnier de l'EBPP (Electronic Bill Presentment and Payment).
- 2005 : intégration mobile via les apps bancaires (BankID nécessaire pour signature).
- 2014 : renommage en simplement "E-faktura", ouverture aux acteurs étrangers (Klarna, PayEx) pour la présentation B2C.
- 2022 : acquisition de Bankgirot par Nets Group (filiale Mastercard depuis 2021) pour ~9,5 Mds SEK. Voir section suivante.
Acquisition par Nets en 2022
L'acquisition de Bankgirot par Nets en 2022 a marqué un tournant structurel pour le paysage paiement nordique :
- Vendeur : consortium de 7 banques suédoises (SEB, Swedbank, Handelsbanken, Nordea, Danske Bank, Länsförsäkringar Bank, Skandiabanken) — anciens actionnaires historiques.
- Acheteur : Nets Group, racheté par Mastercard en 2021 (deal ~7,3 Mds USD). Création d'un acteur paneuropéen Nets couvrant DK, NO, SE, FI.
- Périmètre : 100% des actifs Bankgirot — infrastructure de paiement BG, E-faktura, traitement OCR, réconciliation Autogiro.
- Continuité opérationnelle : aucun changement utilisateur final, marque "Bankgirot" maintenue. Le siège reste à Stockholm.
- Conséquences réglementaires : autorisation par Konkurrensverket (autorité de la concurrence) en avril 2022, conditionnelle à l'engagement de non-discrimination entre banques.
- Vision Nets : consolider E-faktura SE avec eBoks (DK), Vipps (NO), MobilePay (DK/FI) pour créer une plateforme nordique unifiée — projet "Nordic Hub" 2025-2027.
Fonctionnement E-faktura
Le flux E-faktura suit un modèle 3-corner :
- Émetteur : entreprise B2C (Telia, Vattenfall, Ellevio, Apotek, ICA, SJ AB) émet la facture dans son ERP, l'envoie au format ITSME (Internet Transaction Security Multipart Encoding) à Bankgirot via une connexion SFTP/HTTPS sécurisée.
- Hub Bankgirot : route la facture vers la banque du destinataire (lookup par numéro de contrat E-faktura = identifiant client + n° bancaire).
- Banque réceptrice : présente la facture dans l'app/internet banking du destinataire, qui peut approuver d'un clic (signature BankID), modifier le montant ou refuser.
- Paiement : à l'échéance, la banque débite automatiquement le compte du destinataire et crédite l'émetteur via Bankgiro (compensation J+1).
- Confirmation : Bankgirot renvoie un accusé de paiement à l'émetteur, qui peut clôturer la créance dans son ERP.
Intégration avec les banques SE
E-faktura est présent dans 100% des banques de détail suédoises raccordées à Bankgirot :
| Banque | Part de marché B2C | App |
|---|---|---|
| Swedbank | ~28% | Swedbank Mobilbanken |
| Handelsbanken | ~17% | Handelsbanken Mobilbanken |
| SEB | ~20% | SEB Privat-App |
| Nordea | ~15% | Nordea Mobile |
| Länsförsäkringar Bank | ~5% | LF Mobilbank |
| Skandiabanken | ~3% | Skandia App |
| ICA Banken | ~5% | ICA Bank App |
| Resurs Bank, Klarna Bank, autres | ~7% | Apps respectives |
Coexistence avec PEPPOL B2B
E-faktura et PEPPOL coexistent sans recouvrement fonctionnel — chacun cible un segment différent :
- E-faktura : B2C exclusivement, présentation dans l'internet banking de personnes physiques, signature BankID pour approbation. Pas de cycle de validation B2B.
- PEPPOL : B2B / B2G via réseau eDelivery AS4, adressé aux ERP / systèmes de gestion. Pas de présentation aux personnes physiques.
- Pas de migration : contrairement au scénario Norvégien (eFaktura B2C sur EHF en cours d'unification), la Suède ne planifie pas de fusion. Les deux systèmes resteront indépendants à moyen terme.
- Ponts éventuels : certains éditeurs ERP (Visma, Fortnox) proposent un mode dual qui émet la facture en PEPPOL pour le B2B et en E-faktura pour le B2C selon le destinataire. Pas de standardisation.
OCR Bankgirot — référence structurée
Au cœur du système Bankgirot/E-faktura : la référence OCR (Optical Character Recognition reference, en réalité plus proche d'un identifiant Modulo 10), équivalent suédois de la communication structurée belge ou de la référence créancier SEPA.
- Longueur : 2 à 25 chiffres (généralement 8-12), dernier digit = checksum.
- Algorithme : "Modulo 10 vikt 1212" (variante du Luhn avec pondération alternée 1-2-1-2 depuis la droite).
- Variante longue : certains émetteurs utilisent le format "OCR avec longueur" (un digit indique la longueur totale, permettant un contrôle plus strict).
- Utilisation : imprimée sur la facture papier (ligne OCR au bas), reproduite automatiquement par les apps bancaires lors du paiement, permet à l'émetteur le rapprochement automatique paiement → créance.
# Calcul d'une référence OCR Bankgirot suédoise (algorithme Modulo 10 vikt 1212)
# Référence : longueur 1-25 chiffres + 1 checksum + (optionnel) longueur
# Exemple : facture 123456 chez Telia
# Référence interne entreprise: 123456
# On veut ajouter un checksum Luhn-like ("Modulo 10 vikt 1212")
def calculate_ocr_checksum(ref):
"""Bankgirot's OCR checksum — modulo 10 with alternating 1-2-1-2 weighting"""
digits = [int(d) for d in str(ref)]
weighted_sum = 0
for i, d in enumerate(reversed(digits)):
# Position 1 (le plus à droite) = poids 2, position 2 = poids 1, etc.
weight = 2 if i % 2 == 0 else 1
weighted = d * weight
# Si > 9, somme des deux digits (équivaut à -9)
weighted_sum += weighted if weighted < 10 else weighted - 9
return (10 - weighted_sum % 10) % 10
# Exemples
ref = "123456"
checksum = calculate_ocr_checksum(ref)
print(f"OCR référence : {ref}{checksum}")
# Sortie : OCR référence : 1234562
# Variante avec longueur encodée (référence "longue" Bankgirot)
ref = "98765432" # 8 digits
checksum = calculate_ocr_checksum(ref + str(len(ref) + 1)) # +1 pour le checksum
length = (len(ref) + 1 + 1) % 10 # longueur totale (digit final)
print(f"OCR longue : {ref}{length}{checksum}")