diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 1f269d9..fa36549 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1582,6 +1582,8 @@ enum CreditNoteStatus { model CreditNote { id String @id @default(cuid()) + code String + creditNoteStatus CreditNoteStatus @default(Pending) value Float @default(0) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 38a6eef..5e2b5f7 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -261,29 +261,47 @@ export class CreditNoteController extends Controller { return a + c.productService.product.price; }, 0); - const record = await prisma.creditNote.create({ - include: { - requestWork: { - include: { - request: true, - }, - }, - quotation: true, - }, - data: { - value, - requestWork: { - connect: body.requestWorkId.map((v) => ({ - id: v, - })), - }, - quotationId: body.quotationId, - }, - }); - this.setStatus(HttpStatus.CREATED); - return record; + return await prisma.$transaction( + async (tx) => { + const currentYear = new Date().getFullYear(); + const currentMonth = new Date().getMonth() + 1; + + const last = await tx.runningNo.upsert({ + where: { + key: `CREDIT_NOTE_${currentYear.toString().padStart(2, "0")}${currentMonth.toString().padStart(2, "0")}`, + }, + create: { + key: `CREDIT_NOTE_${currentYear.toString().padStart(2, "0")}${currentMonth.toString().padStart(2, "0")}`, + value: 1, + }, + update: { value: { increment: 1 } }, + }); + + return await prisma.creditNote.create({ + include: { + requestWork: { + include: { + request: true, + }, + }, + quotation: true, + }, + data: { + code: `CN${currentYear.toString().padStart(2, "0")}${currentMonth.toString().padStart(2, "0")}${last.value.toString().padStart(6, "0")}`, + value, + requestWork: { + connect: body.requestWorkId.map((v) => ({ + id: v, + })), + }, + quotationId: body.quotationId, + }, + }); + }, + { isolationLevel: Prisma.TransactionIsolationLevel.Serializable }, + ); } @Put("{creditNoteId}")