实现XBRL 2.1、XDT、公式、泛型和XFI规范的类

dev-develop 2021-12-03 23:29 UTC

This package is auto-updated.

Last update: 2024-09-04 05:37:42 UTC


README

目录

更多详细信息请参见Wiki

状态

Build status parsing Build status compile GAAPs Build status compile extensions Build status load_instances Build status reports

一致性测试套件

XBRL 2.1 conformance XBRL dimensions conformance XPath 2.0 conformance XBRL functions registry conformance XBRL Formulas conformance XBRL Enumerations conformance XBRL Generics conformance iXBRL conformance

Build status last run date

这些测试每晚进行,以提供源代码状态的概述。所有测试均在Linux和Windows上运行。
此项目不支持HHVM。

统计信息

该项目包含251个文件中的102535行代码

关于项目

XBRLQuery项目最初是一个想法,即从公司必须产生的监管信息开始,并在组织中扩展其使用。使用XBRL表示公司数据的优点是它可验证、可发布,并且以一致、透明的方式发布,这是一种被世界上所有主要监管机构接受的格式。

我们意识到,通过作为社区来提供来自内部或发布财务数据的有用信息,将使组织能够规划、分析和对业务驱动因素做出反应,并且通过开源项目来实现这一点,将对所有人都有益。

以下是项目的概述。Wiki中还有更多信息,包括源代码的解释和文档,以及使用源代码创建报告的示例。

验证

处理器可以进行验证。将变量设置为true,则同时验证模式和实例文档。将变量设置为false,处理器仅处理并假设您知道模式和实例文档是有效的且一致的。

支持的规范

  • XBRL 2.1,但不存在对参考链接库的支持。
  • 支持XBRL维度。
  • 支持XBRL泛型,包括泛型引用、泛型链接、泛型标签和断言。
  • 支持XBRL公式。
  • 支持XBRL分类包(包括对各种旧版SEC包的支持)。
  • 支持XBRL可扩展枚举1.0和2.0 PWD。
  • 支持内联XBRL 1.1和转换为TRR 4的转换

XBRL公式支持

显著例外

只有使用XML格式(XHTML)的实例文档才能读取,因为处理器不支持任何OIM映射。

存在这些例外是因为没有添加支持的理由。在目前使用iXBRL的情况下,提交者还提供XML格式的实例文档。

分类包支持

存在许多包含分类信息的zip文件实例。如果一个zip文件的内容遵循XBRL分类包规范,那么处理器将支持它。然而,存在许多包含分类的zip文件,这些分类在打包规范存在之前就已经这样打包了。美国SEC的打包是一个例子。实际上,美国SEC提供了两个版本的旧版打包:一个使用JSON文件来记录打包内容;另一个使用XML文件。处理器支持这两种。

此外,还支持丹麦IFRS包以及丹麦商业局(Erhvervsstyrelsen)的分类。尽管这些分类以zip文件的形式提供,但这些包并不支持XBRL分类包规范。

有时,为了针对特定分类添加特定功能,扩展核心XBRL处理类是有帮助的。当一个分类可能被扩展时,这一点尤为重要。扩展的XBRL处理类的例子包括IFRS和ESMA ESEF分类。在这些情况下,基础打包类,如XBRL_TaxonomyPackage,可以扩展以返回用于处理分类的XBRL处理器类的名称。提供的示例包括

  • XBRL-US-TaxonomyPackage.php
  • XBRL-IFRS-Package.php
  • XBRL-ESMA-ESEF-Package.php

一致性

该项目几乎通过所有一致性测试,遗漏产生的原因是没有对参考链接库的支持。

一个单独的项目XBRL-tests提供了一种验证项目是否通过一致性测试的方法。该项目是我们用来运行一致性测试的测试工具的副本。

签名

实例文档和分类也可以签名。所使用的签名技术类似于用于签名Word或PDF文档或电子邮件的技术。文档使用您拥有的证书的私钥进行签名,以便其他人能够验证自您创建文档以来文档的内容没有发生变化。

签名不会影响原始文档,但对于接收者来说,了解他们正在使用未更改的相关分类的副本很重要,对于实例文档的接收者来说,了解自文档准备以来内容未更改也很重要。

签名仅使用公开的加密和验证标准,如公私钥证书。尽管该项目提供了验证签名实例文档的代码,但使用大多数编程语言的标准发行版,例如Java、C#、Python和C++,都可以进行相同的过程。

目的

该项目是由Lyquidity Solutions Limited创建的,使用网站名称www.xbrlquery.com提供PHP应用程序访问包含在XBRL实例文档中的验证过的企业数据。我们还提供这些XBRL技术的咨询服务。请联系我们info-at-xbrlquery.com

XBRL代表“可扩展商业报告语言”。我天真地认为,在这个上下文中,“报告”这个词可以加上“管理”或“预算”等词作为前缀。我认为使用XBRL向监管机构如美国SEC或英国HMRC提交报告的压倒性关注是由于有如此多的会计和政府组织参与XBRL社区的结果。但现实是,XBRL“报告”的目的是向监管机构报告。它很少,如果不是永远,用于其他类型的报告。

我所看到的多数商业或公共领域的工具,如 ArelleGepsioABRLAPI,主要关注准备实例文档以及验证这些文档是否与分类法相符并报告错误。显然,确保实例文档中包含的数据与其声明的基分类法一致是一个重要的第一步。在向法定机构“报告”的背景下,这可能是唯一的目标。当然,还有其他潜在用途的数据可以记录在文档中,并且可以与分类法进行验证。

预算和管理报告是所有组织都必须定期执行的过程示例。这些过程可能在不同部门、地理位置和责任级别具有特定要求。这些过程需要以一致的方式生成、转换、传输和报告信息。这些过程的目标可能是在数据库等存储库中记录数据,但这些数据必须在不同位置捕获,并且需要以允许验证数据和捕获正确数据的格式捕获 - XBRL正是为此而设计的。

因此,XBRL查询 的重点是提供一个平台,在该平台上,XBRL可以作为表示在预算和管理报告等公司流程中使用的数据的手段;创建一个平台,使用XBRL作为在这些业务报告流程的参与者之间可靠、可重复地传输数据的方式;创建一个平台,允许任何人验证可能基于业务决策的实例文档的内容;并且任何正在使用的文档都是真实的且未更改的。

XBRL支持

本项目包括对完整的XBRL 2.1规范以及XBRL Dimensions 1.0、Generics和XBRL Formulas规范(包括XFI函数)的支持。该项目允许应用程序验证分类法和实例文档,并能够报告发现的任何错误。错误报告将记录分类法或实例文档中的每个元素,确定违规元素,并包含对规范的引用。
在维度和公式验证的情况下,消息将包括XDT(维度)规范中定义的适当错误常量。

报告

处理器支持基于分类法作者在表示链接库中提供的信息的实例文档渲染。这意味着您可以通过定义每个网络布局的表示链接库轻松创建实例文档的渲染,而不需要复杂的代码。

数字财务报告示例页面中有许多示例,包括创建实例文档渲染的代码示例。您还可以访问www.xbrlquery.org以查看实时示例或甚至创建您自己的实例文档的渲染。案例研究示例还包括渲染丹麦商业局分类法实例文档的示例。

此示例表明,根据可用的数据(未计算的计算规则将用红色突出显示),XBRL公式和计算链接库规则计算正确。

渲染还可以包括报告的结构细节以及计算和公式结果的分解。

rollforward

为什么选择PHP?

PHP 是网络服务器中最广泛使用的语言之一。独立且最新的 w3techs 研究表明,在已知服务器端语言的网站上,PHP 被用于约 82% 的网站。PHP 简单易与所有主流网络服务器(如 Apache、IIS 和 nginx)集成。作为一种语言,它支持面向对象开发、多态、命名空间、闭包以及现代编程语言应有的所有其他功能。这种背景意味着基于 PHP 的项目可以让平台拥有强大的基于 HTTP 的服务器能力、广泛的支持,并可以集成到许多广泛使用的网络平台。

无需编译步骤/无需库混乱

像所有脚本语言一样,PHP 不需要编译步骤。编译步骤有其优点,主要优点是编译器可以执行额外的代码检查。但也有一些缺点。编写代码并运行可以提高生产力,尤其是在原型设计想法时。

PHP 版本和开发工具

要处理代码,您需要使用 PHP 7.0 或更高版本。PHP 8.0 是最新和最好的版本,虽然它受到支持,但我们目前使用 PHP 7.4.13 进行开发。PHP 8.0、PHP 7.0 及更高版本比早期版本快得多,我们很可能使用了仅在 PHP 7.+ 中可用的语言功能。

我们没有使用需要不在标准发行版中的 PHP 扩展的函数。

PHP 版本相关性能

每晚我们都会运行测试套件,其中包括约 50,000 个单元测试,涵盖了 XPath 2.0 兼容性套件、XBRL 2.1、公式和维度兼容性套件以及示例编译和报告渲染。共有 12 个离散测试(每个都是 PHP 的单独调用),总共大约需要 3-4 分钟才能完成。因为它们是密集和详尽的,所以它们提供了一些关于哪种 PHP 版本最适合这种类型应用的指示。

下表显示了相同测试在同一硬件和相同负载下的运行时间。时间以分钟:秒表示。x(f) 表示启用了 opcache 和文件缓存,因此 opcache 的好处在调用之间持续。当启用 opcache 和文件缓存时,启用检查时间戳的选项。请注意,指令文件缓存不是网站文件缓存的同义词。

我们找到了获胜者!很明显,使用版本 8.0 并启用 JIT(JIT 需要 opcache 启用)和指令文件缓存可以获得最佳性能。

最佳版本 7.2.6 的时间是 3:31。最佳 7.4.13 的时间是 2.55,提高了 21%。最佳版本 8.0 的时间是 2:25,比版本 7.2.6 高 35%,比 7.4.13 高 18%。

内存

在 php.ini 中定义的默认内存限制适用于生成常规网页的网站。然而,分类法可能很大,源代码使用了大量的内存来提高性能。我们建议当您执行示例时,您确保增加内存限制,方法是在您用于运行程序实现的入口点文件的顶部包含以下行

ini_set( 'memory_limit', '512M' );

XBRL 公式依赖于 XPath 2.0,而 XPath 2.0 查询执行依赖于递归调用。由 XBRL 公式生成的 XPath 2.0 查询可能导致非常深层次的调用,因此建议增加 PHP 的 'xdebug.max_nesting_level' 值。这仅影响使用 XDebug 进行调试时

ini_set('xdebug.max_nesting_level', 512);

我们使用 phpDocumentor 从嵌入式注释创建源代码文档。

我们使用Eclipse Neon和PDT软件包作为IDE。使用XDebug提供调试支持。在编写本文档时,Zend调试器不支持PHP 7.0,而XDebug支持。本项目或源代码对上述工具没有任何依赖。

依赖项

本项目依赖于以下项目

示例:加载和验证实例文档

使用本项目代码非常简单。以下简单示例演示了如何读取实例文档文件,检查实例文档的有效性,并报告发现的任何问题。

$instance = XBRL_Instance::FromInstanceDocument( 'my_instance_document.xml' );
$instance->validate();
if ( XBRL_Log::getInstance()->hasConformanceIssueWarning() )
{
    echo "Validation error\n";
}

许可证

本项目以GPL版本3.0许可发布

这意味着什么?

这意味着您可以根据自己的意愿使用源代码。但是,您对源代码所做的任何更改的源代码必须对他人开放,并且必须以与您在此项目中接收源代码相同的条款提供:在GPL v3.0许可下。您必须将本项目的许可证包含在任何源代码的分布中,无论分布是否包含全部源代码或只是部分源代码。例如,如果您创建一个从本项目提供的类派生的新类(例如新的分类类),则是衍生作品。

这并不意味着什么?

这并不表示您创建的仅使用本源代码的产品必须以GPL v3.0许可证发布。如果您创建一个使用本项目源代码访问实例文档数据的预算应用,该应用用于传输数据,则这不属于衍生作品。

贡献

我们欢迎贡献。有关更多信息,请参阅我们的贡献页面。如果您选择做出贡献,我们将要求您同意我们的贡献者许可协议(CLA)。我们将要求您同意CLA中的条款,以确保其他用户使用的代码不会受到不同许可证和专利责任的困扰。还强烈建议您查看我们的行为准则

安装

您可以通过Composer安装本项目。假设Composer已安装,程序快捷方式名为'composer',则安装本项目的命令为

composer require lyquidity/xbrl:dev-master lyquidity/xpath2:dev-master lyquidity/utilities:dev-master lyquidity/xml:dev-master --prefer-dist

或者fork或下载仓库。还需要下载并安装XML工具pear/Log项目。

入门

examples文件夹中的example.php文件包含了如何使用类的示例。

假设您已使用Composer安装了库,则此PHP应用程序将运行示例

<?php
// This MUST be set before the autoload because the XBRL class autoloaded uses it
global $use_xbrl_functions; $use_xbrl_functions = true;
require_once __DIR__ . '/vendor/autoload.php';
include __DIR__ . "/vendor/lyquidity/xbrl/examples/examples.php";

Wiki中阅读入门部分,其中包含更多示例,展示如何使用源代码查询分类实例文档并展示其内容。

内联XBRL转换

内联XBRL规范描述了如何在xHTML文档中嵌入XBRL实例数据。本项目提供了一种验证iXBRL处理程序,可以将iXBRL文档转换为一个XBRL实例文档。有了XBRL实例文档,就可以像处理其他文档一样进行处理。

假设您已成功运行入门中的代码,则以下行将转换一个输入iXBRL文档

$documents = XBRL_Inline::createInstanceDocument( $name, $documentSet, $cacheLocation, $validate );

如果文档验证成功,createInstanceDocument() 函数将返回一个 DOMDocument 实例数组,每个输入文档集中的文档对应一个实例。该数组将按相关目标进行索引。有关目标的信息,请参阅 iXBRL 规范。

然后返回的文档将被保存。以下示例假设 $outputFolder 中存在合适的输出文件夹,并且上面使用的 $name 是一个有用的文件名。$target 是在 iXBRL 文档中定义的名称,用于区分如果要生成多个输出实例文档,则可以区分这些文档。

foreach( $documents as $target => $document )
{
    $document->formatOutput = true;
    $xml = $document->saveXML();
    file_put_contents( "$outputFolder/$name-$target.xbrl", $xml );
}

链接

英国审计豁免分类法
英国公认会计原则和财务报表分类法
美国公认会计原则分类法
XBRL 规范
EIOPA 报告格式
英格兰银行 CRD
EBA 报告框架
ESMA 欧洲单一电子格式 分类法包规范