mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-30 00:38:11 +00:00
feat: add maintenance tracking module foundation
Entities: - MaintenanceSchedule: track preventive/corrective maintenance - MaintenanceCost: record actual maintenance expenses DTOs: - CreateMaintenanceScheduleDto: schedule maintenance - CreateMaintenanceCostDto: log costs - UpdateMaintenanceScheduleDto: mark complete/adjust cost Repository: - getUpcomingMaintenance(): find due maintenance - getMaintenanceCosts(): historical costs by date - getTotalMaintenanceCost(): aggregate spending Also fixed fuel-consumption.entity.ts: totalDistanceKm default 0 Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
import { BaseEntity } from '@edr/api-common';
|
||||
import { Entity, Column, ManyToOne, JoinColumn, Index } from 'typeorm';
|
||||
import { Vehicle } from '../../vehicles/entities/vehicle.entity';
|
||||
import { MaintenanceSchedule } from './maintenance-schedule.entity';
|
||||
|
||||
@Entity({ name: 'maintenance_costs', schema: 'freight' })
|
||||
@Index(['vehicleId', 'incurredDate'])
|
||||
export class MaintenanceCost extends BaseEntity {
|
||||
@Column({ name: 'vehicle_id', type: 'uuid' })
|
||||
vehicleId!: string;
|
||||
|
||||
@ManyToOne(() => Vehicle, { eager: false })
|
||||
@JoinColumn({ name: 'vehicle_id' })
|
||||
vehicle!: Vehicle;
|
||||
|
||||
@Column({ name: 'maintenance_schedule_id', type: 'uuid', nullable: true })
|
||||
maintenanceScheduleId?: string;
|
||||
|
||||
@ManyToOne(() => MaintenanceSchedule, { eager: false, onDelete: 'SET NULL' })
|
||||
@JoinColumn({ name: 'maintenance_schedule_id' })
|
||||
maintenanceSchedule?: MaintenanceSchedule;
|
||||
|
||||
@Column({ name: 'incurred_date', type: 'timestamptz' })
|
||||
incurredDate!: Date;
|
||||
|
||||
@Column({ name: 'cost_amount', type: 'numeric', precision: 14, scale: 2 })
|
||||
costAmount!: number;
|
||||
|
||||
@Column({ name: 'cost_type' })
|
||||
costType!: string; // 'PARTS', 'LABOR', 'DIAGNOSTICS', 'OTHER'
|
||||
|
||||
@Column({ name: 'description' })
|
||||
description!: string;
|
||||
|
||||
@Column({ name: 'service_provider', nullable: true })
|
||||
serviceProvider?: string;
|
||||
|
||||
@Column({ name: 'invoice_number', nullable: true })
|
||||
invoiceNumber?: string;
|
||||
|
||||
@Column({ type: 'text', nullable: true })
|
||||
notes?: string;
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
import { BaseEntity } from '@edr/api-common';
|
||||
import { Entity, Column, ManyToOne, JoinColumn, Index } from 'typeorm';
|
||||
import { Vehicle } from '../../vehicles/entities/vehicle.entity';
|
||||
|
||||
export enum MaintenanceType {
|
||||
PREVENTIVE = 'PREVENTIVE',
|
||||
CORRECTIVE = 'CORRECTIVE',
|
||||
INSPECTION = 'INSPECTION',
|
||||
REPAIR = 'REPAIR',
|
||||
}
|
||||
|
||||
export enum MaintenanceStatus {
|
||||
SCHEDULED = 'SCHEDULED',
|
||||
IN_PROGRESS = 'IN_PROGRESS',
|
||||
COMPLETED = 'COMPLETED',
|
||||
CANCELLED = 'CANCELLED',
|
||||
OVERDUE = 'OVERDUE',
|
||||
}
|
||||
|
||||
@Entity({ name: 'maintenance_schedules', schema: 'freight' })
|
||||
@Index(['vehicleId', 'scheduledDate'])
|
||||
export class MaintenanceSchedule extends BaseEntity {
|
||||
@Column({ name: 'vehicle_id', type: 'uuid' })
|
||||
vehicleId!: string;
|
||||
|
||||
@ManyToOne(() => Vehicle, { eager: false })
|
||||
@JoinColumn({ name: 'vehicle_id' })
|
||||
vehicle!: Vehicle;
|
||||
|
||||
@Column({ name: 'maintenance_type', type: 'varchar' })
|
||||
maintenanceType!: MaintenanceType;
|
||||
|
||||
@Column({ name: 'description' })
|
||||
description!: string;
|
||||
|
||||
@Column({ name: 'scheduled_date', type: 'timestamptz' })
|
||||
scheduledDate!: Date;
|
||||
|
||||
@Column({ name: 'completed_date', type: 'timestamptz', nullable: true })
|
||||
completedDate?: Date;
|
||||
|
||||
@Column({ name: 'estimated_cost', type: 'numeric', precision: 14, scale: 2, nullable: true })
|
||||
estimatedCost?: number;
|
||||
|
||||
@Column({ name: 'actual_cost', type: 'numeric', precision: 14, scale: 2, nullable: true })
|
||||
actualCost?: number;
|
||||
|
||||
@Column({ name: 'status', type: 'varchar', default: MaintenanceStatus.SCHEDULED })
|
||||
status!: MaintenanceStatus;
|
||||
|
||||
@Column({ name: 'odometer_reading', type: 'numeric', nullable: true })
|
||||
odometerReading?: number;
|
||||
|
||||
@Column({ name: 'service_provider', nullable: true })
|
||||
serviceProvider?: string;
|
||||
|
||||
@Column({ name: 'notes', type: 'text', nullable: true })
|
||||
notes?: string;
|
||||
|
||||
@Column({ name: 'next_due_km', type: 'numeric', nullable: true })
|
||||
nextDueKm?: number;
|
||||
|
||||
@Column({ name: 'next_due_date', type: 'timestamptz', nullable: true })
|
||||
nextDueDate?: Date;
|
||||
}
|
||||
Reference in New Issue
Block a user