[{"data":1,"prerenderedAt":1395},["ShallowReactive",2],{"\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Farchitecture\u002Fmodele-donnees":3,"section:\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Farchitecture\u002Fmodele-donnees":1394},{"id":4,"title":5,"body":6,"description":1378,"extension":1379,"meta":1380,"navigation":936,"path":1390,"seo":1391,"stem":1392,"__hash__":1393},"docs\u002F1.v5\u002F3.dodock\u002F10.developpeurs\u002F01.architecture\u002F2.modele-donnees.md","Modèle de données",{"type":7,"value":8,"toc":1353},"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,873,900,916,995,1010,1012,1016,1020,1026,1029,1033,1038,1041,1046,1104,1106,1110,1118,1122,1304,1315,1317,1321,1349],[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,839,853,863],{},[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,835,838],{},"Retourne la valeur actuelle du compteur (entier). Lit la ligne avec un verrou (",[55,836,837],{},"for_update",").",[68,840,841,846],{},[86,842,843],{},[55,844,845],{},"update_counter(new_count, doc=None)",[86,847,848,849,852],{},"Écrit ",[55,850,851],{},"new_count"," dans le compteur. Crée la ligne du compteur si elle n'existe pas.",[68,854,855,860],{},[86,856,857],{},[55,858,859],{},"get_preview(doc=None)",[86,861,862],{},"Retourne trois exemples de noms (compteur 1, 2 et 3), sans lire ni modifier le compteur.",[68,864,865,870],{},[86,866,867],{},[55,868,869],{},"generate_next_name(doc, *, ignore_validate=False)",[86,871,872],{},"Retourne le prochain nom de la série.",[14,874,875,876,879,880,883,884,886,887,526,890,526,893,896,897,899],{},"Quand la série contient une partie ",[55,877,878],{},"{nom_du_champ}",", le préfixe dépend de la valeur de ce champ. Passez alors le document en argument ",[55,881,882],{},"doc"," : sans lui, la partie n'est pas remplacée et le préfixe garde le texte littéral ",[55,885,878],{},". Les trois méthodes qui lisent ou écrivent le compteur (",[55,888,889],{},"get_prefix",[55,891,892],{},"get_current_value",[55,894,895],{},"update_counter",") acceptent ce paramètre facultatif. Un appel sans ",[55,898,882],{}," se comporte comme avant.",[14,901,902,904,905,908,909,912,913,613],{},[18,903,200],{}," : avec un document ",[55,906,907],{},"Webhook"," dont le champ ",[55,910,911],{},"webhook_docevent"," vaut ",[55,914,915],{},"on_update",[47,917,921],{"className":918,"code":919,"language":920,"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,922,923,931,938,944,950,955,961,966,972,978,983,989],{"__ignoreMap":53},[924,925,928],"span",{"class":926,"line":927},"line",1,[924,929,930],{},"from frappe.model.naming import NamingSeries\n",[924,932,934],{"class":926,"line":933},2,[924,935,937],{"emptyLinePlaceholder":936},true,"\n",[924,939,941],{"class":926,"line":940},3,[924,942,943],{},"webhook = frappe.new_doc(\"Webhook\")\n",[924,945,947],{"class":926,"line":946},4,[924,948,949],{},"webhook.webhook_docevent = \"on_update\"\n",[924,951,953],{"class":926,"line":952},5,[924,954,937],{"emptyLinePlaceholder":936},[924,956,958],{"class":926,"line":957},6,[924,959,960],{},"series = NamingSeries(\"KOOH-.{webhook_docevent}.-.####\")\n",[924,962,964],{"class":926,"line":963},7,[924,965,937],{"emptyLinePlaceholder":936},[924,967,969],{"class":926,"line":968},8,[924,970,971],{},"series.get_prefix()         # \"KOOH-{webhook_docevent}-\"\n",[924,973,975],{"class":926,"line":974},9,[924,976,977],{},"series.get_prefix(webhook)  # \"KOOH-on_update-\"\n",[924,979,981],{"class":926,"line":980},10,[924,982,937],{"emptyLinePlaceholder":936},[924,984,986],{"class":926,"line":985},11,[924,987,988],{},"series.update_counter(7, webhook)\n",[924,990,992],{"class":926,"line":991},12,[924,993,994],{},"series.get_current_value(webhook)  # 7\n",[138,996,999],{"color":997,"icon":998},"amber","i-heroicons-exclamation-triangle",[14,1000,1001,1003,1004,1009],{},[55,1002,895],{}," écrit la valeur sans autre contrôle. Une valeur trop basse peut produire des noms en double. Voir ",[1005,1006,1008],"a",{"href":1007},"\u002Fv5\u002Fdodock\u002Ffonctionnalites\u002Fnommage#reprendre-un-compteur","Reprendre un compteur"," pour la même opération depuis l'interface.",[146,1011],{},[23,1013,1015],{"id":1014},"relations-entre-doctypes","Relations entre DocTypes",[28,1017,1019],{"id":1018},"link-relation-1-1-ou-n-1","Link (relation 1-1 ou N-1)",[14,1021,1022,1023,1025],{},"Un champ ",[18,1024,119],{}," crée une référence vers un autre DocType.",[44,1027,1028],{},"\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,1030,1032],{"id":1031},"table-relation-1-n","Table (relation 1-N)",[14,1034,1022,1035,1037],{},[18,1036,130],{}," intègre une table enfant directement dans le document parent.",[44,1039,1040],{},"\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,1042,1043],{},[18,1044,1045],{},"Exemple concret :",[62,1047,1048,1058],{},[65,1049,1050],{},[68,1051,1052,1055],{},[71,1053,1054],{},"Facture de vente",[71,1056,1057],{},"Client A",[81,1059,1060,1067,1076,1084,1092],{},[68,1061,1062,1064],{},[86,1063,273],{},[86,1065,1066],{},"2024-01-15",[68,1068,1069,1074],{},[86,1070,1071],{},[18,1072,1073],{},"Articles",[86,1075],{},[68,1077,1078,1081],{},[86,1079,1080],{},"ART-001",[86,1082,1083],{},"5 × 100 € = 500 €",[68,1085,1086,1089],{},[86,1087,1088],{},"ART-002",[86,1090,1091],{},"3 × 100 € = 300 €",[68,1093,1094,1099],{},[86,1095,1096],{},[18,1097,1098],{},"Total",[86,1100,1101],{},[18,1102,1103],{},"800 €",[146,1105],{},[23,1107,1109],{"id":1108},"cycle-de-vie-dun-document","Cycle de vie d'un document",[44,1111,1112],{},[47,1113,1116],{"className":1114,"code":1115,"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,1117,1115],{"__ignoreMap":53},[28,1119,1121],{"id":1120},"événements-disponibles","Événements disponibles",[62,1123,1124,1137],{},[65,1125,1126],{},[68,1127,1128,1131,1134],{},[71,1129,1130],{},"Événement",[71,1132,1133],{},"Moment",[71,1135,1136],{},"Usage typique",[81,1138,1139,1152,1168,1180,1196,1209,1221,1240,1259,1275,1288],{},[68,1140,1141,1146,1149],{},[86,1142,1143],{},[55,1144,1145],{},"before_insert",[86,1147,1148],{},"Avant la création",[86,1150,1151],{},"Valeurs par défaut",[68,1153,1154,1159,1165],{},[86,1155,1156],{},[55,1157,1158],{},"before_validate",[86,1160,1161,1162],{},"Avant ",[55,1163,1164],{},"validate",[86,1166,1167],{},"Compléter des valeurs avant les contrôles",[68,1169,1170,1174,1177],{},[86,1171,1172],{},[55,1173,1164],{},[86,1175,1176],{},"Avant chaque enregistrement",[86,1178,1179],{},"Validations métier",[68,1181,1182,1187,1193],{},[86,1183,1184],{},[55,1185,1186],{},"before_save",[86,1188,1189,1190,1192],{},"Après ",[55,1191,1164],{},", avant l'écriture",[86,1194,1195],{},"Calculs automatiques",[68,1197,1198,1203,1206],{},[86,1199,1200],{},[55,1201,1202],{},"after_insert",[86,1204,1205],{},"Après la création",[86,1207,1208],{},"Notifications",[68,1210,1211,1215,1218],{},[86,1212,1213],{},[55,1214,915],{},[86,1216,1217],{},"Après chaque enregistrement",[86,1219,1220],{},"Actions après l'enregistrement",[68,1222,1223,1231,1237],{},[86,1224,1225,526,1228],{},[55,1226,1227],{},"before_submit",[55,1229,1230],{},"on_submit",[86,1232,1233,1234,1236],{},"Avant et après la validation (",[55,1235,501],{}," 1)",[86,1238,1239],{},"Écritures comptables, mouvements de stock",[68,1241,1242,1250,1256],{},[86,1243,1244,526,1247],{},[55,1245,1246],{},"before_cancel",[55,1248,1249],{},"on_cancel",[86,1251,1252,1253,1255],{},"Avant et après l'annulation (",[55,1254,501],{}," 2)",[86,1257,1258],{},"Contre-passations",[68,1260,1261,1269,1272],{},[86,1262,1263,526,1266],{},[55,1264,1265],{},"before_update_after_submit",[55,1267,1268],{},"on_update_after_submit",[86,1270,1271],{},"Modification d'un document validé",[86,1273,1274],{},"Contrôle des champs modifiables",[68,1276,1277,1282,1285],{},[86,1278,1279],{},[55,1280,1281],{},"on_change",[86,1283,1284],{},"Après tout changement enregistré",[86,1286,1287],{},"Mise à jour de documents liés",[68,1289,1290,1298,1301],{},[86,1291,1292,526,1295],{},[55,1293,1294],{},"on_trash",[55,1296,1297],{},"after_delete",[86,1299,1300],{},"Avant et après la suppression",[86,1302,1303],{},"Nettoyage",[14,1305,1306,1307,1310,1311,749],{},"Une application peut aussi réagir à ces événements sans modifier le contrôleur, avec le hook ",[55,1308,1309],{},"doc_events",". Voir ",[1005,1312,1314],{"href":1313},"\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fhooks","Référence des hooks",[146,1316],{},[23,1318,1320],{"id":1319},"pour-aller-plus-loin","Pour aller plus loin",[1322,1323,1324,1333,1341],"card-group",{},[1325,1326,1330],"card",{"icon":1327,"title":1328,"to":1329},"i-mdi-cog","Personnaliser les DocTypes","\u002Fv5\u002Fdodock\u002Ffonctionnalites\u002Fpersonnalisations\u002Fdoctype",[14,1331,1332],{},"Ajouter des champs et comportements",[1325,1334,1338],{"icon":1335,"title":1336,"to":1337},"i-mdi-api","API Documents","\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fapi\u002Fdocument_api",[14,1339,1340],{},"Référence complète de l'API",[1325,1342,1346],{"icon":1343,"title":1344,"to":1345},"i-mdi-lock","Rôles et permissions","\u002Fv5\u002Fdodock\u002Ffonctionnalites\u002Futilisateurs\u002Frole-et-autorisations",[14,1347,1348],{},"Gérer les accès",[1350,1351,1352],"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":927,"depth":933,"links":1354},[1355,1359,1363,1366,1370,1374,1377],{"id":25,"depth":933,"text":26,"children":1356},[1357,1358],{"id":30,"depth":940,"text":31},{"id":59,"depth":940,"text":60},{"id":150,"depth":933,"text":151,"children":1360},[1361,1362],{"id":185,"depth":940,"text":186},{"id":356,"depth":940,"text":357},{"id":414,"depth":933,"text":415,"children":1364},[1365],{"id":540,"depth":940,"text":541},{"id":602,"depth":933,"text":603,"children":1367},[1368,1369],{"id":752,"depth":940,"text":753},{"id":778,"depth":940,"text":779},{"id":1014,"depth":933,"text":1015,"children":1371},[1372,1373],{"id":1018,"depth":940,"text":1019},{"id":1031,"depth":940,"text":1032},{"id":1108,"depth":933,"text":1109,"children":1375},[1376],{"id":1120,"depth":940,"text":1121},{"id":1319,"depth":933,"text":1320},"DocTypes, Documents et métadonnées dans Dodock","md",{"reviewed":936,"last_verified":1381,"sources":1382,"generated":936,"generated_at":1387,"source_mrs":1388},"2026-11-03",[1383,1384,1385,1386],"dodock@v5:frappe\u002Fmodel\u002Fdocument.py","dodock@v5:frappe\u002Fmodel\u002Fnaming.py","dodock@v5:frappe\u002Fmodel\u002Fdelete_doc.py","dodock@v5:frappe\u002Fcore\u002Fdoctype\u002Fdoctype\u002Fdoctype.json","2026-11-12",[1389],"https:\u002F\u002Fgitlab.com\u002Fdokos\u002Fdodock\u002F-\u002Fmerge_requests\u002F12539","\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Farchitecture\u002Fmodele-donnees",{"title":5,"description":1378},"1.v5\u002F3.dodock\u002F10.developpeurs\u002F01.architecture\u002F2.modele-donnees","WvDDGkukK1h3DD3XrQMnBT_6r2I6vZATlOLmC0oFXqc",{},1794522728049]