DokladEntities for PHP

Jan 16, 2013 at 9:09 PM

Pro všechny, kteří chtějí používat API iDokladu v PHP a zjišťují, že vygenerování DokladEntities třídy je neskutečný vopruz, nabízím zde ke stažení:

https://docs.google.com/file/d/0B_vj9cqpe5icWXBUNnNvZ19lbDg/edit

Jun 10, 2013 at 1:04 PM
Mohl bych Vás požádat o třídu DokladEntities platnou pro změněné názvosloví iDokladu? Nedaří se mě ji vygenerovat.
Jun 10, 2013 at 1:31 PM
Vůbec se vám nedivím :)
Tady je třída kterou teď používáme my, mělo by tam být vše ok.
https://docs.google.com/file/d/0B_vj9cqpe5icVGE2R1dROWxrSHc/edit?usp=sharing
Jun 11, 2013 at 10:46 AM
Edited Jun 11, 2013 at 10:47 AM
Dobrý den,

moc díky! Vyzkouším a dám vědět zda vše funguje, kdybyste cokoli
potřeboval na revanš stačí říct

Jan Bláha
Jun 26, 2013 at 8:57 PM
Dovolím si ještě dotaz.

Volání PHP
$svc = new DokladEntities('https://app.idoklad.cz/odataservice.svc/');
$query = $svc->IssuedInvoices()->expand('Purchaser,IssuedInvoiceItems');
vyvolá chybu "Property IssuedInvoice::$Contact does not exist".

Přitom stejný HTTP požadavek v prohlížeči (https://app.idoklad.cz/odataservice.svc/IssuedInvoices?$expand=Purchaser,IssuedInvoiceItems) proběhne bez problémů a zobrazí správná data.

Volání $svc->IssuedInvoices()->expand('IssuedInvoiceItems'); je také v pořádku.

Netušíte kde by mohla být chyba? Nemůže být problém v proxy třídě?
Jun 26, 2013 at 9:28 PM
U mě ten příkaz funguje ok. Možná bude problém v tom, že tu třidu používám v namespace a je možné že v proxy třídě zůstaly nějaký lomítka a ty dělají nepořádek.
Jun 27, 2013 at 12:39 PM
Zařazení třídy do namespace nepomohlo, odstranění všech lomítek také ne, ale pomohlo přidání (NavigationProperty) public $Contact; do třídy IssuedInvoice :-) Jen deklarace, žádné další metody. A vše funguje. Takže to je návod i pro ostatní, pokud by potřebovali. Moc děkuji mroz123!
Jul 4, 2013 at 12:43 PM
Dovolím si ještě jeden dotaz.
Jak aktualizovat data faktury v iDokladu? Potřebuji nastavit vlastnost IssuedInvoice->Exported. Pro přidání nové faktury je metoda AddToIssuedInvoices(), ale pro aktualizaci jsem nic nenašel. A konstrukce:
$faktura->Exported = 1;
$svc->SaveChanges();
bohužel nic nedělá.
Jul 4, 2013 at 12:54 PM
Tohle je můj kód když označuji fakturu jako odeslanou. Obdobně vypadá i pro označení zaplacení, takže pro export by to mohlo být podobné.

$faktura->IsSentToPurchaser = true;
$svc->UpdateObject($faktura);
$svc->SaveChanges();
Jul 4, 2013 at 1:06 PM
UpdateObject() je přesně ono! Díky moc, v dokumentaci nic takového není. S vámi bych chtěl mít dvojdomek :-)
Jul 4, 2013 at 1:09 PM
V dokumentaci není vůbec nic, vše to je pokus-omyl :)
Sep 4, 2013 at 4:38 PM
Dobrý den,
mám za úkol udělat nějaké operace prostřednictvím api idokladu v php a protože z dokumentace moc nechápu, chtěl bych Vás požádat o zaslání malého ukázkového skriptu (včetně potřebných knihoven) ze kterého bych pochopil, jak se přihlásím ke službě s načtu seznam faktur (ev. i jiné operace)

Děkuji za Vaši ochotu a přeji hezký den

Hynek Bendl
Sep 4, 2013 at 6:33 PM
Budete potřebovat knihovnu DokladEntities.php, viz výše.

Já se k iDOkladu přihlašuji následovně (zkrácená verze kódu):

function OnBeforeCallBack($httpRequest) {
//uprava hlavicky pred odeslanim Execute, pridani secure tokenu pro prihlasovani
global $secureTokenHash;
$httpRequest->Headers->Add('secureToken', $secureTokenHash);
}

$secureTokenHash = hash('sha256', $idokladjmeno.'|'.$idokladheslo);
$svc = new DokladEntities('https://app.idoklad.cz/odataservice.svc/');
$query = $svc->IssuedInvoices()
                     ->filter('AgendaId eq '.$idokladagenda)
                     ->expand('Purchaser/BankAccounts/Bank,PurchaserDocumentAddress,IssuedInvoiceItems');
$fa = $query->Execute();
foreach ($fa->Result as $f) {
//akce pro kazdou fakturu
echo $f->DocumentNumber;
...atd....
}
Sep 4, 2013 at 6:44 PM
Dá se i takto
$secureToken = hash('sha256',"$username|$password");
$svc = new DokladEntities('https://app.iDoklad.cz/ODataService.svc/');
$svc->addHeader('SecureToken',$secureToken);
Dotazy pak probíhají klasicky
$query = $svc->IssuedInvoices()->Filter($filter)->Expand('IssuedInvoiceItems');
$result = $query->Execute();
        
foreach($result->Result as $res){
    //$res je nyni typu IssuedInvoice
}
viz např. http://www.codeproject.com/Articles/393623/OData-Services
Apr 2, 2014 at 2:55 PM
snažil jsem se po dvě noci uchodit vkládání faktur, ale marně, pomohl by někdo, prosím?
Stačil by kousek kodu s tím, jak s tady publikovanou DokladEntities.php provést vložení faktury a položky faktury.
Osobně mám podezdření že finta bude v AddRelatedObject která nikde definovaná není, takže to na tom spolehlivě padá pokud se to pokusím zavolat, ale v "dokumentaci" ji pro C# používají a nevím jak to obejít.
Zkouším různě přes AddToIssuedInvoiceItems($issuedInvoiceItem); ale jen marně tápu.
Moc prosím o radu :).


Detaily:

Jsem ve stavu:
  • filtrovat, resp. načítat věci v pohodě díky návodům výše, díky :)
  • vložit kontakt v pohodě pomocí
AddToContacts($Contact);
správně vrátí HTTP/1.1 201 Created a seřve mi to, pokud mi něco chybí vyplnit.

Nicméně když se snažím založit fakturu, analogicky jako kontakt
AddToIssuedInvoices($issuedInvoice);
s tím že to xml resp. obsah RequestBody (dole) na první pohled ok, všechny povinný položky jsou tam
--batch_528e1c61-c07f-44b9-406d-ba8db3bf5135
Content-Type: multipart/mixed; boundary=changeset_6561525d-c8ac-edb4-955b-502c1b4121e6

--changeset_6561525d-c8ac-edb4-955b-502c1b4121e6
Content-Type: application/http
Content-Transfer-Encoding: binary

POST https://app.iDoklad.cz/ODataService.svc/IssuedInvoices HTTP/1.1
Content-ID: 3
Accept: application/atom+xml,application/xml
Content-Type: application/atom+xml;type=entry
Content-Length: 1093

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<title />
<author>
<name />
</author>
<updated>2014-04-02T13:34:18Z</updated>
<id />
<content type="application/xml">
<m:properties>
<d:PurchaserId m:type="Edm.Int32">615707</d:PurchaserId>
<d:CurrencyId m:type="Edm.Int32">1</d:CurrencyId>
<d:ConstantSymbolId m:type="Edm.Int32">7</d:ConstantSymbolId>
<d:PaymentOptionId m:type="Edm.Int32">1</d:PaymentOptionId>
<d:VariableSymbol>20140003</d:VariableSymbol>
<d:Description>Vytvořeno pomocí oData API dnes</d:Description>
<d:DateOfIssue m:type="Edm.DateTime">2014-03-25T00:00:00</d:DateOfIssue>
<d:DateOfMaturity m:type="Edm.DateTime">2014-03-25T00:00:00</d:DateOfMaturity>
<d:DateOfTaxing m:type="Edm.DateTime">2014-03-25T00:00:00</d:DateOfTaxing>
<d:AccountedByInvoiceId m:null="true" />
<d:ReportColorId m:null="true" />
<d:CashVoucherReportColorId m:null="true" />
</m:properties>
</content>
</entry>
--changeset_6561525d-c8ac-edb4-955b-502c1b4121e6--
--batch_528e1c61-c07f-44b9-406d-ba8db3bf5135--
Ale vrátí mi to
HTTP/1.1 400 Bad Request
Content-ID: 3
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
Content-Type: application/xml;charset=utf-8

<?xml version="1.0" encoding="utf-8"?><m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><m:code /><m:message xml:lang="en-US">Failed to initialize issued invoice entity</m:message><m:innererror><m:message>Exception has been thrown by the target of an invocation.</m:message><m:type>System.Reflection.TargetInvocationException</m:type><m:stacktrace>   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)&#xD;
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)&#xD;
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)&#xD;
   at System.Data.Services.UpdateTracker.FireNotifications()</m:stacktrace><m:internalexception><m:message>Failed to initialize issued invoice entity</m:message><m:type>System.Data.Services.DataServiceException</m:type><m:stacktrace>   at Doklad.Facades.Services.ODataService.OnChangeIssuedInvoices(IssuedInvoice issuedInvoice, UpdateOperations operations) in e:\Projects\MVC\Releases\Production\3.2.16.00000\Doklad.Facades\Services\ODataService.cs:line 735</m:stacktrace></m:internalexception></m:innererror></m:error>
--changesetresponse_f702bdf3-1340-4454-afd4-03b0e8875c9e--
--batchresponse_1c2550b5-847b-46f7-ba5b-35b4b3405422--
"
}
snažím se o to cca takhle, nicméně předpokldám že mi to nadává kvůli chybějící vazbě mezi fakturou a položkou faktury a tu nevím jak udělat (AddRelatedObject neexistuje jak jsem psal výše :( ).
        $svc = new DokladEntities('https://app.iDoklad.cz/ODataService.svc/');
        $svc->addHeader('SecureToken',$SecureTokenHash);
        
        $issuedInvoice = new IssuedInvoice();
        $issuedInvoiceItem = new IssuedInvoiceItem(); 
        $Contact = new Contact();
       
        
        $Contact->CompanyName = "nejakafirma";
        $Contact->Firstname = "Franta";
        $Contact->Surname = "Tester";
        $Contact->Street = "Testovaci";
        $Contact->City = "Testovadla";
        $Contact->PostalCode = "123456";
        
        
        $issuedInvoice->Description = "Vytvořeno pomocí oData API dnes";
        $issuedInvoice->DateOfIssue = "2014-03-25T00:00:00";
        $issuedInvoice->CurrencyId = 1;
        $issuedInvoice->ConstantSymbolId = 7;
        $issuedInvoice->PaymentOptionId = 1;
        $issuedInvoice->DateOfTaxing = "2014-03-25T00:00:00";
        $issuedInvoice->DateOfIssue = "2014-03-25T00:00:00";
        $issuedInvoice->DateOfMaturity = "2014-03-25T00:00:00";
        $issuedInvoice->VariableSymbol = "20140003";
        
        $issuedInvoiceItem->Price = 500;
        $issuedInvoiceItem->Name = "HP tiskárna";
        $issuedInvoiceItem->Amount = 5;
        $issuedInvoiceItem->PriceType = 1; // bez dane 
        $issuedInvoiceItem->Unit = "Kus";
        $issuedInvoiceItem->ItemType = 0;
        $issuedInvoiceItem->VatRate = 0.21;
        $issuedInvoiceItem->VatRateType = 1; // základní / snížená / nulová 
        
        $svc->AddToContacts($Contact);
        
        $svc->SaveChanges();
        
        $issuedInvoice->PurchaserId = $Contact->Id;
        
        $svc->AddToIssuedInvoiceItems($issuedInvoiceItem);
        
        $svc->AddToIssuedInvoices($issuedInvoice);
        
        $svc->SaveChanges();
Apr 2, 2014 at 4:50 PM

Když jsem začínal s napojením, tak jsem pro vkládání faktur používat tento postup:

$novaAdresa = new DokladAdresa();
/*
vlozeni hodnot...
*/
$novyKontakt = new Kontakt();
/*
vlozeni hodnot...
*/
$novaFaktura = new FakturaVydana();
/*
vlozeni hodnot...
*/
$novaFakturaVydanaPolozka = new FakturaVydanaPolozka();
/*
vlozeni hodnot...
*/

$svc->AddToKontaktList($novyKontakt);
$svc->SaveChanges();
$novaFaktura->Odberatel_ID = $novyKontakt->ID;

$svc->AddToDokladAdresaList($novaAdresa);
$svc->SaveChanges();
$novaFaktura->OdberatelDokladAdresa_ID = $novaAdresa->ID;

$svc->AddToFakturaVydanaList($novaFaktura);
$svc->SaveChanges();
$novaFakturaVydanaPolozka->Faktura_ID = $novaFaktura->ID;

$svc->AddToFakturaVydanaPolozkaList($novaFakturaVydanaPolozka);
$novaFaktura->PolozkaList[] = $novaFakturaVydanaPolozka;

$svc->SaveChanges();

Toto mi fungovalo ještě před přechodem na anglické názvosloví. Předpokládám že pokud upravíš názvy metod dle aktuálního API, mělo by to fungovat nadále.
Apr 2, 2014 at 5:11 PM
$issuedInvoice->PurchaserId = $Contact->Id;

$svc->AddToIssuedInvoices($issuedInvoice);
$svc->SaveChanges();
        
$issuedInvoiceItem->InvoiceId = $issuedInvoice->Id;
$svc->AddToIssuedInvoiceItems($issuedInvoiceItem);
$issuedInvoice->IssuedInvoiceItems[]=$issuedInvoiceItem;
$svc->SaveChanges();

$svc->UpdateObject($issuedInvoice);
$svc->SaveChanges();
Ahoj, zkus takhle upravit svůj konec kódu a uvidíš jestli to půjde.
Jinak VatRate se zadává 0,15,nebo 21
a VatRateType je:
0 - snížená sazba
1 - základní
2 - nulová

to maj v tom pdf špatně
takže v tvém případě bude
$issuedInvoiceItem->VatRate =21;
$issuedInvoiceItem->VatRateType = 1
Apr 2, 2014 at 10:42 PM
Děkuji velice a hluboce se klaním, funguje to :). Máte to oba u mě, nick používám všude stále stejný, tak se kdykoliv ozvěte :).
Teď už to snad metodou pokus-omyl nějak doklepu :).

Jinak "dokumentace" mi stále více přijde jako prostředek na klamání nepřítele - možná by udělali líp, kdyby tam vůbec nebyla....
Třeba drobnost
$novaFakturaVydanaPolozka->InvoiceId = $novaFaktura->Id;
tam ani na druhý pohled nevidím a bez toho (a mnoho dalšího nepsaného) to nevalí... Ještě že máme ty internety :).
Ještě jednou díky!
Apr 2, 2014 at 10:50 PM
Jsem rád, že to běží :)

ještě dva mesíce zpátky to fungovalo i bez této konkrétní drobnosti, ale pak z ničeho nic bum a nic nefungovalo :D
Pokus-omyl tu je vážně nezbytnost.
Apr 3, 2014 at 6:49 AM
Ještě info pro oba - dle únorové informace od vedoucího projektu iDokladu se v řádu měsíců připravuje změna API ze současného oData na (pravděpodobně) REST-API.
Apr 3, 2014 at 9:53 PM
aaaha, ok tak to si to rovnou napíšu nějakou třídu mezi, ať to pak co nejmíň bolí... Díky za info!
Coordinator
Apr 7, 2014 at 3:05 PM
Nejlepší cestou jak sledovat novinky ohledně API je registrace na developer.idoklad.cz.