Audit Data Export

Overview

The Audit Data Export feature provides comprehensive JSON export functionality for all audit types within the Nimbly mobile application. This capability enables users to export their audit data in raw JSON format for external analysis, compliance documentation, backup purposes, and integration with third-party systems.

Key Capabilities πŸš€

  • Universal Coverage: Exports all audit types (Single, Section, Team)
  • Raw Data Format: Preserves exact data structure without transformation
  • Non-Blocking Architecture: Export failures don’t interrupt core workflows
  • Platform-Optimized: Tailored implementations for Android, iOS, and Web
  • Feature Flag Control: Organization-level enablement via EXPORT_JSON_REPORT_ON_SUBMIT_SYNC

Audit Export Types

1. Single Audit Export πŸ“‹

Single audit exports occur during audit synchronization, capturing the complete questionnaire data.

When It Triggers

  • During audit sync via β€œSync” button
  • When synchronizing audit data with server
  • Feature flag must be enabled

Data Exported

  • Complete ReportForm object
  • All questions and answers
  • Metadata (site, auditor, timestamps)
  • Signatures and attachments (as references)

File Naming

report_[reportID]_[timestamp].json

2. Team Audit Export πŸ‘₯

Team audit exports support both full team submissions and individual section synchronization.

2.1 Team Summary Export

When It Triggers
  • During team report submission
  • After team lead confirms submission
  • Feature flag must be enabled
Data Exported
  • Complete ITeamAuditSummary object
  • Section summaries and approval statuses
  • Team member contributions
  • Aggregated scores and flags
File Naming
team_report_[reportID]_[timestamp].json

2.2 Section Export πŸ“‘

Section exports are a sub-feature of team audits, enabling granular data capture during section synchronization.

When It Triggers
  • During section sync via β€œSync” button
  • Feature flag must be enabled
Data Exported
  • Section-specific ReportForm data
  • Questions within that section
  • Section metadata and progress
File Naming
report_[reportID]_section_[sectionIndex]_[timestamp].json

Platform Implementation

Android (10+) πŸ€–

Storage Access Framework (SAF)

For Android 10 and above, the feature utilizes the Storage Access Framework:

graph LR
    A[Export Triggered] --> B{Android Version}
    B -->|10+| C[SAF Dialog]
    B -->|<10| D[Legacy Storage]
    C --> E[User Selects Directory]
    E --> F[Save JSON File]
    D --> G[Save to Downloads]

User Experience:

  1. System presents directory picker
  2. User selects save location
  3. File saved with proper permissions
  4. Fallback to sharing if SAF fails

iOS 🍎

Native Sharing

iOS implementation uses the native sharing dialog:

User Experience:

  1. Share sheet appears
  2. User selects destination (Files, AirDrop, etc.)
  3. File saved to chosen location
  4. Success confirmation displayed

Web 🌐

Browser Download

Web platform triggers standard browser download:

User Experience:

  1. Download initiated automatically
  2. File saved to default downloads folder
  3. Browser shows download progress
  4. File accessible via downloads manager

Technical Architecture

Component Hierarchy

graph TB
    subgraph Controllers
        SC[SubmitQuestionnaireController]
        UC[UpdateQuestionnaireController]
        TC[TeamSummaryController]
    end

    subgraph Use Cases
        ADEU[AuditDataExportUseCase]
    end

    subgraph Services
        ES[ExportService]
        FS[FileSystemService]
    end

    SC --> ADEU
    UC --> ADEU
    TC --> ADEU
    ADEU --> ES
    ES --> FS

Export Flow

sequenceDiagram
    participant User
    participant Controller
    participant UseCase as AuditDataExportUseCase
    participant ExportService
    participant FileSystem

    User->>Controller: Trigger Action
    Controller->>Controller: Check Feature Flag
    Controller->>UseCase: exportAuditData()
    UseCase->>ExportService: exportRawData()
    ExportService->>ExportService: JSON.stringify()
    ExportService->>FileSystem: saveToDownloads()
    FileSystem->>FileSystem: Platform-specific save
    FileSystem-->>User: Success/Failure notification
    Controller->>Controller: Continue main workflow

Configuration

Feature Flag Setup

The export feature for submissions is controlled by the EXPORT_JSON_REPORT_ON_SUBMIT_SYNC feature flag:

// Organization-level configuration
{
  "organizationId": "org_123",
  "features": {
    "EXPORT_JSON_REPORT_ON_SUBMIT_SYNC": true
  }
}

Enabling Export

  1. For Submissions (Single & Team Audits):

    • Enable feature flag in organization settings
    • No app update required
    • Takes effect immediately
  2. For Section Sync (Team Audits):

    • Feature Flag Required: EXPORT_JSON_REPORT_ON_SUBMIT_SYNC must be enabled
    • Enable feature flag in organization settings
    • Takes effect immediately after enabling

Data Format

Note: The following JSON structures use sample/placeholder values for illustration purposes only. Actual export files will contain your real audit data.

Single Audit JSON Structure

{
  "questions": [...],
  "sections": [...],
  "status": "complete",
  "site": "site_456",
  "auditor": "user_123",
  "datetimeSubmitted": "2025-01-19T10:30:00Z",
  "coordinates": {
    "latitude": 1.3521,
    "longitude": 103.8198
  },
  "signatures": [...],
  "questionnaire": "questionnaire_id",
  "grade": "A",
  "maxScore": 100
}

Team Audit JSON Structure

{
  "auditName": "Monthly Team Audit",
  "siteName": "Main Branch",
  "datetimeIn": "2025-01-19T10:00:00Z",
  "flagCount": {
    "red": 5,
    "green": 20,
    "yellow": 3
  },
  "sections": [
    {
      "approvalIndex": 0,
      "sectionIndex": 0,
      "sectionName": "Kitchen",
      "isRequired": true,
      "approvalStatus": "approved"
    }
  ],
  "signatures": [
    {
      "isSigned": true,
      "name": "John Doe",
      "path": "signatures/sign_12345.png",
      "position": "Manager"
    }
  ],
  "emailTargets": [
    {
      "email": "manager@company.com",
      "enabled": true,
      "status": "sent"
    }
  ],
  "reportID": "team_123",
  "siteID": "site_456"
}

Error Handling

Non-Blocking Design

Export operations are designed to be non-blocking:

try {
  const result = await exportAuditData(data);
  if (result.success) {
    // Log success
  }
} catch (error) {
  // Log error but continue
  observabilitySentry.logEvent('Export failed', error);
}
// Main workflow continues regardless

Common Error Scenarios

Error TypeCauseUser ImpactResolution
Permission DeniedStorage access not grantedExport skippedGrant permissions in settings
Storage FullInsufficient device spaceExport failedFree up device storage
File System ErrorWrite operation failedExport failedRetry or use share option
Serialization ErrorInvalid data structurePartial exportContact support

User Experience

Success Flow

  1. Trigger: User completes audit/sync action
  2. Export: Background export initiated
  3. Save: File saved to accessible location
  4. Notification: Success toast displayed
  5. Continue: Main workflow proceeds

Failure Flow

  1. Trigger: User completes audit/sync action
  2. Export: Background export attempted
  3. Error: Export fails (logged)
  4. Continue: Main workflow proceeds uninterrupted
  5. No Impact: User experience unchanged

Performance Considerations

File Size Management

  • Compression: Automatic gzip for files > 1MB
  • Chunking: Large reports split if needed
  • Memory: Efficient streaming for large datasets

Background Processing

  • Export runs in background thread
  • Non-blocking UI operations
  • Progress tracking for large exports

Security & Privacy

Data Protection

  • Sanitization: Sensitive data removed
  • No Credentials: Tokens/passwords excluded
  • User Data: Privacy rules applied

Access Control

  • Feature Flag: Organization-level control
  • Permissions: Platform storage permissions required
  • Audit Trail: All exports logged with metadata

Troubleshooting

Export Not Working

  1. Check Feature Flag: Verify EXPORT_JSON_REPORT_ON_SUBMIT_SYNC enabled
  2. Storage Permissions: Ensure app has storage access
  3. Available Space: Confirm sufficient device storage
  4. App Version: Update to latest version

Files Not Accessible

  1. Android: Check Files app or selected directory
  2. iOS: Look in Files app or chosen destination
  3. File Search: Search device for .json files

Integration Use Cases

Business Intelligence πŸ“Š

Export audit data for analysis in BI tools:

  • Import JSON into PowerBI/Tableau
  • Create custom dashboards
  • Trend analysis across audits

Compliance Documentation πŸ“‘

Maintain audit trails for regulatory requirements:

  • Archive completed audits
  • Provide evidence for inspections
  • Document operational compliance

Backup & Recovery πŸ’Ύ

Create local backups of critical audit data:

  • Protect against data loss
  • Maintain offline copies
  • Enable data portability

Technical References

  • Controller: packages/app/features/questionnaire/questionnaire-summary/controller/submit-questionnaire-controller.ts
  • Use Case: packages/app/features/team-report/export/_use-cases/audit-data-export-usecase.ts
  • Service: packages/app/features/team-report/export/_services/export-service.ts
  • File System: packages/app/features/team-report/export/_services/file-system-service.ts