Project

General

Profile

Autre #73948

formatage numéros de téléphone

Added by Frédéric Péters almost 2 years ago. Updated 7 months ago.

Status:
Fermé
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
28 January 2023
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

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.


Related issues

Related to w.c.s. - Développement #72773: Sur une recherche full text adapter les numéros de téléphoneFermé23 December 2022

Actions
Related to Hobo - Développement #72760: écran sms, intégrer la sélection du code paysFermé23 December 2022

Actions
Related to Publik - Développement #49212: Création de compte avec un numéro de téléphone mobileEn cours01 October 2021

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

Actions

History

#1

Updated by Frédéric Péters almost 2 years ago

É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

Updated by Frédéric Péters almost 2 years ago

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

Updated by Frédéric Péters almost 2 years ago

  • Related to Développement #72773: Sur une recherche full text adapter les numéros de téléphone added
#4

Updated by Frédéric Péters almost 2 years ago

#5

Updated by Paul Marillonnet almost 2 years ago

#6

Updated by Paul Marillonnet almost 2 years ago

  • Related to Bug #73998: settings : les codes pays pour les zones téléphoniques françaises hors-métropoles sont erronées added
#7

Updated by Frédéric Péters 7 months ago

  • Status changed from Nouveau to Fermé

#72793 vient de passer et doit couvrir tout ça. (et c'est important de poser local-region-code hors France métropolitaine).

Also available in: Atom PDF