Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: qbd direct post onboarding skipped export log page settings #1006

Conversation

DhaaraniCIT
Copy link
Contributor

@DhaaraniCIT DhaaraniCIT commented Oct 8, 2024

Description

Qbd direct post onboarding skipped export log page settings

Clickup

https://app.clickup.com/t/86cwmduu2

Summary by CodeRabbit

  • New Features

    • Introduced comprehensive configuration options for QuickBooks Desktop integration, including detailed settings for exporting and importing data.
    • Added new components for managing export logs and skipped exports, enhancing user interaction with the dashboard.
    • Implemented a new routing structure for the QBD Direct integration, facilitating navigation between various settings and logs.
  • Bug Fixes

    • Improved loading states and error handling across various components to enhance user experience.
  • Documentation

    • Updated routing and component structure documentation to reflect new features and integrations.
  • Tests

    • Added test specifications for new components and services to ensure functionality and reliability.

Copy link
Contributor

coderabbitai bot commented Oct 8, 2024

Walkthrough

The changes introduce a comprehensive configuration for QuickBooks Desktop (QBD) integration across multiple files. Key additions include a new configuration object qbd_direct with nested properties for landing, configuration, export settings, and import settings. New services and components are created to manage advanced settings, export logs, and import settings, enhancing the application's capability to handle QBD functionalities. Additionally, routing modules are established for the QBD dashboard and configuration, facilitating a structured navigation experience.

Changes

File Path Change Summary
src/app/branding/c1-contents-config.ts Added new configuration object qbd_direct with nested properties: landing, configuration, exportSetting, and importSetting.
src/app/branding/fyle-contents-config.ts Introduced qbd_direct property under fyleContents with nested landing and configuration objects.
src/app/core/models/branding/content-configuration.model.ts Added qbd_direct key to ContentConfiguration type with nested structure for settings.
src/app/core/models/enum/enum.model.ts Introduced new enums: QbdDirectOnboardingState, QbdDirectReimbursableExpensesObject, and updated existing enums with QBD_DIRECT entries.
src/app/core/models/integrations/integrations.model.ts Updated AppUrlMap to include AppUrl.QBD_DIRECT.
src/app/core/models/misc/tracking.model.ts Added entry for QBD_DIRECT in TrackingAppMap and trackingAppMap.
src/app/core/models/qbd-direct/db/qbd-direct-task-log.model.ts Introduced QuickbooksError, QbdDirectTaskLog, and QbdDirectTaskResponse interfaces.
src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-advanced-settings.model.ts Created model for advanced settings with methods for handling API interactions.
src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-export-settings.model.ts Added types and methods for managing export settings related to QBD.
src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-import-settings.model copy.ts Introduced types and methods for managing import settings for QBD.
src/app/core/services/common/helper.service.ts Updated setBaseApiURL to include mapping for AppUrl.QBD_DIRECT.
src/app/core/services/common/workspace.service.ts Modified getOnboardingState to include entry for QBD_DIRECT.
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-advanced-settings.service.spec.ts Created test spec for QbdDirectAdvancedSettingsService.
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-advanced-settings.service.ts Introduced QbdDirectAdvancedSettingsService for managing advanced settings.
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-export-settings.service.spec.ts Created test spec for QbdDirectExportSettingsService.
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-export-settings.service.ts Introduced QbdDirectExportSettingsService for handling export settings.
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-import-settings.service.spec.ts Created test spec for QbdDirectImportSettingsService.
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-import-settings.service.ts Introduced QbdDirectImportSettingsService for managing import settings.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-auth.service.spec.ts Created test spec for QbdDirectAuthService.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-auth.service.ts Introduced QbdDirectAuthService.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.spec.ts Created test spec for QbdDirectConnectorService.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.ts Introduced QbdDirectConnectorService.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-helper.service.spec.ts Created test spec for QbdDirectHelperService.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-helper.service.ts Introduced QbdDirectHelperService.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-mappings.service.spec.ts Created test spec for QbdDirectMappingsService.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-mappings.service.ts Introduced QbdDirectMappingsService.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-workspace.service.spec.ts Created test spec for QbdDirectWorkspaceService.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-workspace.service.ts Introduced QbdDirectWorkspaceService.
src/app/core/services/qbd/qbd-configuration/qbd-advanced-setting.service.ts Updated constructor to include HelperService.
src/app/core/services/qbd/qbd-configuration/qbd-export-setting.service.ts Updated constructor to include HelperService.
src/app/integrations/integrations-routing.module.ts Added lazy-loaded route for qbd_direct.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-configuration/qbd-direct-configuration-routing.module.ts Created routing module for QBD Direct configuration.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-configuration/qbd-direct-configuration.component.html Enhanced HTML structure with conditional rendering.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-configuration/qbd-direct-configuration.component.spec.ts Created test spec for QbdDirectConfigurationComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-configuration/qbd-direct-configuration.component.ts Introduced QbdDirectConfigurationComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-configuration/qbd-direct-configuration.module.ts Created QbdDirectConfigurationModule.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-dashboard/qbd-direct-dashboard-routing.module.ts Created routing module for QBD Direct dashboard.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-dashboard/qbd-direct-dashboard.component.html Enhanced dashboard HTML structure.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-dashboard/qbd-direct-dashboard.component.spec.ts Created test spec for QbdDirectDashboardComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-dashboard/qbd-direct-dashboard.component.ts Introduced QbdDirectDashboardComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-dashboard/qbd-direct-dashboard.module.ts Created QbdDirectDashboardModule.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-complete-export-log/qbd-direct-complete-export-log.component.html Enhanced export log UI with loading indicators and filters.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-complete-export-log/qbd-direct-complete-export-log.component.spec.ts Created test spec for QbdDirectCompleteExportLogComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-complete-export-log/qbd-direct-complete-export-log.component.ts Introduced QbdDirectCompleteExportLogComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-export-log-routing.module.ts Created routing module for export log.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-export-log.component.html Enhanced export log component layout.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-export-log.component.spec.ts Created test spec for QbdDirectExportLogComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-export-log.component.ts Introduced QbdDirectExportLogComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-export-log.module.ts Created QbdDirectExportLogModule.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-skipped-export-log/qbd-direct-skipped-export-log.component.html Enhanced skipped export log UI.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-skipped-export-log/qbd-direct-skipped-export-log.component.spec.ts Created test spec for QbdDirectSkippedExportLogComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-skipped-export-log/qbd-direct-skipped-export-log.component.ts Introduced QbdDirectSkippedExportLogComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-main-routing.module.ts Created routing module for QBD Direct main component.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-main.component.html Enhanced main component layout.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-main.component.spec.ts Created test spec for QbdDirectMainComponent.
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-main.component.ts Introduced QbdDirectMainComponent.

Possibly related PRs

Suggested labels

deploy, c1_staging_deploy

Suggested reviewers

  • ashwin1111

🐇 In the meadow, changes bloom,
A QBD dance dispels the gloom.
With settings new and paths to trace,
Integration finds its rightful place.
Hop along, let’s celebrate,
For QuickBooks now can integrate! 🌼


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions github-actions bot added the size/XL Extra Large PR label Oct 8, 2024
@DhaaraniCIT DhaaraniCIT changed the base branch from master to qbd-direct-post-onboarding-sucessful-export-log-page-settings October 8, 2024 13:00
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post

🛑 Comments failed to post (74)
src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-done/qbd-direct-onboarding-done.component.html (1)

1-1: 💡 Codebase verification

Action Required: navigateToDashboard() Method Does Not Handle Export Log Page Settings

The navigateToDashboard() method in qbd-direct-onboarding-done.component.ts only navigates to /integrations/qbd_direct/main/dashboard and does not handle export log page settings as required by the PR objectives.

🔗 Analysis chain

LGTM! Consider adding a comment for clarity.

The implementation aligns with the PR objectives by providing a mechanism to complete the QBD direct onboarding process and navigate to the dashboard.

Consider adding a comment above this line to explain the purpose of this component and its role in the QBD direct onboarding process. This would enhance code readability. For example:

<!-- Onboarding completion component for QBD direct integration -->
<app-onboarding-done (launchIntegrationClick)="navigateToDashboard()"></app-onboarding-done>

Please ensure that the navigateToDashboard() method in the corresponding component file handles the export log page settings as mentioned in the PR objectives. You can verify this by running the following script:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation of navigateToDashboard() method

# Test: Search for the navigateToDashboard method in the corresponding component file
# Expect: The method should handle export log page settings
rg --type typescript -A 10 'navigateToDashboard\(\)' src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-done/

Length of output: 171


Script:

#!/bin/bash
# Description: Verify the implementation of navigateToDashboard() method

# Search for the navigateToDashboard method in TypeScript files within the specified directory
rg 'navigateToDashboard\(\)' src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-done/ --glob '*.ts' -A 10

Length of output: 847

src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-main.component.html (1)

1-1: 🛠️ Refactor suggestion

Consider using a custom class for conditional styling

The ngClass directive is using Tailwind CSS utility classes for conditional styling. While this works, it might be more maintainable to create a custom class in your component's CSS file that encapsulates these styles.

Consider refactoring the ngClass usage as follows:

-<div [ngClass]="{'tw-h-100-vh tw-bg-bg-tertiary-lighter tw-overflow-auto': brandingFeatureConfig.isBackgroundColorAllowed}">
+<div [ngClass]="{'qbd-main-container': brandingFeatureConfig.isBackgroundColorAllowed}">

Then, in your component's CSS file:

.qbd-main-container {
  height: 100vh;
  background-color: var(--bg-tertiary-lighter);
  overflow: auto;
}

This approach improves maintainability and keeps your template cleaner.

src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-import-settings/qbd-direct-onboarding-import-settings.component.ts (1)

10-12: ⚠️ Potential issue

Implement component logic for import settings.

The component class is currently empty. For a component dealing with import settings, we would typically expect to see properties and methods to handle these settings.

Consider implementing the following:

  1. Properties to store import settings
  2. Methods to handle user interactions
  3. Lifecycle hooks if needed (e.g., ngOnInit to fetch initial settings)

Would you like assistance in scaffolding the basic structure for this component's logic?

src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-advanced-settings.service.spec.ts (1)

1-16: 🛠️ Refactor suggestion

Enhance test coverage and configuration

The basic structure of the test file is correct, but there are opportunities for improvement:

  1. The testing module configuration is currently empty. Consider adding necessary dependencies or mock services that the QbdDirectAdvancedSettingsService might require.

  2. There's only one basic test case checking if the service is created. To ensure comprehensive coverage, add more test cases that verify the service's methods and behavior.

Here's a suggested structure for more comprehensive testing:

import { TestBed } from '@angular/core/testing';
import { QbdDirectAdvancedSettingsService } from './qbd-direct-advanced-settings.service';
// Import any dependencies the service might have
// import { DependencyService } from './dependency.service';

describe('QbdDirectAdvancedSettingsService', () => {
  let service: QbdDirectAdvancedSettingsService;
  // let dependencyService: jasmine.SpyObj<DependencyService>;

  beforeEach(() => {
    // const dependencyServiceSpy = jasmine.createSpyObj('DependencyService', ['someMethod']);

    TestBed.configureTestingModule({
      providers: [
        QbdDirectAdvancedSettingsService,
        // { provide: DependencyService, useValue: dependencyServiceSpy }
      ]
    });
    service = TestBed.inject(QbdDirectAdvancedSettingsService);
    // dependencyService = TestBed.inject(DependencyService) as jasmine.SpyObj<DependencyService>;
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  // Add more test cases here
  // it('should perform specific action', () => {
  //   // Arrange
  //   // Act
  //   // Assert
  // });
});

This structure provides a more robust foundation for testing the service. Remember to replace the commented sections with actual dependencies and test cases specific to your QbdDirectAdvancedSettingsService.

Would you like assistance in generating more specific test cases based on the actual methods and behavior of the QbdDirectAdvancedSettingsService?

src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-mapping/qbd-direct-mapping.component.html (1)

1-2: 🛠️ Refactor suggestion

Consider improving the gradient background implementation.

The current implementation uses two absolutely positioned divs with fixed heights for the gradient background. This approach might have some drawbacks:

  1. Absolute positioning could potentially cause layout issues with other elements.
  2. The purpose of having two identical divs with different background classes (tw-bg-header-1 and tw-bg-header-2) is not clear. If this is intended to create a gradient effect, consider using a single div with a CSS gradient instead.
  3. The fixed height of 84px might not be responsive on all screen sizes.

Consider refactoring this section to improve responsiveness and clarity:

<div *ngIf="isGradientAllowed" class="tw-absolute tw-w-full tw-h-[10vh] tw-bg-gradient-to-b tw-from-header-1 tw-to-header-2"></div>

This suggestion uses a single div with a gradient background and a responsive height based on the viewport height.

src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-configuration/qbd-direct-configuration.module.ts (1)

9-17: ⚠️ Potential issue

Fix @NgModule decorator configuration.

There are a couple of issues with the current @NgModule configuration:

  1. The declarations array is empty. It should include components that belong to this module.
  2. QbdDirectConfigurationComponent is incorrectly placed in the imports array. It should be in the declarations array instead.

Please apply the following changes:

@NgModule({
-  declarations: [],
+  declarations: [
+    QbdDirectConfigurationComponent
+  ],
  imports: [
    CommonModule,
-   QbdDirectConfigurationComponent,
    QbdDirectConfigurationRoutingModule,
    SharedModule
  ]
})

This will ensure that the QbdDirectConfigurationComponent is properly declared in this module and can be used within its templates.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

@NgModule({
  declarations: [
    QbdDirectConfigurationComponent
  ],
  imports: [
    CommonModule,
    QbdDirectConfigurationRoutingModule,
    SharedModule
  ]
})
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-mapping/qbd-direct-mapping-routing.module.ts (1)

6-17: 💡 Codebase verification

Inconsistent application of route guards detected.

Other routing modules utilize canActivate guards such as AuthGuard, QboTokenGuard, and BusinessCentralTokenGuard to manage access control. However, the current qbd-direct-mapping-routing.module.ts does not implement any route guards. To ensure consistent security measures across the application, consider adding appropriate route guards to this routing module.

🔗 Analysis chain

Route definitions are well-structured.

The route configuration is appropriate for the QBD Direct Mapping feature. The use of a dynamic segment :source_field provides flexibility in routing.

Consider verifying if any route guards or resolvers are needed for these routes, especially for the dynamic segment, to ensure proper access control and data loading.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for existing route guards in the project

# Test: Search for route guard implementations
echo "Searching for route guard implementations:"
rg --type typescript "implements CanActivate|extends CanActivate" -g "!node_modules"

# Test: Search for resolver implementations
echo "Searching for resolver implementations:"
rg --type typescript "implements Resolve|extends Resolve" -g "!node_modules"

# Test: Check if guards or resolvers are used in other routing modules
echo "Checking usage of guards or resolvers in routing modules:"
rg --type typescript "canActivate:|resolve:" -g "*routing.module.ts" -g "!node_modules"

Length of output: 669


Script:

#!/bin/bash
# Description: Check for existing route guards and resolvers in the project

# Test: Search for route guard implementations
echo "Searching for route guard implementations:"
rg --type ts --type tsx "implements CanActivate|extends CanActivate" -g "!node_modules"

# Test: Search for resolver implementations
echo "Searching for resolver implementations:"
rg --type ts --type tsx "implements Resolve|extends Resolve" -g "!node_modules"

# Test: Check if guards or resolvers are used in other routing modules
echo "Checking usage of guards or resolvers in routing modules:"
rg --type ts --type tsx "canActivate:|resolve:" -g "*routing.module.ts" -g "!node_modules"

Length of output: 657


Script:

#!/bin/bash
# Description: Check for existing route guards and resolvers in the project using filename patterns

# Test: Search for route guard implementations
echo "Searching for route guard implementations:"
rg "implements CanActivate|extends CanActivate" -g "*.ts" -g "*.tsx" -g "!node_modules/**"

# Test: Search for resolver implementations
echo "Searching for resolver implementations:"
rg "implements Resolve|extends Resolve" -g "*.ts" -g "*.tsx" -g "!node_modules/**"

# Test: Check if guards or resolvers are used in other routing modules
echo "Checking usage of guards or resolvers in routing modules:"
rg "canActivate:|resolve:" -g "*routing.module.ts" -g "*routing.module.tsx" -g "!node_modules/**"

Length of output: 2825

src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-mapping/qbd-direct-mapping.component.spec.ts (1)

5-18: 💡 Codebase verification

Potential dependencies are missing in the TestBed configuration.

The test suite is well-structured and follows Angular testing best practices. However, it appears that mappingService and router are used within the QbdDirectMappingComponent but are not provided in the TestBed configuration. To ensure that all dependencies are properly injected, consider updating the TestBed setup as follows:

TestBed.configureTestingModule({
  imports: [QbdDirectMappingComponent, /* other required modules */],
  providers: [MappingService, Router]
})

Please verify that all necessary services and modules are included to avoid potential runtime issues.

🔗 Analysis chain

Test suite setup looks good, but consider potential dependencies.

The test suite is well-structured and follows Angular testing best practices. However, consider the following:

  1. If QbdDirectMappingComponent has any dependencies (services, etc.), make sure to add them to the TestBed configuration.
  2. If there are any required modules, include them in the imports array of the TestBed configuration.

Example:

TestBed.configureTestingModule({
  imports: [QbdDirectMappingComponent, /* other required modules */],
  providers: [/* any required services */]
})

To help identify potential dependencies, you can run the following command:

This will help us see the constructor of the component and identify any injected dependencies.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Search for the QbdDirectMappingComponent to identify potential dependencies

ast-grep --lang typescript --pattern 'class QbdDirectMappingComponent {
  constructor($$$) {
    $$$
  }
  $$$
}'

Length of output: 115


Script:

#!/bin/bash
# Description: Search for dependencies injected or used within QbdDirectMappingComponent

rg 'QbdDirectMappingComponent' --glob '*.ts' --context 5
rg 'this\.\w+' --glob 'src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-mapping/*.ts' -A 2

Length of output: 8442


Script:

#!/bin/bash
# Description: Search for constructors with parameter properties in QbdDirectMappingComponent

ast-grep --lang typescript --pattern 'class QbdDirectMappingComponent {
  constructor(private $_: $_, private $_: $_) {
    $$$
  }
  $$$
}'

# Additionally, search for all injected services within the component
rg 'constructor\(([^)]*)\)' --glob 'src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-mapping/*.ts'

Length of output: 253

src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-export-settings.service.ts (1)

13-19: 🛠️ Refactor suggestion

Consider moving setBaseApiURL() call out of the constructor.

While the dependency injection is correctly implemented, calling helper.setBaseApiURL() in the constructor might lead to unexpected side effects during service instantiation. Consider moving this setup to a separate initialization method that can be called explicitly when needed.

Example refactor:

constructor(
  private apiService: ApiService,
  private workspaceService: WorkspaceService,
  private helper: HelperService
) {}

initializeService(): void {
  this.helper.setBaseApiURL();
}

This approach allows for more control over when the base URL is set and improves testability.

src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-export-log.component.ts (1)

1-42: 💡 Codebase verification

The test file for QbdDirectExportLogComponent exists but lacks comprehensive tests.

While it's good to see that a test file is present, it currently only verifies that the component is created. To ensure robust testing of the navigation logic, please add the following test:

  • Verify that the component initializes with the first module and navigates to its corresponding route.

Enhancing the test file will help maintain the reliability of the component's navigation functionality.

🔗 Analysis chain

Overall, the QbdDirectExportLogComponent is well-implemented and follows Angular best practices.

The component provides a clear structure for navigating between completed and skipped export logs. It makes good use of Angular features such as standalone components and dependency injection. The code is clean, readable, and consistent.

To ensure the navigation logic works as expected, consider adding a unit test for the component. Here's a shell script to verify if a test file exists and create a basic test structure if it doesn't:

This script will help ensure that proper testing is in place for the component's navigation logic.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
TEST_FILE="src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-export-log.component.spec.ts"

if [ ! -f "$TEST_FILE" ]; then
  echo "Test file does not exist. Creating a basic test structure."
  cat << EOF > "$TEST_FILE"
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { QbdDirectExportLogComponent } from './qbd-direct-export-log.component';

describe('QbdDirectExportLogComponent', () => {
  let component: QbdDirectExportLogComponent;
  let fixture: ComponentFixture<QbdDirectExportLogComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [RouterTestingModule, QbdDirectExportLogComponent],
    }).compileComponents();

    fixture = TestBed.createComponent(QbdDirectExportLogComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });

  it('should initialize with the first module and navigate to its route', () => {
    const routerSpy = spyOn(component['router'], 'navigateByUrl');
    component.ngOnInit();
    expect(component.activeModule).toBe(component.modules[0]);
    expect(routerSpy).toHaveBeenCalledWith(component.modules[0].routerLink);
  });
});
EOF
  echo "Basic test structure created at $TEST_FILE"
else
  echo "Test file already exists at $TEST_FILE"
fi

# Display the content of the test file
cat "$TEST_FILE"

Length of output: 1328

src/app/core/models/integrations/integrations.model.ts (1)

47-47: 💡 Codebase verification

Issue Detected: Duplicate QBD_DIRECT Enum Definitions

There are multiple definitions of QBD_DIRECT in enum.model.ts:

  • QBD_DIRECT = 'QuickBooks Desktop '
  • QBD_DIRECT = 'qbd_direct'

The trailing space in 'QuickBooks Desktop ' may lead to inconsistencies and potential bugs. Please consolidate these definitions to ensure consistency across the codebase.

🔗 Analysis chain

LGTM: New QBD Direct URL mapping added

The addition of [AppUrl.QBD_DIRECT]: string to the AppUrlMap type is consistent with the existing structure and naming conventions. This change appears to support the new QuickBooks Desktop direct integration mentioned in the PR objectives.

To ensure this change is properly utilized, let's verify its usage across the codebase:


To proceed with verifying the usage of AppUrl.QBD_DIRECT, please run the following corrected shell scripts:


To further verify the integrity of the QBD_DIRECT definitions and their usage, please run the following shell scripts:


To correctly verify the enum definitions of QBD_DIRECT, please run the following updated shell scripts:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for usage of AppUrl.QBD_DIRECT in the codebase

# Search for AppUrl.QBD_DIRECT usage
echo "Searching for AppUrl.QBD_DIRECT usage:"
rg --type typescript "AppUrl\.QBD_DIRECT" -C 3

# Search for QBD_DIRECT enum value definition
echo "\nSearching for QBD_DIRECT enum definition:"
rg --type typescript "QBD_DIRECT\s*=\s*" -C 3

Length of output: 547


Script:

# 
#!/bin/bash
# Description: Check for usage of AppUrl.QBD_DIRECT in the codebase

echo "Searching for AppUrl.QBD_DIRECT usage:"
rg --type=ts "AppUrl\.QBD_DIRECT" -C 3

echo "\nSearching for QBD_DIRECT enum value definition:"
rg --type=ts "QBD_DIRECT\s*=\s*" -C 3

Length of output: 3506


Script:

# 
#!/bin/bash
# Description: Verify all occurrences and definitions of QBD_DIRECT to identify potential conflicts

echo "Searching for all occurrences of QBD_DIRECT:"
rg --type=ts "QBD_DIRECT" -C 3

echo "\nSearching for enum definitions of QBD_DIRECT in enum.model.ts:"
rg --type=ts "enum\s+\w+\s*{\s*[^}]*QBD_DIRECT\s*=" src/app/core/models/enum/enum.model.ts -C 3

Length of output: 9272


Script:

# 
#!/bin/bash
# Description: Verify all occurrences and definitions of QBD_DIRECT to identify potential conflicts

echo "Searching for all occurrences of QBD_DIRECT:"
rg --type=ts "QBD_DIRECT" -C 3

echo "\nSearching for enum definitions of QBD_DIRECT in enum.model.ts:"
rg --type=ts "enum\\s+\\w+\\s*{[^}]*QBD_DIRECT\\s*=" src/app/core/models/enum/enum.model.ts -C 3

Length of output: 9266

src/app/core/models/misc/tracking.model.ts (1)

55-56: 💡 Codebase verification

Multiple definitions of QBD_DIRECT found in enum.model.ts.

The enum QBD_DIRECT is defined multiple times with different values, which may lead to conflicts and unexpected behavior:

  • QBD_DIRECT = 'QuickBooks Desktop '
  • QBD_DIRECT = 'qbd_direct'
  • QBD_DIRECT = 'QBD_DIRECT'

Please consolidate these definitions to ensure consistency and prevent potential issues.

🔗 Analysis chain

LGTM! Verify enum definitions for completeness.

The addition of [AppName.QBD_DIRECT]: TrackingApp.QBD_DIRECT to the TrackingAppMap type is consistent with the existing structure and aligns with the PR objectives for QBD direct post onboarding.

Please ensure that AppName.QBD_DIRECT and TrackingApp.QBD_DIRECT are properly defined in the enum.model.ts file. Run the following script to verify:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify enum definitions for QBD_DIRECT

# Test: Search for QBD_DIRECT in enum definitions
rg --type typescript 'QBD_DIRECT' src/app/core/models/enum/enum.model.ts

Length of output: 93


Script:

#!/bin/bash
# Description: Verify enum definitions for QBD_DIRECT

# Test: Search for QBD_DIRECT in enum.model.ts
rg 'QBD_DIRECT' src/app/core/models/enum/enum.model.ts

Length of output: 147

src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-import-settings.service.ts (1)

6-6: ⚠️ Potential issue

Correct the import path by removing 'copy' from the file name

The import statement at line 6 includes ' copy' at the end of the file name, which may lead to build or runtime errors due to an incorrect file path.

Apply this diff to fix the import statement:

-import { QbdDirectImportSettingGet, QbdDirectImportSettingPost } from 'src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-import-settings.model copy';
+import { QbdDirectImportSettingGet, QbdDirectImportSettingPost } from 'src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-import-settings.model';
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

import { QbdDirectImportSettingGet, QbdDirectImportSettingPost } from 'src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-import-settings.model';
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-dashboard/qbd-direct-dashboard.component.html (5)

4-6: 🛠️ Refactor suggestion

Enhance accessibility for the loading spinner

Ensure that the loading spinner is accessible to users relying on assistive technologies. Consider adding appropriate ARIA attributes, such as role="status" and aria-live="polite", to announce the loading state.


23-27: ⚠️ Potential issue

Incomplete header text in zero state component

The headerText for the zero state component seems incomplete when brandingConfig.brandId === 'fyle':

[headerText]="brandingConfig.brandId === 'fyle' ? 'Looks like you have' : 'No records to show yet'"

The text 'Looks like you have' may be missing additional information. Consider updating it to provide a complete message.

Apply this diff to fix the header text:

- [headerText]="brandingConfig.brandId === 'fyle' ? 'Looks like you have' : 'No records to show yet'"
+ [headerText]="brandingConfig.brandId === 'fyle' ? 'No records to export' : 'No records to show yet'"

25-26: 🛠️ Refactor suggestion

Standardize conditional text messages

To improve maintainability, consider defining the conditional texts in the component class and referencing them in the template. This approach centralizes the text management and simplifies future updates.

In your component class:

public headerText: string;
public subHeaderText: string;

ngOnInit() {
  if (this.brandingConfig.brandId === 'fyle') {
    this.headerText = 'No records to export';
    this.subHeaderText = '0 expenses to export right now';
  } else {
    this.headerText = 'No records to show yet';
    this.subHeaderText = 'Looks like you have no records to export right now.';
  }
}

In your template:

[headerText]="headerText"
[subHeaderText]="subHeaderText"

36-46: ⚠️ Potential issue

Add null checks to prevent runtime errors

In the *ngIf condition for the <app-dashboard-error-section>, you access the .length property of several arrays:

*ngIf="errors.EMPLOYEE_MAPPING.length || errors.CATEGORY_MAPPING.length || errors.ACCOUNTING_ERROR.length"

If any of these arrays are null or undefined, it could result in a runtime error. Ensure that these arrays are initialized or add null-safe checks.

Update the condition with null checks:

*ngIf="(errors.EMPLOYEE_MAPPING?.length || 0) > 0 || (errors.CATEGORY_MAPPING?.length || 0) > 0 || (errors.ACCOUNTING_ERROR?.length || 0) > 0"

Or, initialize the arrays in the component class:

public errors = {
  EMPLOYEE_MAPPING: [],
  CATEGORY_MAPPING: [],
  ACCOUNTING_ERROR: []
};

38-38: ⚠️ Potential issue

Ensure AppUrl is accessible in the template

The template uses AppUrl.QBD_DIRECT, but AppUrl may not be directly available in the template scope. Confirm that AppUrl is exposed to the template via the component class.

In your component class, import and assign AppUrl:

import { AppUrl } from 'path-to-app-url';

@Component({
  // ...
})
export class QbdDirectDashboardComponent {
  public AppUrl = AppUrl;
  // ...
}
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-mapping/qbd-direct-mapping.component.ts (5)

56-56: ⚠️ Potential issue

Check for empty 'mappingPages' array before navigating

There is a potential issue if mappingPages is empty. Accessing this.mappingPages[0] without checking could result in an error. Ensure that mappingPages has at least one item before navigating.

Consider adding a check before navigating:

-    this.router.navigateByUrl(this.mappingPages[0].routerLink);
+    if (this.mappingPages.length > 0) {
+      this.router.navigateByUrl(this.mappingPages[0].routerLink);
+    }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

      if (this.mappingPages.length > 0) {
        this.router.navigateByUrl(this.mappingPages[0].routerLink);
      }

18-18: ⚠️ Potential issue

Fix typo in @Component decorator: Use 'styleUrls' instead of 'styleUrl'

The @Component decorator property styleUrl should be styleUrls, which expects an array of style files. This typo could prevent the component's styles from being applied.

Apply this diff to fix the typo:

 @Component({
   selector: 'app-qbd-direct-mapping',
   standalone: true,
   imports: [RouterModule, SharedModule, CommonModule],
   templateUrl: './qbd-direct-mapping.component.html',
-  styleUrl: './qbd-direct-mapping.component.scss'
+  styleUrls: ['./qbd-direct-mapping.component.scss']
 })
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

  styleUrls: ['./qbd-direct-mapping.component.scss']

45-49: ⚠️ Potential issue

Inconsistent property casing in 'mappingPages' entries

The keys Label and RouterLink in the objects added to mappingPages are capitalized, whereas the initial entries use label and routerLink in lowercase. Property names in JavaScript are case-sensitive. This inconsistency may cause issues when rendering the menu items.

Apply this diff to ensure consistent property names:

 this.mappingPages.push({
-  Label: brandingConfig.brandId === 'co' ? new SentenceCasePipe().transform(mappingPage) : new TitleCasePipe().transform(mappingPage),
-  RouterLink: `/integrations/qbd_direct/main/mapping/${encodeURIComponent(item.source_field.toLowerCase())}`
+  label: brandingConfig.brandId === 'co' ? new SentenceCasePipe().transform(mappingPage) : new TitleCasePipe().transform(mappingPage),
+  routerLink: `/integrations/qbd_direct/main/mapping/${encodeURIComponent(item.source_field.toLowerCase())}`
 });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

            const mappingPage = new SnakeCaseToSpaceCasePipe().transform(item.source_field);
            this.mappingPages.push({
              label: brandingConfig.brandId === 'co' ? new SentenceCasePipe().transform(mappingPage) : new TitleCasePipe().transform(mappingPage),
              routerLink: `/integrations/qbd_direct/main/mapping/${encodeURIComponent(item.source_field.toLowerCase())}`
            });

45-47: 🛠️ Refactor suggestion

Inject Pipes via Dependency Injection instead of creating new instances

Creating new instances of Pipes using new inside methods is not recommended. Instead, inject SnakeCaseToSpaceCasePipe, SentenceCasePipe, and TitleCasePipe via the constructor. This approach promotes better reuse and leverages Angular's dependency injection system.

Modify your constructor to include the pipes:

 export class QbdDirectMappingComponent implements OnInit {

   isLoading: boolean = true;

   // Existing code...

   constructor(
     private mappingService: MappingService,
     private router: Router,
+    private snakeCaseToSpaceCasePipe: SnakeCaseToSpaceCasePipe,
+    private sentenceCasePipe: SentenceCasePipe,
+    private titleCasePipe: TitleCasePipe
   ) { }

Update the usage in the setupPage method:

 const mappingPage = this.snakeCaseToSpaceCasePipe.transform(item.source_field);
 this.mappingPages.push({
   label: brandingConfig.brandId === 'co'
-    ? new SentenceCasePipe().transform(mappingPage)
-    : new TitleCasePipe().transform(mappingPage),
+    ? this.sentenceCasePipe.transform(mappingPage)
+    : this.titleCasePipe.transform(mappingPage),
   routerLink: `/integrations/qbd_direct/main/mapping/${encodeURIComponent(item.source_field.toLowerCase())}`
 });

Also, ensure that the pipes are provided in the component's metadata if not already provided elsewhere:

 @Component({
   selector: 'app-qbd-direct-mapping',
   standalone: true,
   imports: [RouterModule, SharedModule, CommonModule],
+  providers: [SnakeCaseToSpaceCasePipe, SentenceCasePipe, TitleCasePipe],
   templateUrl: './qbd-direct-mapping.component.html',
   styleUrls: ['./qbd-direct-mapping.component.scss']
 })

Committable suggestion was skipped due to low confidence.


41-59: 🛠️ Refactor suggestion

Add error handling for the subscription

The subscription to getMappingSettings() does not currently handle errors. Adding error handling ensures the component can gracefully manage API call failures.

Modify the subscription to include an error handler:

 this.mappingService.getMappingSettings().subscribe(
   (response) => {
     // Existing code...
     this.isLoading = false;
   },
+  (error) => {
+    console.error('Error fetching mapping settings:', error);
+    this.isLoading = false;
+    // Optionally, display an error message to the user or set default values
+  }
 );

Committable suggestion was skipped due to low confidence.

src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-import-settings.model copy.ts (2)

35-35: ⚠️ Potential issue

Replace 'this' with the class name in static methods

Using this inside static methods refers to the class itself, which can be confusing and less explicit. It's clearer to use the class name or, after refactoring, the appropriate module or object name when calling other static methods.

After refactoring the class into standalone functions, ensure you update references of this to the appropriate module or object. If you're retaining the use of ImportSettingsModel, use its class name directly:

At line 35:

-const expenseFieldsArray = importSettings?.mapping_settings ? this.constructFormArray(importSettings.mapping_settings, QbdDirectFields, QbdDirectImportCodeFieldCodeConfig) : [];
+const expenseFieldsArray = importSettings?.mapping_settings
+  ? ImportSettingsModel.constructFormArray(importSettings.mapping_settings, QbdDirectFields, QbdDirectImportCodeFieldCodeConfig)
+  : [];

At line 44:

-importCategoryCode: new FormControl(this.getImportCodeField(importCode, 'ACCOUNT', QbdDirectImportCodeFieldCodeConfig))
+importCategoryCode: new FormControl(ImportSettingsModel.getImportCodeField(importCode, 'ACCOUNT', QbdDirectImportCodeFieldCodeConfig))

At line 51:

-const mappingSettings = this.constructMappingSettingPayload(expenseFieldArray);
+const mappingSettings = ImportSettingsModel.constructMappingSettingPayload(expenseFieldArray);

Ensure that constructFormArray, getImportCodeField, and constructMappingSettingPayload are accessible from ImportSettingsModel or the module where they are defined.

Also applies to: 44-44, 51-51

🧰 Tools
🪛 Biome

[error] 35-35: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


25-64: 🛠️ Refactor suggestion

Refactor static-only class into a module of functions

The QbdDirectImportSettingModel class contains only static methods and does not maintain any instance state. In TypeScript, it's recommended to refactor such classes into modules or namespaces of standalone functions. This approach reduces complexity and aligns with best practices.

You can refactor the code by exporting the functions directly without enclosing them in a class:

-export class QbdDirectImportSettingModel extends ImportSettingsModel {
-
-  static getChartOfAccountTypesList(): string[] {
+export function getChartOfAccountTypesList(): string[] {
     return [
       'Expense', 'Other Expense', 'Cost of Goods Sold', 'Fixed Asset', 'Other Asset', 'Other Current Asset',
       'Long Term Liability', 'Other Current Liability', 'Income', 'Other Income', 'Equity'
     ];
   }
 
-  static mapAPIResponseToFormGroup(importSettings: QbdDirectImportSettingGet | null, QbdDirectFields: IntegrationField[], QbdDirectImportCodeFieldCodeConfig: ImportCodeFieldConfigType): FormGroup {
+export function mapAPIResponseToFormGroup(importSettings: QbdDirectImportSettingGet | null, QbdDirectFields: IntegrationField[], QbdDirectImportCodeFieldCodeConfig: ImportCodeFieldConfigType): FormGroup {
     const importCode = importSettings?.workspace_general_settings?.import_code_fields ?? [];
     const expenseFieldsArray = importSettings?.mapping_settings
       ? ImportSettingsModel.constructFormArray(importSettings.mapping_settings, QbdDirectFields, QbdDirectImportCodeFieldCodeConfig)
       : [];
     return new FormGroup({
       importCategories: new FormControl(importSettings?.workspace_general_settings.import_categories ?? false),
       expenseFields: new FormArray(expenseFieldsArray),
       chartOfAccountTypes: new FormControl(importSettings?.workspace_general_settings.charts_of_accounts ?? ['Expense']),
       importItems: new FormControl(importSettings?.workspace_general_settings.import_items ?? false),
       importVendorsAsMerchants: new FormControl(importSettings?.workspace_general_settings.import_vendors_as_merchants ?? false),
       searchOption: new FormControl(''),
       importCodeFields: new FormControl(importSettings?.workspace_general_settings?.import_code_fields ?? null),
       importCategoryCode: new FormControl(ImportSettingsModel.getImportCodeField(importCode, 'ACCOUNT', QbdDirectImportCodeFieldCodeConfig)),
     });
   }
 
-  static constructPayload(importSettingsForm: FormGroup): QbdDirectImportSettingPost {
+export function constructPayload(importSettingsForm: FormGroup): QbdDirectImportSettingPost {
     const expenseFieldArray = importSettingsForm.getRawValue().expenseFields;
     const mappingSettings = ImportSettingsModel.constructMappingSettingPayload(expenseFieldArray);
 
     return {
       workspace_general_settings: {
         import_categories: importSettingsForm.get('importCategories')?.value,
         import_items: importSettingsForm.get('importItems')?.value,
         charts_of_accounts: importSettingsForm.get('chartOfAccountTypes')?.value,
         import_vendors_as_merchants: importSettingsForm.get('importVendorsAsMerchants')?.value,
         import_code_fields: importSettingsForm.get('importCodeFields')?.value,
       },
       mapping_settings: mappingSettings,
     };
   }
-
-}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

export function getChartOfAccountTypesList(): string[] {
  return [
    'Expense', 'Other Expense', 'Cost of Goods Sold', 'Fixed Asset', 'Other Asset', 'Other Current Asset',
    'Long Term Liability', 'Other Current Liability', 'Income', 'Other Income', 'Equity'
  ];
}

export function mapAPIResponseToFormGroup(importSettings: QbdDirectImportSettingGet | null, QbdDirectFields: IntegrationField[], QbdDirectImportCodeFieldCodeConfig: ImportCodeFieldConfigType): FormGroup {
  const importCode = importSettings?.workspace_general_settings?.import_code_fields ?? [];
  const expenseFieldsArray = importSettings?.mapping_settings
    ? ImportSettingsModel.constructFormArray(importSettings.mapping_settings, QbdDirectFields, QbdDirectImportCodeFieldCodeConfig)
    : [];
  return new FormGroup({
    importCategories: new FormControl(importSettings?.workspace_general_settings.import_categories ?? false),
    expenseFields: new FormArray(expenseFieldsArray),
    chartOfAccountTypes: new FormControl(importSettings?.workspace_general_settings.charts_of_accounts ?? ['Expense']),
    importItems: new FormControl(importSettings?.workspace_general_settings.import_items ?? false),
    importVendorsAsMerchants: new FormControl(importSettings?.workspace_general_settings.import_vendors_as_merchants ?? false),
    searchOption: new FormControl(''),
    importCodeFields: new FormControl(importSettings?.workspace_general_settings?.import_code_fields ?? null),
    importCategoryCode: new FormControl(ImportSettingsModel.getImportCodeField(importCode, 'ACCOUNT', QbdDirectImportCodeFieldCodeConfig)),
  });
}

export function constructPayload(importSettingsForm: FormGroup): QbdDirectImportSettingPost {
  const expenseFieldArray = importSettingsForm.getRawValue().expenseFields;
  const mappingSettings = ImportSettingsModel.constructMappingSettingPayload(expenseFieldArray);

  return {
    workspace_general_settings: {
      import_categories: importSettingsForm.get('importCategories')?.value,
      import_items: importSettingsForm.get('importItems')?.value,
      charts_of_accounts: importSettingsForm.get('chartOfAccountTypes')?.value,
      import_vendors_as_merchants: importSettingsForm.get('importVendorsAsMerchants')?.value,
      import_code_fields: importSettingsForm.get('importCodeFields')?.value,
    },
    mapping_settings: mappingSettings,
  };
}
🧰 Tools
🪛 Biome

[error] 25-64: Avoid classes that contain only static members.

Prefer using simple functions instead of classes with only static members.

(lint/complexity/noStaticOnlyClass)


[error] 35-35: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 44-44: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 51-51: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)

src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-advanced-settings.model.ts (2)

34-35: ⚠️ Potential issue

Avoid using 'this' in static methods; use the class name instead

Using this in static methods can be confusing because this refers to the class itself. It's clearer and more explicit to use the class name directly.

Apply this diff to fix the issue:

- expenseMemoStructure: new FormControl(advancedSettings?.expense_memo_structure && advancedSettings?.expense_memo_structure.length > 0 ? advancedSettings?.expense_memo_structure : this.defaultMemoFields(), Validators.required),
+ expenseMemoStructure: new FormControl(advancedSettings?.expense_memo_structure && advancedSettings?.expense_memo_structure.length > 0 ? advancedSettings?.expense_memo_structure : QbdDirectAdvancedSettingsModel.defaultMemoFields(), Validators.required),

- topMemoStructure: new FormControl(advancedSettings?.top_memo_structure && advancedSettings?.top_memo_structure.length > 0 ? advancedSettings?.top_memo_structure[0] : this.defaultTopMemoOptions()[0], Validators.required),
+ topMemoStructure: new FormControl(advancedSettings?.top_memo_structure && advancedSettings?.top_memo_structure.length > 0 ? advancedSettings?.top_memo_structure[0] : QbdDirectAdvancedSettingsModel.defaultTopMemoOptions()[0], Validators.required),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

            expenseMemoStructure: new FormControl(advancedSettings?.expense_memo_structure && advancedSettings?.expense_memo_structure.length > 0 ? advancedSettings?.expense_memo_structure : QbdDirectAdvancedSettingsModel.defaultMemoFields(), Validators.required),
            topMemoStructure: new FormControl(advancedSettings?.top_memo_structure && advancedSettings?.top_memo_structure.length > 0 ? advancedSettings?.top_memo_structure[0] : QbdDirectAdvancedSettingsModel.defaultTopMemoOptions()[0], Validators.required),
🧰 Tools
🪛 Biome

[error] 34-34: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 35-35: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


21-63: 🛠️ Refactor suggestion

Refactor: Replace class with standalone functions

The class QbdDirectAdvancedSettingsModel contains only static methods and does not maintain any instance state. According to best practices, consider refactoring the static methods into standalone functions outside of a class. This simplifies the code and reduces unnecessary complexity.

Apply this diff to refactor the code:

- export class QbdDirectAdvancedSettingsModel extends AdvancedSettingsModel {
-
-   static defaultMemoFields(): string[] {
-     return ['employee_email', 'merchant', 'purpose', 'category', 'spent_on', 'report_number', 'expense_link'];
-   }
-
-   static defaultTopMemoOptions(): string[] {
-     return ["employee_email", "employee_name", "purpose", "merchant"];
-   }
-
-   static mapAPIResponseToFormGroup(advancedSettings: QbdDirectAdvancedSettingsGet, isSkipExportEnabled: boolean): FormGroup {
-     return new FormGroup({
-       expenseMemoStructure: new FormControl(advancedSettings?.expense_memo_structure && advancedSettings?.expense_memo_structure.length > 0 ? advancedSettings?.expense_memo_structure : QbdDirectAdvancedSettingsModel.defaultMemoFields(), Validators.required),
-       topMemoStructure: new FormControl(advancedSettings?.top_memo_structure && advancedSettings?.top_memo_structure.length > 0 ? advancedSettings?.top_memo_structure[0] : QbdDirectAdvancedSettingsModel.defaultTopMemoOptions()[0], Validators.required),
-       exportSchedule: new FormControl(advancedSettings?.schedule_is_enabled ? advancedSettings?.schedule_is_enabled : false),
-       email: new FormControl(advancedSettings?.emails_selected.length > 0 ? advancedSettings?.emails_selected : []),
-       exportScheduleFrequency: new FormControl(advancedSettings?.schedule_is_enabled ? advancedSettings?.interval_hours : 1),
-       autoCreateEmployeeVendor: new FormControl(advancedSettings?.auto_create_employee ? advancedSettings?.auto_create_employee : false),
-       autoCreateMerchantsAsVendors: new FormControl(advancedSettings?.auto_create_merchants_vendors ? advancedSettings?.auto_create_merchants_vendors : false),
-       skipExport: new FormControl(isSkipExportEnabled),
-       searchOption: new FormControl('')
-     });
-   }
-
-   static constructPayload (advancedSettingForm: FormGroup): QbdDirectAdvancedSettingsPost {
-     const topMemo: string[] = [];
-     topMemo.push(advancedSettingForm.value.topMemoStructure);
-
-     const advancedSettingPayload: QbdDirectAdvancedSettingsPost = {
-       expense_memo_structure: advancedSettingForm.get('expenseMemoStructure')?.value ? advancedSettingForm.get('expenseMemoStructure')?.value : null,
-       top_memo_structure: advancedSettingForm.get('topMemoStructure')?.value ? topMemo : null,
-       schedule_is_enabled: advancedSettingForm.get('exportSchedule')?.value ? advancedSettingForm.get('exportSchedule')?.value : false,
-       emails_selected: advancedSettingForm.get('exportSchedule')?.value ? advancedSettingForm.get('email')?.value : null,
-       interval_hours: advancedSettingForm.get('exportSchedule')?.value ? advancedSettingForm.get('exportScheduleFrequency')?.value : null,
-       auto_create_employee: advancedSettingForm.get('autoCreateEmployeeVendor')?.value ? advancedSettingForm.get('autoCreateEmployeeVendor')?.value : false,
-       auto_create_merchants_vendors: advancedSettingForm.get('autoCreateMerchantsAsVendors')?.value ? advancedSettingForm.get('autoCreateMerchantsAsVendors')?.value : false
-     };
-
-     return advancedSettingPayload;
-   }
- }
+ // Remove the class and define functions directly
+
+ export function defaultMemoFields(): string[] {
+   return ['employee_email', 'merchant', 'purpose', 'category', 'spent_on', 'report_number', 'expense_link'];
+ }
+
+ export function defaultTopMemoOptions(): string[] {
+   return ["employee_email", "employee_name", "purpose", "merchant"];
+ }
+
+ export function mapAPIResponseToFormGroup(advancedSettings: QbdDirectAdvancedSettingsGet, isSkipExportEnabled: boolean): FormGroup {
+   return new FormGroup({
+     expenseMemoStructure: new FormControl(advancedSettings?.expense_memo_structure && advancedSettings?.expense_memo_structure.length > 0 ? advancedSettings?.expense_memo_structure : defaultMemoFields(), Validators.required),
+     topMemoStructure: new FormControl(advancedSettings?.top_memo_structure && advancedSettings?.top_memo_structure.length > 0 ? advancedSettings?.top_memo_structure[0] : defaultTopMemoOptions()[0], Validators.required),
+     exportSchedule: new FormControl(advancedSettings?.schedule_is_enabled ? advancedSettings?.schedule_is_enabled : false),
+     email: new FormControl(advancedSettings?.emails_selected.length > 0 ? advancedSettings?.emails_selected : []),
+     exportScheduleFrequency: new FormControl(advancedSettings?.schedule_is_enabled ? advancedSettings?.interval_hours : 1),
+     autoCreateEmployeeVendor: new FormControl(advancedSettings?.auto_create_employee ? advancedSettings?.auto_create_employee : false),
+     autoCreateMerchantsAsVendors: new FormControl(advancedSettings?.auto_create_merchants_vendors ? advancedSettings?.auto_create_merchants_vendors : false),
+     skipExport: new FormControl(isSkipExportEnabled),
+     searchOption: new FormControl('')
+   });
+ }
+
+ export function constructPayload (advancedSettingForm: FormGroup): QbdDirectAdvancedSettingsPost {
+   const topMemo: string[] = [];
+   topMemo.push(advancedSettingForm.value.topMemoStructure);
+
+   const advancedSettingPayload: QbdDirectAdvancedSettingsPost = {
+     expense_memo_structure: advancedSettingForm.get('expenseMemoStructure')?.value ? advancedSettingForm.get('expenseMemoStructure')?.value : null,
+     top_memo_structure: advancedSettingForm.get('topMemoStructure')?.value ? topMemo : null,
+     schedule_is_enabled: advancedSettingForm.get('exportSchedule')?.value ? advancedSettingForm.get('exportSchedule')?.value : false,
+     emails_selected: advancedSettingForm.get('exportSchedule')?.value ? advancedSettingForm.get('email')?.value : null,
+     interval_hours: advancedSettingForm.get('exportSchedule')?.value ? advancedSettingForm.get('exportScheduleFrequency')?.value : null,
+     auto_create_employee: advancedSettingForm.get('autoCreateEmployeeVendor')?.value ? advancedSettingForm.get('autoCreateEmployeeVendor')?.value : false,
+     auto_create_merchants_vendors: advancedSettingForm.get('autoCreateMerchantsAsVendors')?.value ? advancedSettingForm.get('autoCreateMerchantsAsVendors')?.value : false
+   };
+
+   return advancedSettingPayload;
+ }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

export function defaultMemoFields(): string[] {
    return ['employee_email', 'merchant', 'purpose', 'category', 'spent_on', 'report_number', 'expense_link'];
}

export function defaultTopMemoOptions(): string[] {
    return ["employee_email", "employee_name", "purpose", "merchant"];
}

export function mapAPIResponseToFormGroup(advancedSettings: QbdDirectAdvancedSettingsGet, isSkipExportEnabled: boolean): FormGroup {
    return new FormGroup({
        expenseMemoStructure: new FormControl(advancedSettings?.expense_memo_structure && advancedSettings?.expense_memo_structure.length > 0 ? advancedSettings?.expense_memo_structure : defaultMemoFields(), Validators.required),
        topMemoStructure: new FormControl(advancedSettings?.top_memo_structure && advancedSettings?.top_memo_structure.length > 0 ? advancedSettings?.top_memo_structure[0] : defaultTopMemoOptions()[0], Validators.required),
        exportSchedule: new FormControl(advancedSettings?.schedule_is_enabled ? advancedSettings?.schedule_is_enabled : false),
        email: new FormControl(advancedSettings?.emails_selected.length > 0 ? advancedSettings?.emails_selected : []),
        exportScheduleFrequency: new FormControl(advancedSettings?.schedule_is_enabled ? advancedSettings?.interval_hours : 1),
        autoCreateEmployeeVendor: new FormControl(advancedSettings?.auto_create_employee ? advancedSettings?.auto_create_employee : false),
        autoCreateMerchantsAsVendors: new FormControl(advancedSettings?.auto_create_merchants_vendors ? advancedSettings?.auto_create_merchants_vendors : false),
        skipExport: new FormControl(isSkipExportEnabled),
        searchOption: new FormControl('')
    });
}

export function constructPayload (advancedSettingForm: FormGroup): QbdDirectAdvancedSettingsPost {
    const topMemo: string[] = [];
    topMemo.push(advancedSettingForm.value.topMemoStructure);

    const advancedSettingPayload: QbdDirectAdvancedSettingsPost = {
        expense_memo_structure: advancedSettingForm.get('expenseMemoStructure')?.value ? advancedSettingForm.get('expenseMemoStructure')?.value : null,
        top_memo_structure: advancedSettingForm.get('topMemoStructure')?.value ? topMemo : null,
        schedule_is_enabled: advancedSettingForm.get('exportSchedule')?.value ? advancedSettingForm.get('exportSchedule')?.value : false,
        emails_selected: advancedSettingForm.get('exportSchedule')?.value ? advancedSettingForm.get('email')?.value : null,
        interval_hours: advancedSettingForm.get('exportSchedule')?.value ? advancedSettingForm.get('exportScheduleFrequency')?.value : null,
        auto_create_employee: advancedSettingForm.get('autoCreateEmployeeVendor')?.value ? advancedSettingForm.get('autoCreateEmployeeVendor')?.value : false,
        auto_create_merchants_vendors: advancedSettingForm.get('autoCreateMerchantsAsVendors')?.value ? advancedSettingForm.get('autoCreateMerchantsAsVendors')?.value : false
    };

    return advancedSettingPayload;
}
🧰 Tools
🪛 Biome

[error] 21-63: Avoid classes that contain only static members.

Prefer using simple functions instead of classes with only static members.

(lint/complexity/noStaticOnlyClass)


[error] 34-34: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 35-35: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)

src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-mapping/qbd-direct-base-mapping/qbd-direct-base-mapping.component.ts (3)

9-9: ⚠️ Potential issue

Use the appropriate workspace settings model for QBD integration.

The component imports QBOWorkspaceGeneralSetting from a QBO-specific path, which might not be compatible with QBD integration:

import { QBOWorkspaceGeneralSetting } from 'src/app/core/models/qbo/db/workspace-general-setting.model';

Consider importing the correct QBD workspace settings model to ensure compatibility with QBD features. Update the import statement:

- import { QBOWorkspaceGeneralSetting } from 'src/app/core/models/qbo/db/workspace-general-setting.model';
+ import { QBDWorkspaceGeneralSetting } from 'src/app/core/models/qbd/db/workspace-general-setting.model';

Also, update the method signature to use the correct type:

- private getDestinationField(workspaceGeneralSetting: QBOWorkspaceGeneralSetting, mappingSettings: MappingSetting[]): string {
+ private getDestinationField(workspaceGeneralSetting: QBDWorkspaceGeneralSetting, mappingSettings: MappingSetting[]): string {

Ensure that all references to workspaceGeneralSetting are updated accordingly and that the properties accessed on this object are valid for the QBD workspace settings model.

Also applies to: 56-56


74-74: 🛠️ Refactor suggestion

Avoid unnecessary type casting of 'employee_field_mapping'.

The current assignment involves casting to unknown before casting to FyleField:

this.employeeFieldMapping = (responses[0].employee_field_mapping as unknown as FyleField);

If employee_field_mapping is already compatible with FyleField, you can simplify the assignment by removing the unnecessary casting:

- this.employeeFieldMapping = (responses[0].employee_field_mapping as unknown as FyleField);
+ this.employeeFieldMapping = responses[0].employee_field_mapping as FyleField;

Alternatively, ensure that the employee_field_mapping property in your workspace settings model is properly typed to avoid the need for explicit casting.


21-21: ⚠️ Potential issue

Correct the 'styleUrl' property to 'styleUrls' in the component decorator.

In the @Component decorator, the property should be styleUrls (plural) and it should be assigned an array of style file paths. This ensures that the component's styles are properly applied.

Apply this diff to fix the typo:

-  styleUrl: './qbd-direct-base-mapping.component.scss'
+  styleUrls: ['./qbd-direct-base-mapping.component.scss']
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

  styleUrls: ['./qbd-direct-base-mapping.component.scss']
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-skipped-export-log/qbd-direct-skipped-export-log.component.ts (3)

65-73: ⚠️ Potential issue

Potential use of this.limit before initialization

In the constructor, this.limit is used before it is initialized. Specifically, in the subscription to searchQuerySubject, this.limit is referenced:

this.currentPage = Math.ceil(this.offset / this.limit) + 1;
this.getSkippedExpenses(this.limit, this.offset);

However, this.limit is assigned a value later in ngOnInit, which may lead to this.limit being undefined when these methods are called.

Consider initializing this.limit before using it in the constructor. You can assign a default value when declaring it:

- limit: number;
+ limit: number = 10; // or any appropriate default value

Alternatively, you can initialize it in the constructor before subscribing to searchQuerySubject.


122-144: ⚠️ Potential issue

Incorrect form control used for date range subscriptions

In the setupForm method, you're subscribing to the valueChanges of the start control, but handling it as a date range:

this.skipExportLogForm.controls.start.valueChanges.subscribe((dateRange) => {
  // ...
});

It seems you intended to use the dateRange control instead of start.

Update the subscription to use the correct form control:

- this.skipExportLogForm.controls.start.valueChanges.subscribe((dateRange) => {
+ this.skipExportLogForm.controls.dateRange.valueChanges.subscribe((dateRange) => {

23-23: ⚠️ Potential issue

Typo in 'styleUrl' property: should be 'styleUrls'

In the @Component decorator, the property styleUrl is incorrect. It should be styleUrls (note the plural form), which accepts an array of stylesheet files.

Apply the following diff to fix the typo:

-  styleUrl: './qbd-direct-skipped-export-log.component.scss'
+  styleUrls: ['./qbd-direct-skipped-export-log.component.scss']
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

  styleUrls: ['./qbd-direct-skipped-export-log.component.scss']
src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-export-log/qbd-direct-complete-export-log/qbd-direct-complete-export-log.component.ts (5)

23-23: ⚠️ Potential issue

Correct 'styleUrl' to 'styleUrls' in the @component decorator

The property styleUrl should be styleUrls (plural) in the @Component decorator. This property expects an array of style file paths, even if there's only one file. Using styleUrl instead of styleUrls may lead to the styles not being applied correctly.

Apply this diff to correct the property name:

- styleUrl: './qbd-direct-complete-export-log.component.scss'
+ styleUrls: ['./qbd-direct-complete-export-log.component.scss']
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

  styleUrls: ['./qbd-direct-complete-export-log.component.scss']

112-114: ⚠️ Potential issue

Use 'AppName.QBD_DIRECT' instead of 'AppName.QBO'

In line 113, the AppName parameter passed to parseExpenseGroupAPIResponseToExportLog is AppName.QBO, but it should be AppName.QBD_DIRECT to match the current integration. This ensures that any logic conditional on the application name within the method uses the correct app name.

Apply this diff to correct the app name:

- AccountingExportModel.parseExpenseGroupAPIResponseToExportLog(accountingExport, this.org_id, AppName.QBO)
+ AccountingExportModel.parseExpenseGroupAPIResponseToExportLog(accountingExport, this.org_id, AppName.QBD_DIRECT)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

      const accountingExports: AccountingExportList[] = accountingExportResponse.results.map((accountingExport: ExpenseGroup) =>
        AccountingExportModel.parseExpenseGroupAPIResponseToExportLog(accountingExport, this.org_id, AppName.QBD_DIRECT)
      );

70-78: ⚠️ Potential issue

Initialize 'this.limit' before using it in the constructor

In the constructor, this.limit is used in the searchQuerySubject subscription (line 75~) before it is initialized. Since this.limit is assigned in ngOnInit (after the constructor runs), this could lead to this.limit being undefined when getAccountingExports is called from the subscription, potentially causing errors.

Consider initializing this.limit in the constructor or moving the searchQuerySubject subscription setup to the ngOnInit method after this.limit has been initialized.

Option 1: Initialize this.limit in the constructor

+ this.limit = DEFAULT_LIMIT; // Replace DEFAULT_LIMIT with an appropriate value or fetch from paginator

Option 2: Move subscription setup to ngOnInit

- this.searchQuerySubject.pipe(
-   debounceTime(1000)
- ).subscribe((query: string) => {
-   // subscription logic
- });

Move the above code to ngOnInit after this.limit is set.

Committable suggestion was skipped due to low confidence.


129-151: ⚠️ Potential issue

Subscribe to 'dateRange' control instead of 'start'

In the setupForm method, the subscription is set on this.exportLogForm.controls.start.valueChanges, but within the subscription, the variable dateRange is expected to be an array representing a date range. Subscribing to start may not provide the correct value changes for a date range selection.

Change the subscription to the dateRange control. Apply this diff:

- this.exportLogForm.controls.start.valueChanges.subscribe((dateRange) => {
+ this.exportLogForm.controls.dateRange.valueChanges.subscribe((dateRange) => {

This ensures that the subscription listens to changes in the dateRange control, which is intended for date range selections.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

    this.exportLogForm.controls.dateRange.valueChanges.subscribe((dateRange) => {
      const paginator: Paginator = this.paginatorService.getPageSize(PaginatorPage.EXPORT_LOG);
      if (!dateRange) {
        this.dateOptions = AccountingExportModel.getDateOptionsV2();
        this.selectedDateFilter = null;
        this.isDateSelected = false;
        this.getAccountingExports(paginator.limit, paginator.offset);
      } else if (dateRange.length && dateRange[1]) {
        this.hideCalendar = true;
        this.selectedDateFilter = {
          startDate: dateRange[0],
          endDate: dateRange[1]
        };

        this.isDateSelected = true;

        setTimeout(() => {
          this.hideCalendar = false;
        }, 10);

        this.getAccountingExports(paginator.limit, paginator.offset);
      }
    });

109-119: ⚠️ Potential issue

Add error handling to the 'getExpenseGroups' API call

In the getAccountingExports method, the subscription to this.exportLogService.getExpenseGroups(...) does not include error handling. If the API call fails, the component may not handle the error gracefully, and isLoading may remain true, affecting the user experience.

Add an error handler to the subscription to handle API errors and update isLoading accordingly. For example:

  this.exportLogService.getExpenseGroups(/* parameters */).subscribe(
    (accountingExportResponse: ExpenseGroupResponse) => {
      // existing success logic
      this.isLoading = false;
+   },
+   (error) => {
+     this.isLoading = false;
+     // Optionally, handle the error, e.g., display an error message
+     console.error('Error fetching accounting exports', error);
+   }
  );

Committable suggestion was skipped due to low confidence.

src/app/integrations/qbd-direct/qbd-direct-main/qbd-direct-dashboard/qbd-direct-dashboard.component.ts (5)

91-93: ⚠️ Potential issue

Add error handling for external service call

The subscription to triggerAccountingExport() does not handle errors. If the service call fails, the user might not be informed, and the application state might become inconsistent. Consider adding error handling to manage potential errors from the service call.

Suggested update:

this.dashboardService.triggerAccountingExport().subscribe({
  next: () => {
    this.pollExportStatus(this.exportableAccountingExportIds);
  },
  error: (error) => {
    this.isExportInProgress = false;
    // Handle the error appropriately, e.g., display an error message to the user
  }
});

168-173: ⚠️ Potential issue

Handle errors during expense import

When calling importExpensesFromFyle(), there is no error handling for the subscription. If the import fails, the user might not be notified, and isImportInProgress might remain true. Consider adding error handling to manage possible errors.

Suggested update:

this.accountingExportService.importExpensesFromFyle('v1').subscribe({
  next: () => {
    this.dashboardService.getExportableAccountingExportIds('v1').subscribe((exportableAccountingExportIds) => {
      this.exportableAccountingExportIds = exportableAccountingExportIds.exportable_expense_group_ids;
      this.isImportInProgress = false;
    });
  },
  error: (error) => {
    this.isImportInProgress = false;
    // Handle the error appropriately, e.g., display an error message to the user
  }
});

24-24: ⚠️ Potential issue

Correct 'styleUrl' to 'styleUrls'

In Angular components, the property for specifying stylesheets is styleUrls (plural), and it expects an array of style file paths. This ensures the styles are correctly applied to the component.

Suggested change:

 templateUrl: './qbd-direct-dashboard.component.html',
-styleUrl: './qbd-direct-dashboard.component.scss'
+styleUrls: ['./qbd-direct-dashboard.component.scss']
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

  styleUrls: ['./qbd-direct-dashboard.component.scss']

106-106: ⚠️ Potential issue

Prevent potential division by zero in export progress calculation

In the calculation of exportProgressPercentage, if this.exportableAccountingExportIds.length is zero, it will result in a division by zero error. Ensure that the length is not zero before performing the division.

Suggested fix:

-this.exportProgressPercentage = Math.round((this.processedCount / this.exportableAccountingExportIds.length) * 100);
+this.exportProgressPercentage = this.exportableAccountingExportIds.length > 0 ?
+  Math.round((this.processedCount / this.exportableAccountingExportIds.length) * 100) : 0;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

      this.exportProgressPercentage = this.exportableAccountingExportIds.length > 0 ?
        Math.round((this.processedCount / this.exportableAccountingExportIds.length) * 100) : 0;

9-9: ⚠️ Potential issue

Avoid shadowing the global 'Error' object

Importing Error from 'src/app/core/models/db/error.model' can lead to confusion with the global Error object in JavaScript. This might cause unexpected behaviors or make debugging more difficult. Consider renaming the imported Error to a different name.

Suggested change:

-import { AccountingGroupedErrors, AccountingGroupedErrorStat, Error } from 'src/app/core/models/db/error.model';
+import { AccountingGroupedErrors, AccountingGroupedErrorStat, CustomError } from 'src/app/core/models/db/error.model';

And update all references of Error to CustomError accordingly.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

import { AccountingGroupedErrors, AccountingGroupedErrorStat, CustomError } from 'src/app/core/models/db/error.model';
🧰 Tools
🪛 Biome

[error] 9-9: Do not shadow the global "Error" property.

Consider renaming this variable. It's easy to confuse the origin of variables when they're named after a known global.

(lint/suspicious/noShadowRestrictedNames)

src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-export-settings.model.ts (5)

28-194: 🛠️ Refactor suggestion

Consider refactoring the class containing only static methods.

The QbdDirectExportSettingModel class (lines 28-194) consists entirely of static methods and does not utilize any instance-specific features. Converting this class into a module of standalone functions or organizing these methods within a namespace can enhance code maintainability and reduce complexity.

🧰 Tools
🪛 Biome

[error] 28-194: Avoid classes that contain only static members.

Prefer using simple functions instead of classes with only static members.

(lint/complexity/noStaticOnlyClass)


[error] 138-138: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 143-143: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 161-161: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)


[error] 164-164: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)


[error] 166-166: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 167-167: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


164-164: 🛠️ Refactor suggestion

Simplify boolean assignment without a ternary operator.

Similarly, you can simplify the boolean assignment in line 164.

Apply the following change:

- creditCardExpense: new FormControl(exportSettings?.credit_card_expense_export_type ? true : false),
+ creditCardExpense: new FormControl(!!exportSettings?.credit_card_expense_export_type),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

            creditCardExpense: new FormControl(!!exportSettings?.credit_card_expense_export_type),
🧰 Tools
🪛 Biome

[error] 164-164: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)


161-161: 🛠️ Refactor suggestion

Simplify boolean assignment without a ternary operator.

The use of a ternary operator to assign a boolean value is unnecessary. You can directly convert the value to a boolean.

Apply the following change:

- reimbursableExpense: new FormControl(exportSettings?.reimbursable_expense_export_type ? true : false),
+ reimbursableExpense: new FormControl(!!exportSettings?.reimbursable_expense_export_type),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

            reimbursableExpense: new FormControl(!!exportSettings?.reimbursable_expense_export_type),
🧰 Tools
🪛 Biome

[error] 161-161: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)


138-143: ⚠️ Potential issue

Replace 'this' with the class name in static methods.

Using this in static methods can be confusing since it refers to the class itself. For clarity, replace this with the class name QbdDirectExportSettingModel when invoking other static methods.

Apply the following changes:

- return this.reimbursableExpenseGroupingDateOptions().concat([{
+ return QbdDirectExportSettingModel.reimbursableExpenseGroupingDateOptions().concat([{
- return [this.reimbursableExpenseGroupingDateOptions()[1]];
+ return [QbdDirectExportSettingModel.reimbursableExpenseGroupingDateOptions()[1]];
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

          return QbdDirectExportSettingModel.reimbursableExpenseGroupingDateOptions().concat([{
                label: 'Card Transaction Post date',
                value: QBDExportDateType.POSTED_AT
          }]);
        }
        return [QbdDirectExportSettingModel.reimbursableExpenseGroupingDateOptions()[1]];
🧰 Tools
🪛 Biome

[error] 138-138: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 143-143: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


166-167: ⚠️ Potential issue

Replace 'this' with the class name in static methods.

In lines 166-167, replace this with QbdDirectExportSettingModel to improve readability and avoid confusion within static contexts.

Apply the following changes:

- creditCardExportGroup: new FormControl(exportSettings?.credit_card_expense_grouped_by ? exportSettings?.credit_card_expense_grouped_by : this.expenseGroupingFieldOptions()[1].value),
+ creditCardExportGroup: new FormControl(exportSettings?.credit_card_expense_grouped_by ? exportSettings?.credit_card_expense_grouped_by : QbdDirectExportSettingModel.expenseGroupingFieldOptions()[1].value),
- creditCardExportDate: new FormControl(exportSettings?.credit_card_expense_date ? exportSettings?.credit_card_expense_date : this.expenseGroupingFieldOptions()[0].value),
+ creditCardExportDate: new FormControl(exportSettings?.credit_card_expense_date ? exportSettings?.credit_card_expense_date : QbdDirectExportSettingModel.expenseGroupingFieldOptions()[0].value),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

            creditCardExportGroup: new FormControl(exportSettings?.credit_card_expense_grouped_by ? exportSettings?.credit_card_expense_grouped_by : QbdDirectExportSettingModel.expenseGroupingFieldOptions()[1].value),
            creditCardExportDate: new FormControl(exportSettings?.credit_card_expense_date ? exportSettings?.credit_card_expense_date : QbdDirectExportSettingModel.expenseGroupingFieldOptions()[0].value),
🧰 Tools
🪛 Biome

[error] 166-166: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 167-167: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)

src/app/core/models/branding/content-configuration.model.ts (7)

46-47: 🛠️ Refactor suggestion

Inconsistent Naming: Correct 'Namein' to 'NameIn' in property names

The properties creditCardExpenseNameinJELabel and creditCardExpenseNameinJESubLabel should use camelCase for consistency. Change Namein to NameIn.

Please update the property names as follows:

- creditCardExpenseNameinJELabel: string;
- creditCardExpenseNameinJESubLabel: string;
+ creditCardExpenseNameInJELabel: string;
+ creditCardExpenseNameInJESubLabel: string;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                        creditCardExpenseNameInJELabel: string;
                        creditCardExpenseNameInJESubLabel: string;

56-57: 🛠️ Refactor suggestion

Inconsistent Naming: Add 'Label' to 'chartOfAccountTypes'

The property chartOfAccountTypes should be renamed to chartOfAccountTypesLabel to maintain consistency with other labels.

Update the property name:

- chartOfAccountTypes: string;
+ chartOfAccountTypesLabel: string;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                    chartOfAccountTypesLabel: string;
                    chartOfAccountTypesSubLabel: string;

71-72: 🛠️ Refactor suggestion

Inconsistent Property Naming: Capitalization of 'Frequency'

The properties autoExportfrequencyLabel and autoExportfrequencySubLabel should capitalize 'Frequency' for consistency with camelCase conventions.

Please update the property names:

- autoExportfrequencyLabel: string;
- autoExportfrequencySubLabel: string;
+ autoExportFrequencyLabel: string;
+ autoExportFrequencySubLabel: string;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                    autoExportFrequencyLabel: string;
                    autoExportFrequencySubLabel: string;

27-27: ⚠️ Potential issue

Syntax Error: Missing space in property declaration

There's a missing space before the colon in the property reimbursableExpenseDateSubLabel, which can lead to a syntax error.

Please apply the following fix:

- reimbursableExpenseDateSubLabel:string;
+ reimbursableExpenseDateSubLabel: string;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                        reimbursableExpenseDateSubLabel: string;

83-84: 🛠️ Refactor suggestion

Consider Renaming 'skipExport' Properties for Clarity

The properties skipExportLabel and skipExportSubLabel may benefit from more descriptive names to enhance readability and maintainability.

Suggest renaming to clarify their purpose, for example:

- skipExportLabel: string;
- skipExportSubLabel: string;
+ skipExportPaymentsLabel: string;
+ skipExportPaymentsSubLabel: string;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                    skipExportPaymentsLabel: string;
                    skipExportPaymentsSubLabel: string;

60-60: ⚠️ Potential issue

Missing SubLabel for 'importVendorsAsMerchantsLabel'

The property importVendorsAsMerchantsLabel lacks a corresponding importVendorsAsMerchantsSubLabel, which is inconsistent with other label pairs in the configuration.

Consider adding the missing sub-label:

+ importVendorsAsMerchantsSubLabel: string;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                    importVendorsAsMerchantsLabel: string;
                    importVendorsAsMerchantsSubLabel: string;

80-80: ⚠️ Potential issue

Missing SubLabel for 'autoCreateEmployeeLabel'

The property autoCreateEmployeeLabel does not have a corresponding autoCreateEmployeeSubLabel, unlike other label pairs in advancedSettings.

Consider adding the missing sub-label:

+ autoCreateEmployeeSubLabel: string;

Committable suggestion was skipped due to low confidence.

src/app/core/models/enum/enum.model.ts (1)

93-94: ⚠️ Potential issue

Remove the trailing space in 'QuickBooks Desktop'

The string assigned to QBD_DIRECT in the AppName enum has an unnecessary trailing space. This could lead to inconsistencies or unintended whitespace when displaying or comparing the app name. Please remove the trailing space to ensure consistency.

Apply this diff to fix the issue:

Committable suggestion was skipped due to low confidence.

src/app/branding/c1-contents-config.ts (9)

25-25: ⚠️ Potential issue

Correct capitalization in 'QuickBooks Desktop'.

The term 'QuickBooks Desktop' should have a capital 'B' in 'Books'.

Apply these diffs to correct the text:

Line 25:

-'... will not be exported to Quickbooks Desktop.'
+'... will not be exported to QuickBooks Desktop.'

Line 41:

-'... will not be exported to Quickbooks Desktop.'
+'... will not be exported to QuickBooks Desktop.'

Also applies to: 41-41


30-30: ⚠️ Potential issue

Complete the 'reimbursableExpenseDateLabel' text.

The reimbursableExpenseDateLabel is incomplete ('Set the expense ') and needs to be completed to convey the intended meaning.

Please provide the full text for reimbursableExpenseDateLabel to make it meaningful.


36-36: ⚠️ Potential issue

Complete the 'autoMapEmployeesLabel' text.

The autoMapEmployeesLabel ends abruptly with '... be mapped to', which seems incomplete.

Please complete the text for autoMapEmployeesLabel to properly convey how the employees should be mapped.


46-46: ⚠️ Potential issue

Complete the 'creditCardExpenseDateLabel' text.

The creditCardExpenseDateLabel is incomplete ('Set the expense ') and needs to be completed.

Please provide the full text for creditCardExpenseDateLabel to make it meaningful.


84-84: ⚠️ Potential issue

Complete the 'autoCreateEmployeeLabel' text.

The autoCreateEmployeeLabel is incomplete ('Auto-create employee as ') and seems to be missing the entity.

Please complete the text for autoCreateEmployeeLabel to clarify the label.


9-9: ⚠️ Potential issue

Update 'NetSuite' to 'QuickBooks Desktop' in contentText.

The contentText property still mentions 'NetSuite', but it should refer to 'QuickBooks Desktop' as per the qbd_direct configuration.

Apply this diff to correct the text:

-'Import chart of accounts and projects from NetSuite and export expenses from your Expense Management account.'
+'Import chart of accounts and projects from QuickBooks Desktop and export expenses from your Expense Management account.'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

            contentText: 'Import chart of accounts and projects from QuickBooks Desktop and export expenses from your Expense Management account.',

29-29: ⚠️ Potential issue

Fix typo in 'exxpenses'.

There is a typo in the word 'exxpenses', which should be corrected to 'expenses'.

Apply this diff to fix the typo:

-'You can export exxpenses either when they are awaiting closure after approval (Processing) or when the payment has been settled (Closed).'
+'You can export expenses either when they are awaiting closure after approval (Processing) or when the payment has been settled (Closed).'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                    reimbursableExpenseStateSubLabel: 'You can export expenses either when they are awaiting closure after approval (Processing) or when the payment has been settled (Closed).',

70-70: ⚠️ Potential issue

Ensure consistent use of branding name and correct punctuation.

  • Replace hardcoded 'Fyle' with brandingConfig.brandName for consistency.
  • Add a missing period after 'QuickBooks Desktop'.

Apply this diff to correct the issues:

-'In this section, you can customize the data that you'd like to export from Fyle to QuickBooks Desktop You can choose what data points need to be exported and what shouldn't be.'
+'In this section, you can customize the data that you'd like to export from ' + brandingConfig.brandName + ' to QuickBooks Desktop. You can choose what data points need to be exported and what shouldn't be.'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                customizeSectionSubLabel: 'In this section, you can customize the data that you'd like to export from ' + brandingConfig.brandName + ' to QuickBooks Desktop. You can choose what data points need to be exported and what shouldn't be.',

14-17: ⚠️ Potential issue

Replace 'NetSuite' with 'QuickBooks Desktop' and correct 'subsidiary' spelling.

The configuration texts still refer to 'NetSuite' and contain a misspelling of 'subsidiary' as 'subsidary'. These should be corrected to 'QuickBooks Desktop' and 'subsidiary' respectively.

Apply the following diffs to correct the text:

-configurationHeaderText: 'Connect to NetSuite subsidary',
+configurationHeaderText: 'Connect to QuickBooks Desktop',

-configurationSubHeaderText: 'Expenses will be posted to the NetSuite subsidary selected here. You can't change the subsidary once they're configured.',
+configurationSubHeaderText: 'Expenses will be posted to the QuickBooks Desktop company selected here. You can't change the company once it's configured.',

-stepName: 'Connect to NetSuite',
+stepName: 'Connect to QuickBooks Desktop',

-subLabel: 'Provide your credentials to establish a secure connection between your Expense Management and NetSuite account'
+subLabel: 'Provide your credentials to establish a secure connection between your Expense Management and QuickBooks Desktop account'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                configurationHeaderText: 'Connect to QuickBooks Desktop',
                configurationSubHeaderText: 'Expenses will be posted to the QuickBooks Desktop company selected here. You can't change the company once it's configured.',
                stepName: 'Connect to QuickBooks Desktop',
                subLabel: 'Provide your credentials to establish a secure connection between your Expense Management and QuickBooks Desktop account'
src/app/branding/fyle-contents-config.ts (9)

9-9: ⚠️ Potential issue

Correct references from 'NetSuite' to 'QuickBooks Desktop' in 'qbd_direct' section

In the qbd_direct section, there are multiple references to 'NetSuite' instead of 'QuickBooks Desktop'. This may confuse users and appears to be a copy-paste error.

Please apply the following changes to correct the references:

- contentText: 'Import data from NetSuite to ' + brandingConfig.brandName + ' and export expenses from ' + brandingConfig.brandName + ' to NetSuite. ',
+ contentText: 'Import data from QuickBooks Desktop to ' + brandingConfig.brandName + ' and export expenses from ' + brandingConfig.brandName + ' to QuickBooks Desktop. ',

- configurationHeaderText: 'Connect to NetSuite Tenant',
+ configurationHeaderText: 'Connect to QuickBooks Desktop',

- configurationSubHeaderText: 'Connect to the NetSuite Tenant from which you would like to import and export data. The ' + brandingConfig.brandName + ' org and NetSuite Tenant cannot be changed once the configuration steps are complete.',
+ configurationSubHeaderText: 'Connect to QuickBooks Desktop from which you would like to import and export data. The ' + brandingConfig.brandName + ' organization and QuickBooks Desktop connection cannot be changed once the configuration steps are complete.',

- subLabel: 'Expenses will be posted to the NetSuite Tenant Mapping selected here. Once configured, you can not change ' + brandingConfig.brandName + ' organization or Tenant Mapping.'
+ subLabel: 'Expenses will be posted to the QuickBooks Desktop mapping selected here. Once configured, you cannot change ' + brandingConfig.brandName + ' organization or mapping.'

Also applies to: 14-15, 17-17


25-25: ⚠️ Potential issue

Standardize the spelling of 'QuickBooks Desktop'

Ensure that 'QuickBooks Desktop' is consistently spelled with uppercase 'Q' and 'B' throughout the code.

Please make the following changes:

- ... will not be exported to Quickbooks Desktop.
+ ... will not be exported to QuickBooks Desktop.

- ... expenses will not be exported to Quickbooks Desktop.',
+ ... expenses will not be exported to QuickBooks Desktop.',

- Skip export of specific expenses from ' + brandingConfig.brandName + ' to Quickbooks Desktop
+ Skip export of specific expenses from ' + brandingConfig.brandName + ' to QuickBooks Desktop

Also applies to: 41-41, 85-85


78-78: ⚠️ Potential issue

Remove unnecessary backslash in possessive form

In topLevelMemoStructureSubLabel and memoStructureSubLabel, remove the backslash before the apostrophe in 'Desktop’s'.

Please update the lines as follows:

- topLevelMemoStructureSubLabel: '...QuickBooks Desktop\’s <b>top-level memo</b> field...',
+ topLevelMemoStructureSubLabel: '...QuickBooks Desktop’s <b>top-level memo</b> field...'

- memoStructureSubLabel: '...QuickBooks Desktop\’s <b>transaction line-item level memo</b> field...',
+ memoStructureSubLabel: '...QuickBooks Desktop’s <b>transaction line-item level memo</b> field...'

Also applies to: 80-80


30-30: ⚠️ Potential issue

Complete the text for 'reimbursableExpenseDateLabel'

The label 'Set the expense ' appears incomplete. Please provide the missing information to clarify the label.

Suggested correction:

- reimbursableExpenseDateLabel: 'Set the expense ',
+ reimbursableExpenseDateLabel: 'Set the expense date',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                    reimbursableExpenseDateLabel: 'Set the expense date',

79-79: ⚠️ Potential issue

Correct typo in 'line-ttem' to 'line-item'

There's a typo in memoStructureLabel. 'line-ttem' should be 'line-item'.

Please fix the typo:

- memoStructureLabel: 'Set the line-ttem level memo field data for QuickBooks Desktop.',
+ memoStructureLabel: 'Set the line-item level memo field data for QuickBooks Desktop.',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                memoStructureLabel: 'Set the line-item level memo field data for QuickBooks Desktop.',

76-76: ⚠️ Potential issue

Ensure consistent use of branding in 'autoExportfrequencySubLabel'

Replace 'Fyle' with brandingConfig.brandName for consistency with dynamic branding.

Please make the following change:

- autoExportfrequencySubLabel: 'Set a frequency based on how often you want your expenses in Fyle to be exported to QuickBooks Desktop.',
+ autoExportfrequencySubLabel: 'Set a frequency based on how often you want your expenses in ' + brandingConfig.brandName + ' to be exported to QuickBooks Desktop.',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                autoExportfrequencySubLabel: 'Set a frequency based on how often you want your expenses in ' + brandingConfig.brandName + ' to be exported to QuickBooks Desktop.',

45-45: ⚠️ Potential issue

Standardize terminology and capitalization for 'Corporate Card expenses'

Use consistent terminology and capitalization for 'Corporate Card expenses'. Replace 'ccc expenses' with 'Corporate Card expenses'.

Please update the line as follows:

- creditCardExpenseStateSubLabel: 'You could choose to export ccc expenses when they have been approved and are awaiting payment clearance, or simply when they have been paid out.',
+ creditCardExpenseStateSubLabel: 'You can choose to export Corporate Card expenses when they have been approved and are awaiting payment clearance, or when they have been paid out.',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                    creditCardExpenseStateSubLabel: 'You can choose to export Corporate Card expenses when they have been approved and are awaiting payment clearance, or when they have been paid out.',

86-86: ⚠️ Potential issue

Replace 'Fyle' with dynamic branding in 'autoCreateMerchantsAsVendorsSubLabel'

To maintain consistent branding, replace 'Fyle' with brandingConfig.brandName.

Please update the line as follows:

- autoCreateMerchantsAsVendorsSubLabel: 'Fyle will auto-create a new vendor in QuickBooks Desktop if a merchant added by an employee does not have a corresponding match in QuickBooks Desktop. ',
+ autoCreateMerchantsAsVendorsSubLabel: brandingConfig.brandName + ' will auto-create a new vendor in QuickBooks Desktop if a merchant added by an employee does not have a corresponding match in QuickBooks Desktop. ',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                autoCreateMerchantsAsVendorsSubLabel: brandingConfig.brandName + ' will auto-create a new vendor in QuickBooks Desktop if a merchant added by an employee does not have a corresponding match in QuickBooks Desktop. ',

36-36: ⚠️ Potential issue

Complete the text for 'autoMapEmployeesLabel'

The label 'How should Employees in [BrandName] be mapped to ' is incomplete. Specify the endpoint of the mapping for clarity.

Suggested correction:

- autoMapEmployeesLabel: 'How should Employees in ' + brandingConfig.brandName + ' be mapped to ',
+ autoMapEmployeesLabel: 'How should Employees in ' + brandingConfig.brandName + ' be mapped to QuickBooks Desktop?',

Committable suggestion was skipped due to low confidence.

@DhaaraniCIT DhaaraniCIT merged commit 36e5006 into qbd-direct-post-onboarding-sucessful-export-log-page-settings Oct 9, 2024
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
size/XL Extra Large PR
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants