Skip to content

Schedule/Activities Module

Last Updated: 2026-01-19

Overview

The Schedule/Activities module enables importing Primavera P6 schedule data into the LCO platform. It supports SQLite database files from P6, extracts WBS hierarchy and activities, and provides a paginated UI for viewing and managing schedule data.

Architecture

[P6 SQLite Upload] -> [Azure Blob Storage] -> [Service Bus Queue]
                                                      |
                                                      v
                                            [Azure Function Extractor]
                                                      |
                                                      v
                                            [Cosmos DB: ScheduleActivities]
                                                      |
                                                      v
[Frontend UI] <-- [useInfiniteActivities] <-- [scheduleApi]

Key Files

Layer File Purpose
Backend Router backend/app/api/v1/routers/schedule.py REST endpoints
Backend Schema backend/app/schemas/schedule.py Pydantic models
Repository backend/app/repositories/activity.py Cosmos DB operations
SQLite Extractor backend/app/services/primavera/sqlite_extractor.py P6 data extraction
Frontend Types frontend/src/types/schedule.ts TypeScript interfaces
Frontend API frontend/src/services/api/schedule.ts HTTP client
Frontend Hooks frontend/src/hooks/schedule/ React hooks
Main Page frontend/src/pages/SchedulingPage.tsx Schedule UI

Frontend Hooks

useInfiniteActivities

Paginated activity fetching with filtering support.

const {
  items,
  total,
  loadingInitial,
  isFetchingNext,
  hasNextPage,
  loadMore,
  refetch,
} = useInfiniteActivities({
  projectId,
  filters: { wbsCode, discipline },
});

useExtractionStatus

Polls extraction progress with resume support.

const { status, progress, error, isComplete } = useExtractionStatus({
  taskId,
  projectId,
  enabled: true,
});

useScheduleBulkTask

Polls async bulk operations (delete/fill).

const { status, startTask, cancelTask } = useScheduleBulkTask({
  projectId,
});

useScheduleConfig

CRUD for clean level column configurations.

const { config, updateConfig, loading } = useScheduleConfig({
  projectId,
});

API Endpoints

File Upload Pipeline

Endpoint Method Description
/schedule/upload/init POST Initialize upload, get SAS URL
/schedule/upload/complete POST Mark upload complete, queue extraction
/schedule/upload/status/{taskId} GET Poll extraction status
/schedule/upload/cancel/{taskId} POST Cancel extraction

Primavera Extraction

Endpoint Method Description
/schedule/primavera/projects GET List projects in uploaded DB
/schedule/primavera/extract POST Extract specific project

Activities CRUD

Endpoint Method Description
/schedule/activities GET List with pagination/filters
/schedule/activities/{id} GET Single activity
/schedule/activities POST Create activity
/schedule/activities/{id} PATCH Update activity
/schedule/activities/{id} DELETE Delete activity

Bulk Operations

Endpoint Method Description
/schedule/activities/bulk-delete POST Sync delete (<1000 items)
/schedule/activities/bulk-delete/async POST Async delete (>1000 items)
/schedule/activities/fill POST Fill activities from template

Data Model

Activity Schema

interface ScheduleActivity {
  id: string;
  activityId: string;           // P6 activity ID
  projectId: string;            // Partition key
  activityName: string;
  startDate: string;            // ISO date
  endDate: string;
  duration: number;             // Days
  wbsCode?: string;
  discipline?: string;
  kpiName?: string;
  package?: string;
  systemSubsystem?: string;
  procurementMilestone?: string;
  cleanLevels?: Record<string, string>;  // L1-L8 column values
}

Clean Levels Configuration

Clean levels map WBS hierarchy to custom column names:

interface ScheduleConfig {
  projectId: string;
  cleanLevelNames: {
    l1?: string;  // e.g., "Division"
    l2?: string;  // e.g., "Area"
    l3?: string;  // e.g., "System"
    // ... l4-l8
  };
}

Upload Workflow

  1. User uploads .db file - Frontend calls /upload/init to get SAS URL
  2. Direct upload to Blob - File uploaded directly to Azure Blob Storage
  3. Complete notification - Frontend calls /upload/complete
  4. Service Bus queue - Message queued for extraction
  5. Azure Function processes - Extracts WBS and activities from SQLite
  6. Batch upsert - Activities saved to Cosmos DB (100/batch)
  7. Frontend polls - UI polls /upload/status/{taskId} until complete
  8. Data displayed - useInfiniteActivities loads paginated results

Integration Points

Feature Integration
WBS Clean levels map to WBS hierarchy nodes
Packages package field links to Packages container
Systems/Subsystems systemSubsystem field for organization
COA/KPI discipline and kpiName for cost categorization
S-Curve Schedule dates used for progress curves

Performance Considerations

  • Pagination: Uses offset-based pagination with 100 items per page
  • Async bulk ops: Operations >1000 items run asynchronously
  • Batch processing: Extraction uses 100-item batches with retry
  • Blob direct upload: Files uploaded directly to Azure, not through API