mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-08 01:55:41 +00:00
New freight.additional_charge table, independent of BookingClearanceCharge (unbounded per booking, free-text reason). Draft -> send issues an invoice and notifies the customer in-app/SMS/email; settles via the standard .invoice.paid event. Adds the Additional charges row-menu entry next to Cancel booking, permission-gated. Not included: the Additional Payments tab UI, add-charge modal, portal pay flow.
44 lines
1.7 KiB
TypeScript
44 lines
1.7 KiB
TypeScript
import { MigrationInterface, QueryRunner } from 'typeorm';
|
|
|
|
/** Ad-hoc customer charges finance raises against a booking — Additional Payments tab. */
|
|
export class AdditionalCharge3620000000000 implements MigrationInterface {
|
|
name = 'AdditionalCharge3620000000000';
|
|
|
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
await queryRunner.query(`
|
|
CREATE TABLE IF NOT EXISTS "freight"."additional_charge" (
|
|
"id" uuid NOT NULL DEFAULT uuid_generate_v4(),
|
|
"created_at" timestamptz NOT NULL DEFAULT now(),
|
|
"updated_at" timestamptz NOT NULL DEFAULT now(),
|
|
"deleted_at" timestamptz,
|
|
"booking_id" uuid NOT NULL,
|
|
"reason" text NOT NULL,
|
|
"status" character varying(20) NOT NULL DEFAULT 'DRAFT',
|
|
"amount" numeric(14,2) NOT NULL,
|
|
"currency" character varying(8) NOT NULL,
|
|
"file_record_id" uuid,
|
|
"invoice_id" uuid,
|
|
"payment_reference" character varying(64),
|
|
"created_by_staff_id" uuid,
|
|
"sent_by_staff_id" uuid,
|
|
"sent_at" timestamptz,
|
|
"paid_at" timestamptz,
|
|
"cancelled_by_staff_id" uuid,
|
|
"cancelled_at" timestamptz,
|
|
"cancel_reason" text,
|
|
CONSTRAINT "pk_additional_charge" PRIMARY KEY ("id"),
|
|
CONSTRAINT "fk_additional_charge_booking" FOREIGN KEY ("booking_id")
|
|
REFERENCES "freight"."bookings"("id") ON DELETE CASCADE
|
|
)
|
|
`);
|
|
await queryRunner.query(`
|
|
CREATE INDEX IF NOT EXISTS "idx_additional_charge_booking"
|
|
ON "freight"."additional_charge" ("booking_id")
|
|
`);
|
|
}
|
|
|
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
await queryRunner.query(`DROP TABLE IF EXISTS "freight"."additional_charge"`);
|
|
}
|
|
}
|