Фирма клиент е преминала към друг доставчик, договорът е прекратен и искате да я архивирате в Odoo. Odoo показва съобщение за грешка: „Не можете да архивирате контакти, свързани с активен потребител. Първо архивирайте съответния потребител.“ Ако фирмата има няколко потребителски профила в портала, това означава да намерите и архивирате всеки потребител поотделно, да се върнете към фирмата и отново да я архивирате.
За тази цел разработихме малкия модул Firma archivieren samt Portalbenutzern (partner_archive_users) за Odoo 19. Вместо съобщението за грешка се появява въпрос за потвърждение и при отговор „Да“ потребителите на портала и фирмата се архивират с една стъпка. Модулът е достъпен в GitHub като свободен софтуер под лиценз AGPL-3:
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 с поправката от същия ден. Всички имена и потребителски имена в изображенията са измислени.