ms-salesforce-api 3.3.0__tar.gz → 3.4.0__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 (97) hide show
  1. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/PKG-INFO +2 -2
  2. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/account/constants.py +2 -2
  3. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/account/dto/AccountDTO.py +10 -2
  4. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/account/export_data/Bigquery.py +2 -2
  5. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/__tests__/test_Project.py +2 -4
  6. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/constants.py +2 -3
  7. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/dto/OpportunityDTO.py +4 -12
  8. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/export_data/Bigquery.py +2 -3
  9. ms_salesforce_api-3.4.0/ms_salesforce_api/salesforce/api/projects_with_backup/__init__.py +55 -0
  10. ms_salesforce_api-3.4.0/ms_salesforce_api/salesforce/api/projects_with_backup/constants.py +16 -0
  11. ms_salesforce_api-3.4.0/ms_salesforce_api/salesforce/api/projects_with_backup/dto/ProjectDTO.py +86 -0
  12. ms_salesforce_api-3.4.0/ms_salesforce_api/salesforce/api/projects_with_backup/export_data/Bigquery.py +75 -0
  13. ms_salesforce_api-3.4.0/ms_salesforce_api/salesforce/api/projects_with_backup/export_data/__init__.py +0 -0
  14. ms_salesforce_api-3.4.0/ms_salesforce_api/salesforce/helpers/__init__.py +0 -0
  15. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/pyproject.toml +2 -2
  16. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/LICENSE +0 -0
  17. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/README.md +0 -0
  18. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/__init__.py +0 -0
  19. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/Auth.py +0 -0
  20. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/JWTGenerator.py +0 -0
  21. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/SalesforceQueryExecutor.py +0 -0
  22. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/__init__.py +0 -0
  23. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/__tests__/__init__.py +0 -0
  24. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/__tests__/test_Auth.py +0 -0
  25. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/__tests__/test_JWTGenerator.py +0 -0
  26. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/__tests__/test_SalesforceRequester.py +0 -0
  27. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/__init__.py +0 -0
  28. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/account/__init__.py +0 -0
  29. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/account/dto/__init__.py +0 -0
  30. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/account/export_data/__init__.py +0 -0
  31. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/__init__.py +0 -0
  32. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/constants.py +0 -0
  33. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/dto/AddTechOnboarding.py +0 -0
  34. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/dto/__init__.py +0 -0
  35. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/export_data/Bigquery.py +0 -0
  36. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/export_data/__init__.py +0 -0
  37. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/contact/__init__.py +0 -0
  38. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/contact/constants.py +0 -0
  39. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/contact/dto/ContactDTO.py +0 -0
  40. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/contact/dto/__init__.py +0 -0
  41. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/contact/export_data/Bigquery.py +0 -0
  42. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/contact/export_data/__init__.py +0 -0
  43. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/lead/__init__.py +0 -0
  44. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/lead/constants.py +0 -0
  45. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/lead/dto/LeadDTO.py +0 -0
  46. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/lead/dto/__init__.py +0 -0
  47. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/lead/export_data/Bigquery.py +0 -0
  48. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/lead/export_data/__init__.py +0 -0
  49. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity/__init__.py +0 -0
  50. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity/constants.py +0 -0
  51. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity/dto/OpportunityDTO.py +0 -0
  52. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity/dto/__init__.py +0 -0
  53. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity/export_data/Bigquery.py +0 -0
  54. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity/export_data/CloudSQL.py +0 -0
  55. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity/export_data/__init__.py +0 -0
  56. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity/export_data/__tests__/__init__.py +0 -0
  57. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity/export_data/__tests__/test_CloudSQL.py +0 -0
  58. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity/helpers.py +0 -0
  59. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/__init__.py +0 -0
  60. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/constants.py +0 -0
  61. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/dto/OpportunityContactDTO.py +0 -0
  62. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/dto/__init__.py +0 -0
  63. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/export_data/Bigquery.py +0 -0
  64. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/export_data/__init__.py +0 -0
  65. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_history/__init__.py +0 -0
  66. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_history/constants.py +0 -0
  67. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_history/dto/OpportunityDTO.py +0 -0
  68. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_history/dto/__init__.py +0 -0
  69. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_history/export_data/Bigquery.py +0 -0
  70. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/opportunity_history/export_data/__init__.py +0 -0
  71. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/product/__init__.py +0 -0
  72. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/product/__tests__/__init__.py +0 -0
  73. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/product/__tests__/test_Product.py +0 -0
  74. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/product/constants.py +0 -0
  75. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/product/dto/ProductDTO.py +0 -0
  76. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/product/dto/__init__.py +0 -0
  77. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/product/export_data/Bigquery.py +0 -0
  78. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/product/export_data/__init__.py +0 -0
  79. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/profit_center/__init__.py +0 -0
  80. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/profit_center/__tests__/__init__.py +0 -0
  81. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/profit_center/__tests__/test_ProfitCenter.py +0 -0
  82. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/profit_center/constants.py +0 -0
  83. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/profit_center/dto/ProfitCenterDTO.py +0 -0
  84. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/profit_center/dto/__init__.py +0 -0
  85. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/profit_center/export_data/Bigquery.py +0 -0
  86. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/profit_center/export_data/__init__.py +0 -0
  87. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/__init__.py +0 -0
  88. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/__tests__/__init__.py +0 -0
  89. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/dto/BillingLineDTO.py +0 -0
  90. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/dto/ProjectLineItemDTO.py +0 -0
  91. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/dto/__init__.py +0 -0
  92. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/export_data/CloudSQL.py +0 -0
  93. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/export_data/__init__.py +0 -0
  94. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/export_data/__tests__/__init__.py +0 -0
  95. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/api/project/export_data/__tests__/test_CloudSQL.py +0 -0
  96. {ms_salesforce_api-3.3.0/ms_salesforce_api/salesforce/helpers → ms_salesforce_api-3.4.0/ms_salesforce_api/salesforce/api/projects_with_backup/dto}/__init__.py +0 -0
  97. {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.4.0}/ms_salesforce_api/salesforce/helpers/string.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ms-salesforce-api
3
- Version: 3.3.0
3
+ Version: 3.4.0
4
4
  Summary: Python library used to extract data from Salesforce API and migrate it to Bigquery and Postgres.
5
5
  License-File: LICENSE
6
6
  Author: Making Science
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Classifier: Programming Language :: Python :: 3.14
15
15
  Requires-Dist: flake8 (>=6.0.0,<7.0.0)
16
- Requires-Dist: gc-google-services-api (>=1.2.7,<2.0.0)
16
+ Requires-Dist: gc-google-services-api (==2.4.0)
17
17
  Requires-Dist: isort (>=5.12.0,<6.0.0)
18
18
  Requires-Dist: pre-commit (>=3.1.1,<4.0.0)
19
19
  Requires-Dist: psycopg2-binary (>=2.9.6,<3.0.0)
@@ -7,8 +7,8 @@ SELECT
7
7
  BillingPostalCode,
8
8
  BillingStateCode,
9
9
  BillingStreet,
10
- BQ_CustomerGroupId__c,
11
- BQ_CustomerSubgroupId__c,
10
+ LKP_CustomerSubgroup__r.LKP_CustomerGroup__c,
11
+ LKP_CustomerSubgroup__c,
12
12
  Business_Name__c,
13
13
  CIF__c,
14
14
  CreatedDate,
@@ -262,6 +262,14 @@ class AccountDTO(object):
262
262
  except Exception:
263
263
  return ""
264
264
 
265
+ def _get_customer_group_id():
266
+ try:
267
+ return normalize_value(
268
+ record["LKP_CustomerSubgroup__r"]["LKP_CustomerGroup__c"]
269
+ )
270
+ except (TypeError, KeyError):
271
+ return None
272
+
265
273
  return AccountDTO(
266
274
  id=record["Id"],
267
275
  accelerator=record["Accelerator__c"],
@@ -304,9 +312,9 @@ class AccountDTO(object):
304
312
  billing_state_code=normalize_value(record["BillingStateCode"]),
305
313
  mail_invoincing=normalize_value(record["MAIL_Invoicing__c"]),
306
314
  invoincing_email=normalize_value(record["Invoicing_Email__c"]),
307
- customer_group_id=normalize_value(record["BQ_CustomerGroupId__c"]),
315
+ customer_group_id=_get_customer_group_id(),
308
316
  customer_subgroup_id=normalize_value(
309
- record["BQ_CustomerSubgroupID__c"]
317
+ record["LKP_CustomerSubgroup__c"]
310
318
  ),
311
319
  customer_subgroup_name=normalize_value(_get_subgroup_name()),
312
320
  customer_subgroup_dt_start=normalize_value(_get_subgroup_start()),
@@ -55,8 +55,8 @@ class BigQueryExporter:
55
55
  "billing_state_code": "STRING",
56
56
  "mail_invoincing": "STRING",
57
57
  "invoincing_email": "STRING",
58
- "customer_group_id": "INTEGER",
59
- "customer_subgroup_id": "INTEGER",
58
+ "customer_group_id": "STRING",
59
+ "customer_subgroup_id": "STRING",
60
60
  "customer_subgroup_name": "STRING",
61
61
  "customer_subgroup_dt_start": "DATE",
62
62
  "customer_subgroup_dt_end": "DATE",
@@ -397,8 +397,8 @@ class TestProject(unittest.TestCase):
397
397
  "account_company_invoicing": "",
398
398
  "account_created_date": "2020-03-18 15:32:15",
399
399
  "account_currency_code": "EUR",
400
- "account_customer_groupId": "1",
401
- "account_customer_subgroupId": "5",
400
+ "account_customer_groupId": "",
401
+ "account_customer_subgroupId": "",
402
402
  "account_fax": None,
403
403
  "account_invoicing_email": "client1@test.com",
404
404
  "account_mail_invoicing": "client1@test.com",
@@ -452,7 +452,6 @@ class TestProject(unittest.TestCase):
452
452
  "group_pck_type": "Key Account",
453
453
  "group_start_date": "2023-06-01",
454
454
  "group_supervisor_email": "employee2@test.com",
455
- "international_deparments": False,
456
455
  "invoicing_country_code": "US",
457
456
  "jira_task_url": "<a "
458
457
  "href=https://makingscience.atlassian.net/browse/ESMSBD0001-7168 "
@@ -523,7 +522,6 @@ class TestProject(unittest.TestCase):
523
522
  "subgroup_subgroupid": "a19AX0000004simYAA",
524
523
  }
525
524
  self.assertIsInstance(opportunity, dict)
526
-
527
525
  self.assertDictEqual(
528
526
  opportunity,
529
527
  opportunity_result,
@@ -6,7 +6,6 @@ SELECT
6
6
  CurrencyIsoCode,
7
7
  End_Date__c,
8
8
  Id,
9
- International_Departments__c,
10
9
  LastModifiedDate,
11
10
  LKP_CostCenter__r.Name,
12
11
  LKP_MSCompanyInvoicing__r.PCK_Prefix__c,
@@ -38,8 +37,8 @@ SELECT
38
37
  Project_Account__r.BillingPostalCode,
39
38
  Project_Account__r.BillingStateCode,
40
39
  Project_Account__r.BillingStreet,
41
- Project_Account__r.BQ_CustomerGroupId__c,
42
- Project_Account__r.BQ_CustomerSubgroupId__c,
40
+ Project_Account__r.LKP_CustomerSubgroup__r.LKP_CustomerGroup__c,
41
+ Project_Account__r.LKP_CustomerSubgroup__c,
43
42
  Project_Account__r.Business_Name__c,
44
43
  Project_Account__r.CIF__c,
45
44
  Project_Account__r.CreatedDate,
@@ -77,7 +77,6 @@ class OpportunityDTO(object):
77
77
  autorenewal,
78
78
  comments,
79
79
  end_date,
80
- international_deparments,
81
80
  opportunity_extension,
82
81
  maintance_project,
83
82
  ms_project_id,
@@ -167,7 +166,6 @@ class OpportunityDTO(object):
167
166
  self.autorenewal = autorenewal
168
167
  self.comments = comments
169
168
  self.end_date = end_date
170
- self.international_deparments = international_deparments
171
169
  self.opportunity_extension = opportunity_extension
172
170
  self.maintance_project = maintance_project
173
171
  self.ms_project_id = ms_project_id
@@ -442,7 +440,9 @@ class OpportunityDTO(object):
442
440
 
443
441
  def _get_account_customer_groupid():
444
442
  try:
445
- data = record["Project_Account__r"]["BQ_CustomerGroupId__c"]
443
+ data = record["Project_Account__r"]["LKP_CustomerSubgroup__r"][
444
+ "LKP_CustomerGroup__c"
445
+ ]
446
446
  if data:
447
447
  return normalize_value(data)
448
448
  except (TypeError, KeyError):
@@ -450,7 +450,7 @@ class OpportunityDTO(object):
450
450
 
451
451
  def _get_account_customer_subgroupid():
452
452
  try:
453
- data = record["Project_Account__r"]["BQ_CustomerSubgroupID__c"]
453
+ data = record["Project_Account__r"]["LKP_CustomerSubgroup__c"]
454
454
  if data:
455
455
  return normalize_value(data)
456
456
  except (TypeError, KeyError):
@@ -682,12 +682,6 @@ class OpportunityDTO(object):
682
682
  except KeyError:
683
683
  return ""
684
684
 
685
- def _get_international_deparments():
686
- try:
687
- return record["International_Departments__c"]
688
- except KeyError:
689
- return False
690
-
691
685
  def _get_opportunity_extension():
692
686
  try:
693
687
  return record["LKP_OpportunityExtension__c"]
@@ -865,7 +859,6 @@ class OpportunityDTO(object):
865
859
  autorenewal=_get_autorenewal(),
866
860
  comments=_get_comments(),
867
861
  end_date=_get_end_date(),
868
- international_deparments=_get_international_deparments(),
869
862
  opportunity_extension=_get_opportunity_extension(),
870
863
  maintance_project=_get_maintance_project(),
871
864
  ms_project_id=_get_ms_project_id(),
@@ -960,7 +953,6 @@ class OpportunityDTO(object):
960
953
  "autorenewal": self.autorenewal,
961
954
  "comments": self.comments,
962
955
  "end_date": self.end_date,
963
- "international_deparments": self.international_deparments,
964
956
  "opportunity_extension": self.opportunity_extension,
965
957
  "maintance_project": self.maintance_project,
966
958
  "ms_project_id": self.ms_project_id,
@@ -48,7 +48,6 @@ class BigQueryExporter:
48
48
  "autorenewal": "BOOLEAN",
49
49
  "comments": "STRING",
50
50
  "end_date": "DATE",
51
- "international_deparments": "BOOLEAN",
52
51
  "opportunity_extension": "STRING",
53
52
  "maintance_project": "BOOLEAN",
54
53
  "ms_project_id": "STRING",
@@ -136,8 +135,8 @@ class BigQueryExporter:
136
135
  "tax_id_type": "STRING",
137
136
  "tier": "STRING",
138
137
  "website": "STRING",
139
- "customer_groupId": "INTEGER",
140
- "customer_subgroupId": "INTEGER",
138
+ "customer_groupId": "STRING",
139
+ "customer_subgroupId": "STRING",
141
140
  },
142
141
  "groups": {
143
142
  "project_id": "STRING",
@@ -0,0 +1,55 @@
1
+ import logging
2
+
3
+ from ms_salesforce_api.salesforce.api.projects_with_backup.constants import (
4
+ DEFAULT_PROJECTS_QUERY,
5
+ )
6
+ from ms_salesforce_api.salesforce.api.projects_with_backup.dto.ProjectDTO import ( # noqa: E501
7
+ ProjectDTO,
8
+ )
9
+ from ms_salesforce_api.salesforce.SalesforceQueryExecutor import (
10
+ SalesforceQueryExecutor,
11
+ )
12
+
13
+ logging.basicConfig(
14
+ level=logging.INFO,
15
+ format="%(asctime)s - %(levelname)s - %(message)s",
16
+ )
17
+
18
+ MAX_PROJECT_IDS_PER_QUERY = 200
19
+
20
+
21
+ class Project(SalesforceQueryExecutor):
22
+ def get_batches(self, lst, n):
23
+ """Yield successive n-sized chunks from lst."""
24
+ for i in range(0, len(lst), n):
25
+ yield lst[i : i + n] # noqa: E203
26
+
27
+ def get_all(
28
+ self,
29
+ query: str = DEFAULT_PROJECTS_QUERY,
30
+ format: str = "json",
31
+ ):
32
+ data = self.fetch_data(query)
33
+ if data is None:
34
+ logging.error(
35
+ "[ERROR - SalesforceAPI]: No projects data return from Salesforce API" # noqa: E501
36
+ )
37
+ return []
38
+
39
+ try:
40
+ projects = [
41
+ ProjectDTO.from_salesforce_record(record) for record in data
42
+ ]
43
+ projects_list = list(projects)
44
+
45
+ if format == "json":
46
+ projects_list = [
47
+ project.to_dict() for project in projects_list
48
+ ]
49
+
50
+ return projects_list
51
+ except Exception as e:
52
+ logging.error(
53
+ f"[ERROR - get_all]: Failed to get all projects: {e}"
54
+ )
55
+ return []
@@ -0,0 +1,16 @@
1
+ DEFAULT_PROJECTS_QUERY = """
2
+ SELECT
3
+ Id,
4
+ Account.LKP_CustomerSubgroup__r.LKP_CustomerGroup__r.Name,
5
+ Account.Name,
6
+ FRM_ProjectName__c,
7
+ FRM_ProjectCode__c,
8
+ Tolabel(PCK_ProjectStatus__c),
9
+ DT_ProjectStartDate__c,
10
+ DT_ProjectEndDate__c,
11
+ LKP_AccountManager__r.Name,
12
+ Account_Billing_Country__c,
13
+ PCK_Division__c
14
+ FROM
15
+ Opportunity
16
+ """
@@ -0,0 +1,86 @@
1
+ from ms_salesforce_api.salesforce.helpers.string import normalize_value
2
+
3
+
4
+ class ProjectDTO(object):
5
+ def __init__(
6
+ self,
7
+ id,
8
+ account_customer_group_name,
9
+ account_name,
10
+ project_name,
11
+ project_code,
12
+ project_status,
13
+ project_startdate,
14
+ project_enddate,
15
+ account_manager_name,
16
+ account_billing_country,
17
+ division,
18
+ ):
19
+ self.id = id
20
+ self.account_customer_group_name = account_customer_group_name
21
+ self.account_name = account_name
22
+ self.project_name = project_name
23
+ self.project_code = project_code
24
+ self.project_status = project_status
25
+ self.project_startdate = project_startdate
26
+ self.project_enddate = project_enddate
27
+ self.account_manager_name = account_manager_name
28
+ self.account_billing_country = account_billing_country
29
+ self.division = division
30
+
31
+ @staticmethod
32
+ def from_salesforce_record(record):
33
+ def _get_account_customer_group_name():
34
+ try:
35
+ return normalize_value(
36
+ record["Account"]["LKP_CustomerSubgroup__r"][
37
+ "LKP_CustomerGroup__r"
38
+ ][
39
+ "Name"
40
+ ] # noqa: E501
41
+ )
42
+ except (KeyError, TypeError):
43
+ return None
44
+
45
+ def _get_account_name():
46
+ try:
47
+ return normalize_value(record["Account"]["Name"]) # noqa: E501
48
+ except (KeyError, TypeError):
49
+ return None
50
+
51
+ def _get_account_manager_name():
52
+ try:
53
+ return normalize_value(
54
+ record["LKP_AccountManager__r"]["Name"] # noqa: E501
55
+ )
56
+ except (KeyError, TypeError):
57
+ return None
58
+
59
+ return ProjectDTO(
60
+ id=record["Id"],
61
+ account_customer_group_name=_get_account_customer_group_name(),
62
+ account_name=_get_account_name(),
63
+ project_name=record["FRM_ProjectName__c"],
64
+ project_code=record["FRM_ProjectCode__c"],
65
+ project_status=record["PCK_ProjectStatus__c"],
66
+ project_startdate=record["DT_ProjectStartDate__c"],
67
+ project_enddate=record["DT_ProjectEndDate__c"],
68
+ account_manager_name=_get_account_manager_name(),
69
+ account_billing_country=record["Account_Billing_Country__c"],
70
+ division=record["PCK_Division__c"],
71
+ )
72
+
73
+ def to_dict(self):
74
+ return {
75
+ "id": self.id,
76
+ "account_customer_group_name": self.account_customer_group_name,
77
+ "account_name": self.account_name,
78
+ "project_name": self.project_name,
79
+ "project_code": self.project_code,
80
+ "project_status": self.project_status,
81
+ "project_startdate": self.project_startdate,
82
+ "project_enddate": self.project_enddate,
83
+ "account_manager_name": self.account_manager_name,
84
+ "account_billing_country": self.account_billing_country,
85
+ "division": self.division,
86
+ }
@@ -0,0 +1,75 @@
1
+ import logging
2
+
3
+ from gc_google_services_api.bigquery import BigQueryManager
4
+
5
+ logging.basicConfig(
6
+ level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
7
+ )
8
+
9
+
10
+ class BigQueryExporter:
11
+ """
12
+ Initializes the Bigquery exporter with the given project ID and dataset ID.
13
+
14
+ Args:
15
+ project_id (str): The ID of the Google Cloud project.
16
+ dataset_id (str): The ID of the BigQuery dataset.
17
+ """
18
+
19
+ def __init__(self, project_id, dataset_id):
20
+ self.project_id = project_id
21
+ self.dataset_id = dataset_id
22
+ self.client = BigQueryManager(
23
+ project_id=project_id,
24
+ dataset_id=dataset_id,
25
+ )
26
+ self.batch_size = 200
27
+ self.schemas = {
28
+ "projects_with_backup": {
29
+ "id": "STRING",
30
+ "account_customer_group_name": "STRING",
31
+ "account_name": "STRING",
32
+ "project_name": "STRING",
33
+ "project_code": "STRING",
34
+ "project_status": "STRING",
35
+ "project_startdate": "STRING",
36
+ "project_enddate": "STRING",
37
+ "account_manager_name": "STRING",
38
+ "account_billing_country": "STRING",
39
+ "division": "STRING",
40
+ },
41
+ }
42
+
43
+ for table_name, table_schema in self.schemas.items():
44
+ self.client.create_table_if_not_exists(table_name, table_schema)
45
+
46
+ def _execute_query(self, query, log_id, default_error_value=None):
47
+ custom_error_value = f"{log_id}_custom_error"
48
+
49
+ result = self.client.execute_query(
50
+ query,
51
+ custom_error_value,
52
+ )
53
+
54
+ if result == custom_error_value:
55
+ logging.error(
56
+ f"[ERROR - _execute_query]: Error executing query for {log_id} in BigQuery." # noqa: E501
57
+ )
58
+ result = default_error_value
59
+
60
+ return result
61
+
62
+ def export_data(self, profit_centers):
63
+ self.client.load_massive_data(
64
+ rows_to_insert=profit_centers,
65
+ table_name="projects_with_backup",
66
+ )
67
+
68
+ def delete_all_rows(self):
69
+ table_names = self.schemas.keys()
70
+ for table_name in table_names:
71
+ delete_query_table = f"DELETE FROM `{self.project_id}.{self.dataset_id}.{table_name}` WHERE true" # noqa: E501
72
+ self._execute_query(
73
+ query=delete_query_table,
74
+ log_id=f"delete_table_{table_name}",
75
+ )
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "ms-salesforce-api"
3
- version = "3.3.0"
3
+ version = "3.4.0"
4
4
  description = "Python library used to extract data from Salesforce API and migrate it to Bigquery and Postgres."
5
5
  authors = ["Making Science"]
6
6
  readme = "README.md"
@@ -15,7 +15,7 @@ pre-commit = "^3.1.1"
15
15
  pyjwt = {extras = ["crypto"], version = "^2.6.0"}
16
16
  requests = "^2.28.2"
17
17
  psycopg2-binary = "^2.9.6"
18
- gc-google-services-api = "^1.2.7"
18
+ gc-google-services-api = "2.4.0"
19
19
 
20
20
  [build-system]
21
21
  requires = ["poetry-core"]