Една клиентска фирма е напуснала, договорът е прекратен и искате да я архивирате в Odoo. Odoo отговаря със съобщение за грешка: „Не можете да архивирате контакти, свързани с активен потребител. Първо архивирайте съответния потребител.“ Ако фирмата има няколко достъпа до портала, това означава: всеки потребител се търси поотделно, архивира се поотделно, връщане към фирмата, архивиране отново.
За тази цел написахме малкия модул Архивиране на фирма заедно с потребителите на портала (partner_archive_users) за Odoo 19. Вместо съобщението за грешка идва въпрос за потвърждение, а при „Да“ потребителите на портала и фирмата се архивират с една стъпка. Модулът е свободен софтуер под лиценза AGPL-3 в GitHub:
github.com/Alex0176/odoo-partner-archive-users
Използваме модула в Biricon IT Services от 3 ноември 2026 г. в нашата продуктивна система. Той е нов, така че опитът с него е кратък. Който го възприема, трябва да прочете разделите за обхвата и ограниченията .
Проблемът в стандарта на Odoo
При архивиране на контакт Odoo проверява дали към него е свързан потребител и прекъсва, ако е така. Проверката има смисъл, защото всеки потребител се нуждае от контакт. За вътрешните потребители, т.е. служителите, блокирането е и желано. При потребителите на портала на клиенти обаче то е преди всичко ръчна работа. Всяка клиентска фирма с достъпи до портала, например за преглед на фактури и заявки, изисква при архивиране един и същи ред на действие:
- да се потърсят потребителите на фирмата и на нейните лица за контакт,
- всеки да се архивира поотделно,
- връщане към фирмата,
- архивиране на фирмата.
Решението: въпрос за потвърждение
Модулът разширява пътя Действие → Архивиране в контакта, във формуляра както и в списъка. Ако към избраната фирма или към нейните лица за контакт са свързани активни потребители на портала, се отваря диалог с въпроса „Наистина ли да бъде архивирана фирмата? В системата все още има активни потребители.“ Отдолу са посочени засегнатите потребители с име, потребителско име и контакт.
- Да, архивиране на фирмата и потребителите: Първо се архивират потребителите, след това фирмата.
- Отказ: Нищо не се променя.
- Няма потребители на портала: Odoo се държи както досега, не се появява диалог.
Какво се архивира и какво не
Обхватът е умишлено тесен:
- Само потребители на портала и публични потребители (
share = True). Вътрешни потребители никога не се архивират по този път. Ако към контакта е свързан достъп на служител, съобщението за грешка на Odoo остава. Така никой не блокира случайно служител, защото е архивирал фирма. - Лицата за контакт остават активни като контакти. Архивират се само техните достъпи до портала. Това съответства на стандарта на Odoo, който при архивиране на фирма също не докосва подконтактите.
- Само пътят за архивиране от интерфейса. Директно
write({'active': False}), например при импорт или скрипт, минава непроменено през проверката на Odoo.
Техническа реализация
Модулът няма нови полета в съществуващи модели. Състои се от разширение на res.partner.action_archive и от помощник (partner.archive.users.wizard), който се появява като диалог.
| Градивен елемент | Задача |
|---|---|
action_archive в контакта | Търси активни потребители с share = True, свързани с контакта или (при фирми) с контакти на фирмата. Ако има такива, вместо архивиране се връща диалогът. |
| Помощник | Съхранява фирмата и намерените потребители, показва ги и при „Да“ изпълнява архивирането с контекстния ключ archive_linked_users. |
Контекст skip_archive_users_wizard | Изключва диалога. Тогава отново важи проверката на Odoo. |
| Достъп | Помощника могат да създават и използват вътрешните потребители (base.group_user). |
| Превод | Приложени са немски превод (de.po) и шаблон (.pot). |
Потребителите се търсят и архивират с повишени права (sudo). Така диалогът работи и за потребители без достъп до управлението на потребителите. Обратната страна е описана в ограниченията.
Една находка: тестът беше зелен, но диалогът все пак беше повреден
Модулът имаше при първата употреба грешка, която автоматичните тестове не откриха. При първото щракване върху „Архивиране“ в интерфейса вместо диалога се появи екранът за грешка на Odoo с Cannot read properties of undefined (reading 'map').
Причината: Уеб клиентът извиква action_archive директно и изпълнява върнатото действие без допълнителна обработка. При това той задължително чете ключа views на действието. Нашето действие имаше само view_mode. Действията от бутони с type="object" сървърът допълва предварително (clean_action в call_button), но не и при директно извикване на action_archive. Тестовете извикваха метода само в Python и там липсващото поле не направи впечатление.
Поправката е един ред ("views": [(False, "form")]), към него идва проверка в теста, която изисква точно този ключ. При това нищо не беше архивирано. Поуката: който връща действие от метод, който клиентът извиква директно (action_archive, action_unarchive и подобни), трябва винаги да добавя и views.
Инсталиране
git clone https://github.com/Alex0176/odoo-partner-archive-users.git
ln -s /pfad/odoo-partner-archive-users/partner_archive_users /pfad/addons/
odoo-bin -c odoo.conf -d <datenbank> -i partner_archive_users --stop-after-init
Зависимости са base и contacts. След инсталирането услугата на Odoo трябва да бъде рестартирана, защото модулът съдържа Python код. Който управлява продуктивна система, инсталира модула първо върху копие на базата данни.
ограниченията
- Разрешение. Тъй като потребителите се архивират с повишени права, всеки, който има право да архивира контакт, може чрез диалога да архивира и достъпите до портала на тази фирма. За вътрешни потребители това не важи. Който иска по-прецизно да защити достъпите до портала, трябва да адаптира модула.
- Няма автоматично възстановяване. Ако фирмата бъде активирана отново по-късно, потребителите остават архивирани. Те трябва да бъдат реактивирани на ръка.
- Само контакти. Модулът се отнася за фирми като контакти (
res.partner). Архивирането на фирма в Odoo (res.company) има други проверки, например ако тя още е фирмата по подразбиране на потребители. Модулът не е предназначен за това. - Тестван само с Odoo 19.0 Community. За други версии не сме го проверявали.
Често задавани въпроси
Защо служителите не се архивират заедно?
Вътрешният потребител има права в системата и обикновено е свързан със собствени данни, задачи и разрешения. Да го блокираме като страничен ефект от архивирането на фирма ни се струва твърде рисковано. Затова остава съобщението за грешка на Odoo.
Мога ли да изключа въпроса за потвърждение?
В кода чрез контекста skip_archive_users_wizard. Настройка в интерфейса няма. Който деинсталира модула, отново получава стандартното поведение на Odoo.
Под какъв лиценз е?
Под AGPL-3. Грешки и подобрения са добре дошли като issue в хранилището в GitHub .
Подкрепа от Biricon IT Services
Грижим се за инсталации на Odoo за малки и средни предприятия: от внедряването през адаптациите и миграциите до текущата експлоатация. Ако искате да опростите процеси като архивирането на клиентски фирми в Odoo, да изградите портал за вашите клиенти или да въведете безопасно модул във вашата продуктивна инстанция, с удоволствие ще помогнем. Още собствени разработки: Номера на документи от префикс, година и брояч, Търговски регистър и проверка на адреси за австрийски клиенти и Продуктови комплекти в офертата като раздел.
Към: 3 ноември 2026 г. Версия на модула 19.0.1.0.0 с поправката от същия ден. Всички имена и потребителски имена в изображенията са произволно избрани.