brynq-sdk-factorial 1.0.0__tar.gz → 1.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. {brynq_sdk_factorial-1.0.0 → brynq_sdk_factorial-1.0.2}/PKG-INFO +1 -1
  2. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/__init__.py +59 -0
  3. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/companies.py +73 -0
  4. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/compensations.py +77 -0
  5. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/contracts.py +48 -0
  6. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/costcenter.py +77 -0
  7. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/custom_fields.py +73 -0
  8. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/employees.py +55 -0
  9. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/files.py +22 -0
  10. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/locations.py +47 -0
  11. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/payroll.py +52 -0
  12. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/teams.py +73 -0
  13. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial/workschedules.py +48 -0
  14. {brynq_sdk_factorial-1.0.0 → brynq_sdk_factorial-1.0.2}/brynq_sdk_factorial.egg-info/PKG-INFO +1 -1
  15. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial.egg-info/SOURCES.txt +19 -0
  16. brynq_sdk_factorial-1.0.2/brynq_sdk_factorial.egg-info/top_level.txt +1 -0
  17. {brynq_sdk_factorial-1.0.0 → brynq_sdk_factorial-1.0.2}/setup.py +1 -1
  18. brynq_sdk_factorial-1.0.0/brynq_sdk_factorial.egg-info/SOURCES.txt +0 -7
  19. brynq_sdk_factorial-1.0.0/brynq_sdk_factorial.egg-info/top_level.txt +0 -1
  20. {brynq_sdk_factorial-1.0.0 → brynq_sdk_factorial-1.0.2}/brynq_sdk_factorial.egg-info/dependency_links.txt +0 -0
  21. {brynq_sdk_factorial-1.0.0 → brynq_sdk_factorial-1.0.2}/brynq_sdk_factorial.egg-info/not-zip-safe +0 -0
  22. {brynq_sdk_factorial-1.0.0 → brynq_sdk_factorial-1.0.2}/brynq_sdk_factorial.egg-info/requires.txt +0 -0
  23. {brynq_sdk_factorial-1.0.0 → brynq_sdk_factorial-1.0.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: brynq_sdk_factorial
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: Factorial wrapper from BrynQ
5
5
  Home-page: UNKNOWN
6
6
  Author: BrynQ
@@ -0,0 +1,59 @@
1
+ import requests
2
+ from typing import List, Union
3
+ from brynq_sdk_brynq import BrynQ
4
+ from .compensations import Compensations
5
+ from .employees import Employees
6
+ from .companies import Companies
7
+ from .contracts import Contracts
8
+ from .files import Files
9
+ from .costcenter import Costcenter
10
+ from .locations import Locations
11
+ from .payroll import Payroll
12
+ from .teams import Teams
13
+ from .workschedules import Workschedules
14
+
15
+
16
+ # Set the base class for Factorial. This class will be used to set the credentials and those will be used in all other classes.
17
+ class Factorial(BrynQ):
18
+ def __init__(self, label: Union[str, List], debug: bool = False, demo: bool = False):
19
+ """"
20
+ For the documentation of Factorial, see: https://apidoc.factorialhr.com/docs/authentication-1
21
+ """
22
+ super().__init__()
23
+ if demo:
24
+ self.base_url = 'https://api.demo.factorial.dev/api/v2/'
25
+ self.base_url_v1 = 'https://api.demo.factorial.dev/api/v1/'
26
+ else:
27
+ self.base_url = 'https://api.factorialhr.com/api/v2/'
28
+ self.base_url_v1 = 'https://api.factorialhr.com/api/v1/'
29
+ headers = self._get_credentials(label)
30
+ self.session = requests.Session()
31
+ self.session.headers.update(headers)
32
+ self.employees = Employees(self)
33
+ self.contracts = Contracts(self)
34
+ self.companies = Companies(self)
35
+ self.costcenter = Costcenter(self)
36
+ self.compensations = Compensations(self)
37
+ self.team = Teams(self)
38
+ self.locations = Locations(self)
39
+ self.payroll = Payroll(self)
40
+ self.workschedules = Workschedules(self)
41
+ self.files = Files(self)
42
+ self.debug = debug
43
+
44
+ def _get_credentials(self, label):
45
+ """
46
+ Sets the credentials for the SuccessFactors API.
47
+ :param label (str): The label for the system credentials.
48
+ :returns: headers (dict): The headers for the API request, including the access token.
49
+ """
50
+ credentials = self.get_system_credential(system='factorial', label=label)
51
+ credentials = self.refresh_system_credential(system='factorial', system_id=credentials['id'])
52
+
53
+ headers = {
54
+ 'Authorization': f"Bearer {credentials['access_token']}",
55
+ 'Content-Type': 'application/json'
56
+ }
57
+
58
+ return headers
59
+
@@ -0,0 +1,73 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+
5
+ class Companies:
6
+ def __init__(self, factorial):
7
+ self.factorial = factorial
8
+ self.base_endpoint = '/resources/companies/legal_entities'
9
+
10
+ def get(self,
11
+ ids: list = None,
12
+ employees_ids: list[int] = None,
13
+ companies_ids: list[int] = None,
14
+ country_ids: list[int] = None) -> pd.DataFrame:
15
+
16
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
17
+ func_params = list(locals().items())
18
+ params = {}
19
+ for param, value in func_params:
20
+ if param != 'self' and value is not None:
21
+ params[param] = value
22
+
23
+ has_next_page = True
24
+ result_data = pd.DataFrame()
25
+ while has_next_page:
26
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}',
27
+ params=params)
28
+ response.raise_for_status()
29
+ response_data = response.json()
30
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
31
+ has_next_page = response_data['meta']['has_next_page']
32
+ if has_next_page:
33
+ params['after_id'] = response_data['meta']['end_cursor']
34
+
35
+ return result_data
36
+
37
+ def get_types(self,
38
+ ids: list = None,
39
+ legal_entity_ids: list[int] = None) -> pd.DataFrame:
40
+
41
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
42
+ func_params = locals().items()
43
+ params = {}
44
+ for param, value in func_params:
45
+ if param != 'self' and value is not None:
46
+ params[param] = value
47
+
48
+ has_next_page = True
49
+ result_data = pd.DataFrame()
50
+ while has_next_page:
51
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}',
52
+ params=params)
53
+ response.raise_for_status()
54
+ response_data = response.json()
55
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
56
+ has_next_page = response_data['meta']['has_next_page']
57
+ params['after_id'] = response_data['meta']['end_cursor']
58
+
59
+ return result_data
60
+
61
+ def update(self, company_id: str, data: dict) -> requests.Response:
62
+ response = self.factorial.session.put(url=f'{self.factorial.base_url}{self.base_endpoint}/{company_id}',
63
+ json=data)
64
+ response.raise_for_status()
65
+ return response
66
+
67
+ def delete(self, company_id: str) -> requests.Response:
68
+ response = self.factorial.session.delete(url=f'{self.factorial.base_url}{self.base_endpoint}/{company_id}')
69
+ response.raise_for_status()
70
+ return response
71
+
72
+ def create(self, data: dict) -> requests.Response:
73
+ raise NotImplementedError
@@ -0,0 +1,77 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+
5
+ class Compensations:
6
+ def __init__(self, factorial):
7
+ self.factorial = factorial
8
+ self.base_endpoint = '/resources/contracts/'
9
+
10
+ def get(self,
11
+ ids: list = None,
12
+ contract_version_id: list[int] = None) -> pd.DataFrame:
13
+
14
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
15
+ func_params = list(locals().items())
16
+ params = {}
17
+ for param, value in func_params:
18
+ if param != 'self' and value is not None:
19
+ params[param] = value
20
+
21
+ has_next_page = True
22
+ result_data = pd.DataFrame()
23
+ while has_next_page:
24
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}compensations',
25
+ params=params)
26
+ response.raise_for_status()
27
+ response_data = response.json()
28
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
29
+ has_next_page = response_data['meta']['has_next_page']
30
+ if has_next_page:
31
+ params['after_id'] = response_data['meta']['end_cursor']
32
+
33
+ taxonomies = self.get_types()
34
+ if not result_data.empty:
35
+ result_data = pd.merge(result_data, taxonomies, left_on='contracts_taxonomy_id', right_on='id', suffixes=('', '_taxonomy'))
36
+
37
+ return result_data
38
+
39
+ def get_types(self,
40
+ ids: list = None,
41
+ legal_entity_ids: list[int] = None,
42
+ legal_entity_id: int = None) -> pd.DataFrame:
43
+
44
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
45
+ func_params = list(locals().items())
46
+ params = {}
47
+ for param, value in func_params:
48
+ if param != 'self' and value is not None:
49
+ params[param] = value
50
+
51
+ has_next_page = True
52
+ result_data = pd.DataFrame()
53
+ while has_next_page:
54
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}taxonomies',
55
+ params=params)
56
+ response.raise_for_status()
57
+ response_data = response.json()
58
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
59
+ has_next_page = response_data['meta']['has_next_page']
60
+ if has_next_page:
61
+ params['after_id'] = response_data['meta']['end_cursor']
62
+
63
+ return result_data
64
+
65
+ def update(self, compensation_id: str, data: dict) -> requests.Response:
66
+ response = self.factorial.session.put(url=f'{self.factorial.base_url}{self.base_endpoint}/{compensation_id}',
67
+ json=data)
68
+ response.raise_for_status()
69
+ return response
70
+
71
+ def delete(self, compensation_id: str) -> requests.Response:
72
+ response = self.factorial.session.delete(url=f'{self.factorial.base_url}{self.base_endpoint}/{compensation_id}')
73
+ response.raise_for_status()
74
+ return response
75
+
76
+ def create(self, data: dict) -> requests.Response:
77
+ raise NotImplementedError
@@ -0,0 +1,48 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+
5
+ class Contracts:
6
+ def __init__(self, factorial):
7
+ self.factorial = factorial
8
+ self.base_endpoint = '/resources/contracts/contract_versions'
9
+
10
+ def get(self,
11
+ ids: list = None,
12
+ employee_ids: list[int] = None,
13
+ date: str = None) -> pd.DataFrame:
14
+
15
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
16
+ func_params = list(locals().items())
17
+ params = {}
18
+ for param, value in func_params:
19
+ if param != 'self' and value is not None:
20
+ params[param] = value
21
+
22
+ has_next_page = True
23
+ result_data = pd.DataFrame()
24
+ while has_next_page:
25
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}',
26
+ params=params)
27
+ response.raise_for_status()
28
+ response_data = response.json()
29
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
30
+ has_next_page = response_data['meta']['has_next_page']
31
+ if has_next_page:
32
+ params['after_id'] = response_data['meta']['end_cursor']
33
+
34
+ return result_data
35
+
36
+ def update(self, contract_id: str, data: dict) -> requests.Response:
37
+ response = self.factorial.session.put(url=f'{self.factorial.base_url}{self.base_endpoint}/{contract_id}',
38
+ json=data)
39
+ response.raise_for_status()
40
+ return response
41
+
42
+ def delete(self, contract_id: str) -> requests.Response:
43
+ response = self.factorial.session.delete(url=f'{self.factorial.base_url}{self.base_endpoint}/{contract_id}')
44
+ response.raise_for_status()
45
+ return response
46
+
47
+ def create(self, data: dict) -> requests.Response:
48
+ raise NotImplementedError
@@ -0,0 +1,77 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+
5
+ class Costcenter:
6
+ def __init__(self, factorial):
7
+ self.factorial = factorial
8
+ self.base_endpoint = '/resources/finance/cost_centers'
9
+
10
+ def get(self,
11
+ ids: list = None,
12
+ company_id: int = None,
13
+ legal_entity_ids: list = None,
14
+ include_actives_on_date: str = None,
15
+ search: str = None) -> pd.DataFrame:
16
+
17
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
18
+ func_params = locals().items()
19
+ params = {}
20
+ for param, value in func_params:
21
+ if param != 'self' and value is not None:
22
+ params[param] = value
23
+
24
+ has_next_page = True
25
+ result_data = pd.DataFrame()
26
+ while has_next_page:
27
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}',
28
+ params=params)
29
+ response.raise_for_status()
30
+ response_data = response.json()
31
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
32
+ has_next_page = response_data['meta']['has_next_page']
33
+ if has_next_page:
34
+ params['after_id'] = response_data['meta']['end_cursor']
35
+
36
+ return result_data
37
+
38
+ def get_membership(self,
39
+ cost_center_id: int = None,
40
+ employee_id: int = None,
41
+ active_on: str = None,
42
+ company_id: int = None) -> pd.DataFrame:
43
+
44
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
45
+ func_params = list(locals().items())
46
+ params = {}
47
+ for param, value in func_params:
48
+ if param != 'self' and value is not None:
49
+ params[param] = value
50
+
51
+ has_next_page = True
52
+ result_data = pd.DataFrame()
53
+ while has_next_page:
54
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}/resources/finance/cost_center_memberships',
55
+ params=params)
56
+ response.raise_for_status()
57
+ response_data = response.json()
58
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
59
+ has_next_page = response_data['meta']['has_next_page']
60
+ if has_next_page:
61
+ params['after_id'] = response_data['meta']['end_cursor']
62
+
63
+ return result_data
64
+
65
+ def update(self, costcenter_id: str, data: dict) -> requests.Response:
66
+ response = self.factorial.session.put(url=f'{self.factorial.base_url}{self.base_endpoint}/{costcenter_id}',
67
+ json=data)
68
+ response.raise_for_status()
69
+ return response
70
+
71
+ def delete(self, costcenter_id: str) -> requests.Response:
72
+ response = self.factorial.session.delete(url=f'{self.factorial.base_url}{self.base_endpoint}/{costcenter_id}')
73
+ response.raise_for_status()
74
+ return response
75
+
76
+ def create(self, data: dict) -> requests.Response:
77
+ raise NotImplementedError
@@ -0,0 +1,73 @@
1
+ from typing import Literal, List
2
+
3
+ import requests
4
+ import pandas as pd
5
+
6
+
7
+ class CustomFields:
8
+ def __init__(self, factorial):
9
+ self.factorial = factorial
10
+ self.base_endpoint = '/resources/custom_fields/fields'
11
+
12
+ def get(self,
13
+ ids: list = None,
14
+ field_type: str = None,
15
+ label: str = None,
16
+ slug: str = None,
17
+ company_id: int = None
18
+ ) -> pd.DataFrame:
19
+
20
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
21
+ func_params = locals().items()
22
+ params = {}
23
+ for param, value in func_params:
24
+ if param != 'self' and value is not None:
25
+ params[param] = value
26
+
27
+ has_next_page = True
28
+ result_data = pd.DataFrame()
29
+ while has_next_page:
30
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}',
31
+ params=params)
32
+ response.raise_for_status()
33
+ response_data = response.json()
34
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
35
+ has_next_page = response_data['meta']['has_next_page']
36
+ params['after_id'] = response_data['meta']['end_cursor']
37
+
38
+ return result_data
39
+
40
+ def update(self, contract_id: str, data: dict) -> requests.Response:
41
+ response = self.factorial.session.put(url=f'{self.factorial.base_url}{self.base_endpoint}/{self.base_endpoint}',
42
+ json=data)
43
+ response.raise_for_status()
44
+ return response
45
+
46
+ def delete(self, contract_id: str) -> requests.Response:
47
+ response = self.factorial.session.delete(url=f'{self.factorial.base_url}{self.base_endpoint}/{self.base_endpoint}')
48
+ response.raise_for_status()
49
+ return response
50
+
51
+ def create(self,
52
+ company_id: int,
53
+ editable: Literal['owned', 'reportees', 'teamleader', 'everybody'] = None,
54
+ visible: Literal['owned', 'reportees', 'teamleader', 'everybody'] = None,
55
+ label: str = None,
56
+ field_type: Literal['text', 'long_text', 'date', 'rating', 'checkbox', 'single_choice', 'multiple_choice', 'money', 'cents'] = None,
57
+ min_value: int = None,
58
+ max_value: int = None,
59
+ required: bool = None,
60
+ options: List[str] = None,
61
+ position: int = None
62
+ ) -> requests.Response:
63
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
64
+ func_params = list(locals().items())
65
+ data = {}
66
+ for param, value in func_params:
67
+ if param != 'self' and value is not None:
68
+ data[param] = value
69
+
70
+ response = self.factorial.session.post(url=f'{self.factorial.base_url}{self.base_endpoint}/{self.base_endpoint}',
71
+ data=data)
72
+ response.raise_for_status()
73
+ return response
@@ -0,0 +1,55 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+
5
+ class Employees:
6
+ def __init__(self, factorial):
7
+ self.factorial = factorial
8
+ self.base_endpoint = '/resources/employees/employees'
9
+
10
+ def get(self,
11
+ only_active: bool = False,
12
+ only_managers: bool = False,
13
+ ids: list = None,
14
+ access_ids: list[int] = None,
15
+ emails: list[str] = None,
16
+ full_text_name: str = None,
17
+ name_starts_with: str = None,
18
+ legal_entity_ids: list[int] = None,
19
+ team_ids: list[int] = None,
20
+ location_ids: list[int] = None) -> pd.DataFrame:
21
+
22
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
23
+ func_params = list(locals().items())
24
+ params = {}
25
+ for param, value in func_params:
26
+ if param != 'self' and value is not None:
27
+ params[param] = value
28
+
29
+ has_next_page = True
30
+ result_data = pd.DataFrame()
31
+ while has_next_page:
32
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}',
33
+ params=params)
34
+ response.raise_for_status()
35
+ response_data = response.json()
36
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
37
+ has_next_page = response_data['meta']['has_next_page']
38
+ if has_next_page:
39
+ params['after_id'] = response_data['meta']['end_cursor']
40
+
41
+ return result_data
42
+
43
+ def update(self, employee_id: str, data: dict) -> requests.Response:
44
+ response = self.factorial.session.put(url=f'{self.factorial.base_url}{self.base_endpoint}/{employee_id}',
45
+ json=data)
46
+ response.raise_for_status()
47
+ return response
48
+
49
+ def delete(self, employee_id: str) -> requests.Response:
50
+ response = self.factorial.session.delete(url=f'{self.factorial.base_url}{self.base_endpoint}/{employee_id}')
51
+ response.raise_for_status()
52
+ return response
53
+
54
+ def create(self, data: dict) -> requests.Response:
55
+ raise NotImplementedError
@@ -0,0 +1,22 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+
5
+ class Files:
6
+
7
+ def __init__(self, core):
8
+ self.core = core
9
+ self.base_endpoint = '/core/employees'
10
+
11
+ def get(self) -> pd.DataFrame:
12
+ response = requests.get(f'{self.core.factorial.base_url_v1}{self.base_endpoint}')
13
+ response.raise_for_status()
14
+ return pd.DataFrame(response.json())
15
+
16
+ def update(self, employee_id: str, data: dict) -> requests.Response:
17
+ response = requests.put(f'{self.core.factorial.base_url_v1}{self.base_endpoint}/{employee_id}', json=data)
18
+ response.raise_for_status()
19
+ return response
20
+
21
+ def create(self, data: dict) -> requests.Response:
22
+ raise NotImplementedError
@@ -0,0 +1,47 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+
5
+ class Locations:
6
+ def __init__(self, factorial):
7
+ self.factorial = factorial
8
+ self.base_endpoint = '/resources/locations/locations'
9
+
10
+ def get(self,
11
+ ids: list = None,
12
+ employee_ids: list[int] = None) -> pd.DataFrame:
13
+
14
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
15
+ func_params = list(locals().items())
16
+ params = {}
17
+ for param, value in func_params:
18
+ if param != 'self' and value is not None:
19
+ params[param] = value
20
+
21
+ has_next_page = True
22
+ result_data = pd.DataFrame()
23
+ while has_next_page:
24
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}',
25
+ params=params)
26
+ response.raise_for_status()
27
+ response_data = response.json()
28
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
29
+ has_next_page = response_data['meta']['has_next_page']
30
+ if has_next_page:
31
+ params['after_id'] = response_data['meta']['end_cursor']
32
+
33
+ return result_data
34
+
35
+ def update(self, location_id: str, data: dict) -> requests.Response:
36
+ response = self.factorial.session.put(url=f'{self.factorial.base_url}{self.base_endpoint}/{location_id}',
37
+ json=data)
38
+ response.raise_for_status()
39
+ return response
40
+
41
+ def delete(self, location_id: str) -> requests.Response:
42
+ response = self.factorial.session.delete(url=f'{self.factorial.base_url}{self.base_endpoint}/{location_id}')
43
+ response.raise_for_status()
44
+ return response
45
+
46
+ def create(self, data: dict) -> requests.Response:
47
+ raise NotImplementedError
@@ -0,0 +1,52 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+
5
+ class Payroll:
6
+ def __init__(self, factorial):
7
+ self.factorial = factorial
8
+ self.base_endpoint = '/resources/payroll/supplements'
9
+
10
+ def get(self,
11
+ to_date: str = None, # YYYY-MM-DD
12
+ from_date: str = None, # YYYY-MM-DD
13
+ legal_entity_ids: list = None,
14
+ policy_period_ids: list = None,
15
+ compensation_id: int = None,
16
+ ids: list = None,
17
+ employee_ids: list[int] = None) -> pd.DataFrame:
18
+
19
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
20
+ func_params = list(locals().items())
21
+ params = {}
22
+ for param, value in func_params:
23
+ if param != 'self' and value is not None:
24
+ params[param] = value
25
+
26
+ has_next_page = True
27
+ result_data = pd.DataFrame()
28
+ while has_next_page:
29
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}',
30
+ params=params)
31
+ response.raise_for_status()
32
+ response_data = response.json()
33
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
34
+ has_next_page = response_data['meta']['has_next_page']
35
+ if has_next_page:
36
+ params['after_id'] = response_data['meta']['end_cursor']
37
+
38
+ return result_data
39
+
40
+ def update(self, supplement_id: str, data: dict) -> requests.Response:
41
+ response = self.factorial.session.put(url=f'{self.factorial.base_url}{self.base_endpoint}/{supplement_id}',
42
+ json=data)
43
+ response.raise_for_status()
44
+ return response
45
+
46
+ def delete(self, supplement_id: str) -> requests.Response:
47
+ response = self.factorial.session.delete(url=f'{self.factorial.base_url}{self.base_endpoint}/{supplement_id}')
48
+ response.raise_for_status()
49
+ return response
50
+
51
+ def create(self, data: dict) -> requests.Response:
52
+ raise NotImplementedError
@@ -0,0 +1,73 @@
1
+ from typing import List
2
+
3
+ import requests
4
+ import pandas as pd
5
+
6
+
7
+ class Teams:
8
+ def __init__(self, factorial):
9
+ self.factorial = factorial
10
+ self.base_endpoint = '/resources/teams/'
11
+
12
+ def get(self) -> pd.DataFrame:
13
+
14
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
15
+ func_params = locals().items()
16
+ params = {}
17
+ for param, value in func_params:
18
+ if param != 'self' and value is not None:
19
+ params[param] = value
20
+
21
+ has_next_page = True
22
+ result_data = pd.DataFrame()
23
+ while has_next_page:
24
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}teams',
25
+ params=params)
26
+ response.raise_for_status()
27
+ response_data = response.json()
28
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
29
+ has_next_page = response_data['meta']['has_next_page']
30
+ if has_next_page:
31
+ params['after_id'] = response_data['meta']['end_cursor']
32
+
33
+ return result_data
34
+
35
+ def get_membership(self,
36
+ ids: list = None,
37
+ team_ids: List[int] = None,
38
+ employee_ids: List[int] = None) -> pd.DataFrame:
39
+
40
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
41
+ func_params = list(locals().items())
42
+ params = {}
43
+ for param, value in func_params:
44
+ if param != 'self' and value is not None:
45
+ params[param] = value
46
+
47
+ has_next_page = True
48
+ result_data = pd.DataFrame()
49
+ while has_next_page:
50
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}memberships',
51
+ params=params)
52
+ response.raise_for_status()
53
+ response_data = response.json()
54
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
55
+ has_next_page = response_data['meta']['has_next_page']
56
+ if has_next_page:
57
+ params['after_id'] = response_data['meta']['end_cursor']
58
+
59
+ return result_data
60
+
61
+ def update(self, team_id: str, data: dict) -> requests.Response:
62
+ response = self.factorial.session.put(url=f'{self.factorial.base_url}{self.base_endpoint}teams/{team_id}',
63
+ json=data)
64
+ response.raise_for_status()
65
+ return response
66
+
67
+ def delete(self, team_id: str) -> requests.Response:
68
+ response = self.factorial.session.delete(url=f'{self.factorial.base_url}{self.base_endpoint}teams/{team_id}')
69
+ response.raise_for_status()
70
+ return response
71
+
72
+ def create(self, data: dict) -> requests.Response:
73
+ raise NotImplementedError
@@ -0,0 +1,48 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+
5
+ class Workschedules:
6
+ def __init__(self, factorial):
7
+ self.factorial = factorial
8
+ self.base_endpoint = '/resources/work_schedule/schedules'
9
+
10
+ def get(self,
11
+ ids: list = None,
12
+ with_employee_ids: bool = True,
13
+ with_periods: bool = True) -> pd.DataFrame:
14
+
15
+ # Use locals() to get all function parameters as a dictionary. Do not move this down since it will include all variables in function scope
16
+ func_params = list(locals().items())
17
+ params = {}
18
+ for param, value in func_params:
19
+ if param != 'self' and value is not None:
20
+ params[param] = value
21
+
22
+ has_next_page = True
23
+ result_data = pd.DataFrame()
24
+ while has_next_page:
25
+ response = self.factorial.session.get(url=f'{self.factorial.base_url}{self.base_endpoint}',
26
+ params=params)
27
+ response.raise_for_status()
28
+ response_data = response.json()
29
+ result_data = pd.concat([result_data, pd.DataFrame(response_data['data'])])
30
+ has_next_page = response_data['meta']['has_next_page']
31
+ if has_next_page:
32
+ params['after_id'] = response_data['meta']['end_cursor']
33
+
34
+ return result_data
35
+
36
+ def update(self, workschedule_id: str, data: dict) -> requests.Response:
37
+ response = self.factorial.session.put(url=f'{self.factorial.base_url}{self.base_endpoint}/{workschedule_id}',
38
+ json=data)
39
+ response.raise_for_status()
40
+ return response
41
+
42
+ def delete(self, workschedule_id: str) -> requests.Response:
43
+ response = self.factorial.session.delete(url=f'{self.factorial.base_url}{self.base_endpoint}/{workschedule_id}')
44
+ response.raise_for_status()
45
+ return response
46
+
47
+ def create(self, data: dict) -> requests.Response:
48
+ raise NotImplementedError
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: brynq-sdk-factorial
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: Factorial wrapper from BrynQ
5
5
  Home-page: UNKNOWN
6
6
  Author: BrynQ
@@ -0,0 +1,19 @@
1
+ setup.py
2
+ brynq_sdk_factorial/__init__.py
3
+ brynq_sdk_factorial/companies.py
4
+ brynq_sdk_factorial/compensations.py
5
+ brynq_sdk_factorial/contracts.py
6
+ brynq_sdk_factorial/costcenter.py
7
+ brynq_sdk_factorial/custom_fields.py
8
+ brynq_sdk_factorial/employees.py
9
+ brynq_sdk_factorial/files.py
10
+ brynq_sdk_factorial/locations.py
11
+ brynq_sdk_factorial/payroll.py
12
+ brynq_sdk_factorial/teams.py
13
+ brynq_sdk_factorial/workschedules.py
14
+ brynq_sdk_factorial.egg-info/PKG-INFO
15
+ brynq_sdk_factorial.egg-info/SOURCES.txt
16
+ brynq_sdk_factorial.egg-info/dependency_links.txt
17
+ brynq_sdk_factorial.egg-info/not-zip-safe
18
+ brynq_sdk_factorial.egg-info/requires.txt
19
+ brynq_sdk_factorial.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ brynq_sdk_factorial
@@ -2,7 +2,7 @@ from setuptools import setup, find_namespace_packages
2
2
 
3
3
  setup(
4
4
  name='brynq_sdk_factorial',
5
- version='1.0.0',
5
+ version='1.0.2',
6
6
  description='Factorial wrapper from BrynQ',
7
7
  long_description='Factorial wrapper from BrynQ',
8
8
  author='BrynQ',
@@ -1,7 +0,0 @@
1
- setup.py
2
- brynq_sdk_factorial.egg-info/PKG-INFO
3
- brynq_sdk_factorial.egg-info/SOURCES.txt
4
- brynq_sdk_factorial.egg-info/dependency_links.txt
5
- brynq_sdk_factorial.egg-info/not-zip-safe
6
- brynq_sdk_factorial.egg-info/requires.txt
7
- brynq_sdk_factorial.egg-info/top_level.txt