From 8485209a75d7635b6105a7b50e4a06cd1b177007 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Tue, 28 Oct 2025 17:48:36 +0800 Subject: [PATCH] Mobile API: Donation & Admin Donation Add: - prisma/migrations/20251028063234_donasi_invoice_relation_bank_master/ : penambahan master bank ke donasi invoce - src/app/api/mobile/admin/donation/[id]/invoice/ Fix: - prisma/schema.prisma - src/app/api/mobile/admin/donation/[id]/donatur/route.ts - src/app/api/mobile/admin/donation/[id]/route.ts - src/app/api/mobile/donation/[id]/invoice/route.ts ### No Issue --- .../migration.sql | 5 + prisma/schema.prisma | 5 +- .../admin/donation/[id]/donatur/route.ts | 86 +++++---- .../admin/donation/[id]/invoice/route.ts | 176 ++++++++++++++++++ .../api/mobile/admin/donation/[id]/route.ts | 14 +- .../api/mobile/donation/[id]/invoice/route.ts | 8 +- 6 files changed, 258 insertions(+), 36 deletions(-) create mode 100644 prisma/migrations/20251028063234_donasi_invoice_relation_bank_master/migration.sql create mode 100644 src/app/api/mobile/admin/donation/[id]/invoice/route.ts diff --git a/prisma/migrations/20251028063234_donasi_invoice_relation_bank_master/migration.sql b/prisma/migrations/20251028063234_donasi_invoice_relation_bank_master/migration.sql new file mode 100644 index 00000000..81dab313 --- /dev/null +++ b/prisma/migrations/20251028063234_donasi_invoice_relation_bank_master/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Donasi_Invoice" ADD COLUMN "masterBankId" TEXT; + +-- AddForeignKey +ALTER TABLE "Donasi_Invoice" ADD CONSTRAINT "Donasi_Invoice_masterBankId_fkey" FOREIGN KEY ("masterBankId") REFERENCES "MasterBank"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 72dd8579..c72df09a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -202,6 +202,7 @@ model MasterBank { updatedAt DateTime @updatedAt Investasi_Invoice Investasi_Invoice[] EventTransaksi EventTransaksi[] + Donasi_Invoice Donasi_Invoice[] } model MasterStatus { @@ -576,7 +577,9 @@ model Donasi_Invoice { Images Images? @relation(fields: [imagesId], references: [id]) imagesId String? - imageId String? + imageId String? + MasterBank MasterBank? @relation(fields: [masterBankId], references: [id]) + masterBankId String? @default("null") } model Donasi_Kabar { diff --git a/src/app/api/mobile/admin/donation/[id]/donatur/route.ts b/src/app/api/mobile/admin/donation/[id]/donatur/route.ts index e0e1a318..3d401541 100644 --- a/src/app/api/mobile/admin/donation/[id]/donatur/route.ts +++ b/src/app/api/mobile/admin/donation/[id]/donatur/route.ts @@ -13,40 +13,11 @@ async function GET(req: Request, { params }: { params: { id: string } }) { const skipData = Number(page) * takeData - takeData; const fixStatus = _.startCase(status || ""); + console.log("[FIX STATUS]", fixStatus); + let fixData; try { - if (fixStatus) { - const data = await prisma.donasi_Invoice.findMany({ - take: page ? takeData : undefined, - skip: page ? skipData : undefined, - orderBy: { - createdAt: "desc", - }, - where: { - donasiId: id, - active: true, - DonasiMaster_StatusInvoice: { - name: { - contains: fixStatus, - mode: "insensitive", - }, - }, - }, - select: { - id: true, - nominal: true, - createdAt: true, - Author: true, - DonasiMaster_Bank: true, - DonasiMaster_StatusInvoice: true, - donasiMaster_StatusInvoiceId: true, - imagesId: true, - imageId: true, - }, - }); - - fixData = data; - } else { + if (status === null) { fixData = await prisma.donasi_Invoice.findMany({ take: page ? takeData : undefined, skip: page ? skipData : undefined, @@ -67,8 +38,59 @@ async function GET(req: Request, { params }: { params: { id: string } }) { donasiMaster_StatusInvoiceId: true, imagesId: true, imageId: true, + MasterBank: true, }, }); + } else { + const checkStatusTransaksi = + await prisma.donasiMaster_StatusInvoice.findFirst({ + where: { + name: fixStatus, + }, + }); + + console.log("[CHECK STATUS TRANSAKSI]", checkStatusTransaksi); + + if (!checkStatusTransaksi) + return NextResponse.json( + { + success: false, + message: "Error get detail Investasi", + reason: "Status not found", + }, + { status: 500 } + ); + + const data = await prisma.donasi_Invoice.findMany({ + take: page ? takeData : undefined, + skip: page ? skipData : undefined, + orderBy: { + createdAt: "desc", + }, + where: { + donasiId: id, + active: true, + DonasiMaster_StatusInvoice: { + name: { + contains: checkStatusTransaksi.name, + mode: "insensitive", + }, + }, + }, + select: { + id: true, + nominal: true, + createdAt: true, + Author: true, + DonasiMaster_Bank: true, + DonasiMaster_StatusInvoice: true, + donasiMaster_StatusInvoiceId: true, + imagesId: true, + imageId: true, + }, + }); + + fixData = data; } return NextResponse.json( diff --git a/src/app/api/mobile/admin/donation/[id]/invoice/route.ts b/src/app/api/mobile/admin/donation/[id]/invoice/route.ts new file mode 100644 index 00000000..1627bf56 --- /dev/null +++ b/src/app/api/mobile/admin/donation/[id]/invoice/route.ts @@ -0,0 +1,176 @@ +import { NextResponse } from "next/server"; +import { prisma } from "@/lib"; +import _ from "lodash"; + +export { GET, PUT }; + +async function GET(req: Request, { params }: { params: { id: string } }) { + const { id } = params; + console.log("[ID]", id); + + try { + const data = await prisma.donasi_Invoice.findUnique({ + where: { + id: id, + }, + select: { + id: true, + donasiId: true, + nominal: true, + createdAt: true, + Author: true, + DonasiMaster_StatusInvoice: true, + imageId: true, + MasterBank: true, + }, + }); + + return NextResponse.json( + { + success: true, + message: "Berhasil mendapatkan data", + data: data, + }, + { status: 200 } + ); + } catch (error) { + console.log("[ERROR]", error); + return NextResponse.json( + { + success: false, + message: "Error get detail Investasi", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +} + +// TYPE DATA +interface DataType { + donationId: string; + nominal: number; +} + +async function PUT(req: Request, { params }: { params: { id: string } }) { + const { id } = params; + const { data } = await req.json(); + const { searchParams } = new URL(req.url); + const status = searchParams.get("status"); + const fixStatus = _.startCase(status as string); + + console.log("[ID]", id); + console.log("[DATA]", data); + console.log("[FIX STATUS]", fixStatus); + + const cloneData = data as DataType; + + try { + const checkStatusTransaksi = + await prisma.donasiMaster_StatusInvoice.findFirst({ + where: { + name: fixStatus, + }, + }); + + if (!checkStatusTransaksi) + return NextResponse.json( + { + success: false, + message: "Failed update status invoice", + reason: "Status not found", + }, + { status: 500 } + ); + + const donasi = await prisma.donasi.findUnique({ + where: { + id: data?.donationId, + }, + select: { + target: true, + terkumpul: true, + }, + }); + + if (!donasi) { + return NextResponse.json( + { + success: false, + message: "Failed update status invoice", + reason: "Donasi not found", + }, + { status: 500 } + ); + } + + const updateInvoice = await prisma.donasi_Invoice.update({ + where: { + id: id, + }, + data: { + donasiMaster_StatusInvoiceId: checkStatusTransaksi.id, + }, + }); + + if (!updateInvoice) { + return NextResponse.json( + { + success: false, + message: "Failed update status invoice", + reason: "Update invoice failed", + }, + { status: 500 } + ); + } + + let totalNominal = + Number(cloneData.nominal) + (Number(donasi.terkumpul) || 0); + const progres = + Math.floor((totalNominal / Number(donasi.target)) * 1000) / 10; + + console.log("[STATUS]", checkStatusTransaksi); + console.log("[TOTAL NOMINAL]", totalNominal); + console.log("[PROGRES]", progres); + + const updateDonasi = await prisma.donasi.update({ + where: { + id: data?.donationId, + }, + data: { + terkumpul: "" + totalNominal, + progres: "" + progres, + }, + }); + + if (!updateDonasi) { + return NextResponse.json( + { + success: false, + message: "Failed update status invoice", + reason: "Update donasi failed", + }, + { status: 500 } + ); + } + + return NextResponse.json( + { + success: true, + message: "Berhasil update status invoice", + data: updateDonasi, + }, + { status: 200 } + ); + } catch (error) { + console.log("[ERROR]", error); + return NextResponse.json( + { + success: false, + message: "Error update status invoice", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +} diff --git a/src/app/api/mobile/admin/donation/[id]/route.ts b/src/app/api/mobile/admin/donation/[id]/route.ts index 28d7da3d..ab040081 100644 --- a/src/app/api/mobile/admin/donation/[id]/route.ts +++ b/src/app/api/mobile/admin/donation/[id]/route.ts @@ -42,11 +42,23 @@ async function GET(request: Request, { params }: { params: { id: string } }) { }, }); + const successInvoice = await prisma.donasi_Invoice.count({ + where: { + donasiId: donasiId, + DonasiMaster_StatusInvoice: { + name: "Berhasil", + }, + }, + }); + return NextResponse.json( { success: true, message: "Data Donasi Berhasil Diambil", - data: data, + data: { + donasi: data, + donatur: successInvoice, + }, }, { status: 200 } ); diff --git a/src/app/api/mobile/donation/[id]/invoice/route.ts b/src/app/api/mobile/donation/[id]/invoice/route.ts index b9be4fbb..edd19a2e 100644 --- a/src/app/api/mobile/donation/[id]/invoice/route.ts +++ b/src/app/api/mobile/donation/[id]/invoice/route.ts @@ -13,7 +13,7 @@ async function POST(request: Request, { params }: { params: { id: string } }) { data: { donasiId: id, nominal: data.nominal, - donasiMaster_BankId: data.bankId, + masterBankId: data.bankId, authorId: data.authorId, }, select: { @@ -65,6 +65,7 @@ async function GET(request: Request, { params }: { params: { id: string } }) { createdAt: true, donasiMaster_BankId: true, donasiMaster_StatusInvoiceId: true, +MasterBank: true, Donasi: { select: { id: true, @@ -137,13 +138,14 @@ async function PUT(request: Request, { params }: { params: { id: string } }) { message: "Status tidak ditemukan", }); } + const update = await prisma.donasi_Invoice.update({ where: { id: id, }, data: { donasiMaster_StatusInvoiceId: checkStatus.id, - imageId: data.fileId, + imageId: data || null, }, select: { id: true, @@ -162,6 +164,8 @@ async function PUT(request: Request, { params }: { params: { id: string } }) { }, }); + console.log("[UPDATE INVOICE]", update); + return NextResponse.json({ status: 200, success: true,