def async_auto_map_employees(workspace_id: int): configuration = Configuration.objects.get(workspace_id=workspace_id) employee_mapping_preference = configuration.auto_map_employees mapping_setting = MappingSetting.objects.filter( ~Q(destination_field='CREDIT_CARD_ACCOUNT'), source_field='EMPLOYEE', workspace_id=workspace_id).first() destination_type = mapping_setting.destination_field fyle_credentials = FyleCredential.objects.get(workspace_id=workspace_id) fyle_connection = FyleConnector( refresh_token=fyle_credentials.refresh_token, workspace_id=workspace_id) netsuite_credentials = NetSuiteCredentials.objects.get( workspace_id=workspace_id) netsuite_connection = NetSuiteConnector( netsuite_credentials=netsuite_credentials, workspace_id=workspace_id) fyle_connection.sync_employees() if destination_type == 'EMPLOYEE': netsuite_connection.sync_employees() else: netsuite_connection.sync_vendors() Mapping.auto_map_employees(destination_type, employee_mapping_preference, workspace_id)
def auto_create_project_mappings(workspace_id): """ Create Project Mappings """ try: fyle_credentials: FyleCredential = FyleCredential.objects.get( workspace_id=workspace_id) ns_credentials: NetSuiteCredentials = NetSuiteCredentials.objects.get( workspace_id=workspace_id) fyle_connection = FyleConnector( refresh_token=fyle_credentials.refresh_token, workspace_id=workspace_id) ns_connection = NetSuiteConnector(netsuite_credentials=ns_credentials, workspace_id=workspace_id) fyle_connection.sync_projects() ns_connection.sync_projects() ns_connection.sync_customers() post_projects_in_batches(fyle_connection, workspace_id) except WrongParamsError as exception: logger.error( 'Error while creating projects workspace_id - %s in Fyle %s %s', workspace_id, exception.message, {'error': exception.response}) except Exception: error = traceback.format_exc() error = {'error': error} logger.error( 'Error while creating projects workspace_id - %s error: %s', workspace_id, error)
def post_projects_in_batches(fyle_connection: FyleConnector, workspace_id: int): existing_project_names = ExpenseAttribute.objects.filter( attribute_type='PROJECT', workspace_id=workspace_id).values_list('value', flat=True) ns_attributes_count = DestinationAttribute.objects.filter( attribute_type='PROJECT', workspace_id=workspace_id).count() page_size = 200 for offset in range(0, ns_attributes_count, page_size): limit = offset + page_size paginated_ns_attributes = DestinationAttribute.objects.filter( attribute_type='PROJECT', workspace_id=workspace_id).order_by('value', 'id')[offset:limit] paginated_ns_attributes = remove_duplicates(paginated_ns_attributes) fyle_payload: List[Dict] = create_fyle_projects_payload( paginated_ns_attributes, existing_project_names, workspace_id) if fyle_payload: fyle_connection.connection.Projects.post(fyle_payload) fyle_connection.sync_projects() Mapping.bulk_create_mappings(paginated_ns_attributes, 'PROJECT', 'PROJECT', workspace_id)
def get(self, request, *args, **kwargs): """ Get User Details """ fyle_credentials = AuthToken.objects.get(user__user_id=request.user) fyle_connector = FyleConnector(fyle_credentials.refresh_token) employee_profile = fyle_connector.get_employee_profile() return Response(data=employee_profile, status=status.HTTP_200_OK)
def async_auto_map_ccc_account(workspace_id: int): general_mappings = GeneralMapping.objects.get(workspace_id=workspace_id) default_ccc_account_id = general_mappings.default_ccc_account_id fyle_credentials = FyleCredential.objects.get(workspace_id=workspace_id) fyle_connection = FyleConnector( refresh_token=fyle_credentials.refresh_token, workspace_id=workspace_id) fyle_connection.sync_employees() Mapping.auto_map_ccc_employees('CREDIT_CARD_ACCOUNT', default_ccc_account_id, workspace_id)
def process_reimbursements(workspace_id): fyle_credentials = FyleCredential.objects.get(workspace_id=workspace_id) fyle_connector = FyleConnector(fyle_credentials.refresh_token, workspace_id) fyle_connector.sync_reimbursements() reimbursements = Reimbursement.objects.filter( state='PENDING', workspace_id=workspace_id).all() reimbursement_ids = [] if reimbursements: for reimbursement in reimbursements: expenses = Expense.objects.filter( settlement_id=reimbursement.settlement_id, fund_source='PERSONAL').all() paid_expenses = expenses.filter(paid_on_netsuite=True) all_expense_paid = False if len(expenses): all_expense_paid = len(expenses) == len(paid_expenses) if all_expense_paid: reimbursement_ids.append(reimbursement.reimbursement_id) if reimbursement_ids: fyle_connector.post_reimbursement(reimbursement_ids) fyle_connector.sync_reimbursements()
def get(self, request, *args, **kwargs): """ Get cluster domain from Fyle """ try: fyle_credentials = AuthToken.objects.get( user__user_id=request.user) fyle_connector = FyleConnector(fyle_credentials.refresh_token) cluster_domain = fyle_connector.get_cluster_domain( )['cluster_domain'] return Response(data=cluster_domain, status=status.HTTP_200_OK) except FyleCredential.DoesNotExist: return Response(data={'message': 'Invalid / Expired Token'}, status=status.HTTP_400_BAD_REQUEST)
def load_attachments(netsuite_connection: NetSuiteConnector, expense_id: str, expense_group: ExpenseGroup): """ Get attachments from Fyle :param netsuite_connection: NetSuite Connection :param expense_id: Fyle expense id :param expense_group: Integration Expense group """ workspace_id = expense_group.workspace_id try: fyle_credentials = FyleCredential.objects.get( workspace_id=workspace_id) fyle_connector = FyleConnector(fyle_credentials.refresh_token, workspace_id) attachment = fyle_connector.get_attachment(expense_id) folder = netsuite_connection.connection.folders.post({ "externalId": '{}-{}-{}'.format(workspace_id, expense_group.id, expense_group.description['employee_email']), "name": '{}-{}-{}'.format(workspace_id, expense_group.id, expense_group.description['employee_email']) }) if attachment: netsuite_connection.connection.files.post({ "externalId": expense_id, "name": attachment['filename'], 'content': base64.b64decode(attachment['content']), "folder": { "name": None, "internalId": folder['internalId'], "externalId": folder['externalId'], "type": "folder" } }) file = netsuite_connection.connection.files.get( externalId=expense_id) return file['url'] except Exception: error = traceback.format_exc() logger.error( 'Attachment failed for expense group id %s / workspace id %s Error: %s', expense_id, workspace_id, {'error': error})
def create_vendor_payment(workspace_id): try: fyle_credentials = FyleCredential.objects.get( workspace_id=workspace_id) fyle_connector = FyleConnector(fyle_credentials.refresh_token, workspace_id) fyle_connector.sync_reimbursements() bills = Bill.objects.filter( payment_synced=False, expense_group__workspace_id=workspace_id, expense_group__fund_source='PERSONAL', expense_group__exported_at__isnull=False).all() expense_reports = ExpenseReport.objects.filter( payment_synced=False, expense_group__workspace_id=workspace_id, expense_group__fund_source='PERSONAL', expense_group__exported_at__isnull=False).all() with transaction.atomic(): if bills: bill_entity_map = create_netsuite_payment_objects( bills, 'BILL', workspace_id) for entity_object_key in bill_entity_map: entity_id = entity_object_key entity_object = bill_entity_map[entity_id] process_vendor_payment(entity_object, workspace_id, 'BILL') if expense_reports: expense_report_entity_map = create_netsuite_payment_objects( expense_reports, 'EXPENSE REPORT', workspace_id) for entity_object_key in expense_report_entity_map: entity_id = entity_object_key entity_object = expense_report_entity_map[entity_id] process_vendor_payment(entity_object, workspace_id, 'EXPENSE REPORT') except Exception: error = traceback.format_exc() logger.exception('Something unexpected happened workspace_id: %s %s', workspace_id, {'error': error})
def upload_categories_to_fyle(workspace_id, reimbursable_expenses_object): """ Upload categories to Fyle """ fyle_credentials: FyleCredential = FyleCredential.objects.get( workspace_id=workspace_id) netsuite_credentials: NetSuiteCredentials = NetSuiteCredentials.objects.get( workspace_id=workspace_id) fyle_connection = FyleConnector( refresh_token=fyle_credentials.refresh_token, workspace_id=workspace_id) netsuite_connection = NetSuiteConnector( netsuite_credentials=netsuite_credentials, workspace_id=workspace_id) fyle_connection.sync_categories() if reimbursable_expenses_object == 'EXPENSE REPORT': netsuite_connection.sync_expense_categories() netsuite_attributes: List[ DestinationAttribute] = DestinationAttribute.objects.filter( workspace_id=workspace_id, attribute_type='EXPENSE_CATEGORY') else: netsuite_connection.sync_accounts() netsuite_attributes: List[ DestinationAttribute] = DestinationAttribute.objects.filter( workspace_id=workspace_id, attribute_type='ACCOUNT') netsuite_attributes = remove_duplicates(netsuite_attributes) fyle_payload: List[Dict] = create_fyle_categories_payload( netsuite_attributes, workspace_id) if fyle_payload: fyle_connection.connection.Categories.post(fyle_payload) fyle_connection.sync_categories() return netsuite_attributes