diff --git a/src/app_modules/katalog/portofolio/api/get-bidang-bisnis.ts b/src/app_modules/katalog/portofolio/api/get-bidang-bisnis.ts
new file mode 100644
index 00000000..4130f24d
--- /dev/null
+++ b/src/app_modules/katalog/portofolio/api/get-bidang-bisnis.ts
@@ -0,0 +1,9 @@
+"use server"
+
+import { myConsole } from "@/app/fun/my_console"
+import prisma from "@/app/lib/prisma"
+
+export async function getBidangBisnis() {
+ const data = await prisma.masterBidangBisnis.findMany()
+ return data
+}
\ No newline at end of file
diff --git a/src/app_modules/katalog/portofolio/api/get-portofolio.ts b/src/app_modules/katalog/portofolio/api/get-portofolio.ts
new file mode 100644
index 00000000..2a775a57
--- /dev/null
+++ b/src/app_modules/katalog/portofolio/api/get-portofolio.ts
@@ -0,0 +1,35 @@
+"use server";
+
+import { myConsole } from "@/app/fun/my_console";
+import prisma from "@/app/lib/prisma";
+
+/**
+ *
+ * @param id - profileId
+ * @returns list portofolio by Id
+ */
+export default async function getListPortofolio(id: string) {
+ myConsole(id);
+
+
+ const data = await prisma.katalog.findMany({
+ where: {
+ profileId: id,
+ },
+ select: {
+ id: true,
+ namaBisnis: true,
+ alamatKantor: true,
+ tlpn: true,
+ deskripssi: true,
+ active: true,
+ masterBidangBisnisId: true,
+ },
+ });
+
+ if (!data) {
+ throw new Error('Failed to fetch data')
+ }
+
+ return data;
+}
diff --git a/src/app_modules/katalog/portofolio/create/layout.tsx b/src/app_modules/katalog/portofolio/create/layout.tsx
new file mode 100644
index 00000000..e5e6e58c
--- /dev/null
+++ b/src/app_modules/katalog/portofolio/create/layout.tsx
@@ -0,0 +1,31 @@
+"use client";
+
+import { ActionIcon, AppShell, Group, Header, Text } from "@mantine/core";
+import { IconArrowLeft } from "@tabler/icons-react";
+import { useRouter } from "next/navigation";
+
+export default function PortofolioLayout({ children }: { children: any }) {
+ const router = useRouter();
+ return (
+ <>
+
{JSON.stringify(data, null, 2)} */}
+ >
+ );
+}
diff --git a/src/app_modules/katalog/portofolio/fun/fun_get_all_portofolio.ts b/src/app_modules/katalog/portofolio/fun/fun_get_all_portofolio.ts
new file mode 100644
index 00000000..cc540f58
--- /dev/null
+++ b/src/app_modules/katalog/portofolio/fun/fun_get_all_portofolio.ts
@@ -0,0 +1,16 @@
+import toast from "react-simple-toasts";
+import getListPortofolio from "../api/get-portofolio";
+
+/**
+ *
+ * @param id - profileId
+ * @returns load list portofolio by Id
+ */
+export async function loadListPortofolio(id: string) {
+ if (id === null) {
+ return toast("Id null");
+ } else {
+ const data = await getListPortofolio(id).then((res) => res);
+ return data
+ }
+}
diff --git a/src/app_modules/katalog/portofolio/index.ts b/src/app_modules/katalog/portofolio/index.ts
new file mode 100644
index 00000000..3496c641
--- /dev/null
+++ b/src/app_modules/katalog/portofolio/index.ts
@@ -0,0 +1,5 @@
+import CreatePortofolio from "./create/view";
+import PortofolioLayout from "./create/layout";
+import PortofolioView from "./list_view/view";
+
+export {CreatePortofolio, PortofolioLayout, PortofolioView}
\ No newline at end of file
diff --git a/src/app_modules/katalog/portofolio/list_view/view.tsx b/src/app_modules/katalog/portofolio/list_view/view.tsx
new file mode 100644
index 00000000..0b8368b9
--- /dev/null
+++ b/src/app_modules/katalog/portofolio/list_view/view.tsx
@@ -0,0 +1,65 @@
+"use client";
+import { Box, Center, Grid, Paper, Text, Title } from "@mantine/core";
+import { useShallowEffect } from "@mantine/hooks";
+import { useState } from "react";
+import { loadListPortofolio } from "../fun/fun_get_all_portofolio";
+import _ from "lodash";
+import { IconCaretRightFilled } from "@tabler/icons-react";
+import { loadDataProfile } from "../../profile/fun/fun_get_profile";
+import { useAtom } from "jotai";
+import { gs_profile } from "../../profile/state/global_state";
+import getListPortofolio from "../api/get-portofolio";
+
+export default function PortofolioView({
+ profileId,
+ porto,
+}: {
+ profileId: any;
+ porto: any;
+}) {
+ const [profile, setProfile] = useAtom(gs_profile);
+ useShallowEffect(() => {
+ loadDataProfile(setProfile);
+ }, []);
+
+ const [listPorto, setListPorto] = useState