Entity Relationships
Version: Draft
Overview
Six tables form the Driver Performance Feedback system. They cover incident tracking per order, monthly score aggregation, and performance tier management.
Entity Relationship Diagram
┌─────────────────────────────┐
│ PerformanceIncidentType │ Master lookup — defines incident templates
│─────────────────────────────│ (code, description, points, severity,
│ PK id │ incidentCategory, isQualify, isActive)
│ incidentCode │
│ incidentDescription │
│ incidentCategory │
│ points │
│ severity │
│ isQualify │
│ isActive │
└──────────────┬──────────────┘
│ 1
│ (referenced at time of incident creation;
│ values are copied into the detail record)
│ M
┌──────────────▼──────────────┐ ┌──────────────────┐
│ DriverOrderFeedbackDetail │ │ Order │
│─────────────────────────────│ ┌────│ PK id │
│ PK id │ │ └──────────────────┘
│ FK driverOrderFeedbackId ───┼──┐ │ 1
│ FK performanceIncidentTypeId│ │ │ │
│ incidentCode (snapshot) │ │ │ ┌─────────▼────────────────────┐
│ incidentDescription │ │ │ │ DriverOrderFeedback │
│ incidentCategory │ │ │ │──────────────────────────────│
│ points (snapshot) │ │ └───►│ PK id │
│ severity (snapshot) │ │ │ FK orderId │
│ isQualify (snapshot) │ │ │ FK driverId ─────────────────┼──┐
│ status │ │ │ driverName │ │
│ approvalRemark │ └─────►│ totalPoints │ │
│ approvalDatetime │ │ status │ │
│ approvalBy │ │ supplierDoDatetime │ │
└─────────────────────────────┘ └──────────────────────────────┘ │
│
┌───────────────────────────────────────────────────────────┘
│ Driver (external master)
│ 1
│
│ M
┌──────────────▼──────────────────────────┐
│ DriverPerformanceMonthlyScore │ Monthly aggregation per driver
│─────────────────────────────────────────│
│ PK id │
│ FK driverId │
│ FK performanceTierId ───────────────────┼──┐
│ driverName │ │
│ payrollMonth │ │
│ performanceTierName (snapshot) │ │
│ performanceTierIncentiveAmount │ │
│ performanceTierStatusResult │ │
│ totalBasicSalary │ │
│ totalOrder │ │
│ totalPoints │ │
│ averagePoints │ │
│ majorIncidentCount │ │
│ criticalIncidentCount │ │
│ status │ │
└─────────────────────────────────────────┘ │
│ M
┌──────────────▼──────────────┐
│ PerformanceTier │ Master — tier thresholds
│──────────────────────────────│
│ PK id │
│ tierName │
│ minAveragePoints │
│ maxAveragePoints │
│ minTripCount │
│ minBasicSalary │
│ incentiveAmount │
│ maxCriticalIncident │
│ maxMajorIncident │
│ statusResult │
│ priority │
│ isActive │
└──────────────┬───────────────┘
│ 1
│ M
┌──────────────▼───────────────┐
│ PerformanceTierLogging │ Audit trail for tier changes
│──────────────────────────────│
│ PK id │
│ FK performanceTierId │
│ actionType │
│ oldValue (JSON text) │
│ newValue (JSON text) │
│ createdDatetime │
│ createdBy │
└──────────────────────────────┘
Relationship Summary
| From | To | Type | FK Column | Notes |
|---|---|---|---|---|
DriverOrderFeedbackDetail |
DriverOrderFeedback |
Many → One | driverOrderFeedbackId |
Many incidents per feedback header |
DriverOrderFeedbackDetail |
PerformanceIncidentType |
Many → One | performanceIncidentTypeId |
Incident values are copied (snapshot) into detail at creation |
DriverOrderFeedback |
Order |
Many → One | orderId |
One feedback header per order per driver |
DriverOrderFeedback |
Driver |
Many → One | driverId |
|
DriverPerformanceMonthlyScore |
Driver |
Many → One | driverId |
Monthly score per driver |
DriverPerformanceMonthlyScore |
PerformanceTier |
Many → One | performanceTierId |
Tier resolved at calculation time; name/amount also snapshotted |
PerformanceTierLogging |
PerformanceTier |
Many → One | performanceTierId |
Audit log of tier config changes |
Key Design Notes
-
Snapshot pattern —
DriverOrderFeedbackDetailcopiesincidentCode,incidentDescription,points,severity,isQualifyfromPerformanceIncidentTypeat creation. Historical records are unaffected if the master type is later edited. -
Same pattern in monthly score —
DriverPerformanceMonthlyScorecopiesperformanceTierNameandperformanceTierIncentiveAmountfromPerformanceTierat calculation time. -
Approval workflow on detail —
DriverOrderFeedbackDetailhasstatus,approvalRemark,approvalDatetime,approvalBy— individual incidents can be approved/rejected independently. -
PerformanceIncidentType is pure master — no
@OneToManyback-relation defined. Snapshots handle history preservation. -
PerformanceTierLogging is audit-only — tracks
oldValue/newValueas JSON text for full config history of tier changes.
Source Files
| Entity | File |
|---|---|
| PerformanceIncidentType | src/_entities/performance-incident-type.entity.ts |
| DriverOrderFeedback | src/_entities/driver-order-feedback.entity.ts |
| DriverOrderFeedbackDetail | src/_entities/driver-order-feedback-detail.entity.ts |
| DriverPerformanceMonthlyScore | src/_entities/driver-performance-monthly-score.entity.ts |
| PerformanceTier | src/_entities/performance-tier.entity.ts |
| PerformanceTierLogging | src/_entities/performance-tier-logging.entity.ts |
| Service | src/custom/driver-order-feedback/driver-order-feedback.service.ts |