Projet

Général

Profil

Autre #73948

formatage numéros de téléphone

Ajouté par Frédéric Péters il y a environ un an. Mis à jour il y a environ un an.

Statut:
Nouveau
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
28 janvier 2023
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

(description un peu longue pour servir de mémo sur la situation actuelle, pour ce ticket "chapeau", pour remettre de l'ordre et une compréhension générale, a minima dans w.c.s.).

w.c.s.; un champ peut être typé "numéro de téléphone français" ou "numéro de téléphone".

Ce paramétrage contrôlait la validation,

  • numéro de téléphone = grosso modo des chiffres r'\+?[-\(\)\d\.\s/]+'
  • numéro de téléphone franças = la même + validation par phonenumbers que le code pays est dans [33, 262, 508, 590, 594, 596]

À ça, parce que authentic a été modifié pour stocker/communiquer pour le profil usager des numéros formatés E164,
le préremplissage selon un champ du profil de type numéro a été modifié pour qu'à l'affichage ça soit un numéro
mis en forme qui apparaisse (ex: 01 23 45 67 89 et non +33123456789)

Cette remise en forme passe par la méthode get_formatted_phone,

def get_formatted_phone(number, country_code=None):
    if not country_code:
        country_code = get_publisher().get_site_option('default-country-code') or 'FR'
    try:
        pn = phonenumbers.parse(number)
    except phonenumbers.NumberParseException:
        try:
            pn = phonenumbers.parse(number, country_code)
        except phonenumbers.NumberParseException:
            return number

    if phonenumbers.is_valid_number(pn):
        return phonenumbers.format_number(pn, phonenumbers.PhoneNumberFormat.NATIONAL)
    else:
        return number

Cette fonction va tout le temps envoyer un numéro formaté local (phonenumbers.PhoneNumberFormat.NATIONAL).

Cas nominal on a dans authentic +33123456790 ça affiche 01 23 45 67 89, ok.

Mais si dans authentic on a +3223456789, pn = phonenumbers.parse(number) → PhoneNumber(country_code=32...) → .format_number() → 02 345 67 89 (ça affiche numéro local belge, pour l'agent français qui aurait à appeler l'usager, ça foirerait).

Cas de la Réunion :

  • numéro local, 0262 33 46 00
    • phonenumbers.parse('0262 33 46 00') → NumberParseException → ça se fait ensuite avec 'FR' → PhoneNumber(country_code=33, national_number=262334600... qui est faux
    • vs phonenumbers.parse('+2 62 33 46 00') → PhoneNumber(country_code=262, national_number=334600... qui est correct

→ pour parser, c'est ok uniquement quand les numéros envoyés par Authentic sont E164, lui passer un numéro local donnera l'impression de passer, mais sera faux.

(il me semble qu'il n'y a pas eu de migration des données existantes dans authentic vers le format E164)

Globalement, c'est OK sauf si le code pays local correspond au code pays du numéro.

Mais au final, comme ça enchaine les erreurs, à la Réunion on tape 0262 33 46 00, c'est pris comme +33 262 33 46 00, affiché sous la forme ("métropole") 02 62 33 46 00, ça donne l'impression d'être ok.


Demandes liées

Lié à w.c.s. - Development #72773: Sur une recherche full text adapter les numéros de téléphoneFermé23 décembre 2022

Actions
Lié à Hobo - Development #72760: écran sms, intégrer la sélection du code paysFermé23 décembre 2022

Actions
Lié à Publik - Development #49212: Création de compte avec un numéro de téléphone mobileEn cours01 octobre 2021

Actions
Lié à Authentic 2 - Bug #73998: settings : les codes pays pour les zones téléphoniques françaises hors-métropoles sont erronéesFermé31 janvier 2023

Actions

Historique

#1

Mis à jour par Frédéric Péters il y a environ un an

Étape 1, le default-country-code n'est pas aligné avec la nomenclature de phonenumbers, c'est source de confusion je trouve.

Dans phonenumbers, il y a des régions ("FR" ou "RE") et des "country code" (33 ou 262), on peut passer de l'un à l'autre :

>>> phonenumbers.country_code_for_region('FR')
33
>>> phonenumbers.country_code_for_region('RE')
262
>>> phonenumbers.region_code_for_country_code(33)
'FR'
>>> phonenumbers.region_code_for_country_code(262)
'RE'

On pourrait avoir dans la configuration local-phone-region ("FR") ou local-phone-country-code (33), mais pas default-country-code ("FR") ?

Comme on approche de la configuration globale côté hobo (#72760) c'est le moment.

#2

Mis à jour par Frédéric Péters il y a environ un an

Ensuite, pour w.c.s., continuons à stocker ce qui est tapé comme c'est tapé mais ajoutons une normalisation pour la recherche full text, sur les champs qualifiés de téléphone, où on indexerait également la forme E164.

Ça se passerait dans #72773, je me suis assigné ce ticket pour qu'il ne bouge pas sans qu'on sache globalement où on va.

#3

Mis à jour par Frédéric Péters il y a environ un an

  • Lié à Development #72773: Sur une recherche full text adapter les numéros de téléphone ajouté
#4

Mis à jour par Frédéric Péters il y a environ un an

#5

Mis à jour par Paul Marillonnet il y a environ un an

  • Lié à Development #49212: Création de compte avec un numéro de téléphone mobile ajouté
#6

Mis à jour par Paul Marillonnet il y a environ un an

  • Lié à Bug #73998: settings : les codes pays pour les zones téléphoniques françaises hors-métropoles sont erronées ajouté

Formats disponibles : Atom PDF