From 0c6dbada1565507036744ae5d37d36e67f851d58 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Sun, 17 May 2026 22:41:47 +0330 Subject: [PATCH] fix invoice number --- database/migrations/.snapshot-negareh.json | 6 +++--- database/migrations/Migration20260516121012.ts | 15 ++++++++++++++- database/migrations/Migration20260517190050.ts | 15 +++++++++++++++ src/modules/invoice/entities/invoice.entity.ts | 7 ++++--- src/modules/invoice/invoice.service.ts | 1 - .../request/repositories/request.repository.ts | 2 +- 6 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 database/migrations/Migration20260517190050.ts diff --git a/database/migrations/.snapshot-negareh.json b/database/migrations/.snapshot-negareh.json index 102c310..73e8df8 100644 --- a/database/migrations/.snapshot-negareh.json +++ b/database/migrations/.snapshot-negareh.json @@ -2347,9 +2347,9 @@ }, "invoice_number": { "name": "invoice_number", - "type": "int", - "unsigned": false, - "autoincrement": false, + "type": "serial", + "unsigned": true, + "autoincrement": true, "primary": false, "nullable": false, "mappedType": "integer" diff --git a/database/migrations/Migration20260516121012.ts b/database/migrations/Migration20260516121012.ts index 56dfa95..77716ff 100644 --- a/database/migrations/Migration20260516121012.ts +++ b/database/migrations/Migration20260516121012.ts @@ -3,7 +3,20 @@ import { Migration } from '@mikro-orm/migrations'; export class Migration20260516121012 extends Migration { override async up(): Promise { - this.addSql(`alter table "invoice_items" add column "sub_total" int generated always as (COALESCE(unit_price, 0) * quantity) STORED not null, add column "total" int generated always as ((COALESCE(unit_price, 0) * quantity) - COALESCE(discount, 0)) STORED not null;`); + this.addSql(` + DO $$ BEGIN + ALTER TABLE "invoice_items" + ADD COLUMN "sub_total" int GENERATED ALWAYS AS (COALESCE(unit_price, 0) * quantity) STORED NOT NULL, + ADD COLUMN "total" int GENERATED ALWAYS AS ((COALESCE(unit_price, 0) * quantity) - COALESCE(discount, 0)) STORED NOT NULL; + EXCEPTION + WHEN duplicate_column THEN NULL; + END $$; + `); + } + + override async down(): Promise { + this.addSql(`alter table "invoice_items" drop column if exists "sub_total";`); + this.addSql(`alter table "invoice_items" drop column if exists "total";`); } } diff --git a/database/migrations/Migration20260517190050.ts b/database/migrations/Migration20260517190050.ts new file mode 100644 index 0000000..fe445a6 --- /dev/null +++ b/database/migrations/Migration20260517190050.ts @@ -0,0 +1,15 @@ +import { Migration } from '@mikro-orm/migrations'; + +export class Migration20260517190050 extends Migration { + + override async up(): Promise { + this.addSql(`CREATE SEQUENCE IF NOT EXISTS invoice_number_seq;`); + this.addSql(`SELECT setval('invoice_number_seq', COALESCE((SELECT MAX(invoice_number) FROM invoices), 0) + 1, false);`); + this.addSql(`ALTER TABLE "invoices" ALTER COLUMN "invoice_number" SET DEFAULT nextval('invoice_number_seq');`); + } + + override async down(): Promise { + this.addSql(`ALTER TABLE "invoices" ALTER COLUMN "invoice_number" DROP DEFAULT;`); + } + +} diff --git a/src/modules/invoice/entities/invoice.entity.ts b/src/modules/invoice/entities/invoice.entity.ts index c3fda32..cda9cc4 100644 --- a/src/modules/invoice/entities/invoice.entity.ts +++ b/src/modules/invoice/entities/invoice.entity.ts @@ -24,7 +24,7 @@ import { IAttachment } from 'src/modules/order/interface/order.interface'; @Entity({ tableName: 'invoices' }) @Index({ properties: ['user'] }) export class Invoice extends BaseEntity { - [OptionalProps]?: 'createdAt' | 'deletedAt' + [OptionalProps]?: 'createdAt' | 'deletedAt' | 'invoiceNumber' @PrimaryKey({ type: 'string', columnType: 'char(26)' }) id: string = ulid() @@ -50,9 +50,10 @@ export class Invoice extends BaseEntity { @Property({ type: 'int', - unique: true + unique: true, + autoincrement: true }) - invoiceNumber!: number | Opt; + invoiceNumber: number & Opt; @Property({ type: 'int' }) diff --git a/src/modules/invoice/invoice.service.ts b/src/modules/invoice/invoice.service.ts index 7732b76..0b63031 100644 --- a/src/modules/invoice/invoice.service.ts +++ b/src/modules/invoice/invoice.service.ts @@ -64,7 +64,6 @@ export class InvoiceService { balance: 0, attachments: dto.attachments ?? [], paymentMethod: dto.paymentMethod, - invoiceNumber: 20, // TODO : invoice number description: dto.description, subTotal: 0, taxAmount: 0, diff --git a/src/modules/request/repositories/request.repository.ts b/src/modules/request/repositories/request.repository.ts index e51f3f8..cad6f32 100644 --- a/src/modules/request/repositories/request.repository.ts +++ b/src/modules/request/repositories/request.repository.ts @@ -80,7 +80,7 @@ export class RequestRepository extends EntityRepository { limit, offset, orderBy: { [orderBy]: order.toLowerCase() as 'asc' | 'desc' }, - populate: ['items', 'items.product', 'user'], + populate: ['items', 'items.product', 'user','invoices'], }); const totalPages = Math.ceil(total / limit);