diff --git a/apps/backend/.env.example b/apps/backend/.env.example index 1dd79ad..f06dab1 100644 --- a/apps/backend/.env.example +++ b/apps/backend/.env.example @@ -1,7 +1,14 @@ +BASE_URL = APP_PORT = 3000 DATABASE_URL = ACCESS_TOKEN_SECRET = REFRESH_TOKEN_SECRET = -COOKIE_SECRET = \ No newline at end of file +RESET_PASSWORD_TOKEN_SECRET = +COOKIE_SECRET = + +SMTP_USERNAME = +SMTP_PASSWORD = +SMTP_HOST = +SMTP_PORT = \ No newline at end of file diff --git a/apps/backend/files/.gitignore b/apps/backend/files/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/apps/backend/files/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/apps/backend/package.json b/apps/backend/package.json index a923b14..21a8d3b 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -19,6 +19,7 @@ "hono": "^4.4.6", "jsonwebtoken": "^9.0.2", "moment": "^2.30.1", + "nodemailer": "^6.9.14", "postgres": "^3.4.4", "sharp": "^0.33.4", "zod": "^3.23.8" @@ -27,6 +28,7 @@ "@types/bcrypt": "^5.0.2", "@types/jsonwebtoken": "^9.0.6", "@types/node": "^20.14.2", + "@types/nodemailer": "^6.4.15", "drizzle-kit": "^0.22.7", "pg": "^8.12.0", "tsx": "^4.15.5", diff --git a/apps/backend/src/appEnv.ts b/apps/backend/src/appEnv.ts index bedf2a1..9d4672a 100644 --- a/apps/backend/src/appEnv.ts +++ b/apps/backend/src/appEnv.ts @@ -4,11 +4,17 @@ import { z } from "zod"; dotenv.config(); const envSchema = z.object({ + BASE_URL: z.string(), APP_PORT: z.coerce.number().int(), DATABASE_URL: z.string(), ACCESS_TOKEN_SECRET: z.string(), REFRESH_TOKEN_SECRET: z.string(), + RESET_PASSWORD_TOKEN_SECRET: z.string(), COOKIE_SECRET: z.string(), + SMTP_USERNAME: z.string(), + SMTP_PASSWORD: z.string(), + SMTP_HOST: z.string(), + SMTP_PORT: z.coerce.number().int(), }); const parsedEnv = envSchema.safeParse(process.env); diff --git a/apps/backend/src/data/permissions.ts b/apps/backend/src/data/permissions.ts index 1e91356..6b0214e 100644 --- a/apps/backend/src/data/permissions.ts +++ b/apps/backend/src/data/permissions.ts @@ -32,6 +32,102 @@ const permissionsData = [ { code: "roles.delete", }, + { + code: "questions.readAll", + }, + { + code: "questions.create", + }, + { + code: "questions.update", + }, + { + code: "questions.delete", + }, + { + code: "questions.restore", + }, + { + code :"assessmentRequestManagement.readAll", + }, + { + code: "assessmentRequestManagement.update", + }, + { + code :"assessmentRequestManagement.read", + }, + { + code: "managementAspect.readAll", + }, + { + code: "managementAspect.create", + }, + { + code: "managementAspect.update", + }, + { + code: "managementAspect.delete", + }, + { + code: "managementAspect.restore", + }, + { + code: "assessmentResult.readAll", + }, + { + code: "assessmentResult.read", + }, + { + code: "assessmentResult.readAllQuestions", + }, + { + code: "assessmentResult.create", + }, + { + code: "assessmentRequest.read", + }, + { + code: "assessmentRequest.create", + }, + { + code: "assessmentRequest.update", + }, + { + code: "assessments.readAspect", + }, + { + code: "assessments.readAllQuestions", + }, + { + code: "assessments.readAnswers", + }, + { + code: "assessments.toggleFlag", + }, + { + code: "assessments.uploadFile", + }, + { + code: "assessments.submitOption", + }, + { + code: "assessments.submitValidation", + }, + { + code: "assessments.submitAssessment", + }, + { + code: "assessments.readAverageSubAspect", + }, + { + code: "assessments.readAverageAspect", + }, + { + code: "assessments.updateOption", + }, + { + code: "assessmentResult.update", + } ] as const; export type SpecificPermissionCode = (typeof permissionsData)[number]["code"]; diff --git a/apps/backend/src/data/roles.ts b/apps/backend/src/data/roles.ts index 2c42327..d1c46bb 100644 --- a/apps/backend/src/data/roles.ts +++ b/apps/backend/src/data/roles.ts @@ -17,10 +17,18 @@ const roleData: RoleData[] = [ name: "Super Admin", permissions: permissionsData.map((permission) => permission.code), }, + { + code: "user", + description: + "User with standard access rights for general usage of the application.", + isActive: true, + name: "User", + permissions: permissionsData.map((permission) => permission.code), + }, ]; // Manually specify the union of role codes -export type RoleCode = "super-admin" | "*"; +export type RoleCode = "super-admin" | "user" | "*"; const exportedRoleData = roleData; diff --git a/apps/backend/src/data/sidebarMenus.ts b/apps/backend/src/data/sidebarMenus.ts index 2de9dd6..fa7553b 100644 --- a/apps/backend/src/data/sidebarMenus.ts +++ b/apps/backend/src/data/sidebarMenus.ts @@ -2,17 +2,43 @@ import { SidebarMenu } from "../types"; const sidebarMenus: SidebarMenu[] = [ { - label: "Dashboard", - icon: { tb: "TbLayoutDashboard" }, - allowedPermissions: ["*"], - link: "/dashboard", - }, - { - label: "Users", - icon: { tb: "TbUsers" }, + label: "Manajemen Pengguna", + icon: { tb: "TbUser" }, allowedPermissions: ["permissions.read"], link: "/users", - color: "red", + }, + { + label: "Manajemen Aspek", + icon: { tb: "TbClipboardText" }, + allowedPermissions: ["permissions.read"], + link: "/aspect", + color: "blue", + }, + { + label: "Manajemen Pertanyaan", + icon: { tb: "TbMessage2Cog" }, + allowedPermissions: ["permissions.read"], + link: "/questions", + }, + { + label: "Permohonan Asesmen", + icon: { tb: "TbMessageQuestion" }, + allowedPermissions: ["permissions.read"], + link: "/assessmentRequest", + color: "green", + }, + { + label: "Manajemen Permohonan Asesmen", + icon: { tb: "TbUserQuestion" }, + allowedPermissions: ["permissions.read"], + link: "/assessmentRequestManagements", + color: "orange", + }, + { + label: "Manajemen Hasil Asesmen", + icon: { tb: "TbReport" }, + allowedPermissions: ["permissions.read"], + link: "/assessmentResultsManagement", }, ]; diff --git a/apps/backend/src/drizzle/schema/answerRevisions.ts b/apps/backend/src/drizzle/schema/answerRevisions.ts new file mode 100644 index 0000000..f0f80ec --- /dev/null +++ b/apps/backend/src/drizzle/schema/answerRevisions.ts @@ -0,0 +1,24 @@ +import { createId } from "@paralleldrive/cuid2"; + +import { + boolean, + pgTable, + text, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; +import { options } from "./options"; +import { answers } from "./answers"; + +export const answerRevisions = pgTable("answer_revisions", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + answerId: varchar("answerId", { length: 50 }) + .references(() => answers.id), + newOptionId: varchar("newOptionId", { length: 50 }) + .references(() => options.id), + revisedBy: varchar("revisedBy").notNull(), + newValidationInformation: text("newValidationInformation").notNull(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), +}); diff --git a/apps/backend/src/drizzle/schema/answers.ts b/apps/backend/src/drizzle/schema/answers.ts new file mode 100644 index 0000000..4855a9d --- /dev/null +++ b/apps/backend/src/drizzle/schema/answers.ts @@ -0,0 +1,29 @@ +import { createId } from "@paralleldrive/cuid2"; +import { relations } from "drizzle-orm"; +import { + boolean, + pgTable, + text, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; +import { options } from "./options"; +import { assessments } from "./assessments"; +import { questions } from "./questions"; + +export const answers = pgTable("answers", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + questionId: varchar("questionId", { length: 50 }) + .references(() => questions.id), + optionId: varchar("optionId", { length: 50 }) + .references(() => options.id), + assessmentId: varchar("assessmentId", { length: 50 }) + .references(() => assessments.id), + isFlagged: boolean("isFlagged").default(false), + filename: varchar("filename"), + validationInformation: text("validationInformation").notNull(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), +}); diff --git a/apps/backend/src/drizzle/schema/aspects.ts b/apps/backend/src/drizzle/schema/aspects.ts new file mode 100644 index 0000000..f5df23c --- /dev/null +++ b/apps/backend/src/drizzle/schema/aspects.ts @@ -0,0 +1,16 @@ +import { createId } from "@paralleldrive/cuid2"; +import { + pgTable, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; + +export const aspects = pgTable("aspects", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + name: varchar("name", { length: 255 }).notNull(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), +}); diff --git a/apps/backend/src/drizzle/schema/assessments.ts b/apps/backend/src/drizzle/schema/assessments.ts new file mode 100644 index 0000000..1d43ff3 --- /dev/null +++ b/apps/backend/src/drizzle/schema/assessments.ts @@ -0,0 +1,23 @@ +import { createId } from "@paralleldrive/cuid2"; +import { pgEnum, pgTable, timestamp, varchar } from "drizzle-orm/pg-core"; +import { relations } from "drizzle-orm"; +import { respondents } from "./respondents"; +import { users } from "./users"; + +export const statusEnum = pgEnum("status", ["menunggu konfirmasi", "diterima", "ditolak", + "dalam pengerjaan", "belum diverifikasi", "selesai"]); + +export const assessments = pgTable("assessments", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + respondentId: varchar("respondentId").references(() => respondents.id), + status: statusEnum("status"), + reviewedBy: varchar("reviewedBy"), + reviewedAt: timestamp("reviewedAt", { mode: "date" }), + verifiedBy: varchar("verifiedBy"), + verifiedAt: timestamp("verifiedAt", { mode: "date" }), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), +}); +// Query Tools in PosgreSQL +// CREATE TYPE status AS ENUM ('menunggu konfirmasi', 'diterima', 'ditolak', 'dalam pengerjaan', 'belum diverifikasi', 'selesai'); \ No newline at end of file diff --git a/apps/backend/src/drizzle/schema/options.ts b/apps/backend/src/drizzle/schema/options.ts new file mode 100644 index 0000000..59df2b1 --- /dev/null +++ b/apps/backend/src/drizzle/schema/options.ts @@ -0,0 +1,23 @@ +import { createId } from "@paralleldrive/cuid2"; +import { relations } from "drizzle-orm"; +import { + integer, + pgTable, + text, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; +import { questions } from "./questions"; + +export const options = pgTable("options", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + questionId: varchar("questionId", { length: 50 }) + .references(() => questions.id), + text: text("text").notNull(), + score: integer("score").notNull(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), +}); diff --git a/apps/backend/src/drizzle/schema/permissions.ts b/apps/backend/src/drizzle/schema/permissions.ts index f4a2461..90b13ba 100644 --- a/apps/backend/src/drizzle/schema/permissions.ts +++ b/apps/backend/src/drizzle/schema/permissions.ts @@ -5,13 +5,13 @@ import { permissionsToUsers } from "./permissionsToUsers"; import { permissionsToRoles } from "./permissionsToRoles"; export const permissionsSchema = pgTable("permissions", { - id: text("id") + id: varchar("id", { length: 50 }) .primaryKey() .$defaultFn(() => createId()), code: varchar("code", { length: 50 }).notNull().unique(), description: varchar("description", { length: 255 }), - createdAt: timestamp("created_at").defaultNow(), - updatedAt: timestamp("updated_at").defaultNow(), + createdAt: timestamp("createdAt").defaultNow(), + updatedAt: timestamp("updatedAt").defaultNow(), }); export const permissionsRelations = relations( diff --git a/apps/backend/src/drizzle/schema/permissionsToRoles.ts b/apps/backend/src/drizzle/schema/permissionsToRoles.ts index ddce625..72ead8c 100644 --- a/apps/backend/src/drizzle/schema/permissionsToRoles.ts +++ b/apps/backend/src/drizzle/schema/permissionsToRoles.ts @@ -1,4 +1,4 @@ -import { pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import { pgTable, primaryKey, varchar } from "drizzle-orm/pg-core"; import { permissionsSchema } from "./permissions"; import { relations } from "drizzle-orm"; import { rolesSchema } from "./roles"; @@ -6,10 +6,10 @@ import { rolesSchema } from "./roles"; export const permissionsToRoles = pgTable( "permissions_to_roles", { - roleId: text("roleId") + roleId: varchar("roleId", { length: 50 }) .notNull() .references(() => rolesSchema.id), - permissionId: text("permissionId") + permissionId: varchar("permissionId", { length: 50 }) .notNull() .references(() => permissionsSchema.id), }, diff --git a/apps/backend/src/drizzle/schema/permissionsToUsers.ts b/apps/backend/src/drizzle/schema/permissionsToUsers.ts index 110b433..117c030 100644 --- a/apps/backend/src/drizzle/schema/permissionsToUsers.ts +++ b/apps/backend/src/drizzle/schema/permissionsToUsers.ts @@ -1,4 +1,4 @@ -import { pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import { pgTable, primaryKey, varchar } from "drizzle-orm/pg-core"; import { users } from "./users"; import { permissionsSchema } from "./permissions"; import { relations } from "drizzle-orm"; @@ -6,10 +6,10 @@ import { relations } from "drizzle-orm"; export const permissionsToUsers = pgTable( "permissions_to_users", { - userId: text("userId") + userId: varchar("userId", { length: 50 }) .notNull() .references(() => users.id), - permissionId: text("permissionId") + permissionId: varchar("permissionId", { length: 50 }) .notNull() .references(() => permissionsSchema.id), }, diff --git a/apps/backend/src/drizzle/schema/questions.ts b/apps/backend/src/drizzle/schema/questions.ts new file mode 100644 index 0000000..a84ba99 --- /dev/null +++ b/apps/backend/src/drizzle/schema/questions.ts @@ -0,0 +1,21 @@ +import { createId } from "@paralleldrive/cuid2"; +import { + boolean, + pgTable, + text, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; +import { subAspects } from "./subAspects" + +export const questions = pgTable("questions", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + subAspectId: varchar("subAspectId").references(() => subAspects.id), + question: text("question"), + needFile: boolean("needFile").default(false), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), +}); diff --git a/apps/backend/src/drizzle/schema/respondents.ts b/apps/backend/src/drizzle/schema/respondents.ts new file mode 100644 index 0000000..98d8805 --- /dev/null +++ b/apps/backend/src/drizzle/schema/respondents.ts @@ -0,0 +1,26 @@ +import { createId } from "@paralleldrive/cuid2"; +import { pgTable, text, timestamp, varchar } from "drizzle-orm/pg-core"; +import { relations } from "drizzle-orm"; +import { users } from "./users"; + +export const respondents = pgTable("respondents", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + userId: varchar('userId').references(() => users.id).unique(), + companyName: varchar("companyName").notNull(), + position: varchar("position").notNull(), + workExperience: varchar("workExperience").notNull(), + address: text("address").notNull(), + phoneNumber: varchar("phoneNumber", { length: 13 }).notNull(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), +}); + +export const respondentsRelations = relations(respondents, ({ one }) => ({ + user: one(users, { + fields: [respondents.userId], + references: [users.id], + }), +})); \ No newline at end of file diff --git a/apps/backend/src/drizzle/schema/roles.ts b/apps/backend/src/drizzle/schema/roles.ts index 6b8bfe5..61e585d 100644 --- a/apps/backend/src/drizzle/schema/roles.ts +++ b/apps/backend/src/drizzle/schema/roles.ts @@ -4,14 +4,14 @@ import { pgTable, text, timestamp, varchar } from "drizzle-orm/pg-core"; import { permissionsToRoles } from "./permissionsToRoles"; export const rolesSchema = pgTable("roles", { - id: text("id") + id: varchar("id", { length: 50 }) .primaryKey() .$defaultFn(() => createId()), code: varchar("code", { length: 50 }).notNull().unique(), name: varchar("name", { length: 255 }).notNull(), description: varchar("description", { length: 255 }), - createdAt: timestamp("created_at").defaultNow(), - updatedAt: timestamp("updated_at").defaultNow(), + createdAt: timestamp("createdAt").defaultNow(), + updatedAt: timestamp("updatedAt").defaultNow(), }); export const rolesRelations = relations(rolesSchema, ({ many }) => ({ diff --git a/apps/backend/src/drizzle/schema/rolesToUsers.ts b/apps/backend/src/drizzle/schema/rolesToUsers.ts index dcf422c..396cda4 100644 --- a/apps/backend/src/drizzle/schema/rolesToUsers.ts +++ b/apps/backend/src/drizzle/schema/rolesToUsers.ts @@ -1,4 +1,4 @@ -import { pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import { pgTable, primaryKey, varchar } from "drizzle-orm/pg-core"; import { users } from "./users"; import { relations } from "drizzle-orm"; import { rolesSchema } from "./roles"; @@ -6,10 +6,10 @@ import { rolesSchema } from "./roles"; export const rolesToUsers = pgTable( "roles_to_users", { - userId: text("userId") + userId: varchar("userId", { length: 50 }) .notNull() .references(() => users.id), - roleId: text("roleId") + roleId: varchar("roleId", { length: 50 }) .notNull() .references(() => rolesSchema.id), }, diff --git a/apps/backend/src/drizzle/schema/subAspects.ts b/apps/backend/src/drizzle/schema/subAspects.ts new file mode 100644 index 0000000..e1df105 --- /dev/null +++ b/apps/backend/src/drizzle/schema/subAspects.ts @@ -0,0 +1,14 @@ +import { createId } from "@paralleldrive/cuid2"; +import { pgTable, timestamp, varchar } from "drizzle-orm/pg-core"; +import { aspects } from "./aspects"; + +export const subAspects = pgTable("sub_aspects", { + id: varchar("id", { length: 50 }) + .primaryKey() + .$defaultFn(() => createId()), + aspectId: varchar("aspectId").references(() => aspects.id), + name: varchar("name", { length: 255 }).notNull(), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), +}); diff --git a/apps/backend/src/drizzle/schema/users.ts b/apps/backend/src/drizzle/schema/users.ts index af91337..23e6a89 100644 --- a/apps/backend/src/drizzle/schema/users.ts +++ b/apps/backend/src/drizzle/schema/users.ts @@ -9,22 +9,28 @@ import { } from "drizzle-orm/pg-core"; import { permissionsToUsers } from "./permissionsToUsers"; import { rolesToUsers } from "./rolesToUsers"; +import { respondents } from "./respondents"; export const users = pgTable("users", { - id: text("id") + id: varchar("id", { length: 50 }) .primaryKey() .$defaultFn(() => createId()), name: varchar("name", { length: 255 }).notNull(), username: varchar("username").notNull().unique(), - email: varchar("email"), + email: varchar("email").notNull().unique(), password: text("password").notNull(), - isEnabled: boolean("is_enable").default(true), - createdAt: timestamp("created_at", { mode: "date" }).defaultNow(), - updatedAt: timestamp("updated_at", { mode: "date" }).defaultNow(), - deletedAt: timestamp("deleted_at", { mode: "date" }), + isEnabled: boolean("isEnabled").default(true), + resetPasswordToken: varchar("resetPasswordToken"), + createdAt: timestamp("createdAt", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updatedAt", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deletedAt", { mode: "date" }), }); -export const usersRelations = relations(users, ({ many }) => ({ +export const usersRelations = relations(users, ({ many, one}) => ({ permissionsToUsers: many(permissionsToUsers), rolesToUsers: many(rolesToUsers), + respondent: one(respondents, { + fields: [users.id], + references: [respondents.userId], + }), })); diff --git a/apps/backend/src/drizzle/seed.ts b/apps/backend/src/drizzle/seed.ts index 305be1b..ddfa137 100644 --- a/apps/backend/src/drizzle/seed.ts +++ b/apps/backend/src/drizzle/seed.ts @@ -2,6 +2,13 @@ import db from "."; import permissionSeeder from "./seeds/permissionSeeder"; import roleSeeder from "./seeds/rolesSeeder"; import userSeeder from "./seeds/userSeeder"; +import aspectsSeeder from "./seeds/aspectsSeeder"; +import subAspectsSeeder from "./seeds/subAspectsSeeder"; +import answersSeeder from "./seeds/answersSeeder"; +import assessmentsSeeder from "./seeds/assessmentsSeeder"; +import optionsSeeder from "./seeds/optionsSeeder"; +import questionSeeder from "./seeds/questionSeeder"; +import respondentSeeder from "./seeds/respondentsSeeder"; (async () => { console.time("Done seeding"); @@ -9,6 +16,13 @@ import userSeeder from "./seeds/userSeeder"; await permissionSeeder(); await roleSeeder(); await userSeeder(); + await respondentSeeder(); + await aspectsSeeder(); + await subAspectsSeeder(); + await questionSeeder(); + await optionsSeeder(); + await assessmentsSeeder(); + await answersSeeder(); })().then(() => { console.log("\n"); console.timeEnd("Done seeding"); diff --git a/apps/backend/src/drizzle/seeds/answersSeeder.ts b/apps/backend/src/drizzle/seeds/answersSeeder.ts new file mode 100644 index 0000000..7f1fb61 --- /dev/null +++ b/apps/backend/src/drizzle/seeds/answersSeeder.ts @@ -0,0 +1,62 @@ +import { createId } from "@paralleldrive/cuid2"; +import db from ".."; +import { answers } from "../schema/answers"; +import { options } from "../schema/options"; +import { assessments } from "../schema/assessments"; + +type answers = { + id: string; + optionId: string; + assessmentId: string | null; + isFlagged: boolean; + filename: string; + validationInformation: string; + createdAt: Date; + updatedAt: Date; +}; + +const answersSeeder = async () => { + const optionsData = await db.select().from(options); + const assessmentData = await db.select().from(assessments); + + const answersData: answers[] = []; + + optionsData.forEach(option => { + // assessmentData.forEach(assessment => { + answersData.push({ + id: createId(), + optionId: option.id, + assessmentId: null, + isFlagged: false, + filename: "answer.pdf", + validationInformation: "Sudah teruji dengan baik", + createdAt: new Date(), + updatedAt: new Date(), + }); + // }); + }); + + console.log("Seeding answers..."); + + for (let submitAnswers of answersData) { + try { + const insertedAnswers = ( + await db + .insert(answers) + .values(submitAnswers) + .onConflictDoNothing() + .returning() + )[0]; + + if (insertedAnswers) { + console.log(`Answers created`); + } else { + console.log(`Answers already exists`); + } + } catch (error) { + console.error(`Error inserting answers :`, error); + } + } +}; + +export default answersSeeder; \ No newline at end of file diff --git a/apps/backend/src/drizzle/seeds/aspectsSeeder.ts b/apps/backend/src/drizzle/seeds/aspectsSeeder.ts new file mode 100644 index 0000000..a1464bc --- /dev/null +++ b/apps/backend/src/drizzle/seeds/aspectsSeeder.ts @@ -0,0 +1,63 @@ +import { aspects } from "../schema/aspects"; +import db from ".."; +import { eq } from "drizzle-orm"; + + +const aspectsSeeder = async () => { + const aspectsData: (typeof aspects.$inferInsert)[] = [ + { + name: "Identifikasi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + { + name: "Proteksi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + { + name: "Deteksi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + { + name: "Penanggulangan dan Pemulihan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + ]; + + console.log("Seeding aspects..."); + + for (let aspect of aspectsData) { + // Check if the aspect already exists + const existingAspect = await db + .select() + .from(aspects) + .where(eq(aspects.name, aspect.name)) + .limit(1); + + if (existingAspect.length === 0) { + // If the aspect does not exist, insert it + const insertedAspect = ( + await db + .insert(aspects) + .values(aspect) + .onConflictDoNothing() + .returning() + )[0]; + + if (insertedAspect) { + console.log(`Aspect ${aspect.name} created`); + } + } else { + console.log(`Aspect ${aspect.name} already exists`); + } + } +}; + +export default aspectsSeeder; diff --git a/apps/backend/src/drizzle/seeds/assessmentsSeeder.ts b/apps/backend/src/drizzle/seeds/assessmentsSeeder.ts new file mode 100644 index 0000000..b0df601 --- /dev/null +++ b/apps/backend/src/drizzle/seeds/assessmentsSeeder.ts @@ -0,0 +1,103 @@ +import { createId } from "@paralleldrive/cuid2"; +import db from ".."; +import { assessments } from "../schema/assessments"; +import { respondents } from "../schema/respondents"; +import { users } from "../schema/users"; + +type AssessmentData = { + id: string; + status: "menunggu konfirmasi" | "diterima" | "ditolak" | "dalam pengerjaan" | "belum diverifikasi" | "selesai"; + reviewedAt: Date; + reviewedBy: string; + verifiedBy: string; + verifiedAt: Date; + createdAt: Date, + respondentId: string; +}; + +const assessmentsSeeder = async () => { + const respondentsData = await db.select().from(respondents); + + const assessmentsData: AssessmentData[] = []; + + respondentsData.forEach((respondent) => { + assessmentsData.push({ + id: createId(), + status: "diterima", + reviewedAt: new Date(), + reviewedBy: "Reviewer B", + verifiedBy: "Reviewer A", + verifiedAt: new Date(), + createdAt: new Date(), + respondentId: respondent.id, + + }); + + assessmentsData.push({ + id: createId(), + status: "ditolak", + reviewedAt: new Date(), + reviewedBy: "Reviewer C", + verifiedBy: "Reviewer D", + verifiedAt: new Date(), + createdAt: new Date(), + respondentId: respondent.id, + }); + + assessmentsData.push({ + id: createId(), + status: "menunggu konfirmasi", + reviewedAt: new Date(), + reviewedBy: "Reviewer W", + verifiedBy: "Reviewer S", + verifiedAt: new Date(), + createdAt: new Date(), + respondentId: respondent.id, + }); + + assessmentsData.push({ + id: createId(), + status: "selesai", + reviewedAt: new Date(), + reviewedBy: "Reviewer F", + verifiedBy: "Reviewer G", + verifiedAt: new Date(), + createdAt: new Date(), + respondentId: respondent.id, + }); + assessmentsData.push({ + id: createId(), + status: "selesai", + reviewedAt: new Date(), + reviewedBy: "Reviewer I", + verifiedBy: "Reviewer L", + verifiedAt: new Date(), + createdAt: new Date(), + respondentId: respondent.id, + }); + }); + + console.log("Seeding assessments..."); + + for (let assessment of assessmentsData) { + try { + const insertedAssessment = ( + await db + .insert(assessments) + .values(assessment) + .onConflictDoNothing() + .returning() + )[0]; + + if (insertedAssessment) { + console.log(`Assessment for respondent ${assessment.respondentId} created`); + } else { + console.log(`Assessment for respondent ${assessment.respondentId} already exists`); + } + } catch (error) { + console.error(`Error inserting assessment for respondent ${assessment.respondentId}:, error`); + } + } +}; + +export default assessmentsSeeder; \ No newline at end of file diff --git a/apps/backend/src/drizzle/seeds/optionsSeeder.ts b/apps/backend/src/drizzle/seeds/optionsSeeder.ts new file mode 100644 index 0000000..826a6c0 --- /dev/null +++ b/apps/backend/src/drizzle/seeds/optionsSeeder.ts @@ -0,0 +1,9867 @@ +import { createId } from "@paralleldrive/cuid2"; +import db from ".."; +import { eq, and } from "drizzle-orm"; +import { options } from "../schema/options"; +import { questions } from "../schema/questions"; + +const optionsSeeder = async () => { + const optionsData: (typeof options.$inferInsert & { question: string })[] = [ + //Option of Identifikasi + { + text: "Belum ada penerapan kebijakan atau komitmen pimpinan terkait keamanan siber.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pimpinan organisasi menetapkan keamanan siber sebagai prioritas di organisasi dalam bentuk kebijakan atau komitmen pimpinan yang sesuai dengan kondisi bisnis/layanan dan operasional organisasi.", + }, + { + text: "Kebijakan Keamanan Siber diterapkan pada sebagian kecil aspek, namun belum ditetapkan secara formal", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pimpinan organisasi menetapkan keamanan siber sebagai prioritas di organisasi dalam bentuk kebijakan atau komitmen pimpinan yang sesuai dengan kondisi bisnis/layanan dan operasional organisasi.", + }, + { + text: "Kebijakan Keamanan Siber diterapkan pada sebagian besar aspek, namun belum ditetapkan secara formal", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pimpinan organisasi menetapkan keamanan siber sebagai prioritas di organisasi dalam bentuk kebijakan atau komitmen pimpinan yang sesuai dengan kondisi bisnis/layanan dan operasional organisasi.", + }, + { + text: "- Kebijakan terkait keamanan siber telah disusun dan ditetapkan - Pimpinan berkomitmen untuk memasukkan keamanan siber sebagai prioritas organisasi.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pimpinan organisasi menetapkan keamanan siber sebagai prioritas di organisasi dalam bentuk kebijakan atau komitmen pimpinan yang sesuai dengan kondisi bisnis/layanan dan operasional organisasi.", + }, + { + text: "- Kebijakan terkait keamanan siber telah disusun, ditetapkan, dimonitor, dan dilakukan review secara berkala - Pimpinan berkomitmen untuk memasukkan keamanan siber sebagai prioritas organisasi.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pimpinan organisasi menetapkan keamanan siber sebagai prioritas di organisasi dalam bentuk kebijakan atau komitmen pimpinan yang sesuai dengan kondisi bisnis/layanan dan operasional organisasi.", + }, + { + text: "- Kebijakan terkait keamanan siber telah disusun, ditetapkan, dimonitor, dan dilakukan review serta pembaruan secara berkala - Pimpinan berkomitmen untuk memasukkan keamanan siber sebagai prioritas organisasi.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pimpinan organisasi menetapkan keamanan siber sebagai prioritas di organisasi dalam bentuk kebijakan atau komitmen pimpinan yang sesuai dengan kondisi bisnis/layanan dan operasional organisasi.", + }, + { + text: "Komitmen dan kebijakan keamanan siber yang harus dipatuhi pihak terkait belum dikomunikasikan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengkomunikasikan perihal komitmen keamanan siber di organisasinya dengan pihak-pihak yang terkait dengan bisnis/layanan organisasi (termasuk kepada penyedia pihak ketiga).", + }, + { + text: "Kebijakan keamanan siber yang harus dipatuhi pihak terkait sudah dikomunikasikan pada sebagian kecil aspek, namun belum ditetapkan secara formal", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengkomunikasikan perihal komitmen keamanan siber di organisasinya dengan pihak-pihak yang terkait dengan bisnis/layanan organisasi (termasuk kepada penyedia pihak ketiga).", + }, + { + text: "Kebijakan keamanan siber yang harus dipatuhi pihak terkait sudah dikomunikasikan pada sebagian besar aspek, namun belum ditetapkan secara formal", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengkomunikasikan perihal komitmen keamanan siber di organisasinya dengan pihak-pihak yang terkait dengan bisnis/layanan organisasi (termasuk kepada penyedia pihak ketiga).", + }, + { + text: "Kebijakan keamanan siber yang harus dipatuhi pihak terkait sudah dikomunikasikan pada seluruh aspek dan sudah ditetapkan secara formal", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengkomunikasikan perihal komitmen keamanan siber di organisasinya dengan pihak-pihak yang terkait dengan bisnis/layanan organisasi (termasuk kepada penyedia pihak ketiga).", + }, + { + text: "Kebijakan keamanan siber yang harus dipatuhi pihak terkait sudah dikomunikasikan pada seluruh aspek dan sudah ditetapkan secara formal, dimonitor, dan dilakukan review secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengkomunikasikan perihal komitmen keamanan siber di organisasinya dengan pihak-pihak yang terkait dengan bisnis/layanan organisasi (termasuk kepada penyedia pihak ketiga).", + }, + { + text: "Kebijakan keamanan siber yang harus dipatuhi pihak terkait sudah dikomunikasikan pada seluruh aspek dan sudah ditetapkan secara formal, dimonitor, dan dilakukan review secara berkala, dan dilakukan perbaikan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengkomunikasikan perihal komitmen keamanan siber di organisasinya dengan pihak-pihak yang terkait dengan bisnis/layanan organisasi (termasuk kepada penyedia pihak ketiga).", + }, + { + text: "- Belum dilakukan identifikasi unit kerja maupun pihak lain yang bergantung pada layanan IIV di organisasinya - Belum ada prosedur identifikasi ketergantungan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi unit kerja di internal organisasinya, maupun pihak lain di luar organisasinya yang memiliki ketergantungan, baik secara langsung maupun tidak langsung terhadap operasional layanan IIV di organisasinya.", + }, + { + text: "- Organisasi mengetahui sebagian kecil unit kerja maupun pihak lain yang bergantung pada layanan IIV di organisasinya, namun prosedur identifikasi ketergantungan belum ditetapkan secara formal", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi unit kerja di internal organisasinya, maupun pihak lain di luar organisasinya yang memiliki ketergantungan, baik secara langsung maupun tidak langsung terhadap operasional layanan IIV di organisasinya.", + }, + { + text: "- Organisasi mengetahui sebagian besar unit kerja maupun pihak lain yang bergantung pada layanan IIV di organisasinya, namun prosedur identifikasi ketergantungan belum ditetapkan secara formal", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi unit kerja di internal organisasinya, maupun pihak lain di luar organisasinya yang memiliki ketergantungan, baik secara langsung maupun tidak langsung terhadap operasional layanan IIV di organisasinya.", + }, + { + text: "- Identifikasi unit kerja maupun pihak lain yang bergantung pada layanan IIV di organisasinya telah dilakukan secara menyeluruh - Prosedur identifikasi ketergantungan sudah ditetapkan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi unit kerja di internal organisasinya, maupun pihak lain di luar organisasinya yang memiliki ketergantungan, baik secara langsung maupun tidak langsung terhadap operasional layanan IIV di organisasinya.", + }, + { + text: "- Identifikasi unit kerja maupun pihak lain yang bergantung pada layanan IIV di organisasinya telah dilakukan - Prosedur identifikasi ketergantungan sudah ditetapkan dan dievaluasi secara berkala - Daftar unit kerja atau pihak lain yang bergantung pada layanan IIV di organisasinya dimonitor dan dievaluasi secara berkala - Belum ada mekanisme/siklus pembaruan daftar unit kerja atau pihak lain yang bergantung pada layanan IIV di organisasinya", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi unit kerja di internal organisasinya, maupun pihak lain di luar organisasinya yang memiliki ketergantungan, baik secara langsung maupun tidak langsung terhadap operasional layanan IIV di organisasinya.", + }, + { + text: "- Identifikasi unit kerja maupun pihak lain yang bergantung pada layanan IIV di organisasinya telah dilakukan - Prosedur identifikasi ketergantungan sudah ditetapkan dan dievaluasi serta diperbarui secara berkala - Sudah ada mekanisme/siklus pembaruan daftar unit kerja atau pihak lain yang bergantung pada layanan IIV di organisasinya - Daftar unit kerja atau pihak lain yang bergantung pada layanan IIV di organisasinya dimonitor, dievaluasi, dan diperbarui secara berkala", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi unit kerja di internal organisasinya, maupun pihak lain di luar organisasinya yang memiliki ketergantungan, baik secara langsung maupun tidak langsung terhadap operasional layanan IIV di organisasinya.", + }, + { + text: "Belum adanya rencana terkait identifikasi unit kerja atau fungsi yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi dan menetapkan unit kerja atau fungsi yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya.", + }, + { + text: "Sudah terdapat unit kerja yang menerapkan sebagian kecil fungsi pelindungan IIV di organisasinya, namun belum ditetapkan tugas dan tanggung jawab secara formal", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi dan menetapkan unit kerja atau fungsi yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya.", + }, + { + text: "Sudah terdapat unit kerja yang menerapkan sebagian besar fungsi pelindungan IIV di organisasinya, namun belum ditetapkan tugas dan tanggung jawab secara formal", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi dan menetapkan unit kerja atau fungsi yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya.", + }, + { + text: "Seluruh fungsi dalam menerapkan pelindungan IIV telah diidentifikasi dan unit kerja yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya telah ditetapkan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi dan menetapkan unit kerja atau fungsi yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya.", + }, + { + text: "- Seluruh fungsi dalam menerapkan pelindungan IIV telah diidentifikasi dan unit kerja yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya telah ditetapkan. - Dilakukan evaluasi berkala terhadap fungsi, tugas, dan tanggung jawab unit kerja tersebut dalam menerapkan pelindungan IIV agar tetap inline dengan tujuan organisasi.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi dan menetapkan unit kerja atau fungsi yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya.", + }, + { + text: "- Seluruh fungsi dalam menerapkan pelindungan IIV telah diidentifikasi dan unit kerja yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya telah ditetapkan. - Dilakukan evaluasi berkala terhadap fungsi, tugas, dan tanggung jawab unit kerja tersebut dalam menerapkan pelindungan IIV agar tetap inline dengan tujuan organisasi. - Dilakukan perbaikan berkelanjutan untuk memastikan proses binis yang dijalankan oleh unit kerja tersebut tetap efektif dan sesuai dengan kebutuhan dan kondisi terkini.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi dan menetapkan unit kerja atau fungsi yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya.", + }, + { + text: "Peran, aktivitas, proses, dan narahubung pemangku kepentingan belum diidentifikasi.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi peran, aktivitas, proses, dan narahubung dari pemangku kepentingan yang mendukung ekosistem bisnis atau layanan IIV, baik di dalam atau di luar organisasi.", + }, + { + text: "Organisasi mengetahui sebagian kecil peran, aktivitas, proses, dan narahubung pemangku kepentingan namun belum ditetapkan secara formal", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi peran, aktivitas, proses, dan narahubung dari pemangku kepentingan yang mendukung ekosistem bisnis atau layanan IIV, baik di dalam atau di luar organisasi.", + }, + { + text: "Organisasi mengetahui sebagian besar peran, aktivitas, proses, dan narahubung pemangku kepentingan namun belum ditetapkan secara formal", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi peran, aktivitas, proses, dan narahubung dari pemangku kepentingan yang mendukung ekosistem bisnis atau layanan IIV, baik di dalam atau di luar organisasi.", + }, + { + text: "Peran, aktivitas, proses, dan narahubung pemangku kepentingan telah diidentifikasi dan ditetapkan dalam sebuah dokumen formal.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi peran, aktivitas, proses, dan narahubung dari pemangku kepentingan yang mendukung ekosistem bisnis atau layanan IIV, baik di dalam atau di luar organisasi.", + }, + { + text: "- Peran, aktivitas, proses, dan narahubung pemangku kepentingan telah diidentifikasi dan ditetapkan dalam sebuah dokumen formal. - Penetapan peran, aktivitas, proses, dan narahubung pemangku kepentingan dimonitor dan dievaluasi secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi peran, aktivitas, proses, dan narahubung dari pemangku kepentingan yang mendukung ekosistem bisnis atau layanan IIV, baik di dalam atau di luar organisasi.", + }, + { + text: "- Peran, aktivitas, proses, dan narahubung pemangku kepentingan telah diidentifikasi dan ditetapkan dalam sebuah dokumen formal. - Penetapan peran, aktivitas, proses, dan narahubung pemangku kepentingan dimonitor dan dievaluasi secara berkala. - Dilakukan pembaruan secara berkala terhadap penetapan peran, aktivtias, proses, dan narahubung pemangku kepentingan sebagai timbal balik dari evaluasi yang dilakukan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengidentifikasi peran, aktivitas, proses, dan narahubung dari pemangku kepentingan yang mendukung ekosistem bisnis atau layanan IIV, baik di dalam atau di luar organisasi.", + }, + { + text: "Organisasi belum memiliki kebijakan tentang keamanan siber sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang-undangan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun, menetapkan, dan mengembangkan kebijakan tentang keamanan siber sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang-undangan", + }, + { + text: "Organisasi telah menyusun kebijakan tentang keamanan siber sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang undangan dan sudah menerapkan pada sebagian kecil aspek, namun kebijakan tersebut belum ditetapkan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun, menetapkan, dan mengembangkan kebijakan tentang keamanan siber sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang-undangan", + }, + { + text: "Organisasi telah menerapkan kebijakan keamanan siber pada sebagian besar aspek sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang-undangan namun kebijakan tersebut belum ditetapkan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun, menetapkan, dan mengembangkan kebijakan tentang keamanan siber sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang-undangan", + }, + { + text: "Organisasi tidak hanya telah menerapkan, tetapi juga telah menetapkan kebijakan keamanan siber sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang-undangan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun, menetapkan, dan mengembangkan kebijakan tentang keamanan siber sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang-undangan", + }, + { + text: "Organisasi tidak hanya telah menerapkan dan menetapkan kebijakan keamanan siber, tetapi juga secara aktif mengelola dan meninjau kebijakan ini untuk memastikan bahwa mereka tetap relevan dan efektif. Dilakukannya proses peninjauan dan pembaruan kebijakan yang terstruktur.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun, menetapkan, dan mengembangkan kebijakan tentang keamanan siber sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang-undangan", + }, + { + text: "Organisasi telah berhasil menyusun, menetapkan, dan mengembangkan kebijakan keamanan siber yang komprehensif dan efektif yang sepenuhnya sesuai dengan standar dan regulasi yang berlaku. Kebijakan tersebut dikelola dan ditinjau secara berkala, dan ada mekanisme umpan balik serta perbaikan berkelanjutan untuk memastikan bahwa kebijakan ini tetap relevan dan efektif.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun, menetapkan, dan mengembangkan kebijakan tentang keamanan siber sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang-undangan", + }, + { + text: "Organisasi belum mengomunikasikan dan mengoordinasikan kebijakan dan prosedur dengan personel dan pemangku kepentingan eksternal, dan belum memiliki mekanisme komunikasi terkait hal tersebut.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengomunikasikan kebijakan kepada seluruh personel yang relevan, serta mengoordinasikan dan menyepakati metode berbagi informasi mengenai kebijakan dan prosedur yang ada di organisasi dengan para pemangku kepentingan eksternal.", + }, + { + text: "Organisasi mulai mengomunikasikan dan mengoodinasikan kebijakan dan prosedur kepada sebagian kecil personel dan pemangku kepentingan eksternal, namun mekanisme komunikasi tersebut belum ditetapkan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengomunikasikan kebijakan kepada seluruh personel yang relevan, serta mengoordinasikan dan menyepakati metode berbagi informasi mengenai kebijakan dan prosedur yang ada di organisasi dengan para pemangku kepentingan eksternal.", + }, + { + text: "Organisasi telah mengomunikasikan dan mengoodinasikan kebijakan dan prosedur kepada sebagian besar personel dan pemangku kepentingan eksternal, namun mekanisme komunikasi tersebut belum ditetapkan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengomunikasikan kebijakan kepada seluruh personel yang relevan, serta mengoordinasikan dan menyepakati metode berbagi informasi mengenai kebijakan dan prosedur yang ada di organisasi dengan para pemangku kepentingan eksternal.", + }, + { + text: "Organisasi mengomunikasikan kebijakan kepada seluruh personel yang relevan, serta mengoordinasikan dan menyepakati metode berbagi informasi mengenai kebijakan dan prosedur yang ada di organisasi dengan para pemangku kepentingan eksternal secara efektif dan efisien.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengomunikasikan kebijakan kepada seluruh personel yang relevan, serta mengoordinasikan dan menyepakati metode berbagi informasi mengenai kebijakan dan prosedur yang ada di organisasi dengan para pemangku kepentingan eksternal.", + }, + { + text: "Organisasi mengomunikasikan kebijakan kepada seluruh personel yang relevan, serta mengoordinasikan dan menyepakati metode berbagi informasi mengenai kebijakan dan prosedur yang ada di organisasi dengan para pemangku kepentingan eksternal secara efektif dan efisien. Mekanisme komunikasi, koordinasi kebijakan dan prosedur dengan personel dan pemangku kepentingan eksternal yang telah disusun, dikelola dan ditinjau efektivitasnya secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengomunikasikan kebijakan kepada seluruh personel yang relevan, serta mengoordinasikan dan menyepakati metode berbagi informasi mengenai kebijakan dan prosedur yang ada di organisasi dengan para pemangku kepentingan eksternal.", + }, + { + text: "Organisasi mengomunikasikan kebijakan kepada seluruh personel yang relevan, serta mengoordinasikan dan menyepakati metode berbagi informasi mengenai kebijakan dan prosedur yang ada di organisasi dengan para pemangku kepentingan eksternal secara efektif dan efisien. Mekanisme komunikasi, koordinasi kebijakan dan prosedur dengan personel dan pemangku kepentingan eksternal yang telah disusun, dikelola dan ditinjau efektivitasnya secara berkala dan ada mekanisme umpan balik serta perbaikan berkelanjutan untuk memastikan bahwa kebijakan ini tetap relevan dan efektif.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengomunikasikan kebijakan kepada seluruh personel yang relevan, serta mengoordinasikan dan menyepakati metode berbagi informasi mengenai kebijakan dan prosedur yang ada di organisasi dengan para pemangku kepentingan eksternal.", + }, + { + text: "Penyelenggara belum memiliki rencana untuk meninjau dan merevisi kebijakannya secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV meninjau dan merevisi kebijakannya secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya.", + }, + { + text: "Peninjauan dan revisi mulai dilakukan terhadap penerapan kebijakan pada sebagian kecil aspek secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya, namun mekanisme tersebut belum ditetapkan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV meninjau dan merevisi kebijakannya secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya.", + }, + { + text: "Peninjauan dan revisi terhadap penerapan kebijakan pada sebagian besar aspek secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya, telah dilaksanakan namun mekanisme tersebut belum ditetapkan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV meninjau dan merevisi kebijakannya secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya.", + }, + { + text: "Peninjauan dan revisi kebijakan yang telah diterapkan pada seluruh aspek secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya, telah dilaksanakan secara menyeluruh dan telah ditetapkan mekanismenya.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV meninjau dan merevisi kebijakannya secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya.", + }, + { + text: "Peninjauan dan revisi kebijakan yang telah diterapkan pada seluruh aspek secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya, telah dilaksanakan secara menyeluruh dan secara aktif mengelola dan meninjau efektivitasnya.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV meninjau dan merevisi kebijakannya secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya.", + }, + { + text: "Peninjauan dan revisi kebijakan yang telah diterapkan pada seluruh aspek secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya, telah dilaksanakan secara menyeluruh dan secara aktif mengelola dan meninjau efektivitasnya serta terdapat mekanisme perbaikan berkelanjutan untuk memastikan bahwa kebijakan ini tetap relevan dan efektif.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV meninjau dan merevisi kebijakannya secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya.", + }, + { + text: "Organisasi Belum memiliki strategi perlindungan aset informasi dan Belum memiliki dokumen manajemen risiko organisasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa mengembangkan strategi dalam melindungi aset informasi dengan mempertimbangkan manajemen risiko yang berlaku di organisasi.", + }, + { + text: "Prosedur pelindungan aset informasi, manajemen risiko organisasi dan Strategi pelindungan aset informasi sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa mengembangkan strategi dalam melindungi aset informasi dengan mempertimbangkan manajemen risiko yang berlaku di organisasi.", + }, + { + text: "Prosedur pelindungan aset informasi, manajemen risiko organisasi dan Strategi pelindungan aset informasi sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa mengembangkan strategi dalam melindungi aset informasi dengan mempertimbangkan manajemen risiko yang berlaku di organisasi.", + }, + { + text: "Prosedur pelindungan aset informasi, manajemen risiko organisasi dan Strategi pelindungan aset informasi sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa mengembangkan strategi dalam melindungi aset informasi dengan mempertimbangkan manajemen risiko yang berlaku di organisasi.", + }, + { + text: "Prosedur pelindungan aset informasi, manajemen risiko organisasi dan Strategi pelindungan aset informasi sudah diterapkan pada seluruh aspek dan sudah diformalkan, dilakukan monitoring dan reviu secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa mengembangkan strategi dalam melindungi aset informasi dengan mempertimbangkan manajemen risiko yang berlaku di organisasi.", + }, + { + text: "Prosedur pelindungan aset informasi, manajemen risiko organisasi dan Strategi pelindungan aset informasi sudah diterapkan pada seluruh aspek dan sudah diformalkan, dilakukan monitoring dan reviu secara berkala, dilakukan perbaikan berkelanjutan dan terintegrasi dalam sistem yang terotomatisasi.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa mengembangkan strategi dalam melindungi aset informasi dengan mempertimbangkan manajemen risiko yang berlaku di organisasi.", + }, + { + text: "Organisasi belum memiliki sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV harus menetapkan sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan.", + }, + { + text: "Sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan telah dijalankan pada sebagian kecil aspek namun belum ditetapkan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV harus menetapkan sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan.", + }, + { + text: "Sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan telah dijalankan pada sebagian besar aspek namun belum ditetapkan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV harus menetapkan sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan.", + }, + { + text: "Sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan telah ditetapkan dan dijalankan secara menyeluruh.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV harus menetapkan sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan.", + }, + { + text: "Sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan telah ditetapkan dan dijalankan secara menyeluruh, dilakukan monitoring dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV harus menetapkan sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan.", + }, + { + text: "Sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan telah dtetapkan dan dijalankan secara menyeluruh, dilakukan monitoring dan direview secara berkala serta dievaluasi dan dilakukan perbaikan berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV harus menetapkan sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan.", + }, + { + text: "Organisasi belum memiliki Kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber.", + }, + { + text: "Kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber sudah diterapkan pada sebagian kecil aspek namun belum ditetapkan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber.", + }, + { + text: "Kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber sudah diterapkan pada sebagian besar aspek namun belum ditetapkan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber.", + }, + { + text: "Kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber sudah diterapkan pada seluruh aspek dan sudah ditetapkan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber.", + }, + { + text: "Kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber sudah diterapkan pada seluruh aspek dan sudah ditetapkan, dilakukan monitoring dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber.", + }, + { + text: "Kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber sudah diterapkan pada seluruh aspek dan sudah ditetapkan, dilakukan monitoring dan direview secara berkala serta dievaluasi dan dilakukan perbaikan berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber.", + }, + { + text: "Organisasi belum menyusun kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi, dsb", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi, dsb.", + }, + { + text: "Kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi sudah diterapkan pada sebagian kecil aspek, namun belum ditetapkan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi, dsb.", + }, + { + text: "Kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi sudah diterapkan pada sebagian besar aspek, namun belum ditetapkan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi, dsb.", + }, + { + text: "Kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi sudah diterapkan pada seluruh aspek dan sudah ditetapkan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi, dsb.", + }, + { + text: "Kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi sudah diterapkan pada seluruh aspek dan sudah ditetapkan, dilakukan monitoring dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi, dsb.", + }, + { + text: "Kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi sudah diterapkan pada seluruh aspek dan sudah ditetapkan, dilakukan monitoring dan direview secara berkala serta dievaluasi dan dilakukan perbaikan berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi, dsb.", + }, + { + text: "Organisasi belum menyusun daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb), belum mendokumentasikan dan mengelolanya.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb).", + }, + { + text: "Organisasi telah melakukan dokumentasi dan pengelolaan pada sebagian kecil daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb) namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb).", + }, + { + text: "Organisasi telah melakukan dokumentasi dan pengelolaan pada sebagian besar daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb) namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb).", + }, + { + text: "Organisasi telah melakukan dokumentasi dan pengelolaan pada seluruh daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb) dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb).", + }, + { + text: "Organisasi telah melakukan dokumentasi dan pengelolaan pada seluruh daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb) dan sudah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb).", + }, + { + text: "Organisasi telah melakukan dokumentasi dan pengelolaan pada seluruh daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb) dan sudah diformalkan, dilakukan monitoring dan direview secara berkala serta dievaluasi dan dilakukan perbaikan berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb).", + }, + { + text: "Organisasi belum memiliki prosedur dan belum memastikan pemberian label pada perangkat aset informasi oleh pihak yang berwenang di organisasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan pemberian label pada perangkat aset informasi oleh pihak yang berwenang di organisasi", + }, + { + text: "Organisasi telah menerapkan prosedur pemberian label pada sebagian kecil aspek perangkat aset informasi oleh pihak yang berwenang di organisasi dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan pemberian label pada perangkat aset informasi oleh pihak yang berwenang di organisasi", + }, + { + text: "Organisasi telah menerapkan prosedur pemberian label pada sebagian besar aspek perangkat aset informasi oleh pihak yang berwenang di organisasi namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan pemberian label pada perangkat aset informasi oleh pihak yang berwenang di organisasi", + }, + { + text: "Organisasi telah menerapkan prosedur pemberian label pada seluruh aspek perangkat aset informasi oleh pihak yang berwenang di organisasi dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan pemberian label pada perangkat aset informasi oleh pihak yang berwenang di organisasi", + }, + { + text: "Organisasi telah menerapkan prosedur pemberian label pada seluruh aspek perangkat aset informasi oleh pihak yang berwenang di organisasi dan sudah diformalkan, dilakukan monitoring dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan pemberian label pada perangkat aset informasi oleh pihak yang berwenang di organisasi", + }, + { + text: "Organisasi telah menerapkan prosedur pemberian label pada seluruh aspek perangkat aset informasi oleh pihak yang berwenang di organisasi dan sudah diformalkan, dilakukan monitoring dan direview secara berkala, serta dievaluasi dan dilakukan perbaikan berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan pemberian label pada perangkat aset informasi oleh pihak yang berwenang di organisasi", + }, + { + text: "- Organisasi belum dapat menunjukan dokumentasi diagram jalur komunikasi jaringan (network architecture) dan aliran data (document data flow) yang berhubungan dengan layanan IIV. - Organisasi belum dapat menunjukan bahwa jalur komunikasi jaringan dan aliran data yang berhubungan dengan layanan IIV telah dikelola sesuai dengan persyaratan keamanan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun dokumentasi dan mengelola diagram jalur komunikasi jaringan dan aliran data dengan tepat dalam organisasi.", + }, + { + text: "Organisasi telah menyusun dokumentasi diagram jalur komunikasi jaringan dan aliran data dalam bentuk rancangan, atau dokumen diagram jalur komunikasi jaringan dan aliran data, namun baru diterapkan pada sebagian kecil aspek dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun dokumentasi dan mengelola diagram jalur komunikasi jaringan dan aliran data dengan tepat dalam organisasi.", + }, + { + text: "Organisasi telah menyusun dokumentasi diagram jalur komunikasi jaringan dan aliran data dalam bentuk rancangan, atau dokumen diagram jalur komunikasi jaringan dan aliran data, namun baru diterapkan pada sebagian besar aspek dan belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun dokumentasi dan mengelola diagram jalur komunikasi jaringan dan aliran data dengan tepat dalam organisasi.", + }, + { + text: "Organisasi telah menyusun dokumentasi diagram jalur komunikasi jaringan dan aliran data dalam bentuk rancangan, atau dokumen diagram jalur komunikasi jaringan dan aliran data, sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun dokumentasi dan mengelola diagram jalur komunikasi jaringan dan aliran data dengan tepat dalam organisasi.", + }, + { + text: "Organisasi telah menyusun dokumentasi diagram jalur komunikasi jaringan dan aliran data dalam bentuk rancangan, atau dokumen diagram jalur komunikasi jaringan dan aliran data, sudah diterapkan pada seluruh aspek dan sudah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun dokumentasi dan mengelola diagram jalur komunikasi jaringan dan aliran data dengan tepat dalam organisasi.", + }, + { + text: "Organisasi telah menyusun dokumentasi diagram jalur komunikasi jaringan dan aliran data dalam bentuk rancangan, atau dokumen diagram jalur komunikasi jaringan dan aliran data, sudah diterapkan pada seluruh aspek dan sudah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun dokumentasi dan mengelola diagram jalur komunikasi jaringan dan aliran data dengan tepat dalam organisasi.", + }, + { + text: "Organisasi belum memiliki daftar sistem informasi stakeholder dan pihak eksternal yang menggunakan data atau layanan IIV", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang menggunakan data atau layanan IIV", + }, + { + text: "Organisasi telah melaksanakan dokumentasi dan pengelolaan terhadap sebagian kecil aspek dari daftar sistem informasi stakeholder dan pihak eksternal yang menggunakan data atau layanan IIV namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang menggunakan data atau layanan IIV", + }, + { + text: "Organisasi telah melaksanakan dokumentasi dan pengelolaan terhadap sebagian besar daftar sistem informasi stakeholder dan pihak eksternal yang menggunakan data atau layanan IIV namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang menggunakan data atau layanan IIV", + }, + { + text: "Organisasi telah melaksanakan dokumentasi dan pengelolaan terhadap seluruh daftar sistem informasi stakeholder dan pihak eksternal yang menggunakan data atau layanan IIV dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang menggunakan data atau layanan IIV", + }, + { + text: "Organisasi telah melaksanakan dokumentasi dan pengelolaan terhadap seluruh daftar sistem informasi stakeholder dan pihak eksternal yang menggunakan data atau layanan IIV dan sudah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang menggunakan data atau layanan IIV", + }, + { + text: "Organisasi telah melaksanakan dokumentasi dan pengelolaan terhadap seluruh daftar sistem informasi stakeholder dan pihak eksternal yang menggunakan data atau layanan IIV dan sudah diformalkan, dilakukan monitoring dan direview secara berkala, dievaluasi dan dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang menggunakan data atau layanan IIV", + }, + { + text: "Organisasi belum memiliki daftar sistem informasi eksternal apa saja yang digunakan untuk mendukung penyelenggara IIV dalam menjalankan layanan IIV", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang digunakan oleh penyelenggara IIV.", + }, + { + text: "Organisasi telah melaksanakan dokumentasi dan pengelolaan yang tepat terhadap sebagian kecil aspek dari daftar sistem informasi eksternal yang digunakan untuk mendukung penyelenggara IIV dalam menjalankan layanan IIV, tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang digunakan oleh penyelenggara IIV.", + }, + { + text: "Organisasi telah melaksanakan dokumentasi dan pengelolaan yang tepat terhadap sebagian besar aspek dari daftar sistem informasi eksternal yang digunakan untuk mendukung penyelenggara IIV dalam menjalankan layanan IIV, tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang digunakan oleh penyelenggara IIV.", + }, + { + text: "Organisasi telah melaksanakan dokumentasi dan pengelolaan yang tepat terhadap seluruh aspek dari daftar sistem informasi eksternal yang digunakan untuk mendukung penyelenggara IIV dalam menjalankan layanan IIV, dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang digunakan oleh penyelenggara IIV.", + }, + { + text: "Organisasi telah melaksanakan dokumentasi dan pengelolaan yang tepat terhadap seluruh aspek dari daftar sistem informasi eksternal yang digunakan untuk mendukung penyelenggara IIV dalam menjalankan layanan IIV, dan sudah diformalkan, sudah dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang digunakan oleh penyelenggara IIV.", + }, + { + text: "Organisasi telah melaksanakan dokumentasi dan pengelolaan yang tepat terhadap seluruh aspek dari daftar sistem informasi eksternal yang digunakan untuk mendukung penyelenggara IIV dalam menjalankan layanan IIV, dan sudah diformalkan, sudah dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan secara berkelanjutan dan mekanisme otomatisasi diterapkan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang digunakan oleh penyelenggara IIV.", + }, + { + text: "Organisasi belum memiliki daftar aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengklasifikasikan dan memprioritaskan aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis", + }, + { + text: "Organisasi telah melaksanakan klasifikasi dan menyusun prioritas terhadap sebagian kecil aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis, tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengklasifikasikan dan memprioritaskan aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis", + }, + { + text: "Organisasi telah melaksanakan klasifikasi dan menyusun prioritas terhadap sebagian besar aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis, tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengklasifikasikan dan memprioritaskan aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis", + }, + { + text: "Organisasi telah melaksanakan klasifikasi dan menyusun prioritas terhadap seluruh aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis, dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengklasifikasikan dan memprioritaskan aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis", + }, + { + text: "Organisasi telah melaksanakan klasifikasi dan menyusun prioritas terhadap seluruh aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis, dan sudah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengklasifikasikan dan memprioritaskan aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis", + }, + { + text: "Organisasi telah melaksanakan klasifikasi dan menyusun prioritas terhadap seluruh aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis, dan sudah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan serta mekanisme otomatisasi diterapkan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengklasifikasikan dan memprioritaskan aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis", + }, + { + text: "Organisasi belum memiliki metode penelusuran aset informasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan metode untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait.", + }, + { + text: "Organisasi telah menerapkan metode pada sebagian kecil aspek untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait, tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan metode untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait.", + }, + { + text: "Organisasi telah menerapkan metode pada sebagian besar aspek untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait, dan belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan metode untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait.", + }, + { + text: "Organisasi telah menerapkan metode pada seluruh aspek untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan metode untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait.", + }, + { + text: "Organisasi telah menerapkan metode pada seluruh aspek untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait, dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan metode untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait.", + }, + { + text: "Organisasi telah menerapkan metode pada seluruh aspek untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait, dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilaksanakan evaluasi dan perbaikan berkelanjutan serta diterapkan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan metode untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait.", + }, + { + text: "Organisasi belum pernah memeriksa versi perangkat lunak dan perangkat keras, serta keterbaharuan dari perangkat lunak dan perangkat keras tersebut.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Secara aktif memeriksa keterbaharuan dan memperbaharui dari setiap versi perangkat lunak dan perangkat keras yang digunakan oleh organisasi.", + }, + { + text: "Organisasi telah memeriksa versi pada sebagian kecil perangkat lunak dan perangkat keras, serta keterbaharuannya dari sebagian kecil perangkat-perangkat tersebut yang digunakan oleh organisasi, namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Secara aktif memeriksa keterbaharuan dan memperbaharui dari setiap versi perangkat lunak dan perangkat keras yang digunakan oleh organisasi.", + }, + { + text: "Organisasi telah memeriksa versi pada sebagian besar perangkat lunak dan perangkat keras, serta keterbaharuannya dari sebagian besar perangkat-perangkat tersebut yang digunakan oleh organisasi, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Secara aktif memeriksa keterbaharuan dan memperbaharui dari setiap versi perangkat lunak dan perangkat keras yang digunakan oleh organisasi.", + }, + { + text: "Organisasi telah memeriksa versi pada seluruh perangkat lunak dan perangkat keras, serta keterbaharuannya dari seluruh perangkat-perangkat tersebut yang digunakan oleh organisasi, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Secara aktif memeriksa keterbaharuan dan memperbaharui dari setiap versi perangkat lunak dan perangkat keras yang digunakan oleh organisasi.", + }, + { + text: "Organisasi telah memeriksa versi pada seluruh perangkat lunak dan perangkat keras, serta keterbaharuannya dari seluruh perangkat-perangkat tersebut yang digunakan oleh organisasi, dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Secara aktif memeriksa keterbaharuan dan memperbaharui dari setiap versi perangkat lunak dan perangkat keras yang digunakan oleh organisasi.", + }, + { + text: "Organisasi telah memeriksa versi pada seluruh perangkat lunak dan perangkat keras, serta keterbaharuannya dari seluruh perangkat-perangkat tersebut yang digunakan oleh organisasi, dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan serta menerapkan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Secara aktif memeriksa keterbaharuan dan memperbaharui dari setiap versi perangkat lunak dan perangkat keras yang digunakan oleh organisasi.", + }, + { + text: "Organisasi belum melaksanakan identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, serta belum memiliki daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, serta dokumentasikan daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait.", + }, + { + text: "Organisasi telah melaksanakan identifikasi kerentanan terhadap sebagian kecil aset informasi di organisasi, dan melaksanakan dokumentasi terhadap sebagian kecil kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait, tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, serta dokumentasikan daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait.", + }, + { + text: "Organisasi telah melaksanakan identifikasi kerentanan terhadap sebagian besar aset informasi di organisasi, dan melaksanakan dokumentasi terhadap sebagian besar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, serta dokumentasikan daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait.", + }, + { + text: "Organisasi telah melaksanakan identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, dan melaksanakan dokumentasi terhadap seluruh daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, serta dokumentasikan daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait.", + }, + { + text: "Organisasi telah melaksanakan identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, dan melaksanakan dokumentasi terhadap seluruh daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait, dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, serta dokumentasikan daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait.", + }, + { + text: "Organisasi telah melaksanakan identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, dan melaksanakan dokumentasi terhadap seluruh daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait, dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan serta menerapkan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, serta dokumentasikan daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait.", + }, + { + text: "Organisasi belum memiliki rencana atau proses untuk mengumpulkan informasi tentang kerentanan dan ancaman dari sumber internal dan eksternal. Tidak ada upaya yang dilakukan untuk merencanakan atau mengimplementasikan aktivitas tersebut.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengumpulkan informasi termasuk kerentanan dan ancaman dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.)", + }, + { + text: "Organisasi telah melaksanakan pengumpulan informasi termasuk kerentanan dan ancaman pada sebagian kecil aspek dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.), namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengumpulkan informasi termasuk kerentanan dan ancaman dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.)", + }, + { + text: "Organisasi telah melaksanakan pengumpulan informasi termasuk kerentanan dan ancaman pada sebagian besar aspek dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.), namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengumpulkan informasi termasuk kerentanan dan ancaman dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.)", + }, + { + text: "Organisasi secara aktif telah melaksanakan pengumpulan informasi tentang kerentanan dan ancaman pada seluruh aspek dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.). Proses ini telah dijalankan secara menyeluruh dan mencakup berbagai sumber informasi yang relevan dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengumpulkan informasi termasuk kerentanan dan ancaman dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.)", + }, + { + text: "Organisasi secara aktif telah melaksanakan pengumpulan informasi tentang kerentanan dan ancaman pada seluruh aspek dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.). Proses ini telah dijalankan secara menyeluruh dan mencakup berbagai sumber informasi yang relevan dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengumpulkan informasi termasuk kerentanan dan ancaman dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.)", + }, + { + text: "Organisasi secara aktif telah melaksanakan pengumpulan informasi tentang kerentanan dan ancaman pada seluruh aspek dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.). Proses ini telah dijalankan secara menyeluruh dan mencakup berbagai sumber informasi yang relevan dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan serta penerapan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV mengumpulkan informasi termasuk kerentanan dan ancaman dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.)", + }, + { + text: "Organisasi belum melaksanakan analisis informasi kerentanan dan ancaman dalam konteks risiko terhadap aset informasi dan belum mendokumentasikannya", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menganalisis informasi tersebut apakah termasuk kedalam konteks risiko terhadap aset informasi, dan mendokumentasikannya.", + }, + { + text: "Organisasi telah melaksanakan analisis informasi pada sebagian kecil aspek kerentanan dan ancaman dalam konteks risiko terhadap aset informasi, namun belum didokumentasikan dan diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menganalisis informasi tersebut apakah termasuk kedalam konteks risiko terhadap aset informasi, dan mendokumentasikannya.", + }, + { + text: "Organisasi telah melaksanakan analisis informasi dan dokumentasi pada sebagian besar aspek kerentanan dan ancaman dalam konteks risiko terhadap aset informasi, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menganalisis informasi tersebut apakah termasuk kedalam konteks risiko terhadap aset informasi, dan mendokumentasikannya.", + }, + { + text: "Organisasi secara aktif melakukan analisis informasi kerentanan dan ancaman dalam konteks risiko terhadap aset informasi mereka. Proses ini telah dijalankan secara menyeluruh dan mencakup berbagai aspek risiko yang relevan. Hasil analisis didokumentasikan dengan baik dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menganalisis informasi tersebut apakah termasuk kedalam konteks risiko terhadap aset informasi, dan mendokumentasikannya.", + }, + { + text: "Organisasi secara aktif melakukan analisis informasi kerentanan dan ancaman dalam konteks risiko terhadap aset informasi mereka. Proses ini telah dijalankan secara menyeluruh dan mencakup berbagai aspek risiko yang relevan. Hasil analisis didokumentasikan dengan baik dan sudah diformalkan, dilakukan monitoring dan direview secara periodik untuk memastikan keakuratan dan keterkinian informasi.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menganalisis informasi tersebut apakah termasuk kedalam konteks risiko terhadap aset informasi, dan mendokumentasikannya.", + }, + { + text: "Organisasi secara aktif melakukan analisis informasi kerentanan dan ancaman dalam konteks risiko terhadap aset informasi mereka. Proses ini telah dijalankan secara menyeluruh dan mencakup berbagai aspek risiko yang relevan. Hasil analisis didokumentasikan dengan baik dan sudah diformalkan, dilakukan monitoring dan direview secara periodik untuk memastikan keakuratan dan keterkinian informasi, dilakukan evaluasi dan perbaikan berkelanjutan, serta penerapan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menganalisis informasi tersebut apakah termasuk kedalam konteks risiko terhadap aset informasi, dan mendokumentasikannya.", + }, + { + text: "Organisasi belum memiliki rencana atau proses untuk melakukan pemeriksaan potensi dampak keamanan terhadap setiap fungsi penting yang perlu diketahui.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV perlu memeriksa pada setiap fungsi penting organisasi apakah ada risiko keamanan yang diketahui termasuk kedalam kategori membahayakan keselamatan, menimbulkan kerugian, dan mengancam keamanan negara.", + }, + { + text: "Organisasi telah melakukan pemeriksaan potensi dampak keamanan terhadap sebagian kecil fungsi penting organisasi yang perlu diketahui, seperti risiko keamanan, namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV perlu memeriksa pada setiap fungsi penting organisasi apakah ada risiko keamanan yang diketahui termasuk kedalam kategori membahayakan keselamatan, menimbulkan kerugian, dan mengancam keamanan negara.", + }, + { + text: "Organisasi telah melakukan pemeriksaan potensi dampak keamanan terhadap sebagian besar fungsi penting organisasi yang perlu diketahui, seperti risiko keamanan, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV perlu memeriksa pada setiap fungsi penting organisasi apakah ada risiko keamanan yang diketahui termasuk kedalam kategori membahayakan keselamatan, menimbulkan kerugian, dan mengancam keamanan negara.", + }, + { + text: "Organisasi telah melakukan pemeriksaan potensi dampak keamanan terhadap seluruh fungsi penting organisasi, apakah ada risiko keamanan yang diketahui termasuk kedalam kategori membahayakan keselamatan, menimbulkan kerugian, dan mengancam keamanan negara, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV perlu memeriksa pada setiap fungsi penting organisasi apakah ada risiko keamanan yang diketahui termasuk kedalam kategori membahayakan keselamatan, menimbulkan kerugian, dan mengancam keamanan negara.", + }, + { + text: "Organisasi telah melakukan pemeriksaan potensi dampak keamanan terhadap seluruh fungsi penting organisasi, apakah ada risiko keamanan yang diketahui termasuk kedalam kategori membahayakan keselamatan, menimbulkan kerugian, dan mengancam keamanan negara, dan telah diformalkan, dilakukan monitoring pelaksanaannya dan direviiew secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV perlu memeriksa pada setiap fungsi penting organisasi apakah ada risiko keamanan yang diketahui termasuk kedalam kategori membahayakan keselamatan, menimbulkan kerugian, dan mengancam keamanan negara.", + }, + { + text: "Organisasi telah melakukan pemeriksaan potensi dampak keamanan terhadap seluruh fungsi penting organisasi, apakah ada risiko keamanan yang diketahui termasuk kedalam kategori membahayakan keselamatan, menimbulkan kerugian, dan mengancam keamanan negara, dan telah diformalkan, dilakukan monitoring pelaksanaannya dan direviiew secara berkala, serta penerapan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV perlu memeriksa pada setiap fungsi penting organisasi apakah ada risiko keamanan yang diketahui termasuk kedalam kategori membahayakan keselamatan, menimbulkan kerugian, dan mengancam keamanan negara.", + }, + { + text: "Organisasi belum mempertimbangkan ancaman, kerentanan, kemungkinan, dan dampak saat menganalisis risiko.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pertimbangkan ancaman, kerentanan, kemungkinan, dan dampak saat menganalisis risiko", + }, + { + text: "Organisasi telah melaksanakan analisis nilai risiko pada sebagian kecil aspek IIV dengan mempertimbangkan ancaman, kerentanan, kemungkinan, dan dampak, namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pertimbangkan ancaman, kerentanan, kemungkinan, dan dampak saat menganalisis risiko", + }, + { + text: "Organisasi telah melaksanakan analisis nilai risiko pada sebagian besar aspek IIV dengan mempertimbangkan ancaman, kerentanan, kemungkinan, dan dampak, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pertimbangkan ancaman, kerentanan, kemungkinan, dan dampak saat menganalisis risiko", + }, + { + text: "Organisasi telah melaksanakan analisis nilai risiko pada seluruh aspek IIV dengan mempertimbangkan ancaman, kerentanan, kemungkinan, dan dampak. dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pertimbangkan ancaman, kerentanan, kemungkinan, dan dampak saat menganalisis risiko", + }, + { + text: "Organisasi telah melaksanakan analisis nilai risiko pada seluruh aspek IIV dengan mempertimbangkan ancaman, kerentanan, kemungkinan, dan dampak. dan telah diformalkan, dilakukan monitoring dan di review secara berkala untuk memastikan bahwa proses ini tetap relevan dan efisien seiring waktu.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pertimbangkan ancaman, kerentanan, kemungkinan, dan dampak saat menganalisis risiko", + }, + { + text: "Organisasi telah melaksanakan analisis nilai risiko pada seluruh aspek IIV dengan mempertimbangkan ancaman, kerentanan, kemungkinan, dan dampak. dan telah diformalkan, dilakukan monitoring dan di review secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan serta penerapan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pertimbangkan ancaman, kerentanan, kemungkinan, dan dampak saat menganalisis risiko", + }, + { + text: "Organisasi belum memiliki level risiko dan prioritas mitigasinya.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan level risiko dan prioritas mitigasinya", + }, + { + text: "Organisasi telah menerapkan level risiko dan prioritas mitigasinya pada sebagian kecil aspek, tetapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan level risiko dan prioritas mitigasinya", + }, + { + text: "Organisasi telah menerapkan level risiko dan prioritas mitigasinya pada sebagian besar aspek, tetapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan level risiko dan prioritas mitigasinya", + }, + { + text: "Organisasi telah menerapkan level risiko dan prioritas mitigasinya pada seluruh aspek, dan telah diformalkan. Risiko dievaluasi dengan memperhitungkan dampak potensial dan kemungkinan terjadinya.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan level risiko dan prioritas mitigasinya", + }, + { + text: "Organisasi telah menentukan level risiko dan prioritas mitigasinya pada seluruh aspek, dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan level risiko dan prioritas mitigasinya", + }, + { + text: "Organisasi telah menentukan level risiko dan prioritas mitigasinya pada seluruh aspek, dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan serta penerapan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan level risiko dan prioritas mitigasinya", + }, + { + text: "Organisasi belum memiliki rencana atau proses untuk menetapkan kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk setiap aset informasi vital.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk setiap aset informasi vital.", + }, + { + text: "Organisasi telah menerapkan kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk sebagian kecil aset informasi vital, dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk setiap aset informasi vital.", + }, + { + text: "Organisasi telah menerapkan kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk sebagian besar aset informasi vital, dan belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk setiap aset informasi vital.", + }, + { + text: "Organisasi telah menetapkan kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk seluruh aset informasi vital, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk setiap aset informasi vital.", + }, + { + text: "Organisasi telah menetapkan kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk seluruh aset informasi vital, dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk setiap aset informasi vital.", + }, + { + text: "Organisasi telah menetapkan kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk seluruh aset informasi vital, dan telah diformalkan, dilakukan monitoring dan direview secara berkelanjutan, dilakukan evaluasi dan perbaikan berkelanjutan serta penerapan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk setiap aset informasi vital.", + }, + { + text: "Organisasi belum memiliki rencana atau proses untuk melakukan penilaian risiko siber secara berkala dan menyeluruh.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan penilaian risiko siber secara berkala dan menyeluruh, dengan melibatkan semua pemangku kepentingan yang relevan.", + }, + { + text: "Organisasi telah melakukan penilaian risiko siber namun belum secara rutin dan hanya sebagian kecil aspek saja serta belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan penilaian risiko siber secara berkala dan menyeluruh, dengan melibatkan semua pemangku kepentingan yang relevan.", + }, + { + text: "Organisasi telah melakukan penilaian risiko siber pada sebagian besar aspek tapi belum diformalkan dan belum secara rutin berkala, cakupannya masih terbatas dan mungkin belum melibatkan semua pemangku kepentingan yang relevan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan penilaian risiko siber secara berkala dan menyeluruh, dengan melibatkan semua pemangku kepentingan yang relevan.", + }, + { + text: "Organisasi telah melakukan penilaian risiko siber pada seluruh aspek secara rutin berkala,dan telah diformalkan, cakupannya telah melibatkan semua pemangku kepentingan yang relevan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan penilaian risiko siber secara berkala dan menyeluruh, dengan melibatkan semua pemangku kepentingan yang relevan.", + }, + { + text: "Organisasi telah melakukan penilaian risiko siber pada seluruh aspek secara rutin berkala,dan telah diformalkan, cakupannya telah melibatkan semua pemangku kepentingan yang relevan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan penilaian risiko siber secara berkala dan menyeluruh, dengan melibatkan semua pemangku kepentingan yang relevan.", + }, + { + text: "Organisasi telah melakukan penilaian risiko siber pada seluruh aspek secara rutin berkala,dan telah diformalkan, cakupannya telah melibatkan semua pemangku kepentingan yang relevan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan serta memastikan bahwa organisasi tetap adaptif terhadap perubahan lingkungan dan ancaman keamanan dan menerapkan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan penilaian risiko siber secara berkala dan menyeluruh, dengan melibatkan semua pemangku kepentingan yang relevan.", + }, + { + text: "Organisasi belum memiliki rencana atau proses untuk menentukan tingkat risiko terkait keamanan siber yang dapat diterima.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan tingkat risiko terkait keamanan siber yang dapat diterima", + }, + { + text: "Organisasi telah merencanakan untuk menentukan tingkat risiko terkait keamanan siber yang dapat diterima pada sebagian kecil aspek, tetapi langkah-langkah konkret belum diambil. Kesadaran akan pentingnya kegiatan ini ada, tetapi belum ada tindakan yang diambil untuk melaksanakannya secara aktif.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan tingkat risiko terkait keamanan siber yang dapat diterima", + }, + { + text: "Organisasi telah memulai proses untuk menentukan tingkat risiko terkait keamanan siber yang dapat diterima, pada sebagian besar aspek meskipun masih dalam tahap awal atau sebagian besar aspek. Beberapa aspek mungkin telah dipertimbangkan, tetapi cakupannya masih terbatas.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan tingkat risiko terkait keamanan siber yang dapat diterima", + }, + { + text: "Organisasi telah menentukan tingkat risiko terkait keamanan siber yang dapat diterima pada seluruh aspek. Proses ini telah dijalankan secara menyeluruh dan mencakup semua aspek yang relevan. Organisasi telah menetapkan kriteria yang jelas dan terukur untuk menentukan tingkat risiko yang dapat diterima.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan tingkat risiko terkait keamanan siber yang dapat diterima", + }, + { + text: "Organisasi telah menentukan tingkat risiko terkait keamanan siber yang dapat diterima pada seluruh aspek. Proses ini telah dijalankan secara menyeluruh dan mencakup semua aspek yang relevan. Organisasi telah menetapkan kriteria yang jelas dan terukur untuk menentukan tingkat risiko yang dapat diterima, dilakukan monitoring dan direview secara berkala untuk memastikan bahwa proses ini tetap relevan dan efisien seiring waktu.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan tingkat risiko terkait keamanan siber yang dapat diterima", + }, + { + text: "Organisasi telah menentukan tingkat risiko terkait keamanan siber yang dapat diterima pada seluruh aspek. Proses ini telah dijalankan secara menyeluruh dan mencakup semua aspek yang relevan. Organisasi telah menetapkan kriteria yang jelas dan terukur untuk menentukan tingkat risiko yang dapat diterima, dilakukan monitoring dan direview secara berkala untuk memastikan bahwa proses ini tetap relevan dan efisien seiring waktu, dilakukan evaluasi dan perbaikan berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menentukan tingkat risiko terkait keamanan siber yang dapat diterima", + }, + { + text: "Organisasi belum memiliki rencana atau proses untuk menganalisis dan mengevaluasi data dan informasi terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki proses untuk menganalisis dan mengevaluasi data dan informasi yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang", + }, + { + text: "Organisasi telah menjalankan proses untuk menganalisis dan mengevaluasi data dan informasi pada sebagian kecil aspek yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang, tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki proses untuk menganalisis dan mengevaluasi data dan informasi yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang", + }, + { + text: "Organisasi telah menjalankan proses untuk menganalisis dan mengevaluasi data dan informasi pada sebagian besar aspek yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang, tapi belum diformalkan. Beberapa aspek mungkin telah dipertimbangkan, tetapi cakupannya masih terbatas.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki proses untuk menganalisis dan mengevaluasi data dan informasi yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang", + }, + { + text: "Organisasi telah menjalankan proses untuk menganalisis dan mengevaluasi data dan informasi pada seluruh aspek yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang, dan telah diformalkan. Organisasi telah memiliki metode yang terstruktur untuk melakukan analisis risiko.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki proses untuk menganalisis dan mengevaluasi data dan informasi yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang", + }, + { + text: "Organisasi telah memiliki proses untuk menganalisis dan mengevaluasi data dan informasi pada seluruh aspek yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang, dan telah diformalkan. Organisasi telah memiliki metode yang terstruktur untuk melakukan analisis risiko, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki proses untuk menganalisis dan mengevaluasi data dan informasi yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang", + }, + { + text: "Organisasi telah memiliki proses untuk menganalisis dan mengevaluasi data dan informasi pada seluruh aspek yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang, dan telah diformalkan. Organisasi telah memiliki metode yang terstruktur untuk melakukan analisis risiko, dilakukan monitoring dan direview secara berkala. Berdasarkan hasil review dan umpan balik, ada tindakan yang diambil untuk memperbaiki proses ini secara terus-menerus, memastikan bahwa Organisasi tetap adaptif terhadap perubahan lingkungan dan ancaman keamanan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki proses untuk menganalisis dan mengevaluasi data dan informasi yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang", + }, + { + text: "Organisasi belum memiliki kebijakan dan prosedur yang efektif untuk mengelola risiko siber. Tidak ada upaya yang dilakukan untuk merencanakan atau mengimplementasikan aktivitas tersebut.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kebijakan dan prosedur yang efektif untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan", + }, + { + text: "Organisasi telah menerapkan kebijakan dan prosedur untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber pada sebagian kecil aspek, sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan. tetapi belum ada penetapan secara formal", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kebijakan dan prosedur yang efektif untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan", + }, + { + text: "Organisasi telah menerapkan kebijakan dan prosedur untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber pada sebagian besar aspek, sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan. tetapi belum ada penetapan secara formal", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kebijakan dan prosedur yang efektif untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan", + }, + { + text: "Organisasi telah menerapkan kebijakan dan prosedur untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber pada seluruh aspek, sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan. dan telah ada penetapan secara formal", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kebijakan dan prosedur yang efektif untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan", + }, + { + text: "Organisasi telah menerapkan kebijakan dan prosedur untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber pada seluruh aspek, sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan. dan telah ada penetapan secara formal, dilakukan monitoring pelaksanaan kebijakan ini dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kebijakan dan prosedur yang efektif untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan", + }, + { + text: "Organisasi telah menerapkan kebijakan dan prosedur untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber pada seluruh aspek, sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan. dan telah ada penetapan secara formal, dilakukan monitoring pelaksanaan kebijakan ini dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan serta penerapan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki kebijakan dan prosedur yang efektif untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan", + }, + { + text: "Organisasi belum menentukan dengan jelas rincian tindakan untuk mencegah kemungkinan risiko keamanan, dan belum mendokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan berdasarkan hasil penilaian risiko.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berdasarkan hasil penilaian risiko, tentukan dengan jelas rincian tindakan untuk mencegah kemungkinan risiko keamanan, dan dokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan.", + }, + { + text: "Organisasi telah menentukan dengan jelas rincian tindakan pada sebagian kecil aspek untuk mencegah kemungkinan risiko keamanan, dan mendokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan berdasarkan hasil penilaian risiko, namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berdasarkan hasil penilaian risiko, tentukan dengan jelas rincian tindakan untuk mencegah kemungkinan risiko keamanan, dan dokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan.", + }, + { + text: "Organisasi telah menentukan dengan jelas rincian tindakan pada sebagian besar aspek untuk mencegah kemungkinan risiko keamanan, dan mendokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan berdasarkan hasil penilaian risiko, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berdasarkan hasil penilaian risiko, tentukan dengan jelas rincian tindakan untuk mencegah kemungkinan risiko keamanan, dan dokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan.", + }, + { + text: "Organisasi telah menentukan dengan jelas rincian tindakan pada seluruh aspek untuk mencegah kemungkinan risiko keamanan, dan mendokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan berdasarkan hasil penilaian risiko, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berdasarkan hasil penilaian risiko, tentukan dengan jelas rincian tindakan untuk mencegah kemungkinan risiko keamanan, dan dokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan.", + }, + { + text: "Organisasi telah menentukan dengan jelas rincian tindakan untuk mencegah kemungkinan risiko keamanan, dan dokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan berdasarkan hasil penilaian risiko dan telah dilakukan secara menyeluruh terhadap setiap aset informasi baik yang mendukung secara langsung fungsi vital, maupun tidak langsung selama masih dikelola oleh Organisasi dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berdasarkan hasil penilaian risiko, tentukan dengan jelas rincian tindakan untuk mencegah kemungkinan risiko keamanan, dan dokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan.", + }, + { + text: "Organisasi telah menentukan dengan jelas rincian tindakan untuk mencegah kemungkinan risiko keamanan, dan dokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan berdasarkan hasil penilaian risiko dan telah dilakukan secara menyeluruh terhadap setiap aset informasi baik yang mendukung secara langsung fungsi vital, maupun tidak langsung selama masih dikelola oleh Organisasi dan telah diformalkan, dilakukan monitoring dan direview secara berkala, serta selalu melakukan pebaikan bekelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berdasarkan hasil penilaian risiko, tentukan dengan jelas rincian tindakan untuk mencegah kemungkinan risiko keamanan, dan dokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan.", + }, + { + text: "Organisasi belum melakukan evaluasi terhadap hasil penerapan respon risiko secara berkelanjutan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Evaluasi hasil penerapan respon risiko secara berkelanjutan.", + }, + { + text: "Organisasi telah melakukan evaluasi pada sebagian kecil aspek terhadap hasil penerapan respon risiko secara berkelanjutan, namun masih belum melakukan tindakan kongkrit, dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Evaluasi hasil penerapan respon risiko secara berkelanjutan.", + }, + { + text: "Organisasi telah melakukan evaluasi pada sebagian besar aspek terhadap hasil penerapan respon risiko secara berkelanjutan, dan belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Evaluasi hasil penerapan respon risiko secara berkelanjutan.", + }, + { + text: "Organisasi telah melakukan evaluasi pada seluruh aspek terhadap hasil penerapan respon risiko secara berkelanjutan, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Evaluasi hasil penerapan respon risiko secara berkelanjutan.", + }, + { + text: "Organisasi telah melakukan evaluasi pada seluruh aspek terhadap hasil penerapan respon risiko secara berkelanjutan, dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Evaluasi hasil penerapan respon risiko secara berkelanjutan.", + }, + { + text: "Organisasi telah melakukan evaluasi pada seluruh aspek terhadap hasil penerapan respon risiko secara berkelanjutan, dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan dan menerapkan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Evaluasi hasil penerapan respon risiko secara berkelanjutan.", + }, + { + text: "Organisasi belum menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku.", + }, + { + text: "Organisasi telah menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku pada sebagian kecil aspek, tetapi belum ada tindakan yang diambil untuk melaksanakannya secara aktif dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku.", + }, + { + text: "Organisasi telah menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku pada sebagian besar aspek, dan belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku.", + }, + { + text: "Organisasi telah menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku secara menyeluruh terhadap aspek yang relevan dan telah disahkan pimpinan dalam bentuk formal", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku.", + }, + { + text: "Organisasi telah menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku secara menyeluruh terhadap aspek yang relevan dan telah disahkan pimpinan dalam bentuk formal, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku.", + }, + { + text: "Organisasi telah menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku secara menyeluruh terhadap aspek yang relevan dan telah disahkan pimpinan dalam bentuk formal, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan serta menerapkan mekanisme otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku.", + }, + { + text: "Organisasi belum memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan. Tidak ada upaya yang dilakukan untuk merencanakan atau mengimplementasikan aktivitas tersebut.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan", + }, + { + text: "Organisasi telah memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan, dan menerapkannya pada sebagian kecil aspek, dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan", + }, + { + text: "Organisasi telah memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan, dan menerapkannya pada sebagian besar aspek, dan belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan", + }, + { + text: "Organisasi telah memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan, dan menerapkannya secara menyeluruh dan mencakup semua aspek yang relevan, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan", + }, + { + text: "Organisasi telah memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan, dan menerapkannya secara menyeluruh dan mencakup semua aspek yang relevan, dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan", + }, + { + text: "Organisasi telah memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan, dan menerapkannya secara menyeluruh dan mencakup semua aspek yang relevan, dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi untuk memperbaiki mekanisme tersebut secara terus-menerus, memastikan bahwa Organisasi tetap adaptif terhadap perubahan lingkungan dan kebutuhan komunikasi yang mungkin berubah.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan", + }, + { + text: "Organisasi belum melakukan Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan mengkomunikasikan hasilnya kepada pihak yang tepat di dalam organisasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan komunikasikan hasilnya kepada pihak yang tepat di dalam organisasi (misalnya pimpinan organisasi).", + }, + { + text: "Organisasi sudah melakukan Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan mengkomunikasikan hasilnya kepada pihak yang tepat di dalam organisasi, namun baru diterapkan pada sebagian kecil aspek dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan komunikasikan hasilnya kepada pihak yang tepat di dalam organisasi (misalnya pimpinan organisasi).", + }, + { + text: "Organisasi sudah melakukan Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan mengkomunikasikan hasilnya kepada pihak yang tepat di dalam organisasi, diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan komunikasikan hasilnya kepada pihak yang tepat di dalam organisasi (misalnya pimpinan organisasi).", + }, + { + text: "Organisasi sudah melakukan Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan mengkomunikasikan hasilnya kepada pihak yang tepat di dalam organisasi, diterapkan pada seluruh aspek dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan komunikasikan hasilnya kepada pihak yang tepat di dalam organisasi (misalnya pimpinan organisasi).", + }, + { + text: "Organisasi sudah melakukan Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan mengkomunikasikan hasilnya kepada pihak yang tepat di dalam organisasi, diterapkan pada seluruh aspek dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan komunikasikan hasilnya kepada pihak yang tepat di dalam organisasi (misalnya pimpinan organisasi).", + }, + { + text: "Organisasi sudah melakukan Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan mengkomunikasikan hasilnya kepada pihak yang tepat di dalam organisasi, diterapkan pada seluruh aspek dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan diperbaiki secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan komunikasikan hasilnya kepada pihak yang tepat di dalam organisasi (misalnya pimpinan organisasi).", + }, + { + text: "Organisasi belum menetapkan serta menerapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tetapkan serta terapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait.", + }, + { + text: "Organisasi sudah menetapkan serta menerapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait, namun baru diterapkan pada sebagian kecil aspek dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tetapkan serta terapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait.", + }, + { + text: "Organisasi sudah menetapkan serta menerapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait, diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tetapkan serta terapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait.", + }, + { + text: "Organisasi sudah menetapkan serta menerapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait, diterapkan pada seluruh aspek dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tetapkan serta terapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait.", + }, + { + text: "Organisasi sudah menetapkan serta menerapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait, diterapkan pada seluruh aspek dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tetapkan serta terapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait.", + }, + { + text: "Organisasi sudah menetapkan serta menerapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait, diterapkan pada seluruh aspek dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan diperbaiki secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tetapkan serta terapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait.", + }, + { + text: "Organisasi belum memiliki mekanisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko atau mengimplementasikan rekomendasi perbaikan. Tidak ada upaya yang dilakukan untuk merencanakan atau mengimplementasikan aktivitas tersebut.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki meknisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan", + }, + { + text: "Organisasi telah memiliki mekanisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan, namun baru diterapkan pada sebagian kecil aspek dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki meknisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan", + }, + { + text: "Organisasi telah memiliki mekanisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan, telah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki meknisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan", + }, + { + text: "Organisasi telah memiliki mekanisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan, telah diterapkan pada seluruh besar aspek dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki meknisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan", + }, + { + text: "Organisasi telah memiliki mekanisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan, telah diterapkan pada seluruh besar aspek dan telah diformalkan, dilakukan monitoring dan direview secara berkala meninjau kembali dan mengevaluasi efektivitasnya. Ada upaya untuk memastikan bahwa audit tersebut tetap relevan dan efisien seiring waktu.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki meknisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan", + }, + { + text: "Organisasi telah memiliki mekanisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan, telah diterapkan pada seluruh besar aspek dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan untuk memastikan bahwa Organisasi terus berkembang dan meningkatkan keefektifan dan efisiensinya.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memiliki meknisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan", + }, + { + text: "Organisasi belum melakukan reviu terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko. Tidak ada upaya yang dilakukan untuk merencanakan atau mengimplementasikan aktivitas tersebut.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko.", + }, + { + text: "Organisasi sudah melakukan reviu terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko, tetapi baru diterapkan pada sebagian kecil aspek dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko.", + }, + { + text: "Organisasi sudah melakukan reviu terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko, telah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko.", + }, + { + text: "Organisasi sudah melakukan reviu secara keseluruhan terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko.", + }, + { + text: "Organisasi sudah melakukan reviu secara keseluruhan dan disahkan oleh pimpinan terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko.", + }, + { + text: "Organisasi sudah melakukan reviu secara keseluruhan dan disahkan oleh pimpinan terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko.", + }, + { + text: "Organisasi belum memiliki standar tindakan keamanan yang relevan terkait rantai pasok", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan standar tindakan keamanan yang relevan dengan rantai pasokan dan menyepakati konten dengan mitra bisnis setelah memperjelas ruang lingkup tanggung jawab masing-masing", + }, + { + text: "Organisasi telah merumuskan sebagian kecil aspek standar tindakan keamanan yang relevan terkait rantai pasok tapi belum diformalkan dalam bentuk NSPK", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan standar tindakan keamanan yang relevan dengan rantai pasokan dan menyepakati konten dengan mitra bisnis setelah memperjelas ruang lingkup tanggung jawab masing-masing", + }, + { + text: "Organisasi telah merumuskan sebagian kecil aspek standar tindakan keamanan yang relevan terkait rantai pasok tapi belum diformalkan dalam bentuk NSPK. Hal-hal kesepakatan terkait konten keamanan dengan mitra bisnis mulai diperjelas.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan standar tindakan keamanan yang relevan dengan rantai pasokan dan menyepakati konten dengan mitra bisnis setelah memperjelas ruang lingkup tanggung jawab masing-masing", + }, + { + text: "Organisasi telah merumuskan seluruh aspek standar tindakan keamanan yang relevan terkait rantai pasok dan telah diformalkan dalam bentuk NSPK. Hal-hal terkait kesepakatan pembagian peran dan tanggung jawab masing-masing pihak telah ditentukan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan standar tindakan keamanan yang relevan dengan rantai pasokan dan menyepakati konten dengan mitra bisnis setelah memperjelas ruang lingkup tanggung jawab masing-masing", + }, + { + text: "Organisasi telah merumuskan seluruh aspek standar tindakan keamanan yang relevan terkait rantai pasok dan telah diformalkan dalam bentuk NSPK. Hal-hal terkait implementasi keamanan dengan pihak-pihak terkait telah dimonitoring, direviu secara berkala untuk mendapatkan hasil yang efektif", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan standar tindakan keamanan yang relevan dengan rantai pasokan dan menyepakati konten dengan mitra bisnis setelah memperjelas ruang lingkup tanggung jawab masing-masing", + }, + { + text: "Organisasi telah merumuskan seluruh aspek standar tindakan keamanan yang relevan terkait rantai pasok dan telah diformalkan dalam bentuk NSPK. Hal-hal terkait implementasi keamanan dengan pihak-pihak terkait dimonitoring, direviu secara berkala, dan dilakukan perbaikan untuk mendapatkan hasil yang efektif", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan standar tindakan keamanan yang relevan dengan rantai pasokan dan menyepakati konten dengan mitra bisnis setelah memperjelas ruang lingkup tanggung jawab masing-masing", + }, + { + text: "Organisasi belum merencanakan pengaturan akses kontrol terkait rantai pasok", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hal yang perlu dipertimbangkan dalam proses manajemen risiko rantai pasokan diantaranya adalah penentuan jenis akses yang diberikan, alasan kebutuhan akses, metode akses, jangka waktu, dan potensi risiko yang terjadi apabila akses tersebut disalahgunakan", + }, + { + text: "Organisasi telah menjalankan sebagian kecil metode penentuan akses yang diberikan terhadap rantai pasok. metode penentuan akses yang telah dilakukan meliputi: 1. Penentuan jenis akses yang diberikan; 2. reviu kebutuhan akses; 3. metode akses yang diberikan; 4. jangka waktu yang diberikan; atau 5. identifikasi potensi risiko yang terjadi apabila akses disalahgunakan namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hal yang perlu dipertimbangkan dalam proses manajemen risiko rantai pasokan diantaranya adalah penentuan jenis akses yang diberikan, alasan kebutuhan akses, metode akses, jangka waktu, dan potensi risiko yang terjadi apabila akses tersebut disalahgunakan", + }, + { + text: "Organisasi telah menjalankan sebagian besar metode penentuan akses yang diberikan terhadap rantai pasok. Metode penentuan akses yang telah dilakukan meliputi: 1. Penentuan jenis akses yang diberikan; 2. reviu kebutuhan akses; 3. metode akses yang diberikan; 4. jangka waktu yang diberikan; atau 5. identifikasi potensi risiko yang terjadi apabila akses disalahgunakan namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hal yang perlu dipertimbangkan dalam proses manajemen risiko rantai pasokan diantaranya adalah penentuan jenis akses yang diberikan, alasan kebutuhan akses, metode akses, jangka waktu, dan potensi risiko yang terjadi apabila akses tersebut disalahgunakan", + }, + { + text: "Organisasi telah menjalankan keseluruhan metode penentuan akses yang diberikan terhadap rantai pasok dan telah diformalkan dalam bentuk NSPK. Metode penentuan akses yang telah dilakukan meliputi: 1. Penentuan jenis akses yang diberikan; 2. reviu kebutuhan akses; 3. metode akses yang diberikan; 4. jangka waktu yang diberikan; atau 5. identifikasi potensi risiko yang terjadi apabila akses disalahgunakan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hal yang perlu dipertimbangkan dalam proses manajemen risiko rantai pasokan diantaranya adalah penentuan jenis akses yang diberikan, alasan kebutuhan akses, metode akses, jangka waktu, dan potensi risiko yang terjadi apabila akses tersebut disalahgunakan", + }, + { + text: "Organisasi telah menjalankan keseluruhan metode penentuan akses yang diberikan terhadap rantai pasok dan telah diformalkan dalam bentuk NSPK. Metode penentuan akses yang telah dilakukan meliputi: 1. Penentuan jenis akses yang diberikan; 2. reviu kebutuhan akses; 3. metode akses yang diberikan; 4. jangka waktu yang diberikan; atau 5. identifikasi potensi risiko yang terjadi apabila akses disalahgunakan. Komponen-komponen terkait telah dimonitoring dan direviu secara berkala namun belum ada upaya perbaikan berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hal yang perlu dipertimbangkan dalam proses manajemen risiko rantai pasokan diantaranya adalah penentuan jenis akses yang diberikan, alasan kebutuhan akses, metode akses, jangka waktu, dan potensi risiko yang terjadi apabila akses tersebut disalahgunakan", + }, + { + text: "Organisasi telah menjalankan keseluruhan metode penentuan akses yang diberikan terhadap rantai pasok dan telah diformalkan dalam bentuk NSPK. Metode penentuan akses yang telah dilakukan meliputi: 1. Penentuan jenis akses yang diberikan; 2. reviu kebutuhan akses; 3. metode akses yang diberikan; 4. jangka waktu yang diberikan; atau 5. identifikasi potensi risiko yang terjadi apabila akses disalahgunakan. Komponen-komponen terkait telah dimonitoring dan direviu secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hal yang perlu dipertimbangkan dalam proses manajemen risiko rantai pasokan diantaranya adalah penentuan jenis akses yang diberikan, alasan kebutuhan akses, metode akses, jangka waktu, dan potensi risiko yang terjadi apabila akses tersebut disalahgunakan", + }, + { + text: "Organisasi belum menjalankan identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan dengan penyelenggara IIV.", + }, + { + text: "Organisasi telah melaksanakan sebagian kecil aspek identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan, dan belum diformalkan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan dengan penyelenggara IIV.", + }, + { + text: "Organisasi telah melaksanakan sebagian besar aspek identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan namun belum diformalkan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan dengan penyelenggara IIV.", + }, + { + text: "Organisasi telah melaksanakan keseluruhan identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan dan telah diformalkan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan dengan penyelenggara IIV.", + }, + { + text: "Organisasi telah melaksanakan keseluruhan identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya dan telah diformalkan. Hasil identifikasi dilakukan monitoring dan reviu secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan dengan penyelenggara IIV.", + }, + { + text: "Organisasi telah melaksanakan keseluruhan identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya dan telah diformalkan. Hasil identifikasi dilakukan monitoring dan reviu secara berkala serta perbaikan yang berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan dengan penyelenggara IIV.", + }, + { + text: "Organisasi belum memiliki program perumusan dan pengelolaan persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan mengelola persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga.", + }, + { + text: "Organisasi telah merumuskan dan mengelola persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga, yang diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan mengelola persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga.", + }, + { + text: "Organisasi telah merumuskan dan mengelola persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga, yang diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan mengelola persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga.", + }, + { + text: "Organisasi telah secara menyeluruh merumuskan dan mengelola persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga secara efektif. Penyusunan program telah melibatkan pihak-pihak terkait termasuk pihak ketiga yang terlibat dan telah diformalkan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan mengelola persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga.", + }, + { + text: "Organisasi telah menjalankan keseluruhan program perumusan dan pengelolaan persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga secara efektif. Penyusunan program telah melibatkan pihak-pihak terkait termasuk pihak ketiga yang terlibat. Program yang disusun dilakukan monitoring dan reviu secara berkala untuk mengukur tingkat efektifitas kegiatan.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan mengelola persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga.", + }, + { + text: "Organisasi telah menjalankan keseluruhan program perumusan dan pengelolaan persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga secara efektif. Penyusunan program telah melibatkan pihak-pihak terkait termasuk pihak ketiga yang terlibat. Program yang disusun dilakukan monitoring, reviu dan diperbaiki secara berkala untuk meningkatkan efektifitas kegiatan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan mengelola persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga.", + }, + { + text: "Organisasi belum melakukan kegiatan pemeriksaan kepatuhan manajemen pihak ketiga terhadap persyaratan keamanan, standar, dan peraturam perundangan yang berlaku saat penandatangan kontrak.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah manajemen pihak ketiga telah dengan benar mematuhi persyaratan keamanan, standar, dan peraturan perundangan yang berlaku, dengan mempertimbangkan tujuan kontrak tersebut dan hasil manajemen risiko.", + }, + { + text: "Organisasi telah melakukan kegiatan pemeriksaan kepatuhan manajemen pihak ketiga terhadap persyaratan keamanan, standar, dan peraturam perundangan yang berlaku saat penandatangan kontrak, yang diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah manajemen pihak ketiga telah dengan benar mematuhi persyaratan keamanan, standar, dan peraturan perundangan yang berlaku, dengan mempertimbangkan tujuan kontrak tersebut dan hasil manajemen risiko.", + }, + { + text: "Organisasi telah melakukan kegiatan pemeriksaan kepatuhan manajemen pihak ketiga terhadap persyaratan keamanan, standar, dan peraturam perundangan yang berlaku saat penandatangan kontrak. yang diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah manajemen pihak ketiga telah dengan benar mematuhi persyaratan keamanan, standar, dan peraturan perundangan yang berlaku, dengan mempertimbangkan tujuan kontrak tersebut dan hasil manajemen risiko.", + }, + { + text: "Organisasi telah melakukan keseluruhan pemeriksaan kepatuhan manajemen pihak ketiga terhadap persyaratan keamanan, standar, dan peraturam perundangan yang berlaku saat penandatangan kontrak secara menyeluruh dengan mempertimbangkan dari tujuan penandatanganan kontrak serta hasil manajemen risiko. Pelaksanaan telah diformalkan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah manajemen pihak ketiga telah dengan benar mematuhi persyaratan keamanan, standar, dan peraturan perundangan yang berlaku, dengan mempertimbangkan tujuan kontrak tersebut dan hasil manajemen risiko.", + }, + { + text: "Organisasi telah mewajibkan menjalankan pemeriksaan kepatuhan manajemen pihak ketiga terhadap persyaratan keamanan, standar, dan peraturam perundangan yang berlaku saat penandatangan kontrak secara menyeluruh dengan mempertimbangkan dari tujuan penandatanganan kontrak serta hasil manajemen risiko. Komponen-komponen yang menjadi perhatian dalam kontrak dilakukan monitoring, reviu secara berkala namun belum dilakukan perbaikan berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah manajemen pihak ketiga telah dengan benar mematuhi persyaratan keamanan, standar, dan peraturan perundangan yang berlaku, dengan mempertimbangkan tujuan kontrak tersebut dan hasil manajemen risiko.", + }, + { + text: "Organisasi telah mewajibkan menjalankan pemeriksaan kepatuhan manajemen pihak ketiga terhadap persyaratan keamanan, standar, dan peraturam perundangan yang berlaku saat penandatangan kontrak secara menyeluruh dengan mempertimbangkan dari tujuan penandatanganan kontrak serta hasil manajemen risiko. Komponen-komponen yang menjadi perhatian dalam kontrak dilakukan monitoring, reviu secara berkala, dan telah dilakukan perbaikan berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah manajemen pihak ketiga telah dengan benar mematuhi persyaratan keamanan, standar, dan peraturan perundangan yang berlaku, dengan mempertimbangkan tujuan kontrak tersebut dan hasil manajemen risiko.", + }, + { + text: "Organisasi belum melakukan kegiatan pemeriksaan terhadap produk dan layanan yang disediakan oleh pihak ketiga telah sesuai dengan persyaratan keamanan yang ada di organisasi.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah produk dan layanan yang disediakan oleh pihak ketiga sesuai dengan persyaratan keamanan yang ada di organisasi.", + }, + { + text: "Organisasi telah melaksanakan kegiatan pemeriksaan terhadap produk dan layanan yang disediakan oleh pihak ketiga telah sesuai dengan persyaratan keamanan yang ada di organisasi, yang diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah produk dan layanan yang disediakan oleh pihak ketiga sesuai dengan persyaratan keamanan yang ada di organisasi.", + }, + { + text: "Organisasi telah melaksanakan pemeriksaan terhadap produk dan layanan yang disediakan oleh pihak ketiga telah sesuai dengan persyaratan keamanan yang ada di organisasi namun pelaksanaanya pada sebagian besar aspek dan masih belum menyeluruh, serta belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah produk dan layanan yang disediakan oleh pihak ketiga sesuai dengan persyaratan keamanan yang ada di organisasi.", + }, + { + text: "Organisasi telah melaksanakan pemeriksaan terhadap produk dan layanan yang disediakan oleh pihak ketiga telah sesuai dengan persyaratan keamanan yang ada di organisasi, diterapkan pada seluruh aspek dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah produk dan layanan yang disediakan oleh pihak ketiga sesuai dengan persyaratan keamanan yang ada di organisasi.", + }, + { + text: "Organisasi telah mewajibkan terhadap pemeriksaan produk dan layanan yang disediakan oleh pihak ketiga telah sesuai dengan persyaratan keamanan yang ada di organisasi secara menyeluruh dan telah diformalkan. Komponen-komponen yang menjadi perhatian dalam kontrak dilakukan reviu secara berkala namun belum dilakukan perbaikan berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah produk dan layanan yang disediakan oleh pihak ketiga sesuai dengan persyaratan keamanan yang ada di organisasi.", + }, + { + text: "Organisasi telah mewajibkan terhadap pemeriksaan produk dan layanan yang disediakan oleh pihak ketiga telah sesuai dengan persyaratan keamanan yang ada di organisasi secara menyeluruh dan telah diformalkan. Komponen-komponen yang menjadi perhatian dalam kontrak dilakukan reviu secara berkala dan dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah produk dan layanan yang disediakan oleh pihak ketiga sesuai dengan persyaratan keamanan yang ada di organisasi.", + }, + { + text: "Organisasi belum melakukan penilaian", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan penilaian secara berkala melalui audit, hasil pengujian, atau pemeriksaan dari pihak terkait untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka.", + }, + { + text: "Organisasi telah melakukan penilaian yang diterapkan pada sebagian kecil aspek untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka, namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan penilaian secara berkala melalui audit, hasil pengujian, atau pemeriksaan dari pihak terkait untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka.", + }, + { + text: "Organisasi telah melakukan penilaian yang diterapkan pada sebagian besar aspek untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan penilaian secara berkala melalui audit, hasil pengujian, atau pemeriksaan dari pihak terkait untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka.", + }, + { + text: "Organisasi telah melakukan Penilaian yang diterapkan pada seluruh aspek secara berkala melalui audit, hasil pengujian, atau pemeriksaan dari pihak terkait untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan penilaian secara berkala melalui audit, hasil pengujian, atau pemeriksaan dari pihak terkait untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka.", + }, + { + text: "Organisasi telah melakukan Penilaian yang diterapkan pada seluruh aspek secara berkala melalui audit, hasil pengujian, atau pemeriksaan dari pihak terkait untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka dan telah diformalkan, dimonitoring dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan penilaian secara berkala melalui audit, hasil pengujian, atau pemeriksaan dari pihak terkait untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka.", + }, + { + text: "Organisasi telah melakukan Penilaian yang diterapkan pada seluruh aspek secara berkala melalui audit, hasil pengujian, atau pemeriksaan dari pihak terkait untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka dan telah diformalkan, dimonitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan penilaian secara berkala melalui audit, hasil pengujian, atau pemeriksaan dari pihak terkait untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka.", + }, + { + text: "Prosedur belum dirumuskan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan menerapkan prosedur untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan.", + }, + { + text: "Organisasi telah merumuskan dan menerapkan prosedur pada sebagian kecil aspek untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan, namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan menerapkan prosedur untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan.", + }, + { + text: "Organisasi telah merumuskan dan menerapkan prosedur pada sebagian besar aspek untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan menerapkan prosedur untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan.", + }, + { + text: "Organisasi telah merumuskan dan menerapkan prosedur pada seluruh aspek untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan menerapkan prosedur untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan.", + }, + { + text: "Organisasi telah merumuskan dan menerapkan prosedur pada seluruh aspek untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan, dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan menerapkan prosedur untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan.", + }, + { + text: "Organisasi telah merumuskan dan menerapkan prosedur pada seluruh aspek untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan, dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dilakukan evaluasi dan perbaikan berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Merumuskan dan menerapkan prosedur untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan.", + }, + { + text: "Pengumpulan dan penyimpanan data belum dilakukan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengumpulkan dan menyimpan data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum.", + }, + { + text: "Organisasi telah melakukan Pengumpulan dan penyimpanan sebagian kecil data dengan aman, namun belum ada prosedur formal", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengumpulkan dan menyimpan data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum.", + }, + { + text: "Organisasi telah mengumpulkan dan menyimpan sebagian besar data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengumpulkan dan menyimpan data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum.", + }, + { + text: "Organisasi telah mengumpulkan dan menyimpan keseluruhan data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengumpulkan dan menyimpan data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum.", + }, + { + text: "Organisasi telah mengumpulkan dan menyimpan keseluruhan data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum, dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengumpulkan dan menyimpan data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum.", + }, + { + text: "Organisasi telah mengumpulkan dan menyimpan keseluruhan data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum, dan telah diformalkan, dilakukan monitoring dan direview secara berkala, serta dilakukan evaluasi dan perbaikan berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengumpulkan dan menyimpan data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum.", + }, + { + text: "Prosedur respons insiden belum dirumuskan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyiapkan dan menguji prosedur respons insiden dengan pihak terkait yang terlibat dalam aktivitas respons insiden untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan.", + }, + { + text: "Organisasi telah menerapkan Prosedur respons insiden pada sebagian kecil aspek yang melibatkan pihak terkait untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan, namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyiapkan dan menguji prosedur respons insiden dengan pihak terkait yang terlibat dalam aktivitas respons insiden untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan.", + }, + { + text: "Organisasi telah menerapkan Prosedur respons insiden pada sebagian besar aspek yang melibatkan pihak terkait untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyiapkan dan menguji prosedur respons insiden dengan pihak terkait yang terlibat dalam aktivitas respons insiden untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan.", + }, + { + text: "Organisasi telah menerapkan Prosedur respons insiden pada seluruh aspek yang melibatkan pihak terkait untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan, dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyiapkan dan menguji prosedur respons insiden dengan pihak terkait yang terlibat dalam aktivitas respons insiden untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan.", + }, + { + text: "Organisasi telah menyiapkan dan menguji pada seluruh aspek prosedur respons insiden dengan pihak terkait yang terlibat dalam aktivitas respons insiden untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan, dan telah diformalkan, dilakukan monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyiapkan dan menguji prosedur respons insiden dengan pihak terkait yang terlibat dalam aktivitas respons insiden untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan.", + }, + { + text: "Organisasi telah menyiapkan dan menguji pada seluruh aspek prosedur respons insiden dengan pihak terkait yang terlibat dalam aktivitas respons insiden untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan, dan telah diformalkan, dilakukan monitoring dan direview secara berkala, dievaluasi dan dilakukan perbaikan berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyiapkan dan menguji prosedur respons insiden dengan pihak terkait yang terlibat dalam aktivitas respons insiden untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan.", + }, + { + text: "Prosedur keamanan belum dirumuskan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun prosedur keamanan yang akan dijalankan ketika kontrak dengan pihak ketiga selesai. (misalnya, pemutusan hak akses ketika berakhirnya masa kontrak)", + }, + { + text: "Organisasi telah menerapkan Prosedur keamanan pada sebagian kecil aspek yang akan dijalankan ketika kontrak dengan pihak ketiga selesai, namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun prosedur keamanan yang akan dijalankan ketika kontrak dengan pihak ketiga selesai. (misalnya, pemutusan hak akses ketika berakhirnya masa kontrak)", + }, + { + text: "Organisasi telah menerapkan Prosedur keamanan pada sebagian besar aspek yang akan dijalankan ketika kontrak dengan pihak ketiga selesai, namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun prosedur keamanan yang akan dijalankan ketika kontrak dengan pihak ketiga selesai. (misalnya, pemutusan hak akses ketika berakhirnya masa kontrak)", + }, + { + text: "Organisasi telah menerapkan prosedur keamanan pada seluruh aspek yang akan dijalankan ketika kontrak dengan pihak ketiga selesai. (misalnya, pemutusan hak akses ketika berakhirnya masa kontrak), dan telah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun prosedur keamanan yang akan dijalankan ketika kontrak dengan pihak ketiga selesai. (misalnya, pemutusan hak akses ketika berakhirnya masa kontrak)", + }, + { + text: "Organisasi telah menerapkan prosedur keamanan pada seluruh aspek yang akan dijalankan ketika kontrak dengan pihak ketiga selesai. (misalnya, pemutusan hak akses ketika berakhirnya masa kontrak), dan telah diformalkan, telah dimonitoring dan direview tetapi belum perbaikan berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun prosedur keamanan yang akan dijalankan ketika kontrak dengan pihak ketiga selesai. (misalnya, pemutusan hak akses ketika berakhirnya masa kontrak)", + }, + { + text: "Organisasi telah menerapkan prosedur keamanan pada seluruh aspek yang akan dijalankan ketika kontrak dengan pihak ketiga selesai. (misalnya, pemutusan hak akses ketika berakhirnya masa kontrak), dan telah diformalkan, telah dimonitoring dan direview dan telah diperbaiki berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun prosedur keamanan yang akan dijalankan ketika kontrak dengan pihak ketiga selesai. (misalnya, pemutusan hak akses ketika berakhirnya masa kontrak)", + }, + { + text: "Peningkatan standar belum dilakukan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Senantiasa meningkatkan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok.", + }, + { + text: "Peningkatan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok telah diterapkan pada sebagian kecil aspek dan belum disahkan ", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Senantiasa meningkatkan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok.", + }, + { + text: "Peningkatan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok telah diterapkan pada sebagian besar aspek namun belum disahkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Senantiasa meningkatkan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok.", + }, + { + text: "Peningkatan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok telah diterapkan keseluruhan dan telah disahkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Senantiasa meningkatkan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok.", + }, + { + text: "Peningkatan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok telah dimonitoring dan direview tetapi belum perbaikan berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Senantiasa meningkatkan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok.", + }, + { + text: "Peningkatan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok sudah diperbaiki berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Senantiasa meningkatkan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok.", + }, + //End of Identifikasi + //Option of Penanggulangan Dan Pemulihan + { + text: "- Organisasi belum menentukan dan menetapkan prosedur tanggap insiden serta belum ada pembagian peran yang jelas antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan prosedur tanggap insiden beserta pembagian peran yang jelas antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + }, + { + text: "- Organisasi belum memformalkan penentuan dan penetapan prosedur tanggap insiden namun penerapan dan pembagian peran sudah diterapkan pada sebagian kecil aspek antara lain pihak manajemen, personel pengelola IIV, dan pihak lainnya, yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan prosedur tanggap insiden beserta pembagian peran yang jelas antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + }, + { + text: "- Organisasi belum memformalkan penentuan dan penetapan prosedur tanggap insiden namun penerapan dan pembagian peran sudah diterapkan pada sebagian besar aspek antara lain pihak manajemen, personel pengelola IIV, dan pihak lainnya, yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan prosedur tanggap insiden beserta pembagian peran yang jelas antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + }, + { + text: "- Organisasi telah memformalkan penentuan dan penetapan prosedur tanggap insiden beserta pembagian peran yang jelas serta sudah diterapkan pada seluruh aspek antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan prosedur tanggap insiden beserta pembagian peran yang jelas antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + }, + { + text: "- Organisasi telah memformalkan penentuan dan penetapan serta melakukan review terhadap prosedur tanggap insiden beserta pembagian peran yang jelas dan sudah diterapkan pada seluruh aspek antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan prosedur tanggap insiden beserta pembagian peran yang jelas antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + }, + { + text: "- Organisasi telah memformalkan penentuan dan penetapan serta melakukan review terhadap prosedur tanggap insiden beserta pembagian peran yang jelas dan sudah diterapkan pada seluruh aspek antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber yang diperbaiki secara berkala.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan prosedur tanggap insiden beserta pembagian peran yang jelas antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + }, + { + text: "- Organisasi belum menentukan dan menetapkan rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menetapkan prosedur rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan", + }, + { + text: "- Organisasi sudah menentukan dan menetapkan sebagian kecil aspek dari rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menetapkan prosedur rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan", + }, + { + text: "- Organisasi sudah menentukan dan menetapkan sebagian besar aspek dari rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menetapkan prosedur rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan", + }, + { + text: "- Organisasi sudah menentukan dan menetapkan keseluruhan aspek serta memformalkan rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menetapkan prosedur rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan", + }, + { + text: "- Organisasi sudah menentukan dan menetapkan keseluruhan aspek serta memformalkan rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan yang direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menetapkan prosedur rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan", + }, + { + text: "- Organisasi sudah menentukan dan menetapkan keseluruhan aspek serta memformalkan rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan yang direview dan diperbaiki secara berkala", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menetapkan prosedur rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan", + }, + { + text: "- Organisasi belum menentukan skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber.", + }, + { + text: "- Organisasi telah menentukan sebagian kecil skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber.", + }, + { + text: "- Organisasi telah menentukan sebagian besar skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber namun belum diformalkan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber.", + }, + { + text: "- Organisasi telah menentukan dan memformalkan skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber.", + }, + { + text: "- Organisasi telah menentukan, memformalkan serta melakukan review terhadap skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber.", + }, + { + text: "- Organisasi telah menentukan, memformalkan serta melakukan review terhadap skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber yang diperbaiki secara berkala.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber.", + }, + { + text: "- Rencana tanggap Insiden Siber belum dikomunikasikan secara khusus kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan - Tidak ada kebijakan/panduan/pedoman terkait komunikasi secara khusus kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana tanggap Insiden Siber sudah dikomunikasikan secara khusus ke sebagian kecil pihak yang berkepentingan dan berhak sesuai ketentuan - Belum ada kebijakan/panduan/pedoman terkait komunikasi secara khusus kepada beberapa pemangku kepentingan tentang pembelajaran tersebut", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana tanggap Insiden Siber sudah dikomunikasikan kepada sebagian besar pihak yang berkepentingan dan berhak sesuai ketentuan. - Belum ada kebijakan/panduan/pedoman terkait komunikasi secara khusus kepada beberapa pemangku kepentingan tentang pembelajaran tersebut", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana tanggap Insiden Siber sudah dikomunikasikan kepada seluruh pihak yang berkepentingan dan berhak sesuai ketentuan. - Sudah memiliki kebijakan/panduan/pedoman terkait komunikasi secara khusus kepada kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan dalam bentuk.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana tanggap Insiden Siber sudah dikomunikasikan kepada seluruh pihak yang berkepentingan dan berhak sesuai ketentuan. - Sudah memiliki kebijakan/panduan/pedoman tertulis terkait komunikasi secara khusus kepada kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan. - Telah dilakukan review terkait kebijakan komunikasi secara khusus kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana tanggap Insiden Siber sudah dikomunikasikan kepada seluruh pihak yang berkepentingan dan berhak sesuai ketentuan. - Sudah memiliki kebijakan tertulis terkait komunikasi secara khusus kepada kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan. - Telah dilakukan review dan diperbaiki secara berkala terkait kebijakan komunikasi secara khusus kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Organisasi belum menentukan dan menetapkan daftar fungsi dan layanan vital bgai penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV.", + }, + { + text: "- Organisasi telah menentukan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV. - Belum ada penetapan tertulis diorganisasi terkait daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV.", + }, + { + text: "- Organisasi telah menentukan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV. - Penetapan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV sedang disusun/masih dalam bentuk draf/belum diresmikan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV.", + }, + { + text: "- Organisasi telah menentukan dan menetapkan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV. - Penetapan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV telah disusun dan telah diresmikan/diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV.", + }, + { + text: "- Organisasi telah Menentukan dan menetapkan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV. - Organisasi sudah memiliki kebijakan yang telah disusun dan telah diresmikan/diformalkan dan melakukan review secara berkala yang berkaitan dengan penentuan penetapan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV.", + }, + { + text: "- Organisasi telah Menentukan dan menetapkan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan perasional layanan IIV. - Organisasi sudah memiliki kebijakan yang telah disusun dan telah diresmikan/diformalkan dan melakukan review secara berkala yang berkaitan dengan proses penentuan penetapan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV serta dilakukan perbaikan secara berkala.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV.", + }, + { + text: "Organisasi belum menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal..", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal.", + }, + { + text: "- Organisasi telah menentukan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal. - Belum ada penetapan tertulis diorganisasi terkait daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal.", + }, + { + text: "- Organisasi telah menentukan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal. - Penetapan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal sedang disusun/masih dalam bentuk draf/belum diresmikan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal.", + }, + { + text: "- Organisasi telah menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal. - Penetapan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal telah disusun dan telah diresmikan/diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal.", + }, + { + text: "- Organisasi telah Menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal. - Organisasi sudah memiliki kebijakan yang telah disusun dan telah diresmikan/diformalkan dan melakukan review secara berkala yang berkaitan dengan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal.", + }, + { + text: "- Organisasi telah Menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal.. - Organisasi sudah memiliki kebijakan yang telah disusun dan telah diresmikan/diformalkan dan melakukan review secara berkala yang berkaitan dengan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal serta dilakukan perbaikan secara berkala.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal.", + }, + { + text: "Organisasi belum menentukan dan menetapkan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital.", + }, + { + text: "- Organisasi telah menentukan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital. - Belum ada penetapan tertulis diorganisasi terkait daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital.", + }, + { + text: "- Organisasi telah menentukan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital. - Penetapan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital. sedang disusun/masih dalam bentuk draf/belum diresmikan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital.", + }, + { + text: "- Organisasi telah menentukan dan menetapkan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital. - Penetapan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital telah disusun dan telah diresmikan/diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital.", + }, + { + text: "- Organisasi telah Menentukan dan menetapkan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital. - Organisasi sudah memiliki kebijakan yang telah disusun dan telah diresmikan/diformalkan dan melakukan review secara berkala yang berkaitan dengan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital.", + }, + { + text: "- Organisasi telah Menentukan dan menetapkan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital. . - Organisasi sudah memiliki kebijakan yang telah disusun dan telah diresmikan/diformalkan dan melakukan review secara berkala yang berkaitan dengan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital. yang sudah diresmikan serta dilakukan perbaikan secara berkala.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital.", + }, + { + text: "- Rencana keberlangsungan layanan belum dikomunikasikan secara khusus kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan - Tidak ada kebijakan/panduan/pedoman terkait komunikasi secara khusus kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana keberlangsungan layanan dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana keberlangsungan tersebut sudah dikomunikasikan secara khusus ke sebagian kecil pihak yang berkepentingan dan berhak sesuai ketentuan - Belum ada kebijakan/panduan/pedoman terkait komunikasi secara khusus kepada beberapa pemangku kepentingan tentang pembelajaran tersebut", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana keberlangsungan layanan dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana keberlangsungan tersebut sudah dikomunikasikan kepada sebagian besar pihak yang berkepentingan dan berhak sesuai ketentuan. - Belum ada kebijakan/panduan/pedoman terkait komunikasi secara khusus kepada beberapa pemangku kepentingan tentang pembelajaran tersebut", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana keberlangsungan layanan dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana keberlangsungan tersebut sudah dikomunikasikan kepada seluruh pihak yang berkepentingan dan berhak sesuai ketentuan. - Sudah memiliki draf kebijakan/panduan/pedoman terkait komunikasi secara khusus kepada kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan dalam bentuk .", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana keberlangsungan layanan dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana keberlangsungan tersebut sudah dikomunikasikan kepada seluruh pihak yang berkepentingan dan berhak sesuai ketentuan. - Sudah memiliki kebijakan/panduan/pedoman tertulis terkait komunikasi secara khusus kepada kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan. - Sudah dilakukan review terkait kebijakan komunikasi secara khusus kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana keberlangsungan layanan dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana keberlangsungan tersebut sudah dikomunikasikan kepada seluruh pihak yang berkepentingan dan berhak sesuai ketentuan. - Sudah memiliki kebijakan/panduan/pedoman tertulis terkait komunikasi secara khusus kepada kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan. - Sudah dilakukan review dan diperbaiki secara berkala terkait kebijakan komunikasi secara khusus kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana keberlangsungan layanan dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + }, + { + text: "- Rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan belum disusun dan disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. - Belum ada kebijakan/panduan/pedoman terkait simulasi rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. (misalnya dalam kegiatan simulasi kesiapsiagaan Insiden Siber)", + }, + { + text: "- Rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan sudah disimulasikan namun belum secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. - Belum ada kebijakan/panduan/pedoman terkait simulasi rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. (misalnya dalam kegiatan simulasi kesiapsiagaan Insiden Siber)", + }, + { + text: "- Rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan sudah disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. - Belum ada kebijakan/panduan/pedoman terkait simulasi rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. (misalnya dalam kegiatan simulasi kesiapsiagaan Insiden Siber)", + }, + { + text: "- Rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan sudah disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. - Sudah ada kebijakan/panduan/pedoman terkait simulasi rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. (misalnya dalam kegiatan simulasi kesiapsiagaan Insiden Siber)", + }, + { + text: "- Rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan sudah disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. - Sudah ada kebijakan/panduan/pedoman terkait simulasi rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan. •Telah dilakukan review terkait kebijakan simulasi rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. (misalnya dalam kegiatan simulasi kesiapsiagaan Insiden Siber)", + }, + { + text: "- Rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan sudah disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. - Sudah ada kebijakan/panduan/pedoman terkait simulasi rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan. - Telah dilakukan review dan perbaikan secara berkala terkait kebijakan simulasi rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. (misalnya dalam kegiatan simulasi kesiapsiagaan Insiden Siber)", + }, + { + text: "Belum adanya dokumen rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan dan/atau belum adanya pembagian peran yang ditetapkan oleh Organisasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menetapkan personel yang ditugaskan dalam Tim Tanggap Insiden Siber.", + }, + { + text: "Dokumen rencana tanggap Insiden Siber sudah memiliki penanggung jawab, namun belum spesifik, dokumen tersebut belum ditetapkan/diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menetapkan personel yang ditugaskan dalam Tim Tanggap Insiden Siber.", + }, + { + text: "Dokumen rencana tanggap Insiden Siber sudah memiliki penanggung jawab yang ditugaskan secara spesifik namun belum diresmikan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menetapkan personel yang ditugaskan dalam Tim Tanggap Insiden Siber.", + }, + { + text: "Dokumen rencana tanggap Insiden Siber sudah memiliki penanggung jawab yang ditugaskan secara spesifik dan sudah diresmikan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menetapkan personel yang ditugaskan dalam Tim Tanggap Insiden Siber.", + }, + { + text: "Dokumen rencana tanggap Insiden Siber sudah memiliki penanggung jawab yang ditugaskan secara spesifik, sudah diresmikan, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menetapkan personel yang ditugaskan dalam Tim Tanggap Insiden Siber.", + }, + { + text: "Dokumen rencana tanggap Insiden Siber sudah memiliki penanggung jawab yang ditugaskan secara spesifik, sudah diresmikan, direview, dan dilakukan perbaikan secara berkala", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menetapkan personel yang ditugaskan dalam Tim Tanggap Insiden Siber.", + }, + { + text: "Seluruh personel belum mengetahui peran dan urutan pengoperasian dalam proses penanggulangan dan pemulihan, baik karena belum tersampaikannya pembagian peran maupun karena belum adanya pembagian peran", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel mengetahui perannya dan urutan pengoperasian bila respons diperlukan", + }, + { + text: "Sebagian kecil personel mengetahui peran dan urutan pengoperasian dalam proses penanggulangan dan pemulihan, namun tidak dapat mempraktikkannya", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel mengetahui perannya dan urutan pengoperasian bila respons diperlukan", + }, + { + text: "Sebagian besar personel mengetahui peran dan urutan pengoperasian dalam proses penanggulangan dan pemulihan namun tidak dapat mempraktikkannya", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel mengetahui perannya dan urutan pengoperasian bila respons diperlukan", + }, + { + text: "Seluruh personel mengetahui peran dan urutan pengoperasian dalam proses penanggulangan dan pemulihan dan dapat mempraktikkannya", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel mengetahui perannya dan urutan pengoperasian bila respons diperlukan", + }, + { + text: "Seluruh personel mengetahui peran dan urutan pengoperasian dalam proses penanggulangan dan pemulihan, dan dapat mempraktikkannya serta direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel mengetahui perannya dan urutan pengoperasian bila respons diperlukan", + }, + { + text: "Seluruh personel mengetahui peran dan urutan pengoperasian dalam proses penanggulangan dan pemulihan serta dapat mempraktikkannya serta direview dan dilakukan perbaikan secara berkala", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel mengetahui perannya dan urutan pengoperasian bila respons diperlukan", + }, + { + text: "Tidak melibatkan siapapun dalam proses penanggulangan dan pemulihan insiden, termasuk tidak adanya mekanisme eskalasi.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengidentifikasi siapa saja pihak-pihak pihak-pihak terkait dalam proses penanggulangan dan pemulihan insiden, misalnya aparat penegak hukum, regulator, maupun tim TTIS nasional", + }, + { + text: "Terdapat mekanisme eskalasi sehingga memungkinkan untuk melibatkan TTIS sektoral atau TTIS nasional dalam proses penanggulangan dan pemulihan insiden namun belum diformalkan/diresmikan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengidentifikasi siapa saja pihak-pihak pihak-pihak terkait dalam proses penanggulangan dan pemulihan insiden, misalnya aparat penegak hukum, regulator, maupun tim TTIS nasional", + }, + { + text: "- Terdapat mekanisme eskalasi sehingga memungkinkan untuk melibatkan TTIS sektoral atau TTIS nasional dalam proses penanggulangan dan pemulihan insiden namun belum diformalkan/diresmikan - Terdapat mekanisme dalam melibatkan aparat, penegak hukum, regulator, dan pihak lain yang diperlukan, namun kontak narahubung pihak lain tidak tercantum dalam dokumen rencana.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengidentifikasi siapa saja pihak-pihak pihak-pihak terkait dalam proses penanggulangan dan pemulihan insiden, misalnya aparat penegak hukum, regulator, maupun tim TTIS nasional", + }, + { + text: "- Terdapat mekanisme eskalasi sudah diformalkan/diresmikan sehingga memungkinkan untuk melibatkan TTIS sektoral atau TTIS nasional dalam proses penanggulangan dan pemulihan insiden. - Terdapat mekanisme yang sudah diformalkan/diresmikan dalam melibatkan aparat, penegak hukum, regulator, dan pihak lain yang diperlukan dan kontak narahubung pihak lain tercantum dalam dokumen rencana.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengidentifikasi siapa saja pihak-pihak pihak-pihak terkait dalam proses penanggulangan dan pemulihan insiden, misalnya aparat penegak hukum, regulator, maupun tim TTIS nasional", + }, + { + text: "- Terdapat mekanisme eskalasi yang sudah diformalkan/diresmikan dan direview secara berkala sehingga memungkinkan untuk melibatkan TTIS sektoral atau TTIS nasional dalam proses penanggulangan dan pemulihan insiden. - Terdapat mekanisme yang sudah diformalkan/diresmikan dan direview secara berkala dalam melibatkan aparat, penegak hukum, regulator, dan pihak lain yang diperlukan dan kontak narahubung pihak lain tercantum dalam dokumen rencana. - TTIS melibatkan komunitas, ahli hukum atau akademisi.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengidentifikasi siapa saja pihak-pihak pihak-pihak terkait dalam proses penanggulangan dan pemulihan insiden, misalnya aparat penegak hukum, regulator, maupun tim TTIS nasional", + }, + { + text: "- Terdapat mekanisme eskalasi yang sudah diformalkan/diresmikan serta direview dan diperbaiki secara berkala sehingga memungkinkan untuk melibatkan TTIS sektoral atau TTIS nasional dalam proses penanggulangan dan pemulihan insiden. - Terdapat mekanisme yang diformalkan/diresmikan serta direview dan diperbaiki secara berkala dalam melibatkan aparat, penegak hukum, regulator, dan pihak lain yang diperlukan dan kontak narahubung pihak lain tercantum dalam dokumen rencana. - TTIS melibatkan komunitas, ahli hukum dan akademisi.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengidentifikasi siapa saja pihak-pihak pihak-pihak terkait dalam proses penanggulangan dan pemulihan insiden, misalnya aparat penegak hukum, regulator, maupun tim TTIS nasional", + }, + { + text: "Belum adanya aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu mengembangkan dan mengelola aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan. sehingga informasi organisasi hanya boleh keluar melalui personel yang berwenang saja.", + }, + { + text: "Sudah ada aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan, namun seluruh personel belum mengetahuinya serta belum mempraktikkannya", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu mengembangkan dan mengelola aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan. sehingga informasi organisasi hanya boleh keluar melalui personel yang berwenang saja.", + }, + { + text: "Sudah ada aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan dan sebagian personel sudah mengetahuinya, namun aturan belum dipraktikkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu mengembangkan dan mengelola aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan. sehingga informasi organisasi hanya boleh keluar melalui personel yang berwenang saja.", + }, + { + text: "Sudah ada aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan dan sebagian personel sudah mengetahuinya dan sebagian sudah mempraktikkannya", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu mengembangkan dan mengelola aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan. sehingga informasi organisasi hanya boleh keluar melalui personel yang berwenang saja.", + }, + { + text: "Sudah ada aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan dan seluruh personel sudah mengetahui dan mempraktikkannya", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu mengembangkan dan mengelola aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan. sehingga informasi organisasi hanya boleh keluar melalui personel yang berwenang saja.", + }, + { + text: "Sudah ada aturan yang telah direview dan diperbaiki secara berkala mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan dan seluruh personel sudah mengetahui dan mempraktikkannya", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu mengembangkan dan mengelola aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan. sehingga informasi organisasi hanya boleh keluar melalui personel yang berwenang saja.", + }, + { + text: "Belum ada prosedur rekam cadang yang ditetapkan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel yang mengelola IIV melakukan prosedur rekam cadang untuk mengamankan aset informasi berupa sistem/data yang tersimpan di dalam sistem IIV, serta memastikan bahwa media yang digunakan untuk menyimpan data tersebut telah diamankan.", + }, + { + text: "- Sudah ada prosedur rekam cadang yang disusun, namun belum ada pihak yang menjadi penanggung jawab. - Prosedur tersebut belum dilaksanakan sebagaimana direncanakan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel yang mengelola IIV melakukan prosedur rekam cadang untuk mengamankan aset informasi berupa sistem/data yang tersimpan di dalam sistem IIV, serta memastikan bahwa media yang digunakan untuk menyimpan data tersebut telah diamankan.", + }, + { + text: "- Sudah ada prosedur rekam cadang yang disusun dan sudah ada pihak yang menjadi penanggung jawab,dan terdapat penanggung jawab spesifik ke personel tertentu. - Prosedur tersebut belum dilaksanakan sesuai dengan rencana", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel yang mengelola IIV melakukan prosedur rekam cadang untuk mengamankan aset informasi berupa sistem/data yang tersimpan di dalam sistem IIV, serta memastikan bahwa media yang digunakan untuk menyimpan data tersebut telah diamankan.", + }, + { + text: "- Sudah ada prosedur rekam cadang yang ditetapkan/diformalkan dan sudah ada pihak yang menjadi penanggung jawab,dan terdapat penanggung jawab spesifik ke personel tertentu. - Prosedur tersebut sudah dilaksanakan sesuai dengan rencana", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel yang mengelola IIV melakukan prosedur rekam cadang untuk mengamankan aset informasi berupa sistem/data yang tersimpan di dalam sistem IIV, serta memastikan bahwa media yang digunakan untuk menyimpan data tersebut telah diamankan.", + }, + { + text: "- Sudah ada prosedur rekam cadang yang ditetapkan dan sudah ada pihak yang menjadi penanggung jawab,dan terdapat penanggung jawab spesifik ke personel tertentu - Prosedur tersebut sudah dilaksanakan sesuai dengan rencana - Media yang digunakan untuk menyimpan data belum disimpan sedemikian rupa sehingga aman.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel yang mengelola IIV melakukan prosedur rekam cadang untuk mengamankan aset informasi berupa sistem/data yang tersimpan di dalam sistem IIV, serta memastikan bahwa media yang digunakan untuk menyimpan data tersebut telah diamankan.", + }, + { + text: "- Sudah ada prosedur rekam cadang yang ditetapkan dan sudah ada pihak yang menjadi penanggung jawab,dan terdapat penanggung jawab spesifik ke personel tertentu - Prosedur tersebut sudah dilaksanakan sesuai dengan rencana - Media yang digunakan untuk menyimpan data telah diamankan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan personel yang mengelola IIV melakukan prosedur rekam cadang untuk mengamankan aset informasi berupa sistem/data yang tersimpan di dalam sistem IIV, serta memastikan bahwa media yang digunakan untuk menyimpan data tersebut telah diamankan.", + }, + { + text: "Organisasi tidak memeriksa hasil analisis deteksi peristiwa siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil analisis deteksi peristiwa siber diperiksa untuk menilai ada atau tidaknya anomali pada sistem.", + }, + { + text: "Organisasi tidak memeriksa hasil analisis deteksi peristiwa siber", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil analisis deteksi peristiwa siber diperiksa untuk menilai ada atau tidaknya anomali pada sistem.", + }, + { + text: "- Organisasi melakukan deteksi peristiwa siber - Hasil deteksi dianalisis lebih lanjut secara manual oleh personel yang berkompeten dalam melakukan analisis deteksi", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil analisis deteksi peristiwa siber diperiksa untuk menilai ada atau tidaknya anomali pada sistem.", + }, + { + text: "- Organisasi melakukan deteksi peristiwa siber - Hasil deteksi dianalisis lebih lanjut secara manual oleh personel yang berkompeten dalam melakukan analisis deteksi - Menyusun prosedur pemeriksaan hasil analisis deteksi peristiwa siber", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil analisis deteksi peristiwa siber diperiksa untuk menilai ada atau tidaknya anomali pada sistem.", + }, + { + text: "- Organisasi melakukan deteksi peristiwa siber - Hasil deteksi dianalisis lebih lanjut secara manual oleh personel yang berkompeten dalam melakukan analisis deteksi - Menyusun prosedur pemeriksaan hasil analisis deteksi peristiwa siber - Melakukan monitoring dan review terhadap hasil deteksi, hasil analisis, serta prosedur yang sudah ditetapkan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil analisis deteksi peristiwa siber diperiksa untuk menilai ada atau tidaknya anomali pada sistem.", + }, + { + text: "- Organisasi melakukan deteksi peristiwa Siber - peristiwa Siber dianalisis menggunakan sistem terotomisasi - hasil analisis sistem terotomisasi diverifikasi oleh personel yang berkompeten dalam melakukan analisis deteksi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil analisis deteksi peristiwa siber diperiksa untuk menilai ada atau tidaknya anomali pada sistem.", + }, + { + text: "Organisasi tidak memiliki layanan aduan/pelaporan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengumpulkan dan menganalisis laporan peristiwa siber yang diterima baik dari pengguna layanan, maupun sumber eksternal organisasi misalnya laporan dari Tim Tanggap Insiden Siber nasional atau mitra pihak ketiga.", + }, + { + text: "Organisasi memiliki layanan aduan/pelaporan namun tidak dianalisis", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengumpulkan dan menganalisis laporan peristiwa siber yang diterima baik dari pengguna layanan, maupun sumber eksternal organisasi misalnya laporan dari Tim Tanggap Insiden Siber nasional atau mitra pihak ketiga.", + }, + { + text: "Organisasi memiliki layanan aduan/pelaporan, dianalisis, namun belum memiliki prosedurnya", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengumpulkan dan menganalisis laporan peristiwa siber yang diterima baik dari pengguna layanan, maupun sumber eksternal organisasi misalnya laporan dari Tim Tanggap Insiden Siber nasional atau mitra pihak ketiga.", + }, + { + text: "Organisasi memiliki layanan aduan/pelaporan, dianalisis, dan sudah ditetapkan prosedurnya", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengumpulkan dan menganalisis laporan peristiwa siber yang diterima baik dari pengguna layanan, maupun sumber eksternal organisasi misalnya laporan dari Tim Tanggap Insiden Siber nasional atau mitra pihak ketiga.", + }, + { + text: "Organisasi memiliki layanan aduan/pelaporan, dianalisis, dan sudah ditetapkan prosedurnya, serta dilakukan monitoring dan review berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengumpulkan dan menganalisis laporan peristiwa siber yang diterima baik dari pengguna layanan, maupun sumber eksternal organisasi misalnya laporan dari Tim Tanggap Insiden Siber nasional atau mitra pihak ketiga.", + }, + { + text: "Organisasi memiliki layanan aduan/pelaporan, dianalisis, dan sudah ditetapkan prosedurnya, serta dilakukan monitoring dan review berkala, kemudian dilakukan perbaikan jika diperlukan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengumpulkan dan menganalisis laporan peristiwa siber yang diterima baik dari pengguna layanan, maupun sumber eksternal organisasi misalnya laporan dari Tim Tanggap Insiden Siber nasional atau mitra pihak ketiga.", + }, + { + text: "Organisasi belum melakukan identifikasi dan analisis potensi dampak Insiden Siber pada layanan IIV, organisasi, dan pihak terkait", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi dan menganalisis potensi dampak Insiden Siber pada layanan IIV, termasuk organisasi, dan pihak terkait seperti mitra ketiga berdasarkan laporan lengkap Insiden Siber.", + }, + { + text: "Organisasi sudah melakukan identifikasi dan analisis potensi dampak Insiden Siber pada layanan IIV, organisasi, dan pihak terkait, namun belum berdasarkan laporan lengkap Insiden Siber (masih bersifat sporadis)", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi dan menganalisis potensi dampak Insiden Siber pada layanan IIV, termasuk organisasi, dan pihak terkait seperti mitra ketiga berdasarkan laporan lengkap Insiden Siber.", + }, + { + text: "Organisasi sudah melakukan identifikasi dan analisis potensi dampak Insiden Siber pada layanan IIV, organisasi, dan pihak terkait berdasarkan laporan lengkap Insiden Siber, namun belum memiliki prosedur pelaksanaannya", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi dan menganalisis potensi dampak Insiden Siber pada layanan IIV, termasuk organisasi, dan pihak terkait seperti mitra ketiga berdasarkan laporan lengkap Insiden Siber.", + }, + { + text: "Organisasi sudah melakukan identifikasi dan analisis potensi dampak Insiden Siber pada layanan IIV, organisasi, dan pihak terkait berdasarkan laporan lengkap Insiden Siber, yang mengacu kepada prosedur pelaksanaannya", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi dan menganalisis potensi dampak Insiden Siber pada layanan IIV, termasuk organisasi, dan pihak terkait seperti mitra ketiga berdasarkan laporan lengkap Insiden Siber.", + }, + { + text: "- Organisasi sudah melakukan identifikasi dan analisis potensi dampak Insiden Siber pada layanan IIV, organisasi, dan pihak terkait berdasarkan laporan lengkap Insiden Siber, yang mengacu kepada prosedur pelaksanaannya - Pelaksanaan identifikasi dan analisis potensi dampak Insiden Siber dimonitor secara berkala - Prosedur pelaksanaan identifikasi dan analisis potensi dampak Insiden Siber direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi dan menganalisis potensi dampak Insiden Siber pada layanan IIV, termasuk organisasi, dan pihak terkait seperti mitra ketiga berdasarkan laporan lengkap Insiden Siber.", + }, + { + text: "- Organisasi sudah melakukan identifikasi dan analisis potensi dampak Insiden Siber pada layanan IIV, organisasi, dan pihak terkait berdasarkan laporan lengkap Insiden Siber, yang mengacu kepada prosedur pelaksanaannya - Pelaksanaan identifikasi dan analisis potensi dampak Insiden Siber dimonitor secara berkala - Prosedur pelaksanaan identifikasi dan analisis potensi dampak Insiden Siber direview secara berkala - Melakukan perbaikan terhadap prosedur dan pelaksanaan identifikasi dan analisis potensi dampak Insiden Siber (jika diperlukan)", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi dan menganalisis potensi dampak Insiden Siber pada layanan IIV, termasuk organisasi, dan pihak terkait seperti mitra ketiga berdasarkan laporan lengkap Insiden Siber.", + }, + { + text: "Organisasi belum melakukan pengumpulan laporan Insiden Siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan laporan Insiden Siber dikumpulkan, dikategorisasikan, dan diprioritaskan sesuai dampak risiko terhadap organisasi", + }, + { + text: "Organisasi sudah mengumpulkan laporan Insiden Siber, namun belum dikategorisasi dan diprioritaskan sesuai dampak risiko terhadap organisasi", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan laporan Insiden Siber dikumpulkan, dikategorisasikan, dan diprioritaskan sesuai dampak risiko terhadap organisasi", + }, + { + text: "Organisasi sudah mengumpulkan, mengkategorisasikan, dan memprioritaskan laporan Insiden Siber sesuai dampak risiko terhadap organisasi, namun belum memiliki prosedur pelaksanaannya", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan laporan Insiden Siber dikumpulkan, dikategorisasikan, dan diprioritaskan sesuai dampak risiko terhadap organisasi", + }, + { + text: "Organisasi sudah mengumpulkan, mengkategorisasikan, dan memprioritaskan laporan Insiden Siber sesuai dampak risiko terhadap organisasi yang mengacu kepada prosedur pelaksanaannya", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan laporan Insiden Siber dikumpulkan, dikategorisasikan, dan diprioritaskan sesuai dampak risiko terhadap organisasi", + }, + { + text: "- Organisasi sudah mengumpulkan, mengkategorisasikan, dan memprioritaskan laporan Insiden Siber sesuai dampak risiko terhadap organisasi yang mengacu kepada prosedur pelaksanaannya - Pelaksanaan pengumpulan, pengkategorisasian, dan prioritisasi laporan Insiden Siber dimonitor secara berkala - Prosedur pengumpulan, pengkategorisasian, dan prioritisasi laporan Insiden Siber direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan laporan Insiden Siber dikumpulkan, dikategorisasikan, dan diprioritaskan sesuai dampak risiko terhadap organisasi", + }, + { + text: "- Organisasi sudah mengumpulkan, mengkategorisasikan, dan memprioritaskan laporan Insiden Siber sesuai dampak risiko terhadap organisasi yang mengacu kepada prosedur pelaksanaannya - Pelaksanaan pengumpulan, pengkategorisasian, dan prioritisasi laporan Insiden Siber dimonitor secara berkala - Prosedur pengumpulan, pengkategorisasian, dan prioritisasi laporan Insiden Siber direview secara berkala - Melakukan perbaikan terhadap prosedur dan pelaksanaan pengumpulan, pengkategorisasian, dan prioritisasi laporan Insiden Siber (jika diperlukan)", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan laporan Insiden Siber dikumpulkan, dikategorisasikan, dan diprioritaskan sesuai dampak risiko terhadap organisasi", + }, + { + text: "Organisasi belum melaporkan informasi mengenai Insiden Siber kepada pihak yang berwenang", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai Insiden Siber dilaporkan kepada pihak yang berwenang sesuai dengan kriteria yang ditetapkan oleh organisasi dan peraturan perundangan yang berlaku.", + }, + { + text: "Organisasi hanya melaporkan sebagian informasi mengenai Insiden Siber kepada pihak yang berwenang", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai Insiden Siber dilaporkan kepada pihak yang berwenang sesuai dengan kriteria yang ditetapkan oleh organisasi dan peraturan perundangan yang berlaku.", + }, + { + text: "Organisasi sudah melaporkan seluruh informasi mengenai Insiden Siber kepada pihak yang berwenang, namun belum memiliki prosedur pelaksanaannya", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai Insiden Siber dilaporkan kepada pihak yang berwenang sesuai dengan kriteria yang ditetapkan oleh organisasi dan peraturan perundangan yang berlaku.", + }, + { + text: "Organisasi sudah melaporkan seluruh informasi mengenai Insiden Siber kepada pihak yang berwenang sesuai dengan kriteria yang ditetapkan oleh organisasi dan peraturan perundangan yang berlaku", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai Insiden Siber dilaporkan kepada pihak yang berwenang sesuai dengan kriteria yang ditetapkan oleh organisasi dan peraturan perundangan yang berlaku.", + }, + { + text: "- Organisasi sudah melaporkan seluruh informasi mengenai Insiden Siber kepada pihak yang berwenang sesuai dengan kriteria yang ditetapkan oleh organisasi dan peraturan perundangan yang berlaku - Pelaksanaan pelaporan Insiden Siber kepada pihak yang berwenang dimonitor secara berkala - Prosedur pelaporan Insiden Siber kepada pihak yang berwenang direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai Insiden Siber dilaporkan kepada pihak yang berwenang sesuai dengan kriteria yang ditetapkan oleh organisasi dan peraturan perundangan yang berlaku.", + }, + { + text: "- Organisasi sudah melaporkan seluruh informasi mengenai Insiden Siber kepada pihak yang berwenang sesuai dengan kriteria yang ditetapkan oleh organisasi dan peraturan perundangan yang berlaku - Pelaksanaan pelaporan Insiden Siber kepada pihak yang berwenang dimonitor secara berkala - Prosedur pelaporan Insiden Siber kepada pihak yang berwenang direview secara berkala - Melakukan perbaikan terhadap prosedur dan pelaksanaan pelaporan Insiden Siber kepada pihak yang berwenang (jika diperlukan)", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai Insiden Siber dilaporkan kepada pihak yang berwenang sesuai dengan kriteria yang ditetapkan oleh organisasi dan peraturan perundangan yang berlaku.", + }, + { + text: "Organisasi belum melakukan identifikasi siapa saja para pemangku kepentingan terkait jika terjadi Insiden Siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan proses koordinasi dengan para pemangku kepentingan dilakukan sesuai dengan rencana tanggap Insiden Siber (seperti kepada Kementerian atau Lembaga pembina sektor, Tim Tanggap Insiden Siber nasional, atau mitra pihak ketiga)", + }, + { + text: "Organisasi sudah mengidentifikasi siapa saja para pemangku kepentingan, namun belum melakukan koordinasi kepada para pemangku kepentingan tersebut", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan proses koordinasi dengan para pemangku kepentingan dilakukan sesuai dengan rencana tanggap Insiden Siber (seperti kepada Kementerian atau Lembaga pembina sektor, Tim Tanggap Insiden Siber nasional, atau mitra pihak ketiga)", + }, + { + text: "Organisasi sudah mengidentifikasi siapa saja para pemangku kepentingan dan sudah melakukan koordinasi kepada para pemangku kepentingan tersebut", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan proses koordinasi dengan para pemangku kepentingan dilakukan sesuai dengan rencana tanggap Insiden Siber (seperti kepada Kementerian atau Lembaga pembina sektor, Tim Tanggap Insiden Siber nasional, atau mitra pihak ketiga)", + }, + { + text: "Organisasi sudah memastikan proses koordinasi dengan para pemangku kepentingan dilakukan sesuai dengan rencana tanggap Insiden Siber", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan proses koordinasi dengan para pemangku kepentingan dilakukan sesuai dengan rencana tanggap Insiden Siber (seperti kepada Kementerian atau Lembaga pembina sektor, Tim Tanggap Insiden Siber nasional, atau mitra pihak ketiga)", + }, + { + text: "- Organisasi sudah memastikan proses koordinasi dengan para pemangku kepentingan dilakukan sesuai dengan rencana tanggap Insiden Siber - Pelaksanaan koordinasi dengan para pemangku kepentingan dimonitor secara berkala - Rencana tanggap Insiden Siber direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan proses koordinasi dengan para pemangku kepentingan dilakukan sesuai dengan rencana tanggap Insiden Siber (seperti kepada Kementerian atau Lembaga pembina sektor, Tim Tanggap Insiden Siber nasional, atau mitra pihak ketiga)", + }, + { + text: "- Organisasi sudah memastikan proses koordinasi dengan para pemangku kepentingan dilakukan sesuai dengan rencana tanggap Insiden Siber - Pelaksanaan koordinasi dengan para pemangku kepentingan dimonitor secara berkala - Rencana tanggap Insiden Siber direview secara berkala - Melakukan perbaikan terhadap rencana tanggap Insiden Siber dan pelaksanaan koordinasi dengan para pemangku kepentingan (jika diperlukan)", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan proses koordinasi dengan para pemangku kepentingan dilakukan sesuai dengan rencana tanggap Insiden Siber (seperti kepada Kementerian atau Lembaga pembina sektor, Tim Tanggap Insiden Siber nasional, atau mitra pihak ketiga)", + }, + { + text: "Organisasi belum memiliki dan mengetahui prosedur untuk meminimalkan kerusakan keamanan akibat Insiden Siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil langkah-langkah yang diperlukan untuk meminimalkan kerusakan terkait keamanan dan mengurangi dampak yang disebabkan oleh Insiden Siber tersebut. Misalnya melakukan isolasi terhadap jaringan yang terdapat Insiden Siber.", + }, + { + text: "Organisasi mulai menerapkan Prosedur containment untuk meminimalkan kerusakan keamanan akibat Insiden Siber, Organisasi mulai mengidentifikasi dampak yang dapat ditimbulkan akibat Insiden Siber alternatif: Organisasi sudah menerapkan langkah-langkah containment untuk meminimalkan kerusakan keamanan akibat Insiden Siber, namun belum menyeluruh serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil langkah-langkah yang diperlukan untuk meminimalkan kerusakan terkait keamanan dan mengurangi dampak yang disebabkan oleh Insiden Siber tersebut. Misalnya melakukan isolasi terhadap jaringan yang terdapat Insiden Siber.", + }, + { + text: "Organisasi telah menerapkan Prosedur containment namun belum ditetapkan dan belum dijalankan, Organisasi telah melakukan Identifikasi kerusakan dan dampak dari Insiden Siber Alternatif: Organisasi sudah menerapkan langkah-langkah containment untuk meminimalkan kerusakan keamanan akibat Insiden Siber, secara menyeluruh namun belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil langkah-langkah yang diperlukan untuk meminimalkan kerusakan terkait keamanan dan mengurangi dampak yang disebabkan oleh Insiden Siber tersebut. Misalnya melakukan isolasi terhadap jaringan yang terdapat Insiden Siber.", + }, + { + text: "Organisasi telah menetapkan Prosedur Containment dan mulai dijalankan untuk meminimalkan kerusakan keamanan dan mengurangi dampak insiden", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil langkah-langkah yang diperlukan untuk meminimalkan kerusakan terkait keamanan dan mengurangi dampak yang disebabkan oleh Insiden Siber tersebut. Misalnya melakukan isolasi terhadap jaringan yang terdapat Insiden Siber.", + }, + { + text: "Organisasi telah menetapkan secara formal dan menjalankan prosedur containment terhadap Insiden Siber untuk meminimalkan kerusakan dan mengurangi dampak dari Insiden Siber tersebut secara berkelanjutan dan dilakukan monitoring dan reviu", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil langkah-langkah yang diperlukan untuk meminimalkan kerusakan terkait keamanan dan mengurangi dampak yang disebabkan oleh Insiden Siber tersebut. Misalnya melakukan isolasi terhadap jaringan yang terdapat Insiden Siber.", + }, + { + text: "Organisasi menjalankan prosedur containment yang telah ditetapkan secara konsisten, dilakukan monitoring, reviu dan perbaikan berkelanjutan serta untuk mengurangi dampak dari Insiden Siber Prosedur containment telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil langkah-langkah yang diperlukan untuk meminimalkan kerusakan terkait keamanan dan mengurangi dampak yang disebabkan oleh Insiden Siber tersebut. Misalnya melakukan isolasi terhadap jaringan yang terdapat Insiden Siber.", + }, + { + text: "Organisasi belum melakukan identifikasi prioritas yang harus dilakukan dalam menghadapi Insiden Siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi hal-hal yang perlu diprioritaskan dan ruang lingkup respons yang perlu diambil.", + }, + { + text: "Organisasi sudah menerapkan langkah identifikasi prioritas dan ruang lingkup respons dalam menghadapi Insiden Siber namun belum menyeluruh (sebagian kecil) serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi hal-hal yang perlu diprioritaskan dan ruang lingkup respons yang perlu diambil.", + }, + { + text: "Organisasi sudah menerapkan langkah identifikasi prioritas dan ruang lingkup respons dalam menghadapi Insiden Siber namun belum menyeluruh (sebagian besar) namun belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi hal-hal yang perlu diprioritaskan dan ruang lingkup respons yang perlu diambil.", + }, + { + text: "Organisasi sudah menerapkan langkah identifikasi prioritas dan ruang lingkup respons dalam menghadapi Insiden Siber secara menyeluruh serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi hal-hal yang perlu diprioritaskan dan ruang lingkup respons yang perlu diambil.", + }, + { + text: "Organisasi menjalankan  Prosedur identifikasi prioritas dan ruang lingkup respons terhadap Insiden Siber untuk meminimalkan kerusakan dan mengurangi dampak dari Insiden Siber sesuai dengan prosedur yang telah ditetapkan ,dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi hal-hal yang perlu diprioritaskan dan ruang lingkup respons yang perlu diambil.", + }, + { + text: "Organisasi menjalankan Prosedur identifikasi prioritas dan ruang lingkup respons terhadap Insiden Siber untuk meminimalkan kerusakan dan mengurangi dampak dari Insiden Siber sesuai dengan prosedur yang telah ditetapkan ,dimonitor dan dilakukan reviu secara berkelanjutan Prosedur identifikasi prioritas dan ruang lingkup respons telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengidentifikasi hal-hal yang perlu diprioritaskan dan ruang lingkup respons yang perlu diambil.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk melakukan tindakan atau penanganan terhadap perangkat yang terpengaruh oleh Insiden Siber.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil tindakan yang tepat terhadap perangkat yang terpengaruh oleh Insiden Siber, terutama mengenai fasilitas produksi yang rusak akibat insiden keamanan.", + }, + { + text: "Organisasi telah melakukan tindakan atau penanganan terhadap perangkat yang terpengaruh oleh Insiden Siber, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil tindakan yang tepat terhadap perangkat yang terpengaruh oleh Insiden Siber, terutama mengenai fasilitas produksi yang rusak akibat insiden keamanan.", + }, + { + text: "Organisasi telah melakukan tindakan atau penanganan terhadap perangkat yang terpengaruh oleh Insiden Siber namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil tindakan yang tepat terhadap perangkat yang terpengaruh oleh Insiden Siber, terutama mengenai fasilitas produksi yang rusak akibat insiden keamanan.", + }, + { + text: "Organisasi telah melakukan tindakan atau penanganan terhadap perangkat yang terpengaruh oleh Insiden Siber secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil tindakan yang tepat terhadap perangkat yang terpengaruh oleh Insiden Siber, terutama mengenai fasilitas produksi yang rusak akibat insiden keamanan.", + }, + { + text: "Organisasi telah menjalankan Prosedur penanganan terhadap perangkat yang terpengaruh oleh Insiden Siber secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan Organisasi telah menjalankan secara menyeluruh dan melakukan review terhadap tindakan terhadap perangkat yang terpengaruh oleh Insiden Siber.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil tindakan yang tepat terhadap perangkat yang terpengaruh oleh Insiden Siber, terutama mengenai fasilitas produksi yang rusak akibat insiden keamanan.", + }, + { + text: "Organisasi menjalankan Prosedur penanganan terhadap perangkat yang terpengaruh oleh Insiden Siber secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus mengambil tindakan yang tepat terhadap perangkat yang terpengaruh oleh Insiden Siber, terutama mengenai fasilitas produksi yang rusak akibat insiden keamanan.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk melakukan tindakan pendokumentasian hasil mitigasi Insiden Siber.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan hasil mitigasi Insiden Siber tersebut sebagai bahan pembelajaran berkelanjutan.", + }, + { + text: "Organisasi telah melakukan tindakan pendokumentasian hasil mitigasi Insiden Siber, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan hasil mitigasi Insiden Siber tersebut sebagai bahan pembelajaran berkelanjutan.", + }, + { + text: "Organisasi telah melakukan melakukan tindakan pendokumentasian hasil mitigasi Insiden Siber, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan hasil mitigasi Insiden Siber tersebut sebagai bahan pembelajaran berkelanjutan.", + }, + { + text: "Organisasi telah melakukan melakukan tindakan pendokumentasian hasil mitigasi Insiden Siber secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan hasil mitigasi Insiden Siber tersebut sebagai bahan pembelajaran berkelanjutan.", + }, + { + text: "Organisasi telah menjalankan Prosedur melakukan tindakan pendokumentasian hasil mitigasi Insiden Siber secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan hasil mitigasi Insiden Siber tersebut sebagai bahan pembelajaran berkelanjutan.", + }, + { + text: "Organisasi menjalankan Prosedur melakukan tindakan pendokumentasian hasil mitigasi Insiden Siber secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan hasil mitigasi Insiden Siber tersebut sebagai bahan pembelajaran berkelanjutan.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan.", + }, + { + text: "Organisasi telah melakukan melakukan langkah atau prosedur untuk memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur untuk memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur untuk memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden, untuk keperluan investigasi dan/atau audit", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk keperluan investigasi dan/atau audit, maka Organisasi menerapkan forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden, untuk keperluan investigasi dan/atau audit, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk keperluan investigasi dan/atau audit, maka Organisasi menerapkan forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden, untuk keperluan investigasi dan/atau audit, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk keperluan investigasi dan/atau audit, maka Organisasi menerapkan forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden, untuk keperluan investigasi dan/atau audit secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk keperluan investigasi dan/atau audit, maka Organisasi menerapkan forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden, untuk keperluan investigasi dan/atau audit secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk keperluan investigasi dan/atau audit, maka Organisasi menerapkan forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden, untuk keperluan investigasi dan/atau audit secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk keperluan investigasi dan/atau audit, maka Organisasi menerapkan forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk untuk memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Sibersecara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur untuk memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber", + }, + { + text: "Organisasi menjalankan langkah atau prosedur untuk memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut, jika insiden meningkat atau meluas", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "jika insiden meningkat atau meluas, maka Organisasi perlu menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut, jika insiden meningkat atau meluas, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "jika insiden meningkat atau meluas, maka Organisasi perlu menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk untuk menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut, jika insiden meningkat atau meluas, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "jika insiden meningkat atau meluas, maka Organisasi perlu menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut, jika insiden meningkat atau meluas, secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "jika insiden meningkat atau meluas, maka Organisasi perlu menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur untuk menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut, jika insiden meningkat atau meluas secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "jika insiden meningkat atau meluas, maka Organisasi perlu menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur untuk menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut, jika insiden meningkat atau meluas secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "jika insiden meningkat atau meluas, maka Organisasi perlu menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi, secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi, secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi", + }, + { + text: "Organisasi menjalankan langkah atau prosedur pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi, secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodiksecara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melaksanakan simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur rekam cadang (back-up) secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "prosedur rekam cadang (back-up) sedapat mungkin dilakukan secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur rekam cadang (back-up) secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "prosedur rekam cadang (back-up) sedapat mungkin dilakukan secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur rekam cadang (back-up) secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "prosedur rekam cadang (back-up) sedapat mungkin dilakukan secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur rekam cadang (back-up) secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "prosedur rekam cadang (back-up) sedapat mungkin dilakukan secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur rekam cadang (back-up) secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "prosedur rekam cadang (back-up) sedapat mungkin dilakukan secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur rekam cadang (back-up) secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "prosedur rekam cadang (back-up) sedapat mungkin dilakukan secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur untuk memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur untuk memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi, secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk memastikan hasil pelaksanaan rekam cadang data didokumentasikan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil pelaksanaan rekam cadang data didokumentasikan.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan hasil pelaksanaan rekam cadang data didokumentasikan, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil pelaksanaan rekam cadang data didokumentasikan.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk untuk memastikan hasil pelaksanaan rekam cadang data didokumentasikan, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil pelaksanaan rekam cadang data didokumentasikan.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan hasil pelaksanaan rekam cadang data didokumentasikan secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil pelaksanaan rekam cadang data didokumentasikan.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur untuk memastikan hasil pelaksanaan rekam cadang data didokumentasikan secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil pelaksanaan rekam cadang data didokumentasikan.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur forensik digital terhadap untuk memastikan hasil pelaksanaan rekam cadang data didokumentasikan secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan hasil pelaksanaan rekam cadang data didokumentasikan.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk memastikan media penyimpanan rekam cadang telah disimpan secara aman", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan media penyimpanan rekam cadang telah disimpan secara aman.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan media penyimpanan rekam cadang telah disimpan secara aman, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan media penyimpanan rekam cadang telah disimpan secara aman.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk untuk memastikan media penyimpanan rekam cadang telah disimpan secara aman, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan media penyimpanan rekam cadang telah disimpan secara aman.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan media penyimpanan rekam cadang telah disimpan secara amansecara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan media penyimpanan rekam cadang telah disimpan secara aman.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur untuk memastikan media penyimpanan rekam cadang telah disimpan secara aman secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan media penyimpanan rekam cadang telah disimpan secara aman.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur untuk memastikan media penyimpanan rekam cadang telah disimpan secara aman secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan media penyimpanan rekam cadang telah disimpan secara aman.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk memastikan pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk untuk memastikan pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur untuk memastikan pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur untuk memastikan pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk memastikan pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk untuk memastikan pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur untuk memastikan pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur untuk memastikan pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi.", + }, + { + text: "Organisasi belum menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber", + }, + { + text: "Organisasi telah menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber", + }, + { + text: "Organisasi telah menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber", + }, + { + text: "Organisasi telah menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber secara menyeluruh, serta telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber", + }, + { + text: "Organisasi telah menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber secara menyeluruh, telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber", + }, + { + text: "Organisasi menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber, telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber", + }, + { + text: "Organisasi belum menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber.", + }, + { + text: "Organisasi telah menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber.", + }, + { + text: "Organisasi telah menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber.", + }, + { + text: "Organisasi telah menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber secara menyeluruh, serta telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber.", + }, + { + text: "Organisasi telah menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber secara menyeluruh, telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber.", + }, + { + text: "Organisasi menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber, telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber.", + }, + { + text: "Organisasi belum memiliki langkah atau prosedur untuk memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan, namun belum diimplementasikan secara menyeluruh (sebagian kecil), serta belum memiliki prosedur yang telah di formalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk untuk memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan, namun belum diimplementasikan secara menyeluruh (sebagian besar), serta belum memiliki prosedur yang telah di formalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan.", + }, + { + text: "Organisasi telah melakukan langkah atau prosedur untuk memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan secara menyeluruh, serta sudah memiliki prosedur yang telah di formalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan.", + }, + { + text: "Organisasi telah menjalankan langkah atau prosedur untuk memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan.", + }, + { + text: "Organisasi menjalankan langkah atau prosedur funtuk memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan secara menyeluruh sesuai dengan prosedur yang telah ditetapkan, dimonitor dan dilakukan reviu secara berkelanjutan, serta telah terintegrasi dengan proses bisnis Organisasi atau dalam sistem terotomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan.", + }, + { + text: "Organisasi belum pernah menyusun laporan hasil penanganan Insiden Siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menyusun laporan hasil penanganan Insiden Siber dan menyampaikannya kepada Kementerian atau Lembaga di masing-masing sektor.", + }, + { + text: "- Organisasi telah menyusun draft laporan hasil penanganan Insiden Siber - isi draft laporan belum mencakup 4 kriteria antara lain: jenis indikasi Insiden Siber, kode distribusi informasi, sistem dan/atau aset terdampak, rekomendasi mitigasi.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menyusun laporan hasil penanganan Insiden Siber dan menyampaikannya kepada Kementerian atau Lembaga di masing-masing sektor.", + }, + { + text: "- Organisasi telah menyusun draft laporan hasil penanganan Insiden Siber - isi draft laporan belum komprehensif namun sudah mencakup minimal salah satu dari 4 kriteria antara lain: jenis indikasi Insiden Siber, kode distribusi informasi, sistem dan/atau aset terdampak, rekomendasi mitigasi.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menyusun laporan hasil penanganan Insiden Siber dan menyampaikannya kepada Kementerian atau Lembaga di masing-masing sektor.", + }, + { + text: "- Organisasi sudah menyusun laporan hasil penanganan Insiden Siber dan telah disahkan oleh pimpinan Organisasi - isi laporan belum komprehensif namun sudah mencakup minimal 2 dari 4 kriteria antara lain: jenis indikasi Insiden Siber, kode distribusi informasi, sistem dan/atau aset terdampak, rekomendasi mitigasi. - Laporan hasil penanganan Insiden Siber sudah disampaikan kepada Kementerian atau Lembaga di masing-masing sektor", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menyusun laporan hasil penanganan Insiden Siber dan menyampaikannya kepada Kementerian atau Lembaga di masing-masing sektor.", + }, + { + text: "- Organisasi sudah menyusun laporan hasil penanganan Insiden Siber dan telah disahkan oleh pimpinan Organisasi - isi laporan belum komprehensif namun sudah mencakup minimal 3 dari 4 kriteria antara lain: jenis indikasi Insiden Siber, kode distribusi informasi, sistem dan/atau aset terdampak, rekomendasi mitigasi. - Laporan hasil penanganan Insiden Siber sudah disampaikan kepada Kementerian atau Lembaga di masing-masing sektor", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menyusun laporan hasil penanganan Insiden Siber dan menyampaikannya kepada Kementerian atau Lembaga di masing-masing sektor.", + }, + { + text: "- Organisasi sudah menyusun laporan hasil penanganan Insiden Siber dan telah disahkan oleh pimpinan Organisasi - isi laporan telah komprehensif mencakup minimal 4 kriteria antara lain: jenis indikasi Insiden Siber, kode distribusi informasi, sistem dan/atau aset terdampak, rekomendasi mitigasi. - Laporan hasil penanganan Insiden Siber sudah disampaikan kepada Kementerian atau Lembaga di masing-masing sektor", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menyusun laporan hasil penanganan Insiden Siber dan menyampaikannya kepada Kementerian atau Lembaga di masing-masing sektor.", + }, + { + text: "- Organisasi sudah menyusun laporan hasil penanganan Insiden Siber dan telah disahkan oleh pimpinan Organisasi - isi laporan telah komprehensif mencakup minimal 4 kriteria antara lain: jenis indikasi Insiden Siber, kode distribusi informasi, sistem dan/atau aset terdampak, rekomendasi mitigasi. - Laporan hasil penanganan Insiden Siber sudah disampaikan kepada Kementerian atau Lembaga di masing-masing sektor", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menyusun laporan hasil penanganan Insiden Siber dan menyampaikannya kepada Kementerian atau Lembaga di masing-masing sektor.", + }, + { + text: "Organisasi belum menerapkan kontrol keamanan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengevaluasi kontrol keamanan yang diterapkan apakah masih relevan terhadap spektrum ancaman yang ada atau perlu ada perbaikan dan penambahan.", + }, + { + text: "Organisasi telah mengevaluasi sebagian kecil aspek kontrol keamanan namun belum ditetapkan menjadi kebijakan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengevaluasi kontrol keamanan yang diterapkan apakah masih relevan terhadap spektrum ancaman yang ada atau perlu ada perbaikan dan penambahan.", + }, + { + text: "Organisasi telah mengevaluasi sebagian besar aspek kontrol keamanan namun belum ditetapkan menjadi kebijakan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengevaluasi kontrol keamanan yang diterapkan apakah masih relevan terhadap spektrum ancaman yang ada atau perlu ada perbaikan dan penambahan.", + }, + { + text: "- Organisasi mengevaluasi kontrol keamanan yang diterapkan secara menyeluruh dan sudah ditetapkan melalui sebuah kebijakan - hasil evaluasi kontrol keamanan disusun dalam bentuk laporan hasil evaluasi yang berisi kontrol-kontrol yang masih relevan dan yang sudah tidak relevan terhadap spektrum ancaman yang ada - merekomendasikan perbaikan dan penambahan terhadap kontrol yang sudah tidak relevan terhadap spektrum ancaman yang ada.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengevaluasi kontrol keamanan yang diterapkan apakah masih relevan terhadap spektrum ancaman yang ada atau perlu ada perbaikan dan penambahan.", + }, + { + text: "- Organisasi mengevaluasi kontrol keamanan yang diterapkan secara menyeluruh dan sudah ditetapkan melalui sebuah kebijakan - hasil evaluasi kontrol keamanan disusun dalam bentuk laporan hasil evaluasi yang berisi kontrol-kontrol yang masih relevan dan yang sudah tidak relevan terhadap spektrum ancaman yang ada - melakukan perbandingan kontrol keamanan dengan standar-standar nasional dan internasional yang berkaitan - melakukan perbaikan dan penambahan terhadap kontrol yang sudah tidak relevan terhadap spektrum ancaman yang ada.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengevaluasi kontrol keamanan yang diterapkan apakah masih relevan terhadap spektrum ancaman yang ada atau perlu ada perbaikan dan penambahan.", + }, + { + text: "- Organisasi mengevaluasi kontrol keamanan yang diterapkan secara menyeluruh dan sudah ditetapkan melalui sebuah kebijakan - hasil evaluasi kontrol keamanan disusun dalam bentuk laporan hasil evaluasi yang berisi kontrol-kontrol yang masih relevan dan yang sudah tidak relevan terhadap spektrum ancaman yang ada - melakukan perbandingan kontrol keamanan dengan standar-standar nasional dan internasional yang berkaitan - melakukan perbaikan dan penambahan terhadap kontrol yang sudah tidak relevan terhadap spektrum ancaman yang ada - hasil evaluasi kontrol dilakukan secara berkala sesuai kebutuhan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengevaluasi kontrol keamanan yang diterapkan apakah masih relevan terhadap spektrum ancaman yang ada atau perlu ada perbaikan dan penambahan.", + }, + { + text: "Organisasi belum menyusun dokumen rencana tanggap Insiden Siber dan pemulihan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan reviu dan pembaharuan terhadap dokumen rencana tanggap Insiden Siber dan pemulihan jika terdapat hal-hal yang dapat dijadikan pembelajaran berkelanjutan bagi organisasi.", + }, + { + text: "- Organisasi telah melakukan sebagian kecil reviu dan pembaharuan dokumen rencana tanggap Insiden Siber dan pemulihan, namun belum ditetapkan menjadi kebijakan - Reviu terhadap isi dari dokumen Rencana tanggap Insiden Siber minimal terdapat 1 dari 6 kriteria antara lain: tahapan penanganan Insiden Siber; jenis Insiden Siber yang ditangani; daftar peran dan tanggung jawab anggota TTIS; daftar perangkat, teknologi, dan sumber daya yang diperlukan; daftar proses pemulihan jaringan dan data yang penting/kritikal; dan daftar pihak internal dan eksternal yang perlu dihubungi.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan reviu dan pembaharuan terhadap dokumen rencana tanggap Insiden Siber dan pemulihan jika terdapat hal-hal yang dapat dijadikan pembelajaran berkelanjutan bagi organisasi.", + }, + { + text: "- Organisasi telah melakukan sebagian besar reviu dan pembaharuan dokumen rencana tanggap Insiden Siber dan pemulihan, namun belum ditetapkan menjadi kebijakan - Reviu terhadap isi dari dokumen Rencana tanggap Insiden Siber minimal terdapat 3 dari 6 kriteria antara lain: tahapan penanganan Insiden Siber; jenis Insiden Siber yang ditangani; daftar peran dan tanggung jawab anggota TTIS; daftar perangkat, teknologi, dan sumber daya yang diperlukan; daftar proses pemulihan jaringan dan data yang penting/kritikal; dan daftar pihak internal dan eksternal yang perlu dihubungi.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan reviu dan pembaharuan terhadap dokumen rencana tanggap Insiden Siber dan pemulihan jika terdapat hal-hal yang dapat dijadikan pembelajaran berkelanjutan bagi organisasi.", + }, + { + text: "- Organisasi melakukan reviu dan pembaharuan terhadap dokumen rencana tanggap Insiden Siber dan telah disahkan oleh pimpinan Organisasi", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan reviu dan pembaharuan terhadap dokumen rencana tanggap Insiden Siber dan pemulihan jika terdapat hal-hal yang dapat dijadikan pembelajaran berkelanjutan bagi organisasi.", + }, + { + text: "Organisasi melakukan reviu dan pembaharuan secara berkala terhadap dokumen rencana tanggap Insiden Siber dan telah disahkan oleh pimpinan Organisasi", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan reviu dan pembaharuan terhadap dokumen rencana tanggap Insiden Siber dan pemulihan jika terdapat hal-hal yang dapat dijadikan pembelajaran berkelanjutan bagi organisasi.", + }, + { + text: "Organisasi melakukan reviu dan pembaharuan terhadap dokumen rencana tanggap Insiden Siber dan telah disahkan oleh pimpinan Organisasi - reviu terhadap dokumen rencana tanggap Insiden Siber dilakukan secara berkala sesuai kebutuhan - pembaruan terhadap dokumen rencana tanggap Insiden Siber telah disahkan oleh pimpinan Organisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan reviu dan pembaharuan terhadap dokumen rencana tanggap Insiden Siber dan pemulihan jika terdapat hal-hal yang dapat dijadikan pembelajaran berkelanjutan bagi organisasi.", + }, + { + text: "Organisasi belum membuat dokumen pengelolaan risiko", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan beserta rencana mitigasinya ke dalam dokumen pengelolaan risiko", + }, + { + text: "Organisasi telah menyusun draft dokumen pengelolaan risiko, namun belum mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan beserta rencana mitigasinya ke dalam draft dokumen tersebut", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan beserta rencana mitigasinya ke dalam dokumen pengelolaan risiko", + }, + { + text: "- Organisasi telah menyusun draft dokumen pengelolaan risiko dan sudah melakukan Pengumpulan data/analisis terhadap kerentanan, ancaman, atau risiko yang baru ditemukan, namun belum mendokumentasikan ke dalam draft dokumen tersebut", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan beserta rencana mitigasinya ke dalam dokumen pengelolaan risiko", + }, + { + text: "- Organisasi telah menyusun dokumen pengelolaan risiko dan telah disahkan oleh pimpinan Organisasi - Organisasi telah mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan ke dalam dokumen pengelolaan risiko - pembaruan terhadap dokumen pengelolaan risiko telah disahkan oleh pimpinan Organisasi", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan beserta rencana mitigasinya ke dalam dokumen pengelolaan risiko", + }, + { + text: "- Organisasi telah menyusun dokumen pengelolaan risiko dan telah disahkan oleh pimpinan Organisasi - Organisasi telah mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan beserta rencana mitigasinya ke dalam dokumen pengelolaan risiko - pembaruan terhadap dokumen pengelolaan risiko telah disahkan oleh pimpinan Organisasi", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan beserta rencana mitigasinya ke dalam dokumen pengelolaan risiko", + }, + { + text: "- Organisasi telah menyusun dokumen pengelolaan risiko dan telah disahkan oleh pimpinan Organisasi - Organisasi telah mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan beserta rencana mitigasinya ke dalam dokumen pengelolaan risiko - pendokumentasian terhadap kerentanan, ancaman,atau risiko dilakukan secara berkala sesuai kebutuhan - pembaruan terhadap dokumen pengelolaan risiko telah disahkan oleh pimpinan Organisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan beserta rencana mitigasinya ke dalam dokumen pengelolaan risiko", + }, + { + text: "Kegiatan forensik digital belum dilaksanakan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dikumpulkan dan dipelihara meliputi juga informasi-informasi yang relevan terhadapnya.", + }, + { + text: "Kegiatan forensik digital sudah dilaksanakan namun laporan hasil pelaksanaan forensik digital belum pernah disusun/diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dikumpulkan dan dipelihara meliputi juga informasi-informasi yang relevan terhadapnya.", + }, + { + text: "Kegiatan forensik digital sudah dilaksanakan sesuai dengan praktik terbaik namun laporan hasil pelaksanaan forensik digital belum pernah disusun/diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dikumpulkan dan dipelihara meliputi juga informasi-informasi yang relevan terhadapnya.", + }, + { + text: "Kegiatan forensik digital sudah dilaksanakan sesuai dengan praktik terbaik dan laporan hasil pelaksanaan forensik digital sudah disusun/diformalkan berikut juga pengumpulan dan pemeliharaan informasi-informasi yang relevan terhadapnya", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dikumpulkan dan dipelihara meliputi juga informasi-informasi yang relevan terhadapnya.", + }, + { + text: "- Kegiatan forensik digital sudah dilaksanakan sesuai dengan praktik terbaik dan laporan hasil pelaksanaan forensik digital sudah disusun/diformalkan berikut juga pengumpulan dan pemeliharaan informasi-informasi yang relevan terhadapnya - Kebijakan pelaporan pelaksanaan forensik digital berikut juga pengumpulan dan pemeliharaan informasi-informasi yang relevan terhadapnya telah dilakukan reviu berkala berdasarkan pelaksanaan forensik digital", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dikumpulkan dan dipelihara meliputi juga informasi-informasi yang relevan terhadapnya.", + }, + { + text: "- Kebijakan pelaksanaan forensik digital telah ditetapkan, pelaksanaan forensik digital sudah dilakukan sesuai prosedur yang lengkap sesuai prosedur yang ditetapkan - Kebijakan pelaporan pelaksanaan forensik digital berikut juga pengumpulan dan pemeliharaan informasi-informasi yang relevan terhadapnya telah dilakukan reviu berkala berdasarkan pelaksanaan forensik digital dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dikumpulkan dan dipelihara meliputi juga informasi-informasi yang relevan terhadapnya.", + }, + { + text: "Kegiatan forensik digital belum pernah dilaksanakan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dapat disampaikan kepada pihak berwajib untuk proses investigasi dan penegakkan hukum sesuai ketentuan yang berlaku", + }, + { + text: "Kegiatan forensik digital pernah dilaksanakan namun laporan hasil pelaksanaan forensik digital belum pernah disusun.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dapat disampaikan kepada pihak berwajib untuk proses investigasi dan penegakkan hukum sesuai ketentuan yang berlaku", + }, + { + text: "Laporan hasil pelaksanaan forensik digital telah disusun namun masih berupa draft yang belum ditandatangani oleh Tim Forensik Digital", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dapat disampaikan kepada pihak berwajib untuk proses investigasi dan penegakkan hukum sesuai ketentuan yang berlaku", + }, + { + text: "Laporan hasil pelaksanaan forensik digital telah ditandatangani oleh Tim Forensik Digital namun baru dilaporkan kepada Pimpinan Organisasi dan/atau Ketua TTIS", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dapat disampaikan kepada pihak berwajib untuk proses investigasi dan penegakkan hukum sesuai ketentuan yang berlaku", + }, + { + text: "- Laporan forensik digital telah ditandatangani oleh tim forensik digital dan disahkan oleh pimpinan Organisasi atau Ketua TTIS - Laporan hasil pelaksanaan forensik digital telah disampaikan kepada pihak berwajib untuk proses investigasi dan penegakkan hukum sesuai ketentuan yang berlaku", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dapat disampaikan kepada pihak berwajib untuk proses investigasi dan penegakkan hukum sesuai ketentuan yang berlaku", + }, + { + text: "- Laporan forensik digital telah ditandatangani oleh tim forensik digital dan disahkan oleh pimpinan Organisasi atau Ketua TTIS - Laporan hasil pelaksanaan forensik digital telah disampaikan kepada pihak berwajib untuk proses investigasi dan penegakkan hukum sesuai ketentuan yang berlaku - Penyampaian Laporan telah mempertimbangkan Klasifikasi Informasi dan/atau Kode Distribusi Informasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Laporan hasil pelaksanaan forensik digital dapat disampaikan kepada pihak berwajib untuk proses investigasi dan penegakkan hukum sesuai ketentuan yang berlaku", + }, + { + text: "Organisasi belum melakukan peninjauan terhadap efektifitas kinerja penanganan insiden", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan peninjauan terhadap efektifitas kinerja penanganan insiden yang dilakukan oleh tim tanggap Insiden Siber secara berkala.", + }, + { + text: "- TTIS sudah menangani Insiden Siber namun belum pernah dilakukan evaluasi terhadap efektifitas kinerja penanganan Insiden secara mandiri - Organisasi belum pernah melakukan peninjauan terhadap efektifitas kinerja penanganan Insiden yang dilakukan oleh TTIS", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan peninjauan terhadap efektifitas kinerja penanganan insiden yang dilakukan oleh tim tanggap Insiden Siber secara berkala.", + }, + { + text: "TTIS sudah pernah melakukan evaluasi terhadap efektifitas kinerja penanganan insiden secara mandiri namun belum dilakukan peninjauan oleh organisasi", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan peninjauan terhadap efektifitas kinerja penanganan insiden yang dilakukan oleh tim tanggap Insiden Siber secara berkala.", + }, + { + text: "- TTIS sudah pernah melakukan evaluasi terhadap efektifitas kinerja penanganan Insiden secara mandiri - Organisasi telah melakukan peninjauan terhadap efektifitas kinerja penanganan Insiden yang dilakukan oleh tim tanggap Insiden Siber", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan peninjauan terhadap efektifitas kinerja penanganan insiden yang dilakukan oleh tim tanggap Insiden Siber secara berkala.", + }, + { + text: "- TTIS sudah pernah melakukan evaluasi terhadap efektifitas kinerja penanganan Insiden secara mandiri - Organisasi telah melakukan peninjauan terhadap efektifitas kinerja penanganan Insiden yang dilakukan oleh tim tanggap Insiden Siber - Kebijakan/pedoman/prosedur peninjauan terhadap efektifitas kinerja penanganan Insiden Siber oleh TTIS sudah ditetapkan/diformalkan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan peninjauan terhadap efektifitas kinerja penanganan insiden yang dilakukan oleh tim tanggap Insiden Siber secara berkala.", + }, + { + text: "- TTIS sudah pernah melakukan evaluasi terhadap efektifitas kinerja penanganan Insiden secara mandiri - Organisasi telah melakukan peninjauan terhadap efektifitas kinerja penanganan Insiden yang dilakukan oleh tim tanggap Insiden Siber secara berkala minimal satu kali dalam satu tahun - Kebijakan/pedoman/prosedur peninjauan terhadap efektifitas kinerja penanganan Insiden Siber oleh TTIS sudah ditetapkan/diformalkandan dsudah dilakukan reviu secara berkala dan dilakukan perbaikan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi melakukan peninjauan terhadap efektifitas kinerja penanganan insiden yang dilakukan oleh tim tanggap Insiden Siber secara berkala.", + }, + { + text: "Organisasi belum melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasistas SDM.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasistas SDM.", + }, + { + text: "Organisasi belum pernah melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber oleh TTIS", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasistas SDM.", + }, + { + text: "a. Organisasi telah melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber oleh TTIS namun belum secara komprehensif meliputi dari segi teknologi, tata kelola, atau peningkatan kapasitas SDM.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasistas SDM.", + }, + { + text: "TTIS telah melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasitas SDM.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasistas SDM.", + }, + { + text: "Organisasi bersama dengan TTIS telah melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasitas SDM.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasistas SDM.", + }, + { + text: "- Organisasi bersama dengan TTIS telah melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasitas SDM. - langkah-langkah perbaikan tersebut dievaluasi dan diperbarui secara berkala sesuai kebutuhan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasistas SDM.", + }, + //End of Penganggulangan Dan Pemulihan + //Option of deteksi + { + text: "Belum adanya kejelasan tentang peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperjelas peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan.", + }, + { + text: "Peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperjelas peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan.", + }, + { + text: "Peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan sudah diterapkan pada sebagian besar aspek tapi belum diformalkan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperjelas peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan.", + }, + { + text: "Peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperjelas peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan.", + }, + { + text: "Peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dilakukan monitoring secara rutin, dan di review secara berkala meninjau kembali dan mengevaluasi efektivitasnya. Ada upaya untuk memastikan bahwa proses ini tetap relevan dan efisien seiring waktu.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperjelas peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan.", + }, + { + text: "Peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dilakukan monitoring secara rutin, dan di review secara berkala meninjau kembali dan mengevaluasi efektivitasnya, proaktif melakukan perbaikan berkelanjutan dan adaptif terhadap perubahan lingkungan dan ancaman keamanan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperjelas peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan.", + }, + { + text: "- Belum ada sistem untuk mendeteksi peristiwa kamanan - Belum ada sistem untuk menganalisis peristiwa kamanan - Belum ada sistem untuk merespons peristiwa keamanan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyiapkan sistem dalam organisasi untuk mendeteksi, menganalisis, dan merespons peristiwa keamanan.", + }, + { + text: "- Sistem untuk mendeteksi peristiwa keamanan sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan - Sistem untuk menganalisis peristiwa keamanan sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan - Sistem untuk merespons peristiwa keamanan sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyiapkan sistem dalam organisasi untuk mendeteksi, menganalisis, dan merespons peristiwa keamanan.", + }, + { + text: "- Sistem untuk mendeteksi peristiwa keamanan sudah diterapkan pada sebagian besar aspek tapi belum diformalkan - Sistem untuk menganalisis peristiwa keamanan sudah diterapkan pada sebagian besar aspek tapi belum diformalkan - Sistem untuk merespons peristiwa keamanan sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyiapkan sistem dalam organisasi untuk mendeteksi, menganalisis, dan merespons peristiwa keamanan.", + }, + { + text: "- Sistem untuk mendeteksi peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan - Sistem untuk menganalisis peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan - Sistem untuk merespons peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyiapkan sistem dalam organisasi untuk mendeteksi, menganalisis, dan merespons peristiwa keamanan.", + }, + { + text: "- Sistem untuk mendeteksi peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala - Sistem untuk menganalisis peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala - Sistem untuk merespons peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyiapkan sistem dalam organisasi untuk mendeteksi, menganalisis, dan merespons peristiwa keamanan.", + }, + { + text: "- Sistem untuk mendeteksi peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala serta dilakukan otomatisasi - Sistem untuk menganalisis peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala serta dilakukan otomatisasi - Sistem untuk merespons peristiwa keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala serta dilakukan otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyiapkan sistem dalam organisasi untuk mendeteksi, menganalisis, dan merespons peristiwa keamanan.", + }, + { + text: "Belum dilakukan proses pemantauan peristiwa keamanan siber, sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan proses pemantauan peristiwa keamanan siber, sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku.", + }, + { + text: "Proses pemantauan peristiwa keamanan siber sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan proses pemantauan peristiwa keamanan siber, sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku.", + }, + { + text: "Proses pemantauan peristiwa keamanan siber sudah diterapkan pada sebagian besar aspek tapi belum diformalkan sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan proses pemantauan peristiwa keamanan siber, sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku.", + }, + { + text: "Proses pemantauan peristiwa keamanan siber sudah diterapkan pada seluruh aspek dan sudah diformalkan sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan proses pemantauan peristiwa keamanan siber, sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku.", + }, + { + text: "Proses pemantauan peristiwa keamanan siber sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan proses pemantauan peristiwa keamanan siber, sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku.", + }, + { + text: "Proses pemantauan peristiwa keamanan siber sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala serta dilakukan otomatisasi sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan proses pemantauan peristiwa keamanan siber, sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku.", + }, + { + text: "Belum dilakukan proses pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi.", + }, + { + text: "Proses pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi.", + }, + { + text: "Proses pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi.", + }, + { + text: "Proses pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi.", + }, + { + text: "Proses pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi.", + }, + { + text: "Proses pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala serta dilakukan otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi.", + }, + { + text: "- Belum ada SOP Penyampaian Informasi hasil pendeteksian kejadian keamanan - Belum ada dokumen NDA", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Informasi hasil pendeteksian kejadian keamanan diberitahukan kepada pihak yang terkait sesuai dengan persetujuan manajemen organisasi.", + }, + { + text: "- SOP Penyampaian Informasi hasil pendeteksian kejadian keamanan sudah diterapkan pada sebagian aspek tapi belum diformalkan - Dokumen NDA sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Informasi hasil pendeteksian kejadian keamanan diberitahukan kepada pihak yang terkait sesuai dengan persetujuan manajemen organisasi.", + }, + { + text: "- SOP Penyampaian Informasi hasil pendeteksian kejadian keamanan sudah diterapkan pada sebagian besar aspek tapi belum diformalkan - Dokumen NDA sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Informasi hasil pendeteksian kejadian keamanan diberitahukan kepada pihak yang terkait sesuai dengan persetujuan manajemen organisasi.", + }, + { + text: "- SOP Penyampaian Informasi hasil pendeteksian kejadian keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan - Dokumen NDA sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Informasi hasil pendeteksian kejadian keamanan diberitahukan kepada pihak yang terkait sesuai dengan persetujuan manajemen organisasi.", + }, + { + text: "- SOP Penyampaian Informasi hasil pendeteksian kejadian keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala - Dokumen NDA sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Informasi hasil pendeteksian kejadian keamanan diberitahukan kepada pihak yang terkait sesuai dengan persetujuan manajemen organisasi.", + }, + { + text: "- SOP Penyampaian Informasi hasil pendeteksian kejadian keamanan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala serta dilakukan perbaikan - Dokumen NDA sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan direview secara berkala serta dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Informasi hasil pendeteksian kejadian keamanan diberitahukan kepada pihak yang terkait sesuai dengan persetujuan manajemen organisasi.", + }, + { + text: "Belum ada Review prosedur secara berkala", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu dan peningkatan prosedur pendeteksian peristiwa keamanan secara berkala.", + }, + { + text: "Review prosedur secara berkala sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu dan peningkatan prosedur pendeteksian peristiwa keamanan secara berkala.", + }, + { + text: "Review prosedur secara berkala sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu dan peningkatan prosedur pendeteksian peristiwa keamanan secara berkala.", + }, + { + text: "Review prosedur secara berkala sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu dan peningkatan prosedur pendeteksian peristiwa keamanan secara berkala.", + }, + { + text: "Review prosedur secara berkala sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan dikaji secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu dan peningkatan prosedur pendeteksian peristiwa keamanan secara berkala.", + }, + { + text: "Review prosedur secara berkala sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring dan dikaji secara berkala serta dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV melakukan reviu dan peningkatan prosedur pendeteksian peristiwa keamanan secara berkala.", + }, + { + text: "- Belum ada SOP Identifikasi Operasional IIV - Belum ada SOP Pengelolaan Operasional IIV - Belum ada Dokumen Monitoring Kapasitas IIV", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menetapkan dan menerapkan prosedur untuk mengidentifikasi dan mengelola ambang batas terhadap operasional jaringan dan arus informasi yang diharapkan antara pengguna, penyelenggara, dan sistem.", + }, + { + text: "- SOP Identifikasi Operasional IIV sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan - SOP Pengelolaan Operasional IIV sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan - Dokumen Monitoring Kapasitas IIV sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menetapkan dan menerapkan prosedur untuk mengidentifikasi dan mengelola ambang batas terhadap operasional jaringan dan arus informasi yang diharapkan antara pengguna, penyelenggara, dan sistem.", + }, + { + text: "- SOP Identifikasi Operasional IIV sudah diterapkan pada sebagian besar aspek tapi belum diformalkan - SOP Pengelolaan Operasional IIV sudah diterapkan pada sebagian besar aspek tapi belum diformalkan - Dokumen Monitoring Kapasitas IIV sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menetapkan dan menerapkan prosedur untuk mengidentifikasi dan mengelola ambang batas terhadap operasional jaringan dan arus informasi yang diharapkan antara pengguna, penyelenggara, dan sistem.", + }, + { + text: "- SOP Identifikasi Operasional IIV sudah diterapkan pada seluruh aspek dan sudah diformalkan - SOP Pengelolaan Operasional IIV sudah diterapkan pada seluruh aspek dan sudah diformalkan - Dokumen Monitoring Kapasitas IIV sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menetapkan dan menerapkan prosedur untuk mengidentifikasi dan mengelola ambang batas terhadap operasional jaringan dan arus informasi yang diharapkan antara pengguna, penyelenggara, dan sistem.", + }, + { + text: "- SOP Identifikasi Operasional IIV sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, dan direview secara berkala - SOP Pengelolaan Operasional IIV sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, dan direview secara berkala - Dokumen Monitoring Kapasitas IIV sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menetapkan dan menerapkan prosedur untuk mengidentifikasi dan mengelola ambang batas terhadap operasional jaringan dan arus informasi yang diharapkan antara pengguna, penyelenggara, dan sistem.", + }, + { + text: "- SOP Identifikasi Operasional IIV sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan, atau otomatisasi jika teknis - SOP Pengelolaan Operasional IIV sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan, atau otomatisasi jika teknis - Dokumen Monitoring Kapasitas IIV sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan, atau otomatisasi jika teknis", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menetapkan dan menerapkan prosedur untuk mengidentifikasi dan mengelola ambang batas terhadap operasional jaringan dan arus informasi yang diharapkan antara pengguna, penyelenggara, dan sistem.", + }, + { + text: "- Belum ada tools untuk melaksanakan analisis terhadap peristiwa siber - Belum ada Petunjuk Teknis Analisis terhadap Peristiwa Siber - Belum ada laporan analisis terhadap peristiwa siber yang terdeteksi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Kejadian keamanan yang terdeteksi dianalisis untuk memahami target dan metode serangan", + }, + { + text: "- Tools untuk melaksanakan analisis terhadap peristiwa siber sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan - Petunjuk Teknis Analisis terhadap Peristiwa Siber sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan - Laporan analisis terhadap peristiwa siber yang terdeteksi sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Kejadian keamanan yang terdeteksi dianalisis untuk memahami target dan metode serangan", + }, + { + text: "- Tools untuk melaksanakan analisis terhadap peristiwa siber sudah diterapkan pada sebagian besar aspek tapi belum diformalkan - Petunjuk Teknis Analisis terhadap Peristiwa Siber sudah diterapkan pada sebagian besar aspek tapi belum diformalkan - Laporan analisis terhadap peristiwa siber yang terdeteksi sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Kejadian keamanan yang terdeteksi dianalisis untuk memahami target dan metode serangan", + }, + { + text: "- tools untuk melaksanakan analisis terhadap peristiwa siber sudah diterapkan pada seluruh aspek dan sudah diformalkan - Petunjuk Teknis analisis terhadap peristiwa siber sudah diterapkan pada seluruh aspek dan sudah diformalkan - laporan analisis terhadap peristiwa siber yang terdeteksi sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Kejadian keamanan yang terdeteksi dianalisis untuk memahami target dan metode serangan", + }, + { + text: "- Tools untuk melaksanakan analisis terhadap peristiwa siber sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, dan direview secara berkala - Petunjuk Teknis Analisis terhadap Peristiwa Siber sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, dan direview secara berkala - Laporan analisis terhadap peristiwa siber yang terdeteksi sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Kejadian keamanan yang terdeteksi dianalisis untuk memahami target dan metode serangan", + }, + { + text: "- Tools untuk melaksanakan analisis terhadap peristiwa siber sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan, atau otomatisasi jika teknis - Petunjuk Teknis Analisis terhadap Peristiwa Siber sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan, atau otomatisasi jika teknis - Laporan analisis terhadap peristiwa siber yang terdeteksi sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan, atau otomatisasi jika teknis", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Kejadian keamanan yang terdeteksi dianalisis untuk memahami target dan metode serangan", + }, + { + text: "- Belum ada SOP Investigasi Insiden Keamanan Siber - Belum ada Laporan Investigasi Insiden Keamanan Siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peristiwa keamanan secara akurat dengan menerapkan prosedur untuk melakukan analisis korelasi insiden keamanan dan analisis komparatif dengan informasi ancaman yang diperoleh dari luar organisasi.", + }, + { + text: "- SOP Investigasi Insiden Keamanan Siber sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan - Laporan Investigasi Insiden Keamanan Siber sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peristiwa keamanan secara akurat dengan menerapkan prosedur untuk melakukan analisis korelasi insiden keamanan dan analisis komparatif dengan informasi ancaman yang diperoleh dari luar organisasi.", + }, + { + text: "- SOP Investigasi Insiden Keamanan Siber sudah diterapkan pada sebagian besar aspek tapi belum diformalkan - Laporan Investigasi Insiden Keamanan Siber sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peristiwa keamanan secara akurat dengan menerapkan prosedur untuk melakukan analisis korelasi insiden keamanan dan analisis komparatif dengan informasi ancaman yang diperoleh dari luar organisasi.", + }, + { + text: "- SOP Investigasi Insiden Keamanan Siber sudah diterapkan pada seluruh aspek dan sudah diformalkan - Laporan Investigasi Insiden Keamanan Siber sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peristiwa keamanan secara akurat dengan menerapkan prosedur untuk melakukan analisis korelasi insiden keamanan dan analisis komparatif dengan informasi ancaman yang diperoleh dari luar organisasi.", + }, + { + text: "- SOP Investigasi Insiden Keamanan Siber sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, dan direview secara berkala - Laporan Investigasi Insiden Keamanan Siber sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peristiwa keamanan secara akurat dengan menerapkan prosedur untuk melakukan analisis korelasi insiden keamanan dan analisis komparatif dengan informasi ancaman yang diperoleh dari luar organisasi.", + }, + { + text: "- SOP Investigasi Insiden Keamanan Siber sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan, atau otomatisasi jika teknis - Laporan Investigasi Insiden Keamanan Siber sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan, atau otomatisasi jika teknis", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi peristiwa keamanan secara akurat dengan menerapkan prosedur untuk melakukan analisis korelasi insiden keamanan dan analisis komparatif dengan informasi ancaman yang diperoleh dari luar organisasi.", + }, + { + text: "Belum ada dokumen Manajemen Risiko berupa dokumen Penilaian Risiko (Risk Assessment), IRP (Incident Response Program and Planning), DRP (Disaster Recovery Planning), dan BIA (Business Impact Analysis)", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi dampak peristiwa keamanan, termasuk dampaknya terhadap organisasi lain yang relevan.", + }, + { + text: "Dokumen Manajemen Risiko (dokumen Penilaian Risiko (Risk Assessment), IRP (Incident Response Program and Planning), DRP (Disaster Recovery Planning), dan BIA (Business Impact Analysis) sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi dampak peristiwa keamanan, termasuk dampaknya terhadap organisasi lain yang relevan.", + }, + { + text: "Dokumen Manajemen Risiko (dokumen Penilaian Risiko (Risk Assessment), IRP (Incident Response Program and Planning), DRP (Disaster Recovery Planning), dan BIA (Business Impact Analysis) sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi dampak peristiwa keamanan, termasuk dampaknya terhadap organisasi lain yang relevan.", + }, + { + text: "Dokumen Manajemen Risiko (dokumen Penilaian Risiko (Risk Assessment), IRP (Incident Response Program and Planning), DRP (Disaster Recovery Planning), dan BIA (Business Impact Analysis) sudah diterapkan pada seluruh aspek dan sudah diformalkan ", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi dampak peristiwa keamanan, termasuk dampaknya terhadap organisasi lain yang relevan.", + }, + { + text: "Dokumen Manajemen Risiko (dokumen Penilaian Risiko (Risk Assessment), IRP (Incident Response Program and Planning), DRP (Disaster Recovery Planning), dan BIA (Business Impact Analysis) sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi dampak peristiwa keamanan, termasuk dampaknya terhadap organisasi lain yang relevan.", + }, + { + text: "Dokumen Manajemen Risiko (dokumen Penilaian Risiko (Risk Assessment), IRP (Incident Response Program and Planning), DRP (Disaster Recovery Planning), dan BIA (Business Impact Analysis) sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan, atau otomatisasi jika teknis", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Identifikasi dampak peristiwa keamanan, termasuk dampaknya terhadap organisasi lain yang relevan.", + }, + { + text: "Belum ada proses dokumentasi hasil analisis peristiwa siber yang dilaporkan kepada pihak manajemen sesuai ketentuan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hasil analisis peristiwa siber didokumentasikan, serta dilaporkan kepada pihak manajemen sesuai ketentuan.", + }, + { + text: "Proses dokumentasi hasil analisis peristiwa siber yang dilaporkan kepada pihak manajemen sesuai ketentuan sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hasil analisis peristiwa siber didokumentasikan, serta dilaporkan kepada pihak manajemen sesuai ketentuan.", + }, + { + text: "Proses dokumentasi hasil analisis peristiwa siber yang dilaporkan kepada pihak manajemen sesuai ketentuan sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hasil analisis peristiwa siber didokumentasikan, serta dilaporkan kepada pihak manajemen sesuai ketentuan.", + }, + { + text: "Proses dokumentasi hasil analisis peristiwa siber yang dilaporkan kepada pihak manajemen sesuai ketentuan sudah diterapkan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hasil analisis peristiwa siber didokumentasikan, serta dilaporkan kepada pihak manajemen sesuai ketentuan.", + }, + { + text: "Proses dokumentasi hasil analisis peristiwa siber yang dilaporkan kepada pihak manajemen sesuai ketentuan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hasil analisis peristiwa siber didokumentasikan, serta dilaporkan kepada pihak manajemen sesuai ketentuan.", + }, + { + text: "Proses dokumentasi hasil analisis peristiwa siber yang dilaporkan kepada pihak manajemen sesuai ketentuan sudah diterapkan pada seluruh aspek dan sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan, atau otomatisasi jika teknis", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Hasil analisis peristiwa siber didokumentasikan, serta dilaporkan kepada pihak manajemen sesuai ketentuan.", + }, + { + text: "Organisasi belum menggunakan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "gunakan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan. (misalnya perangkat intrustion detection and prevention systems, next-generation firewall, endpoint detection and response, dll)", + }, + { + text: "Organisasi telah menerapkan penggunaan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan di sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "gunakan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan. (misalnya perangkat intrustion detection and prevention systems, next-generation firewall, endpoint detection and response, dll)", + }, + { + text: "Organisasi telah menerapkan penggunaan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan di sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "gunakan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan. (misalnya perangkat intrustion detection and prevention systems, next-generation firewall, endpoint detection and response, dll)", + }, + { + text: "Organisasi sudah menerapkan penggunaan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan di seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "gunakan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan. (misalnya perangkat intrustion detection and prevention systems, next-generation firewall, endpoint detection and response, dll)", + }, + { + text: "Organisasi sudah menerapkan penggunaan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan di seluruh aspek dan sudah diformalkan, melakukan monitoring dan dilakukan review prosedur secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "gunakan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan. (misalnya perangkat intrustion detection and prevention systems, next-generation firewall, endpoint detection and response, dll)", + }, + { + text: "Organisasi sudah menerapkan penggunaan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan di seluruh aspek dan sudah diformalkan, melakukan monitoring dan dilakukan review prosedur secara berkala, serta dilakukan perbaikan prosedur dan pembaruan perangkat secara berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "gunakan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan. (misalnya perangkat intrustion detection and prevention systems, next-generation firewall, endpoint detection and response, dll)", + }, + { + text: "Organisasi belum memiliki prosedur validasi informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi apakah informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan.", + }, + { + text: "Organisasi sudah menerapkan prosedur validasi informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan, pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi apakah informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan.", + }, + { + text: "Organisasi sudah menerapkan prosedur validasi informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan, pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi apakah informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan.", + }, + { + text: "Organisasi sudah menerapkan prosedur validasi informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan, pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi apakah informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan.", + }, + { + text: "Organisasi sudah menerapkan prosedur validasi informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan, pada seluruh aspek dan sudah diformalkan, dilakukan monitoring dan review prosedur secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi apakah informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan.", + }, + { + text: "Organisasi sudah menerapkan prosedur validasi informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan, pada seluruh aspek dan sudah diformalkan, dilakukan monitoring dan review prosedur secara berkala, serta melakukan perbaikan prosedur secara berkelanjutan, dan mengarah pada otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi apakah informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan.", + }, + { + text: "", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan.", + }, + { + text: "Organisasi belum memiliki prosedur untuk melakukan validasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan.", + }, + { + text: "Organisasi sudah menerapkan prosedur validasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan.", + }, + { + text: "Organisasi sudah menerapkan prosedur validasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan.", + }, + { + text: "Organisasi sudah menerapkan prosedur validasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan pada seluruh aspek dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan.", + }, + { + text: "Organisasi sudah menerapkan prosedur validasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan dan dilakukan pada seluruh aspek dan sudah diformalkan, dilakukan monitoring dan review prosedur secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan.", + }, + { + text: "Organisasi sudah menerapkan prosedur validasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan pada seluruh aspek dan sudah diformalkan, dilakukan monitoring dan review prosedur secara berkala, serta melakukan perbaikan prosedur secara berkelanjutan, dan mengarah pada otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "memvalidasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan.", + }, + { + text: "Organisasi belum memiliki prosedur untuk memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi sudah menerapkan prosedur pada sebagian kecil aspek tapi belum diformalkan untuk memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi sudah menerapkan prosedur pada sebagian besar aspek tapi belum diformalkanuntuk memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi sudah menerapkan prosedur pada seluruh aspek dan sudah diformalkan untuk memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi sudah menerapkan prosedur pada seluruh aspek dan sudah diformalkan untuk memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV, dilakukan monitoring dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi sudah menerapkan prosedur pada seluruh aspek dan sudah diformalkan untuk memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV, dilakukan monitoring dan direview secara berkala, serta diperbaiki prosedurnya secara berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi belum memiliki prosedur untuk memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi sudah menerapkan prosedur pada sebagian kecil aspek tapi belum diformalkan untuk memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV ", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi sudah menerapkan prosedur pada sebagian besar aspek tapi belum diformalkanuntuk memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi sudah menerapkan prosedur pada seluruh aspek dan sudah diformalkan untuk memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi sudah menerapkan prosedur pada seluruh aspek dan sudah diformalkan untuk memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV, dilakukan monitoring dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi sudah menerapkan prosedur pada seluruh aspek dan sudah diformalkan untuk memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV, dilakukan monitoring dan direview secara berkala, serta diperbaiki prosedurnya secara berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + }, + { + text: "Organisasi belum memiliki teknologi untuk memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanan melalui penilaian kerentanan, uji penetrasi, atau audit keamanan ", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanannya melalui penilaian kerentanan, uji penetrasi, atau audit keamanan.", + }, + { + text: "Organisasi telah menerapkan teknologi pada sebagian kecil aspek tapi belum diformalkan untuk memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanan melalui penilaian kerentanan, uji penetrasi, atau audit keamanan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanannya melalui penilaian kerentanan, uji penetrasi, atau audit keamanan.", + }, + { + text: "Organisasi telah menerapkan teknologi pada sebagian besar aspek tapi belum diformalkan untuk memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanan melalui penilaian kerentanan, uji penetrasi, atau audit keamanan ", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanannya melalui penilaian kerentanan, uji penetrasi, atau audit keamanan.", + }, + { + text: "Organisasi telah menerapkan teknologi pada seluruh aspek dan sudah diformalkan untuk memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanan melalui penilaian kerentanan, uji penetrasi, atau audit keamanan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanannya melalui penilaian kerentanan, uji penetrasi, atau audit keamanan.", + }, + { + text: "Organisasi telah menerapkan teknologi pada seluruh aspek dan sudah diformalkan untuk memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanan melalui penilaian kerentanan, uji penetrasi, atau audit keamanan, dilakukan monitoring dan review prosedur secara berkala. ", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanannya melalui penilaian kerentanan, uji penetrasi, atau audit keamanan.", + }, + { + text: "Organisasi telah menerapkan teknologi pada seluruh aspek dan sudah diformalkan untuk memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanan melalui penilaian kerentanan, uji penetrasi, atau audit keamanan, dilakukan monitoring dan review prosedur secara berkala serta dilakukan perbaikan prosedur secara berkelanjutan, dan mengarah pada otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanannya melalui penilaian kerentanan, uji penetrasi, atau audit keamanan.", + }, + { + text: "Organisasi belum memiliki prosedur pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi.", + }, + { + text: "Organisasi telah menerapkan teknologi pada sebagian besar aspek tapi belum diformalkan untuk memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi.", + }, + { + text: "Organisasi telah menerapkan teknologi pada sebagian besar aspek tapi belum diformalkan untuk memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi.", + }, + { + text: "Organisasi telah menerapkan teknologi pada seluruh aspek dan sudah diformalkan untuk memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi.", + }, + { + text: "Organisasi telah menerapkan teknologi pada seluruh aspek dan sudah diformalkan untuk memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi dan dilakukan monitoring dan review prosedur secara berkala. ", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi.", + }, + { + text: "Organisasi telah menerapkan teknologi pada seluruh aspek dan sudah diformalkan untuk memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi dan dilakukan monitoring dan review prosedur secara berkala serta dilakukan perbaikan prosedur secara berkelanjutan, dan mengarah pada otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi.", + }, + // End Option of deteksi + // Option of Proteksi + // 1 > KATEGORI 2.1 + { + text: "belum memiliki prosedur pengelolaan aset informasi dan personel yang menggunakan IIV", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menetapkan dan menerapkan prosedur untuk menerbitkan, mengelola, memeriksa, membatalkan, dan memantau informasi tentang identitias dan kredensial terhadap aset informasi dan personel yang menggunakan IIV.", + }, + { + text: "Prosedur pengelolaan aset informasi dan personel yang menggunakan IIV sudah diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menetapkan dan menerapkan prosedur untuk menerbitkan, mengelola, memeriksa, membatalkan, dan memantau informasi tentang identitias dan kredensial terhadap aset informasi dan personel yang menggunakan IIV.", + }, + { + text: "Prosedur pengelolaan aset informasi dan personel yang menggunakan IIV sudah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menetapkan dan menerapkan prosedur untuk menerbitkan, mengelola, memeriksa, membatalkan, dan memantau informasi tentang identitias dan kredensial terhadap aset informasi dan personel yang menggunakan IIV.", + }, + { + text: "Prosedur pengelolaan aset informasi dan personel yang menggunakan IIV sudah diformalkan dan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menetapkan dan menerapkan prosedur untuk menerbitkan, mengelola, memeriksa, membatalkan, dan memantau informasi tentang identitias dan kredensial terhadap aset informasi dan personel yang menggunakan IIV.", + }, + { + text: "- Prosedur pengelolaan aset informasi dan personel yang menggunakan IIV sudah diformalkan dan diterapkan pada seluruh aspek. - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menetapkan dan menerapkan prosedur untuk menerbitkan, mengelola, memeriksa, membatalkan, dan memantau informasi tentang identitias dan kredensial terhadap aset informasi dan personel yang menggunakan IIV.", + }, + { + text: "- Prosedur pengelolaan aset informasi dan personel yang menggunakan IIV sudah diformalkan dan diterapkan pada seluruh aspek. - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala, serta dilakukan perbaikan secara berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menetapkan dan menerapkan prosedur untuk menerbitkan, mengelola, memeriksa, membatalkan, dan memantau informasi tentang identitias dan kredensial terhadap aset informasi dan personel yang menggunakan IIV.", + }, + // 2 + { + text: "Belum memiliki prosedur mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun prosedur tentang mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan, termasuk pemberian koneksi terhadap pengguna, perangkat IoT, dan/atau server.", + }, + { + text: "Prosedur mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan sudah diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun prosedur tentang mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan, termasuk pemberian koneksi terhadap pengguna, perangkat IoT, dan/atau server.", + }, + { + text: "Prosedur mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan sudah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun prosedur tentang mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan, termasuk pemberian koneksi terhadap pengguna, perangkat IoT, dan/atau server.", + }, + { + text: "Prosedur mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan sudah diformalkan dan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun prosedur tentang mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan, termasuk pemberian koneksi terhadap pengguna, perangkat IoT, dan/atau server.", + }, + { + text: "- Prosedur mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan sudah diformalkan dan diterapkan pada seluruh aspek. - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun prosedur tentang mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan, termasuk pemberian koneksi terhadap pengguna, perangkat IoT, dan/atau server.", + }, + { + text: "- Prosedur mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan sudah diformalkan dan diterapkan pada seluruh aspek. - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala, serta dilakukan perbaikan secara berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyusun prosedur tentang mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan, termasuk pemberian koneksi terhadap pengguna, perangkat IoT, dan/atau server.", + }, + // 3 + { + text: "Belum memiliki prosedur pencegahan terhadap upaya serangan melalui perangkat atau jaringan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkannya prosedur pencegahan terhadap upaya memasuki perangkat atau jaringan secara tidak sah, dengan menerapkan langkah-langkah seperti menerapkan fungsi untuk penguncian setelah sejumlah upaya masuk yang gagal dan memberikan interval waktu hingga keamanannya dipastikan.", + }, + { + text: "Prosedur pencegahan terhadap upaya serangan melalui perangkat atau jaringan sudah diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkannya prosedur pencegahan terhadap upaya memasuki perangkat atau jaringan secara tidak sah, dengan menerapkan langkah-langkah seperti menerapkan fungsi untuk penguncian setelah sejumlah upaya masuk yang gagal dan memberikan interval waktu hingga keamanannya dipastikan.", + }, + { + text: "Prosedur pencegahan terhadap upaya serangan melalui perangkat atau jaringan sudah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkannya prosedur pencegahan terhadap upaya memasuki perangkat atau jaringan secara tidak sah, dengan menerapkan langkah-langkah seperti menerapkan fungsi untuk penguncian setelah sejumlah upaya masuk yang gagal dan memberikan interval waktu hingga keamanannya dipastikan.", + }, + { + text: "Prosedur pencegahan terhadap upaya serangan melalui perangkat atau jaringan sudah diformalkan dan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkannya prosedur pencegahan terhadap upaya memasuki perangkat atau jaringan secara tidak sah, dengan menerapkan langkah-langkah seperti menerapkan fungsi untuk penguncian setelah sejumlah upaya masuk yang gagal dan memberikan interval waktu hingga keamanannya dipastikan.", + }, + { + text: "- Prosedur pencegahan terhadap upaya serangan melalui perangkat atau jaringan sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkannya prosedur pencegahan terhadap upaya memasuki perangkat atau jaringan secara tidak sah, dengan menerapkan langkah-langkah seperti menerapkan fungsi untuk penguncian setelah sejumlah upaya masuk yang gagal dan memberikan interval waktu hingga keamanannya dipastikan.", + }, + { + text: "- Prosedur pencegahan terhadap upaya serangan melalui perangkat atau jaringan sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala, serta dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkannya prosedur pencegahan terhadap upaya memasuki perangkat atau jaringan secara tidak sah, dengan menerapkan langkah-langkah seperti menerapkan fungsi untuk penguncian setelah sejumlah upaya masuk yang gagal dan memberikan interval waktu hingga keamanannya dipastikan.", + }, + // 4 + { + text: "belum memiliki prosedur pemisahan hak akses", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menerapkan prosedur untuk memisahkan hak akses sesuai tugas dan area tanggung jawab (misalnya, pisahkan fungsi untuk pengguna dari fungsi untuk administrator sistem)", + }, + { + text: "Prosedur pemisahan hak akses sudah diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menerapkan prosedur untuk memisahkan hak akses sesuai tugas dan area tanggung jawab (misalnya, pisahkan fungsi untuk pengguna dari fungsi untuk administrator sistem)", + }, + { + text: "Prosedur pemisahan hak akses sudah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menerapkan prosedur untuk memisahkan hak akses sesuai tugas dan area tanggung jawab (misalnya, pisahkan fungsi untuk pengguna dari fungsi untuk administrator sistem)", + }, + { + text: "Prosedur pemisahan hak akses sudah diformalkan dan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menerapkan prosedur untuk memisahkan hak akses sesuai tugas dan area tanggung jawab (misalnya, pisahkan fungsi untuk pengguna dari fungsi untuk administrator sistem)", + }, + { + text: "- Prosedur pemisahan hak akses sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menerapkan prosedur untuk memisahkan hak akses sesuai tugas dan area tanggung jawab (misalnya, pisahkan fungsi untuk pengguna dari fungsi untuk administrator sistem)", + }, + { + text: "- Prosedur pemisahan hak akses sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala, serta dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menyusun dan menerapkan prosedur untuk memisahkan hak akses sesuai tugas dan area tanggung jawab (misalnya, pisahkan fungsi untuk pengguna dari fungsi untuk administrator sistem)", + }, + // 5 + { + text: "belum memiliki prosedur pembatasan komunikasi perangkat dan server", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pembatasan komunikasi oleh perangkat dan server kepada pengguna sesuai dengan tingkat risikonya.", + }, + { + text: "Prosedur pembatasan komunikasi perangkat dan server sudah diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pembatasan komunikasi oleh perangkat dan server kepada pengguna sesuai dengan tingkat risikonya.", + }, + { + text: "Prosedur pembatasan komunikasi perangkat dan server sudah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pembatasan komunikasi oleh perangkat dan server kepada pengguna sesuai dengan tingkat risikonya.", + }, + { + text: "Prosedur pembatasan komunikasi perangkat dan server sudah diformalkan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pembatasan komunikasi oleh perangkat dan server kepada pengguna sesuai dengan tingkat risikonya.", + }, + { + text: "- Prosedur pembatasan komunikasi perangkat dan server sudah diformalkan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pembatasan komunikasi oleh perangkat dan server kepada pengguna sesuai dengan tingkat risikonya.", + }, + { + text: "- Prosedur pembatasan komunikasi perangkat dan server sudah diformalkan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala, serta dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pembatasan komunikasi oleh perangkat dan server kepada pengguna sesuai dengan tingkat risikonya.", + }, + // 6 + { + text: "Belum memiliki sistem otentikasi untuk perangkat, pengguna, dan aset informasi lainnya", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "perangkat, pengguna, dan aset informasi lainnya menggunakan sistem otentikasi tertentu (misalnya, multi-factor authentication) sesuai dengan tingkat risiko nya terhadap sistem.", + }, + { + text: "Sistem otentikasi untuk perangkat, pengguna, dan aset informasi lainnya sudah diterapkan pada sebagian kecil aspek tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "perangkat, pengguna, dan aset informasi lainnya menggunakan sistem otentikasi tertentu (misalnya, multi-factor authentication) sesuai dengan tingkat risiko nya terhadap sistem.", + }, + { + text: "Sistem otentikasi untuk perangkat, pengguna, dan aset informasi lainnya sudah diterapkan pada sebagian besar aspek tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "perangkat, pengguna, dan aset informasi lainnya menggunakan sistem otentikasi tertentu (misalnya, multi-factor authentication) sesuai dengan tingkat risiko nya terhadap sistem.", + }, + { + text: "Sistem otentikasi untuk perangkat, pengguna, dan aset informasi lainnya sudah diformalkan dan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "perangkat, pengguna, dan aset informasi lainnya menggunakan sistem otentikasi tertentu (misalnya, multi-factor authentication) sesuai dengan tingkat risiko nya terhadap sistem.", + }, + { + text: "- Sistem otentikasi untuk perangkat, pengguna, dan aset informasi lainnya sudah diformalkan dan diterapkan pada seluruh aspek - Sistem tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "perangkat, pengguna, dan aset informasi lainnya menggunakan sistem otentikasi tertentu (misalnya, multi-factor authentication) sesuai dengan tingkat risiko nya terhadap sistem.", + }, + { + text: "- Sistem otentikasi untuk perangkat, pengguna, dan aset informasi lainnya sudah diformalkan dan diterapkan pada seluruh aspek, serta dilakukan otomatisasi - Sistem tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "perangkat, pengguna, dan aset informasi lainnya menggunakan sistem otentikasi tertentu (misalnya, multi-factor authentication) sesuai dengan tingkat risiko nya terhadap sistem.", + }, + + // 7 > KATEGORI 2.2 + { + text: "Belum memiliki prosedur keamanan fisik terhadap akses kontrol", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "menetapkan dan menerapkan prosedur keamanan fisik terhadap akses kontrol yang sesuai seperti mengunci dan membatasi akses ke area tempat perangkat dan server dipasang, menggunakan kontrol masuk dan keluar, otentikasi biometrik, memasang kamera pengintai, dan/atau memeriksa barang bawaan.", + }, + { + text: "Prosedur keamanan fisik terhadap akses kontrol sudah diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "menetapkan dan menerapkan prosedur keamanan fisik terhadap akses kontrol yang sesuai seperti mengunci dan membatasi akses ke area tempat perangkat dan server dipasang, menggunakan kontrol masuk dan keluar, otentikasi biometrik, memasang kamera pengintai, dan/atau memeriksa barang bawaan.", + }, + { + text: "Prosedur keamanan fisik terhadap akses kontrol sudah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "menetapkan dan menerapkan prosedur keamanan fisik terhadap akses kontrol yang sesuai seperti mengunci dan membatasi akses ke area tempat perangkat dan server dipasang, menggunakan kontrol masuk dan keluar, otentikasi biometrik, memasang kamera pengintai, dan/atau memeriksa barang bawaan.", + }, + { + text: "Prosedur keamanan fisik terhadap akses kontrol sudah diformalkan dan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "menetapkan dan menerapkan prosedur keamanan fisik terhadap akses kontrol yang sesuai seperti mengunci dan membatasi akses ke area tempat perangkat dan server dipasang, menggunakan kontrol masuk dan keluar, otentikasi biometrik, memasang kamera pengintai, dan/atau memeriksa barang bawaan.", + }, + { + text: "- Prosedur keamanan fisik terhadap akses kontrol sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "menetapkan dan menerapkan prosedur keamanan fisik terhadap akses kontrol yang sesuai seperti mengunci dan membatasi akses ke area tempat perangkat dan server dipasang, menggunakan kontrol masuk dan keluar, otentikasi biometrik, memasang kamera pengintai, dan/atau memeriksa barang bawaan.", + }, + { + text: "- Prosedur keamanan fisik terhadap akses kontrol sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala, serta dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "menetapkan dan menerapkan prosedur keamanan fisik terhadap akses kontrol yang sesuai seperti mengunci dan membatasi akses ke area tempat perangkat dan server dipasang, menggunakan kontrol masuk dan keluar, otentikasi biometrik, memasang kamera pengintai, dan/atau memeriksa barang bawaan.", + }, + // 8 + { + text: "Belum memiliki prosedur pelindungan aset fisik", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pelindungan fisik seperti menyiapkan catu daya cadangan, fasilitas proteksi kebakaran, dan perlindungan dari resapan air yang mengikuti kebijakan dan standar yang berlaku.", + }, + { + text: "Prosedur pelindungan aset fisik sudah diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pelindungan fisik seperti menyiapkan catu daya cadangan, fasilitas proteksi kebakaran, dan perlindungan dari resapan air yang mengikuti kebijakan dan standar yang berlaku.", + }, + { + text: "Prosedur pelindungan aset fisik sudah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pelindungan fisik seperti menyiapkan catu daya cadangan, fasilitas proteksi kebakaran, dan perlindungan dari resapan air yang mengikuti kebijakan dan standar yang berlaku.", + }, + { + text: "Prosedur pelindungan aset fisik sudah diformalkan dan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pelindungan fisik seperti menyiapkan catu daya cadangan, fasilitas proteksi kebakaran, dan perlindungan dari resapan air yang mengikuti kebijakan dan standar yang berlaku.", + }, + { + text: "- Prosedur pelindungan aset fisik sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pelindungan fisik seperti menyiapkan catu daya cadangan, fasilitas proteksi kebakaran, dan perlindungan dari resapan air yang mengikuti kebijakan dan standar yang berlaku.", + }, + { + text: "- Prosedur pelindungan aset fisik sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala, serta dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pelindungan fisik seperti menyiapkan catu daya cadangan, fasilitas proteksi kebakaran, dan perlindungan dari resapan air yang mengikuti kebijakan dan standar yang berlaku.", + }, + // 9 + { + text: "Belum memiliki prosedur dan sarana pengamanan terhadap perangkat komputer untuk pengolahan data IIV", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya prosedur dan sarana pengamanan terhadap perangkat komputer yang digunakan untuk pengolahan data IIV.", + }, + { + text: "Prosedur pengamanan terhadap perangkat komputer untuk pengolahan data IIV sudah diterapkan pada sebagian kecil aspek beserta sarana pengamanannya namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya prosedur dan sarana pengamanan terhadap perangkat komputer yang digunakan untuk pengolahan data IIV.", + }, + { + text: "Prosedur pengamanan terhadap perangkat komputer untuk pengolahan data IIV sudah diterapkan pada sebagian besar aspek beserta sarana pengamanannya namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya prosedur dan sarana pengamanan terhadap perangkat komputer yang digunakan untuk pengolahan data IIV.", + }, + { + text: "Prosedur pengamanan terhadap perangkat komputer untuk pengolahan data IIV sudah diformalkan dan diterapkan pada seluruh aspek beserta sarana pengamanannya", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya prosedur dan sarana pengamanan terhadap perangkat komputer yang digunakan untuk pengolahan data IIV.", + }, + { + text: "- Prosedur pengamanan terhadap perangkat komputer untuk pengolahan data IIV sudah diformalkan dan diterapkan pada seluruh aspek beserta sarana pengamanannya - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya prosedur dan sarana pengamanan terhadap perangkat komputer yang digunakan untuk pengolahan data IIV.", + }, + { + text: "- Prosedur pengamanan terhadap perangkat komputer untuk pengolahan data IIV sudah diformalkan dan diterapkan pada seluruh aspek beserta sarana pengamanannya - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala serta dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya prosedur dan sarana pengamanan terhadap perangkat komputer yang digunakan untuk pengolahan data IIV.", + }, + // 10 + { + text: "Belum memiliki prosedur pembaruan keamanan dan sejenisnya pada perangkat dan server", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tentukan metode untuk melakukan pembaruan keamanan dan sejenisnya pada perangkat dan server. Kemudian, terapkan pembaruan keamanan tersebut dengan teknologi yang benar dan tepat pada waktunya.", + }, + { + text: "Prosedur pembaruan keamanan dan sejenisnya pada perangkat dan server sudah diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tentukan metode untuk melakukan pembaruan keamanan dan sejenisnya pada perangkat dan server. Kemudian, terapkan pembaruan keamanan tersebut dengan teknologi yang benar dan tepat pada waktunya.", + }, + { + text: "Prosedur pembaruan keamanan dan sejenisnya pada perangkat dan server sudah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tentukan metode untuk melakukan pembaruan keamanan dan sejenisnya pada perangkat dan server. Kemudian, terapkan pembaruan keamanan tersebut dengan teknologi yang benar dan tepat pada waktunya.", + }, + { + text: "Prosedur pembaruan keamanan dan sejenisnya pada perangkat dan server sudah diformalkan dan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tentukan metode untuk melakukan pembaruan keamanan dan sejenisnya pada perangkat dan server. Kemudian, terapkan pembaruan keamanan tersebut dengan teknologi yang benar dan tepat pada waktunya.", + }, + { + text: "- Prosedur pembaruan keamanan dan sejenisnya pada perangkat dan server sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tentukan metode untuk melakukan pembaruan keamanan dan sejenisnya pada perangkat dan server. Kemudian, terapkan pembaruan keamanan tersebut dengan teknologi yang benar dan tepat pada waktunya.", + }, + { + text: "- Prosedur pembaruan keamanan dan sejenisnya pada perangkat dan server sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala serta dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tentukan metode untuk melakukan pembaruan keamanan dan sejenisnya pada perangkat dan server. Kemudian, terapkan pembaruan keamanan tersebut dengan teknologi yang benar dan tepat pada waktunya.", + }, + // 11 + { + text: "Kegiatan pembaruan keamanan pada perangkat organisasi belum didokumentasikan dan dilaporkan kepada manajemen secara berkala", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan kegiatan pembaruan keamanan pada perangkat organisasi dan laporkan kepada manajemen secara berkala.", + }, + { + text: "Kegiatan pembaruan keamanan pada perangkat organisasi sebagian kecil sudah didokumentasikan dan dilaporkan kepada manajemen secara berkala secara informal", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan kegiatan pembaruan keamanan pada perangkat organisasi dan laporkan kepada manajemen secara berkala.", + }, + { + text: "Kegiatan pembaruan keamanan pada perangkat organisasi sebagian besar sudah didokumentasikan dan dilaporkan kepada manajemen secara berkala secara informal", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan kegiatan pembaruan keamanan pada perangkat organisasi dan laporkan kepada manajemen secara berkala.", + }, + { + text: "Kegiatan pembaruan keamanan pada perangkat organisasi sudah didokumentasikan seluruhnya dan dilaporkan kepada manajemen secara berkala secara formal", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan kegiatan pembaruan keamanan pada perangkat organisasi dan laporkan kepada manajemen secara berkala.", + }, + { + text: "- Kegiatan pembaruan keamanan pada perangkat organisasi sudah didokumentasikan seluruhnya dan dilaporkan kepada manajemen secara berkala secara formal - Prosedur dokumentasi dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan kegiatan pembaruan keamanan pada perangkat organisasi dan laporkan kepada manajemen secara berkala.", + }, + { + text: "- Kegiatan pembaruan keamanan pada perangkat organisasi sudah didokumentasikan seluruhnya dan dilaporkan kepada manajemen secara berkala secara formal - Prosedur dokumentasi dimonitor pelaksanaanya dan direview secara berkala, serta dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Dokumentasikan kegiatan pembaruan keamanan pada perangkat organisasi dan laporkan kepada manajemen secara berkala.", + }, + // 12 + { + text: "Belum dilakukan identifikasi perangkat yang memiliki mekanisme pembaruan melalui perintah jarak jauh", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengidentifikasi perangkat yang memiliki mekanisme pembaruan jarak jauh untuk melakukan pembaruan massal berbagai program perangkat lunak (OS, driver, dan aplikasi) melalui perintah jarak jauh.", + }, + { + text: "Identifikasi perangkat yang memiliki mekanisme pembaruan melalui perintah jarak jauh sebagian kecil sudah diidentifikasi secara informal", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengidentifikasi perangkat yang memiliki mekanisme pembaruan jarak jauh untuk melakukan pembaruan massal berbagai program perangkat lunak (OS, driver, dan aplikasi) melalui perintah jarak jauh.", + }, + { + text: "Identifikasi perangkat yang memiliki mekanisme pembaruan melalui perintah jarak jauh sebagian besar sudah diidentifikasi secara informal", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengidentifikasi perangkat yang memiliki mekanisme pembaruan jarak jauh untuk melakukan pembaruan massal berbagai program perangkat lunak (OS, driver, dan aplikasi) melalui perintah jarak jauh.", + }, + { + text: "Identifikasi perangkat yang memiliki mekanisme pembaruan melalui perintah jarak jauh sudah diidentifikasi seluruhnya secara formal", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengidentifikasi perangkat yang memiliki mekanisme pembaruan jarak jauh untuk melakukan pembaruan massal berbagai program perangkat lunak (OS, driver, dan aplikasi) melalui perintah jarak jauh.", + }, + { + text: "- Identifikasi perangkat yang memiliki mekanisme pembaruan melalui perintah jarak jauh sudah diidentifikasi seluruhnya secara formal - Proses identifikasi perangkat dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengidentifikasi perangkat yang memiliki mekanisme pembaruan jarak jauh untuk melakukan pembaruan massal berbagai program perangkat lunak (OS, driver, dan aplikasi) melalui perintah jarak jauh.", + }, + { + text: "- Identifikasi perangkat yang memiliki mekanisme pembaruan melalui perintah jarak jauh sudah diidentifikasi seluruhnya secara formal, serta dilakukan otomatisasi - Proses identifikasi perangkat dimonitor pelaksanaanya dan direview secara berkala", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengidentifikasi perangkat yang memiliki mekanisme pembaruan jarak jauh untuk melakukan pembaruan massal berbagai program perangkat lunak (OS, driver, dan aplikasi) melalui perintah jarak jauh.", + }, + // 13 + { + text: "Pemeliharaan perangkat dan server yang disetujui dari jarak jauh belum dilakukan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeliharaan perangkat dan server yang telah disetujui dari jarak jauh dan mencatat setiap log masuknya, sehingga akses yang tidak sah dapat dicegah.", + }, + { + text: "Sebagian kecil perangkat dan server yang disetujui dari jarak jauh sudah dilakukan pemeliharaan namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeliharaan perangkat dan server yang telah disetujui dari jarak jauh dan mencatat setiap log masuknya, sehingga akses yang tidak sah dapat dicegah.", + }, + { + text: "Sebagian besar perangkat dan server yang disetujui dari jarak jauh sudah dilakukan pemeliharaan namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeliharaan perangkat dan server yang telah disetujui dari jarak jauh dan mencatat setiap log masuknya, sehingga akses yang tidak sah dapat dicegah.", + }, + { + text: "Seluruh perangkat dan server yang disetujui dari jarak jauh sudah dilakukan pemeliharaan dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeliharaan perangkat dan server yang telah disetujui dari jarak jauh dan mencatat setiap log masuknya, sehingga akses yang tidak sah dapat dicegah.", + }, + { + text: "- Seluruh perangkat dan server yang disetujui dari jarak jauh sudah dilakukan pemeliharaan dan sudah diformalkan - Prosedur pemeliharaan perangkat dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeliharaan perangkat dan server yang telah disetujui dari jarak jauh dan mencatat setiap log masuknya, sehingga akses yang tidak sah dapat dicegah.", + }, + { + text: "- Seluruh perangkat dan server yang disetujui dari jarak jauh sudah dilakukan pemeliharaan dan sudah diformalkan, dan dilakukan otomatisasi - Prosedur pemeliharaan perangkat dimonitor pelaksanaanya dan direview secara berkala", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeliharaan perangkat dan server yang telah disetujui dari jarak jauh dan mencatat setiap log masuknya, sehingga akses yang tidak sah dapat dicegah.", + }, + // 14 + { + text: "Organisasi belum memiliki prosedur pemantauan lingkungan fisik aset IIV", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan lingkungan fisik aset IIV dipantau secara tepat melalui pengaturan, perekaman, dan pemantauan akses fisik terhadap aset IIV. (misalnya cctv, akses kontrol, sensor, dll).", + }, + { + text: "Prosedur pemantauan lingkungan fisik aset IIV sudah diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan lingkungan fisik aset IIV dipantau secara tepat melalui pengaturan, perekaman, dan pemantauan akses fisik terhadap aset IIV. (misalnya cctv, akses kontrol, sensor, dll).", + }, + { + text: "Prosedur pemantauan lingkungan fisik aset IIV sudah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan lingkungan fisik aset IIV dipantau secara tepat melalui pengaturan, perekaman, dan pemantauan akses fisik terhadap aset IIV. (misalnya cctv, akses kontrol, sensor, dll).", + }, + { + text: "Prosedur pemantauan lingkungan fisik aset IIV sudah diformalkan dan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan lingkungan fisik aset IIV dipantau secara tepat melalui pengaturan, perekaman, dan pemantauan akses fisik terhadap aset IIV. (misalnya cctv, akses kontrol, sensor, dll).", + }, + { + text: "- Prosedur pemantauan lingkungan fisik aset IIV sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan lingkungan fisik aset IIV dipantau secara tepat melalui pengaturan, perekaman, dan pemantauan akses fisik terhadap aset IIV. (misalnya cctv, akses kontrol, sensor, dll).", + }, + { + text: "- Prosedur pemantauan lingkungan fisik aset IIV sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala serta dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan lingkungan fisik aset IIV dipantau secara tepat melalui pengaturan, perekaman, dan pemantauan akses fisik terhadap aset IIV. (misalnya cctv, akses kontrol, sensor, dll).", + }, + // 15 + { + text: "Organisasi belum memiliki prosedur peninjauan, analisis dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa melakukan peninjauan, analisis, dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu dari respons insiden keamanan dan hasil pemantauan, pengukuran, dan evaluasi ancaman internal dan eksternal.", + }, + { + text: "Prosedur peninjauan, analisis dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu sudah diterapkan pada sebagian kecil aspek namun belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa melakukan peninjauan, analisis, dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu dari respons insiden keamanan dan hasil pemantauan, pengukuran, dan evaluasi ancaman internal dan eksternal.", + }, + { + text: "Prosedur peninjauan, analisis dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu sudah diterapkan pada sebagian besar aspek namun belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa melakukan peninjauan, analisis, dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu dari respons insiden keamanan dan hasil pemantauan, pengukuran, dan evaluasi ancaman internal dan eksternal.", + }, + { + text: "Prosedur peninjauan, analisis dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu sudah diformalkan dan diterapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa melakukan peninjauan, analisis, dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu dari respons insiden keamanan dan hasil pemantauan, pengukuran, dan evaluasi ancaman internal dan eksternal.", + }, + { + text: "- Prosedur peninjauan, analisis dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa melakukan peninjauan, analisis, dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu dari respons insiden keamanan dan hasil pemantauan, pengukuran, dan evaluasi ancaman internal dan eksternal.", + }, + { + text: "- Prosedur peninjauan, analisis dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu sudah diformalkan dan diterapkan pada seluruh aspek - Prosedur tersebut dimonitor pelaksanaanya dan direview secara berkala serta dilakukan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV senantiasa melakukan peninjauan, analisis, dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu dari respons insiden keamanan dan hasil pemantauan, pengukuran, dan evaluasi ancaman internal dan eksternal.", + }, + + // 16 > KATEGORI 2.3 + { + text: "- Organisasi belum meminta organisasi lain untuk menyetujui persyaratan keamanan untuk perlindungan informasi yang ditukarkan. - Organisasi belum memiliki kebijakan internal atau prosedur teknis mengenai pertukaran informasi yang perlu dilindungi dengan organisasi lain. - Organisasi belum memiliki konsep atau format dokumen persetujuan persyaratan keamanan yang disahkan pimpinan untuk melindungi informasi yang ditukarkan dengan organisasi lain.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Jika Penyelenggara IIV bertukar informasi yang perlu dilindungi dengan organisasi lain, maka Penyelenggara IIV perlu meminta organisasi lain tersebut untuk menyetujui persyaratan keamanan untuk perlindungan informasi tersebut.", + }, + { + text: "- Organisasi sudah meminta organisasi lain untuk menyetujui sebagian kecil aspek persyaratan keamanan untuk perlindungan informasi yang ditukarkan. - Organisasi telah memiliki konsep atau rancangan kebijakan internal atau prosedur teknis mengenai pertukaran informasi yang perlu dilindungi dengan organisasi lain. - Organisasi telah memiliki konsep atau format dokumen persetujuan persyaratan keamanan yang belum disahkan pimpinan untuk melindungi informasi yang ditukarkan dengan organisasi lain.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Jika Penyelenggara IIV bertukar informasi yang perlu dilindungi dengan organisasi lain, maka Penyelenggara IIV perlu meminta organisasi lain tersebut untuk menyetujui persyaratan keamanan untuk perlindungan informasi tersebut.", + }, + { + text: "- Organisasi sudah meminta organisasi lain untuk menyetujui sebagian besar aspek persyaratan keamanan untuk perlindungan informasi yang ditukarkan. - Organisasi telah memiliki konsep atau rancangan kebijakan internal atau prosedur teknis mengenai pertukaran informasi yang perlu dilindungi dengan organisasi lain. - Organisasi telah memiliki konsep atau format dokumen persetujuan persyaratan keamanan yang belum disahkan pimpinan untuk melindungi informasi yang ditukarkan dengan organisasi lain.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Jika Penyelenggara IIV bertukar informasi yang perlu dilindungi dengan organisasi lain, maka Penyelenggara IIV perlu meminta organisasi lain tersebut untuk menyetujui persyaratan keamanan untuk perlindungan informasi tersebut.", + }, + { + text: "- Organisasi sudah meminta organisasi lain untuk menyetujui seluruh aspek persyaratan keamanan untuk perlindungan informasi yang ditukarkan. - Organisasi telah memiliki kebijakan internal atau prosedur teknis yang diformalkan mengenai pertukaran informasi yang perlu dilindungi dengan organisasi lain. - Organisasi telah memiliki format dokumen persetujuan persyaratan keamanan yang disahkan pimpinan untuk melindungi informasi yang ditukarkan dengan organisasi lain.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Jika Penyelenggara IIV bertukar informasi yang perlu dilindungi dengan organisasi lain, maka Penyelenggara IIV perlu meminta organisasi lain tersebut untuk menyetujui persyaratan keamanan untuk perlindungan informasi tersebut.", + }, + { + text: "- Organisasi sudah meminta organisasi lain untuk menyetujui seluruh aspek persyaratan keamanan untuk perlindungan informasi yang ditukarkan. - Organisasi telah memiliki kebijakan internal atau prosedur teknis yang diformalkan, dimonitoring, dan direview secara berkala mengenai pertukaran informasi yang perlu dilindungi dengan organisasi lain. - Organisasi telah memiliki format dokumen persetujuan persyaratan keamanan yang disahkan pimpinan, dimonitoring, dan direview secara berkala untuk melindungi informasi yang ditukarkan dengan organisasi lain.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Jika Penyelenggara IIV bertukar informasi yang perlu dilindungi dengan organisasi lain, maka Penyelenggara IIV perlu meminta organisasi lain tersebut untuk menyetujui persyaratan keamanan untuk perlindungan informasi tersebut.", + }, + { + text: "- Organisasi sudah meminta organisasi lain untuk menyetujui seluruh aspek persyaratan keamanan untuk perlindungan informasi yang ditukarkan. - Organisasi telah memiliki kebijakan internal atau prosedur teknis yang diformalkan, dimonitoring, direview secara berkala dan dilakukan perbaikan mengenai pertukaran informasi yang perlu dilindungi dengan organisasi lain. - Organisasi telah memiliki format dokumen persetujuan persyaratan keamanan yang disahkan pimpinan, dimonitoring, direview dan dilakukan perbaikansecara berkala untuk melindungi informasi yang ditukarkan dengan organisasi lain.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Jika Penyelenggara IIV bertukar informasi yang perlu dilindungi dengan organisasi lain, maka Penyelenggara IIV perlu meminta organisasi lain tersebut untuk menyetujui persyaratan keamanan untuk perlindungan informasi tersebut.", + }, + // 17 + { + text: "- Organisasi belum memiliki kebijakan internal maupun prosedur enkripsi informasi dengan tingkat kekuatan keamanan sesuai dengan standar keamanan; - Organisasi belum menerapkan enkripsi pada informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengenkripsi informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan.", + }, + { + text: "- Organisasi sudah memiliki konsep kebijakan internal maupun prosedur enkripsi informasi dengan tingkat kekuatan keamanan sesuai dengan standar keamanan - Organisasi sudah menerapkan enkripsi pada sebagian kecil informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengenkripsi informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan.", + }, + { + text: "- Organisasi sudah memiliki konsep kebijakan internal maupun prosedur enkripsi informasi dengan tingkat kekuatan keamanan sesuai dengan standar keamanan - Organisasi sudah menerapkan enkripsi pada sebagian besar informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengenkripsi informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan.", + }, + { + text: "- Organisasi sudah memiliki kebijakan internal maupun prosedur enkripsi informasi yang disahkan pimpinan dengan tingkat kekuatan keamanan sesuai dengan standar keamanan - Organisasi sudah menerapkan enkripsi pada seluruh informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengenkripsi informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan.", + }, + { + text: "- Organisasi sudah memiliki kebijakan internal maupun prosedur enkripsi informasi yang disahkan pimpinan, dimonitoring, dan direview secara berkala dengan tingkat kekuatan keamanan sesuai dengan standar keamanan - Organisasi sudah menerapkan enkripsi pada seluruh informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan, dimonitoring penerapannya, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengenkripsi informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan.", + }, + { + text: "- Organisasi sudah memiliki kebijakan internal maupun prosedur enkripsi informasi yang disahkan pimpinan, dimonitoring, direview secara berkala, dan dilakukan perbaikan sesuai dengan standar keamanan - Organisasi sudah menerapkan enkripsi pada seluruh informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan, dimonitoring penerapannya, direview secara berkala, dan dilakukan perbaikan secara otomatis", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengenkripsi informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan.", + }, + // 18 + { + text: "- Organisasi belum memiliki kebijakan internal maupun prosedur penerapan enkripsi saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV - Organisasi belum menerapkan enkripsi pada saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan saluran komunikasi menerapkan enkripsi saat berkomunikasi antara perangkat IIV dan server IIV.", + }, + { + text: "- Organisasi sudah memiliki konsep kebijakan internal maupun prosedur penerapan enkripsi saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV - Organisasi telah menerapkan enkripsi pada sebagian kecil saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan saluran komunikasi menerapkan enkripsi saat berkomunikasi antara perangkat IIV dan server IIV.", + }, + { + text: "- Organisasi sudah memiliki konsep kebijakan internal maupun prosedur penerapan enkripsi saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV - Organisasi telah menerapkan enkripsi pada sebagian besar saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan saluran komunikasi menerapkan enkripsi saat berkomunikasi antara perangkat IIV dan server IIV.", + }, + { + text: "- Organisasi sudah memiliki kebijakan internal maupun prosedur penerapan enkripsi saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV yang disahkan pimpinan - Organisasi telah menerapkan enkripsi pada seluruh saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan saluran komunikasi menerapkan enkripsi saat berkomunikasi antara perangkat IIV dan server IIV.", + }, + { + text: "- Organisasi sudah memiliki kebijakan internal maupun prosedur penerapan enkripsi saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV yang disahkan pimpinan, dimonitoring penerapannya, dan direview secara berkala - Organisasi telah menerapkan enkripsi pada seluruh saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV, dimonitoring penerapannya, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan saluran komunikasi menerapkan enkripsi saat berkomunikasi antara perangkat IIV dan server IIV.", + }, + { + text: "- Organisasi sudah memiliki kebijakan internal maupun prosedur penerapan enkripsi saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV yang disahkan pimpinan, dimonitoring penerapannya, direview secara berkala, dan dilakukan perbaikan. - Organisasi telah menerapkan enkripsi pada seluruh saluran komunikasi saat berkomunikasi antara perangkat IIV dan server IIV, dimonitoring penerapannya, direview secara berkala dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan saluran komunikasi menerapkan enkripsi saat berkomunikasi antara perangkat IIV dan server IIV.", + }, + // 19 + { + text: "Organisasi belum memiliki prosedur pengamanan kunci enkripsi sepanjang siklus hidup kunci enkripsi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan kunci enkripsi dikontrol dengan aman sepanjang siklus hidup kunci enkripsi tersebut untuk memastikan pengoperasian yang benar dan data yang ditransmisikan, diterima, dan disimpan dengan aman.", + }, + { + text: "Organisasi telah menyusun prosedur dan menerapkan sebagian kecil pengamanan kunci enkripsi sepanjang siklus hidup kunci enkripsi", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan kunci enkripsi dikontrol dengan aman sepanjang siklus hidup kunci enkripsi tersebut untuk memastikan pengoperasian yang benar dan data yang ditransmisikan, diterima, dan disimpan dengan aman.", + }, + { + text: "Organisasi telah menyusun prosedur dan menerapkan sebagian besar pengamanan kunci enkripsi sepanjang siklus hidup kunci enkripsi", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan kunci enkripsi dikontrol dengan aman sepanjang siklus hidup kunci enkripsi tersebut untuk memastikan pengoperasian yang benar dan data yang ditransmisikan, diterima, dan disimpan dengan aman.", + }, + { + text: "Organisasi telah mengesahkan prosedur dan menerapkan secara menyeluruh pengamanan kunci enkripsi sepanjang siklus hidup kunci enkripsi", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan kunci enkripsi dikontrol dengan aman sepanjang siklus hidup kunci enkripsi tersebut untuk memastikan pengoperasian yang benar dan data yang ditransmisikan, diterima, dan disimpan dengan aman.", + }, + { + text: "Organisasi telah mengesahkan prosedur, menerapkan secara menyeluruh, memonitoring dan mereview secara berkala pengamanan kunci enkripsi sepanjang siklus hidup kunci enkripsi", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan kunci enkripsi dikontrol dengan aman sepanjang siklus hidup kunci enkripsi tersebut untuk memastikan pengoperasian yang benar dan data yang ditransmisikan, diterima, dan disimpan dengan aman.", + }, + { + text: "Organisasi telah mengesahkan prosedur, menerapkan secara menyeluruh, memonitoring, mereview secara berkala dan melakukan perbaikan mengenai pengamanan kunci enkripsi sepanjang siklus hidup kunci enkripsi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan kunci enkripsi dikontrol dengan aman sepanjang siklus hidup kunci enkripsi tersebut untuk memastikan pengoperasian yang benar dan data yang ditransmisikan, diterima, dan disimpan dengan aman.", + }, + // 20 + { + text: "- Organisasi belum merencanakan atau membuat strategi penyediaan sumber daya untuk setiap sistem IIV yang dimiliki. - Organisasi belum menyediakan sumber daya yang cukup untuk setiap sistem IIV.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyediakan sumber daya yang cukup untuk setiap sistem IIV (misalnya ruang penyimpanan, sumber daya, dan sistem redundan),", + }, + { + text: "- Organisasi telah menyusun strategi penyediaan sumber daya untuk setiap sistem IIV namun belum diformalkan. - Organisasi sudah menyediakan sumber daya yang cukup untuk sebagian kecil aspek pada sistem IIV.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyediakan sumber daya yang cukup untuk setiap sistem IIV (misalnya ruang penyimpanan, sumber daya, dan sistem redundan),", + }, + { + text: "- Organisasi telah menyusun strategi penyediaan sumber daya untuk setiap sistem IIV namun belum diformalkan. - Organisasi sudah menyediakan sumber daya yang cukup untuk sebagian besar aspek pada sistem IIV.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyediakan sumber daya yang cukup untuk setiap sistem IIV (misalnya ruang penyimpanan, sumber daya, dan sistem redundan),", + }, + { + text: "- Organisasi telah menyusun strategi penyediaan sumber daya untuk setiap sistem IIV yang disahkan pimpinan. - Organisasi sudah menyediakan sumber daya yang cukup untuk seluruh aspek pada sistem IIV.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyediakan sumber daya yang cukup untuk setiap sistem IIV (misalnya ruang penyimpanan, sumber daya, dan sistem redundan),", + }, + { + text: "- Organisasi telah menyusun strategi penyediaan sumber daya untuk setiap sistem IIV yang disahkan pimpinan, dimonitoring, dan direview secara berkala. - Organisasi sudah menyediakan sumber daya yang cukup untuk seluruh aspek pada sistem IIV, dimonitoring dan direview penerapannya secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyediakan sumber daya yang cukup untuk setiap sistem IIV (misalnya ruang penyimpanan, sumber daya, dan sistem redundan),", + }, + { + text: "- Organisasi telah menyusun strategi penyediaan sumber daya untuk setiap sistem IIV yang disahkan pimpinan, dimonitoring, direview secara berkala, dan dilakukan perbaikan. - Organisasi sudah menyediakan sumber daya yang cukup untuk seluruh aspek pada sistem IIV, dimonitoring, direview penerapannya secara berkala dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV menyediakan sumber daya yang cukup untuk setiap sistem IIV (misalnya ruang penyimpanan, sumber daya, dan sistem redundan),", + }, + // 21 + { + text: "Organisasi belum memiliki dan menerapkan prosedur pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan dilakukannya pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data.", + }, + { + text: "Organisasi telah menyusun dan menerapkan sebagian kecil aspek prosedur pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data pada sebagian aspek.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan dilakukannya pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data.", + }, + { + text: "Organisasi telah menyusun dan menerapkan sebagian besar aspek prosedur pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan dilakukannya pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data.", + }, + { + text: "Organisasi telah mengesahkan dan menerapkan seluruh aspek prosedur pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan dilakukannya pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data.", + }, + { + text: "Organisasi telah mengesahkan dan menerapkan seluruh aspek prosedur pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data, dimonitoring, dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan dilakukannya pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data.", + }, + { + text: "Organisasi telah mengesahkan dan menerapkan seluruh aspek prosedur pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data, dimonitoring, direview secara berkala dan dilakukan perbaikan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penyelenggara IIV memastikan dilakukannya pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data.", + }, + // 22 + { + text: "- Organisasi belum memiliki prosedur pengadaan untuk pemilihan pernagkat dan server yang dilengkapi dengan perangkat anti-tampering. - Organisasi belum menerapkan pemilihan pengadaan perangkat dan server dengan perangkat anti-tampering.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menangani informasi yang akan dilindungi atau pengadaan perangkat yang memiliki fungsi penting bagi organisasi, pilih perangkat dan server yang dilengkapi dengan perangkat anti-tampering.", + }, + { + text: "- Organisasi sudah menyusun prosedur pengadaan untuk pemilihan perangkat dan server yang dilengkapi dengan perangkat anti-tampering. - Organisasi telah menerapkan sebagian kecil pemilihan pengadaan perangkat dan server dengan perangkat anti-tampering.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menangani informasi yang akan dilindungi atau pengadaan perangkat yang memiliki fungsi penting bagi organisasi, pilih perangkat dan server yang dilengkapi dengan perangkat anti-tampering.", + }, + { + text: "- Organisasi sudah menyusun prosedur pengadaan untuk pemilihan perangkat dan server yang dilengkapi dengan perangkat anti-tampering. - Organisasi telah menerapkan sebagian besar pemilihan pengadaan perangkat dan server dengan perangkat anti-tampering.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menangani informasi yang akan dilindungi atau pengadaan perangkat yang memiliki fungsi penting bagi organisasi, pilih perangkat dan server yang dilengkapi dengan perangkat anti-tampering.", + }, + { + text: "- Organisasi sudah mengesahkan prosedur pengadaan untuk pemilihan perangkat dan server yang dilengkapi dengan perangkat anti-tampering. - Organisasi telah menerapkan seluruh pemilihan pengadaan perangkat dan server dengan perangkat anti-tampering.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menangani informasi yang akan dilindungi atau pengadaan perangkat yang memiliki fungsi penting bagi organisasi, pilih perangkat dan server yang dilengkapi dengan perangkat anti-tampering.", + }, + { + text: "- Organisasi sudah mengesahkan prosedur pengadaan untuk pemilihan perangkat dan server yang dilengkapi dengan perangkat anti-tampering, dimonitoring dan direview secara berkala. - Organisasi telah menerapkan seluruh pemilihan pengadaan perangkat dan server dengan perangkat anti-tampering, dimonitoring dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menangani informasi yang akan dilindungi atau pengadaan perangkat yang memiliki fungsi penting bagi organisasi, pilih perangkat dan server yang dilengkapi dengan perangkat anti-tampering.", + }, + { + text: "- Organisasi sudah mengesahkan prosedur pengadaan untuk pemilihan perangkat dan server yang dilengkapi dengan perangkat anti-tampering, dimonitoring, direview secara berkala, dan dilakukan perbaikan. - Organisasi telah menerapkan seluruh pemilihan pengadaan perangkat dan server dengan perangkat anti-tampering, dimonitoring dan direview secara berkala, dan dilakukan perbaikan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat menangani informasi yang akan dilindungi atau pengadaan perangkat yang memiliki fungsi penting bagi organisasi, pilih perangkat dan server yang dilengkapi dengan perangkat anti-tampering.", + }, + // 23 + { + text: "- Organisasi belum memiliki dan menerapkan prosedur melindungi jalur komunikasi dengan kontrol keamanan yang tepat.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa jalur komunikasi yang digunakan untuk mengirim informasi telah dilindungi dengan kontrol keamanan yang tepat.", + }, + { + text: "- Organisasi telah menyusun dan menerapkan sebagian kecil prosedur melindungi jalur komunikasi dengan kontrol keamanan yang tepat.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa jalur komunikasi yang digunakan untuk mengirim informasi telah dilindungi dengan kontrol keamanan yang tepat.", + }, + { + text: "- Organisasi telah menyusun dan menerapkan sebagian besar prosedur melindungi jalur komunikasi dengan kontrol keamanan yang tepat.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa jalur komunikasi yang digunakan untuk mengirim informasi telah dilindungi dengan kontrol keamanan yang tepat.", + }, + { + text: "- Organisasi telah mengesahkan dan menerapkan seluruh prosedur melindungi jalur komunikasi dengan kontrol keamanan yang tepat.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa jalur komunikasi yang digunakan untuk mengirim informasi telah dilindungi dengan kontrol keamanan yang tepat.", + }, + { + text: "- Organisasi telah mengesahkan dan menerapkan seluruh prosedur melindungi jalur komunikasi dengan kontrol keamanan yang tepat, dimonitoring dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa jalur komunikasi yang digunakan untuk mengirim informasi telah dilindungi dengan kontrol keamanan yang tepat.", + }, + { + text: "- Organisasi telah mengesahkan dan menerapkan seluruh prosedur melindungi jalur komunikasi dengan kontrol keamanan yang tepat, dimonitoring dan direview secara berkala serta dilakukan perbaikan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan bahwa jalur komunikasi yang digunakan untuk mengirim informasi telah dilindungi dengan kontrol keamanan yang tepat.", + }, + // 24 + { + text: "- Organisasi belum memiliki dan menerapkan prosedur pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan organisasi.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan oleh organisasi, untuk mencegah pemasangan perangkat lunak yang tidak sah.", + }, + { + text: "- Organisasi telah menyusun dan menerapkan sebagian kecil prosedur pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan organisasi.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan oleh organisasi, untuk mencegah pemasangan perangkat lunak yang tidak sah.", + }, + { + text: "- Organisasi telah menyusun dan menerapkan sebagian besar prosedur pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan organisasi.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan oleh organisasi, untuk mencegah pemasangan perangkat lunak yang tidak sah.", + }, + { + text: "- Organisasi telah mengesahkan dan menerapkan seluruh prosedur pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan organisasi.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan oleh organisasi, untuk mencegah pemasangan perangkat lunak yang tidak sah.", + }, + { + text: "- Organisasi telah mengesahkan dan menerapkan seluruh prosedur pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan organisasi, dimonitring dan direview secara berkala.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan oleh organisasi, untuk mencegah pemasangan perangkat lunak yang tidak sah.", + }, + { + text: "- Organisasi telah mengesahkan dan menerapkan seluruh prosedur pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan organisasi, dimonitring dan direview secara berkala serta dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan oleh organisasi, untuk mencegah pemasangan perangkat lunak yang tidak sah.", + }, + // 25 + { + text: "Organisasi belum memiliki mekanisme dan menerapkan pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan.", + }, + { + text: "Organisasi telah menyusun mekanisme dan menerapkan sebagian kecil pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan.", + }, + { + text: "Organisasi telah menyusun dan menerapkan sebagian besar mekanisme pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan.", + }, + { + text: "Organisasi mengesahkan dan menerapkan secara menyeluruh mekanisme pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan.", + }, + { + text: "Organisasi telah mengesahkan, menerapkan secara menyeluruh, memonitoring dan mereview secara berkala mekanisme pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan serta", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan.", + }, + { + text: "Organisasi telah mengesahkan, menerapkan secara menyeluruh, memonitoring dan mereview secara berkala serta melakukan perbaikan mekanisme pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan serta", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Melakukan pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan.", + }, + // 26 + { + text: "Organisasi belum memperkenalkan mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperkenalkan mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras.", + }, + { + text: "Organisasi telah menyusun mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras dan memperkenalkan pada sebagian kecil stakeholder", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperkenalkan mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras.", + }, + { + text: "Organisasi telah menyusun mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras dan memperkenalkan kepada sebagian besar stakeholder", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperkenalkan mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras.", + }, + { + text: "Organisasi telah mengesahkan mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras dan memperkenalkan kepada seluruh stakeholder", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperkenalkan mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras.", + }, + { + text: "Organisasi telah mengesahkan, memonitoring dan mereview secara berkala mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras dan memperkenalkan kepada seluruh stakeholder", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperkenalkan mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras.", + }, + { + text: "Organisasi telah mengesahkan, memonitoring, mereview secara berkala dan melakukan perbaikan mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras dan memperkenalkan kepada seluruh stakeholder", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memperkenalkan mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras.", + }, + // 27 + { + text: "Organisasi belum memiliki prosedur dan mengonfirmasikan keaslian dan kepemilikan sertifikat keamanan pada perangkat keras dan perangkat lunak", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasikan bahwa perangkat keras dan perangkat lunak adalah produk asli dan memiliki sertifikat keamanan.", + }, + { + text: "Organisasi telah menyusun prosedur dan mengonfirmasikan keaslian dan kepemilikan sertifikat keamanan pada perangkat keras dan perangkat lunak kepada sebagian kecil stakeholder", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasikan bahwa perangkat keras dan perangkat lunak adalah produk asli dan memiliki sertifikat keamanan.", + }, + { + text: "Organisasi telah menyusun prosedur dan mengonfirmasikan keaslian dan kepemilikan sertifikat keamanan pada perangkat keras dan perangkat lunak kepada sebagian besar stakeholder", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasikan bahwa perangkat keras dan perangkat lunak adalah produk asli dan memiliki sertifikat keamanan.", + }, + { + text: "Organisasi telah mengesahkan prosedur dan mengonfirmasikan keaslian dan kepemilikan sertifikat keamanan pada perangkat keras dan perangkat lunak kepada seluruh stakeholder", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasikan bahwa perangkat keras dan perangkat lunak adalah produk asli dan memiliki sertifikat keamanan.", + }, + { + text: "Organisasi telah mengesahkan prosedur dan mengonfirmasikan keaslian dan kepemilikan sertifikat keamanan pada perangkat keras dan perangkat lunak kepada seluruh stakeholder, monitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasikan bahwa perangkat keras dan perangkat lunak adalah produk asli dan memiliki sertifikat keamanan.", + }, + { + text: "Organisasi telah mengesahkan prosedur dan mengonfirmasikan keaslian dan kepemilikan sertifikat keamanan pada perangkat keras dan perangkat lunak kepada seluruh stakeholder, dimonitoring, direview secara berkala dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Konfirmasikan bahwa perangkat keras dan perangkat lunak adalah produk asli dan memiliki sertifikat keamanan.", + }, + // 28 + { + text: "Organisasi belum memiliki dan menerapkan prosedur pemeliharaan, pembaruan dan pengelolaan informasi pada siklus hidup data", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pelihara, perbarui, dan kelola informasi seperti asal data, dan riwayat pemrosesan data, di seluruh siklus hidup data.", + }, + { + text: "Organisasi telah merancang dan menerapkan sebagian kecil prosedur pemeliharaan, pembaruan dan pengelolaan informasi pada siklus hidup data", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pelihara, perbarui, dan kelola informasi seperti asal data, dan riwayat pemrosesan data, di seluruh siklus hidup data.", + }, + { + text: "Organisasi telah merancang dan menerapkan sebagian besar prosedur pemeliharaan, pembaruan dan pengelolaan informasi pada siklus hidup data", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pelihara, perbarui, dan kelola informasi seperti asal data, dan riwayat pemrosesan data, di seluruh siklus hidup data.", + }, + { + text: "Organisasi telah mengesahkan dan menerapkan secara menyeluruh prosedur pemeliharaan, pembaruan dan pengelolaan informasi pada siklus hidup data", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pelihara, perbarui, dan kelola informasi seperti asal data, dan riwayat pemrosesan data, di seluruh siklus hidup data.", + }, + { + text: "Organisasi telah mengesahkan, menerapkan secara menyeluruh, memonitoring dan mereview secara berkala prosedur pemeliharaan, pembaruan dan pengelolaan informasi pada siklus hidup data", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pelihara, perbarui, dan kelola informasi seperti asal data, dan riwayat pemrosesan data, di seluruh siklus hidup data.", + }, + { + text: "Organisasi telah mengesahkan, menerapkan secara menyeluruh, memonitoring dan mereview secara berkala serta melakukan perbaikan prosedur pemeliharaan, pembaruan dan pengelolaan informasi pada siklus hidup data", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pelihara, perbarui, dan kelola informasi seperti asal data, dan riwayat pemrosesan data, di seluruh siklus hidup data.", + }, + // 29 + { + text: "- Organisasi belum memiliki prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem.", + }, + { + text: "- Organisasi telah menyusun prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem dan menerapkan pada sebagian kecil aspek", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem.", + }, + { + text: "- Organisasi telah menyusun prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem dan menerapkan pada sebagian besar aspek", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem.", + }, + { + text: "- Organisasi telah mengesahkan prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem dan menerapkan pada seluruh aspek", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem.", + }, + { + text: "- Organisasi telah mengesahkan prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem dan menerapkan pada seluruh aspek, dimonitoring dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem.", + }, + { + text: "- Organisasi telah mengesahkan prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem dan menerapkan pada seluruh aspek, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem.", + }, + // 30 + { + text: "Organisasi belum memiliki kebijakan dan menerapkan penghapusan data yang disimpan dari perangkat dan server yang akan dimusnahkan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat akan menghapuskan perangkat dan aset informasi, prosedur penghapusan data yang disimpan dari perangkat dan server serta informasi penting lainya (misalnya, kunci pribadi dan sertifikat digital), atau dibuat agar tidak dapat dibaca.", + }, + { + text: "Organisasi telah menyusun kebijakan dan menerapkan sebagian kecil mekanisme penghapusan data yang disimpan dari perangkat dan server yang akan dimusnahkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat akan menghapuskan perangkat dan aset informasi, prosedur penghapusan data yang disimpan dari perangkat dan server serta informasi penting lainya (misalnya, kunci pribadi dan sertifikat digital), atau dibuat agar tidak dapat dibaca.", + }, + { + text: "Organisasi telah menyusun kebijakan dan menerapkan sebagian besar mekanisme penghapusan data yang disimpan dari perangkat dan server yang akan dimusnahkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat akan menghapuskan perangkat dan aset informasi, prosedur penghapusan data yang disimpan dari perangkat dan server serta informasi penting lainya (misalnya, kunci pribadi dan sertifikat digital), atau dibuat agar tidak dapat dibaca.", + }, + { + text: "Organisasi telah mengesahkan kebijakan dan menerapkan secara menyeluruh mekanisme penghapusan data yang disimpan dari perangkat dan server yang akan dimusnahkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat akan menghapuskan perangkat dan aset informasi, prosedur penghapusan data yang disimpan dari perangkat dan server serta informasi penting lainya (misalnya, kunci pribadi dan sertifikat digital), atau dibuat agar tidak dapat dibaca.", + }, + { + text: "Organisasi telah mengesahkan kebijakan, menerapkan secara menyeluruh mekanisme, memonitoring dan mereview secara berkala penghapusan data yang disimpan dari perangkat dan server yang akan dimusnahkan", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat akan menghapuskan perangkat dan aset informasi, prosedur penghapusan data yang disimpan dari perangkat dan server serta informasi penting lainya (misalnya, kunci pribadi dan sertifikat digital), atau dibuat agar tidak dapat dibaca.", + }, + { + text: "Organisasi telah mengesahkan kebijakan, menerapkan secara menyeluruh mekanisme, memonitoring dan mereview secara berkala serta melakukan perbaikan penghapusan data yang disimpan dari perangkat dan server yang akan dimusnahkan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Saat akan menghapuskan perangkat dan aset informasi, prosedur penghapusan data yang disimpan dari perangkat dan server serta informasi penting lainya (misalnya, kunci pribadi dan sertifikat digital), atau dibuat agar tidak dapat dibaca.", + }, + + // 31 > KATEGORI 2.4 + { + text: "Prosedur untuk keamanan pada saat pengaturan sistem belum ada", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses, dsb)", + }, + { + text: "Organisasi telah menyediakan prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses) dan diterapkan oleh sebagian kecil organisasi tapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses, dsb)", + }, + { + text: "Organisasi telah menyediakan prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses) dan diterapkan oleh sebagian besar organisasi tapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses, dsb)", + }, + { + text: "Organisasi telah menyediakan prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses), diterapkan oleh seluruh organisasi dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses, dsb)", + }, + { + text: "Organisasi telah menyediakan prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses), diterapkan oleh seluruh organisasi, sudah diformalkan, dimonitoring dan direviu berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses, dsb)", + }, + { + text: "Organisasi telah menyediakan prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses), diterapkan oleh seluruh organisasi, sudah diformalkan, dimonitoring dan direviu berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses, dsb)", + }, + // 32 + { + text: "Organisasi belum memiliki prosedur untuk melakukan perubahan pengaturan pada perangkat", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkanya prosedur untuk melakukan perubahan pengaturan pada perangkat.", + }, + { + text: "Organisasi telah menyediakan prosedur untuk melakukan perubahan pengaturan pada perangkat dan diterapkan oleh sebagian kecil organisasi tetapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkanya prosedur untuk melakukan perubahan pengaturan pada perangkat.", + }, + { + text: "Organisasi telah menyediakan prosedur untuk melakukan perubahan pengaturan pada perangkat dan diterapkan oleh sebagian besar organisasi tetapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkanya prosedur untuk melakukan perubahan pengaturan pada perangkat.", + }, + { + text: "Organisasi telah menyediakan prosedur untuk melakukan perubahan pengaturan pada perangkat dan diterapkan oleh seluruh organisasi dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkanya prosedur untuk melakukan perubahan pengaturan pada perangkat.", + }, + { + text: "Organisasi telah menyediakan prosedur untuk melakukan perubahan pengaturan pada perangkat dan diterapkan oleh seluruh organisasi, sudah diformalkan, dimonitoring dan direviu berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkanya prosedur untuk melakukan perubahan pengaturan pada perangkat.", + }, + { + text: "Organisasi telah menyediakan prosedur untuk melakukan perubahan pengaturan pada perangkat dan diterapkan oleh seluruh organisasi, sudah diformalkan, dimonitoring, direviu berkala dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya dan diterapkanya prosedur untuk melakukan perubahan pengaturan pada perangkat.", + }, + // 33 + { + text: "Organisasi belum memiliki prosedur pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur Pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server.", + }, + { + text: "Organisasi telah menyediakan rancangan prosedur pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server dan diterapkan oleh sebagian kecil organisasi tetapi belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur Pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server.", + }, + { + text: "Organisasi telah menyediakan rancangan prosedur pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server dan diterapkan oleh sebagian besar organisasi tetapi belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur Pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server.", + }, + { + text: "Organisasi telah menyediakan rancangan prosedur pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server dan diterapkan oleh seluruh organisasi dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur Pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server.", + }, + { + text: "Organisasi telah menyediakan rancangan prosedur pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server dan diterapkan oleh seluruh organisasi, sudah diformalkan, dimonitoring, dan direviu secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur Pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server.", + }, + { + text: "Organisasi telah menyediakan rancangan prosedur pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server dan diterapkan oleh seluruh organisasi, sudah diformalkan, dimonitoring, direviu secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur Pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server.", + }, + // 34 + { + text: "Organisasi belum mengembangkan dan mengimplementasikan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengembangkan dan mengimplementasikan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi.", + }, + { + text: "Organisasi sudah mengembangkan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi. diimplementasikan pada sebagian kecil organisasi dan belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengembangkan dan mengimplementasikan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi.", + }, + { + text: "Organisasi sudah mengembangkan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi. diimplementasikan pada sebagian besar organisasi dan belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengembangkan dan mengimplementasikan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi.", + }, + { + text: "Organisasi sudah mengembangkan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi. diimplementasikan pada seluruh organisasi dan sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengembangkan dan mengimplementasikan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi.", + }, + { + text: "Organisasi sudah mengembangkan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi. diimplementasikan pada seluruh organisasi, sudah diformalkan, dimonitoring dan direviu secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengembangkan dan mengimplementasikan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi.", + }, + { + text: "Organisasi sudah mengembangkan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi. diimplementasikan pada seluruh organisasi, sudah diformalkan, dimonitoring, direviu secara berkala, dan diperbaiki", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi mengembangkan dan mengimplementasikan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi.", + }, + // 35 + { + text: "Organisasi belum memiliki pemisahan antara lingkungan pengembangan dan lingkungan produksi. Tidak ada upaya yang dilakukan untuk mengimplementasikan pemisahan tersebut.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penggunaan lingkungan pengembangan sistem yang berbeda dari lingkungan produksi yang meliputi pemisahan terhadap media penyimpanan, jaringan, lingkungan kerja, dsb.", + }, + { + text: "Organisasi telah mulai menerapkan pemisahan antara lingkungan pengembangan dan lingkungan produksi pada sebagian kecil aspek, seperti media penyimpanan atau jaringan, tetapi belum ada formalitas atau kebijakan yang mendukung pemisahan ini secara keseluruhan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penggunaan lingkungan pengembangan sistem yang berbeda dari lingkungan produksi yang meliputi pemisahan terhadap media penyimpanan, jaringan, lingkungan kerja, dsb.", + }, + { + text: "Pemisahan antara lingkungan pengembangan dan lingkungan produksi telah diterapkan pada sebagian besar aspek, termasuk media penyimpanan, jaringan, dan lingkungan kerja, tetapi belum ada kebijakan atau dokumentasi formal yang mengatur atau mendukung praktik ini.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penggunaan lingkungan pengembangan sistem yang berbeda dari lingkungan produksi yang meliputi pemisahan terhadap media penyimpanan, jaringan, lingkungan kerja, dsb.", + }, + { + text: "Organisasi telah menerapkan pemisahan lingkungan pengembangan dan produksi pada seluruh aspek, dan langkah ini sudah didukung oleh kebijakan, prosedur, dan dokumentasi formal. Pemisahan ini menjadi bagian dari standar operasi organisasi.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penggunaan lingkungan pengembangan sistem yang berbeda dari lingkungan produksi yang meliputi pemisahan terhadap media penyimpanan, jaringan, lingkungan kerja, dsb.", + }, + { + text: "Selain pemisahan yang sudah diterapkan dan diformalkan, organisasi juga melakukan monitoring dan review secara berkala untuk memastikan bahwa pemisahan antara lingkungan pengembangan dan produksi tetap efektif dan sesuai dengan kebijakan yang ada.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penggunaan lingkungan pengembangan sistem yang berbeda dari lingkungan produksi yang meliputi pemisahan terhadap media penyimpanan, jaringan, lingkungan kerja, dsb.", + }, + { + text: "Organisasi tidak hanya menerapkan dan memformalkan pemisahan antara lingkungan pengembangan dan produksi, tetapi juga melakukan monitoring, review berkala, serta perbaikan terus-menerus. Jika memungkinkan, otomatisasi teknis diterapkan untuk meningkatkan efisiensi dan keamanan dalam memisahkan kedua lingkungan tersebut.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Penggunaan lingkungan pengembangan sistem yang berbeda dari lingkungan produksi yang meliputi pemisahan terhadap media penyimpanan, jaringan, lingkungan kerja, dsb.", + }, + // 36 + { + text: "Organisasi belum memiliki prosedur pengembangan perangkat lunak yang memperhatikan aspek keamanan pada setiap tahapan siklus hidup pengembangannya. Tidak ada upaya yang dilakukan untuk mengintegrasikan keamanan dalam proses pengembangan.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pengembangan perangkat lunak yang selalu memperhatikan aspek keamanan pada setiap tahapan siklus hidup pengembangannya.", + }, + { + text: "Aspek keamanan mulai diperhatikan dalam sebagian kecil tahapan siklus hidup pengembangan perangkat lunak, tetapi belum ada prosedur formal yang mendokumentasikan atau mendukung penerapan tersebut. Keamanan belum menjadi bagian yang sistematis dalam proses pengembangan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pengembangan perangkat lunak yang selalu memperhatikan aspek keamanan pada setiap tahapan siklus hidup pengembangannya.", + }, + { + text: "Keamanan sudah diperhatikan dalam sebagian besar tahapan siklus hidup pengembangan perangkat lunak, namun prosedur yang mengatur penerapan keamanan tersebut belum diformalkan. Semua aspek pengembangan sudah mencakup pertimbangan keamanan, tetapi tanpa dokumentasi resmi atau kebijakan yang mengaturnya.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pengembangan perangkat lunak yang selalu memperhatikan aspek keamanan pada setiap tahapan siklus hidup pengembangannya.", + }, + { + text: "Prosedur pengembangan perangkat lunak yang memperhatikan aspek keamanan sudah diterapkan di seluruh tahapan siklus hidup pengembangan dan telah diformalkan. Dokumentasi, kebijakan, dan prosedur yang mengatur keamanan dalam pengembangan perangkat lunak sudah tersedia dan diterapkan secara konsisten.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pengembangan perangkat lunak yang selalu memperhatikan aspek keamanan pada setiap tahapan siklus hidup pengembangannya.", + }, + { + text: "Selain penerapan dan formalisasi, prosedur pengembangan perangkat lunak yang memperhatikan aspek keamanan juga dimonitoring dan direview secara berkala untuk memastikan efektivitasnya. Organisasi secara aktif mengevaluasi apakah prosedur tersebut masih relevan dan efisien seiring dengan perkembangan teknologi dan ancaman keamanan.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pengembangan perangkat lunak yang selalu memperhatikan aspek keamanan pada setiap tahapan siklus hidup pengembangannya.", + }, + { + text: "Organisasi tidak hanya menerapkan, memformalkan, memonitoring, dan mereview prosedur pengembangan perangkat lunak yang memperhatikan keamanan, tetapi juga secara aktif melakukan perbaikan berkelanjutan berdasarkan hasil review. Jika memungkinkan, otomatisasi proses keamanan dalam siklus hidup pengembangan diterapkan untuk meningkatkan efisiensi dan respons terhadap ancaman keamanan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Tersedianya dan diterapkannya prosedur pengembangan perangkat lunak yang selalu memperhatikan aspek keamanan pada setiap tahapan siklus hidup pengembangannya.", + }, + { + text: "Organisasi belum melakukan pemblokiran secara fisik dan logis port jaringan, USB, dan dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Minimalkan fungsi perangkat dan server dengan memblokir secara fisik dan logis port jaringan, USB, dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server.", + }, + { + text: "Organisasi sudah menerapkan pemblokiran secara fisik dan logis pada sebagian kecil port jaringan, USB, dan dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server, tetapi kebijakan/prosedur penerapan pemblokiran tersebut belum diformalkan.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Minimalkan fungsi perangkat dan server dengan memblokir secara fisik dan logis port jaringan, USB, dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server.", + }, + { + text: "Organisasi sudah menerapkan pemblokiran secara fisik dan logis pada sebagian besar port jaringan, USB, dan dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server, tetapi kebijakan/prosedur penerapan pemblokiran tersebut belum diformalkan.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Minimalkan fungsi perangkat dan server dengan memblokir secara fisik dan logis port jaringan, USB, dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server.", + }, + { + text: "Organisasi sudah menerapkan pemblokiran secara fisik dan logis pada seluruh port jaringan, USB, dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server, dan kebijakan/prosedur penerapan pemblokiran tersebut sudah diformalkan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Minimalkan fungsi perangkat dan server dengan memblokir secara fisik dan logis port jaringan, USB, dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server.", + }, + { + text: "Organisasi sudah menerapkan pemblokiran secara fisik dan logis pada seluruh port jaringan, USB, dan dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server, dan kebijakan/prosedur penerapan pemblokiran tersebut sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Minimalkan fungsi perangkat dan server dengan memblokir secara fisik dan logis port jaringan, USB, dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server.", + }, + { + text: "Organisasi sudah menerapkan pemblokiran secara fisik dan logis pada seluruh port jaringan, USB, dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server, dan kebijakan/prosedur penerapan pemblokiran tersebut sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan atau otomatisasi pemblokiran", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Minimalkan fungsi perangkat dan server dengan memblokir secara fisik dan logis port jaringan, USB, dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server.", + }, + { + text: "Organisasi belum memastikan Removable Media terlindungi dan pembatasan penggunaannya", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan Removable Media terlindungi dan penggunaannya terbatas sesuai dengan kebijakan.", + }, + { + text: "Organisasi sudah menerapkan pelindungan dan pembatasan penggunaan pada sebagian kecil Removable Media tetapi kebijakannya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan Removable Media terlindungi dan penggunaannya terbatas sesuai dengan kebijakan.", + }, + { + text: "Organisasi sudah menerapkan pelindungan dan pembatasan penggunaan pada sebagian besar Removable Media tetapi kebijakannya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan Removable Media terlindungi dan penggunaannya terbatas sesuai dengan kebijakan.", + }, + { + text: "Organisasi sudah menerapkan pelindungan dan pembatasan penggunaan pada seluruh Removable Media sesuai dengan kebijakan yang sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan Removable Media terlindungi dan penggunaannya terbatas sesuai dengan kebijakan.", + }, + { + text: "Organisasi sudah menerapkan pelindungan dan pembatasan penggunaan pada seluruh Removable Media sesuai dengan kebijakan yang sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan Removable Media terlindungi dan penggunaannya terbatas sesuai dengan kebijakan.", + }, + { + text: "Organisasi sudah menerapkan pelindungan dan pembatasan penggunaan pada seluruh Removable Media sesuai dengan kebijakan yang sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan Removable Media terlindungi dan penggunaannya terbatas sesuai dengan kebijakan.", + }, + { + text: "Organisasi belum menentukan dan menerapkan segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menerapkan segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet. (misalnya dibagi menjadi lingkungan pengembangan, pengujian, lingkungan produksi, dan lingkungan lain dalam organisasi)", + }, + { + text: "Organisasi sudah menentukan dan menerapkan sebagian kecil segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet, tetapi kebijakan/prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menerapkan segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet. (misalnya dibagi menjadi lingkungan pengembangan, pengujian, lingkungan produksi, dan lingkungan lain dalam organisasi)", + }, + { + text: "Organisasi sudah menentukan dan menerapkan sebagian besar segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet, tetapi kebijakan/prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menerapkan segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet. (misalnya dibagi menjadi lingkungan pengembangan, pengujian, lingkungan produksi, dan lingkungan lain dalam organisasi)", + }, + { + text: "Organisasi sudah menentukan dan menerapkan seluruh segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet, dan kebijakan/prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menerapkan segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet. (misalnya dibagi menjadi lingkungan pengembangan, pengujian, lingkungan produksi, dan lingkungan lain dalam organisasi)", + }, + { + text: "Organisasi sudah menentukan dan menerapkan seluruh segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet, dan kebijakan/prosedurnya sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menerapkan segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet. (misalnya dibagi menjadi lingkungan pengembangan, pengujian, lingkungan produksi, dan lingkungan lain dalam organisasi)", + }, + { + text: "Organisasi sudah menentukan dan menerapkan seluruh segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet, dan kebijakan/prosedurnya sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menentukan dan menerapkan segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet. (misalnya dibagi menjadi lingkungan pengembangan, pengujian, lingkungan produksi, dan lingkungan lain dalam organisasi)", + }, + { + text: "Organisasi belum melakukan isolasi terhadap jaringan yang menghubungkan dengan perangkat penting", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi juga melakukan isolasi terhadap jaringan yang menghubungkan dengan perangkat penting, misalnya perangkat SCADA atau ICS (Industrial Control System).", + }, + { + text: "Organisasi sudah melakukan isolasi terhadap sebagian kecil jaringan yang menghubungkan dengan perangkat penting, tetapi kebijakan/prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi juga melakukan isolasi terhadap jaringan yang menghubungkan dengan perangkat penting, misalnya perangkat SCADA atau ICS (Industrial Control System).", + }, + { + text: "Organisasi sudah melakukan isolasi terhadap sebagian besar jaringan yang menghubungkan dengan perangkat penting, tetapi kebijakan/prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi juga melakukan isolasi terhadap jaringan yang menghubungkan dengan perangkat penting, misalnya perangkat SCADA atau ICS (Industrial Control System).", + }, + { + text: "Organisasi sudah melakukan isolasi terhadap seluruh jaringan yang menghubungkan dengan perangkat penting, dan kebijakan/prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi juga melakukan isolasi terhadap jaringan yang menghubungkan dengan perangkat penting, misalnya perangkat SCADA atau ICS (Industrial Control System).", + }, + { + text: "Organisasi sudah melakukan isolasi terhadap seluruh jaringan yang menghubungkan dengan perangkat penting, dan kebijakan/prosedurnya sudah diformalkan, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi juga melakukan isolasi terhadap jaringan yang menghubungkan dengan perangkat penting, misalnya perangkat SCADA atau ICS (Industrial Control System).", + }, + { + text: "Organisasi sudah melakukan isolasi terhadap seluruh jaringan yang menghubungkan dengan perangkat penting, dan kebijakan/prosedurnya sudah diformalkan, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi juga melakukan isolasi terhadap jaringan yang menghubungkan dengan perangkat penting, misalnya perangkat SCADA atau ICS (Industrial Control System).", + }, + { + text: "Organisasi belum memastikan perangkat jaringan mampu menerapkan mekanisme yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan perangkat jaringan mampu menerapkan mekanisme (misalnya, fail safe, load balancer, atau hot swap) yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan.", + }, + { + text: "Organisasi telah memastikan sebagian kecil perangkat jaringan mampu menerapkan mekanisme yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan, tetapi kebijakan/prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan perangkat jaringan mampu menerapkan mekanisme (misalnya, fail safe, load balancer, atau hot swap) yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan.", + }, + { + text: "Organisasi telah memastikan sebagian besar perangkat jaringan mampu menerapkan mekanisme yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan, tetapi kebijakan/prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan perangkat jaringan mampu menerapkan mekanisme (misalnya, fail safe, load balancer, atau hot swap) yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan.", + }, + { + text: "Organisasi telah memastikan seluruh perangkat jaringan mampu menerapkan mekanisme yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan, dan kebijakan/prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan perangkat jaringan mampu menerapkan mekanisme (misalnya, fail safe, load balancer, atau hot swap) yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan.", + }, + { + text: "Organisasi telah memastikan seluruh perangkat jaringan mampu menerapkan mekanisme yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan, dan kebijakan/prosedurnya sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan perangkat jaringan mampu menerapkan mekanisme (misalnya, fail safe, load balancer, atau hot swap) yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan.", + }, + { + text: "Organisasi telah memastikan seluruh perangkat jaringan mampu menerapkan mekanisme yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan, dan kebijakan/prosedurnya sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan atau otomatisasi", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan perangkat jaringan mampu menerapkan mekanisme (misalnya, fail safe, load balancer, atau hot swap) yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan.", + }, + { + text: "Organisasi belum memastikan fungsi keamanan pada perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan fungsi keamanan pada perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan.", + }, + { + text: "Organisasi telah memastikan fungsi keamanan pada sebagian kecil perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan, tetapi kebijakan/prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan fungsi keamanan pada perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan.", + }, + { + text: "Organisasi telah memastikan fungsi keamanan pada sebagian besar perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan, tetapi kebijakan/prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan fungsi keamanan pada perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan.", + }, + { + text: "Organisasi telah memastikan fungsi keamanan pada seluruh perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan, dan kebijakan/prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan fungsi keamanan pada perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan.", + }, + { + text: "Organisasi telah memastikan fungsi keamanan pada seluruh perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan, dan kebijakan/prosedurnya sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan fungsi keamanan pada perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan.", + }, + { + text: "Organisasi telah memastikan fungsi keamanan pada seluruh perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan, dan kebijakan/prosedurnya sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memastikan fungsi keamanan pada perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan.", + }, + { + text: "Organisasi belum memiliki prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai.", + }, + { + text: "Organisasi telah menjalankan sebagian kecil penyediaan prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai, tetapi prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai.", + }, + { + text: "Organisasi telah menjalankan sebagian besar prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai, tetapi prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai, dan prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai, dan prosedurnya sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai, dan prosedurnya sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "tersedianya prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai.", + }, + { + text: "Organisasi belum memiliki prosedur dan teknologi pencegahan malware untuk melindungi ketersediaan data berupa perekaman pencadangan data organisasi secara berkala.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk melindungi ketersediaan data terhadap serangan malware, data organisasi harus di-rekam cadang secara berkala.", + }, + { + text: "Organisasi telah menjalankan sebagian kecil prosedur dan teknologi pencegahan malware untuk melindungi ketersediaan data berupa perekaman pencadangan data organisasi secara berkala, tetapi prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk melindungi ketersediaan data terhadap serangan malware, data organisasi harus di-rekam cadang secara berkala.", + }, + { + text: "Organisasi telah menjalankan sebagian besar prosedur dan teknologi pencegahan malware untuk melindungi ketersediaan data berupa perekaman pencadangan data organisasi secara berkala, tetapi prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk melindungi ketersediaan data terhadap serangan malware, data organisasi harus di-rekam cadang secara berkala.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware untuk melindungi ketersediaan data berupa perekaman pencadangan data organisasi secara berkala, dan prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk melindungi ketersediaan data terhadap serangan malware, data organisasi harus di-rekam cadang secara berkala.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware untuk melindungi ketersediaan data berupa perekaman pencadangan data organisasi secara berkala, dan prosedurnya sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk melindungi ketersediaan data terhadap serangan malware, data organisasi harus di-rekam cadang secara berkala.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware untuk melindungi ketersediaan data berupa perekaman pencadangan data organisasi secara berkala, dan prosedurnya sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Untuk melindungi ketersediaan data terhadap serangan malware, data organisasi harus di-rekam cadang secara berkala.", + }, + { + text: "Organisasi belum memiliki prosedur dan teknologi pencegahan malware berupa pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya untuk mencegah masuknya virus dari luar ke dalam perangkat pengolah informasi dan jaringan komunikasi data milik Organisasi.", + }, + { + text: "Organisasi telah menjalankan sebagian kecil prosedur dan teknologi pencegahan malware berupa pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya, tetapi prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya untuk mencegah masuknya virus dari luar ke dalam perangkat pengolah informasi dan jaringan komunikasi data milik Organisasi.", + }, + { + text: "Organisasi telah menjalankan sebagian besar prosedur dan teknologi pencegahan malware berupa pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya, tetapi prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya untuk mencegah masuknya virus dari luar ke dalam perangkat pengolah informasi dan jaringan komunikasi data milik Organisasi.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware berupa pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya, dan prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya untuk mencegah masuknya virus dari luar ke dalam perangkat pengolah informasi dan jaringan komunikasi data milik Organisasi.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware berupa pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya, dan prosedurnya sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya untuk mencegah masuknya virus dari luar ke dalam perangkat pengolah informasi dan jaringan komunikasi data milik Organisasi.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware berupa pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya, dan prosedurnya sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya untuk mencegah masuknya virus dari luar ke dalam perangkat pengolah informasi dan jaringan komunikasi data milik Organisasi.", + }, + { + text: "Organisasi belum memiliki prosedur dan teknologi pencegahan malware berupa pengunduhan dan instalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengunduh dan menginstalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system.", + }, + { + text: "Organisasi telah menjalankan sebagian kecil prosedur dan teknologi pencegahan malware berupa pengunduhan dan instalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system, tetapi prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengunduh dan menginstalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system.", + }, + { + text: "Organisasi telah menjalankan sebagian besar prosedur dan teknologi pencegahan malware berupa pengunduhan dan instalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system, tetapi prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengunduh dan menginstalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware berupa pengunduhan dan instalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system, dan prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengunduh dan menginstalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware berupa pengunduhan dan instalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system, dan prosedurnya sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengunduh dan menginstalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware berupa pengunduhan dan instalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system, dan prosedurnya sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Mengunduh dan menginstalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system.", + }, + { + text: "Organisasi belum memiliki prosedur dan teknologi pencegahan malware berupa meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi.", + }, + { + text: "Organisasi telah menjalankan sebagian kecil prosedur dan teknologi pencegahan malware berupa meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi, tetapi prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi.", + }, + { + text: "Organisasi telah menjalankan sebagian besar prosedur dan teknologi pencegahan malware berupa meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi, tetapi prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware berupa meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi, dan prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware berupa meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi, dan prosedurnya sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dan teknologi pencegahan malware berupa meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi, dan prosedurnya sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi.", + }, + // 2.5.6 + { + text: "Organisasi belum menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar.", + }, + { + text: "Organisasi telah menjalankan sebagian kecil prosedur dalam menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar, tetapi prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar.", + }, + { + text: "Organisasi telah menjalankan sebagian besar prosedur dalam menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar, tetapi prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dalam menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar, dan prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dalam menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar, dan prosedurnya sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar.", + }, + { + text: "Organisasi telah menjalankan secara penuh prosedur dalam menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar, dan prosedurnya sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar.", + }, + + // 2.5.7 + { + text: "Organisasi belum melakukan berbagi informasi mengenai efektivitas teknologi perlindungan data", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya.", + }, + { + text: "Organisasi telah menjalankan berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya namun belum secara menyeluruh (masih sebagian kecil) baik terhadap teknologi maupun terhadap mitra, tetapi prosedurnya belum diformalkan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya.", + }, + { + text: "Organisasi telah menjalankan berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan sebagian besar mitra yang tepat dan terpercaya baik terhadap teknologi maupun terhadap mitra, tetapi prosedurnya belum diformalkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya.", + }, + { + text: "Organisasi telah menjalankan berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya secara menyeluruh baik terhadap teknologi maupun terhadap mitra, dan prosedurnya sudah diformalkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya.", + }, + { + text: "Organisasi telah menjalankan berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya secara menyeluruh baik terhadap teknologi maupun terhadap mitra, dan prosedurnya sudah diformalkan, dimonitoring, dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya.", + }, + { + text: "Organisasi telah menjalankan berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya secara menyeluruh baik terhadap teknologi maupun terhadap mitra, dan prosedurnya sudah diformalkan, dimonitoring, direview secara berkala, dan dilakukan perbaikan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya.", + }, + { + text: "- Organisasi belum memiliki prosedur terorganisir dalam melakukan pemeriksaan verifikasi latar belakang calon personel yang akan bergabung dengan organisasi - Organisasi belum menjalankan pemeriksaan latar belakang calon personel yang akan bergabung dengan organisasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pemeriksaan verifikasi latar belakang terhadap semua calon personel harus dilakukan sebelum bergabung dengan Penyelenggara IIV dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir dalam melakukan pemeriksaan verifikasi latar belakang calon personel yang akan bergabung dengan organisasi - Organisasi sudah melakukan pemeriksaan/verifikasi latar belakang kepada sebagian kecil calon personel yang akan bergabung dengan organisasi", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pemeriksaan verifikasi latar belakang terhadap semua calon personel harus dilakukan sebelum bergabung dengan Penyelenggara IIV dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir dalam melakukan pemeriksaan verifikasi latar belakang calon personel yang akan bergabung dengan organisasi - Organisasi telah menjalankan kegiatan pemeriksaan verifikasi latar belakang terhadap sebagian besar calon personel yang akan bergabung dengan organisasi dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan namun belum secara menyeluruh", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pemeriksaan verifikasi latar belakang terhadap semua calon personel harus dilakukan sebelum bergabung dengan Penyelenggara IIV dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir dalam melakukan pemeriksaan verifikasi latar belakang calon personel yang akan bergabung dengan organisasi - Organisasi telah menjalankan kegiatan kegiatan pemeriksaan verifikasi latar belakang terhadap semua calon personel yang akan bergabung dengan organisasi dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan secara menyeluruh", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pemeriksaan verifikasi latar belakang terhadap semua calon personel harus dilakukan sebelum bergabung dengan Penyelenggara IIV dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir dalam melakukan pemeriksaan verifikasi latar belakang calon personel yang akan bergabung dengan organisasi - Organisasi telah menjalankan kegiatan kegiatan pemeriksaan verifikasi latar belakang terhadap semua calon personel yang akan bergabung dengan organisasi dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan secara menyeluruh serta melakukan pemantauan terhadap personel yang bergabung dengan organisasi", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pemeriksaan verifikasi latar belakang terhadap semua calon personel harus dilakukan sebelum bergabung dengan Penyelenggara IIV dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir dalam melakukan pemeriksaan verifikasi latar belakang calon personel yang akan bergabung dengan organisasi - Organisasi telah menjalankan kegiatan kegiatan pemeriksaan verifikasi latar belakang terhadap semua calon personel yang akan bergabung dengan organisasi dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan secara menyeluruh serta melakukan pemantauan secara berkala dan dilakukan perbaikan berkelanjutan terhadap pelaksanaan kegiatan verifikasi latar belakang personel", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Pemeriksaan verifikasi latar belakang terhadap semua calon personel harus dilakukan sebelum bergabung dengan Penyelenggara IIV dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan.", + }, + { + text: "- Organisasi belum memiliki prosedur terorganisir tentang penerapan perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi - Organisasi belum mewajibkan adanya perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kontrak kerja harus menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir yang mewajibkan adanya perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi - Organisasi sedang merencanakan membuat perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kontrak kerja harus menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir yang mewajibkan adanya perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi - Organisasi telah mewajibkan adanya perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi namun belum secara menyeluruh ", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kontrak kerja harus menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir yang mewajibkan adanya perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi - Organisasi telah mewajibkan dan menjalankan perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi secara menyeluruh", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kontrak kerja harus menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir yang mewajibkan adanya perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi - Organisasi telah mewajibkan dan menjalankan perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi secara menyeluruh dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kontrak kerja harus menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir yang mewajibkan adanya perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informas - Organisasi telah mewajibkan dan menjalankan perjanjian kontrak kerja yang menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi secara menyeluruh dan dilakukan review secara berkala terhadap perjanjian kerja yang sudah ada serta diperbaiki secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kontrak kerja harus menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi.", + }, + { + text: "- Organisasi belum memiliki prosedur terorganisir untuk melaksanakan pendislipan terhadap personel dan pihak berkepentingan lainnya - Organisasi belum merencanakan proses pendisiplinan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Proses pendisiplinan harus diformalkan dan dikomunikasikan untuk mengambil tindakan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir untuk melaksanakan pendislipan terhadap personel dan pihak berkepentingan lainnya - Organisasi telah merencanakan proses pendisiplinan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Proses pendisiplinan harus diformalkan dan dikomunikasikan untuk mengambil tindakan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir untuk melaksanakan pendislipan terhadap personel dan pihak berkepentingan lainnya - Organisasi telah menjalankan proses pendisiplinan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi namun belum secara menyeluruh", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Proses pendisiplinan harus diformalkan dan dikomunikasikan untuk mengambil tindakan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir untuk melaksanakan pendislipan terhadap personel dan pihak berkepentingan lainnya - Organisasi telah menjalankan proses pendisiplinan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi secara menyeluruh", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Proses pendisiplinan harus diformalkan dan dikomunikasikan untuk mengambil tindakan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir untuk melaksanakan pendislipan terhadap personel dan pihak berkepentingan lainnya - Organisasi telah menjalankan proses pendisiplinan, diformalkan dan dikomunikasikan untuk mengambil tindakan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi dan proses pendisiplinan tersebut direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Proses pendisiplinan harus diformalkan dan dikomunikasikan untuk mengambil tindakan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur terorganisir untuk melaksanakan pendislipan terhadap personel dan pihak berkepentingan lainnya - Organisasi telah menjalankan proses pendisiplinan, diformalkan dan dikomunikasikan untuk mengambil tindakan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi dan proses pendisiplinan tersebut direview secara berkala serta diperbaiki secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Proses pendisiplinan harus diformalkan dan dikomunikasikan untuk mengambil tindakan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi.", + }, + { + text: "Organisasi belum merencakan untuk menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi.", + }, + { + text: "Organisasi sedang merencakan untuk menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi.", + }, + { + text: "Organisasi telah menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi namun belum secara menyeluruh.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi.", + }, + { + text: "Organisasi telah menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi secara menyeluruh.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi.", + }, + { + text: "Organisasi telah menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi secara menyeluruh dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi.", + }, + { + text: "Organisasi telah menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi dan direview secara berkala serta diperbaiki secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi.", + }, + { + text: "Organisasi belum merencakan untuk membuat perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya.", + }, + { + text: "Organisasi telah merencakan untuk membuat perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya.", + }, + { + text: "Organisasi menjalankan perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya namun belum secara menyeluruh", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya.", + }, + { + text: "Organisasi menjalankan perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya secara menyeluruh", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya.", + }, + { + text: "Organisasi menjalankan perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya secara menyeluruh dan direview secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya.", + }, + { + text: "Organisasi menjalankan perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya secara menyeluruh dan direview secara berkala", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya.", + }, + { + text: "Belum memiliki prosedur mengenai langkah-langkah keamanan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Langkah-langkah keamanan harus diterapkan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi.", + }, + { + text: "Telah membentuk tim penyusunan prosedur langkah-langkah keamanan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi ", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Langkah-langkah keamanan harus diterapkan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi.", + }, + { + text: "Telah menyusun prosedur langkah-langkah keamanan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi sudah dijadwalkan untuk diterapkan namun belum disahkan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Langkah-langkah keamanan harus diterapkan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi.", + }, + { + text: "Telah mengesahkan prosedur langkah-langkah keamanan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi sudah diterapkan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Langkah-langkah keamanan harus diterapkan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi.", + }, + { + text: "Telah mewajibakan seluruh pegawai untuk menjalankan prosedur langkah-langkah keamanan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi ", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Langkah-langkah keamanan harus diterapkan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi.", + }, + { + text: "Telah mewajibkan seluruh pegawai untuk menjalankan prosedur langkah-langkah keamanan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi serta terdapat mekanisme untuk menampung saran/masukan pegawai terhadap prosedur tersebut guna perbaikan berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Langkah-langkah keamanan harus diterapkan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi.", + }, + { + text: "Belum terdapat mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyediakan mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + }, + { + text: "Telah membentuk tim untuk merumuskan mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyediakan mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + }, + { + text: "Telah menyusun mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyediakan mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + }, + { + text: "Telah mengesahkan mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyediakan mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + }, + { + text: "Telah mengesahkan dan mereviu mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat namun belum dilakukan tindakan perbaikan.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyediakan mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + }, + { + text: "Telah mengesahkan dan mereviu mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat dan dilakukan tindakan perbaikan berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi harus menyediakan mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + }, + { + text: "- Organisasi belum memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi - Organisasi belum mengidentifikasi jenis-jenis pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi - Organisasi belum memiliki perencanaan yang tepat dalam pelaksanaan program pelatihan dan pendidikan kaitannya dengan insiden keamanan", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi dan mengelola catatan sehingga mereka dapat memenuhi peran dan tanggung jawab yang ditugaskan untuk mencegah dan mengatasi terjadinya dan tingkat keparahan insiden keamanan.", + }, + { + text: "- Organisasi sudah memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi - Organisasi sudah mengidentifikasi jenis-jenis pelatihan dan pendidikan namun belum kepada semua individu dalam organisasi  - Organisasi belum memiliki perencanaan yang tepat dalam pelaksanaan program pelatihan dan pendidikan kaitannya dengan insiden keamanan", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi dan mengelola catatan sehingga mereka dapat memenuhi peran dan tanggung jawab yang ditugaskan untuk mencegah dan mengatasi terjadinya dan tingkat keparahan insiden keamanan.", + }, + { + text: "- Organisasi sudah memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi - Organisasi sudah melakukan identifikasi jenis-jenis pelatihan dan pendidikan yang dibutuhkan semua individu dalam organisasi untuk mencegah dan mengatasi terjadinya dan tingkat keparahan insiden keamanan - Secara sah terdapat dokumen identifikasi jenis-jenis pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi - Organisasi sudah memiliki perencanaan yang tepat dalam pelaksanaan program pelatihan dan pendidikan kaitannya dengan insiden keamanan", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi dan mengelola catatan sehingga mereka dapat memenuhi peran dan tanggung jawab yang ditugaskan untuk mencegah dan mengatasi terjadinya dan tingkat keparahan insiden keamanan.", + }, + { + text: "- Organisasi sudah memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi - Secara sah terdapat dokumen identifikasi jenis-jenis pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi - Organisasi mengelola catatan kebutuhan pelatihan berdasarkan hasil identifikasi pelatihan dan pendidikan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi dan mengelola catatan sehingga mereka dapat memenuhi peran dan tanggung jawab yang ditugaskan untuk mencegah dan mengatasi terjadinya dan tingkat keparahan insiden keamanan.", + }, + { + text: "- Organisasi sudah memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi - Organisasi sudah melakukan identifikasi jenis-jenis pelatihan dan pendidikan yang dibutuhkan oleh semua individu dalam organisasi untuk mencegah dan mengatasi terjadinya dan tingkat keparahan insiden keamanan - Organisasi telah memiliki dan mengelola dokumen identifikasi jenis-jenis pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi serta terdapat klasifikasi personil dengan kriteria yang sesuai dengan jenis-jenis pelatihan yang dibutuhkan. - Seluruh pegawai sesuai klasifikasi kriteria mengikuti pelatihan dan pendidikan yang tepat dan mengelola catatan sehingga mereka dapat memenuhi peran dan tanggung jawab yang ditugaskan untuk mencegah dan mengatasi terjadinya dan tingkat keparahan insiden keamanan.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi dan mengelola catatan sehingga mereka dapat memenuhi peran dan tanggung jawab yang ditugaskan untuk mencegah dan mengatasi terjadinya dan tingkat keparahan insiden keamanan.", + }, + { + text: "- Organisasi sudah memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi - Organisasi telah memiliki dan mengelola dokumen identifikasi jenis-jenis pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi serta terdapat klasifikasi personil dengan kriteria yang sesuai dengan jenis-jenis pelatihan yang dibutuhkan. - Seluruh pegawai sesuai klasifikasi kriteria mengikuti pelatihan dan pendidikan yang tepat - Organisasi mengelola catatan pelatihan dan pendidikan yang sudah diberikan serta terdapat mekanisme evaluasi kemampuan SDM pasca pendidikan dan pelatihan sebagai bahan perbaikan berkelanjutan organisasi.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi dan mengelola catatan sehingga mereka dapat memenuhi peran dan tanggung jawab yang ditugaskan untuk mencegah dan mengatasi terjadinya dan tingkat keparahan insiden keamanan.", + }, + { + text: "- Organisasi belum memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi dan pihak terkait lainnya - Belum mengidentifikasi pelatihan dan pendidikan keamanan yang sesuai kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan. - Belum ada mekanisme pengelolaan catatan pelatihan dan pendidikan keamanan tersebut.", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan keamanan yang sesuai kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan. Kemudian, kelola catatan pelatihan dan pendidikan keamanan tersebut.", + }, + { + text: "- Organisasi sudah memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi dan pihak terkait lainnya - Organisasi sudah mengidentifikasi jenis-jenis pelatihan dan pendidikan namun belum kepada semua individu dalam organisasi dan pihak terkait - Telah membentuk tim untuk mengidentifikasi pelatihan dan pendidikan keamanan yang sesuai kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan. - Telah membentuk tim penyusunan mekanisme pengelolaan catatan pelatihan dan pendidikan keamanan tersebut.", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan keamanan yang sesuai kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan. Kemudian, kelola catatan pelatihan dan pendidikan keamanan tersebut.", + }, + { + text: "- Organisasi sudah memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi dan pihak terkait lainnya - Organisasi sudah mengidentifikasi jenis-jenis pelatihan dan pendidikan namun belum kepada semua individu dalam organisasi dan pihak terkait - Secara sah terdapat dokumen identifikasi pelatihan dan pendidikan keamanan yang sesuai kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan. - Secara sah telah terdapat dokumen mekanisme pengelolaan catatan pelatihan dan pendidikan keamanan tersebut.", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan keamanan yang sesuai kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan. Kemudian, kelola catatan pelatihan dan pendidikan keamanan tersebut.", + }, + { + text: "- Organisasi sudah memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi dan pihak terkait lainnya - Organisasi sudah mengidentifikasi jenis-jenis pelatihan dan pendidikan namun belum kepada semua individu dalam organisasi dan pihak terkait - 50% anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan sudah mendapatkan pendidikan dan pelatihan keamanan, - Pengelolaan catatan pelatihan dan pendidikan keamanan tersebut belum dilaksanakan namun telah direncanakan untuk dilaksanakan.", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan keamanan yang sesuai kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan. Kemudian, kelola catatan pelatihan dan pendidikan keamanan tersebut.", + }, + { + text: "- Organisasi sudah memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi dan pihak terkait lainnya - Organisasi sudah mengidentifikasi jenis-jenis pelatihan dan pendidikan namun belum kepada semua individu dalam organisasi dan pihak terkait - Seluruh anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan sudah mendapatkan pendidikan dan pelatihan keamanan, - Melakukan pengelolaan catatan pelatihan dan pendidikan keamanan tersebut telah dilaksanakan.", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan keamanan yang sesuai kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan. Kemudian, kelola catatan pelatihan dan pendidikan keamanan tersebut.", + }, + { + text: "- Organisasi sudah memiliki prosedur dalam melakukan identifikasi dan pengelolaan data kebutuhan pelatihan yang diberikan kepada semua individu dalam organisasi dan pihak terkait lainnya - Organisasi sudah mengidentifikasi jenis-jenis pelatihan dan pendidikan namun belum kepada semua individu dalam organisasi dan pihak terkait - Seluruh anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan sudah mendapatkan pendidikan dan pelatihan keamanan, dan terdapat mekanisme evaluasi kemampuan SDM pasca pendidikan dan pelatihan sebagai bahan perbaikan berkelanjutan organisasi. - Mekanisme pengelolaan catatan pelatihan dan pendidikan keamanan tersebut telah dilaksanakan dan menjadi dasar evaluasi perbaikan pengelolaan SDM organisasi berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Memberikan pelatihan dan pendidikan keamanan yang sesuai kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan. Kemudian, kelola catatan pelatihan dan pendidikan keamanan tersebut.", + }, + { + text: "- Organisasi belum memiliki prosedur dan mekanisme evaluasi peningkatan pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya - Organisasi belum melaksanakan evaluasi peningkatan isi pelatihan dan pendidikan teentang keamanan yang diberikan kepada anggota organisasi dan pihak trkait lainnya", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meningkatkan isi pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan organisasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur dan mekanisme evaluasi peningkatan pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya - Organisasi telah merencanakan evaluasi peningkatan materi/isi pendidikan dan pelatihan dengan membentuk tim evaluasi", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meningkatkan isi pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan organisasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur dan mekanisme evaluasi peningkatan pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya - Organisasi telah melaksanakan evaluasi terhadap materi/isi pelatihan dan pendidikan tentang keamanan yang diberikan kepaa anggota dan pihak terkait lainnya", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meningkatkan isi pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan organisasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur dan mekanisme evaluasi peningkatan pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya - Organisasi telah melakukan evaluasi secara berkala untuk meningkatkan materi/isi pelatihan dan pendidikan yang diberikan kepada anggota dan pihak terkait lainnya", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meningkatkan isi pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan organisasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur dan mekanisme evaluasi peningkatan pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya - Organisasi telah melakukan evaluasi secara berkala untuk meningkatkan materi/isi pelatihan dan pendidikan yang diberikan kepada anggota dan pihak terkait lainnya dan melaksanakan perbaikan berkelanjutan terhadap hasil evaluasi", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meningkatkan isi pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan organisasi.", + }, + { + text: "- Organisasi sudah memiliki prosedur dan mekanisme evaluasi peningkatan pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya - Organisasi telah melakukan evaluasi secara berkala untuk meningkatkan materi/isi pelatihan dan pendidikan yang diberikan kepada anggota dan pihak terkait lainnya dan melaksanakan perbaikan berkelanjutan terhadap hasil evaluasi secara konsisten dan menyeluruh", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Meningkatkan isi pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan organisasi.", + }, + // 2.6.3 + { + text: "- Organisasi belum memiliki kebijakan terkait kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya sesuai dengan Peta Okupasi Keamanan Siber Nasional Indonesia - Organisasi belum merencanakan atau menyusun kebutuhan kompetensi dan keahlian sumber daya manusia yang melaksanakan tugas dibidang keamanan siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan terkait Kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya dengan menacu kepada Peta Okupasi Keamanan Siber Nasional Indonesia.", + }, + { + text: "- Organisasi sudah memiliki kebijakan terkait kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya sesuai dengan Peta Okupasi Keamanan Siber Nasional Indonesia - Organisasi telah memiliki atau membuat draf dokumen kebutuhan kompetensi sumber daya manusia yang melaksanakan tugas dibidang keamanan siber", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan terkait Kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya dengan menacu kepada Peta Okupasi Keamanan Siber Nasional Indonesia.", + }, + { + text: "- Organisasi sudah memiliki kebijakan terkait kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya sesuai dengan Peta Okupasi Keamanan Siber Nasional Indonesia - Organisasi telah memiliki dan mengesahkan dokumen kompetensi sumber daya manusia bidang keamanan siber namun belum mengacu pada Peta Okupasi Nasional Keamanan Siber", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan terkait Kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya dengan menacu kepada Peta Okupasi Keamanan Siber Nasional Indonesia.", + }, + { + text: "- Organisasi sudah memiliki kebijakan terkait kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya sesuai dengan Peta Okupasi Keamanan Siber Nasional Indonesia - Organisasi telah memiliki dan mengesahkan dokumen kompetensi sumber daya manusia bidang keamanan siber dan telah mengacu pada Peta okupasi Keamanan Siber", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan terkait Kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya dengan menacu kepada Peta Okupasi Keamanan Siber Nasional Indonesia.", + }, + { + text: "- Organisasi sudah memiliki kebijakan terkait kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya sesuai dengan Peta Okupasi Keamanan Siber Nasional Indonesia - Organisasi telah memiliki dan mengesahkan dokumen kompetensi sumber daya manusia bidang keamanan siber yang mengacu pada Peta Okupasi Keamanan Siber dan telah ditinjau secara berkala", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan terkait Kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya dengan menacu kepada Peta Okupasi Keamanan Siber Nasional Indonesia.", + }, + { + text: "- Organisasi sudah memiliki kebijakan terkait kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya sesuai dengan Peta Okupasi Keamanan Siber Nasional Indonesia - Organisasi telah memiliki dan mengesahkan dokumen kebutuhan sumber daya manusia bidang keamanan siber yang mengacu pada Peta Okupasi Keamanan Siber dan diterapkan dan telah ditinjau serta dilakukan perbaikan secara berkelanjutan.", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan terkait Kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya dengan menacu kepada Peta Okupasi Keamanan Siber Nasional Indonesia.", + }, + + { + text: "- Organisasi belum menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop - Organisasi belum merencanakan atau melakukan penghitungan kebutuhan sumber daya manusia bidang keamanan siber", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop.", + }, + { + text: "- Organisasi sudah menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop - Organisasi telah memiliki atau membuat draf dokumen perencanaan peningkatan kapasitas sumber daya manusia bidang keamanan siber namun belum mencakup: 1. Peningkatan kompetensi dan/atau sertifikasi kompetensi 2. Alih Teknologi dan Alih Keahlian 3. Peningkatan budaya kesadaran keamanan informasi", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop.", + }, + { + text: "- Organisasi sudah menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop - Organisasi telah memiliki atau membuat draf dokumen perencanaan peningkatan kapasitas sumber daya manusia bidang keamanan siber yang mencakup paling sedikit melalui : 1. Peningkatan kompetensi dan/atau sertifikasi kompetensi 2. Alih Teknologi dan Alih Keahlian 3. Peningkatan budaya kesadaran keamanan informasi", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop.", + }, + { + text: "- Organisasi sudah menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop - Organisasi telah memiliki dan mengesahkan dokumen peningkatan kapasitas sumber daya manusia bidang keamanan siber yang mencakup paling sedikit melalui : 1. Peningkatan kompetensi dan/atau sertifikasi kompetensi 2. Alih Teknologi dan Alih Keahlian 3. Peningkatan budaya kesadaran keamanan informasi dan telah diimplementasikan", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop.", + }, + { + text: "- Organisasi sudah menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop - Organisasi telah memiliki dan mengesahkan dokumen peningkatan kapasitas sumber daya manusia bidang keamanan siber yang mencakup paling sedikit melalui : 1. Peningkatan kompetensi dan/atau sertifikasi kompetensi 2. Alih Teknologi dan Alih Keahlian 3. Peningkatan budaya kesadaran keamanan informasi yang telah diimplemetasikan dan dilakukan evaluasi terhadap pelaksanaan peningkatan kapasitas", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop.", + }, + { + text: "- Organisasi sudah menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop - Organisasi telah memiliki dan mengesahkan dokumen peningkatan kapasitas sumber daya manusia bidang keamanan siber yang mencakup paling sedikit melalui : 1. Peningkatan kompetensi dan/atau sertifikasi kompetensi 2. Alih Teknologi dan Alih Keahlian 3. Peningkatan budaya kesadaran keamanan informasi yang telah diimplemetasikan, dievaluasi dan diperbaiki secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi perlu menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop.", + }, + + { + text: "Organisasi sektor pemerintah belum memiliki dokumen perencanaan peningkatan kompetensi SDM keamanan siber melalui pendidikan formal dan/atau informal", + score: 0, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi sektor Pemerintah harus meningkatkan keterampilan dan kompetensi teknis dalam keamanan siber serta perilaku personel terhadap keamanan siber secara berkala dan sesuai dengan perkembangan teknologi dan pemanfaatan TIK.", + }, + { + text: "Organisasi sektor pemerintah sudah memiliki dokumen perencanaan yang telah ditetapkan terkait peningkatan kompetensi SDM keamanan siber yang telah melalui pendidikan formal dan/atau informal namun belum mengacu pada Standar Kompetensi Bidang Keamanan Siber yang terdiri atas: 1. Standar Kompetensi Kerja Nasional Indonesia (SKKNI) bidang keamanan siber, 2. Standar kompetensi jabatan bidang keamanan siber, atau 3. Standar kompetensi bidang keamanan siber lainnya", + score: 1, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi sektor Pemerintah harus meningkatkan keterampilan dan kompetensi teknis dalam keamanan siber serta perilaku personel terhadap keamanan siber secara berkala dan sesuai dengan perkembangan teknologi dan pemanfaatan TIK.", + }, + { + text: "Organisasi sektor pemerintah sudah memiliki dokumen perencanaan yang telah ditetapkan terkait peningkatan kompetensi SDM keamanan siber yang telah melalui pendidikan formal dan/atau informal yang mengacu pada Standar Kompetensi Bidang Keamanan Siber yang terdiri atas: 1. Standar Kompetensi Kerja Nasional Indonesia (SKKNI) bidang keamanan siber, 2. Standar kompetensi jabatan bidang keamanan siber, atau 3. Standar kompetensi bidang keamanan siber lainnya", + score: 2, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi sektor Pemerintah harus meningkatkan keterampilan dan kompetensi teknis dalam keamanan siber serta perilaku personel terhadap keamanan siber secara berkala dan sesuai dengan perkembangan teknologi dan pemanfaatan TIK.", + }, + { + text: "Organisasi sektor pemerintah telah melaksanakan peningkatan kompetensi SDM keamanan siber sesuai dokumen perencanaan yang telah ditetapkan melalui pendidikan formal dan/atau informal yang mengacu pada Standar Kompetensi Bidang Keamanan Siber yang terdiri atas : 1. Standar Kompetensi Kerja Nasional Indonesia (SKKNI) bidang keamanan siber, 2. Standar kompetensi jabatan bidang keamanan siber, atau 3. Standar kompetensi bidang keamanan siber lainnya", + score: 3, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi sektor Pemerintah harus meningkatkan keterampilan dan kompetensi teknis dalam keamanan siber serta perilaku personel terhadap keamanan siber secara berkala dan sesuai dengan perkembangan teknologi dan pemanfaatan TIK.", + }, + { + text: "Organisasi sektor pemerintah melaksanakan dan melakukan evaluasi terhadap peningkatan kompetensi SDM keamanan siber sesuai dokumen perencanaan peningkatan kompetensi SDM keamanan siber", + score: 4, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi sektor Pemerintah harus meningkatkan keterampilan dan kompetensi teknis dalam keamanan siber serta perilaku personel terhadap keamanan siber secara berkala dan sesuai dengan perkembangan teknologi dan pemanfaatan TIK.", + }, + { + text: "Organisasi sektor pemerintah melaksanakan dan melakukan evaluasi terhadap peningkatan kompetensi SDM keamanan siber sesuai dokumen perencanaan dan dilakukan evaluasi dan perbaikan secara berkelanjutan", + score: 5, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + question: + "Organisasi sektor Pemerintah harus meningkatkan keterampilan dan kompetensi teknis dalam keamanan siber serta perilaku personel terhadap keamanan siber secara berkala dan sesuai dengan perkembangan teknologi dan pemanfaatan TIK.", + }, + // End Option of Proteksi + ]; + + console.log("Seeding options..."); + + const memoizedQuestionIds: Map = new Map(); + + for (let option of optionsData) { + // Check if sub aspect ID is already memoized + if (!memoizedQuestionIds.has(option.question)) { + const questionData = ( + await db + .select({ id: questions.id }) + .from(questions) + .where(eq(questions.question, option.question)) + )[0]; + + if (!questionData) { + throw new Error( + `Question ${questions.question} does not exist in the database` + ); + } + + memoizedQuestionIds.set(option.question, questionData.id); + } + + const questionId = memoizedQuestionIds.get(option.question)!; + + // Check if the question already exists + const existingOption = await db + .select() + .from(options) + .where( + and( + eq(options.text as any, option.text as any), + eq(options.questionId, questionId) + ) + ) + .limit(1); + + if (existingOption.length === 0) { + // If the questions does not exist, insert it + const insertedOption = ( + await db + .insert(options) + .values({ + questionId: questionId, + text: option.text, + score: option.score, + createdAt: option.createdAt, + updatedAt: option.updatedAt, + deletedAt: option.deletedAt, + }) + .onConflictDoNothing() + .returning() + )[0]; + + if (insertedOption) { + console.log( + `Options ${option.text} created and linked to question ${option.question}` + ); + } + } else { + console.log(`Options ${option.text} already exists`); + } + } +}; + +export default optionsSeeder; diff --git a/apps/backend/src/drizzle/seeds/questionSeeder.ts b/apps/backend/src/drizzle/seeds/questionSeeder.ts new file mode 100644 index 0000000..713fdde --- /dev/null +++ b/apps/backend/src/drizzle/seeds/questionSeeder.ts @@ -0,0 +1,1168 @@ +import { subAspects } from "../schema/subAspects"; +import db from ".."; +import { eq, and } from "drizzle-orm"; +import { questions } from "../schema/questions"; +import { aspects } from "../schema/aspects"; + +const questionSeeder = async () => { + const questionsData: (typeof questions.$inferInsert & { subAspectName: string, aspectName: string })[] = [ + // Identifikasi + { + question: "Pimpinan organisasi menetapkan keamanan siber sebagai prioritas di organisasi dalam bentuk kebijakan atau komitmen pimpinan yang sesuai dengan kondisi bisnis/layanan dan operasional organisasi.", + needFile: false, + subAspectName: "Mengidentifikasi Peran dan tanggung jawab organisasi", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV mengkomunikasikan perihal komitmen keamanan siber di organisasinya dengan pihak-pihak yang terkait dengan bisnis/layanan organisasi (termasuk kepada penyedia pihak ketiga).", + needFile: false, + subAspectName: "Mengidentifikasi Peran dan tanggung jawab organisasi", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV mengidentifikasi unit kerja di internal organisasinya, maupun pihak lain di luar organisasinya yang memiliki ketergantungan, baik secara langsung maupun tidak langsung terhadap operasional layanan IIV di organisasinya.", + needFile: false, + subAspectName: "Mengidentifikasi Peran dan tanggung jawab organisasi", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV mengidentifikasi dan menetapkan unit kerja atau fungsi yang memiliki tugas dan tanggung jawab dalam menerapkan pelindungan IIV di organisasinya.", + needFile: false, + subAspectName: "Mengidentifikasi Peran dan tanggung jawab organisasi", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV mengidentifikasi peran, aktivitas, proses, dan narahubung dari pemangku kepentingan yang mendukung ekosistem bisnis atau layanan IIV, baik di dalam atau di luar organisasi.", + needFile: false, + subAspectName: "Mengidentifikasi Peran dan tanggung jawab organisasi", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV menyusun, menetapkan, dan mengembangkan kebijakan tentang keamanan siber sesuai dengan standar yang berlaku di sektornya dan/atau peraturan perundang-undangan", + needFile: false, + subAspectName: "Menyusun strategi, kebijakan, dan prosedur Pelindungan IIV", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV mengomunikasikan kebijakan kepada seluruh personel yang relevan, serta mengoordinasikan dan menyepakati metode berbagi informasi mengenai kebijakan dan prosedur yang ada di organisasi dengan para pemangku kepentingan eksternal.", + needFile: false, + subAspectName: "Menyusun strategi, kebijakan, dan prosedur Pelindungan IIV", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV meninjau dan merevisi kebijakannya secara berkelanjutan sesuai dengan setiap perubahan dalam peraturan perundang-undangan yang relevan, standar dan/atau pedoman industri yang berlaku di sektornya.", + needFile: false, + subAspectName: "Menyusun strategi, kebijakan, dan prosedur Pelindungan IIV", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV senantiasa mengembangkan strategi dalam melindungi aset informasi dengan mempertimbangkan manajemen risiko yang berlaku di organisasi.", + needFile: false, + subAspectName: "Menyusun strategi, kebijakan, dan prosedur Pelindungan IIV", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV harus menetapkan sasaran atau target penerapan keamanan siber pada fungsi dan tingkatan yang relevan.", + needFile: false, + subAspectName: "Menyusun strategi, kebijakan, dan prosedur Pelindungan IIV", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV menyusun kebijakan standar operasional prosedur terhadap setiap layanan yang mendukung IIV baik dalam kondisi normal, jika terjadi insiden siber, dan pasca insiden siber.", + needFile: false, + subAspectName: "Menyusun strategi, kebijakan, dan prosedur Pelindungan IIV", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV menyusun kebijakan yang diperlukan untuk menjaga ketersediaan aset informasi, seperti kebijakan penggunaan perangkat pribadi di kantor (bring your own devices), kebijakan instalasi perangkat lunak pada perangkat kantor, kebijakan klasifikasi informasi, dsb.", + needFile: false, + subAspectName: "Menyusun strategi, kebijakan, dan prosedur Pelindungan IIV", + aspectName: "Identifikasi" + }, + { + question: "Dokumentasikan dan kelola dengan tepat daftar inventaris aset informasi seperti perangkat keras, perangkat lunak, data, dan layanan TIK yang akan dilindungi, beserta informasi manajemennya (misalnya nama aset, versi, alamat jaringan, nama penanggungjawab, informasi lisensi, dsb).", + needFile: false, + subAspectName: "Mengelola aset informasi", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV memastikan pemberian label pada perangkat aset informasi oleh pihak yang berwenang di organisasi", + needFile: false, + subAspectName: "Mengelola aset informasi", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV menyusun dokumentasi dan mengelola diagram jalur komunikasi jaringan dan aliran data dengan tepat dalam organisasi.", + needFile: false, + subAspectName: "Mengelola aset informasi", + aspectName: "Identifikasi" + }, + { + question: "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang menggunakan data atau layanan IIV", + needFile: false, + subAspectName: "Mengelola aset informasi", + aspectName: "Identifikasi" + }, + { + question: "Dokumentasikan dan kelola dengan tepat daftar sistem informasi eksternal yang digunakan oleh penyelenggara IIV.", + needFile: false, + subAspectName: "Mengelola aset informasi", + aspectName: "Identifikasi" + }, + { + question: "Mengklasifikasikan dan memprioritaskan aset informasi seperti, perangkat keras, perangkat lunak, data, dan layanan TIK lainnya berdasarkan fungsi, kekritisan, dan nilai bisnis", + needFile: false, + subAspectName: "Mengelola aset informasi", + aspectName: "Identifikasi" + }, + { + question: "Menentukan metode untuk memastikan ketertelusuran aset informasi seperti membuat catatan mengenai tanggal produksi atau pengadaan aset, kondisi aset, catatan pemakaian, dan pelaporan kepada unit kerja terkait.", + needFile: false, + subAspectName: "Mengelola aset informasi", + aspectName: "Identifikasi" + }, + { + question: "Secara aktif memeriksa keterbaharuan dan memperbaharui dari setiap versi perangkat lunak dan perangkat keras yang digunakan oleh organisasi.", + needFile: false, + subAspectName: "Mengelola aset informasi", + aspectName: "Identifikasi" + }, + { + question: "Identifikasi kerentanan terhadap seluruh aset informasi di organisasi, misalnya melalui penetration testing dan vulnerability assessment, serta dokumentasikan daftar kerentanan yang teridentifikasi tersebut bersama dengan daftar aset terkait.", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV mengumpulkan informasi termasuk kerentanan dan ancaman dari sumber internal dan eksternal (melalui pengujian internal, informasi dari pihak berwajib, hasil penelitian keamanan, dll.)", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Menganalisis informasi tersebut apakah termasuk kedalam konteks risiko terhadap aset informasi, dan mendokumentasikannya.", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV perlu memeriksa pada setiap fungsi penting organisasi apakah ada risiko keamanan yang diketahui termasuk kedalam kategori membahayakan keselamatan, menimbulkan kerugian, dan mengancam keamanan negara.", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Pertimbangkan ancaman, kerentanan, kemungkinan, dan dampak saat menganalisis risiko", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV menentukan level risiko dan prioritas mitigasinya", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV memiliki kriteria yang jelas dan konsisten untuk menentukan tingkat risiko siber dan toleransi risiko untuk setiap aset informasi vital.", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV melakukan penilaian risiko siber secara berkala dan menyeluruh, dengan melibatkan semua pemangku kepentingan yang relevan.", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV menentukan tingkat risiko terkait keamanan siber yang dapat diterima", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV memiliki proses untuk menganalisis dan mengevaluasi data dan informasi yang terkait dengan risiko siber, termasuk penyebab, dampak, dan peluang", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV memiliki kebijakan dan prosedur yang efektif untuk mengurangi, menghindari, mentransfer, atau menerima risiko siber sesuai dengan tingkat risiko dan toleransi risiko yang ditetapkan", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Berdasarkan hasil penilaian risiko, tentukan dengan jelas rincian tindakan untuk mencegah kemungkinan risiko keamanan, dan dokumentasikan hasil yang terorganisir dari ruang lingkup dan prioritas tindakan.", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Evaluasi hasil penerapan respon risiko secara berkelanjutan.", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Menentukan tingkat toleransi risiko organisasi berdasarkan hasil penilaian risiko dan kebijakan yang berlaku.", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV memiliki mekanisme untuk mengkomunikasikan hasil dan rekomendasi dari proses manajemen risiko kepada pihak-pihak yang berwenang dan relevan", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Konfirmasi status implementasi manajemen risiko keamanan siber organisasi dan komunikasikan hasilnya kepada pihak yang tepat di dalam organisasi (misalnya pimpinan organisasi).", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Tetapkan serta terapkan proses untuk mengonfirmasi status penerapan manajemen risiko keamanan pihak terkait.", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV memiliki meknisme untuk melakukan audit internal dan eksternal terhadap proses manajemen risiko dan mengimplementasikan rekomendasi perbaikan", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Penyelenggara IIV melakukan reviu terhadap manajemen risiko secara periodik, atau apabila menemukan data atau informasi baru yang berpotensi menambah atau mengubah profil risiko.", + needFile: false, + subAspectName: "Menilai dan mengelola risiko Keamanan Siber", + aspectName: "Identifikasi" + }, + { + question: "Merumuskan standar tindakan keamanan yang relevan dengan rantai pasokan dan menyepakati konten dengan mitra bisnis setelah memperjelas ruang lingkup tanggung jawab masing-masing", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Hal yang perlu dipertimbangkan dalam proses manajemen risiko rantai pasokan diantaranya adalah penentuan jenis akses yang diberikan, alasan kebutuhan akses, metode akses, jangka waktu, dan potensi risiko yang terjadi apabila akses tersebut disalahgunakan", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Identifikasi peran dan tanggung jawab keamanan siber di pemangku kepentingan pihak ketiga (misalnya, pemasok, pelanggan, atau mitra), dan pihak lainnya yang berhubungan dengan penyelenggara IIV.", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Merumuskan dan mengelola persyaratan keamanan yang berlaku untuk anggota/personel pihak ketiga, dan juga pemangku kepentingan lainnya yang terlibat dalam layanan yang disediakan oleh pihak ketiga.", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah manajemen pihak ketiga telah dengan benar mematuhi persyaratan keamanan, standar, dan peraturan perundangan yang berlaku, dengan mempertimbangkan tujuan kontrak tersebut dan hasil manajemen risiko.", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Saat menandatangani kontrak dengan pihak ketiga, periksa apakah produk dan layanan yang disediakan oleh pihak ketiga sesuai dengan persyaratan keamanan yang ada di organisasi.", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Melakukan penilaian secara berkala melalui audit, hasil pengujian, atau pemeriksaan dari pihak terkait untuk memastikan pihak ketiga memenuhi kewajiban kontraktual mereka.", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Merumuskan dan menerapkan prosedur untuk mengatasi ketidakpatuhan terhadap persyaratan kontrak yang ditemukan.", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Mengumpulkan dan menyimpan data dengan aman yang membuktikan bahwa organisasi memenuhi kewajiban kontraktualnya dengan pihak atau individu lain yang relevan, dan mempersiapkannya untuk pengungkapan jika diperlukan dalam rangka penegakan hukum.", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Menyiapkan dan menguji prosedur respons insiden dengan pihak terkait yang terlibat dalam aktivitas respons insiden untuk memastikan tindakan respons dilaksanakan dalam rantai pasokan.", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Menyusun prosedur keamanan yang akan dijalankan ketika kontrak dengan pihak ketiga selesai. (misalnya, pemutusan hak akses ketika berakhirnya masa kontrak)", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + { + question: "Senantiasa meningkatkan standar langkah-langkah keamanan yang relevan dengan mitra rantai pasok.", + needFile: false, + subAspectName: "Mengelola risiko rantai pasok", + aspectName: "Identifikasi" + }, + // End of Identifikasi + // Proteksi + { + question: "Menetapkan dan menerapkan prosedur untuk menerbitkan, mengelola, memeriksa, membatalkan, dan memantau informasi tentang identitias dan kredensial terhadap aset informasi dan personel yang menggunakan IIV.", + needFile: false, + subAspectName: "Mengelola identitas, autentikasi, dan kendali akses", + aspectName: "Proteksi" + }, + { + question: "Penyelenggara IIV menyusun prosedur tentang mekanisme identifikasi pengguna layanan, pemberian akses, dan otorisasi terhadap layanan, termasuk pemberian koneksi terhadap pengguna, perangkat IoT, dan/atau server.", + needFile: false, + subAspectName: "Mengelola identitas, autentikasi, dan kendali akses", + aspectName: "Proteksi" + }, + { + question: "tersedianya dan diterapkannya prosedur pencegahan terhadap upaya memasuki perangkat atau jaringan secara tidak sah, dengan menerapkan langkah-langkah seperti menerapkan fungsi untuk penguncian setelah sejumlah upaya masuk yang gagal dan memberikan interval waktu hingga keamanannya dipastikan.", + needFile: false, + subAspectName: "Mengelola identitas, autentikasi, dan kendali akses", + aspectName: "Proteksi" + }, + { + question: "Menyusun dan menerapkan prosedur untuk memisahkan hak akses sesuai tugas dan area tanggung jawab (misalnya, pisahkan fungsi untuk pengguna dari fungsi untuk administrator sistem)", + needFile: false, + subAspectName: "Mengelola identitas, autentikasi, dan kendali akses", + aspectName: "Proteksi" + }, + { + question: "tersedianya prosedur pembatasan komunikasi oleh perangkat dan server kepada pengguna sesuai dengan tingkat risikonya.", + needFile: false, + subAspectName: "Mengelola identitas, autentikasi, dan kendali akses", + aspectName: "Proteksi" + }, + { + question: "perangkat, pengguna, dan aset informasi lainnya menggunakan sistem otentikasi tertentu (misalnya, multi-factor authentication) sesuai dengan tingkat risiko nya terhadap sistem.", + needFile: false, + subAspectName: "Mengelola identitas, autentikasi, dan kendali akses", + aspectName: "Proteksi" + }, + { + question: "menetapkan dan menerapkan prosedur keamanan fisik terhadap akses kontrol yang sesuai seperti mengunci dan membatasi akses ke area tempat perangkat dan server dipasang, menggunakan kontrol masuk dan keluar, otentikasi biometrik, memasang kamera pengintai, dan/atau memeriksa barang bawaan.", + needFile: false, + subAspectName: "Melindungi aset fisik", + aspectName: "Proteksi" + }, + { + question: "Tersedianya dan diterapkannya prosedur pelindungan fisik seperti menyiapkan catu daya cadangan, fasilitas proteksi kebakaran, dan perlindungan dari resapan air yang mengikuti kebijakan dan standar yang berlaku.", + needFile: false, + subAspectName: "Melindungi aset fisik", + aspectName: "Proteksi" + }, + { + question: "Tersedianya prosedur dan sarana pengamanan terhadap perangkat komputer yang digunakan untuk pengolahan data IIV.", + needFile: false, + subAspectName: "Melindungi aset fisik", + aspectName: "Proteksi" + }, + { + question: "Tentukan metode untuk melakukan pembaruan keamanan dan sejenisnya pada perangkat dan server. Kemudian, terapkan pembaruan keamanan tersebut dengan teknologi yang benar dan tepat pada waktunya.", + needFile: false, + subAspectName: "Melindungi aset fisik", + aspectName: "Proteksi" + }, + { + question: "Dokumentasikan kegiatan pembaruan keamanan pada perangkat organisasi dan laporkan kepada manajemen secara berkala.", + needFile: false, + subAspectName: "Melindungi aset fisik", + aspectName: "Proteksi" + }, + { + question: "Mengidentifikasi perangkat yang memiliki mekanisme pembaruan jarak jauh untuk melakukan pembaruan massal berbagai program perangkat lunak (OS, driver, dan aplikasi) melalui perintah jarak jauh.", + needFile: false, + subAspectName: "Melindungi aset fisik", + aspectName: "Proteksi" + }, + { + question: "Melakukan pemeliharaan perangkat dan server yang telah disetujui dari jarak jauh dan mencatat setiap log masuknya, sehingga akses yang tidak sah dapat dicegah.", + needFile: false, + subAspectName: "Melindungi aset fisik", + aspectName: "Proteksi" + }, + { + question: "Penyelenggara IIV memastikan lingkungan fisik aset IIV dipantau secara tepat melalui pengaturan, perekaman, dan pemantauan akses fisik terhadap aset IIV. (misalnya cctv, akses kontrol, sensor, dll).", + needFile: false, + subAspectName: "Melindungi aset fisik", + aspectName: "Proteksi" + }, + { + question: "Penyelenggara IIV senantiasa melakukan peninjauan, analisis, dan peningkatan terhadap kontrol keamanan yang diterapkan sesuai hasil reviu dari respons insiden keamanan dan hasil pemantauan, pengukuran, dan evaluasi ancaman internal dan eksternal.", + needFile: false, + subAspectName: "Melindungi aset fisik", + aspectName: "Proteksi" + }, + { + question: "Jika Penyelenggara IIV bertukar informasi yang perlu dilindungi dengan organisasi lain, maka Penyelenggara IIV perlu meminta organisasi lain tersebut untuk menyetujui persyaratan keamanan untuk perlindungan informasi tersebut.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Mengenkripsi informasi dengan tingkat kekuatan keamanan yang sesuai standar keamanan.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Penyelenggara IIV memastikan saluran komunikasi menerapkan enkripsi saat berkomunikasi antara perangkat IIV dan server IIV.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Penyelenggara IIV memastikan kunci enkripsi dikontrol dengan aman sepanjang siklus hidup kunci enkripsi tersebut untuk memastikan pengoperasian yang benar dan data yang ditransmisikan, diterima, dan disimpan dengan aman.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Penyelenggara IIV menyediakan sumber daya yang cukup untuk setiap sistem IIV (misalnya ruang penyimpanan, sumber daya, dan sistem redundan),", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Penyelenggara IIV memastikan dilakukannya pemeriksaan kualitas ruang penyimpanan data secara berkala, pendeteksi kegagalan operasional, dan pembaharuan perangkat lunak untuk perangkat penyimpanan data.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Saat menangani informasi yang akan dilindungi atau pengadaan perangkat yang memiliki fungsi penting bagi organisasi, pilih perangkat dan server yang dilengkapi dengan perangkat anti-tampering.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Memastikan bahwa jalur komunikasi yang digunakan untuk mengirim informasi telah dilindungi dengan kontrol keamanan yang tepat.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Melakukan pemeriksaan integritas perangkat lunak yang berjalan di perangkat dan server pada waktu yang ditentukan oleh organisasi, untuk mencegah pemasangan perangkat lunak yang tidak sah.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Melakukan pemeriksaan integritas informasi yang akan dikirim, diterima, dan disimpan.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Memperkenalkan mekanisme pemeriksaan integritas untuk memverifikasi integritas perangkat keras.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Konfirmasikan bahwa perangkat keras dan perangkat lunak adalah produk asli dan memiliki sertifikat keamanan.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Pelihara, perbarui, dan kelola informasi seperti asal data, dan riwayat pemrosesan data, di seluruh siklus hidup data.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Tersedianya dan diterapkannya prosedur pencadangan sistem secara berkala dan pengujian kehandalan komponen untuk memastikan ketersediaan sistem.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Saat akan menghapuskan perangkat dan aset informasi, prosedur penghapusan data yang disimpan dari perangkat dan server serta informasi penting lainya (misalnya, kunci pribadi dan sertifikat digital), atau dibuat agar tidak dapat dibaca.", + needFile: false, + subAspectName: "Melindungi data", + aspectName: "Proteksi" + }, + { + question: "Tersedianya dan diterapkannya prosedur untuk keamanan pada saat pengaturan sistem (misalnya, prosedur penerapan kata sandi, prosedur penerapan izin akses, dsb)", + needFile: false, + subAspectName: "Melindungi aplikasi", + aspectName: "Proteksi" + }, + { + question: "tersedianya dan diterapkanya prosedur untuk melakukan perubahan pengaturan pada perangkat.", + needFile: false, + subAspectName: "Melindungi aplikasi", + aspectName: "Proteksi" + }, + { + question: "Tersedianya dan diterapkannya prosedur Pembatasan perangkat lunak yang akan ditambahkan pada perangkat dan server.", + needFile: false, + subAspectName: "Melindungi aplikasi", + aspectName: "Proteksi" + }, + { + question: "Organisasi mengembangkan dan mengimplementasikan rencana manajemen kerentanan yang meliputi mekanisme pengumpulan informasi kerentanan, inventarisasi kerentanan, hingga perbaikan terhadap kerentanan yang ditemukan pada aplikasi.", + needFile: false, + subAspectName: "Melindungi aplikasi", + aspectName: "Proteksi" + }, + { + question: "Penggunaan lingkungan pengembangan sistem yang berbeda dari lingkungan produksi yang meliputi pemisahan terhadap media penyimpanan, jaringan, lingkungan kerja, dsb.", + needFile: false, + subAspectName: "Melindungi aplikasi", + aspectName: "Proteksi" + }, + { + question: "Tersedianya dan diterapkannya prosedur pengembangan perangkat lunak yang selalu memperhatikan aspek keamanan pada setiap tahapan siklus hidup pengembangannya.", + needFile: false, + subAspectName: "Melindungi aplikasi", + aspectName: "Proteksi" + }, + { + question: "Minimalkan fungsi perangkat dan server dengan memblokir secara fisik dan logis port jaringan, USB, dan port serial yang tidak perlu, yang mengakses secara langsung bagian utama perangkat dan server.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Memastikan Removable Media terlindungi dan penggunaannya terbatas sesuai dengan kebijakan.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Organisasi menentukan dan menerapkan segmentasi dan/atau pembagian zonasi jaringan komunikasi/internet. (misalnya dibagi menjadi lingkungan pengembangan, pengujian, lingkungan produksi, dan lingkungan lain dalam organisasi)", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Organisasi juga melakukan isolasi terhadap jaringan yang menghubungkan dengan perangkat penting, misalnya perangkat SCADA atau ICS (Industrial Control System).", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Memastikan perangkat jaringan mampu menerapkan mekanisme (misalnya, fail safe, load balancer, atau hot swap) yang perlu diimplementasikan untuk mencapai persyaratan ketahanan dalam situasi normal dan situasi yang merugikan.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Memastikan fungsi keamanan pada perangkat jaringan dapat digunakan sesuai dengan kebutuhan dan sertifikat keamanan.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "tersedianya prosedur pelindungan terhadap integritas jaringan dengan cara melakukan pengujian dan monitoring terhadap konfigurasi jaringan, seperti pengujian terhadap segmentasi jaringan yang sesuai.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Untuk melindungi ketersediaan data terhadap serangan malware, data organisasi harus di-rekam cadang secara berkala.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "pemindaian/scanning terhadap removable media yang akan digunakan pada perangkat komputer, notebook, server, atau perangkat pengolah informasi lainnya untuk mencegah masuknya virus dari luar ke dalam perangkat pengolah informasi dan jaringan komunikasi data milik Organisasi.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Mengunduh dan menginstalasi update anti malware terbaru, meliputi antivirus, anti-spyware, spam filtering, web content filtering, dan intrusion detection and prevention system.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Meng-update perangkat komputer dengan melakukan upgrade dan patch sistem operasi dan aplikasi.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Menentukan dan mendokumentasikan subjek atau ruang lingkup rekaman audit/pencatatan log, dan menerapkan dan meninjau catatan tersebut untuk mendeteksi insiden keamanan berisiko tinggi dengan benar.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Berbagi informasi mengenai efektivitas teknologi perlindungan data hanya dengan mitra yang tepat dan terpercaya.", + needFile: false, + subAspectName: "Melindungi jaringan", + aspectName: "Proteksi" + }, + { + question: "Pemeriksaan verifikasi latar belakang terhadap semua calon personel harus dilakukan sebelum bergabung dengan Penyelenggara IIV dengan mempertimbangkan peraturan dan etika yang berlaku serta proporsional dengan kebutuhan bisnis, dan risiko keamanan.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Perjanjian kontrak kerja harus menyatakan tanggung jawab personel dan organisasi untuk keamanan informasi.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Proses pendisiplinan harus diformalkan dan dikomunikasikan untuk mengambil tindakan terhadap personel dan pihak berkepentingan lainnya yang telah melakukan pelanggaran kebijakan keamanan informasi.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Organisasi menetapkan dan mengomunikasikan kendali terhadap seluruh pegawai dan pihak ketiga setelah penghentian atau penggantian jabatan, tugas dan tanggung jawab keamanan informasi.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Perjanjian kerahasiaan yang mencerminkan kebutuhan organisasi untuk perlindungan informasi harus diidentifikasi, didokumentasikan, ditinjau secara teratur dan ditandatangani oleh personel dan pihak berkepentingan terkait lainnya.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Langkah-langkah keamanan harus diterapkan ketika personel bekerja dari jarak jauh untuk melindungi informasi yang diakses, diproses, atau disimpan di luar lokasi organisasi.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Organisasi harus menyediakan mekanisme bagi personel untuk melaporkan kejadian keamanan informasi yang diamati atau dicurigai melalui saluran yang tepat.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Memberikan pelatihan dan pendidikan yang tepat kepada semua individu dalam organisasi dan mengelola catatan sehingga mereka dapat memenuhi peran dan tanggung jawab yang ditugaskan untuk mencegah dan mengatasi terjadinya dan tingkat keparahan insiden keamanan.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Memberikan pelatihan dan pendidikan keamanan yang sesuai kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan yang mungkin terlibat dalam pencegahan dan penanggulangan insiden keamanan. Kemudian, kelola catatan pelatihan dan pendidikan keamanan tersebut.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Meningkatkan isi pelatihan dan pendidikan tentang keamanan kepada anggota organisasi dan pihak terkait lainnya yang sangat penting dalam manajemen keamanan organisasi.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Organisasi perlu menetapkan kebijakan terkait Kompetensi yang diperlukan dalam pelaksanaan Keamanan Siber diorganisasinya dengan menacu kepada Peta Okupasi Keamanan Siber Nasional Indonesia.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Organisasi perlu menetapkan kebijakan pengembangan kompetensi SDM keamanan siber melalui pelatihan/pendidikan/workshop.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + { + question: "Organisasi sektor Pemerintah harus meningkatkan keterampilan dan kompetensi teknis dalam keamanan siber serta perilaku personel terhadap keamanan siber secara berkala dan sesuai dengan perkembangan teknologi dan pemanfaatan TIK.", + needFile: false, + subAspectName: "Melindungi sumber daya manusia", + aspectName: "Proteksi" + }, + // End of Proteksi + // Deteksi + { + question: "Memperjelas peran dan tanggung jawab organisasi serta penyedia layanan dalam rangka mendeteksi peristiwa keamanan.", + needFile: false, + subAspectName: "Mengelola deteksi Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Penyelenggara IIV menyiapkan sistem dalam organisasi untuk mendeteksi, menganalisis, dan merespons peristiwa keamanan.", + needFile: false, + subAspectName: "Mengelola deteksi Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Melakukan proses pemantauan peristiwa keamanan siber, sesuai dengan peraturan, arahan, standar industri, dan aturan lainnya yang berlaku.", + needFile: false, + subAspectName: "Mengelola deteksi Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Melakukan pemantauan dan kontrol jaringan pada setiap titik masuk ke jaringan organisasi.", + needFile: false, + subAspectName: "Mengelola deteksi Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Penyelenggara IIV melakukan pengujian secara periodik tentang efektifitas perangkat dan prosedur untuk mendeteksi peristiwa keamanan sebagaimana mestinya.", + needFile: false, + subAspectName: "Mengelola deteksi Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Informasi hasil pendeteksian kejadian keamanan diberitahukan kepada pihak yang terkait sesuai dengan persetujuan manajemen organisasi.", + needFile: false, + subAspectName: "Mengelola deteksi Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Penyelenggara IIV melakukan reviu dan peningkatan prosedur pendeteksian peristiwa keamanan secara berkala.", + needFile: false, + subAspectName: "Mengelola deteksi Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Penyelenggara IIV menetapkan dan menerapkan prosedur untuk mengidentifikasi dan mengelola ambang batas terhadap operasional jaringan dan arus informasi yang diharapkan antara pengguna, penyelenggara, dan sistem.", + needFile: false, + subAspectName: "Menganalisis anomali dan Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Kejadian keamanan yang terdeteksi dianalisis untuk memahami target dan metode serangan", + needFile: false, + subAspectName: "Menganalisis anomali dan Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Identifikasi peristiwa keamanan secara akurat dengan menerapkan prosedur untuk melakukan analisis korelasi insiden keamanan dan analisis komparatif dengan informasi ancaman yang diperoleh dari luar organisasi.", + needFile: false, + subAspectName: "Menganalisis anomali dan Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Identifikasi dampak peristiwa keamanan, termasuk dampaknya terhadap organisasi lain yang relevan.", + needFile: false, + subAspectName: "Menganalisis anomali dan Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "Hasil analisis peristiwa siber didokumentasikan, serta dilaporkan kepada pihak manajemen sesuai ketentuan.", + needFile: false, + subAspectName: "Menganalisis anomali dan Peristiwa Siber", + aspectName: "Deteksi" + }, + { + question: "gunakan perangkat teknologi yang dapat mendeteksi perilaku abnormal pada sistem dan jaringan. (misalnya perangkat intrustion detection and prevention systems, next-generation firewall, endpoint detection and response, dll)", + needFile: false, + subAspectName: "Memantau Peristiwa Siber berkelanjutan", + aspectName: "Deteksi" + }, + { + question: "memvalidasi apakah informasi atau file yang diberikan dari dunia maya tidak mengandung kode berbahaya, sebelum tindakan dilakukan.", + needFile: false, + subAspectName: "Memantau Peristiwa Siber berkelanjutan", + aspectName: "Deteksi" + }, + { + question: "memvalidasi integritas dan keaslian informasi yang diberikan dari dunia maya sebelum tindakan dilakukan.", + needFile: false, + subAspectName: "Memantau Peristiwa Siber berkelanjutan", + aspectName: "Deteksi" + }, + { + question: "Memastikan bahwa personel yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + needFile: false, + subAspectName: "Memantau Peristiwa Siber berkelanjutan", + aspectName: "Deteksi" + }, + { + question: "Memastikan bahwa pihak ketiga yang berada pada layanan IIV tidak melakukan koneksi, memasang perangkat keras ataupun perangkat lunak yang tidak berizin pada lingkup sistem IIV.", + needFile: false, + subAspectName: "Memantau Peristiwa Siber berkelanjutan", + aspectName: "Deteksi" + }, + { + question: "Memastikan bahwa seluruh perangkat teknologi pada lingkup IIV telah diuji keamanannya melalui penilaian kerentanan, uji penetrasi, atau audit keamanan.", + needFile: false, + subAspectName: "Memantau Peristiwa Siber berkelanjutan", + aspectName: "Deteksi" + }, + { + question: "Penyelenggara IIV memastikan adanya pemeriksaan rutin di perangkat dan server yang dikelola dalam organisasi.", + needFile: false, + subAspectName: "Memantau Peristiwa Siber berkelanjutan", + aspectName: "Deteksi" + }, + // End of Deteksi + // Penanggulangan dan Pemulihan + { + question: "Menentukan dan menetapkan prosedur tanggap insiden beserta pembagian peran yang jelas antara pihak manajemen, personel pengelola IIV, dan pihak lainnya yang mencakup tindakan yang harus dilakukan setelah mendeteksi adanya Insiden Siber.", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Menyusun dan menetapkan prosedur rencana tanggap Insiden Siber, mulai dari tahapan persiapan, identifikasi, kontainmen, eradiksi, pemulihan, dan peningkatan berkelanjutan", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Menentukan skenario insiden keamanan yang mungkin terjadi pada layanan IIV dan menambahkannya pada dokumen rencana tanggap Insiden Siber.", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Memastikan rencana tanggap Insiden Siber dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Menentukan dan menetapkan daftar fungsi dan layanan vital bagi penyelenggaraan IIV, beserta daftar pembagian peran dan tanggung jawab dengan pihak-pihak yang berhubungan dengan operasional layanan IIV.", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Menentukan dan menetapkan strategi, tahapan, beserta target waktu yang dibutuhkan untuk memulihkan dan menjalankan fungsi dan layanan vital secara penuh/kembali normal.", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Menentukan daftar sumber daya, peralatan, dan personil yang dibutuhkan untuk menjalankan fungsi dan layanan vital.", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Memastikan rencana keberlangsungan layanan dikomunikasikan kepada pihak-pihak yang berkepentingan dan berhak sesuai ketentuan.", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Memastikan rencana tanggap Insiden Siber dan rencana keberlangsungan kegiatan disimulasikan secara berkala oleh seluruh pihak yang terlibat dalam lingkup IIV. (misalnya dalam kegiatan simulasi kesiapsiagaan Insiden Siber)", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi menentukan dan menetapkan personel yang ditugaskan dalam Tim Tanggap Insiden Siber.", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan personel mengetahui perannya dan urutan pengoperasian bila respons diperlukan", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi mengidentifikasi siapa saja pihak-pihak pihak-pihak terkait dalam proses penanggulangan dan pemulihan insiden, misalnya aparat penegak hukum, regulator, maupun tim TTIS nasional", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi perlu mengembangkan dan mengelola aturan mengenai penerbitan dan distribusi informasi setelah terjadinya insiden keamanan. sehingga informasi organisasi hanya boleh keluar melalui personel yang berwenang saja.", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan personel yang mengelola IIV melakukan prosedur rekam cadang untuk mengamankan aset informasi berupa sistem/data yang tersimpan di dalam sistem IIV, serta memastikan bahwa media yang digunakan untuk menyimpan data tersebut telah diamankan.", + needFile: false, + subAspectName: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan hasil analisis deteksi peristiwa siber diperiksa untuk menilai ada atau tidaknya anomali pada sistem.", + needFile: false, + subAspectName: "Menganalisis dan melaporkan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi mengumpulkan dan menganalisis laporan peristiwa siber yang diterima baik dari pengguna layanan, maupun sumber eksternal organisasi misalnya laporan dari Tim Tanggap Insiden Siber nasional atau mitra pihak ketiga.", + needFile: false, + subAspectName: "Menganalisis dan melaporkan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi harus mengidentifikasi dan menganalisis potensi dampak Insiden Siber pada layanan IIV, termasuk organisasi, dan pihak terkait seperti mitra ketiga berdasarkan laporan lengkap Insiden Siber.", + needFile: false, + subAspectName: "Menganalisis dan melaporkan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan laporan Insiden Siber dikumpulkan, dikategorisasikan, dan diprioritaskan sesuai dampak risiko terhadap organisasi", + needFile: false, + subAspectName: "Menganalisis dan melaporkan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan informasi mengenai Insiden Siber dilaporkan kepada pihak yang berwenang sesuai dengan kriteria yang ditetapkan oleh organisasi dan peraturan perundangan yang berlaku.", + needFile: false, + subAspectName: "Menganalisis dan melaporkan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan proses koordinasi dengan para pemangku kepentingan dilakukan sesuai dengan rencana tanggap Insiden Siber (seperti kepada Kementerian atau Lembaga pembina sektor, Tim Tanggap Insiden Siber nasional, atau mitra pihak ketiga)", + needFile: false, + subAspectName: "Menganalisis dan melaporkan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi harus mengambil langkah-langkah yang diperlukan untuk meminimalkan kerusakan terkait keamanan dan mengurangi dampak yang disebabkan oleh Insiden Siber tersebut. Misalnya melakukan isolasi terhadap jaringan yang terdapat Insiden Siber.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi harus mengidentifikasi hal-hal yang perlu diprioritaskan dan ruang lingkup respons yang perlu diambil.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi harus mengambil tindakan yang tepat terhadap perangkat yang terpengaruh oleh Insiden Siber, terutama mengenai fasilitas produksi yang rusak akibat insiden keamanan.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi mendokumentasikan hasil mitigasi Insiden Siber tersebut sebagai bahan pembelajaran berkelanjutan.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan informasi mengenai insiden keamanan yang terdeteksi dikategorikan dan disimpan menurut ukuran dampak terkait keamanan, penyebab insiden, dan faktor lainnya yang diperlukan.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Untuk keperluan investigasi dan/atau audit, maka Organisasi menerapkan forensik digital terhadap aset informasi yang terdampak insiden keamanan untuk menemukenali penyebab insiden.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi harus memastikan bahwa seluruh aset informasi yang terdampak Insiden Siber telah diperiksa setiap komponennya untuk menghapus setiap kode berbahaya atau indikasi ancaman lainnya yang terkait Insiden Siber", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "jika insiden meningkat atau meluas, maka Organisasi perlu menyiapkan dan melaksanakan prosedur eskalasi Insiden Siber, seperti melaporkan kepada tim tanggap Insiden Siber (TTIS) sektoral dan nasional, serta menyiapkan informasi yang relevan terkait Insiden Siber tersebut.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi melakukan pemeriksaan seluruh aset informasi yang berhubungan dengan IIV untuk memastikan seluruh sistem tersebut telah bersih dari indikasi ancaman atau serangan yang telah terjadi", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi melaksanakan prosedur pemulihan sistem/data dari media penyimpanan dalam hal terjadi keadaan darurat.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi melaksanakan simulasi terhadap prosedur pemulihan sistem/data dari media penyimpangan rekam cadang secara periodik.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "prosedur rekam cadang (back-up) sedapat mungkin dilakukan secara otomatis dengan memanfaatkan perangkat-perangkat penyimpanan yang mempunyai fitur job-schedulling.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan data yang disimpan pada media penyimpanan rekam cadang diamankan menggunakan enkripsi.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi menentukan waktu pelaksanaan rekam cadang terhadap data organisasi yang disesuaikan dengan tingkat kritikalitas data dan kebutuhan organisasi.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan hasil pelaksanaan rekam cadang data didokumentasikan.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan media penyimpanan rekam cadang telah disimpan secara aman.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "pemusnahan terhadap data yang disimpan pada media rekam cadang harus dilaksanakan dengan persetujuan pimpinan organisasi.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "pemusnahan data pada media rekam cadang dilakukan dengan melakukan format ulang atas media rekam cadang dan memastikan bahwa data tersebut tidak dapat diakses lagi.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi harus menyusun dan menerapkan prosedur yang bertujuan untuk memastikan seluruh fungsi pada layanan IIV telah beroperasi dengan normal pasca Insiden Siber", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi perlu menyusun dan menerapkan strategi komunikasi publik dalam hal mengelola informasi yang perlu disampaikan terkait Insiden Siber.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi memastikan bahwa proses penanganan dan pemulihan insiden dikomunikasikan dengan pihak yang berkepentingan sesuai dengan peraturan perundangan.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi menyusun laporan hasil penanganan Insiden Siber dan menyampaikannya kepada Kementerian atau Lembaga di masing-masing sektor.", + needFile: false, + subAspectName: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi mengevaluasi kontrol keamanan yang diterapkan apakah masih relevan terhadap spektrum ancaman yang ada atau perlu ada perbaikan dan penambahan.", + needFile: false, + subAspectName: "Meningkatkan keamanan setelah terjadinya Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi melakukan reviu dan pembaharuan terhadap dokumen rencana tanggap Insiden Siber dan pemulihan jika terdapat hal-hal yang dapat dijadikan pembelajaran berkelanjutan bagi organisasi.", + needFile: false, + subAspectName: "Meningkatkan keamanan setelah terjadinya Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi mendokumentasikan kerentanan, ancaman, atau risiko yang baru ditemukan beserta rencana mitigasinya ke dalam dokumen pengelolaan risiko", + needFile: false, + subAspectName: "Meningkatkan keamanan setelah terjadinya Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Laporan hasil pelaksanaan forensik digital dikumpulkan dan dipelihara meliputi juga informasi-informasi yang relevan terhadapnya.", + needFile: false, + subAspectName: "Meningkatkan keamanan setelah terjadinya Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Laporan hasil pelaksanaan forensik digital dapat disampaikan kepada pihak berwajib untuk proses investigasi dan penegakkan hukum sesuai ketentuan yang berlaku", + needFile: false, + subAspectName: "Meningkatkan keamanan setelah terjadinya Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Organisasi melakukan peninjauan terhadap efektifitas kinerja penanganan insiden yang dilakukan oleh tim tanggap Insiden Siber secara berkala.", + needFile: false, + subAspectName: "Meningkatkan keamanan setelah terjadinya Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + { + question: "Melakukan langkah-langkah perbaikan yang diperlukan terhadap pelaksanaan penanganan Insiden Siber meliputi dari segi teknologi, tata kelola, atau peningkatan kapasistas SDM.", + needFile: false, + subAspectName: "Meningkatkan keamanan setelah terjadinya Insiden Siber", + aspectName: "Penanggulangan dan Pemulihan" + }, + // End of Penanggulangan dan Pemulihan + ]; + + console.log("Seeding questions..."); + + const memoizedSubAspectIds: Map = new Map(); + + for (let question of questionsData) { + // Unique key for memoization combining aspect and subAspect names + const memoKey = `${question.aspectName}-${question.subAspectName}`; + + // Check if sub aspect ID is already memoized + if (!memoizedSubAspectIds.has(memoKey)) { + const subAspect = ( + await db + .select({ id: subAspects.id }) + .from(subAspects) + // Join with aspects to filter by aspectName + .innerJoin(aspects, eq(subAspects.aspectId, aspects.id)) + .where( + and( + eq(subAspects.name, question.subAspectName), + eq(aspects.name, question.aspectName) + ) + ) + )[0]; + + if (!subAspect) { + throw new Error(`Sub Aspect ${question.subAspectName} with aspect ${question.aspectName} does not exist in the database`); + } + + memoizedSubAspectIds.set(memoKey, subAspect.id); + } + + const subAspectId = memoizedSubAspectIds.get(memoKey)!; + + // Check if the question already exists + const existingQuestion = await db + .select() + .from(questions) + .where(and(eq(questions.question as any, question.question as any), eq(questions.subAspectId, subAspectId))) + .limit(1); + + if (existingQuestion.length === 0) { + // If the questions does not exist, insert it + const insertedQuestion = ( + await db + .insert(questions) + .values({ + question: question.question, + needFile: question.needFile, + subAspectId: subAspectId + }) + .onConflictDoNothing() + .returning() + )[0]; + + if (insertedQuestion) { + console.log(`Question ${question.question} created and linked to sub aspect ${question.subAspectName}`); + } + } else { + console.log(`Question ${question.question} already exists`); + } + } +}; + +export default questionSeeder; diff --git a/apps/backend/src/drizzle/seeds/respondentsSeeder.ts b/apps/backend/src/drizzle/seeds/respondentsSeeder.ts new file mode 100644 index 0000000..f2769d3 --- /dev/null +++ b/apps/backend/src/drizzle/seeds/respondentsSeeder.ts @@ -0,0 +1,110 @@ +import db from ".."; +import { eq, and } from "drizzle-orm"; +import { users } from "../schema/users"; +import { respondents } from "../schema/respondents"; + +const respondentSeeder = async () => { + const respondentsData: (typeof respondents.$inferInsert & { userName: string })[] = [ + { + userName: "Respondent User 2", + companyName: "Company C", + position: "Employee", + workExperience: "4 years", + address: "Address D", + phoneNumber: "1234567890123", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + { + userName: "Respondent User 3", + companyName: "Company DD", + position: "Manager Account", + workExperience: "6 years", + address: "Address HRT", + phoneNumber: "1234567890123", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + { + userName: "Respondent User 4", + companyName: "Company FS", + position: "Developer", + workExperience: "8 years", + address: "Address HFD", + phoneNumber: "1234567890123", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, + { + userName: "Respondent User 5", + companyName: "Company DA", + position: "Start", + workExperience: "3 years", + address: "Address JWO", + phoneNumber: "1234567890123", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + }, +]; + + console.log("Seeding users and respondents..."); + + const memoizedUserIds: Map = new Map(); + + for (let respondent of respondentsData) { + if (!memoizedUserIds.has(respondent.userName)) { + const user = ( + await db + .select({ id: users.id }) + .from(users) + .where(eq(users.name, respondent.userName)) + )[0]; + + if (!user) { + throw new Error(`User ${respondent.userName} does not exist in the database`); + } + + memoizedUserIds.set(respondent.userName, user.id); + } + + const UserId = memoizedUserIds.get(respondent.userName)!; + + const existingRespondent = await db + .select() + .from(respondents) + .where(and(eq(respondents.companyName, respondent.userName), eq(respondents.userId, UserId))) + .limit(1); + + if (existingRespondent.length === 0) { + const insertedRespondent = ( + await db + .insert(respondents) + .values({ + companyName: respondent.companyName, + position: respondent.position, + workExperience: respondent.workExperience, + address: respondent.address, + phoneNumber: respondent.phoneNumber, + createdAt: respondent.createdAt, + updatedAt: respondent.updatedAt, + deletedAt: respondent.deletedAt, + userId: UserId, + }) + .onConflictDoNothing() + .returning() + )[0]; + + if (insertedRespondent) { + console.log(`Respondent ${respondent.companyName} created and linked to respondent ${respondent.userName}`); + } + } else { + console.log(`Respondent ${respondent.companyName} already exists`); + } + } +}; + +export default respondentSeeder; \ No newline at end of file diff --git a/apps/backend/src/drizzle/seeds/subAspectsSeeder.ts b/apps/backend/src/drizzle/seeds/subAspectsSeeder.ts new file mode 100644 index 0000000..9d23933 --- /dev/null +++ b/apps/backend/src/drizzle/seeds/subAspectsSeeder.ts @@ -0,0 +1,204 @@ +import { subAspects } from "../schema/subAspects"; +import db from ".."; +import { aspects } from "../schema/aspects"; +import { eq, and } from "drizzle-orm"; + +const subAspectSeeder = async () => { + const subAspectsData: (typeof subAspects.$inferInsert & { + aspectName: string; + })[] = [ + /////// Aspect 1 identifikasi + { + name: "Mengidentifikasi Peran dan tanggung jawab organisasi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + { + name: "Menyusun strategi, kebijakan, dan prosedur Pelindungan IIV", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + { + name: "Menilai dan mengelola risiko Keamanan Siber", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + { + name: "Mengelola aset informasi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + { + name: "Mengelola aset informasi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + { + name: "Mengelola risiko rantai pasok", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Identifikasi", + }, + /////// Aspect 2 Proteksi + { + name: "Mengelola identitas, autentikasi, dan kendali akses", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + { + name: "Melindungi aset fisik", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + { + name: "Melindungi data", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + { + name: "Melindungi aplikasi", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + { + name: "Melindungi jaringan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + { + name: "Melindungi sumber daya manusia", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Proteksi", + }, + /////// Aspect 3 Deteksi + { + name: "Mengelola deteksi Peristiwa Siber", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Deteksi", + }, + { + name: "Menganalisis anomali dan Peristiwa Siber", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Deteksi", + }, + { + name: "Memantau Peristiwa Siber berkelanjutan", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Deteksi", + }, + /////// Aspect 4 Gulih + { + name: "Menyusun perencanaan penanggulangan dan pemulihan Insiden Siber", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Penanggulangan dan Pemulihan", + }, + { + name: "Menganalisis dan melaporkan Insiden Siber", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Penanggulangan dan Pemulihan", + }, + { + name: "Melaksanakan penanggulangan dan pemulihan Insiden Siber", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Penanggulangan dan Pemulihan", + }, + { + name: "Meningkatkan keamanan setelah terjadinya Insiden Siber", + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null, + aspectName: "Penanggulangan dan Pemulihan", + }, + ]; + + console.log("Seeding subAspects..."); + + const memoizedAspectIds: Map = new Map(); + + for (let subAspect of subAspectsData) { + // Check if aspect ID is already memoized + if (!memoizedAspectIds.has(subAspect.aspectName)) { + const aspect = ( + await db + .select({ id: aspects.id }) + .from(aspects) + .where(eq(aspects.name, subAspect.aspectName)) + )[0]; + + if (!aspect) { + throw new Error(`Aspect ${subAspect.aspectName} does not exist in the database`); + } + + memoizedAspectIds.set(subAspect.aspectName, aspect.id); + } + + const aspectId = memoizedAspectIds.get(subAspect.aspectName)!; + + // Check if the subAspect already exists + const existingSubAspect = await db + .select() + .from(subAspects) + .where(and(eq(subAspects.name, subAspect.name), eq(subAspects.aspectId, aspectId))) + .limit(1); + + if (existingSubAspect.length === 0) { + // If the subAspect does not exist, insert it + const insertedSubAspect = ( + await db + .insert(subAspects) + .values({ + name: subAspect.name, + createdAt: subAspect.createdAt, + updatedAt: subAspect.updatedAt, + deletedAt: subAspect.deletedAt, + aspectId: aspectId + }) + .onConflictDoNothing() + .returning() + )[0]; + + if (insertedSubAspect) { + console.log(`SubAspect ${subAspect.name} created and linked to aspect ${subAspect.aspectName}`); + } + } else { + console.log(`SubAspect ${subAspect.name} already exists`); + } + } +}; + +export default subAspectSeeder; diff --git a/apps/backend/src/drizzle/seeds/userSeeder.ts b/apps/backend/src/drizzle/seeds/userSeeder.ts index db7f2c2..2a5ee78 100644 --- a/apps/backend/src/drizzle/seeds/userSeeder.ts +++ b/apps/backend/src/drizzle/seeds/userSeeder.ts @@ -11,8 +11,37 @@ const userSeeder = async () => { name: "Super Admin", password: await hashPassword("123456"), username: "superadmin", + email: "admin@admin.com", roles: ["super-admin"], }, + { + name: "Respondent User 2", + password: await hashPassword("123456"), + username: "respondentUser2", + email: "respondentUser2@gmail.com", + roles: ["user"], + }, + { + name: "Respondent User 3", + password: await hashPassword("123456"), + username: "respondentUser3", + email: "respondentUser3@gmail.com", + roles: ["user"], + }, + { + name: "Respondent User 4", + password: await hashPassword("123456"), + username: "respondentUser4", + email: "respondentUser4@gmail.com", + roles: ["user"], + }, + { + name: "Respondent User 5", + password: await hashPassword("123456"), + username: "respondentUser5", + email: "respondentUser5@gmail.com", + roles: ["user"], + }, ]; console.log("Seeding users..."); diff --git a/apps/backend/src/index.ts b/apps/backend/src/index.ts index c0fbe56..820fe77 100644 --- a/apps/backend/src/index.ts +++ b/apps/backend/src/index.ts @@ -3,6 +3,8 @@ import { configDotenv } from "dotenv"; import { Hono } from "hono"; import authRoutes from "./routes/auth/route"; import usersRoute from "./routes/users/route"; +import managementAspectsRoute from "./routes/managementAspect/route"; +import respondentsRoute from "./routes/register/route"; import { verifyAccessToken } from "./utils/authUtils"; import permissionRoutes from "./routes/permissions/route"; import { cors } from "hono/cors"; @@ -15,6 +17,12 @@ import DashboardError from "./errors/DashboardError"; import HonoEnv from "./types/HonoEnv"; import devRoutes from "./routes/dev/route"; import appEnv from "./appEnv"; +import questionsRoute from "./routes/questions/route"; +import assessmentResultRoute from "./routes/assessmentResult/route"; +import assessmentRequestRoute from "./routes/assessmentRequest/route"; +import forgotPasswordRoutes from "./routes/forgotPassword/route"; +import assessmentsRoute from "./routes/assessments/route"; +import assessmentsRequestManagementRoutes from "./routes/assessmentRequestManagement/route"; configDotenv(); @@ -78,11 +86,20 @@ const routes = app .route("/dashboard", dashboardRoutes) .route("/roles", rolesRoute) .route("/dev", devRoutes) + .route("/questions", questionsRoute) + .route("/management-aspect", managementAspectsRoute) + .route("/register", respondentsRoute) + .route("/assessmentResult", assessmentResultRoute) + .route("/assessmentRequest", assessmentRequestRoute) + .route("/forgot-password", forgotPasswordRoutes) + .route("/assessments", assessmentsRoute) + .route("/assessmentRequestManagement",assessmentsRequestManagementRoutes) .onError((err, c) => { if (err instanceof DashboardError) { return c.json( { message: err.message, + errorCode: err.errorCode, formErrors: err.formErrors, }, diff --git a/apps/backend/src/middlewares/authInfo.ts b/apps/backend/src/middlewares/authInfo.ts index 10514c2..957dc24 100644 --- a/apps/backend/src/middlewares/authInfo.ts +++ b/apps/backend/src/middlewares/authInfo.ts @@ -71,6 +71,7 @@ const authInfo = createMiddleware(async (c, next) => { // Setting the currentUser with fetched data c.set("currentUser", { + id: user[0].users.id, // Adding user ID here name: user[0].users.name, // Assuming the first result is the user permissions: Array.from(permissions), roles: Array.from(roles), diff --git a/apps/backend/src/routes/assessmentRequest/route.ts b/apps/backend/src/routes/assessmentRequest/route.ts new file mode 100644 index 0000000..977a4f4 --- /dev/null +++ b/apps/backend/src/routes/assessmentRequest/route.ts @@ -0,0 +1,278 @@ +import { eq, sql, ilike, and, desc} from "drizzle-orm"; +import { Hono } from "hono"; +import { z } from "zod"; +import db from "../../drizzle"; +import { respondents } from "../../drizzle/schema/respondents"; +import { assessments } from "../../drizzle/schema/assessments"; +import { users } from "../../drizzle/schema/users"; +import HonoEnv from "../../types/HonoEnv"; +import authInfo from "../../middlewares/authInfo"; +import { forbidden, notFound } from "../../errors/DashboardError"; +import checkPermission from "../../middlewares/checkPermission"; +import requestValidator from "../../utils/requestValidator"; +import { HTTPException } from "hono/http-exception"; +import { createId } from "@paralleldrive/cuid2"; +import { questions } from "../../drizzle/schema/questions"; +import { subAspects } from "../../drizzle/schema/subAspects"; +import { aspects } from "../../drizzle/schema/aspects"; +import { answers } from "../../drizzle/schema/answers"; +import { options } from "../../drizzle/schema/options"; + +const assessmentRequestRoute = new Hono() + .use(authInfo) + + // Get assessment request by user ID + .get( + "/", + checkPermission("assessmentRequest.read"), + requestValidator( + "query", + z.object({ + page: z.coerce.number().int().min(0).default(0), + limit: z.coerce.number().int().min(1).max(1000).default(10), + q: z.string().optional(), + }) + ), + async (c) => { + const currentUser = c.get("currentUser"); + const userId = currentUser?.id; // Get user ID of the currently logged in currentUser + + if (!userId) { + throw forbidden({ + message: "User not authenticated" + }); + } + const { page, limit, q } = c.req.valid("query"); + + // Query to count total data + const totalCountQuery = db + .select({ + count: sql`count(distinct ${assessments.id})`, + }) + .from(assessments) + .leftJoin(respondents, eq(assessments.respondentId, respondents.id)) + .leftJoin(users, eq(respondents.userId, users.id)) + .where( + and( + eq(users.id, userId), + q && q.trim() !== "" + ?sql`CAST(${assessments.status} AS TEXT) ILIKE ${'%' + q + '%'}` + : undefined + ) + ) + + const totalCountResult = await totalCountQuery; + const totalItems = totalCountResult[0]?.count || 0; + + // Query to get assessment data with pagination + const queryResult = await db + .select({ + userId: users.id, + name: users.name, + assessmentId: assessments.id, + tanggal: assessments.createdAt, + status: assessments.status, + respondentId: respondents.id, + }) + .from(users) + .leftJoin(respondents, eq(users.id, respondents.userId)) + .leftJoin(assessments, eq(respondents.id, assessments.respondentId)) + .where( + and( + eq(users.id, userId), + q && q.trim() !== "" + // ? ilike(sql`${assessments.status}::text`, `%${q}%`) // Cast status to text for ilike + ?sql`CAST(${assessments.status} AS TEXT) ILIKE ${'%' + q + '%'}` + : undefined + ) + ) + .orderBy(desc(assessments.createdAt)) + .offset(page * limit) + .limit(limit); + + + if (!queryResult[0]) throw notFound(); + + return c.json({ + data: queryResult, + _metadata: { + currentPage: page, + totalPages: Math.ceil(totalItems / limit), + totalItems, + perPage: limit, + }, + }); + } + ) + + // Post assessment request by user ID + .post( + "/", + checkPermission("assessmentRequest.create"), + requestValidator( + "json", + z.object({ + respondentId: z.string().min(1), // Ensure respondentId has at least one character + }) + ), + async (c) => { + const { respondentId } = c.req.valid("json"); + const currentUser = c.get("currentUser"); + const userId = currentUser?.id; // Get userId from currentUser stored in context + + if (!userId) { + return c.text("User not authenticated", 401); + } + + // Validate if respondent with respondentId exists + const respondent = await db + .select() + .from(respondents) + .where(and(eq(respondents.id, respondentId), eq(respondents.userId, userId))); + + if (!respondent.length) { + throw new HTTPException(404, { message: "Respondent not found or unauthorized." }); + } + + // Check if there is an assessment request with status "in progress" + const existingAssessment = await db + .select() + .from(assessments) + .where( + and( + eq(assessments.respondentId, respondentId), + eq(assessments.status, "dalam pengerjaan") + ) + ); + + if (!existingAssessment.length) { + const newAssessment = await db + .insert(assessments) + .values({ + id: createId(), + respondentId, + status: "menunggu konfirmasi", + reviewedAt: null, + reviewedBy: null, + verifiedBy: null, + verifiedAt: null, + createdAt: new Date(), + }) + .returning(); + + return c.json({ message: "Successfully submitted the assessment request", data: newAssessment }, 201); + + } + } + ) + + /*Update assessment status when the user clicks the start assessment button + and Post all answers for assessment by ID */ + .patch( + "/:assessmentId", + checkPermission("assessmentRequest.update"), + requestValidator( + "json", + z.object({ + status: z.enum([ + "menunggu konfirmasi", + "diterima", + "ditolak", + "dalam pengerjaan", + "belum diverifikasi", + "selesai", + ]).optional(), + }) + ), + async (c) => { + const currentUser = c.get("currentUser"); + const userId = currentUser?.id; + const { assessmentId } = c.req.param(); + const { status } = c.req.valid("json"); + + if (!userId) { + throw forbidden({ + message: "User not authenticated", + }); + } + + // Check if the assessment with the given assessmentId exists and belongs to the user + const existingAssessment = await db + .select() + .from(assessments) + .leftJoin(respondents, eq(assessments.respondentId, respondents.id)) + .where(and(eq(assessments.id, assessmentId), eq(respondents.userId, userId))); + + if (!existingAssessment.length) { + throw notFound({ + message: "Assessment not found or unauthorized.", + }); + } + + // Update assessment status to "dalam pengerjaan" + const updatedAssessment = await db + .update(assessments) + .set({ + status: status || "dalam pengerjaan", + }) + .where(eq(assessments.id, assessmentId)) + .returning(); + + // Get all questions with options related to the assessment by aspect and sub-aspect + const questionsWithOptions = await db + .select({ + questionId: questions.id, + }) + .from(questions) + .leftJoin(options, eq(questions.id, options.questionId)) + .where(sql`${options.id} IS NOT NULL`) // Filter only questions with options + .leftJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .leftJoin(aspects, eq(subAspects.aspectId, aspects.id)) + .groupBy(questions.id); + + if (!questionsWithOptions.length) { + throw notFound({ + message: "No questions found for this assessment.", + }); + } + + // Check answers that already have optionId + const existingAnswers = await db + .select({ + questionId: answers.questionId, + }) + .from(answers) + .where( + and(eq(answers.assessmentId, assessmentId), sql`${answers.optionId} IS NOT NULL`) + ); + + const existingAnswerIds = new Set(existingAnswers.map((answer) => answer.questionId)); + + // Create a list of new answers only for questions that have options and do not have existing answers + const answerRecords = questionsWithOptions + .filter((q) => !existingAnswerIds.has(q.questionId)) + .map((q) => ({ + id: createId(), + questionId: q.questionId, + optionId: null, + validationInformation: "", + assessmentId, + })); + + // Insert new answers with null values + if (answerRecords.length > 0) { + await db.insert(answers).values(answerRecords); + } + + return c.json({ + message: "Assessment status updated started successfully", + data: { + updatedAssessment, + answerRecords,} + }); + } + ) + + + +export default assessmentRequestRoute; \ No newline at end of file diff --git a/apps/backend/src/routes/assessmentRequestManagement/route.ts b/apps/backend/src/routes/assessmentRequestManagement/route.ts new file mode 100644 index 0000000..32e923d --- /dev/null +++ b/apps/backend/src/routes/assessmentRequestManagement/route.ts @@ -0,0 +1,217 @@ +import { and, eq, ilike, or, sql, asc, inArray } from "drizzle-orm"; +import { Hono } from "hono"; +import checkPermission from "../../middlewares/checkPermission"; +import { z } from "zod"; +import { HTTPException } from "hono/http-exception"; +import db from "../../drizzle"; +import { assessments } from "../../drizzle/schema/assessments"; +import { respondents } from "../../drizzle/schema/respondents"; +import { users } from "../../drizzle/schema/users"; +import HonoEnv from "../../types/HonoEnv"; +import requestValidator from "../../utils/requestValidator"; +import authInfo from "../../middlewares/authInfo"; + +export const assessmentFormSchema = z.object({ + respondentId: z.string().min(1), + status: z.enum(["menunggu konfirmasi", "diterima", "ditolak", "dalam pengerjaan", "belum diverifikasi", "selesai"]), + reviewedBy: z.string().min(1), + verifiedBy: z.string().min(1), + verifiedAt: z.string().optional(), +}); + +export const assessmentUpdateSchema = assessmentFormSchema.extend({ + verifiedAt: z.string().optional().or(z.literal("")), +}); + +const assessmentsRequestManagementRoutes = new Hono() + .use(authInfo) + /** + * Get All Assessments (With Metadata) + * + * Query params: + * - withMetadata: boolean + */ + .get( + "/", + checkPermission("assessmentRequestManagement.readAll"), + requestValidator( + "query", + z.object({ + withMetadata: z + .string() + .optional() + .transform((v) => v?.toLowerCase() === "true"), + page: z.coerce.number().int().min(0).default(0), + limit: z.coerce.number().int().min(1).max(1000).default(10), + q: z.string().default(""), + }) + ), + async (c) => { + const { page, limit, q } = c.req.valid("query"); + + const validStatuses = [ + "dalam pengerjaan", + "menunggu konfirmasi", + "diterima", + "ditolak", + ] as ("menunggu konfirmasi" | "diterima" | "ditolak" | "dalam pengerjaan")[]; + + // Query untuk menghitung total jumlah item (totalCountQuery) + const assessmentCountQuery = await db + .select({ + count: sql`count(*)`, + }) + .from(assessments) + .leftJoin(respondents, eq(assessments.respondentId, respondents.id)) + .leftJoin(users, eq(respondents.userId, users.id)) + .where( + and( + inArray(assessments.status, validStatuses), + q + ? or( + ilike(users.name, `%${q}%`), + ilike(respondents.companyName, `%${q}%`), + sql`CAST(${assessments.status} AS TEXT) ILIKE ${'%' + q + '%'}`, + eq(assessments.id, q) + ) + : undefined + ) + ); + + const totalItems = Number(assessmentCountQuery[0]?.count) || 0; + + // Query utama untuk mendapatkan data permohonan assessment + const result = await db + .select({ + idPermohonan: assessments.id, + namaResponden: users.name, + namaPerusahaan: respondents.companyName, + status: assessments.status, + tanggal: assessments.createdAt, + }) + .from(assessments) + .leftJoin(respondents, eq(assessments.respondentId, respondents.id)) + .leftJoin(users, eq(respondents.userId, users.id)) + .where( + and( + inArray(assessments.status, validStatuses), + q + ? or( + ilike(users.name, `%${q}%`), + ilike(respondents.companyName, `%${q}%`), + sql`CAST(${assessments.status} AS TEXT) ILIKE ${'%' + q + '%'}`, + eq(assessments.id, q) + ) + : undefined + ) + ) + .orderBy( + sql` + CASE + WHEN ${assessments.status} = 'menunggu konfirmasi' THEN 1 + WHEN ${assessments.status} = 'dalam pengerjaan' THEN 2 + WHEN ${assessments.status} = 'diterima' THEN 3 + WHEN ${assessments.status} = 'ditolak' THEN 4 + ELSE 5 + END + `, + asc(assessments.createdAt) + ) + .offset(page * limit) + .limit(limit); + + return c.json({ + data: result.map((d) => ({ + idPermohonan: d.idPermohonan, + namaResponden: d.namaResponden, + namaPerusahaan: d.namaPerusahaan, + status: d.status, + tanggal: d.tanggal, + })), + _metadata: { + currentPage: page, + totalPages: Math.ceil(totalItems / limit), + totalItems, + perPage: limit, + }, + }); + } + ) + + // Get assessment by id + .get( + "/:id", + checkPermission("assessmentRequestManagement.read"), + async (c) => { + const assessmentId = c.req.param("id"); + + const queryResult = await db + .select({ + tanggal: assessments.createdAt, + nama: users.name, + posisi: respondents.position, + pengalamanKerja: respondents.workExperience, + email: users.email, + namaPerusahaan: respondents.companyName, + alamat: respondents.address, + nomorTelepon: respondents.phoneNumber, + username: users.username, + status: assessments.status, + }) + .from(assessments) + .leftJoin(respondents, eq(assessments.respondentId, respondents.id)) + .leftJoin(users, eq(respondents.userId, users.id)) + .where(eq(assessments.id, assessmentId)); + + if (!queryResult.length) + throw new HTTPException(404, { + message: "The assessment does not exist", + }); + + const assessmentData = queryResult[0]; + + return c.json(assessmentData); + } + ) + + .patch( + "/:id", + checkPermission("assessmentRequestManagement.update"), + requestValidator( + "json", + z.object({ + status: z.enum(["menunggu konfirmasi", "diterima", "ditolak", "dalam pengerjaan", "belum diverifikasi", "selesai"]), + }) + ), + async (c) => { + const assessmentId = c.req.param("id"); + const { status } = c.req.valid("json"); + const userName = c.var.currentUser?.name; + + const assessment = await db + .select() + .from(assessments) + .where(and(eq(assessments.id, assessmentId),)); + + if (!assessment[0]) throw new HTTPException(404, { + message: "Assessment tidak ditemukan.", + }); + + const currentDate = new Date(); + + await db + .update(assessments) + .set({ + status, + reviewedBy: userName, + reviewedAt: currentDate, + }) + .where(eq(assessments.id, assessmentId)); + + return c.json({ + message: "Status assessment berhasil diperbarui.", + }); + } + ) + +export default assessmentsRequestManagementRoutes; diff --git a/apps/backend/src/routes/assessmentResult/route.ts b/apps/backend/src/routes/assessmentResult/route.ts new file mode 100644 index 0000000..a4b17e4 --- /dev/null +++ b/apps/backend/src/routes/assessmentResult/route.ts @@ -0,0 +1,620 @@ +import { and, eq, ilike, isNull, or, sql } from "drizzle-orm"; +import { Hono } from "hono"; +import { z } from "zod"; +import db from "../../drizzle"; +import { assessments, statusEnum } from "../../drizzle/schema/assessments"; +import { respondents } from "../../drizzle/schema/respondents"; +import { users } from "../../drizzle/schema/users"; +import { aspects } from "../../drizzle/schema/aspects"; +import { subAspects } from "../../drizzle/schema/subAspects"; +import { questions } from "../../drizzle/schema/questions"; +import { options } from "../../drizzle/schema/options"; +import { answers } from "../../drizzle/schema/answers"; +import { answerRevisions } from "../../drizzle/schema/answerRevisions"; +import HonoEnv from "../../types/HonoEnv"; +import authInfo from "../../middlewares/authInfo"; +import checkPermission from "../../middlewares/checkPermission"; +import requestValidator from "../../utils/requestValidator"; +import { notFound } from "../../errors/DashboardError"; + +// optionFormSchema: untuk /submitOption +export const optionFormSchema = z.object({ + optionId: z.string().min(1), + assessmentId: z.string().min(1), + questionId: z.string().min(1), + isFlagged: z.boolean().optional().default(false), + filename: z.string().optional(), +}); + +// validationFormSchema: untuk /submitValidation +export const validationFormSchema = z.object({ + assessmentId: z.string().min(1), + questionId: z.string().min(1), + newValidationInformation: z.string().min(1, "Validation information is required"), +}); + +const assessmentRoute = new Hono() + .use(authInfo) + + // Get All List of Assessment Results + .get( + "/", + checkPermission("assessmentResult.readAll"), + requestValidator( + "query", + z.object({ + withMetadata: z + .string() + .optional() + .transform((v) => v?.toLowerCase() === "true"), + page: z.coerce.number().int().min(0).default(0), + limit: z.coerce.number().int().min(1).max(1000).default(40), + q: z.string().default(""), + }) + ), + async (c) => { + const { page, limit, q } = c.req.valid("query"); + const totalItems = await db + .select({ + count: sql`COUNT(*)`, + }) + .from(assessments) + .leftJoin(respondents, eq(assessments.respondentId, respondents.id)) + .leftJoin(users, eq(respondents.userId, users.id)) + .where( + and( + or( + q ? or( + ilike(users.name, q), + ilike(respondents.companyName, q) + ) : undefined, + ), + or( + eq(assessments.status, 'belum diverifikasi'), + eq(assessments.status, 'selesai') + ) + ) + ); + + const result = await db + .select({ + id: assessments.id, + respondentName: users.name, + companyName: respondents.companyName, + statusAssessments: assessments.status, + statusVerification: sql` + CASE + WHEN ${assessments.verifiedAt} IS NOT NULL THEN 'sudah diverifikasi' + ELSE 'belum diverifikasi' + END` + .as("statusVerification"), + assessmentsResult: sql` + (SELECT ROUND(AVG(${options.score}), 2) + FROM ${answers} + JOIN ${options} ON ${options.id} = ${answers.optionId} + JOIN ${questions} ON ${questions.id} = ${options.questionId} + JOIN ${subAspects} ON ${subAspects.id} = ${questions.subAspectId} + JOIN ${aspects} ON ${aspects.id} = ${subAspects.aspectId} + WHERE ${answers.assessmentId} = ${assessments.id})` + .as("assessmentsResult"), + }) + .from(assessments) + .leftJoin(respondents, eq(assessments.respondentId, respondents.id)) + .leftJoin(users, eq(respondents.userId, users.id)) + .where( + and( + or( + q ? or( + ilike(users.name, q), + ilike(respondents.companyName, q), + ) : undefined, + ), + or( + eq(assessments.status, 'belum diverifikasi'), + eq(assessments.status, 'selesai') + ) + ) + ) + .orderBy( + sql`CASE + WHEN ${assessments.status} = 'belum diverifikasi' THEN 1 + WHEN ${assessments.status} = 'selesai' THEN 2 + ELSE 3 + END` + ) + .offset(page * limit) + .limit(limit); + const totalCountResult = await totalItems; + const totalCount = totalCountResult[0]?.count || 0; + return c.json({ + data: result, + _metadata: { + currentPage: page, + totalPages: Math.ceil(totalCount / limit), + totalItems: totalCount, + perPage: limit, + }, + }); + } + ) + + // Get Assessment Result by ID + .get( + "/:id", + checkPermission("assessmentResult.read"), + async (c) => { + const assessmentId = c.req.param("id"); + + const result = await db + .select({ + respondentName: users.name, + position: respondents.position, + workExperience: respondents.workExperience, + email: users.email, + companyName: respondents.companyName, + address: respondents.address, + phoneNumber: respondents.phoneNumber, + username: users.username, + assessmentDate: assessments.createdAt, + statusAssessment: assessments.status, + statusVerification: sql` + CASE + WHEN ${assessments.verifiedAt} IS NOT NULL THEN 'sudah diverifikasi' + ELSE 'belum diverifikasi' + END` + .as("statusVerification"), + assessmentsResult: sql` + (SELECT ROUND(AVG(${options.score}), 2) + FROM ${answers} + JOIN ${options} ON ${options.id} = ${answers.optionId} + JOIN ${questions} ON ${questions.id} = ${options.questionId} + JOIN ${subAspects} ON ${subAspects.id} = ${questions.subAspectId} + JOIN ${aspects} ON ${aspects.id} = ${subAspects.aspectId} + WHERE ${answers.assessmentId} = ${assessments.id})` + .as("assessmentsResult"), + }) + .from(assessments) + .leftJoin(respondents, eq(assessments.respondentId, respondents.id)) + .leftJoin(users, eq(respondents.userId, users.id)) + .where(eq(assessments.id, assessmentId)); + + if (!result.length) { + throw notFound({ + message: "Assessment not found", + }); + } + + return c.json(result[0]); + } + ) + + .get( + "/verified/:id", + checkPermission("assessmentResult.read"), + async (c) => { + const assessmentId = c.req.param("id"); + + const result = await db + .select({ + respondentName: users.name, + position: respondents.position, + workExperience: respondents.workExperience, + email: users.email, + companyName: respondents.companyName, + address: respondents.address, + phoneNumber: respondents.phoneNumber, + username: users.username, + assessmentDate: assessments.createdAt, + statusAssessment: assessments.status, + statusVerification: sql` + CASE + WHEN ${assessments.verifiedAt} IS NOT NULL THEN 'sudah diverifikasi' + ELSE 'belum diverifikasi' + END`.as("statusVerification"), + verifiedAssessmentsResult: sql` + (SELECT ROUND(AVG(${options.score}), 2) + FROM ${answerRevisions} + JOIN ${answers} ON ${answers.id} = ${answerRevisions.answerId} + JOIN ${options} ON ${options.id} = ${answerRevisions.newOptionId} + JOIN ${questions} ON ${questions.id} = ${options.questionId} + JOIN ${subAspects} ON ${subAspects.id} = ${questions.subAspectId} + JOIN ${aspects} ON ${aspects.id} = ${subAspects.aspectId} + WHERE ${answers.assessmentId} = ${assessments.id})`.as("verifiedAssessmentsResult"), + }) + .from(assessments) + .leftJoin(respondents, eq(assessments.respondentId, respondents.id)) + .leftJoin(users, eq(respondents.userId, users.id)) + .where(eq(assessments.id, assessmentId)); + + if (!result.length) { + throw notFound({ + message: "Assessment not found", + }); + } + + return c.json(result[0]); + } + ) + + // Get all Questions and Options that relate to Sub Aspects and Aspects based on Assessment ID + .get( + "getAllQuestion/:id", + checkPermission("assessmentResult.readAllQuestions"), + async (c) => { + const assessmentId = c.req.param("id"); + + if (!assessmentId) { + throw notFound({ + message: "Assessment ID is missing", + }); + } + + // Total count of options related to the assessment + const totalCountQuery = sql` + SELECT count(*) + FROM ${options} + LEFT JOIN ${questions} ON ${options.questionId} = ${questions.id} + LEFT JOIN ${subAspects} ON ${questions.subAspectId} = ${subAspects.id} + LEFT JOIN ${aspects} ON ${subAspects.aspectId} = ${aspects.id} + LEFT JOIN ${answers} ON ${options.id} = ${answers.optionId} + WHERE ${questions.deletedAt} IS NULL + AND ${answers.assessmentId} = ${assessmentId} + `; + + // Query to get detailed information about options + const result = await db + .select({ + optionId: options.id, + aspectsId: aspects.id, + aspectsName: aspects.name, + subAspectId: subAspects.id, + subAspectName: subAspects.name, + questionId: questions.id, + questionText: questions.question, + answerId: answers.id, + answerText: options.text, + answerScore: options.score, + }) + .from(options) + .leftJoin(questions, eq(options.questionId, questions.id)) + .leftJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .leftJoin(aspects, eq(subAspects.aspectId, aspects.id)) + .leftJoin(answers, eq(options.id, answers.optionId)) + .where(sql`${questions.deletedAt} IS NULL AND ${answers.assessmentId} = ${assessmentId}`); + + // Execute the total count query + const totalCountResult = await db.execute(totalCountQuery); + + if (result.length === 0) { + throw notFound({ + message: "Data does not exist", + }); + } + + return c.json({ + data: result, + totalCount: totalCountResult[0]?.count || 0 + }); + } + ) + + .get( + '/average-score/sub-aspects/assessments/:assessmentId', + checkPermission("assessments.readAverageSubAspect"), + async (c) => { + const { assessmentId } = c.req.param(); + + const averageScores = await db + .select({ + aspectId: subAspects.aspectId, + subAspectId: subAspects.id, + subAspectName: subAspects.name, + average: sql`AVG(options.score)` + }) + .from(answerRevisions) + .innerJoin(answers, eq(answers.id, answerRevisions.answerId)) + .innerJoin(options, eq(answerRevisions.newOptionId, options.id)) + .innerJoin(questions, eq(options.questionId, questions.id)) + .innerJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .innerJoin(assessments, eq(answers.assessmentId, assessments.id)) + .where(eq(assessments.id, assessmentId)) + .groupBy(subAspects.id); + + return c.json({ + assessmentId, + subAspects: averageScores.map(score => ({ + subAspectId: score.subAspectId, + subAspectName: score.subAspectName, + averageScore: score.average, + aspectId: score.aspectId + })) + }); + } + ) + + .get( + '/average-score/aspects/assessments/:assessmentId', + checkPermission("assessments.readAverageAspect"), + async (c) => { + const { assessmentId } = c.req.param(); + + // Query untuk mendapatkan average score per aspect + const aspectScores = await db + .select({ + aspectId: aspects.id, + aspectName: aspects.name, + averageScore: sql`AVG(options.score)`, + }) + .from(answerRevisions) + .innerJoin(answers, eq(answers.id, answerRevisions.answerId)) + .innerJoin(options, eq(answerRevisions.newOptionId, options.id)) + .innerJoin(questions, eq(options.questionId, questions.id)) + .innerJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .innerJoin(aspects, eq(subAspects.aspectId, aspects.id)) + .innerJoin(assessments, eq(answers.assessmentId, assessments.id)) + .where(eq(assessments.id, assessmentId)) + .groupBy(aspects.id); + + // Query untuk mendapatkan average score per sub-aspect + const subAspectScores = await db + .select({ + aspectId: subAspects.aspectId, + subAspectId: subAspects.id, + subAspectName: subAspects.name, + averageScore: sql`AVG(options.score)`, + }) + .from(answerRevisions) + .innerJoin(answers, eq(answers.id, answerRevisions.answerId)) + .innerJoin(options, eq(answerRevisions.newOptionId, options.id)) + .innerJoin(questions, eq(options.questionId, questions.id)) + .innerJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .innerJoin(assessments, eq(answers.assessmentId, assessments.id)) + .where(eq(assessments.id, assessmentId)) + .groupBy(subAspects.id); + + // Menggabungkan sub-aspects ke dalam masing-masing aspect + const aspectsWithSubAspects = aspectScores.map((aspect) => ({ + aspectId: aspect.aspectId, + aspectName: aspect.aspectName, + averageScore: aspect.averageScore, + subAspects: subAspectScores + .filter((sub) => sub.aspectId === aspect.aspectId) + .map((sub) => ({ + subAspectId: sub.subAspectId, + subAspectName: sub.subAspectName, + averageScore: sub.averageScore, + })), + })); + + return c.json({ + assessmentId, + aspects: aspectsWithSubAspects, + }); + } + ) + + // Get all Answers Data by Assessment Id + .get( + "/getAnswers/:id", + checkPermission("assessments.readAnswers"), + async (c) => { + const assessmentId = c.req.param("id").toString(); + + // Query to count total answers for the specific assessmentId + const totalCountQuery = sql`(SELECT count(*) + FROM ${answerRevisions} + JOIN ${answers} ON ${answers.id} = ${answerRevisions.answerId} + JOIN ${assessments} ON ${answers.assessmentId} = ${assessments.id} + WHERE ${assessments.id} = ${assessmentId})`; + + // Query to retrieve answers for the specific assessmentId + const result = await db + .select({ + id: answerRevisions.id, + answerId: answerRevisions.answerId, + newOptionId: answerRevisions.newOptionId, + newValidationInformation: answerRevisions.newValidationInformation, + questionId: options.questionId, + fullCount: totalCountQuery, + }) + .from(answerRevisions) + .leftJoin(answers, eq(answers.id, answerRevisions.answerId)) + .leftJoin(options, eq(answerRevisions.newOptionId, options.id)) + .leftJoin(assessments, eq(answers.assessmentId, assessments.id)) + .where(eq(assessments.id, assessmentId), + ) + + return c.json({ + data: result.map((d) => ({ ...d, fullCount: undefined })), + }); + } + ) + + // POST Endpoint for creating multiple answer revisions based on assessmentId +.post( + "/answer-revisions", + checkPermission("assessmentResult.create"), + requestValidator( + "json", + z.object({ + assessmentId: z.string(), + revisedBy: z.string(), // assuming this will come from the session or auth context + }) + ), + async (c) => { + const { assessmentId, revisedBy } = c.req.valid("json"); + + // Fetch answers related to the given assessmentId + const existingAnswers = await db + .select() + .from(answers) + .where(eq(answers.assessmentId, assessmentId)); + + if (!existingAnswers.length) { + throw notFound({ + message: "No answers found for the given assessment ID", + }); + } + + // Fetch already existing revisions for the given answer IDs + const existingRevisions = await db + .select({ answerId: answerRevisions.answerId }) + .from(answerRevisions) + .where( + or( + ...existingAnswers.map((answer) => + eq(answerRevisions.answerId, answer.id) + ) + ) + ); + + // Create a Set of existing revision IDs for quick lookup + const existingRevisionIds = new Set( + existingRevisions.map(revision => revision.answerId) + ); + + // Prepare revisions to be inserted, excluding those that already exist + const revisions = existingAnswers + .filter(answer => !existingRevisionIds.has(answer.id)) // Filter out existing revisions + .map(answer => ({ + answerId: answer.id, + newOptionId: answer.optionId, // Assuming you want to keep the existing optionId + newValidationInformation: answer.validationInformation, // Keep the existing validation information + revisedBy: revisedBy + })); + + if (revisions.length === 0) { + return c.json({ + message: "No new revisions to create, as all answers are already revised.", + }); + } + + // Insert all new revisions in a single operation + const newRevisions = await db + .insert(answerRevisions) + .values(revisions) + .returning(); + + return c.json( + { + message: "Answer revisions created successfully", + data: newRevisions, + }, + 201 + ); + } +) + + .patch( + "/:id", + checkPermission("assessmentResult.update"), + async (c) => { + const assessmentId = c.req.param("id"); + + if (!assessmentId) { + throw notFound({ + message: "Assessment tidak ada", + }); + } + + const assessment = await db + .select() + .from(assessments) + .where(and(eq(assessments.id, assessmentId))); + + if (!assessment[0]) throw notFound(); + + await db + .update(assessments) + .set({ + verifiedAt: new Date(), + }) + .where(eq(assessments.id, assessmentId)); + console.log("Verified Success"); + + return c.json({ + message: "Assessment berhasil diverifikasi", + data: assessment, + }); + } + ) + + .patch( + "/submitAssessmentRevision/:id", + checkPermission("assessments.submitAssessment"), + async (c) => { + const assessmentId = c.req.param("id"); + const status = "selesai"; + + const assessment = await db + .select() + .from(assessments) + .where(and(eq(assessments.id, assessmentId),)); + + if (!assessment[0]) { + throw notFound({ + message: "Assessment not found.", + }); + } + + await db + .update(assessments) + .set({ + status, + }) + .where(eq(assessments.id, assessmentId)); + + return c.json({ + message: "Status assessment berhasil diperbarui.", + }); + } + ) + +.post( + "/updateValidation", + checkPermission("assessments.submitValidation"), + requestValidator("json", validationFormSchema), + async (c) => { + const validationData = c.req.valid("json"); + + // Cek apakah jawaban ada berdasarkan assessmentId dan questionId + const [targetAnswer] = await db + .select({ id: answers.id }) + .from(answers) + .leftJoin(options, eq(answers.optionId, options.id)) + .where( + sql`answers."assessmentId" = ${validationData.assessmentId} + AND options."questionId" = ${validationData.questionId}` + ) + .limit(1); + + if (!targetAnswer) { + return c.json( + { message: "Answer not found for given assessmentId and questionId" }, + 404 + ); + } + + // Dapatkan tanggal dan waktu saat ini + const currentDate = new Date(); + + // Update dengan melakukan JOIN yang sama + const [updatedRevision] = await db + .update(answerRevisions) + .set({ + newValidationInformation: validationData.newValidationInformation, + }) + .where(sql`"answerId" = ${targetAnswer.id}`) + .returning(); + + return c.json( + { + message: "Revision updated successfully", + revision: updatedRevision, // Revisi yang baru saja diperbarui + }, + 200 + ); + } +) + +export default assessmentRoute; diff --git a/apps/backend/src/routes/assessments/route.ts b/apps/backend/src/routes/assessments/route.ts new file mode 100644 index 0000000..9f83ea5 --- /dev/null +++ b/apps/backend/src/routes/assessments/route.ts @@ -0,0 +1,779 @@ +import { and, eq, ilike, isNull, inArray, or, sql, is } from "drizzle-orm"; +import { Hono } from "hono"; +import { z } from "zod"; +import db from "../../drizzle"; +import { answers } from "../../drizzle/schema/answers"; +import { options } from "../../drizzle/schema/options"; +import { questions } from "../../drizzle/schema/questions"; +import { subAspects } from "../../drizzle/schema/subAspects"; +import { aspects } from "../../drizzle/schema/aspects"; +import { assessments } from "../../drizzle/schema/assessments"; +import HonoEnv from "../../types/HonoEnv"; +import requestValidator from "../../utils/requestValidator"; +import authInfo from "../../middlewares/authInfo"; +import checkPermission from "../../middlewares/checkPermission"; +import path from "path"; +import fs from 'fs'; +import { notFound } from "../../errors/DashboardError"; +import { answerRevisions } from "../../drizzle/schema/answerRevisions"; + +export const answerFormSchema = z.object({ + optionId: z.string().min(1), + assessmentId: z.string().min(1), + isFlagged: z.boolean().optional().default(false), + filename: z.string().optional(), + validationInformation: z.string().min(1), +}); + +// optionFormSchema: untuk /submitOption +export const optionFormSchema = z.object({ + optionId: z.string().min(1), + assessmentId: z.string().min(1), + questionId: z.string().min(1), + isFlagged: z.boolean().optional().default(false), + filename: z.string().optional(), +}); + +// newOptionFormSchema: untuk /updateOption +export const newOptionFormSchema = z.object({ + newOptionId: z.string().min(1), + assessmentId: z.string().min(1), + questionId: z.string().min(1), +}); + +// validationFormSchema: untuk /submitValidation +export const validationFormSchema = z.object({ + assessmentId: z.string().min(1), + questionId: z.string().min(1), + validationInformation: z.string().min(1, "Validation information is required"), +}); + +// newValidationFormSchema: untuk /updateValidation +export const newValidationFormSchema = z.object({ + assessmentId: z.string().min(1), + questionId: z.string().min(1), + newValidationInformation: z.string().min(1, "Validation information is required"), +}); + +// validationFormSchema: untuk /submitValidation +export const flagFormSchema = z.object({ + assessmentId: z.string().min(1), + questionId: z.string().min(1), + isFlagged: z.boolean().optional().default(false), +}); + +export const answerUpdateSchema = answerFormSchema.partial(); + +// Helper untuk menyimpan file +async function saveFile(filePath: string, fileBuffer: Buffer): Promise { + await fs.promises.writeFile(filePath, fileBuffer); +} + +// Cari answer berdasarkan assessmentId dan questionId +async function findAnswerId(assessmentId: string, questionId: string): Promise { + const result = await db + .select({ answerId: answers.id }) + .from(answers) + .leftJoin(options, eq(answers.optionId, options.id)) + .where( + and( + eq(answers.assessmentId, assessmentId), + eq(options.questionId, questionId) + ) + ) + .limit(1); + + return result.length > 0 ? result[0].answerId : null; +} + +// Update filename di tabel answers +async function updateFilename(answerId: string, filename: string): Promise { + // Dapatkan tanggal dan waktu saat ini + const currentDate = new Date(); + + await db + .update(answers) + .set({ + filename, + updatedAt: currentDate, + }) + .where(eq(answers.id, answerId)); +} + +const assessmentsRoute = new Hono() + .use(authInfo) + + // Get all aspects + .get( + "/aspect", + checkPermission("assessments.readAspect"), + requestValidator( + "query", + z.object({ + includeTrashed: z + .string() + .optional() + .transform((v) => v?.toLowerCase() === "true"), + withMetadata: z + .string() + .optional() + .transform((v) => v?.toLowerCase() === "true"), + page: z.coerce.number().int().min(0).default(0), + limit: z.coerce.number().int().min(1).max(1000).default(10), + q: z.string().default(""), + }) + ), + async (c) => { + const { includeTrashed, page, limit, q } = c.req.valid("query"); + + const totalCountQuery = includeTrashed + ? sql`(SELECT count(DISTINCT ${aspects.id}) FROM ${aspects})` + : sql`(SELECT count(DISTINCT ${aspects.id}) FROM ${aspects} WHERE ${aspects.deletedAt} IS NULL)`; + + const aspectIdsQuery = await db + .select({ + id: aspects.id, + }) + .from(aspects) + .where( + and( + includeTrashed ? undefined : isNull(aspects.deletedAt), + q ? or(ilike(aspects.name, q), eq(aspects.id, q)) : undefined + ) + ) + .offset(page * limit) + .limit(limit); + + const aspectIds = aspectIdsQuery.map(a => a.id); + + if (aspectIds.length === 0) { + return c.json({ + data: [], + _metadata: { + currentPage: page, + totalPages: 0, + totalItems: 0, + perPage: limit, + }, + }); + } + + // Main query to get aspects, sub-aspects, and number of questions + const result = await db + .select({ + id: aspects.id, + name: aspects.name, + createdAt: aspects.createdAt, + updatedAt: aspects.updatedAt, + ...(includeTrashed ? { deletedAt: aspects.deletedAt } : {}), + subAspectId: subAspects.id, + subAspectName: subAspects.name, + // Increase the number of questions related to sub aspects + questionCount: sql`( + SELECT count(*) + FROM ${questions} + WHERE ${questions.subAspectId} = ${subAspects.id} + )`.as('questionCount'), + fullCount: totalCountQuery, + }) + .from(aspects) + .leftJoin(subAspects, eq(subAspects.aspectId, aspects.id)) + .where(inArray(aspects.id, aspectIds)); + + // Grouping sub aspects by aspect ID + const groupedResult = result.reduce((acc, curr) => { + const aspectId = curr.id; + + if (!acc[aspectId]) { + acc[aspectId] = { + id: curr.id, + name: curr.name, + createdAt: curr.createdAt ? new Date(curr.createdAt).toISOString() : null, + updatedAt: curr.updatedAt ? new Date(curr.updatedAt).toISOString() : null, + subAspects: curr.subAspectName + ? [{ id: curr.subAspectId!, name: curr.subAspectName, questionCount: curr.questionCount }] + : [], + }; + } else { + if (curr.subAspectName) { + const exists = acc[aspectId].subAspects.some(sub => sub.id === curr.subAspectId); + if (!exists) { + acc[aspectId].subAspects.push({ + id: curr.subAspectId!, + name: curr.subAspectName, + questionCount: curr.questionCount, + }); + } + } + } + + return acc; + }, {} as Record); + + const groupedArray = Object.values(groupedResult); + + return c.json({ + data: groupedArray, + _metadata: { + currentPage: page, + totalPages: Math.ceil((Number(result[0]?.fullCount) ?? 0) / limit), + totalItems: Number(result[0]?.fullCount) ?? 0, + perPage: limit, + }, + }); + } + ) + + // Get all Questions and Options that relate to Sub Aspects and Aspects + .get( + "/getAllQuestions", + checkPermission("assessments.readAllQuestions"), + async (c) => { + // Definisikan tipe untuk hasil query dan izinkan nilai null + type QuestionWithOptions = { + aspectsId: string | null; + aspectsName: string | null; + subAspectId: string | null; + subAspectName: string | null; + questionId: string | null; + questionText: string | null; + optionId: string; + optionText: string; + needFile: boolean | null; + optionScore: number; + fullCount?: number; + }; + + const totalCountQuery = + sql`(SELECT count(*) + FROM ${options} + LEFT JOIN ${questions} ON ${options.questionId} = ${questions.id} + LEFT JOIN ${subAspects} ON ${questions.subAspectId} = ${subAspects.id} + LEFT JOIN ${aspects} ON ${subAspects.aspectId} = ${aspects.id} + WHERE ${questions.deletedAt} IS NULL + )`; + + // Sesuaikan tipe hasil query + const result: QuestionWithOptions[] = await db + .select({ + aspectsId: aspects.id, + aspectsName: aspects.name, + subAspectId: subAspects.id, + subAspectName: subAspects.name, + questionId: questions.id, + questionText: questions.question, + optionId: options.id, + optionText: options.text, + needFile: questions.needFile, + optionScore: options.score, + fullCount: totalCountQuery, + }) + .from(options) + .leftJoin(questions, eq(options.questionId, questions.id)) + .leftJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .leftJoin(aspects, eq(subAspects.aspectId, aspects.id)) + .where(sql`${questions.deletedAt} IS NULL`); + + // Definisikan tipe untuk hasil pengelompokan + type GroupedQuestion = { + questionId: string | null; + questionText: string | null; + needFile: boolean | null; + aspectsId: string | null; + aspectsName: string | null; + subAspectId: string | null; + subAspectName: string | null; + options: { + optionId: string; + optionText: string; + optionScore: number; + }[]; + }; + + // Mengelompokkan berdasarkan questionId + const groupedResult: GroupedQuestion[] = result.reduce((acc, current) => { + const { questionId, questionText, needFile, aspectsId, aspectsName, subAspectId, subAspectName, optionId, optionText, optionScore } = current; + + // Cek apakah questionId sudah ada dalam accumulator + const existingQuestion = acc.find(q => q.questionId === questionId); + + if (existingQuestion) { + // Tambahkan opsi baru ke array options dari pertanyaan yang ada + existingQuestion.options.push({ + optionId, + optionText, + optionScore + }); + } else { + // Jika pertanyaan belum ada, tambahkan objek baru + acc.push({ + questionId, + questionText, + needFile, + aspectsId, + aspectsName, + subAspectId, + subAspectName, + options: [ + { + optionId, + optionText, + optionScore + } + ] + }); + } + + return acc; + }, [] as GroupedQuestion[]); // Pastikan tipe untuk accumulator didefinisikan + + return c.json({ + data: groupedResult, + }); + } + ) + + // Get all Answers Data by Assessment Id + .get( + "/getAnswers", + checkPermission("assessments.readAnswers"), + requestValidator( + "query", + z.object({ + assessmentId: z.string(), // Require assessmentId as a query parameter + }) + ), + async (c) => { + const { assessmentId } = c.req.valid("query"); + + // Query to count total answers for the specific assessmentId + const totalCountQuery = + sql`(SELECT count(*) + FROM ${answers} + WHERE ${answers.assessmentId} = ${assessmentId})`; + + // Query to retrieve answers for the specific assessmentId + const result = await db + .select({ + id: answers.id, + assessmentId: answers.assessmentId, + questionId: options.questionId, + optionId: answers.optionId, + isFlagged: answers.isFlagged, + filename: answers.filename, + validationInformation: answers.validationInformation, + fullCount: totalCountQuery, + }) + .from(answers) + .leftJoin(options, eq(answers.optionId, options.id)) + .where( + and( + eq(answers.assessmentId, assessmentId), // Filter by assessmentId + ) + ) + + return c.json({ + data: result.map((d) => ({ ...d, fullCount: undefined })), + }); + } + ) + + // Toggles the isFlagged field between true and false + .patch( + "/toggleFlag", + checkPermission("assessments.toggleFlag"), + requestValidator("json", flagFormSchema), + async (c) => { + const flagData = c.req.valid("json"); + + // Update jawaban yang ada berdasarkan assessmentId dan questionId + const answer = await db + .update(answers) + .set({ + isFlagged: flagData.isFlagged, // Ubah ke pilihan baru + }) + .where( + and( + eq(answers.assessmentId, flagData.assessmentId), + eq(answers.questionId, flagData.questionId) + ) + ) + .returning(); + + return c.json( + { + message: "Flag changed successfully", + answer: answer[0], + }, + 200 + ); + } + ) + + // Upload filename to the table answers and save the file on the local storage + .post( + "/uploadFile", + checkPermission("assessments.uploadFile"), + async (c) => { + const contentType = c.req.header('content-type'); + if (!contentType || !contentType.includes('multipart/form-data')) { + return c.json({ message: "Invalid Content-Type" }, 400); + } + + const boundary = contentType.split('boundary=')[1]; + if (!boundary) { + return c.json({ message: "Boundary not found" }, 400); + } + + const body = await c.req.arrayBuffer(); + const bodyString = Buffer.from(body).toString(); + const parts = bodyString.split(`--${boundary}`); + + let fileUrl: string | null = null; + + for (const part of parts) { + if (part.includes('Content-Disposition: form-data;')) { + const match = /filename="(.+?)"/.exec(part); + if (match) { + const fileName = match[1]; + const fileContentStart = part.indexOf('\r\n\r\n') + 4; + const fileContentEnd = part.lastIndexOf('\r\n'); + const fileBuffer = Buffer.from(part.slice(fileContentStart, fileContentEnd), 'binary'); + + const filePath = path.join('files', `${Date.now()}-${fileName}`); + await saveFile(filePath, fileBuffer); + + const assessmentId = c.req.query('assessmentId'); + const questionId = c.req.query('questionId'); + + if (!assessmentId || !questionId) { + return c.json({ message: "assessmentId and questionId are required" }, 400); + } + + const answerId = await findAnswerId(assessmentId, questionId); + + if (!answerId) { + return c.json({ message: 'Answer not found' }, 404); + } + + await updateFilename(answerId, path.basename(filePath)); + fileUrl = `/files/${path.basename(filePath)}`; + } + } + } + + if (!fileUrl) { + return c.json({ message: 'No file uploaded' }, 400); + } + + return c.json({ success: true, imageUrl: fileUrl }); + } + ) + + .post( + "/submitOption", + checkPermission("assessments.submitOption"), + requestValidator("json", optionFormSchema), + async (c) => { + const optionData = c.req.valid("json"); + + // Update jawaban yang ada berdasarkan assessmentId dan questionId + const answer = await db + .update(answers) + .set({ + optionId: optionData.optionId, // Ubah ke pilihan baru + }) + .where( + and( + eq(answers.assessmentId, optionData.assessmentId), + eq(answers.questionId, optionData.questionId) + ) + ) + .returning(); + + return c.json( + { + message: "Option submitted successfully", + answer: answer[0], + }, + 200 + ); + } + ) + + .post( + "/submitValidation", + checkPermission("assessments.submitValidation"), + requestValidator("json", validationFormSchema), + async (c) => { + const validationData = c.req.valid("json"); + + // Cek apakah jawaban ada berdasarkan assessmentId dan questionId + const existingAnswer = await db + .select() + .from(answers) + .leftJoin(options, eq(answers.optionId, options.id)) + .leftJoin(questions, eq(options.questionId, questions.id)) + .where( + sql`answers."assessmentId" = ${validationData.assessmentId} + AND questions.id = ${validationData.questionId}` + ) + .limit(1); + + if (existingAnswer.length === 0) { + return c.json( + { + message: "No existing answer found for the given assessmentId and questionId.", + }, + 404 + ); + } + + // Dapatkan tanggal dan waktu saat ini + const currentDate = new Date(); + + // Update dengan melakukan JOIN yang sama + const updatedAnswer = await db + .update(answers) + .set({ + validationInformation: validationData.validationInformation, + updatedAt: currentDate, + }) + .where( + sql`answers."assessmentId" = ${validationData.assessmentId} + AND answers."optionId" IN ( + SELECT id FROM options WHERE "questionId" = ${validationData.questionId} + )` + ) + .returning(); + + return c.json( + { + message: "Validation information updated successfully", + answer: updatedAnswer[0], + }, + 200 + ); + } + ) + + .patch( + "/submitAssessment/:id", + checkPermission("assessments.submitAssessment"), + async (c) => { + const assessmentId = c.req.param("id"); + const status = "belum diverifikasi"; + + const assessment = await db + .select() + .from(assessments) + .where(and(eq(assessments.id, assessmentId),)); + + if (!assessment[0]) { + throw notFound({ + message: "Assessment not found.", + }); + } + + await db + .update(assessments) + .set({ + status, + }) + .where(eq(assessments.id, assessmentId)); + + return c.json({ + message: "Status assessment berhasil diperbarui.", + }); + } + ) + + // Get data for All Sub Aspects average score By Assessment Id + .get( + '/average-score/sub-aspects/assessments/:assessmentId', + checkPermission("assessments.readAverageSubAspect"), + async (c) => { + const { assessmentId } = c.req.param(); + + const averageScores = await db + .select({ + aspectId: subAspects.aspectId, + subAspectId: subAspects.id, + subAspectName: subAspects.name, + average: sql`AVG(options.score)` + }) + .from(answers) + .innerJoin(options, eq(answers.optionId, options.id)) + .innerJoin(questions, eq(options.questionId, questions.id)) + .innerJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .innerJoin(assessments, eq(answers.assessmentId, assessments.id)) + .where(eq(assessments.id, assessmentId)) + .groupBy(subAspects.id); + + return c.json({ + assessmentId, + subAspects: averageScores.map(score => ({ + subAspectId: score.subAspectId, + subAspectName: score.subAspectName, + averageScore: score.average, + aspectId: score.aspectId + })) + }); + } + ) + + // Get data for Aspects average score and all related Sub Aspects average score By Assessment Id + .get( + '/average-score/aspects/assessments/:assessmentId', + checkPermission("assessments.readAverageAspect"), + async (c) => { + const { assessmentId } = c.req.param(); + + // Query untuk mendapatkan average score per aspect + const aspectScores = await db + .select({ + aspectId: aspects.id, + aspectName: aspects.name, + averageScore: sql`AVG(options.score)`, + }) + .from(answers) + .innerJoin(options, eq(answers.optionId, options.id)) + .innerJoin(questions, eq(options.questionId, questions.id)) + .innerJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .innerJoin(aspects, eq(subAspects.aspectId, aspects.id)) + .innerJoin(assessments, eq(answers.assessmentId, assessments.id)) + .where(eq(assessments.id, assessmentId)) + .groupBy(aspects.id); + + // Query untuk mendapatkan average score per sub-aspect + const subAspectScores = await db + .select({ + aspectId: subAspects.aspectId, + subAspectId: subAspects.id, + subAspectName: subAspects.name, + averageScore: sql`AVG(options.score)`, + }) + .from(answers) + .innerJoin(options, eq(answers.optionId, options.id)) + .innerJoin(questions, eq(options.questionId, questions.id)) + .innerJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .innerJoin(assessments, eq(answers.assessmentId, assessments.id)) + .where(eq(assessments.id, assessmentId)) + .groupBy(subAspects.id); + + // Menggabungkan sub-aspects ke dalam masing-masing aspect + const aspectsWithSubAspects = aspectScores.map((aspect) => ({ + aspectId: aspect.aspectId, + aspectName: aspect.aspectName, + averageScore: aspect.averageScore, + subAspects: subAspectScores + .filter((sub) => sub.aspectId === aspect.aspectId) + .map((sub) => ({ + subAspectId: sub.subAspectId, + subAspectName: sub.subAspectName, + averageScore: sub.averageScore, + })), + })); + + return c.json({ + assessmentId, + aspects: aspectsWithSubAspects, + }); + } + ) + + .patch( + "/updateOption", + checkPermission("assessments.updateOption"), + requestValidator("json", newOptionFormSchema), + async (c) => { + const optionData = c.req.valid("json"); + + // Temukan answerId yang sesuai berdasarkan assessmentId dan questionId + const [targetAnswer] = await db + .select({ id: answers.id }) + .from(answers) + .leftJoin(options, eq(answers.optionId, options.id)) + .where( + sql`answers."assessmentId" = ${optionData.assessmentId} + AND options."questionId" = ${optionData.questionId}` + ) + .limit(1); + + if (!targetAnswer) { + return c.json( + { message: "Answer not found for given assessmentId and questionId" }, + 404 + ); + } + + // Lakukan update pada answer_revisions menggunakan answerId yang ditemukan + const [updatedRevision] = await db + .update(answerRevisions) + .set({ + newOptionId: optionData.newOptionId, + }) + .where(sql`"answerId" = ${targetAnswer.id}`) + .returning(); + + return c.json( + { + message: "Revision updated successfully", + revision: updatedRevision, // Revisi yang baru saja diperbarui + }, + 200 + ); + } + ) + + .patch( + "/updateOption", + checkPermission("assessments.updateOption"), + requestValidator("json", newOptionFormSchema), + async (c) => { + const optionData = c.req.valid("json"); + + // Temukan answerId yang sesuai berdasarkan assessmentId dan questionId + const [targetAnswer] = await db + .select({ id: answers.id }) + .from(answers) + .leftJoin(options, eq(answers.optionId, options.id)) + .where( + sql`answers."assessmentId" = ${optionData.assessmentId} + AND options."questionId" = ${optionData.questionId}` + ) + .limit(1); + + if (!targetAnswer) { + return c.json( + { message: "Answer not found for given assessmentId and questionId" }, + 404 + ); + } + + // Lakukan update pada answer_revisions menggunakan answerId yang ditemukan + const [updatedRevision] = await db + .update(answerRevisions) + .set({ + newOptionId: optionData.newOptionId, + }) + .where(sql`"answerId" = ${targetAnswer.id}`) + .returning(); + + return c.json( + { + message: "Revision updated successfully", + revision: updatedRevision, // Revisi yang baru saja diperbarui + }, + 200 + ); + } + ) + +export default assessmentsRoute; diff --git a/apps/backend/src/routes/auth/route.ts b/apps/backend/src/routes/auth/route.ts index 89b1405..1adbcb5 100644 --- a/apps/backend/src/routes/auth/route.ts +++ b/apps/backend/src/routes/auth/route.ts @@ -134,6 +134,7 @@ const authRoutes = new Hono() user: { id: user[0].users.id, name: user[0].users.name, + role: user[0].roles?.code, permissions: Array.from(permissions), }, }); diff --git a/apps/backend/src/routes/forgotPassword/route.ts b/apps/backend/src/routes/forgotPassword/route.ts new file mode 100644 index 0000000..8c3ddb0 --- /dev/null +++ b/apps/backend/src/routes/forgotPassword/route.ts @@ -0,0 +1,111 @@ +import { zValidator } from "@hono/zod-validator"; +import HonoEnv from "../../types/HonoEnv"; +import { z } from "zod"; +import { and, eq, isNull } from "drizzle-orm"; +import { Hono } from "hono"; +import db from "../../drizzle"; +import { users } from "../../drizzle/schema/users"; +import { notFound, unauthorized } from "../../errors/DashboardError"; +import { generateResetPasswordToken, verifyResetPasswordToken } from "../../utils/authUtils"; +import { sendResetPasswordEmail } from "../../utils/mailerUtils"; +import { hashPassword } from "../../utils/passwordUtils"; + +const forgotPasswordRoutes = new Hono() + /** + * Forgot Password + * + * Checking emails in the database, generating tokens, and sending emails occurs. + */ + .post( + '/', + zValidator( + 'json', + z.object({ + email: z.string().email(), + }) + ), + async (c) => { + const { email } = c.req.valid('json'); + + const user = await db + .select() + .from(users) + .where( + and( + isNull(users.deletedAt), + eq(users.email, email) + ) + ); + + if (!user.length) throw notFound(); + + // Generate reset password token + const resetPasswordToken = await generateResetPasswordToken({ + uid: user[0].id, + }); + + await db + .update(users) + .set({ + resetPasswordToken: resetPasswordToken + }) + .where(eq(users.email, email)); + + // Send email with reset password token + await sendResetPasswordEmail(email, resetPasswordToken); + + return c.json({ + message: 'Email has been sent successfully', + }); + } + ) + /** + * Reset Password + */ + .patch( + '/verify', + zValidator( + 'json', + z.object({ + password: z.string(), + confirm_password: z.string() + }) + ), + async (c) => { + const formData = c.req.valid('json'); + const token = c.req.query('token') + + // Token validation + if (!token) { + return c.json({ message: 'Token is required' }, 400); + } + + // Password validation + if (formData.password !== formData.confirm_password) { + return c.json({ message: 'Passwords do not match' }, 400); + } + + const decoded = await verifyResetPasswordToken(token); + if (!decoded) { + return c.json({ message: 'Invalid or expired token' }, 401); + } + + if (!decoded) throw unauthorized(); + + // Hash the password + const hashedPassword = await hashPassword(formData.password); + + await db + .update(users) + .set({ + password: hashedPassword, + updatedAt: new Date(), + }) + .where(eq(users.id, decoded.uid)); + + return c.json({ + message: 'Password has been reset successfully' + }); + }); + +export default forgotPasswordRoutes; \ No newline at end of file diff --git a/apps/backend/src/routes/managementAspect/route.ts b/apps/backend/src/routes/managementAspect/route.ts new file mode 100644 index 0000000..0a5699f --- /dev/null +++ b/apps/backend/src/routes/managementAspect/route.ts @@ -0,0 +1,530 @@ +import { and, eq, ilike, isNull, or, sql, inArray } from "drizzle-orm"; +import { Hono } from "hono"; +import { questions } from "../../drizzle/schema/questions"; +import { z } from "zod"; +import db from "../../drizzle"; +import { aspects } from "../../drizzle/schema/aspects"; +import { subAspects } from "../../drizzle/schema/subAspects"; +import HonoEnv from "../../types/HonoEnv"; +import requestValidator from "../../utils/requestValidator"; +import authInfo from "../../middlewares/authInfo"; +import checkPermission from "../../middlewares/checkPermission"; +import { forbidden } from "../../errors/DashboardError"; +import { notFound } from "../../errors/DashboardError"; + +// Schema for creating and updating aspects +export const aspectFormSchema = z.object({ + name: z.string().min(1).max(50), + subAspects: z + .string() + .refine( + (data) => { + try { + const parsed = JSON.parse(data); + return Array.isArray(parsed); + } catch { + return false; + } + }, + { + message: "Sub Aspects must be an array", + } + ) + .optional(), +}); + +// Schema for creating and updating subAspects +export const subAspectFormSchema = z.object({ + id: z.string(), + name: z.string().min(1).max(50), + aspectId: z.string().optional(), +}); + +export const aspectUpdateSchema = z.object({ + name: z.string(), + subAspects: z.array(subAspectFormSchema), +}); + +export const subAspectUpdateSchema = subAspectFormSchema.extend({}); + +const managementAspectRoute = new Hono() + .use(authInfo) + /** + * Get All Aspects (With Metadata) + * + * Query params: + * - includeTrashed: boolean (default: false) + * - withMetadata: boolean + */ + + // Get all aspects + .get( + "/", + checkPermission("managementAspect.readAll"), + requestValidator( + "query", + z.object({ + includeTrashed: z + .string() + .optional() + .transform((v) => v?.toLowerCase() === "true"), + withMetadata: z + .string() + .optional() + .transform((v) => v?.toLowerCase() === "true"), + page: z.coerce.number().int().min(0).default(0), + limit: z.coerce.number().int().min(1).max(1000).default(10), + q: z.string().default(""), + }) + ), + async (c) => { + const { includeTrashed, page, limit, q } = c.req.valid("query"); + + const aspectCountQuery = await db + .select({ + count: sql`count(*)`, + }) + .from(aspects) + .where( + and( + includeTrashed ? undefined : isNull(aspects.deletedAt), + q ? or(ilike(aspects.name, q), eq(aspects.id, q)) : undefined + ) + ); + + const totalItems = Number(aspectCountQuery[0]?.count) || 0; + + const aspectIdsQuery = await db + .select({ + id: aspects.id, + }) + .from(aspects) + .where( + and( + includeTrashed ? undefined : isNull(aspects.deletedAt), + q ? or(ilike(aspects.name, q), eq(aspects.id, q)) : undefined + ) + ) + .orderBy(aspects.name) + .offset(page * limit) + .limit(limit); + + const aspectIds = aspectIdsQuery.map(a => a.id); + + if (aspectIds.length === 0) { + return c.json({ + data: [], + _metadata: { + currentPage: page, + totalPages: 0, + totalItems: 0, + perPage: limit, + }, + }); + } + + // Main query to get aspects, sub-aspects, and number of questions + const result = await db + .select({ + id: aspects.id, + name: aspects.name, + createdAt: aspects.createdAt, + updatedAt: aspects.updatedAt, + ...(includeTrashed ? { deletedAt: aspects.deletedAt } : {}), + subAspectId: subAspects.id, + subAspectName: subAspects.name, + // Increase the number of questions related to sub aspects + questionCount: sql`( + SELECT count(*) + FROM ${questions} + WHERE ${questions.subAspectId} = ${subAspects.id} + )`.as('questionCount'), + }) + .from(aspects) + .leftJoin(subAspects, eq(subAspects.aspectId, aspects.id)) + .where(inArray(aspects.id, aspectIds)) + .orderBy(aspects.name); + + // Grouping sub aspects by aspect ID + const groupedResult = result.reduce((acc, curr) => { + const aspectId = curr.id; + + if (!acc[aspectId]) { + acc[aspectId] = { + id: curr.id, + name: curr.name, + createdAt: curr.createdAt ? new Date(curr.createdAt).toISOString() : null, + updatedAt: curr.updatedAt ? new Date(curr.updatedAt).toISOString() : null, + subAspects: curr.subAspectName + ? [{ id: curr.subAspectId!, name: curr.subAspectName, questionCount: curr.questionCount }] + : [], + }; + } else { + if (curr.subAspectName) { + const exists = acc[aspectId].subAspects.some(sub => sub.id === curr.subAspectId); + if (!exists) { + acc[aspectId].subAspects.push({ + id: curr.subAspectId!, + name: curr.subAspectName, + questionCount: curr.questionCount, + }); + } + } + } + + return acc; + }, {} as Record); + + const groupedArray = Object.values(groupedResult); + + return c.json({ + data: groupedArray, + _metadata: { + currentPage: page, + totalPages: Math.ceil(totalItems / limit), + totalItems, + perPage: limit, + }, + }); + } + ) + + // Get aspect by id + .get( + "/:id", + checkPermission("managementAspect.readAll"), + requestValidator( + "query", + z.object({ + includeTrashed: z.string().default("false"), + }) + ), + async (c) => { + const aspectId = c.req.param("id"); + + if (!aspectId) + throw notFound({ + message: "Missing id", + }); + + const includeTrashed = c.req.query("includeTrashed")?.toLowerCase() === "true"; + + const queryResult = await db + .select({ + id: aspects.id, + name: aspects.name, + createdAt: aspects.createdAt, + updatedAt: aspects.updatedAt, + ...(includeTrashed ? { deletedAt: aspects.deletedAt } : {}), + subAspect: { + name: subAspects.name, + id: subAspects.id, + questionCount: sql`COUNT(${questions.id})`.as("questionCount"), + }, + }) + .from(aspects) + .leftJoin(subAspects, eq(aspects.id, subAspects.aspectId)) + .leftJoin(questions, eq(subAspects.id, questions.subAspectId)) + .where(and(eq(aspects.id, aspectId), !includeTrashed ? isNull(aspects.deletedAt) : undefined)) + .groupBy(aspects.id, aspects.name, aspects.createdAt, aspects.updatedAt, subAspects.id, subAspects.name); + + if (!queryResult.length) + throw notFound({ + message: "The aspect does not exist", + }); + + const subAspectsList = queryResult.reduce((prev, curr) => { + if (!curr.subAspect) return prev; + prev.set(curr.subAspect.id, { + name: curr.subAspect.name, + questionCount: Number(curr.subAspect.questionCount), + }); + return prev; + }, new Map()); + + const aspectData = { + ...queryResult[0], + subAspect: undefined, + subAspects: Array.from(subAspectsList, ([id, { name, questionCount }]) => ({ id, name, questionCount })), + }; + + return c.json(aspectData); + } + ) + + // Create aspect + .post("/", + checkPermission("managementAspect.create"), + requestValidator("json", aspectFormSchema), + async (c) => { + const aspectData = c.req.valid("json"); + + // Check if aspect name already exists and is not deleted + const existingAspect = await db + .select() + .from(aspects) + .where( + and( + eq(aspects.name, aspectData.name), + isNull(aspects.deletedAt) + ) + ); + + if (existingAspect.length > 0) { + // Return an error if the aspect name already exists + return c.json( + { message: "Aspect name already exists" }, + 400 // Bad Request + ); + } + + // If it doesn't exist, create a new aspect + const aspect = await db + .insert(aspects) + .values({ + name: aspectData.name, + }) + .returning(); + + const aspectId = aspect[0].id; + + // If there is sub aspect data, parse and insert into the database. + if (aspectData.subAspects) { + const subAspectsArray = JSON.parse(aspectData.subAspects) as string[]; + + // Create a Set to check for duplicates + const uniqueSubAspects = new Set(); + + // Filter out duplicates + const filteredSubAspects = subAspectsArray.filter((subAspect) => { + if (uniqueSubAspects.has(subAspect)) { + return false; // Skip duplicates + } + uniqueSubAspects.add(subAspect); + return true; // Keep unique sub-aspects + }); + + // Check if there are any unique sub aspects to insert + if (filteredSubAspects.length) { + // Insert new sub aspects into the database + await db.insert(subAspects).values( + filteredSubAspects.map((subAspect) => ({ + aspectId, + name: subAspect, + })) + ); + } + } + + return c.json( + { + message: "Aspect and sub aspects created successfully", + }, + 201 + ); + } + ) + + // Update aspect + .patch( + "/:id", + checkPermission("managementAspect.update"), + requestValidator("json", aspectUpdateSchema), + async (c) => { + const aspectId = c.req.param("id"); + const aspectData = c.req.valid("json"); + + // Check if new aspect name already exists + const existingAspect = await db + .select() + .from(aspects) + .where( + and( + eq(aspects.name, aspectData.name), + isNull(aspects.deletedAt), + sql`${aspects.id} <> ${aspectId}` + ) + ); + + if (existingAspect.length > 0) { + throw notFound({ + message: "Aspect name already exists", + }); + } + + // Check if the aspect in question exists + const aspect = await db + .select() + .from(aspects) + .where(and(eq(aspects.id, aspectId), isNull(aspects.deletedAt))); + + if (!aspect[0]) throw notFound(); + + // Update aspect name + await db + .update(aspects) + .set({ + name: aspectData.name, + updatedAt: new Date(), + }) + .where(eq(aspects.id, aspectId)); + + // Get new sub aspect data from request + const newSubAspects = aspectData.subAspects || []; + + // Take the existing sub aspects + const currentSubAspects = await db + .select({ id: subAspects.id, name: subAspects.name }) + .from(subAspects) + .where(eq(subAspects.aspectId, aspectId)); + + const currentSubAspectMap = new Map(currentSubAspects.map(sub => [sub.id, sub.name])); + + // Sub aspects to be removed + const subAspectsToDelete = currentSubAspects + .filter(sub => !newSubAspects.some(newSub => newSub.id === sub.id)) + .map(sub => sub.id); + + // Delete sub aspects that do not exist in the new data + if (subAspectsToDelete.length) { + await db + .delete(subAspects) + .where( + and( + eq(subAspects.aspectId, aspectId), + inArray(subAspects.id, subAspectsToDelete) + ) + ); + } + + // Create a Set to check for duplicate sub-aspects + const uniqueSubAspectNames = new Set(currentSubAspects.map(sub => sub.name)); + + // Update or add new sub aspects + for (const subAspect of newSubAspects) { + const existingSubAspect = currentSubAspectMap.has(subAspect.id); + + // Check for duplicate sub-aspect names + if (uniqueSubAspectNames.has(subAspect.name) && !existingSubAspect) { + throw notFound({ + message: `Sub aspect name "${subAspect.name}" already exists for this aspect.`, + }); + } + + if (existingSubAspect) { + // Update if sub aspect already exists + await db + .update(subAspects) + .set({ + name: subAspect.name, + updatedAt: new Date(), + }) + .where( + and( + eq(subAspects.id, subAspect.id), + eq(subAspects.aspectId, aspectId) + ) + ); + } else { + // Add if new sub aspect + await db + .insert(subAspects) + .values({ + aspectId, + name: subAspect.name, + createdAt: new Date(), + }); + } + + // Add the name to the Set after processing + uniqueSubAspectNames.add(subAspect.name); + } + + return c.json({ + message: "Aspect and sub aspects updated successfully", + }); + } + ) + + // Delete aspect + .delete( + "/:id", + checkPermission("managementAspect.delete"), + async (c) => { + const aspectId = c.req.param("id"); + + // Check if aspect exists before deleting + const aspect = await db + .select() + .from(aspects) + .where(and(eq(aspects.id, aspectId), isNull(aspects.deletedAt))); + + if (!aspect[0]) + throw notFound({ + message: "The aspect is not found", + }); + + // Update deletedAt column on aspect (soft delete) + await db + .update(aspects) + .set({ + deletedAt: new Date(), + }) + .where(eq(aspects.id, aspectId)); + + // Soft delete related sub aspects (update deletedAt on the sub-aspect) + await db + .update(subAspects) + .set({ + deletedAt: new Date(), + }) + .where(eq(subAspects.aspectId, aspectId)); + + return c.json({ + message: "Aspect and sub aspects soft deleted successfully", + }); + } + ) + + // Undo delete + .patch( + "/restore/:id", + checkPermission("managementAspect.restore"), + async (c) => { + const aspectId = c.req.param("id"); + + // Check if the desired aspects are present + const aspect = (await db.select().from(aspects).where(eq(aspects.id, aspectId)))[0]; + + if (!aspect) { + throw notFound({ + message: "The aspect is not found", + }); + } + + // Make sure the aspect has been deleted (there is deletedAt) + if (!aspect.deletedAt) { + throw notFound({ + message: "The aspect is not deleted", + }); + } + + // Restore aspects (remove deletedAt mark) + await db.update(aspects).set({ deletedAt: null }).where(eq(aspects.id, aspectId)); + + // Restore all related sub aspects that have also been deleted (if any) + await db.update(subAspects).set({ deletedAt: null }).where(eq(subAspects.aspectId, aspectId)); + + return c.json({ + message: "Aspect and sub aspects restored successfully", + }); + } + ) + +export default managementAspectRoute; \ No newline at end of file diff --git a/apps/backend/src/routes/questions/route.ts b/apps/backend/src/routes/questions/route.ts new file mode 100644 index 0000000..8c551cc --- /dev/null +++ b/apps/backend/src/routes/questions/route.ts @@ -0,0 +1,519 @@ +import { and, eq, ne, ilike, isNull, or, sql } from "drizzle-orm"; +import { Hono } from "hono"; +import { z } from "zod"; +import { HTTPException } from "hono/http-exception"; +import db from "../../drizzle"; +import { questions } from "../../drizzle/schema/questions"; +import HonoEnv from "../../types/HonoEnv"; +import requestValidator from "../../utils/requestValidator"; +import authInfo from "../../middlewares/authInfo"; +import checkPermission from "../../middlewares/checkPermission"; +import { aspects } from "../../drizzle/schema/aspects"; +import { subAspects } from "../../drizzle/schema/subAspects"; +import { notFound } from "../../errors/DashboardError"; +import { options } from "../../drizzle/schema/options"; + +// Schema for creating and updating options +export const optionFormSchema = z.object({ + text: z.string().min(1).max(255), + score: z.number().min(0).max(999), +}); + +// Schema for creating and updating questions +export const questionFormSchema = z.object({ + subAspectId: z.string().min(1).max(255), + question: z.string().min(1).max(510), + needFile: z.boolean().default(false), + options: z.array(optionFormSchema).optional(), // Allow options to be included +}); + +export const questionUpdateSchema = questionFormSchema.extend({ + question: z.string().min(1).max(510).or(z.literal("")), + subAspectId: z.string().min(1).max(255).or(z.literal("")), + needFile: z.boolean().default(false).or(z.boolean()), +}); + +const questionsRoute = new Hono() + .use(authInfo) + /** + * Get All Aspects + */ + .get("/aspects", + checkPermission("questions.readAll"), + async (c) => { + const result = await db + .select({ + id: aspects.id, + name: aspects.name, + createdAt: aspects.createdAt, + updatedAt: aspects.updatedAt, + }) + .from(aspects); + + return c.json(result); + }) + /** + * Get All Sub Aspects + * + * Query params: + * - aspectId: string (optional) + */ + .get("/subAspects", + checkPermission("questions.readAll"), + requestValidator( + "query", + z.object({ + aspectId: z.string().optional(), + }) + ), + async (c) => { + const { aspectId } = c.req.valid("query"); + + const query = db + .select({ + id: subAspects.id, + name: subAspects.name, + aspectId: subAspects.aspectId, + createdAt: subAspects.createdAt, + updatedAt: subAspects.updatedAt, + }) + .from(subAspects); + + if (aspectId) { + query.where(eq(subAspects.aspectId, aspectId)); + } + + const result = await query; + + return c.json(result); + } + ) + /** + * Get All Questions (With Metadata) + * + * Query params: + * - includeTrashed: boolean (default: false) + * - withMetadata: boolean + */ + .get( + "/", + checkPermission("questions.readAll"), + requestValidator( + "query", + z.object({ + includeTrashed: z + .string() + .optional() + .transform((v) => v?.toLowerCase() === "true"), + withMetadata: z + .string() + .optional() + .transform((v) => v?.toLowerCase() === "true"), + page: z.coerce.number().int().min(0).default(0), + limit: z.coerce.number().int().min(1).max(1000).default(30), + q: z.string().default(""), + }) + ), + async (c) => { + const { includeTrashed, page, limit, q } = c.req.valid("query"); + + const totalCountQuery = includeTrashed + ? sql`(SELECT count(*) FROM ${questions})` + : sql`(SELECT count(*) FROM ${questions} WHERE ${questions.deletedAt} IS NULL)`; + + const result = await db + .select({ + id: questions.id, + question: questions.question, + needFile: questions.needFile, + aspectName: aspects.name, + subAspectName: subAspects.name, + createdAt: questions.createdAt, + updatedAt: questions.updatedAt, + ...(includeTrashed ? { deletedAt: questions.deletedAt } : {}), + averageScore: sql`( + SELECT ROUND(AVG(${options.score}), 2) + FROM ${options} + WHERE ${options.questionId} = ${questions.id} + AND ${options.deletedAt} IS NULL -- Include only non-deleted options + )`, + fullCount: totalCountQuery, + }) + .from(questions) + .leftJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .leftJoin(aspects, eq(subAspects.aspectId, aspects.id)) + .where( + and( + includeTrashed ? undefined : isNull(questions.deletedAt), + q + ? or( + ilike(questions.question, `%${q}%`), + ilike(aspects.name, `%${q}%`), + ilike(subAspects.name, `%${q}%`), + eq(questions.id, q) + ) + : undefined + ) + ) + .orderBy(questions.question) + .offset(page * limit) + .limit(limit); + + return c.json({ + data: result.map((d) => ({ ...d, fullCount: undefined })), + _metadata: { + currentPage: page, + totalPages: Math.ceil( + (Number(result[0]?.fullCount) ?? 0) / limit + ), + totalItems: Number(result[0]?.fullCount) ?? 0, + perPage: limit, + }, + }); + } + ) + /** + * Get Question by ID + * + * Query params: + * - id: string + * - includeTrashed: boolean (default: false) + */ + .get( + "/:id", + checkPermission("questions.readAll"), + requestValidator( + "query", + z.object({ + includeTrashed: z.string().default("false"), + }) + ), + async (c) => { + const questionId = c.req.param("id"); + + if (!questionId) + throw notFound({ + message: "Missing id", + }); + + const includeTrashed = + c.req.query("includeTrashed")?.toLowerCase() === "true"; + + const queryResult = await db + .select({ + id: questions.id, + question: questions.question, + needFile: questions.needFile, + subAspectId: questions.subAspectId, + subAspectName: subAspects.name, + aspectId: subAspects.aspectId, + aspectName: aspects.name, + createdAt: questions.createdAt, + updatedAt: questions.updatedAt, + ...(includeTrashed ? { deletedAt: questions.deletedAt } : {}), + options: { + id: options.id, + text: options.text, + score: options.score, + }, + }) + .from(questions) + .leftJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .leftJoin(aspects, eq(subAspects.aspectId, aspects.id)) + .leftJoin(options, and(eq(questions.id, options.questionId), isNull(options.deletedAt))) // Filter out soft-deleted options + .where( + and( + eq(questions.id, questionId), + !includeTrashed ? isNull(questions.deletedAt) : undefined + ) + ) + .groupBy(questions.id, questions.question, questions.needFile, subAspects.aspectId, + aspects.name, questions.subAspectId, subAspects.name, questions.createdAt, + questions.updatedAt, options.id, options.text, options.score); + + if (!queryResult[0]) throw notFound(); + + const optionsList = queryResult.reduce((prev, curr) => { + if (!curr.options) return prev; + prev.set(curr.options.id, + { + text: curr.options.text, + score: curr.options.score, + } + ); + return prev; + }, new Map()); + + // Convert Map to Array and sort by the score field in ascending order + const sortedOptions = Array.from(optionsList, ([id, { text, score }]) => ({ id, text, score })) + .sort((a, b) => a.score - b.score); // Sort based on score field in ascending order + + const questionData = { + ...queryResult[0], + options: sortedOptions, + }; + + return c.json(questionData); + } + ) + /** + * Create Question + * + * JSON: + * - questionFormSchema: object + */ + .post( + "/", + checkPermission("questions.create"), + requestValidator("json", questionFormSchema), + async (c) => { + const questionData = c.req.valid("json"); + + // Check if the sub aspect exists + const existingSubAspect = await db + .select() + .from(subAspects) + .where(eq(subAspects.id, questionData.subAspectId)); + + if (existingSubAspect.length === 0) { + return c.json({ message: "Sub aspect not found" }, 404); + } + + // Cek apakah question dengan subAspectId yang sama sudah ada + const duplicateQuestion = await db + .select() + .from(questions) + .where( + and( + eq(questions.subAspectId, questionData.subAspectId), + eq(questions.question, questionData.question) + ) + ); + + if (duplicateQuestion.length > 0) { + return c.json( + { message: "Pertanyaan dengan sub-aspek yang sama sudah ada" }, + 409 + ); + } + + // Insert question data into the questions table + const question = await db + .insert(questions) + .values({ + question: questionData.question, + needFile: questionData.needFile, + subAspectId: questionData.subAspectId, + }) + .returning(); + + const questionId = question[0].id; + + // Insert options data if provided + if (questionData.options && questionData.options.length > 0) { + const optionsData = questionData.options.map((option) => ({ + questionId: questionId, + text: option.text, + score: option.score, + })); + + await db.insert(options).values(optionsData); + } + + return c.json({ + message: "Question and options created successfully", + data: question[0], + }, + 201 + ); + } + ) + /** + * Update Question + * + * JSON: + * - questionUpdateSchema: object + */ + .patch( + "/:id", + checkPermission("questions.update"), + requestValidator("json", questionUpdateSchema), + async (c) => { + const questionId = c.req.param("id"); + const questionData = c.req.valid("json"); + + // Check if the question exists and is not soft deleted + const question = await db + .select() + .from(questions) + .where(and(eq(questions.id, questionId), isNull(questions.deletedAt))); + + if (!question[0]) throw notFound(); + + // Check if the combination of subAspectId and question already exists (except for this question) + const duplicateQuestion = await db + .select() + .from(questions) + .where( + and( + eq(questions.subAspectId, questionData.subAspectId), + eq(questions.question, questionData.question), + ne(questions.id, questionId), // Ignore questions that are being updated + isNull(questions.deletedAt) + ) + ); + + if (duplicateQuestion.length > 0) { + return c.json( + { message: "Pertanyaan dengan sub-aspek yang sama sudah ada" }, + 409 + ); + } + + // Update question data + await db + .update(questions) + .set({ + ...questionData, + updatedAt: new Date(), + }) + .where(eq(questions.id, questionId)); + + // Check if options data is provided + if (questionData.options !== undefined) { + // Fetch existing options from the database for this question + const existingOptions = await db + .select() + .from(options) + .where(and(eq(options.questionId, questionId), isNull(options.deletedAt))); + + // Prepare new options data for comparison + const newOptionsData = questionData.options.map((option) => ({ + questionId: questionId, + text: option.text, + score: option.score, + })); + + // Iterate through existing options and perform updates or soft deletes if needed + for (const existingOption of existingOptions) { + const matchingOption = newOptionsData.find( + (newOption) => newOption.text === existingOption.text + ); + + if (!matchingOption) { + // If the existing option is not in the new options data, soft delete it + await db + .update(options) + .set({ deletedAt: new Date() }) + .where(eq(options.id, existingOption.id)); + } else { + // If the option is found, update it if the score has changed + if (existingOption.score !== matchingOption.score) { + await db + .update(options) + .set({ + score: matchingOption.score, + updatedAt: new Date(), + }) + .where(eq(options.id, existingOption.id)); + } + } + } + + // Insert new options that do not exist in the database + const existingOptionTexts = existingOptions.map((opt) => opt.text); + const optionsToInsert = newOptionsData.filter((newOption) => !existingOptionTexts.includes(newOption.text)); + + if (optionsToInsert.length > 0) { + await db.insert(options).values(optionsToInsert); + } + } + + return c.json({ + message: "Question and options updated successfully", + }); + } + ) + /** + * Delete Question + * + * Query params: + * - id: string + * - skipTrash: string (default: false) + */ + .delete( + "/:id", + checkPermission("questions.delete"), + requestValidator( + "query", + z.object({ + skipTrash: z.string().default("false"), + }) + ), + async (c) => { + const questionId = c.req.param("id"); + + const skipTrash = + c.req.valid("query").skipTrash.toLowerCase() === "true"; + + const question = await db + .select() + .from(questions) + .where( + and( + eq(questions.id, questionId), + skipTrash ? undefined : isNull(questions.deletedAt) + ) + ); + + if (!question[0]) throw notFound(); + + if (skipTrash) { + await db.delete(questions).where(eq(questions.id, questionId)); + } else { + await db + .update(questions) + .set({ + deletedAt: new Date(), + }) + .where(and(eq(questions.id, questionId), isNull(questions.deletedAt))); + } + return c.json({ + message: "Question deleted successfully", + }); + } + ) + /** + * Restore Question + * + * Query params: + * - id: string + */ + .patch("/restore/:id", + checkPermission("questions.restore"), + async (c) => { + const questionId = c.req.param("id"); + + const question = ( + await db.select().from(questions).where(eq(questions.id, questionId)) + )[0]; + + if (!question) throw notFound(); + + if (!question.deletedAt) { + throw new HTTPException(400, { + message: "The question is not deleted", + }); + } + + await db + .update(questions) + .set({ deletedAt: null }) + .where(eq(questions.id, questionId)); + + return c.json({ + message: "Question restored successfully", + }); + }); + +export default questionsRoute; diff --git a/apps/backend/src/routes/register/route.ts b/apps/backend/src/routes/register/route.ts new file mode 100644 index 0000000..4be7398 --- /dev/null +++ b/apps/backend/src/routes/register/route.ts @@ -0,0 +1,131 @@ +import { Hono } from "hono"; +import { HTTPException } from "hono/http-exception"; +import db from "../../drizzle"; +import { respondents } from "../../drizzle/schema/respondents"; +import { users } from "../../drizzle/schema/users"; +import { rolesSchema } from "../../drizzle/schema/roles"; +import { rolesToUsers } from "../../drizzle/schema/rolesToUsers"; +import { hashPassword } from "../../utils/passwordUtils"; +import requestValidator from "../../utils/requestValidator"; +import authInfo from "../../middlewares/authInfo"; +import { or, eq } from "drizzle-orm"; +import { z } from "zod"; +import HonoEnv from "../../types/HonoEnv"; +import { notFound } from "../../errors/DashboardError"; + +const registerFormSchema = z.object({ + name: z.string().min(1).max(255), + username: z.string().min(1).max(255), + email: z.string().email(), + password: z.string().min(6), + companyName: z.string().min(1).max(255), + position: z.string().min(1).max(255), + workExperience: z.string().min(1).max(255), + address: z.string().min(1), + phoneNumber: z.string().min(1).max(13), + isEnabled: z.string().default("false"), +}); + +const respondentsRoute = new Hono() + .use(authInfo) + //post user + .post("/", requestValidator("json", registerFormSchema), async (c) => { + const formData = c.req.valid("json"); + + // Check if the provided email or username is already exists in database + const conditions = []; + if (formData.email) { + conditions.push(eq(users.email, formData.email)); + } + conditions.push(eq(users.username, formData.username)); + + const existingUser = await db + .select() + .from(users) + .where( + or( + eq(users.email, formData.email), + eq(users.username, formData.username) + ) + ); + + const existingRespondent = await db + .select() + .from(respondents) + .where(eq(respondents.phoneNumber, formData.phoneNumber)); + + if (existingUser.length > 0) { + throw new HTTPException(400, { + message: "Email or username has been registered", + }); + } + + if (existingRespondent.length > 0) { + throw new HTTPException(400, { + message: "Phone number has been registered", + }); + } + + // Hash the password + const hashedPassword = await hashPassword(formData.password); + + // Start a transaction + const result = await db.transaction(async (trx) => { + // Create user + const [newUser] = await trx + .insert(users) + .values({ + name: formData.name, + username: formData.username, + email: formData.email, + password: hashedPassword, + isEnabled: formData.isEnabled?.toLowerCase() === "true" || true, + }) + .returning() + .catch(() => { + throw new HTTPException(500, { message: "Error creating user" }); + }); + + // Create respondent + await trx + .insert(respondents) + .values({ + companyName: formData.companyName, + position: formData.position, + workExperience: formData.workExperience, + address: formData.address, + phoneNumber: formData.phoneNumber, + userId: newUser.id, + }) + .catch(() => { + throw new HTTPException(500, { + message: "Error creating respondent", + }); + }); + + // Automatically assign "user" role to the new user + const [role] = await trx + .select() + .from(rolesSchema) + .where(eq(rolesSchema.code, "user")) + .limit(1); + + if (!role) throw notFound(); + + await trx.insert(rolesToUsers).values({ + userId: newUser.id, + roleId: role.id, + }); + + return newUser; + }); + + return c.json( + { + message: "User created successfully", + }, + 201 + ); + }); + +export default respondentsRoute; diff --git a/apps/backend/src/routes/users/route.ts b/apps/backend/src/routes/users/route.ts index 3069960..4eadb67 100644 --- a/apps/backend/src/routes/users/route.ts +++ b/apps/backend/src/routes/users/route.ts @@ -1,4 +1,4 @@ -import { and, eq, ilike, isNull, or, sql } from "drizzle-orm"; +import { and, eq, ilike, isNull, or, sql, not, inArray } from "drizzle-orm"; import { Hono } from "hono"; import { z } from "zod"; @@ -12,30 +12,21 @@ import HonoEnv from "../../types/HonoEnv"; import requestValidator from "../../utils/requestValidator"; import authInfo from "../../middlewares/authInfo"; import checkPermission from "../../middlewares/checkPermission"; +import { respondents } from "../../drizzle/schema/respondents"; +import { forbidden, notFound } from "../../errors/DashboardError"; export const userFormSchema = z.object({ - name: z.string().min(1).max(255), - username: z.string().min(1).max(255), - email: z.string().email().optional().or(z.literal("")), - password: z.string().min(6), + name: z.string().min(1, "Nama wajib diisi").max(255), + username: z.string().min(1, "Username wajib diisi").max(255), + email: z.string().min(1, "Email wajib diisi").max(255), + password: z.string().min(6, "Password wajib diisi"), + companyName: z.string().min(1, "Nama Perusahaan wajib diisi").max(255), + position: z.string().min(1, "Jabatan wajib diisi").max(255), + workExperience: z.string().min(1, "Pengalaman Kerja wajib diisi").max(255), + address: z.string().min(1, "Alamat wajib diisi"), + phoneNumber: z.string().min(1, "Nomor Telepon wajib diisi").max(13), isEnabled: z.string().default("false"), - roles: z - .string() - .refine( - (data) => { - console.log(data); - try { - const parsed = JSON.parse(data); - return Array.isArray(parsed); - } catch { - return false; - } - }, - { - message: "Roles must be an array", - } - ) - .optional(), + roles: z.array(z.string().min(1, "Role wajib diisi")), }); export const userUpdateSchema = userFormSchema.extend({ @@ -50,75 +41,169 @@ const usersRoute = new Hono() * Query params: * - includeTrashed: boolean (default: false)\ * - withMetadata: boolean - */ + */ + + // Get all users with search .get( "/", checkPermission("users.readAll"), requestValidator( - "query", - z.object({ - includeTrashed: z - .string() - .optional() - .transform((v) => v?.toLowerCase() === "true"), - withMetadata: z - .string() - .optional() - .transform((v) => v?.toLowerCase() === "true"), - page: z.coerce.number().int().min(0).default(0), - limit: z.coerce.number().int().min(1).max(1000).default(1), - q: z.string().default(""), - }) + "query", + z.object({ + includeTrashed: z + .string() + .optional() + .transform((v) => v?.toLowerCase() === "true"), + withMetadata: z + .string() + .optional() + .transform((v) => v?.toLowerCase() === "true"), + page: z.coerce.number().int().min(0).default(0), + limit: z.coerce.number().int().min(1).max(1000).default(10), + q: z.string().default(""), // Keyword search + }) ), async (c) => { - const { includeTrashed, page, limit, q } = c.req.valid("query"); - - const totalCountQuery = includeTrashed - ? sql`(SELECT count(*) FROM ${users})` - : sql`(SELECT count(*) FROM ${users} WHERE ${users.deletedAt} IS NULL)`; - - const result = await db - .select({ - id: users.id, - name: users.name, - email: users.email, - username: users.username, - isEnabled: users.isEnabled, - createdAt: users.createdAt, - updatedAt: users.updatedAt, - ...(includeTrashed ? { deletedAt: users.deletedAt } : {}), - fullCount: totalCountQuery, - }) - .from(users) - .where( - and( - includeTrashed ? undefined : isNull(users.deletedAt), - q - ? or( - ilike(users.name, q), - ilike(users.username, q), - ilike(users.email, q), - eq(users.id, q) - ) - : undefined + const { includeTrashed, page, limit, q } = c.req.valid("query"); + + // Query to count total data without duplicates + const totalCountQuery = db + .select({ + count: sql`count(distinct ${users.id})`, + }) + .from(users) + .leftJoin(respondents, eq(users.id, respondents.userId)) + .leftJoin(rolesToUsers, eq(users.id, rolesToUsers.userId)) + .leftJoin(rolesSchema, eq(rolesToUsers.roleId, rolesSchema.id)) + .where( + and( + includeTrashed ? undefined : isNull(users.deletedAt), + q + ? or( + ilike(users.name, `%${q}%`), // Search by name + ilike(users.username, `%${q}%`), // Search by username + ilike(users.email, `%${q}%`), // Search by email + ilike(respondents.companyName, `%${q}%`), // Search by companyName (from respondents) + ilike(rolesSchema.name, `%${q}%`) // Search by role name (from rolesSchema) ) - ) - .offset(page * limit) - .limit(limit); - - return c.json({ - data: result.map((d) => ({ ...d, fullCount: undefined })), - _metadata: { - currentPage: page, - totalPages: Math.ceil( - (Number(result[0]?.fullCount) ?? 0) / limit - ), - totalItems: Number(result[0]?.fullCount) ?? 0, - perPage: limit, - }, - }); + : undefined + ) + ); + + // Get the total count result from the query + const totalCountResult = await totalCountQuery; + const totalCount = totalCountResult[0]?.count || 0; + + // Query to get unique user IDs based on pagination (Sub Query) + const userIdsQuery = db + .select({ + id: users.id, + }) + .from(users) + .leftJoin(respondents, eq(users.id, respondents.userId)) + .leftJoin(rolesToUsers, eq(users.id, rolesToUsers.userId)) + .leftJoin(rolesSchema, eq(rolesToUsers.roleId, rolesSchema.id)) + .where( + and( + includeTrashed ? undefined : isNull(users.deletedAt), + q + ? or( + ilike(users.name, `%${q}%`), // Search by name + ilike(users.username, `%${q}%`), // Search by username + ilike(users.email, `%${q}%`), + ilike(respondents.companyName, `%${q}%`), + ilike(rolesSchema.name, `%${q}%`) + ) + : undefined + ) + ) + .groupBy(users.id) // Group by user ID to avoid the effect of duplicate data + .offset(page * limit) + .limit(limit); + + // Main Query + const result = await db + .select({ + id: users.id, + name: users.name, + email: users.email, + username: users.username, + isEnabled: users.isEnabled, + createdAt: users.createdAt, + updatedAt: users.updatedAt, + ...(includeTrashed ? { deletedAt: users.deletedAt } : {}), + company: respondents.companyName, + role: { + name: rolesSchema.name, + id: rolesSchema.id, + }, + }) + .from(users) + .leftJoin(respondents, eq(users.id, respondents.userId)) + .leftJoin(rolesToUsers, eq(users.id, rolesToUsers.userId)) + .leftJoin(rolesSchema, eq(rolesToUsers.roleId, rolesSchema.id)) + .where(inArray(users.id, userIdsQuery)) // Only take data based on IDs from subquery + .orderBy(users.createdAt); + + // Group roles for each user to avoid duplication + const userMap = new Map< + string, + { + id: string; + name: string; + email: string | null; + username: string; + isEnabled: boolean; + createdAt: Date; + updatedAt: Date; + deletedAt?: Date; + company: string | null; + roles: { id: string; name: string }[]; + } + >(); + + result.forEach((item) => { + if (!userMap.has(item.id)) { + userMap.set(item.id, { + id: item.id, + name: item.name, + email: item.email ?? null, + username: item.username, + isEnabled: item.isEnabled ?? false, + createdAt: item.createdAt ?? new Date(), + updatedAt: item.updatedAt ?? new Date(), + deletedAt: item.deletedAt ?? undefined, + company: item.company, + roles: item.role + ? [{ id: item.role.id, name: item.role.name }] + : [], + }); + } else { + const existingUser = userMap.get(item.id); + if (item.role) { + existingUser?.roles.push({ + id: item.role.id, + name: item.role.name, + }); + } + } + }); + + // Return user data without duplicates, with roles array + const groupedData = Array.from(userMap.values()); + + return c.json({ + data: groupedData, + _metadata: { + currentPage: page, + totalPages: Math.ceil(totalCount / limit), + totalItems: totalCount, + perPage: limit, + }, + }); } - ) + ) + //get user by id .get( "/:id", @@ -139,7 +224,12 @@ const usersRoute = new Hono() .select({ id: users.id, name: users.name, + position: respondents.position, + workExperience: respondents.workExperience, email: users.email, + companyName: respondents.companyName, + address: respondents.address, + phoneNumber: respondents.phoneNumber, username: users.username, isEnabled: users.isEnabled, createdAt: users.createdAt, @@ -151,6 +241,7 @@ const usersRoute = new Hono() }, }) .from(users) + .leftJoin(respondents, eq(users.id, respondents.userId)) .leftJoin(rolesToUsers, eq(users.id, rolesToUsers.userId)) .leftJoin(rolesSchema, eq(rolesToUsers.roleId, rolesSchema.id)) .where( @@ -161,9 +252,9 @@ const usersRoute = new Hono() ); if (!queryResult.length) - throw new HTTPException(404, { - message: "The user does not exists", - }); + throw notFound({ + message : "The user does not exists", + }) const roles = queryResult.reduce((prev, curr) => { if (!curr.role) return prev; @@ -180,38 +271,121 @@ const usersRoute = new Hono() return c.json(userData); } ) + //create user .post( "/", checkPermission("users.create"), - requestValidator("form", userFormSchema), + requestValidator("json", userFormSchema), async (c) => { - const userData = c.req.valid("form"); + const userData = c.req.valid("json"); - const user = await db - .insert(users) - .values({ - name: userData.name, - username: userData.username, - email: userData.email, - password: await hashPassword(userData.password), - isEnabled: userData.isEnabled.toLowerCase() === "true", - }) - .returning(); - - if (userData.roles) { - const roles = JSON.parse(userData.roles) as string[]; - console.log(roles); - - if (roles.length) { - await db.insert(rolesToUsers).values( - roles.map((role) => ({ - userId: user[0].id, - roleId: role, - })) - ); - } + // Check if the provided email or username is already exists in database + const conditions = []; + if (userData.email) { + conditions.push(eq(users.email, userData.email)); } + conditions.push(eq(users.username, userData.username)); + + const existingUser = await db + .select() + .from(users) + .where( + or( + eq(users.email, userData.email), + eq(users.username, userData.username) + ) + ); + + const existingRespondent = await db + .select() + .from(respondents) + .where(eq(respondents.phoneNumber, userData.phoneNumber)); + + if (existingUser.length > 0) { + throw forbidden({ + message: "Email or username has been registered", + }) + } + + if (existingRespondent.length > 0) { + throw forbidden({ + message: "Phone number has been registered", + }) + } + + // Hash the password + const hashedPassword = await hashPassword(userData.password); + + // Start a transaction + const result = await db.transaction(async (trx) => { + // Create user + const [newUser] = await trx + .insert(users) + .values({ + name: userData.name, + username: userData.username, + email: userData.email, + password: hashedPassword, + isEnabled: userData.isEnabled?.toLowerCase() === "true" || true, + }) + .returning() + .catch(() => { + throw forbidden({ + message: "Error creating user", + }) + }); + + // Create respondent + const [newRespondent] = await trx + .insert(respondents) + .values({ + companyName: userData.companyName, + position: userData.position, + workExperience: userData.workExperience + " Tahun", + address: userData.address, + phoneNumber: userData.phoneNumber, + userId: newUser.id, + }) + .returning() + .catch((err) => { + throw new HTTPException(500, { + message: "Error creating respondent: " + err.message, + }); + }); + + // Add other roles if provided + if (userData.roles && userData.roles.length > 0) { + const roles = userData.roles; + + for (let roleId of roles) { + const role = ( + await trx + .select() + .from(rolesSchema) + .where(eq(rolesSchema.id, roleId)) + .limit(1) + )[0]; + + if (role) { + await trx.insert(rolesToUsers).values({ + userId: newUser.id, + roleId: role.id, + }); + } else { + throw new HTTPException(404, { + message: `Role ${roleId} does not exists`, + }); + } + } + } else { + throw forbidden({ + message: "Harap pilih minimal satu role", + }); + } + + return newUser; + }); return c.json( { @@ -226,10 +400,32 @@ const usersRoute = new Hono() .patch( "/:id", checkPermission("users.update"), - requestValidator("form", userUpdateSchema), + requestValidator("json", userUpdateSchema), async (c) => { const userId = c.req.param("id"); - const userData = c.req.valid("form"); + const userData = c.req.valid("json"); + + // Check if the provided email or username is already exists in the database (excluding the current user) + if (userData.email || userData.username) { + const existingUser = await db + .select() + .from(users) + .where( + and( + or( + eq(users.email, userData.email), + eq(users.username, userData.username) + ), + not(eq(users.id, userId)) + ) + ); + + if (existingUser.length > 0) { + throw forbidden({ + message: "Email or username has been registered by another user", + }) + } + } const user = await db .select() @@ -238,18 +434,70 @@ const usersRoute = new Hono() if (!user[0]) return c.notFound(); - await db - .update(users) - .set({ - ...userData, - ...(userData.password - ? { password: await hashPassword(userData.password) } - : {}), - updatedAt: new Date(), - isEnabled: userData.isEnabled.toLowerCase() === "true", - }) - .where(eq(users.id, userId)); + // Start transaction to update both user and respondent + await db.transaction(async (trx) => { + // Update user + await trx + .update(users) + .set({ + name: userData.name, + username: userData.username, + email: userData.email, + updatedAt: new Date(), + isEnabled: userData.isEnabled.toLowerCase() === "true", + }) + .where(eq(users.id, userId)); + // Update respondent data if provided + if (userData.companyName || userData.position || userData.workExperience || userData.address || userData.phoneNumber) { + await trx + .update(respondents) + .set({ + ...(userData.companyName ? {companyName: userData.companyName} : {}), + ...(userData.position ? {position: userData.position} : {}), + ...(userData.workExperience ? {workExperience: userData.workExperience} : {}), + ...(userData.address ? {address: userData.address} : {}), + ...(userData.phoneNumber ? {phoneNumber: userData.phoneNumber} : {}), + updatedAt: new Date(), + }) + .where(eq(respondents.userId, userId)); + } + + // Update roles if provided + if (userData.roles && userData.roles.length > 0) { + const roles = userData.roles; + + // Remove existing roles for the user + await trx.delete(rolesToUsers).where(eq(rolesToUsers.userId, userId)); + + // Assign new roles + for (let roleId of roles) { + const role = ( + await trx + .select() + .from(rolesSchema) + .where(eq(rolesSchema.id, roleId)) + .limit(1) + )[0]; + + if (role) { + await trx.insert(rolesToUsers).values({ + userId: userId, + roleId: role.id, + }); + } else { + throw new HTTPException(404, { + message: `Role ${roleId} does not exist`, + }); + } + } + } else { + throw forbidden({ + message: "Harap pilih minimal satu role", + }); + } + }); + return c.json({ message: "User updated successfully", }); @@ -273,6 +521,7 @@ const usersRoute = new Hono() const skipTrash = c.req.valid("form").skipTrash.toLowerCase() === "true"; + // Check if the user exists const user = await db .select() .from(users) @@ -283,17 +532,20 @@ const usersRoute = new Hono() ) ); + // Throw error if the user does not exist if (!user[0]) - throw new HTTPException(404, { + throw notFound ({ message: "The user is not found", }); + // Throw error if the user is trying to delete themselves if (user[0].id === currentUserId) { - throw new HTTPException(400, { + throw forbidden ({ message: "You cannot delete yourself", }); } + // Delete or soft delete user if (skipTrash) { await db.delete(users).where(eq(users.id, userId)); } else { @@ -311,28 +563,34 @@ const usersRoute = new Hono() ) //undo delete - .patch("/restore/:id", checkPermission("users.restore"), async (c) => { - const userId = c.req.param("id"); + .patch( + "/restore/:id", + checkPermission("users.restore"), + async (c) => { + const userId = c.req.param("id"); - const user = ( - await db.select().from(users).where(eq(users.id, userId)) - )[0]; + // Check if the user exists + const user = ( + await db.select().from(users).where(eq(users.id, userId)) + )[0]; - if (!user) return c.notFound(); + if (!user) return c.notFound(); - if (!user.deletedAt) { - throw new HTTPException(400, { - message: "The user is not deleted", + // Throw error if the user is not deleted + if (!user.deletedAt) { + throw forbidden({ + message: "The user is not deleted", + }); + } + + // Restore user + await db + .update(users) + .set({ deletedAt: null }) + .where(eq(users.id, userId)); + + return c.json({ + message: "User restored successfully", }); - } - - await db - .update(users) - .set({ deletedAt: null }) - .where(eq(users.id, userId)); - - return c.json({ - message: "User restored successfully", - }); }); export default usersRoute; diff --git a/apps/backend/src/types/HonoEnv.d.ts b/apps/backend/src/types/HonoEnv.d.ts index 4cf35db..e9ceb7d 100644 --- a/apps/backend/src/types/HonoEnv.d.ts +++ b/apps/backend/src/types/HonoEnv.d.ts @@ -5,6 +5,7 @@ type HonoEnv = { Variables: { uid?: string; currentUser?: { + id: string; name: string; permissions: SpecificPermissionCode[]; roles: RoleCode[]; diff --git a/apps/backend/src/utils/authUtils.ts b/apps/backend/src/utils/authUtils.ts index 99019f4..09f19b3 100644 --- a/apps/backend/src/utils/authUtils.ts +++ b/apps/backend/src/utils/authUtils.ts @@ -4,6 +4,7 @@ import appEnv from "../appEnv"; // Environment variables for secrets, defaulting to a random secret if not set. const accessTokenSecret = appEnv.ACCESS_TOKEN_SECRET; const refreshTokenSecret = appEnv.REFRESH_TOKEN_SECRET; +const resetPasswordTokenSecret = appEnv.RESET_PASSWORD_TOKEN_SECRET; // Algorithm to be used for JWT encoding. const algorithm: jwt.Algorithm = "HS256"; @@ -11,6 +12,7 @@ const algorithm: jwt.Algorithm = "HS256"; // Expiry settings for tokens. 'null' signifies no expiry. export const accessTokenExpiry: number | string | null = null; export const refreshTokenExpiry: number | string | null = "30d"; +export const resetPasswordTokenExpiry: number | string | null = null; // Interfaces to describe the payload structure for access and refresh tokens. interface AccessTokenPayload { @@ -21,6 +23,10 @@ interface RefreshTokenPayload { uid: string; } +interface ResetPasswordTokenPayload { + uid: string; +} + /** * Generates a JSON Web Token (JWT) for access control using a specified payload. * @@ -84,3 +90,35 @@ export const verifyRefreshToken = async (token: string) => { return null; } }; + +/** + * Generates a JSON Web Token (JWT) for reset password using a specified payload. + * + * @param payload - The payload containing user-specific data for the token. + * @returns A promise that resolves to the generated JWT string. + */ +export const generateResetPasswordToken = async (payload: ResetPasswordTokenPayload) => { + const token = jwt.sign(payload, resetPasswordTokenSecret, { + algorithm, + ...(resetPasswordTokenExpiry ? { expiresIn: resetPasswordTokenExpiry } : {}), + }); + return token; +}; + +/** + * Verifies a given reset password token and decodes the payload if the token is valid. + * + * @param token - The JWT string to verify. + * @returns A promise that resolves to the decoded payload or null if verification fails. + */ +export const verifyResetPasswordToken = async (token: string) => { + try { + const payload = jwt.verify( + token, + resetPasswordTokenSecret + ) as ResetPasswordTokenPayload; + return payload; + } catch { + return null; + } +}; \ No newline at end of file diff --git a/apps/backend/src/utils/mailerUtils.ts b/apps/backend/src/utils/mailerUtils.ts new file mode 100644 index 0000000..4f5d660 --- /dev/null +++ b/apps/backend/src/utils/mailerUtils.ts @@ -0,0 +1,33 @@ +import nodemailer from 'nodemailer'; +import appEnv from '../appEnv'; + +/** + * Nodemailer configuration + */ +const transporter = nodemailer.createTransport({ + host: appEnv.SMTP_HOST, + port: appEnv.SMTP_PORT, + secure: false, + auth: { + user: appEnv.SMTP_USERNAME, + pass: appEnv.SMTP_PASSWORD, + }, + tls: { + rejectUnauthorized: false, + }, +}); + +export async function sendResetPasswordEmail(to: string, token: string) { + const resetUrl = appEnv.BASE_URL + '/forgot-password/verify?token=' + token; + + const info = await transporter.sendMail({ + from: `"Your App" <${appEnv.SMTP_USERNAME}>`, + to, + subject: 'Password Reset Request', + text: `You requested a password reset. Click this link to reset your password: ${resetUrl}`, + html: `

You requested a password reset. Click this link to reset your password:
${resetUrl}

`, + }); + + console.log('Email sent: %s', info.messageId); + return info; +} diff --git a/apps/frontend/index.html b/apps/frontend/index.html index e4b78ea..1370af7 100644 --- a/apps/frontend/index.html +++ b/apps/frontend/index.html @@ -2,9 +2,9 @@ - + - Vite + React + TS + Amati
diff --git a/apps/frontend/package.json b/apps/frontend/package.json index b89c51a..1e5f62b 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -10,11 +10,22 @@ }, "dependencies": { "@emotion/react": "^11.11.4", + "@hookform/resolvers": "^3.9.0", "@mantine/core": "^7.10.2", "@mantine/dates": "^7.10.2", "@mantine/form": "^7.10.2", "@mantine/hooks": "^7.10.2", "@mantine/notifications": "^7.10.2", + "@paralleldrive/cuid2": "^2.2.2", + "@radix-ui/react-alert-dialog": "^1.1.2", + "@radix-ui/react-avatar": "^1.1.0", + "@radix-ui/react-checkbox": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-radio-group": "^1.2.0", + "@radix-ui/react-scroll-area": "^1.1.0", + "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-slot": "^1.1.0", "@tanstack/react-query": "^5.45.0", "@tanstack/react-router": "^1.38.1", @@ -24,11 +35,14 @@ "clsx": "^2.1.1", "dayjs": "^1.11.11", "hono": "^4.4.6", + "html2pdf.js": "^0.10.2", "lucide-react": "^0.414.0", "mantine-form-zod-resolver": "^1.1.0", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-hook-form": "^7.53.0", "react-icons": "^5.2.1", + "recharts": "^2.13.0", "tailwind-merge": "^2.4.0", "tailwindcss-animate": "^1.0.7", "zod": "^3.23.8" diff --git a/apps/frontend/src/assets/backgrounds/backgroundLogin.png b/apps/frontend/src/assets/backgrounds/backgroundLogin.png new file mode 100644 index 0000000..3eba5c9 Binary files /dev/null and b/apps/frontend/src/assets/backgrounds/backgroundLogin.png differ diff --git a/apps/frontend/src/assets/backgrounds/backgroundLoginMobile.png b/apps/frontend/src/assets/backgrounds/backgroundLoginMobile.png new file mode 100644 index 0000000..3032a38 Binary files /dev/null and b/apps/frontend/src/assets/backgrounds/backgroundLoginMobile.png differ diff --git a/apps/frontend/src/assets/logos/amati-icon.png b/apps/frontend/src/assets/logos/amati-icon.png new file mode 100644 index 0000000..8969c76 Binary files /dev/null and b/apps/frontend/src/assets/logos/amati-icon.png differ diff --git a/apps/frontend/src/assets/logos/amati-logo-old.png b/apps/frontend/src/assets/logos/amati-logo-old.png new file mode 100644 index 0000000..bf15f56 Binary files /dev/null and b/apps/frontend/src/assets/logos/amati-logo-old.png differ diff --git a/apps/frontend/src/assets/logos/amati-logo-old2.png b/apps/frontend/src/assets/logos/amati-logo-old2.png new file mode 100644 index 0000000..7f94e49 Binary files /dev/null and b/apps/frontend/src/assets/logos/amati-logo-old2.png differ diff --git a/apps/frontend/src/assets/logos/amati-logo.png b/apps/frontend/src/assets/logos/amati-logo.png new file mode 100644 index 0000000..09c860a Binary files /dev/null and b/apps/frontend/src/assets/logos/amati-logo.png differ diff --git a/apps/frontend/src/components/AppHeader.tsx b/apps/frontend/src/components/AppHeader.tsx index 836b93d..8e3fec6 100644 --- a/apps/frontend/src/components/AppHeader.tsx +++ b/apps/frontend/src/components/AppHeader.tsx @@ -1,96 +1,195 @@ import { useState } from "react"; -import { - AppShell, - Avatar, - Burger, - Group, - Menu, - UnstyledButton, - Text, - rem, -} from "@mantine/core"; -import logo from "@/assets/logos/logo.png"; +import logo from "@/assets/logos/amati-logo.png"; import cx from "clsx"; import classNames from "./styles/appHeader.module.css"; -import { TbChevronDown } from "react-icons/tb"; -import { Link } from "@tanstack/react-router"; +import { IoMdMenu } from "react-icons/io"; +import { Link, useLocation } from "@tanstack/react-router"; import useAuth from "@/hooks/useAuth"; +import { Avatar, AvatarFallback, AvatarImage } from "@/shadcn/components/ui/avatar"; +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/shadcn/components/ui/dropdown-menu"; +import { Button } from "@/shadcn/components/ui/button"; +import { TbMenu2 } from "react-icons/tb"; // import getUserMenus from "../actions/getUserMenus"; // import { useAuth } from "@/modules/auth/contexts/AuthContext"; // import UserMenuItem from "./UserMenuItem"; +// import { toggleLeftSidebar } from "../../src/routes/_assessmentLayout/assessment/index.lazy"; interface Props { openNavbar: boolean; toggle: () => void; } +interface User { + id: string; + name: string; + permissions: string[]; + role: string; + photoProfile?: string; +} + +interface Props { + toggle: () => void; +} + // const mockUserData = { // name: "Fulan bin Fulanah", // email: "janspoon@fighter.dev", // image: "https://raw.githubusercontent.com/mantinedev/mantine/master/.demo/avatars/avatar-5.png", // }; -export default function AppHeader(props: Props) { - const [userMenuOpened, setUserMenuOpened] = useState(false); +interface Props { + toggle: () => void; + toggleLeftSidebar: () => void; // Add this prop + } - const { user } = useAuth(); +export default function AppHeader({ toggle, toggleLeftSidebar }: Props) { + const [userMenuOpened, setUserMenuOpened] = useState(false); + const [isLeftSidebarOpen, setIsLeftSidebarOpen] = useState(false); + + const { user }: { user: User | null } = useAuth(); + const isSuperAdmin = user?.role === "super-admin"; // const userMenus = getUserMenus().map((item, i) => ( // // )); + // const toggleLeftSidebar = () => setIsLeftSidebarOpen(!isLeftSidebarOpen); + + const { pathname } = useLocation(); + const showAssessmentResultLinks = pathname === "/assessmentResult"; + const showAssessmentLinks = pathname === "/assessment"; + const showVerifyingAssessmentLinks = pathname === "/verifying"; + const assessmentRequestsLinks = pathname === "/assessmentRequest"; + const managementResultsLinks = pathname === "/assessmentResultsManagement"; + + const shouldShowButton = !(showAssessmentResultLinks || showAssessmentLinks || assessmentRequestsLinks || showVerifyingAssessmentLinks ); + return ( - - - - - setUserMenuOpened(true)} - onClose={() => setUserMenuOpened(false)} - withinPortal +
+
+
+ {shouldShowButton && ( + + )} + + {(showAssessmentLinks || showVerifyingAssessmentLinks || showAssessmentResultLinks) && ( + + )} + + Logo +
+ + {/* Conditional Navlinks */} + {!isSuperAdmin && ( +
+ {showAssessmentResultLinks && ( + <> + { + if (window.opener) { + window.close(); + } + }} + > + Permohonan Asesmen + + + Hasil Asesmen + + + )} + + {showAssessmentLinks && ( + <> + { + if (window.opener) { + window.close(); + } + }} + > + Permohonan Asesmen + + + Asesmen + + + )} +
+ )} + + - - + + - - - Logout - - - {/* {userMenus} */} - -
-
-
+ + + Logout + + + + + ); } diff --git a/apps/frontend/src/components/AppNavbar.tsx b/apps/frontend/src/components/AppNavbar.tsx index d44397c..00c8ce2 100644 --- a/apps/frontend/src/components/AppNavbar.tsx +++ b/apps/frontend/src/components/AppNavbar.tsx @@ -1,7 +1,11 @@ -import { AppShell, ScrollArea } from "@mantine/core"; import { useQuery } from "@tanstack/react-query"; import client from "../honoClient"; import MenuItem from "./NavbarMenuItem"; +import { useState, useEffect } from "react"; +import { useLocation } from "@tanstack/react-router"; +import { ScrollArea } from "@/shadcn/components/ui/scroll-area"; +import AppHeader from "./AppHeader"; +import useAuth from "@/hooks/useAuth"; // import MenuItem from "./SidebarMenuItem"; // import { useAuth } from "@/modules/auth/contexts/AuthContext"; @@ -13,7 +17,21 @@ import MenuItem from "./NavbarMenuItem"; * @returns A React element representing the application's navigation bar. */ export default function AppNavbar() { - // const {user} = useAuth(); + const { user } = useAuth(); + // const userRole = JSON.parse(localStorage.getItem('userRole') || '{}'); + + const { pathname } = useLocation(); + const pathsThatCloseSidebar = ["/assessmentRequest", "/assessmentResult", "/assessment", "/verifying"]; + + const [isSidebarOpen, setSidebarOpen] = useState(true); + const [isLeftSidebarOpen, setIsLeftSidebarOpen] = useState(false); + const toggleSidebar = () => { + setSidebarOpen(!isSidebarOpen); + }; + + const toggleLeftSidebar = () => { + setIsLeftSidebarOpen(!isLeftSidebarOpen); + }; const { data } = useQuery({ queryKey: ["sidebarData"], @@ -21,24 +39,81 @@ export default function AppNavbar() { const res = await client.dashboard.getSidebarItems.$get(); if (res.ok) { const data = await res.json(); - return data; } console.error("Error:", res.status, res.statusText); - - //TODO: Handle error properly throw new Error("Error fetching sidebar data"); }, }); + useEffect(() => { + const handleResize = () => { + if (window.innerWidth < 768) { // Ganti 768 dengan breakpoint mobile Anda + setSidebarOpen(false); + } else { + setSidebarOpen(!pathsThatCloseSidebar.includes(pathname)); + } + }; + + window.addEventListener('resize', handleResize); + handleResize(); // Initial check + + return () => window.removeEventListener('resize', handleResize); + }, []); + + const handleMenuItemClick = () => { + if (window.innerWidth < 768) { + setSidebarOpen(false); + } + }; + + useEffect(() => { + if (pathname === "/assessment"){ + setSidebarOpen(false); + } + }) + + // Filter sidebar menu items according to user role + const filteredData = data?.filter(menu => { + if (user?.role === "super-admin") { + return [ + "/users", + "/aspect", + "/questions", + "/assessmentRequestManagements", + "/assessmentResultsManagement", + ].includes(menu.link as string); + } else if (user?.role === "user") { + return ["/assessmentRequest"].includes(menu.link as string); + } + return false; // If role is not recognized, show nothing + }); + return ( - - - {data?.map((menu, i) => )} - {/* {user?.sidebarMenus.map((menu, i) => ( - - )) ?? null} */} - - + <> +
+ {/* Header */} + + + {/* Sidebar */} + {!pathsThatCloseSidebar.includes(pathname) && ( +
+ + {filteredData?.map((menu, i) => ( + + ))} + +
+ )} +
+ ); } diff --git a/apps/frontend/src/components/DashboardTable.tsx b/apps/frontend/src/components/DashboardTable.tsx index 1b03a27..065e8d3 100644 --- a/apps/frontend/src/components/DashboardTable.tsx +++ b/apps/frontend/src/components/DashboardTable.tsx @@ -1,5 +1,13 @@ -import { Table, Center, ScrollArea } from "@mantine/core"; -import { Table as ReactTable, flexRender } from "@tanstack/react-table"; +import { ScrollArea } from "@/shadcn/components/ui/scroll-area"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow +} from "@/shadcn/components/ui/table"; +import { flexRender, Table as ReactTable } from "@tanstack/react-table"; interface Props { table: ReactTable; @@ -7,68 +15,57 @@ interface Props { export default function DashboardTable({ table }: Props) { return ( - - - {/* Thead */} - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => ( - - {header.isPlaceholder - ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} - - ))} - +
+
+ + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + {header.isPlaceholder + ? null + : flexRender(header.column.columnDef.header, header.getContext())} + ))} - + + ))} + - {/* Tbody */} - - {table.getRowModel().rows.length > 0 ? ( - table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - - {flexRender( - cell.column.columnDef.cell, - cell.getContext() - )} - - ))} - - )) - ) : ( - - -
- No Data -
-
-
- )} -
+ + {table.getRowModel().rows.length > 0 ? ( + table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + )) + ) : ( + + + - No Data - + + + )} +
-
+ ); } diff --git a/apps/frontend/src/components/NavbarChildMenu.tsx b/apps/frontend/src/components/NavbarChildMenu.tsx index 3f09f2f..5ed22ef 100644 --- a/apps/frontend/src/components/NavbarChildMenu.tsx +++ b/apps/frontend/src/components/NavbarChildMenu.tsx @@ -1,5 +1,3 @@ -import { Text } from "@mantine/core"; - import classNames from "./styles/navbarChildMenu.module.css"; import { SidebarMenu } from "backend/types"; @@ -22,13 +20,10 @@ export default function ChildMenu(props: Props) { : `/${props.item.link}`; return ( - - component="a" - className={classNames.link} - href={`${linkPath}`} - fw={props.active ? "bold" : "normal"} + {props.item.label} - + ); } diff --git a/apps/frontend/src/components/NavbarMenuItem.tsx b/apps/frontend/src/components/NavbarMenuItem.tsx index fc0e202..12494d1 100644 --- a/apps/frontend/src/components/NavbarMenuItem.tsx +++ b/apps/frontend/src/components/NavbarMenuItem.tsx @@ -1,17 +1,6 @@ import { useState } from "react"; - -import { - Box, - Collapse, - Group, - ThemeIcon, - UnstyledButton, - rem, -} from "@mantine/core"; -import { TbChevronRight } from "react-icons/tb"; import * as TbIcons from "react-icons/tb"; - -import classNames from "./styles/navbarMenuItem.module.css"; +// import classNames from "./styles/navbarMenuItem.module.css"; // import dashboardConfig from "../dashboard.config"; // import { usePathname } from "next/navigation"; // import areURLsSame from "@/utils/areUrlSame"; @@ -19,9 +8,14 @@ import classNames from "./styles/navbarMenuItem.module.css"; import { SidebarMenu } from "backend/types"; import ChildMenu from "./NavbarChildMenu"; import { Link } from "@tanstack/react-router"; +import { Button } from "@/shadcn/components/ui/button"; +import { ChevronRightIcon} from "lucide-react"; +import { cn } from "@/lib/utils"; interface Props { menu: SidebarMenu; + isActive: boolean; + onClick: (link: string) => void; } //TODO: Make bold and collapsed when the item is active @@ -34,7 +28,7 @@ interface Props { * @param props.menu - The menu item data to display. * @returns A React element representing an individual menu item. */ -export default function MenuItem({ menu }: Props) { +export default function MenuItem({ menu, isActive, onClick }: Props) { const hasChildren = Array.isArray(menu.children); // const pathname = usePathname(); @@ -50,6 +44,13 @@ export default function MenuItem({ menu }: Props) { setOpened((prev) => !prev); }; + const handleClick = () => { + onClick(menu.link ?? ""); + if (!hasChildren) { + toggleOpenMenu(); + } + }; + // Mapping children menu items if available const subItems = (hasChildren ? menu.children! : []).map((child, index) => ( @@ -69,43 +70,41 @@ export default function MenuItem({ menu }: Props) { return ( <> {/* Main Menu Item */} - - onClick={toggleOpenMenu} - className={`${classNames.control} py-2`} - to={menu.link} - component={menu.link ? Link : "button"} + {/* Collapsible Sub-Menu */} - {hasChildren && {subItems}} + {hasChildren && ( +
+ {subItems} +
+ )} ); } diff --git a/apps/frontend/src/components/PageTemplate.tsx b/apps/frontend/src/components/PageTemplate.tsx index 3107229..406aca1 100644 --- a/apps/frontend/src/components/PageTemplate.tsx +++ b/apps/frontend/src/components/PageTemplate.tsx @@ -1,16 +1,4 @@ /* eslint-disable no-mixed-spaces-and-tabs */ -import { - Button, - Card, - Flex, - Pagination, - Select, - Stack, - Text, - TextInput, - Title, -} from "@mantine/core"; -import { Link } from "@tanstack/react-router"; import React, { ReactNode, useState } from "react"; import { TbPlus, TbSearch } from "react-icons/tb"; import DashboardTable from "./DashboardTable"; @@ -25,7 +13,25 @@ import { keepPreviousData, useQuery, } from "@tanstack/react-query"; -import { useDebouncedCallback } from "@mantine/hooks"; +import { useDebouncedValue } from "@mantine/hooks"; +import { Button } from "@/shadcn/components/ui/button"; +import { useLocation, useNavigate } from "@tanstack/react-router"; +import { Card } from "@/shadcn/components/ui/card"; +import { Input } from "@/shadcn/components/ui/input"; +import { + Pagination, + PaginationContent, + PaginationEllipsis, + PaginationItem, +} from "@/shadcn/components/ui/pagination"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/shadcn/components/ui/select"; +import { HiChevronLeft, HiChevronRight } from "react-icons/hi"; type PaginatedResponse> = { data: Array; @@ -70,24 +76,36 @@ const createCreateButton = ( // eslint-disable-next-line @typescript-eslint/no-explicit-any property: Props["createButton"] = true ) => { + const navigate = useNavigate(); + + const addQuery = () => { + navigate({ to: `${window.location.pathname}`, search: { create: true } }); + } + if (property === true) { + const location = useLocation(); + const isAssessmentRequestPage = + location.pathname === "/assessmentRequest"; + return ( ); } else if (typeof property === "string") { return ( ); } else { @@ -95,6 +113,109 @@ const createCreateButton = ( } }; +/** + * Pagination component for handling page navigation. + * + * @param props - The properties object. + * @returns The rendered Pagination component. + */ +const CustomPagination = ({ + currentPage, + totalPages, + onChange, +}: { + currentPage: number; + totalPages: number; + onChange: (page: number) => void; +}) => { + const getPaginationItems = () => { + let items = []; + + // Determine start and end pages + let startPage = + currentPage == totalPages && currentPage > 3 ? + Math.max(1, currentPage - 2) : + Math.max(1, currentPage - 1); + let endPage = + currentPage == 1 ? + Math.min(totalPages, currentPage + 2) : + Math.min(totalPages, currentPage + 1); + + // Add ellipsis if needed + if (startPage > 2) { + items.push(); + } + + // Add page numbers + for (let i = startPage; i <= endPage; i++) { + items.push( + + ); + } + + // Add ellipsis after + if (endPage < totalPages - 1) { + items.push(); + } + + // Add last page + if (endPage < totalPages) { + items.push( + + ); + } + if (currentPage > 2) { + items.unshift( + + ); + } + + return items; + }; + + return ( + + + + + +
+ {getPaginationItems().map((item) => ( + + {item} + + ))} +
+ + + +
+
+ ); +}; + /** * PageTemplate component for displaying a paginated table with search and filter functionality. @@ -113,15 +234,15 @@ export default function PageTemplate< q: "", }); - // const [deboucedSearchQuery] = useDebouncedValue(filterOptions.q, 500); + const [debouncedSearchQuery] = useDebouncedValue(filterOptions.q, 500); const query = useQuery({ ...(typeof props.queryOptions === "function" ? props.queryOptions( - filterOptions.page, - filterOptions.limit, - filterOptions.q - ) + filterOptions.page, + filterOptions.limit, + debouncedSearchQuery + ) : props.queryOptions), placeholderData: keepPreviousData, }); @@ -131,7 +252,11 @@ export default function PageTemplate< columns: props.columnDefs, getCoreRowModel: getCoreRowModel(), defaultColumn: { - cell: (props) => {props.getValue() as ReactNode}, + cell: (props) => ( + + {props.getValue() as ReactNode} + + ), }, }); @@ -140,13 +265,13 @@ export default function PageTemplate< * * @param value - The new search query value. */ - const handleSearchQueryChange = useDebouncedCallback((value: string) => { + const handleSearchQueryChange = (value: string) => { setFilterOptions((prev) => ({ page: 0, limit: prev.limit, q: value, })); - }, 500); + }; /** * Handles the change in page number. @@ -155,33 +280,34 @@ export default function PageTemplate< */ const handlePageChange = (page: number) => { setFilterOptions((prev) => ({ - page: page - 1, + page: page - 1, // Adjust for zero-based index limit: prev.limit, q: prev.q, })); }; return ( - - {props.title} - - {/* Top Section */} - - {createCreateButton(props.createButton)} - - +
+

{props.title}

+ {/* Table Functionality */}
- {/* Search */} -
- } - value={filterOptions.q} - onChange={(e) => - handleSearchQueryChange(e.target.value) - } - placeholder="Search..." - /> + {/* Search and Create Button */} +
+
+ + handleSearchQueryChange(e.target.value)} + placeholder="Pencarian..." + /> +
+
+ {createCreateButton(props.createButton)} +
{/* Table */} @@ -189,41 +315,50 @@ export default function PageTemplate< {/* Pagination */} {query.data && ( -
- + setFilterOptions((prev) => ({ + page: prev.page, + limit: parseInt(value ?? "10"), + q: prev.q, + })) + } + defaultValue="10" + > + + + + + 5 + 10 + 50 + 100 + 500 + 1000 + + +
+ - - Showing {query.data.data.length} of{" "} - {query.data._metadata.totalItems} - +
+ + Menampilkan {query.data.data.length} dari {query.data._metadata.totalItems} + +
)}
- {/* The Modals */} {props.modals?.map((modal, index) => ( {modal} ))}
- +
); } diff --git a/apps/frontend/src/contexts/AuthContext.tsx b/apps/frontend/src/contexts/AuthContext.tsx index 69ad1ce..0253b93 100644 --- a/apps/frontend/src/contexts/AuthContext.tsx +++ b/apps/frontend/src/contexts/AuthContext.tsx @@ -2,19 +2,20 @@ import { ReactNode } from "@tanstack/react-router"; import { createContext, useState } from "react"; interface AuthContextType { - user: { - id: string; - name: string; - permissions: string[]; - } | null; - accessToken: string | null; - saveAuthData: ( - userData: NonNullable, - accessToken?: NonNullable - ) => void; - clearAuthData: () => void; - checkPermission: (permission: string) => boolean; - isAuthenticated: boolean; + user: { + id: string; + name: string; + permissions: string[]; + role: string; + } | null; + accessToken: string | null; + saveAuthData: ( + userData: { id: string; name: string; permissions: string[]; role: string }, + accessToken?: string + ) => void; + clearAuthData: () => void; + checkPermission: (permission: string) => boolean; + isAuthenticated: boolean; } export const AuthContext = createContext( @@ -25,6 +26,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { const [userId, setUserId] = useState(null); const [userName, setUserName] = useState(null); const [permissions, setPermissions] = useState(null); + const [role, setRole] = useState(null); const [accessToken, setAccessToken] = useState( localStorage.getItem("accessToken") ); @@ -36,6 +38,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { setUserId(userData.id); setUserName(userData.name); setPermissions(userData.permissions); + setRole(userData.role); if (accessToken) { setAccessToken(accessToken); localStorage.setItem("accessToken", accessToken); @@ -46,6 +49,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { setUserId(null); setUserName(null); setPermissions(null); + setRole(null); setAccessToken(null); localStorage.removeItem("accessToken"); }; @@ -60,7 +64,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { diff --git a/apps/frontend/src/modules/aspectManagement/modals/AspectDeleteModal.tsx b/apps/frontend/src/modules/aspectManagement/modals/AspectDeleteModal.tsx new file mode 100644 index 0000000..56fd575 --- /dev/null +++ b/apps/frontend/src/modules/aspectManagement/modals/AspectDeleteModal.tsx @@ -0,0 +1,97 @@ +import client from "@/honoClient"; +import { + AlertDialog, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/shadcn/components/ui/alert-dialog"; +import { Button } from "@/shadcn/components/ui/button"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { getRouteApi, useSearch } from "@tanstack/react-router"; +import { deleteAspect } from "../queries/aspectQueries"; +import { notifications } from "@mantine/notifications"; +import fetchRPC from "@/utils/fetchRPC"; + +const routeApi = getRouteApi("/_dashboardLayout/aspect/"); + +export default function AspectDeleteModal() { + const queryClient = useQueryClient(); + const searchParams = useSearch({ from: "/_dashboardLayout/aspect/" }) as { + delete: string; + }; + + const aspectId = searchParams.delete; + const navigate = routeApi.useNavigate(); + + const aspectQuery = useQuery({ + queryKey: ["management-aspect", aspectId], + queryFn: async () => { + if (!aspectId) return null; + return await fetchRPC( + client["management-aspect"][":id"].$get({ + param: { id: aspectId }, + query: {}, + }) + ); + }, + }); + + const mutation = useMutation({ + mutationKey: ["deleteAspectMutation"], + mutationFn: async ({ id }: { id: string }) => { + return await deleteAspect(id); + }, + onError: (error: unknown) => { + if (error instanceof Error) { + notifications.show({ + message: error.message, + color: "red", + }); + } + }, + onSuccess: () => { + notifications.show({ + message: "Aspek berhasil dihapus.", + color: "green", + }); + queryClient.removeQueries({ queryKey: ["management-aspect", aspectId] }); + queryClient.invalidateQueries({ queryKey: ["management-aspect"] }); + navigate({ search: {} }); + }, + }); + + const isModalOpen = Boolean(searchParams.delete && aspectQuery.data); + + return ( + navigate({ search: {} })}> + + + Konfirmasi Hapus + + Apakah Anda yakin ingin menghapus aspek{" "} + {aspectQuery.data?.name}? Tindakan ini tidak dapat diubah. + + + + navigate({ search: {} })} + disabled={mutation.isPending} + > + Batal + + + + + + ); +} \ No newline at end of file diff --git a/apps/frontend/src/modules/aspectManagement/modals/AspectFormModal.tsx b/apps/frontend/src/modules/aspectManagement/modals/AspectFormModal.tsx new file mode 100644 index 0000000..dd3496b --- /dev/null +++ b/apps/frontend/src/modules/aspectManagement/modals/AspectFormModal.tsx @@ -0,0 +1,283 @@ +import { + AlertDialog, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/shadcn/components/ui/alert-dialog"; +import { ScrollArea } from "@/shadcn/components/ui/scroll-area"; +import { Button } from "@/shadcn/components/ui/button"; +import { TextInput } from "@mantine/core"; +import { Label } from "@/shadcn/components/ui/label"; +import { useForm } from "@mantine/form"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { getRouteApi } from "@tanstack/react-router"; +import { createAspect, updateAspect, getAspectByIdQueryOptions } from "../queries/aspectQueries"; +import { useEffect, useState } from "react"; +import { notifications } from "@mantine/notifications"; +import FormResponseError from "@/errors/FormResponseError"; +import { createId } from "@paralleldrive/cuid2"; + +// Initialize route API +const routeApi = getRouteApi("/_dashboardLayout/aspect/"); + +export default function AspectFormModal() { + const queryClient = useQueryClient(); + const navigate = routeApi.useNavigate(); + const searchParams = routeApi.useSearch(); + const dataId = searchParams.detail || searchParams.edit; + const isDialogOpen = Boolean(dataId || searchParams.create); + const formType = searchParams.detail ? "detail" : searchParams.edit ? "ubah" : "tambah"; + + // Fetch aspect data if ubahing or viewing details + const aspectQuery = useQuery(getAspectByIdQueryOptions(dataId)); + + const modalTitle = `${formType.charAt(0).toUpperCase() + formType.slice(1)} Aspek`; + + const form = useForm({ + initialValues: { + id: "", + name: "", + subAspects: [{ id: "", name: "", questionCount: 0 }] as { id: string; name: string; questionCount: number }[], + }, + }); + + useEffect(() => { + const data = aspectQuery.data; + + if (!data) { + form.reset(); + return; + } + + form.setValues({ + id: data.id, + name: data.name, + subAspects: data.subAspects?.map(subAspect => ({ + id: subAspect.id || "", + name: subAspect.name, + questionCount: subAspect.questionCount || 0, + })) || [], + }); + + form.setErrors({}); + }, [aspectQuery.data]); + + const mutation = useMutation({ + mutationKey: ["aspectMutation"], + mutationFn: async ( + options: + | { action: "ubah"; data: Parameters[0] } + | { action: "tambah"; data: Parameters[0] } + ) => { + return options.action === "ubah" + ? await updateAspect(options.data) + : await createAspect(options.data); + }, + onError: (error: unknown) => { + if (error instanceof FormResponseError) { + form.setErrors(error.formErrors); + return; + } + + if (error instanceof Error) { + notifications.show({ + message: error.message, + color: "red", + }); + } + }, + }); + + type CreateAspectPayload = { + name: string; + subAspects?: string; + }; + + type EditAspectPayload = { + id: string; + name: string; + subAspects?: string; + }; + + const [isSubmitting, setIsSubmitting] = useState(false); + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + const values = form.values; + + try { + // Start submit process + setIsSubmitting(true); + + // Name field validation + if (values.name.trim() === "") { + form.setErrors({ name: "Nama aspek harus diisi" }); + setIsSubmitting(false); + return; + } + + let payload: CreateAspectPayload | EditAspectPayload; + + if (formType === "tambah") { + payload = { + name: values.name, + subAspects: values.subAspects.length > 0 + ? JSON.stringify( + values.subAspects + .filter(subAspect => subAspect.name.trim() !== "") + .map(subAspect => subAspect.name) + ) + : "", + }; + await createAspect(payload); + } else if (formType === "ubah") { + payload = { + id: values.id, + name: values.name, + subAspects: values.subAspects.length > 0 + ? JSON.stringify( + values.subAspects + .filter(subAspect => subAspect.name.trim() !== "") + .map(subAspect => ({ + id: subAspect.id || "", + name: subAspect.name, + questionCount: subAspect.questionCount || 0, + })) + ) + : "", + }; + await updateAspect(payload); + } + + queryClient.invalidateQueries({ queryKey: ["management-aspect"] }); + + notifications.show({ + message: `Aspek ${formType === "tambah" ? "berhasil dibuat" : "berhasil diubah"}`, + }); + + navigate({ search: {} }); + } catch (error) { + console.error("Error during submit:", error); + + if (error instanceof Error && error.message === "Aspect name already exists") { + notifications.show({ + message: "Nama aspek sudah ada. Silakan gunakan nama lain.", + color: "red", + }); + } else { + notifications.show({ + message: "Nama Sub Aspek sudah ada. Silakan gunakan nama lain.", + color: "red", + }); + } + } finally { + setIsSubmitting(false); + } + }; + + return ( + !isOpen && navigate({ search: {} })}> + + + {modalTitle} + + {formType === "detail" ? "Detail dari aspek." : "Silakan isi data aspek di bawah ini."} + + + +
+ +
+
+ + +
+ + {form.values.subAspects.map((subAspect, index) => ( +
+
+ + { + if (formType !== "detail" && !mutation.isPending) { + const newSubAspects = [...form.values.subAspects]; + newSubAspects[index] = { ...newSubAspects[index], name: event.target.value }; + form.setValues({ subAspects: newSubAspects }); + } + }} + disabled={formType === "detail" || isSubmitting} + /> +
+ {formType === "detail" && ( +
+ + +
+ )} + {formType !== "detail" && ( + + )} +
+ ))} + + {formType !== "detail" && ( + + )} +
+
+ + + Tutup + {formType !== "detail" && ( + + )} + +
+
+
+ ); +} \ No newline at end of file diff --git a/apps/frontend/src/modules/aspectManagement/queries/aspectQueries.ts b/apps/frontend/src/modules/aspectManagement/queries/aspectQueries.ts new file mode 100644 index 0000000..19d09d2 --- /dev/null +++ b/apps/frontend/src/modules/aspectManagement/queries/aspectQueries.ts @@ -0,0 +1,83 @@ +import client from "@/honoClient"; +import fetchRPC from "@/utils/fetchRPC"; +import { queryOptions } from "@tanstack/react-query"; +import { InferRequestType } from "hono"; + +export const aspectQueryOptions = (page: number, limit: number, q?: string) => + queryOptions({ + queryKey: ["management-aspect", { page, limit, q }], + queryFn: async () => { + const response = await fetchRPC( + client["management-aspect"].$get({ + query: { + limit: String(limit), + page: String(page), + q, + }, + }) + ); + + return response; + }, + }); + +export const getAspectByIdQueryOptions = (aspectId: string | undefined) => + queryOptions({ + queryKey: ["management-aspect", aspectId], + queryFn: () => + fetchRPC( + client["management-aspect"][":id"].$get({ + param: { + id: aspectId!, + }, + query: {}, + }) + ), + enabled: Boolean(aspectId), + }); + +export const createAspect = async ( + json: { name: string; subAspects?: string } +) => { + try { + return await fetchRPC( + client["management-aspect"].$post({ + json, + }) + ); + } catch (error) { + console.error("Error creating aspect:", error); + throw error; + } +}; + +export const updateAspect = async ( + form: { id: string; name: string; subAspects?: string } +) => { + try { + const payload = { + name: form.name, + subAspects: form.subAspects + ? JSON.parse(form.subAspects) + : [], + }; + + return await fetchRPC( + client["management-aspect"][":id"].$patch({ + param: { + id: form.id, + }, + json: payload, + }) + ); + } catch (error) { + console.error("Error updating aspect:", error); + throw error; + } +}; + +export const deleteAspect = async (id: string) => { + return await fetchRPC( + (client["management-aspect"] as { [key: string]: any })[id].$delete() + ); +}; \ No newline at end of file diff --git a/apps/frontend/src/modules/assessmentManagement/fileUpload/fileUpload.tsx b/apps/frontend/src/modules/assessmentManagement/fileUpload/fileUpload.tsx new file mode 100644 index 0000000..22d896d --- /dev/null +++ b/apps/frontend/src/modules/assessmentManagement/fileUpload/fileUpload.tsx @@ -0,0 +1,98 @@ +import React, { useRef } from 'react'; +import { TbUpload } from 'react-icons/tb'; +import { Text, Stack, Group, Flex } from '@mantine/core'; +import FileSizeValidationModal from "@/modules/assessmentManagement/modals/FileSizeValidationModal"; + +interface Question { + questionId: string; + needFile: boolean; + // Add any other properties needed for question +} + +interface FileUploadProps { + question: Question; + handleFileChange: (event: React.ChangeEvent, question: Question) => void; + handleRemoveFile: (question: Question) => void; + uploadedFiles: Record; + dragActive: boolean; + handleDragOver: (event: React.DragEvent) => void; + handleDragLeave: (event: React.DragEvent) => void; + handleDrop: (event: React.DragEvent, question: Question) => void; + modalOpenFileSize: boolean; + setModalOpenFileSize: React.Dispatch>; + exceededFileName: string; + handleClick: () => void; +} + +const FileUpload: React.FC = ({ + question, + handleFileChange, + handleRemoveFile, + uploadedFiles, + dragActive, + handleDragOver, + handleDragLeave, + handleDrop, + modalOpenFileSize, + setModalOpenFileSize, + exceededFileName, + handleClick +}) => { + const fileInputRef = useRef(null); + + return ( +
+ {question.needFile && ( +
handleDrop(event, question)} + onClick={() => { + handleClick(); + fileInputRef.current?.click(); + }} + > + + {/* Upload Icon */} + +
+ + Klik untuk unggah atau geser file disini + + PNG, JPG, PDF + (Max.File size : 64 MB) +
+
+ handleFileChange(event, question)} + style={{ display: "none" }} + accept="image/png, image/jpeg, application/pdf" + /> +
+ )} + +
+ {uploadedFiles[question.questionId] && ( + + File yang diunggah: + + {uploadedFiles[question.questionId]?.name} + + + )} +
+ + {/* File Size Validation Modal */} + setModalOpenFileSize(false)} + fileName={exceededFileName} + /> +
+ ); +}; + +export default FileUpload; \ No newline at end of file diff --git a/apps/frontend/src/modules/assessmentManagement/modals/ConfirmModal.tsx b/apps/frontend/src/modules/assessmentManagement/modals/ConfirmModal.tsx new file mode 100644 index 0000000..4921f8b --- /dev/null +++ b/apps/frontend/src/modules/assessmentManagement/modals/ConfirmModal.tsx @@ -0,0 +1,48 @@ +import { Button } from "@/shadcn/components/ui/button"; +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/shadcn/components/ui/alert-dialog"; + +interface FinishAssessmentModalProps { + assessmentId: string; + opened: boolean; + onClose: () => void; + onConfirm: (assessmentId: string) => void; +} + +export default function FinishAssessmentModal({ + assessmentId, + opened, + onClose, + onConfirm, +}: FinishAssessmentModalProps) { + return ( + + + + Konfirmasi Selesai Asesmen + + Apakah Anda yakin ingin mengakhiri assessment ini? Pastikan semua jawaban sudah lengkap sebelum melanjutkan. Jika Anda sudah siap, klik 'Ya' untuk menyelesaikan. + + + + + + + + + + + + + ); +} \ No newline at end of file diff --git a/apps/frontend/src/modules/assessmentManagement/modals/FileSizeValidationModal.tsx b/apps/frontend/src/modules/assessmentManagement/modals/FileSizeValidationModal.tsx new file mode 100644 index 0000000..10c8cee --- /dev/null +++ b/apps/frontend/src/modules/assessmentManagement/modals/FileSizeValidationModal.tsx @@ -0,0 +1,42 @@ +import { Button } from "@/shadcn/components/ui/button"; +import { + AlertDialog, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/shadcn/components/ui/alert-dialog"; + +interface FileSizeValidationModalProps { + opened: boolean; + onClose: () => void; + fileName?: string; +} + +export default function FileSizeValidationModal({ + opened, + onClose, + fileName, +}: FileSizeValidationModalProps) { + return ( + + + + Peringatan Ukuran File + + Ukuran file {fileName} melebihi batas maksimum 64 MB! Silakan pilih file yang lebih kecil. + + + + + + + + + + ); +} \ No newline at end of file diff --git a/apps/frontend/src/modules/assessmentManagement/modals/ValidationModal.tsx b/apps/frontend/src/modules/assessmentManagement/modals/ValidationModal.tsx new file mode 100644 index 0000000..cbf0cee --- /dev/null +++ b/apps/frontend/src/modules/assessmentManagement/modals/ValidationModal.tsx @@ -0,0 +1,42 @@ +import { Button } from "@/shadcn/components/ui/button"; +import { + AlertDialog, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/shadcn/components/ui/alert-dialog"; + +interface ValidationModalProps { + opened: boolean; + onClose: () => void; + unansweredQuestions: number; +} + +export default function ValidationModal({ + opened, + onClose, + unansweredQuestions, +}: ValidationModalProps) { + return ( + + + + Peringatan + + Anda mempunyai {unansweredQuestions} pertanyaan yang belum terjawab! Pastikan semua jawaban sudah lengkap sebelum melanjutkan. + + + + + + + + + + ); +} \ No newline at end of file diff --git a/apps/frontend/src/modules/assessmentManagement/queries/assessmentQueries.ts b/apps/frontend/src/modules/assessmentManagement/queries/assessmentQueries.ts new file mode 100644 index 0000000..cdb5347 --- /dev/null +++ b/apps/frontend/src/modules/assessmentManagement/queries/assessmentQueries.ts @@ -0,0 +1,175 @@ +import client from "@/honoClient"; +import fetchRPC from "@/utils/fetchRPC"; +import { queryOptions, UseMutationOptions } from "@tanstack/react-query"; + +type SubmitOptionResponse = { + message: string; + answer: { + id: string; + createdAt: string | null; + validationInformation: string; + isFlagged: boolean | null; + }; +}; + +export const fetchAspects = async () => { + return await fetchRPC( + client.assessments.aspect.$get({ + query: {} + }) + ); +}; + +// Query untuk mendapatkan semua pertanyaan berdasarkan halaman dan limit +export const getQuestionsAllQueryOptions = (page: number, limit: number, q?: string) => + queryOptions({ + queryKey: ["assessment", { page, limit, q }], + queryFn: () => + fetchRPC( + client.assessments.getAllQuestions.$get({ + query: { + limit: String(limit), + page: String(page), + q: q || "", + }, + }) + ), + }); + +// Query untuk mendapatkan jawaban berdasarkan assessment ID +export const getAnswersQueryOptions = ( + assessmentId: string, + page: number, + limit: number, + q: string = "", + enabled: boolean = true +) => { + return queryOptions({ + queryKey: ["assessment", { assessmentId, page, limit, q }], + queryFn: () => + fetchRPC( + client.assessments.getAnswers.$get({ + query: { + assessmentId, + }, + }) + ).then((res) => { + return res; + }), + enabled, + }); +}; + +// Query untuk toggle flag jawaban berdasarkan questionId +export const toggleFlagAnswer = async (form: { + assessmentId: string; + questionId: string; + isFlagged: boolean; +}): Promise => { + return await fetchRPC( + client.assessments.toggleFlag.$patch({ + json: form, + }) + ); +}; + +// Query untuk mendapatkan rata-rata skor berdasarkan aspectId dan assessmentId +export const getAverageScoreQueryOptions = (assessmentId: string) => + queryOptions({ + queryKey: ["averageScore", { assessmentId }], + queryFn: () => + fetchRPC( + client.assessments["average-score"].aspects.assessments[":assessmentId"].$get({ + param: { + assessmentId, + }, + }) + ), + }); + +export const submitOption = async (form: { + optionId: string; + assessmentId: string; + questionId: string; + isFlagged?: boolean; + filename?: string; +}): Promise => { + return await fetchRPC( + client.assessments.submitOption.$post({ + json: form, + }) + ); +}; + +export const submitOptionMutationOptions: UseMutationOptions< + SubmitOptionResponse, + Error, + Parameters[0] +> = { + mutationFn: submitOption, +}; + +export const submitValidationQuery = async ( + form: { + assessmentId: string; + questionId: string; + validationInformation: string; + } +) => { + return await fetchRPC( + client.assessments.submitValidation.$post({ + json: { + ...form, + assessmentId: String(form.assessmentId), + questionId: String(form.questionId), + validationInformation: form.validationInformation, + }, + }) + ); +}; + +export const submitValidationMutationOptions = () => ({ + mutationFn: submitValidationQuery, +}); + +// Function to upload a file +const uploadFile = async (formData: FormData, assessmentId: string, questionId: string) => { + const token = localStorage.getItem('accessToken'); + + const response = await fetch(`${import.meta.env.VITE_BACKEND_BASE_URL}/assessments/uploadFile?assessmentId=${assessmentId}&questionId=${questionId}`, { + method: 'POST', + body: formData, + headers: { + 'Authorization': `Bearer ${token}` + } + }); + + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.message || 'Error uploading file'); + } + + const responseData = await response.json(); + return responseData; // Return the JSON response with file URL +}; + +// Options for the mutation +export const uploadFileMutationOptions = (): UseMutationOptions<{ imageUrl: string }, Error, FormData> => ({ + mutationFn: (formData: FormData) => { + const assessmentId = formData.get('assessmentId') as string; + const questionId = formData.get('questionId') as string; + return uploadFile(formData, assessmentId, questionId); + }, +}); + +export const submitAssessment = async (assessmentId: string): Promise<{ message: string }> => { + return await fetchRPC( + client.assessments.submitAssessment[":id"].$patch({ + param: { id: assessmentId }, + }) + ); +}; + +export const submitAssessmentMutationOptions = (assessmentId: string) => ({ + mutationFn: () => submitAssessment(assessmentId), +}); \ No newline at end of file diff --git a/apps/frontend/src/modules/assessmentRequest/modals/ConfirmModal.tsx b/apps/frontend/src/modules/assessmentRequest/modals/ConfirmModal.tsx new file mode 100644 index 0000000..a05220b --- /dev/null +++ b/apps/frontend/src/modules/assessmentRequest/modals/ConfirmModal.tsx @@ -0,0 +1,34 @@ +import { Modal, Text, Flex } from "@mantine/core"; +import { Button } from "@/shadcn/components/ui/button"; + +interface StartAssessmentModalProps { + assessmentId: string; + isOpen: boolean; + onClose: () => void; + onConfirm: (assessmentId: string) => void; +} + +export default function StartAssessmentModal({ + assessmentId, + isOpen, + onClose, + onConfirm, +}: StartAssessmentModalProps) { + return ( + + Apakah Anda yakin ingin memulai asesmen ini? + + + + + + ); +} diff --git a/apps/frontend/src/modules/assessmentRequest/modals/CreateAssessmentRequestModal.tsx b/apps/frontend/src/modules/assessmentRequest/modals/CreateAssessmentRequestModal.tsx new file mode 100644 index 0000000..ab53f48 --- /dev/null +++ b/apps/frontend/src/modules/assessmentRequest/modals/CreateAssessmentRequestModal.tsx @@ -0,0 +1,174 @@ +import { + Flex, + Modal, + Text +} from "@mantine/core"; +import { Button } from "@/shadcn/components/ui/button"; +import { useForm } from "@mantine/form"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { getRouteApi } from "@tanstack/react-router"; +import { useEffect } from "react"; +import { notifications } from "@mantine/notifications"; +import FormResponseError from "@/errors/FormResponseError"; +import createInputComponents from "@/utils/createInputComponents"; +import { assessmentRequestQueryOptions, createAssessmentRequest } from "../queries/assessmentRequestQueries"; + +/** + * Change this + */ +const routeApi = getRouteApi("/_dashboardLayout/assessmentRequest/"); + +export default function UserFormModal() { + + const queryClient = useQueryClient(); + + const navigate = routeApi.useNavigate(); + + const searchParams = routeApi.useSearch(); + + const isModalOpen = Boolean(searchParams.create); + + const formType = "create"; + + const userQuery = useQuery(assessmentRequestQueryOptions(0, 10)); + + const modalTitle = Konfirmasi + + + const form = useForm({ + initialValues: { + respondentsId: "", + name: "", + }, + }); + + // used to get the respondentId of the currently logged in user + // and then set respondentsId in the form to create an assessment request + useEffect(() => { + const data = userQuery.data; + + if (!data) { + form.reset(); + return; + } + + form.setValues({ + respondentsId: data.data[0].respondentId ?? "", + name: data.data[0].name ?? "", + }); + + form.setErrors({}); + }, [userQuery.data]); + + // Mutation function to create a new assessment request and refresh query after success + const mutation = useMutation({ + mutationKey: ["usersMutation"], + mutationFn: async (options: { action: "create"; data: { respondentsId: string } }) => { + console.log("called"); + if (options.action === "create") { + return await createAssessmentRequest(options.data); + } + }, + // auto refresh after mutation + onSuccess: () => { + // force a query-reaction to retrieve the latest data + queryClient.invalidateQueries({ queryKey: ["assessmentRequest"] }); + + notifications.show({ + message: "Permohonan Asesmen berhasil dibuat!", + color: "green", + }); + + // close modal + navigate({ search: {} }); + }, + onError: (error: unknown) => { + console.log(error); + + if (error instanceof FormResponseError) { + form.setErrors(error.formErrors); + return; + } + + if (error instanceof Error) { + notifications.show({ + message: error.message, + color: "red", + }); + } + }, + }); + + // Handle submit form, mutate data to server and close modal after success + const handleSubmit = async (values: typeof form.values) => { + + if (formType === "create") { + try { + await mutation.mutateAsync({ + action: "create", + data: { + respondentsId: values.respondentsId, + }, + }); + } catch (error) { + console.error(error); + } + } + + queryClient.invalidateQueries({ queryKey: ["users"] }); + navigate({ search: {} }); + }; + + + return ( + navigate({ search: {} })} + title= {modalTitle} + size="md" + > +
handleSubmit(values))}> + + Apakah anda yakin ingin membuat Permohonan Asesmen Baru? + + {/* Fields to display data will be sent but only respondentId */} + {createInputComponents({ + disableAll: mutation.isPending, + readonlyAll: formType === "create", + inputs: [ + { + type: "text", + label: "Respondent ID", + ...form.getInputProps("respondentsId"), + hidden: true, + }, + { + type: "text", + label: "Name", + ...form.getInputProps("name"), + hidden: true, + }, + ], + })} + + {/* Buttons */} + + + + +
+
+ ); +} diff --git a/apps/frontend/src/modules/assessmentRequest/queries/assessmentRequestQueries.ts b/apps/frontend/src/modules/assessmentRequest/queries/assessmentRequestQueries.ts new file mode 100644 index 0000000..bb2ded9 --- /dev/null +++ b/apps/frontend/src/modules/assessmentRequest/queries/assessmentRequestQueries.ts @@ -0,0 +1,50 @@ +import client from "@/honoClient"; +import fetchRPC from "@/utils/fetchRPC"; +import { queryOptions } from "@tanstack/react-query"; + +export const assessmentRequestQueryOptions = (page: number, limit: number, q?: string) => + queryOptions({ + queryKey: ["assessmentRequest", { page, limit, q }], + queryFn: () => + fetchRPC( + client.assessmentRequest.$get({ + query: { + limit: String(limit), + page: String(page), + q, + }, + }) + ), + }); + +export const createAssessmentRequest = async ({ respondentsId }: { respondentsId: string }) => { + const response = await client.assessmentRequest.$post({ + json: { respondentId: respondentsId }, + }); + + if (!response.ok) { + throw new Error("Asesmen sedang berlangsung, Selesaikan terlebih dahulu."); + } + + return await response.json(); + }; + +// Query to update assessment status when user start assessment +export const updateAssessmentRequest = async ({ + assessmentId, + status, +}: { + assessmentId: string; + status: "menunggu konfirmasi" | "diterima" | "ditolak" | "dalam pengerjaan" | "belum diverifikasi" | "selesai"; +}) => { + const response = await client.assessmentRequest[":assessmentId"].$patch({ + json: { status }, + param: { assessmentId }, + }); + + if (!response.ok) { + throw new Error("Gagal memperbarui status permohonan asesmen"); + } + + return await response.json(); +}; \ No newline at end of file diff --git a/apps/frontend/src/modules/assessmentRequestManagement/modals/AssessmentRequestManagementFormModal.tsx b/apps/frontend/src/modules/assessmentRequestManagement/modals/AssessmentRequestManagementFormModal.tsx new file mode 100644 index 0000000..65471e1 --- /dev/null +++ b/apps/frontend/src/modules/assessmentRequestManagement/modals/AssessmentRequestManagementFormModal.tsx @@ -0,0 +1,236 @@ +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/shadcn/components/ui/dialog"; +import { Button } from "@/shadcn/components/ui/button"; +import { ScrollArea } from "@/shadcn/components/ui/scroll-area"; +// import { Button, Flex, Modal, ScrollArea } from "@mantine/core"; +import { useForm } from "@mantine/form"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { getRouteApi } from "@tanstack/react-router"; +import { notifications } from "@mantine/notifications"; +import { fetchAssessmentRequestManagementById, updateAssessmentRequestManagementStatus } from "../queries/assessmentRequestManagementQueries"; +import createInputComponents from "@/utils/createInputComponents"; // Assuming you have this utility +import { useEffect } from "react"; + +// Define the API route for navigation +const routeApi = getRouteApi("/_dashboardLayout/assessmentRequestManagements/"); + +// Define allowed status values +type AssessmentStatus = "menunggu konfirmasi" | "diterima" | "ditolak" | "dalam pengerjaan" | "belum diverifikasi" | "selesai"; + +interface AssessmentRequestManagementFormModalProps { + assessmentId: string | null; + isOpen: boolean; + onClose: () => void; +} + +export default function AssessmentRequestManagementFormModal({ + assessmentId, + isOpen, + onClose, +}: AssessmentRequestManagementFormModalProps) { + const queryClient = useQueryClient(); + const navigate = routeApi.useNavigate(); + + const AssessmentRequestManagementQuery = useQuery({ + queryKey: ["assessmentRequestManagements", assessmentId], + queryFn: async () => { + if (!assessmentId) return null; + return await fetchAssessmentRequestManagementById(assessmentId); + }, + }); + + const form = useForm({ + initialValues: { + tanggal: "", + nama: "", + posisi: "", + pengalamanKerja: "", + email: "", + namaPerusahaan: "", + alamat: "", + nomorTelepon: "", + username: "", + status: "menunggu konfirmasi" as AssessmentStatus, + }, + }); + + // Populate the form once data is available + useEffect(() => { + if (AssessmentRequestManagementQuery.data) { + form.setValues({ + tanggal: formatDate(AssessmentRequestManagementQuery.data.tanggal || "Data Kosong"), + nama: AssessmentRequestManagementQuery.data.nama || "Data Kosong", + posisi: AssessmentRequestManagementQuery.data.posisi || "Data Kosong", + pengalamanKerja: AssessmentRequestManagementQuery.data.pengalamanKerja || "Data Kosong", + email: AssessmentRequestManagementQuery.data.email || "Data Kosong", + namaPerusahaan: AssessmentRequestManagementQuery.data.namaPerusahaan || "Data Kosong", + alamat: AssessmentRequestManagementQuery.data.alamat || "Data Kosong", + nomorTelepon: AssessmentRequestManagementQuery.data.nomorTelepon || "Data Kosong", + username: AssessmentRequestManagementQuery.data.username || "Data Kosong", + status: AssessmentRequestManagementQuery.data.status || "menunggu konfirmasi", + }); + } + }, [AssessmentRequestManagementQuery.data, form]); + + const mutation = useMutation({ + mutationKey: ["updateAssessmentRequestManagementStatusMutation"], + mutationFn: async ({ + id, + status, + }: { + id: string; + status: AssessmentStatus; + }) => { + return await updateAssessmentRequestManagementStatus(id, status); + }, + onError: (error: unknown) => { + if (error instanceof Error) { + notifications.show({ + message: error.message, + color: "red", + }); + } + }, + onSuccess: () => { + notifications.show({ + message: "Status Permohonan Asesmen berhasil diperbarui.", + color: "green", + }); + queryClient.invalidateQueries({ + queryKey: ["assessmentRequestManagements", assessmentId], + }); + onClose(); + }, + }); + + const handleStatusChange = (status: AssessmentStatus) => { + if (assessmentId) { + mutation.mutate({ id: assessmentId, status }); + } + }; + + const formatDate = (dateString: string | null) => { + if (!dateString) return "Tanggal tidak tersedia"; + + const date = new Date(dateString); + if (isNaN(date.getTime())) return "Tanggal tidak valid"; + + return new Intl.DateTimeFormat("id-ID", { + hour12: true, + minute: "2-digit", + hour: "2-digit", + day: "2-digit", + month: "long", + year: "numeric", + }).format(date); + }; + + const { status } = form.values; + + return ( + + + + Detail Permohonan Asesmen + + + + {createInputComponents({ + disableAll: mutation.isPending, + readonlyAll: true, + inputs: [ + { + type: "text", + label: "Tanggal", + ...form.getInputProps("tanggal"), + }, + { + type: "text", + label: "Nama", + ...form.getInputProps("nama"), + }, + { + type: "text", + label: "Posisi", + ...form.getInputProps("posisi"), + }, + { + type: "text", + label: "Pengalaman Kerja", + ...form.getInputProps("pengalamanKerja"), + }, + { + type: "text", + label: "Email", + ...form.getInputProps("email"), + }, + { + type: "text", + label: "Nama Perusahaan", + ...form.getInputProps("namaPerusahaan"), + }, + { + type: "text", + label: "Alamat", + ...form.getInputProps("alamat"), + }, + { + type: "text", + label: "Nomor Telepon", + ...form.getInputProps("nomorTelepon"), + }, + { + type: "text", + label: "Username", + ...form.getInputProps("username"), + }, + { + type: "text", + label: "Status", + ...form.getInputProps("status"), + }, + ], + })} + + +
+ + {status !== "selesai" && ( + <> + + + + )} +
+
+
+
+ ); +} diff --git a/apps/frontend/src/modules/assessmentRequestManagement/queries/assessmentRequestManagementQueries.ts b/apps/frontend/src/modules/assessmentRequestManagement/queries/assessmentRequestManagementQueries.ts new file mode 100644 index 0000000..60baf44 --- /dev/null +++ b/apps/frontend/src/modules/assessmentRequestManagement/queries/assessmentRequestManagementQueries.ts @@ -0,0 +1,38 @@ +import client from "@/honoClient"; +import fetchRPC from "@/utils/fetchRPC"; +import { queryOptions } from "@tanstack/react-query"; + +// Define allowed status values +type AssessmentStatus = "menunggu konfirmasi" | "diterima" | "ditolak" | "dalam pengerjaan" | "belum diverifikasi" | "selesai"; + +export const assessmentRequestManagementQueryOptions = (page: number, limit: number, q?: string) => + queryOptions({ + queryKey: ["assessmentRequestManagements", { page, limit, q }], + queryFn: () => + fetchRPC( + client.assessmentRequestManagement.$get({ + query: { + limit: String(limit), + page: String(page), + q, + }, + }) + ), + }); + +export async function updateAssessmentRequestManagementStatus(id: string, status: AssessmentStatus) { + return await fetchRPC( + client.assessmentRequestManagement[":id"].$patch({ + param: { id }, + json: { status }, + }) + ); +} + +export async function fetchAssessmentRequestManagementById(id: string) { + return await fetchRPC( + client.assessmentRequestManagement[":id"].$get({ + param: { id }, + }) + ); +} diff --git a/apps/frontend/src/modules/assessmentResult/queries/assessmentResultQueries.ts b/apps/frontend/src/modules/assessmentResult/queries/assessmentResultQueries.ts new file mode 100644 index 0000000..814122c --- /dev/null +++ b/apps/frontend/src/modules/assessmentResult/queries/assessmentResultQueries.ts @@ -0,0 +1,59 @@ +import client from "@/honoClient"; +import fetchRPC from "@/utils/fetchRPC"; +import { queryOptions } from "@tanstack/react-query"; + +export const getAllSubAspectsAverageScore = (assessmentId: string | undefined) => + queryOptions({ + queryKey: ["allSubAspectsAverage", assessmentId], + queryFn: () => + fetchRPC( + client.assessments["average-score"]["sub-aspects"]["assessments"][":assessmentId"].$get({ + param: { + assessmentId: assessmentId!, + }, + }) + ), + enabled: Boolean(assessmentId), + }); + +export const getAllAspectsAverageScore = (assessmentId: string | undefined) => + queryOptions({ + queryKey: ["allAspectsAverage", assessmentId], + queryFn: () => + fetchRPC( + client.assessments["average-score"]["aspects"]["assessments"][":assessmentId"].$get({ + param: { + assessmentId: assessmentId!, + }, + }) + ), + enabled: Boolean(assessmentId), + }); + +export const getAllVerifiedSubAspectsAverageScore = (assessmentId: string | undefined) => + queryOptions({ + queryKey: ["allVerifiedSubAspectsAverage", assessmentId], + queryFn: () => + fetchRPC( + client.assessmentResult["average-score"]["sub-aspects"]["assessments"][":assessmentId"].$get({ + param: { + assessmentId: assessmentId!, + }, + }) + ), + enabled: Boolean(assessmentId), + }); + +export const getAllVerifiedAspectsAverageScore = (assessmentId: string | undefined) => + queryOptions({ + queryKey: ["allVerifiedAspectsAverage", assessmentId], + queryFn: () => + fetchRPC( + client.assessmentResult["average-score"]["aspects"]["assessments"][":assessmentId"].$get({ + param: { + assessmentId: assessmentId!, + }, + }) + ), + enabled: Boolean(assessmentId), + }); \ No newline at end of file diff --git a/apps/frontend/src/modules/assessmentResultsManagement/modals/assessmentResultsFormModal.tsx b/apps/frontend/src/modules/assessmentResultsManagement/modals/assessmentResultsFormModal.tsx new file mode 100644 index 0000000..815d6f5 --- /dev/null +++ b/apps/frontend/src/modules/assessmentResultsManagement/modals/assessmentResultsFormModal.tsx @@ -0,0 +1,240 @@ +import { + Button, + Flex, + Modal, + ScrollArea, +} from "@mantine/core"; +import { useForm } from "@mantine/form"; +import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { getRouteApi } from "@tanstack/react-router"; +import { useEffect } from "react"; +import createInputComponents from "@/utils/createInputComponents"; +import { getAssessmentResultByIdQueryOptions } from "../queries/assessmentResultsManagaementQueries"; + +/** + * Change this + */ +const routeApi = getRouteApi("/_dashboardLayout/assessmentResultsManagement/"); + +export default function UserFormModal() { + /** + * DON'T CHANGE FOLLOWING: + */ + const queryClient = useQueryClient(); + + const navigate = routeApi.useNavigate(); + + const searchParams = routeApi.useSearch(); + + const detailId = (searchParams as { detail?: string }).detail; + + const isModalOpen = Boolean(detailId); + + const formType = detailId ? "detail" : "tambah"; + + /** + * CHANGE FOLLOWING: + */ + + const assessmentResultQuery = useQuery(getAssessmentResultByIdQueryOptions(detailId)); + + const modalTitle = + formType.charAt(0).toUpperCase() + formType.slice(1) + " Hasil Assessment"; + + const form = useForm({ + initialValues: { + respondentName: "", + position: "", + workExperience: "", + email: "", + companyName: "", + address: "", + phoneNumber: "", + username: "", + assessmentDate: "", + statusAssessment: "", + assessmentsResult: "", + }, + }); + + useEffect(() => { + const data = assessmentResultQuery.data; + + if (!data) { + form.reset(); + return; + } + + // Function to format the date + const formatDate = (dateString: string) => { + const date = new Date(dateString); + // Format only the date, hour, and minute + return date.toLocaleString('id-ID', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + hour12: false, + }); + }; + + form.setValues({ + respondentName: data.respondentName ?? "", + position: data.position ?? "", + workExperience: data.workExperience ?? "", + email: data.email ?? "", + companyName: data.companyName ?? "", + address: data.address ?? "", + phoneNumber: data.phoneNumber ?? "", + username: data.username ?? "", + assessmentDate: data.assessmentDate ? formatDate(data.assessmentDate) : "", + statusAssessment: data.statusAssessment ?? "", + assessmentsResult: String(data.assessmentsResult ?? ""), + }); + + form.setErrors({}); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [assessmentResultQuery.data]); + + // const mutation = useMutation({ + // mutationKey: ["assessmentResultMutation"], + // mutationFn: async ( + // options: + // | { action: "ubah"; data: Parameters[0] } + // | { action: "tambah"; data: Parameters[0] } + // ) => { + // console.log("called"); + // return options.action === "ubah" + // ? await updateUser(options.data) + // : await createUser(options.data); + // }, + // onError: (error: unknown) => { + // console.log(error); + + // if (error instanceof FormResponseError) { + // form.setErrors(error.formErrors); + // return; + // } + + // if (error instanceof Error) { + // notifications.show({ + // message: error.message, + // color: "red", + // }); + // } + // }, + // }); + + const handleSubmit = async (values: typeof form.values) => { + if (formType === "detail") { + ({ + action: formType, + data: { + respondentName: values.respondentName, + position: values.position, + workExperience: values.workExperience, + email: values.email, + companyName: values.companyName, + address: values.address, + phoneNumber: values.phoneNumber, + username: values.username, + assessmentDate: values.assessmentDate, + statusAssessment: values.statusAssessment, + assessmentsResult: values.assessmentsResult, + isEnabled: "true", + }, + }); + } + queryClient.invalidateQueries({ queryKey: ["users"] }); + navigate({ search: {} }); + }; + + /** + * YOU MIGHT NOT NEED FOLLOWING: + */ + + return ( + navigate({ search: {} })} + title={modalTitle} //Uppercase first letter + scrollAreaComponent={ScrollArea.Autosize} + size="md" + > +
handleSubmit(values))}> + {createInputComponents({ + readonlyAll: formType === "detail", + inputs: [ + { + type: "text", + label: "Nama Respondent", + ...form.getInputProps("respondentName"), + }, + { + type: "text", + label: "Jabatan", + ...form.getInputProps("position"), + }, + { + type: "text", + label: "Pengalaman Kerja", + ...form.getInputProps("workExperience"), + }, + { + type: "text", + label: "Email", + ...form.getInputProps("email"), + }, + { + type: "text", + label: "Instansi/Perusahaan", + ...form.getInputProps("companyName"), + }, + { + type: "text", + label: "Alamat", + ...form.getInputProps("address"), + }, + { + type: "text", + label: "Nomor Telepon", + ...form.getInputProps("phoneNumber"), + }, + { + type: "text", + label: "Username", + ...form.getInputProps("username"), + }, + { + type: "text", + label: "Tanggal Assessment", + ...form.getInputProps("assessmentDate"), + }, + { + type: "text", + label: "Status Assessment", + ...form.getInputProps("statusAssessment"), + }, + { + type: "text", + label: "Hasil Assessment", + ...form.getInputProps("assessmentsResult"), + }, + ], + })} + + {/* Buttons */} + + + +
+
+ ); +} diff --git a/apps/frontend/src/modules/assessmentResultsManagement/queries/assessmentResultsManagaementQueries.ts b/apps/frontend/src/modules/assessmentResultsManagement/queries/assessmentResultsManagaementQueries.ts new file mode 100644 index 0000000..b4e5e26 --- /dev/null +++ b/apps/frontend/src/modules/assessmentResultsManagement/queries/assessmentResultsManagaementQueries.ts @@ -0,0 +1,168 @@ +import client from "@/honoClient"; +import fetchRPC from "@/utils/fetchRPC"; +import { queryOptions, useMutation } from "@tanstack/react-query"; + +export const assessmentResultsQueryOptions = (page: number, limit: number, q?: string) => + queryOptions({ + queryKey: ["assessmentResults", { page, limit, q }], + queryFn: () => + fetchRPC( + client.assessmentResult.$get({ + query: { + limit: String(limit), + page: String(page), + q: q || "", + }, + }) + ), + }); + +export const getAssessmentResultByIdQueryOptions = (assessmentResultId: string | undefined) => + queryOptions({ + queryKey: ["assessmentResults", assessmentResultId], + queryFn: () => + fetchRPC( + client.assessmentResult[":id"].$get({ + param: { + id: assessmentResultId!, + }, + }) + ), + enabled: Boolean(assessmentResultId), + }); + +export const getVerifiedAssessmentResultByIdQueryOptions = (assessmentResultId: string | undefined) => + queryOptions({ + queryKey: ["verifiedAssessmentResult", assessmentResultId], + queryFn: () => + fetchRPC( + client.assessmentResult.verified[":id"].$get({ + param: { + id: assessmentResultId!, + }, + }) + ), + enabled: Boolean(assessmentResultId), + }); + +export const postAnswerRevisionQueryOptions = ( + assessmentId: string, + revisedBy: string, +) => + queryOptions({ + queryKey: ["answerRevisions", assessmentId], + queryFn: () => + fetchRPC( + client.assessmentResult["answer-revisions"].$post({ + json: { + assessmentId, + revisedBy, + }, + }) + ), + enabled: Boolean(assessmentId && revisedBy), + }); + +export const postAnswerRevisionMutation = () => { + return useMutation({ + mutationFn: ({ assessmentId, revisedBy }: { assessmentId: string; revisedBy: string }) => { + return fetchRPC( + client.assessmentResult["answer-revisions"].$post({ + json: { + assessmentId, + revisedBy, + }, + }) + ); + }, + onSuccess: () => { + console.log("Revision posted successfully."); + // Optionally, you could trigger a refetch of relevant data here + }, + onError: (error: any) => { + console.error("Error posting revision:", error); + }, + }); +}; + +// Query untuk mendapatkan jawaban berdasarkan assessment ID +export const getAnswersRevisionQueryOptions = ( + assessmentId: string, +) => { + return queryOptions({ + queryKey: ["answerRevision", { assessmentId }], + queryFn: () => + fetchRPC( + client.assessmentResult.getAnswers[":id"].$get({ + param: { id: assessmentId }, + }) + ), + }); +}; + +export const updateValidationQueryOptions = (assessmentId: string, questionId: string, newValidationInformation: string) => { + return queryOptions({ + queryKey: ["updateValidation", { assessmentId, questionId }], + queryFn: () => + fetchRPC( + client.assessmentResult.updateValidation.$post({ + json: { + assessmentId, + questionId, + newValidationInformation, + }, + }) + ), + enabled: Boolean(assessmentId && questionId && newValidationInformation), + }); +}; + +export const updateValidationQuery = async ( + form: { + assessmentId: string; + questionId: string; + newValidationInformation: string; + } +) => { + return await fetchRPC( + client.assessmentResult.updateValidation.$post({ + json: { + ...form, + assessmentId: String(form.assessmentId), + questionId: String(form.questionId), + newValidationInformation: form.newValidationInformation, + }, + }) + ); +}; + +export const updateOptionQuery = async ( + form: { + assessmentId: string; + questionId: string; + optionId: string; + } +) => { + return await fetchRPC( + client.assessments.updateOption.$patch({ + json: { + ...form, + assessmentId: String(form.assessmentId), + questionId: String(form.questionId), + newOptionId: form.optionId, + }, + }) + ); +}; + +export const submitAssessmentRevision = async (assessmentId: string): Promise<{ message: string }> => { + return await fetchRPC( + client.assessmentResult.submitAssessmentRevision[":id"].$patch({ + param: { id: assessmentId }, + }) + ); +}; + +export const submitAssessmentRevisionMutationOptions = (assessmentId: string) => ({ + mutationFn: () => submitAssessmentRevision(assessmentId), +}); \ No newline at end of file diff --git a/apps/frontend/src/modules/questionsManagement/modals/QuestionDeleteModal.tsx b/apps/frontend/src/modules/questionsManagement/modals/QuestionDeleteModal.tsx new file mode 100644 index 0000000..5e1f9e0 --- /dev/null +++ b/apps/frontend/src/modules/questionsManagement/modals/QuestionDeleteModal.tsx @@ -0,0 +1,98 @@ +import client from "@/honoClient"; +import { + AlertDialog, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/shadcn/components/ui/alert-dialog"; +import { Button } from "@/shadcn/components/ui/button"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { getRouteApi, useSearch } from "@tanstack/react-router"; +import { deleteQuestion } from "../queries/questionQueries"; +import { notifications } from "@mantine/notifications"; +import fetchRPC from "@/utils/fetchRPC"; + +const routeApi = getRouteApi("/_dashboardLayout/questions/"); + +export default function QuestionDeleteModal() { + const queryClient = useQueryClient(); + + const searchParams = useSearch({ from: "/_dashboardLayout/questions/" }) as { + delete: string; + }; + + const questionId = searchParams.delete; + const navigate = routeApi.useNavigate(); + + const questionQuery = useQuery({ + queryKey: ["questions", questionId], + queryFn: async () => { + if (!questionId) return null; + return await fetchRPC( + client.questions[":id"].$get({ + param: { + id: questionId, + }, + query: {}, + }) + ); + }, + }); + + const mutation = useMutation({ + mutationKey: ["deleteQuestionMutation"], + mutationFn: async ({ id }: { id: string }) => { + return await deleteQuestion(id); + }, + onError: (error: unknown) => { + if (error instanceof Error) { + notifications.show({ + message: error.message, + color: "red", + }); + } + }, + onSuccess: () => { + notifications.show({ + message: "Question deleted successfully.", + color: "green", + }); + queryClient.removeQueries({ queryKey: ["question", questionId] }); + queryClient.invalidateQueries({ queryKey: ["questions"] }); + navigate({ search: {} }); + }, + }); + + const isModalOpen = Boolean(searchParams.delete && questionQuery.data); + + return ( + navigate({ search: {} })}> + + + Konfirmasi Hapus + + Apakah Anda yakin ingin menghapus pertanyaan ini? Tindakan ini tidak dapat diubah. + + + + navigate({ search: {} })} + disabled={mutation.isPending} + > + Batal + + + + + + ); +} diff --git a/apps/frontend/src/modules/questionsManagement/modals/QuestionFormModal.tsx b/apps/frontend/src/modules/questionsManagement/modals/QuestionFormModal.tsx new file mode 100644 index 0000000..ab79046 --- /dev/null +++ b/apps/frontend/src/modules/questionsManagement/modals/QuestionFormModal.tsx @@ -0,0 +1,348 @@ +import { useForm } from "@mantine/form"; +import { + Modal, + Stack, + Button, + Flex, + ActionIcon, + ScrollArea, + TextInput, + NumberInput, + Group, +} from "@mantine/core"; +import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; +import { getRouteApi } from "@tanstack/react-router"; +import { TbDeviceFloppy, TbPlus, TbTrash } from "react-icons/tb"; +import { useEffect } from "react"; +import { notifications } from "@mantine/notifications"; +import FormResponseError from "@/errors/FormResponseError"; +import createInputComponents from "@/utils/createInputComponents"; +import { + createQuestion, + getQuestionByIdQueryOptions, + updateQuestion, + fetchAspects, + fetchSubAspects, +} from "../queries/questionQueries"; + +const routeApi = getRouteApi("/_dashboardLayout/questions/"); + +interface Option { + questionId: string; + text: string; + score: number; +} + +interface CreateQuestionPayload { + id?: string; + subAspectId: string; + question: string; + needFile: boolean; + options: Option[]; +} + +interface UpdateQuestionPayload { + id: string; + subAspectId: string; + question: string; + needFile: boolean; + options?: Option[]; +} + +export default function QuestionFormModal() { + const queryClient = useQueryClient(); + const navigate = routeApi.useNavigate(); + const searchParams = routeApi.useSearch(); + const dataId = searchParams.detail || searchParams.edit; + const isModalOpen = Boolean(dataId || searchParams.create); + const detailId = searchParams.detail; + const editId = searchParams.edit; + const formType = detailId ? "detail" : editId ? "ubah" : "tambah"; + + const form = useForm({ + initialValues: { + id: "", + question: "", + needFile: false, + aspectId: "", + subAspectId: "", + options: [] as { id: string; text: string; score: number; questionId: string }[], + }, + validate: { + aspectId: (value) => (value ? null : "Nama Aspek harus dipilih."), + subAspectId: (value) => (value ? null : "Nama Sub Aspek harus dipilih."), + question: (value) => (value ? null : "Pertanyaan tidak boleh kosong."), + options: { + text: (value) => (value ? null : "Jawaban tidak boleh kosong."), + score: (value) => (value >= 0 ? null : "Skor harus diisi dengan angka."), + }, + }, + }); + + // Fetch aspects and sub-aspects + const aspectsQuery = useQuery({ + queryKey: ["aspects"], + queryFn: fetchAspects, + }); + + const subAspectsQuery = useQuery({ + queryKey: ["subAspects"], + queryFn: fetchSubAspects, + }); + + // Check for form initialization and aspectId before filtering + const filteredSubAspects = form.values.aspectId + ? subAspectsQuery.data?.filter( + (subAspect) => subAspect.aspectId === form.values.aspectId + ) || [] + : []; + + const questionQuery = useQuery(getQuestionByIdQueryOptions(dataId)); + const modalTitle = + formType.charAt(0).toUpperCase() + formType.slice(1) + " Pertanyaan"; + + useEffect(() => { + const data = questionQuery.data; + + if (!data) { + form.reset(); + return; + } + + form.setValues({ + id: data.id, + question: data.question ?? "", + needFile: data.needFile ?? false, + aspectId: data.aspectId ?? "", + subAspectId: data.subAspectId ?? "", + options: data.options.map((option) => ({ + ...option, + questionId: data.id, + })), + }); + + form.setErrors({}); + }, [questionQuery.data]); + + // Define possible actions, depending on the action, it can be one or the other + interface MutationOptions { + action: "ubah" | "tambah"; + data: CreateQuestionPayload | UpdateQuestionPayload; + } + + interface MutationResponse { + message: string; + } + + const mutation = useMutation({ + mutationKey: ["questionsMutation"], + mutationFn: async (options) => { + if (options.action === "ubah") { + return await updateQuestion(options.data as UpdateQuestionPayload); + } else { + return await createQuestion(options.data as CreateQuestionPayload); + } + }, + }); + + const handleSubmit = async (values: CreateQuestionPayload) => { + if (formType === "detail") return; + + const payload: CreateQuestionPayload = { + id: values.id, + question: values.question, + needFile: values.needFile, + subAspectId: values.subAspectId, + options: values.options.map((option) => ({ + questionId: values.id || "", + text: option.text, + score: option.score, + })), + }; + + try { + if (formType === "tambah") { + await mutation.mutateAsync({ action: "tambah", data: payload }); + notifications.show({ + message: "Data pertanyaan berhasil dibuat!", + color: "green", + }); + } else { + await mutation.mutateAsync({ action: "ubah", data: payload }); + notifications.show({ + message: "Data pertanyaan berhasil diperbarui!", + color: "green", + }); + } + + queryClient.invalidateQueries({ queryKey: ["questions"] }); + navigate({ search: {} }); + } catch (error) { + if (error instanceof FormResponseError) { + form.setErrors(error.formErrors); + } else if (error instanceof Error) { + notifications.show({ + message: error.message, + color: "red", + }); + } + } + }; + + const handleAddOption = () => { + form.insertListItem("options", { id: "", text: "", score: 0 }); + }; + + const handleRemoveOption = (index: number) => { + form.removeListItem("options", index); + }; + + return ( + navigate({ search: {} })} + title={modalTitle} + scrollAreaComponent={ScrollArea.Autosize} + size="md" + > +
handleSubmit(values))}> + {createInputComponents({ + disableAll: mutation.isPending, + readonlyAll: formType === "detail", + inputs: [ + formType === "detail" + ? { + type: "text", + label: "Nama Aspek", + readOnly: true, + value: aspectsQuery.data?.find(aspect => aspect.id === form.values.aspectId)?.name || "", + } + : { + type: "select", + label: "Nama Aspek", + placeholder: "Pilih Aspek", + data: aspectsQuery.data?.map((aspect) => ({ + value: aspect.id, + label: aspect.name, + })) || [], + disabled: mutation.isPending, + ...form.getInputProps("aspectId"), + required: true, + }, + formType === "detail" + ? { + type: "text", + label: "Nama Sub Aspek", + readOnly: true, + value: filteredSubAspects.find(subAspect => subAspect.id === form.values.subAspectId)?.name || "", + } + : { + type: "select", + label: "Nama Sub Aspek", + placeholder: "Pilih Sub Aspek", + data: filteredSubAspects.map((subAspect) => ({ + value: subAspect.id, + label: subAspect.name, + })), + disabled: mutation.isPending, + ...form.getInputProps("subAspectId"), + required: true, + }, + { + type: "textarea", + label: "Pertanyaan", + placeholder: "Tulis Pertanyaan", + ...form.getInputProps("question"), + }, + formType === "detail" + ? { + type: "text", + label: "Dibutuhkan Upload File?", + readOnly: true, + value: form.values.needFile ? "Ya" : "Tidak", + } + : { + type: "select", + label: "Dibutuhkan Upload File?", + placeholder: "Pilih opsi", + data: [ + { value: "true", label: "Ya" }, + { value: "false", label: "Tidak" }, + ], + value: form.values.needFile ? "true" : "false", + onChange: (value) => form.setFieldValue("needFile", value === "true"), + disabled: mutation.isPending, + required: true, + }, + ], + })} + + {/* Options */} + + {form.values.options.map((option, index) => ( + + + + {formType !== "detail" && ( + handleRemoveOption(index)} + > + + + )} + + ))} + + {formType !== "detail" && ( + + )} + + + {/* Buttons */} + + + {formType !== "detail" && ( + + )} + +
+
+ ); +} diff --git a/apps/frontend/src/modules/questionsManagement/queries/questionQueries.ts b/apps/frontend/src/modules/questionsManagement/queries/questionQueries.ts new file mode 100644 index 0000000..ea4b71c --- /dev/null +++ b/apps/frontend/src/modules/questionsManagement/queries/questionQueries.ts @@ -0,0 +1,115 @@ +import client from "@/honoClient"; +import fetchRPC from "@/utils/fetchRPC"; +import { queryOptions } from "@tanstack/react-query"; +import { InferRequestType } from "hono"; + +interface Option { + questionId: string; + text: string; + score: number; +} + +interface CreateQuestionPayload { + subAspectId: string; // Ensure this matches the correct ID type + question: string; + needFile: boolean; + options: Option[]; // Array of options (text and score) +} + +interface UpdateQuestionPayload { + id: string; // The ID of the question to update + subAspectId: string; // Ensure this matches the correct ID type + question: string; + needFile: boolean; + options?: Option[]; // Optional array of options (text and score) +} + +export const questionQueryOptions = (page: number, limit: number, q?: string) => + queryOptions({ + queryKey: ["questions", { page, limit, q }], + queryFn: () => + fetchRPC( + client.questions.$get({ + query: { + limit: String(limit), + page: String(page), + q, + }, + }) + ), + }); + +export const getQuestionByIdQueryOptions = (questionId: string | undefined) => + queryOptions({ + queryKey: ["question", questionId], + queryFn: () => + fetchRPC( + client.questions[":id"].$get({ + param: { + id: questionId!, + }, + query: {}, + }) + ), + enabled: Boolean(questionId), + }); + +export const createQuestion = async (form: CreateQuestionPayload) => { + return await fetchRPC( + client.questions.$post({ + json: { + question: form.question, + needFile: form.needFile, + subAspectId: form.subAspectId, + options: form.options.map((option) => ({ + text: option.text, + score: option.score, + })), + }, + }) + ); +}; + +export const updateQuestion = async (form: UpdateQuestionPayload) => { + return await fetchRPC( + client.questions[":id"].$patch({ + param: { + id: form.id, + }, + json: { + question: form.question, + needFile: form.needFile, + subAspectId: form.subAspectId, + options: form.options?.map((option: Option) => ({ + text: option.text, + score: option.score, + })), + }, + }) + ); +}; + +export const deleteQuestion = async (id: string) => { + return await fetchRPC( + client.questions[":id"].$delete({ + param: { id }, + query: {}, + }) + ); +}; + +export const fetchAspects = async () => { + return await fetchRPC( + client.questions.aspects.$get({ + query: {} // Provide an empty query if no parameters are needed + }) // Adjust this based on your API client structure + ); +}; + +export const fetchSubAspects = async () => { + return await fetchRPC( + client.questions.subAspects.$get({ + query: {} // Provide an empty query if no parameters are needed + }) + ); +}; diff --git a/apps/frontend/src/modules/usersManagement/modals/UserDeleteModal.tsx b/apps/frontend/src/modules/usersManagement/modals/UserDeleteModal.tsx index 8e5f24f..8eb21af 100644 --- a/apps/frontend/src/modules/usersManagement/modals/UserDeleteModal.tsx +++ b/apps/frontend/src/modules/usersManagement/modals/UserDeleteModal.tsx @@ -1,5 +1,14 @@ import client from "@/honoClient"; -import { Button, Flex, Modal, Text } from "@mantine/core"; +import { + AlertDialog, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/shadcn/components/ui/alert-dialog"; +import { Button } from "@/shadcn/components/ui/button"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { getRouteApi, useSearch } from "@tanstack/react-router"; import { deleteUser } from "../queries/userQueries"; @@ -60,40 +69,34 @@ export default function UserDeleteModal() { const isModalOpen = Boolean(searchParams.delete && userQuery.data); return ( - navigate({ search: {} })} - title={`Delete confirmation`} - > - - Are you sure you want to delete user{" "} - - {userQuery.data?.name} - - ? This action is irreversible. - - - {/* {errorMessage && {errorMessage}} */} - {/* Buttons */} - - - - - + navigate({ search: {} })}> + + + Konfirmasi Hapus + + Apakah Anda yakin ingin menghapus pengguna{" "} + {userQuery.data?.name}? +
+ Tindakan ini tidak dapat diubah. +
+
+ + navigate({ search: {} })} + disabled={mutation.isPending} + > + Batal + + + +
+
); } diff --git a/apps/frontend/src/modules/usersManagement/modals/UserFormModal.tsx b/apps/frontend/src/modules/usersManagement/modals/UserFormModal.tsx index 05531b1..035ede8 100644 --- a/apps/frontend/src/modules/usersManagement/modals/UserFormModal.tsx +++ b/apps/frontend/src/modules/usersManagement/modals/UserFormModal.tsx @@ -1,19 +1,16 @@ +import client from "../../../honoClient"; import stringToColorHex from "@/utils/stringToColorHex"; import { Avatar, - Button, - Center, - Flex, - Modal, - ScrollArea, - Stack, -} from "@mantine/core"; + AvatarFallback, + AvatarImage +} from "@/shadcn/components/ui/avatar"; +import { Modal, ScrollArea } from "@mantine/core"; +import { Button } from "@/shadcn/components/ui/button"; import { useForm } from "@mantine/form"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { getRouteApi } from "@tanstack/react-router"; import { createUser, updateUser } from "../queries/userQueries"; -import { TbDeviceFloppy } from "react-icons/tb"; -import client from "../../../honoClient"; import { getUserByIdQueryOptions } from "../queries/userQueries"; import { useEffect } from "react"; import { notifications } from "@mantine/notifications"; @@ -42,7 +39,7 @@ export default function UserFormModal() { const detailId = searchParams.detail; const editId = searchParams.edit; - const formType = detailId ? "detail" : editId ? "edit" : "create"; + const formType = detailId ? "detail" : editId ? "ubah" : "tambah"; /** * CHANGE FOLLOWING: @@ -51,7 +48,7 @@ export default function UserFormModal() { const userQuery = useQuery(getUserByIdQueryOptions(dataId)); const modalTitle = - formType.charAt(0).toUpperCase() + formType.slice(1) + " User"; + formType.charAt(0).toUpperCase() + formType.slice(1) + " Pengguna"; const form = useForm({ initialValues: { @@ -62,6 +59,11 @@ export default function UserFormModal() { photoProfileUrl: "", password: "", roles: [] as string[], + companyName: "", + position: "", + workExperience: "", + address: "", + phoneNumber: "", }, }); @@ -75,12 +77,17 @@ export default function UserFormModal() { form.setValues({ id: data.id, - email: data.email ?? "", - name: data.name, + email: data.email, + name: data.name, photoProfileUrl: "", username: data.username, password: "", roles: data.roles.map((v) => v.id), //only extract the id + companyName: data.companyName ?? "", + position: data.position ?? "", + workExperience: data.workExperience ?? "", + address: data.address ?? "", + phoneNumber: data.phoneNumber ?? "", }); form.setErrors({}); @@ -91,11 +98,11 @@ export default function UserFormModal() { mutationKey: ["usersMutation"], mutationFn: async ( options: - | { action: "edit"; data: Parameters[0] } - | { action: "create"; data: Parameters[0] } + | { action: "ubah"; data: Parameters[0] } + | { action: "tambah"; data: Parameters[0] } ) => { console.log("called"); - return options.action === "edit" + return options.action === "ubah" ? await updateUser(options.data) : await createUser(options.data); }, @@ -120,16 +127,21 @@ export default function UserFormModal() { if (formType === "detail") return; //TODO: OPtimize this code - if (formType === "create") { + if (formType === "tambah") { await mutation.mutateAsync({ action: formType, data: { email: values.email, name: values.name, password: values.password, - roles: JSON.stringify(values.roles), + roles: values.roles, isEnabled: "true", username: values.username, + companyName: values.companyName, + position: values.position, + workExperience: values.workExperience, + address: values.address, + phoneNumber: values.phoneNumber, }, }); } else { @@ -140,15 +152,20 @@ export default function UserFormModal() { email: values.email, name: values.name, password: values.password, - roles: JSON.stringify(values.roles), + roles: values.roles, isEnabled: "true", username: values.username, + companyName: values.companyName, + position: values.position, + workExperience: values.workExperience, + address: values.address, + phoneNumber: values.phoneNumber, }, }); } queryClient.invalidateQueries({ queryKey: ["users"] }); notifications.show({ - message: `The ser is ${formType === "create" ? "created" : "edited"}`, + message: `Pengguna berhasil di${formType === "tambah" ? "tambahkan" : "perbarui"}`, }); navigate({ search: {} }); @@ -171,95 +188,113 @@ export default function UserFormModal() { }); return ( - navigate({ search: {} })} title={modalTitle} //Uppercase first letter scrollAreaComponent={ScrollArea.Autosize} size="md" - > -
handleSubmit(values))}> - - {/* Avatar */} -
- - {form.values.name?.[0]?.toUpperCase()} - -
-
+ > + handleSubmit(values))}> +
+
+ + + + {form.values.name?.[0]?.toUpperCase() ?? "?"} + + +
+
- {createInputComponents({ - disableAll: mutation.isPending, - readonlyAll: formType === "detail", - inputs: [ - { - type: "text", - readOnly: true, - variant: "filled", - ...form.getInputProps("id"), - hidden: !form.values.id, - }, - { - type: "text", - label: "Name", - ...form.getInputProps("name"), - }, - { - type: "text", - label: "Username", - ...form.getInputProps("username"), - }, - { - type: "text", - label: "Email", - ...form.getInputProps("email"), - }, - { - type: "password", - label: "Password", - hidden: formType !== "create", - ...form.getInputProps("password"), - }, - { - type: "multi-select", - label: "Roles", - value: form.values.roles, - onChange: (values) => - form.setFieldValue("roles", values), - data: rolesQuery.data?.map((role) => ({ - value: role.id, - label: role.name, - })), - error: form.errors.roles, - }, - ], - })} + + {createInputComponents({ + disableAll: mutation.isPending, + readonlyAll: formType === "detail", + inputs: [ + { + type: "text", + label: "Nama", + ...form.getInputProps("name"), + }, + { + type: "text", + label: "Jabatan", + ...form.getInputProps("position"), + }, + { + type: "text", + label: "Pengalaman Kerja", + ...form.getInputProps("workExperience"), + }, + { + type: "text", + label: "Email", + ...form.getInputProps("email"), + }, + { + type: "text", + label: "Instansi/Perusahaan", + ...form.getInputProps("companyName"), + }, + { + type: "text", + label: "Alamat", + ...form.getInputProps("address"), + }, + { + type: "text", + label: "Nomor Telepon", + ...form.getInputProps("phoneNumber"), + }, + + { + type: "multi-select", + label: "Roles", + value: form.values.roles, + onChange: (values) => + form.setFieldValue("roles", values), + data: rolesQuery.data?.map((role) => ({ + value: role.id, + label: role.name, + })), + error: form.errors.roles, + }, + { + type: "text", + label: "Username", + ...form.getInputProps("username"), + }, + { + type: "password", + label: "Password", + hidden: formType !== "tambah", + ...form.getInputProps("password"), + }, + ], + })} + - {/* Buttons */} - - - {formType !== "detail" && ( - - )} - -
+ {/* Buttons */} +
+ + {formType !== "detail" && ( + + )} +
+
); } diff --git a/apps/frontend/src/modules/usersManagement/queries/userQueries.ts b/apps/frontend/src/modules/usersManagement/queries/userQueries.ts index 02da504..2093488 100644 --- a/apps/frontend/src/modules/usersManagement/queries/userQueries.ts +++ b/apps/frontend/src/modules/usersManagement/queries/userQueries.ts @@ -34,26 +34,26 @@ export const getUserByIdQueryOptions = (userId: string | undefined) => }); export const createUser = async ( - form: InferRequestType["form"] + json: InferRequestType["json"] ) => { return await fetchRPC( client.users.$post({ - form, + json, }) ); }; export const updateUser = async ( - form: InferRequestType<(typeof client.users)[":id"]["$patch"]>["form"] & { + json: InferRequestType<(typeof client.users)[":id"]["$patch"]>["json"] & { id: string; } ) => { return await fetchRPC( client.users[":id"].$patch({ param: { - id: form.id, + id: json.id, }, - form, + json, }) ); }; diff --git a/apps/frontend/src/modules/usersManagement/tables/columns.tsx b/apps/frontend/src/modules/usersManagement/tables/columns.tsx index d29d65c..134f191 100644 --- a/apps/frontend/src/modules/usersManagement/tables/columns.tsx +++ b/apps/frontend/src/modules/usersManagement/tables/columns.tsx @@ -1,5 +1,4 @@ import { createColumnHelper } from "@tanstack/react-table"; -import { Badge, Flex, Group, Avatar, Text, Anchor } from "@mantine/core"; import { TbEye, TbPencil, TbTrash } from "react-icons/tb"; import { CrudPermission } from "@/types"; import stringToColorHex from "@/utils/stringToColorHex"; @@ -7,6 +6,8 @@ import createActionButtons from "@/utils/createActionButton"; import client from "@/honoClient"; import { InferResponseType } from "hono"; import { Link } from "@tanstack/react-router"; +import { Badge } from "@/shadcn/components/ui/badge"; +import { Avatar } from "@/shadcn/components/ui/avatar"; interface ColumnOptions { permissions: Partial; @@ -29,31 +30,28 @@ const createColumns = (options: ColumnOptions) => { columnHelper.accessor("name", { header: "Name", cell: (props) => ( - +
{props.getValue()?.[0].toUpperCase()} - + {props.getValue()} - - + +
), }), columnHelper.accessor("email", { header: "Email", cell: (props) => ( - + {props.getValue()} - + ), }), @@ -66,7 +64,7 @@ const createColumns = (options: ColumnOptions) => { id: "status", header: "Status", cell: (props) => ( - + {props.row.original.isEnabled ? "Active" : "Inactive"} ), @@ -80,7 +78,7 @@ const createColumns = (options: ColumnOptions) => { className: "w-fit", }, cell: (props) => ( - +
{createActionButtons([ { label: "Detail", @@ -104,7 +102,7 @@ const createColumns = (options: ColumnOptions) => { icon: , }, ])} - +
), }), ]; diff --git a/apps/frontend/src/routeTree.gen.ts b/apps/frontend/src/routeTree.gen.ts index 8619974..9cb45df 100644 --- a/apps/frontend/src/routeTree.gen.ts +++ b/apps/frontend/src/routeTree.gen.ts @@ -13,38 +13,93 @@ import { createFileRoute } from '@tanstack/react-router' // Import Routes import { Route as rootRoute } from './routes/__root' +import { Route as VerifyingLayoutImport } from './routes/_verifyingLayout' import { Route as DashboardLayoutImport } from './routes/_dashboardLayout' +import { Route as AssessmentLayoutImport } from './routes/_assessmentLayout' +import { Route as LoginIndexImport } from './routes/login/index' +import { Route as VerifyingLayoutVerifyingIndexImport } from './routes/_verifyingLayout/verifying/index' import { Route as DashboardLayoutUsersIndexImport } from './routes/_dashboardLayout/users/index' import { Route as DashboardLayoutTimetableIndexImport } from './routes/_dashboardLayout/timetable/index' -import { Route as DashboardLayoutDashboardIndexImport } from './routes/_dashboardLayout/dashboard/index' +import { Route as DashboardLayoutQuestionsIndexImport } from './routes/_dashboardLayout/questions/index' +import { Route as DashboardLayoutAssessmentResultsManagementIndexImport } from './routes/_dashboardLayout/assessmentResultsManagement/index' +import { Route as DashboardLayoutAssessmentResultIndexImport } from './routes/_dashboardLayout/assessmentResult/index' +import { Route as DashboardLayoutAssessmentRequestManagementsIndexImport } from './routes/_dashboardLayout/assessmentRequestManagements/index' +import { Route as DashboardLayoutAssessmentRequestIndexImport } from './routes/_dashboardLayout/assessmentRequest/index' +import { Route as DashboardLayoutAspectIndexImport } from './routes/_dashboardLayout/aspect/index' +import { Route as AssessmentLayoutAssessmentIndexImport } from './routes/_assessmentLayout/assessment/index' // Create Virtual Routes const IndexLazyImport = createFileRoute('/')() +const RegisterIndexLazyImport = createFileRoute('/register/')() const LogoutIndexLazyImport = createFileRoute('/logout/')() -const LoginIndexLazyImport = createFileRoute('/login/')() +const ForgotPasswordIndexLazyImport = createFileRoute('/forgot-password/')() +const ForgotPasswordVerifyLazyImport = createFileRoute( + '/forgot-password/verify', +)() // Create/Update Routes +const VerifyingLayoutRoute = VerifyingLayoutImport.update({ + id: '/_verifyingLayout', + getParentRoute: () => rootRoute, +} as any) + const DashboardLayoutRoute = DashboardLayoutImport.update({ id: '/_dashboardLayout', getParentRoute: () => rootRoute, } as any) +const AssessmentLayoutRoute = AssessmentLayoutImport.update({ + id: '/_assessmentLayout', + getParentRoute: () => rootRoute, +} as any) + const IndexLazyRoute = IndexLazyImport.update({ path: '/', getParentRoute: () => rootRoute, } as any).lazy(() => import('./routes/index.lazy').then((d) => d.Route)) +const RegisterIndexLazyRoute = RegisterIndexLazyImport.update({ + path: '/register/', + getParentRoute: () => rootRoute, +} as any).lazy(() => + import('./routes/register/index.lazy').then((d) => d.Route), +) + const LogoutIndexLazyRoute = LogoutIndexLazyImport.update({ path: '/logout/', getParentRoute: () => rootRoute, } as any).lazy(() => import('./routes/logout/index.lazy').then((d) => d.Route)) -const LoginIndexLazyRoute = LoginIndexLazyImport.update({ +const ForgotPasswordIndexLazyRoute = ForgotPasswordIndexLazyImport.update({ + path: '/forgot-password/', + getParentRoute: () => rootRoute, +} as any).lazy(() => + import('./routes/forgot-password/index.lazy').then((d) => d.Route), +) + +const LoginIndexRoute = LoginIndexImport.update({ path: '/login/', getParentRoute: () => rootRoute, -} as any).lazy(() => import('./routes/login/index.lazy').then((d) => d.Route)) +} as any) + +const ForgotPasswordVerifyLazyRoute = ForgotPasswordVerifyLazyImport.update({ + path: '/forgot-password/verify', + getParentRoute: () => rootRoute, +} as any).lazy(() => + import('./routes/forgot-password/verify.lazy').then((d) => d.Route), +) + +const VerifyingLayoutVerifyingIndexRoute = + VerifyingLayoutVerifyingIndexImport.update({ + path: '/verifying/', + getParentRoute: () => VerifyingLayoutRoute, + } as any).lazy(() => + import('./routes/_verifyingLayout/verifying/index.lazy').then( + (d) => d.Route, + ), + ) const DashboardLayoutUsersIndexRoute = DashboardLayoutUsersIndexImport.update({ path: '/users/', @@ -59,11 +114,74 @@ const DashboardLayoutTimetableIndexRoute = getParentRoute: () => DashboardLayoutRoute, } as any) -const DashboardLayoutDashboardIndexRoute = - DashboardLayoutDashboardIndexImport.update({ - path: '/dashboard/', +const DashboardLayoutQuestionsIndexRoute = + DashboardLayoutQuestionsIndexImport.update({ + path: '/questions/', getParentRoute: () => DashboardLayoutRoute, - } as any) + } as any).lazy(() => + import('./routes/_dashboardLayout/questions/index.lazy').then( + (d) => d.Route, + ), + ) + +const DashboardLayoutAssessmentResultsManagementIndexRoute = + DashboardLayoutAssessmentResultsManagementIndexImport.update({ + path: '/assessmentResultsManagement/', + getParentRoute: () => DashboardLayoutRoute, + } as any).lazy(() => + import( + './routes/_dashboardLayout/assessmentResultsManagement/index.lazy' + ).then((d) => d.Route), + ) + +const DashboardLayoutAssessmentResultIndexRoute = + DashboardLayoutAssessmentResultIndexImport.update({ + path: '/assessmentResult/', + getParentRoute: () => DashboardLayoutRoute, + } as any).lazy(() => + import('./routes/_dashboardLayout/assessmentResult/index.lazy').then( + (d) => d.Route, + ), + ) + +const DashboardLayoutAssessmentRequestManagementsIndexRoute = + DashboardLayoutAssessmentRequestManagementsIndexImport.update({ + path: '/assessmentRequestManagements/', + getParentRoute: () => DashboardLayoutRoute, + } as any).lazy(() => + import( + './routes/_dashboardLayout/assessmentRequestManagements/index.lazy' + ).then((d) => d.Route), + ) + +const DashboardLayoutAssessmentRequestIndexRoute = + DashboardLayoutAssessmentRequestIndexImport.update({ + path: '/assessmentRequest/', + getParentRoute: () => DashboardLayoutRoute, + } as any).lazy(() => + import('./routes/_dashboardLayout/assessmentRequest/index.lazy').then( + (d) => d.Route, + ), + ) + +const DashboardLayoutAspectIndexRoute = DashboardLayoutAspectIndexImport.update( + { + path: '/aspect/', + getParentRoute: () => DashboardLayoutRoute, + } as any, +).lazy(() => + import('./routes/_dashboardLayout/aspect/index.lazy').then((d) => d.Route), +) + +const AssessmentLayoutAssessmentIndexRoute = + AssessmentLayoutAssessmentIndexImport.update({ + path: '/assessment/', + getParentRoute: () => AssessmentLayoutRoute, + } as any).lazy(() => + import('./routes/_assessmentLayout/assessment/index.lazy').then( + (d) => d.Route, + ), + ) // Populate the FileRoutesByPath interface @@ -76,6 +194,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof IndexLazyImport parentRoute: typeof rootRoute } + '/_assessmentLayout': { + id: '/_assessmentLayout' + path: '' + fullPath: '' + preLoaderRoute: typeof AssessmentLayoutImport + parentRoute: typeof rootRoute + } '/_dashboardLayout': { id: '/_dashboardLayout' path: '' @@ -83,11 +208,32 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof DashboardLayoutImport parentRoute: typeof rootRoute } + '/_verifyingLayout': { + id: '/_verifyingLayout' + path: '' + fullPath: '' + preLoaderRoute: typeof VerifyingLayoutImport + parentRoute: typeof rootRoute + } + '/forgot-password/verify': { + id: '/forgot-password/verify' + path: '/forgot-password/verify' + fullPath: '/forgot-password/verify' + preLoaderRoute: typeof ForgotPasswordVerifyLazyImport + parentRoute: typeof rootRoute + } '/login/': { id: '/login/' path: '/login' fullPath: '/login' - preLoaderRoute: typeof LoginIndexLazyImport + preLoaderRoute: typeof LoginIndexImport + parentRoute: typeof rootRoute + } + '/forgot-password/': { + id: '/forgot-password/' + path: '/forgot-password' + fullPath: '/forgot-password' + preLoaderRoute: typeof ForgotPasswordIndexLazyImport parentRoute: typeof rootRoute } '/logout/': { @@ -97,11 +243,60 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof LogoutIndexLazyImport parentRoute: typeof rootRoute } - '/_dashboardLayout/dashboard/': { - id: '/_dashboardLayout/dashboard/' - path: '/dashboard' - fullPath: '/dashboard' - preLoaderRoute: typeof DashboardLayoutDashboardIndexImport + '/register/': { + id: '/register/' + path: '/register' + fullPath: '/register' + preLoaderRoute: typeof RegisterIndexLazyImport + parentRoute: typeof rootRoute + } + '/_assessmentLayout/assessment/': { + id: '/_assessmentLayout/assessment/' + path: '/assessment' + fullPath: '/assessment' + preLoaderRoute: typeof AssessmentLayoutAssessmentIndexImport + parentRoute: typeof AssessmentLayoutImport + } + '/_dashboardLayout/aspect/': { + id: '/_dashboardLayout/aspect/' + path: '/aspect' + fullPath: '/aspect' + preLoaderRoute: typeof DashboardLayoutAspectIndexImport + parentRoute: typeof DashboardLayoutImport + } + '/_dashboardLayout/assessmentRequest/': { + id: '/_dashboardLayout/assessmentRequest/' + path: '/assessmentRequest' + fullPath: '/assessmentRequest' + preLoaderRoute: typeof DashboardLayoutAssessmentRequestIndexImport + parentRoute: typeof DashboardLayoutImport + } + '/_dashboardLayout/assessmentRequestManagements/': { + id: '/_dashboardLayout/assessmentRequestManagements/' + path: '/assessmentRequestManagements' + fullPath: '/assessmentRequestManagements' + preLoaderRoute: typeof DashboardLayoutAssessmentRequestManagementsIndexImport + parentRoute: typeof DashboardLayoutImport + } + '/_dashboardLayout/assessmentResult/': { + id: '/_dashboardLayout/assessmentResult/' + path: '/assessmentResult' + fullPath: '/assessmentResult' + preLoaderRoute: typeof DashboardLayoutAssessmentResultIndexImport + parentRoute: typeof DashboardLayoutImport + } + '/_dashboardLayout/assessmentResultsManagement/': { + id: '/_dashboardLayout/assessmentResultsManagement/' + path: '/assessmentResultsManagement' + fullPath: '/assessmentResultsManagement' + preLoaderRoute: typeof DashboardLayoutAssessmentResultsManagementIndexImport + parentRoute: typeof DashboardLayoutImport + } + '/_dashboardLayout/questions/': { + id: '/_dashboardLayout/questions/' + path: '/questions' + fullPath: '/questions' + preLoaderRoute: typeof DashboardLayoutQuestionsIndexImport parentRoute: typeof DashboardLayoutImport } '/_dashboardLayout/timetable/': { @@ -118,6 +313,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof DashboardLayoutUsersIndexImport parentRoute: typeof DashboardLayoutImport } + '/_verifyingLayout/verifying/': { + id: '/_verifyingLayout/verifying/' + path: '/verifying' + fullPath: '/verifying' + preLoaderRoute: typeof VerifyingLayoutVerifyingIndexImport + parentRoute: typeof VerifyingLayoutImport + } } } @@ -125,13 +327,27 @@ declare module '@tanstack/react-router' { export const routeTree = rootRoute.addChildren({ IndexLazyRoute, + AssessmentLayoutRoute: AssessmentLayoutRoute.addChildren({ + AssessmentLayoutAssessmentIndexRoute, + }), DashboardLayoutRoute: DashboardLayoutRoute.addChildren({ - DashboardLayoutDashboardIndexRoute, + DashboardLayoutAspectIndexRoute, + DashboardLayoutAssessmentRequestIndexRoute, + DashboardLayoutAssessmentRequestManagementsIndexRoute, + DashboardLayoutAssessmentResultIndexRoute, + DashboardLayoutAssessmentResultsManagementIndexRoute, + DashboardLayoutQuestionsIndexRoute, DashboardLayoutTimetableIndexRoute, DashboardLayoutUsersIndexRoute, }), - LoginIndexLazyRoute, + VerifyingLayoutRoute: VerifyingLayoutRoute.addChildren({ + VerifyingLayoutVerifyingIndexRoute, + }), + ForgotPasswordVerifyLazyRoute, + LoginIndexRoute, + ForgotPasswordIndexLazyRoute, LogoutIndexLazyRoute, + RegisterIndexLazyRoute, }) /* prettier-ignore-end */ @@ -143,30 +359,85 @@ export const routeTree = rootRoute.addChildren({ "filePath": "__root.tsx", "children": [ "/", + "/_assessmentLayout", "/_dashboardLayout", + "/_verifyingLayout", + "/forgot-password/verify", "/login/", - "/logout/" + "/forgot-password/", + "/logout/", + "/register/" ] }, "/": { "filePath": "index.lazy.tsx" }, + "/_assessmentLayout": { + "filePath": "_assessmentLayout.tsx", + "children": [ + "/_assessmentLayout/assessment/" + ] + }, "/_dashboardLayout": { "filePath": "_dashboardLayout.tsx", "children": [ - "/_dashboardLayout/dashboard/", + "/_dashboardLayout/aspect/", + "/_dashboardLayout/assessmentRequest/", + "/_dashboardLayout/assessmentRequestManagements/", + "/_dashboardLayout/assessmentResult/", + "/_dashboardLayout/assessmentResultsManagement/", + "/_dashboardLayout/questions/", "/_dashboardLayout/timetable/", "/_dashboardLayout/users/" ] }, + "/_verifyingLayout": { + "filePath": "_verifyingLayout.tsx", + "children": [ + "/_verifyingLayout/verifying/" + ] + }, + "/forgot-password/verify": { + "filePath": "forgot-password/verify.lazy.tsx" + }, "/login/": { - "filePath": "login/index.lazy.tsx" + "filePath": "login/index.tsx" + }, + "/forgot-password/": { + "filePath": "forgot-password/index.lazy.tsx" }, "/logout/": { "filePath": "logout/index.lazy.tsx" }, - "/_dashboardLayout/dashboard/": { - "filePath": "_dashboardLayout/dashboard/index.tsx", + "/register/": { + "filePath": "register/index.lazy.tsx" + }, + "/_assessmentLayout/assessment/": { + "filePath": "_assessmentLayout/assessment/index.tsx", + "parent": "/_assessmentLayout" + }, + "/_dashboardLayout/aspect/": { + "filePath": "_dashboardLayout/aspect/index.tsx", + "parent": "/_dashboardLayout" + }, + "/_dashboardLayout/assessmentRequest/": { + "filePath": "_dashboardLayout/assessmentRequest/index.tsx", + "parent": "/_dashboardLayout" + }, + "/_dashboardLayout/assessmentRequestManagements/": { + "filePath": "_dashboardLayout/assessmentRequestManagements/index.tsx", + "parent": "/_dashboardLayout" + }, + "/_dashboardLayout/assessmentResult/": { + "filePath": "_dashboardLayout/assessmentResult/index.tsx", + "parent": "/_dashboardLayout" + }, + "/_dashboardLayout/assessmentResultsManagement/": { + "filePath": "_dashboardLayout/assessmentResultsManagement/index.tsx", + "parent": "/_dashboardLayout" + }, + "/_dashboardLayout/questions/": { + "filePath": "_dashboardLayout/questions/index.tsx", "parent": "/_dashboardLayout" }, "/_dashboardLayout/timetable/": { @@ -176,6 +447,10 @@ export const routeTree = rootRoute.addChildren({ "/_dashboardLayout/users/": { "filePath": "_dashboardLayout/users/index.tsx", "parent": "/_dashboardLayout" + }, + "/_verifyingLayout/verifying/": { + "filePath": "_verifyingLayout/verifying/index.tsx", + "parent": "/_verifyingLayout" } } } diff --git a/apps/frontend/src/routes/__root.tsx b/apps/frontend/src/routes/__root.tsx index 91b0ffe..3815d1b 100644 --- a/apps/frontend/src/routes/__root.tsx +++ b/apps/frontend/src/routes/__root.tsx @@ -8,9 +8,9 @@ interface RouteContext { export const Route = createRootRouteWithContext()({ component: () => ( -
+
- + {/* */}
), }); diff --git a/apps/frontend/src/routes/_assessmentLayout.tsx b/apps/frontend/src/routes/_assessmentLayout.tsx new file mode 100644 index 0000000..3bbad5c --- /dev/null +++ b/apps/frontend/src/routes/_assessmentLayout.tsx @@ -0,0 +1,71 @@ +import { Navigate, Outlet, createFileRoute } from "@tanstack/react-router"; +import AppHeader from "../components/AppHeader"; +import AppNavbar from "../components/AppNavbar"; +import useAuth from "@/hooks/useAuth"; +import { useQuery } from "@tanstack/react-query"; +import fetchRPC from "@/utils/fetchRPC"; +import client from "@/honoClient"; +import { useState } from "react"; + +export const Route = createFileRoute("/_assessmentLayout")({ + component: AssessmentLayout, + + // beforeLoad: ({ location }) => { + // if (true) { + // throw redirect({ + // to: "/login", + // }); + // } + // }, +}); + +function AssessmentLayout() { + const { isAuthenticated, saveAuthData } = useAuth(); + + useQuery({ + queryKey: ["my-profile"], + queryFn: async () => { + const response = await fetchRPC(client.auth["my-profile"].$get()); + + saveAuthData({ + id: response.id, + name: response.name, + permissions: response.permissions, + role: response.roles[0], + }); + + return response; + }, + enabled: isAuthenticated, + }); + + const [openNavbar, setNavbarOpen] = useState(true); + const [isLeftSidebarOpen, setIsLeftSidebarOpen] = useState(false); + const toggle = () => { + setNavbarOpen(!openNavbar); + }; + + const toggleLeftSidebar = () => { + setIsLeftSidebarOpen(!isLeftSidebarOpen); + }; + + return isAuthenticated ? ( +
+ {/* Header */} + + + {/* Main Content Area */} +
+ {/* Sidebar */} + + + {/* Main Content */} +
+ +
+
+
+ ) : ( + + ); +} diff --git a/apps/frontend/src/routes/_assessmentLayout/assessment/index.lazy.tsx b/apps/frontend/src/routes/_assessmentLayout/assessment/index.lazy.tsx new file mode 100644 index 0000000..9e2e905 --- /dev/null +++ b/apps/frontend/src/routes/_assessmentLayout/assessment/index.lazy.tsx @@ -0,0 +1,1173 @@ +import { createLazyFileRoute } from "@tanstack/react-router"; +import { + Loader, +} from "@mantine/core"; +import { + Card, + CardContent, + CardDescription, +} from "@/shadcn/components/ui/card"; +import { Button } from "@/shadcn/components/ui/button"; +import { Textarea } from "@/shadcn/components/ui/textarea"; +import { Label } from "@/shadcn/components/ui/label"; +import { RadioGroup, RadioGroupItem } from "@/shadcn/components/ui/radio-group"; +import { ScrollArea } from "@/shadcn/components/ui/scroll-area"; +import { + Pagination, +} from "@/shadcn/components/ui/pagination-assessment"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { + getAnswersQueryOptions, + submitAssessmentMutationOptions, + uploadFileMutationOptions, + submitValidationQuery, + submitOptionMutationOptions, + getAverageScoreQueryOptions, + fetchAspects, + getQuestionsAllQueryOptions, + toggleFlagAnswer, +} from "@/modules/assessmentManagement/queries/assessmentQueries"; +import { TbFlagFilled, TbChevronRight, TbChevronDown, TbLayoutSidebarLeftCollapseFilled } from "react-icons/tb"; +import FinishAssessmentModal from "@/modules/assessmentManagement/modals/ConfirmModal"; +import FileUpload from "@/modules/assessmentManagement/fileUpload/fileUpload"; +import ValidationModal from "@/modules/assessmentManagement/modals/ValidationModal"; +import { + Sheet, + SheetContent, + SheetTitle, +} from "@/shadcn/components/ui/sheet"; +import { + LeftSheet, + LeftSheetContent, +} from "@/shadcn/components/ui/leftsheet"; +import { useState, useRef, useEffect } from "react"; +import AppHeader from "@/components/AppHeader"; + +const getQueryParam = (param: string) => { + const urlParams = new URLSearchParams(window.location.search); + return urlParams.get(param); +}; + +export const Route = createLazyFileRoute("/_assessmentLayout/assessment/")({ + component: AssessmentPage, +}); + +interface ToggleFlagResponse { + message: string; + answer: { + id: string; + createdAt: string | null; + updatedAt: string | null; + optionId: string | null; + assessmentId: string | null; + isFlagged: boolean | null; + filename: string | null; + validationInformation: string; + }; +} + +export interface SubmitOptionResponse { + message: string; + answer: { + id: string; + isFlagged: boolean | null; + }; +} + +export default function AssessmentPage() { + const [page, setPage] = useState(1); + const limit = 10; + const questionRefs = useRef<{ [key: string]: HTMLDivElement | null }>({}); + const [files, setFiles] = useState([]); + const [dragActive, setDragActive] = useState(false); + const [flaggedQuestions, setFlaggedQuestions] = useState<{ + [key: string]: boolean; + }>({}); + const fileInputRef = useRef(null); + const [modalOpen, setModalOpen] = useState(false); + const [modalOpenFileSize, setModalOpenFileSize] = useState(false); + const [selectedAspectId, setSelectedAspectId] = useState(null); + const [selectedSubAspectId, setSelectedSubAspectId] = useState(null); + const [assessmentId, setAssessmentId] = useState(null); + const [answers, setAnswers] = useState<{ [key: string]: string }>({}); + const [validationInformation, setValidationInformation] = useState<{ [key: string]: string }>({}); + const [uploadedFiles, setUploadedFiles] = useState<{ [key: string]: File | null }>({}); + const [unansweredQuestions, setUnansweredQuestions] = useState(0); + const [validationModalOpen, setValidationModalOpen] = useState(false); + const [exceededFileName, setExceededFileName] = useState(""); + const [currentPagePerSubAspect, setCurrentPagePerSubAspect] = useState<{ [subAspectId: string]: number }>({}); + const currentPage = currentPagePerSubAspect[selectedSubAspectId || ""] || 1; + const questionsPerPage = 10; + const [isMobile, setIsMobile] = useState(window.innerWidth <= 768); // Check for mobile screen + const [isSidebarOpen, setIsSidebarOpen] = useState(false); + const [openNavbar, setOpenNavbar] = useState(false); + const [isLeftSidebarOpen, setIsLeftSidebarOpen] = useState(false); + + const toggleLeftSidebar = () => setIsLeftSidebarOpen(!isLeftSidebarOpen); + + // Fungsi toggle untuk membuka/menutup navbar + const toggle = () => { + setOpenNavbar((prevState) => !prevState); + }; + + // Adjust layout on screen resize + window.addEventListener('resize', () => { + setIsMobile(window.innerWidth <= 768); + }); + + // Fetch aspects and sub-aspects + const aspectsQuery = useQuery({ + queryKey: ["aspects"], + queryFn: fetchAspects, + }); + + // Fetching questions data using useQuery + const { data, isLoading, isError, error } = useQuery( + getQuestionsAllQueryOptions(page, limit) + ); + + const handleFinishClick = () => { + // Memanggil fungsi untuk memeriksa pertanyaan yang belum dijawab + checkUnansweredQuestions(); + }; + + useEffect(() => { + const id = getQueryParam("id"); + + if (!id) { + setAssessmentId(null); + } else { + setAssessmentId(id); + } + + // Check if aspectsQuery.data is defined + if (aspectsQuery.data?.data && aspectsQuery.data.data.length > 0) { + // If no sub-aspect is selected, find a suitable default + if (selectedSubAspectId === null) { + const firstMatchingSubAspect = aspectsQuery.data.data + .flatMap((aspect) => aspect.subAspects) // Get all sub-aspects + .find((subAspect) => + data?.data.some((question) => question.subAspectId === subAspect.id) + ); + + if (firstMatchingSubAspect) { + setSelectedSubAspectId(firstMatchingSubAspect.id); + + // Find the parent aspect and set its id as the selectedAspectId + const parentAspect = aspectsQuery.data.data.find((aspect) => + aspect.subAspects.some((sub) => sub.id === firstMatchingSubAspect.id) + ); + + if (parentAspect) { + setSelectedAspectId(parentAspect.id); // Use `id` from the parent aspect + setOpenAspects({ [parentAspect.id]: true }); // Open only relevant aspects + } + } + } else { + // Update the aspectId based on the selected sub-aspect + const matchingAspect = aspectsQuery.data.data.find((aspect) => + aspect.subAspects.some((subAspect) => subAspect.id === selectedSubAspectId) + ); + + if (matchingAspect) { + setSelectedAspectId(matchingAspect.id); // Use `id` from the matching aspect + setOpenAspects({ [matchingAspect.id]: true }); // Close all other dropdowns and open only the newly selected aspect + } else { + console.warn("No matching aspect found for selected sub-aspect."); + setSelectedAspectId(null); + setOpenAspects({}); // Close all dropdowns if none of them match + } + } + } + }, [aspectsQuery.data, selectedSubAspectId, data?.data]); + + // Fetching answers for the assessment + const { data: answersData } = useQuery( + getAnswersQueryOptions(assessmentId || "", page, limit), + ); + + if (answersData && answersData.data) { + const transformedData = answersData.data.reduce( + (acc: Record, item: any) => { + if (item.questionId && item.optionId) { + acc[item.questionId] = item.optionId; + } + return acc; + }, + {} + ); + + } + + // Effect untuk mengatur answers dari data yang diambil + useEffect(() => { + const assessmentId = getQueryParam("id"); + if (!assessmentId) { + console.error("Assessment ID tidak ditemukan"); + return; + } + + // Set answers from `answersData` if data is available + if (answersData && Array.isArray(answersData.data)) { + const answersFromDatabase = answersData.data.reduce( + (acc: Record, item: any) => { + if (item.questionId && item.optionId) { + acc[item.questionId] = item.optionId; + } + return acc; + }, + {} + ); + setAnswers(answersFromDatabase); // Set the transformed data directly to state + } + }, [answersData]); + + // Fungsi untuk memeriksa pertanyaan yang belum dijawab + const checkUnansweredQuestions = () => { + + // Filter pertanyaan yang belum dijawab berdasarkan data `answers` + const unanswered = data?.data.filter(question => { + return question.questionId !== null && !answers[question.questionId]; + }) || []; + + setUnansweredQuestions(unanswered.length); + + // Tampilkan modal berdasarkan jumlah pertanyaan yang belum dijawab + if (unanswered.length > 0) { + setValidationModalOpen(true); + } else { + setModalOpen(true); + } + }; + + const handleConfirmFinish = async (assessmentId: string) => { + try { + // Skip counting unanswered questions here to prevent duplication + const mutation = submitAssessmentMutationOptions(assessmentId); + const response = await mutation.mutationFn(); + + // Navigate to results + const newUrl = `/assessmentResult?id=${assessmentId}`; + window.history.pushState({}, "", newUrl); + console.log("Navigated to:", newUrl); + console.log(response.message); + } catch (error) { + console.error("Error finishing assessment:", error); + } finally { + setModalOpen(false); + } + }; + + // Tambahkan state untuk aspek yang terbuka + const [openAspects, setOpenAspects] = useState<{ [key: string]: boolean }>({}); + + const toggleAspect = (aspectId: string) => { + setOpenAspects((prev) => ({ + ...prev, + [aspectId]: !prev[aspectId], // Toggle state untuk aspek yang diklik + })); + }; + + // Fetch average scores by aspect + const averageScoreQuery = useQuery(getAverageScoreQueryOptions(assessmentId || "")); + const aspects = averageScoreQuery.data?.aspects || []; + + // Filter aspects by selected aspectId + const filteredAspects = selectedAspectId + ? aspects.filter((aspect) => aspect.aspectId === selectedAspectId) // Use 'id' instead of 'aspectId' + : aspects; + + // Get the currently selected aspect to show all related sub-aspects + const currentAspect = aspects.find(aspect => aspect.aspectId === selectedAspectId); + const filteredSubAspects = currentAspect ? currentAspect.subAspects : []; + + // Inisialisasi flaggedQuestions dari database saat komponen dimuat + useEffect(() => { + const initialFlagData = answersData?.data.reduce((acc, item) => { + if (item.questionId != null && item.isFlagged != null) { + acc[item.questionId] = item.isFlagged; + } + return acc; + }, {} as Record); + + if (initialFlagData) { + setFlaggedQuestions(initialFlagData); + } + }, [answersData]); + + // Mutation function to toggle flag + const { mutate: toggleFlag } = useMutation({ + mutationFn: (formData: { assessmentId: string; questionId: string; isFlagged: boolean }) => + toggleFlagAnswer(formData), + onSuccess: (response: SubmitOptionResponse) => { + if (response.answer) { + const { answer } = response; + setFlaggedQuestions((prevFlags) => ({ + ...prevFlags, + [answer.id]: answer.isFlagged ?? false, + })); + } + }, + onError: (error) => { + console.error("Error toggling flag:", error); + }, + }); + + // Fungsi untuk toggle flag + const handleToggleFlag = (questionId: string) => { + const newFlagState = !flaggedQuestions[questionId]; + const assessmentId = getQueryParam("id"); + + if (!assessmentId) { + console.error("Assessment ID tidak ditemukan"); + return; + } + + // Update flaggedQuestions di state + setFlaggedQuestions((prevFlags) => ({ + ...prevFlags, + [questionId]: newFlagState, + })); + + // Kirim perubahan flag ke server + toggleFlag({ + assessmentId, + questionId, + isFlagged: newFlagState, + }); + }; + + // Usage of the mutation in your component + const submitOptionMutation = useMutation({ + ...submitOptionMutationOptions, // Spread the mutation options here + onSuccess: () => { + // Refetch the average scores after a successful submission + averageScoreQuery.refetch(); + }, + onError: (error) => { + console.error("Error submitting option:", error); + }, + }); + + const handleAnswerChange = (questionId: string, optionId: string) => { + const assessmentId = getQueryParam("id"); + if (!assessmentId) { + console.error("Assessment ID tidak ditemukan"); + return; + } + + // Update answers in the state + const updatedAnswers = { ...answers, [questionId]: optionId }; + setAnswers(updatedAnswers); + + // Send the updated answer to the backend + submitOptionMutation.mutate({ + optionId, + assessmentId, + questionId, + isFlagged: false, + filename: undefined, + }); + }; + + const validationResult = answersData?.data.reduce((acc, item) => { + if (item.questionId != null && item.validationInformation != null) { + acc[item.questionId] = item.validationInformation; + } + return acc; + }, {} as Record); + + // Mengambil data dari database saat komponen dimuat + useEffect(() => { + if (validationResult) { + setValidationInformation(validationResult); + } + }, [answersData, assessmentId]); + + // Mutation untuk mengirim data ke backend + const { mutate: submitValidation } = useMutation({ + mutationFn: (form: { + assessmentId: string; + questionId: string; + validationInformation: string; + }) => submitValidationQuery(form), + onSuccess: () => { + // Tindakan yang diambil setelah berhasil + console.log("Validation updated successfully!"); + }, + onError: (error) => { + console.error("Error updating validation:", error); + }, + }); + + // Handle perubahan di Textarea + const handleTextareaChange = (questionId: string, value: string) => { + // Memperbarui state validationInformation + setValidationInformation((prev) => ({ + ...prev, + [questionId]: value, + })); + + // Pastikan assessmentId tidak null sebelum mengirimkan data ke server + if (assessmentId) { + // Kirim data validasi ke server + submitValidation({ + assessmentId, + questionId, + validationInformation: value, + }); + } else { + console.error("Assessment ID tidak ditemukan"); + } + }; + + // Mutation for file upload + const uploadFileMutation = useMutation(uploadFileMutationOptions()); + + // Inisialisasi uploadedFiles dari data yang diterima (answersData) + useEffect(() => { + if (answersData && answersData.data) { + + const transformedFileData = answersData.data.reduce((acc, item) => { + + if (item.questionId && item.filename) { + acc[item.questionId] = new File([""], item.filename, { type: "application/pdf" }); + } + + return acc; + }, {} as Record); + + setUploadedFiles(transformedFileData); + } + }, [answersData]); + + // Drag and Drop handlers + const handleDragOver = (event: React.DragEvent) => { + event.preventDefault(); + setDragActive(true); + }; + + const handleDragLeave = () => { + setDragActive(false); + }; + + // Max file size in bytes (64 MB) + const MAX_FILE_SIZE = 64 * 1024 * 1024; + + const handleDrop = (event: React.DragEvent, question: { questionId: string }) => { + event.preventDefault(); + setDragActive(false); + const droppedFiles = Array.from(event.dataTransfer.files); + + if (droppedFiles.length > 0) { + const file = droppedFiles[0]; + + // Validate file size + if (file.size > MAX_FILE_SIZE) { + setExceededFileName(file.name); + setModalOpenFileSize(true); + return; + } + + const formData = new FormData(); + formData.append('file', file); + + if (assessmentId) { + formData.append('assessmentId', assessmentId); + } else { + console.error("assessmentId is null"); + return; + } + + if (question.questionId) { + formData.append('questionId', question.questionId); + } else { + console.error("questionId is null"); + return; + } + + uploadFileMutation.mutate(formData); // Upload file + + // Update state to reflect the uploaded file (store the File object, not just the name) + setUploadedFiles(prev => ({ + ...prev, + [question.questionId]: file, // Store the file itself + })); + } + }; + + const handleClick = () => { + if (fileInputRef.current) { + fileInputRef.current.click(); + } + }; + + const handleFileChange = (event: React.ChangeEvent, question: { questionId: string }) => { + if (event.target.files) { + const fileArray = Array.from(event.target.files); + if (fileArray.length > 0) { + const file = fileArray[0]; + + // Validate file size + if (file.size > MAX_FILE_SIZE) { + setExceededFileName(file.name); + setModalOpenFileSize(true); + return; + } + + const formData = new FormData(); + formData.append('file', file); + + if (assessmentId) { + formData.append('assessmentId', assessmentId); + } else { + console.error("assessmentId is null"); + return; + } + + if (question.questionId) { + formData.append('questionId', question.questionId); + } else { + console.error("questionId is null"); + return; + } + + uploadFileMutation.mutate(formData); // Upload file + + // Update state to reflect the uploaded file (store the File object) + setUploadedFiles(prev => ({ + ...prev, + [question.questionId]: file, // Store the File object, not just the name + })); + } + } + }; + + const handleRemoveFile = (question: { questionId: string }) => { + setUploadedFiles((prev) => ({ + ...prev, + [question.questionId]: null, + })); + }; + + // Function to scroll to the specific question + const scrollToQuestion = (questionId: string) => { + const questionElement = questionRefs.current[questionId]; + if (questionElement) { + questionElement.scrollIntoView({ behavior: "smooth" }); + } + }; + + // Render conditions + if (isLoading) { + return ; + } + + if (isError) { + return ( +

+ Error: {error?.message || "Terjadi kesalahan saat memuat pertanyaan."} +

+ ); + } + + if (!assessmentId) { + return ( + + +

+ Error: Data Asesmen tidak ditemukan. Harap akses halaman melalui link yang valid. +

+
+
+ ); + } + + const startIndex = (currentPage - 1) * questionsPerPage; + + // Fungsi untuk mengubah halaman pada sub-aspek + const handlePageChange = (subAspectId: string, newPage: number) => { + setCurrentPagePerSubAspect((prev) => ({ + ...prev, + [subAspectId]: newPage, + })); + }; + + // Filter pertanyaan berdasarkan halaman saat ini + const filteredQuestions = data?.data?.filter((question) => { + // Filter berdasarkan sub-aspek yang dipilih + return question.subAspectId === selectedSubAspectId; + })?.slice( + (currentPage - 1) * questionsPerPage, + currentPage * questionsPerPage + ) || []; + + // Perbarui jumlah halaman untuk sub-aspek saat ini + const totalQuestionsInSubAspect = data?.data?.filter( + (question) => question.subAspectId === selectedSubAspectId + )?.length || 0; + + const totalPages = Math.ceil(totalQuestionsInSubAspect / questionsPerPage); + + return ( +
+
+
+ + {/* LEFT-SIDE */} + {/* Aspek dan Sub-Aspek */} + + + {/* Sidebar for Mobile */} + {isMobile && ( + setIsLeftSidebarOpen(open)}> + + + +
+
+ {/* Aspek */} + {aspectsQuery.data?.data + .filter((aspect) => + aspect.subAspects.some((subAspect) => + data?.data.some((question) => question.subAspectId === subAspect.id) + ) + ) + .map((aspect) => ( +
+
toggleAspect(aspect.id)} + > +
{aspect.name}
+
+ {openAspects[aspect.id] ? ( + + ) : ( + + )} +
+
+ + {/* Sub-Aspek */} + {openAspects[aspect.id] && ( +
+ {aspect.subAspects + .filter((subAspect) => + data?.data.some((question) => question.subAspectId === subAspect.id) + ) + .map((subAspect) => ( +
setSelectedSubAspectId(subAspect.id)} + > +
{subAspect.name}
+
+ ))} +
+ )} +
+ ))} +
+
+
+
+
+ )} + + {/* Sidebar for Desktop (Always Visible) */} +
+ + +
+
+ {/* Aspek */} + {aspectsQuery.data?.data + .filter((aspect) => + aspect.subAspects.some((subAspect) => + data?.data.some((question) => question.subAspectId === subAspect.id) + ) + ) + .map((aspect) => ( +
+
toggleAspect(aspect.id)} + > +
{aspect.name}
+
+ {openAspects[aspect.id] ? ( + + ) : ( + + )} +
+
+ + {/* Sub-Aspek */} + {openAspects[aspect.id] && ( +
+ {aspect.subAspects + .filter((subAspect) => + data?.data.some((question) => question.subAspectId === subAspect.id) + ) + .map((subAspect) => ( +
setSelectedSubAspectId(subAspect.id)} + > +
{subAspect.name}
+
+ ))} +
+ )} +
+ ))} +
+
+
+
+ + {/* MIDDLE */} + {/* Pertanyaan */} +
+
+ + + {filteredQuestions.length === 0 ? ( + + ) : ( + filteredQuestions.map((question: any, index: number) => { + const questionId = question.questionId; + if (!questionId) return null; + + return ( +
(questionRefs.current[questionId] = el)} + className="space-y-4" + > +
+ {/* Question Number */} + + + {/* Question Text */} + + + {/* Action Button/Flag */} + +
+ + {/* Radio Button Options */} + {question.options?.length > 0 ? ( +
+ handleAnswerChange(question.questionId, value)} + className="flex flex-col gap-2" + > + {question.options.map((option: any) => ( +
handleAnswerChange(question.questionId, option.optionId)} + > + + +
+ ))} +
+
+ ) : ( + + )} + + {/* Textarea for additional information */} +
+