Skip to content

omnibase/legal API reference

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

Read from the package's own PHP files at the commit f90b8933208b: its namespaces, classes, interfaces and enums, their public constants, properties and methods with their PHPDoc, and the options its factories take. Nothing of it is run.

Base\Legal

  • LegalBundle class

    The legal professions, one bundle and a profile for each (legal.profession: lawyer | notary | jurist - one site, one profession).

    3 methods

  • Profession enum

    The profession a site is for (legal.profession): one site, one profession. Each has its profile - a folder of src/ loaded when it is the one chosen, and then alone: its compliance checks, the words its communication must not carry, its own entities, its demonstration accounts, its pages.

    3 methods · 3 cases

Base\Legal\DependencyInjection

Base\Legal\Jurist\Consulting

  • OfferingRule class

    The jurist's guard on what omnibase/consulting offers: an offering whose title, sentence or presentation announces a legal consultation or the drafting of deeds does not validate - in the back office's form the reason is printed under the text that carries the words.

    2 methods

Base\Legal\Jurist\Enum

  • ReservedActivity enum

    What the law reserves to the professions it allows (French law no.

    2 methods · 2 cases

Base\Legal\Jurist\Service

  • RegulatedActivityGuard class

    What a jurist may offer who is neither a lawyer nor a notary (French law no. 71-1130 of 31 December 1971, art. 54 and following): no personalised legal consultation, no deed drafted for someone else - unless a status allows it all the same (legal.jurist.authorized_status: a university teacher of law under art. 57, another regulated profession within its own field under art. 59). Training, documentary information (art. 66-1), writing content, talks are open to all.

    5 methods

Base\Legal\Lawyer

  • LawyerProfile class

    The lawyers' profile: what a law firm's site owes to article 10 of the Règlement intérieur national (RIN), written as checks the back office runs - the domain name (10.5), specialisations from the certified list only and three dominant fields at most (10.2), wording free of comparison (10.2), the firm identified (10.2), the site and what it says declared to the conseil de l'Ordre (10.2, 10.3, 10.5), the fees explained and the fee agreement announced (11.1, 11.2) - with its own entity (a member of the team as a lawyer: Entity\Attorney) and its own pages: the fees, the memo for the Ordre. Paying online is for fees only, through omnibase/marketplace when it is installed; the bundle itself takes no payment.

    4 methods

Base\Legal\Lawyer\Compliance

  • DomainNameCheck class

    The domain name carries the lawyer's name or the firm's denomination, and evokes generically neither the title, nor a field of law, nor an activity of the profession (RIN art. 10.5).

    2 methods

  • FeesInformationCheck class

    « L'avocat informe son client, dès sa saisine, des modalités de détermination des honoraires » (RIN art. 11.1) and « conclut par écrit avec son client une convention d'honoraires » (art. 11.2). The fees page always says the second; the first is the firm's own words, typed in the settings: how its fees are set.

    2 methods

  • OrderDeclarationCheck class

    « 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 » (RIN art. 10.5). The settings keep which bar and the day the Ordre was told; the back office's memo lists what to send.

  • PaymentScopeCheck class

    Paying online is for fees only (RIN art. 11.5); clients' funds go to the CARPA (art. 6.2). Off: nothing to check. On without omnibase/marketplace or without a route: the link is not shown, and the back office says why.

    2 methods

  • SpecialisationCheck class

    Specialisations, as RIN art. 10.2 has them:

    2 methods

Base\Legal\Lawyer\Controller\Admin

  • DeclarationController class

    The memo of what is declared to the conseil de l'Ordre, filled with what the site says today: its domain names (RIN art. 10.5), each lawyer's specialisations, qualifications and dominant fields as they are shown (art. 10.2: their terms are sent to the Ordre), the fields of practice the firm presents (art. 10.3: any publicity is communicated). To print or to copy into the letter - the bundle sends nothing itself.

    1 method

Base\Legal\Lawyer\Controller\Admin\Crud

  • AttorneyCrudController class

    A member of the team as a lawyer: bar, oath, and what RIN art. 10.2 frames - the certified specialisations, picked in the official list (two at most), and the dominant fields (three at most).

    5 methods

Base\Legal\Lawyer\Controller\Client

  • FeesController class

    The fees: how they are set, the fee agreement, how they are paid (RIN art. 11.1, 11.2, 11.5) - the lawyers' page of what it costs.

    1 method

Base\Legal\Lawyer\Demo

  • LawyerDemoAccounts class

    The demonstration accounts of a law firm (glitchr/omnibase's `demo` environment): one for each role the profile and omnibase/office know. The roles of the firm come from two groups, as in a real one - "Avocats" (ROLE_LAWYER) and "Secrétariat" (ROLE_SECRETARY), both ROLE_STAFF through the application's role hierarchy; "cabinet" is the firm's administrator.

    1 method · 3 constants

Base\Legal\Lawyer\Entity

  • Attorney class

    A member of the team as a lawyer: the bar they are registered with, the year of their oath, their certified specialisations (from the official list, two at most), a specific qualification within one, and their dominant fields of activity - three at most, from an actual and habitual practice (RIN art. 10.2).

    19 methods · 1 constant

Base\Legal\Lawyer\Enum

  • Specialisation enum

    The mentions of specialisation a lawyer may hold: the list fixed by the order of the garde des Sceaux of 28 December 2011, as the Conseil national des barreaux publishes it (28 mentions). "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 »" (RIN art. 10.2): a specialisation is one of these cases, or it is not shown.

    2 methods · 1 constant · 28 cases

Base\Legal\Lawyer\Guard

  • DomainName class

    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 ». 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. »

    1 method · 5 constants

  • SpecialistWords class

    RIN art. 10.2: « Seul l'avocat titulaire d'un ou de plusieurs certificats de spécialisation [...] régulièrement obtenus et non invalidés peut utiliser pour sa communication, quel qu'en soit le support, les mots « spécialiste », « spécialisé », « spécialité » ou « spécialisation ». »

    2 methods

Base\Legal\Lawyer\Payment

  • FeePayment class

    The hook towards paying a fee note online. The bundle takes no payment itself: when omnibase/marketplace is installed and the application has turned legal.lawyer.payment.enabled on and named its route, the fees page links to it - for fees only (« Les honoraires sont payés [...] notamment en espèces, par chèque, par virement, par billet à ordre et par carte bancaire », RIN art. 11.5). Clients' funds never go through it: « 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 » (RIN art. 6.2).

    5 methods · 1 constant

Base\Legal\Lawyer\Repository

Base\Legal\Lawyer\Service

  • Domains class

    The site's domain names and how each reads against RIN art. 10.5: those of the configuration (legal.lawyer.domains), else the host of the router's default address; the names they may carry are the firm's denomination and the lawyers'.

    4 methods

  • LawyerRecord class

    What only the firm knows and the back office's settings keep: its denomination, its structure of practice, its bar, its network, the day the site was declared to the conseil de l'Ordre, how its fees are set, what a first meeting costs, whether legal aid is taken.

    8 methods · 4 constants

Base\Legal\Lawyer\Twig

  • LawyerExtension class

    The lawyers' own in templates, beside the practice's (legal_record(), legal_areas(), legal_mediator()...): legal_attorney(member) (bar, oath, certified specialisations, dominant fields) and legal_payment() (the hook for paying fees online).

    2 methods

Base\Legal\Notary

  • NotaryProfile class

    The notaries' profile: what a notary's office site owes to its professional rules (règlement professionnel du notariat, approved by the order of 29 January 2024), written as checks the back office runs - the regulated tariff and the discounts displayed, the consumer mediator of the notariat, e-mail addresses ending in notaires.fr, the site declared to the chamber, wording free of comparison, the profession's charter - and its own page: the tariff. No online payment: the profile has none.

    4 methods

Base\Legal\Notary\Compliance

  • BrandBlockCheck class

    The profession's graphic charter and its brand block: the site keeps to "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" (règlement professionnel du notariat, art. 14.4), and the brand block with the NOTAIRES DE FRANCE logo is put "sur tous les supports de communication" (art. 14.5). Neither can be read from outside the profession's intranet: the office says in the settings that it has applied them, and until then the back office reminds it.

    2 methods

  • ChamberDeclarationCheck class

    "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 [...] doit en informer sans délai la chambre des notaires dont il dépend" (règlement professionnel du notariat, art. 14.4). The settings keep which chamber and the day it was told.

  • ProfessionalEmailCheck class

    The office's e-mail addresses end with notaires.fr (règlement professionnel du notariat, art. 16.3): the address each office shows to the public, and the one the site writes to clients from.

    2 methods

  • TariffDisplayCheck class

    The tariff is displayed on the site (code de commerce, art. L. 444-4: the notaries post the tariffs they practise in their office and on their website), and with it the discounts the office grants, by category of deeds and by band - or that it grants none. The page /tarifs links to the official text; the office types its discounts in the settings. Past the period of the order in force, the reference is to be brought up to date.

    2 methods

Base\Legal\Notary\Controller\Client

  • TariffController class

    The tariff - the notaries' page of what it costs: regulated, so the page explains it and links to the official text, with the office's discounts and its fees for what the tariff does not cover.

    1 method

Base\Legal\Notary\Demo

  • NotaryDemoAccounts class

    The demonstration accounts of a notary's office (glitchr/omnibase's `demo` environment): one for each role the profile and omnibase/office know. The roles of the office come from three groups, as in a real one - "Notaires" (ROLE_NOTARY), "Clercs" (ROLE_CLERK) and "Accueil" (ROLE_STAFF), the first two ROLE_STAFF through the application's role hierarchy; "etude" is the office's administrator.

    1 method · 4 constants

Base\Legal\Notary\Guard

  • EmailDomain class

    "L'adresse de messagerie professionnelle sortante du notaire se termine par « .notaires.fr », afin d'éviter toute confusion dans l'esprit du public" (règlement professionnel du notariat, art. 16.3, approved by the order of 29 January 2024).

    1 method

Base\Legal\Notary\Service

  • NotaryRecord class

    What only the office knows and the back office's settings keep: the structure that holds the office, its CRPCEN number, its chamber, the day the site was declared to it, whether the profession's charter is applied, the discounts it practises, its fees for what the tariff does not cover.

    8 methods · 3 constants

Base\Legal\Notary\Twig

  • NotaryExtension class

    The notaries' own in templates, beside the practice's (legal_record(), legal_areas(), legal_mediator()...): legal_tariff() - the official text, the order in force and its last day.

    2 methods

Base\Legal\Practice

  • ProfileInterface interface

    What a profession tells the practice - the part a firm and an office share: what identifies it on its site, the words its communication must not carry beyond those common to every regulated practice, where it says what it costs. The chosen profession's profile answers (Base\Legal\Lawyer\LawyerProfile, Base\Legal\Notary\NotaryProfile); its settings are its record's (Base\Legal\Practice\Service\Record).

    4 methods · 5 constants

Base\Legal\Practice\Admin\Settings

  • LegalSettingsSection class

    The settings' section of the practice: what the legal notice and the page of the fees print and only the practice knows. Which fields, and under which words, is the profession's (its record's getFields(), the labels <profession>.settings.* of the `legal` domain) - a firm's denomination, structure, bar and network; an office's holder, CRPCEN number, chamber, discounts. The compliance widget reads the same.

    3 methods

Base\Legal\Practice\Compliance

  • DeclarationCheck class

    The site is declared to the professional body: the settings keep which one (the bar, the chamber) and the day it was told. Which rule asks it, and in which words, is the profession's - its profile extends this check and names its label (Base\Legal\Lawyer\Compliance\OrderDeclarationCheck, Base\Legal\Notary\Compliance\ChamberDeclarationCheck).

    2 methods

  • IdentificationCheck class

    The practice can be identified on its site: a member of a regulated profession names its professional title, the body it is registered with and the rules that apply to it (loi n° 2004-575 du 21 juin 2004, art.

    2 methods

  • MediatorCheck class

    The consumer mediator is named on the site, with how to reach it: the page /mediation and the legal notice print legal.mediator - by default the mediator the profession set up. For a notary: "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" (règlement professionnel du notariat, art. 25.1). Missing: no name, or no way to reach it; a warning for a site that is not https.

    2 methods

  • WordingCheck class

    What the practice wrote for the public - the fields of practice, the team's biographies, what it typed in the settings about its fees - read again for comparison, disparagement and the superlatives of advertising, and for what the profession forbids of its own (ProfileInterface::getWordingPatterns(), which says on which texts this rests). A warning names where and what.

    2 methods

Base\Legal\Practice\Controller\Admin

  • AdminScreenTrait trait

    The back office's screens of the practice and of a profile: written by the practice's administrator (ROLE_ADMIN), not only by the super-admin omnibase/admin asks by default for anything that writes (openTo()); a page of the bundle's own in the back office's chrome (page()).

    1 method

Base\Legal\Practice\Controller\Admin\Crud

  • AreaCrudController class

    The fields of practice as the site shows them. What is done in a field is named by the profession (a notary's "Actes et démarches", a lawyer's "Questions traitées"), and so is what its text must keep from.

    6 methods

Base\Legal\Practice\Controller\Client

  • PracticeController class

    The practice's public pages every profession has: the fields of practice and the consumer mediator. What it costs is the profession's own page (a lawyer's fees, a notary's tariff: its profile's controller).

    4 methods

  • RequestController class

    Asking for a first appointment without an account: a practice's clients are invited, so someone new could not go through omnibase/office's booking pages, which ask to sign in. The request becomes an appointment of the office in request mode (no time yet: the practice fixes it), under the name, the e-mail and the phone given; the few words are kept encrypted, as every reason is.

    1 method

  • SpaceController class

    The client's space: the appointments to come, the documents the practice sent and those the client deposited - in the encrypted vault, never by e-mail.

    1 method

Base\Legal\Practice\Entity

  • Area class

    A field of practice of the firm or of the office (family, real estate, labour...): what it covers, what is done in it - a notary's deeds, a lawyer's matters -, who of the team follows it. Information for the public: its wording is checked (Base\Legal\Practice\Compliance\WordingCheck), and a lawyer's never calls it a "speciality" unless a certificate is held (Base\Legal\Lawyer\Compliance\SpecialisationCheck).

    2 methods

Base\Legal\Practice\Guard

  • Wording class

    Words the communication of a lawyer or of a notary must not carry: comparison with colleagues, disparagement, the superlatives of advertising - and what a profession adds of its own (a lawyer's reference to judicial functions). Each profile cites its texts where it gives its patterns (ProfileInterface::getWordingPatterns()).

    3 methods

Base\Legal\Practice\Repository

  • AreaRepository class

    The finders are omnibase/office's (findActive(), findOneActiveBySlug(), findForMember()).

    1 method

Base\Legal\Practice\Security

  • OfficeAudience class

    Professional secrecy within the practice, as the tool applies it to a client's documents, beyond the client and whoever sent the document (the voter's own business):

    2 methods

Base\Legal\Practice\Service

  • Record class

    What only the practice knows and the back office's settings keep. Every profession has these four: the practice's name (a firm's denomination, the structure that holds an office), its professional body (the bar, the chamber), the day the site was declared to it, how its fees are set. A profession's record adds its own (Base\Legal\Lawyer\Service\LawyerRecord, Base\Legal\Notary\Service\NotaryRecord) and says which fields the settings' form shows.

    9 methods · 4 constants

Base\Legal\Practice\Twig

  • LegalExtension class

    The practice in templates, whatever the profession: legal_profession() ("lawyer", "notary": the bundle's texts of a profession are under its name), legal_record() (what the settings keep: the name, the professional body, the fees, and the profession's own), legal_areas(member|null) (the fields of practice, or a member's), legal_mediator(), legal_rules_url(), legal_fees_route() (the page that says what it costs). A profile adds its own functions (legal_attorney(), legal_payment(); legal_tariff()).

    2 methods

Base\Legal\Routing

  • ProfileRouteLoader class

    The bundle's routes for the site's profession, whichever it is:

    3 methods

class LegalBundle extends AbstractBaseBundle LegalBundle.php:39

The legal professions, one bundle and a profile for each (legal.profession: lawyer | notary | jurist - one site, one profession).

What a lawyer's firm and a notary's office share is written once, on omnibase/office (src/Practice): the 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 settings, and the compliance checks every regulated practice answers - it can be identified, it names its consumer mediator, its texts carry no comparison.

What is a profession's own is its profile (src/Lawyer, src/Notary, src/Jurist), loaded when it is the one chosen and then alone - its rules as compliance checks, the words it must not use, its entities and their tables, its pages, its demonstration accounts:

lawyer article 10 of the RIN - the domain name, certified specialisations and dominant fields, the fees and their agreement, the declaration to the conseil de l'Ordre, fees paid online and nothing else; notary the règlement professionnel - addresses in notaires.fr, the regulated tariff and the discounts, the declaration to the chamber, the profession's charter; no online payment; jurist the law of 31 December 1971 - nothing a regulated profession alone may do is offered.

Compliance built into the code does not replace the control of the Ordre or of the chamber.

public function __construct()
public function getPath(): string

Modern layout: the class lives in src/, the bundle root is the package root.

public function build(ContainerBuilder $container): void

enum Profession Profession.php:12

The profession a site is for (legal.profession): one site, one profession. Each has its profile - a folder of src/ loaded when it is the one chosen, and then alone: its compliance checks, the words its communication must not carry, its own entities, its demonstration accounts, its pages.

public function hasPractice(): bool

Whether the profession keeps a practice (a firm, an office) on omnibase/office: fields of practice, appointments asked, the client's space, the compliance widget. A jurist who teaches, writes and trains has none: the profile is then the guard on what is offered, nothing more.

public function folder(): string

The profile's folder under src/, and its namespace under Base\Legal.

public static function values(): array

class LegalConfiguration extends AbstractBaseConfiguration LegalConfiguration.php:9

What a profession's defaults are where a site says nothing: who of the practice reads a client's document, the consumer mediator the profession set up, where its rules are published.

public function getConfigTreeBuilder(): TreeBuilder
public static function withProfessionDefaults(array $config): array

The configuration once the chosen profession's defaults are filled in.

$config

the processed tree

class LegalExtension extends AbstractBaseExtension implements PrependExtensionInterface LegalExtension.php:13

public function getConfiguration(array $config, ContainerBuilder $container): LegalConfiguration
public static function profession(array $configs): ?Profession

The profession as the configuration files write it, the last one that sets it winning: prepend() needs it before anything is processed.

$configs

legal's configurations, unprocessed

public function prepend(ContainerBuilder $container): void

What the chosen profession sets before the other bundles read their configuration:

  • the practice's entities (the fields of practice) and the profile's own (a lawyer's Attorney), mapped for it alone - a site has no table of a profession that is not its own;
  • omnibase/office's pages in the profession's words: the contact form's warning (nothing confidential here: the client's space is for that), the menu of the client's space, where the e-mails send the client.
public function load(array $configs, ContainerBuilder $container): void

final class OfferingRule implements OfferingRuleInterface OfferingRule.php:20

The jurist's guard on what omnibase/consulting offers: an offering whose title, sentence or presentation announces a legal consultation or the drafting of deeds does not validate - in the back office's form the reason is printed under the text that carries the words.

Loaded when omnibase/consulting is installed (config/services.php): that bundle knows nothing of the law, it asks its rules.

public function __construct(readonly RegulatedActivityGuard $guard, readonly TranslatorInterface $translator)
public function check(Offering $offering): ?OfferingViolation

enum ReservedActivity ReservedActivity.php:13

What the law reserves to the professions it allows (French law no.

71-1130 of 31 December 1971, art. 54): giving personalised legal advice, and drafting deeds for others. Training, documentary information (art. 66-1), writing content, a talk are open to anyone - they are no case here. Each case knows the words that announce it, in French and in English.

public function label(): string

Its name, a key of the legal domain.

public function patterns(): array
Returns

the regular expressions that give it away in a text

final class RegulatedActivityGuard RegulatedActivityGuard.php:26

What a jurist may offer who is neither a lawyer nor a notary (French law no. 71-1130 of 31 December 1971, art. 54 and following): no personalised legal consultation, no deed drafted for someone else - unless a status allows it all the same (legal.jurist.authorized_status: a university teacher of law under art. 57, another regulated profession within its own field under art. 59). Training, documentary information (art. 66-1), writing content, talks are open to all.

The guard reads words, whatever they were filed under: a "training" sold as "consultation juridique personnalisée" is caught. It is on with the profession - a site whose profession is jurist has it; a lawyer's or a notary's site does not load it. A safeguard, not legal advice: what it does not find is not thereby allowed.

What is offered on the site is read through it by the bundle that holds the offerings (omnibase/consulting: Base\Legal\Jurist\Consulting\OfferingRule).

public function __construct(readonly ?string $authorizedStatus = null)
public function isAuthorized(): bool

Whether the jurist holds a status that allows legal advice.

public function getAuthorizedStatus(): ?string
public function read(?string $text): ?ReservedActivity

The reserved activity a text announces - whoever wrote it, whatever their status.

public function check(?string $text): ?string

Why this jurist may not publish the text, or null when he may.

Returns

a translation key of the legal domain

final class LawyerProfile implements ProfileInterface LawyerProfile.php:24

The lawyers' profile: what a law firm's site owes to article 10 of the Règlement intérieur national (RIN), written as checks the back office runs - the domain name (10.5), specialisations from the certified list only and three dominant fields at most (10.2), wording free of comparison (10.2), the firm identified (10.2), the site and what it says declared to the conseil de l'Ordre (10.2, 10.3, 10.5), the fees explained and the fee agreement announced (11.1, 11.2) - with its own entity (a member of the team as a lawyer: Entity\Attorney) and its own pages: the fees, the memo for the Ordre. Paying online is for fees only, through omnibase/marketplace when it is installed; the bundle itself takes no payment.

Compliance built into the code does not replace the Ordre's control.

public function getProfession(): Profession
public function getIdentification(): array

« L'avocat doit, dans toute communication, [...] faire état de sa qualité et permettre, quel que soit le support utilisé, 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 » (RIN art. 10.2). The network is asked only of who has one.

public function getWordingPatterns(): array

Beyond comparison and disparagement, RIN art. 10.2 forbids « toute référence à des fonctions juridictionnelles »: a former judge does not say so to recommend himself.

public function getFeesRoute(): string

final class DomainNameCheck implements ComplianceCheckInterface DomainNameCheck.php:15

The domain name carries the lawyer's name or the firm's denomination, and evokes generically neither the title, nor a field of law, nor an activity of the profession (RIN art. 10.5).

public function __construct(readonly Domains $domains)
public function check(): ComplianceResult

final class FeesInformationCheck implements ComplianceCheckInterface FeesInformationCheck.php:16

« L'avocat informe son client, dès sa saisine, des modalités de détermination des honoraires » (RIN art. 11.1) and « conclut par écrit avec son client une convention d'honoraires » (art. 11.2). The fees page always says the second; the first is the firm's own words, typed in the settings: how its fees are set.

public function __construct(readonly LawyerRecord $record)
public function check(): ComplianceResult

final class OrderDeclarationCheck extends DeclarationCheck OrderDeclarationCheck.php:14

« 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 » (RIN art. 10.5). The settings keep which bar and the day the Ordre was told; the back office's memo lists what to send.

final class PaymentScopeCheck implements ComplianceCheckInterface PaymentScopeCheck.php:15

Paying online is for fees only (RIN art. 11.5); clients' funds go to the CARPA (art. 6.2). Off: nothing to check. On without omnibase/marketplace or without a route: the link is not shown, and the back office says why.

On and available: a reminder of what the payment page may take.

public function __construct(readonly FeePayment $payment)
public function check(): ComplianceResult

final class SpecialisationCheck implements ComplianceCheckInterface SpecialisationCheck.php:25

Specialisations, as RIN art. 10.2 has them:

  • the words « spécialiste », « spécialisé », « spécialité », « spécialisation » are for the holders of a certificate: a lawyer without one whose title, biography or dominant fields use them, or a field of practice that does when nobody in the firm holds a certificate, is to be corrected;
  • a specialisation shown is one of the official list (the entity keeps nothing else), two at most;
  • the dominant fields of activity are three at most.
public function __construct(readonly AttorneyRepository $attorneys, readonly AreaRepository $areas)
public function check(): ComplianceResult

class DeclarationController extends AbstractController DeclarationController.php:23

The memo of what is declared to the conseil de l'Ordre, filled with what the site says today: its domain names (RIN art. 10.5), each lawyer's specialisations, qualifications and dominant fields as they are shown (art. 10.2: their terms are sent to the Ordre), the fields of practice the firm presents (art. 10.3: any publicity is communicated). To print or to copy into the letter - the bundle sends nothing itself.

public function index(LawyerRecord $record, Domains $domains, AttorneyRepository $attorneys, AreaRepository $areas): Response

class AttorneyCrudController extends AbstractCrudController AttorneyCrudController.php:23

A member of the team as a lawyer: bar, oath, and what RIN art. 10.2 frames - the certified specialisations, picked in the official list (two at most), and the dominant fields (three at most).

public static function getEntityFqcn(): string
public static function getPreferredIcon(): ?string
public function configureCrud(Crud $crud): Crud
public function configureActions(Actions $actions): Actions
public function configureFields(string $pageName): iterable

class FeesController extends AbstractController FeesController.php:18

The fees: how they are set, the fee agreement, how they are paid (RIN art. 11.1, 11.2, 11.5) - the lawyers' page of what it costs.

public function fees(OfficeRepository $offices, LawyerRecord $record, FeePayment $payment, MemberRepository $members, AppointmentTypeRepository $types): Response

final class LawyerDemoAccounts implements DemoAccountProviderInterface LawyerDemoAccounts.php:25

The demonstration accounts of a law firm (glitchr/omnibase's demo environment): one for each role the profile and omnibase/office know. The roles of the firm come from two groups, as in a real one - "Avocats" (ROLE_LAWYER) and "Secrétariat" (ROLE_SECRETARY), both ROLE_STAFF through the application's role hierarchy; "cabinet" is the firm's administrator.

An application's fixtures take them from Base\Demo\DemoAccountFactory ($accounts->account('avocate', $manager)) and attach what makes them worth signing in as: a member of the team and an agenda to the lawyers, a request and documents in the vault to the client. A firm without one of these roles (a lawyer practising alone has no associate) leaves it out: base.demo.exclude.

Registered when the installed glitchr/omnibase has the demo environment (config/services.php).

public function getDemoAccounts(): iterable

class Attorney Attorney.php:18

A member of the team as a lawyer: the bar they are registered with, the year of their oath, their certified specialisations (from the official list, two at most), a specific qualification within one, and their dominant fields of activity - three at most, from an actual and habitual practice (RIN art. 10.2).

RIN art. 10.2: « dont le nombre revendiqué ne peut être supérieur à trois ».

public function __construct(?Member $member = null, ?string $bar = null)
public function __toString(): string
public function getId(): ?int
public function getMember(): ?Member
public function setMember(?Member $member): self
public function getBar(): ?string
public function setBar(?string $bar): self
public function getSwornIn(): ?int
public function setSwornIn(?int $year): self
public function getQualification(): ?string
public function setQualification(?string $qualification): self
public function getSpecialisations(): array
Returns

only what the official list knows

public function getSpecialisationValues(): array
public function setSpecialisationValues(?array $values): self

Anything outside the official list is dropped: a specialisation is a certificate, not a wish.

public function isSpecialist(): bool
public function getDominantFields(): array
public function setDominantFields(?array $fields): self
public function getDominantFieldsText(): string

One a line: what the back office's form edits.

public function setDominantFieldsText(?string $text): self

enum Specialisation Specialisation.php:14

The mentions of specialisation a lawyer may hold: the list fixed by the order of the garde des Sceaux of 28 December 2011, as the Conseil national des barreaux publishes it (28 mentions). "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 »" (RIN art. 10.2): a specialisation is one of these cases, or it is not shown.

An avocat holds and uses two mentions at most (Conseil national des barreaux).

public function label(): string

The mention as the order names it.

public static function choices(): array
Returns

label => value, for a form

final class DomainName DomainName.php:28

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 ». 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. »

assess() reads a host against the names it may carry (the firm's denomination, the lawyers' names):

OK it carries a name, alone or with "avocat" / "avocats" GENERIC it carries no name and evokes the title, a field of law or an activity: forbidden MIXED it carries a name and a field of law or an activity besides UNNAMED it carries no name the site knows LOCAL a development host (localhost, an address, .local, .test): nothing to assess

A reading aid: the conseil de l'Ordre, told of the domain names, decides.

public static function assess(?string $host, array $names): string
$names

the firm's denomination and the lawyers' names

final class SpecialistWords SpecialistWords.php:15

RIN art. 10.2: « Seul l'avocat titulaire d'un ou de plusieurs certificats de spécialisation [...] régulièrement obtenus et non invalidés peut utiliser pour sa communication, quel qu'en soit le support, les mots « spécialiste », « spécialisé », « spécialité » ou « spécialisation ». »

Finds those four words (and their feminine and plural forms) in a text.

public static function find(?string $text): array
Returns

the words found, as written

public static function uses(?string $text): bool

class FeePayment FeePayment.php:18

The hook towards paying a fee note online. The bundle takes no payment itself: when omnibase/marketplace is installed and the application has turned legal.lawyer.payment.enabled on and named its route, the fees page links to it - for fees only (« Les honoraires sont payés [...] notamment en espèces, par chèque, par virement, par billet à ordre et par carte bancaire », RIN art. 11.5). Clients' funds never go through it: « 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 » (RIN art. 6.2).

public function __construct(readonly bool $enabled = false, readonly ?string $route = null, readonly ?bool $installed = null)
public function isInstalled(): bool

Whether omnibase/marketplace is there to take the payment.

public function isEnabled(): bool
public function isAvailable(): bool

Shown on the fees page only when all three hold.

public function getRoute(): ?string

class AttorneyRepository extends ServiceEntityRepository AttorneyRepository.php:11

public function __construct(ManagerRegistry $registry)
public function findOneByMember(?Member $member): ?Attorney
public function findVisible(): array
Returns

those the site shows

class Domains Domains.php:15

The site's domain names and how each reads against RIN art. 10.5: those of the configuration (legal.lawyer.domains), else the host of the router's default address; the names they may carry are the firm's denomination and the lawyers'.

public function __construct(readonly LawyerRecord $record, readonly AttorneyRepository $attorneys, readonly array $domains = [], readonly ?string $defaultUri = null)
public function all(): array
public function names(): array
Returns

the firm's denomination and its lawyers' names

public function verdicts(): array
Returns

domain => DomainName verdict

class LawyerRecord extends Record LawyerRecord.php:13

What only the firm knows and the back office's settings keep: its denomination, its structure of practice, its bar, its network, the day the site was declared to the conseil de l'Ordre, how its fees are set, what a first meeting costs, whether legal aid is taken.

public function getFields(): array
public function getPublishedText(): string
public function getFirm(): ?string

The firm's denomination.

public function getBar(): ?string

The bar the firm is registered with.

public function getStructure(): ?string
public function getNetwork(): ?string
public function getFirstMeeting(): ?string
public function getLegalAid(): ?string

class LawyerExtension extends AbstractExtension LawyerExtension.php:18

The lawyers' own in templates, beside the practice's (legal_record(), legal_areas(), legal_mediator()...): legal_attorney(member) (bar, oath, certified specialisations, dominant fields) and legal_payment() (the hook for paying fees online).

public function __construct(readonly AttorneyRepository $attorneys, readonly FeePayment $payment)
public function getFunctions(): array

final class NotaryProfile implements ProfileInterface NotaryProfile.php:19

The notaries' profile: what a notary's office site owes to its professional rules (règlement professionnel du notariat, approved by the order of 29 January 2024), written as checks the back office runs - the regulated tariff and the discounts displayed, the consumer mediator of the notariat, e-mail addresses ending in notaires.fr, the site declared to the chamber, wording free of comparison, the profession's charter - and its own page: the tariff. No online payment: the profile has none.

Compliance built into the code does not replace the chamber's control.

public function getProfession(): Profession
public function getIdentification(): array

"Tout document destiné à la correspondance ou à la communication du notaire doit mentionner les éléments permettant de l'identifier" (règlement professionnel du notariat, art. 14.1): the legal notice prints the structure that holds the office, its address, its phone, its chamber.

public function getWordingPatterns(): array

Nothing of the notaries' alone so far: the common list is theirs.

The notary's communication keeps to "la dignité, la loyauté, la confraternité, la délicatesse ; la neutralité, l'impartialité et l'objectivité" (règlement professionnel, art. 14.1), abstains from "toute démarche à caractère publicitaire" (art. 14.2), and a personalised solicitation or an online offer of services "ne peut pas inclure d'éléments comparatifs ou dénigrants" (decree n° 73-1202 of 28 December 1973 as amended by decree n° 2019-257 of 29 March 2019).

public function getFeesRoute(): string

final class BrandBlockCheck implements ComplianceCheckInterface BrandBlockCheck.php:19

The profession's graphic charter and its brand block: the site keeps to "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" (règlement professionnel du notariat, art. 14.4), and the brand block with the NOTAIRES DE FRANCE logo is put "sur tous les supports de communication" (art. 14.5). Neither can be read from outside the profession's intranet: the office says in the settings that it has applied them, and until then the back office reminds it.

public function __construct(readonly NotaryRecord $record)
public function check(): ComplianceResult

final class ChamberDeclarationCheck extends DeclarationCheck ChamberDeclarationCheck.php:14

"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 [...] doit en informer sans délai la chambre des notaires dont il dépend" (règlement professionnel du notariat, art. 14.4). The settings keep which chamber and the day it was told.

final class ProfessionalEmailCheck implements ComplianceCheckInterface ProfessionalEmailCheck.php:16

The office's e-mail addresses end with notaires.fr (règlement professionnel du notariat, art. 16.3): the address each office shows to the public, and the one the site writes to clients from.

public function __construct(readonly OfficeRepository $offices, readonly ?string $sender = null, readonly string $suffix = 'notaires.fr')
public function check(): ComplianceResult

final class TariffDisplayCheck implements ComplianceCheckInterface TariffDisplayCheck.php:18

The tariff is displayed on the site (code de commerce, art. L. 444-4: the notaries post the tariffs they practise in their office and on their website), and with it the discounts the office grants, by category of deeds and by band - or that it grants none. The page /tarifs links to the official text; the office types its discounts in the settings. Past the period of the order in force, the reference is to be brought up to date.

public function __construct(readonly NotaryRecord $record, readonly array $tariff = [], readonly ?\DateTimeImmutable $today = null)
public function check(): ComplianceResult

class TariffController extends AbstractController TariffController.php:16

The tariff - the notaries' page of what it costs: regulated, so the page explains it and links to the official text, with the office's discounts and its fees for what the tariff does not cover.

public function tariff(OfficeRepository $offices, NotaryRecord $record): Response

final class NotaryDemoAccounts implements DemoAccountProviderInterface NotaryDemoAccounts.php:25

The demonstration accounts of a notary's office (glitchr/omnibase's demo environment): one for each role the profile and omnibase/office know. The roles of the office come from three groups, as in a real one - "Notaires" (ROLE_NOTARY), "Clercs" (ROLE_CLERK) and "Accueil" (ROLE_STAFF), the first two ROLE_STAFF through the application's role hierarchy; "etude" is the office's administrator.

An application's fixtures take them from Base\Demo\DemoAccountFactory ($accounts->account('notaire', $manager)) and attach what makes them worth signing in as: a member of the team and an agenda to the notary, a request and documents in the vault to the client. An office without one of these roles leaves it out: base.demo.exclude.

Registered when the installed glitchr/omnibase has the demo environment (config/services.php).

public function getDemoAccounts(): iterable

final class EmailDomain EmailDomain.php:15

"L'adresse de messagerie professionnelle sortante du notaire se termine par « .notaires.fr », afin d'éviter toute confusion dans l'esprit du public" (règlement professionnel du notariat, art. 16.3, approved by the order of 29 January 2024).

The host of the address is notaires.fr itself (prenom.nom@notaires.fr) or one of its subdomains (@paris.notaires.fr); a look-alike (@notaires.fr.example, @mes-notaires.fr) is not.

public static function isNotarial(?string $email, string $suffix = 'notaires.fr'): bool

class NotaryRecord extends Record NotaryRecord.php:14

What only the office knows and the back office's settings keep: the structure that holds the office, its CRPCEN number, its chamber, the day the site was declared to it, whether the profession's charter is applied, the discounts it practises, its fees for what the tariff does not cover.

public function getFields(): array
public function getLongFields(): array
public function getPublishedText(): string
public function getHolder(): ?string

The structure that holds the office (name and form).

public function getChamber(): ?string

The chamber the office depends on.

public function getCrpcen(): ?string
public function getDiscounts(): ?string
public function isBrandApplied(): bool

The profession's graphic charter and brand block, applied - as the office says.

class NotaryExtension extends AbstractExtension NotaryExtension.php:14

The notaries' own in templates, beside the practice's (legal_record(), legal_areas(), legal_mediator()...): legal_tariff() - the official text, the order in force and its last day.

public function __construct(readonly array $tariff = [])
public function getFunctions(): array

interface ProfileInterface ProfileInterface.php:15

What a profession tells the practice - the part a firm and an office share: what identifies it on its site, the words its communication must not carry beyond those common to every regulated practice, where it says what it costs. The chosen profession's profile answers (Base\Legal\Lawyer\LawyerProfile, Base\Legal\Notary\NotaryProfile); its settings are its record's (Base\Legal\Practice\Service\Record).

What the settings call the practice's name, a contact, its professional body.

A phone number or an e-mail address.

public function getProfession(): Profession
public function getIdentification(): array

What identifies the practice, in the order it is asked: the word the back office names it by when it is missing ("holder", "bar") => one of the constants above, or the key of a setting of the profession's own (a lawyer's structure of practice).

public function getWordingPatterns(): array

The profession's own forbidden words, after the common ones (Base\Office\Guard\Wording): label => regular expression on the text once lowered and stripped of its accents.

public function getFeesRoute(): string

The route of the page that says what it costs: the fees, the tariff.

final class LegalSettingsSection implements SettingsSectionInterface LegalSettingsSection.php:20

The settings' section of the practice: what the legal notice and the page of the fees print and only the practice knows. Which fields, and under which words, is the profession's (its record's getFields(), the labels <profession>.settings.* of the legal domain) - a firm's denomination, structure, bar and network; an office's holder, CRPCEN number, chamber, discounts. The compliance widget reads the same.

public function __construct(readonly ProfileInterface $profile, readonly Record $record, readonly TranslatorInterface $translator)
public function getPage(): string
public function getFields(): array

abstract class DeclarationCheck implements ComplianceCheckInterface DeclarationCheck.php:20

The site is declared to the professional body: the settings keep which one (the bar, the chamber) and the day it was told. Which rule asks it, and in which words, is the profession's - its profile extends this check and names its label (Base\Legal\Lawyer\Compliance\OrderDeclarationCheck, Base\Legal\Notary\Compliance\ChamberDeclarationCheck).

Under the label "<label>": "<label>_body_advice" when the body is not named, "<label>_advice" (with {body}) when no date is typed, "<label>_future" when the date is yet to come.

public function __construct(readonly Record $record)
public function check(): ComplianceResult

final class IdentificationCheck implements ComplianceCheckInterface IdentificationCheck.php:21

The practice can be identified on its site: a member of a regulated profession names its professional title, the body it is registered with and the rules that apply to it (loi n° 2004-575 du 21 juin 2004, art.

19), and each profession says what its own rules ask - a notary's "éléments permettant de l'identifier" (règlement professionnel, art. 14.1), a lawyer's bar and structure of practice (RIN art. 10.2). What is asked is the profile's (ProfileInterface::getIdentification()); where it is read is the same for all: the settings, and the main office's address.

public function __construct(readonly ProfileInterface $profile, readonly Record $record, readonly OfficeRepository $offices)
public function check(): ComplianceResult

final class MediatorCheck implements ComplianceCheckInterface MediatorCheck.php:20

The consumer mediator is named on the site, with how to reach it: the page /mediation and the legal notice print legal.mediator - by default the mediator the profession set up. For a notary: "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" (règlement professionnel du notariat, art. 25.1). Missing: no name, or no way to reach it; a warning for a site that is not https.

public function __construct(readonly ProfileInterface $profile, readonly array $mediator = [])
public function check(): ComplianceResult

final class WordingCheck implements ComplianceCheckInterface WordingCheck.php:22

What the practice wrote for the public - the fields of practice, the team's biographies, what it typed in the settings about its fees - read again for comparison, disparagement and the superlatives of advertising, and for what the profession forbids of its own (ProfileInterface::getWordingPatterns(), which says on which texts this rests). A warning names where and what.

public function __construct(readonly ProfileInterface $profile, readonly AreaRepository $areas, readonly MemberRepository $members, readonly Record $record, readonly array $extra = [])
public function check(): ComplianceResult

trait AdminScreenTrait AdminScreenTrait.php:23

The back office's screens of the practice and of a profile: written by the practice's administrator (ROLE_ADMIN), not only by the super-admin omnibase/admin asks by default for anything that writes (openTo()); a page of the bundle's own in the back office's chrome (page()).

omnibase/office has the same two helpers (OpenToTrait, AdminPageTrait); they are not used here because a jurist's site has no omnibase/office, and a trait that is missing is a fatal error wherever the class is read - not an exception a scan of the bundle's classes can step over.

public function setScreenChrome(AdminContext $adminContext, MenuBuilder $menuBuilder): void

class AreaCrudController extends AbstractCrudController AreaCrudController.php:25

The fields of practice as the site shows them. What is done in a field is named by the profession (a notary's "Actes et démarches", a lawyer's "Questions traitées"), and so is what its text must keep from.

public function setLegalProfile(ProfileInterface $profile): void
public static function getEntityFqcn(): string
public static function getPreferredIcon(): ?string
public function configureCrud(Crud $crud): Crud
public function configureActions(Actions $actions): Actions
public function configureFields(string $pageName): iterable

class PracticeController extends AbstractController PracticeController.php:17

The practice's public pages every profession has: the fields of practice and the consumer mediator. What it costs is the profession's own page (a lawyer's fees, a notary's tariff: its profile's controller).

public function __construct(readonly OfficeRepository $offices, readonly Record $record)
public function areas(AreaRepository $areas): Response
public function area(string $slug, AreaRepository $areas): Response
public function mediation(): Response

class RequestController extends AbstractRequestController RequestController.php:24

Asking for a first appointment without an account: a practice's clients are invited, so someone new could not go through omnibase/office's booking pages, which ask to sign in. The request becomes an appointment of the office in request mode (no time yet: the practice fixes it), under the name, the e-mail and the phone given; the few words are kept encrypted, as every reason is.

The form, its model and what is done with the request are omnibase/office's (AbstractRequestController, AppointmentRequests); the route, the page and its words are here - what the profession says of its own (nothing confidential yet; a lawyer: do not name the other party) is its <profession>.request.* in the legal domain.

public function request(Request $request): Response

class SpaceController extends AbstractController SpaceController.php:17

The client's space: the appointments to come, the documents the practice sent and those the client deposited - in the encrypted vault, never by e-mail.

public function index(AppointmentRepository $appointments, DocumentRepository $documents): Response

class Area extends Area Area.php:22

A field of practice of the firm or of the office (family, real estate, labour...): what it covers, what is done in it - a notary's deeds, a lawyer's matters -, who of the team follows it. Information for the public: its wording is checked (Base\Legal\Practice\Compliance\WordingCheck), and a lawyer's never calls it a "speciality" unless a certificate is held (Base\Legal\Lawyer\Compliance\SpecialisationCheck).

The fields and the methods are omnibase/office's (Base\Office\Entity\Area); the list, the members and the tables are here. Mapped when the profession keeps a practice (LegalExtension::prepend()).

public function getItems(): array
public function setItems(?array $items): static

final class Wording Wording.php:20

Words the communication of a lawyer or of a notary must not carry: comparison with colleagues, disparagement, the superlatives of advertising - and what a profession adds of its own (a lawyer's reference to judicial functions). Each profile cites its texts where it gives its patterns (ProfileInterface::getWordingPatterns()).

A list of expressions is a help to the person who writes, not a judge: what it finds is shown as a warning, and what it does not find is not thereby allowed.

The common expressions are omnibase/office's (Base\Office\Guard\Wording).

public static function scan(?string $text, array $extra = [], array $patterns = []): array
$extra

expressions of the site's own, matched as they are written (case and accents apart)

$patterns

the profession's own, label => regular expression on the plain text

Returns

what was found, by its label

public static function isClean(?string $text, array $extra = [], array $patterns = []): bool
public static function plain(string $text): string

Lowered, without accents nor tags, typographic apostrophes and spaces made plain.

class AreaRepository extends AreaRepository AreaRepository.php:13

The finders are omnibase/office's (findActive(), findOneActiveBySlug(), findForMember()).

public function __construct(ManagerRegistry $registry)

final class OfficeAudience implements AudienceResolverInterface OfficeAudience.php:26

Professional secrecy within the practice, as the tool applies it to a client's documents, beyond the client and whoever sent the document (the voter's own business):

  • those who work on the files (legal.roles.readers: a firm's lawyers, an office's notaries and clerks, who draw up the deeds) see and read it;
  • the rest of the staff (the secretariat, the reception) sees that it exists and what it is called, and reads only what is not marked confidential;
  • nobody else: neither another client, nor the site's administrators as such.

Only its sender withdraws a document.

public function __construct(readonly RoleHierarchyInterface $roles, readonly array $readerRoles = [], readonly string $staffRole = 'ROLE_STAFF')
public function decide(string $attribute, Document $document, UserInterface $user): ?bool

abstract class Record Record.php:19

What only the practice knows and the back office's settings keep. Every profession has these four: the practice's name (a firm's denomination, the structure that holds an office), its professional body (the bar, the chamber), the day the site was declared to it, how its fees are set. A profession's record adds its own (Base\Legal\Lawyer\Service\LawyerRecord, Base\Legal\Notary\Service\NotaryRecord) and says which fields the settings' form shows.

Read without ever failing a page: a settings table not there yet answers nothing.

public function __construct(readonly SettingBagInterface $settings)
abstract public function getFields(): array

The settings' fields of the profession, in the form's order: the setting's key => its name in the profession's labels (<profession>.settings.<name>).

public function getLongFields(): array
Returns

the keys among them typed on several lines

public function getPublishedText(): string

What the practice typed here and publishes on its pages: read again by the wording check.

public function get(string $path): ?string
public function getName(): ?string
public function getBody(): ?string
public function getFees(): ?string
public function getDeclaredAt(): ?\DateTimeImmutable

The day the site was declared to the professional body, when what was typed is a date.

class LegalExtension extends AbstractExtension LegalExtension.php:23

The practice in templates, whatever the profession: legal_profession() ("lawyer", "notary": the bundle's texts of a profession are under its name), legal_record() (what the settings keep: the name, the professional body, the fees, and the profession's own), legal_areas(member|null) (the fields of practice, or a member's), legal_mediator(), legal_rules_url(), legal_fees_route() (the page that says what it costs). A profile adds its own functions (legal_attorney(), legal_payment(); legal_tariff()).

public function __construct(readonly ProfileInterface $profile, readonly Record $record, readonly AreaRepository $areas, readonly array $mediator = [], readonly ?string $rulesUrl = null)
public function getFunctions(): array

final class ProfileRouteLoader extends Loader ProfileRouteLoader.php:22

The bundle's routes for the site's profession, whichever it is:

# config/routes.yaml legal: resource: . type: legal

The practice's pages when the profession keeps one (the fields of practice, the mediation, a first appointment asked, the client's space), then the profile's own (a lawyer's fees and the memo for the Ordre, a notary's tariff) - and none of another profession's. The back office's pages are read when omnibase/admin is installed.

public function __construct(readonly string $profession, readonly bool $practice = true, readonly bool $admin = true)
public function supports(mixed $resource, ?string $type = null): bool
public function load(mixed $resource, ?string $type = null): RouteCollection