## Deskripsi:
- Cek notif
## No Issue
This commit is contained in:
2024-08-26 17:18:09 +08:00
parent a6bb993b0d
commit 916c5c7d85
183 changed files with 720 additions and 584 deletions

View File

@@ -1,11 +1,7 @@
import { ComponentInvestasi_FrameFileView } from "./file_view/frame_file_view";
import { ComponentInvestasi_BoxMetodePembayaran } from "./transaksi/box_metode_pembayaran";
import { ComponentInvestasi_BoxPembelian } from "./transaksi/box_pembelian";
import { ComponentInvestasi_ProsesAccAdmin } from "./transaksi/proses_acc_admin";
import { ComponentInvestasi_ViewInvoice } from "./transaksi/view_invoice";
import { Investasi_ComponentCardBeranda } from "./main/comp_card_beranda";
import { Investasi_ComponentFooterMain } from "./main/comp_footer_main";
import { Investasi_ComponentButtonUpdateBeranda } from "./main/comp_update_beranda";
export { ComponentInvestasi_BoxPembelian };
export { ComponentInvestasi_BoxMetodePembayaran };
export { ComponentInvestasi_FrameFileView };
export { ComponentInvestasi_ViewInvoice };
export { ComponentInvestasi_ProsesAccAdmin };
export { Investasi_ComponentFooterMain };
export { Investasi_ComponentCardBeranda };
export { Investasi_ComponentButtonUpdateBeranda };

View File

@@ -0,0 +1,161 @@
import { RouterInvestasi_OLD } from "@/app/lib/router_hipmi/router_investasi";
import { Warna } from "@/app/lib/warna";
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
import {
Card,
CardSection,
AspectRatio,
Box,
Stack,
Title,
Progress,
Group,
Image,
Text,
} from "@mantine/core";
import { IconCircleCheck, IconXboxX } from "@tabler/icons-react";
import moment from "moment";
import { MODEL_INVESTASI } from "../../_lib/interface";
import { useRouter } from "next/navigation";
import { useState } from "react";
import ComponentGlobal_CardLoadingOverlay from "@/app_modules/_global/loading_card";
export function Investasi_ComponentCardBeranda({
data,
}: {
data: MODEL_INVESTASI;
}) {
const router = useRouter();
const [isLoadingDetail, setLoadingDetail] = useState(false);
const [visible, setVisible] = useState(false);
return (
<>
<Card
style={{
padding: "15px",
backgroundColor: AccentColor.darkblue,
borderRadius: "10px",
border: `2px solid ${AccentColor.blue}`,
color: "white",
marginBottom: "15px",
marginInline: "15px",
}}
onClick={() => {
setLoadingDetail(true);
setVisible(true);
router.push(RouterInvestasi_OLD.detail + `${data?.id}`);
}}
>
<CardSection py={"md"} px={"sm"}>
<AspectRatio ratio={1 / 1} mah={250}>
<Box style={{ borderRadius: "7px" }}>
{data.imagesId ? (
<Image
radius={"sm"}
alt="Foto"
src={RouterInvestasi_OLD.api_gambar + `${data?.imagesId}`}
w={200}
/>
) : (
<Image alt="" src={"/aset/no-img.png"} />
)}
</Box>
</AspectRatio>
</CardSection>
<CardSection p={"md"}>
<Stack>
<Title align="center" order={3}>
{data?.title}
</Title>
{/* <Progress
label={(+e.progress).toFixed(2) + " %"}
value={+e.progress}
color="teal"
size="xl"
radius="xl"
/> */}
<Progress
label={
"" +
(
((+data?.totalLembar - +data?.sisaLembar) /
+data?.totalLembar) *
100
).toFixed(1) +
"%"
}
value={
+(
((+data?.totalLembar - +data?.sisaLembar) /
+data?.totalLembar) *
100
).toFixed(1)
}
color="teal"
size="xl"
radius="xl"
/>
</Stack>
</CardSection>
<CardSection p={"md"}>
<Group position="right">
{data?.progress === "100" ? (
<Group position="right" spacing={"xs"}>
<IconCircleCheck color="green" />
<Text
truncate
variant="text"
c={Warna.hijau_tua}
sx={{ fontFamily: "Greycliff CF, sans-serif" }}
ta="center"
fz="md"
fw={700}
>
Selesai
</Text>
</Group>
) : (
<Box>
{+data?.MasterPencarianInvestor.name -
moment(new Date()).diff(new Date(data?.countDown), "days") <=
0 ? (
<Group position="right" spacing={"xs"}>
<IconXboxX color="red" />
<Text
truncate
variant="text"
c={Warna.merah}
sx={{ fontFamily: "Greycliff CF, sans-serif" }}
ta="center"
fz="md"
fw={700}
>
Waktu Habis
</Text>
</Group>
) : (
<Group position="right" spacing={"xs"}>
<Text truncate>Sisa waktu:</Text>
<Text truncate>
{Number(data?.MasterPencarianInvestor.name) -
moment(new Date()).diff(
new Date(data?.countDown),
"days"
)}
</Text>
<Text truncate>Hari</Text>
</Group>
)}
</Box>
)}
</Group>
</CardSection>
{visible ? <ComponentGlobal_CardLoadingOverlay /> : ""}
</Card>
</>
);
}

View File

@@ -0,0 +1,73 @@
import { RouterInvestasi_OLD } from "@/app/lib/router_hipmi/router_investasi";
import { MainColor } from "@/app_modules/_global/color/color_pallet";
import { SimpleGrid, Stack, ActionIcon, Text } from "@mantine/core";
import {
IconChartHistogram,
IconChartPie,
IconCash,
IconNotes,
} from "@tabler/icons-react";
import { useAtom } from "jotai";
import { useRouter } from "next/navigation";
import { gs_investas_menu } from "../../g_state";
const listFooter = [
{
id: 1,
name: "Bursa",
route: RouterInvestasi_OLD.main,
icon: <IconChartHistogram />,
},
{
id: 2,
name: "Portofolio",
route: RouterInvestasi_OLD.main_porto,
icon: <IconChartPie />,
},
{
id: 3,
name: "Saham Saya",
route: RouterInvestasi_OLD.main_investasi,
icon: <IconCash />,
},
{
id: 4,
name: "Transaksi",
route: RouterInvestasi_OLD.main_transaksi,
icon: <IconNotes />,
},
];
export function Investasi_ComponentFooterMain() {
const router = useRouter();
const [hotMenu, setHotMenu] = useAtom(gs_investas_menu);
return (
<>
<SimpleGrid cols={listFooter.length} h={"9vh"} mx={"xs"}>
{listFooter.map((e, i) => (
<Stack key={i} align="center" justify="center" spacing={0}>
<ActionIcon
// disabled={e.path === "" ? true : false}
variant="transparent"
c={hotMenu === i ? MainColor.yellow : "white"}
onClick={() => {
router.push(e.route);
setHotMenu(i);
}}
>
{e.icon}
</ActionIcon>
<Text
c={hotMenu === i ? MainColor.yellow : "white"}
fz={"xs"}
lineClamp={1}
>
{e.name}
</Text>
</Stack>
))}
</SimpleGrid>
</>
);
}

View File

@@ -0,0 +1,52 @@
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
import { Affix, Button, Center, rem } from "@mantine/core";
import { useState } from "react";
import { investasi_funGetAllPublish } from "../../fun/get_all_investasi";
import { data } from "autoprefixer";
export function Investasi_ComponentButtonUpdateBeranda({
onLoadData,
}: {
onLoadData: (val: any) => void;
}) {
const [isLoading, setIsLoading] = useState(false);
async function onLoaded() {
try {
await investasi_funGetAllPublish({ page: 1 });
} catch (error) {
console.log(error);
} finally {
const loadData = await investasi_funGetAllPublish({ page: 1 });
onLoadData({
data: loadData,
isNewPost: false,
});
}
setIsLoading(true);
}
return (
<>
<Affix position={{ top: rem(100) }} w={"100%"}>
<Center>
<Button
style={{
transition: "0.5s",
border: `1px solid ${AccentColor.skyblue}`,
}}
bg={AccentColor.blue}
loaderPosition="center"
loading={isLoading ? true : false}
radius={"xl"}
onClick={() => onLoaded()}
>
Update beranda
</Button>
</Center>
</Affix>
</>
);
}

View File

@@ -0,0 +1,32 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
interface Model_Invoice_Masuk {
total: number;
jumlah: number;
pilihBank: string;
investasiId: string;
}
export async function investasi_funCreateInvoice({
data,
}: {
data: Model_Invoice_Masuk;
}) {
const authorId = await user_getOneUserId();
const create = await prisma.investasi_Invoice.create({
data: {
nominal: "" + data.total,
lembarTerbeli: "" + data.jumlah ,
masterBankId: data.pilihBank,
authorId: authorId,
investasiId: data.investasiId,
statusInvoiceId: "3",
},
});
if (!create) return { status: 400, message: "Gagal membuat invoice" };
return { status: 201, data: create, message: "Berhasil membuat invoice" };
}

View File

@@ -0,0 +1,21 @@
"use server";
import prisma from "@/app/lib/prisma";
export async function investasi_funGetInvoiceById({
invoiceId,
}: {
invoiceId: string;
}) {
const data = await prisma.investasi_Invoice.findFirst({
where: {
id: invoiceId,
},
include: {
MasterBank: true,
StatusInvoice: true,
},
});
return data;
}

View File

@@ -96,11 +96,12 @@ export interface Model_Dokumen_Investasi {
investasiId: string;
}
export interface MODEL_DATA_BANK {
export interface MODEL_MASTER_BANK {
id: string;
name: string;
namaBank: string;
namaAkun: string
norek: string;
active: boolean;
isActive: boolean;
createdAt: Date;
updatedAt: Date;
}

View File

@@ -1,11 +1,15 @@
import { Investasi_UiFileView } from "./file_view";
import { Investasi_UiInvoice } from "./transaksi/invoice";
import { Investasi_UiMetodePembayaran } from "./transaksi/metode_pembayaran";
import { Investasi_UiProsesPembelian } from "./transaksi/proses_pembelian";
import { Investasi_UiProsesTransaksi } from "./transaksi/proses_transaksi";
import { Investasi_UiFileView } from "./ui_file_view";
import { Investasi_UiInvoice } from "./transaksi/ui_invoice";
import { Investasi_UiMetodePembayaran } from "./transaksi/ui_metode_pembayaran";
import { Investasi_UiProsesPembelian } from "./transaksi/ui_proses_pembelian";
import { Investasi_UiProsesTransaksi } from "./transaksi/ui_proses_transaksi";
import { Investasi_UiBeranda } from "./main/ui_beranda";
import { Investasi_UiLayoutMain } from "./main/ui_layout_main";
export { Investasi_UiProsesPembelian };
export { Investasi_UiMetodePembayaran };
export { Investasi_UiFileView };
export { Investasi_UiInvoice };
export { Investasi_UiProsesTransaksi };
export { Investasi_UiBeranda };
export { Investasi_UiLayoutMain };

View File

@@ -0,0 +1,20 @@
"use client";
import mqtt_client from "@/util/mqtt_client";
import { useShallowEffect } from "@mantine/hooks";
import React, { useState } from "react";
import { Investasi_ComponentButtonUpdateBeranda } from "../../_component/main/comp_update_beranda";
import { MODEL_INVESTASI } from "../../_lib/interface";
import { Investasi_ViewBeranda } from "../../_view";
export function Investasi_UiBeranda({
dataInvestasi,
}: {
dataInvestasi: MODEL_INVESTASI[];
}) {
return (
<>
<Investasi_ViewBeranda dataInvestasi={dataInvestasi} />
</>
);
}

View File

@@ -0,0 +1,32 @@
"use client";
import { useAtom } from "jotai";
import { useRouter } from "next/navigation";
import React from "react";
import { gs_investas_menu } from "../../g_state";
import UIGlobal_LayoutTamplate from "@/app_modules/_global/ui/ui_layout_tamplate";
import { RouterCrowd } from "@/app/lib/router_hipmi/router_crowd";
import UIGlobal_LayoutHeaderTamplate from "@/app_modules/_global/ui/ui_header_tamplate";
import { Investasi_ComponentFooterMain } from "../../_component";
export function Investasi_UiLayoutMain({
children,
}: {
children: React.ReactNode;
}) {
return (
<>
<UIGlobal_LayoutTamplate
header={
<UIGlobal_LayoutHeaderTamplate
routerLeft={RouterCrowd.main}
title="Investasi"
/>
}
footer={<Investasi_ComponentFooterMain />}
>
{children}
</UIGlobal_LayoutTamplate>
</>
);
}

View File

@@ -1,15 +1,15 @@
"use client";
import UIGlobal_LayoutTamplate from "@/app_modules/_global/ui/ui_layout_tamplate";
import { ComponentInvestasi_ViewInvoice } from "../../_component";
import UIGlobal_LayoutHeaderTamplate from "@/app_modules/_global/ui/ui_header_tamplate";
import UIGlobal_LayoutTamplate from "@/app_modules/_global/ui/ui_layout_tamplate";
import { Investasi_ViewInvoice } from "../../_view";
export function Investasi_UiInvoice() {
return (
<UIGlobal_LayoutTamplate
header={<UIGlobal_LayoutHeaderTamplate title="Invoice" />}
>
<ComponentInvestasi_ViewInvoice dataInvoice={{}} />
<Investasi_ViewInvoice dataInvoice={{}} />
</UIGlobal_LayoutTamplate>
);
}

View File

@@ -2,15 +2,19 @@
import UIGlobal_LayoutHeaderTamplate from "@/app_modules/_global/ui/ui_header_tamplate";
import UIGlobal_LayoutTamplate from "@/app_modules/_global/ui/ui_layout_tamplate";
import { ComponentInvestasi_BoxMetodePembayaran } from "../../_component";
import { Investasi_ViewMetodePembayaran } from "../../_view";
export function Investasi_UiMetodePembayaran({ listBank }: { listBank: any[] }) {
export function Investasi_UiMetodePembayaran({
listBank,
}: {
listBank: any[];
}) {
return (
<>
<UIGlobal_LayoutTamplate
header={<UIGlobal_LayoutHeaderTamplate title="Metode Pembayaran" />}
>
<ComponentInvestasi_BoxMetodePembayaran listBank={listBank} />
<Investasi_ViewMetodePembayaran listBank={listBank} />
</UIGlobal_LayoutTamplate>
</>
);

View File

@@ -2,8 +2,7 @@
import UIGlobal_LayoutHeaderTamplate from "@/app_modules/_global/ui/ui_header_tamplate";
import UIGlobal_LayoutTamplate from "@/app_modules/_global/ui/ui_layout_tamplate";
import { ComponentInvestasi_BoxPembelian } from "../../_component";
import { Investasi_ViewProsesPembelian } from "../../_view";
export function Investasi_UiProsesPembelian({
dataInvestasi,
@@ -15,7 +14,7 @@ export function Investasi_UiProsesPembelian({
<UIGlobal_LayoutTamplate
header={<UIGlobal_LayoutHeaderTamplate title="Pembelian Saham" />}
>
<ComponentInvestasi_BoxPembelian dataInvestasi={dataInvestasi} />
<Investasi_ViewProsesPembelian dataInvestasi={dataInvestasi} />
</UIGlobal_LayoutTamplate>
</>
);

View File

@@ -1,9 +1,9 @@
"use client";
import UIGlobal_LayoutTamplate from "@/app_modules/_global/ui/ui_layout_tamplate";
import { ComponentInvestasi_ProsesAccAdmin } from "../../_component";
import UIGlobal_LayoutHeaderTamplate from "@/app_modules/_global/ui/ui_header_tamplate";
import UIGlobal_LayoutTamplate from "@/app_modules/_global/ui/ui_layout_tamplate";
import { IconX } from "@tabler/icons-react";
import { Investasi_ViewProsesTransaksi } from "../../_view";
export function Investasi_UiProsesTransaksi() {
return (
@@ -16,7 +16,7 @@ export function Investasi_UiProsesTransaksi() {
/>
}
>
<ComponentInvestasi_ProsesAccAdmin />
<Investasi_ViewProsesTransaksi />
</UIGlobal_LayoutTamplate>
</>
);

View File

@@ -1,14 +1,11 @@
"use client";
import UIGlobal_LayoutHeaderTamplate from "@/app_modules/_global/ui/ui_header_tamplate";
import UIGlobal_LayoutTamplate from "@/app_modules/_global/ui/ui_layout_tamplate";
import { ComponentInvestasi_FrameFileView } from "../_component";
import { MODEl_PROSPEKTUS_INVESTASI } from "../_lib/interface";
import { RouterInvestasi_OLD } from "@/app/lib/router_hipmi/router_investasi";
import { ActionIcon, Box, Container, Group, Header, rem } from "@mantine/core";
import { MainColor } from "@/app_modules/_global/color/color_pallet";
import { IconChevronLeft, IconX } from "@tabler/icons-react";
import { ActionIcon, Box, Container, Group, Header, rem } from "@mantine/core";
import { IconX } from "@tabler/icons-react";
import { useRouter } from "next/navigation";
import { Investasi_ViewFileViewer } from "../_view";
export function Investasi_UiFileView({ prospekId }: { prospekId: string }) {
return (
@@ -31,7 +28,7 @@ export function Investasi_UiFileView({ prospekId }: { prospekId: string }) {
<Container mih={"100vh"} p={0} size={rem(500)} bg={MainColor.black}>
<HeaderView />
<ComponentInvestasi_FrameFileView
<Investasi_ViewFileViewer
fileId={prospekId}
path={RouterInvestasi_OLD.api_file_prospektus}
/>

View File

@@ -1,27 +1,23 @@
import { Stack } from "@mantine/core";
// import { useState } from "react";
// import { Document, Page, pdfjs } from "react-pdf";
// import "react-pdf/dist/Page/AnnotationLayer.css";
// import "react-pdf/dist/Page/TextLayer.css";
// import styles from "./styles.module.css";
import { useState } from "react";
import { Document, Page, pdfjs } from "react-pdf";
import "react-pdf/dist/Page/AnnotationLayer.css";
import "react-pdf/dist/Page/TextLayer.css";
import styles from "./styles.module.css";
// pdfjs.GlobalWorkerOptions.workerSrc = new URL(
// "pdfjs-dist/build/pdf.worker.min.mjs",
// import.meta.url
// ).toString();
export function ComponentInvestasi_FrameFileView({
export function Investasi_ViewFileViewer({
fileId,
path,
}: {
fileId: string;
path: string;
}) {
return (
<Stack>
{/* <MyFile file={path + fileId} /> */}
</Stack>
);
return <Stack>{/* <MyFile file={path + fileId} /> */}</Stack>;
}
// function MyFile({ file }: { file: any }) {

View File

@@ -0,0 +1,13 @@
import { Investasi_ViewFileViewer } from "./file_view/view_file_viewer";
import { Investasi_ViewBeranda } from "./main/view_beranda";
import { Investasi_ViewInvoice } from "./transaksi/view_invoice";
import { Investasi_ViewMetodePembayaran } from "./transaksi/view_metode_pembayaran";
import { Investasi_ViewProsesPembelian } from "./transaksi/view_proses_pembelian";
import { Investasi_ViewProsesTransaksi } from "./transaksi/view_proses_transaksi";
export { Investasi_ViewProsesPembelian };
export { Investasi_ViewMetodePembayaran };
export { Investasi_ViewInvoice };
export { Investasi_ViewProsesTransaksi };
export { Investasi_ViewFileViewer };
export { Investasi_ViewBeranda };

View File

@@ -0,0 +1,73 @@
import { RouterInvestasi_OLD } from "@/app/lib/router_hipmi/router_investasi";
import ComponentGlobal_CreateButton from "@/app_modules/_global/component/button_create";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import ComponentGlobal_Loader from "@/app_modules/_global/component/loader";
import mqtt_client from "@/util/mqtt_client";
import { Box, Center } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
import _ from "lodash";
import { ScrollOnly } from "next-scroll-loader";
import { useState } from "react";
import { Investasi_ComponentButtonUpdateBeranda } from "../../_component";
import { Investasi_ComponentCardBeranda } from "../../_component/main/comp_card_beranda";
import { investasi_funGetAllPublish } from "../../fun/get_all_investasi";
export function Investasi_ViewBeranda({
dataInvestasi,
}: {
dataInvestasi: any[];
}) {
const [data, setData] = useState(dataInvestasi);
const [activePage, setActivePage] = useState(1);
const [isNewPost, setIsNewPost] = useState(false);
useShallowEffect(() => {
mqtt_client.subscribe("Beranda_Investasi");
mqtt_client.on("message", (topic, message) => {
const newPost = JSON.parse(message.toString());
setIsNewPost(newPost);
});
}, []);
return (
<>
{isNewPost && (
<Investasi_ComponentButtonUpdateBeranda
onLoadData={(val) => {
setData(val.data);
setIsNewPost(val.isNewPost);
}}
/>
)}
<Box>
<ComponentGlobal_CreateButton path={RouterInvestasi_OLD.create} />
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
<ScrollOnly
height="82vh"
renderLoading={() => (
<Center>
<ComponentGlobal_Loader size={25} />
</Center>
)}
data={data}
setData={setData}
moreData={async () => {
const loadData = await investasi_funGetAllPublish({
page: activePage + 1,
});
setActivePage((val) => val + 1);
return loadData;
}}
>
{(item) => <Investasi_ComponentCardBeranda data={item as any} />}
</ScrollOnly>
)}
</Box>
</>
);
}

View File

@@ -22,7 +22,7 @@ import { IconCamera, IconCircleCheck } from "@tabler/icons-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
export function ComponentInvestasi_ViewInvoice({
export function Investasi_ViewInvoice({
dataInvoice,
}: {
dataInvoice: any;

View File

@@ -8,7 +8,7 @@ import { useLocalStorage } from "@mantine/hooks";
import { useRouter } from "next/navigation";
import { useState } from "react";
export function ComponentInvestasi_BoxMetodePembayaran({
export function Investasi_ViewMetodePembayaran({
listBank,
}: {
listBank: any[];

View File

@@ -20,7 +20,7 @@ import { MODEL_INVESTASI } from "../../_lib/interface";
import { gs_investas_menu } from "../../g_state";
import { NEW_RouterInvestasi } from "../../../../app/lib/router_hipmi/router_investasi";
export function ComponentInvestasi_BoxPembelian({
export function Investasi_ViewProsesPembelian({
dataInvestasi,
}: {
dataInvestasi: MODEL_INVESTASI;

View File

@@ -1,21 +1,18 @@
import { Warna } from "@/app/lib/warna";
import {
AccentColor,
MainColor,
} from "@/app_modules/_global/color/color_pallet";
import {
Stack,
Paper,
Title,
Center,
Loader,
Group,
Loader,
Paper,
Stack,
Text,
Title,
} from "@mantine/core";
import { IconBrandWhatsapp } from "@tabler/icons-react";
import Link from "next/link";
export function ComponentInvestasi_ProsesAccAdmin() {
export function Investasi_ViewProsesTransaksi() {
return (
<>
<Stack>

View File

@@ -3,7 +3,10 @@
import prisma from "@/app/lib/prisma";
import moment from "moment";
export async function investasi_funGetAllPublish() {
export async function investasi_funGetAllPublish({ page }: { page: number }) {
const takeData = 5;
const skipData = page * takeData - takeData;
const data = await prisma.investasi.findMany({
where: {
masterStatusInvestasiId: "1",
@@ -23,8 +26,6 @@ export async function investasi_funGetAllPublish() {
moment(new Date()).diff(new Date(a.countDown as any), "days") <=
0
) {
// console.log(a.MasterPencarianInvestor?.name);
await prisma.investasi.update({
where: {
id: a.id,
@@ -51,34 +52,25 @@ export async function investasi_funGetAllPublish() {
// klo ada, update status
const dataFix = await prisma.investasi.findMany({
take: takeData,
skip: skipData,
orderBy: [
{
masterProgresInvestasiId: "asc",
},
{
countDown: "desc",
},
],
where: {
masterStatusInvestasiId: "1",
},
select: {
id: true,
title: true,
authorId: true,
hargaLembar: true,
targetDana: true,
totalLembar: true,
sisaLembar: true,
progress: true,
roi: true,
active: true,
createdAt: true,
updatedAt: true,
imagesId: true,
include: {
ProspektusInvestasi: true,
MasterPembagianDeviden: true,
MasterPencarianInvestor: true,
MasterPeriodeDeviden: true,
MasterProgresInvestasi: true,
countDown: true,
},
});

View File

@@ -6,7 +6,7 @@ export default async function getNorekInvestasi(id: string) {
const res = await prisma.masterBank.findUnique({
where: { id: id },
select: {
name: true,
namaBank: true,
norek: true,
},
});

View File

@@ -1,5 +1,3 @@
import MainInvestasi from "./main/view";
import LayoutMainInvestasi from "./main/layout";
import InvestasiCreate from "./create/view";
import InvestasiCreateLayout from "./create/layout";
import UploadGambarInvestasi from "./upload/view";
@@ -69,8 +67,6 @@ import StatusPesananInvetsatsi from "./status_pesanan/view";
import LayoutStatusPesananInvestasi from "./status_pesanan/layout";
export {
MainInvestasi,
LayoutMainInvestasi,
InvestasiCreate,
InvestasiCreateLayout,
UploadGambarInvestasi,

View File

@@ -1,137 +0,0 @@
"use client";
import { RouterCrowd } from "@/app/lib/router_hipmi/router_crowd";
import { RouterInvestasi_OLD } from "@/app/lib/router_hipmi/router_investasi";
import { MainColor } from "@/app_modules/_global/color/color_pallet";
import UIGlobal_LayoutHeaderTamplate from "@/app_modules/_global/ui/ui_header_tamplate";
import UIGlobal_LayoutTamplate from "@/app_modules/_global/ui/ui_layout_tamplate";
import {
ActionIcon,
SimpleGrid,
Stack,
Text
} from "@mantine/core";
import {
IconCash,
IconChartHistogram,
IconChartPie,
IconNotes,
} from "@tabler/icons-react";
import { useAtom } from "jotai";
import { useRouter } from "next/navigation";
import React from "react";
import { gs_investas_menu } from "../g_state";
export default function LayoutMainInvestasi({
children,
}: {
children: React.ReactNode;
}) {
const router = useRouter();
const [active, setActive] = useAtom(gs_investas_menu);
const listFooter = [
{
id: 1,
name: "Bursa",
route: RouterInvestasi_OLD.main,
icon: <IconChartHistogram />,
},
{
id: 2,
name: "Portofolio",
route: RouterInvestasi_OLD.main_porto,
icon: <IconChartPie />,
},
{
id: 3,
name: "Saham Saya",
route: RouterInvestasi_OLD.main_investasi,
icon: <IconCash />,
},
{
id: 4,
name: "Transaksi",
route: RouterInvestasi_OLD.main_transaksi,
icon: <IconNotes />,
},
];
return (
<>
<UIGlobal_LayoutTamplate
header={
<UIGlobal_LayoutHeaderTamplate
routerLeft={RouterCrowd.main}
title="Investasi"
// icon={<IconPencilPlus />}
// route2={"/dev/investasi/create"}
/>
}
footer={
<SimpleGrid cols={listFooter.length} h={"9vh"} mx={"xs"}>
{listFooter.map((e, i) => (
<Stack key={i} align="center" justify="center" spacing={0}>
<ActionIcon
// disabled={e.path === "" ? true : false}
variant="transparent"
c={active === i ? MainColor.yellow : "white"}
onClick={
() => {
router.push(e.route);
setActive(i);
}
// e.route === ""
// ? ComponentGlobal_NotifikasiPeringatan("Cooming Soon")
// : (router.replace(e.route), setActive(i))
}
>
{e.icon}
</ActionIcon>
<Text
c={active === i ? MainColor.yellow : "white"}
fz={"xs"}
lineClamp={1}
>
{e.name}
</Text>
</Stack>
))}
</SimpleGrid>
// <Footer height={"10vh"} bg={"black"}>
// <Grid align="center" h={"10vh"} pt={"xs"} grow>
// {listFooter.map((e, k) => (
// <Grid.Col
// key={e.id}
// span={3}
// onClick={() => {
// router.push(e.route);
// setActive(k);
// }}
// >
// <Center h={"100%"}>
// <Flex direction={"column"} align={"center"} w={"100%"}>
// <ActionIcon
// variant="transparent"
// c={active === k ? "blue" : "white"}
// >
// {e.icon}
// </ActionIcon>
// <Text c={active === k ? "blue" : "white"} fz={"xs"}>
// {e.name}
// </Text>
// </Flex>
// </Center>
// </Grid.Col>
// ))}
// </Grid>
// </Footer>
}
>
{children}
</UIGlobal_LayoutTamplate>
</>
);
}

View File

@@ -1,237 +0,0 @@
"use client";
import { RouterInvestasi_OLD } from "@/app/lib/router_hipmi/router_investasi";
import { Warna } from "@/app/lib/warna";
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
import ComponentGlobal_CreateButton from "@/app_modules/_global/component/button_create";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import {
Affix,
AspectRatio,
Box,
Button,
Card,
CardSection,
Group,
Image,
Progress,
rem,
Stack,
Text,
Title,
} from "@mantine/core";
import { useShallowEffect, useWindowScroll } from "@mantine/hooks";
import { IconCircleCheck, IconXboxX } from "@tabler/icons-react";
import _ from "lodash";
import moment from "moment";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { MODEL_INVESTASI } from "../_lib/interface";
import mqtt_client from "@/util/mqtt_client";
import { investasi_funGetAllPublish } from "../fun/get_all_investasi";
export default function MainInvestasi({
listData,
}: {
listData: MODEL_INVESTASI[];
}) {
// console.log(listData)
const router = useRouter();
const [data, setData] = useState(listData);
const [isLoadingDetail, setLoadingDetail] = useState(false);
const [isNewPost, setIsNewPost] = useState(false);
// console.log(dataWaktuHabis)
useShallowEffect(() => {
mqtt_client.subscribe("Beranda_Investasi");
mqtt_client.on("message", (topic, message) => {
const newPost = JSON.parse(message.toString());
setIsNewPost(newPost);
});
}, []);
return (
<>
{isNewPost && (
<Affix position={{ top: rem(100) }} w={"100%"}>
<ButtonUpdateBeranda
onLoadData={(val) => {
setData(val.data);
setIsNewPost(val.isNewPost);
}}
/>
</Affix>
)}
<ComponentGlobal_CreateButton path={RouterInvestasi_OLD.create} />
{_.isEmpty(data) ? (
<ComponentGlobal_IsEmptyData />
) : (
data.map((e) => (
<Card
key={e.id}
style={{
padding: "15px",
backgroundColor: AccentColor.darkblue,
borderRadius: "10px",
border: `2px solid ${AccentColor.blue}`,
color: "white",
marginBottom: "15px",
marginInline: "15px",
}}
onClick={() => {
setLoadingDetail(true);
router.push(RouterInvestasi_OLD.detail + `${e.id}`);
}}
>
<CardSection py={"md"} px={"sm"}>
<AspectRatio ratio={1 / 1} mah={250}>
<Box style={{ borderRadius: "7px" }}>
{e.imagesId ? (
<Image
radius={"sm"}
alt="Foto"
src={RouterInvestasi_OLD.api_gambar + `${e.imagesId}`}
w={200}
/>
) : (
<Image alt="" src={"/aset/no-img.png"} />
)}
</Box>
</AspectRatio>
</CardSection>
<CardSection p={"md"}>
<Stack>
<Title align="center" order={3}>
{e.title}
</Title>
{/* <Progress
label={(+e.progress).toFixed(2) + " %"}
value={+e.progress}
color="teal"
size="xl"
radius="xl"
/> */}
<Progress
label={
"" +
(
((+e.totalLembar - +e.sisaLembar) / +e.totalLembar) *
100
).toFixed(1) +
"%"
}
value={
+(
((+e.totalLembar - +e.sisaLembar) / +e.totalLembar) *
100
).toFixed(1)
}
color="teal"
size="xl"
radius="xl"
/>
</Stack>
</CardSection>
<CardSection p={"md"}>
<Group position="right">
{e.progress === "100" ? (
<Group position="right" spacing={"xs"}>
<IconCircleCheck color="green" />
<Text
truncate
variant="text"
c={Warna.hijau_tua}
sx={{ fontFamily: "Greycliff CF, sans-serif" }}
ta="center"
fz="md"
fw={700}
>
Selesai
</Text>
</Group>
) : (
<Box>
{+e.MasterPencarianInvestor.name -
moment(new Date()).diff(new Date(e.countDown), "days") <=
0 ? (
<Group position="right" spacing={"xs"}>
<IconXboxX color="red" />
<Text
truncate
variant="text"
c={Warna.merah}
sx={{ fontFamily: "Greycliff CF, sans-serif" }}
ta="center"
fz="md"
fw={700}
>
Waktu Habis
</Text>
</Group>
) : (
<Group position="right" spacing={"xs"}>
<Text truncate>Sisa waktu:</Text>
<Text truncate>
{Number(e.MasterPencarianInvestor.name) -
moment(new Date()).diff(
new Date(e.countDown),
"days"
)}
</Text>
<Text truncate>Hari</Text>
</Group>
)}
</Box>
)}
</Group>
</CardSection>
</Card>
))
)}
</>
);
}
function ButtonUpdateBeranda({
onLoadData,
}: {
onLoadData: (val: any) => void;
}) {
const [isLoading, setIsLoading] = useState(false);
async function onLoaded() {
const loadData = await investasi_funGetAllPublish();
onLoadData({
data: loadData,
isNewPost: false,
});
setIsLoading(true);
}
return (
<>
<center>
<Button
style={{
transition: "0.5s",
border: `1px solid ${AccentColor.skyblue}`,
}}
bg={AccentColor.blue}
loaderPosition="center"
loading={isLoading ? true : false}
radius={"xl"}
onClick={() => onLoaded()}
>
Update beranda
</Button>
</center>
</>
);
}

View File

@@ -21,7 +21,7 @@ import toast from "react-simple-toasts";
import {
MODEL_INVESTASI,
MODEL_Transaksi_Investasi,
MODEL_DATA_BANK,
MODEL_MASTER_BANK,
} from "../_lib/interface";
import { useAtom } from "jotai";
import { gs_TransferValue } from "../g_state";
@@ -36,7 +36,7 @@ export default function MetodeTransferInvestasi({
authorId,
}: {
dataInvestasi: MODEL_INVESTASI;
namaBank: MODEL_DATA_BANK[];
namaBank: MODEL_MASTER_BANK[];
authorId: string;
}) {
const [investasi, setInvestasi] = useState(dataInvestasi);
@@ -66,7 +66,7 @@ export default function MetodeTransferInvestasi({
if (res.status === 200) {
setTransferValue({
...transferValue,
namaBank: res.res?.name as any,
namaBank: res.res?.namaBank as any,
nomorRekening: res.res?.norek as any,
});
} else {
@@ -100,7 +100,7 @@ export default function MetodeTransferInvestasi({
<Flex direction={"column"} gap={"lg"} mt="xs">
{bank.map((e) => (
<Box key={e.id}>
<Radio value={e.id} label={e.name} />
<Radio value={e.id} label={e.namaBank} />
</Box>
))}
</Flex>

View File

@@ -1,32 +1,17 @@
"use client";
import { RouterInvestasi_OLD } from "@/app/lib/router_hipmi/router_investasi";
import {
Badge,
Box,
Center,
Group,
Paper,
Stack,
Text,
Title,
} from "@mantine/core";
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import { Box, Group, Paper, Stack, Text, Title } from "@mantine/core";
import _ from "lodash";
import moment from "moment";
import { useRouter } from "next/navigation";
import toast from "react-simple-toasts";
import { useState } from "react";
import {
MODEL_Transaksi_Investasi,
Model_Status_Transaksi_Investasi,
} from "../_lib/interface";
import { useState } from "react";
import moment from "moment";
import funCountDown from "../fun/fun_countdown_investasi";
import funGantiStatusTransaksi_Investasi from "../fun/fun_ganti_status_transaksi";
import { useInterval, useShallowEffect } from "@mantine/hooks";
import _ from "lodash";
import Link from "next/link";
import ComponentInvestasi_IsEmptyData from "../component/is_empty_data";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
export default function TransaksiInvestasi({
statusTransaksi,
@@ -58,7 +43,7 @@ export default function TransaksiInvestasi({
}
}
if (_.isEmpty(transaksi)) return <ComponentGlobal_IsEmptyData />;
if (_.isEmpty(transaksi)) return <ComponentGlobal_IsEmptyData text="Tidak ada transaksi" />;
return (
<>