The lawyers' regime on omnibase/office. What a regime brings: its mandatory mentions and its safeguards, coded and tested; its own pages; its settings. The rules and their sources are in Rules and sources.
Compliance built into the code does not replace the Ordre's control.
Installation
composer require omnibase/lawyer # brings omnibase/office
// config/bundles.php
Base\Office\OfficeBundle::class => ['all' => true],
Base\Lawyer\LawyerBundle::class => ['all' => true],
# config/routes.yaml - after omnibase/office's
lawyer_controller:
resource: "@LawyerBundle/src/Controller/Client"
type: attribute
lawyer_admin_controller:
resource: "@LawyerBundle/src/Controller/Admin"
type: attribute
# config/packages/security.yaml
security:
role_hierarchy:
ROLE_LAWYER: [ROLE_STAFF]
ROLE_SECRETARY: [ROLE_STAFF]
ROLE_STAFF: [ROLE_USER]
ROLE_ADMIN: [ROLE_STAFF]
The roles are given by omnibase's groups (Base\Entity\User\Group): a group "Avocats" whose roles
are [ROLE_LAWYER], a group "Secrétariat" with [ROLE_SECRETARY].
Then a migration: three tables, lawyer_attorney, lawyer_area, lawyer_area_member.
In the layout, after the office's stylesheet:
<link rel="stylesheet" href="{{ asset('bundles/lawyer/css/lawyer.css') }}">
Configuration
# config/packages/lawyer.yaml - every key has a default
lawyer:
roles: { lawyer: ROLE_LAWYER, secretary: ROLE_SECRETARY, staff: ROLE_STAFF }
domains: ['dupont-avocat.fr'] # checked against RIN art. 10.5; none: the host of DEFAULT_URI
mediator: # printed on /mediation and in the legal notice
name: 'Médiateur de la consommation de la profession d’avocat'
address: '180 boulevard Haussmann, 75008 Paris'
email: 'mediateur-conso@mediateur-consommation-avocat.fr'
url: 'https://mediateur-consommation-avocat.fr'
rules_url: 'https://www.cnb.avocat.fr/fr/reglement-interieur-national-de-la-profession-davocat-rin'
payment:
enabled: false # see "Paying fees online"
route: ~
wording: [] # expressions added to the built-in list
The bundle sets three of omnibase/office's options (prepend): the warning above the contact form
(@lawyer.contact.notice: nothing confidential here, and no relation created), the menu of the
client's space, and where the booking e-mails send the client (lawyer_space).
Settings (back office, Réglages)
What only the firm knows, kept by omnibase's settings and read by Base\Lawyer\Service\Record:
| Setting | |
|---|---|
lawyer.firm.name |
the firm's denomination - what the domain name is read against |
lawyer.firm.structure |
the structure of practice (individual, SELARL, AARPI...) |
lawyer.firm.bar |
the bar it is registered with |
lawyer.firm.network |
the network it belongs to, if any |
lawyer.order.declared_at |
the day the site was declared to the conseil de l'Ordre (YYYY-MM-DD) |
lawyer.fees.terms |
how the fees are set (hourly rate, flat fees...) |
lawyer.fees.first_meeting |
the first meeting: how long, what it costs |
lawyer.fees.legal_aid |
legal aid: accepted or not |
The lawyers
Base\Lawyer\Entity\Attorney, one per member of the team who is a lawyer (as omnibase/health's
Practitioner is to a Member): bar, swornIn, specialisations, qualification,
dominantFields.
- A specialisation is a case of
Base\Lawyer\Enum\Specialisation- the 28 mentions of the official list.setSpecialisationValues()drops anything else: a specialisation is a certificate, not a wish. Two at most (Specialisation::MAX, a validation constraint). - Dominant fields: free words, three at most (
Attorney::MAX_DOMINANT_FIELDS, a validation constraint, RIN art. 10.2).
{% include '@Lawyer/client/_attorney.html.twig' with {attorney: lawyer_attorney(member)} only %}
The domain name
DomainName::assess('mareval-avocat.fr', ['Cabinet Maréval', 'Me Hortense Maréval']); // DomainName::OK
DomainName::assess('avocat-divorce.fr', $names); // GENERIC: no name, a field of law - forbidden
DomainName::assess('mareval-divorce.fr', $names); // MIXED: the name, and a field of law besides
DomainName::assess('lexium.fr', $names); // UNNAMED: no name the site knows
DomainName::assess('localhost', $names); // LOCAL: nothing to assess
The names are the firm's denomination and its lawyers' (Base\Lawyer\Service\Domains); the initials
of a denomination count as its abbreviation ("dma" for Dupont Martin & Associés). A reading aid: the
conseil de l'Ordre decides.
Pages
| Route | Path | |
|---|---|---|
lawyer_areas, lawyer_area |
/domaines, /domaines/{slug} |
the fields of practice (Area: summary, text, matters, who follows it) |
lawyer_fees |
/honoraires |
the fee agreement, how fees are set, quota litis forbidden, the first meeting, legal aid, how to pay, disagreement |
lawyer_mediation |
/mediation |
the firm first, then the consumer mediator of the profession and its coordinates; the bâtonnier |
lawyer_request |
/rendez-vous/demande |
a first appointment asked without an account |
lawyer_space |
/espace |
the client's space: appointments, documents |
lawyer_admin_declaration |
/admin/lawyer/declaration |
the memo for the Ordre (ROLE_ADMIN) |
Twig: lawyer_record(), lawyer_attorney(member), lawyer_areas(member), lawyer_mediator(),
lawyer_payment(), lawyer_rules_url().
A first appointment without an account
omnibase/office's booking pages ask to sign in, and a firm's clients are invited, not registered.
/rendez-vous/demande is a Symfony form (AppointmentRequestType, with omnibase's PrivacyType and
its box) that calls Booker::request() with no account: an appointment with status requested, the
words encrypted like every reason. Its warning asks for no confidential detail and not to name the
other party: the firm checks for a conflict of interest first.
Paying fees online
The bundle takes no payment. Base\Lawyer\Payment\FeePayment::isAvailable() is true when
Base\Marketplace\MarketplaceBundle exists (class_exists), lawyer.payment.enabled is on and
lawyer.payment.route names the application's payment page; the fees page then shows "Régler une
note d'honoraires" with what it may take: fees only (RIN art. 11.5), clients' funds going to the
CARPA (art. 6.2). Writing that payment page - a fee note paid through omnibase/marketplace and
glitchr/omnitrade - is the application's.
Who reads a document
Base\Lawyer\Security\OfficeAudience, beyond the client and whoever sent the document:
| sees it exists | reads it | |
|---|---|---|
a lawyer (ROLE_LAWYER) |
yes | yes |
the secretariat, the rest of the staff (ROLE_STAFF) |
yes | only what is not marked confidential |
| anyone else, the site's administrators included | no | no |
Back office (with omnibase/admin)
The CRUD of the lawyers and of the fields of practice, the settings section, the memo for the
Ordre, and eight checks in omnibase/office's office_compliance widget.
Demonstration accounts
In glitchr/omnibase's demo environment (its docs/20-architecture/demo.md) the sign-in page offers
one button for each role of a firm. Base\Lawyer\Demo\LawyerDemoAccounts declares them:
| Identifier | Role | |
|---|---|---|
avocate |
group "Avocats" (ROLE_LAWYER) |
the agenda, the requests to settle, the clients' documents: reads them, sends some |
avocat |
group "Avocats" (ROLE_LAWYER) |
the associate lawyer: an agenda of his own, the same documents |
secretariat |
group "Secrétariat" (ROLE_SECRETARY) |
the agenda, the requests, the site's messages; sees that a document exists, reads nothing confidential |
cabinet |
ROLE_ADMIN |
the firm's administration: team, fields of practice, settings, the memo for the Ordre, compliance |
client |
group "Clients" | the client's space: an appointment requested, a draft in the vault, an exhibit deposited |
The password is the identifier. The fixtures take the accounts from omnibase's factory and attach what makes them worth signing in as - a member of the team and an agenda, a request and documents:
public function __construct(private readonly \Base\Demo\DemoAccountFactory $accounts) {}
$avocate = $this->accounts->account('avocate', $manager); // created with its group, or the database's
A firm without one of these roles leaves it out (base.demo.exclude: [avocat] for a lawyer
practising alone); a site that renames one declares the same identifier in its own provider. The
labels are demo.<identifier>.label and .description in the lawyer domain.
More
Propose a change docs/index.md
Rules and sources
Each rule the bundle codes, the text it rests on, where that text was read, and the class and test that carry it. Read on 2026-10-05.
Compliance built into the code does not replace the Ordre's control: the conseil de l'Ordre is the only judge of a site's conformity.
The texts
| Text | Read at |
|---|---|
| RIN - Règlement intérieur national de la profession d'avocat, Conseil national des barreaux, consolidated version of 7 July 2026 (articles 2, 6, 10, 11) | https://www.cnb.avocat.fr/fr/reglement-interieur-national-de-la-profession-davocat-rin (the PDF: https://cnb.avocat.fr/medias/file/cnbrinmaj-08072026-6a4e79014f6b41.49207715.pdf) |
| The list of the mentions of specialisation (order of the garde des Sceaux of 28 December 2011), 28 mentions, two at most per lawyer | as the Conseil national des barreaux publishes it: https://www.cnb.avocat.fr/sites/default/files/documents/cnb_plaquette_specification_2022_pap.pdf |
| The consumer mediator of the lawyers' profession | its own site: https://mediateur-consommation-avocat.fr |
Coded rules
| # | Rule | Text | Class | Test |
|---|---|---|---|---|
| 1 | The domain name carries the lawyer's name or the firm's denomination, in full or abbreviated, before or after the word "avocat" | RIN art. 10.5: « Le nom de domaine doit comporter le nom de l'avocat ou la dénomination du cabinet en totalité ou en abrégé, qui peut être suivi ou précédé du mot « avocat ». » | Guard\DomainName, Service\Domains, Compliance\DomainNameCheck |
DomainNameTest, ChecksTest |
| 2 | A generic domain name is forbidden | RIN art. 10.5: « L'utilisation de noms de domaine évoquant de façon générique le titre d'avocat ou un titre pouvant prêter à confusion, un domaine du droit ou une activité relevant de celles de l'avocat, est interdite. » | the same (GENERIC: missing; MIXED: a warning) |
DomainNameTest |
| 3 | The site and its domain names are declared to the conseil de l'Ordre | RIN art. 10.5: « L'avocat qui ouvre ou modifie substantiellement un site Internet doit en informer le conseil de l'Ordre sans délai et lui communiquer les noms de domaine qui permettent d'y accéder. » | Compliance\OrderDeclarationCheck, the memo |
ChecksTest |
| 4 | What is said of specialisations and dominant fields is sent to the Ordre in its terms; any publicity too | RIN art. 10.2 (« doit transmettre les termes de cette communication sans délai au conseil de l'Ordre ») ; art. 10.3 (« Toute publicité doit être communiquée sans délai au conseil de l'Ordre. ») | Controller\Admin\DeclarationController (the memo lists them) |
the application's test |
| 5 | Only certified specialisations are shown | RIN art. 10.2: the lawyer may mention « sa ou ses spécialisations [...] régulièrement obtenues et non invalidées » | Enum\Specialisation (the 28 mentions), Entity\Attorney::setSpecialisationValues() |
AttorneyTest |
| 6 | The four words are for the holders of a certificate | RIN art. 10.2: « Seul l'avocat titulaire d'un ou de plusieurs certificats de spécialisation [...] peut utiliser pour sa communication [...] les mots « spécialiste », « spécialisé », « spécialité » ou « spécialisation » » | Guard\SpecialistWords, Compliance\SpecialisationCheck |
SpecialistWordsTest, ChecksTest |
| 7 | Three dominant fields at most | RIN art. 10.2: « L'information relative aux domaines d'activités dominantes, dont le nombre revendiqué ne peut être supérieur à trois » | Attorney::MAX_DOMINANT_FIELDS (constraint), SpecialisationCheck |
ChecksTest |
| 8 | Two mentions of specialisation at most | Conseil national des barreaux: « Un avocat peut obtenir et faire usage de deux mentions de spécialisation au maximum » | Specialisation::MAX (constraint), SpecialisationCheck |
ChecksTest |
| 9 | No comparison, no disparagement, no reference to judicial functions | RIN art. 10.2: « Sont prohibées : toute publicité mensongère ou trompeuse ; toute mention comparative ou dénigrante ; [...] toute référence à des fonctions juridictionnelles. » | Guard\Wording, Compliance\WordingCheck |
WordingTest, ChecksTest |
| 10 | The firm is identified, located, reachable, with its bar and its structure of practice | RIN art. 10.2: the lawyer must « faire état de sa qualité et permettre [...] de l'identifier, de le localiser, de le joindre, de connaître le barreau auquel il est inscrit, la structure d'exercice à laquelle il appartient et, le cas échéant, le réseau dont il est membre » | Compliance\IdentificationCheck |
ChecksTest |
| 11 | The client is told how fees are set | RIN art. 11.1: « L'avocat informe son client, dès sa saisine, des modalités de détermination des honoraires et l'informe régulièrement de l'évolution de leur montant. » | Compliance\FeesInformationCheck, /honoraires |
ChecksTest |
| 12 | A written fee agreement, announced on the fees page | RIN art. 11.2: « Sauf en cas d'urgence ou de force majeure ou lorsqu'il intervient au titre de l'aide juridictionnelle totale [...], l'avocat conclut par écrit avec son client une convention d'honoraires » | the fees page's text | the application's test |
| 13 | No quota litis | RIN art. 11.3: « Il est interdit à l'avocat de fixer ses honoraires par un pacte de quota litis. » | the fees page's text | the application's test |
| 14 | Paying online is for fees only; clients' funds go to the CARPA | RIN art. 11.5 (« Les honoraires sont payés [...] notamment en espèces, par chèque, par virement, par billet à ordre et par carte bancaire ») ; art. 6.2 (« L'avocat qui manie les fonds, effets ou valeurs de manière accessoire à une opération juridique ou judiciaire doit les déposer sans délai à la CARPA ») | Payment\FeePayment, Compliance\PaymentScopeCheck |
FeePaymentTest |
| 15 | The consumer mediator of the profession is named with its coordinates | the mediator's site (address, e-mail, form) | Compliance\MediatorCheck (a warning), /mediation, lawyer.mediator |
ChecksTest |
| 16 | Within the firm the lawyers read a client's document; the secretariat sees a title | the firm's choice, under RIN art. 2.1: « Le secret professionnel de l'avocat est d'ordre public. Il est général, absolu et illimité dans le temps. » | Security\OfficeAudience |
OfficeAudienceTest |
Guard\Wording, Guard\SpecialistWords and Guard\DomainName read words: a help to whoever
writes, shown in the back office. What they do not find is not thereby allowed.
What the application must keep (no check can see a template)
- RIN art. 10.5: « Le site de l'avocat ne peut comporter aucun encart ou bannière publicitaire, autres que ceux de la profession, pour quelque produit ou service que ce soit. »
- RIN art. 10.5: no hyperlink to a site whose content is contrary to the profession's essential principles; the lawyer visits the linked sites regularly. The memo recalls both.
- RIN art. 10.6: a denomination evoking generically the title, a field of law, a specialisation or an activity of the profession is forbidden - the same reading as the domain name's applies to the firm's name, which the bundle does not check.
To confirm (not coded as rules, or coded with this reserve)
- The current list of the mentions of specialisation: read in the CNB's 2022 leaflet (28 mentions); the order of 28 December 2011 as amended could not be read on Légifrance (it refuses automated readers). To be compared before a real firm relies on it.
- The article of the code de la consommation that has a professional give the mediator's coordinates (art. L. 616-1, as recalled from memory) was not read: the mediator and its coordinates are confirmed, the legal basis of the obligation is not - hence a warning, not a missing mention.
- Loi n° 71-1130 du 31 décembre 1971, art. 10 (fees, the mandatory agreement): cited by the RIN in the heading of its article 11, not read itself.
- The contest of fees before the bâtonnier (the fees and mediation pages say it): from RIN art. 11.5 (« il devra saisir son bâtonnier aux fins de taxation ») and the decree of 27 November 1991 cited in the heading of article 11, not read itself.
- The name of the mediator in office changes (a term of a few years): the configuration names the institution, not the person.
- Each bar's own rules (its règlement intérieur) may add to the RIN: not known to the bundle.