Merge pull request #284 from Tria-plc/freight/feature/vehicle_2

Freight/feature/vehicle 2
This commit is contained in:
yaschalew10
2026-06-25 09:48:11 +03:00
committed by GitHub
6 changed files with 185 additions and 137 deletions

View File

@@ -59,7 +59,7 @@ export class FirstMileController {
@TrainSchedulingManage() @TrainSchedulingManage()
@ApiOperation({ summary: 'Accept a paid booking and create a first-mile leg' }) @ApiOperation({ summary: 'Accept a paid booking and create a first-mile leg' })
acceptBooking(@Param('reference') reference: string) { acceptBooking(@Param('reference') reference: string) {
return this.firstMileService.acceptBooking(reference); return this.firstMileService.acceptBookingByReference(reference);
} }
@Post() @Post()

View File

@@ -44,8 +44,8 @@ export class FirstMileService {
* paid before any first-mile work proceeds. Throws if the reference is * paid before any first-mile work proceeds. Throws if the reference is
* unknown or the booking has not reached PAID status. * unknown or the booking has not reached PAID status.
*/ */
async acceptBooking(bookingReference: string): Promise<FirstMile | null> { async acceptBooking(bookingId: string): Promise<FirstMile | null> {
const booking = await this.bookingsRepository.findByReference(bookingReference); const booking = await this.bookingsRepository.findById(bookingId);
if (!booking) { if (!booking) {
return null; return null;
@@ -61,6 +61,22 @@ export class FirstMileService {
}); });
} }
async acceptBookingByReference(bookingReference: string): Promise<FirstMile | null> {
const booking = await this.bookingsRepository.findByReference(bookingReference);
if (!booking) {
return null;
}
if (booking.paymentStatus !== 'PAID') {
return null;
}
return this.create({
bookingId: booking.id,
advancedPayment: 0,
});
}
async findAll(filter: FirstMileListFilter = {}): Promise<{ async findAll(filter: FirstMileListFilter = {}): Promise<{
data: FirstMile[]; data: FirstMile[];
meta: { total: number; page: number; pageSize: number; totalPages: number }; meta: { total: number; page: number; pageSize: number; totalPages: number };

View File

@@ -59,7 +59,7 @@ export class LastMileController {
@TrainSchedulingManage() @TrainSchedulingManage()
@ApiOperation({ summary: 'Accept a paid booking and create a last-mile leg' }) @ApiOperation({ summary: 'Accept a paid booking and create a last-mile leg' })
acceptBooking(@Param('reference') reference: string) { acceptBooking(@Param('reference') reference: string) {
return this.lastMileService.acceptBooking(reference); return this.lastMileService.acceptBookingByReference(reference);
} }
@Post() @Post()

View File

@@ -54,7 +54,26 @@ export class LastMileService {
return this.create({ return this.create({
bookingId: booking.id, bookingId: booking.id,
advancedPayment: booking.totalAmount, advancedPayment: 0,
});
}
async acceptBookingByReference(bookingReference: string): Promise<LastMile> {
const booking = await this.bookingsRepository.findByReference(bookingReference);
if (!booking) {
throw new NotFoundException(`Booking ${bookingReference} not found`);
}
if (booking.paymentStatus !== 'PAID') {
throw new BadRequestException(
`Booking ${bookingReference} is not paid (payment status: ${booking.paymentStatus})`,
);
}
return this.create({
bookingId: booking.id,
advancedPayment: 0,
}); });
} }

View File

@@ -72,6 +72,7 @@ import WarehouseInventoryPage from "./pages/warehouses/WarehouseInventoryPage";
import WarehouseInvoicesPage from "./pages/warehouses/WarehouseInvoicesPage"; import WarehouseInvoicesPage from "./pages/warehouses/WarehouseInvoicesPage";
import WarehouseListPage from "./pages/warehouses/WarehouseListPage"; import WarehouseListPage from "./pages/warehouses/WarehouseListPage";
import WarehouseRulesPage from "./pages/warehouses/WarehouseRulesPage"; import WarehouseRulesPage from "./pages/warehouses/WarehouseRulesPage";
import { HealthCheck } from "./features/health/HealthCheck";
const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [ const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [
{ {
@@ -353,6 +354,7 @@ const App = () => {
return ( return (
<Routes> <Routes>
<Route path="/um/*" element={<UserManagementHostPage />} /> <Route path="/um/*" element={<UserManagementHostPage />} />
<Route path="/health" element={<HealthCheck />} />
<Route path="/" element={<Navigate to="/dashboard/overview" replace />} /> <Route path="/" element={<Navigate to="/dashboard/overview" replace />} />
<Route path="/dashboard" element={<Navigate to="/dashboard/overview" replace />} /> <Route path="/dashboard" element={<Navigate to="/dashboard/overview" replace />} />
<Route path="/dashboard" element={<DashboardShell />}> <Route path="/dashboard" element={<DashboardShell />}>
@@ -388,138 +390,138 @@ const App = () => {
<Route path="warehouse-fee-invoices" element={<WarehouseInvoicesPage />} /> <Route path="warehouse-fee-invoices" element={<WarehouseInvoicesPage />} />
<Route path="warehouse-dashboard" element={<WarehouseDashboardPage />} /> <Route path="warehouse-dashboard" element={<WarehouseDashboardPage />} />
<Route <Route
path="operations/train-scheduling" path="operations/train-scheduling"
element={<Navigate to="/dashboard/operations/train-scheduling-v2" replace />} element={<Navigate to="/dashboard/operations/train-scheduling-v2" replace />}
/> />
<Route <Route
path="operations/batch-board" path="operations/batch-board"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}> <RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}>
<BatchBoardPage /> <BatchBoardPage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="operations/first-mile" path="operations/first-mile"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}> <RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}>
<FirstMilePage /> <FirstMilePage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="operations/last-mile" path="operations/last-mile"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}> <RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}>
<LastMilePage /> <LastMilePage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="operations/batch-board/:scheduleId" path="operations/batch-board/:scheduleId"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}> <RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}>
<BatchScheduleDetailPage /> <BatchScheduleDetailPage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="operations/train-scheduling-v2" path="operations/train-scheduling-v2"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}> <RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}>
<TrainScheduleV2ListPage /> <TrainScheduleV2ListPage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="operations/train-scheduling-v2/:scheduleId" path="operations/train-scheduling-v2/:scheduleId"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}> <RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}>
<TrainScheduleV2DetailPage /> <TrainScheduleV2DetailPage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="operations/train-scheduling-v2/:scheduleId/track" path="operations/train-scheduling-v2/:scheduleId/track"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}> <RequirePermission permission={FREIGHT_PERMS.trainScheduling.view}>
<TrainScheduleTrackPage /> <TrainScheduleTrackPage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="routes" path="routes"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.fleet.view}> <RequirePermission permission={FREIGHT_PERMS.fleet.view}>
<RoutesPage /> <RoutesPage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="locomotives" path="locomotives"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.fleet.view}> <RequirePermission permission={FREIGHT_PERMS.fleet.view}>
<FleetResourcePage /> <FleetResourcePage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="trains" path="trains"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.fleet.view}> <RequirePermission permission={FREIGHT_PERMS.fleet.view}>
<FleetResourcePage /> <FleetResourcePage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="trains/:id" path="trains/:id"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.fleet.view}> <RequirePermission permission={FREIGHT_PERMS.fleet.view}>
<TrainDetailPage /> <TrainDetailPage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="wagons" path="wagons"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.fleet.view}> <RequirePermission permission={FREIGHT_PERMS.fleet.view}>
<FleetResourcePage /> <FleetResourcePage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="containers" path="containers"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.fleet.view}> <RequirePermission permission={FREIGHT_PERMS.fleet.view}>
<FleetResourcePage /> <FleetResourcePage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="cargoes" path="cargoes"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.fleet.view}> <RequirePermission permission={FREIGHT_PERMS.fleet.view}>
<FleetResourcePage /> <FleetResourcePage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="vehicles" path="vehicles"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.fleet.view}> <RequirePermission permission={FREIGHT_PERMS.fleet.view}>
<FleetResourcePage /> <FleetResourcePage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="drivers" path="drivers"
element={ element={
<RequirePermission permission={FREIGHT_PERMS.fleet.view}> <RequirePermission permission={FREIGHT_PERMS.fleet.view}>
<FleetResourcePage /> <FleetResourcePage />
</RequirePermission> </RequirePermission>
} }
/> />
<Route <Route
path="operations/train-scheduling" path="operations/train-scheduling"
element={<Navigate to="/dashboard/operations/train-scheduling-v2" replace />} element={<Navigate to="/dashboard/operations/train-scheduling-v2" replace />}

View File

@@ -0,0 +1,11 @@
export const HealthCheck = () => {
const url1 = import.meta.env.VITE_API_URL?? "undefined";
const url2 = import.meta.env.VITE_BASE_API_URL?? "undefined";
const url3 = import.meta.env.VITE_USER_MANAGEMENT_BASE?? "undefined";
return <div>
<h2>-----------{url1}</h2>
<h2>-----------{url2}</h2>
<h2>-----------{url3}</h2>
</div>
}