» »

Davčne blagajne

Davčne blagajne

««
8 / 27
»»

prtenjam ::

Na win 8.1 telefonu deluje vse OK, kodo skenira pravilno in tudi vse podatke pravilno razbere (ZOI, davčno, datum in čas)
Matjaž Prtenjak
https://mnet.si

trstenjak ::

Popravek, začetek izdajanja digitalnih potrdil se je prestavil na 15. november, ker še niso uspeli dokončati portala za prevzemanje potrdil.

Tech2k ::

Imam težave pri skeniranju code128 ker jo skener ne prebere, najpej sem mislil da je predolga in sem jo razbil na tri vrstice vsaka ima svojo bar kodo pa je še vedno problem. Ali je za POS termalni priter 23 znakov še vedno preveč?

pix ::

Tech2k je izjavil:

Imam težave pri skeniranju code128 ker jo skener ne prebere, najpej sem mislil da je predolga in sem jo razbil na tri vrstice vsaka ima svojo bar kodo pa je še vedno problem. Ali je za POS termalni priter 23 znakov še vedno preveč?


meni dela ok na code128, pa si dal tiste kontrolke spredaj, 41,42,43... ali pa če so štiri kode 441,442,443...? Ampak na nobenem pos tiskalniku mi ni ratalo v eno spravit, minimalno v 2 pa do 6...

zipposi ::

Pozdrav vsem!

XML vprašanje glede izdaje računov - čemu služita tag ExemptVATTaxableAmount in NontaxableAmount?

V bistvu, kakšna je razlika če izdajatelj računa je ali pa ni DDV zavezanec?

atlet ::

Si uspel rešiti podpis v PHP-ju?
Ok še eno vprašanje (upam da bom tole čimprej razrešil, ker mam počasi že občutek, da se mi meša)...

Torej dobil sem odgovor od FURSa glede tega digitalnega podpisa in odgovor se je glasil:
"namespace je potrebno navesti v envelope, v prilogi je primer pravilnega xml."

Priložena datoteka dejansko gre skoz če jo pposkusim poslati, kar pa me zanima je sledeče:
Kje je razlika med njihovo in mojo datoteko oziroma, kako/kje moram definirati namespace v Envelope?

Moja datoteka (NI OK):
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:fu="http://www.fu.gov.si/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
 	<SOAP-ENV:Body>
 		<fu:BusinessPremiseRequest Id="test">
 			<fu:Header>
 				<fu:MessageID>2E1B49B0-F007-4AAB-9824-5B85FBD08BE7</fu:MessageID>
 				<fu:DateTime>2015-09-15T10:41:04Z</fu:DateTime>
 			</fu:Header>
			<fu:BusinessPremise>
 				<fu:TaxNumber>10041052</fu:TaxNumber>
 				<fu:BusinessPremiseID>TRGOVINA1</fu:BusinessPremiseID>
 				<fu:BPIdentifier>
 					<fu:RealEstateBP>
 						<fu:PropertyID>
 							<fu:CadastralNumber>365</fu:CadastralNumber>
 							<fu:BuildingNumber>12</fu:BuildingNumber>
 							<fu:BuildingSectionNumber>3</fu:BuildingSectionNumber>
 						</fu:PropertyID>
 						<fu:Address>
 							<fu:Street>Cankarjeva</fu:Street>
 							<fu:HouseNumber>12</fu:HouseNumber>
 							<fu:HouseNumberAdditional>A</fu:HouseNumberAdditional>
 							<fu:Community>Ljubljana</fu:Community>
 							<fu:City>Ljubljana</fu:City>
 							<fu:PostalCode>1000</fu:PostalCode>
 						</fu:Address>
 					</fu:RealEstateBP>
  				</fu:BPIdentifier>
				<fu:ValidityDate>1990-08-25</fu:ValidityDate>
  				<fu:SoftwareSupplier>
 					<fu:TaxNumber>42839521</fu:TaxNumber>
 				</fu:SoftwareSupplier>
 			</fu:BusinessPremise>
 		<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/><Reference URI="#test"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>mFKM1Fc5i3UsIs1t2NVO7CdcaIE0y/pdSRIBR5gGOWI=</DigestValue></Reference></SignedInfo><SignatureValue>Gz350EuSHz8Cpet64vNxk7gLtdWEeXJXaymMIOFgJas3hnVsR0ND+8D+eNoWKtVuqcR3XeXMqVQAm3VekEjmdUhqqs0gegxJXVNFFIAylU9NnQ49Dn2Hgq5pvRvZ1TGT66xC/GKKKYqqXYLvR4IbYipMD2Xf1Sn8lgth7WL2aitAKNdkFVtjI1S/QAqh+IL/AZQEUlgT/6S7TuK8zzZNXm8n8YQWWUxavc8HNHSlJe73X9iSvHyoL8PNiuBRUw467GOgk+K9cMyu3ShpS6h8zRkrrYqHog3FhqKbWn+zCJwnc/vU7I115kYDNJQL2XA+jqXAm9cAIYNnKbAP98Y8Mw==</SignatureValue><KeyInfo><X509Data><X509IssuerSerial><X509IssuerName>C=SI,O=state-institutions,CN=Tax CA Test</X509IssuerName><X509SerialNumber>6272978640195208819</X509SerialNumber></X509IssuerSerial><X509SubjectName>C=SI O=state-institutions OU=DavPotRacTEST OU=10041052 serialNumber=1 CN=TESTNO PODJETJE 108</X509SubjectName></X509Data></KeyInfo></Signature></fu:BusinessPremiseRequest>
 	</SOAP-ENV:Body>
 </SOAP-ENV:Envelope>


njihova datoteka (JE OK):
<?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:fu="http://www.fu.gov.si/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
  <SOAP-ENV:Body>
    <fu:BusinessPremiseRequest Id="test">
      <fu:Header>
        <fu:MessageID>004464d8-8cd0-47a9-9445-9c28a1dd6230</fu:MessageID>
        <fu:DateTime>2015-09-18T08:07:55</fu:DateTime>
      </fu:Header>
      <fu:BusinessPremise>
        <fu:TaxNumber>10041052</fu:TaxNumber>
        <fu:BusinessPremiseID>TRGOVINA1</fu:BusinessPremiseID>
        <fu:BPIdentifier>
          <fu:RealEstateBP>
            <fu:PropertyID>
              <fu:CadastralNumber>365</fu:CadastralNumber>
              <fu:BuildingNumber>12</fu:BuildingNumber>
              <fu:BuildingSectionNumber>3</fu:BuildingSectionNumber>
            </fu:PropertyID>
            <fu:Address>
              <fu:Street>Cankarjeva</fu:Street>
              <fu:HouseNumber>12</fu:HouseNumber>
              <fu:HouseNumberAdditional>A</fu:HouseNumberAdditional>
              <fu:Community>Ljubljana</fu:Community>
              <fu:City>Ljubljana</fu:City>
              <fu:PostalCode>1000</fu:PostalCode>
            </fu:Address>
          </fu:RealEstateBP>
        </fu:BPIdentifier>
        <fu:ValidityDate>1990-08-25</fu:ValidityDate>
        <fu:SoftwareSupplier>
          <fu:TaxNumber>42839521</fu:TaxNumber>
        </fu:SoftwareSupplier>
      </fu:BusinessPremise>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /><Reference URI="#test"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /><DigestValue>4Nbm+rDcS9VTvgh157wD87iVCNZ/E8yFRnnlaK6Huzg=</DigestValue></Reference></SignedInfo><SignatureValue>AlatazD7NTKiMTB3KkSzybbQsbvEDmK924dEh/OrbnH1SOFKIVwCAY7Uq/n4pBcyHgOTrps5HGMWj0YcFYxoCgvaPVDJM5uvZNhnrvNIotWHoFzyifVl2jNiZEuc/+iDJywDji+OOc5mFu/RL7aDIfjFrw99xM2rJui0CC8AiU/fVwDTNSsy0PW3iRIgwqsR8E+f90ByVY4xsYM3GQw66ET/Mo/QWG1O5vUQ3F5TkJE1O5/jw3k+m7FYMIFUqNRtlx0sOm4UfmEWY+69uQMp0QPm64wKydsbm1f5NiriHqj7llmTMl7e9ZMZCy8GH/15oNLSfgSimUaqLB6ASlkiig==</SignatureValue><KeyInfo><X509Data><X509IssuerSerial><X509IssuerName>CN=Tax CA Test, O=state-institutions, C=SI</X509IssuerName><X509SerialNumber>6272978640195208819</X509SerialNumber></X509IssuerSerial><X509SubjectName>CN=TESTNO PODJETJE 108, SERIALNUMBER=1, OU=10041052, OU=DavPotRacTEST, O=state-institutions, C=SI</X509SubjectName></X509Data></KeyInfo></Signature></fu:BusinessPremiseRequest>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Kje je razlika? Kako drugače je v njihovi datoteki definiran kak namespace kot pa v moji? ...
Enostaven program za fakturiranje -> www.quibi.net

Strato5 ::

atlet je izjavil:

Si uspel rešiti podpis v PHP-ju?


Ja imam rešeno in mi zaenrkat deluje.

sicer trenutno imam nastavljeno verifypeer pa verifyhost oboje na false (nikjer ni explicitno rečeno, da je to obvezno).
Za testiranje je OK pa če mi ne uspe nič pogruntat glede tega, lahko grem tudi na produkcijo s temi nastavitvami (nisem pretirano paranoičen) :D

atlet ::

Kaj pa je bilo narobe, da ti je vračalo napako: "Digitalni podpis ni ustrezen"?

Strato5 je izjavil:

atlet je izjavil:

Si uspel rešiti podpis v PHP-ju?


Ja imam rešeno in mi zaenrkat deluje.

sicer trenutno imam nastavljeno verifypeer pa verifyhost oboje na false (nikjer ni explicitno rečeno, da je to obvezno).
Za testiranje je OK pa če mi ne uspe nič pogruntat glede tega, lahko grem tudi na produkcijo s temi nastavitvami (nisem pretirano paranoičen) :D
Enostaven program za fakturiranje -> www.quibi.net

veqlargh ::

atlet: 2015-09-15T10:41:04Z... Z je odveč. Vrž ven in poizkusi zopet. Mene je čas jebal (sem pozabil T dodajat) in mi je tud tako napako glupo metalo. Slab opis, lahko bi bolje to povedali kaj serje.

MesecB ::

Tudi sam rabim malo pomoči.
Delam v php.
Pri invoices/register mi vedno javlja napako: S003 : Digitalni podpis ni ustrezen
Ne razumem kaj je potrebno podpisati: ovojnico, BusinessPremiseRequest, BusinessPremise ...
Hvala za nasvet oz. če mi kdo "posodi ta del kode" ?
Če bo špilalo seveda lahko nekaj primaknem za trud...
hvala.

veqlargh ::

Saj piše, glavni element moraš, torej BusinessPremiseRequest. Ta ima Id=test... In tudi temu elementu moraš podpis dodat.

MesecB ::

Hvala, sem imel tako, pa še vedno ne gre skozi: (S003 : Digitalni podpis ni ustrezen)
request

zipposi ::

zipposi je izjavil:

Pozdrav vsem!

XML vprašanje glede izdaje računov - čemu služita tag ExemptVATTaxableAmount in NontaxableAmount?

V bistvu, kakšna je razlika če izdajatelj računa je ali pa ni DDV zavezanec?


Nihče..?

atlet ::

Hvala, sem odstranil Z, vendar je napaka še vedno enaka. Podpisujem pa po teh navodilih: http://www.di-mgt.com.au/xmldsig2.html

veqlargh je izjavil:

atlet: 2015-09-15T10:41:04Z... Z je odveč. Vrž ven in poizkusi zopet. Mene je čas jebal (sem pozabil T dodajat) in mi je tud tako napako glupo metalo. Slab opis, lahko bi bolje to povedali kaj serje.


CURLOPT_CAINFO => getcwd() . '/sitest-ca.pem', to dodaj, pa bi moralo delati.

Strato5 je izjavil:

atlet je izjavil:

Si uspel rešiti podpis v PHP-ju?


Ja imam rešeno in mi zaenrkat deluje.

sicer trenutno imam nastavljeno verifypeer pa verifyhost oboje na false (nikjer ni explicitno rečeno, da je to obvezno).
Za testiranje je OK pa če mi ne uspe nič pogruntat glede tega, lahko grem tudi na produkcijo s temi nastavitvami (nisem pretirano paranoičen) :D
Enostaven program za fakturiranje -> www.quibi.net

Zgodovina sprememb…

  • spremenil: atlet ()

PrimozHisof ::

zipposi je izjavil:

Pozdrav vsem!

XML vprašanje glede izdaje računov - čemu služita tag ExemptVATTaxableAmount in NontaxableAmount?

V bistvu, kakšna je razlika če izdajatelj računa je ali pa ni DDV zavezanec?


ExemptVATTaxableAmount - tu vpišeš, če izdajatelj ni zavezanec! Elemente, kjer je DDV pa izpustiš.

zipposi ::

Hvala!

bojanp ::

Pozdravljeni!

Pri nas pripravljamo za izdajo računov web aplikacijo. Zanima me, če obstaja enostavna rešitev za tiskanje pripravljenega pdf računa na lokalni tiskalnik brez prikaza tega računa v web browzerju? Kako boste reševali problem, da stranka ne sme istega računa natisniti večkrat, oziroma mora na vsaki kopiji pisati 'kopija n'. Ravno zaradi tega razloga se po moje pdf izpisa računa ne sme prikazati v browserju.
lp!

Zgodovina sprememb…

  • spremenil: bojanp ()

Strato5 ::

Mene pa zanima, če še komu tale app od FURSA za preverjanje QR kode dela kot je treba?

Meni namreč prebere QR kodo ok (prebrani string je isti kot če kodo preberemo s kakšnim drugim čitalcem QR kod in tudi je isti kot tisti s katerim smo kdo generirali (logično))
Ko pa aplikacija prikaže podatke, ki jih je dekodirala iz tega prebranega stringa, pa so napačni... davčna ima prvi znak premaknjen na konec (mogoče naključje in je zadnji znak vzet od kje drugje) datum je nekje za leto 2051 ipd...

Ali komu to uspešno prebere in dekodira?

zipposi ::

Jaz imam iPhone, bo tudi zanj pripravljena aplikacija za testiranje QR kode..? EČ ne bo, kako naj preverim to nesrečno kodo?

MesecB ::

Pozdravljeni,
Rabil še malo pomoči oz. namig kje naj iščem napako:

1) napaka Cannot find the declaration of element 'soapenv:Envelope se še vedno pojavlja. Primerjal s primerom v navodilih in ni razlike tukaj??

2) Reqest sicer pošljem pa vedno odgovor: S003 : Digitalni podpis ni ustrezen

Probal sem podpis validirati še sam preden pošljem request pa pri meni javi da je podpis ok.

openssl_sign($sigNodeXMLString, $signature, $raw_cert['pkey'], OPENSSL_ALGO_SHA256);

$nok=openssl_verify ( $sigNodeXMLString , $signature , $npublick,"sha256WithRSAEncryption" );

Linki:
Nepodpisan
Podpisan
probal sem na 2 različnih web serverjih. pa vedno ista napaka.
za nasvet se vam zahvaljujem
Bojan

Zgodovina sprememb…

  • spremenilo: MesecB ()

atlet ::

Sem obupal nad xml-ji, saj ni šel skozi podpis. Sem naredil v json-u in deluje super. :)

MesecB je izjavil:

Pozdravljeni,
Rabil še malo pomoči oz. namig kje naj iščem napako:

1) napaka Cannot find the declaration of element 'soapenv:Envelope se še vedno pojavlja. Primerjal s primerom v navodilih in ni razlike tukaj??

2) Reqest sicer pošljem pa vedno odgovor: S003 : Digitalni podpis ni ustrezen

Probal sem podpis validirati še sam preden pošljem request pa pri meni javi da je podpis ok.

openssl_sign($sigNodeXMLString, $signature, $raw_cert['pkey'], OPENSSL_ALGO_SHA256);

$nok=openssl_verify ( $sigNodeXMLString , $signature , $npublick,"sha256WithRSAEncryption" );

Linki:
Nepodpisan
Podpisan
probal sem na 2 različnih web serverjih. pa vedno ista napaka.
za nasvet se vam zahvaljujem
Bojan
Enostaven program za fakturiranje -> www.quibi.net

peterv6i ::

Pozdrav vsem,
Ali ima kdo težavo s preverjanjem XML-ov po XSD shemi furs-a?
Namreč karkoli preverim dobim napako:
InvalidRegex: Pattern Value '\d{4}[-]\d{2}[-]\d{2}' Is Not A Valid Regular Expression. The Reported Error Was: ''-' Is An Invalid Character Range. Write '\-'.'.

Je pa zanimivo to, da v kolikor prenesem xml v FURS gre ta skozi brez kakršne koli napake (SOAP-UI)...

Drugo jajce je pa certifikat...
Zadevo sem spisal v Javi kot java stored proceduro na Oracle bazi... vse lepo in prav dokler ne pridem do vzpostavitve http povezave preko oracle wallet-a (tle pa nisem prišel skozi (baza 11g))..
Razmišljam, da bi https povezavo pravtako vzpostavil kar preko java stored procedure na bazi vendar bo "potrebno" uvozit certifikat v java keystore... (če je kdo uvažal furs-ov certifikat, ga bi prosil za kontakt (ker kot vem je v njem (private key in server key) povezava pa mora biti avtenticirana preko private key-a (kakor pravijo na FURS-u)...
V septembru mesecu mi pa je delovala povezava kar s certifikatom, ki smo ga sneli preko browserja (s spletne strani kjer so objavljeni webservisi)...

lp
Peter

veqlargh ::

peterv6i: jaz sem se najprej jebal z JAX-WS klientom, mi ni hotel z ničemer zgenerirat klienta (AXIS2, CXF) in sem mel poln k... pa sem potem naredil preko HttpClienta in sam generiram te zahteve... ni prva izbira ampak se mi je podobno dogajalo, kar ene napake pri generiranju. Pa nisem pipal WSDL-jev in XSD-jev.

Sicer mi sedaj validacija deluje (validiram request preden pošljem, odgovorov ne). SOAP-UI tudi meni deloval OK.

peterv6i ::

Ok.. ampak če se povežem na http://www.freeformatter.com/xml-valida... in noter paste-am xml iz fursovih primerov in XSD shemo iz fursove strani mi javi napako...
!?

XML-je sestavljam "ročno" konkateniram stringe ker delam v PL/sql-u na bazi..
XML-ji so vsebinsko ok.. problem je validacija in problem je pošiljanje na FURS preko baze ker mi ga oracle wallet sračka..

Validacija kot pravim mi odleti z napako:
InvalidRegex: Pattern Value '\d{4}[-]\d{2}[-]\d{2}' Is Not A Valid Regular Expression. The Reported Error Was: ''-' Is An Invalid Character Range. Write '\-'.'.

to pa je za :
message_id 23CBC4DF-D9EF-563C-E053-0CC910AC7BBA

tega pa generiram kar na bazi...
select regexp_replace(sys_guid(), '([[:alnum:]]{8})([[:alnum:]]{4})([[:alnum:]]{4})([[:alnum:]]{4})([[:alnum:]]+)$', '\1-\2-\3-\4-\5')
into l_message_id
from dual;

recimo:
to je validacija:
 validacija

validacija



To je pa prenos v furs kjer gre zadeva skozi brez težav...
 furs

furs



preverjam pa po tej shemi: http://www.datoteke.fu.gov.si/dpr/files...

V Javi je validacija isti šmoren..
 validacijajava

validacijajava

Zgodovina sprememb…

  • spremenilo: peterv6i ()

mcfri ::

Strato5 je izjavil:

Mene pa zanima, če še komu tale app od FURSA za preverjanje QR kode dela kot je treba?

Meni namreč prebere QR kodo ok (prebrani string je isti kot če kodo preberemo s kakšnim drugim čitalcem QR kod in tudi je isti kot tisti s katerim smo kdo generirali (logično))
Ko pa aplikacija prikaže podatke, ki jih je dekodirala iz tega prebranega stringa, pa so napačni... davčna ima prvi znak premaknjen na konec (mogoče naključje in je zadnji znak vzet od kje drugje) datum je nekje za leto 2051 ipd...

Ali komu to uspešno prebere in dekodira?


Dodaš vodilno ničlo, če zakodiran ZOI ni dovolj dolg?

Meni tudi prej ni delovalo in je bila zmešnjava z datumi, po updejtu aplikacija deluje kot mora. No, moje kode dekodira pravilno :-)

mpss ::

prtenjam je izjavil:

Grrr...

Trudim se 2 uri potem pa napišem vprašanje in mi kapne. Če bo torej še kdo imel podobne težave; objekt CspParemeters ima polje Flags in tam je potrebno povedati, naj uporablja ključe iz druge shrambe; torej:

cspParameters.Flags |= CspProviderFlags.UseMachineKeyStore;


Ojej! Sem se včeraj mučil cel večer. Vse je delovalo dokler nisem hotel zadevo prožiti iz service-a (in certifikata shranjenega v machine store). Danes pa najdem tole... HVALA!!! Tudi meni ste prihranili kar nekaj ur :-).

lp, Marko

peterv6i ::

Se mantram v javi, da bi naredi https povezavo ampak mi ne rata... (brez kakšnih zunanjih knjižnic)

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.KeyManagementException;

import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

/**
 *
 * @author peterv
 */
public class KeystoreHTTPS {

    public KeystoreHTTPS() throws FileNotFoundException {
        try {

            System.out.println("Begin");
          
            URL url = new URL("https://blagajne-test.fu.gov.si:9002/v1/cash_registers");
            String USER_AGENT = "Mozilla/5.0";
            String keyStore = "c:/cert/10031685-1.p12";
            String keyStorePassword = "GesloXXX";
            String keyPassword = "GesloXXX";
            String KeyStoreType = "PKCS12";
            String KeyManagerAlgorithm = "SunX509";
            String SSLVersion = "SSLv3";
            HttpsURLConnection con = getHttpsURLConnection(url, keyStore, keyStorePassword, keyPassword, KeyStoreType, KeyManagerAlgorithm, SSLVersion);

            //add reuqest header
		con.setRequestMethod("POST");
		con.setRequestProperty("User-Agent", USER_AGENT);
		con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");

		String urlParameters = "sn=C02G8416DRJM&cn=&locale=&caller=&num=12345";
		
		// Send post request
		con.setDoOutput(true);
		DataOutputStream wr = new DataOutputStream(con.getOutputStream());
		wr.writeBytes(urlParameters);
		wr.flush();
		wr.close();

		int responseCode = con.getResponseCode();
		System.out.println("\nSending 'POST' request to URL : " + url);
		System.out.println("Post parameters : " + urlParameters);
		System.out.println("Response Code : " + responseCode);

		BufferedReader in = new BufferedReader(
		        new InputStreamReader(con.getInputStream()));
		String inputLine;
		StringBuffer response = new StringBuffer();

		while ((inputLine = in.readLine()) != null) {
			response.append(inputLine);
		}
		in.close();
		
		//print result
		System.out.println(response.toString());
                
        } catch (Exception ex) {
            Logger.getLogger(KeystoreHTTPS.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static HttpsURLConnection getHttpsURLConnection(URL url, String keystore,
            String keyStorePass, String keyPassword, String KeyStoreType, String KeyManagerAlgorithm, String SSLVersion)
            throws NoSuchAlgorithmException, KeyStoreException,
            CertificateException, FileNotFoundException, IOException,
            UnrecoverableKeyException, KeyManagementException {
        System.setProperty("javax.net.debug", "ssl,handshake,record");

        SSLContext sslcontext = SSLContext.getInstance(SSLVersion);
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerAlgorithm);
        KeyStore ks = KeyStore.getInstance(KeyStoreType);
        ks.load(new FileInputStream(keystore), keyStorePass.toCharArray());
        kmf.init(ks, keyPassword.toCharArray());

        TrustManagerFactory tmf = TrustManagerFactory
                .getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        TrustManager[] tm = tmf.getTrustManagers();

        sslcontext.init(kmf.getKeyManagers(), tm, null);
        SSLSocketFactory sslSocketFactory = sslcontext.getSocketFactory();
        HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);
        HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();

        return httpsURLConnection;
    }

    public static void main(String[] args) throws FileNotFoundException {
        KeystoreHTTPS a = new KeystoreHTTPS();

    }

}


ven dobim:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

krho ::

Khm.. String SSLVersion = "SSLv3"; KAJ!? Če tole furs podpira, pol je nekoga za ustrelit. Edino, kar bi moral bit podrto je TLS 1.1 in 1.2
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

peterv6i ::

Moja napaka.. TLS mora biti ja.. ampak vseglih se ne morem povezat...

Rozhy ::

peterv6i je izjavil:

Moja napaka.. TLS mora biti ja.. ampak vseglih se ne morem povezat...

V TrustManagerFactory naloži test-tls certifikat. V KeyManagerFactory pa kot si predvidel certifikat podjetja.

peterv6i ::

hvala "Rozhy"..

Evo tukaj je če kdo potrebuje pošiljanje Echo sporočila na FURS.. cerifikat podjetja si nastavite sami in pa geslo...


import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.security.KeyManagementException;

import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

public class KeystoreHTTPS {

    public KeystoreHTTPS() throws FileNotFoundException {
        try {

            System.out.println("Begin");

            URL url = new URL("https://blagajne-test.fu.gov.si:9002/v1/cash_registers");
            String USER_AGENT = "Mozilla/5.0";
            String keyStore = "C:\\cert\\10031685-1.p12";
            String keyStorePassword = "Geslo123#";
            String keyPassword = "Geslo123#";
            String KeyStoreType = "PKCS12";
            String KeyManagerAlgorithm = "SunX509";
            String SSLVersion = "TLS";
            HttpsURLConnection con = getHttpsURLConnection(url, keyStore, keyStorePassword, keyPassword, KeyStoreType, KeyManagerAlgorithm, SSLVersion);

            //add reuqest header
            con.setRequestMethod("POST");
            con.setRequestProperty("User-Agent", USER_AGENT);
            con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
            con.setRequestProperty("Content-type", "text/xml; charset=utf-8");
            con.setRequestProperty("SOAPAction","\"/echo\"");

            String xml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:fu=\"http://www.fu.gov.si/\">\n" +
"   <soapenv:Header/>\n" +
"   <soapenv:Body>\n" +
"      <fu:EchoRequest>130031{$1}</fu:EchoRequest>\n" +
"   </soapenv:Body>\n" +
"</soapenv:Envelope>";

            con.setDoOutput(true);
            OutputStream reqStream = con.getOutputStream();
            
            reqStream.write(xml.getBytes());

            int responseCode = con.getResponseCode();
            System.out.println("\nSending 'POST' request to URL : " + url);
           
            System.out.println("Response Code : " + responseCode);

            BufferedReader in = new BufferedReader(
                    new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            //print result
            System.out.println(response.toString());

        } catch (Exception ex) {
            Logger.getLogger(KeystoreHTTPS.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static HttpsURLConnection getHttpsURLConnection(URL url, String keystore,
            String keyStorePass, String keyPassword, String KeyStoreType, String KeyManagerAlgorithm, String SSLVersion)
            throws NoSuchAlgorithmException, KeyStoreException,
            CertificateException, FileNotFoundException, IOException,
            UnrecoverableKeyException, KeyManagementException {
        System.setProperty("javax.net.debug", "ssl,handshake,record");

        SSLContext sslcontext = SSLContext.getInstance(SSLVersion);
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerAlgorithm);
        KeyStore ks = KeyStore.getInstance(KeyStoreType);
        ks.load(new FileInputStream(keystore), keyStorePass.toCharArray());
        kmf.init(ks, keyPassword.toCharArray());

        //test-tls (2).cer
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        // From https://www.washington.edu/itconnect/security/ca/load-der.crt
        InputStream is = new FileInputStream("c:/cert/test-tls (2).cer");
        InputStream caInput = new BufferedInputStream(is);
        Certificate ca;
        try {
            ca = cf.generateCertificate(caInput);
            System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
        } finally {
            caInput.close();
        }
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        // Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        TrustManager[] tm = tmf.getTrustManagers();

        sslcontext.init(kmf.getKeyManagers(), tm, null);
        SSLSocketFactory sslSocketFactory = sslcontext.getSocketFactory();
        HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);
        HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();

        return httpsURLConnection;
    }

    public static void main(String[] args) throws FileNotFoundException {
        KeystoreHTTPS a = new KeystoreHTTPS();

    }

}

peterv6i ::

Tukaj je še primer za podpis xml-ja s certifikatom (poslovni prostor)..
kodo si pač priredite po potrebah..

ko končam bom objabil še java stored procedure, za podpis in pošiljanje dokumentov direkt iz oracle baze..


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URL;

import java.security.*;
import java.security.cert.X509Certificate;
import java.util.*;
import javax.xml.XMLConstants;


import javax.xml.crypto.dsig.*;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.keyinfo.*;
import javax.xml.crypto.dsig.spec.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.w3c.dom.*;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * Sign XML file.
 */
public class SignFileExample {

    
    

    public static void main(String[] args) throws Exception {
        String referenceURI = null;
        List transforms = null;
       
     
 
  
  
        String xml = "<soapenv:Envelope  xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:fu=\"http://www.fu.gov.si/\" xmlns:xd=\"http://www.w3.org/2000/09/xmldsig#\">\n"
                + "   <soapenv:Body>\n"
                + "    <fu:BusinessPremiseRequest Id=\"data\">\n"
                + "	<fu:Header>\n"
                + "		<fu:MessageID>20E148DC-5066-4D7B-E053-AA02010A3F8D</fu:MessageID>\n"
                + "		<fu:DateTime>2015-09-24T12:07:28</fu:DateTime>\n"
                + "	</fu:Header>\n"
                + "	<fu:BusinessPremise>\n"
                + "		<fu:TaxNumber>10031685</fu:TaxNumber>\n"
                + "		<fu:BusinessPremiseID>P001</fu:BusinessPremiseID>\n"
                + "		<fu:BPIdentifier>\n"
                + "			<fu:RealEstateBP>\n"
                + "				<fu:PropertyID>\n"
                + "					<fu:CadastralNumber>2606</fu:CadastralNumber>\n"
                + "					<fu:BuildingNumber>6967</fu:BuildingNumber>\n"
                + "					<fu:BuildingSectionNumber>1</fu:BuildingSectionNumber>\n"
                + "				</fu:PropertyID>\n"
                + "				<fu:Address>\n"
                + "					<fu:Street>ŠMARSKA CESTA</fu:Street>\n"
                + "					<fu:HouseNumber>7</fu:HouseNumber>\n"
                + "					<fu:HouseNumberAdditional>C</fu:HouseNumberAdditional>\n"
                + "					<fu:Community>KOPER</fu:Community>\n"
                + "					<fu:City>KOPER</fu:City>\n"
                + "					<fu:PostalCode>6000</fu:PostalCode>\n"
                + "				</fu:Address>\n"
                + "			</fu:RealEstateBP>\n"
                + "		</fu:BPIdentifier>\n"
                + "		<fu:ValidityDate>2010-09-24</fu:ValidityDate>\n"
                + "		<fu:SoftwareSupplier>\n"
                + "			<fu:TaxNumber>76562832</fu:TaxNumber>\n"
                + "		</fu:SoftwareSupplier>\n"
                + "		<fu:SpecialNotes>Primer prijave poslovnega prostora</fu:SpecialNotes>\n"
                + "	</fu:BusinessPremise>\n"
                + "</fu:BusinessPremiseRequest>"
                + "</soapenv:Body>\n"
                + "</soapenv:Envelope>";
               
        String outputFile = "c:/brisi/podpisanracun.xml";

        // Instantiate the document to be signed
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        dbFactory.setNamespaceAware(true);
        Document doc = (Document) dbFactory.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes()));
        Node node = doc.getElementsByTagName("fu:BusinessPremiseRequest").item(0);
        
        //fu:InvoiceRequest
        //fu:BusinessPremiseRequest

        
        KeyStore p12 = KeyStore.getInstance("pkcs12");
        p12.load(new FileInputStream("c:/cert/testfurs.p12"), "Geslo123#".toCharArray());
        Enumeration e = p12.aliases();
        String alias = (String) e.nextElement();
        System.out.println("Alias certifikata:" + alias);
        Key privateKey = p12.getKey(alias, "Geslo123#".toCharArray());

        KeyStore.PrivateKeyEntry keyEntry
                = (KeyStore.PrivateKeyEntry) p12.getEntry(alias, new KeyStore.PasswordProtection("Geslo123#".toCharArray()));

        X509Certificate cert = (X509Certificate) keyEntry.getCertificate();

        PublicKey publicKey = cert.getPublicKey();

        final XMLSignatureFactory sigFactory = XMLSignatureFactory.getInstance("DOM");
        // Create a Reference to the enveloped document
        Reference ref = sigFactory.newReference("#data",
                sigFactory.newDigestMethod(DigestMethod.SHA256, null),
                Collections.singletonList(sigFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)),
                null,
                null);

        
        SignedInfo si = sigFactory.newSignedInfo(sigFactory.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), sigFactory.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", null), Collections.singletonList(ref));

        // Create a KeyValue containing the RSA PublicKey 
        KeyInfoFactory keyInfoFactory = sigFactory.getKeyInfoFactory();
        X509IssuerSerial x509IssuerSerial = keyInfoFactory.newX509IssuerSerial(cert.getSubjectX500Principal().getName(), cert.getSerialNumber());

        List x509Content = new ArrayList();

        x509Content.add(cert.getSubjectX500Principal().getName());
        x509Content.add(x509IssuerSerial);

        KeyValue keyValue = keyInfoFactory.newKeyValue(publicKey);
        X509Data xd = keyInfoFactory.newX509Data(x509Content);

        // Create a KeyInfo and add the KeyValue to it
        KeyInfo keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(xd));

        // Create a DOMSignContext and specify the RSA PrivateKey and
        // location of the resulting XMLSignature's parent element
        DOMSignContext dsc = new DOMSignContext(
                privateKey,
                node
        );

        // Create the XMLSignature (but don't sign it yet)
        XMLSignature signature = sigFactory.newXMLSignature(si, keyInfo);

        // Marshal, generate (and sign) the enveloped signature
        signature.sign(dsc);

        // output the resulting document
        OutputStream os = new FileOutputStream("c:/brisi/PodpisanXml.xml");
        //ByteArrayOutputStream os = new ByteArrayOutputStream();
        Transformer trans = TransformerFactory.newInstance()
                .newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(os));
        os.flush();
        os.close();
        
       // System.out.println(new String(os.toByteArray()));
        System.out.println("preverjam xml");

        SchemaFactory fc = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = fc.newSchema(new URL("http://www.datoteke.fu.gov.si/dpr/files/wsdl_v1/FiscalVerificationSchema.xsd"));
        Validator validator = schema.newValidator();
        final List<SAXParseException> exceptions = new LinkedList<SAXParseException>();
        validator.setErrorHandler(new ErrorHandler() {
            @Override
            public void warning(SAXParseException exception) throws SAXException {
                exceptions.add(exception);
            }

            @Override
            public void fatalError(SAXParseException exception) throws SAXException {
                exceptions.add(exception);
            }

            @Override
            public void error(SAXParseException exception) throws SAXException {
                exceptions.add(exception);
            }
        });
        validator.validate(new StreamSource(new File(outputFile)));
        System.out.println(exceptions.toString());

    }

    private static void usage() {
        System.out.println("Usage: java SignFile <inputFile> <outputFile> [id|path|whole]");
    }
}

Zgodovina sprememb…

  • spremenilo: peterv6i ()

trstenjak ::

Kul, Peter.

veqlargh ::

peterv6i: S katero verzijo jave si to delal?

veqlargh ::

z 1.7 ne podpiše.

Zgodovina sprememb…

  • spremenil: veqlargh ()

veqlargh ::

Ja, isti problem, s katerim sem si razbijal glavo precej časa. Skratka, po verziji 1.6.2x (se mi zdi) so "zakomplicirali" obnašanje atributov. Treba je povedat XML-ju, da je atribut tipa ID in ne tipa string (nisem gledal kako je to v shemi). Skratka, tole pokličete na elementu, ki ima ta atribut:
element.setIdAttributeNode(atribut, true);

peterv6i ::

Ja.. jaz sem delal z Javo 1.6 ker imam ta JDK na oracle bazi kateri poganja java stored procedure...
Z javo < 1.6 so bile težave zaradi SHA256withRSA...

Zgodovina sprememb…

  • spremenilo: peterv6i ()

veqlargh ::

Jup, no saj, tolk za druge, če bodo na višji verziji :)

Infinity ::

Kolega je spisal knjižnico za python.

Dobite jo preko pip-a ali na https://github.com/boris-savic/python-f...

peterv6i ::

Zanima me koliko časa vam traja generiranje ZOI številke?
Namreč v Javi pridem do nekje 70msec...
Če pomnožim to vrednost s številom faktur, ki jih imamo v obdelavah potem bo samo generiranje številk trajao 4 ure...

perci ::

Pa moraš celotno obdelavo dati v potrditev? So res gotovinski računi? Glede na tvojo količino računov, sklepam, da delaš za kakšnega telekom operaterja ali komunalno podjetje, tam pa gotovinski računi predstavljajo cca 5% računov.

Zgodovina sprememb…

  • spremenil: perci ()

DamijanD ::

Hmm nisem gledal samo ZOI - mi je pa potrdilo 924 (vključno z ZOI generiranjem) računov v dveh minutah (pa nimam nekaj blazno optimizirane kode...)

perci ::

no sej, potem ti ne dela kaj bistveno hitreje od peterv6i

veqlargh ::

Za 10k ZOI številk cca 5 minut. S tem, da sem za vsako še Keystore in to sranje generiral. Moram še poštimat. Ampak tole je samo ZOI za dane podatke.

perci ::

Kako vam pa potrjevanje deluje? Hitrost?

Strato5 ::

mcfri je izjavil:


Dodaš vodilno ničlo, če zakodiran ZOI ni dovolj dolg?

Meni tudi prej ni delovalo in je bila zmešnjava z datumi, po updejtu aplikacija deluje kot mora. No, moje kode dekodira pravilno :-)


Misliš po pretvorbi iz šestnajstiškega v desetiški zapis naj dodam vodilne ničle, da bo ZOI vedno dolg enako številko znakov? točno koliko znakov pa bi naj bil dolg?

peterv6i ::

Ja jaz sem poštelal tako, da Certifikate in ostala jajca naložim samo 1x..
S profiler-jem sem gledal in se največ časa potroši na podpisu (kjer pač nimaš vpliva na hitrost)...
MD5 pa sem uporabil ta.. (ker se mi ne da nalagat še par megabajtov knjižnic apache-a na bazo)

Torej na bazi pokličem samo 1x metodo initcert, ki inicializira objekte...
Potem pa v zanki ali kjerkoli pač pokličem generiranjeZOI številke..
Kot sem rekel se največ časa troši na Signature.sign

 StringBuilder sb = new StringBuilder();
public static  KeyStore p12 = null;
    public static  String geslo;
    public static  String vmesni_rezultat = "";
    public static  String alias = null;
    public static  Key privateKey = null;
    public static  Signature podpis = null;
    public static  MessageDigest md = null;
    public static  StringBuilder sb = new StringBuilder();

    static
    {
        try
        {
           podpis = Signature.getInstance("SHA256WithRSA");
           md = MessageDigest.getInstance("MD5");
        }
        catch(Exception ex)
        {

        }


    }
 .
 . 
 public static void initCert(String direktorij, String certifikat, String gesloc) throws Exception
        {
            if (certifikat == null) {
                throw new Exception("ime datoteke certifikata ni podano!");
            }
            if (gesloc == null) {
                throw new Exception("geslo certifikata ni podano!");
            }

          geslo = gesloc;
          if (p12 == null) {
          p12 = KeyStore.getInstance("pkcs12");
          p12.load(new FileInputStream(direktorij + "/" + certifikat), geslo.toCharArray());
            Enumeration e = p12.aliases();
            alias = (String) e.nextElement();
            //pridobimo privatni ključ
            privateKey = p12.getKey(alias, geslo.toCharArray());
            //določimo način podpisa
            //Signature podpis = Signature.getInstance("SHA256WithRSA");
            podpis.initSign((PrivateKey) privateKey);


        }
        }


 private static String md5Java(byte[] message) throws Exception {
        byte[] hash = md.digest(message); //.getBytes("UTF-8"));
        sb.setLength(0);
        for (byte b : hash) {
            sb.append(String.format("%02x", b & 0xff));
        }

        return sb.toString();
    }

 public static String getZOI(
            String davcnaStevilka,
            String datumIzdaje,
            String stevilkaRacuna,
            String oznakaPoslovnegaProstora,
            String electronicDeviceId,
            String znesekRacuna) throws Exception {



        //sestavimo vrstico
        vmesni_rezultat = davcnaStevilka.concat(datumIzdaje).concat(stevilkaRacuna).concat(oznakaPoslovnegaProstora).concat(electronicDeviceId).concat(znesekRacuna);
        podpis.update(vmesni_rezultat.getBytes("UTF-8"));
        byte[] podpisano = podpis.sign();

        //MD5 hash
        return md5Java(podpisano);
    }


Zanima me če vam deluje validacija po shemi?
Recimo... če vzamem xml in ga preverim po shemi, ki je na fursu dobim:

Exception in thread "main" org.xml.sax.SAXParseException: InvalidRegex: Pattern value '\d{4}[-]\d{2}[-]\d{2}' is not a valid regular expression. The reported error was: ''-' is an invalid character range. Write '\-'.' at column '6'.

Če pa ta isti XML odložim na FURS ga ta sprejme brez težav...

Zgodovina sprememb…

  • spremenilo: peterv6i ()

PrimozHisof ::


Dodaš vodilno ničlo, če zakodiran ZOI ni dovolj dolg?


Ja. Če je ZOI destiški dolg 59 znakov, dodaš na začetku 0, da je dolžina 60.

Strato5 ::

PrimozHisof je izjavil:

Ja. Če je ZOI destiški dolg 59 znakov, dodaš na začetku 0, da je dolžina 60.


Odlično tole pa zdaj pravilno razbere podatke iz QR kode

peterv6i ::

Iz FURS-a so mi odgovorili, da so težave z validacijo le tam kjer to počne Java...
mah...ne razumem več nič.. Torej je priporočeno orodje pri uporabi FURSOVIH api-jev le .net?

==========
Spoštovani,
To je problem javanske knjižnice, ki se uporabljajo za validacijo. Njemu ni regular expression všeč, čeprav je pravilen.
Isti primer je tu:
http://www.oxygenxml.com/forum/topic101...

Lep pozdrav,

REPUBLIKA SLOVENIJA
MINISTRSTVO ZA FINANCE
««
8 / 27
»»


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Davčne blagajne - PHP

Oddelek: Programiranje
116081 (1127) vsepocenv
»

C# davčno potrjevanje

Oddelek: Programiranje
163975 (3444) windigo
»

E-račun

Oddelek: Programiranje
217098 (3861) ivanhoe5x
»

PHP davčna blagajna

Oddelek: Programiranje
187661 (5685) brble
»

[JAVA] HTTPS client

Oddelek: Programiranje
173058 (1788) peterv6i

Več podobnih tem