Odoo: Поиск партнера по номеру телефона в заказе

Довольно удобно, когда при создании заказа можно быстро найти нужного партнера.

Изменнеие поиска на уровне модели

Так как наш партнер или покупатель в Odoo относиться к сущности res.partner, мы можем переопределить поиск по данным этой модели. Для этого, расширяем модель следующим образом:

# Код из модуля OCA/partner-contact: https://github.com/OCA/partner-contact/blob/11.0/partner_phone_search/models/res_partner.py
class ResPartner(models.Model):
    _inherit = 'res.partner'
    @api.model
    def name_search(self, name, args=None, operator='ilike', limit=100):
        if not args:
            args = []
        if name:
            domain = ['|', '|', 
                      ('phone', operator, name),
                      ('mobile', operator, name),
                      ('email', operator, name)
                      ]
            partners = self.search(domain + args, limit=limit,)
            res = partners.name_get()
            if limit:
                limit_rest = limit - len(partners)
            else:
                limit_rest = limit
            if limit_rest or not limit:
                args += [('id', 'not in', partners.ids)]
                res += super(ResPartner, self).name_search(
                    name, args=args, operator=operator, limit=limit_rest)
            return res

Код работает на Odoo 11 & 12. На других версиях не тестировался.

Оригинальный вариант name_search можно посмотреть по ссылке https://github.com/odoo/odoo/blob/a12e29c963201add0ea6b15a1e8e19a6af1db032/odoo/addons/base/models/res_partner.py.

По умолчанию, в Odoo поиск ищет по имени клиента. Если посмотреть в view, за поиск в поле customer отвечает следующий код:

<field name="partner_id" widget="res_partner_many2one" domain="[('customer','=',True)]" context="{'search_default_customer':1, 'show_address': 1, 'show_vat': True}" options="{"always_reload": True}"/>

Его можно заменить:

<field name="partner_id" filter_domain="['|', '|', ('phone', 'ilike', self), ('mobile', 'ilike', self), ('name', 'ilike', self)]" string="Покупатель"/>

В результате, получим аналогичное поле для поиска, но оно будет учитывать номера телефона (mobile, phone). Из минусов — в поиске отображаются все контакты, которые подходят под критерий поиска.

Чтобы этого измежать, добавим еще один фильтр:

<field name="partner_id" filter_domain="['&',('customer','=',True), ('|', '|',('phone', 'ilike', self), ('mobile', 'ilike', self), ('name', 'ilike', self))]" string="Покупатель"/>

В XML амперсанд записывается иначе. Не забываем использовать предопределенные сущности в XML.

полный список: https://en.wikipedia.org

Готовые модули

В магазине Odoo есть несколько модулей, которые позволяют добавить подобный функционал. К сожалению, для Odoo 12 подобный модуль стоит 40$ (Partner Search by Phone). Есть более дешевый плагин — Partner Search by Number за 8€.

Для 10 версии доступен бесплатный плагин. Для 11 версии можно попробовать плагин из OCA: github.com/OCA/partner-contact/tree/11.0/partner_phone_search.