Automatické načtení sídla firmy a DIČ podle zadaného IČ (ARES XML) pomocí PHP a jQuery

MyEgo.cz

home foto blogy mywindows.cz kontakt

Automatické načtení sídla firmy a DIČ podle zadaného IČ (ARES XML) pomocí PHP a jQuery

PHP 18.04.11

V eshopu zaměřeném na firemní zákazníky můžete těmto usnadnit nákup a prvotní registraci tím, že podle zadaného IČ načtete kompletní informace o sídle a DIČ z databáze ARES. MFČR ji poskytuje jako webovou službu vracející přehledný XML feed.

Implementace s pomocí jQuery je velice jednoduchá, stačí si vytvořit JSON feed reagující na AJAXový požadavek pod názvem ares.php:

<?php 

header("Content-Type: application/json; charset=UTF-8");
define('ARES','http://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?ico=');
$ico = intval($_REQUEST['ico']);
$file = @file_get_contents(ARES.$ico);
if ($file) $xml = @simplexml_load_string($file); $a = array();
if ($xml) {
$ns = $xml->getDocNamespaces();
$data = $xml->children($ns['are']);
$el = $data->children($ns['D'])->VBAS;
if (strval($el->ICO) == $ico) {
$a['ico'] = strval($el->ICO);
$a['dic'] = strval($el->DIC);
$a['firma'] = strval($el->OF);
$a['ulice'] = strval($el->AA->NU).' '.strval($el->AA->CO);
$a['mesto'] = strval($el->AA->N);
$a['psc'] = strval($el->AA->PSC);
$a['stav'] = 'ok';
} else
$a['stav'] = 'IČ firmy nebylo nalezeno';
} else
$a['stav'] = 'Databáze ARES není dostupná'; echo json_encode($a); ?> 

A tento požadavek zavolat při změně IČ ve formuláři:

<script type='text/javascript'>
$(document).ready(function(){
$('#ico').change( function() {
var ico = $(this).val();
$.ajax({
url: "/ares.php",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: "ico="+ico,
cache: false,
success: function(data) {
if (data.stav == 'ok') {
$('input[name=dic]').val(data.dic);
$('input[name=firma]').val(data.firma);
$('input[name=ulice]').val(data.ulice);
$('input[name=mesto]').val(data.mesto);
$('input[name=psc]').val(data.psc);
alert('Název a sídlo firmy bylo vyplněno z databáze ARES.');
} else {
alert(data.stav);
}
},
});
});
</script> 

Výsledek pak vypadá třeba takto - po zadání IČ jsou ostatní informace vyplněné automaticky:

ARES XML propojení

Komentáře

  1. 1 Tomáš Kavalek 19.04.11, 08:04:44
    FB

    Není zbytečné volat ares.php vždy při události 'change' - tolik volání než ho celé napíši? IČO má přeci svá pravidla - není lepší zavolat ares.php až ve chvíli, kdy je správná délka #ico?

  2. 2 Radek Hulán 19.04.11, 08:04:48
    FB

    [1] change() se volá na INPUTu až po dokončení psaní a změně focusu, ne po každém znaku (třeba klávesa TAB), to by se muselo použít třeba keyup(). Volání bude jen jedno. Navíc starší IČ nemají 8 znaků.

  3. 3 Ondřej Mirtes 19.04.11, 07:04:15
    FB

    Proč do toho tahat PHP a nenačítat to z ARESu přímo v JavaScriptu?

  4. 4 Radek Hulán 19.04.11, 07:04:16
    FB

    [3] to PHP toho dělá víc, hlavně ověřuje, zda klient už není registrovaný v interní DB.. A pak to neběží v UTF-8 (napojení na starší verzi účetnictví běžící v CP1250).

  5. 5 Demčák Marek 19.04.11, 09:04:15
    FB

    [3] Pokud se něco nezměnilo za poslední dva roky, tak se obávám, že AJAXem nelze načítat data z jiné domény (alespoň ne v standardně nastaveném Internet Exploreru). Rád se budu mýlit, ale...

  6. 6 Radek Hulán 19.04.11, 09:04:55
    FB

    [5] právěže to není tak úplně pravda, $.getJSON funguje cross-domain. Řešíme to v jednom projektu autentizace mezi více doménami a funguje 100%.

  7. 7 Jan Valentík 14.05.11, 08:05:17
    FB

    Asi malá chybka, na řádku:
    $a['ulice'] = strval($el->AA->NU).' '.strval($el->AA->CO);
    má být CD:
    $a['ulice'] = strval($el->AA->NU).' '.strval($el->AA->CD);
    alespoň mě to tak funguje i s číslem popisným.

  8. 8 Jan Valentík 14.05.11, 08:05:19
    FB

    BTW nešlo by aby během prodlevy při načítání se zobrazil nějaký loader aby uživatel viděl, že se něco děje a nezačal vyplňovat další údaje sám??

    Díky

  9. 9 Radek Hulán 14.05.11, 03:05:23
    FB

    [8] šlo a praxi to tak je implementováno, tuto trivialitku si ale každý dodělá sám, umístí otáčející se kolo podle potřeb a v success/error na něj zavolá remove().

  10. 10 Radek Hulán 14.05.11, 03:05:23
    FB

    [8] šlo a praxi to tak je implementováno, tuto trivialitku si ale každý dodělá sám, umístí otáčející se kolo podle potřeb a v success/error na něj zavolá remove().

  11. 11 Mario Palka 21.06.11, 04:06:57
    FB

    Zdravím, mám dotaz: jak by šlo získat "Obory_cinnosti"? Nějak sem se zasekl.. Jinak dík za dobré řešení!

  12. 12 Eduard Zeman 18.08.11, 09:08:17
    FB

    Ahoj všem,
    já bych k tomuto online získávání dat podle IČ doplnil ještě možnost získat stejně jednoduše a rychle náhled loga dané firmy.

    návod je zde: http://www.logobox.cz/napojrozhrani.aspx...

    příklad tady: http://www.logobox.cz/gadgets/logobox.zip...

  13. 13 Luca Babánková 01.01.14, 09:01:53
    FB

    Ahojky mám problém jak rozchodit tento script php mi jde, javascript a html z formulářem mi to nejde poradíte prosím

    script mi běží na: http://77.48.114.178/pokus/90/

  14. 14 Lukáš Brzák 28.09.14, 10:09:01
    FB

    Trochu jsem Váš script rozšířil. Používám cURL a také rozšiřuji detekci živnostníka (jméno + příjmení) a firmy.

    <?php
    error_reporting(0);

    header("Content-Type: application/json; charset=UTF-8");
    $url = 'http://wwwinfo.mfcr.cz/cgi-bin...
    $ico = (int)$_GET['ico'];
    $url = $url . $ico;

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, false);
    $data = curl_exec($curl);
    curl_close($curl);

    if ($data) $xml = simplexml_load_string($data);

    $a = array();

    if (isset($xml)) {
    $ns = $xml->getDocNamespaces();
    $data = $xml->children($ns['are']);
    $el = $data->children($ns['D'])->VBAS;
    if (strval($el->ICO) == $ico) {
    $a['ico'] = strval($el->ICO);
    $a['dic'] = strval($el->DIC);
    $a['firma'] = strval($el->OF);

    $a['jmeno'] = "";
    $a['prijmeni'] = "";
    // detekce jména a firmy ..
    $firma = $a['firma'];
    $roz = explode(" ",$firma);
    $match = preg_match("/(s\.r\.o\.|s\. r\. o\.|spol\. s r\.o\.|a\.s\.|a\. s\.|v\.o\.s|v\. o\. s\.|o\.s\.|k\.s\.|kom\.spol\.)/",$firma);
    if (count($roz) == 2 AND !$match) {
    // nenašli jsme shodu s firmou, pravděpodobně se jedná o živnostníka se jménem ..
    $a['jmeno'] = $roz[0];
    $a['prijmeni'] = $roz[1];
    }

    $a['ulice'] = strval($el->AA->NU);
    if (!empty($el->AA->CO) OR !empty($el->AA->CD)) {
    // detekování popisného a orientačního čísla
    $a['ulice'] .= " ";
    if (!empty($el->AA->CD)) $a['ulice'] .= strval($el->AA->CD);
    if (!empty($el->AA->CO) AND !empty($el->AA->CD)) $a['ulice'] .= "/";
    if (!empty($el->AA->CO)) $a['ulice'] .= strval($el->AA->CO);
    }

    $a['mesto'] = strval($el->AA->N);
    $a['psc'] = strval($el->AA->PSC);
    $a['stav'] = 'ok';
    } else {
    $a['stav'] = 'IČ firmy nebylo v databázi ARES nalezeno';
    }
    } else {
    $a['stav'] = 'Databáze ARES není dostupná';
    }

    echo json_encode($a);

    ?>

  15. 15 Tomas Berger 01.02.16, 03:02:50
    FB

    Rád bych upozornil na náhradu ARES API - https://www.merk.cz/api-strojo... které je v základu zdarma. Krom SLA, disponuje i našeptávačem, informací o obratech, kontaktech atp.

  16. 16 Vitalij Petráš 19.07.19, 03:07:49
    FB

    Děkuji! You saved my day :-)