diff --git a/hypha/apply/projects/services/sageintacct/__init__.py b/hypha/apply/projects/services/sageintacct/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ecc225b1cbcbce5a38c0da8f855acb83d7d059a0 100644 --- a/hypha/apply/projects/services/sageintacct/__init__.py +++ b/hypha/apply/projects/services/sageintacct/__init__.py @@ -0,0 +1,26 @@ +""" +Sage Intacct init +""" +from .exceptions import ( + ExpiredTokenError, + InternalServerError, + InvalidTokenError, + NoPrivilegeError, + NotFoundItemError, + SageIntacctSDKError, + WrongParamsError, +) +from .sageintacctsdk import SageIntacctSDK + +__all__ = [ + 'SageIntacctSDK', + 'SageIntacctSDKError', + 'ExpiredTokenError', + 'InvalidTokenError', + 'NoPrivilegeError', + 'WrongParamsError', + 'NotFoundItemError', + 'InternalServerError' +] + +name = "sageintacctsdk" diff --git a/hypha/apply/projects/services/sageintacct/sageintacctsdk.py b/hypha/apply/projects/services/sageintacct/sageintacctsdk.py new file mode 100644 index 0000000000000000000000000000000000000000..977912e3ea8f2af6494a31da61f31d6f03deedb0 --- /dev/null +++ b/hypha/apply/projects/services/sageintacct/sageintacctsdk.py @@ -0,0 +1,62 @@ +from .wrapper import ApiBase, Purchasing + + +class SageIntacctSDK: + """ + Sage Intacct SDK + """ + + def __init__( + self, sender_id: str, sender_password: str, + user_id: str, company_id: str, user_password: str, + entity_id: str = None + ): + """ + Initialize connection to Sage Intacct + :param sender_id: Sage Intacct sender id + :param sender_password: Sage Intacct sener password + :param user_id: Sage Intacct user id + :param company_id: Sage Intacct company id + :param user_password: Sage Intacct user password + :param (optional) entity_id: Sage Intacct entity ID + """ + # Initializing variables + self.__sender_id = sender_id + self.__sender_password = sender_password + self.__user_id = user_id + self.__company_id = company_id + self.__user_password = user_password + self.__entity_id = entity_id + + self.api_base = ApiBase() + self.purchasing = Purchasing() + self.update_sender_id() + self.update_sender_password() + self.update_session_id() + + def update_sender_id(self): + """ + Update the sender id in all API objects. + """ + self.api_base.set_sender_id(self.__sender_id) + self.purchasing.set_sender_id(self.__sender_id) + + def update_sender_password(self): + """ + Update the sender password in all API objects. + """ + self.api_base.set_sender_password(self.__sender_password) + self.purchasing.set_sender_password(self.__sender_password) + + def update_session_id(self): + """ + Update the session id and change it in all API objects. + """ + self.__session_id = self.api_base.get_session_id( + self.__user_id, + self.__company_id, + self.__user_password, + self.__entity_id + ) + self.api_base.set_session_id(self.__session_id) + self.purchasing.set_session_id(self.__session_id) diff --git a/hypha/apply/projects/services/sageintacct/wrapper/__init__.py b/hypha/apply/projects/services/sageintacct/wrapper/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2e601e93577c86d43e095dd39b7f7d75a84eaf87 100644 --- a/hypha/apply/projects/services/sageintacct/wrapper/__init__.py +++ b/hypha/apply/projects/services/sageintacct/wrapper/__init__.py @@ -0,0 +1,7 @@ +from .api_base import ApiBase +from .purchasing import Purchasing + +__all__ = [ + 'ApiBase', + 'Purchasing', +] diff --git a/hypha/apply/projects/services/sageintacct/wrapper/api_base.py b/hypha/apply/projects/services/sageintacct/wrapper/api_base.py index 3f17309f43630b9be9f46ff17a9ea53953db819e..03689f6b68b6abe9087176dc00ef998d6029d2e3 100644 --- a/hypha/apply/projects/services/sageintacct/wrapper/api_base.py +++ b/hypha/apply/projects/services/sageintacct/wrapper/api_base.py @@ -1,16 +1,24 @@ -import json import datetime +import json +import re import uuid -from warnings import warn from typing import Dict, List, Tuple from urllib.parse import unquote -import re +from warnings import warn -import xmltodict import requests +import xmltodict -from ..exceptions import SageIntacctSDKError, ExpiredTokenError, InvalidTokenError, NoPrivilegeError, \ - WrongParamsError, NotFoundItemError, InternalServerError, DataIntegrityWarning +from ..exceptions import ( + DataIntegrityWarning, + ExpiredTokenError, + InternalServerError, + InvalidTokenError, + NoPrivilegeError, + NotFoundItemError, + SageIntacctSDKError, + WrongParamsError, +) from .constants import dimensions_fields_mapping diff --git a/hypha/apply/projects/services/sageintacct/wrapper/constants.py b/hypha/apply/projects/services/sageintacct/wrapper/constants.py new file mode 100644 index 0000000000000000000000000000000000000000..6c6acad5d48b736c9c41b3533f29968214920a8e --- /dev/null +++ b/hypha/apply/projects/services/sageintacct/wrapper/constants.py @@ -0,0 +1,10 @@ +dimensions_fields_mapping = { + 'PODOCUMENTENTRY': [ + 'ITEMID', + 'ITEMNAME', + 'ITEMDESC', + 'QUANTITY', + 'UNIT', + 'DEPARTMENTID', + ], +} diff --git a/hypha/apply/projects/services/sageintacct/wrapper/purchasing.py b/hypha/apply/projects/services/sageintacct/wrapper/purchasing.py new file mode 100644 index 0000000000000000000000000000000000000000..c9e0774d5c2f99a32b8481e70b0bb5504ba20136 --- /dev/null +++ b/hypha/apply/projects/services/sageintacct/wrapper/purchasing.py @@ -0,0 +1,12 @@ + +""" +Sage Intacct purchasing +""" + +from .api_base import ApiBase + + +class Purchasing(ApiBase): + """Class for Purchasing APIs.""" + def __init__(self): + ApiBase.__init__(self, dimension='PODOCUMENTENTRY') diff --git a/hypha/settings/base.py b/hypha/settings/base.py index 241c62784559507b1a81ec2edd7293a46f1177ca..c57e91d00fcc742b535961ce9b55b7d4f0098b54 100644 --- a/hypha/settings/base.py +++ b/hypha/settings/base.py @@ -651,5 +651,15 @@ if env.str('AWS_STORAGE_BUCKET_NAME', None): FILE_FORM_TEMP_STORAGE = PRIVATE_FILE_STORAGE # Matomo tracking -MATOMO_URL = env.str('MATOMO_URL', None) -MATOMO_SITEID = env.str('MATOMO_SITEID', None) + +MATOMO_URL = env.get('MATOMO_URL', False) +MATOMO_SITEID = env.get('MATOMO_SITEID', False) + +# SAGE INTACCT Configuration +if 'INITIALISE_INTACCT' in env: + INITIALISE_INTACCT = env['INITIALISE_INTACCT'] + INTACCT_SENDER_ID = env['INTACCT_SENDER_ID'] + INTACCT_SENDER_PASSWORD = env['INTACCT_SENDER_PASSWORD'] + INTACCT_USER_ID = env['INTACCT_USER_ID'] + INTACCT_COMPANY_ID = env['INTACCT_COMPANY_ID'] + INTACCT_USER_PASSWORD = env['INTACCT_USER_PASSWORD'] diff --git a/requirements.txt b/requirements.txt index d3b75a8e93e6ff37a7955ab7d625cee9d34a6cdf..e8a75a81f768a8f9611f51c05d08c5cfe67656db 100644 --- a/requirements.txt +++ b/requirements.txt @@ -48,3 +48,4 @@ wagtail-cache==1.0.2 wagtail-purge==0.1 wagtail==2.16.1 whitenoise==5.3.0 +xmltodict==0.12.0