Architecture

Modèle de données

DocTypes, Documents et métadonnées dans Dodock

Modèle de données

Dans Dodock, tout est Document. Cette abstraction uniforme simplifie le développement, l'extension et la maintenance des applications.

Concepts fondamentaux

DocType et Document

Un DocType est la définition d'un type de document : il décrit les champs, les comportements et les permissions. Un Document est une instance de ce DocType, c'est-à-dire un enregistrement en base de données.

Analogie avec les bases de données

Concept DodockÉquivalent SQLDescription
DocTypeTable + SchémaDéfinition de la structure
DocumentLigne (row)Enregistrement de données
DocFieldColonneChamp du document
LinkClé étrangèreRéférence vers un autre DocType
TableTable enfantRelation 1-N intégrée
Un DocType est lui-même un document, du type de document « DocType ». C'est pourquoi vous pouvez modifier la structure des données depuis l'interface.

Types de champs (DocField)

Chaque champ d'un DocType est défini par :

  • fieldname : Nom technique (snake_case)
  • fieldtype : Type de données
  • label : Libellé affiché
  • reqd : Obligatoire ou non

Types de champs disponibles

TypeDescriptionExemple
DataTexte courtNom, référence
TextTexte longDescription
IntNombre entierQuantité
FloatNombre décimalTaux
CurrencyMontant monétairePrix, total
DateDateDate de facturation
DatetimeDate et heureHorodatage
CheckCase à cocherActif/Inactif
SelectListe déroulanteStatut
LinkRéférence vers un DocTypeClient, Article
TableTable enfantLignes de facture
AttachFichier jointDocument PDF

Champs de mise en page

TypeDescription
Section BreakNouvelle section
Column BreakNouvelle colonne
Tab BreakNouvel onglet
HTMLContenu HTML personnalisé

Champs standards

Tous les documents possèdent automatiquement ces champs de métadonnées :

ChampTypeDescription
nameDataIdentifiant unique du document
ownerLink (User)Utilisateur créateur
creationDatetimeDate de création
modifiedDatetimeDate de dernière modification
modified_byLink (User)Dernier utilisateur modificateur
docstatusIntÉtat du document
idxIntPosition de la ligne, pour une table enfant
parent, parenttype, parentfieldDataDocument parent, type du parent et champ Table, pour une ligne de table enfant

États du document (docstatus)

Pour les DocTypes soumissibles (option « Est soumissible ») :

ValeurÉtatDescription
0BrouillonModifiable, non validé
1ValidéNon modifiable, sauf les champs « Autoriser les modifications après validation »
2AnnuléAnnulé après validation. Le bouton Modifier crée une copie en brouillon

Nommage des documents

Le champ name est l'identifiant unique de chaque document. La propriété « Règle de nommage » du DocType choisit la méthode. Elle remplit la propriété autoname :

RègleValeur de autonameExemple de nom
Par série (champ naming_series)naming_series:ACC-SINV-2026-00001
Par nom de champfield:customer_nameMaison Verte SARL
Expressionformat:INT-{customer}-{####}INT-Maison Verte SARL-0001
Aléatoirehasha1b2c3d4e5
Auto-incrémentautoincrement42
UUIDUUID0192f0e6-…
Défini par l'utilisateurpromptSaisie manuelle

Le contrôleur peut aussi définir une méthode autoname(self) qui calcule self.name.

Exemple de série

Avec la règle « Par série », l'utilisateur choisit la série dans le champ naming_series du document. Une série comme FACT-.YYYY.-.##### donne FACT-2026-00001. .YYYY. est remplacé par l'année et ##### par un compteur sur 5 chiffres.

Lire ou modifier le compteur d'une série depuis le code

La classe NamingSeries de frappe.model.naming donne accès au compteur d'une série. Le compteur est stocké dans le DocType Series, sous une clé qui est le préfixe calculé de la série : FACT-2026- pour FACT-.YYYY.-.#####.

MéthodeRôle
get_prefix(doc=None)Retourne le préfixe, c'est-à-dire la clé du compteur.
get_current_value(doc=None)Retourne la valeur actuelle du compteur (entier). Lit la ligne avec un verrou (for_update).
update_counter(new_count, doc=None)Écrit new_count dans le compteur. Crée la ligne du compteur si elle n'existe pas.
get_preview(doc=None)Retourne trois exemples de noms (compteur 1, 2 et 3), sans lire ni modifier le compteur.
generate_next_name(doc, *, ignore_validate=False)Retourne le prochain nom de la série.

Quand la série contient une partie {nom_du_champ}, le préfixe dépend de la valeur de ce champ. Passez alors le document en argument doc : sans lui, la partie n'est pas remplacée et le préfixe garde le texte littéral {nom_du_champ}. Les trois méthodes qui lisent ou écrivent le compteur (get_prefix, get_current_value, update_counter) acceptent ce paramètre facultatif. Un appel sans doc se comporte comme avant.

Exemple : avec un document Webhook dont le champ webhook_docevent vaut on_update :

from frappe.model.naming import NamingSeries

webhook = frappe.new_doc("Webhook")
webhook.webhook_docevent = "on_update"

series = NamingSeries("KOOH-.{webhook_docevent}.-.####")

series.get_prefix()         # "KOOH-{webhook_docevent}-"
series.get_prefix(webhook)  # "KOOH-on_update-"

series.update_counter(7, webhook)
series.get_current_value(webhook)  # 7
update_counter écrit la valeur sans autre contrôle. Une valeur trop basse peut produire des noms en double. Voir Reprendre un compteur pour la même opération depuis l'interface.

Relations entre DocTypes

Un champ Link crée une référence vers un autre DocType.

Table (relation 1-N)

Un champ Table intègre une table enfant directement dans le document parent.

Exemple concret :

Facture de venteClient A
Date2024-01-15
Articles
ART-0015 × 100 € = 500 €
ART-0023 × 100 € = 300 €
Total800 €

Cycle de vie d'un document

Événements disponibles

ÉvénementMomentUsage typique
before_insertAvant la créationValeurs par défaut
before_validateAvant validateCompléter des valeurs avant les contrôles
validateAvant chaque enregistrementValidations métier
before_saveAprès validate, avant l'écritureCalculs automatiques
after_insertAprès la créationNotifications
on_updateAprès chaque enregistrementActions après l'enregistrement
before_submit, on_submitAvant et après la validation (docstatus 1)Écritures comptables, mouvements de stock
before_cancel, on_cancelAvant et après l'annulation (docstatus 2)Contre-passations
before_update_after_submit, on_update_after_submitModification d'un document validéContrôle des champs modifiables
on_changeAprès tout changement enregistréMise à jour de documents liés
on_trash, after_deleteAvant et après la suppressionNettoyage

Une application peut aussi réagir à ces événements sans modifier le contrôleur, avec le hook doc_events. Voir Référence des hooks.


Pour aller plus loin

Personnaliser les DocTypes

Ajouter des champs et comportements

API Documents

Référence complète de l'API

Rôles et permissions

Gérer les accès