[{"data":1,"prerenderedAt":1391},["ShallowReactive",2],{"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Farchitecture\u002Fmodele-donnees":3,"section:\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Farchitecture\u002Fmodele-donnees":1390},{"id":4,"title":5,"body":6,"description":1374,"extension":1375,"meta":1376,"navigation":932,"path":1386,"seo":1387,"stem":1388,"__hash__":1389},"docs\u002F2.next\u002F3.dodock\u002F10.developpeurs\u002F01.architecture\u002F2.modele-donnees.md","Modèle de données",{"type":7,"value":8,"toc":1349},"minimark",[9,13,22,27,32,43,57,61,137,145,148,152,155,183,187,354,358,410,412,416,419,538,542,545,598,600,604,614,739,750,754,776,780,801,869,896,912,991,1006,1008,1012,1016,1022,1025,1029,1034,1037,1042,1100,1102,1106,1114,1118,1300,1311,1313,1317,1345],[10,11,5],"h1",{"id":12},"modèle-de-données",[14,15,16,17,21],"p",{},"Dans Dodock, ",[18,19,20],"strong",{},"tout est Document",". Cette abstraction uniforme simplifie le développement, l'extension et la maintenance des applications.",[23,24,26],"h2",{"id":25},"concepts-fondamentaux","Concepts fondamentaux",[28,29,31],"h3",{"id":30},"doctype-et-document","DocType et Document",[14,33,34,35,38,39,42],{},"Un ",[18,36,37],{},"DocType"," est la définition d'un type de document : il décrit les champs, les comportements et les permissions. Un ",[18,40,41],{},"Document"," est une instance de ce DocType, c'est-à-dire un enregistrement en base de données.",[44,45,46],"mermaid",{},[47,48,54],"pre",{"className":49,"code":51,"language":52,"meta":53},[50],"language-text","flowchart TB\n    subgraph DocType[\"DocType : Facture de vente\"]\n        D1[\"Champs : client, montant, date, articles...\"]\n        D2[\"Permissions : lecture, création, soumission...\"]\n        D3[\"Comportements : soumissible, nommage auto...\"]\n    end\n\n    DocType -->|définit| Documents\n\n    subgraph Documents[\"Documents (instances)\"]\n        DOC1[\"FACT-00001\u003Cbr\u002F>Client A\u003Cbr\u002F>1 500 €\"]\n        DOC2[\"FACT-00002\u003Cbr\u002F>Client B\u003Cbr\u002F>2 300 €\"]\n        DOC3[\"FACT-00003\u003Cbr\u002F>Client A\u003Cbr\u002F>890 €\"]\n    end\n","text","",[55,56,51],"code",{"__ignoreMap":53},[28,58,60],{"id":59},"analogie-avec-les-bases-de-données","Analogie avec les bases de données",[62,63,64,80],"table",{},[65,66,67],"thead",{},[68,69,70,74,77],"tr",{},[71,72,73],"th",{},"Concept Dodock",[71,75,76],{},"Équivalent SQL",[71,78,79],{},"Description",[81,82,83,94,104,115,126],"tbody",{},[68,84,85,88,91],{},[86,87,37],"td",{},[86,89,90],{},"Table + Schéma",[86,92,93],{},"Définition de la structure",[68,95,96,98,101],{},[86,97,41],{},[86,99,100],{},"Ligne (row)",[86,102,103],{},"Enregistrement de données",[68,105,106,109,112],{},[86,107,108],{},"DocField",[86,110,111],{},"Colonne",[86,113,114],{},"Champ du document",[68,116,117,120,123],{},[86,118,119],{},"Link",[86,121,122],{},"Clé étrangère",[86,124,125],{},"Référence vers un autre DocType",[68,127,128,131,134],{},[86,129,130],{},"Table",[86,132,133],{},"Table enfant",[86,135,136],{},"Relation 1-N intégrée",[138,139,142],"callout",{"color":140,"icon":141},"teal","i-heroicons-light-bulb",[14,143,144],{},"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.",[146,147],"hr",{},[23,149,151],{"id":150},"types-de-champs-docfield","Types de champs (DocField)",[14,153,154],{},"Chaque champ d'un DocType est défini par :",[156,157,158,165,171,177],"ul",{},[159,160,161,164],"li",{},[18,162,163],{},"fieldname"," : Nom technique (snake_case)",[159,166,167,170],{},[18,168,169],{},"fieldtype"," : Type de données",[159,172,173,176],{},[18,174,175],{},"label"," : Libellé affiché",[159,178,179,182],{},[18,180,181],{},"reqd"," : Obligatoire ou non",[28,184,186],{"id":185},"types-de-champs-disponibles","Types de champs disponibles",[62,188,189,201],{},[65,190,191],{},[68,192,193,196,198],{},[71,194,195],{},"Type",[71,197,79],{},[71,199,200],{},"Exemple",[81,202,203,216,228,241,254,267,279,292,305,318,330,341],{},[68,204,205,210,213],{},[86,206,207],{},[18,208,209],{},"Data",[86,211,212],{},"Texte court",[86,214,215],{},"Nom, référence",[68,217,218,223,226],{},[86,219,220],{},[18,221,222],{},"Text",[86,224,225],{},"Texte long",[86,227,79],{},[68,229,230,235,238],{},[86,231,232],{},[18,233,234],{},"Int",[86,236,237],{},"Nombre entier",[86,239,240],{},"Quantité",[68,242,243,248,251],{},[86,244,245],{},[18,246,247],{},"Float",[86,249,250],{},"Nombre décimal",[86,252,253],{},"Taux",[68,255,256,261,264],{},[86,257,258],{},[18,259,260],{},"Currency",[86,262,263],{},"Montant monétaire",[86,265,266],{},"Prix, total",[68,268,269,274,276],{},[86,270,271],{},[18,272,273],{},"Date",[86,275,273],{},[86,277,278],{},"Date de facturation",[68,280,281,286,289],{},[86,282,283],{},[18,284,285],{},"Datetime",[86,287,288],{},"Date et heure",[86,290,291],{},"Horodatage",[68,293,294,299,302],{},[86,295,296],{},[18,297,298],{},"Check",[86,300,301],{},"Case à cocher",[86,303,304],{},"Actif\u002FInactif",[68,306,307,312,315],{},[86,308,309],{},[18,310,311],{},"Select",[86,313,314],{},"Liste déroulante",[86,316,317],{},"Statut",[68,319,320,324,327],{},[86,321,322],{},[18,323,119],{},[86,325,326],{},"Référence vers un DocType",[86,328,329],{},"Client, Article",[68,331,332,336,338],{},[86,333,334],{},[18,335,130],{},[86,337,133],{},[86,339,340],{},"Lignes de facture",[68,342,343,348,351],{},[86,344,345],{},[18,346,347],{},"Attach",[86,349,350],{},"Fichier joint",[86,352,353],{},"Document PDF",[28,355,357],{"id":356},"champs-de-mise-en-page","Champs de mise en page",[62,359,360,368],{},[65,361,362],{},[68,363,364,366],{},[71,365,195],{},[71,367,79],{},[81,369,370,380,390,400],{},[68,371,372,377],{},[86,373,374],{},[18,375,376],{},"Section Break",[86,378,379],{},"Nouvelle section",[68,381,382,387],{},[86,383,384],{},[18,385,386],{},"Column Break",[86,388,389],{},"Nouvelle colonne",[68,391,392,397],{},[86,393,394],{},[18,395,396],{},"Tab Break",[86,398,399],{},"Nouvel onglet",[68,401,402,407],{},[86,403,404],{},[18,405,406],{},"HTML",[86,408,409],{},"Contenu HTML personnalisé",[146,411],{},[23,413,415],{"id":414},"champs-standards","Champs standards",[14,417,418],{},"Tous les documents possèdent automatiquement ces champs de métadonnées :",[62,420,421,432],{},[65,422,423],{},[68,424,425,428,430],{},[71,426,427],{},"Champ",[71,429,195],{},[71,431,79],{},[81,433,434,446,459,471,483,495,507,519],{},[68,435,436,441,443],{},[86,437,438],{},[55,439,440],{},"name",[86,442,209],{},[86,444,445],{},"Identifiant unique du document",[68,447,448,453,456],{},[86,449,450],{},[55,451,452],{},"owner",[86,454,455],{},"Link (User)",[86,457,458],{},"Utilisateur créateur",[68,460,461,466,468],{},[86,462,463],{},[55,464,465],{},"creation",[86,467,285],{},[86,469,470],{},"Date de création",[68,472,473,478,480],{},[86,474,475],{},[55,476,477],{},"modified",[86,479,285],{},[86,481,482],{},"Date de dernière modification",[68,484,485,490,492],{},[86,486,487],{},[55,488,489],{},"modified_by",[86,491,455],{},[86,493,494],{},"Dernier utilisateur modificateur",[68,496,497,502,504],{},[86,498,499],{},[55,500,501],{},"docstatus",[86,503,234],{},[86,505,506],{},"État du document",[68,508,509,514,516],{},[86,510,511],{},[55,512,513],{},"idx",[86,515,234],{},[86,517,518],{},"Position de la ligne, pour une table enfant",[68,520,521,533,535],{},[86,522,523,526,527,526,530],{},[55,524,525],{},"parent",", ",[55,528,529],{},"parenttype",[55,531,532],{},"parentfield",[86,534,209],{},[86,536,537],{},"Document parent, type du parent et champ Table, pour une ligne de table enfant",[28,539,541],{"id":540},"états-du-document-docstatus","États du document (docstatus)",[14,543,544],{},"Pour les DocTypes soumissibles (option « Est soumissible ») :",[62,546,547,559],{},[65,548,549],{},[68,550,551,554,557],{},[71,552,553],{},"Valeur",[71,555,556],{},"État",[71,558,79],{},[81,560,561,572,583],{},[68,562,563,566,569],{},[86,564,565],{},"0",[86,567,568],{},"Brouillon",[86,570,571],{},"Modifiable, non validé",[68,573,574,577,580],{},[86,575,576],{},"1",[86,578,579],{},"Validé",[86,581,582],{},"Non modifiable, sauf les champs « Autoriser les modifications après validation »",[68,584,585,588,591],{},[86,586,587],{},"2",[86,589,590],{},"Annulé",[86,592,593,594,597],{},"Annulé après validation. Le bouton ",[18,595,596],{},"Modifier"," crée une copie en brouillon",[146,599],{},[23,601,603],{"id":602},"nommage-des-documents","Nommage des documents",[14,605,606,607,609,610,613],{},"Le champ ",[55,608,440],{}," 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é ",[55,611,612],{},"autoname"," :",[62,615,616,631],{},[65,617,618],{},[68,619,620,623,628],{},[71,621,622],{},"Règle",[71,624,625,626],{},"Valeur de ",[55,627,612],{},[71,629,630],{},"Exemple de nom",[81,632,633,652,667,682,697,712,726],{},[68,634,635,642,647],{},[86,636,637,638,641],{},"Par série (champ ",[55,639,640],{},"naming_series",")",[86,643,644],{},[55,645,646],{},"naming_series:",[86,648,649],{},[55,650,651],{},"ACC-SINV-2026-00001",[68,653,654,657,662],{},[86,655,656],{},"Par nom de champ",[86,658,659],{},[55,660,661],{},"field:customer_name",[86,663,664],{},[55,665,666],{},"Maison Verte SARL",[68,668,669,672,677],{},[86,670,671],{},"Expression",[86,673,674],{},[55,675,676],{},"format:INT-{customer}-{####}",[86,678,679],{},[55,680,681],{},"INT-Maison Verte SARL-0001",[68,683,684,687,692],{},[86,685,686],{},"Aléatoire",[86,688,689],{},[55,690,691],{},"hash",[86,693,694],{},[55,695,696],{},"a1b2c3d4e5",[68,698,699,702,707],{},[86,700,701],{},"Auto-incrément",[86,703,704],{},[55,705,706],{},"autoincrement",[86,708,709],{},[55,710,711],{},"42",[68,713,714,717,721],{},[86,715,716],{},"UUID",[86,718,719],{},[55,720,716],{},[86,722,723],{},[55,724,725],{},"0192f0e6-…",[68,727,728,731,736],{},[86,729,730],{},"Défini par l'utilisateur",[86,732,733],{},[55,734,735],{},"prompt",[86,737,738],{},"Saisie manuelle",[14,740,741,742,745,746,749],{},"Le contrôleur peut aussi définir une méthode ",[55,743,744],{},"autoname(self)"," qui calcule ",[55,747,748],{},"self.name",".",[28,751,753],{"id":752},"exemple-de-série","Exemple de série",[14,755,756,757,759,760,763,764,767,768,771,772,775],{},"Avec la règle « Par série », l'utilisateur choisit la série dans le champ ",[55,758,640],{}," du document. Une série comme ",[55,761,762],{},"FACT-.YYYY.-.#####"," donne ",[55,765,766],{},"FACT-2026-00001",". ",[55,769,770],{},".YYYY."," est remplacé par l'année et ",[55,773,774],{},"#####"," par un compteur sur 5 chiffres.",[28,777,779],{"id":778},"lire-ou-modifier-le-compteur-dune-série-depuis-le-code","Lire ou modifier le compteur d'une série depuis le code",[14,781,782,783,786,787,790,791,794,795,798,799,749],{},"La classe ",[55,784,785],{},"NamingSeries"," de ",[55,788,789],{},"frappe.model.naming"," donne accès au compteur d'une série. Le compteur est stocké dans le DocType ",[55,792,793],{},"Series",", sous une clé qui est le préfixe calculé de la série : ",[55,796,797],{},"FACT-2026-"," pour ",[55,800,762],{},[62,802,803,813],{},[65,804,805],{},[68,806,807,810],{},[71,808,809],{},"Méthode",[71,811,812],{},"Rôle",[81,814,815,825,835,849,859],{},[68,816,817,822],{},[86,818,819],{},[55,820,821],{},"get_prefix(doc=None)",[86,823,824],{},"Retourne le préfixe, c'est-à-dire la clé du compteur.",[68,826,827,832],{},[86,828,829],{},[55,830,831],{},"get_current_value(doc=None)",[86,833,834],{},"Retourne la valeur actuelle du compteur (entier).",[68,836,837,842],{},[86,838,839],{},[55,840,841],{},"update_counter(new_count, doc=None)",[86,843,844,845,848],{},"Écrit ",[55,846,847],{},"new_count"," dans le compteur. Crée la ligne du compteur si elle n'existe pas.",[68,850,851,856],{},[86,852,853],{},[55,854,855],{},"get_preview(doc=None)",[86,857,858],{},"Retourne trois exemples de noms (compteur 1, 2 et 3), sans lire ni modifier le compteur.",[68,860,861,866],{},[86,862,863],{},[55,864,865],{},"generate_next_name(doc, *, ignore_validate=False)",[86,867,868],{},"Retourne le prochain nom de la série.",[14,870,871,872,875,876,879,880,882,883,526,886,526,889,892,893,895],{},"Quand la série contient une partie ",[55,873,874],{},"{nom_du_champ}",", le préfixe dépend de la valeur de ce champ. Passez alors le document en argument ",[55,877,878],{},"doc"," : sans lui, la partie n'est pas remplacée et le préfixe garde le texte littéral ",[55,881,874],{},". Les trois méthodes qui lisent ou écrivent le compteur (",[55,884,885],{},"get_prefix",[55,887,888],{},"get_current_value",[55,890,891],{},"update_counter",") acceptent ce paramètre facultatif. Un appel sans ",[55,894,878],{}," se comporte comme avant.",[14,897,898,900,901,904,905,908,909,613],{},[18,899,200],{}," : avec un document ",[55,902,903],{},"Webhook"," dont le champ ",[55,906,907],{},"webhook_docevent"," vaut ",[55,910,911],{},"on_update",[47,913,917],{"className":914,"code":915,"language":916,"meta":53,"style":53},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from frappe.model.naming import NamingSeries\n\nwebhook = frappe.new_doc(\"Webhook\")\nwebhook.webhook_docevent = \"on_update\"\n\nseries = NamingSeries(\"KOOH-.{webhook_docevent}.-.####\")\n\nseries.get_prefix()         # \"KOOH-{webhook_docevent}-\"\nseries.get_prefix(webhook)  # \"KOOH-on_update-\"\n\nseries.update_counter(7, webhook)\nseries.get_current_value(webhook)  # 7\n","python",[55,918,919,927,934,940,946,951,957,962,968,974,979,985],{"__ignoreMap":53},[920,921,924],"span",{"class":922,"line":923},"line",1,[920,925,926],{},"from frappe.model.naming import NamingSeries\n",[920,928,930],{"class":922,"line":929},2,[920,931,933],{"emptyLinePlaceholder":932},true,"\n",[920,935,937],{"class":922,"line":936},3,[920,938,939],{},"webhook = frappe.new_doc(\"Webhook\")\n",[920,941,943],{"class":922,"line":942},4,[920,944,945],{},"webhook.webhook_docevent = \"on_update\"\n",[920,947,949],{"class":922,"line":948},5,[920,950,933],{"emptyLinePlaceholder":932},[920,952,954],{"class":922,"line":953},6,[920,955,956],{},"series = NamingSeries(\"KOOH-.{webhook_docevent}.-.####\")\n",[920,958,960],{"class":922,"line":959},7,[920,961,933],{"emptyLinePlaceholder":932},[920,963,965],{"class":922,"line":964},8,[920,966,967],{},"series.get_prefix()         # \"KOOH-{webhook_docevent}-\"\n",[920,969,971],{"class":922,"line":970},9,[920,972,973],{},"series.get_prefix(webhook)  # \"KOOH-on_update-\"\n",[920,975,977],{"class":922,"line":976},10,[920,978,933],{"emptyLinePlaceholder":932},[920,980,982],{"class":922,"line":981},11,[920,983,984],{},"series.update_counter(7, webhook)\n",[920,986,988],{"class":922,"line":987},12,[920,989,990],{},"series.get_current_value(webhook)  # 7\n",[138,992,995],{"color":993,"icon":994},"amber","i-heroicons-exclamation-triangle",[14,996,997,999,1000,1005],{},[55,998,891],{}," écrit la valeur sans autre contrôle. Une valeur trop basse peut produire des noms en double. Voir ",[1001,1002,1004],"a",{"href":1003},"\u002Fnext\u002Fdodock\u002Ffonctionnalites\u002Fnommage#reprendre-un-compteur","Reprendre un compteur"," pour la même opération depuis l'interface.",[146,1007],{},[23,1009,1011],{"id":1010},"relations-entre-doctypes","Relations entre DocTypes",[28,1013,1015],{"id":1014},"link-relation-1-1-ou-n-1","Link (relation 1-1 ou N-1)",[14,1017,1018,1019,1021],{},"Un champ ",[18,1020,119],{}," crée une référence vers un autre DocType.",[44,1023,1024],{},"\nerDiagram\n    Facture ||--o{ Client : \"client (Link)\"\n    Facture {\n        string name\n        string client\n        date date_facturation\n        float montant\n    }\n    Client {\n        string name\n        string nom_complet\n        string email\n    }\n",[28,1026,1028],{"id":1027},"table-relation-1-n","Table (relation 1-N)",[14,1030,1018,1031,1033],{},[18,1032,130],{}," intègre une table enfant directement dans le document parent.",[44,1035,1036],{},"\nerDiagram\n    FactureDeVente ||--|{ LigneFacture : \"articles (Table)\"\n    FactureDeVente {\n        string name\n        string client\n        date date\n        float total\n    }\n    LigneFacture {\n        string parent\n        string article\n        int quantite\n        float montant\n    }\n",[14,1038,1039],{},[18,1040,1041],{},"Exemple concret :",[62,1043,1044,1054],{},[65,1045,1046],{},[68,1047,1048,1051],{},[71,1049,1050],{},"Facture de vente",[71,1052,1053],{},"Client A",[81,1055,1056,1063,1072,1080,1088],{},[68,1057,1058,1060],{},[86,1059,273],{},[86,1061,1062],{},"2024-01-15",[68,1064,1065,1070],{},[86,1066,1067],{},[18,1068,1069],{},"Articles",[86,1071],{},[68,1073,1074,1077],{},[86,1075,1076],{},"ART-001",[86,1078,1079],{},"5 × 100 € = 500 €",[68,1081,1082,1085],{},[86,1083,1084],{},"ART-002",[86,1086,1087],{},"3 × 100 € = 300 €",[68,1089,1090,1095],{},[86,1091,1092],{},[18,1093,1094],{},"Total",[86,1096,1097],{},[18,1098,1099],{},"800 €",[146,1101],{},[23,1103,1105],{"id":1104},"cycle-de-vie-dun-document","Cycle de vie d'un document",[44,1107,1108],{},[47,1109,1112],{"className":1110,"code":1111,"language":52,"meta":53},[50],"flowchart TD\n    A[before_insert] --> B[before_validate \u002F validate]\n    B --> B2[before_save]\n    B2 --> C{INSERT \u002F UPDATE}\n    C --> D[after_insert\u003Cbr\u002F>on_update]\n    D --> E{Validation ?}\n    E -->|oui| F[on_submit]\n    E -->|non| G{Suppression ?}\n    F --> H{Annulation ?}\n    H -->|oui| I[on_cancel]\n    H -->|non| G\n    I --> G\n    G -->|oui| J[on_trash]\n    G -->|non| K((Fin))\n    J --> K\n",[55,1113,1111],{"__ignoreMap":53},[28,1115,1117],{"id":1116},"événements-disponibles","Événements disponibles",[62,1119,1120,1133],{},[65,1121,1122],{},[68,1123,1124,1127,1130],{},[71,1125,1126],{},"Événement",[71,1128,1129],{},"Moment",[71,1131,1132],{},"Usage typique",[81,1134,1135,1148,1164,1176,1192,1205,1217,1236,1255,1271,1284],{},[68,1136,1137,1142,1145],{},[86,1138,1139],{},[55,1140,1141],{},"before_insert",[86,1143,1144],{},"Avant la création",[86,1146,1147],{},"Valeurs par défaut",[68,1149,1150,1155,1161],{},[86,1151,1152],{},[55,1153,1154],{},"before_validate",[86,1156,1157,1158],{},"Avant ",[55,1159,1160],{},"validate",[86,1162,1163],{},"Compléter des valeurs avant les contrôles",[68,1165,1166,1170,1173],{},[86,1167,1168],{},[55,1169,1160],{},[86,1171,1172],{},"Avant chaque enregistrement",[86,1174,1175],{},"Validations métier",[68,1177,1178,1183,1189],{},[86,1179,1180],{},[55,1181,1182],{},"before_save",[86,1184,1185,1186,1188],{},"Après ",[55,1187,1160],{},", avant l'écriture",[86,1190,1191],{},"Calculs automatiques",[68,1193,1194,1199,1202],{},[86,1195,1196],{},[55,1197,1198],{},"after_insert",[86,1200,1201],{},"Après la création",[86,1203,1204],{},"Notifications",[68,1206,1207,1211,1214],{},[86,1208,1209],{},[55,1210,911],{},[86,1212,1213],{},"Après chaque enregistrement",[86,1215,1216],{},"Actions après l'enregistrement",[68,1218,1219,1227,1233],{},[86,1220,1221,526,1224],{},[55,1222,1223],{},"before_submit",[55,1225,1226],{},"on_submit",[86,1228,1229,1230,1232],{},"Avant et après la validation (",[55,1231,501],{}," 1)",[86,1234,1235],{},"Écritures comptables, mouvements de stock",[68,1237,1238,1246,1252],{},[86,1239,1240,526,1243],{},[55,1241,1242],{},"before_cancel",[55,1244,1245],{},"on_cancel",[86,1247,1248,1249,1251],{},"Avant et après l'annulation (",[55,1250,501],{}," 2)",[86,1253,1254],{},"Contre-passations",[68,1256,1257,1265,1268],{},[86,1258,1259,526,1262],{},[55,1260,1261],{},"before_update_after_submit",[55,1263,1264],{},"on_update_after_submit",[86,1266,1267],{},"Modification d'un document validé",[86,1269,1270],{},"Contrôle des champs modifiables",[68,1272,1273,1278,1281],{},[86,1274,1275],{},[55,1276,1277],{},"on_change",[86,1279,1280],{},"Après tout changement enregistré",[86,1282,1283],{},"Mise à jour de documents liés",[68,1285,1286,1294,1297],{},[86,1287,1288,526,1291],{},[55,1289,1290],{},"on_trash",[55,1292,1293],{},"after_delete",[86,1295,1296],{},"Avant et après la suppression",[86,1298,1299],{},"Nettoyage",[14,1301,1302,1303,1306,1307,749],{},"Une application peut aussi réagir à ces événements sans modifier le contrôleur, avec le hook ",[55,1304,1305],{},"doc_events",". Voir ",[1001,1308,1310],{"href":1309},"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fhooks","Référence des hooks",[146,1312],{},[23,1314,1316],{"id":1315},"pour-aller-plus-loin","Pour aller plus loin",[1318,1319,1320,1329,1337],"card-group",{},[1321,1322,1326],"card",{"icon":1323,"title":1324,"to":1325},"i-mdi-cog","Personnaliser les DocTypes","\u002Fnext\u002Fdodock\u002Ffonctionnalites\u002Fpersonnalisations\u002Fdoctype",[14,1327,1328],{},"Ajouter des champs et comportements",[1321,1330,1334],{"icon":1331,"title":1332,"to":1333},"i-mdi-api","API Documents","\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fapi\u002Fdocument_api",[14,1335,1336],{},"Référence complète de l'API",[1321,1338,1342],{"icon":1339,"title":1340,"to":1341},"i-mdi-lock","Rôles et permissions","\u002Fnext\u002Fdodock\u002Ffonctionnalites\u002Futilisateurs\u002Frole-et-autorisations",[14,1343,1344],{},"Gérer les accès",[1346,1347,1348],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":53,"searchDepth":923,"depth":929,"links":1350},[1351,1355,1359,1362,1366,1370,1373],{"id":25,"depth":929,"text":26,"children":1352},[1353,1354],{"id":30,"depth":936,"text":31},{"id":59,"depth":936,"text":60},{"id":150,"depth":929,"text":151,"children":1356},[1357,1358],{"id":185,"depth":936,"text":186},{"id":356,"depth":936,"text":357},{"id":414,"depth":929,"text":415,"children":1360},[1361],{"id":540,"depth":936,"text":541},{"id":602,"depth":929,"text":603,"children":1363},[1364,1365],{"id":752,"depth":936,"text":753},{"id":778,"depth":936,"text":779},{"id":1010,"depth":929,"text":1011,"children":1367},[1368,1369],{"id":1014,"depth":936,"text":1015},{"id":1027,"depth":936,"text":1028},{"id":1104,"depth":929,"text":1105,"children":1371},[1372],{"id":1116,"depth":936,"text":1117},{"id":1315,"depth":929,"text":1316},"DocTypes, Documents et métadonnées dans Dodock","md",{"reviewed":932,"last_verified":1377,"sources":1378,"generated":932,"generated_at":1383,"source_mrs":1384},"2026-11-03",[1379,1380,1381,1382],"dodock@develop:frappe\u002Fmodel\u002Fdocument.py","dodock@develop:frappe\u002Fmodel\u002Fnaming.py","dodock@develop:frappe\u002Fmodel\u002Fdelete_doc.py","dodock@develop:frappe\u002Fcore\u002Fdoctype\u002Fdoctype\u002Fdoctype.json","2026-11-06",[1385],"https:\u002F\u002Fgitlab.com\u002Fdokos\u002Fdodock\u002F-\u002Fmerge_requests\u002F12518","\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Farchitecture\u002Fmodele-donnees",{"title":5,"description":1374},"2.next\u002F3.dodock\u002F10.developpeurs\u002F01.architecture\u002F2.modele-donnees","A8ROoDRAfUt-ya2Lgxs0kRU0Hd6Pz8pB6lPSZK4jeDs",{},1794701582609]