Alur Payment

# feat
- Pembelian saham
- Function progres
### No Issue
This commit is contained in:
2023-12-12 13:56:39 +08:00
parent 26a7b988df
commit 693bb65710
126 changed files with 1204 additions and 316 deletions

4
.env
View File

@@ -5,4 +5,6 @@
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
DATABASE_URL="postgresql://bip:Production_123@localhost:5433/hipmi?schema=public"
PWD="QWERTYUIOPLKJHGFDSAZXCVBNMQAZWSXEDCRFVTGBYHNUJMIKOLPPOIUYTREWQLKJHGFDSAMNBVCXZlghvftyguhijknhbgvcfytguu8okjnhbgvfty7u8oilkjnhgvtygu7u8ojilnkhbgvhujnkhghvjhukjnhb"
PWD="QWERTYUIOPLKJHGFDSAZXCVBNMQAZWSXEDCRFVTGBYHNUJMIKOLPPOIUYTREWQLKJHGFDSAMNBVCXZlghvftyguhijknhbgvcfytguu8okjnhbgvfty7u8oilkjnhgvtygu7u8ojilnkhbgvhujnkhghvjhukjnhb"
Client_KEY="SB-Mid-client-9NDTxltqdZrEB9m-"
Server_KEY="SB-Mid-server-NyltU-U7fLVQd1nv1LWBKylr"

View File

@@ -30,6 +30,7 @@
"iron-session": "^6.3.1",
"jotai": "^2.4.3",
"lodash": "^4.17.21",
"midtrans-client": "^1.3.1",
"moment": "^2.29.4",
"next": "^13.5.4-canary.8",
"postcss": "8.4.27",

View File

@@ -100,21 +100,23 @@ model MasterBidangBisnis {
// -------------------- INVESTASI --------------------- //
// Table investasi / saham
model Investasi {
id String @id @default(cuid())
title String
targetDana String
hargaLembar String
totalLembar String
roi String
active Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
author User? @relation(fields: [authorId], references: [id])
id String @id @default(cuid())
title String
targetDana String
hargaLembar String
totalLembar String
roi String
active Boolean @default(true)
countDown DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
author User? @relation(fields: [authorId], references: [id])
authorId String?
catatan String?
sisaLembar String
lembarTerbeli String? @default("0")
progress String? @default("0")
lembarTerbeli String? @default("0")
progress String? @default("0")
MasterPeriodeDeviden MasterPeriodeDeviden? @relation(fields: [masterPeriodeDevidenId], references: [id])
masterPeriodeDevidenId String?
@@ -218,16 +220,31 @@ model MasterBank {
}
model TransaksiInvestasi {
id String @id @default(cuid())
Investasi Investasi? @relation(fields: [investasiId], references: [id])
investasiId String?
Author User? @relation(fields: [authorId], references: [id])
authorId String?
id String @id @default(cuid())
Investasi Investasi @relation(fields: [investasiId], references: [id])
investasiId String
Author User @relation(fields: [authorId], references: [id])
authorId String
namaBank String?
nomorRekening String?
token String?
redirect_url String?
quantity String
price String
gross_amount String
merchant_name String
status_code String?
status_message String?
transaction_id String?
order_id String?
payment_type String?
transaction_time String?
transaction_status String?
fraud_status String?
pdf_url String?
finish_redirect_url String?
namaBank String
nomorRekening String
lembarTerbeli String
totalTransfer String
active Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

View File

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

View File

Before

Width:  |  Height:  |  Size: 263 KiB

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 132 KiB

View File

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View File

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

View File

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

View File

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 KiB

1
public/file/index.ts Normal file
View File

@@ -0,0 +1 @@
// Image for file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View File

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

View File

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 KiB

View File

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 268 KiB

View File

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 202 KiB

View File

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

View File

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

View File

@@ -0,0 +1 @@
// Image for investasi

View File

@@ -6,6 +6,7 @@ export async function GET(
req: NextRequest,
{ params }: { params: { id: string } }
) {
console.log(params.id)
const data = await prisma.prospektusInvestasi.findUnique({
where: { id: params.id },
select: {

View File

@@ -1,11 +1,12 @@
import { DetailPropektus } from "@/app_modules/investasi";
import getOneInvestasiById from "@/app_modules/investasi/fun/get_one_investasi_by_id";
export default async function Page({params}:{params: {id: string}}) {
const dataInvestasi = await getOneInvestasiById(params.id)
export default async function Page({ params }: { params: { id: string } }) {
const dataInvestasi = await getOneInvestasiById(params.id);
return<>
<DetailPropektus dataInvestasi={dataInvestasi as any}/>
return (
<>
<DetailPropektus dataInvestasi={dataInvestasi as any} />
</>
}
);
}

View File

@@ -1,5 +1,13 @@
import { DetailSahamTerbeli } from "@/app_modules/investasi";
import funTotalInvestorByIdInvestasi from "@/app_modules/investasi/fun/fun_total_investor_by_id";
import getOneTransaksiBerhasilByIdInvestasi from "@/app_modules/investasi/fun/get_one_transaksi_berhasil_by_id";
export default async function Page({ params }: { params: { id: string } }) {
return <DetailSahamTerbeli id={params.id} />;
const dataTransaksi = await getOneTransaksiBerhasilByIdInvestasi(params.id);
const investor = await funTotalInvestorByIdInvestasi(
dataTransaksi?.Investasi.id as any
);
// console.log(investor);
return <DetailSahamTerbeli dataTransaksi={dataTransaksi as any} investor={investor} />;
}

View File

@@ -1,9 +1,23 @@
import { InvestasiSahamTerbeli } from "@/app_modules/investasi";
import getListTransaksiBerhasilInvestasi from "@/app_modules/investasi/fun/get_list_transaksi_berhasil_by_id";
import yaml from "yaml";
import fs from "fs";
import { cookies } from "next/headers";
import { unsealData } from "iron-session";
const config = yaml.parse(fs.readFileSync("config.yaml").toString());
export default async function Page() {
const c = cookies().get("ssn");
const user = JSON.parse(
await unsealData(c?.value as string, {
password: config.server.password,
})
);
const listTransaksi = await getListTransaksiBerhasilInvestasi(user.id)
// console.log(listTransaksi)
return (
<>
<InvestasiSahamTerbeli />
<InvestasiSahamTerbeli listTransaksi={listTransaksi as any} />
</>
);
}

View File

@@ -20,6 +20,7 @@ export default async function Page() {
const userId = tkn.id;
const statusTransaksi = await getMaster_StatusTransaksiInvestasi();
const listTransaksi = await getListAllTransaksiById_Investasi(userId);
// console.log(listTransaksi)
return (
<>

View File

@@ -0,0 +1,12 @@
import { LayoutProsesTransaksiInvestasi } from "@/app_modules/investasi";
import React from "react";
export default async function Layout({
children,
}: {
children: React.ReactNode;
}) {
return (
<LayoutProsesTransaksiInvestasi>{children}</LayoutProsesTransaksiInvestasi>
);
}

View File

@@ -0,0 +1,29 @@
import { ProsesTransaksiInvestasi } from "@/app_modules/investasi";
import getOneInvestasiById from "@/app_modules/investasi/fun/get_one_investasi_by_id";
import { unsealData } from "iron-session";
import { cookies } from "next/headers";
import { funGetUserProfile } from "@/app_modules/fun/get_user_profile";
import yaml from "yaml";
import fs from "fs";
const config = yaml.parse(fs.readFileSync("config.yaml").toString());
export default async function Page({ params }: { params: { id: string } }) {
const c = cookies().get("ssn");
const user = JSON.parse(
await unsealData(c?.value as string, {
password: config.server.password,
})
);
const userLogin = await funGetUserProfile(user.id);
const dataInvestasi = await getOneInvestasiById(params.id);
// console.log(userLogin);
return (
<>
<ProsesTransaksiInvestasi
dataInvestasi={dataInvestasi as any}
userLogin={userLogin as any}
/>
</>
);
}

View File

@@ -18,6 +18,7 @@ export const RouterInvestasi = {
// proses beli saham
proses_investasi: "/dev/investasi/proses_investasi/",
proses_transaksi: "/dev/investasi/proses_transaksi/",
status_transaksi: "/dev/investasi/status_transaksi/berhasil",
status_transaksi_gagal: "/dev/investasi/status_transaksi/gagal/",
metode_transfer: "/dev/investasi/metode_transfer/",
@@ -30,6 +31,7 @@ export const RouterInvestasi = {
edit_berita: "/dev/investasi/edit_berita/",
// detail //
detail: "/dev/investasi/detail/",
detail_portofolio: "",
detail_saham_terbeli: "/dev/investasi/detail_saham_terbeli/",
detail_prospektus: "/dev/investasi/detail_prospektus/",

View File

@@ -1,9 +1,15 @@
"use client"
import { Title } from "@mantine/core"
import { Divider, Stack, Title } from "@mantine/core"
export default function Admin_Award(){
return<>
<Title>halaman award</Title>
<Stack spacing={"sm"}>
<Title>Award</Title>
<Divider mb={"md"} />
<Stack align="center" justify="center" h={"80vh"}>
<Title>Cooming Soon !!</Title>
</Stack>
</Stack>
</>
}

View File

@@ -55,6 +55,7 @@ import toast, { toastConfig } from "react-simple-toasts";
import Admin_funRejectInvestasi from "../fun/fun_reject_investasi";
import { RouterAdminInvestasi } from "@/app/lib/router_hipmi/router_admin";
import "react-simple-toasts/dist/theme/dark.css";
import { BeritaInvestasi } from "@/app_modules/investasi";
toastConfig({ theme: "dark" });
@@ -112,7 +113,7 @@ export default function Admin_KonfirmasiInvestasi({
await Admin_funRejectInvestasi(body).then((res) => {
if (res.status === 200) {
toast(res.message);
router.back()
router.back();
toggle();
} else {
toast(res.message);
@@ -292,6 +293,13 @@ export default function Admin_KonfirmasiInvestasi({
</Text>
</Stack>
)}
{publish &&
investasi.MasterStatusInvestasi.id === "3" &&
_.isEmpty(investasi.BeritaInvestasi) ? (
<BeritaInvestasi dataInvestasi={investasi} />
) : (
""
)}
</Grid.Col>
{/* Note dan dokumen */}
<Grid.Col span={6}>
@@ -370,10 +378,10 @@ export default function Admin_KonfirmasiInvestasi({
minRows={2}
maxRows={4}
value={investasi.catatan === null ? [] : investasi.catatan}
onChange={(val) =>
onChange={(val) =>
setInvestasi({
...investasi,
catatan: val.target.value
catatan: val.target.value,
})
}
/>

View File

@@ -23,6 +23,7 @@ export default function TablePublikasiProgresInvestasi({
radius={"md"}
bg={"gray.4"}
p={"sm"}
h={400}
// sx={{ borderStyle: "solid", borderColor: "teal" }}
>
<Stack spacing={"xl"}>

View File

@@ -72,10 +72,8 @@ export default function Admin_TablePublishInvestasi({
return (
<>
<Stack>
<ActionIcon
variant="outline"
onClick={() => router.push(RouterAdminInvestasi.main_investasi)}
>
<ActionIcon variant="outline" onClick={() => router.push(RouterAdminInvestasi.main_investasi)}>
<IconChevronLeft />
</ActionIcon>
<Box>

View File

@@ -61,7 +61,8 @@ export default function Admin_TableRejectInvestasi({
return (
<>
<Stack>
<ActionIcon variant="outline" onClick={() => router.back()}>
<ActionIcon variant="outline" onClick={() => router.push(RouterAdminInvestasi.main_investasi)}>
<IconChevronLeft />
</ActionIcon>
<Box>

View File

@@ -71,7 +71,7 @@ export default function Admin_TableReviewInvestasi({
return (
<>
<Stack>
<ActionIcon variant="outline" onClick={() => router.back()}>
<ActionIcon variant="outline" onClick={() => router.push(RouterAdminInvestasi.main_investasi)}>
<IconChevronLeft />
</ActionIcon>
<Box>

View File

@@ -20,15 +20,15 @@ export default function TableTotalInvestasi({
<Paper
radius={"md"}
bg={"gray.4"}
p={"sm"}
h={400}
// sx={{ borderStyle: "solid", borderColor: "teal" }}
>
<Stack spacing={"xl"}>
<Center>
<Title order={4}>Total Investasi Pengguna</Title>
</Center>
<Table bg={"gray.2"} sx={{borderRadius: "10px"}}>
<Table bg={"gray.2"} sx={{ borderRadius: "10px" }}>
<thead>
<tr>
<th>

View File

@@ -98,8 +98,10 @@ export default function Admin_Investasi({
<Grid mb={"md"}>
{listBox.map((e) => (
<Grid.Col sm={12} md={6} lg={3} key={e.id}>
<Paper bg={`${e.color}.1`} p={"xs"}
// sx={{borderStyle: "solid", borderColor: e.color}}
<Paper
bg={`${e.color}.1`}
p={"xs"}
// sx={{borderStyle: "solid", borderColor: e.color}}
>
<Stack align="center" justify="center" spacing={0} mb={-35}>
<Text tt={"uppercase"}>{e.name}</Text>
@@ -110,10 +112,13 @@ export default function Admin_Investasi({
<Group position="right">
{e.link === "" ? (
<ActionIcon variant="transparent">
{/* <IconChevronsRight color="black" /> */}
</ActionIcon>
{/* <IconChevronsRight color="black" /> */}
</ActionIcon>
) : (
<ActionIcon variant="transparent" onClick={() => router.push(e.link)}>
<ActionIcon
variant="transparent"
onClick={() => router.push(e.link)}
>
<IconChevronsRight color="black" />
</ActionIcon>
)}
@@ -124,20 +129,15 @@ export default function Admin_Investasi({
</Grid>
{/* Table Total & Progres */}
<Grid>
{/* <Grid>
<Grid.Col sm={12} md={4} lg={4}>
<TableTotalInvestasi totalInvestasiByUser={totalInvestasiByUser} />
</Grid.Col>
<Grid.Col sm={12} md={8} lg={8}>
<TablePublikasiProgresInvestasi publishProgres={publishProgres} />
</Grid.Col>
</Grid>
</Grid> */}
</Stack>
{/* <TablePublish dataInvestsi={investasi as any} />
<TableReview dataInvestsi={investasi as any} />
<TableReject dataInvestsi={investasi as any} /> */}
{/* <pre>{JSON.stringify(targetTerbesar, null, 2)}</pre> */}
</>
);
}

View File

@@ -1,13 +1,18 @@
"use client";
import { Title } from "@mantine/core";
import { Center, Divider, Stack, Title } from "@mantine/core";
import Admin_Investasi from "../investasi/main/view";
export default function AdminMain() {
return (
<>
<Title>Main Dashboard</Title>
<Stack spacing={"sm"}>
<Title>Main Dashboard</Title>
<Divider mb={"md"} />
<Stack align="center" justify="center" h={"80vh"}>
<Title>Cooming Soon !!</Title>
</Stack>
</Stack>
</>
);
}

View File

@@ -57,7 +57,7 @@ export default function MainCrowd() {
</Grid>
</Paper>
<Paper
bg={Warna.biru}
bg={"blue.4"}
radius={"md"}
p={"xs"}
onClick={() => toast("Cooming Soon Feature...")}

View File

@@ -131,7 +131,7 @@ export default function HomeView({ user }: { user: MODEL_User_profile }) {
</Flex>
<Paper bg={"dark"} radius={5} my={"xs"}>
<Image alt="logo" src={"/aset/logo.png"} />
<Image alt="logo" src={"/aset/investasi/home-hipmi.png"} />
</Paper>
{/* <pre>{JSON.stringify(stateUser, null, 2)}</pre> */}

View File

@@ -152,7 +152,7 @@ export default function InvestasiCreate({
</Paper>
) : (
<Paper w={"100%"} bg={"gray.6"} p={"sm"}>
<Text>{pdf.name}</Text>
<Text truncate>{pdf.name}</Text>
</Paper>
)}
{/* {JSON.stringify(filePdf)} */}

View File

@@ -73,7 +73,7 @@ export default function DetailInvestasi({
];
async function onSubmit() {
router.push(RouterInvestasi.proses_investasi + `${investasi.id}`);
router.push(RouterInvestasi.proses_transaksi + `${investasi.id}`);
setTransaksiValue({
...transaksiValue,
lembarTerbeli: "",
@@ -224,7 +224,7 @@ export default function DetailInvestasi({
onSubmit()
}}
>
Investasi
Beli Saham
</Button>
</Center>
)}

View File

@@ -8,6 +8,7 @@ import {
Model_Prospektus_Investasi,
} from "../model/model_investasi";
import { useState } from "react";
import { RouterInvestasi } from "@/app/lib/router_hipmi/router_investasi";
export default function DetailPropektus({
dataInvestasi,
@@ -16,23 +17,16 @@ export default function DetailPropektus({
}) {
const [prospek, setProspek] = useState(dataInvestasi);
return (
<>
{prospek.ProspektusInvestasi !== null ? (
<Link
href={`/file/${prospek.ProspektusInvestasi.url}`}
href={RouterInvestasi.api_file_prospektus + `${prospek.ProspektusInvestasi.id}`}
target="_blank"
style={{ textDecorationLine: "none" }}
>
<Paper w={"100%"} bg={"gray"} mb={"md"}>
<Grid
align="center"
justify="center"
px={"sm"}
onClick={() => ""}
>
<Paper w={"100%"} bg={"gray"} mb={"md"}>
<Grid align="center" justify="center" px={"sm"}>
<Grid.Col span={10}>
<Text>Prospektus_{prospek.title}</Text>
</Grid.Col>

View File

@@ -15,6 +15,7 @@ import {
Group,
Image,
Paper,
Progress,
Slider,
Stack,
Text,
@@ -22,13 +23,24 @@ import {
} from "@mantine/core";
import {
IconBookDownload,
IconCircleCheck,
IconFileDescription,
IconSpeakerphone,
} from "@tabler/icons-react";
import { useRouter } from "next/navigation";
import { MODEL_Transaksi_Investasi } from "../model/model_investasi";
import { useState } from "react";
import moment from "moment";
export default function DetailSahamTerbeli({id}: {id: string}) {
export default function DetailSahamTerbeli({
dataTransaksi,
investor
}: {
dataTransaksi: MODEL_Transaksi_Investasi;
investor: number
}) {
const router = useRouter();
const [investasi, setINvestasi] = useState(dataTransaksi);
const listBox = [
{
id: 1,
@@ -54,50 +66,104 @@ export default function DetailSahamTerbeli({id}: {id: string}) {
<Group position="apart" mb={"md"}>
<Flex align={"center"} gap={"xs"}>
<Avatar src={"/aset/avatar.png"} />
<Text>Username</Text>
<Text>{investasi.Investasi.author.username}</Text>
</Flex>
<Text>Sisa waktu : 20 Hari</Text>
{(() => {
if (
Number(investasi.Investasi.MasterPencarianInvestor.name) -
moment(new Date()).diff(new Date(investasi.createdAt), "days") <=
0
) {
return (
<>
<Group position="right">
<IconCircleCheck color="green" />
<Text c={"green"}>Selesai</Text>
</Group>
</>
);
} else {
return (
<>
<Group position="right" spacing={"xs"}>
<Text>Sisa waktu:</Text>
<Text>
{Number(investasi.Investasi.MasterPencarianInvestor.name) -
moment(new Date()).diff(
new Date(investasi.Investasi.countDown),
"days"
)}{" "}
Hari
</Text>
</Group>
</>
);
}
})()}
</Group>
{/* Gambar Investasi */}
<Paper withBorder mb={"md"}>
<AspectRatio ratio={16 / 9}>
<Image alt="" src={"/aset/no-img.png"} />
<Image alt="" src={RouterInvestasi.api_gambar + `${investasi.Investasi.imagesId}`} />
</AspectRatio>
</Paper>
{/* Title dan Persentase */}
<Box mb={"md"}>
<Title order={4} mb={"xs"}>
Judul Proyek
{investasi.Investasi.title}
</Title>
<Slider
disabled
size={10}
value={60}
marks={[{ value: 60, label: "60%" }]}
/>
<Progress
label={
"" +
(
((+investasi.Investasi.totalLembar - +investasi.Investasi.sisaLembar) /
+investasi.Investasi.totalLembar) *
100
).toFixed(1) +
"%"
}
value={
+(
((+investasi.Investasi.totalLembar - +investasi.Investasi.sisaLembar) /
+investasi.Investasi.totalLembar) *
100
).toFixed(2)
}
color="teal"
size="xl"
radius="xl"
/>
</Box>
{/* Rincian Data */}
<Grid p={"md"}>
<Grid.Col span={6}>
<Stack>
<Box>
{/* <Box>
<Text>Terkumpul</Text>
<Text>Rp. </Text>
</Box>
</Box> */}
<Box>
<Text>Dana Dibutuhkan</Text>
<Text>Rp. </Text>
<Text>Rp. {new Intl.NumberFormat("id-ID", {
maximumSignificantDigits: 10,
}).format(+investasi.Investasi.targetDana)}</Text>
</Box>
<Box>
<Text>Harga Per Lembar</Text>
<Text>Rp. </Text>
<Text>Rp. {new Intl.NumberFormat("id-ID", {
maximumSignificantDigits: 10,
}).format(+investasi.Investasi.hargaLembar)}</Text>
</Box>
<Box>
<Text>Jadwal Pembagian</Text>
<Text>3 Bulan </Text>
<Text>{investasi.Investasi.MasterPembagianDeviden.name} bulan </Text>
</Box>
<Box>
<Text>Pembagian Deviden</Text>
<Text>{investasi.Investasi.MasterPeriodeDeviden.name}</Text>
</Box>
</Stack>
</Grid.Col>
@@ -105,19 +171,23 @@ export default function DetailSahamTerbeli({id}: {id: string}) {
<Stack>
<Box>
<Text>Investor</Text>
<Text>4657</Text>
<Text>{investor} pengguna</Text>
</Box>
<Box>
<Text>ROI</Text>
<Text>%</Text>
<Text>{investasi.Investasi.roi}%</Text>
</Box>
<Box>
<Text>Total Lembar</Text>
<Text>0</Text>
<Text>{new Intl.NumberFormat("id-ID", {
maximumSignificantDigits: 10,
}).format(+investasi.Investasi.totalLembar)} lembar</Text>
</Box>
<Box>
<Text>Pembagian Deviden</Text>
<Text>Selamanya</Text>
<Text>Sisa Lembar</Text>
<Text>{new Intl.NumberFormat("id-ID", {
maximumSignificantDigits: 10,
}).format(+investasi.Investasi.sisaLembar)} lembar</Text>
</Box>
</Stack>
</Grid.Col>
@@ -135,7 +205,9 @@ export default function DetailSahamTerbeli({id}: {id: string}) {
<Stack>
<Box>
<Text>Total Pembelian</Text>
<Text>Rp. 0</Text>
<Text>Rp. {new Intl.NumberFormat("id-ID", {
maximumSignificantDigits: 10,
}).format(+investasi.gross_amount)}</Text>
</Box>
</Stack>
</Grid.Col>
@@ -143,7 +215,9 @@ export default function DetailSahamTerbeli({id}: {id: string}) {
<Stack>
<Box>
<Text>Lembar Dibeli</Text>
<Text>100</Text>
<Text>{new Intl.NumberFormat("id-ID", {
maximumSignificantDigits: 10,
}).format(+investasi.quantity)} lembar</Text>
</Box>
</Stack>
</Grid.Col>
@@ -153,7 +227,11 @@ export default function DetailSahamTerbeli({id}: {id: string}) {
{/* List Box */}
<Grid mb={"sm"} justify="center">
{listBox.map((e) => (
<Grid.Col span={"auto"} key={e.id} onClick={() => router.push(e.route + `${id}`)}>
<Grid.Col
span={"auto"}
key={e.id}
onClick={() => router.push(e.route + `${investasi.Investasi.id}`)}
>
<Center>
<Paper h={100} w={100} bg={"gray.4"} withBorder py={"xs"}>
<Flex direction={"column"} align={"center"} justify={"center"}>

View File

@@ -11,7 +11,7 @@ import { MODEL_Investasi } from "../model/model_investasi";
export async function funCreateInvestasi(
gamabar: FormData,
filePdf: FormData,
data: MODEL_Investasi | any
data: MODEL_Investasi
) {
// Function upload gambar
const file: any = gamabar.get("file");
@@ -32,7 +32,7 @@ export async function funCreateInvestasi(
if (!uploadImage)
return {
status: 400,
message: "File Kosong",
message: "Gambar Kosong",
};
const upFolder = Buffer.from(await file.arrayBuffer());
@@ -67,23 +67,21 @@ export async function funCreateInvestasi(
const pdfExt = _.lowerCase(dataPdf.name.split(".").pop());
const pdfRandomName = v4(pdfName) + "." + pdfExt;
const uploadFile = await prisma.prospektusInvestasi.upsert({
where: {
investasiId: createInvest.id,
},
update: {
url: pdfRandomName,
},
create: {
const uploadFile = await prisma.prospektusInvestasi.create({
data: {
investasiId: createInvest.id,
url: pdfRandomName,
},
select: {
id: true,
url: true,
},
});
if(!uploadFile) return {status: 400, message: "Gagal Upload"}
const upPdfFolder = Buffer.from(await file.arrayBuffer())
fs.writeFileSync(`./public/file/${uploadFile.url}`, upPdfFolder)
if (!uploadFile) return { status: 400, message: "File Kosong" };
const upPdfFolder = Buffer.from(await file.arrayBuffer());
fs.writeFileSync(`./public/file/${uploadFile.url}`, upPdfFolder);
revalidatePath(RouterInvestasi.main_porto);

View File

@@ -12,10 +12,12 @@ export default async function funCreateTransaksiInvestasi(
data: {
namaBank: data.namaBank,
nomorRekening: data.nomorRekening,
lembarTerbeli: "" + data.lembarTerbeli,
totalTransfer: "" + data.totalTransfer,
investasiId: invesId,
authorId: authorId,
gross_amount: "",
merchant_name:"",
price: "",
quantity: ""
},
});
if (!res) return { status: 400, message: "Gagal disimpan" };

View File

@@ -3,24 +3,31 @@
import prisma from "@/app/lib/prisma";
import { RouterAdminInvestasi } from "@/app/lib/router_hipmi/router_admin";
import { RouterInvestasi } from "@/app/lib/router_hipmi/router_investasi";
import moment from "moment";
import { revalidatePath } from "next/cache";
export default async function funGantiStatusInvestasi(id: string, val: string) {
const publishCD = new Date
const data = await prisma.investasi.update({
where: {
id: id,
},
data: {
masterStatusInvestasiId: val,
MasterStatusInvestasi: {
connect: {
id: val,
},
},
countDown: publishCD,
},
});
if(!data) return {status: 400}
if (!data) return { status: 400 };
revalidatePath(RouterInvestasi.portofolio)
revalidatePath(RouterAdminInvestasi.main_investasi)
revalidatePath(RouterInvestasi.portofolio);
revalidatePath(RouterAdminInvestasi.main_investasi);
return {
status: 200
}
status: 200,
};
}

View File

@@ -19,7 +19,6 @@ export default async function funGantiStatusTransaksi_Investasi(
select: {
id: true,
namaBank: true,
totalTransfer: true,
Investasi: true,
MasterStatusTransaksiInvestasi: true
}

View File

@@ -0,0 +1,16 @@
"use server";
import prisma from "@/app/lib/prisma";
export default async function funTotalInvestorByIdInvestasi(id: string) {
// console.log(id)
const data = await prisma.transaksiInvestasi.count({
where: {
investasiId: id,
status_code: "200"
},
});
return data;
}
// belum ke hitungg

View File

@@ -0,0 +1,23 @@
"use server";
import prisma from "@/app/lib/prisma";
import { MODEL_Investasi } from "../model/model_investasi";
export default async function funUpdateInvestasi(data: MODEL_Investasi) {
// console.log(data)
const res = await prisma.investasi.update({
where: {
id: data.id,
},
data: {
sisaLembar: "" + data.sisaLembar,
},
});
if (!res) return { status: 400, message: "Gagal update" };
return {
status: 200,
message: "Update berhasil",
};
}

Some files were not shown because too many files have changed in this diff Show More