arelle-release 2.17.1__py3-none-any.whl → 2.37.71__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (893) hide show
  1. arelle/Aspect.py +6 -3
  2. arelle/BetaFeatures.py +3 -0
  3. arelle/Cntlr.py +117 -413
  4. arelle/CntlrCmdLine.py +364 -227
  5. arelle/CntlrQuickBooks.py +4 -2
  6. arelle/CntlrWebMain.py +179 -119
  7. arelle/CntlrWinMain.py +342 -124
  8. arelle/DialogAbout.py +1 -1
  9. arelle/DialogArcroleGroup.py +1 -1
  10. arelle/DialogFind.py +1 -1
  11. arelle/DialogFormulaParameters.py +2 -2
  12. arelle/DialogLanguage.py +45 -36
  13. arelle/DialogNewFactItem.py +1 -1
  14. arelle/DialogOpenArchive.py +30 -34
  15. arelle/DialogPackageManager.py +11 -8
  16. arelle/DialogPluginManager.py +43 -89
  17. arelle/DialogRssWatch.py +2 -2
  18. arelle/DialogURL.py +1 -1
  19. arelle/DialogUserPassword.py +1 -1
  20. arelle/DisclosureSystem.py +69 -1
  21. arelle/ErrorManager.py +321 -0
  22. arelle/FileSource.py +201 -99
  23. arelle/FunctionFn.py +44 -5
  24. arelle/FunctionIxt.py +16 -13
  25. arelle/FunctionUtil.py +1 -1
  26. arelle/FunctionXfi.py +68 -24
  27. arelle/FunctionXs.py +1 -1
  28. arelle/HtmlUtil.py +5 -4
  29. arelle/LeiUtil.py +63 -43
  30. arelle/LinkbaseType.py +94 -0
  31. arelle/LocalViewer.py +8 -2
  32. arelle/Locale.py +239 -79
  33. arelle/ModelDocument.py +180 -48
  34. arelle/ModelDtsObject.py +32 -27
  35. arelle/ModelFormulaObject.py +14 -6
  36. arelle/ModelInstanceObject.py +43 -14
  37. arelle/ModelManager.py +6 -1
  38. arelle/ModelObject.py +12 -8
  39. arelle/ModelObjectFactory.py +18 -2
  40. arelle/ModelRelationshipSet.py +46 -3
  41. arelle/ModelRenderingObject.py +899 -951
  42. arelle/ModelRssItem.py +2 -4
  43. arelle/ModelTestcaseObject.py +41 -4
  44. arelle/ModelValue.py +42 -14
  45. arelle/ModelVersReport.py +1 -1
  46. arelle/ModelXbrl.py +133 -273
  47. arelle/PackageManager.py +202 -176
  48. arelle/PluginManager.py +551 -239
  49. arelle/PluginUtils.py +54 -0
  50. arelle/PrototypeInstanceObject.py +53 -12
  51. arelle/PythonUtil.py +166 -25
  52. arelle/RuntimeOptions.py +32 -18
  53. arelle/SocketUtils.py +3 -0
  54. arelle/SystemInfo.py +1 -1
  55. arelle/TkTableWrapper.py +33 -5
  56. arelle/UITkTable.py +27 -21
  57. arelle/Updater.py +7 -3
  58. arelle/UrlUtil.py +6 -2
  59. arelle/Validate.py +596 -402
  60. arelle/ValidateDuplicateFacts.py +584 -0
  61. arelle/ValidateFileSource.py +38 -0
  62. arelle/ValidateFilingText.py +46 -29
  63. arelle/ValidateInfoset.py +104 -32
  64. arelle/ValidateUtr.py +31 -4
  65. arelle/ValidateXbrl.py +144 -120
  66. arelle/ValidateXbrlCalcs.py +51 -66
  67. arelle/ValidateXbrlDTS.py +98 -29
  68. arelle/Version.py +2 -7
  69. arelle/ViewFile.py +2 -0
  70. arelle/ViewFileDTS.py +7 -2
  71. arelle/ViewFileFactList.py +1 -1
  72. arelle/ViewFileFactTable.py +4 -4
  73. arelle/ViewFileRelationshipSet.py +36 -19
  74. arelle/ViewFileRenderedGrid.py +164 -753
  75. arelle/ViewFileRenderedLayout.py +174 -0
  76. arelle/ViewFileRenderedStructure.py +108 -0
  77. arelle/ViewWinDTS.py +4 -1
  78. arelle/ViewWinFactList.py +1 -1
  79. arelle/ViewWinFactTable.py +1 -1
  80. arelle/ViewWinRelationshipSet.py +14 -8
  81. arelle/ViewWinRenderedGrid.py +397 -287
  82. arelle/ViewWinRssFeed.py +4 -0
  83. arelle/ViewWinTree.py +15 -9
  84. arelle/ViewWinXml.py +1 -1
  85. arelle/WebCache.py +510 -272
  86. arelle/XbrlConst.py +202 -196
  87. arelle/XbrlUtil.py +2 -1
  88. arelle/XhtmlValidate.py +9 -23
  89. arelle/XmlUtil.py +24 -19
  90. arelle/XmlValidate.py +95 -67
  91. arelle/XmlValidateParticles.py +4 -4
  92. arelle/_version.py +33 -3
  93. arelle/api/Session.py +183 -0
  94. arelle/config/creationSoftwareNames.json +24 -10
  95. arelle/config/disclosuresystems.xml +1 -1
  96. arelle/config/disclosuresystems.xsd +3 -0
  97. arelle/config/sbr-text-formatting.xsd +737 -0
  98. arelle/conformance/CSVTestcaseLoader.py +102 -0
  99. arelle/formula/FactAspectsCache.py +10 -4
  100. arelle/formula/ValidateFormula.py +82 -194
  101. arelle/formula/XPathContext.py +42 -28
  102. arelle/formula/XPathParser.py +15 -9
  103. arelle/locale/ar_EG/LC_MESSAGES/ar_EG.po +3 -4
  104. arelle/locale/messages.pot +1 -2
  105. arelle/locale/ru/LC_MESSAGES/ru.po +2 -2
  106. arelle/logging/formatters/LogFormatter.py +47 -0
  107. arelle/logging/handlers/LogHandlerWithXml.py +94 -0
  108. arelle/logging/handlers/LogToBufferHandler.py +20 -0
  109. arelle/logging/handlers/LogToPrintHandler.py +41 -0
  110. arelle/logging/handlers/LogToXmlHandler.py +244 -0
  111. arelle/logging/handlers/StructuredMessageLogHandler.py +74 -0
  112. arelle/model/CommentBase.py +3 -0
  113. arelle/model/ElementBase.py +3 -0
  114. arelle/model/PIBase.py +3 -0
  115. arelle/model/__init__.py +3 -0
  116. arelle/oim/Load.py +2869 -0
  117. arelle/oim/Validate.py +155 -0
  118. arelle/oim/xml/Save.py +21 -0
  119. arelle/packages/PackageConst.py +7 -0
  120. arelle/packages/PackageType.py +13 -0
  121. arelle/packages/PackageUtils.py +22 -0
  122. arelle/packages/PackageValidation.py +200 -0
  123. arelle/packages/report/DetectReportPackage.py +13 -0
  124. arelle/packages/report/ReportPackage.py +265 -0
  125. arelle/packages/report/ReportPackageConst.py +79 -0
  126. arelle/packages/report/ReportPackageValidator.py +207 -0
  127. arelle/plugin/EdgarRendererAllReports.py +12 -12
  128. arelle/plugin/OimTaxonomy/ModelValueMore.py +15 -0
  129. arelle/plugin/OimTaxonomy/ValidateDTS.py +484 -0
  130. arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +239 -0
  131. arelle/plugin/OimTaxonomy/XbrlAbstract.py +16 -0
  132. arelle/plugin/OimTaxonomy/XbrlConcept.py +68 -0
  133. arelle/plugin/OimTaxonomy/XbrlConst.py +261 -0
  134. arelle/plugin/OimTaxonomy/XbrlCube.py +91 -0
  135. arelle/plugin/OimTaxonomy/XbrlDimension.py +38 -0
  136. arelle/plugin/OimTaxonomy/XbrlDts.py +152 -0
  137. arelle/plugin/OimTaxonomy/XbrlEntity.py +16 -0
  138. arelle/plugin/OimTaxonomy/XbrlGroup.py +22 -0
  139. arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +22 -0
  140. arelle/plugin/OimTaxonomy/XbrlLabel.py +31 -0
  141. arelle/plugin/OimTaxonomy/XbrlNetwork.py +100 -0
  142. arelle/plugin/OimTaxonomy/XbrlProperty.py +28 -0
  143. arelle/plugin/OimTaxonomy/XbrlReference.py +33 -0
  144. arelle/plugin/OimTaxonomy/XbrlReport.py +24 -0
  145. arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +35 -0
  146. arelle/plugin/OimTaxonomy/XbrlTaxonomy.py +93 -0
  147. arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py +154 -0
  148. arelle/plugin/OimTaxonomy/XbrlTransform.py +17 -0
  149. arelle/plugin/OimTaxonomy/XbrlTypes.py +23 -0
  150. arelle/plugin/OimTaxonomy/XbrlUnit.py +17 -0
  151. arelle/plugin/OimTaxonomy/__init__.py +1037 -0
  152. arelle/plugin/OimTaxonomy/resources/iso4217.json +4479 -0
  153. arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json +935 -0
  154. arelle/plugin/OimTaxonomy/resources/ref.json +333 -0
  155. arelle/plugin/OimTaxonomy/resources/transform-types.json +2481 -0
  156. arelle/plugin/OimTaxonomy/resources/types.json +727 -0
  157. arelle/plugin/OimTaxonomy/resources/utr.json +3046 -0
  158. arelle/plugin/OimTaxonomy/resources/xbrlSpec.json +1082 -0
  159. arelle/plugin/formulaLoader.py +3 -3
  160. arelle/plugin/formulaSaver.py +4 -4
  161. arelle/plugin/inlineXbrlDocumentSet.py +331 -102
  162. arelle/plugin/internet/proxyNTLM/HTTPNtlmAuthHandler.py +1 -1
  163. arelle/plugin/loadFromExcel.py +13 -10
  164. arelle/plugin/loadFromOIM.py +16 -3096
  165. arelle/plugin/logging/saveMessages.py +1 -1
  166. arelle/plugin/saveHtmlEBAtables.py +293 -213
  167. arelle/plugin/saveLoadableOIM.py +652 -361
  168. arelle/plugin/saveOIMTaxonomy.py +311 -0
  169. arelle/plugin/streamingExtensions.py +1 -1
  170. arelle/plugin/systemInfo.py +46 -0
  171. arelle/plugin/transforms/tester.py +4 -4
  172. arelle/plugin/validate/CIPC/Const.py +18 -0
  173. arelle/plugin/validate/CIPC/__init__.py +34 -13
  174. arelle/plugin/validate/DBA/DisclosureSystems.py +12 -0
  175. arelle/plugin/validate/DBA/PluginValidationDataExtension.py +165 -0
  176. arelle/plugin/validate/DBA/ValidationPluginExtension.py +545 -0
  177. arelle/plugin/validate/DBA/__init__.py +49 -0
  178. arelle/plugin/validate/DBA/resources/config.xml +21 -0
  179. arelle/plugin/validate/DBA/rules/__init__.py +323 -0
  180. arelle/plugin/validate/DBA/rules/fr.py +1377 -0
  181. arelle/plugin/validate/DBA/rules/tc.py +45 -0
  182. arelle/plugin/validate/DBA/rules/th.py +172 -0
  183. arelle/plugin/validate/DBA/rules/tm.py +351 -0
  184. arelle/plugin/validate/DBA/rules/tr.py +373 -0
  185. arelle/plugin/validate/EBA/__init__.py +11 -12
  186. arelle/plugin/validate/EDINET/Constants.py +208 -0
  187. arelle/plugin/validate/EDINET/ContextRequirement.py +58 -0
  188. arelle/plugin/validate/EDINET/ControllerPluginData.py +298 -0
  189. arelle/plugin/validate/EDINET/CoverItemRequirements.py +42 -0
  190. arelle/plugin/validate/EDINET/DeiRequirements.py +118 -0
  191. arelle/plugin/validate/EDINET/DisclosureSystems.py +1 -0
  192. arelle/plugin/validate/EDINET/FilingFormat.py +275 -0
  193. arelle/plugin/validate/EDINET/FormType.py +134 -0
  194. arelle/plugin/validate/EDINET/ManifestInstance.py +236 -0
  195. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +640 -0
  196. arelle/plugin/validate/EDINET/ReportFolderType.py +162 -0
  197. arelle/plugin/validate/EDINET/Statement.py +139 -0
  198. arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +493 -0
  199. arelle/plugin/validate/EDINET/UploadContents.py +48 -0
  200. arelle/plugin/validate/EDINET/ValidationPluginExtension.py +64 -0
  201. arelle/plugin/validate/EDINET/__init__.py +109 -0
  202. arelle/plugin/validate/EDINET/resources/config.xml +22 -0
  203. arelle/plugin/validate/EDINET/resources/cover-item-requirements.json +793 -0
  204. arelle/plugin/validate/EDINET/resources/dei-requirements.csv +27 -0
  205. arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +62 -0
  206. arelle/plugin/validate/EDINET/rules/contexts.py +547 -0
  207. arelle/plugin/validate/EDINET/rules/edinet.py +1991 -0
  208. arelle/plugin/validate/EDINET/rules/frta.py +301 -0
  209. arelle/plugin/validate/EDINET/rules/gfm.py +2394 -0
  210. arelle/plugin/validate/EDINET/rules/manifests.py +88 -0
  211. arelle/plugin/validate/EDINET/rules/upload.py +1370 -0
  212. arelle/plugin/validate/ESEF/Const.py +16 -75
  213. arelle/plugin/validate/ESEF/Dimensions.py +2 -2
  214. arelle/plugin/validate/ESEF/ESEF_2021/DTS.py +6 -1
  215. arelle/plugin/validate/ESEF/ESEF_2021/Image.py +7 -4
  216. arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +80 -57
  217. arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +60 -22
  218. arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +272 -133
  219. arelle/plugin/validate/ESEF/Util.py +5 -19
  220. arelle/plugin/validate/ESEF/__init__.py +61 -46
  221. arelle/plugin/validate/ESEF/resources/authority-validations.json +120 -10
  222. arelle/plugin/validate/ESEF/resources/config.xml +44 -3
  223. arelle/plugin/validate/FERC/__init__.py +31 -18
  224. arelle/plugin/validate/FERC/config.xml +18 -18
  225. arelle/plugin/validate/NL/DisclosureSystems.py +19 -3
  226. arelle/plugin/validate/NL/PluginValidationDataExtension.py +710 -7
  227. arelle/plugin/validate/NL/ValidationPluginExtension.py +117 -12
  228. arelle/plugin/validate/NL/__init__.py +21 -10
  229. arelle/plugin/validate/NL/resources/config.xml +27 -6
  230. arelle/plugin/validate/NL/rules/br_kvk.py +81 -21
  231. arelle/plugin/validate/NL/rules/fg_nl.py +292 -0
  232. arelle/plugin/validate/NL/rules/fr_kvk.py +60 -7
  233. arelle/plugin/validate/NL/rules/fr_nl.py +705 -24
  234. arelle/plugin/validate/NL/rules/nl_kvk.py +2182 -0
  235. arelle/plugin/validate/ROS/DisclosureSystems.py +1 -0
  236. arelle/plugin/validate/ROS/PluginValidationDataExtension.py +109 -0
  237. arelle/plugin/validate/ROS/ValidationPluginExtension.py +27 -0
  238. arelle/plugin/validate/ROS/__init__.py +28 -341
  239. arelle/plugin/validate/ROS/resources/config.xml +20 -0
  240. arelle/plugin/validate/ROS/rules/__init__.py +56 -0
  241. arelle/plugin/validate/ROS/rules/ros.py +393 -0
  242. arelle/plugin/validate/UK/ValidateUK.py +1372 -0
  243. arelle/plugin/validate/{HMRC → UK}/__init__.py +195 -189
  244. arelle/plugin/validate/{HMRC → UK}/config.xml +1 -1
  245. arelle/plugin/xbrlDB/SqlDb.py +1 -1
  246. arelle/plugin/xbrlDB/XbrlOpenSqlDB.py +5 -5
  247. arelle/plugin/xbrlDB/XbrlPublicPostgresDB.py +1 -1
  248. arelle/plugin/xbrlDB/XbrlSemanticJsonDB.py +1 -1
  249. arelle/plugin/xbrlDB/XbrlSemanticRdfDB.py +1 -1
  250. arelle/plugin/xbrlDB/__init__.py +4 -1
  251. arelle/{RenderingEvaluator.py → rendering/RenderingEvaluator.py} +120 -99
  252. arelle/rendering/RenderingLayout.py +476 -0
  253. arelle/rendering/RenderingResolution.py +814 -0
  254. arelle/resources/cache/http/www.eurofiling.info/eu/fr/xbrl/ext/filing-indicators.xsd +20 -0
  255. arelle/resources/cache/http/www.w3.org/2001/03/xml.xsd +117 -0
  256. arelle/resources/cache/http/www.w3.org/2001/XMLSchema.xsd +2534 -0
  257. arelle/resources/cache/http/www.w3.org/2001/xml.xsd +287 -0
  258. arelle/resources/cache/http/www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd +779 -0
  259. arelle/resources/cache/http/www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd +486 -0
  260. arelle/resources/cache/http/www.xbrl.org/2003/xl-2003-12-31.xsd +251 -0
  261. arelle/resources/cache/http/www.xbrl.org/2003/xlink-2003-12-31.xsd +121 -0
  262. arelle/resources/cache/http/www.xbrl.org/2004/ref-2004-08-10.xsd +129 -0
  263. arelle/resources/cache/http/www.xbrl.org/2005/xbrldt-2005.xsd +53 -0
  264. arelle/resources/cache/http/www.xbrl.org/2006/ref-2006-02-27.xsd +120 -0
  265. arelle/resources/cache/http/www.xbrl.org/2006/xbrldi-2006.xsd +41 -0
  266. arelle/resources/cache/http/www.xbrl.org/2008/boolean-filter.xsd +51 -0
  267. arelle/resources/cache/http/www.xbrl.org/2008/concept-filter.xsd +127 -0
  268. arelle/resources/cache/http/www.xbrl.org/2008/conformance.xsd +116 -0
  269. arelle/resources/cache/http/www.xbrl.org/2008/conformanceFunction.xsd +51 -0
  270. arelle/resources/cache/http/www.xbrl.org/2008/consistency-assertion.xsd +66 -0
  271. arelle/resources/cache/http/www.xbrl.org/2008/dimension-filter.xsd +86 -0
  272. arelle/resources/cache/http/www.xbrl.org/2008/entity-filter.xsd +92 -0
  273. arelle/resources/cache/http/www.xbrl.org/2008/existence-assertion.xsd +44 -0
  274. arelle/resources/cache/http/www.xbrl.org/2008/formula.xsd +261 -0
  275. arelle/resources/cache/http/www.xbrl.org/2008/function.xsd +90 -0
  276. arelle/resources/cache/http/www.xbrl.org/2008/general-filter.xsd +38 -0
  277. arelle/resources/cache/http/www.xbrl.org/2008/generic-label.xsd +80 -0
  278. arelle/resources/cache/http/www.xbrl.org/2008/generic-link.xsd +81 -0
  279. arelle/resources/cache/http/www.xbrl.org/2008/generic-reference.xsd +63 -0
  280. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
  281. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
  282. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xl-2003-12-31.xsd +248 -0
  283. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xlink-2003-12-31.xsd +117 -0
  284. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xframes-1.xsd +166 -0
  285. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-applet-1.xsd +66 -0
  286. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-attribs-1.xsd +72 -0
  287. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-base-1.xsd +36 -0
  288. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-form-1.xsd +195 -0
  289. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-table-1.xsd +169 -0
  290. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-model-1.xsd +376 -0
  291. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
  292. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-modules-1.xsd +259 -0
  293. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10.xsd +98 -0
  294. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-bdo-1.xsd +78 -0
  295. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkphras-1.xsd +161 -0
  296. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkpres-1.xsd +37 -0
  297. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkstruct-1.xsd +49 -0
  298. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-charent-1.xsd +38 -0
  299. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-copyright-1.xsd +29 -0
  300. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-csismap-1.xsd +96 -0
  301. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-datatypes-1.xsd +128 -0
  302. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-edit-1.xsd +39 -0
  303. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-events-1.xsd +130 -0
  304. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-form-1.xsd +326 -0
  305. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-frames-1.xsd +113 -0
  306. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-framework-1.xsd +66 -0
  307. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-hypertext-1.xsd +47 -0
  308. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-iframe-1.xsd +68 -0
  309. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-image-1.xsd +45 -0
  310. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlphras-1.xsd +163 -0
  311. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlpres-1.xsd +39 -0
  312. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstruct-1.xsd +50 -0
  313. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstyle-1.xsd +27 -0
  314. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-legacy-1.xsd +97 -0
  315. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-link-1.xsd +45 -0
  316. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-list-1.xsd +99 -0
  317. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-meta-1.xsd +42 -0
  318. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-misc-1.xsd +441 -0
  319. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-nameident-1.xsd +63 -0
  320. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-notations-1.xsd +69 -0
  321. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-object-1.xsd +76 -0
  322. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-param-1.xsd +51 -0
  323. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-pres-1.xsd +51 -0
  324. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-1.xsd +171 -0
  325. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-basic-1.xsd +89 -0
  326. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-script-1.xsd +70 -0
  327. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ssismap-1.xsd +43 -0
  328. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-struct-1.xsd +112 -0
  329. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-style-1.xsd +52 -0
  330. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-table-1.xsd +272 -0
  331. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-target-1.xsd +53 -0
  332. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-text-1.xsd +67 -0
  333. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-model-1.xsd +677 -0
  334. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-module-redefines-1.xsd +335 -0
  335. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-modules-1.xsd +528 -0
  336. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11.xsd +104 -0
  337. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml2.xsd +21 -0
  338. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-1.xsd +73 -0
  339. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-2.xsd +74 -0
  340. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-1.xsd +73 -0
  341. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-2.xsd +75 -0
  342. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-1.xsd +34 -0
  343. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-2.xsd +34 -0
  344. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-handlers-2.xsd +98 -0
  345. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-definitions.xsd +225 -0
  346. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-model.xsd +681 -0
  347. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-modules.xsd +535 -0
  348. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0.xsd +40 -0
  349. arelle/resources/cache/http/www.xbrl.org/2008/match-filter.xsd +94 -0
  350. arelle/resources/cache/http/www.xbrl.org/2008/period-filter.xsd +86 -0
  351. arelle/resources/cache/http/www.xbrl.org/2008/registry.xsd +145 -0
  352. arelle/resources/cache/http/www.xbrl.org/2008/relative-filter.xsd +38 -0
  353. arelle/resources/cache/http/www.xbrl.org/2008/segment-scenario-filter.xsd +41 -0
  354. arelle/resources/cache/http/www.xbrl.org/2008/tuple-filter.xsd +83 -0
  355. arelle/resources/cache/http/www.xbrl.org/2008/unit-filter.xsd +58 -0
  356. arelle/resources/cache/http/www.xbrl.org/2008/validation.xsd +78 -0
  357. arelle/resources/cache/http/www.xbrl.org/2008/value-assertion.xsd +43 -0
  358. arelle/resources/cache/http/www.xbrl.org/2008/value-filter.xsd +43 -0
  359. arelle/resources/cache/http/www.xbrl.org/2008/variable.xsd +240 -0
  360. arelle/resources/cache/http/www.xbrl.org/2010/aspect-cover-filter.xsd +67 -0
  361. arelle/resources/cache/http/www.xbrl.org/2010/concept-relation-filter.xsd +108 -0
  362. arelle/resources/cache/http/www.xbrl.org/2010/custom-function-implementation.xsd +71 -0
  363. arelle/resources/cache/http/www.xbrl.org/2010/generic-message.xsd +68 -0
  364. arelle/resources/cache/http/www.xbrl.org/2010/validation-message.xsd +50 -0
  365. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
  366. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
  367. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xl-2003-12-31.xsd +248 -0
  368. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xlink-2003-12-31.xsd +117 -0
  369. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xframes-1.xsd +166 -0
  370. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-applet-1.xsd +66 -0
  371. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-attribs-1.xsd +72 -0
  372. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-base-1.xsd +36 -0
  373. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-form-1.xsd +195 -0
  374. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-table-1.xsd +169 -0
  375. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-model-1.xsd +376 -0
  376. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
  377. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-modules-1.xsd +259 -0
  378. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10.xsd +98 -0
  379. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-bdo-1.xsd +78 -0
  380. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkphras-1.xsd +161 -0
  381. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkpres-1.xsd +37 -0
  382. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkstruct-1.xsd +49 -0
  383. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-charent-1.xsd +38 -0
  384. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-copyright-1.xsd +29 -0
  385. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-csismap-1.xsd +96 -0
  386. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-datatypes-1.xsd +128 -0
  387. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-edit-1.xsd +39 -0
  388. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-events-1.xsd +130 -0
  389. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-form-1.xsd +326 -0
  390. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-frames-1.xsd +113 -0
  391. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-framework-1.xsd +66 -0
  392. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-hypertext-1.xsd +47 -0
  393. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-iframe-1.xsd +68 -0
  394. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-image-1.xsd +45 -0
  395. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlphras-1.xsd +163 -0
  396. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlpres-1.xsd +39 -0
  397. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstruct-1.xsd +50 -0
  398. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstyle-1.xsd +27 -0
  399. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-legacy-1.xsd +97 -0
  400. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-link-1.xsd +45 -0
  401. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-list-1.xsd +99 -0
  402. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-meta-1.xsd +42 -0
  403. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-misc-1.xsd +441 -0
  404. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-nameident-1.xsd +63 -0
  405. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-notations-1.xsd +69 -0
  406. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-object-1.xsd +76 -0
  407. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-param-1.xsd +51 -0
  408. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-pres-1.xsd +51 -0
  409. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-1.xsd +171 -0
  410. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-basic-1.xsd +89 -0
  411. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-script-1.xsd +70 -0
  412. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ssismap-1.xsd +43 -0
  413. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-struct-1.xsd +112 -0
  414. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-style-1.xsd +52 -0
  415. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-table-1.xsd +272 -0
  416. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-target-1.xsd +53 -0
  417. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-text-1.xsd +67 -0
  418. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-model-1.xsd +677 -0
  419. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-module-redefines-1.xsd +335 -0
  420. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-modules-1.xsd +528 -0
  421. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11.xsd +104 -0
  422. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml2.xsd +21 -0
  423. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-1.xsd +73 -0
  424. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-2.xsd +74 -0
  425. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-1.xsd +73 -0
  426. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-2.xsd +75 -0
  427. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-1.xsd +34 -0
  428. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-2.xsd +34 -0
  429. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-handlers-2.xsd +98 -0
  430. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-definitions.xsd +252 -0
  431. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-model.xsd +681 -0
  432. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-modules.xsd +535 -0
  433. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1.xsd +40 -0
  434. arelle/resources/cache/http/www.xbrl.org/2013/match-filter.xsd +94 -0
  435. arelle/resources/cache/http/www.xbrl.org/2013/preferred-label.xsd +12 -0
  436. arelle/resources/cache/http/www.xbrl.org/2013/versioning-base.xsd +142 -0
  437. arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-details.xsd +143 -0
  438. arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-use.xsd +64 -0
  439. arelle/resources/cache/http/www.xbrl.org/2013/versioning-dimensions.xsd +162 -0
  440. arelle/resources/cache/http/www.xbrl.org/2014/extensible-enumerations.xsd +27 -0
  441. arelle/resources/cache/http/www.xbrl.org/2014/table.xsd +356 -0
  442. arelle/resources/cache/http/www.xbrl.org/2014/tablemodel.xsd +156 -0
  443. arelle/resources/cache/http/www.xbrl.org/2016/assertion-severity.xsd +29 -0
  444. arelle/resources/cache/http/www.xbrl.org/2016/severities.xml +21 -0
  445. arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package-catalog.xsd +38 -0
  446. arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package.xsd +154 -0
  447. arelle/resources/cache/http/www.xbrl.org/2022/assertion-severity.xsd +43 -0
  448. arelle/resources/cache/http/www.xbrl.org/2022/severities.xml +21 -0
  449. arelle/resources/cache/http/www.xbrl.org/dtr/type/nonNumeric-2009-12-16.xsd +76 -0
  450. arelle/resources/cache/http/www.xbrl.org/dtr/type/numeric-2009-12-16.xsd +78 -0
  451. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/accounting-arcrole-2023-01-04.xsd +39 -0
  452. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/deprecated-2009-12-16.xsd +29 -0
  453. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/esma-arcrole-2018-11-21.xsd +14 -0
  454. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/factExplanatory-2009-12-16.xsd +13 -0
  455. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/jpfr-arcrole-2007-11-07.xsd +27 -0
  456. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/parent-child-2013-09-19.xsd +12 -0
  457. arelle/resources/cache/http/www.xbrl.org/lrr/role/deprecated-2009-12-16.xsd +17 -0
  458. arelle/resources/cache/http/www.xbrl.org/lrr/role/jpfr-role-2007-11-07.xsd +47 -0
  459. arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2008-03-31.xsd +30 -0
  460. arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2009-12-16.xsd +33 -0
  461. arelle/resources/cache/http/www.xbrl.org/lrr/role/negative-2009-12-16.xsd +25 -0
  462. arelle/resources/cache/http/www.xbrl.org/lrr/role/net-2009-12-16.xsd +13 -0
  463. arelle/resources/cache/http/www.xbrl.org/lrr/role/positive-2009-12-16.xsd +25 -0
  464. arelle/resources/cache/http/www.xbrl.org/lrr/role/property-2022-09-28.xsd +15 -0
  465. arelle/resources/cache/http/www.xbrl.org/lrr/role/reference-2009-12-16.xsd +21 -0
  466. arelle/resources/cache/http/www.xbrl.org/lrr/role/restated-2006-02-21.xsd +19 -0
  467. arelle/resources/cache/http/www.xbrl.org/utr/2012-01-30/utr.xml +4543 -0
  468. arelle/resources/cache/http/www.xbrl.org/utr/2012-10-31/utr.xml +4510 -0
  469. arelle/resources/cache/http/www.xbrl.org/utr/2012-11-30/utr.xml +4567 -0
  470. arelle/resources/cache/http/www.xbrl.org/utr/2013-02-28/utr.xml +5180 -0
  471. arelle/resources/cache/http/www.xbrl.org/utr/2013-05-17/utr.xml +5349 -0
  472. arelle/resources/cache/http/www.xbrl.org/utr/2016-08-10/utr.xml +5363 -0
  473. arelle/resources/cache/http/www.xbrl.org/utr/2017-07-12/utr.xml +6164 -0
  474. arelle/resources/cache/http/www.xbrl.org/utr/2021-02-16/utr.xml +6370 -0
  475. arelle/resources/cache/http/www.xbrl.org/utr/2021-12-08/utr.xml +6493 -0
  476. arelle/resources/cache/http/www.xbrl.org/utr/2022-02-16/utr.xml +6551 -0
  477. arelle/resources/cache/http/www.xbrl.org/utr/2022-07-20/utr.xml +6638 -0
  478. arelle/resources/cache/http/www.xbrl.org/utr/2023-12-20/utr.xml +6680 -0
  479. arelle/resources/cache/http/www.xbrl.org/utr/2024-01-31/utr.xml +6680 -0
  480. arelle/resources/cache/http/www.xbrl.org/utr/2024-10-22/utr.xml +6693 -0
  481. arelle/resources/cache/http/www.xbrl.org/utr/utr.xml +6693 -0
  482. arelle/resources/cache/https/www.xbrl.org/2005/conformance.xsd +87 -0
  483. arelle/resources/cache/https/www.xbrl.org/2020/extensible-enumerations-2.0.xsd +51 -0
  484. arelle/resources/cache/https/www.xbrl.org/2023/calculation-1.1.xsd +27 -0
  485. arelle/resources/cache/https/www.xbrl.org/dtr/type/2020-01-21/types.xsd +812 -0
  486. arelle/resources/cache/https/www.xbrl.org/dtr/type/2022-03-31/types.xsd +847 -0
  487. arelle/resources/cache/https/www.xbrl.org/dtr/type/2024-01-31/types.xsd +897 -0
  488. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-def.xml +68 -0
  489. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-label.xml +84 -0
  490. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators.xsd +67 -0
  491. arelle/resources/libs/Tktable2.11/linux-x86_64/README.txt +149 -0
  492. arelle/resources/libs/Tktable2.11/linux-x86_64/html/tkTable.html +2039 -0
  493. arelle/resources/libs/Tktable2.11/linux-x86_64/libTktable2.11.so +0 -0
  494. arelle/resources/libs/Tktable2.11/linux-x86_64/license.txt +51 -0
  495. arelle/resources/libs/Tktable2.11/linux-x86_64/pkgIndex.tcl +3 -0
  496. arelle/resources/libs/Tktable2.11/linux-x86_64/tkTable.tcl +825 -0
  497. arelle/resources/libs/Tktable2.11/linux-x86_64/tktable.py +674 -0
  498. arelle/resources/libs/Tktable2.11/macos-arm64/README.txt +149 -0
  499. arelle/resources/libs/Tktable2.11/macos-arm64/html/tkTable.html +2039 -0
  500. arelle/resources/libs/Tktable2.11/macos-arm64/libTktable2.11.dylib +0 -0
  501. arelle/resources/libs/Tktable2.11/macos-arm64/license.txt +51 -0
  502. arelle/resources/libs/Tktable2.11/macos-arm64/pkgIndex.tcl +2 -0
  503. arelle/resources/libs/Tktable2.11/macos-arm64/tkTable.tcl +825 -0
  504. arelle/resources/libs/Tktable2.11/macos-arm64/tktable.py +674 -0
  505. arelle/resources/libs/Tktable2.11/macos-x86_64/README.txt +149 -0
  506. arelle/resources/libs/Tktable2.11/macos-x86_64/html/tkTable.html +2039 -0
  507. arelle/resources/libs/Tktable2.11/macos-x86_64/libTktable2.11.dylib +0 -0
  508. arelle/resources/libs/Tktable2.11/macos-x86_64/license.txt +51 -0
  509. arelle/resources/libs/Tktable2.11/macos-x86_64/pkgIndex.tcl +2 -0
  510. arelle/resources/libs/Tktable2.11/macos-x86_64/tkTable.tcl +825 -0
  511. arelle/resources/libs/Tktable2.11/macos-x86_64/tktable.py +674 -0
  512. arelle/resources/libs/Tktable2.11/win-x86_64/Tktable.dll +0 -0
  513. arelle/resources/libs/Tktable2.11/win-x86_64/pkgIndex.tcl +2 -0
  514. arelle/resources/libs/Tktable2.11/win-x86_64/tkTable.tcl +825 -0
  515. arelle/typing.py +9 -4
  516. arelle/utils/Contexts.py +38 -0
  517. arelle/utils/EntryPointDetection.py +139 -0
  518. arelle/utils/Equivalence.py +22 -0
  519. arelle/utils/{validate/PluginValidationData.py → PluginData.py} +5 -2
  520. arelle/utils/PluginHooks.py +256 -5
  521. arelle/utils/Units.py +36 -0
  522. arelle/utils/validate/Decorator.py +5 -3
  523. arelle/utils/validate/DetectScriptsInXhtml.py +99 -0
  524. arelle/utils/validate/ESEFImage.py +283 -0
  525. arelle/utils/validate/Validation.py +9 -1
  526. arelle/utils/validate/ValidationPlugin.py +74 -11
  527. arelle/utils/validate/ValidationUtil.py +55 -0
  528. arelle/webserver/bottle.py +5 -4424
  529. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/METADATA +51 -42
  530. arelle_release-2.37.71.dist-info/RECORD +697 -0
  531. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/WHEEL +1 -1
  532. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info/licenses}/LICENSE.md +1 -4
  533. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/top_level.txt +0 -1
  534. arelle/DialogOpenTaxonomyPackage.py +0 -1
  535. arelle/RenderingResolver.py +0 -624
  536. arelle/examples/.pydevproject +0 -5
  537. arelle/examples/CustomLogger.py +0 -43
  538. arelle/examples/LoadEFMvalidate.py +0 -32
  539. arelle/examples/LoadSavePreLbCsv.py +0 -26
  540. arelle/examples/LoadValidate.cs +0 -31
  541. arelle/examples/LoadValidate.py +0 -36
  542. arelle/examples/LoadValidateCmdLine.java +0 -69
  543. arelle/examples/LoadValidatePostedZip.java +0 -57
  544. arelle/examples/LoadValidateWebService.java +0 -34
  545. arelle/examples/SaveTableToExelle.py +0 -140
  546. arelle/examples/TR3toTR4.py +0 -88
  547. arelle/examples/plugin/bigInstance.py +0 -394
  548. arelle/examples/plugin/cmdWebServerExtension.py +0 -42
  549. arelle/examples/plugin/crashTest.py +0 -38
  550. arelle/examples/plugin/formulaSuiteConverter.py +0 -212
  551. arelle/examples/plugin/functionsCustom.py +0 -59
  552. arelle/examples/plugin/hello_dolly.py +0 -64
  553. arelle/examples/plugin/hello_i18n.pot +0 -26
  554. arelle/examples/plugin/hello_i18n.py +0 -32
  555. arelle/examples/plugin/importTestChild1.py +0 -21
  556. arelle/examples/plugin/importTestChild2.py +0 -22
  557. arelle/examples/plugin/importTestGrandchild1.py +0 -21
  558. arelle/examples/plugin/importTestGrandchild2.py +0 -21
  559. arelle/examples/plugin/importTestImported1.py +0 -23
  560. arelle/examples/plugin/importTestImported11.py +0 -22
  561. arelle/examples/plugin/importTestParent.py +0 -48
  562. arelle/examples/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
  563. arelle/examples/plugin/packagedImportTest/__init__.py +0 -47
  564. arelle/examples/plugin/packagedImportTest/importTestChild1.py +0 -21
  565. arelle/examples/plugin/packagedImportTest/importTestChild2.py +0 -22
  566. arelle/examples/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
  567. arelle/examples/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
  568. arelle/examples/plugin/packagedImportTest/importTestImported1.py +0 -24
  569. arelle/examples/plugin/packagedImportTest/importTestImported11.py +0 -21
  570. arelle/examples/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
  571. arelle/examples/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
  572. arelle/examples/plugin/sakaCalendar.py +0 -215
  573. arelle/examples/plugin/saveInstanceInfoset.py +0 -121
  574. arelle/examples/plugin/streamingExtensions.py +0 -335
  575. arelle/examples/plugin/testcaseCalc11ValidateSetup.py +0 -32
  576. arelle/examples/plugin/testcaseIxExpectedHtmlFixup.py +0 -45
  577. arelle/examples/plugin/updateTableLB.py +0 -242
  578. arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
  579. arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
  580. arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
  581. arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
  582. arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
  583. arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -109
  584. arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -58
  585. arelle/examples/plugin/validateSchemaLxml.py +0 -156
  586. arelle/examples/plugin/validateTableInfoset.py +0 -52
  587. arelle/examples/us-gaap-dei-docType-extraction-frm.xml +0 -90
  588. arelle/examples/us-gaap-dei-ratio-cash-frm.xml +0 -150
  589. arelle/plugin/functionsXmlCreation.py +0 -106
  590. arelle/plugin/instanceInfo.py +0 -306
  591. arelle/plugin/loadFromOIM-2018.py +0 -1282
  592. arelle/plugin/objectmaker.py +0 -285
  593. arelle/plugin/sphinx/FormulaGenerator.py +0 -823
  594. arelle/plugin/sphinx/SphinxContext.py +0 -404
  595. arelle/plugin/sphinx/SphinxEvaluator.py +0 -783
  596. arelle/plugin/sphinx/SphinxMethods.py +0 -1287
  597. arelle/plugin/sphinx/SphinxParser.py +0 -1093
  598. arelle/plugin/sphinx/SphinxValidator.py +0 -163
  599. arelle/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
  600. arelle/plugin/sphinx/__init__.py +0 -285
  601. arelle/plugin/transforms/SEC/__init__.py +0 -308
  602. arelle/plugin/transforms/SEC/conf/README.md +0 -39
  603. arelle/plugin/transforms/SEC/conf/extractTestcase.sh +0 -2
  604. arelle/plugin/transforms/SEC/conf/extractTestcase.xsl +0 -109
  605. arelle/plugin/transforms/SEC/conf/runIxtSecTests.sh +0 -16
  606. arelle/plugin/transforms/SEC/conf/saxon9.jar +0 -0
  607. arelle/plugin/transforms/SEC/conf/testcase.xml +0 -7117
  608. arelle/plugin/transforms/SEC/conf/tests.xml +0 -848
  609. arelle/plugin/transforms/SEC/text2num.py +0 -110
  610. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-boolballotbox.xml +0 -66
  611. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-countrynameen.xml +0 -65
  612. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-datequarterend.xml +0 -66
  613. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durday.xml +0 -61
  614. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durhour.xml +0 -69
  615. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durmonth.xml +0 -71
  616. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durweek.xml +0 -70
  617. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durwordsen.xml +0 -56
  618. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-duryear.xml +0 -64
  619. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-edgarprovcountryen.xml +0 -65
  620. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-entityfilercategoryen.xml +0 -63
  621. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-exchnameen.xml +0 -86
  622. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-numwordsen.xml +0 -55
  623. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-stateprovnameen.xml +0 -64
  624. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-yesnoballotbox.xml +0 -66
  625. arelle/plugin/transforms/SEC/transformationRegistry/registry/transform-registry.xml +0 -314
  626. arelle/plugin/transforms/SEC/transformationRegistry/schema/inlinexbrl-sec-transformation.xsd +0 -418
  627. arelle/plugin/validate/EFM/Consts.py +0 -362
  628. arelle/plugin/validate/EFM/DTS.py +0 -569
  629. arelle/plugin/validate/EFM/Dimensions.py +0 -264
  630. arelle/plugin/validate/EFM/Document.py +0 -206
  631. arelle/plugin/validate/EFM/Filing.py +0 -4383
  632. arelle/plugin/validate/EFM/IsolateSeparateIXDSes.py +0 -19
  633. arelle/plugin/validate/EFM/MessageNumericId.py +0 -142
  634. arelle/plugin/validate/EFM/PreCalAlignment.py +0 -324
  635. arelle/plugin/validate/EFM/Util.py +0 -688
  636. arelle/plugin/validate/EFM/__init__.py +0 -843
  637. arelle/plugin/validate/EFM/config.xml +0 -333
  638. arelle/plugin/validate/EFM/resources/README.md +0 -57
  639. arelle/plugin/validate/EFM/resources/axiswarnings.json +0 -27
  640. arelle/plugin/validate/EFM/resources/cef-deprecated-concepts.json +0 -8
  641. arelle/plugin/validate/EFM/resources/country-deprecated-concepts.json +0 -19
  642. arelle/plugin/validate/EFM/resources/currency-deprecated-concepts.json +0 -7
  643. arelle/plugin/validate/EFM/resources/dei-deprecated-concepts.json +0 -8
  644. arelle/plugin/validate/EFM/resources/dei-validations.json +0 -2884
  645. arelle/plugin/validate/EFM/resources/dqc-us-rules.json +0 -1389
  646. arelle/plugin/validate/EFM/resources/ecd-deprecated-concepts.json +0 -1
  647. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-16-4.xml +0 -115
  648. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-0-4.xml +0 -300
  649. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-1.xml +0 -304
  650. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-2.xml +0 -290
  651. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-3-1.xml +0 -294
  652. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.1.xml +0 -549
  653. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.2.xml +0 -506
  654. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.3.xml +0 -496
  655. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-1.xml +0 -662
  656. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-2.xml +0 -3761
  657. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-3.xml +0 -3577
  658. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-1.xml +0 -4020
  659. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-2.xml +0 -3320
  660. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-3.xml +0 -2998
  661. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2012.xml +0 -957
  662. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2013.xml +0 -982
  663. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2014.xml +0 -1001
  664. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2015.xml +0 -1076
  665. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2016.xml +0 -120
  666. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-1.xml +0 -3329
  667. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-2.xml +0 -1230
  668. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-3.xml +0 -1113
  669. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-4.xml +0 -1321
  670. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1-preview.xml +0 -1721
  671. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1.xml +0 -1841
  672. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2-2.xml +0 -1450
  673. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2.xml +0 -1429
  674. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-4.xml +0 -1527
  675. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1-1.xml +0 -2049
  676. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1.xml +0 -2065
  677. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-2.xml +0 -1674
  678. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-3.xml +0 -1715
  679. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-all-years.xml +0 -10671
  680. arelle/plugin/validate/EFM/resources/edgartaxonomies/erxl.xsd +0 -69
  681. arelle/plugin/validate/EFM/resources/edgartaxonomies/extendedtaxonomies-all-years.xml +0 -18
  682. arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrs-taxonomies.xml +0 -3126
  683. arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrstaxonomies-all-years.xml +0 -22
  684. arelle/plugin/validate/EFM/resources/ex26-validations.json +0 -255
  685. arelle/plugin/validate/EFM/resources/exch-deprecated-concepts.json +0 -163
  686. arelle/plugin/validate/EFM/resources/ifrs-full-deprecated-concepts.json +0 -204
  687. arelle/plugin/validate/EFM/resources/invest-deprecated-concepts.json +0 -99
  688. arelle/plugin/validate/EFM/resources/ixbrl-transform-registries.json +0 -16
  689. arelle/plugin/validate/EFM/resources/naics-deprecated-concepts.json +0 -295
  690. arelle/plugin/validate/EFM/resources/oef-deprecated-concepts.json +0 -59
  691. arelle/plugin/validate/EFM/resources/other-standard-taxonomies.json +0 -12
  692. arelle/plugin/validate/EFM/resources/rr-deprecated-concepts.json +0 -14
  693. arelle/plugin/validate/EFM/resources/rxp-deprecated-concepts.json +0 -1
  694. arelle/plugin/validate/EFM/resources/shr-deprecated-concepts.json +0 -1
  695. arelle/plugin/validate/EFM/resources/sic-deprecated-concepts.json +0 -1
  696. arelle/plugin/validate/EFM/resources/signwarnings.json +0 -112
  697. arelle/plugin/validate/EFM/resources/srt-deprecated-concepts.json +0 -1
  698. arelle/plugin/validate/EFM/resources/stpr-deprecated-concepts.json +0 -1
  699. arelle/plugin/validate/EFM/resources/taxonomy-compatibility.json +0 -79
  700. arelle/plugin/validate/EFM/resources/us-gaap-deprecated-concepts.json +0 -2886
  701. arelle/plugin/validate/EFM/resources/us-gaap-rels-2020.json +0 -29068
  702. arelle/plugin/validate/EFM/resources/us-gaap-rels-2021.json +0 -29598
  703. arelle/plugin/validate/EFM/resources/us-gaap-rels-2022.json +0 -29141
  704. arelle/plugin/validate/EFM/resources/us-gaap-rels-2023.json +0 -29400
  705. arelle/plugin/validate/EFM/resources/vip-deprecated-concepts.json +0 -1
  706. arelle/plugin/validate/EFM/tools/CheckTxmyRefs.py +0 -180
  707. arelle/plugin/validate/EFM-htm/Const.py +0 -205
  708. arelle/plugin/validate/EFM-htm/__init__.py +0 -217
  709. arelle/plugin/validate/EFM-htm/config.xml +0 -17
  710. arelle/plugin/validate/EFM-htm/resources/efm-htm.dtd +0 -664
  711. arelle/plugin/validate/ESEF/ESEF_Current/Image.py +0 -199
  712. arelle/plugin/validate/ESEF_2022/__init__.py +0 -47
  713. arelle/plugin/validate/GFM/__init__.py +0 -59
  714. arelle/plugin/validate/GFM/config.xml +0 -82
  715. arelle/plugin/validate/SBRnl/CustomLoader.py +0 -19
  716. arelle/plugin/validate/SBRnl/DTS.py +0 -305
  717. arelle/plugin/validate/SBRnl/Dimensions.py +0 -357
  718. arelle/plugin/validate/SBRnl/Document.py +0 -799
  719. arelle/plugin/validate/SBRnl/Filing.py +0 -467
  720. arelle/plugin/validate/SBRnl/__init__.py +0 -75
  721. arelle/plugin/validate/SBRnl/config.xml +0 -26
  722. arelle/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
  723. arelle/plugin/validate/USBestPractices.py +0 -570
  724. arelle/plugin/validate/USCorpAction.py +0 -557
  725. arelle/plugin/validate/USSecTagging.py +0 -337
  726. arelle/plugin/validate/XDC/__init__.py +0 -77
  727. arelle/plugin/validate/XDC/config.xml +0 -20
  728. arelle/plugin/validate/XFsyntax/__init__.py +0 -64
  729. arelle/plugin/validate/XFsyntax/xf.py +0 -2227
  730. arelle/plugin/validate/__init__.py +0 -20
  731. arelle/plugin/validate/calc2.py +0 -536
  732. arelle/plugin/validateSBRnl.py +0 -530
  733. arelle/scripts-macOS/startWebServer.command +0 -3
  734. arelle/scripts-unix/startWebServer.sh +0 -1
  735. arelle/scripts-windows/startWebServer.bat +0 -5
  736. arelle_release-2.17.1.dist-info/RECORD +0 -676
  737. tests/__init__.py +0 -0
  738. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/ArelleGUITest.csproj +0 -30
  739. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Tests.cs +0 -381
  740. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Usings.cs +0 -1
  741. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest.sln +0 -31
  742. tests/integration_tests/ui_tests/resources/workiva.zip +0 -0
  743. tests/integration_tests/validation/README.md +0 -50
  744. tests/integration_tests/validation/conformance_suite_config.py +0 -59
  745. tests/integration_tests/validation/conformance_suite_configs.py +0 -63
  746. tests/integration_tests/validation/conformance_suite_configurations/efm_current.py +0 -261
  747. tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2021.py +0 -85
  748. tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2022.py +0 -90
  749. tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2021.py +0 -15
  750. tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2022.py +0 -15
  751. tests/integration_tests/validation/conformance_suite_configurations/nl_nt16.py +0 -13
  752. tests/integration_tests/validation/conformance_suite_configurations/nl_nt17.py +0 -13
  753. tests/integration_tests/validation/conformance_suite_configurations/nl_nt18.py +0 -13
  754. tests/integration_tests/validation/conformance_suite_configurations/xbrl_2_1.py +0 -34
  755. tests/integration_tests/validation/conformance_suite_configurations/xbrl_calculations_1_1.py +0 -40
  756. tests/integration_tests/validation/conformance_suite_configurations/xbrl_dimensions_1_0.py +0 -28
  757. tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_1_0.py +0 -10
  758. tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_2_0.py +0 -10
  759. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0.py +0 -9
  760. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_assertion_severity_2_0.py +0 -9
  761. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_function_registry.py +0 -14
  762. tests/integration_tests/validation/conformance_suite_configurations/xbrl_ixbrl_1_1.py +0 -22
  763. tests/integration_tests/validation/conformance_suite_configurations/xbrl_link_role_registry_1_0.py +0 -11
  764. tests/integration_tests/validation/conformance_suite_configurations/xbrl_oim_1_0.py +0 -19
  765. tests/integration_tests/validation/conformance_suite_configurations/xbrl_table_linkbase_1_0.py +0 -296
  766. tests/integration_tests/validation/conformance_suite_configurations/xbrl_taxonomy_packages_1_0.py +0 -13
  767. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_3.py +0 -13
  768. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_4.py +0 -13
  769. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_5.py +0 -13
  770. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_malformed_1_0.py +0 -31
  771. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_registry_1_0.py +0 -22
  772. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_structure_1_0.py +0 -18
  773. tests/integration_tests/validation/conftest.py +0 -24
  774. tests/integration_tests/validation/discover_tests.py +0 -22
  775. tests/integration_tests/validation/download_conformance_suites.py +0 -47
  776. tests/integration_tests/validation/run_conformance_suites.py +0 -175
  777. tests/integration_tests/validation/test_conformance_suites.py +0 -14
  778. tests/integration_tests/validation/validation_util.py +0 -271
  779. tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-invalid-period.xbrl +0 -63
  780. tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-testcase.xml +0 -22
  781. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-missing.xbrl +0 -53
  782. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-multiple.xbrl +0 -60
  783. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-testcase.xml +0 -33
  784. tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-invalid.xbrl +0 -57
  785. tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-testcase.xml +0 -22
  786. tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-invalid.xbrl +0 -58
  787. tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-testcase.xml +0 -22
  788. tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-invalid.xbrl +0 -63
  789. tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-testcase.xml +0 -22
  790. tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-missing.xbrl +0 -61
  791. tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-testcase.xml +0 -22
  792. tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-invalid-date.xbrl +0 -89
  793. tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-testcase.xml +0 -22
  794. tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-invalid-file-extension.xml +0 -56
  795. tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-testcase.xml +0 -22
  796. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-invalid-lang.xbrl +0 -56
  797. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-missing-lang.xbrl +0 -55
  798. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-testcase.xml +0 -33
  799. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-entrypoint.xsd +0 -6
  800. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
  801. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-testcase.xml +0 -22
  802. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
  803. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-testcase.xml +0 -22
  804. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
  805. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-testcase.xml +0 -22
  806. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-file.xbrl +0 -2
  807. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-zip.zip +0 -0
  808. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-testcase.xml +0 -33
  809. tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  810. tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-testcase.xml +0 -22
  811. tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  812. tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-testcase.xml +0 -22
  813. tests/resources/conformance_suites/nl_nt16/fr_nl/1-06-testcase.xml +0 -22
  814. tests/resources/conformance_suites/nl_nt16/fr_nl/1-06.invalid.xbrl +0 -2
  815. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-file.xbrl +0 -8
  816. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-zip.zip +0 -0
  817. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-testcase.xml +0 -33
  818. tests/resources/conformance_suites/nl_nt16/index.xml +0 -20
  819. tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-invalid-period.xbrl +0 -63
  820. tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-testcase.xml +0 -22
  821. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-missing.xbrl +0 -53
  822. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-multiple.xbrl +0 -60
  823. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-testcase.xml +0 -33
  824. tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-invalid.xbrl +0 -57
  825. tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-testcase.xml +0 -22
  826. tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-invalid.xbrl +0 -58
  827. tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-testcase.xml +0 -22
  828. tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-invalid.xbrl +0 -63
  829. tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-testcase.xml +0 -22
  830. tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-missing.xbrl +0 -61
  831. tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-testcase.xml +0 -22
  832. tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-invalid-date.xbrl +0 -89
  833. tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-testcase.xml +0 -22
  834. tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-invalid-file-extension.xml +0 -56
  835. tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-testcase.xml +0 -22
  836. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-invalid-lang.xbrl +0 -56
  837. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-missing-lang.xbrl +0 -55
  838. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-testcase.xml +0 -33
  839. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-entrypoint.xsd +0 -6
  840. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
  841. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-testcase.xml +0 -22
  842. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
  843. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-testcase.xml +0 -22
  844. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
  845. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-testcase.xml +0 -22
  846. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-file.xbrl +0 -2
  847. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-zip.zip +0 -0
  848. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-testcase.xml +0 -33
  849. tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  850. tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-testcase.xml +0 -22
  851. tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  852. tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-testcases.xml +0 -22
  853. tests/resources/conformance_suites/nl_nt17/fr_nl/1-06-testcase.xml +0 -22
  854. tests/resources/conformance_suites/nl_nt17/fr_nl/1-06.invalid.xbrl +0 -2
  855. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-file.xbrl +0 -8
  856. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-zip.zip +0 -0
  857. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-testcase.xml +0 -33
  858. tests/resources/conformance_suites/nl_nt17/index.xml +0 -20
  859. tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  860. tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-testcase.xml +0 -22
  861. tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  862. tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-testcases.xml +0 -22
  863. tests/resources/conformance_suites/nl_nt18/fr_nl/1-06-testcase.xml +0 -22
  864. tests/resources/conformance_suites/nl_nt18/fr_nl/1-06.invalid.xbrl +0 -2
  865. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-file.xbrl +0 -2
  866. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-zip.zip +0 -0
  867. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-testcase.xml +0 -33
  868. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-file.xbrl +0 -8
  869. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-zip.zip +0 -0
  870. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-testcase.xml +0 -33
  871. tests/resources/conformance_suites/nl_nt18/index.xml +0 -8
  872. tests/unit_tests/arelle/conftest.py +0 -16
  873. tests/unit_tests/arelle/formula/test_fact_aspects_cache.py +0 -170
  874. tests/unit_tests/arelle/plugin/test_loadfromoim.py +0 -40
  875. tests/unit_tests/arelle/plugin/test_plugin_imports.py +0 -27
  876. tests/unit_tests/arelle/test_betafeatures.py +0 -81
  877. tests/unit_tests/arelle/test_cntlr.py +0 -28
  878. tests/unit_tests/arelle/test_import.py +0 -40
  879. tests/unit_tests/arelle/test_locale.py +0 -73
  880. tests/unit_tests/arelle/test_modelmanager.py +0 -15
  881. tests/unit_tests/arelle/test_packagemanager.py +0 -65
  882. tests/unit_tests/arelle/test_pluginmanager.py +0 -176
  883. tests/unit_tests/arelle/test_qname.py +0 -140
  884. tests/unit_tests/arelle/test_runtimeoptions.py +0 -56
  885. tests/unit_tests/arelle/test_system_info.py +0 -26
  886. tests/unit_tests/arelle/test_updater.py +0 -507
  887. tests/unit_tests/arelle/test_urlutil.py +0 -49
  888. tests/unit_tests/arelle/test_version.py +0 -46
  889. tests/unit_tests/arelle/utils/validate/test_decorator.py +0 -59
  890. /arelle/{examples/plugin/validate/XYZ → plugin/validate/EDINET}/rules/__init__.py +0 -0
  891. /arelle/plugin/validate/{HMRC → UK}/consistencyChecksByName.json +0 -0
  892. /arelle/plugin/validate/{HMRC → UK}/hmrc-taxonomies.xml +0 -0
  893. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,1372 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from dataclasses import dataclass
7
+ from dataclasses import field
8
+ from enum import Enum
9
+ from functools import cached_property
10
+ from typing import Any, cast, Iterable
11
+
12
+ import regex as re
13
+
14
+ from arelle.ModelInstanceObject import ModelFact
15
+ from arelle.ModelXbrl import ModelXbrl
16
+ from arelle.XmlValidateConst import VALID
17
+
18
+ # Error codes
19
+ CH_AUDIT = 'Char.Audit'
20
+ CH_CHAR_FUND = 'Char.CharFund'
21
+ CH_DIR_REP = 'Char.DirReport'
22
+ CH_DIR_RESP = 'Char.DirResp'
23
+ CO_ABRID = 'Co.Abrid'
24
+ CO_AUDIT = 'Co.Audit'
25
+ CO_AUDIT_NR = 'Co.AuditNR'
26
+ CO_DIR_REP = 'Co.DirReport'
27
+ CO_DIR_RESP = 'Co.DirResp'
28
+ CO_GROUP = 'Co.Group'
29
+ CO_MED_CO = 'Co.MedCo'
30
+ CO_MICRO = 'Co.Micro'
31
+ CO_MISSING_ELEMENT = 'Co.MissingElement'
32
+ CO_PROF_LOSS = 'Co.ProfLoss'
33
+ CO_QUAL_AUDIT = 'Co.QualAudit'
34
+ CO_SM_CO = 'Co.SmCo'
35
+ CO_SEC_477 = 'Co.Sec477'
36
+ CO_SEC_480 = 'Co.Sec480'
37
+ LP_ABRID = 'Lp.Abrid'
38
+ LP_AUDIT = 'Lp.Audit'
39
+ LP_GROUP = 'Lp.Group'
40
+ LP_MED_LP = 'Lp.MedLp'
41
+ LP_MEM_RESP = 'Lp.MemResp'
42
+ LP_MICRO = 'Lp.Micro'
43
+ LP_PROF_LOSS = 'Lp.ProfLoss'
44
+ LP_QUAL_AUDIT = 'Lp.QualAudit'
45
+ LP_SEC_477 = 'Lp.Sec477'
46
+ LP_SEC_480 = 'Lp.Sec480'
47
+ LP_SM_LP = 'Lp.SmLp'
48
+
49
+ # Concept local names
50
+ CONCEPT_ABRIDGED_ACCOUNTS = 'AbridgedAccounts'
51
+ CONCEPT_ABBREVIATED_ACCOUNTS = 'AbbreviatedAccounts'
52
+ CONCEPT_AUDITED = 'Audited'
53
+ CONCEPT_APPLICABLE_LEGISLATION = 'ApplicableLegislation'
54
+ CONCEPT_APPLICABLE_LEGISLATION_DIMENSION = 'ApplicableLegislationDimension'
55
+ CONCEPT_ACCOUNTING_STANDARDS_APPLIED = 'AccountingStandardsApplied'
56
+ CONCEPT_ACCOUNTING_STANDARDS_DIMENSION = 'AccountingStandardsDimension'
57
+ CONCEPT_ACCOUNTS_STATUS = 'AccountsStatusAuditedOrUnaudited'
58
+ CONCEPT_ACCOUNTS_STATUS_DIMENSION = 'AccountsStatusDimension'
59
+ CONCEPT_ACCOUNTS_TYPE_FULL_OR_ABBREVIATED = 'AccountsTypeFullOrAbbreviated' # DEPRECATED IN 2022+ taxonomies. No replacement yet.
60
+ CONCEPT_ACCOUNTS_TYPE_DIMENSION = 'AccountsTypeDimension'
61
+ CONCEPT_ADVERSE_OPINION = 'AdverseOpinion'
62
+ CONCEPT_BALANCE_SHEET_DATE = 'BalanceSheetDate'
63
+ CONCEPT_CHARITY_FUNDS = 'CharityFunds'
64
+ CONCEPT_CHARITY_REGISTRATION_NUMBER_ENGLAND_WALES = 'CharityRegistrationNumberEnglandWales'
65
+ CONCEPT_CHARITY_REGISTRATION_NUMBER_NORTH_IRELAND = 'CharityRegistrationNumberNorthernIreland'
66
+ CONCEPT_CHARITY_REGISTRATION_NUMBER_SCOTLAND = 'CharityRegistrationNumberScotland'
67
+ CONCEPT_CONSOLIDATED = 'Consolidated'
68
+ CONCEPT_DATE_AUDITOR_REPORT = 'DateAuditorsReport'
69
+ CONCEPT_DATE_CHARITY_AUDITORS_REPORT = 'DateCharityAuditorsReport'
70
+ CONCEPT_DATE_SIGNING_DIRECTOR_REPORT = 'DateSigningDirectorsReport'
71
+ CONCEPT_DATE_SIGNING_TRUSTEES_REPORT = 'DateSigningTrusteesAnnualReport'
72
+ CONCEPT_DIRECTOR_SIGNING_DIRECTORS_REPORT = 'DirectorSigningDirectorsReport'
73
+ CONCEPT_DISCLAIMER_OPINION = 'DisclaimerOpinion'
74
+ CONCEPT_END_DATE_FOR_PERIOD_COVERED_BY_REPORT = 'EndDateForPeriodCoveredByReport'
75
+ CONCEPT_ENTITY_DORMANT = 'EntityDormantTruefalse'
76
+ CONCEPT_ENTITY_TRADING_STATUS = 'EntityTradingStatus'
77
+ CONCEPT_ENTITY_TRADING_STATUS_DIMENSION = 'EntityTradingStatusDimension'
78
+ CONCEPT_GROUP_COMPANY_DATA_DIMENSION = 'GroupCompanyDataDimension'
79
+ CONCEPT_LANGUAGES_DIMENSION = 'LanguagesDimension'
80
+ CONCEPT_MEDIUM_COMPANY = 'StatementThatCompanyHasPreparedAccountsUnderProvisionsRelatingToMedium-sizedCompanies'
81
+ CONCEPT_MEDIUM_COMPANIES_REGIME_FOR_ACCOUNTS = 'Medium-sizedCompaniesRegimeForAccounts'
82
+ CONCEPT_MICRO_ENTITIES = 'Micro-entities'
83
+ CONCEPT_NAME_INDIVIDUAL_AUDITOR = 'NameIndividualAuditor'
84
+ CONCEPT_NAME_INDIVIDUAL_CHARITY_AUDITOR = 'NameIndividualCharityAuditor'
85
+ CONCEPT_NAME_ENTITY_AUDITORS = 'NameEntityAuditors'
86
+ CONCEPT_NAME_ENTITY_CHARITY_AUDITORS = 'NameEntityCharityAuditors'
87
+ CONCEPT_NAME_SENIOR_STATUTORY_AUDITOR = 'NameSeniorStatutoryAuditor'
88
+ CONCEPT_NAME_SENIOR_STATUTORY_CHARITY_AUDITOR = 'NameSeniorStatutoryCharityAuditor'
89
+ CONCEPT_OPINION_AUDITORS_ON_ENTITY = 'OpinionAuditorsOnEntity'
90
+ CONCEPT_QUALIFIED_OPINION = 'QualifiedOpinion'
91
+ CONCEPT_UNQUALIFIED_OPINION = 'UnqualifiedOpinion'
92
+ CONCEPT_LEGAL_FORM_ENTIY = 'LegalFormEntity'
93
+ CONCEPT_LEGAL_FORM_ENTIY_DIMENSION = 'LegalFormEntityDimension'
94
+ CONCEPT_LLP = 'LimitedLiabilityPartnershipLLP'
95
+ CONCEPT_PROFIT_LOSS = 'ProfitLoss'
96
+ CONCEPT_REPORT_PRINCIPAL_LANGUAGE = 'ReportPrincipalLanguage'
97
+ CONCEPT_SCOPE_ACCOUNTS = 'ScopeAccounts'
98
+ CONCEPT_SCOPE_ACCOUNTS_DIMENSION = 'ScopeAccountsDimension'
99
+ CONCEPT_STATEMENT_PROVIDED = 'StatementOnQualityCompletenessInformationProvidedToAuditors'
100
+ CONCEPT_SMALL_COMPANY_REGIME_FOR_ACCOUNTS = 'SmallCompaniesRegimeForAccounts'
101
+ CONCEPT_TRUSTEE_SIGNING_ANNUAL_REPORT = 'TrusteeSigningTrusteesAnnualReport'
102
+ CONCEPT_GROUP_ACCOUNTS_ONLY = 'GroupAccountsOnly'
103
+ CONCEPT_CONSOLIDATED_GROUP_COMPANY_ACCOUNTS = 'ConsolidatedGroupCompanyAccounts'
104
+ CONCEPT_WELSH = 'Welsh'
105
+
106
+ CHARITY_REGISTRATION_NUMBERS = [CONCEPT_CHARITY_REGISTRATION_NUMBER_ENGLAND_WALES, CONCEPT_CHARITY_REGISTRATION_NUMBER_NORTH_IRELAND, CONCEPT_CHARITY_REGISTRATION_NUMBER_SCOTLAND]
107
+
108
+ # Map of error code > concept local name > tuple of pairings of descriptions and regex patterns
109
+ TEXT_VALIDATION_PATTERNS: dict[str, dict[str, tuple[tuple[str, list[list[str]]], ...]]] = {
110
+ CH_DIR_RESP: {
111
+ 'StatementThatDirectorsAcknowledgeTheirResponsibilitiesUnderCompaniesAct': (
112
+ (
113
+ '"Directors acknowledge" or "Director acknowledges" or "Trustees acknowledge" or "Trustee acknowledges", and "responsibilities", and "Companies Act 2006" OR "the Act"',
114
+ [
115
+ ["Director acknowledges", "Directors acknowledge", "Trustees acknowledge", "Trustee acknowledges"],
116
+ ["responsibilities"],
117
+ ["Companies Act 2006", "the Act"]
118
+ ],
119
+ ),
120
+ (
121
+ '"Cyfarwyddwyr yn cydnabod" or "Cyfarwyddwr yn cydnabod" or "ymddiriedolwyr yn cydnabod" or "ymddiriedolwr yn cydnabod", and "cyfrifoldebau", and "Ddeddf Cwmnïau 2006" or "y ddeddf"',
122
+ [
123
+ ["Cyfarwyddwyr yn cydnabod", "Cyfarwyddwr yn cydnabod", "ymddiriedolwyr yn cydnabod", "ymddiriedolwr yn cydnabod"],
124
+ ["cyfrifoldebau"],
125
+ ["Ddeddf Cwmnïau 2006", "y ddeddf"]
126
+ ],
127
+ ),
128
+ ),
129
+ },
130
+ CO_ABRID: {
131
+ 'StatementThatMembersHaveAgreedToPreparationAbridgedAccountsUnderSection444CompaniesAct2006': (
132
+ (
133
+ 'Members" or "Member", and "agreed" or "consented", and "preparation", and "abridged")',
134
+ [
135
+ ["Members", "Member"],
136
+ ["agreed", "consented"],
137
+ ["preparation"],
138
+ ["abridged"]
139
+ ],
140
+ ),
141
+ (
142
+ '"Aelodau" or "Aelod", and "wedi cytuno" or "cydsynio", and "paratoi", and "talfyredig")',
143
+ [
144
+ ["Aelodau", "Aelod"],
145
+ ["wedi cytuno", "cydsynio"],
146
+ ["paratoi"],
147
+ ["talfyredig"]
148
+ ],
149
+ ),
150
+ ),
151
+ },
152
+ CO_AUDIT_NR: {
153
+ 'StatementThatMembersHaveNotRequiredCompanyToObtainAnAudit': (
154
+ (
155
+ '"member has" or "members have", and "not required the company to obtain an audit"',
156
+ [
157
+ ["Member has", "Members have"],
158
+ ["not required the company to obtain an audit"]
159
+ ],
160
+ ),
161
+ (
162
+ '"aelodau heb ei gwneud yn ofynnol i\'r cwmni gael archwiliad" OR "aelod heb ei gwneud yn ofynnol i\'r cwmni gael archwiliad"',
163
+ [
164
+ ["aelodau heb ei gwneud yn ofynnol i'r cwmni gael archwiliad", "aelod heb ei gwneud yn ofynnol i'r cwmni gael archwiliad"]
165
+ ],
166
+ ),
167
+ ),
168
+ },
169
+ CO_DIR_RESP: {
170
+ 'StatementThatDirectorsAcknowledgeTheirResponsibilitiesUnderCompaniesAct': (
171
+ (
172
+ '"Directors acknowledge" or "Director acknowledges", and "responsibilities", and "Companies Act 2006" OR "the Act"',
173
+ [
174
+ ["Director acknowledges", "Directors acknowledge"],
175
+ ["responsibilities"],
176
+ ["Companies Act 2006", "the Act"]
177
+ ],
178
+ ),
179
+ (
180
+ '"Cyfarwyddwyr yn cydnabod" or "Cyfarwyddwr yn cydnabod", and "cyfrifoldebau", and "Ddeddf Cwmnïau 2006" or "y ddeddf"',
181
+ [
182
+ ["Cyfarwyddwyr yn cydnabod", "Cyfarwyddwr yn cydnabod"],
183
+ ["cyfrifoldebau"],
184
+ ["Ddeddf Cwmnïau 2006", "y ddeddf"]
185
+ ],
186
+ ),
187
+ ),
188
+ },
189
+ CO_MICRO: {
190
+ 'StatementThatAccountsHaveBeenPreparedInAccordanceWithProvisionsSmallCompaniesRegime': (
191
+ (
192
+ '"Prepared", and "in accordance with", and "provisions", and "micro"',
193
+ [
194
+ ["Prepared"],
195
+ ["in accordance with"],
196
+ ["provisions"],
197
+ ["micro"]
198
+ ],
199
+ ),
200
+ (
201
+ '"wedi eu paratoi", and "yn unol â", and "darpariaethau", and "micro"',
202
+ [
203
+ ["wedi eu paratoi"],
204
+ ["yn unol â"],
205
+ ["darpariaethau"],
206
+ ["micro"]
207
+ ],
208
+ ),
209
+ ),
210
+ },
211
+ CO_SEC_477: {
212
+ 'StatementThatCompanyEntitledToExemptionFromAuditUnderSection477CompaniesAct2006RelatingToSmallCompanies': (
213
+ (
214
+ '"Exempt" or "Exemption", and later "section 477 of the Companies Act 2006"',
215
+ [
216
+ ["Exempt", "Exemption"],
217
+ ["section 477 of the Companies Act 2006"]
218
+ ]
219
+ ),
220
+ (
221
+ '"Wedi\'i eithrio" or "Eithriad", and "adran 477 o Ddeddf Cwmnïau 2006"',
222
+ [
223
+ ["Wedi'i eithrio", "Eithriad"],
224
+ ["adran 477 o Ddeddf Cwmnïau 2006"]
225
+ ],
226
+ ),
227
+ ),
228
+ },
229
+ CO_SEC_480: {
230
+ 'StatementThatCompanyEntitledToExemptionFromAuditUnderSection480CompaniesAct2006RelatingToDormantCompanies': (
231
+ (
232
+ '"Exempt" or "Exemption", and later "section 480 of the Companies Act 2006"',
233
+ [
234
+ ["Exempt", "Exemption"],
235
+ ["section 480 of the Companies Act 2006"]
236
+ ],
237
+ ),
238
+ (
239
+ '"Wedi\'i eithrio" or "Eithriad", and "adran 480 o Ddeddf Cwmnïau 2006"',
240
+ [
241
+ ["Wedi'i eithrio", "Eithriad"],
242
+ ["adran 480 o Ddeddf Cwmnïau 2006"]
243
+ ],
244
+ ),
245
+ ),
246
+ },
247
+ CO_SM_CO: {
248
+ 'StatementThatAccountsHaveBeenPreparedInAccordanceWithProvisionsSmallCompaniesRegime': (
249
+ (
250
+ '"Prepared in accordance with", and "provisions", and "small companies"',
251
+ [
252
+ ["Prepared in accordance with"],
253
+ ["provisions"],
254
+ ["small companies"]
255
+ ],
256
+ ),
257
+ (
258
+ '"Paratowyd yn unol â", and "darpariaethau", and "cwmnïau bach"',
259
+ [
260
+ ["Paratowyd yn unol â"],
261
+ ["darpariaethau"],
262
+ ["cwmnïau bach"]
263
+ ],
264
+ ),
265
+ ),
266
+ },
267
+ LP_ABRID: {
268
+ 'StatementThatMembersHaveAgreedToPreparationAbridgedAccountsUnderSection444CompaniesAct2006': (
269
+ (
270
+ '"Members" or "Member", and "agreed" or "consented", and "preparation", and "abridged")',
271
+ [
272
+ ["Members", "Member"],
273
+ ["agreed", "consented"],
274
+ ["preparation"],
275
+ ["abridged"]
276
+ ],
277
+ ),
278
+ (
279
+ '"Aelodau" or "Aelod", and "wedi cytuno" or "cydsynio", and "paratoi", and "talfyredig")',
280
+ [
281
+ ["Aelodau", "Aelod"],
282
+ ["wedi cytuno", "cydsynio"],
283
+ ["paratoi"],
284
+ ["talfyredig"]
285
+ ],
286
+ ),
287
+ ),
288
+ },
289
+ LP_MEM_RESP: {
290
+ 'StatementThatDirectorsAcknowledgeTheirResponsibilitiesUnderCompaniesAct': (
291
+ (
292
+ '"Members acknowledge" or "Member acknowledges", and "responsibilities", and "Companies Act 2006" or "the Act", and "Limited Liability Partnership" or "LLP"',
293
+ [
294
+ ["Members acknowledge", "Member acknowledges"],
295
+ ["responsibilities"],
296
+ ["Companies Act 2006", "the Act"],
297
+ ["Limited Liability Partnership", "LLP"]
298
+ ],
299
+ ),
300
+ (
301
+ '"Aelodau\'n cydnabod" or "Aelod yn cydnabod", and "cyfrifoldebau", and "Ddeddf Cwmnïau 2006" or "y Ddeddf", and "Partneriaeth Atebolrwydd Cyfyngedig" or "PAC"',
302
+ [
303
+ ["Aelodau'n cydnabod", "Aelod yn cydnabod"],
304
+ ["cyfrifoldebau"],
305
+ ["Ddeddf Cwmnïau 2006", "y Ddeddf"],
306
+ ["Partneriaeth Atebolrwydd Cyfyngedig", "PAC"]
307
+ ],
308
+ ),
309
+ ),
310
+ },
311
+ LP_MICRO: {
312
+ 'StatementThatAccountsHaveBeenPreparedInAccordanceWithProvisionsSmallCompaniesRegime': (
313
+ (
314
+ '"Prepared", and "in accordance with", and "provisions", and "micro"',
315
+ [
316
+ ["Prepared"],
317
+ ["in accordance with"],
318
+ ["provisions"],
319
+ ["micro"]
320
+ ],
321
+ ),
322
+ (
323
+ '"wedi eu paratoi", and "yn unol â", and "darpariaethau", and "micro"',
324
+ [
325
+ ["wedi eu paratoi"],
326
+ ["yn unol â"],
327
+ ["darpariaethau"],
328
+ ["micro"]
329
+ ],
330
+ ),
331
+ ),
332
+ },
333
+ LP_SEC_477: {
334
+ 'StatementThatCompanyEntitledToExemptionFromAuditUnderSection477CompaniesAct2006RelatingToSmallCompanies': (
335
+ (
336
+ '"Exempt" OR "Exemption", and "section 477 of the Companies Act 2006", and "Limited Liability Partnership" OR "LLP")',
337
+ [
338
+ ["Exempt", "Exemption"],
339
+ ["section 477 of the Companies Act 2006"],
340
+ ["Limited Liability Partnership", "LLP"]
341
+ ],
342
+ ),
343
+ (
344
+ '"Wedi\'i eithrio" or "Eithriad", and "adran 477 o Ddeddf Cwmnïau 2006", and "Partneriaeth Atebolrwydd Cyfyngedig" OR "PAC"',
345
+ [
346
+ ["Wedi'i eithrio", "Eithriad"],
347
+ ["adran 477 o Ddeddf Cwmnïau 2006"],
348
+ ["Partneriaeth Atebolrwydd Cyfyngedig", "PAC"]
349
+ ],
350
+ ),
351
+ ),
352
+ },
353
+ LP_SEC_480: {
354
+ 'StatementThatCompanyEntitledToExemptionFromAuditUnderSection480CompaniesAct2006RelatingToDormantCompanies': (
355
+ (
356
+ '"Exempt" or "Exemption", and "section 480 of the Companies Act 2006", and "Limited Liability Partnership" OR "LLP"',
357
+ [
358
+ ["Exempt", "Exemption"],
359
+ ["section 480 of the Companies Act 2006"],
360
+ ["Limited Liability Partnership", "LLP"]
361
+ ],
362
+ ),
363
+ (
364
+ '"Wedi\'i eithrio" or "Eithriad", and "adran 480 o Ddeddf Cwmnïau 2006", and "Partneriaeth Atebolrwydd Cyfyngedig" or "PAC"',
365
+ [
366
+ ["Wedi'i eithrio", "Eithriad"],
367
+ ["adran 480 o Ddeddf Cwmnïau 2006"],
368
+ ["Partneriaeth Atebolrwydd Cyfyngedig", "PAC"]
369
+ ],
370
+ ),
371
+ ),
372
+ },
373
+ LP_SM_LP: {
374
+ 'StatementThatAccountsHaveBeenPreparedInAccordanceWithProvisionsSmallCompaniesRegime': (
375
+ (
376
+ '"Prepared in accordance with", and "provisions", and "small Limited Liability Partnership" OR "small LLP',
377
+ [
378
+ ["Prepared in accordance with"],
379
+ ["provisions"],
380
+ ["small Limited Liability Partnership", "small LLP"]
381
+ ],
382
+ ),
383
+ (
384
+ '"Paratowyd yn unol â", and "y darpariaethau", and "Partneriaeth Atebolrwydd Cyfyngedig bach" or "PAC bach")',
385
+ [
386
+ ["Paratowyd yn unol â"],
387
+ ["y darpariaethau"],
388
+ ["Partneriaeth Atebolrwydd Cyfyngedig bach", "PAC bach"]
389
+ ],
390
+ ),
391
+ ),
392
+ },
393
+ }
394
+
395
+ # Map of codes > dict of local name and warning level boolean
396
+ SINGLE_CONCEPT_EVALUATIONS: dict[str, dict[str, bool]] = {
397
+ CO_MED_CO: {CONCEPT_MEDIUM_COMPANY: True},
398
+ LP_MED_LP: {CONCEPT_MEDIUM_COMPANY: True},
399
+ CO_QUAL_AUDIT: {CONCEPT_STATEMENT_PROVIDED: False},
400
+ LP_QUAL_AUDIT: {CONCEPT_STATEMENT_PROVIDED: False},
401
+ }
402
+
403
+
404
+ class AccountStatus(Enum):
405
+ AUDIT_EXEMPT_NO_REPORT = 'AuditExempt-NoAccountantsReport'
406
+ AUDIT_EXEMPT_WITH_REPORT = 'AuditExemptWithAccountantsReport'
407
+
408
+
409
+ class NotTrading(Enum):
410
+ CONCEPT_ENTITY_HAS_NEVER_TRADED = 'EntityHasNeverTraded'
411
+ CONCEPT_ENTITY_NO_LONGER_TRADING = 'EntityNoLongerTradingButTradedInPast'
412
+
413
+
414
+ class ScopeAccounts(Enum):
415
+ GROUP_ONLY = 'GroupAccountsOnly'
416
+ CONSOLIDATED_GROUP = 'ConsolidatedGroupCompanyAccounts'
417
+
418
+
419
+ @dataclass
420
+ class CodeResult:
421
+ success: bool = field(default=True)
422
+ conceptLocalName: str | None = field(default=None)
423
+ conceptList: list[str] | None = field(default=None)
424
+ fact: ModelFact | None = field(default=None)
425
+ message: str | None = field(default=None)
426
+ warning: bool = field(default=False)
427
+
428
+
429
+ class HmrcLang(Enum):
430
+ ENGLISH = 0
431
+ WELSH = 1
432
+
433
+
434
+ @dataclass
435
+ class ValidateUK:
436
+ modelXbrl: ModelXbrl
437
+ _codeResultMap: dict[str, CodeResult] = field(default_factory=dict)
438
+
439
+ def _checkValidFact(self, fact: ModelFact ) -> bool:
440
+ return (
441
+ fact is not None and
442
+ not fact.isNil and
443
+ fact.context is not None
444
+ )
445
+
446
+ def _errorOnMissingFact(self, conceptLocalName: str) -> None:
447
+ """
448
+ Logs an error explaining that a fact of the given concept was missing.
449
+ :param conceptLocalName:
450
+ """
451
+ self.modelXbrl.error(
452
+ CO_MISSING_ELEMENT,
453
+ "Based on facts regarding Entity and Report Information provided, "
454
+ "your document is expected to have a fact tagged with the following concept: %(conceptLocalName)s.",
455
+ conceptLocalName=conceptLocalName
456
+ )
457
+
458
+ def _errorOnMissingFactText(self, code: str, result: CodeResult) -> None:
459
+ """
460
+ Logs an error on the `ModelXbrl` explaining the actual fact value did not match expected patterns.
461
+ If a fact of the expected type did not exist, an additional error will be logged.
462
+ :param code:
463
+ :param result:
464
+ """
465
+ if result.fact is None and result.conceptLocalName is not None:
466
+ self._errorOnMissingFact(result.conceptLocalName)
467
+ self.modelXbrl.error(
468
+ code,
469
+ "The value for the the fact tagged with the concept %(conceptLocalName)s "
470
+ "is missing the text for language '%(lang)s': %(message)s",
471
+ conceptLocalName=result.conceptLocalName,
472
+ lang=self._lang.name.title(),
473
+ message=result.message,
474
+ modelObject=result.fact,
475
+ )
476
+
477
+ def _setCode(self, code: str, result: CodeResult) -> CodeResult:
478
+ """
479
+ Caches the given result for the given code.
480
+ :param code:
481
+ :param result:
482
+ :return: The given result.
483
+ """
484
+ self._codeResultMap[code] = result
485
+ return result
486
+
487
+ def _evaluateTextPattern(self, code: str) -> CodeResult:
488
+ pattern: dict[str, tuple[tuple[str, list[list[str]]], ...]] | Any = TEXT_VALIDATION_PATTERNS.get(code, {})
489
+ for conceptLocalName, textMatchers in pattern.items():
490
+ facts = self._getFacts(conceptLocalName)
491
+ if not facts:
492
+ return CodeResult(
493
+ success=False,
494
+ conceptLocalName=conceptLocalName
495
+ )
496
+ for fact in facts:
497
+ message, phrase_lists = textMatchers[self._lang.value]
498
+ match = all(
499
+ re.compile(
500
+ "|".join(r"\b{}\b".format(phrase) for phrase in phrase_list),
501
+ re.MULTILINE | re.IGNORECASE
502
+ ).search(fact.value) for phrase_list in phrase_lists
503
+ )
504
+
505
+ if not match:
506
+ return CodeResult(
507
+ success=False,
508
+ conceptLocalName=conceptLocalName,
509
+ fact=fact,
510
+ message=message
511
+ )
512
+ return CodeResult()
513
+
514
+ def _evaluateDirectorFacts(self, code: str) -> CodeResult:
515
+ """
516
+ Logs an error when an audited report does not facts tagged with the concepts of "DateSigningDirectorsReport" and "DirectorSigningDirectorsReport,
517
+ or DateSigningTrusteesAnnualReport and TrusteeSigningTrusteesAnnualReport (for charities)."
518
+ :return:
519
+ """
520
+ missingConcepts = []
521
+ if not self._getAndCheckValidFacts([CONCEPT_DATE_SIGNING_DIRECTOR_REPORT]):
522
+ missingConcepts.append(CONCEPT_DATE_SIGNING_DIRECTOR_REPORT)
523
+ if not self._getAndCheckValidFacts([CONCEPT_DIRECTOR_SIGNING_DIRECTORS_REPORT]):
524
+ missingConcepts.append(CONCEPT_DIRECTOR_SIGNING_DIRECTORS_REPORT)
525
+ if len(missingConcepts) > 0:
526
+ if code == CO_DIR_REP:
527
+ return CodeResult(
528
+ success=False,
529
+ conceptList=missingConcepts,
530
+ message="Facts tagged with the DateSigningDirectorsReport and DirectorSigningDirectorsReport must exist with non-nil values. "
531
+ "There are no facts tagged with the concepts: %(conceptList)s.",
532
+ )
533
+ elif code == CH_DIR_REP:
534
+ missingCharConcepts = []
535
+ if not self._getAndCheckValidFacts([CONCEPT_DATE_SIGNING_TRUSTEES_REPORT]):
536
+ missingCharConcepts.append(CONCEPT_DATE_SIGNING_TRUSTEES_REPORT)
537
+ if not self._getAndCheckValidFacts([CONCEPT_TRUSTEE_SIGNING_ANNUAL_REPORT]):
538
+ missingCharConcepts.append(CONCEPT_TRUSTEE_SIGNING_ANNUAL_REPORT)
539
+ if len(missingCharConcepts) > 0:
540
+ missingConcepts.extend(missingCharConcepts)
541
+ return CodeResult(
542
+ success=False,
543
+ conceptList=missingConcepts,
544
+ message="A set of facts must exist with non-nil values with the concepts of DateSigningDirectorsReport and DirectorSigningDirectorsReport "
545
+ "or DateSigningTrusteesAnnualReport and TrusteeSigningTrusteesAnnualReport. "
546
+ "There are no facts tagged with the concepts: %(conceptList)s.",
547
+ )
548
+ return CodeResult()
549
+
550
+ def _evaluateAuditFacts(self) -> CodeResult:
551
+ """
552
+ Logs an error when an audited report does not facts tagged with the concepts of "DateAuditorsReport" and "OpinionAuditorsOnEntity"
553
+ as well as either "NameIndividualAuditor" or the combination of "NameSeniorStatutoryAuditor" and "NameEntityAuditors".
554
+ :return:
555
+ """
556
+ missingConcepts = []
557
+ if not self._getAndCheckValidFacts([CONCEPT_DATE_AUDITOR_REPORT]):
558
+ missingConcepts.append(CONCEPT_DATE_AUDITOR_REPORT)
559
+ if not self._getAndCheckValidFacts([CONCEPT_OPINION_AUDITORS_ON_ENTITY]):
560
+ missingConcepts.append(CONCEPT_OPINION_AUDITORS_ON_ENTITY)
561
+ if (not (self._getAndCheckValidFacts([CONCEPT_NAME_ENTITY_AUDITORS]) and self._getAndCheckValidFacts([CONCEPT_NAME_SENIOR_STATUTORY_AUDITOR]))
562
+ and not self._getAndCheckValidFacts([CONCEPT_NAME_INDIVIDUAL_AUDITOR])):
563
+ missingConcepts.append(CONCEPT_NAME_INDIVIDUAL_AUDITOR)
564
+ missingConcepts.append(CONCEPT_NAME_SENIOR_STATUTORY_AUDITOR)
565
+ missingConcepts.append(CONCEPT_NAME_ENTITY_AUDITORS)
566
+ if len(missingConcepts) > 0:
567
+ return CodeResult(
568
+ success=False,
569
+ conceptList=missingConcepts,
570
+ message="An audited report must contain facts tagged with the concepts of DateAuditorsReport, OpinionAuditorsOnEntity "
571
+ "as well as either NameIndividualAuditor or the combination of NameSeniorStatutoryAuditor and NameEntityAuditors. "
572
+ "There are no facts tagged with the concepts: %(conceptList)s."
573
+ )
574
+ return CodeResult()
575
+
576
+ def _evaluateCharAuditFacts(self) -> CodeResult:
577
+ """
578
+ Logs an error when a charity report does not facts tagged with the concepts of "DateAuditorsReport" or "DateCharityAuditorsReport"
579
+ and "OpinionAuditorsOnEntity" or "QualifiedOpinion" or "UnqualifiedOpinion" or "AdverseOpinion" or "DisclaimerOpinion"
580
+ and "NameIndividualAuditor" or "NameIndividualCharityAuditor" or ("NameSeniorStatutoryAuditor" and "NameEntityAuditors") or ("NameSeniorStatutoryCharityAuditor" and "NameEntityCharityAuditors")
581
+ :return:
582
+ """
583
+ missingConcepts = []
584
+ if not self._getAndCheckValidFacts([CONCEPT_DATE_AUDITOR_REPORT, CONCEPT_DATE_CHARITY_AUDITORS_REPORT]):
585
+ missingConcepts.extend([CONCEPT_DATE_AUDITOR_REPORT, CONCEPT_DATE_CHARITY_AUDITORS_REPORT])
586
+ if not self._getAndCheckValidFacts(
587
+ [CONCEPT_OPINION_AUDITORS_ON_ENTITY, CONCEPT_QUALIFIED_OPINION, CONCEPT_UNQUALIFIED_OPINION, CONCEPT_ADVERSE_OPINION, CONCEPT_DISCLAIMER_OPINION]
588
+ ):
589
+ missingConcepts.extend(
590
+ [CONCEPT_OPINION_AUDITORS_ON_ENTITY, CONCEPT_QUALIFIED_OPINION, CONCEPT_UNQUALIFIED_OPINION, CONCEPT_ADVERSE_OPINION, CONCEPT_DISCLAIMER_OPINION]
591
+ )
592
+ if not self._getAndCheckValidFacts([CONCEPT_NAME_INDIVIDUAL_AUDITOR, CONCEPT_NAME_INDIVIDUAL_CHARITY_AUDITOR]):
593
+ if not (self._getAndCheckValidFacts([CONCEPT_NAME_SENIOR_STATUTORY_AUDITOR]) and self._getAndCheckValidFacts([CONCEPT_NAME_ENTITY_AUDITORS])):
594
+ if not (self._getAndCheckValidFacts([CONCEPT_NAME_SENIOR_STATUTORY_CHARITY_AUDITOR]) and self._getAndCheckValidFacts([CONCEPT_NAME_ENTITY_CHARITY_AUDITORS])):
595
+ missingConcepts.extend(
596
+ [
597
+ CONCEPT_NAME_INDIVIDUAL_AUDITOR, CONCEPT_NAME_INDIVIDUAL_CHARITY_AUDITOR, CONCEPT_NAME_SENIOR_STATUTORY_AUDITOR, CONCEPT_NAME_ENTITY_AUDITORS,
598
+ CONCEPT_NAME_SENIOR_STATUTORY_CHARITY_AUDITOR, CONCEPT_NAME_ENTITY_CHARITY_AUDITORS
599
+ ]
600
+ )
601
+ if len(missingConcepts) > 0:
602
+ return CodeResult(
603
+ success=False,
604
+ conceptList=missingConcepts,
605
+ message="Audited charities accounts submission missing required audit-related information. Audited charity accounts submissions are required to include facts for: "
606
+ "i) DateAuditorsReport or DateCharityAuditorsReport "
607
+ "ii) OpinionAuditorsOnEntity, QualifiedOpinion, UnqualifiedOpinion, AdverseOpinion, or DisclaimerOpinion "
608
+ "iii) NameIndividualAuditor, NameIndividualCharityAuditor, OR either (NameSeniorStatutoryAuditor and NameEntityAuditors) or (NameSeniorStatutoryCharityAuditor and NameEntityCharityAuditors) "
609
+ "There are no facts tagged with the concepts: %(conceptList)s"
610
+ )
611
+ return CodeResult()
612
+
613
+ def _evaluateRequiredSingleFact(self, code: str) -> CodeResult:
614
+ """
615
+ Logs a warning or error if the fact tied to the code is not found.
616
+ """
617
+ conceptAndLevel = SINGLE_CONCEPT_EVALUATIONS.get(code, {})
618
+ for conceptLocalName, warning in conceptAndLevel.items():
619
+ if not self._getAndCheckValidFacts([conceptLocalName]):
620
+ return CodeResult(
621
+ success=False,
622
+ warning=warning,
623
+ message="The concept of %(conceptLocalName)s must exist and have a non-nil value.",
624
+ conceptLocalName=conceptLocalName,
625
+ )
626
+ return CodeResult()
627
+
628
+ def _evaluateProfLossOrCharityFundsFact(self, code: str) -> CodeResult:
629
+ """
630
+ Logs an error if EntityTradingStatus with the dimension of EntityTradingStatusDimension/(EntityHasNeverTraded OR EntityNoLongerTradingButTradedInPast)
631
+ or (ProfitLoss for a company/LLP of CharityFunds for a charity)
632
+ """
633
+ concept = ''
634
+ if code in (CO_PROF_LOSS, LP_PROF_LOSS):
635
+ concept = CONCEPT_PROFIT_LOSS
636
+ elif code == CH_CHAR_FUND:
637
+ concept = CONCEPT_CHARITY_FUNDS
638
+ trading = False
639
+ for value in self._getDimensionValues(CONCEPT_ENTITY_TRADING_STATUS, CONCEPT_ENTITY_TRADING_STATUS_DIMENSION):
640
+ if value in {
641
+ NotTrading.CONCEPT_ENTITY_NO_LONGER_TRADING.value,
642
+ NotTrading.CONCEPT_ENTITY_HAS_NEVER_TRADED.value,
643
+ }:
644
+ trading = True
645
+ if not self._getAndCheckValidFacts([concept]) and not trading:
646
+ return CodeResult(
647
+ conceptLocalName=concept,
648
+ success=False,
649
+ message="A fact tagged with %(conceptLocalName)s must exist if a fact tagged with EntityTradingStatus "
650
+ "with the dimension of EntityTradingStatusDimension/(EntityHasNeverTraded OR EntityNoLongerTradingButTradedInPast) "
651
+ "does not exist or has a nil value"
652
+ )
653
+ return CodeResult()
654
+
655
+ def _evaluateGroupFacts(self) -> CodeResult:
656
+ """
657
+ BalanceSheetDate with GroupCompanyDataDimension and Consolidated must equal BalanceSheetDate with default
658
+ dimensions. Both facts must be non-nil.
659
+ """
660
+ consolidatedFact = None
661
+ defaultFact = None
662
+ endDateFact = None
663
+ for fact in self._getFacts(CONCEPT_END_DATE_FOR_PERIOD_COVERED_BY_REPORT):
664
+ if not fact.context.qnameDims:
665
+ endDateFact = fact
666
+ break
667
+ if endDateFact is None:
668
+ return CodeResult()
669
+ for balanceSheetDateFact in self._getFacts(CONCEPT_BALANCE_SHEET_DATE):
670
+ if self._checkValidFact(balanceSheetDateFact):
671
+ if not balanceSheetDateFact.context.qnameDims and balanceSheetDateFact.context.instantDate == endDateFact.context.instantDate:
672
+ defaultFact = balanceSheetDateFact
673
+ for qname, value in balanceSheetDateFact.context.qnameDims.items():
674
+ if value.xValid < VALID:
675
+ continue
676
+ if qname.localName == CONCEPT_GROUP_COMPANY_DATA_DIMENSION and cast(str, value.xValue.localName) == CONCEPT_CONSOLIDATED:
677
+ consolidatedFact = balanceSheetDateFact
678
+ break
679
+ if consolidatedFact is None or defaultFact is None or consolidatedFact.xValue != defaultFact.xValue:
680
+ return CodeResult(
681
+ conceptLocalName=CONCEPT_BALANCE_SHEET_DATE,
682
+ success=False,
683
+ message="A fact tagged with BalanceSheetDate with the dimension of GroupCompanyDataDimension/Consolidated "
684
+ "must equal a fact tagged with BalanceSheetDate with the default dimension."
685
+ )
686
+ return CodeResult()
687
+
688
+ def _evaluateCode(self, code: str) -> CodeResult:
689
+ """
690
+ Evaluates whether the conditions associated with the given code pass.
691
+ Result is cached.
692
+ :param code:
693
+ :return: Result object that can be used for additional logic or to trigger an error.
694
+ """
695
+ if code in self._codeResultMap:
696
+ return self._codeResultMap[code]
697
+ if code in TEXT_VALIDATION_PATTERNS:
698
+ result = self._evaluateTextPattern(code)
699
+ elif code in (CO_AUDIT, LP_AUDIT):
700
+ result = self._evaluateAuditFacts()
701
+ elif code in (CH_DIR_REP, CO_DIR_REP):
702
+ result = self._evaluateDirectorFacts(code)
703
+ elif code in SINGLE_CONCEPT_EVALUATIONS:
704
+ result = self._evaluateRequiredSingleFact(code)
705
+ elif code in (CH_CHAR_FUND, CO_PROF_LOSS, LP_PROF_LOSS):
706
+ result = self._evaluateProfLossOrCharityFundsFact(code)
707
+ elif code == CH_AUDIT:
708
+ result = self._evaluateCharAuditFacts()
709
+ elif code in (CO_GROUP, LP_GROUP):
710
+ result = self._evaluateGroupFacts()
711
+ return self._setCode(code, result)
712
+
713
+ def _getFacts(self, conceptLocalName: str) -> list[ModelFact]:
714
+ return [f for f in self.modelXbrl.factsByLocalName.get(conceptLocalName, set()) if f is not None]
715
+
716
+ def _getAndCheckValidFacts(self, conceptLocalNames: list[str]) -> bool:
717
+ for concept in conceptLocalNames:
718
+ facts = self._getFacts(concept)
719
+ if any(self._checkValidFact(x) for x in facts):
720
+ return True
721
+ return False
722
+
723
+ @cached_property
724
+ def _lang(self) -> HmrcLang:
725
+ """
726
+ Determines if the language is set to Welsh, otherwise defaults to English.
727
+ """
728
+ if any(
729
+ lang == CONCEPT_WELSH
730
+ for lang in self._getDimensionValues(CONCEPT_REPORT_PRINCIPAL_LANGUAGE, CONCEPT_LANGUAGES_DIMENSION)
731
+ ):
732
+ return HmrcLang.WELSH
733
+ return HmrcLang.ENGLISH
734
+
735
+ def _yieldErrorOrWarning(self, code: str, result: CodeResult) -> None:
736
+ """
737
+ Logs an error on the `ModelXbrl` explaining the actual fact value did not match expected patterns.
738
+ If a fact of the expected type did not exist, an additional error will be logged.
739
+ :param code:
740
+ :param result:
741
+ """
742
+ if result.message is None:
743
+ result.message = ''
744
+ if not result.warning:
745
+ self.modelXbrl.error(
746
+ code,
747
+ msg=result.message,
748
+ conceptList=result.conceptList,
749
+ conceptLocalName=result.conceptLocalName,
750
+ message=result.message,
751
+ modelObject=result.fact,
752
+ )
753
+ else:
754
+ self.modelXbrl.warning(
755
+ code,
756
+ msg=result.message,
757
+ conceptList=result.conceptList,
758
+ conceptLocalName=result.conceptLocalName,
759
+ message=result.message,
760
+ modelObject=result.fact,
761
+ )
762
+
763
+ @cached_property
764
+ def accountStatus(self) -> str | None:
765
+ return next(iter(self._getDimensionValues(CONCEPT_ACCOUNTS_STATUS, CONCEPT_ACCOUNTS_STATUS_DIMENSION)), None)
766
+
767
+ @cached_property
768
+ def accountsType(self) -> str | None:
769
+ return next(iter(self._getDimensionValues(CONCEPT_ACCOUNTS_TYPE_FULL_OR_ABBREVIATED, CONCEPT_ACCOUNTS_TYPE_DIMENSION)), None)
770
+
771
+ @cached_property
772
+ def accountingStandardsApplied(self) -> str | None:
773
+ return next(iter(self._getDimensionValues(CONCEPT_ACCOUNTING_STANDARDS_APPLIED, CONCEPT_ACCOUNTING_STANDARDS_DIMENSION)), None)
774
+
775
+ @cached_property
776
+ def applicableLegislation(self) -> str | None:
777
+ return next(iter(self._getDimensionValues(CONCEPT_APPLICABLE_LEGISLATION, CONCEPT_APPLICABLE_LEGISLATION_DIMENSION)), None)
778
+
779
+ @cached_property
780
+ def isEntityDormant(self) -> bool:
781
+ facts = self._getFacts(CONCEPT_ENTITY_DORMANT)
782
+ if not facts:
783
+ return False
784
+ return all(not f.isNil and isinstance(f.xValue, bool) and f.xValue for f in facts)
785
+
786
+ @cached_property
787
+ def legalFormEntity(self) -> str | None:
788
+ return next(iter(self._getDimensionValues(CONCEPT_LEGAL_FORM_ENTIY, CONCEPT_LEGAL_FORM_ENTIY_DIMENSION)), None)
789
+
790
+ @cached_property
791
+ def scopeAccounts(self) -> str | None:
792
+ return next(iter(self._getDimensionValues(CONCEPT_SCOPE_ACCOUNTS, CONCEPT_SCOPE_ACCOUNTS_DIMENSION)), None)
793
+
794
+ def _getDimensionValues(self, conceptLocalName: str, dimensionLocalName: str) -> Iterable[str]:
795
+ facts = self._getFacts(conceptLocalName)
796
+ for fact in facts:
797
+ if not self._checkValidFact(fact):
798
+ continue
799
+ for qname, value in fact.context.qnameDims.items():
800
+ if value.xValid < VALID:
801
+ continue
802
+ if qname.localName == dimensionLocalName:
803
+ yield cast(str, value.xValue.localName)
804
+
805
+ def validate(self) -> None:
806
+ """
807
+ Find the appropriate set of validations to run on this document and runs them.
808
+ """
809
+ if self.accountStatus in {
810
+ AccountStatus.AUDIT_EXEMPT_NO_REPORT.value,
811
+ AccountStatus.AUDIT_EXEMPT_WITH_REPORT.value,
812
+ }:
813
+ if self.isEntityDormant:
814
+ if self.legalFormEntity == CONCEPT_LLP:
815
+ self.validateUnauditedDormantLLP()
816
+ else:
817
+ self.validateUnauditedDormantCompany()
818
+ elif self.accountingStandardsApplied == CONCEPT_MICRO_ENTITIES:
819
+ if self.legalFormEntity == CONCEPT_LLP:
820
+ self.validateUnauditedMicroLLP()
821
+ else:
822
+ self.validateUnauditedMicroCompany()
823
+ elif self.accountsType == CONCEPT_ABRIDGED_ACCOUNTS:
824
+ if self.legalFormEntity == CONCEPT_LLP:
825
+ self.validateUnauditedLLPAbridgedAccounts()
826
+ else:
827
+ self.validateUnauditedCompanyAbridgedAccounts()
828
+ elif self.accountsType == CONCEPT_ABBREVIATED_ACCOUNTS:
829
+ if self.legalFormEntity == CONCEPT_LLP:
830
+ self.validateUnauditedLLPAbbreviatedAccounts()
831
+ else:
832
+ self.validateUnauditedCompanyAbbreviatedAccounts()
833
+ elif self.scopeAccounts in {
834
+ ScopeAccounts.GROUP_ONLY.value,
835
+ ScopeAccounts.CONSOLIDATED_GROUP.value,
836
+ }:
837
+ if self.legalFormEntity == CONCEPT_LLP:
838
+ self.validateUnauditedLLPGroupAccounts()
839
+ else:
840
+ self.validateUnauditedCompanyGroupAccounts()
841
+ else:
842
+ if self.legalFormEntity == CONCEPT_LLP and self.applicableLegislation == CONCEPT_SMALL_COMPANY_REGIME_FOR_ACCOUNTS :
843
+ self.validateUnauditedLLPFullAccounts()
844
+ else:
845
+ self.validateUnauditedSmallCompanyFullAccounts()
846
+ elif self.accountStatus == CONCEPT_AUDITED:
847
+ if self.accountsType == CONCEPT_ABRIDGED_ACCOUNTS:
848
+ if self.legalFormEntity == CONCEPT_LLP:
849
+ self.validateAuditedAbridgedLLPAccounts()
850
+ else:
851
+ self.validateAuditedCompanyAbridgedAccounts()
852
+ elif self.applicableLegislation == CONCEPT_SMALL_COMPANY_REGIME_FOR_ACCOUNTS:
853
+ if self.legalFormEntity == CONCEPT_LLP:
854
+ self.validateAuditedSmallLLP()
855
+ else:
856
+ self.validateAuditedSmallCompany()
857
+ elif self.applicableLegislation == CONCEPT_MEDIUM_COMPANIES_REGIME_FOR_ACCOUNTS:
858
+ if self.legalFormEntity == CONCEPT_LLP:
859
+ self.validateAuditedMediumLLP()
860
+ else:
861
+ self.validateAuditedMediumCompany()
862
+ elif self.accountingStandardsApplied == CONCEPT_MICRO_ENTITIES:
863
+ if self.legalFormEntity == CONCEPT_LLP:
864
+ self.validateAuditedMicroLLP()
865
+ else:
866
+ self.validateAuditedMicroCompany()
867
+ elif not (self.scopeAccounts in {
868
+ ScopeAccounts.GROUP_ONLY.value,
869
+ ScopeAccounts.CONSOLIDATED_GROUP.value,
870
+ } or self.accountsType == CONCEPT_ABRIDGED_ACCOUNTS or self.applicableLegislation == CONCEPT_SMALL_COMPANY_REGIME_FOR_ACCOUNTS):
871
+ if self.legalFormEntity == CONCEPT_LLP:
872
+ self.validateAuditedOtherLLP()
873
+ else:
874
+ self.validateAuditedOtherCompany()
875
+ elif self.scopeAccounts in {
876
+ ScopeAccounts.GROUP_ONLY.value,
877
+ ScopeAccounts.CONSOLIDATED_GROUP.value,
878
+ }:
879
+ if self.legalFormEntity == CONCEPT_LLP:
880
+ self.validateAuditedGroupLLP()
881
+ else:
882
+ self.validateAuditedGroupCompany()
883
+
884
+ def validateCharities(self) -> None:
885
+ """
886
+ Find the appropriate set of validations to run on this document and runs them.
887
+ """
888
+ if self._getAndCheckValidFacts(CHARITY_REGISTRATION_NUMBERS):
889
+ if self.accountStatus == CONCEPT_AUDITED:
890
+ if self.applicableLegislation == CONCEPT_SMALL_COMPANY_REGIME_FOR_ACCOUNTS:
891
+ if self.legalFormEntity != CONCEPT_LLP:
892
+ self.validateAuditedSmallCharity()
893
+
894
+ elif not (self.scopeAccounts in {
895
+ ScopeAccounts.GROUP_ONLY.value,
896
+ ScopeAccounts.CONSOLIDATED_GROUP.value,
897
+ } or self.accountsType == CONCEPT_ABRIDGED_ACCOUNTS):
898
+ self.validateAuditedOtherCharity()
899
+ elif self.accountStatus in {
900
+ AccountStatus.AUDIT_EXEMPT_NO_REPORT.value,
901
+ AccountStatus.AUDIT_EXEMPT_WITH_REPORT.value,
902
+ }:
903
+ if self.isEntityDormant:
904
+ self.validateUnauditedDormantCharity()
905
+ else:
906
+ self.validateUnauditedCharitySmallAndGroupAccounts()
907
+
908
+ def validateAuditedAbridgedLLPAccounts(self) -> None:
909
+ """
910
+ Checks conditions applicable to audited abridged LLP accounts:
911
+ Lp.Abrid, lp.Audit, and Lp.Smlp
912
+ """
913
+ result = self._evaluateCode(LP_ABRID)
914
+ if not result.success:
915
+ self._errorOnMissingFactText(LP_ABRID, result)
916
+ result = self._evaluateCode(LP_SM_LP)
917
+ if not result.success:
918
+ self._errorOnMissingFactText(LP_SM_LP, result)
919
+ result = self._evaluateCode(LP_AUDIT)
920
+ if not result.success:
921
+ self._yieldErrorOrWarning(LP_AUDIT, result)
922
+
923
+ def validateAuditedCompanyAbridgedAccounts(self) -> None:
924
+ """
925
+ Checks conditions applicable to audited company abridged accounts:
926
+ Co.Abrid, Co.Audit, and Co.SmCo
927
+ """
928
+ result = self._evaluateCode(CO_ABRID)
929
+ if not result.success:
930
+ self._errorOnMissingFactText(CO_ABRID, result)
931
+ result = self._evaluateCode(CO_SM_CO)
932
+ if not result.success:
933
+ self._errorOnMissingFactText(CO_SM_CO, result)
934
+ result = self._evaluateCode(CO_AUDIT)
935
+ if not result.success:
936
+ self._yieldErrorOrWarning(CO_AUDIT, result)
937
+
938
+ def validateAuditedMediumCompany(self) -> None:
939
+ """
940
+ Checks conditions applicable to audited medium company filings:
941
+ Co.Audit, and Co.MedCo
942
+ """
943
+ result = self._evaluateCode(CO_MED_CO)
944
+ if not result.success:
945
+ self._yieldErrorOrWarning(CO_MED_CO, result)
946
+ result = self._evaluateCode(CO_AUDIT)
947
+ if not result.success:
948
+ self._yieldErrorOrWarning(CO_AUDIT, result)
949
+
950
+ def validateAuditedMediumLLP(self) -> None:
951
+ """
952
+ Checks conditions applicable to audited medium llp filings:
953
+ Lp.Audit, and Lp.MedLp
954
+ """
955
+ result = self._evaluateCode(LP_MED_LP)
956
+ if not result.success:
957
+ self._yieldErrorOrWarning(LP_MED_LP, result)
958
+ result = self._evaluateCode(LP_AUDIT)
959
+ if not result.success:
960
+ self._yieldErrorOrWarning(LP_AUDIT, result)
961
+
962
+ def validateAuditedMicroCompany(self) -> None:
963
+ """
964
+ Checks conditions applicable to audited micro company filings:
965
+ Co.Micro and (Co.SmCo or Co.ProfLoss)
966
+ """
967
+ result = self._evaluateCode(CO_MICRO)
968
+ if not result.success:
969
+ self._errorOnMissingFactText(CO_MICRO, result)
970
+ result = self._evaluateCode(CO_SM_CO)
971
+ if not result.success:
972
+ pLResult = self._evaluateCode(CO_PROF_LOSS)
973
+ if not pLResult.success:
974
+ self._errorOnMissingFactText(CO_SM_CO, result)
975
+ self._yieldErrorOrWarning(CO_PROF_LOSS, pLResult)
976
+
977
+ def validateAuditedMicroLLP(self) -> None:
978
+ """
979
+ Checks conditions applicable to audited micro LLP filings:
980
+ LP.Micro and (Lp.SmLp or Lp.ProfLoss)
981
+ """
982
+ result = self._evaluateCode(LP_MICRO)
983
+ if not result.success:
984
+ self._errorOnMissingFactText(LP_MICRO, result)
985
+ result = self._evaluateCode(LP_SM_LP)
986
+ if not result.success:
987
+ pLResult = self._evaluateCode(LP_PROF_LOSS)
988
+ if not pLResult.success:
989
+ self._errorOnMissingFactText(LP_SM_LP, result)
990
+ self._yieldErrorOrWarning(LP_PROF_LOSS, pLResult)
991
+
992
+ def validateAuditedOtherCharity(self) -> None:
993
+ """
994
+ Checks conditions applicable to audited other charity filings:
995
+ Char.DirReport, Char.Audit, and Char.CharFunds
996
+ """
997
+ result = self._evaluateCode(CH_DIR_REP)
998
+ if not result.success:
999
+ self._yieldErrorOrWarning(CH_DIR_REP, result)
1000
+ result = self._evaluateCode(CH_AUDIT)
1001
+ if not result.success:
1002
+ self._yieldErrorOrWarning(CH_AUDIT, result)
1003
+ result = self._evaluateCode(CH_CHAR_FUND)
1004
+ if not result.success:
1005
+ self._yieldErrorOrWarning(CH_CHAR_FUND, result)
1006
+
1007
+ def validateAuditedOtherCompany(self) -> None:
1008
+ """
1009
+ Checks conditions applicable to audited other company filings:
1010
+ Co.Audit, Co.DirReport, Co.QualAudit, and Co.ProfLoss
1011
+ """
1012
+ result = self._evaluateCode(CO_AUDIT)
1013
+ if not result.success:
1014
+ self._errorOnMissingFactText(CO_AUDIT, result)
1015
+ result = self._evaluateCode(CO_DIR_REP)
1016
+ if not result.success:
1017
+ self._yieldErrorOrWarning(CO_DIR_REP, result)
1018
+ result = self._evaluateCode(CO_QUAL_AUDIT)
1019
+ if not result.success:
1020
+ self._yieldErrorOrWarning(CO_QUAL_AUDIT, result)
1021
+ result = self._evaluateCode(CO_PROF_LOSS)
1022
+ if not result.success:
1023
+ self._yieldErrorOrWarning(CO_PROF_LOSS, result)
1024
+
1025
+ def validateAuditedOtherLLP(self) -> None:
1026
+ """
1027
+ Checks conditions applicable to audited other LLP filings:
1028
+ Lp.Audit, Lp.QualAudit and Lp.ProfLoss
1029
+ """
1030
+ result = self._evaluateCode(LP_AUDIT)
1031
+ if not result.success:
1032
+ self._errorOnMissingFactText(LP_AUDIT, result)
1033
+ result = self._evaluateCode(LP_QUAL_AUDIT)
1034
+ if not result.success:
1035
+ self._yieldErrorOrWarning(LP_QUAL_AUDIT, result)
1036
+ result = self._evaluateCode(LP_PROF_LOSS)
1037
+ if not result.success:
1038
+ self._yieldErrorOrWarning(LP_PROF_LOSS, result)
1039
+
1040
+ def validateAuditedSmallCharity(self) -> None:
1041
+ """
1042
+ Checks conditions applicable to audited small company filings:
1043
+ Char.Audit and Co.SmCo
1044
+ """
1045
+ result = self._evaluateCode(CO_SM_CO)
1046
+ if not result.success:
1047
+ self._errorOnMissingFactText(CO_SM_CO, result)
1048
+ result = self._evaluateCode(CH_AUDIT)
1049
+ if not result.success:
1050
+ self._yieldErrorOrWarning(CH_AUDIT, result)
1051
+
1052
+ def validateAuditedSmallCompany(self) -> None:
1053
+ """
1054
+ Checks conditions applicable to audited small company filings:
1055
+ Co.Audit and Co.SmCo
1056
+ """
1057
+ result = self._evaluateCode(CO_SM_CO)
1058
+ if not result.success:
1059
+ self._errorOnMissingFactText(CO_SM_CO, result)
1060
+ result = self._evaluateCode(CO_AUDIT)
1061
+ if not result.success:
1062
+ self._yieldErrorOrWarning(CO_AUDIT, result)
1063
+
1064
+ def validateAuditedSmallLLP(self) -> None:
1065
+ """
1066
+ Checks conditions applicable to audited small LLP filings:
1067
+ Lp.Audit and Lp.Smlp
1068
+ """
1069
+ result = self._evaluateCode(LP_SM_LP)
1070
+ if not result.success:
1071
+ self._errorOnMissingFactText(LP_SM_LP, result)
1072
+ result = self._evaluateCode(LP_AUDIT)
1073
+ if not result.success:
1074
+ self._yieldErrorOrWarning(LP_AUDIT, result)
1075
+
1076
+ def validateUnauditedCharitySmallAndGroupAccounts(self) -> None:
1077
+ """
1078
+ Checks conditions applicable to unaudited small charities or unaudited charity group accounts:
1079
+ Co.Sec777, Co.AuditNR, Char.DirResp, and Co.SmCo
1080
+ """
1081
+ result = self._evaluateCode(CO_SEC_477)
1082
+ if not result.success:
1083
+ self._errorOnMissingFactText(CO_SEC_477, result)
1084
+ result = self._evaluateCode(CO_AUDIT_NR)
1085
+ if not result.success:
1086
+ self._errorOnMissingFactText(CO_AUDIT_NR, result)
1087
+ result = self._evaluateCode(CH_DIR_RESP)
1088
+ if not result.success:
1089
+ self._yieldErrorOrWarning(CH_DIR_RESP, result)
1090
+ result = self._evaluateCode(CO_SM_CO)
1091
+ if not result.success:
1092
+ self._errorOnMissingFactText(CO_SM_CO, result)
1093
+
1094
+ def validateUnauditedCompanyAbbreviatedAccounts(self) -> None:
1095
+ """
1096
+ Checks conditions applicable to unaudited company abbreviated accounts:
1097
+ Co.Sec777, Co.AuditNR, Co.DirResp, and Co.SmCo
1098
+ """
1099
+ result = self._evaluateCode(CO_SEC_477)
1100
+ if not result.success:
1101
+ self._errorOnMissingFactText(CO_SEC_477, result)
1102
+ result = self._evaluateCode(CO_AUDIT_NR)
1103
+ if not result.success:
1104
+ self._errorOnMissingFactText(CO_AUDIT_NR, result)
1105
+ result = self._evaluateCode(CO_DIR_RESP)
1106
+ if not result.success:
1107
+ self._errorOnMissingFactText(CO_DIR_RESP, result)
1108
+ result = self._evaluateCode(CO_SM_CO)
1109
+ if not result.success:
1110
+ self._errorOnMissingFactText(CO_SM_CO, result)
1111
+
1112
+ def validateUnauditedCompanyAbridgedAccounts(self) -> None:
1113
+ """
1114
+ Checks conditions applicable to unaudited company abridged accounts:
1115
+ Co.Sec777, Co.AuditNR, Co.DirResp, Co.SmCo, Co.Abrid
1116
+ """
1117
+ result = self._evaluateCode(CO_SEC_477)
1118
+ if not result.success:
1119
+ self._errorOnMissingFactText(CO_SEC_477, result)
1120
+ result = self._evaluateCode(CO_AUDIT_NR)
1121
+ if not result.success:
1122
+ self._errorOnMissingFactText(CO_AUDIT_NR, result)
1123
+ result = self._evaluateCode(CO_DIR_RESP)
1124
+ if not result.success:
1125
+ self._errorOnMissingFactText(CO_DIR_RESP, result)
1126
+ result = self._evaluateCode(CO_SM_CO)
1127
+ if not result.success:
1128
+ self._errorOnMissingFactText(CO_SM_CO, result)
1129
+ result = self._evaluateCode(CO_ABRID)
1130
+ if not result.success:
1131
+ self._errorOnMissingFactText(CO_ABRID, result)
1132
+
1133
+ def validateUnauditedCompanyGroupAccounts(self) -> None:
1134
+ """
1135
+ Checks conditions applicable to unaudited company abridged accounts:
1136
+ Co.Sec477, Co.AuditNR, Co.DirResp, and Co.SmCo
1137
+ """
1138
+ result = self._evaluateCode(CO_SEC_477)
1139
+ if not result.success:
1140
+ self._errorOnMissingFactText(CO_SEC_477, result)
1141
+ result = self._evaluateCode(CO_AUDIT_NR)
1142
+ if not result.success:
1143
+ self._errorOnMissingFactText(CO_AUDIT_NR, result)
1144
+ result = self._evaluateCode(CO_DIR_RESP)
1145
+ if not result.success:
1146
+ self._errorOnMissingFactText(CO_DIR_RESP, result)
1147
+ result = self._evaluateCode(CO_SM_CO)
1148
+ if not result.success:
1149
+ self._errorOnMissingFactText(CO_SM_CO, result)
1150
+
1151
+ def validateUnauditedDormantCharity(self) -> None:
1152
+ """
1153
+ Checks conditions applicable to unaudited dormant charities:
1154
+ Co.Sec480 and Co.AuditNR and Char.DirResp and (Char.DirReport or Co.SmCo).
1155
+ """
1156
+ result = self._evaluateCode(CO_SEC_480)
1157
+ if not result.success:
1158
+ self._errorOnMissingFactText(CO_SEC_480, result)
1159
+ result = self._evaluateCode(CO_AUDIT_NR)
1160
+ if not result.success:
1161
+ self._errorOnMissingFactText(CO_AUDIT_NR, result)
1162
+ result = self._evaluateCode(CH_DIR_RESP)
1163
+ if not result.success:
1164
+ self._errorOnMissingFactText(CH_DIR_RESP, result)
1165
+
1166
+ result = self._evaluateCode(CH_DIR_REP)
1167
+ if not result.success:
1168
+ smCoResult = self._evaluateCode(CO_SM_CO)
1169
+ if not smCoResult.success:
1170
+ self._yieldErrorOrWarning(CH_DIR_REP, result)
1171
+ self._errorOnMissingFactText(CO_SM_CO, smCoResult)
1172
+
1173
+ def validateUnauditedDormantCompany(self) -> None:
1174
+ """
1175
+ Checks conditions applicable to unaudited dormant companies:
1176
+ Co.Sec480 and Co.AuditNR and Co.DirResp and (Co.Micro or Co.SmCo).
1177
+ """
1178
+ result = self._evaluateCode(CO_SEC_480)
1179
+ if not result.success:
1180
+ self._errorOnMissingFactText(CO_SEC_480, result)
1181
+ result = self._evaluateCode(CO_AUDIT_NR)
1182
+ if not result.success:
1183
+ self._errorOnMissingFactText(CO_AUDIT_NR, result)
1184
+ result = self._evaluateCode(CO_DIR_RESP)
1185
+ if not result.success:
1186
+ self._errorOnMissingFactText(CO_DIR_RESP, result)
1187
+
1188
+ result = self._evaluateCode(CO_MICRO)
1189
+ if not result.success:
1190
+ smCoResult = self._evaluateCode(CO_SM_CO)
1191
+ if not smCoResult.success:
1192
+ self._errorOnMissingFactText(CO_MICRO, result)
1193
+ self._errorOnMissingFactText(CO_SM_CO, smCoResult)
1194
+
1195
+ def validateUnauditedDormantLLP(self) -> None:
1196
+ """
1197
+ Checks conditions applicable to unaudited dormant LLPs:
1198
+ LP.MemResp and LP.Sec480 and LP.SmLP).
1199
+ """
1200
+ result = self._evaluateCode(LP_MEM_RESP)
1201
+ if not result.success:
1202
+ self._errorOnMissingFactText(LP_MEM_RESP, result)
1203
+ result = self._evaluateCode(LP_SEC_480)
1204
+ if not result.success:
1205
+ self._errorOnMissingFactText(LP_SEC_480, result)
1206
+ result = self._evaluateCode(LP_SM_LP)
1207
+ if not result.success:
1208
+ self._errorOnMissingFactText(LP_SM_LP, result)
1209
+
1210
+ def validateUnauditedLLPAbbreviatedAccounts(self) -> None:
1211
+ """
1212
+ Checks conditions applicable to unaudited LLP abbreviated accounts:
1213
+ Lp.Sec777, LP.MemResp, and Lp.SmLp
1214
+ """
1215
+ result = self._evaluateCode(LP_SEC_477)
1216
+ if not result.success:
1217
+ self._errorOnMissingFactText(LP_SEC_477, result)
1218
+ result = self._evaluateCode(LP_MEM_RESP)
1219
+ if not result.success:
1220
+ self._errorOnMissingFactText(LP_MEM_RESP, result)
1221
+ result = self._evaluateCode(LP_SM_LP)
1222
+ if not result.success:
1223
+ self._errorOnMissingFactText(LP_SM_LP, result)
1224
+
1225
+ def validateUnauditedLLPAbridgedAccounts(self) -> None:
1226
+ """
1227
+ Checks conditions applicable to unaudited LLP abridged accounts:
1228
+ Lp.Sec777, LP.MemResp, Lp.SmLp, and Lp.Abrid
1229
+ """
1230
+ result = self._evaluateCode(LP_SEC_477)
1231
+ if not result.success:
1232
+ self._errorOnMissingFactText(LP_SEC_477, result)
1233
+ result = self._evaluateCode(LP_MEM_RESP)
1234
+ if not result.success:
1235
+ self._errorOnMissingFactText(LP_MEM_RESP, result)
1236
+ result = self._evaluateCode(LP_SM_LP)
1237
+ if not result.success:
1238
+ self._errorOnMissingFactText(LP_SM_LP, result)
1239
+ result = self._evaluateCode(LP_ABRID)
1240
+ if not result.success:
1241
+ self._errorOnMissingFactText(LP_ABRID, result)
1242
+
1243
+ def validateUnauditedLLPFullAccounts(self) -> None:
1244
+ """
1245
+ Checks conditions applicable to unaudited LLP full accounts:
1246
+ Lp.Sec777, LP.MemResp, and Lp.SmLp
1247
+ """
1248
+ result = self._evaluateCode(LP_SEC_477)
1249
+ if not result.success:
1250
+ self._errorOnMissingFactText(LP_SEC_477, result)
1251
+ result = self._evaluateCode(LP_MEM_RESP)
1252
+ if not result.success:
1253
+ self._errorOnMissingFactText(LP_MEM_RESP, result)
1254
+ result = self._evaluateCode(LP_SM_LP)
1255
+ if not result.success:
1256
+ self._errorOnMissingFactText(LP_SM_LP, result)
1257
+
1258
+ def validateUnauditedLLPGroupAccounts(self) -> None:
1259
+ """
1260
+ Checks conditions applicable to unaudited LLP group accounts:
1261
+ Lp.Sec777, LP.MemResp, and Lp.SmLp
1262
+ """
1263
+ result = self._evaluateCode(LP_SEC_477)
1264
+ if not result.success:
1265
+ self._errorOnMissingFactText(LP_SEC_477, result)
1266
+ result = self._evaluateCode(LP_MEM_RESP)
1267
+ if not result.success:
1268
+ self._errorOnMissingFactText(LP_MEM_RESP, result)
1269
+ result = self._evaluateCode(LP_SM_LP)
1270
+ if not result.success:
1271
+ self._errorOnMissingFactText(LP_SM_LP, result)
1272
+
1273
+ def validateUnauditedMicroCompany(self) -> None:
1274
+ """
1275
+ Checks conditions applicable to unaudited micro companies:
1276
+ Co.Sec477 and Co.AuditNR and Co.DirResp and Co.Micro.
1277
+ """
1278
+ result = self._evaluateCode(CO_SEC_477)
1279
+ if not result.success:
1280
+ self._errorOnMissingFactText(CO_SEC_477, result)
1281
+ result = self._evaluateCode(CO_AUDIT_NR)
1282
+ if not result.success:
1283
+ self._errorOnMissingFactText(CO_AUDIT_NR, result)
1284
+ result = self._evaluateCode(CO_DIR_RESP)
1285
+ if not result.success:
1286
+ self._errorOnMissingFactText(CO_DIR_RESP, result)
1287
+ result = self._evaluateCode(CO_MICRO)
1288
+ if not result.success:
1289
+ self._errorOnMissingFactText(CO_MICRO, result)
1290
+
1291
+ def validateUnauditedMicroLLP(self) -> None:
1292
+ """
1293
+ Checks conditions applicable to unaudited micro companies:
1294
+ Lp.Sec477 and Lp.MemResp and Lp.Micro.
1295
+ """
1296
+ result = self._evaluateCode(LP_SEC_477)
1297
+ if not result.success:
1298
+ self._errorOnMissingFactText(LP_SEC_477, result)
1299
+ result = self._evaluateCode(LP_MEM_RESP)
1300
+ if not result.success:
1301
+ self._errorOnMissingFactText(LP_MEM_RESP, result)
1302
+ result = self._evaluateCode(LP_MICRO)
1303
+ if not result.success:
1304
+ self._errorOnMissingFactText(LP_MICRO, result)
1305
+
1306
+ def validateUnauditedSmallCompanyFullAccounts(self) -> None:
1307
+ """
1308
+ Checks conditions applicable to unaudited small company full accounts:
1309
+ Co.Sec477, Co.AuditNR, Co.DirResp, and Co.SmCo
1310
+ """
1311
+ result = self._evaluateCode(CO_SEC_477)
1312
+ if not result.success:
1313
+ self._errorOnMissingFactText(CO_SEC_477, result)
1314
+ result = self._evaluateCode(CO_AUDIT_NR)
1315
+ if not result.success:
1316
+ self._errorOnMissingFactText(CO_AUDIT_NR, result)
1317
+ result = self._evaluateCode(CO_DIR_RESP)
1318
+ if not result.success:
1319
+ self._errorOnMissingFactText(CO_DIR_RESP, result)
1320
+ result = self._evaluateCode(CO_SM_CO)
1321
+ if not result.success:
1322
+ self._errorOnMissingFactText(CO_SM_CO, result)
1323
+
1324
+ def validateAuditedGroupCompany(self) -> None:
1325
+ """
1326
+ Checks conditions applicable to audited group companies:
1327
+ Co.Audit AND ((Co.DirReport AND Co.ProfLoss AND Co.Group) OR Co.SmCo).
1328
+ """
1329
+ result = self._evaluateCode(CO_AUDIT)
1330
+ if not result.success:
1331
+ self._yieldErrorOrWarning(CO_AUDIT, result)
1332
+
1333
+ result = self._evaluateCode(CO_SM_CO)
1334
+ if not result.success:
1335
+ failedOr = False
1336
+ dirRepResult = self._evaluateCode(CO_DIR_REP)
1337
+ if not dirRepResult.success:
1338
+ self._yieldErrorOrWarning(CO_DIR_REP, dirRepResult)
1339
+ failedOr = True
1340
+ profLossResult = self._evaluateCode(CO_PROF_LOSS)
1341
+ if not profLossResult.success:
1342
+ self._yieldErrorOrWarning(CO_PROF_LOSS, profLossResult)
1343
+ failedOr = True
1344
+ groupResult = self._evaluateCode(CO_GROUP)
1345
+ if not groupResult.success:
1346
+ self._yieldErrorOrWarning(CO_GROUP, groupResult)
1347
+ failedOr = True
1348
+ if failedOr:
1349
+ self._errorOnMissingFactText(CO_SM_CO, result)
1350
+
1351
+ def validateAuditedGroupLLP(self) -> None:
1352
+ """
1353
+ Checks conditions applicable to audited group companies:
1354
+ LP.Audit AND ((LP.ProfLoss+LP.Group) OR LP.SmLp)
1355
+ """
1356
+ result = self._evaluateCode(LP_AUDIT)
1357
+ if not result.success:
1358
+ self._yieldErrorOrWarning(LP_AUDIT, result)
1359
+
1360
+ result = self._evaluateCode(LP_SM_LP)
1361
+ if not result.success:
1362
+ failedOr = False
1363
+ profLossResult = self._evaluateCode(LP_PROF_LOSS)
1364
+ if not profLossResult.success:
1365
+ self._yieldErrorOrWarning(LP_PROF_LOSS, profLossResult)
1366
+ failedOr = True
1367
+ groupResult = self._evaluateCode(LP_GROUP)
1368
+ if not groupResult.success:
1369
+ self._yieldErrorOrWarning(LP_GROUP, groupResult)
1370
+ failedOr = True
1371
+ if failedOr:
1372
+ self._errorOnMissingFactText(LP_SM_LP, result)