This commit is contained in:
natib21
2026-06-19 11:42:27 +00:00
parent b4ed7d492d
commit 8d69630f01
65 changed files with 8980 additions and 6 deletions

View File

@@ -0,0 +1,60 @@
import { api as apiClient } from '../auth/http';
import { URL_CONSTANTS } from '@/constants/URLS';
export type DriverStatus = 'ACTIVE' | 'INACTIVE' | 'SUSPENDED' | 'ON_LEAVE';
export interface DriverListFilters {
status?: DriverStatus;
search?: string;
page?: number;
limit?: number;
sortBy?: string;
sortOrder?: 'ASC' | 'DESC';
}
export interface Driver {
id: string;
licenseNumber: string;
firstName: string;
lastName: string;
email: string;
phoneNumber: string;
dateOfBirth: string;
licenseExpiryDate: string;
status: DriverStatus;
vehicleTypesAuthorized: string[];
address?: string | null;
emergencyContact?: string | null;
notes?: string | null;
totalTrips: number;
rating: number;
createdAt: string;
updatedAt: string;
}
export type SaveDriverPayload = Omit<
Driver,
'id' | 'createdAt' | 'updatedAt' | 'totalTrips' | 'rating'
>;
export const driversService = {
getAll: (filters: DriverListFilters = {}) => {
const params = new URLSearchParams();
if (filters.status) params.set('status', filters.status);
if (filters.search) params.set('search', filters.search);
if (filters.page) params.set('page', filters.page.toString());
if (filters.limit) params.set('limit', filters.limit.toString());
if (filters.sortBy) params.set('sortBy', filters.sortBy);
if (filters.sortOrder) params.set('sortOrder', filters.sortOrder);
const qs = params.toString();
return apiClient.get<Driver[]>(
`${URL_CONSTANTS.DRIVERS.BASE}${qs ? `?${qs}` : ''}`,
);
},
getById: (id: string) => apiClient.get<Driver>(URL_CONSTANTS.DRIVERS.BY_ID(id)),
create: (data: Partial<SaveDriverPayload>) =>
apiClient.post(URL_CONSTANTS.DRIVERS.BASE, data),
update: (id: string, data: Partial<SaveDriverPayload>) =>
apiClient.patch(URL_CONSTANTS.DRIVERS.BY_ID(id), data),
delete: (id: string) => apiClient.delete(URL_CONSTANTS.DRIVERS.BY_ID(id)),
};

View File

@@ -7,11 +7,13 @@ import {
} from "@/services/locomotives.service";
import { trainService, type Train } from "@/services/trains.service";
import { wagonService, type Wagon, type WagonListFilters } from "@/services/wagon.service";
import { vehiclesService, type Vehicle, type VehicleListFilters } from "@/services/vehicles.service";
import { driversService, type Driver, type DriverListFilters } from "@/services/drivers.service";
import type { FleetResourceSlug } from "@/pages/fleet/config/resources";
export type FleetRecord = Locomotive | Train | Wagon | Container | Cargo;
export type FleetRecord = Locomotive | Train | Wagon | Container | Cargo | Vehicle | Driver;
export type FleetListFilters = WagonListFilters & LocomotiveListFilters;
export type FleetListFilters = WagonListFilters & LocomotiveListFilters & VehicleListFilters & DriverListFilters;
const listHandlers: Record<
FleetResourceSlug,
@@ -22,6 +24,8 @@ const listHandlers: Record<
wagons: (filters) => wagonService.getAll(filters ?? {}).then((r) => r.data),
containers: () => containerService.getAll().then((r) => r.data),
cargoes: () => cargoService.getAll().then((r) => r.data),
vehicles: (filters) => vehiclesService.getAll(filters ?? {}).then((r) => r.data),
drivers: (filters) => driversService.getAll(filters ?? {}).then((r) => r.data),
};
const createHandlers: Record<FleetResourceSlug, (data: Record<string, unknown>) => Promise<unknown>> = {
@@ -30,6 +34,8 @@ const createHandlers: Record<FleetResourceSlug, (data: Record<string, unknown>)
wagons: (data) => wagonService.create(data),
containers: (data) => containerService.create(data),
cargoes: (data) => cargoService.create(data),
vehicles: (data) => vehiclesService.create(data),
drivers: (data) => driversService.create(data),
};
const updateHandlers: Record<
@@ -41,6 +47,8 @@ const updateHandlers: Record<
wagons: (id, data) => wagonService.update(id, data),
containers: (id, data) => containerService.update(id, data),
cargoes: (id, data) => cargoService.update(id, data),
vehicles: (id, data) => vehiclesService.update(id, data),
drivers: (id, data) => driversService.update(id, data),
};
const removeHandlers: Record<FleetResourceSlug, (id: string) => Promise<unknown>> = {
@@ -49,6 +57,8 @@ const removeHandlers: Record<FleetResourceSlug, (id: string) => Promise<unknown>
wagons: (id) => wagonService.delete(id),
containers: (id) => containerService.delete(id),
cargoes: (id) => cargoService.delete(id),
vehicles: (id) => vehiclesService.delete(id),
drivers: (id) => driversService.delete(id),
};
export const fleetService = {

View File

@@ -0,0 +1,58 @@
import { api as apiClient } from '../auth/http';
import { URL_CONSTANTS } from '@/constants/URLS';
export type VehicleType = 'TRUCK' | 'VAN' | 'CAR' | 'BUS' | 'TRAILER' | 'TANKER' | 'FLATBED';
export type FuelType = 'PETROL' | 'DIESEL' | 'ELECTRIC' | 'HYBRID';
export type VehicleStatus = 'ACTIVE' | 'MAINTENANCE' | 'RETIRED' | 'OUT_OF_SERVICE';
export interface VehicleListFilters {
status?: VehicleStatus;
search?: string;
page?: number;
limit?: number;
sortBy?: string;
sortOrder?: 'ASC' | 'DESC';
}
export interface Vehicle {
id: string;
plateNumber: string;
registrationNumber: string;
vehicleType: VehicleType;
manufacturer: string;
model: string;
year: number;
fuelType: FuelType;
capacity: number;
status: VehicleStatus;
description?: string | null;
createdAt: string;
updatedAt: string;
}
export type SaveVehiclePayload = Omit<
Vehicle,
'id' | 'createdAt' | 'updatedAt' | 'registrationNumber'
>;
export const vehiclesService = {
getAll: (filters: VehicleListFilters = {}) => {
const params = new URLSearchParams();
if (filters.status) params.set('status', filters.status);
if (filters.search) params.set('search', filters.search);
if (filters.page) params.set('page', filters.page.toString());
if (filters.limit) params.set('limit', filters.limit.toString());
if (filters.sortBy) params.set('sortBy', filters.sortBy);
if (filters.sortOrder) params.set('sortOrder', filters.sortOrder);
const qs = params.toString();
return apiClient.get<Vehicle[]>(
`${URL_CONSTANTS.VEHICLES.BASE}${qs ? `?${qs}` : ''}`,
);
},
getById: (id: string) => apiClient.get<Vehicle>(URL_CONSTANTS.VEHICLES.BY_ID(id)),
create: (data: Partial<SaveVehiclePayload>) =>
apiClient.post(URL_CONSTANTS.VEHICLES.BASE, data),
update: (id: string, data: Partial<SaveVehiclePayload>) =>
apiClient.patch(URL_CONSTANTS.VEHICLES.BY_ID(id), data),
delete: (id: string) => apiClient.delete(URL_CONSTANTS.VEHICLES.BY_ID(id)),
};