Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
    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)
Example #5
0
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)
Example #6
0
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()
Example #7
0
    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)
Example #8
0
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})
Example #9
0
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})
Example #10
0
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