fix issue

This commit is contained in:
Marshal
2026-08-20 18:10:29 +00:00
183 changed files with 14241 additions and 1265 deletions

View File

@@ -42,10 +42,16 @@ import type { Response } from "express";
import { BookingClearanceChargeService } from './booking-clearance-charge.service';
import { BookingPayablesService } from './booking-payables.service';
import { ClearanceEventService } from './clearance-event.service';
<<<<<<< HEAD
import {
BillClearanceChargeDto,
RejectClearanceChargeDto,
} from './dto/clearance-charge.dto';
=======
import { BillClearanceChargeDto } from './dto/clearance-charge.dto';
import { AdditionalChargeService } from './additional-charge.service';
import { CancelAdditionalChargeDto, CreateAdditionalChargeDto } from './dto/additional-charge.dto';
>>>>>>> 82c795999efce5e4422dd332551cecab2592764d
import { BookingContractService } from './booking-contract.service';
import { BookingPricingService } from './booking-pricing.service';
import { BookingTransitionService } from './booking-transition.service';
@@ -181,6 +187,7 @@ export class BookingsController {
private readonly clearanceChargeService: BookingClearanceChargeService,
private readonly bookingPayablesService: BookingPayablesService,
private readonly clearanceEventService: ClearanceEventService,
private readonly additionalChargeService: AdditionalChargeService,
) {}
@Post()
@@ -1278,6 +1285,64 @@ export class BookingsController {
);
}
// ── Additional charges (ad-hoc finance billing) ────────────────────────────
@Get(":id/additional-charges")
@MixedAudience(FREIGHT_PERMS.additionalCharges.view)
@ApiOperation({ summary: "Ad-hoc extra charges finance has raised against this booking" })
async getAdditionalCharges(
@Param("id", ParseUUIDPipe) id: string,
@CurrentUser() user: TCurrentUser,
) {
const isStaff = hasFreightPermission(user, FREIGHT_PERMS.additionalCharges.view);
if (!isStaff) {
const booking = await this.bookingsService.findById(id);
await this.bookingsService.assertCustomerCanAccessBooking(user?.id, booking);
}
const charges = await this.additionalChargeService.list(id);
// A charge finance hasn't sent yet isn't the customer's to see.
return isStaff ? charges : charges.filter((c) => c.status !== "DRAFT");
}
@Post(":id/additional-charges")
@BookingStaff(FREIGHT_PERMS.additionalCharges.create)
@UseInterceptors(FileInterceptor("file"))
@ApiConsumes("multipart/form-data")
@ApiOperation({
summary: "Finance raises a new additional charge — draft, or send to the customer immediately",
})
createAdditionalCharge(
@Param("id", ParseUUIDPipe) id: string,
@UploadedFile() file: Express.Multer.File | undefined,
@Body() dto: CreateAdditionalChargeDto,
@CurrentUser() user: TCurrentUser,
) {
return this.additionalChargeService.create(id, dto, resolveAuthUserId(user), file);
}
@Post(":id/additional-charges/:chargeId/send")
@BookingStaff(FREIGHT_PERMS.additionalCharges.send)
@ApiOperation({ summary: "Issue the draft charge's payable invoice and notify the customer" })
sendAdditionalCharge(
@Param("id", ParseUUIDPipe) id: string,
@Param("chargeId", ParseUUIDPipe) chargeId: string,
@CurrentUser() user: TCurrentUser,
) {
return this.additionalChargeService.send(id, chargeId, resolveAuthUserId(user));
}
@Post(":id/additional-charges/:chargeId/cancel")
@BookingStaff(FREIGHT_PERMS.additionalCharges.cancel)
@ApiOperation({ summary: "Withdraw a draft or unpaid additional charge" })
cancelAdditionalCharge(
@Param("id", ParseUUIDPipe) id: string,
@Param("chargeId", ParseUUIDPipe) chargeId: string,
@Body() dto: CancelAdditionalChargeDto,
@CurrentUser() user: TCurrentUser,
) {
return this.additionalChargeService.cancel(id, chargeId, resolveAuthUserId(user), dto.reason);
}
@Post(":id/clearance/output-documents")
@BookingStaff(FREIGHT_PERMS.bookings.uploadClearanceOutput)
@UseInterceptors(AnyFilesInterceptor())