Skip to content

omnibase/legal

The legal professions on omnibase, one bundle and a profile for each: a lawyer's firm (the RIN's article 10 - domain name, certified specialisations, fees and their agreement, the declaration to the Ordre), a notary's office (regulated tariff and discounts, addresses in notaires.fr, the declaration to the chamber, the profession's charter), a jurist (nothing the law of 31 December 1971 reserves to a regulated profession). In common, on omnibase/office: fields of practice, a first appointment asked without an account, the client's space on the encrypted vault, who of the practice reads a document, the compliance checks of the back office.

Floor
Prepared structure · Omnibase
Version
main
Verified for real
Its README does not say
Licence
MIT
composer require omnibase/legal:dev-main

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/legal in place of either; Base\Legal\LegalBundle in config/bundles.php; legal.profession; the routes by type: 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_*; Twig lawyer_*() / notary_*() → legal_*(); @Lawyer/client/_attorney.html.twig → @Legal/lawyer/_attorney.html.twig; classes la-* / no-* → lg-*; parameters lawyer.* / 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.fr is 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, or jurist.guard.legal_consultation / jurist.guard.deed_drafting (domain legal) 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 (an OfferingRuleInterface of 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

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

Propose a change docs/testing.md