O firmă client s-a mutat, contractul a luat sfârșit, iar dumneavoastră vreți să o arhivați în Odoo. Odoo răspunde cu un mesaj de eroare: „Nu puteți arhiva contacte care sunt legate de un utilizator activ. Arhivați mai întâi utilizatorul corespunzător.” Dacă firma are mai multe accesuri de portal, aceasta înseamnă: să căutați fiecare utilizator în parte, să-l arhivați individual, să reveniți la firmă, să arhivați din nou.
Pentru aceasta am scris micul modul Arhivarea unei firme împreună cu utilizatorii de portal (partner_archive_users) pentru Odoo 19. În locul mesajului de eroare apare o întrebare de confirmare, iar la „Da” utilizatorii de portal și firma sunt arhivați într-un singur pas. Modulul este disponibil pe GitHub ca software liber sub licența AGPL-3:
github.com/Alex0176/odoo-partner-archive-users
Folosim modulul la Biricon IT Services, în sistemul nostru de producție, din 3 noiembrie 2026. Este nou, deci experiența cu el este scurtă. Cine îl preia ar trebui să citească secțiunile despre Domeniu de aplicare și Limite .
Problema în Odoo standard
La arhivarea unui contact, Odoo verifică dacă de el este legat un utilizator și se oprește dacă da. Verificarea are sens, deoarece fiecare utilizator are nevoie de un contact. Pentru utilizatorii interni, adică angajați, blocarea este chiar dorită. La utilizatorii de portal ai clienților este însă, în primul rând, muncă manuală. Fiecare firmă client cu accesuri de portal, de exemplu pentru consultarea facturilor și a tichetelor, necesită la arhivare același proces:
- căutarea utilizatorilor firmei și ai persoanelor ei de contact,
- arhivarea fiecăruia în parte,
- înapoi la firmă,
- arhivarea firmei.
Soluția: o întrebare de confirmare
Modulul extinde calea Acțiune → Arhivare la contact, atât în formular, cât și în listă. Dacă de firma aleasă sau de persoanele ei de contact sunt legați utilizatori de portal activi, se deschide un dialog cu întrebarea „Firma trebuie într-adevăr arhivată? În sistem mai există utilizatori activi.” Dedesubt apar utilizatorii afectați, cu nume, nume de autentificare și contact.
- Da, arhivează firma și utilizatorii: mai întâi sunt arhivați utilizatorii, apoi firma.
- Anulare: nu se modifică nimic.
- Nu există utilizatori de portal: Odoo se comportă ca până acum, nu apare niciun dialog.
Ce se arhivează și ce nu
Domeniul de aplicare este intenționat restrâns:
- Doar utilizatori de portal și publici (
share = True). Utilizatorii interni nu sunt niciodată arhivați pe această cale. Dacă de contact este legat un acces de angajat, mesajul de eroare din Odoo rămâne. Astfel, nimeni nu blochează din greșeală un angajat pentru că a arhivat o firmă. - Persoanele de contact rămân active ca contacte. Doar accesurile lor de portal sunt arhivate. Aceasta corespunde Odoo standard, care la arhivarea unei firme nu atinge nici subcontactele.
- Doar calea de arhivare din interfață. Un
write({'active': False})direct, de exemplu într-un import sau script, trece neschimbat prin verificarea din Odoo.
Implementare tehnică
Modulul nu are câmpuri noi la modelele existente. Constă dintr-o extindere a res.partner.action_archive și dintr-un asistent (partner.archive.users.wizard) care apare ca dialog.
| Element | Sarcină |
|---|---|
action_archive la contact | Caută utilizatori activi cu share = True, legați de contact sau (la firme) de contactele firmei. Dacă există, în loc să arhiveze, returnează dialogul. |
| Asistent | Memorează firma și utilizatorii găsiți, îi afișează și, la „Da”, execută arhivarea cu cheia de context archive_linked_users. |
Context skip_archive_users_wizard | Dezactivează dialogul. Atunci se aplică din nou verificarea din Odoo. |
| Acces | Asistentul poate fi creat și folosit de utilizatorii interni (base.group_user). |
| Traducere | Germana (de.po) și șablonul (.pot) sunt incluse. |
Utilizatorii sunt căutați și arhivați cu drepturi sporite (sudo). Astfel, dialogul funcționează și pentru utilizatorii fără acces la administrarea utilizatorilor. Reversul este descris la Limite.
O constatare: testul a fost verde, dar dialogul era totuși defect
La prima utilizare, modulul a avut o eroare pe care testele automate nu au găsit-o. La primul clic pe „Arhivare” în interfață, în locul dialogului a apărut ecranul de eroare Odoo cu Cannot read properties of undefined (reading 'map').
Cauza: clientul web apelează action_archive direct și execută o acțiune returnată fără altă prelucrare. În acest proces citește obligatoriu cheia views a acțiunii. Acțiunea noastră avea doar view_mode. Acțiunile din butoane cu type="object" sunt completate în prealabil de server (clean_action în call_button), apelul direct al action_archive nu. Testele apelau metoda doar în Python, iar acolo câmpul lipsă nu a atras atenția.
Remedierea este o singură linie ("views": [(False, "form")]), la care se adaugă o verificare în test care cere exact această cheie. Cu această ocazie nu s-a arhivat nimic. Concluzia: cine returnează o acțiune dintr-o metodă pe care clientul o apelează direct (action_archive, action_unarchive și altele similare) ar trebui să includă întotdeauna views.
Instalare
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
Dependențele sunt base și contacts. După instalare, serviciul Odoo trebuie repornit, deoarece modulul conține cod Python. Cine operează un sistem de producție instalează modulul mai întâi pe o copie a bazei de date.
Limite
- Autorizare. Deoarece utilizatorii sunt arhivați cu drepturi sporite, oricine are voie să arhiveze un contact poate arhiva prin dialog și accesurile de portal ale acelei firme. Pentru utilizatorii interni, acest lucru nu se aplică. Cine dorește să securizeze mai fin accesurile de portal trebuie să adapteze modulul.
- Nicio restaurare automată. Dacă firma este reactivată ulterior, utilizatorii rămân arhivați. Ei trebuie reactivați manual.
- Doar contacte. Modulul privește firmele ca contacte (
res.partner). Arhivarea unei companii Odoo (res.company) are alte verificări, de exemplu dacă este încă compania implicită a unor utilizatori. Modulul nu este destinat acestui lucru. - Testat doar pe Odoo 19.0 Community. Pentru alte versiuni nu l-am verificat.
Întrebări frecvente
De ce nu sunt arhivați și angajații?
Un utilizator intern are drepturi în sistem și este de obicei legat de date, sarcini și autorizări proprii. Să-l blocăm ca efect secundar al arhivării unei firme ni se pare prea riscant. De aceea rămâne mesajul de eroare din Odoo.
Pot dezactiva întrebarea de confirmare?
În cod, prin contextul skip_archive_users_wizard. O setare în interfață nu există. Cine dezinstalează modulul primește din nou comportamentul standard din Odoo.
Sub ce licență este?
Sub AGPL-3. Erorile și îmbunătățirile sunt binevenite ca issue în repository-ul GitHub .
Asistență din partea Biricon IT Services
Administrăm instalări Odoo pentru întreprinderi mici și mijlocii: de la implementare, prin personalizări și migrări, până la funcționarea curentă. Dacă doriți să simplificați în Odoo procese precum arhivarea firmelor client, să configurați un portal pentru clienții dumneavoastră sau să puneți în siguranță un modul în instanța dumneavoastră de producție, vă ajutăm cu plăcere. Alte dezvoltări proprii: Numere de documente din prefix, an și contor, Firmenbuch și verificarea adreselor pentru clienți austrieci și Seturi de produse în ofertă ca secțiune.
Situație la: 3 noiembrie 2026. Versiunea modulului 19.0.1.0.0 cu remedierea din aceeași zi. Toate numele și numele de autentificare din figuri sunt alese liber.