Skip to content

Commit

Permalink
Import Standard Cost Code, Standard Category as Cost Center
Browse files Browse the repository at this point in the history
  • Loading branch information
ruuushhh committed Nov 2, 2023
1 parent 956b860 commit a23e109
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 4 deletions.
10 changes: 7 additions & 3 deletions apps/mappings/imports/modules/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,8 @@ def construct_payload_and_import_to_fyle(
"""
Construct Payload and Import to fyle in Batches
"""
is_auto_sync_status_allowed = self.get_auto_sync_permission()

filters = self.construct_attributes_filter(self.destination_field)

destination_attributes_count = DestinationAttribute.objects.filter(**filters).count()
Expand All @@ -209,7 +211,8 @@ def construct_payload_and_import_to_fyle(

for paginated_destination_attributes, is_last_batch in destination_attributes_generator:
fyle_payload = self.setup_fyle_payload_creation(
paginated_destination_attributes=paginated_destination_attributes
paginated_destination_attributes=paginated_destination_attributes,
is_auto_sync_status_allowed=is_auto_sync_status_allowed
)

self.post_to_fyle_and_sync(
Expand All @@ -236,7 +239,8 @@ def get_destination_attributes_generator(self, destination_attributes_count: int

def setup_fyle_payload_creation(
self,
paginated_destination_attributes: List[DestinationAttribute]
paginated_destination_attributes: List[DestinationAttribute],
is_auto_sync_status_allowed: bool
):
"""
Setup Fyle Payload Creation
Expand All @@ -247,7 +251,7 @@ def setup_fyle_payload_creation(
paginated_destination_attribute_values = [attribute.value for attribute in paginated_destination_attributes]
existing_expense_attributes_map = self.get_existing_fyle_attributes(paginated_destination_attribute_values)

return self.construct_fyle_payload(paginated_destination_attributes, existing_expense_attributes_map)
return self.construct_fyle_payload(paginated_destination_attributes, existing_expense_attributes_map, is_auto_sync_status_allowed)

def get_existing_fyle_attributes(self, paginated_destination_attribute_values: List[str]):
"""
Expand Down
57 changes: 57 additions & 0 deletions apps/mappings/imports/modules/cost_centers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from datetime import datetime
from typing import List
from apps.mappings.imports.modules.base import Base
from fyle_accounting_mappings.models import DestinationAttribute


class CostCenter(Base):
"""
Class for Cost Center module
"""

def __init__(self, workspace_id: int, destination_field: str, sync_after: datetime):
super().__init__(
workspace_id=workspace_id,
source_field="COST_CENTER",
destination_field=destination_field,
platform_class_name="cost_centers",
sync_after=sync_after,
)

def trigger_import(self):
"""
Trigger import for Cost Center module
"""
self.check_import_log_and_start_import()

def construct_fyle_payload(
self,
paginated_destination_attributes: List[DestinationAttribute],
existing_fyle_attributes_map: object,
is_auto_sync_status_allowed: bool
):
"""
Construct Fyle payload for CostCenter module
:param paginated_destination_attributes: List of paginated destination attributes
:param existing_fyle_attributes_map: Existing Fyle attributes map
:param is_auto_sync_status_allowed: Is auto sync status allowed
:return: Fyle payload
"""
payload = []

for attribute in paginated_destination_attributes:
cost_center = {
'name': attribute.value,
'code': attribute.destination_id,
'is_enabled': True if attribute.active is None else attribute.active,
'description': 'Cost Center - {0}, Id - {1}'.format(
attribute.value,
attribute.destination_id
)
}

# Create a new cost-center if it does not exist in Fyle
if attribute.value.lower() not in existing_fyle_attributes_map:
payload.append(cost_center)

return payload
4 changes: 3 additions & 1 deletion apps/mappings/imports/tasks.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
from apps.mappings.models import ImportLog
from apps.mappings.imports.modules.categories import Category
from apps.mappings.imports.modules.projects import Project
from apps.mappings.imports.modules.cost_centers import CostCenter
from apps.mappings.imports.modules.expense_custom_fields import ExpenseCustomField


SOURCE_FIELD_CLASS_MAP = {
'CATEGORY': Category,
'PROJECT': Project
'PROJECT': Project,
'COST_CENTER': CostCenter
}


Expand Down
30 changes: 30 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,3 +306,33 @@ def add_project_mappings():
detail='Sage 300 Project - Platform APIs, Id - 10081',
active=True
)


@pytest.fixture()
@pytest.mark.django_db(databases=['default'])
def add_cost_center_mappings():
"""
Pytest fixtue to add cost center mappings to a workspace
"""
workspace_ids = [
1, 2, 3
]
for workspace_id in workspace_ids:
DestinationAttribute.objects.create(
workspace_id=workspace_id,
attribute_type='COST_CENTER',
display_name='Direct Mail Campaign',
value='Direct Mail Campaign',
destination_id='10064',
detail='Cost Center - Direct Mail Campaign, Id - 10064',
active=True
)
DestinationAttribute.objects.create(
workspace_id=workspace_id,
attribute_type='COST_CENTER',
display_name='Platform APIs',
value='Platform APIs',
destination_id='10081',
detail='Cost Center - Platform APIs, Id - 10081',
active=True
)
15 changes: 15 additions & 0 deletions tests/test_mappings/test_imports/test_modules/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,20 @@
'is_enabled': False,
'name': 'Platform APIs'
}
],
"create_fyle_cost_center_payload_create_new_case":
[
{
'code': '10064',
'description': 'Cost Center - Direct Mail Campaign, Id - 10064',
'is_enabled': True,
'name': 'Direct Mail Campaign'
},
{
'description': 'Cost Center - Platform APIs, Id - 10081',
'is_enabled': True,
'name': 'Platform APIs',
'code': '10081',
}
]
}
21 changes: 21 additions & 0 deletions tests/test_mappings/test_imports/test_modules/test_cost_centers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from apps.mappings.imports.modules.cost_centers import CostCenter
from fyle_accounting_mappings.models import DestinationAttribute
from .fixtures import data


def test_construct_fyle_payload(api_client, test_connection, mocker, create_temp_workspace, add_sage300_creds, add_fyle_credentials, add_cost_center_mappings):
cost_center = CostCenter(1, 'COST_CENTER', None)

# create new case
paginated_destination_attributes = DestinationAttribute.objects.filter(workspace_id=1, attribute_type='COST_CENTER')

existing_fyle_attributes_map = {}
is_auto_sync_status_allowed = cost_center.get_auto_sync_permission()

fyle_payload = cost_center.construct_fyle_payload(
paginated_destination_attributes,
existing_fyle_attributes_map,
is_auto_sync_status_allowed
)

assert fyle_payload == data['create_fyle_cost_center_payload_create_new_case']

0 comments on commit a23e109

Please sign in to comment.