Search Posts

Visits: 608

Store XBRL GL instance documents in database

In order to calculate summary for period and/or account numbers, we store contents of XBRL GL instance documents.

In this case, we use PostgreSQL database after processed by PHP’s XML DOM functions.

We need getElementsByTagNameNS for processing elements having namespace definition.

$glcor = ‘http://www.xbrl.org/taxonomy/int/gl/cor/2003-08-29/’;
$dom -> getElementsByTagNameNS($glcor, ‘accountingEntries’);

The similar method with previous sample was used for handling structures of entryDetails element.

We connect to PostgreSQL database with PDO. Following style of coding was used to execute a sql command.

$stmt = $pdo -> prepare($sql);

[php] XML parsing with DOM and database handling with PDO


    $dom = new DOMDocument;
    $dom->load($filename);

    $glcor = 'http://www.xbrl.org/taxonomy/int/gl/cor/2003-08-29/';
    $glbus = 'http://www.xbrl.org/taxonomy/int/gl/bus/2003-08-29/';
    $glmuc = 'http://www.xbrl.org/taxonomy/int/gl/muc/2003-08-29/';

    $entries = $dom -> getElementsByTagNameNS($glcor, 'accountingEntries');
    if (count($entries)) :
        foreach ($entries as $entry) :
            /*
             * entryHeader
             */
            $entryHeader = $entry -> getElementsByTagNameNS($glcor, 'entryHeader');
            if (count($entryHeader)) :
                foreach ($entryHeader as $header) :
                    $enteredDate = $header
                        -> getElementsByTagNameNS($glcor, 'enteredDate')
                        -> item(0)
                        -> nodeValue;
                    $enteredDate = trim($enteredDate);
                    $sourceJournalDescription = $header
                        -> getElementsByTagNameNS($glbus, 'sourceJournalDescription')
                        -> item(0)
                        -> nodeValue;
                    $sourceJournalDescription = trim($sourceJournalDescription);
                    $entryNumber = $header
                        -> getElementsByTagNameNS($glcor, 'entryNumber')
                        -> item(0)
                        -> nodeValue;
                    $entryNumber = trim($entryNumber);
                    /*
                     * INSERT TABLE
                     */
                    $sql = "INSERT INTO entryheaders(";
                    $sql .= "accountingEnrtiesID, enteredDate, sourceJournalDescription, entryNumber";
                    $sql .= ") ";
                    $sql .= "VALUES(";
                    $sql .= ":accountingEnrtiesID, :enteredDate,";
                    $sql .= ":sourceJournalDescription, :entryNumber";
                    $sql .= ") ";
                    $stmt = $pdo -> prepare($sql);
                    $stmt -> bindParam(':accountingEnrtiesID', $accountingEnrtiesID);
                    $stmt -> bindParam(':enteredDate', $enteredDate);
                    $stmt -> bindParam(':sourceJournalDescription', $sourceJournalDescription);
                    $stmt -> bindParam(':entryNumber', $entryNumber);
                    try {
                        $stmt -> execute();
                    } catch( PDOExecption $e ) {
                        print "Error!: ".$e->getMessage()."<br>";
                    }
                    // Get current sequence id value
                    $sql = "SELECT currval('entryheaders_id_seq') AS seq";
                    $stmt = $pdo -> query($sql);
                    while ($row = $stmt -> fetch(PDO::FETCH_ASSOC)) {
                        $entryHeadersID = $row['seq'];
                    }
                endforeach;
            endif;
        endforeach;
    endif;

[sql] table definition


-- accountingEnrties
CREATE TABLE accountingEnrties (
    -- documentInfo
    id SERIAL8 NOT NULL,
    entriesType VARCHAR(32),
    uniqueID VARCHAR(32),
    language VARCHAR(32),
    creationDate  VARCHAR(10),
    creator  VARCHAR(64),
    entriesComment  VARCHAR(128),
    periodCoveredStart VARCHAR(10),
    periodCoveredEnd  VARCHAR(10),
    sourceApplication  VARCHAR(32),
    defaultCurrency  VARCHAR(32),
    -- entityInformation
    -- entityPhoneNumber 
    phoneNumber VARCHAR(16),
    -- entityFaxNumberStructure
    entityFaxNumber VARCHAR(16), 
    -- entityEmailAddressStructure 
    entityEmailAddress  VARCHAR(64),
    -- organizationIdentifiers 
    organizationIdentifier VARCHAR(16),
    organizationDescription VARCHAR(128),
    -- organizationAddress 
    organizationAddressStreet VARCHAR(128),
    organizationAddressCity VARCHAR(128), 
    organizationAddressStateOrProvince VARCHAR(128), 
    organizationAddressCountry VARCHAR(128),
    organizationAddressZipOrPostalCode VARCHAR(16), 
    PRIMARY KEY (id)
);

-- entryHeader
CREATE TABLE entryHeaders (
    id SERIAL8 NOT NULL,
    accountingEnrtiesID INT8,
    postedDate VARCHAR(10),
    enteredBy VARCHAR(32),
    enteredDate VARCHAR(10),
    sourceJournalID VARCHAR(16),
    sourceJournalDescription VARCHAR(128),
    entryOrigin VARCHAR(64),
    entryType VARCHAR(10),
    entryNumber VARCHAR(16),
    entryComment VARCHAR(16),
    bookTaxDifference VARCHAR(32),
    PRIMARY KEY (id),
    FOREIGN KEY (accountingEnrtiesID)  REFERENCES accountingEnrties ( id )
);

-- entryDetail
CREATE TABLE entryDetails (
    id SERIAL8 NOT NULL,
    entryHeadersID INT8,			
    lineNumber VARCHAR(16),
    -- account
    accountMainID VARCHAR(32),
    accountMainDescription VARCHAR(128),
    accountPurposeCode VARCHAR(16),
    accountType VARCHAR(32),
    -- accountSub
    accountSubDescription VARCHAR(128),
    accountSubID VARCHAR(32),
    accountSubType VARCHAR(32),
    amount VARCHAR(16),
    amountDecimals VARCHAR(16),
    amountUnitref  VARCHAR(16),
    amountMemo VARCHAR(128),
    -- identifierReference
    identifierCode VARCHAR(16),
    -- identifierExternalReference
    identifierAuthorityCode VARCHAR(16),
    identifierAuthority VARCHAR(64),
    identifierDescription VARCHAR(128),
    identifierType VARCHAR(32),
    -- identifierAddress
    identifierStreet VARCHAR(128),
    identifierCity VARCHAR(128),
    identifierStateOrProvince VARCHAR(128),
    identifierCountry VARCHAR(128),
    identifierZipOrPostalCode VARCHAR(16),
    documentType VARCHAR(16),
    documentNumber VARCHAR(16),
    documentReference VARCHAR(16),
    documentDate VARCHAR(10),
    documentLocation VARCHAR(64),
    maturityDate VARCHAR(10),
    terms VARCHAR(32),
    -- measurable
    measurableCode VARCHAR(16),
    measurableID VARCHAR(64),
    measurableDescription VARCHAR(128),
    measurableQuantity  VARCHAR(64),
    measurableUnitOfMeasure VARCHAR(16),
    measurableCostPerUnit  VARCHAR(64),
    measurableQualifier VARCHAR(16),
    -- depreciationMortgage
    dmJurisdiction VARCHAR(32),
    -- taxes
    taxAuthority  VARCHAR(16),
    taxAmount  VARCHAR(64),
    taxCode VARCHAR(16),
    debitCreditCode VARCHAR(16),
    postingDate VARCHAR(10),
    postingStatus VARCHAR(16),
    detailComment VARCHAR(128),
    PRIMARY KEY (id),
    FOREIGN KEY (entryHeadersID)  REFERENCES entryHeaders ( id )
);