Automatické načtení sídla firmy a DIČ podle zadaného IČ (ARES XML) pomocí PHP a jQuery
MyEgo.cz
Automatické načtení sídla firmy a DIČ podle zadaného IČ (ARES XML) pomocí PHP a jQuery
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:
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?
[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ů.
Proč do toho tahat PHP a nenačítat to z ARESu přímo v JavaScriptu?
[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).
[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...
[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%.
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.
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
[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().
[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().
Zdravím, mám dotaz: jak by šlo získat "Obory_cinnosti"? Nějak sem se zasekl.. Jinak dík za dobré řešení!
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...
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/
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);
?>
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.
Děkuji! You saved my day :-)