diff --git a/apps/edr-freight-api/package.json b/apps/edr-freight-api/package.json index 36d20799e..32237b507 100644 --- a/apps/edr-freight-api/package.json +++ b/apps/edr-freight-api/package.json @@ -46,7 +46,9 @@ "pg": "^8.13.0", "puppeteer": "^24.2.0", "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.1" + "rxjs": "^7.8.1", + "typeorm": "^0.3.30" + }, "devDependencies": { "@edr/api-common": "workspace:*", @@ -69,7 +71,6 @@ "ts-loader": "^9.5.1", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "typeorm": "^0.3.30", "typescript": "^5.5.4" }, "jest": { diff --git a/apps/edr-freight-api/src/modules/bookings/booking-list-tabs.config.ts b/apps/edr-freight-api/src/modules/bookings/booking-list-tabs.config.ts index 332916727..2140a7688 100644 --- a/apps/edr-freight-api/src/modules/bookings/booking-list-tabs.config.ts +++ b/apps/edr-freight-api/src/modules/bookings/booking-list-tabs.config.ts @@ -16,7 +16,7 @@ export const BOOKING_LIST_TABS: ReadonlyArray<{ statuses: readonly string[] | null; }> = [ { key: 'all', statuses: null }, - { key: 'intake', statuses: ['SUBMITTED'] }, + { key: 'intake', statuses: ['SUBMITTED', 'PENDING_CONSOLIDATION'] }, { key: 'in_approval', statuses: ['PENDING_APPROVAL', 'APPROVED_PENDING_SIGNATURE'], @@ -28,7 +28,7 @@ export const BOOKING_LIST_TABS: ReadonlyArray<{ { key: 'payment', statuses: ['FULLY_EXECUTED'] }, { key: 'operations', - statuses: ['IN_TRANSIT', 'PENDING_CONSOLIDATION', 'CONSOLIDATED','PAID'], + statuses: ['IN_TRANSIT', 'PAID'], }, { key: 'completed', statuses: ['COMPLETED'] }, { key: 'closed', statuses: ['REJECTED', 'CANCELLED'] }, diff --git a/apps/edr-freight-api/src/modules/bookings/booking-transition.service.ts b/apps/edr-freight-api/src/modules/bookings/booking-transition.service.ts index 9974b807a..b2c3ffbfb 100644 --- a/apps/edr-freight-api/src/modules/bookings/booking-transition.service.ts +++ b/apps/edr-freight-api/src/modules/bookings/booking-transition.service.ts @@ -1,4 +1,10 @@ -import { BadRequestException, forwardRef, Inject, Injectable } from '@nestjs/common'; +import { + BadRequestException, + ConflictException, + forwardRef, + Inject, + Injectable, +} from '@nestjs/common'; import type { TCurrentUser } from '@tria-plc/api-common/modules/auth/types/current-user.type'; import { assertCanApproveBookingStep } from '../../common/freight-permission.util'; @@ -184,6 +190,16 @@ export class BookingTransitionService { const booking = await this.bookingsService.findById(bookingId); assertBookingStatus(booking, ['SUBMITTED']); + // Consolidation gate: a booking whose containers don't fill whole wagons + // cannot be accepted until it is paired with a complementary booking. + const gate = await this.bookingsService.resolveConsolidationGate(bookingId); + if (gate.blocked) { + throw new ConflictException( + gate.message ?? + 'Booking requires consolidation and cannot be accepted until a partner is found.', + ); + } + await this.ruleEngineService.instantiateApprovalSteps(bookingId, { freightType: booking.freightType as 'CONTAINER' | 'BULK', cargoTypeId: booking.cargoTypeId, diff --git a/apps/edr-freight-api/src/modules/bookings/bookings.repository.ts b/apps/edr-freight-api/src/modules/bookings/bookings.repository.ts index 3e95b917d..d304e2946 100644 --- a/apps/edr-freight-api/src/modules/bookings/bookings.repository.ts +++ b/apps/edr-freight-api/src/modules/bookings/bookings.repository.ts @@ -93,6 +93,7 @@ export class BookingsRepository extends BaseRepository { .leftJoinAndSelect('booking.rateSnapshots', 'snapshots') .leftJoinAndSelect('booking.cargoModifiers', 'modifiers') .leftJoinAndSelect('booking.reviewNotes', 'reviewNotes') + .leftJoinAndSelect('booking.consolidationPartner', 'consolidationPartner') .where('booking.id = :id', { id }) .leftJoinAndMapMany( 'booking.files', @@ -177,7 +178,7 @@ export class BookingsRepository extends BaseRepository { .andWhere('b.allowConsolidation = true') .andWhere('b.consolidationPartnerId IS NULL') .andWhere('b.status IN (:...statuses)', { - statuses: ['DRAFT', 'PENDING_CONSOLIDATION'], + statuses: ['DRAFT', 'SUBMITTED', 'PENDING_CONSOLIDATION'], }) .andWhere('b.originYardId = :originYardId', { originYardId: booking.originYardId, @@ -214,15 +215,27 @@ export class BookingsRepository extends BaseRepository { return null; } - /** Pair two bookings for consolidation. */ + /** + * Pair two bookings for consolidation. Both return to SUBMITTED so staff can + * accept them into the approval chain; the link itself (consolidationPartnerId) + * marks them as consolidated in the UI. + */ async pairConsolidation(bookingId: string, partnerId: string): Promise { await this.repository.update(bookingId, { consolidationPartnerId: partnerId, - status: 'CONSOLIDATED', + status: 'SUBMITTED', } as never); await this.repository.update(partnerId, { consolidationPartnerId: bookingId, - status: 'CONSOLIDATED', + status: 'SUBMITTED', + } as never); + } + + /** Park a booking that needs consolidation but has no partner yet. */ + async parkForConsolidation(bookingId: string): Promise { + await this.repository.update(bookingId, { + consolidationPartnerId: null, + status: 'PENDING_CONSOLIDATION', } as never); } @@ -429,6 +442,7 @@ export class BookingsRepository extends BaseRepository { .leftJoinAndSelect('booking.destinationYard', 'destinationYard') .leftJoinAndSelect('booking.serviceType', 'serviceType') .leftJoinAndSelect('booking.approvalSteps', 'approvalSteps') + .leftJoinAndSelect('booking.consolidationPartner', 'consolidationPartner') .where('booking.deleted_at IS NULL'); this.applyListFilters(qb, options); diff --git a/apps/edr-freight-api/src/modules/bookings/bookings.service.ts b/apps/edr-freight-api/src/modules/bookings/bookings.service.ts index d1c135152..ebf8273de 100644 --- a/apps/edr-freight-api/src/modules/bookings/bookings.service.ts +++ b/apps/edr-freight-api/src/modules/bookings/bookings.service.ts @@ -204,6 +204,48 @@ export class BookingsService { return { booking: pending, messages }; } + /** + * Consolidation gate used at staff-accept time. Returns the (possibly newly + * paired) booking plus whether it still needs a consolidation partner. + * When a booking needs consolidation and none is found, it is parked in + * PENDING_CONSOLIDATION and `blocked` is true so the caller refuses the accept. + */ + async resolveConsolidationGate(bookingId: string): Promise<{ + booking: Booking; + blocked: boolean; + message?: string; + }> { + let booking = await this.findById(bookingId); + + // Already paired — passes the gate. + if (booking.consolidationPartnerId) { + return { booking, blocked: false }; + } + + const needs = + await this.consolidationService.needsConsolidationFromBooking(booking); + if (!needs) { + return { booking, blocked: false }; + } + + // A partner may have appeared since submission — try to pair now. + const result = await this.tryAutoConsolidate(booking); + booking = result.booking; + if (booking.consolidationPartnerId) { + return { booking, blocked: false, message: result.messages.join(' ') }; + } + + // Still no partner — park it and block the accept. + await this.bookingsRepository.parkForConsolidation(booking.id); + booking = await this.findById(booking.id); + const slots = await this.consolidationService.slotsFromBooking(booking); + return { + booking, + blocked: true, + message: this.consolidationService.describePending(booking, slots), + }; + } + /** Create a new freight booking. */ async create( dto: CreateBookingDto, diff --git a/apps/edr-freight-web/backoffice/src/components/bookings/BookingStatusBadge.tsx b/apps/edr-freight-web/backoffice/src/components/bookings/BookingStatusBadge.tsx index 3d8a0792a..466bfe505 100644 --- a/apps/edr-freight-web/backoffice/src/components/bookings/BookingStatusBadge.tsx +++ b/apps/edr-freight-web/backoffice/src/components/bookings/BookingStatusBadge.tsx @@ -1,4 +1,5 @@ -import { Badge } from "@mantine/core"; +import { Badge, Group } from "@mantine/core"; +import { Link2 } from "lucide-react"; import { BOOKING_STATUS_STYLES } from "@/features/bookings/booking-status.config"; const statusColorMap: Record = { @@ -24,14 +25,26 @@ const statusColorMap: Record = { CONSOLIDATED: "indigo", }; -export function BookingStatusBadge({ status }: { status: string }) { +interface BookingStatusBadgeProps { + status: string; + /** When the booking is part of a consolidation, show a sibling badge. */ + consolidated?: boolean; + /** Partner booking reference for the consolidated badge tooltip. */ + partnerReference?: string | null; +} + +export function BookingStatusBadge({ + status, + consolidated, + partnerReference, +}: BookingStatusBadgeProps) { const style = BOOKING_STATUS_STYLES[status] ?? { label: status, color: "gray", }; const color = statusColorMap[status] ?? "gray"; - return ( + const statusBadge = ( ); + + if (!consolidated) return statusBadge; + + return ( + + {statusBadge} + } + title={ + partnerReference + ? `Consolidated with ${partnerReference}` + : "Part of a consolidation" + } + style={{ + fontSize: "0.7rem", + letterSpacing: "0.05em", + display: "inline-flex", + whiteSpace: "nowrap", + }} + > + Consolidated + + + ); } diff --git a/apps/edr-freight-web/backoffice/src/components/bookings/detail/BookingDetailHeader.tsx b/apps/edr-freight-web/backoffice/src/components/bookings/detail/BookingDetailHeader.tsx index aa4e00b19..e03f4580e 100644 --- a/apps/edr-freight-web/backoffice/src/components/bookings/detail/BookingDetailHeader.tsx +++ b/apps/edr-freight-web/backoffice/src/components/bookings/detail/BookingDetailHeader.tsx @@ -36,7 +36,11 @@ export function BookingDetailHeader({ {booking.reference} - + diff --git a/apps/edr-freight-web/backoffice/src/components/bookings/detail/ConsolidationWaitingBanner.tsx b/apps/edr-freight-web/backoffice/src/components/bookings/detail/ConsolidationWaitingBanner.tsx new file mode 100644 index 000000000..5e95ec7ef --- /dev/null +++ b/apps/edr-freight-web/backoffice/src/components/bookings/detail/ConsolidationWaitingBanner.tsx @@ -0,0 +1,44 @@ +import { useQuery } from "@tanstack/react-query"; +import { Alert, List, Text } from "@mantine/core"; +import { Link2 } from "lucide-react"; + +import { bookingsService } from "@/services/bookings.service"; +import { QUERY_KEYS } from "@/constants/QUERY_KEYS"; + +/** + * Shown on a booking parked in PENDING_CONSOLIDATION. Explains that the booking + * cannot be approved until a complementary booking fills the wagon, and lists + * the partial-wagon container lines that are waiting for a partner. + */ +export function ConsolidationWaitingBanner({ bookingId }: { bookingId: string }) { + const { data } = useQuery({ + queryKey: [...QUERY_KEYS.BOOKINGS.byId(bookingId), "consolidation"], + queryFn: () => bookingsService.getConsolidationDetails(bookingId), + enabled: Boolean(bookingId), + }); + + return ( + } + title="Waiting for a consolidation partner" + > + + This booking cannot be approved until a matching booking fills the + wagon. It will return to the approval queue automatically once a partner + is found. + + {data?.wagonSlots?.length ? ( + + {data.wagonSlots.map((slot) => ( + + {slot.slotsNeeded} more × {slot.containerTypeCode} ( + {slot.containersPerWagon} per wagon; you have {slot.quantity}) + + ))} + + ) : null} + + ); +} diff --git a/apps/edr-freight-web/backoffice/src/components/layout/FreightDashboardHeader.tsx b/apps/edr-freight-web/backoffice/src/components/layout/FreightDashboardHeader.tsx index d0dd0d04d..cc8074850 100644 --- a/apps/edr-freight-web/backoffice/src/components/layout/FreightDashboardHeader.tsx +++ b/apps/edr-freight-web/backoffice/src/components/layout/FreightDashboardHeader.tsx @@ -2,6 +2,7 @@ import { type ReactNode, useEffect, useRef, useState } from "react"; import { Bell, ChevronDown, + FileSignature, Languages, LogOut, MessageSquare, @@ -209,6 +210,15 @@ const FreightDashboardHeader = ({ > Profile + } + onClick={() => { + setIsUserMenuOpen(false); + navigate("/dashboard/profile#signature"); + }} + > + My signature + } color="red" diff --git a/apps/edr-freight-web/backoffice/src/features/bookings/booking-actions.config.ts b/apps/edr-freight-web/backoffice/src/features/bookings/booking-actions.config.ts index bbc01b402..5aeeabbd7 100644 --- a/apps/edr-freight-web/backoffice/src/features/bookings/booking-actions.config.ts +++ b/apps/edr-freight-web/backoffice/src/features/bookings/booking-actions.config.ts @@ -347,6 +347,10 @@ export function getBookingActions( case "CHANGES_REQUESTED": actions = [CANCEL_ACTION]; break; + case "PENDING_CONSOLIDATION": + // View-only while waiting for a consolidation partner; cancel still allowed. + actions = [CANCEL_ACTION]; + break; default: actions = []; } diff --git a/apps/edr-freight-web/backoffice/src/features/bookings/booking-status.config.ts b/apps/edr-freight-web/backoffice/src/features/bookings/booking-status.config.ts index 834dcee3e..213cb7c2e 100644 --- a/apps/edr-freight-web/backoffice/src/features/bookings/booking-status.config.ts +++ b/apps/edr-freight-web/backoffice/src/features/bookings/booking-status.config.ts @@ -212,21 +212,25 @@ export const BOOKING_STATUS_META: Record = { }, PENDING_CONSOLIDATION: { title: "Pending Consolidation", - description: "Waiting for consolidation partner.", + description: "Blocked — waiting for a consolidation partner before approval.", color: "text-amber-600", - stage: 4, + stage: 0, }, CONSOLIDATED: { title: "Consolidated", description: "Paired with another booking.", color: "text-indigo-600", - stage: 4, + stage: 0, }, }; export const BOOKING_LIST_TABS = [ { key: "all", label: "All bookings", statuses: null as string[] | null }, - { key: "intake", label: "Submitted", statuses: ["SUBMITTED"] }, + { + key: "intake", + label: "Submitted", + statuses: ["SUBMITTED", "PENDING_CONSOLIDATION"], + }, { key: "in_approval", label: "In approval", @@ -256,7 +260,7 @@ export const BOOKING_LIST_TABS = [ { key: "operations", label: "Operations", - statuses: ["PAID", "IN_TRANSIT", "PENDING_CONSOLIDATION", "CONSOLIDATED"], + statuses: ["PAID", "IN_TRANSIT"], }, { key: "completed", label: "Completed", statuses: ["COMPLETED"] }, { key: "closed", label: "Closed", statuses: ["REJECTED", "CANCELLED"] }, @@ -265,7 +269,15 @@ export const BOOKING_LIST_TABS = [ export type BookingStatusTabKey = (typeof BOOKING_LIST_TABS)[number]["key"]; export const WORKFLOW_STAGES = [ - { label: "Submission", statuses: ["DRAFT", "SUBMITTED", "CHANGES_REQUESTED"] }, + { + label: "Submission", + statuses: [ + "DRAFT", + "SUBMITTED", + "CHANGES_REQUESTED", + "PENDING_CONSOLIDATION", + ], + }, { label: "Approval", statuses: ["PENDING_APPROVAL", "APPROVED_PENDING_SIGNATURE"], @@ -286,7 +298,7 @@ export const WORKFLOW_STAGES = [ }, { label: "Operations", - statuses: ["PAID", "IN_TRANSIT", "PENDING_CONSOLIDATION", "CONSOLIDATED"], + statuses: ["PAID", "IN_TRANSIT"], }, { label: "Done", statuses: ["COMPLETED"] }, ] as const; diff --git a/apps/edr-freight-web/backoffice/src/features/bookings/mapBookingListRow.ts b/apps/edr-freight-web/backoffice/src/features/bookings/mapBookingListRow.ts index f458b11e6..7f250daeb 100644 --- a/apps/edr-freight-web/backoffice/src/features/bookings/mapBookingListRow.ts +++ b/apps/edr-freight-web/backoffice/src/features/bookings/mapBookingListRow.ts @@ -42,6 +42,8 @@ export function toBookingListRow(booking: BookingDetail): BookingListRow { trainScheduleId: booking.trainScheduleId ?? null, isGovernment: booking.isGovernment ?? false, governmentInstitution: booking.governmentInstitution ?? null, + consolidationPartnerId: booking.consolidationPartnerId ?? null, + consolidationPartnerReference: booking.consolidationPartner?.reference ?? null, createdAt: booking.createdAt, }; } diff --git a/apps/edr-freight-web/backoffice/src/pages/bookings/BookingRequestDetailPage.tsx b/apps/edr-freight-web/backoffice/src/pages/bookings/BookingRequestDetailPage.tsx index a9b3849d7..b534b44cc 100644 --- a/apps/edr-freight-web/backoffice/src/pages/bookings/BookingRequestDetailPage.tsx +++ b/apps/edr-freight-web/backoffice/src/pages/bookings/BookingRequestDetailPage.tsx @@ -17,6 +17,7 @@ import { ApprovalStepsCard } from "@/components/bookings/ApprovalStepsCard"; import { BookingActionsToolbar } from "@/components/bookings/BookingActionsToolbar"; import { BookingPricingSummary } from "@/components/bookings/BookingPricingSummary"; import { BookingWorkflowStepper } from "@/components/bookings/BookingWorkflowStepper"; +import { ConsolidationWaitingBanner } from "@/components/bookings/detail/ConsolidationWaitingBanner"; import { detailStyles, BookingRequestHero, @@ -128,6 +129,10 @@ export default function BookingRequestDetailPage() { titleColor={statusMeta.color} /> + {booking.status === "PENDING_CONSOLIDATION" && ( + + )} + {/* LEFT — primary content */} diff --git a/apps/edr-freight-web/backoffice/src/pages/bookings/BookingRequestsPage.tsx b/apps/edr-freight-web/backoffice/src/pages/bookings/BookingRequestsPage.tsx index c5241610c..38d1acec6 100644 --- a/apps/edr-freight-web/backoffice/src/pages/bookings/BookingRequestsPage.tsx +++ b/apps/edr-freight-web/backoffice/src/pages/bookings/BookingRequestsPage.tsx @@ -227,7 +227,11 @@ export default function BookingRequestsPage() { header: () => Status, cell: ({ row }) => (
- +
), meta: { diff --git a/apps/edr-freight-web/backoffice/src/pages/dashboard/MyProfilePage.tsx b/apps/edr-freight-web/backoffice/src/pages/dashboard/MyProfilePage.tsx index 018e3328b..baf548d92 100644 --- a/apps/edr-freight-web/backoffice/src/pages/dashboard/MyProfilePage.tsx +++ b/apps/edr-freight-web/backoffice/src/pages/dashboard/MyProfilePage.tsx @@ -3,7 +3,9 @@ import { MySignatureCard } from "@/components/profile/MySignatureCard"; export default function MyProfilePage() { return (
- +
+ +
); } diff --git a/apps/edr-freight-web/backoffice/src/services/bookings.service.ts b/apps/edr-freight-web/backoffice/src/services/bookings.service.ts index 36fd8105a..06dbb638b 100644 --- a/apps/edr-freight-web/backoffice/src/services/bookings.service.ts +++ b/apps/edr-freight-web/backoffice/src/services/bookings.service.ts @@ -87,6 +87,21 @@ export interface ContractView { } | null; } +export interface ConsolidationWagonSlot { + containerTypeCode: string; + quantity: number; + containersPerWagon: number; + remainder: number; + slotsNeeded: number; +} + +export interface ConsolidationDetails { + statusMessage: string; + wagonSlots: ConsolidationWagonSlot[]; + partner: { id: string; reference: string } | null; + splitBilling: { bookingShare: number; partnerShare: number } | null; +} + export interface SignContractPayload { role: "CUSTOMER" | "STAFF"; signatureImageBase64: string; @@ -198,6 +213,13 @@ export const bookingsService = { return unwrap(response.data); }, + getConsolidationDetails: async ( + id: string, + ): Promise => { + const response = await client.get(B.CONSOLIDATION(id)); + return unwrap(response.data) as ConsolidationDetails; + }, + customerSign: (id: string, payload: SignContractPayload) => postBooking(B.CUSTOMER_SIGN(id), { ...payload, diff --git a/apps/edr-freight-web/backoffice/src/types/booking.ts b/apps/edr-freight-web/backoffice/src/types/booking.ts index 8edd0dd56..ec178daec 100644 --- a/apps/edr-freight-web/backoffice/src/types/booking.ts +++ b/apps/edr-freight-web/backoffice/src/types/booking.ts @@ -101,6 +101,8 @@ export interface BookingDetail { cargoTotalWeightVgm: number; isHazardous: boolean; allowConsolidation: boolean; + consolidationPartnerId?: string | null; + consolidationPartner?: BookingNamedRef & { reference?: string } | null; priorityScore: number; schedulingStatus?: string; holdExpiresAt?: string | null; @@ -157,5 +159,7 @@ export interface BookingListRow { trainScheduleId?: string | null; isGovernment?: boolean; governmentInstitution?: string | null; + consolidationPartnerId?: string | null; + consolidationPartnerReference?: string | null; createdAt: string; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66dbc154f..750c9ec01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,6 +122,9 @@ importers: rxjs: specifier: ^7.8.1 version: 7.8.2 + typeorm: + specifier: ^0.3.30 + version: 0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3)) devDependencies: '@edr/eslint-config': specifier: workspace:* @@ -177,9 +180,6 @@ importers: tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 - typeorm: - specifier: ^0.3.30 - version: 0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3)) typescript: specifier: ^5.5.4 version: 5.9.3 @@ -14463,7 +14463,7 @@ snapshots: tslib: 2.8.1 uid: 2.0.2 optionalDependencies: - '@nestjs/microservices': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(amqp-connection-manager@5.0.0(amqplib@0.10.9))(amqplib@0.10.9)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/microservices': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(amqp-connection-manager@5.0.0(amqplib@2.0.1))(amqplib@2.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/platform-express': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24) '@nestjs/event-emitter@2.1.1(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)': @@ -14494,19 +14494,6 @@ snapshots: class-transformer: 0.5.1 class-validator: 0.14.4 - '@nestjs/microservices@11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(amqp-connection-manager@5.0.0(amqplib@0.10.9))(amqplib@0.10.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)': - dependencies: - '@nestjs/common': 11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.24)(@nestjs/platform-express@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2) - iterare: 1.2.1 - reflect-metadata: 0.2.2 - rxjs: 7.8.2 - tslib: 2.8.1 - optionalDependencies: - amqp-connection-manager: 5.0.0(amqplib@0.10.9) - amqplib: 0.10.9 - optional: true - '@nestjs/microservices@11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(amqp-connection-manager@5.0.0(amqplib@2.0.1))(amqplib@2.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: '@nestjs/common': 11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -14591,7 +14578,7 @@ snapshots: '@nestjs/core': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.24)(@nestjs/platform-express@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2) tslib: 2.8.1 optionalDependencies: - '@nestjs/microservices': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(amqp-connection-manager@5.0.0(amqplib@0.10.9))(amqplib@0.10.9)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/microservices': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(amqp-connection-manager@5.0.0(amqplib@2.0.1))(amqplib@2.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/platform-express': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24) '@nestjs/throttler@6.5.0(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2)': @@ -18670,12 +18657,6 @@ snapshots: amqplib: 0.10.9 promise-breaker: 6.0.0 - amqp-connection-manager@5.0.0(amqplib@0.10.9): - dependencies: - amqplib: 0.10.9 - promise-breaker: 6.0.0 - optional: true - amqp-connection-manager@5.0.0(amqplib@2.0.1): dependencies: amqplib: 2.0.1