Potpisivanje i slanje pozivanjem COM DLL-a

Ukoliko je vaša aplikacija (blagajna) rađena u tehnologiji koja vam ne omogućava pozivanje .NET assembly-a, pripremili smo i podršku za povezivanje putem COM DLL-a.

Ovo bi trebalo raditi iz VB Script-a, VB6, Delphi-a i sl. uz napomenu da je sve isprobano jedino putem VB Script-a.

Kako bi ovo radilo, na računalu morate imati instaliran .NET Framework v2.0 (http://www.microsoft.com/en-us/download/details.aspx?id=1639)

 

Upute za instalaciju

  1. Preuzmite COM DLL (http://fiskalizacija.codeplex.com/releases)
  2. Registrirajte ga koristeći RegAsm.exe utility: C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe Raverus.FiskalizacijaDEV.COM.dll /codebase
  3. Kod priprema XML-a, obratite pažnju na Id="signXmlId" uz RacunZahtjev ili PoslovniProstorZahtjev - ovaj podatak rutini za potpisivanje "objašnjava" koji dio XML poruke treba digitalno potpisati

 

Primjeri pozivanja

 

Dim o

Set o = CreateObject("Raverus.FiskalizacijaDEV.COM.CentralniInformacijskiSustav")
msgbox o.PosaljiEcho("")


Dim xml

xml="<?xml version=""1.0"" encoding=""utf-8""?><tns:RacunZahtjev xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" Id=""signXmlId"" xmlns:tns=""http://www.apis-it.hr/fin/2012/types/f73""><tns:Zaglavlje><tns:IdPoruke>cff93023-850b-403c-ac8b-277619e81dc9</tns:IdPoruke><tns:DatumVrijeme>21.10.2012T10:10:28</tns:DatumVrijeme></tns:Zaglavlje><tns:Racun><tns:Oib>44718633471</tns:Oib><tns:USustPdv>true</tns:USustPdv><tns:DatVrijeme>21.10.2012T10:10:22</tns:DatVrijeme><tns:OznSlijed>P</tns:OznSlijed><tns:BrRac><tns:BrOznRac>1</tns:BrOznRac><tns:OznPosPr>123</tns:OznPosPr><tns:OznNapUr>1</tns:OznNapUr></tns:BrRac><tns:Pdv><tns:Porez><tns:Stopa>25.00</tns:Stopa><tns:Osnovica>10.00</tns:Osnovica><tns:Iznos>2.50</tns:Iznos></tns:Porez></tns:Pdv><tns:IznosUkupno>12.50</tns:IznosUkupno><tns:NacinPlac>G</tns:NacinPlac><tns:OibOper>12345678900</tns:OibOper><tns:ZastKod>e4d909c290d0fb1ca068ffaddf22cbd0</tns:ZastKod><tns:NakDost>false</tns:NakDost></tns:Racun></tns:RacunZahtjev>"


Dim odgovor

odgovor = o.PosaljiSoapPoruku(xml,"FISKAL 1")
msgbox odgovor


dim jir

jir = o.DohvatiJir(odgovor)
msgbox jir



odgovor = o.PosaljiSoapPorukuCertifikatDatoteka(xml,"D:\Users\Nino\Desktop\Fiskalizacija\MojCert.pfx","PASSWORD")
msgbox odgovor


jir = o.DohvatiJir(odgovor)
msgbox jir



Dim potpisaniXml

potpisaniXml=o.PotpisiXmlDokument(xml,"FISKAL 1")
msgbox potpisaniXml



Dim soap

soap=o.DodajSoapEnvelope(potpisaniXml)
msgbox soap

odgovor=o.PosaljiPotpisanuSoapXmlPoruku(soap)
msgbox odgovor
msgbox o.DohvatiUuid(odgovor,"RacunOdgovor")


Dim zki

zki=o.ZastitniKodIzracun("FISKAL 1","12345678901","21.10.2012 10:10:28","1","1","1","125.00")
msgbox zki


msgbox "Status: " + o.DohvatiStatusCisServisa()


msgbox "UUID: " + o.GenerirajUuid()




Dim xmlError

xmlError="<?xml version=""1.0"" encoding=""utf-8""?><tns:RacunZahtjev xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" Id=""signXmlId"" xmlns:tns=""http://www.apis-it.hr/fin/2012/types/f73""><tns:Zaglavlje><tns:IdPoruke>cff93023-850b-403c-ac8b-277619e81dc9</tns:IdPoruke><tns:DatumVrijeme>21.10.2012T10:10:28</tns:DatumVrijeme></tns:Zaglavlje><tns:Racun><tns:Oib>44718633471</tns:Oib><tns:USustPdv>true_ERROR_JE_OVDJE</tns:USustPdv><tns:DatVrijeme>21.10.2012T10:10:22</tns:DatVrijeme><tns:OznSlijed>P</tns:OznSlijed><tns:BrRac><tns:BrOznRac>1</tns:BrOznRac><tns:OznPosPr>123</tns:OznPosPr><tns:OznNapUr>1</tns:OznNapUr></tns:BrRac><tns:Pdv><tns:Porez><tns:Stopa>25.00</tns:Stopa><tns:Osnovica>10.00</tns:Osnovica><tns:Iznos>2.50</tns:Iznos></tns:Porez></tns:Pdv><tns:IznosUkupno>12.50</tns:IznosUkupno><tns:NacinPlac>G</tns:NacinPlac><tns:OibOper>12345678900</tns:OibOper><tns:ZastKod>e4d909c290d0fb1ca068ffaddf22cbd0</tns:ZastKod><tns:NakDost>false</tns:NakDost></tns:Racun></tns:RacunZahtjev>"


Dim odgovorErr

On Error Resume Next
Err.Clear
odgovorErr = o.PosaljiSoapPoruku(xmlError,"FISKAL 1")
If Err.Number <> 0 Then
	msgbox Err.Number
	msgbox odgovorErr
	msgbox o.OdgovorGreska
	msgbox o.OdgovorGreskaStatus
	msgbox o.DohvatiGresku(o.OdgovorGreska)
End If
On Error Goto 0	


Err.Clear
On Error Resume Next


o.TimeOut=10
odgovor=o.PosaljiSoapPoruku(xml,"FISKAL 1")
If Err.Number <> 0 Then
	msgbox Err.Number
	msgbox o.OdgovorGreskaStatus

End If
On Error Goto 0

 


Kako provjeriti da li COM DLL radi kako treba?

Da vidite da li COM radi kako treba u okruženju koje koristite postoji metoda "TestCOM", poziva se:

Dim o
 
Set o = CreateObject("Raverus.FiskalizacijaDEV.COM.CentralniInformacijskiSustav")
msgbox o.TestCom("Moj test")

 

Ovaj će mali primjer pozvati message box sa "Moj test" ako je sve ok - ovo je svakako prvi, preporučeni korak, u testiranju. Ako ovo radi, onda i COM DLL radi :)

 

 

Primjeri iz VBA za Excel

Dim zki

zki = IzracunajZki("44718633471", Now, "1", "1", "1", 12.5)

Dim jir As String
Dim datumVrijemeIzdavanja As Date

datumVrijemeIzdavanja = Now

jir = PosaljiRacun("44718633471", datumVrijemeIzdavanja, "P", "1", "1", "1", 25, 10, 2.5, 12.5, "G", "00000000000", "0")

Function IzracunajZki(Oib As String, datumVrijemeIzdavanja As Date, BrojcanaOznakaRacuna As String, OznakaPoslovnogProstora As String, OznakaNaplatnogUredaja As String, UkupanIznos As Double) As String
    Dim zki As String
    
    Set o = CreateObject("Raverus.FiskalizacijaDEV.COM.CentralniInformacijskiSustav")
    
    zki = o.ZastitniKodIzracun("FISKAL 1", Oib, Format(datumVrijemeIzdavanja, "dd.MM.yyyy HH:mm:ss"), BrojcanaOznakaRacuna, OznakaPoslovnogProstora, OznakaNaplatnogUredaja, Replace(Format(UkupanIznos, "#.00"), ",", "."))
            
            
    IzracunajZki = zki
End Function

Function PosaljiRacun(Oib As String, datumVrijemeIzdavanja As Date, OznakaSlijednosti As String, BrojcanaOznakaRacuna As String, OznakaPoslovnogProstora As String, OznakaNaplatnogUredaja As String, PdvStopa As Double, PdvOsnovica As Double, PdvIznos As Double, UkupanIznos As Double, NacinPlacanja As String, OibOperatera As String, NaknadnaDostavaRacuna As String) As String
    Dim o
    Dim jir
    Dim datumVrijeme As String
    Dim zki As String
    
    datumVrijeme = Format(Now, "dd.MM.yyyyTHH:mm:ss")
    
    Set o = CreateObject("Raverus.FiskalizacijaDEV.COM.CentralniInformacijskiSustav")
    o.TimeOut = 30 * 1000
    o.CisUrl = ""
    o.NazivAutoGeneriranje = True
    o.NazivMapeZahtjev = "c:\fiskalizator\Zahtjevi"
    o.NazivMapeOdgovor = "c:\fiskalizator\Odgovori"
            
    zki = IzracunajZki(Oib, datumVrijemeIzdavanja, BrojcanaOznakaRacuna, OznakaPoslovnogProstora, OznakaNaplatnogUredaja, UkupanIznos)
    
    
    Dim xml As String
    
    xml = "<?xml version=""1.0"" encoding=""utf-8""?><tns:RacunZahtjev xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" Id=""signXmlId"" xmlns:tns=""http://www.apis-it.hr/fin/2012/types/f73"">" + _
    "<tns:Zaglavlje><tns:IdPoruke>" + o.GenerirajUuid() + "</tns:IdPoruke>" + _
    "<tns:DatumVrijeme>" + datumVrijeme + "</tns:DatumVrijeme>" + _
    "</tns:Zaglavlje><tns:Racun><tns:Oib>" + Oib + "</tns:Oib>" + _
    "<tns:USustPdv>true</tns:USustPdv>" + _
    "<tns:DatVrijeme>" + Format(datumVrijemeIzdavanja, "dd.MM.yyyyTHH:mm:ss") + "</tns:DatVrijeme>" + _
    "<tns:OznSlijed>" + OznakaSlijednosti + "</tns:OznSlijed>" + _
    "<tns:BrRac><tns:BrOznRac>" + BrojcanaOznakaRacuna + "</tns:BrOznRac>" + _
    "<tns:OznPosPr>" + OznakaPoslovnogProstora + "</tns:OznPosPr>" + _
    "<tns:OznNapUr>" + OznakaNaplatnogUredaja + "</tns:OznNapUr>" + _
    "</tns:BrRac><tns:Pdv><tns:Porez><tns:Stopa>" + Replace(Format(PdvStopa, "#.00"), ",", ".") + "</tns:Stopa>" + _
    "<tns:Osnovica>" + Replace(Format(PdvOsnovica, "#.00"), ",", ".") + "</tns:Osnovica>" + _
    "<tns:Iznos>" + Replace(Format(PdvIznos, "#.00"), ",", ".") + "</tns:Iznos>" + _
    "</tns:Porez></tns:Pdv><tns:IznosUkupno>" + Replace(Format(UkupanIznos, "#.00"), ",", ".") + "</tns:IznosUkupno>" + _
    "<tns:NacinPlac>" + NacinPlacanja + "</tns:NacinPlac>" + _
    "<tns:OibOper>" + OibOperatera + "</tns:OibOper>" + _
    "<tns:ZastKod>" + zki + "</tns:ZastKod>" + _
    "<tns:NakDost>" + NaknadnaDostavaRacuna + "</tns:NakDost></tns:Racun></tns:RacunZahtjev>"
    
    
    Dim odgovor

    On Error Resume Next
    Err.Clear
    odgovor = o.PosaljiSoapPoruku(xml, "FISKAL 1")
    If Err.Number <> 0 Then
        jir = ""
        MsgBox o.DohvatiGresku(o.OdgovorGreska)
    Else
        jir = o.DohvatiJir(odgovor)
    End If
    On Error GoTo 0
    ' MsgBox odgovor

    Err.Clear
    On Error Resume Next
    
    PosaljiRacun = jir
End Function

Sub PosaljiPoslovniProstor(Oib As String, OznakaPoslovnogProstora As String, Ulica As String, Kbr As String, DodatakKbr As String, BrojPoste As String, Naselje As String, Opcina As String, RadnoVrijeme As String, DatumPocetkaPrimjene As String, OznakaZatvaranja As String, SpecificnaNamjena As String)
    Dim o
    Dim datumVrijeme As String
    
    datumVrijeme = Format(Now, "dd.MM.yyyyTHH:mm:ss")
    
    Set o = CreateObject("Raverus.FiskalizacijaDEV.COM.CentralniInformacijskiSustav")
    o.TimeOut = 30 * 1000
    o.CisUrl = ""
    o.NazivAutoGeneriranje = True
    o.NazivMapeZahtjev = "c:\fiskalizator\Zahtjevi"
    o.NazivMapeOdgovor = "c:\fiskalizator\Odgovori"
            
    Dim xml As String
    
    xml = "<?xml version=""1.0"" encoding=""utf-8""?>" + _
        "<tns:PoslovniProstorZahtjev xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" Id=""signXmlId"" xmlns:tns=""http://www.apis-it.hr/fin/2012/types/f73"">" + _
        "<tns:Zaglavlje><tns:IdPoruke>" + o.GenerirajUuid() + "</tns:IdPoruke>" + _
        "<tns:DatumVrijeme>" + datumVrijeme + "</tns:DatumVrijeme>" + _
        "</tns:Zaglavlje><tns:PoslovniProstor><tns:Oib>" + Oib + "</tns:Oib>" + _
        "<tns:OznPoslProstora>" + OznakaPoslovnogProstora + "</tns:OznPoslProstora>" + _
        "<tns:AdresniPodatak><tns:Adresa><tns:Ulica>" + Ulica + "</tns:Ulica>" + _
        "<tns:KucniBroj>" + Kbr + "</tns:KucniBroj>" + _
        "<tns:KucniBrojDodatak>" + DodatakKbr + "</tns:KucniBrojDodatak>" + _
        "<tns:BrojPoste>" + BrojPoste + "</tns:BrojPoste>" + _
        "<tns:Naselje>" + Naselje + "</tns:Naselje>" + _
        "<tns:Opcina>" + Opcina + "</tns:Opcina>" + _
        "</tns:Adresa></tns:AdresniPodatak><tns:RadnoVrijeme>" + RadnoVrijeme + "</tns:RadnoVrijeme>" + _
        "<tns:DatumPocetkaPrimjene>" + DatumPocetkaPrimjene + "</tns:DatumPocetkaPrimjene></tns:PoslovniProstor></tns:PoslovniProstorZahtjev>"
    
    Dim odgovor

    On Error Resume Next
    Err.Clear
    odgovor = o.PosaljiSoapPoruku(xml, "FISKAL 1")
    If Err.Number <> 0 Then
        MsgBox o.DohvatiGresku(o.OdgovorGreska)
    End If
    On Error GoTo 0
    MsgBox odgovor

    Err.Clear
    On Error Resume Next
    
End Sub

Sub PosaljiEcho()
    Dim o
    
    Set o = CreateObject("Raverus.FiskalizacijaDEV.COM.CentralniInformacijskiSustav")
    MsgBox o.PosaljiEcho("")
End Sub

 

VAŽNOObratiti pažnju na OIB, koji mora biti isti kao i OIB u FISKAL certifikatu. Naravno, UUID, datum i vrijeme i ostale informacije se isto dinamički generiraju i svaki su puta drugačije.

Kod priprema XML-a, obratite pažnju na Id="signXmlId" uz RacunZahtjev ili PoslovniProstorZahtjev - ovaj podatak rutini za potpisivanje "objašnjava" koji dio XML poruke treba digitalno potpisati.

Last edited Feb 7, 2013 at 4:55 PM by nrasinec, version 7

Comments

grizwako Dec 13, 2012 at 1:23 PM 
dambach, uzmi property $com->OdgovorGreska u tom slucaju. U slucaju exceptiona ti se vrati ta poruka o erroru 500, no zapravo to niej slucaj, samo trebas ocitat "OdgovorGreska".

dambach Dec 13, 2012 at 10:14 AM 
pozdrav,
jucerasnje greske uspio sam rijesiti instalacijom frameworka v2.050727 (imao sam 4.0.30319)
izracun zastitnog koda radi kao i potpisivanje xml-a ,no sve posalji funkcije javljaju mi slijedecu
gresku:
Error Code: The remote server returned an error (500) Internal Server Error
verifikacijski /root samopotpisni certifikat imam instaliran u Trusted Root Certification Authorities
kakva ideja ?
hvala

dambach Dec 12, 2012 at 1:26 PM 
Postovanje,
koristim Visual Object 2.7 ,skinuo sam com dll implementirao ,echo mi prolazi ali PosaljiSoapPoruku
mi javlja slijedece "Could not load file or assembly 'Raverus.FiskalizacijaDEV,Version=1.2.4694.19363,Culture=neutral,PublicKeyToken=5483b372e7c94269'
or one of its dependencies.The system cannot find the file specified.
Subsystem: Raverus.FiskalizacijaDev.COM

Nerman Dec 3, 2012 at 12:41 PM 
Za vb6, vb5 i sl. je potrebno registrovati dll sa /tlb opcijom, inace se ne moze dodati referenca.. To je korak 2, u uputama za registraciju:
Registrirajte ga koristeći RegAsm.exe utility: C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe Raverus.FiskalizacijaDEV.COM.dll /codebase /tlb

nrasinec Dec 1, 2012 at 10:43 AM 
Komentari postavljeni na stranicu dokumentacije ne dolaze automatski na e-mail, tako da ih ignoriramo; molim da sva pitanja postavljate na Discussions.

kodak Nov 29, 2012 at 11:23 AM 
Pozdrav svima,
ja imam sličan problem kao i sanjink, dakle registrirao sam Raverus.FiskalizacijaDEV.COM.dll ali ne vidim niti jednu metodu (za bilo koju metodu koju pozovem dobijem "Member not found").

dankoh Nov 27, 2012 at 1:34 PM 
Poštovanje!
Molim pomoc ako moze u vezi com dll-a i VB6. Registrirao sam dll i napravio tlb i radi sve ok. I echo i slanje racuna i ostalo.
Problem je u tome da ne mogu vidjeti funkcije/membere klase CentralniInformacijskiSustav u ObjectBrowseru.

Dakle vidim library Raverus_FiskalizacijaDEV_COM i vidim klasu CentralniInformacijskiSustav ali ne vidim members u kalsi. Da li je to moguce slozit na koji nacin?

Postoji li kakav doc sa funkcijama u dll-u?

sanjink Nov 13, 2012 at 9:21 PM 
Poštovanje @nrasic, zanima me u COM DLL- u koji koristim za VB6, kakva je razlika u praksi sto se tice funkcija PosaljiSoapPoruku i PosaljiSoapPorukuCertifikatDatoteka? lp, sanjin

sanjink Nov 13, 2012 at 8:42 PM 
Napravio sam tlb fajl i sve je super. Stvar je u tome sto ja imam 64 bit windows 7 sustav i da treba koristiti 32bit inacicu regasm koja se nalazi na C:\Windows\Microsoft.NET\Framework\v2.0.50727 i na taj nacin se tlb vidi u VB6 pod References.

z3computers Nov 12, 2012 at 5:22 PM 
Probaj napraviti tlb file ... pokreni cmd ... pokrreni RegAsm.exe /tlb filename ( npr: C:\Control\ Raverus.FiskalizacijaDEV.COM.dll ) i onda taj file može ubaciti u VB6 kroz References ...

sanjink Nov 12, 2012 at 2:40 PM 
Poštovanje, skinuo sam com dll i registrirao ga kako pise, medjutim kad pokrenem VB6 aplikaciju, ne vidim com dll pod "References...". Koristim VB6 kao razvojno rjesenje svoje kase, medjutim probao sam u visual studio 2005 kreirati exe pa sam pod references uvidio da tu taj type library postoji ali ne u COM, nego u .NET odjeljku. Sta da radim?