From 47bb82563d2c1fd51453b01c09c23da7e472a490 Mon Sep 17 00:00:00 2001
From: sks444 <krishnasingh.ss30@gmail.com>
Date: Mon, 8 Nov 2021 12:56:54 +0530
Subject: [PATCH] Add env variables and test purchasing api

---
 .../projects/services/sageintacct/__init__.py | 26 ++++++++
 .../services/sageintacct/sageintacctsdk.py    | 62 +++++++++++++++++++
 .../services/sageintacct/wrapper/__init__.py  |  7 +++
 .../services/sageintacct/wrapper/api_base.py  | 20 ++++--
 .../services/sageintacct/wrapper/constants.py | 10 +++
 .../sageintacct/wrapper/purchasing.py         | 12 ++++
 hypha/settings/base.py                        | 14 ++++-
 requirements.txt                              |  1 +
 8 files changed, 144 insertions(+), 8 deletions(-)
 create mode 100644 hypha/apply/projects/services/sageintacct/sageintacctsdk.py
 create mode 100644 hypha/apply/projects/services/sageintacct/wrapper/constants.py
 create mode 100644 hypha/apply/projects/services/sageintacct/wrapper/purchasing.py

diff --git a/hypha/apply/projects/services/sageintacct/__init__.py b/hypha/apply/projects/services/sageintacct/__init__.py
index e69de29bb..ecc225b1c 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 000000000..977912e3e
--- /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 e69de29bb..2e601e935 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 3f17309f4..03689f6b6 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 000000000..6c6acad5d
--- /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 000000000..c9e0774d5
--- /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 241c62784..c57e91d00 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 d3b75a8e9..e8a75a81f 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
-- 
GitLab