From b91ddb6685d0c4a90fa166215ff1b566404fb0b8 Mon Sep 17 00:00:00 2001 From: Kuba Winnicki Date: Thu, 14 Nov 2024 18:48:55 +0100 Subject: [PATCH] Refactoring ifirma core --- python_ifirma/core.py | 92 +++++++++++++++++++++++++++++++++------------------ setup.py | 4 +-- 2 files changed, 62 insertions(+), 34 deletions(-) diff --git a/python_ifirma/core.py b/python_ifirma/core.py index 9773bb2..7e91541 100644 --- a/python_ifirma/core.py +++ b/python_ifirma/core.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- + import six import json import datetime @@ -9,6 +10,9 @@ from python_ifirma.helpers import Helpers import requests +from urllib.parse import urljoin, quote + + class VAT: VAT_0 = 0.00 VAT_5 = 0.05 @@ -50,17 +54,17 @@ class Client: "Ulica": self.address.street, "Miejscowosc": self.address.city, "Kraj": self.address.country, - #"Email": self.email, - #"Telefon": self.phone_number, + # "Email": self.email, + # "Telefon": self.phone_number, "OsobaFizyczna": False, } if self.export == "eu": d.update({"PrefiksUE": self.tax_id[:2]}) if self.export == "eu" or self.export == "yes": d.update({"NIP": self.tax_id[2:]}) - #if self.export == "eu": - #d.update({"PrefiksUE": self.tax_id[:2]}) - #elif self.export == "yes": + # if self.export == "eu": + # d.update({"PrefiksUE": self.tax_id[:2]}) + # elif self.export == "yes": d.update({"Kraj": self.tax_id[:2]}) else: d.update({"NIP": self.tax_id}) @@ -147,7 +151,7 @@ class NewInvoiceParams: d.update({ "DataObowiazkuPodatkowego": self.__get_issue_date(), "NazwaUslugi": "services", - "Waluta": self.currency, #"PLN", + "Waluta": self.currency, "Jezyk": "en", "KursWalutyWidoczny": False, "KursWalutyZDniaPoprzedzajacegoDzienWystawieniaFaktury": 1.00, @@ -164,6 +168,8 @@ class NewInvoiceParams: class iFirmaAPI(): + __base_url = "https://www.ifirma.pl/iapi/" + __username = None __invoice_key_name = 'faktura' __invoice_key_value = None @@ -195,17 +201,37 @@ class iFirmaAPI(): return response_dict - def __create_authentication_header_value(self, request_hash_text, key_value=""): + def __get_auth_header(self, request_hash_text, key_value=""): key_value = key_value or self.__invoice_key_value return "IAPIS user={}, hmac-sha1={}".format( self.__username, Helpers.get_hmac_of_text(key_value, request_hash_text) ) + def __get(self, url_path, key_name, key_value="", params={}): + """Send GET request to IFirma API""" + + url = urljoin(self.__base_url, url_path) + request_hash_text = f"{url}{self.__username}{key_name}" + headers = { + # Content-type not needed in GET requests + # "Content-type": "application/json; charset=UTF-8", + "Accept": "application/json", + "Authentication": self.__get_auth_header(request_hash_text, + key_value=key_value) + } + response = requests.get(url, headers=headers, params=params) + return json.loads(response.content.decode('utf-8')) + + def find_partner(self, keyword): + return self.__get(f"kontrahenci/{quote(keyword)}.json", + self.__invoice_key_name) + def __create_invoice_and_return_id(self, invoice, url): # from pprint import pprint # pprint(invoice.get_request_data()) - request_content = json.dumps(invoice.get_request_data(), separators=(',', ':')) + request_content = json.dumps(invoice.get_request_data(), + separators=(',', ':')) request_hash_text = "{}{}{}{}".format( url, self.__username, @@ -215,7 +241,8 @@ class iFirmaAPI(): headers = { "Accept": "application/json", "Content-type": "application/json; charset=UTF-8", - "Authentication": self.__create_authentication_header_value(request_hash_text) + "Authentication": self.__get_auth_header(request_hash_text, + key_value=__user_key_value) } response_dict = self.__execute_post_request(headers, request_content, url) @@ -243,21 +270,13 @@ class iFirmaAPI(): self.__post_cost(cost_json, url) def get_accounting_month(self): - url = 'https://www.ifirma.pl/iapi/abonent/miesiacksiegowy.json' - request_hash_text = "{}{}{}".format( - url, - self.__username, - self.__user_key_name, - ) - headers = { - "Accept": "application/json", - "Content-type": "application/json; charset=UTF-8", - "Authentication": - self.__create_authentication_header_value(request_hash_text, self.__user_key_value) - } - resp = requests.get(url, headers=headers) - content = resp.content - return content + response = self.__get("abonent/miesiacksiegowy.json", + self.__user_key_name, + key_value=self.__user_key_value) + + month = response['response']["MiesiacKsiegowy"] + year = response['response']['RokKsiegowy'] + return year, month def __post_cost(self, cost_json, url): request_content = json.dumps(cost_json, separators=(',', ':')) @@ -270,7 +289,7 @@ class iFirmaAPI(): headers = { "Accept": "application/json", "Content-type": "application/json; charset=UTF-8", - "Authentication": self.__create_authentication_header_value(request_hash_text) + "Authentication": self.__get_auth_header(request_hash_text) } response_dict = self.__execute_post_request(headers, request_content, url) @@ -281,6 +300,15 @@ class iFirmaAPI(): else: return None + def list_invoices(self, date_from="", date_to=""): + params = {"dataOd": date_from} + if date_to: + params.update(dataDo=date_to) + + return self.__get("faktury.json", self.__invoice_key_name, + params=params) + + def get_invoice_list(self, limit=0): url = "https://www.ifirma.pl/iapi/fakturaeksportuslugue/list.json" request_hash_text = "{}{}{}".format( @@ -291,7 +319,7 @@ class iFirmaAPI(): headers = { "Accept": "application/json", "Content-type": "application/json; charset=UTF-8", - "Authentication": self.__create_authentication_header_value(request_hash_text) + "Authentication": self.__get_auth_header(request_hash_text) } params = {} if limit: @@ -301,7 +329,7 @@ class iFirmaAPI(): return rj def get_invoice(self, invoice_id): - url = "https://www.ifirma.pl/iapi/fakturaeksportuslug/{}.json".format(invoice_id) + url = f"https://www.ifirma.pl/iapi/fakturaeksportuslug/{invoice_id}.json" request_hash_text = "{}{}{}".format( url, self.__username, @@ -310,7 +338,7 @@ class iFirmaAPI(): headers = { "Accept": "application/json", "Content-type": "application/json; charset=UTF-8", - "Authentication": self.__create_authentication_header_value(request_hash_text) + "Authentication": self.__get_auth_header(request_hash_text) } resp = requests.get(url, headers=headers) rj = json.loads(resp.content.decode('utf-8')) @@ -320,11 +348,11 @@ class iFirmaAPI(): return rj def get_invoice_pdf(self, invoice_id): - url = "https://www.ifirma.pl/iapi/fakturakraj/{}.pdf".format(invoice_id) + url = f"https://www.ifirma.pl/iapi/fakturakraj/{invoice_id}.pdf" return self.__download_pdf(url) def __get_invoice_number(self, invoice_id): - url = "https://www.ifirma.pl/iapi/fakturakraj/{}.json".format(invoice_id) + url = f"https://www.ifirma.pl/iapi/fakturakraj/{invoice_id}.json" request_hash_text = "{}{}{}".format( url, self.__username, @@ -333,7 +361,7 @@ class iFirmaAPI(): headers = { "Accept": "application/json", "Content-type": "application/json; charset=UTF-8", - "Authentication": self.__create_authentication_header_value(request_hash_text) + "Authentication": self.__get_auth_header(request_hash_text) } resp = requests.get(url, headers=headers) rj = json.loads(resp.content.decode('utf-8')) @@ -351,7 +379,7 @@ class iFirmaAPI(): headers = { "Accept": "application/pdf", "Content-type": "application/pdf; charset=UTF-8", - "Authentication": self.__create_authentication_header_value(request_hash_text) + "Authentication": self.__get_auth_header(request_hash_text) } resp = requests.get(url, headers=headers) diff --git a/setup.py b/setup.py index 2eaee35..651441c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="python-ifirma", - version="0.0.5", + version="0.1.0b2", packages=find_packages(), install_requires=[ 'requests', @@ -12,4 +12,4 @@ setup( author_email='dariusz@aniszewski.eu', license='BSD License', -) \ No newline at end of file +)