The legal professions, one bundle and a profile for each. A site says which profession it is for; the bundle loads that profile, and it alone.
Compliance built into the code does not replace the control of the Ordre or of the chamber.
Installation
composer require omnibase/legal # a lawyer or a notary: omnibase/office too
// config/bundles.php - a lawyer's or a notary's site
Base\Office\OfficeBundle::class => ['all' => true],
Base\Legal\LegalBundle::class => ['all' => true],
# config/packages/legal.yaml
legal:
profession: lawyer # lawyer | notary | jurist - required
# config/routes.yaml - after omnibase/office's
legal:
resource: .
type: legal
The loader imports the practice's pages and the chosen profile's, the back office's when omnibase/admin is installed - none of another profession's.
# config/packages/security.yaml
security:
role_hierarchy:
ROLE_LAWYER: [ROLE_STAFF] # a lawyer's site
ROLE_SECRETARY: [ROLE_STAFF]
ROLE_NOTARY: [ROLE_STAFF] # a notary's site
ROLE_CLERK: [ROLE_STAFF]
ROLE_STAFF: [ROLE_USER]
ROLE_ADMIN: [ROLE_STAFF]
Then make:migration: a lawyer's or a notary's site gets legal_area and legal_area_member; a
lawyer's legal_attorney too; a jurist's none.
In the layout, after the office's stylesheet:
<link rel="stylesheet" href="{{ asset('bundles/legal/css/legal.css') }}">
How a profile is made
src/
Profession.php lawyer | notary | jurist; hasPractice()
Practice/ what a firm and an office share, on omnibase/office
ProfileInterface what a profession tells the practice: what identifies it,
its own forbidden words, its page of what it costs
Entity/Area a field of practice (table legal_area), its list "items"
Service/Record the settings every profession has: name, professional body,
the day the site was declared to it, the fees
Compliance/ IdentificationCheck, MediatorCheck, WordingCheck, DeclarationCheck
Security/OfficeAudience who reads a client's document (legal.roles.readers)
Controller/ /domaines, /mediation, /rendez-vous/demande, /espace; the CRUD of areas
Lawyer/ Notary/ Jurist/ one profile each
A profile's folder is loaded only when it is the site's profession, and every service in it carries
the tag legal.profile with its profession (debug:container --tag=legal.profile). Its checks are
omnibase/office's ComplianceCheckInterface (autoconfigured): only the chosen profile's run in the
widget. Its entities are mapped by LegalExtension::prepend() for that profession alone - a site has no
table of another's.
A profile gives the practice <Profile>Profile (a ProfileInterface) and Service\<Profile>Record
(a Record); its labels are under its name in the legal translation domain
(lawyer.compliance.domain, notary.tariff.title...), in French and English.
What is common to a whole profession stays in its profile (a lawyer's certified specialisations, fee agreement and declaration to the Ordre; a notary's chamber, regulated tariff and professional address). Only what is one firm's or one office's goes into the site's own code.
Configuration
legal:
profession: notary
roles:
readers: ~ # default: the profession's - [ROLE_LAWYER]; [ROLE_NOTARY, ROLE_CLERK]
staff: ROLE_STAFF
mediator: ~ # default: the profession's consumer mediator; a mediator named here replaces it whole
rules_url: ~ # default: the profession's (a lawyer: the RIN)
wording: [] # expressions added to the built-in list
lawyer:
domains: [] # RIN art. 10.5; none: the host of DEFAULT_URI
payment: { enabled: false, route: ~ } # fees only, with omnibase/marketplace
notary:
email_suffix: notaires.fr
tariff: { code_url: …, order: 'arrêté du 25 février 2026', order_url: …, until: '2028-02-29', info_url: … }
jurist:
authorized_status: ~ # teacher | regulated_profession
Only the chosen profession's section becomes parameters (legal.lawyer.domains,
legal.notary.tariff...).
Settings (back office, Réglages)
| Setting | Lawyer | Notary |
|---|---|---|
legal.practice.name |
the firm's denomination | the structure that holds the office |
legal.body.name |
the bar | the chamber |
legal.body.declared_at |
declared to the conseil de l'Ordre on | declared to the chamber on |
legal.fees.terms |
how the fees are set | fees for what the tariff does not cover |
legal.lawyer.structure, .network, .first_meeting, .legal_aid |
✓ | |
legal.notary.crpcen, .brand_applied, .discounts |
✓ |
Pages
| Route | Path | |
|---|---|---|
legal_areas, legal_area |
/domaines, /domaines/{slug} |
the fields of practice |
legal_mediation |
/mediation |
the practice, then the profession's consumer mediator, then its professional body |
legal_request |
/rendez-vous/demande |
a first appointment asked without an account (omnibase/office's form) |
legal_space |
/espace |
the client's space: appointments, documents |
legal_fees |
/honoraires |
lawyer: how fees are set, the agreement, paying online |
legal_tariff |
/tarifs |
notary: what the costs are made of, the official text, the discounts |
legal_admin_declaration |
/admin/legal/declaration |
lawyer: the memo for the conseil de l'Ordre |
Templates extend omnibase/office's layout and are overridden the usual way
(templates/bundles/LegalBundle/...). Twig: legal_profession(), legal_record(),
legal_areas(member), legal_mediator(), legal_rules_url(), legal_fees_route(); a lawyer's
legal_attorney(member), legal_payment(); a notary's legal_tariff().
Demonstration accounts
In omnisense/omnibase's demo environment the profile declares one account for each role:
avocate, avocat, secretariat, cabinet, client (lawyer); notaire, clerc, accueil,
etude, client (notary). The password is the identifier; labels <profession>.demo.<identifier>.*
in the legal domain. A jurist's site declares its own.
From omnibase/lawyer and omnibase/notary
The two bundles were one structure twice; they are abandoned for this one (2026-10-09). For a site:
composer require omnibase/legalin place of either;Base\Legal\LegalBundleinconfig/bundles.php;legal.profession; the routes bytype: legal;- classes:
Base\Lawyer\Entity\Area/Base\Notary\Entity\Area→Base\Legal\Practice\Entity\Area(getMatters()/getDeeds()→getItems()),Base\Lawyer\Entity\Attorney→Base\Legal\Lawyer\Entity\Attorney,Base\Lawyer\Service\Record→Base\Legal\Lawyer\Service\LawyerRecord,Base\Notary\Service\Record→Base\Legal\Notary\Service\NotaryRecord; - routes
lawyer_*/notary_*→legal_*; Twiglawyer_*()/notary_*()→legal_*();@Lawyer/client/_attorney.html.twig→@Legal/lawyer/_attorney.html.twig; classesla-*/no-*→lg-*; parameterslawyer.*/notary.*→legal.*(legal.mediator,legal.lawyer.domains,legal.notary.tariff); - a migration that renames, never drops:
lawyer_area/notary_area→legal_area(matters/deeds→items),*_area_member→legal_area_member(area_id,member_id),lawyer_attorney→legal_attorney, and the settings' paths (lawyer.firm.name→legal.practice.name...). The sites avocat and notaire carry one each to copy.
More
Lawyers · Notaries · Jurists · Configuration reference · Testing
Propose a change docs/index.md
Lawyers - rules and sources
Each rule the profile codes (classes under Base\Legal\; tests under tests/), 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 ». » | Lawyer\Guard\DomainName, Lawyer\Service\Domains, Lawyer\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. » | Lawyer\Compliance\OrderDeclarationCheck (on Practice\Compliance\DeclarationCheck), 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 » | Lawyer\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 » » | Lawyer\Guard\SpecialistWords, Lawyer\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. » | Practice\Guard\Wording, Practice\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 » | Practice\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. » | Lawyer\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 ») | Lawyer\Payment\FeePayment, Lawyer\Compliance\PaymentScopeCheck |
FeePaymentTest |
| 15 | The consumer mediator of the profession is named with its coordinates | the mediator's site (address, e-mail, form) | Practice\Compliance\MediatorCheck (a warning), /mediation, legal.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. » | Practice\Security\OfficeAudience |
OfficeAudienceTest |
Practice\Guard\Wording, Lawyer\Guard\SpecialistWords and Lawyer\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.
Propose a change docs/lawyer.md
Notaries - rules and sources
Each rule the profile codes (classes under Base\Legal\; tests under tests/), 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 chamber's control: the chamber of notaries verifies its notaries' sites and is the only judge of their conformity.
The texts
| Text | Read at |
|---|---|
| RPN - règlement professionnel du notariat, approved by the order of 29 January 2024 (NOR JUSC2402635A, JORF of 31 January 2024, in force 1 February 2024) | full text of the Journal officiel: https://anc.notaires.fr/wp-content/uploads/2024/09/Arrete-RPN-du-29.01.24.pdf ; Légifrance: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000049060695 |
| Code de déontologie des notaires - decree n° 2023-1297 of 28 December 2023 | Légifrance: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000048706693 - not readable from the build environment (Légifrance refuses automated readers); only what the RPN and the Autorité de la concurrence quote of it was used |
| Decree n° 73-1202 of 28 December 1973 as amended by decree n° 2019-257 of 29 March 2019 (personalised solicitation, online services) | as summarised by the Autorité de la concurrence, opinion n° 23-A-19 of 1 December 2023, § 140-141: https://www.autoritedelaconcurrence.fr/sites/default/files/integral_texts/2024-02/23a19.pdf |
| Code de commerce, art. L. 444-1 and following, R. 444-1 and following, A. 444-53 and following (the tariff) | as presented by the Conseil supérieur du notariat: https://www.notaires.fr/fr/profession-notaire/le-tarif-du-notaire-emoluments-et-honoraires ; the code: https://www.legifrance.gouv.fr/codes/texte_lc/LEGITEXT000005634379 |
| Order of 25 February 2026 fixing the notaries' regulated tariffs (NOR ECOC2604872A), 1 March 2026 - 29 February 2028 | Service-Public.fr: https://www.service-public.gouv.fr/particuliers/actualites/A18834 ; Légifrance: https://www.legifrance.gouv.fr/eli/arrete/2026/2/25/ECOC2604872A/jo/texte |
| Loi n° 2004-575 of 21 June 2004 (LCEN), art. 6 and 19: a site's mandatory mentions, a regulated profession's | Service-Public.fr: https://entreprendre.service-public.gouv.fr/vosdroits/F31228 |
Coded rules
| # | Rule | Text | Class | Test |
|---|---|---|---|---|
| 1 | The professional e-mail address ends with .notaires.fr |
RPN art. 16.3: « L'adresse de messagerie professionnelle sortante du notaire se termine par ".notaires.fr", afin d'éviter toute confusion dans l'esprit du public. » | Notary\Guard\EmailDomain, Notary\Compliance\ProfessionalEmailCheck |
EmailDomainTest, ChecksTest |
| 2 | The site, and any change to the pages where the office offers its services, is declared to the chamber | RPN art. 14.4: « L'office notarial qui ouvre un site internet, y propose ses services ou ouvre ou modifie une ou plusieurs pages web destinées aux mêmes fins sur un site internet tiers doit en informer sans délai la chambre des notaires dont il dépend. » | Notary\Compliance\ChamberDeclarationCheck (on Practice\Compliance\DeclarationCheck) |
ChecksTest |
| 3 | The consumer mediator of the notariat is named, with its coordinates | RPN art. 25.1: « Le notaire doit faire connaître par tous moyens lisibles et appropriés la possibilité pour le client d'avoir recours au médiateur de la consommation du notariat en cas de différend entre eux et en indiquer les coordonnées. » | Practice\Compliance\MediatorCheck, /mediation, legal.mediator |
ChecksTest |
| 4 | The tariff is displayed on the site, with the discounts practised | Code de commerce, art. L. 444-4 (the tariffs are posted in the office and on its website); notaires.fr: the notary « doit afficher dans son office et publier sur son site internet, les taux de remise pratiqués par catégorie d'actes et tranches d'assiette » | Notary\Compliance\TariffDisplayCheck, /tarifs |
ChecksTest |
| 5 | The tariff is not copied: the page links to the official text, and the back office warns when the order's period is over | the tariff is revised by order (the one in force: 25 February 2026, until 29 February 2028) | Notary\Compliance\TariffDisplayCheck (legal.notary.tariff.until) |
ChecksTest |
| 6 | Fees for what the tariff does not cover are agreed in writing beforehand | Code de commerce, art. L. 444-1, as quoted by notaires.fr: « Les notaires concluent par écrit avec leur client une convention d'honoraires, qui précise, notamment, le montant ou le mode de détermination des honoraires » ; RPN art. 23 | the tariff page's text; legal.notary.tariff.fees |
page test in the application |
| 7 | No comparison, no disparagement, no advertising superlative in what the office writes | RPN art. 14.1 (« la dignité, la loyauté, la confraternité, la délicatesse ; la neutralité, l'impartialité et l'objectivité »), art. 14.2 (« Le notaire s'abstient de toute démarche à caractère publicitaire ») ; decree n° 73-1202 as amended: a personalised solicitation « ne peut pas inclure d'éléments comparatifs ou dénigrants » | Practice\Guard\Wording, Practice\Compliance\WordingCheck |
WordingTest, ChecksTest |
| 8 | The office is identified: its structure, its address, its phone, its chamber | RPN art. 14.1: « Tout document destiné à la correspondance ou à la communication du notaire doit mentionner les éléments permettant de l'identifier » ; LCEN art. 19 (title, professional body, rules) | Practice\Compliance\IdentificationCheck |
ChecksTest |
| 9 | The profession's graphic charter and brand block are applied - declared by the office, since they cannot be read from outside | RPN art. 14.4 (« respecter la charte graphique [...] et le plan de nommage arrêtés par le Conseil supérieur du notariat et publiés sur le portail intranet de la profession ») and art. 14.5 (the brand block with the NOTAIRES DE FRANCE logo « sur tous les supports de communication ») | Notary\Compliance\BrandBlockCheck |
ChecksTest |
| 10 | Within the office, the notaries and the clerks read a client's document; the reception sees a title | the office's choice, under the professional secrecy the RPN recalls (art. 14.1: « tenu au secret professionnel ») | Practice\Security\OfficeAudience |
OfficeAudienceTest |
The wording check is a list of expressions (Practice\Guard\Wording): a help to whoever writes, shown as a
warning. What it does not find is not thereby allowed.
What the bundle does not do, by design
- No online payment. The bundle offers none and the tariff page says so. The plan's reason ("clients' funds go through the Caisse des dépôts") was not verified on an official text as a prohibition of card payment of a notary's fees: it is therefore a choice of the product, not a coded rule. To confirm with the chamber before any payment is added.
- No testimonials, no client reviews, no comparison table. The bundle has no such entity or page. That testimonials are forbidden as such was not found in the texts read (the RPN forbids advertising, art. 14.2, and paid referencing): to confirm.
- No advertising insert. RPN art. 14.4: « Le site internet du notaire ne comporte aucun encart ou bannière publicitaire autre que celui ou celle de la profession. » Nothing in the bundle displays one; the application must not add any (no check can see a template).
- No paid referencing, no mass mailing. RPN art. 14.2: « La pratique du référencement payant est prohibée » ; art. 14.3: a personalised solicitation is a letter or an e-mail only. The bundle sends nothing but the answers to what a client asked.
To confirm (not coded as rules)
- The code de déontologie itself (decree n° 2023-1297): its articles on communication and on the title (art. 15, referred to by RPN art. 15) could not be read. To be read on Légifrance.
- The exact wording of art. L. 444-4 of the code de commerce and the article that asks for the discounts to be published (R. 444-10, as recalled from memory): read through notaires.fr only.
- The graphic charter and naming plan of the Conseil supérieur du notariat (intranet of the profession): a real office's site must follow them - its domain name too (RPN art. 16.2). The demonstration's own design is therefore provisional for a real office.
- Whether
@notaires.fris required of the site's sender address as well as of the notary's own address (the check warns, it does not fail). - The mediator's e-mail address (only the postal address and the site were confirmed: https://mediateur-notariat.notaires.fr, postal address also on justice.fr and inc-conso.fr).
- A salaried notary must name the holder of the office and its seat in what they write (RPN art. 15, last paragraph): left to the member's biography, not checked.
Propose a change docs/notary.md
Jurists - the law of 31 December 1971
French law no. 71-1130 of 31 December 1971 (art. 54 and following) reserves personalised legal advice and the drafting of deeds for others to the professions it allows: a lawyer, a notary, a university teacher of law (art. 57), another regulated profession within its own field (art. 59). Training, documentary information (art. 66-1), writing content, talks are open to anyone.
# config/packages/legal.yaml
legal:
profession: jurist
jurist:
authorized_status: ~ # teacher (art. 57) or regulated_profession (art. 59) lifts the guard
A jurist keeps no practice: omnibase/office is not needed, and none of the practice's pages, tables or checks is loaded. The profile is the guard:
Jurist\Service\RegulatedActivityGuard::check($text)- null, orjurist.guard.legal_consultation/jurist.guard.deed_drafting(domainlegal) when the text announces a reserved activity (Jurist\Enum\ReservedActivity: "consultation juridique", "conseil juridique personnalisé", "rédaction d'actes", "legal advice"...), whatever the offering was filed under;- with omnibase/consulting, its rule
Jurist\Consulting\OfferingRule(anOfferingRuleInterfaceof that bundle): an offering whose title, sentence or presentation announces one does not validate, and the back office prints why under that text.
Until 2026-10-09 this was omnibase/consulting's RegulatedActivityGuard (consulting.regulated_activity_guard,
consulting.authorized_status): a site moves those two options here, as above.
It is a safeguard written into the code, not legal advice: what it does not find is not thereby
allowed, and the profession's own rules still apply. Tests: tests/Jurist/.
Propose a change docs/jurist.md
Configuration reference
The legal tree
Dumped with Symfony's YamlReferenceDumper from
Base\Legal\DependencyInjection\LegalConfiguration:
legal:
# The profession the site is for: its profile is loaded, and it alone - its compliance checks, its entities and their tables, its pages, its demonstration accounts.
profession: ~ # One of "lawyer"; "notary"; "jurist", Required
# The roles omnibase's groups give (security.yaml puts the readers under the staff's).
roles:
# Who of the practice reads a client's document; the rest of the staff sees that it exists. Default: the profession's - a lawyer [ROLE_LAWYER], a notary [ROLE_NOTARY, ROLE_CLERK].
readers: []
staff: ROLE_STAFF
# The consumer mediator whose coordinates the practice gives (/mediation, the legal notice). Default: the one the profession set up.
mediator:
name: null
address: null
email: null
url: null
# The profession's rules, linked from the legal notice. Default: the profession's (a lawyer: the RIN on the Conseil national des barreaux's site).
rules_url: ~
# Expressions added to the built-in list the texts are checked against (comparison, disparagement, and the profession's own).
wording: []
# The lawyers' profile.
lawyer:
# The domain names the site answers on, checked against RIN art. 10.5 and listed in the memo for the Ordre. None: the host of the router's default address.
domains: []
# Where the domain name is read when legal.lawyer.domains is empty.
default_uri: '%env(default::DEFAULT_URI)%'
# Paying a fee note online - fees only, never clients' funds. Needs omnibase/marketplace: without it the link is not shown, whatever is set here.
payment:
enabled: false
# The application's route where a fee note is paid (the marketplace's checkout of a fee note).
route: null
# The notaries' profile.
notary:
# What a notary's professional e-mail address ends with (règlement professionnel, art. 16.3).
email_suffix: notaires.fr
# Where the regulated tariff is read: the official text, the order in force, the profession's explanation.
tariff:
# Code de commerce, articles A444-53 and following (the notaries' tariff).
code_url: 'https://www.legifrance.gouv.fr/codes/texte_lc/LEGITEXT000005634379'
# The order fixing the tariff in force, as it is named on the page.
order: 'arrêté du 25 février 2026'
order_url: 'https://www.legifrance.gouv.fr/eli/arrete/2026/2/25/ECOC2604872A/jo/texte'
# The last day of the order's period: past it, the back office asks for the new order.
until: '2028-02-29'
info_url: 'https://www.notaires.fr/fr/profession-notaire/le-tarif-du-notaire-emoluments-et-honoraires'
# The jurists' profile.
jurist:
# A status that lets the jurist give legal advice all the same (law of 31 December 1971): a university teacher of law (art. 57), another regulated profession within its own field (art. 59). A lawyer or a notary is not a jurist's status: that is another profession.
authorized_status: null # One of null; "teacher"; "regulated_profession"
What reads each key
| Key | Default | Read by |
|---|---|---|
profession |
required: lawyer, notary or jurist |
the bundle: the profile loaded, and it alone (its checks, entities, pages, demonstration accounts) |
roles.readers |
the profession's: [ROLE_LAWYER], [ROLE_NOTARY, ROLE_CLERK] |
OfficeAudience: who of the practice reads a client's document |
roles.staff |
ROLE_STAFF |
OfficeAudience: the rest of the staff, who see that a document exists |
mediator.name, address, email, url |
the profession's mediator | /mediation, the legal notice, the mediator check; a mediator named here replaces it whole |
rules_url |
the profession's (a lawyer: the RIN) | the legal notice |
wording |
none | Wording: expressions added to the built-in list the texts are checked against |
lawyer.domains |
none: the host of lawyer.default_uri |
Domains, the domain name check (RIN art. 10.5), the memo for the Ordre |
lawyer.default_uri |
%env(default::DEFAULT_URI)% |
Domains, when lawyer.domains is empty |
lawyer.payment.enabled, route |
false, null | FeePayment: paying a fee note online, with omnibase/marketplace only |
notary.email_suffix |
notaires.fr |
the professional e-mail check (règlement professionnel art. 16.3) |
notary.tariff.* |
the Code de commerce, the order of 25 February 2026, its end on 2028-02-29, the profession's page | /tarifs, legal_tariff(), the tariff check (past until, the back office asks for the new order) |
jurist.authorized_status |
null: teacher (art. 57) or regulated_profession (art. 59) |
RegulatedActivityGuard, the consulting offering rule |
Only the chosen profession's section becomes parameters
(legal.lawyer.domains, legal.notary.tariff...), with the common keys
(legal.profession, legal.roles.readers...).
Services
config/services.php loads the practice's common part (src/Practice, on
omnibase/office) when the profession keeps a practice (a lawyer, a notary),
and the chosen profession's directory alone (src/Lawyer, src/Notary or
src/Jurist); bin/console debug:container --tag=legal.profile lists what
the profile registered. The
routes follow the same rule through Base\Legal\Routing\ProfileRouteLoader
(omnibase/legal).
Translations
The domain legal, in English, French and German (ICU format).
Propose a change docs/configuration.md
Testing
Running the suite
Inside a host application that has omnibase/office (the practice's tests
need it, tests/NeedsOffice.php):
php vendor/bin/phpunit -c vendor/omnibase/legal/phpunit.xml.dist
omnisense/omnibase-harness has no omnibase/office: its test legal errs on
Base\Office\Entity\Area. With the checkouts of omnibase/office and
omnibase/consulting on the harness's autoloader and no kernel, the suite on
this checkout gives:
Tests: 141, Assertions: 472, Errors: 8.
The eight errors are Practice\OfficeAudienceTest's, which needs the host
kernel's App\Entity\User aliases.
What the tests check
| Test | Checks |
|---|---|
DependencyInjection\ConfigurationTest |
the profession is asked; an unknown one refused; what the site does not say is the profession's; what it says wins; a jurist's status; the last file that sets the profession wins |
Controller\CrudRequiredFieldsTest |
omnibase/admin's CrudFieldsTestCase on the screens |
Practice\AreaTest, ChecksTest, WordingTest |
an area's work is a list edited one a line, one table and its join table whatever the profession; an office or a firm identified, located and reachable (holder, address, phone, chamber or bar), the mediator's coordinates given, the declaration's day a date or nothing; comparison and disparagement found where they are (fields, settings), each profession's own words, the site's own added, each reported once |
Practice\OfficeAudienceTest |
who of a firm or an office reads a client's document, who sees its title, nobody outside the practice |
Lawyer\AttorneyTest |
the official list of 28 mentions; what is outside it dropped; the dominant fields typed one a line |
Lawyer\ChecksTest, DomainNameTest, SpecialistWordsTest, FeePaymentTest, LawyerDemoAccountsTest |
the domain name carries the name (RIN art. 10.5); the declaration to the Ordre; "specialist" for the certificate holders; at most three dominant fields and two mentions; the fees page; paying online off by default, shown only with omnibase/marketplace and a route; the demonstration accounts |
Notary\ChecksTest, EmailDomainTest, NotaryDemoAccountsTest |
an office address outside notaires.fr is missing, the site's sender only a warning; the declaration to the chamber; the tariff page links the official text and prints the discounts, past the order's period the reference is to be updated; the charter a reminder until confirmed; the e-mail suffix and its look-alikes; the demonstration accounts |
Jurist\RegulatedActivityGuardTest, OfferingRuleTest |
the words of a reserved activity refused, training, information and writing open to all, a status lifts the guard, each activity's words in French and English; a consulting offering refused under the text that carries them |