mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-26 18:42:49 +00:00
Added assertCapacity() checks before saving (matches single receive) Added applyCapacityDelta() after save to increment counters Now validates warehouse → yard → zone capacity hierarchy Single receive already had both checks; bulk receive was gap.
181 lines
6.4 KiB
TypeScript
181 lines
6.4 KiB
TypeScript
import { Controller, Post, Get, Patch, Delete, Body, Param, Query } from '@nestjs/common';
|
|
import { ApiBearerAuth, ApiTags, ApiOperation } from '@nestjs/swagger';
|
|
import { BookingStaff } from '../../common/booking-guards';
|
|
import { FREIGHT_PERMS } from '../../seed/freight-permissions.registry';
|
|
import { MaintenanceService } from './maintenance.service';
|
|
import { MaintenanceDepthService } from './maintenance-depth.service';
|
|
import { CreateMaintenanceScheduleDto, CreateMaintenanceCostDto, UpdateMaintenanceScheduleDto } from './dto/create-maintenance.dto';
|
|
import {
|
|
CreateWorkOrderDto,
|
|
UpdateWorkOrderDto,
|
|
CreatePartDto,
|
|
UpdatePartDto,
|
|
CreateWarrantyDto,
|
|
} from './dto/create-maintenance-depth.dto';
|
|
import { WorkOrderStatus } from './entities/work-order.entity';
|
|
|
|
@ApiTags('Maintenance Management')
|
|
@ApiBearerAuth()
|
|
@Controller('maintenance')
|
|
export class MaintenanceController {
|
|
constructor(
|
|
private readonly maintenanceService: MaintenanceService,
|
|
private readonly maintenanceDepthService: MaintenanceDepthService,
|
|
) {}
|
|
|
|
@Post('schedules')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.create)
|
|
@ApiOperation({ summary: 'Schedule maintenance' })
|
|
async scheduleMaintenanceAsync(@Body() dto: CreateMaintenanceScheduleDto) {
|
|
return this.maintenanceService.scheduleMaintenanceAsync(dto);
|
|
}
|
|
|
|
@Post('costs')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.create)
|
|
@ApiOperation({ summary: 'Record maintenance cost' })
|
|
async recordCost(@Body() dto: CreateMaintenanceCostDto) {
|
|
return this.maintenanceService.recordMaintenanceCost(dto);
|
|
}
|
|
|
|
@Patch('schedules/:id')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.update)
|
|
@ApiOperation({ summary: 'Update maintenance schedule' })
|
|
async updateSchedule(@Param('id') id: string, @Body() dto: UpdateMaintenanceScheduleDto) {
|
|
return this.maintenanceService.updateMaintenanceSchedule(id, dto);
|
|
}
|
|
|
|
@Get('due-board')
|
|
@BookingStaff([FREIGHT_PERMS.maintenance.view, FREIGHT_PERMS.fleetDashboard.view])
|
|
@ApiOperation({ summary: 'Fleet-wide next-due maintenance board (by date and km)' })
|
|
async getDueBoard() {
|
|
return this.maintenanceService.getDueBoard();
|
|
}
|
|
|
|
@Get('upcoming/:vehicleId')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.view)
|
|
@ApiOperation({ summary: 'Get upcoming maintenance' })
|
|
async getUpcoming(@Param('vehicleId') vehicleId: string) {
|
|
return this.maintenanceService.getUpcomingMaintenance(vehicleId);
|
|
}
|
|
|
|
@Get('history/:vehicleId')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.view)
|
|
@ApiOperation({ summary: 'Get maintenance history' })
|
|
async getHistory(@Param('vehicleId') vehicleId: string) {
|
|
return this.maintenanceService.getMaintenanceHistory(vehicleId);
|
|
}
|
|
|
|
@Get('stats')
|
|
@BookingStaff([FREIGHT_PERMS.maintenance.view, FREIGHT_PERMS.fleetReports.view, FREIGHT_PERMS.fleetDashboard.view])
|
|
@ApiOperation({ summary: 'Get fleet-wide maintenance statistics' })
|
|
async getFleetStats() {
|
|
return this.maintenanceService.getFleetMaintenanceStats();
|
|
}
|
|
|
|
@Get('stats/:vehicleId')
|
|
@BookingStaff([FREIGHT_PERMS.maintenance.view, FREIGHT_PERMS.fleetReports.view, FREIGHT_PERMS.fleetDashboard.view])
|
|
@ApiOperation({ summary: 'Get maintenance statistics' })
|
|
async getStats(@Param('vehicleId') vehicleId: string) {
|
|
return this.maintenanceService.getVehicleMaintenanceStats(vehicleId);
|
|
}
|
|
|
|
// ---- Work Orders ----
|
|
|
|
@Post('work-orders')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.create)
|
|
@ApiOperation({ summary: 'Create work order' })
|
|
async createWorkOrder(@Body() dto: CreateWorkOrderDto) {
|
|
return this.maintenanceDepthService.createWorkOrder(dto);
|
|
}
|
|
|
|
@Get('work-orders')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.view)
|
|
@ApiOperation({ summary: 'List work orders' })
|
|
async listWorkOrders(
|
|
@Query('vehicleId') vehicleId?: string,
|
|
@Query('status') status?: WorkOrderStatus,
|
|
) {
|
|
return this.maintenanceDepthService.findWorkOrders({ vehicleId, status });
|
|
}
|
|
|
|
@Get('work-orders/:id')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.view)
|
|
@ApiOperation({ summary: 'Get work order' })
|
|
async getWorkOrder(@Param('id') id: string) {
|
|
return this.maintenanceDepthService.findWorkOrderById(id);
|
|
}
|
|
|
|
@Patch('work-orders/:id')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.update)
|
|
@ApiOperation({ summary: 'Update work order' })
|
|
async updateWorkOrder(@Param('id') id: string, @Body() dto: UpdateWorkOrderDto) {
|
|
return this.maintenanceDepthService.updateWorkOrder(id, dto);
|
|
}
|
|
|
|
@Delete('work-orders/:id')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.delete)
|
|
@ApiOperation({ summary: 'Delete work order' })
|
|
async deleteWorkOrder(@Param('id') id: string) {
|
|
return this.maintenanceDepthService.deleteWorkOrder(id);
|
|
}
|
|
|
|
// ---- Parts / Tires ----
|
|
|
|
@Post('parts')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.create)
|
|
@ApiOperation({ summary: 'Create part' })
|
|
async createPart(@Body() dto: CreatePartDto) {
|
|
return this.maintenanceDepthService.createPart(dto);
|
|
}
|
|
|
|
@Get('parts')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.view)
|
|
@ApiOperation({ summary: 'List parts / tire inventory' })
|
|
async listParts(
|
|
@Query('category') category?: string,
|
|
@Query('lowStock') lowStock?: string,
|
|
) {
|
|
return this.maintenanceDepthService.findParts({
|
|
category,
|
|
lowStock: lowStock === 'true',
|
|
});
|
|
}
|
|
|
|
@Patch('parts/:id')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.update)
|
|
@ApiOperation({ summary: 'Update part' })
|
|
async updatePart(@Param('id') id: string, @Body() dto: UpdatePartDto) {
|
|
return this.maintenanceDepthService.updatePart(id, dto);
|
|
}
|
|
|
|
@Delete('parts/:id')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.delete)
|
|
@ApiOperation({ summary: 'Delete part' })
|
|
async deletePart(@Param('id') id: string) {
|
|
return this.maintenanceDepthService.deletePart(id);
|
|
}
|
|
|
|
// ---- Warranties ----
|
|
|
|
@Post('warranties')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.create)
|
|
@ApiOperation({ summary: 'Create warranty' })
|
|
async createWarranty(@Body() dto: CreateWarrantyDto) {
|
|
return this.maintenanceDepthService.createWarranty(dto);
|
|
}
|
|
|
|
@Get('warranties')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.view)
|
|
@ApiOperation({ summary: 'List warranties' })
|
|
async listWarranties(@Query('vehicleId') vehicleId?: string) {
|
|
return this.maintenanceDepthService.findWarranties({ vehicleId });
|
|
}
|
|
|
|
@Delete('warranties/:id')
|
|
@BookingStaff(FREIGHT_PERMS.maintenance.delete)
|
|
@ApiOperation({ summary: 'Delete warranty' })
|
|
async deleteWarranty(@Param('id') id: string) {
|
|
return this.maintenanceDepthService.deleteWarranty(id);
|
|
}
|
|
}
|