{ "info": { "author": "Boris Tomic", "author_email": "boris@kodmasin.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "Intended Audience :: Financial and Insurance Industry", "Intended Audience :: Information Technology", "License :: OSI Approved :: Apache Software License", "Natural Language :: Croatian", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Office/Business :: Financial :: Accounting", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "fiskpy\n------\n\nEN: *A simple fiscalization library for fiscalizing the receipts to the Croatian tax service.*\n\nHR: *Biblioteka za fiskalizaciju ra\u010duna Poreznoj upravi Republike Hrvatske.*\n\n**Note1:** This library is not Python 3 compatible.\n\nINSTALLATION\n------------\n\nTo install this package from PyPI, use the following command:\n\n.. code:: bash\n\n $ pip install fisk\n\nREQUIREMENTS\n------------\n\n1. signxml - pip install signxml (version 2 supported from fiskpy\n v0.8.1)\n2. pyCrypto library - https://www.dlitz.net/software/pycrypto/\n\nUSAGE\n-----\n\nEcho Request\n~~~~~~~~~~~~\n\n.. code:: python\n\n import fisk\n import lxml.etree as et\n\n #As we did not set environment with FiskInit default environment is DEMO. This\n #works just with EchoRequest as it does not require key (with password) and certificate.\n\n #test echo\n echo = fisk.EchoRequest(\"Proba echo poruke\")\n\n #send request and print server reply\n echo_reply = echo.execute()\n if(echo_reply != False):\n print echo_reply\n else:\n errors = echo.get_last_error()\n print \"EchoRequest errors:\"\n for error in errors:\n print error\n\nPoslovniProstor Request\n~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: python\n\n import fisk\n import lxml.etree as et\n from datetime import date, timedelta\n\n #fiskpy initialization !!! must be used for PoslovniProstorZahtjev\n fisk.FiskInit.init('/path/to/your/key.pem', \"kaypassword\", '/path/to/your/cert.pem')\n #For production environment\n #fisk.FiskInit.init('/path/to/your/key.pem', \"kaypassword\", '/path/to/your/cert.pem', Ture)\n #create addres\n adresa = fisk.Adresa(data = {\"Ulica\": \"Proba\", \"KucniBroj\": \"1\", \"BrojPoste\": \"54321\"})\n #create poslovni prostor\n pp = fisk.PoslovniProstor(data = {\"Oib\": \"12345678901\",\n \"OznPoslProstora\": \"POS1\",\n \"AdresniPodatak\": fisk.AdresniPodatak(adresa),\n \"RadnoVrijeme\": \"PON-PET 9:00-17:00\",\n \"DatumPocetkaPrimjene\": (date.today() + timedelta(days = 1)).strftime('%d.%m.%Y')})\n\n #you can also access (set and get) attributes of fisk element classes as\n pp.SpecNamj = \"12345678901\"\n print pp.OznPoslProstora\n\n #poslovni prostor request\n ppz = fisk.PoslovniProstorZahtjev(pp)\n\n ppz_reply = ppz.execute()\n if(ppz_reply == True):\n print \"PoslovniProstorZahtjev seccessfuly sent!\"\n else:\n errors = ppz.get_last_error()\n print \"PoslovniProstorZahtjev reply errors:\"\n for error in errors:\n print error\n\n #fiskpy deinitialization - maybe not needed but good for correct garbage cleaning\n fisk.FiskInit.deinit()\n\nRacun Request\n-------------\n\n.. code:: python\n\n import fisk\n import lxml.etree as et\n from datetime import date, timedelta\n\n #fiskpy initialization !!! must be used for RacunZahtjev\n fisk.FiskInit.init('/path/to/your/key.pem', \"kaypassword\", '/path/to/your/cert.pem')\n #For production environment\n #fisk.FiskInit.init('/path/to/your/key.pem', \"kaypassword\", '/path/to/your/cert.pem', Ture)\n\n racun = fisk.Racun(data = {\"Oib\": \"12345678901\",\n \"USustPdv\": \"true\",\n \"DatVrijeme\": \"26.10.2013T23:50:00\",\n \"BrRac\": fisk.BrRac({\"BrOznRac\": \"2\", \"OznPosPr\":\"POS2\", \"OznNapUr\":\"1\"}),\n \"Pdv\": [fisk.Porez({\"Stopa\":\"25.00\", \"Osnovica\":\"100.00\", \"Iznos\":\"25.00\"}), fisk.Porez({\"Stopa\":\"10.00\", \"Osnovica\":\"100.00\", \"Iznos\":\"10.00\"})],\n \"Pnp\": [fisk.Porez({\"Stopa\":\"25.00\", \"Osnovica\":\"100.00\", \"Iznos\":\"25.00\"}), fisk.Porez({\"Stopa\":\"10.00\", \"Osnovica\":\"100.00\", \"Iznos\":\"10.00\"})],\n \"OstaliPor\": [fisk.OstPorez({\"Naziv\": \"Neki porez\", \"Stopa\":\"3.00\", \"Osnovica\":\"100.00\", \"Iznos\":\"3.00\"})],\n \"IznosOslobPdv\": \"100.00\",\n \"IznosMarza\": \"100.00\",\n \"IznosNePodlOpor\": \"50.00\",\n \"Naknade\": [fisk.Naknada({\"NazivN\" : \"test\", \"IznosN\": \"10.00\"})],\n \"IznosUkupno\": \"500.00\",\n \"NacinPlac\": \"G\",\n \"OibOper\": \"12345678901\",\n \"NakDost\": \"false\",\n \"ParagonBrRac\": \"123-234-12\",\n \"SpecNamj\": \"Tekst specijalne namjne\"})\n\n #IWe did not supplied required element in constructor so now we set it\n racun.OznSlijed = \"P\"\n\n #Zastitni kod is calculated so print it\n print \"ZKI: \" + racun.ZastKod\n\n #change one variable and check new zastitni kod\n racun.IznosUkupno = \"1233.00\"\n print \"ZKI: \" + racun.ZastKod\n\n #create Request and send it to server (DEMO) and print reply\n racunZahtjev = fisk.RacunZahtjev(racun)\n racun_reply = racunZahtjev.execute()\n if(racun_reply != False):\n print \"JIR is: \" + racun_reply\n else:\n errors = racunZahtjev.get_last_error()\n print \"RacunZahtjev reply errors:\"\n for error in errors:\n print error\n\n #fiskpy deinitialization - maybe not needed but good for correct garbage cleaning\n fisk.FiskInit.deinit()\n\nProvjera Request\n----------------\n\n.. code:: python\n\n import fisk\n from lxml import etree as et\n from datetime import date, timedelta\n\n #fiskpy initialization\n fisk.FiskInit.init('/path/to/your/key.pem', \"kaypassword\", '/path/to/your/cert.pem')\n\n racun = fisk.Racun(data = {\"Oib\": \"12345678901\",\n \"USustPdv\": \"true\",\n \"DatVrijeme\": \"26.10.2013T23:50:00\",\n \"BrRac\": fisk.BrRac({\"BrOznRac\": \"2\", \"OznPosPr\":\"POS2\", \"OznNapUr\":\"1\"}),\n \"Pdv\": [fisk.Porez({\"Stopa\":\"25.00\", \"Osnovica\":\"100.00\", \"Iznos\":\"25.00\"}), fisk.Porez({\"Stopa\":\"10.00\", \"Osnovica\":\"100.00\", \"Iznos\":\"10.00\"})],\n \"Pnp\": [fisk.Porez({\"Stopa\":\"25.00\", \"Osnovica\":\"100.00\", \"Iznos\":\"25.00\"}), fisk.Porez({\"Stopa\":\"10.00\", \"Osnovica\":\"100.00\", \"Iznos\":\"10.00\"})],\n \"OstaliPor\": [fisk.OstPorez({\"Naziv\": \"Neki porez\", \"Stopa\":\"3.00\", \"Osnovica\":\"100.00\", \"Iznos\":\"3.00\"})],\n \"IznosOslobPdv\": \"100.00\",\n \"IznosMarza\": \"100.00\",\n \"IznosNePodlOpor\": \"50.00\",\n \"Naknade\": [fisk.Naknada({\"NazivN\" : \"test\", \"IznosN\": \"10.00\"})],\n \"IznosUkupno\": \"500.00\",\n \"NacinPlac\": \"G\",\n \"OibOper\": \"12345678901\",\n \"NakDost\": \"false\",\n \"ParagonBrRac\": \"123-234-12\",\n \"SpecNamj\": \"Tekst specijalne namjne\"})\n\n #We did not supplied required element in constructor so now we set it\n racun.OznSlijed = \"P\"\n\n #Zastitni kod is calculated so print it\n print \"ZKI: \" + racun.ZastKod\n\n #change one variable and check new zastitni kod\n racun.IznosUkupno = \"1233.00\"\n print \"ZKI :\" + racun.ZastKod\n\n #create Request and send it to server (DEMO) and print reply\n provjeraZahtjev = fisk.ProvjeraZahtjev(racun)\n provjera_reply = provjeraZahtjev.execute()\n\n if(provjera_reply == False):\n print \"Request and response data is not the same\"\n elif(isinstance(provjera_reply, et._Element)):\n for greska in provjera_reply:\n print u\"Code: {} -> Message: {}\".format(greska[0].text, greska[1].text)\n else:\n print(\"Unhandled error\")\n\nKEY GENERATION\n--------------\n\nFiscalization keys and certificates are delivered in .p12 or .pfx\nformat. To be used with this library you should convert them to .pem\nformat. This can be done with openssl.\n\n.. code:: bash\n\n $ openssl pkcs12 -in certificate.pfx -out certificate.pem -nodes\n\nNow certificate.pem holds both key and certificate. So you should\nmanually open this file and copy each to separate file including\nBEGIN/END statements.\n\nPrivate key should be encrypted so if it is not you should run:\n\n.. code:: bash\n\n $ openssl rsa -in key.pem -des3 -out passkey.pem\n\nCA Certificates\n~~~~~~~~~~~~~~~\n\nVersion >= 0.7.4\n^^^^^^^^^^^^^^^^\n\nCA certificate are included in release. You do should not supply them to\nFiskInit class.\n\nVersions < 0.7.4\n^^^^^^^^^^^^^^^^\n\nYou will also need CA certificate for DEMO and PRODUCTION environment.\nThis certificate is needed for verification process.\n\nDEMO CA Certificate\n'''''''''''''''''''\n\nYou can download this certificate\nhttps://demo-pki.fina.hr/crl/democacert.cer\n\nDEMO CA 2014 Certificate (2 of them)\n''''''''''''''''''''''''''''''''''''\n\nYou can download this certificates\nhttp://www.fina.hr/Default.aspx?sec=1730\n\nBut in time of writing this you have to include old DEMO CA certificate\nin list too, to work.\n\nPRODUCTION CA Certificate\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nYou can download them from http://www.fina.hr/Default.aspx?art=10758\n\nTroubleshooting\n^^^^^^^^^^^^^^^\n\n**500: Internal Server Error** - this was bug before version 0.7.5\n\n**ValueError: RSA key format is not supported** - this error could\nhappen if your private key is not encrypted. Please check if your\nprivate key is encrypted. If it is not please encrypt it (''openssl rsa\n-in key.pem -des3 -out passkey.pem'')", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/kodmasin/fiskpy", "keywords": "fiscalization tax", "license": "Apache Software License", "maintainer": null, "maintainer_email": null, "name": "fisk", "package_url": "https://pypi.org/project/fisk/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/fisk/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/kodmasin/fiskpy" }, "release_url": "https://pypi.org/project/fisk/0.8.2/", "requires_dist": null, "requires_python": null, "summary": "library for fiscalization (Hrvatska) as defined in wsdl-1.1.2 and wsdl-1.2", "version": "0.8.2" }, "last_serial": 4749216, "releases": { "0.8.2": [ { "comment_text": "", "digests": { "md5": "74a4993925bb32cd52c1e28c54c10cd0", "sha256": "414bb87e9c6f7c53c5343cc0f91c4b0fa7bb2443953c67cbc84a713858bd1117" }, "downloads": -1, "filename": "fisk-0.8.2.tar.gz", "has_sig": false, "md5_digest": "74a4993925bb32cd52c1e28c54c10cd0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33934, "upload_time": "2017-03-30T07:52:41", "url": "https://files.pythonhosted.org/packages/46/b0/a77c00a4784eb5147c43d24a32ccf5e887b7753f601ed6047e0698f64ff0/fisk-0.8.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "74a4993925bb32cd52c1e28c54c10cd0", "sha256": "414bb87e9c6f7c53c5343cc0f91c4b0fa7bb2443953c67cbc84a713858bd1117" }, "downloads": -1, "filename": "fisk-0.8.2.tar.gz", "has_sig": false, "md5_digest": "74a4993925bb32cd52c1e28c54c10cd0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33934, "upload_time": "2017-03-30T07:52:41", "url": "https://files.pythonhosted.org/packages/46/b0/a77c00a4784eb5147c43d24a32ccf5e887b7753f601ed6047e0698f64ff0/fisk-0.8.2.tar.gz" } ] }