Skip to content

Instantly share code, notes, and snippets.

@livarb
Last active April 19, 2023 17:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save livarb/6ab46307149dcd4fb70ceaa523fa368e to your computer and use it in GitHub Desktop.
Save livarb/6ab46307149dcd4fb70ceaa523fa368e to your computer and use it in GitHub Desktop.
Hentar ut informasjon om enheter for statsforvaltninga, inkludert rekursitvt org.nr. for alle i enheter under. Sjå https://datalandsbyen.norge.no/topic/268/oversikt-over-enhetane-i-staten
<?php
// require("difilib.php");
header("Access-Control-Allow-Origin: *");
header('Content-Type: application/json; charset=utf-8');
define("DEBUG", false);
// standard cache ved http-kall via getHTTPCached() er 1 time
// https://datalandsbyen.norge.no/topic/268/oversikt-over-enhetane-i-staten
$topLevelUrl = "https://data.brreg.no/enhetsregisteret/api/enheter?organisasjonsform=STAT&size=10000";
$subLevelUrlPrefix = "https://data.brreg.no/enhetsregisteret/api/enheter?overordnetEnhet=";
// enkel cache sidan samme org.nr. kan bli sjekka fleire ganger
// key: orgnr
// value: enhet-objekt frå data.brreg.no
$enhetCache = array();
// legge til ei liste over enheter i cache
function addToEnheterCache($enheter) {
global $enhetCache;
foreach ($enheter as $enhet) {
$orgnr = $enhet["organisasjonsnummer"];
if (!array_key_exists($orgnr, $enhetCache)) {
$enhetCache[$orgnr] = $enhet;
}
}
}
// Slå opp org.nr.
// Sjekkar først cache, deretter cacha oppslag i data.brreg.no (prøver først enhetsregisteret, deretter underenheter)
// Returnerer enhet-objekt eller null dersom ikkje funne i data.brreg.no
function lookupEnhet($orgnr, $indent = "") {
global $enhetCache;
$enhet = null;
if (array_key_exists($orgnr, $enhetCache)) {
if (DEBUG) print($indent . "Fann enhet $orgnr i enhetCache\n");
$enhet = $enhetCache[$orgnr];
}
if ($enhet == null) {
$enhet = lookupEnhetsregisteret($orgnr);
if ($enhet == null) {
if (DEBUG) print($indent . "Fant ikkje $orgnr i Enhetsregisteret. Prøver underenheter\n");
$enhet = lookupUnderenhet($orgnr);
if (DEBUG) {
if ($enhet == null) print($indent . "Fann ikkje $orgnr i underenheter heller.\n");
else print($indent . "Fant $orgnr i underenheter!\n");
}
} else {
if (DEBUG) print($indent . "Fant $orgnr i Enhetsregisteret.\n");
}
}
if (DEBUG && $enhet != null) print($indent . "lookup: " . $orgnr . "" . $enhet["navn"] . "\n");
return $enhet;
}
function lookupEnhetsregisteret($orgnr) {
$enhetPrefix = "https://data.brreg.no/enhetsregisteret/api/enheter?organisasjonsnummer=";
$enhetRaw = getHTTPCached($enhetPrefix . $orgnr);
$enhet = json_decode($enhetRaw["content"], true);
if (array_key_exists("_embedded", $enhet)) {
addToEnheterCache($enhet["_embedded"]["enheter"]);
return $enhet["_embedded"]["enheter"];
} else {
return null;
}
}
function lookupUnderenhet($orgnr) {
$underenhetUrlPrefix = "https://data.brreg.no/enhetsregisteret/api/underenheter?organisasjonsnummer=";
$underenhetRaw = getHTTPCached($underenhetUrlPrefix . $orgnr);
$underenhet = json_decode($underenhetRaw["content"], true);
if (array_key_exists("_embedded", $underenhet)) {
addToEnheterCache($underenhet["_embedded"]["underenheter"]);
return $underenhet["_embedded"]["underenheter"];
} else {
return null;
}
}
function getUnderenheter($orgnr) {
$underenheterUrlPrefix = "https://data.brreg.no/enhetsregisteret/api/underenheter?overordnetEnhet=";
$underenheterRaw = getHTTPCached($underenheterUrlPrefix . $orgnr);
$underenheter = json_decode($underenheterRaw["content"], true);
if (array_key_exists("_embedded", $underenheter)) {
addToEnheterCache($underenheter["_embedded"]["underenheter"]);
return $underenheter["_embedded"]["underenheter"];
} else {
return null;
}
}
function getUnderenheterOrgnrs($orgnr) {
$underenheter = getUnderenheter($orgnr);
if ($underenheter == null) {
return array();
} else {
$orgNums = array();
foreach ($underenheter as $underenhet) {
$orgNums[] = $underenhet["organisasjonsnummer"];
}
return $orgNums;
}
}
function getUnderordnaEnheter($orgnr) {
global $subLevelUrlPrefix;
$underordnaEnheterRaw = getHTTPCached($subLevelUrlPrefix . $orgnr);
$underordnaEnheter = json_decode($underordnaEnheterRaw["content"], true);
if (array_key_exists("_embedded", $underordnaEnheter)) {
addToEnheterCache($underordnaEnheter["_embedded"]["enheter"]);
return $underordnaEnheter["_embedded"]["enheter"];
}
return array();
}
// Lagar ei liste over alle organisasjonsnummer for ein enhet
// Først hovud-org-nr, deretter rekursivt org.nr. for underordna enheter og underenheter
function getOrgNums($orgnr, $indent = "") {
$enhet = lookupEnhet($orgnr, $indent);
$orgform = $enhet["organisasjonsform"]["kode"];
if (DEBUG) print($indent . "getOrgNums: " . $orgnr . " — " . $orgform . "" . $enhet["navn"] . "\n");
if ($orgform == "BEDR") {
if (DEBUG) print($indent . "BEDR - returnerer\n");
return array();
}
$orgNums = getUnderenheterOrgnrs($orgnr);
if (DEBUG) print($indent . "getOrgNums: $orgnr — fann " . count($orgNums) . " underenheter\n");
$underordnaEnheter = getUnderordnaEnheter($orgnr);
if (DEBUG) print($indent . "getOrgNums: $orgnr - fann " . count($underordnaEnheter) . " underordna\n");
for ($i = 0; $i < count($underordnaEnheter); $i++) {
$underordnaOrgnr = $underordnaEnheter[$i]["organisasjonsnummer"];
if (DEBUG) print($indent . "Sjekkar underordna enheter (" . count($underordnaEnheter) . ") — $underordnaOrgnr\n");
$underOrgNums = getOrgNums($underordnaOrgnr, $indent . " ");
$orgNums = array_merge(
$orgNums,
$underOrgNums
);
}
if (DEBUG) print($indent . "getOrgNums: $orgnr — totalt orgnr: " . count($orgNums) . "\n");
return $orgNums;
}
// Hent først ut topp-nivået (alle departement + stortinget og andre topp-nivå)
$dataRaw = getHTTPCached($topLevelUrl);
$data = json_decode($dataRaw["content"], true)["_embedded"]["enheter"];
addToEnheterCache($data);
// Lagar nivå 2 i hierarkiet - alle underordna enheter til enhetane henta over.
for ($i = 0; $i < count($data); $i++) {
unset($data[$i]["_links"]);
$orgnr = $data[$i]["organisasjonsnummer"];
$underordnaEnheter = getUnderordnaEnheter($orgnr);
$data[$i]["orgNums"][] = array_merge(array($orgnr), getUnderenheterOrgnrs($orgnr));
$data[$i]["underordna"] = $underordnaEnheter;
}
// Loop over nivå 2 og legg til orgNums
for ($i = 0; $i < count($data); $i++) {
for ($j = 0; $j < count($data[$i]["underordna"]); $j++) {
$orgnr = $data[$i]["underordna"][$j]["organisasjonsnummer"];
$data[$i]["underordna"][$j]["orgNums"] = array_merge(array($orgnr), getOrgNums($orgnr));
}
}
print(json_encode($data));
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment