Lue dans les fichiers PHP du paquet au commit f90b8933208b : ses espaces de noms, classes, interfaces et énumérations, leurs constantes, propriétés et méthodes publiques avec leur PHPDoc, et les options que prennent ses fabriques. Rien n’en est exécuté.
LegalBundleclassThe legal professions, one bundle and a profile for each (legal.profession: lawyer | notary | jurist - one site, one profession).
3 methods
ProfessionenumThe 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
LegalConfigurationclass2 methods · 1 constant
LegalExtensionclass4 methods
OfferingRuleclassThe 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
ReservedActivityenumWhat the law reserves to the professions it allows (French law no.
2 methods · 2 cases
RegulatedActivityGuardclassWhat 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
LawyerProfileclassThe 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
DomainNameCheckclassThe 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
FeesInformationCheckclass« 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
OrderDeclarationCheckclass« 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.
PaymentScopeCheckclassPaying 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
SpecialisationCheckclassSpecialisations, as RIN art. 10.2 has them:
2 methods
Base\Legal\Lawyer\Controller\Admin
DeclarationControllerclassThe 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
AttorneyCrudControllerclassA 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
FeesControllerclassThe 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
LawyerDemoAccountsclassThe 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
AttorneyclassA 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
SpecialisationenumThe 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
DomainNameclassRIN 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
SpecialistWordsclassRIN 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
FeePaymentclassThe 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
AttorneyRepositoryclass3 methods
DomainsclassThe 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
LawyerRecordclassWhat 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
LawyerExtensionclassThe 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
NotaryProfileclassThe 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
BrandBlockCheckclassThe 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
ChamberDeclarationCheckclass"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.
ProfessionalEmailCheckclassThe 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
TariffDisplayCheckclassThe 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
TariffControllerclassThe 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
NotaryDemoAccountsclassThe 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
EmailDomainclass"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
NotaryRecordclassWhat 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
NotaryExtensionclassThe 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
ProfileInterfaceinterfaceWhat 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
LegalSettingsSectionclassThe 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
DeclarationCheckclassThe 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
IdentificationCheckclassThe 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
MediatorCheckclassThe 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
WordingCheckclassWhat 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
AdminScreenTraittraitThe 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
AreaCrudControllerclassThe 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
PracticeControllerclassThe 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
RequestControllerclassAsking 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
SpaceControllerclassThe 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
AreaclassA 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
WordingclassWords 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
AreaRepositoryclassThe finders are omnibase/office's (findActive(), findOneActiveBySlug(), findForMember()).
1 method
OfficeAudienceclassProfessional 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
RecordclassWhat 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
LegalExtensionclassThe 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
ProfileRouteLoaderclassThe bundle's routes for the site's profession, whichever it is:
3 methods
Base\Legal
LegalBundle class
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.
LegalBundle::__construct()
public function __construct()LegalBundle::getPath()
public function getPath(): stringModern layout: the class lives in src/, the bundle root is the package root.
LegalBundle::build()
public function build(ContainerBuilder $container): voidProfession enum
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.
case LAWYER = 'lawyer'case NOTARY = 'notary'case JURIST = 'jurist'
Profession::hasPractice()
public function hasPractice(): boolWhether 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.
Profession::folder()
public function folder(): stringThe profile's folder under src/, and its namespace under Base\Legal.
Profession::values()
public static function values(): arrayBase\Legal\DependencyInjection
LegalConfiguration class
class LegalConfiguration extends AbstractBaseConfiguration LegalConfiguration.php:9
const DEFAULTS = ['lawyer' => ['readers' => ['ROLE_LAWYER'], 'mediator' => ['name' => 'Médiateur de la consommation de la profession d’avocat', 'address' => '180 boulevard Ha…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.
LegalConfiguration::getConfigTreeBuilder()
public function getConfigTreeBuilder(): TreeBuilderLegalConfiguration::withProfessionDefaults()
public static function withProfessionDefaults(array $config): arrayThe configuration once the chosen profession's defaults are filled in.
$configthe processed tree
LegalExtension class
class LegalExtension extends AbstractBaseExtension implements PrependExtensionInterface LegalExtension.php:13
LegalExtension::getConfiguration()
public function getConfiguration(array $config, ContainerBuilder $container): LegalConfigurationLegalExtension::profession()
public static function profession(array $configs): ?ProfessionThe profession as the configuration files write it, the last one that sets it winning: prepend() needs it before anything is processed.
$configslegal's configurations, unprocessed
LegalExtension::prepend()
public function prepend(ContainerBuilder $container): voidWhat 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.
LegalExtension::load()
public function load(array $configs, ContainerBuilder $container): voidBase\Legal\Jurist\Consulting
OfferingRule class
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.
OfferingRule::__construct()
public function __construct(readonly RegulatedActivityGuard $guard, readonly TranslatorInterface $translator)OfferingRule::check()
public function check(Offering $offering): ?OfferingViolationBase\Legal\Jurist\Enum
ReservedActivity enum
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.
case LEGAL_CONSULTATION = 'legal_consultation'case DEED_DRAFTING = 'deed_drafting'
ReservedActivity::label()
public function label(): stringIts name, a key of the legal domain.
ReservedActivity::patterns()
public function patterns(): array- Returns
the regular expressions that give it away in a text
Base\Legal\Jurist\Service
RegulatedActivityGuard class
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).
RegulatedActivityGuard::__construct()
public function __construct(readonly ?string $authorizedStatus = null)RegulatedActivityGuard::isAuthorized()
public function isAuthorized(): boolWhether the jurist holds a status that allows legal advice.
RegulatedActivityGuard::getAuthorizedStatus()
public function getAuthorizedStatus(): ?stringRegulatedActivityGuard::read()
public function read(?string $text): ?ReservedActivityThe reserved activity a text announces - whoever wrote it, whatever their status.
RegulatedActivityGuard::check()
public function check(?string $text): ?stringWhy this jurist may not publish the text, or null when he may.
- Returns
a translation key of the
legaldomain
Base\Legal\Lawyer
LawyerProfile class
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.
LawyerProfile::getProfession()
public function getProfession(): ProfessionLawyerProfile::getIdentification()
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.
LawyerProfile::getWordingPatterns()
public function getWordingPatterns(): arrayBeyond 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.
LawyerProfile::getFeesRoute()
public function getFeesRoute(): stringBase\Legal\Lawyer\Compliance
DomainNameCheck class
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).
DomainNameCheck::__construct()
public function __construct(readonly Domains $domains)DomainNameCheck::check()
public function check(): ComplianceResultFeesInformationCheck class
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.
FeesInformationCheck::__construct()
public function __construct(readonly LawyerRecord $record)FeesInformationCheck::check()
public function check(): ComplianceResultOrderDeclarationCheck class
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.
PaymentScopeCheck class
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.
PaymentScopeCheck::__construct()
public function __construct(readonly FeePayment $payment)PaymentScopeCheck::check()
public function check(): ComplianceResultSpecialisationCheck class
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.
SpecialisationCheck::__construct()
public function __construct(readonly AttorneyRepository $attorneys, readonly AreaRepository $areas)SpecialisationCheck::check()
public function check(): ComplianceResultBase\Legal\Lawyer\Controller\Admin
DeclarationController class
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.
DeclarationController::index()
public function index(LawyerRecord $record, Domains $domains, AttorneyRepository $attorneys, AreaRepository $areas): ResponseBase\Legal\Lawyer\Controller\Admin\Crud
AttorneyCrudController class
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).
AttorneyCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringAttorneyCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringAttorneyCrudController::configureCrud()
public function configureCrud(Crud $crud): CrudAttorneyCrudController::configureActions()
public function configureActions(Actions $actions): ActionsAttorneyCrudController::configureFields()
public function configureFields(string $pageName): iterableBase\Legal\Lawyer\Controller\Client
FeesController class
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.
FeesController::fees()
public function fees(OfficeRepository $offices, LawyerRecord $record, FeePayment $payment, MemberRepository $members, AppointmentTypeRepository $types): ResponseBase\Legal\Lawyer\Demo
LawyerDemoAccounts class
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).
const LAWYERS = 'Avocats'const SECRETARIES = 'Secrétariat'const CLIENTS = 'Clients'
LawyerDemoAccounts::getDemoAccounts()
public function getDemoAccounts(): iterableBase\Legal\Lawyer\Entity
Attorney class
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).
const MAX_DOMINANT_FIELDS = 3RIN art. 10.2: « dont le nombre revendiqué ne peut être supérieur à trois ».
Attorney::__construct()
public function __construct(?Member $member = null, ?string $bar = null)Attorney::__toString()
public function __toString(): stringAttorney::getId()
public function getId(): ?intAttorney::getMember()
public function getMember(): ?MemberAttorney::setMember()
public function setMember(?Member $member): selfAttorney::getBar()
public function getBar(): ?stringAttorney::setBar()
public function setBar(?string $bar): selfAttorney::getSwornIn()
public function getSwornIn(): ?intAttorney::setSwornIn()
public function setSwornIn(?int $year): selfAttorney::getQualification()
public function getQualification(): ?stringAttorney::setQualification()
public function setQualification(?string $qualification): selfAttorney::getSpecialisations()
public function getSpecialisations(): array- Returns
only what the official list knows
Attorney::getSpecialisationValues()
public function getSpecialisationValues(): arrayAttorney::setSpecialisationValues()
public function setSpecialisationValues(?array $values): selfAnything outside the official list is dropped: a specialisation is a certificate, not a wish.
Attorney::isSpecialist()
public function isSpecialist(): boolAttorney::getDominantFields()
public function getDominantFields(): arrayAttorney::setDominantFields()
public function setDominantFields(?array $fields): selfAttorney::getDominantFieldsText()
public function getDominantFieldsText(): stringOne a line: what the back office's form edits.
Attorney::setDominantFieldsText()
public function setDominantFieldsText(?string $text): selfBase\Legal\Lawyer\Enum
Specialisation enum
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.
case ARBITRATION = 'arbitrage'case ASSOCIATIONS = 'associations-fondations'case INSURANCE = 'assurances'case BANKING = 'bancaire-boursier'case COMMERCIAL = 'commercial-affaires-concurrence'case CREDIT = 'credit-consommation'case BODILY_INJURY = 'dommage-corporel'case CHILDREN = 'enfants'case ENVIRONMENT = 'environnement'case FOREIGNERS = 'etrangers-nationalite'case FAMILY = 'famille-personnes-patrimoine'case TRUST = 'fiducie'case TAX = 'fiscal-douanier'case SECURITIES = 'garanties-suretes-execution'case REAL_ESTATE = 'immobilier'case INTERNATIONAL = 'international-union-europeenne'case DIGITAL = 'numerique-communications'case CRIMINAL = 'penal'case INTELLECTUAL_PROPERTY = 'propriete-intellectuelle'case DATA_PROTECTION = 'protection-donnees-personnelles'case PUBLIC = 'public'case RURAL = 'rural'case HEALTH = 'sante'case COMPANIES = 'societes'case SPORT = 'sport'case TRANSPORT = 'transports'case LABOUR = 'travail'const MAX = 2An avocat holds and uses two mentions at most (Conseil national des barreaux).
Specialisation::label()
public function label(): stringThe mention as the order names it.
Specialisation::choices()
public static function choices(): array- Returns
label => value, for a form
Base\Legal\Lawyer\Guard
DomainName class
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.
const OK = 'ok'const GENERIC = 'generic'const MIXED = 'mixed'const UNNAMED = 'unnamed'const LOCAL = 'local'
DomainName::assess()
public static function assess(?string $host, array $names): string$namesthe firm's denomination and the lawyers' names
SpecialistWords class
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.
SpecialistWords::find()
public static function find(?string $text): array- Returns
the words found, as written
SpecialistWords::uses()
public static function uses(?string $text): boolBase\Legal\Lawyer\Payment
FeePayment class
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).
const MARKETPLACE = 'Base\Marketplace\MarketplaceBundle'
FeePayment::__construct()
public function __construct(readonly bool $enabled = false, readonly ?string $route = null, readonly ?bool $installed = null)FeePayment::isInstalled()
public function isInstalled(): boolWhether omnibase/marketplace is there to take the payment.
FeePayment::isEnabled()
public function isEnabled(): boolFeePayment::isAvailable()
public function isAvailable(): boolShown on the fees page only when all three hold.
FeePayment::getRoute()
public function getRoute(): ?stringBase\Legal\Lawyer\Repository
AttorneyRepository class
class AttorneyRepository extends ServiceEntityRepository AttorneyRepository.php:11
AttorneyRepository::__construct()
public function __construct(ManagerRegistry $registry)AttorneyRepository::findOneByMember()
public function findOneByMember(?Member $member): ?AttorneyAttorneyRepository::findVisible()
public function findVisible(): array- Returns
those the site shows
Base\Legal\Lawyer\Service
Domains class
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'.
Domains::__construct()
public function __construct(readonly LawyerRecord $record, readonly AttorneyRepository $attorneys, readonly array $domains = [], readonly ?string $defaultUri = null)Domains::all()
public function all(): arrayDomains::names()
public function names(): array- Returns
the firm's denomination and its lawyers' names
Domains::verdicts()
public function verdicts(): array- Returns
domain => DomainName verdict
LawyerRecord class
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.
const STRUCTURE = 'legal.lawyer.structure'const NETWORK = 'legal.lawyer.network'const FIRST_MEETING = 'legal.lawyer.first_meeting'const LEGAL_AID = 'legal.lawyer.legal_aid'
LawyerRecord::getFields()
public function getFields(): arrayLawyerRecord::getPublishedText()
public function getPublishedText(): stringLawyerRecord::getFirm()
public function getFirm(): ?stringThe firm's denomination.
LawyerRecord::getBar()
public function getBar(): ?stringThe bar the firm is registered with.
LawyerRecord::getStructure()
public function getStructure(): ?stringLawyerRecord::getNetwork()
public function getNetwork(): ?stringLawyerRecord::getFirstMeeting()
public function getFirstMeeting(): ?stringLawyerRecord::getLegalAid()
public function getLegalAid(): ?stringBase\Legal\Lawyer\Twig
LawyerExtension class
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).
LawyerExtension::__construct()
public function __construct(readonly AttorneyRepository $attorneys, readonly FeePayment $payment)LawyerExtension::getFunctions()
public function getFunctions(): arrayBase\Legal\Notary
NotaryProfile class
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.
NotaryProfile::getProfession()
public function getProfession(): ProfessionNotaryProfile::getIdentification()
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.
NotaryProfile::getWordingPatterns()
public function getWordingPatterns(): arrayNothing 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).
NotaryProfile::getFeesRoute()
public function getFeesRoute(): stringBase\Legal\Notary\Compliance
BrandBlockCheck class
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.
BrandBlockCheck::__construct()
public function __construct(readonly NotaryRecord $record)BrandBlockCheck::check()
public function check(): ComplianceResultChamberDeclarationCheck class
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.
ProfessionalEmailCheck class
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.
ProfessionalEmailCheck::__construct()
public function __construct(readonly OfficeRepository $offices, readonly ?string $sender = null, readonly string $suffix = 'notaires.fr')ProfessionalEmailCheck::check()
public function check(): ComplianceResultTariffDisplayCheck class
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.
TariffDisplayCheck::__construct()
public function __construct(readonly NotaryRecord $record, readonly array $tariff = [], readonly ?\DateTimeImmutable $today = null)TariffDisplayCheck::check()
public function check(): ComplianceResultBase\Legal\Notary\Controller\Client
TariffController class
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.
TariffController::tariff()
public function tariff(OfficeRepository $offices, NotaryRecord $record): ResponseBase\Legal\Notary\Demo
NotaryDemoAccounts class
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).
const NOTARIES = 'Notaires'const CLERKS = 'Clercs'const RECEPTION = 'Accueil'const CLIENTS = 'Clients'
NotaryDemoAccounts::getDemoAccounts()
public function getDemoAccounts(): iterableBase\Legal\Notary\Guard
EmailDomain class
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.
EmailDomain::isNotarial()
public static function isNotarial(?string $email, string $suffix = 'notaires.fr'): boolBase\Legal\Notary\Service
NotaryRecord class
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.
const CRPCEN = 'legal.notary.crpcen'const BRAND = 'legal.notary.brand_applied'const DISCOUNTS = 'legal.notary.discounts'
NotaryRecord::getFields()
public function getFields(): arrayNotaryRecord::getLongFields()
public function getLongFields(): arrayNotaryRecord::getPublishedText()
public function getPublishedText(): stringNotaryRecord::getHolder()
public function getHolder(): ?stringThe structure that holds the office (name and form).
NotaryRecord::getChamber()
public function getChamber(): ?stringThe chamber the office depends on.
NotaryRecord::getCrpcen()
public function getCrpcen(): ?stringNotaryRecord::getDiscounts()
public function getDiscounts(): ?stringNotaryRecord::isBrandApplied()
public function isBrandApplied(): boolThe profession's graphic charter and brand block, applied - as the office says.
Base\Legal\Notary\Twig
NotaryExtension class
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.
NotaryExtension::__construct()
public function __construct(readonly array $tariff = [])NotaryExtension::getFunctions()
public function getFunctions(): arrayBase\Legal\Practice
ProfileInterface interface
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).
const NAME = 'name'What the settings call the practice's name, a contact, its professional body.
const ADDRESS = 'address'const PHONE = 'phone'const CONTACT = 'contact'A phone number or an e-mail address.
const BODY = 'body'
ProfileInterface::getProfession()
public function getProfession(): ProfessionProfileInterface::getIdentification()
public function getIdentification(): arrayWhat 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).
ProfileInterface::getWordingPatterns()
public function getWordingPatterns(): arrayThe 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.
ProfileInterface::getFeesRoute()
public function getFeesRoute(): stringThe route of the page that says what it costs: the fees, the tariff.
Base\Legal\Practice\Admin\Settings
LegalSettingsSection class
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.
LegalSettingsSection::__construct()
public function __construct(readonly ProfileInterface $profile, readonly Record $record, readonly TranslatorInterface $translator)LegalSettingsSection::getPage()
public function getPage(): stringLegalSettingsSection::getFields()
public function getFields(): arrayBase\Legal\Practice\Compliance
DeclarationCheck class
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.
DeclarationCheck::__construct()
public function __construct(readonly Record $record)DeclarationCheck::check()
public function check(): ComplianceResultIdentificationCheck class
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.
IdentificationCheck::__construct()
public function __construct(readonly ProfileInterface $profile, readonly Record $record, readonly OfficeRepository $offices)IdentificationCheck::check()
public function check(): ComplianceResultMediatorCheck class
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.
MediatorCheck::__construct()
public function __construct(readonly ProfileInterface $profile, readonly array $mediator = [])MediatorCheck::check()
public function check(): ComplianceResultWordingCheck class
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.
WordingCheck::__construct()
public function __construct(readonly ProfileInterface $profile, readonly AreaRepository $areas, readonly MemberRepository $members, readonly Record $record, readonly array $extra = [])WordingCheck::check()
public function check(): ComplianceResultBase\Legal\Practice\Controller\Admin
AdminScreenTrait trait
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.
AdminScreenTrait::setScreenChrome()
public function setScreenChrome(AdminContext $adminContext, MenuBuilder $menuBuilder): voidBase\Legal\Practice\Controller\Admin\Crud
AreaCrudController class
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.
AreaCrudController::setLegalProfile()
public function setLegalProfile(ProfileInterface $profile): voidAreaCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringAreaCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringAreaCrudController::configureCrud()
public function configureCrud(Crud $crud): CrudAreaCrudController::configureActions()
public function configureActions(Actions $actions): ActionsAreaCrudController::configureFields()
public function configureFields(string $pageName): iterableBase\Legal\Practice\Controller\Client
PracticeController class
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).
PracticeController::__construct()
public function __construct(readonly OfficeRepository $offices, readonly Record $record)PracticeController::areas()
public function areas(AreaRepository $areas): ResponsePracticeController::area()
public function area(string $slug, AreaRepository $areas): ResponsePracticeController::mediation()
public function mediation(): ResponseRequestController class
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.
RequestController::request()
public function request(Request $request): ResponseSpaceController class
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.
SpaceController::index()
public function index(AppointmentRepository $appointments, DocumentRepository $documents): ResponseBase\Legal\Practice\Entity
Area class
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()).
Area::getItems()
public function getItems(): arrayArea::setItems()
public function setItems(?array $items): staticBase\Legal\Practice\Guard
Wording class
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).
Wording::scan()
public static function scan(?string $text, array $extra = [], array $patterns = []): array$extraexpressions of the site's own, matched as they are written (case and accents apart)
$patternsthe profession's own, label => regular expression on the plain text
- Returns
what was found, by its label
Wording::isClean()
public static function isClean(?string $text, array $extra = [], array $patterns = []): boolWording::plain()
public static function plain(string $text): stringLowered, without accents nor tags, typographic apostrophes and spaces made plain.
Base\Legal\Practice\Repository
AreaRepository class
class AreaRepository extends AreaRepository AreaRepository.php:13
The finders are omnibase/office's (findActive(), findOneActiveBySlug(), findForMember()).
AreaRepository::__construct()
public function __construct(ManagerRegistry $registry)Base\Legal\Practice\Security
OfficeAudience class
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.
OfficeAudience::__construct()
public function __construct(readonly RoleHierarchyInterface $roles, readonly array $readerRoles = [], readonly string $staffRole = 'ROLE_STAFF')OfficeAudience::decide()
public function decide(string $attribute, Document $document, UserInterface $user): ?boolBase\Legal\Practice\Service
Record class
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.
const NAME = 'legal.practice.name'const BODY = 'legal.body.name'const DECLARED_AT = 'legal.body.declared_at'const FEES = 'legal.fees.terms'
Record::__construct()
public function __construct(readonly SettingBagInterface $settings)Record::getFields()
abstract public function getFields(): arrayThe settings' fields of the profession, in the form's order: the setting's key => its name in the profession's labels (<profession>.settings.<name>).
Record::getLongFields()
public function getLongFields(): array- Returns
the keys among them typed on several lines
Record::getPublishedText()
public function getPublishedText(): stringWhat the practice typed here and publishes on its pages: read again by the wording check.
Record::get()
public function get(string $path): ?stringRecord::getName()
public function getName(): ?stringRecord::getBody()
public function getBody(): ?stringRecord::getFees()
public function getFees(): ?stringRecord::getDeclaredAt()
public function getDeclaredAt(): ?\DateTimeImmutableThe day the site was declared to the professional body, when what was typed is a date.
Base\Legal\Practice\Twig
LegalExtension class
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()).
LegalExtension::__construct()
public function __construct(readonly ProfileInterface $profile, readonly Record $record, readonly AreaRepository $areas, readonly array $mediator = [], readonly ?string $rulesUrl = null)LegalExtension::getFunctions()
public function getFunctions(): arrayBase\Legal\Routing
ProfileRouteLoader class
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.
ProfileRouteLoader::__construct()
public function __construct(readonly string $profession, readonly bool $practice = true, readonly bool $admin = true)ProfileRouteLoader::supports()
public function supports(mixed $resource, ?string $type = null): boolProfileRouteLoader::load()
public function load(mixed $resource, ?string $type = null): RouteCollection