From a4ba0e032f8748b0ba8ec891394637e31d626732 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Mon, 6 Jan 2025 09:32:42 +0700 Subject: [PATCH 01/53] fix: price not accurate after recalc vat --- src/controllers/05-quotation-controller.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/controllers/05-quotation-controller.ts b/src/controllers/05-quotation-controller.ts index bdaba92..65c5da1 100644 --- a/src/controllers/05-quotation-controller.ts +++ b/src/controllers/05-quotation-controller.ts @@ -419,11 +419,11 @@ export class QuotationController extends Controller { const list = body.productServiceList.map((v, i) => { const p = product.find((p) => p.id === v.productId)!; const price = body.agentPrice ? p.agentPrice : p.price; - const pricePerUnit = p.vatIncluded ? precisionRound(price / (1 + VAT_DEFAULT)) : price; + const pricePerUnit = p.vatIncluded ? price / (1 + VAT_DEFAULT) : price; const vat = p.calcVat - ? precisionRound( - (pricePerUnit * (v.discount ? v.amount : 1) - (v.discount || 0)) * VAT_DEFAULT, - ) * (!v.discount ? v.amount : 1) + ? (pricePerUnit * (v.discount ? v.amount : 1) - (v.discount || 0)) * + VAT_DEFAULT * + (!v.discount ? v.amount : 1) : 0; return { @@ -684,11 +684,11 @@ export class QuotationController extends Controller { const list = body.productServiceList?.map((v, i) => { const p = product.find((p) => p.id === v.productId)!; const price = record.agentPrice ? p.agentPrice : p.price; - const pricePerUnit = p.vatIncluded ? precisionRound(price / (1 + VAT_DEFAULT)) : price; + const pricePerUnit = p.vatIncluded ? price / (1 + VAT_DEFAULT) : price; const vat = p.calcVat - ? precisionRound( - (pricePerUnit * (v.discount ? v.amount : 1) - (v.discount || 0)) * VAT_DEFAULT, - ) * (!v.discount ? v.amount : 1) + ? (pricePerUnit * (v.discount ? v.amount : 1) - (v.discount || 0)) * + VAT_DEFAULT * + (!v.discount ? v.amount : 1) : 0; return { order: i + 1, From c2a592bf197d31544323011d561f79f47e05531e Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Mon, 6 Jan 2025 09:58:26 +0700 Subject: [PATCH 02/53] fix: full name not change when update --- src/controllers/02-user-controller.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/controllers/02-user-controller.ts b/src/controllers/02-user-controller.ts index 7c34b48..f5ddbde 100644 --- a/src/controllers/02-user-controller.ts +++ b/src/controllers/02-user-controller.ts @@ -642,11 +642,13 @@ export class UserController extends Controller { } } - if (body.username) { + if (body.username || body.email || body.firstName || body.lastName) { await editUser(userId, { + firstName: body.firstName, + lastName: body.lastName, username: body.username, email: body.email, - enabled: body.status !== "INACTIVE", + enabled: body.status ? body.status !== "INACTIVE" : undefined, }); } else if (body.status) { await editUser(userId, { enabled: body.status !== "INACTIVE" }); From 8533c49a274f66742be6fe184dbab19a6a55fa2e Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Mon, 6 Jan 2025 10:54:48 +0700 Subject: [PATCH 03/53] feat: also response quotation relation in credit note --- src/controllers/08-credit-note-controller.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 31ec519..e37365e 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -162,6 +162,7 @@ export class CreditNoteController extends Controller { prisma.creditNote.findMany({ where, include: { + quotation: true, requestWork: { include: { request: true }, }, From 4af2a2c1749f93b71fe51f61e6f784c51049b4d8 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:53:16 +0700 Subject: [PATCH 04/53] refactor: add credit note status to table --- prisma/schema.prisma | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9341741..d9e16d1 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1574,9 +1574,16 @@ model UserTask { userId String } +enum CreditNoteStatus { + Pending + Success +} + model CreditNote { id String @id @default(cuid()) + creditNoteStatus CreditNoteStatus @default(Pending) + quotation Quotation @relation(fields: [quotationId], references: [id], onDelete: Cascade) quotationId String From 027bb49c2a64dcb5207ca07e99b84139ab389a86 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:55:41 +0700 Subject: [PATCH 05/53] chore: migration --- .../20250106045511_add_credit_note_status/migration.sql | 5 +++++ .../migration.sql | 9 +++++++++ 2 files changed, 14 insertions(+) create mode 100644 prisma/migrations/20250106045511_add_credit_note_status/migration.sql create mode 100644 prisma/migrations/20250106045533_default_credit_note_status/migration.sql diff --git a/prisma/migrations/20250106045511_add_credit_note_status/migration.sql b/prisma/migrations/20250106045511_add_credit_note_status/migration.sql new file mode 100644 index 0000000..8929904 --- /dev/null +++ b/prisma/migrations/20250106045511_add_credit_note_status/migration.sql @@ -0,0 +1,5 @@ +-- CreateEnum +CREATE TYPE "CreditNoteStatus" AS ENUM ('Pending', 'Success'); + +-- AlterTable +ALTER TABLE "CreditNote" ADD COLUMN "creditNoteStatus" "CreditNoteStatus"; diff --git a/prisma/migrations/20250106045533_default_credit_note_status/migration.sql b/prisma/migrations/20250106045533_default_credit_note_status/migration.sql new file mode 100644 index 0000000..6a8551a --- /dev/null +++ b/prisma/migrations/20250106045533_default_credit_note_status/migration.sql @@ -0,0 +1,9 @@ +/* + Warnings: + + - Made the column `creditNoteStatus` on table `CreditNote` required. This step will fail if there are existing NULL values in that column. + +*/ +-- AlterTable +ALTER TABLE "CreditNote" ALTER COLUMN "creditNoteStatus" SET NOT NULL, +ALTER COLUMN "creditNoteStatus" SET DEFAULT 'Pending'; From 53453e37db4cdd898c161910fae977b6759df85e Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Mon, 6 Jan 2025 14:59:59 +0700 Subject: [PATCH 06/53] refactor: store credit note value in database --- prisma/schema.prisma | 2 + src/controllers/08-credit-note-controller.ts | 112 ++++++++++++++++++- 2 files changed, 110 insertions(+), 4 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index d9e16d1..1f269d9 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1584,6 +1584,8 @@ model CreditNote { creditNoteStatus CreditNoteStatus @default(Pending) + value Float @default(0) + quotation Quotation @relation(fields: [quotationId], references: [id], onDelete: Cascade) quotationId String diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index e37365e..a6c977b 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -25,7 +25,7 @@ import { import HttpError from "../interfaces/http-error"; import HttpStatus from "../interfaces/http-status"; import { notFoundError } from "../utils/error"; -import { Prisma } from "@prisma/client"; +import { CreditNoteStatus, Prisma } from "@prisma/client"; import { queryOrNot } from "../utils/relation"; import { RequestWorkStatus } from "../generated/kysely/types"; @@ -217,6 +217,15 @@ export class CreditNoteController extends Controller { id: { in: body.requestWorkId }, }, include: { + stepStatus: true, + productService: { + include: { + product: true, + work: { + include: { productOnWork: true }, + }, + }, + }, request: { include: { quotation: { @@ -237,6 +246,21 @@ export class CreditNoteController extends Controller { requestWork.map((item) => permissionCheck(req.user, item.request.quotation.registeredBranch)), ); + const value = requestWork.reduce((a, c) => { + const serviceChargeStepCount = c.productService.work?.productOnWork.find( + (v) => v.productId === c.productService.productId, + )?.stepCount; + + const successCount = c.stepStatus.filter((v) => v.workStatus === "Completed").length; + + if (serviceChargeStepCount && successCount) { + return ( + a + c.productService.product.price - c.productService.product.serviceCharge * successCount + ); + } + return a + c.productService.product.price; + }, 0); + const record = await prisma.creditNote.create({ include: { requestWork: { @@ -247,6 +271,7 @@ export class CreditNoteController extends Controller { quotation: true, }, data: { + value, requestWork: { connect: body.requestWorkId.map((v) => ({ id: v, @@ -297,16 +322,49 @@ export class CreditNoteController extends Controller { }, id: { in: body.requestWorkId }, }, + include: { + stepStatus: true, + productService: { + include: { + product: true, + work: { + include: { productOnWork: true }, + }, + }, + }, + request: { + include: { + quotation: { + include: { + registeredBranch: { include: branchRelationPermInclude(req.user) }, + }, + }, + }, + }, + }, }); if (requestWork.length !== body.requestWorkId.length) { throw new HttpError(HttpStatus.BAD_REQUEST, "Not Match", "reqNotMet"); } + const value = requestWork.reduce((a, c) => { + const serviceChargeStepCount = c.productService.work?.productOnWork.find( + (v) => v.productId === c.productService.productId, + )?.stepCount; + + const successCount = c.stepStatus.filter((v) => v.workStatus === "Completed").length; + + if (serviceChargeStepCount && successCount) { + return ( + a + c.productService.product.price - c.productService.product.serviceCharge * successCount + ); + } + return a + c.productService.product.price; + }, 0); + const record = await prisma.creditNote.update({ - where: { - id: creditNoteId, - }, + where: { id: creditNoteId }, include: { requestWork: { include: { @@ -316,6 +374,7 @@ export class CreditNoteController extends Controller { quotation: true, }, data: { + value, requestWork: { disconnect: creditNoteData.requestWork .map((item) => ({ @@ -354,3 +413,48 @@ export class CreditNoteController extends Controller { return await prisma.creditNote.delete({ where: { id: creditNoteId } }); } } + +@Route("api/v1/credit-note/{creditNoteId}") +@Tags("Credit Note") +export class CreditNoteActionController extends Controller { + async #checkPermission(user: RequestWithUser["user"], id: string) { + const creditNoteData = await prisma.creditNote.findFirst({ + where: { id }, + include: { + requestWork: true, + quotation: { + include: { + registeredBranch: { include: branchRelationPermInclude(user) }, + }, + }, + }, + }); + if (!creditNoteData) throw notFoundError("Credit Note"); + await permissionCheck(user, creditNoteData.quotation.registeredBranch); + return creditNoteData; + } + + @Post("status") + @Security("keycloak", MANAGE_ROLES) + async updateStatus( + @Request() req: RequestWithUser, + @Path() creditNoteId: string, + @Body() body: CreditNoteStatus, + ) { + await this.#checkPermission(req.user, creditNoteId); + return await prisma.creditNote.update({ + where: { id: creditNoteId }, + include: { + requestWork: { + include: { + request: true, + }, + }, + quotation: true, + }, + data: { + creditNoteStatus: body, + }, + }); + } +} From f4ded1692dfc0cb77c8b66fe45afa0c602703ffd Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Mon, 6 Jan 2025 15:00:39 +0700 Subject: [PATCH 07/53] chore: migration --- .../20250106080031_add_value_to_credit_note/migration.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 prisma/migrations/20250106080031_add_value_to_credit_note/migration.sql diff --git a/prisma/migrations/20250106080031_add_value_to_credit_note/migration.sql b/prisma/migrations/20250106080031_add_value_to_credit_note/migration.sql new file mode 100644 index 0000000..6e94b07 --- /dev/null +++ b/prisma/migrations/20250106080031_add_value_to_credit_note/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "CreditNote" ADD COLUMN "value" DOUBLE PRECISION NOT NULL DEFAULT 0; From 26c9705b1884e2f4b9f425121a3923ed6651c5d8 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Mon, 6 Jan 2025 15:18:10 +0700 Subject: [PATCH 08/53] feat: prevent request work that already issued credit note --- src/controllers/08-credit-note-controller.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index a6c977b..4374f96 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -204,6 +204,7 @@ export class CreditNoteController extends Controller { async createCreditNote(@Request() req: RequestWithUser, @Body() body: CreditNoteCreate) { const requestWork = await prisma.requestWork.findMany({ where: { + creditNote: null, request: { quotation: { id: body.quotationId, @@ -310,6 +311,7 @@ export class CreditNoteController extends Controller { const requestWork = await prisma.requestWork.findMany({ where: { + OR: [{ creditNote: null }, { creditNoteId }], request: { quotation: { id: body.quotationId, From 16ceabe3dfcfacf03c934f48c216f4abfd4e0082 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 7 Jan 2025 09:29:02 +0700 Subject: [PATCH 09/53] fix: make param optional --- src/controllers/08-credit-note-controller.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 4374f96..38a6eef 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -13,7 +13,6 @@ import { Tags, } from "tsoa"; -// import { Prisma } from "@prisma/client"; import prisma from "../db"; import { RequestWithUser } from "../interfaces/user"; @@ -64,7 +63,7 @@ type CreditNoteUpdate = { export class CreditNoteController extends Controller { @Get("stats") @Security("keycloak") - async getCreditNoteStats(@Request() req: RequestWithUser, @Query() quotationId: string) { + async getCreditNoteStats(@Request() req: RequestWithUser, @Query() quotationId?: string) { const where = { requestWork: { some: { From b9b6745bb604c8f52b1baae79cf5da24187cc0b8 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 7 Jan 2025 09:39:21 +0700 Subject: [PATCH 10/53] feat: add code gen to credit note --- prisma/schema.prisma | 2 + src/controllers/08-credit-note-controller.ts | 60 +++++++++++++------- 2 files changed, 41 insertions(+), 21 deletions(-) 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}") From 2654633f9c6b8bb0d701ce34503e39286c8f2bf3 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 7 Jan 2025 09:39:47 +0700 Subject: [PATCH 11/53] chore: migration --- .../20250107023936_add_code_field/migration.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 prisma/migrations/20250107023936_add_code_field/migration.sql diff --git a/prisma/migrations/20250107023936_add_code_field/migration.sql b/prisma/migrations/20250107023936_add_code_field/migration.sql new file mode 100644 index 0000000..e64b47f --- /dev/null +++ b/prisma/migrations/20250107023936_add_code_field/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - Added the required column `code` to the `CreditNote` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "CreditNote" ADD COLUMN "code" TEXT NOT NULL; From 8c65ad4eeafcb33ea93e0cb898174282a2861a7b Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 7 Jan 2025 15:56:18 +0700 Subject: [PATCH 12/53] feat: add metadata to credit note --- prisma/schema.prisma | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index fa36549..382fcc5 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -482,6 +482,7 @@ model User { notificationReceive Notification[] @relation("NotificationReceiver") notificationRead Notification[] taskOrderCreated TaskOrder[] @relation("TaskOrderCreatedByUser") + creditNoteCreated CreditNote[] @relation("CreditNoteCreatedByUser") requestWorkStepStatus RequestWorkStepStatus[] userTask UserTask[] @@ -1593,6 +1594,10 @@ model CreditNote { // NOTE: only status cancel requestWork RequestWork[] + + createdAt DateTime @default(now()) + createdBy User? @relation(name: "CreditNoteCreatedByUser", fields: [createdByUserId], references: [id]) + createdByUserId String? } model DebitNote { From c9a192219532a202b1a5c521bac2a21850bd0311 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 7 Jan 2025 15:56:28 +0700 Subject: [PATCH 13/53] feat: also include quotation in credit note --- src/controllers/08-credit-note-controller.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 5e2b5f7..420a9ce 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -191,6 +191,7 @@ export class CreditNoteController extends Controller { return prisma.creditNote.findFirst({ where, include: { + quotation: true, requestWork: { include: { request: true }, }, From 5bb0adb51b488f17c8706318dacd32c22eb791e5 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 7 Jan 2025 15:56:38 +0700 Subject: [PATCH 14/53] chore: migration --- .../migration.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 prisma/migrations/20250107085603_add_metadata_to_credit_note/migration.sql diff --git a/prisma/migrations/20250107085603_add_metadata_to_credit_note/migration.sql b/prisma/migrations/20250107085603_add_metadata_to_credit_note/migration.sql new file mode 100644 index 0000000..a9936d3 --- /dev/null +++ b/prisma/migrations/20250107085603_add_metadata_to_credit_note/migration.sql @@ -0,0 +1,6 @@ +-- AlterTable +ALTER TABLE "CreditNote" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, +ADD COLUMN "createdByUserId" TEXT; + +-- AddForeignKey +ALTER TABLE "CreditNote" ADD CONSTRAINT "CreditNote_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; From 09313cf2ba466fa6c08171cb5faf0ec0ad97292b Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:46:06 +0700 Subject: [PATCH 15/53] feat: add param for include relation --- src/controllers/05-quotation-controller.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/controllers/05-quotation-controller.ts b/src/controllers/05-quotation-controller.ts index 65c5da1..b432b2c 100644 --- a/src/controllers/05-quotation-controller.ts +++ b/src/controllers/05-quotation-controller.ts @@ -190,6 +190,7 @@ export class QuotationController extends Controller { @Query() payCondition?: PayCondition, @Query() status?: QuotationStatus, @Query() urgentFirst?: boolean, + @Query() includeRegisteredBranch?: boolean, @Query() code?: string, @Query() query = "", ) { @@ -223,6 +224,7 @@ export class QuotationController extends Controller { _count: { select: { worker: true }, }, + registeredBranch: includeRegisteredBranch, customerBranch: { include: { customer: { From 83bf72e0a3cd06336a556f41d59e571b258ecb7d Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:04:44 +0700 Subject: [PATCH 16/53] feat: include more relation --- src/controllers/08-credit-note-controller.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 420a9ce..ddda39b 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -161,7 +161,11 @@ export class CreditNoteController extends Controller { prisma.creditNote.findMany({ where, include: { - quotation: true, + quotation: { + include: { + registeredBranch: true, + }, + }, requestWork: { include: { request: true }, }, From 13ad7a4bf192e5f1a0f8dcc1161d663563270a64 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:07:55 +0700 Subject: [PATCH 17/53] feat: also include customer --- src/controllers/08-credit-note-controller.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index ddda39b..971673e 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -164,6 +164,11 @@ export class CreditNoteController extends Controller { quotation: { include: { registeredBranch: true, + customerBranch: { + include: { + customer: true, + }, + }, }, }, requestWork: { From 3d361fd79fd4645d9f9c2d10a149c0ca76bc8629 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 09:37:39 +0700 Subject: [PATCH 18/53] feat: include registered branch relation --- src/controllers/07-task-controller.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index dee4b7a..d50e089 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -125,6 +125,7 @@ export class TaskController extends Controller { userTask: true, taskList: true, institution: true, + registeredBranch: true, createdBy: true, }, }), @@ -735,6 +736,7 @@ export class UserTaskController extends Controller { userTask: { where: { userId: req.user.sub }, }, + registeredBranch: true, institution: true, createdBy: true, }, From 641a3562b45697e3db5bb92572b6c9f2a640fd4d Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 11:24:00 +0700 Subject: [PATCH 19/53] feat: add restart task status --- prisma/schema.prisma | 1 + 1 file changed, 1 insertion(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 382fcc5..4b687e0 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1498,6 +1498,7 @@ enum TaskStatus { Success Failed + Restart Redo Validate From 13d20f5eaa69af6d45e3fb20c55c0234bc7a50a2 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 11:24:25 +0700 Subject: [PATCH 20/53] chore: migration --- .../migrations/20250108042351_add_restart_status/migration.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 prisma/migrations/20250108042351_add_restart_status/migration.sql diff --git a/prisma/migrations/20250108042351_add_restart_status/migration.sql b/prisma/migrations/20250108042351_add_restart_status/migration.sql new file mode 100644 index 0000000..e47bb4e --- /dev/null +++ b/prisma/migrations/20250108042351_add_restart_status/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "TaskStatus" ADD VALUE 'Restart'; From ed84137aaeb3d8a5ecdc0ba22a90f5aa1183622a Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 11:26:15 +0700 Subject: [PATCH 21/53] feat: add restart user task status --- prisma/schema.prisma | 1 + 1 file changed, 1 insertion(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4b687e0..a3a078c 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1561,6 +1561,7 @@ model TaskOrder { enum UserTaskStatus { Pending // Should not be use but define here for type + Restart Accept Submit } From 2536394fb2d134fd43253fcc0cb6a0c9ce7c27a0 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 11:26:18 +0700 Subject: [PATCH 22/53] chore: migration --- .../migration.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 prisma/migrations/20250108042549_add_restart_for_user_task_status/migration.sql diff --git a/prisma/migrations/20250108042549_add_restart_for_user_task_status/migration.sql b/prisma/migrations/20250108042549_add_restart_for_user_task_status/migration.sql new file mode 100644 index 0000000..f19660e --- /dev/null +++ b/prisma/migrations/20250108042549_add_restart_for_user_task_status/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "UserTaskStatus" ADD VALUE 'Restart'; From 27d80de0ec720c75f66e2f32bf91f499ab115cc2 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 13:09:59 +0700 Subject: [PATCH 23/53] feat: add restart task within same order --- src/controllers/07-task-controller.ts | 39 +++++++++++++++++++-------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index d50e089..28b65cf 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -452,6 +452,7 @@ export class TaskActionController extends Controller { return await prisma.$transaction(async (tx) => { const promises = body.map(async (v) => { const record = await tx.task.findFirst({ + include: { requestWorkStep: true }, where: { step: v.step, requestWorkId: v.requestWorkId, @@ -459,6 +460,16 @@ export class TaskActionController extends Controller { }, }); if (!record) throw notFoundError("Task List"); + + if (v.taskStatus === TaskStatus.Restart && record.requestWorkStep.responsibleUserId) { + await tx.userTask.updateMany({ + where: { + taskOrderId: record.taskOrderId, + userId: record.requestWorkStep.responsibleUserId, + }, + data: { userTaskStatus: UserTaskStatus.Restart }, + }); + } return await tx.task.update({ where: { id: record.id }, data: { @@ -520,13 +531,7 @@ export class TaskActionController extends Controller { @Post("complete") @Security("keycloak") - async completeTaskOrder( - @Request() req: RequestWithUser, - @Path() taskOrderId: string, - @Query() submitUserId?: string, - ) { - submitUserId = submitUserId ?? req.user.sub; - + async completeTaskOrder(@Request() req: RequestWithUser, @Path() taskOrderId: string) { const record = await prisma.taskOrder.findFirst({ where: { id: taskOrderId } }); if (!record) throw notFoundError("Task Order"); @@ -540,16 +545,25 @@ export class TaskActionController extends Controller { tx.requestWorkStepStatus.updateMany({ where: { task: { - some: { taskOrderId, taskStatus: TaskStatus.Redo }, + some: { + taskOrderId, + taskStatus: { notIn: [TaskStatus.Canceled, TaskStatus.Success] }, + }, }, }, data: { workStatus: RequestWorkStatus.Ready }, }), + tx.task.updateMany({ + where: { + taskOrderId: taskOrderId, + taskStatus: TaskStatus.Restart, + }, + data: { taskStatus: TaskStatus.Redo }, + }), tx.task.updateMany({ where: { taskOrderId: taskOrderId, taskStatus: TaskStatus.Validate, - requestWorkStep: { responsibleUserId: submitUserId }, }, data: { taskStatus: TaskStatus.Complete }, }), @@ -712,13 +726,16 @@ export class UserTaskController extends Controller { userTask: userTaskStatus ? { some: - userTaskStatus !== UserTaskStatus.Pending + userTaskStatus !== UserTaskStatus.Pending && userTaskStatus !== UserTaskStatus.Restart ? { userTaskStatus, userId: req.user.sub, } : undefined, - none: userTaskStatus === UserTaskStatus.Pending ? { userId: req.user.sub } : undefined, + none: + userTaskStatus === UserTaskStatus.Pending || userTaskStatus === UserTaskStatus.Restart + ? { userId: req.user.sub } + : undefined, } : undefined, OR: queryOrNot(query, [ From 7c582ffcf84232fdb8d5bb2e1d4f4b0b3a3f2f8e Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 13:42:24 +0700 Subject: [PATCH 24/53] fix: wrong query --- src/controllers/07-task-controller.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index 28b65cf..ff8e981 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -725,16 +725,16 @@ export class UserTaskController extends Controller { }, userTask: userTaskStatus ? { - some: - userTaskStatus !== UserTaskStatus.Pending && userTaskStatus !== UserTaskStatus.Restart - ? { - userTaskStatus, - userId: req.user.sub, - } - : undefined, + some: { + userTaskStatus: + userTaskStatus === UserTaskStatus.Pending + ? { in: [UserTaskStatus.Pending, UserTaskStatus.Restart] } + : userTaskStatus, + userId: req.user.sub, + }, none: - userTaskStatus === UserTaskStatus.Pending || userTaskStatus === UserTaskStatus.Restart - ? { userId: req.user.sub } + userTaskStatus === UserTaskStatus.Pending + ? { userId: req.user.sub, userTaskStatus: { not: UserTaskStatus.Restart } } : undefined, } : undefined, From 697111d5f65d594b82a3bc04cbb6c5b00ede8a6c Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 13:46:00 +0700 Subject: [PATCH 25/53] fix: also change other status to redo if force complete --- src/controllers/07-task-controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index ff8e981..3c855c2 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -556,7 +556,7 @@ export class TaskActionController extends Controller { tx.task.updateMany({ where: { taskOrderId: taskOrderId, - taskStatus: TaskStatus.Restart, + taskStatus: { notIn: [TaskStatus.Canceled, TaskStatus.Success] }, }, data: { taskStatus: TaskStatus.Redo }, }), From a1b5fd73bcbfaf44a1242a055b104f0e022d2e88 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 14:23:21 +0700 Subject: [PATCH 26/53] fix: pending task not show for user --- src/controllers/07-task-controller.ts | 42 +++++++++++++++++++-------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index 3c855c2..19a81e0 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -723,20 +723,38 @@ export class UserTaskController extends Controller { requestWorkStep: { responsibleUserId: req.user.sub }, }, }, - userTask: userTaskStatus - ? { - some: { - userTaskStatus: + AND: userTaskStatus + ? [ + { + OR: userTaskStatus === UserTaskStatus.Pending - ? { in: [UserTaskStatus.Pending, UserTaskStatus.Restart] } - : userTaskStatus, - userId: req.user.sub, + ? [ + { + userTask: { + some: { + userTaskStatus: { + in: [UserTaskStatus.Pending, UserTaskStatus.Restart], + }, + userId: req.user.sub, + }, + }, + }, + { + userTask: { none: { userId: req.user.sub } }, + }, + ] + : undefined, + userTask: + userTaskStatus !== UserTaskStatus.Pending + ? { + some: { + userTaskStatus, + userId: req.user.sub, + }, + } + : undefined, }, - none: - userTaskStatus === UserTaskStatus.Pending - ? { userId: req.user.sub, userTaskStatus: { not: UserTaskStatus.Restart } } - : undefined, - } + ] : undefined, OR: queryOrNot(query, [ { code: { contains: query, mode: "insensitive" } }, From eb907eff1035c63ba43d9e54cd60fa9629d5fe1c Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 14:41:26 +0700 Subject: [PATCH 27/53] feat: update accept restart status --- src/controllers/07-task-controller.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index 19a81e0..8b9e5b6 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -820,6 +820,7 @@ export class UserTaskController extends Controller { data: { taskOrderStatus: TaskOrderStatus.InProgress, userTask: { + deleteMany: { userId: req.user.sub }, create: { userId: req.user.sub, userTaskStatus: UserTaskStatus.Accept, @@ -830,7 +831,7 @@ export class UserTaskController extends Controller { tx.task.updateMany({ where: { taskOrderId: taskOrderId, - taskStatus: TaskStatus.Pending, + taskStatus: { in: [TaskStatus.Pending, TaskStatus.Restart] }, requestWorkStep: { responsibleUserId: req.user.sub }, }, data: { @@ -849,13 +850,6 @@ export class UserTaskController extends Controller { }, data: { requestDataStatus: RequestDataStatus.InProgress }, }), - tx.userTask.create({ - data: { - userId: req.user.sub, - taskOrderId: taskOrderId, - userTaskStatus: UserTaskStatus.Accept, - }, - }), ]); await Promise.all(promises); From 7e3ec0db4203c2a9422e6cfc4676fc06ad6b751c Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 14:50:18 +0700 Subject: [PATCH 28/53] feat: add accepted and submitted date to user task --- prisma/schema.prisma | 3 +++ 1 file changed, 3 insertions(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a3a078c..344a681 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1575,6 +1575,9 @@ model UserTask { taskOrderId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) userId String + + acceptedAt DateTime? + submittedAt DateTime? } enum CreditNoteStatus { From d50bcd3ed781f955cb1c1577a6b8aff0ec1c3d27 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 14:50:58 +0700 Subject: [PATCH 29/53] chore: migration --- .../20250108075050_add_date_to_user_task/migration.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 prisma/migrations/20250108075050_add_date_to_user_task/migration.sql diff --git a/prisma/migrations/20250108075050_add_date_to_user_task/migration.sql b/prisma/migrations/20250108075050_add_date_to_user_task/migration.sql new file mode 100644 index 0000000..e7d0e94 --- /dev/null +++ b/prisma/migrations/20250108075050_add_date_to_user_task/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "UserTask" ADD COLUMN "acceptedAt" TIMESTAMP(3), +ADD COLUMN "submittedAt" TIMESTAMP(3); From f4ae8073aa12edcdd86cdc77db394a987cad397d Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 15:04:22 +0700 Subject: [PATCH 30/53] feat: add accepted and submitted data in table --- src/controllers/07-task-controller.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index 8b9e5b6..2f15c1d 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -524,7 +524,7 @@ export class TaskActionController extends Controller { taskOrderId: taskOrderId, userId: submitUserId, }, - data: { userTaskStatus: UserTaskStatus.Submit }, + data: { userTaskStatus: UserTaskStatus.Submit, submittedAt: new Date() }, }), ]); } @@ -824,6 +824,7 @@ export class UserTaskController extends Controller { create: { userId: req.user.sub, userTaskStatus: UserTaskStatus.Accept, + acceptedAt: new Date(), }, }, }, From 659fb325b1300c1a982a811f275675c43cf286bb Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Wed, 8 Jan 2025 16:13:38 +0700 Subject: [PATCH 31/53] feat: add canceled work count to quotation --- src/controllers/05-quotation-controller.ts | 54 ++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/controllers/05-quotation-controller.ts b/src/controllers/05-quotation-controller.ts index b432b2c..4df4293 100644 --- a/src/controllers/05-quotation-controller.ts +++ b/src/controllers/05-quotation-controller.ts @@ -29,6 +29,7 @@ import { queryOrNot } from "../utils/relation"; import { deleteFile, fileLocation, getFile, getPresigned, listFile, setFile } from "../utils/minio"; import HttpError from "../interfaces/http-error"; import HttpStatus from "../interfaces/http-status"; +import { RequestWorkStatus } from "../generated/kysely/types"; type QuotationCreate = { registeredBranchId: string; @@ -191,6 +192,7 @@ export class QuotationController extends Controller { @Query() status?: QuotationStatus, @Query() urgentFirst?: boolean, @Query() includeRegisteredBranch?: boolean, + @Query() hasCancel?: boolean, @Query() code?: string, @Query() query = "", ) { @@ -215,6 +217,18 @@ export class QuotationController extends Controller { payCondition, registeredBranch: isSystem(req.user) ? undefined : { OR: permissionCond(req.user) }, quotationStatus: status, + requestData: hasCancel + ? { + some: { + requestWork: { + some: { + creditNoteId: null, + stepStatus: { some: { workStatus: RequestWorkStatus.Canceled } }, + }, + }, + }, + } + : undefined, } satisfies Prisma.QuotationWhereInput; const [result, total] = await prisma.$transaction([ @@ -248,6 +262,46 @@ export class QuotationController extends Controller { prisma.quotation.count({ where }), ]); + if (hasCancel) { + const canceled = await prisma.requestData.findMany({ + include: { + _count: { + select: { + requestWork: { + where: { + creditNoteId: null, + stepStatus: { some: { workStatus: RequestWorkStatus.Canceled } }, + }, + }, + }, + }, + }, + where: { + requestWork: { + some: { + creditNoteId: null, + stepStatus: { some: { workStatus: RequestWorkStatus.Canceled } }, + }, + }, + quotationId: { in: result.map((v) => v.id) }, + }, + }); + + return { + result: result.map((v) => { + const canceledCount = canceled + .filter((item) => item.quotationId === v.id) + .reduce((a, c) => a + c._count.requestWork, 0); + return Object.assign(v, { + _count: { ...v._count, canceledWork: canceledCount }, + }); + }), + page, + pageSize, + total, + }; + } + return { result: result, page, pageSize, total }; } From d37f527f7d18ad4ee17ba0c41f90e755df9bd7dc Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:26:56 +0700 Subject: [PATCH 32/53] feat: add cancel only and quotation id filter --- src/controllers/06-request-list-controller.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/controllers/06-request-list-controller.ts b/src/controllers/06-request-list-controller.ts index c967efd..f8a008c 100644 --- a/src/controllers/06-request-list-controller.ts +++ b/src/controllers/06-request-list-controller.ts @@ -292,6 +292,8 @@ export class RequestListController extends Controller { @Query() requestDataId?: string, @Query() workStatus?: RequestWorkStatus, @Query() readyToTask?: boolean, + @Query() cancelOnly?: boolean, + @Query() quotationId?: string, ) { let statusCondition: Prisma.RequestWorkWhereInput["stepStatus"] = {}; @@ -313,7 +315,15 @@ export class RequestListController extends Controller { ], }, }; - } else { + } + + if (cancelOnly) { + statusCondition = { + some: { workStatus: RequestWorkStatus.Canceled }, + }; + } + + if (workStatus && !readyToTask && !cancelOnly) { statusCondition = { some: { workStatus }, }; @@ -321,8 +331,10 @@ export class RequestListController extends Controller { const where = { stepStatus: readyToTask || workStatus ? statusCondition : undefined, + creditNote: cancelOnly ? null : undefined, request: { id: requestDataId, + quotationId, quotation: { registeredBranch: { OR: permissionCond(req.user) }, }, From 07d796251bfd52aea8ce9d1064065a89c797f384 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:34:20 +0700 Subject: [PATCH 33/53] fix: filter not cover --- src/controllers/07-task-controller.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index 2f15c1d..c80a3a9 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -547,7 +547,14 @@ export class TaskActionController extends Controller { task: { some: { taskOrderId, - taskStatus: { notIn: [TaskStatus.Canceled, TaskStatus.Success] }, + taskStatus: { + notIn: [ + TaskStatus.Canceled, + TaskStatus.Success, + TaskStatus.Validate, + TaskStatus.Complete, + ], + }, }, }, }, @@ -556,7 +563,14 @@ export class TaskActionController extends Controller { tx.task.updateMany({ where: { taskOrderId: taskOrderId, - taskStatus: { notIn: [TaskStatus.Canceled, TaskStatus.Success] }, + taskStatus: { + notIn: [ + TaskStatus.Canceled, + TaskStatus.Success, + TaskStatus.Validate, + TaskStatus.Complete, + ], + }, }, data: { taskStatus: TaskStatus.Redo }, }), From a0f20970aefdb40a2cae00920dfc4b0a294ff0a4 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:38:14 +0700 Subject: [PATCH 34/53] fix: condition not working --- src/controllers/06-request-list-controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/06-request-list-controller.ts b/src/controllers/06-request-list-controller.ts index f8a008c..53b388f 100644 --- a/src/controllers/06-request-list-controller.ts +++ b/src/controllers/06-request-list-controller.ts @@ -330,7 +330,7 @@ export class RequestListController extends Controller { } const where = { - stepStatus: readyToTask || workStatus ? statusCondition : undefined, + stepStatus: readyToTask || cancelOnly || workStatus ? statusCondition : undefined, creditNote: cancelOnly ? null : undefined, request: { id: requestDataId, From a6f5cde21fc93867f502ae9567f6ee1a9f44609c Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 11:24:20 +0700 Subject: [PATCH 35/53] feat: also change user task to submitted even force complete --- src/controllers/07-task-controller.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index c80a3a9..dfbce52 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -540,7 +540,17 @@ export class TaskActionController extends Controller { await Promise.all([ tx.taskOrder.update({ where: { id: taskOrderId }, - data: { taskOrderStatus: TaskOrderStatus.Complete }, + data: { + taskOrderStatus: TaskOrderStatus.Complete, + userTask: { + updateMany: { + where: { taskOrderId }, + data: { + userTaskStatus: UserTaskStatus.Submit, + }, + }, + }, + }, }), tx.requestWorkStepStatus.updateMany({ where: { From 66212b3b2d1ef5a5fd3eb118ccd685cd852dbf37 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:37:01 +0700 Subject: [PATCH 36/53] feat: add more field for data store --- prisma/schema.prisma | 14 +++++++++++++- src/controllers/08-credit-note-controller.ts | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 344a681..89dbaf1 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1585,6 +1585,11 @@ enum CreditNoteStatus { Success } +enum CreditNotePaybackType { + Cash + BankTransfer +} + model CreditNote { id String @id @default(cuid()) @@ -1592,7 +1597,14 @@ model CreditNote { creditNoteStatus CreditNoteStatus @default(Pending) - value Float @default(0) + value Float @default(0) + reason String? + detail String? + + paybackType CreditNotePaybackType? + paybackBank String? + paybackAccount String? + paybackAccountName String? quotation Quotation @relation(fields: [quotationId], references: [id], onDelete: Cascade) quotationId String diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 971673e..2523613 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -24,7 +24,7 @@ import { import HttpError from "../interfaces/http-error"; import HttpStatus from "../interfaces/http-status"; import { notFoundError } from "../utils/error"; -import { CreditNoteStatus, Prisma } from "@prisma/client"; +import { CreditNotePaybackType, CreditNoteStatus, Prisma } from "@prisma/client"; import { queryOrNot } from "../utils/relation"; import { RequestWorkStatus } from "../generated/kysely/types"; @@ -52,10 +52,22 @@ const permissionCheckCompany = createPermCheck((_) => true); type CreditNoteCreate = { requestWorkId: string[]; quotationId: string; + reason?: string; + detail?: string; + paybackType?: CreditNotePaybackType; + paybackBank?: string; + paybackAccount?: string; + paybackAccountName?: string; }; type CreditNoteUpdate = { requestWorkId: string[]; quotationId: string; + reason?: string; + detail?: string; + paybackType?: CreditNotePaybackType; + paybackBank?: string; + paybackAccount?: string; + paybackAccountName?: string; }; @Route("api/v1/credit-note") From 3e16486d72728b5d806d82c33bd8802e1793ecf0 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:37:07 +0700 Subject: [PATCH 37/53] chore: migration --- .../migration.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 prisma/migrations/20250109063649_add_more_field_credit_note/migration.sql diff --git a/prisma/migrations/20250109063649_add_more_field_credit_note/migration.sql b/prisma/migrations/20250109063649_add_more_field_credit_note/migration.sql new file mode 100644 index 0000000..d56f956 --- /dev/null +++ b/prisma/migrations/20250109063649_add_more_field_credit_note/migration.sql @@ -0,0 +1,10 @@ +-- CreateEnum +CREATE TYPE "CreditNotePaybackType" AS ENUM ('Cash', 'BankTransfer'); + +-- AlterTable +ALTER TABLE "CreditNote" ADD COLUMN "detail" TEXT, +ADD COLUMN "paybackAccount" TEXT, +ADD COLUMN "paybackAccountName" TEXT, +ADD COLUMN "paybackBank" TEXT, +ADD COLUMN "paybackType" "CreditNotePaybackType", +ADD COLUMN "reason" TEXT; From c1fb21e14cb4a73419cb500e8dc703e3877b3e8a Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 14:09:49 +0700 Subject: [PATCH 38/53] fix: task ordering --- src/controllers/07-task-controller.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index dfbce52..22357b4 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -151,6 +151,7 @@ export class TaskController extends Controller { where: { requestWorkStep: { responsibleUserId: taskAssignedUserId }, }, + orderBy: { id: "asc" }, include: { requestWorkStep: { include: { From d5e0c56da35b29bbdb9934bdf02d94e7e5c75a3f Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:54:20 +0700 Subject: [PATCH 39/53] fix: body not save in database --- src/controllers/08-credit-note-controller.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 2523613..1f87dd1 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -311,6 +311,12 @@ export class CreditNoteController extends Controller { quotation: true, }, data: { + reason: body.reason, + detail: body.detail, + paybackType: body.paybackType, + paybackBank: body.paybackBank, + paybackAccount: body.paybackAccount, + paybackAccountName: body.paybackAccountName, code: `CN${currentYear.toString().padStart(2, "0")}${currentMonth.toString().padStart(2, "0")}${last.value.toString().padStart(6, "0")}`, value, requestWork: { @@ -415,6 +421,12 @@ export class CreditNoteController extends Controller { quotation: true, }, data: { + reason: body.reason, + detail: body.detail, + paybackType: body.paybackType, + paybackBank: body.paybackBank, + paybackAccount: body.paybackAccount, + paybackAccountName: body.paybackAccountName, value, requestWork: { disconnect: creditNoteData.requestWork From 77dbdac012ac1a16d8def93f54e18d0acfd653ed Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:02:41 +0700 Subject: [PATCH 40/53] feat: detect if agent price --- src/controllers/08-credit-note-controller.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 1f87dd1..56d892f 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -273,11 +273,17 @@ export class CreditNoteController extends Controller { (v) => v.productId === c.productService.productId, )?.stepCount; - const successCount = c.stepStatus.filter((v) => v.workStatus === "Completed").length; + const successCount = c.stepStatus.filter( + (v) => v.workStatus === RequestWorkStatus.Completed, + ).length; + + const price = c.request.quotation.agentPrice ? "price" : "agentPrice"; if (serviceChargeStepCount && successCount) { return ( - a + c.productService.product.price - c.productService.product.serviceCharge * successCount + a + + c.productService.product[price] - + c.productService.product.serviceCharge * successCount ); } return a + c.productService.product.price; @@ -400,11 +406,17 @@ export class CreditNoteController extends Controller { (v) => v.productId === c.productService.productId, )?.stepCount; - const successCount = c.stepStatus.filter((v) => v.workStatus === "Completed").length; + const successCount = c.stepStatus.filter( + (v) => v.workStatus === RequestWorkStatus.Completed, + ).length; + + const price = c.request.quotation.agentPrice ? "price" : "agentPrice"; if (serviceChargeStepCount && successCount) { return ( - a + c.productService.product.price - c.productService.product.serviceCharge * successCount + a + + c.productService.product[price] - + c.productService.product.serviceCharge * successCount ); } return a + c.productService.product.price; From 59d134b260dfd292f4d32febc4169282008d3ac8 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:53:29 +0700 Subject: [PATCH 41/53] feat: include more relation in credit note get by id --- src/controllers/08-credit-note-controller.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 56d892f..7816fee 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -212,7 +212,16 @@ export class CreditNoteController extends Controller { return prisma.creditNote.findFirst({ where, include: { - quotation: true, + quotation: { + include: { + registeredBranch: true, + customerBranch: { + include: { + customer: true, + }, + }, + }, + }, requestWork: { include: { request: true }, }, From af20c3fab21fafb299e92bd9099933550e1cae56 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:03:43 +0700 Subject: [PATCH 42/53] feat: add payback status in database --- prisma/schema.prisma | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 89dbaf1..d69cca0 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1590,6 +1590,12 @@ enum CreditNotePaybackType { BankTransfer } +enum PaybackStatus { + Pending + Verify + Done +} + model CreditNote { id String @id @default(cuid()) @@ -1605,6 +1611,7 @@ model CreditNote { paybackBank String? paybackAccount String? paybackAccountName String? + paybackStatus PaybackStatus @default(Pending) quotation Quotation @relation(fields: [quotationId], references: [id], onDelete: Cascade) quotationId String From 6a86dfd9ad3cb386a33715b6c352b90c64a5a88e Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:04:21 +0700 Subject: [PATCH 43/53] chore: migration --- .../20250109100013_add_payback_status/migration.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 prisma/migrations/20250109100013_add_payback_status/migration.sql diff --git a/prisma/migrations/20250109100013_add_payback_status/migration.sql b/prisma/migrations/20250109100013_add_payback_status/migration.sql new file mode 100644 index 0000000..ba8a319 --- /dev/null +++ b/prisma/migrations/20250109100013_add_payback_status/migration.sql @@ -0,0 +1,5 @@ +-- CreateEnum +CREATE TYPE "PaybackStatus" AS ENUM ('Pending', 'Verify', 'Done'); + +-- AlterTable +ALTER TABLE "CreditNote" ADD COLUMN "paybackStatus" "PaybackStatus" NOT NULL DEFAULT 'Pending'; From 019c493e7f3205bcc4f877afe51ee3c7e7cccdb8 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:05:20 +0700 Subject: [PATCH 44/53] fix: do not include work with parent cancled --- src/controllers/06-request-list-controller.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/controllers/06-request-list-controller.ts b/src/controllers/06-request-list-controller.ts index 53b388f..f669f0a 100644 --- a/src/controllers/06-request-list-controller.ts +++ b/src/controllers/06-request-list-controller.ts @@ -334,6 +334,9 @@ export class RequestListController extends Controller { creditNote: cancelOnly ? null : undefined, request: { id: requestDataId, + requestDataStatus: readyToTask + ? { notIn: [RequestDataStatus.Canceled, RequestDataStatus.Completed] } + : undefined, quotationId, quotation: { registeredBranch: { OR: permissionCond(req.user) }, From 9b21c1559917468756b6f9282d0b489c5ff123a8 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:08:35 +0700 Subject: [PATCH 45/53] feat: include more relation --- src/controllers/08-credit-note-controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 7816fee..e157d6c 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -223,7 +223,7 @@ export class CreditNoteController extends Controller { }, }, requestWork: { - include: { request: true }, + include: { request: true, productService: true }, }, }, }); From 4e7e6e07c9261c5d41ec82fdb175bede9664f790 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:17:48 +0700 Subject: [PATCH 46/53] feat: update payback status instead of its status --- src/controllers/08-credit-note-controller.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index e157d6c..03ec023 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -26,7 +26,7 @@ import HttpStatus from "../interfaces/http-status"; import { notFoundError } from "../utils/error"; import { CreditNotePaybackType, CreditNoteStatus, Prisma } from "@prisma/client"; import { queryOrNot } from "../utils/relation"; -import { RequestWorkStatus } from "../generated/kysely/types"; +import { PaybackStatus, RequestWorkStatus } from "../generated/kysely/types"; const MANAGE_ROLES = [ "system", @@ -508,12 +508,12 @@ export class CreditNoteActionController extends Controller { return creditNoteData; } - @Post("status") + @Post("packback-status") @Security("keycloak", MANAGE_ROLES) async updateStatus( @Request() req: RequestWithUser, @Path() creditNoteId: string, - @Body() body: CreditNoteStatus, + @Body() body: PaybackStatus, ) { await this.#checkPermission(req.user, creditNoteId); return await prisma.creditNote.update({ @@ -527,7 +527,8 @@ export class CreditNoteActionController extends Controller { quotation: true, }, data: { - creditNoteStatus: body, + creditNoteStatus: body === PaybackStatus.Done ? CreditNoteStatus.Success : undefined, + paybackStatus: body, }, }); } From bea08e5d126439b87ad4471c34347dec6dcef64b Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:35:48 +0700 Subject: [PATCH 47/53] feat: include more relation --- src/controllers/08-credit-note-controller.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 03ec023..58ebafe 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -223,7 +223,20 @@ export class CreditNoteController extends Controller { }, }, requestWork: { - include: { request: true, productService: true }, + include: { + request: true, + productService: { + include: { + service: true, + work: { + include: { productOnWork: true }, + }, + product: { + include: { document: true }, + }, + }, + }, + }, }, }, }); From 5c3dc9abcd14ed25afa9b48c6c83ad916d5f0cec Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:45:02 +0700 Subject: [PATCH 48/53] feat: include more relation --- src/controllers/08-credit-note-controller.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 58ebafe..3be267d 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -224,7 +224,9 @@ export class CreditNoteController extends Controller { }, requestWork: { include: { - request: true, + request: { + include: { employee: true }, + }, productService: { include: { service: true, From a3735abb788f8f11b180b4515e11687c986c165d Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Fri, 10 Jan 2025 09:05:03 +0700 Subject: [PATCH 49/53] feat: add attachment endpoints for credit note --- src/controllers/08-credit-note-controller.ts | 63 ++++++++++++++++++++ src/utils/minio.ts | 3 + 2 files changed, 66 insertions(+) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index 3be267d..e4b37ff 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -3,6 +3,7 @@ import { Controller, Delete, Get, + Head, Path, Post, Put, @@ -23,6 +24,7 @@ import { } from "../services/permission"; import HttpError from "../interfaces/http-error"; import HttpStatus from "../interfaces/http-status"; +import { deleteFile, fileLocation, getFile, getPresigned, listFile, setFile } from "../utils/minio"; import { notFoundError } from "../utils/error"; import { CreditNotePaybackType, CreditNoteStatus, Prisma } from "@prisma/client"; import { queryOrNot } from "../utils/relation"; @@ -548,3 +550,64 @@ export class CreditNoteActionController extends Controller { }); } } + +@Route("api/v1/credit-note/{creditNoteId}") +@Tags("Credit Note") +export class CreditNoteAttachmentController extends Controller { + async #checkPermission(user: RequestWithUser["user"], id: string) { + const creditNoteData = await prisma.creditNote.findFirst({ + where: { id }, + include: { + requestWork: true, + quotation: { + include: { + registeredBranch: { include: branchRelationPermInclude(user) }, + }, + }, + }, + }); + if (!creditNoteData) throw notFoundError("Credit Note"); + await permissionCheck(user, creditNoteData.quotation.registeredBranch); + return creditNoteData; + } + + @Get("attachment") + @Security("keycloak") + async listAttachment(@Request() req: RequestWithUser, @Path() creditNoteId: string) { + await this.#checkPermission(req.user, creditNoteId); + return await listFile(fileLocation.creditNote.attachment(creditNoteId)); + } + + @Get("attachment/{name}") + @Security("keycloak") + async getAttachment(@Path() creditNoteId: string, @Path() name: string) { + return await getFile(fileLocation.creditNote.attachment(creditNoteId, name)); + } + + @Head("attachment/{name}") + async headAttachment(@Path() creditNoteId: string, @Path() name: string) { + return await getPresigned("head", fileLocation.creditNote.attachment(creditNoteId, name)); + } + + @Put("attachment/{name}") + @Security("keycloak") + async putAttachment( + @Request() req: RequestWithUser, + @Path() creditNoteId: string, + @Path() name: string, + ) { + await this.#checkPermission(req.user, creditNoteId); + return await setFile(fileLocation.creditNote.attachment(creditNoteId, name)); + } + + @Delete("attachment/{name}") + @Security("keycloak") + async delAttachment( + @Request() req: RequestWithUser, + @Path() creditNoteId: string, + @Path() name: string, + ) { + await this.#checkPermission(req.user, creditNoteId); + return await deleteFile(fileLocation.creditNote.attachment(creditNoteId, name)); + } +} diff --git a/src/utils/minio.ts b/src/utils/minio.ts index 4a2cfef..7ec0a3b 100644 --- a/src/utils/minio.ts +++ b/src/utils/minio.ts @@ -112,4 +112,7 @@ export const fileLocation = { task: { attachment: (taskId: string, name?: string) => `task/attachment-${taskId}/${name || ""}`, }, + creditNote: { + attachment: (taskId: string, name?: string) => `credit-note/attachment-${taskId}/${name || ""}`, + }, }; From 1cf861d4924392cb4df736c8dc69544d5bd4df8e Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Fri, 10 Jan 2025 09:37:47 +0700 Subject: [PATCH 50/53] feat: add credit note status filter --- src/controllers/08-credit-note-controller.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index e4b37ff..ae420e3 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -101,8 +101,16 @@ export class CreditNoteController extends Controller { @Query() pageSize: number = 30, @Query() query: string = "", @Query() quotationId?: string, + @Query() creditNoteStatus?: CreditNoteStatus, ) { - return await this.getCreditNoteListByCriteria(req, page, pageSize, query, quotationId); + return await this.getCreditNoteListByCriteria( + req, + page, + pageSize, + query, + quotationId, + creditNoteStatus, + ); } // NOTE: only when needed or else remove this and implement in getCreditNoteList @@ -114,6 +122,7 @@ export class CreditNoteController extends Controller { @Query() pageSize: number = 30, @Query() query: string = "", @Query() quotationId?: string, + @Query() creditNoteStatus?: CreditNoteStatus, @Body() body?: {}, ) { const where = { @@ -159,6 +168,7 @@ export class CreditNoteController extends Controller { }, }, ]), + creditNoteStatus, requestWork: { some: { request: { From 5cf5e079fb41c76a1e47f49c185db4a825e71137 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Fri, 10 Jan 2025 10:18:57 +0700 Subject: [PATCH 51/53] fix: wrong model error message thrown --- src/controllers/05-quotation-controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/05-quotation-controller.ts b/src/controllers/05-quotation-controller.ts index 4df4293..7da7cb4 100644 --- a/src/controllers/05-quotation-controller.ts +++ b/src/controllers/05-quotation-controller.ts @@ -1045,7 +1045,7 @@ export class QuotationFileController extends Controller { }, where: { id }, }); - if (!data) throw notFoundError("Payment"); + if (!data) throw notFoundError("Quotation"); await permissionCheck(user, data.registeredBranch); } From a416f7d04edc2e5c14a5c77dd6eea80a8601a454 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Fri, 10 Jan 2025 10:19:40 +0700 Subject: [PATCH 52/53] refactor: use # instead of private --- src/controllers/05-quotation-controller.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/controllers/05-quotation-controller.ts b/src/controllers/05-quotation-controller.ts index 7da7cb4..a85d8aa 100644 --- a/src/controllers/05-quotation-controller.ts +++ b/src/controllers/05-quotation-controller.ts @@ -1036,7 +1036,7 @@ export class QuotationActionController extends Controller { @Route("api/v1/quotation/{quotationId}/attachment") @Tags("Quotation") export class QuotationFileController extends Controller { - private async checkPermission(user: RequestWithUser["user"], id: string) { + async #checkPermission(user: RequestWithUser["user"], id: string) { const data = await prisma.quotation.findUnique({ include: { registeredBranch: { @@ -1052,7 +1052,7 @@ export class QuotationFileController extends Controller { @Get() @Security("keycloak") async listAttachment(@Request() req: RequestWithUser, @Path() quotationId: string) { - await this.checkPermission(req.user, quotationId); + await this.#checkPermission(req.user, quotationId); return await listFile(fileLocation.quotation.attachment(quotationId)); } @@ -1074,7 +1074,7 @@ export class QuotationFileController extends Controller { @Path() quotationId: string, @Path() name: string, ) { - await this.checkPermission(req.user, quotationId); + await this.#checkPermission(req.user, quotationId); return await getFile(fileLocation.quotation.attachment(quotationId, name)); } @@ -1085,7 +1085,7 @@ export class QuotationFileController extends Controller { @Path() quotationId: string, @Path() name: string, ) { - await this.checkPermission(req.user, quotationId); + await this.#checkPermission(req.user, quotationId); return await setFile(fileLocation.quotation.attachment(quotationId, name)); } @@ -1096,7 +1096,7 @@ export class QuotationFileController extends Controller { @Path() quotationId: string, @Path() name: string, ) { - await this.checkPermission(req.user, quotationId); + await this.#checkPermission(req.user, quotationId); return await deleteFile(fileLocation.quotation.attachment(quotationId, name)); } } From 6b62926ba42a1332cf2388af72b0da5c2f612ef8 Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Fri, 10 Jan 2025 16:41:29 +0700 Subject: [PATCH 53/53] fix: typo --- src/controllers/08-credit-note-controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/08-credit-note-controller.ts b/src/controllers/08-credit-note-controller.ts index ae420e3..d47376c 100644 --- a/src/controllers/08-credit-note-controller.ts +++ b/src/controllers/08-credit-note-controller.ts @@ -535,7 +535,7 @@ export class CreditNoteActionController extends Controller { return creditNoteData; } - @Post("packback-status") + @Post("payback-status") @Security("keycloak", MANAGE_ROLES) async updateStatus( @Request() req: RequestWithUser,