diff --git a/src/app/api/investasi/[id]/invoice/route.ts b/src/app/api/investasi/[id]/invoice/route.ts new file mode 100644 index 00000000..df9c6e9f --- /dev/null +++ b/src/app/api/investasi/[id]/invoice/route.ts @@ -0,0 +1,55 @@ +import { NextResponse } from "next/server"; +import { prisma } from "@/lib"; + +export async function GET( + request: Request, + context: { params: { id: string } } +) { + try { + const { id } = context.params; + const data = await prisma.investasi_Invoice.findFirst({ + where: { + id: id, + }, + include: { + MasterBank: true, + StatusInvoice: true, + Investasi: { + include: { + MasterPembagianDeviden: true, + MasterPencarianInvestor: true, + MasterPeriodeDeviden: true, + ProspektusInvestasi: true, + Investasi_Invoice: { + where: { + statusInvoiceId: "1", + }, + }, + }, + }, + Author: { + include: { + Profile: true, + }, + }, + }, + }); + + const { ...allData } = data; + const Investor = data?.Investasi?.Investasi_Invoice; + const result = { ...allData, Investor }; + + return NextResponse.json({ + success: true, + message: "Berhasil mendapatkan data invoice", + data: result, + }); + } catch (error) { + console.error("Error get invoice", error); + return NextResponse.json({ + success: false, + message: "Gagal mendapatkan data invoice, coba lagi nanti ", + reason: (error as Error).message, + }); + } +} diff --git a/src/app/dev/(user)/investasi/transaksi/invoice/[id]/page.tsx b/src/app/dev/(user)/investasi/transaksi/invoice/[id]/page.tsx index 11d9fd8f..1bc408ad 100644 --- a/src/app/dev/(user)/investasi/transaksi/invoice/[id]/page.tsx +++ b/src/app/dev/(user)/investasi/transaksi/invoice/[id]/page.tsx @@ -1,13 +1,9 @@ -import { investasi_funGetOneInvoiceById } from "@/app_modules/investasi/_fun/get/fun_get_one_invoice_by_id"; import { Investasi_UiInvoice } from "@/app_modules/investasi/_ui"; -export default async function Page({ params }: { params: { id: string } }) { - const invoiceId = params.id; - const dataInvoice = await investasi_funGetOneInvoiceById({ invoiceId: invoiceId }); - +export default async function Page() { return ( <> - + ); } diff --git a/src/app/dev/(user)/investasi/transaksi/metode-pembayaran/[id]/page.tsx b/src/app/dev/(user)/investasi/transaksi/metode-pembayaran/[id]/page.tsx index 1c7e75a0..f7a1b6fd 100644 --- a/src/app/dev/(user)/investasi/transaksi/metode-pembayaran/[id]/page.tsx +++ b/src/app/dev/(user)/investasi/transaksi/metode-pembayaran/[id]/page.tsx @@ -1,13 +1,9 @@ -import { funGlobal_getAllBank } from "@/app_modules/_global/fun/get/fun_get_all_bank"; import { Investasi_UiMetodePembayaran } from "@/app_modules/investasi/_ui"; -export default async function Page({ params }: { params: { id: string } }) { - const investasiId = params.id; - const listBank = await funGlobal_getAllBank(); - +export default async function Page() { return ( <> - + ); } diff --git a/src/app/dev/(user)/investasi/transaksi/proses-transaksi/[id]/page.tsx b/src/app/dev/(user)/investasi/transaksi/proses-transaksi/[id]/page.tsx index 7fb5988e..38ae995b 100644 --- a/src/app/dev/(user)/investasi/transaksi/proses-transaksi/[id]/page.tsx +++ b/src/app/dev/(user)/investasi/transaksi/proses-transaksi/[id]/page.tsx @@ -1,13 +1,9 @@ -import { funGlobal_getNomorAdmin } from "@/app_modules/_global/fun/get"; import { Investasi_UiProsesTransaksi } from "@/app_modules/investasi/_ui"; -export default async function Page({ params }: { params: { id: string } }) { - const invoiceId = params.id; - const nomorAdmin = await funGlobal_getNomorAdmin(); - +export default async function Page() { return ( <> - + ); } diff --git a/src/app_modules/investasi/_lib/api_fetch_new_investasi.ts b/src/app_modules/investasi/_lib/api_fetch_new_investasi.ts index 086d08da..878d622e 100644 --- a/src/app_modules/investasi/_lib/api_fetch_new_investasi.ts +++ b/src/app_modules/investasi/_lib/api_fetch_new_investasi.ts @@ -3,6 +3,7 @@ export { apiNewGetOneInvestasiById, apiGetInvestorById, apiGetOneSahamInvestasiById, + apiGetInvoiceById, }; const apiFetchGetAllInvestasi = async ({ page }: { page: string }) => { @@ -156,3 +157,45 @@ const apiGetOneSahamInvestasiById = async ({ throw error; // Re-throw the error to handle it in the calling function } }; + + +const apiGetInvoiceById = async ({ + id, +}: { + id: string; +}) => { + try { + // Fetch token from cookie + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) { + console.error("No token found"); + return null; + } + + const response = await fetch(`/api/investasi/${id}/invoice`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${token}`, + }, + }); + + // Check if the response is OK + if (!response.ok) { + const errorData = await response.json().catch(() => null); + console.error( + "Failed to get list investor", + response.statusText, + errorData + ); + throw new Error(errorData?.message || "Failed to get list investor"); + } + + // Return the JSON response + return await response.json(); + } catch (error) { + console.error("Error get list investor", error); + throw error; // Re-throw the error to handle it in the calling function + } +}; diff --git a/src/app_modules/investasi/_ui/transaksi/ui_invoice.tsx b/src/app_modules/investasi/_ui/transaksi/ui_invoice.tsx index cce2b04d..356ae68f 100644 --- a/src/app_modules/investasi/_ui/transaksi/ui_invoice.tsx +++ b/src/app_modules/investasi/_ui/transaksi/ui_invoice.tsx @@ -2,7 +2,6 @@ import { useAtom } from "jotai"; import { Investasi_ViewInvoice } from "../../_view"; - import { Component_Header } from "@/app_modules/_global/component/new/component_header"; import UI_NewLayoutTamplate, { UI_NewChildren, @@ -15,34 +14,12 @@ import { useRouter } from "next/navigation"; import { useState } from "react"; import { gs_investas_menu } from "../../g_state"; -export function Investasi_UiInvoice({ dataInvoice }: { dataInvoice: any }) { +export function Investasi_UiInvoice() { const router = useRouter(); const [hotMenu, setHotMenu] = useAtom(gs_investas_menu); const [isLoading, setLoading] = useState(false); return ( - // { - // setHotMenu(3); - // setLoading(true); - // router.push(RouterInvestasi_OLD.main_transaksi); - // }} - // > - // {isLoading ? : } - // - // } - // /> - // } - // > - // - // - - + ); diff --git a/src/app_modules/investasi/_ui/transaksi/ui_metode_pembayaran.tsx b/src/app_modules/investasi/_ui/transaksi/ui_metode_pembayaran.tsx index 68b8b276..a687f76f 100644 --- a/src/app_modules/investasi/_ui/transaksi/ui_metode_pembayaran.tsx +++ b/src/app_modules/investasi/_ui/transaksi/ui_metode_pembayaran.tsx @@ -7,33 +7,15 @@ import UI_NewLayoutTamplate, { } from "@/app_modules/_global/ui/V2_layout_tamplate"; import { Investasi_ViewMetodePembayaran } from "../../_view"; -export function Investasi_UiMetodePembayaran({ - listBank, - investasiId, -}: { - listBank: any[]; - investasiId: string; -}) { +export function Investasi_UiMetodePembayaran() { return ( <> - {/* } - > - - */} - - + diff --git a/src/app_modules/investasi/_ui/transaksi/ui_proses_transaksi.tsx b/src/app_modules/investasi/_ui/transaksi/ui_proses_transaksi.tsx index fa0f61fa..1538ab20 100644 --- a/src/app_modules/investasi/_ui/transaksi/ui_proses_transaksi.tsx +++ b/src/app_modules/investasi/_ui/transaksi/ui_proses_transaksi.tsx @@ -12,7 +12,7 @@ import { useRouter } from "next/navigation"; import { RouterInvestasi_OLD } from "@/lib/router_hipmi/router_investasi"; import { useState } from "react"; -export function Investasi_UiProsesTransaksi({ nomorAdmin }: { nomorAdmin : any}) { +export function Investasi_UiProsesTransaksi() { const router = useRouter(); const [hotMenu, setHotMenu] = useAtom(gs_investas_menu); const [isLoading, setLoading] = useState(false); @@ -38,7 +38,7 @@ export function Investasi_UiProsesTransaksi({ nomorAdmin }: { nomorAdmin : any}) /> } > - + ); diff --git a/src/app_modules/investasi/_view/transaksi/view_invoice.tsx b/src/app_modules/investasi/_view/transaksi/view_invoice.tsx index 964513d9..ba740268 100644 --- a/src/app_modules/investasi/_view/transaksi/view_invoice.tsx +++ b/src/app_modules/investasi/_view/transaksi/view_invoice.tsx @@ -19,7 +19,7 @@ import { Text, } from "@mantine/core"; import { IconCamera, IconCircleCheck } from "@tabler/icons-react"; -import { useRouter } from "next/navigation"; +import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; import { MODEL_INVOICE_INVESTASI } from "../../_lib/interface"; import { investasi_funUploadBuktiTransferById } from "../../_fun"; @@ -33,18 +33,34 @@ import { notifikasiToAdmin_funCreate } from "@/app_modules/notifikasi/fun"; import { WibuRealtime } from "wibu-pkg"; import { clientLogger } from "@/util/clientLogger"; import { ComponentGlobal_ButtonUploadFileImage } from "@/app_modules/_global/component"; +import { useShallowEffect } from "@mantine/hooks"; +import { apiGetInvoiceById } from "../../_lib/api_fetch_new_investasi"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export function Investasi_ViewInvoice({ - dataInvoice, -}: { - dataInvoice: MODEL_INVOICE_INVESTASI; -}) { +export function Investasi_ViewInvoice() { + const param = useParams<{ id: string }>(); + const invoiceId = param.id; const router = useRouter(); const [isLoading, setLoading] = useState(false); - const [data, setData] = useState(dataInvoice); + const [data, setData] = useState(null); const [file, setFile] = useState(null); const [img, setImg] = useState(null); + useShallowEffect(() => { + onLoadData(); + }, [invoiceId]); + + async function onLoadData() { + try { + const response = await apiGetInvoiceById({ id: invoiceId }); + if (response.success) { + setData(response.data); + } + } catch (error) { + console.error("Error get invoice", error); + } + } + async function onUpload() { try { setLoading(true); @@ -60,7 +76,7 @@ export function Investasi_ViewInvoice({ } const res = await investasi_funUploadBuktiTransferById({ - invoiceId: data.id, + invoiceId: invoiceId as string, fileId: uploadFileToStorage.data.id, }); @@ -71,9 +87,9 @@ export function Investasi_ViewInvoice({ } const dataNotifikasi: IRealtimeData = { - appId: dataInvoice.Investasi.id, + appId: data?.Investasi.id, status: "Proses", - userId: dataInvoice.authorId as string, + userId: data?.authorId as string, pesan: "Bukti transfer telah diupload", kategoriApp: "INVESTASI", title: "Invoice baru", @@ -92,7 +108,7 @@ export function Investasi_ViewInvoice({ ComponentGlobal_NotifikasiBerhasil(res.message); - router.push(NEW_RouterInvestasi.proses_transaksi + data.id, { + router.push(NEW_RouterInvestasi.proses_transaksi + invoiceId, { scroll: false, }); } @@ -102,6 +118,10 @@ export function Investasi_ViewInvoice({ } } + if (!data) { + return + } + return ( <> diff --git a/src/app_modules/investasi/_view/transaksi/view_metode_pembayaran.tsx b/src/app_modules/investasi/_view/transaksi/view_metode_pembayaran.tsx index 3eb00487..8d456d3d 100644 --- a/src/app_modules/investasi/_view/transaksi/view_metode_pembayaran.tsx +++ b/src/app_modules/investasi/_view/transaksi/view_metode_pembayaran.tsx @@ -9,22 +9,20 @@ import { IRealtimeData } from "@/lib/global_state"; import { NEW_RouterInvestasi } from "@/lib/router_hipmi/router_investasi"; import { clientLogger } from "@/util/clientLogger"; import { Button, Paper, Radio, Stack, Title } from "@mantine/core"; -import { useLocalStorage } from "@mantine/hooks"; -import { useRouter } from "next/navigation"; +import { useLocalStorage, useShallowEffect } from "@mantine/hooks"; +import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; import { WibuRealtime } from "wibu-pkg"; import { investasi_funCreateInvoice } from "../../_fun/create/fun_create_invoice"; import { MODEL_MASTER_BANK } from "../../_lib/interface"; +import { apiGetMasterBank } from "@/app_modules/_global/lib/api_fetch_master"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export function Investasi_ViewMetodePembayaran({ - listBank, - investasiId, -}: { - listBank: MODEL_MASTER_BANK[]; - investasiId: string; -}) { +export function Investasi_ViewMetodePembayaran() { + // id = investasiId + const param = useParams<{ id: string }>(); const router = useRouter(); - const [bank, setBank] = useState(listBank); + const [bank, setBank] = useState([]); const [pilihBank, setPilihBank] = useState(""); const [isLoading, setLoading] = useState(false); const [total, setTotal] = useLocalStorage({ @@ -36,6 +34,25 @@ export function Investasi_ViewMetodePembayaran({ defaultValue: 0, }); + useShallowEffect(() => { + onLoadData(); + }, []); + + async function onLoadData() { + try { + const response = await apiGetMasterBank(); + + if (response.success) { + setBank(response.data); + } else { + setBank([]); + } + } catch (error) { + console.error("Error get investasi", error); + setBank([]); + } + } + async function onProses() { try { setLoading(true); @@ -43,7 +60,7 @@ export function Investasi_ViewMetodePembayaran({ data: { total: total, pilihBank: pilihBank, - investasiId: investasiId, + investasiId: param.id, jumlah: jumlah, }, }); @@ -55,7 +72,7 @@ export function Investasi_ViewMetodePembayaran({ } const dataNotifikasi: IRealtimeData = { - appId: investasiId, + appId: param.id, status: "Menunggu", userId: res.data?.authorId as string, pesan: "Menunggu transfer", @@ -85,6 +102,10 @@ export function Investasi_ViewMetodePembayaran({ } } + if (bank.length === 0) { + return ; + } + return ( <> diff --git a/src/app_modules/investasi/_view/transaksi/view_proses_transaksi.tsx b/src/app_modules/investasi/_view/transaksi/view_proses_transaksi.tsx index bbb434ef..118166a8 100644 --- a/src/app_modules/investasi/_view/transaksi/view_proses_transaksi.tsx +++ b/src/app_modules/investasi/_view/transaksi/view_proses_transaksi.tsx @@ -14,12 +14,34 @@ import { } from "@mantine/core"; import { IconBrandWhatsapp } from "@tabler/icons-react"; import Link from "next/link"; +import { useState } from "react"; +import { useShallowEffect } from "@mantine/hooks"; +import { apiGetAdminContact } from "@/app_modules/_global/lib/api_fetch_master"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export function Investasi_ViewProsesTransaksi({ - nomorAdmin, -}: { - nomorAdmin: any; -}) { +export function Investasi_ViewProsesTransaksi() { + const [nomorAdmin, setNomorAdmin] = useState(undefined); + + useShallowEffect(() => { + onLoadData(); + }, []); + + async function onLoadData() { + try { + const data = await apiGetAdminContact(); + if (data.success) { + setNomorAdmin(data.data.nomor); + } else { + console.error("Error get admin contact", data.message); + setNomorAdmin(undefined); + } + } catch (error) { + console.error("Error get admin contact", error); + setNomorAdmin(undefined); + } + } + + if (!nomorAdmin) return ; return ( <> @@ -47,7 +69,13 @@ export function Investasi_ViewProsesTransaksi({ Admin sedang memproses transaksimu -
+
@@ -92,7 +120,7 @@ export function Investasi_ViewProsesTransaksi({ textDecoration: "none", }} target="_blank" - href={`https://wa.me/+${nomorAdmin.nomor}?text=Hallo Admin , Saya ada kendala dalam proses transfer investasi !`} + href={`https://wa.me/+${nomorAdmin}?text=Hallo Admin , Saya ada kendala dalam proses transfer investasi !`} >