================================ Partner Phone Country Validation ================================ This module enhances phone number handling on partners by adding automatic country detection from phone numbers and enforcing country consistency. It extends the standard ``phone_validation`` module and the OCA ``base_phone`` module to provide additional features for phone number management. **Table of contents** .. contents:: :local: Features ======== Automatic Phone Number Normalization ------------------------------------ When entering a phone number, the module automatically converts numbers starting with ``00`` to the international ``+`` format: * ``0033 6 12 34 56 78`` → ``+33 6 12 34 56 78`` * ``0041 76 123 45 67`` → ``+41 76 123 45 67`` This normalization happens before the standard formatting, ensuring compatibility with the ``phonenumbers`` library. Automatic Country Detection --------------------------- When a phone number with an international prefix (``+xx``) is entered and the partner has no country set, the module automatically detects and sets the country based on the phone number prefix: * Enter ``+33 6 12 34 56 78`` → Country is set to **France** * Enter ``+32 4 123 45 67`` → Country is set to **Belgium** * Enter ``+41 76 123 45 67`` → Country is set to **Switzerland** This works for both ``phone`` and ``mobile`` fields. Country Validation Constraint ----------------------------- The module enforces that a country must be set on the partner if a phone or mobile number is present. This ensures data consistency and allows proper phone number formatting. If you try to save a partner with a phone number but no country, a validation error will be raised. How It Works ============ The module overrides the ``_onchange_phone_validation`` and ``_onchange_mobile_validation`` methods from the standard ``phone_validation`` module. The processing order is: 1. **Normalize**: Convert ``00xx`` format to ``+xx`` international format 2. **Detect country**: If no country is set, detect it from the phone prefix 3. **Format**: Call the standard formatting (via ``super()``) which formats the number according to the partner's country When the country is changed on a partner, both phone and mobile numbers are automatically reformatted to match the new country's format. Dependencies ============ This module depends on: * ``base``: Odoo base module * ``base_phone``: OCA module providing the ``phone.validation.mixin`` (from `connector-telephony <https://github.com/OCA/connector-telephony>`_) The ``base_phone`` module itself depends on the standard ``phone_validation`` module which uses the `phonenumbers <https://github.com/daviddrysdale/python-phonenumbers>`_ Python library. Installation ============ 1. Install the ``base_phone`` module from the OCA ``connector-telephony`` repository 2. Install this module using the standard Odoo module installation procedure Configuration ============= No configuration is required. The module works automatically once installed. Known Issues / Limitations ========================== National Numbers Without International Prefix --------------------------------------------- When changing a partner's country, phone numbers in **national format** (without international prefix) may not be reformatted if they are not valid for the new country. For example: * A French mobile ``06 12 34 56 78`` (without ``+33``) cannot be reformatted to a Belgian format because ``06`` is not a valid Belgian mobile prefix. * The ``phonenumbers`` library validates numbers and will keep the original format if the number is invalid for the target country. **Recommendation**: Always use international format (``+xx``) for phone numbers to ensure proper handling when countries change. Bug Tracker =========== Bugs are tracked on `Elabore Git Issues <https://git.elabore.coop/Elabore/partner-tools/issues>`_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smash it by providing a detailed and welcomed feedback. Credits ======= Authors ------- * `Elabore <https://elabore.coop>`_ Contributors ------------ * Boris Gallet <boris.gallet@elabore.coop> (`GitHub <https://github.com/b0g>`_) * Stéphan Sainléger <stephan.sainleger@elabore.coop> Funders ------- The development of this module has been financially supported by: * `Elabore <https://elabore.coop>`_ Maintainer ---------- .. image:: https://elabore.coop/logo.png :alt: Elabore :target: https://elabore.coop This module is maintained by Elabore.