diff --git a/package.json b/package.json index f6e19ba..f958efc 100644 --- a/package.json +++ b/package.json @@ -1,140 +1,142 @@ -{ - "name": "simpro-web", - "version": "0.0.1", - "description": "Sistem Informasi Manajemen Proyek", - "author": "Ardhi", - "homepage": ".", - "copyright": "Copyright Integrasia Utama", - "license": "MIT", - "private": true, - "repository": { - "type": "http", - "url": "https://git.oslog.id/iu/simpro-website.git" - }, - "dependencies": { - "@ant-design/plots": "^1.1.1", - "@coreui/coreui": "^2.1.12", - "@coreui/icons": "0.3.0", - "@coreui/react": "^2.5.1", - "@dabeng/react-orgchart": "^1.0.0", - "@develoka/angka-rupiah-js": "^1.0.3", - "@faker-js/faker": "^7.3.0", - "@iconify/icons-ant-design": "^1.0.6", - "@iconify/icons-fa-solid": "^1.0.6", - "@iconify/icons-fe": "^1.0.3", - "@iconify/icons-geo": "^1.0.3", - "@iconify/icons-ion": "^1.0.7", - "@iconify/icons-mdi": "^1.0.57", - "@iconify/icons-uil": "^1.0.6", - "@iconify/react": "^1.1.1", - "@nicholasadamou/react-iframe": "^1.0.3", - "@reduxjs/toolkit": "^1.9.2", - "@terrestris/ol-util": "^7.2.0", - "@terrestris/react-geo": "^12.0.0", - "alasql": "^1.7.3", - "antd": "^4.16.13", - "axios": "^0.21.1", - "bootstrap": "^4.3.1", - "chart.js": "^3.9.1", - "chartjs-plugin-datalabels": "^2.1.0", - "chartjs-plugin-zoom": "^0.7.7", - "classnames": "^2.2.6", - "core-js": "^3.1.4", - "dhtmlx-gantt": "^7.1.7", - "dom-to-image": "^2.6.0", - "enzyme": "^3.10.0", - "enzyme-adapter-react-16": "^1.14.0", - "flag-icon-css": "^3.3.0", - "font-awesome": "^4.7.0", - "i18next": "^22.4.9", - "interactjs": "^1.10.11", - "jspdf": "^2.5.1", - "jspdf-autotable": "^3.5.25", - "leaflet": "^1.8.0", - "leaflet-control-geocoder": "^2.4.0", - "leaflet-draw": "^1.0.4", - "leaflet.markercluster": "^1.5.3", - "moment": "^2.24.0", - "node-sass": "^4.12.0", - "numeral": "^2.0.6", - "ol": "^5.3.3", - "prop-types": "^15.7.2", - "rc-color-picker": "^1.2.6", - "re-resizable": "^6.9.9", - "react": "^16.14.0", - "react-app-polyfill": "^1.0.1", - "react-awesome-query-builder": "^4.3.0", - "react-bootstrap-sweetalert": "^5.1.9", - "react-bootstrap-table-next": "^3.3.3", - "react-bootstrap-table2-editor": "^1.4.0", - "react-bootstrap-table2-paginator": "^2.1.0", - "react-bootstrap-table2-toolkit": "^2.1.1", - "react-calendar-timeline": "^0.27.0", - "react-chartjs-2": "^4.3.1", - "react-color": "^2.17.3", - "react-content-loader": "^6.0.3", - "react-dom": "^16.14.0", - "react-excel-renderer": "^1.1.0", - "react-grid-layout": "^1.2.5", - "react-highlight-words": "^0.18.0", - "react-i18next": "^12.1.5", - "react-leaflet": "^3.2.0", - "react-leaflet-draw": "^0.19.8", - "react-loader-spinner": "^3.1.5", - "react-notifications": "^1.7.2", - "react-redux": "^8.0.5", - "react-router-dom": "^5.0.1", - "react-select": "^4.3.1", - "react-slick": "^0.28.1", - "react-tiny-fab": "^4.0.4", - "react-toastify": "^5.5.0", - "reactstrap": "^8.0.0", - "redux": "^4.2.1", - "redux-persist": "^6.0.0", - "redux-thunk": "^2.4.2", - "simple-line-icons": "^2.4.1", - "slick-carousel": "^1.8.1", - "underscore": "^1.13.1", - "xlsx": "^0.17.0" - }, - "devDependencies": { - "@babel/core": "^7.14.5", - "babel-plugin-module-resolver": "^4.1.0", - "clean-webpack-plugin": "^3.0.0", - "cypress": "^12.17.2", - "react-scripts": "^3.0.1", - "webpack-sources": "1.0.1" - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts --max_old_space_size=8096 build", - "test": "react-scripts test", - "test:cov": "npm test -- --coverage --watchAll=false", - "test:debug": "react-scripts --inspect-brk test --runInBand", - "eject": "react-scripts eject" - }, - "bugs": { - "url": "https://git.oslog.id/iu/simpro-website/issues" - }, - "eslintConfig": { - "extends": "react-app" - }, - "browserslist": [ - ">0.2%", - "not dead", - "not ie <= 9", - "not op_mini all" - ], - "jest": { - "collectCoverageFrom": [ - "src/**/*.{js,jsx}", - "!**/*index.js", - "!src/serviceWorker.js", - "!src/polyfill.js" - ] - }, - "engines": { - "node": ">=8.10", - "npm": ">=6" - } -} +{ + "name": "simpro-web", + "version": "0.0.1", + "description": "Sistem Informasi Manajemen Proyek", + "author": "Ardhi", + "homepage": ".", + "copyright": "Copyright Integrasia Utama", + "license": "MIT", + "private": true, + "repository": { + "type": "http", + "url": "https://git.oslog.id/iu/simpro-website.git" + }, + "dependencies": { + "@ant-design/plots": "^1.1.1", + "@ckeditor/ckeditor5-build-classic": "^39.0.2", + "@ckeditor/ckeditor5-react": "^6.1.0", + "@coreui/coreui": "^2.1.12", + "@coreui/icons": "0.3.0", + "@coreui/react": "^2.5.1", + "@dabeng/react-orgchart": "^1.0.0", + "@develoka/angka-rupiah-js": "^1.0.3", + "@faker-js/faker": "^7.3.0", + "@iconify/icons-ant-design": "^1.0.6", + "@iconify/icons-fa-solid": "^1.0.6", + "@iconify/icons-fe": "^1.0.3", + "@iconify/icons-geo": "^1.0.3", + "@iconify/icons-ion": "^1.0.7", + "@iconify/icons-mdi": "^1.0.57", + "@iconify/icons-uil": "^1.0.6", + "@iconify/react": "^1.1.1", + "@nicholasadamou/react-iframe": "^1.0.3", + "@reduxjs/toolkit": "^1.9.2", + "@terrestris/ol-util": "^7.2.0", + "@terrestris/react-geo": "^12.0.0", + "alasql": "^1.7.3", + "antd": "^4.16.13", + "axios": "^0.21.1", + "bootstrap": "^4.3.1", + "chart.js": "^3.9.1", + "chartjs-plugin-datalabels": "^2.1.0", + "chartjs-plugin-zoom": "^0.7.7", + "classnames": "^2.2.6", + "core-js": "^3.1.4", + "dhtmlx-gantt": "^7.1.7", + "dom-to-image": "^2.6.0", + "enzyme": "^3.10.0", + "enzyme-adapter-react-16": "^1.14.0", + "flag-icon-css": "^3.3.0", + "font-awesome": "^4.7.0", + "i18next": "^22.4.9", + "interactjs": "^1.10.11", + "jspdf": "^2.5.1", + "jspdf-autotable": "^3.5.25", + "leaflet": "^1.8.0", + "leaflet-control-geocoder": "^2.4.0", + "leaflet-draw": "^1.0.4", + "leaflet.markercluster": "^1.5.3", + "moment": "^2.24.0", + "node-sass": "^4.12.0", + "numeral": "^2.0.6", + "ol": "^5.3.3", + "prop-types": "^15.7.2", + "rc-color-picker": "^1.2.6", + "re-resizable": "^6.9.9", + "react": "^16.14.0", + "react-app-polyfill": "^1.0.1", + "react-awesome-query-builder": "^4.3.0", + "react-bootstrap-sweetalert": "^5.1.9", + "react-bootstrap-table-next": "^3.3.3", + "react-bootstrap-table2-editor": "^1.4.0", + "react-bootstrap-table2-paginator": "^2.1.0", + "react-bootstrap-table2-toolkit": "^2.1.1", + "react-calendar-timeline": "^0.27.0", + "react-chartjs-2": "^4.3.1", + "react-color": "^2.17.3", + "react-content-loader": "^6.0.3", + "react-dom": "^16.14.0", + "react-excel-renderer": "^1.1.0", + "react-grid-layout": "^1.2.5", + "react-highlight-words": "^0.18.0", + "react-i18next": "^12.1.5", + "react-leaflet": "^3.2.0", + "react-leaflet-draw": "^0.19.8", + "react-loader-spinner": "^3.1.5", + "react-notifications": "^1.7.2", + "react-redux": "^8.0.5", + "react-router-dom": "^5.0.1", + "react-select": "^4.3.1", + "react-slick": "^0.28.1", + "react-tiny-fab": "^4.0.4", + "react-toastify": "^5.5.0", + "reactstrap": "^8.0.0", + "redux": "^4.2.1", + "redux-persist": "^6.0.0", + "redux-thunk": "^2.4.2", + "simple-line-icons": "^2.4.1", + "slick-carousel": "^1.8.1", + "underscore": "^1.13.1", + "xlsx": "^0.17.0" + }, + "devDependencies": { + "@babel/core": "^7.14.5", + "babel-plugin-module-resolver": "^4.1.0", + "clean-webpack-plugin": "^3.0.0", + "cypress": "^12.17.2", + "react-scripts": "^3.0.1", + "webpack-sources": "1.0.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts --max_old_space_size=8096 build", + "test": "react-scripts test", + "test:cov": "npm test -- --coverage --watchAll=false", + "test:debug": "react-scripts --inspect-brk test --runInBand", + "eject": "react-scripts eject" + }, + "bugs": { + "url": "https://git.oslog.id/iu/simpro-website/issues" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": [ + ">0.2%", + "not dead", + "not ie <= 9", + "not op_mini all" + ], + "jest": { + "collectCoverageFrom": [ + "src/**/*.{js,jsx}", + "!**/*index.js", + "!src/serviceWorker.js", + "!src/polyfill.js" + ] + }, + "engines": { + "node": ">=8.10", + "npm": ">=6" + } +} diff --git a/src/const/ApiConst.js b/src/const/ApiConst.js index cbed48f..7e9365c 100644 --- a/src/const/ApiConst.js +++ b/src/const/ApiConst.js @@ -117,7 +117,7 @@ export const TOKEN_ADW = // export let BASE_OSPRO = "https://ospro-api.ospro.id"; export let BASE_OSPRO = "https://adw-api.ospro.id"; -// export let BASE_OSPRO = "http://localhost:8444"; +// export let BASE_OSPRO = "http://localhost:8444/adw-backend"; // export let BASE_OSPRO = "http://103.73.125.81:8444"; // ip public adw export let BASE_SIMPRO_LUMEN = `${BASE_OSPRO}/api`; export let BASE_SIMPRO_LUMEN_IMAGE = `${BASE_OSPRO}/assets/image`; @@ -363,6 +363,55 @@ export const PROYEK_ADD = `${BASE_SIMPRO_LUMEN}/project/add`; export const PROYEK_LIST = `${BASE_SIMPRO_LUMEN}/project/list`; export const PROYEK_SEARCH = `${BASE_SIMPRO_LUMEN}/project/search`; export const PROYEK_SEARCH_DETAIL = `${BASE_SIMPRO_LUMEN}/project/search`; +// Checklist +export const PROJECT_CHECKLIST_ADD = `${BASE_SIMPRO_LUMEN}/project-checklists/add`; +export const PROJECT_CHECKLIST_SEARCH = `${BASE_SIMPRO_LUMEN}/project-checklists/search`; +export const PROJECT_CHECKLIST_EDIT = (id) => { + return `${BASE_SIMPRO_LUMEN}/project-checklists/update/${id}`; +}; +export const PROJECT_CHECKLIST_DELETE = (id) => { + return `${BASE_SIMPRO_LUMEN}/project-checklists/delete/${id}`; +}; +export const PROJECT_CHECKLIST_DELETE_BY_PROYEK = (id) => { + return `${BASE_SIMPRO_LUMEN}/project-checklists/delete-by-proyek/${id}`; +}; +export const PROJECT_CHECKLIST_LIST = `${BASE_SIMPRO_LUMEN}/project-checklists/list`; +export const PROJECT_CHECKLIST_WHERE_CUSTOM = (where, id) => { + return `${BASE_SIMPRO_LUMEN}/project-checklists/${where}/${id}`; +}; +// Issue +export const PROJECT_ISSUE_ADD = `${BASE_SIMPRO_LUMEN}/project-issues/add`; +export const PROJECT_ISSUE_SEARCH = `${BASE_SIMPRO_LUMEN}/project-issues/search`; +export const PROJECT_ISSUE_EDIT = (id) => { + return `${BASE_SIMPRO_LUMEN}/project-issues/update/${id}`; +}; +export const PROJECT_ISSUE_DELETE = (id) => { + return `${BASE_SIMPRO_LUMEN}/project-issues/delete/${id}`; +}; +export const PROJECT_ISSUE_DELETE_BY_PROYEK = (id) => { + return `${BASE_SIMPRO_LUMEN}/project-issues/delete-by-proyek/${id}`; +}; +export const PROJECT_ISSUE_LIST = `${BASE_SIMPRO_LUMEN}/project-issues/list`; +export const PROJECT_ISSUE_WHERE_CUSTOM = (where, id) => { + return `${BASE_SIMPRO_LUMEN}/project-issues/${where}/${id}`; +}; +// Potential Risk +export const PROJECT_RISK_ADD = `${BASE_SIMPRO_LUMEN}/project-risks/add`; +export const PROJECT_RISK_SEARCH = `${BASE_SIMPRO_LUMEN}/project-risks/search`; +export const PROJECT_RISK_EDIT = (id) => { + return `${BASE_SIMPRO_LUMEN}/project-risks/update/${id}`; +}; +export const PROJECT_RISK_DELETE = (id) => { + return `${BASE_SIMPRO_LUMEN}/project-risks/delete/${id}`; +}; +export const PROJECT_RISK_DELETE_BY_PROYEK = (id) => { + return `${BASE_SIMPRO_LUMEN}/project-risks/delete-by-proyek/${id}`; +}; +export const PROJECT_RISK_LIST = `${BASE_SIMPRO_LUMEN}/project-risks/list`; +export const PROJECT_RISK_WHERE_CUSTOM = (where, id) => { + return `${BASE_SIMPRO_LUMEN}/project-risks/${where}/${id}`; +}; + // export const PROYEK_SEARCH_BY_USER = (id) => { // return `${BASE_SIMPRO_LUMEN}/project-by-customer/${id}`; // }; @@ -608,6 +657,7 @@ export const CHECKLIST_K3_DELETE = (id) => { export const CHECKLIST_K3_LIST = `${BASE_SIMPRO_LUMEN}/checklist-k3/list`; export const ASSIGN_HR_PROJECT_ADD = `${BASE_SIMPRO_LUMEN}/user-to-proyek/add`; +export const ASSIGN_HR_PROJECT_ADD_MULTIPLE = `${BASE_SIMPRO_LUMEN}/user-to-proyek/add-multiple`; export const ASSIGN_HR_PROJECT_SEARCH = `${BASE_SIMPRO_LUMEN}/user-to-proyek/search`; export const ASSIGN_HR_PROJECT_EDIT = (id) => { return `${BASE_SIMPRO_LUMEN}/user-to-proyek/update/${id}`; @@ -676,3 +726,9 @@ export const HIERARCHY_FTTH_TREE = (id) => { return `${BASE_SIMPRO_LUMEN}/hierarchy-ftths/tree/${id}`; }; export const WAYPOINT_SEARCH = `${BASE_SIMPRO_LUMEN}/waypoint/search`; + +export const IMAGE_UPLOAD = `${BASE_SIMPRO_LUMEN}/image/upload`; + +export const IMAGE_DELETE = (id, category) => { + return `${BASE_SIMPRO_LUMEN}/image/delete/${id}/${category}`; +} diff --git a/src/views/Dashboard/DashboardBOD.js b/src/views/Dashboard/DashboardBOD.js index fff92ef..110fb0d 100644 --- a/src/views/Dashboard/DashboardBOD.js +++ b/src/views/Dashboard/DashboardBOD.js @@ -244,8 +244,10 @@ const DashboardBOD = () => { return; } - if (result.status == 200 && result.data.data) { - SET_PROJECT_PER_DIVISION(result.data.data); + if (result.status == 200 && result.data.data) { + let dataRes = result.data.data; + const filteredData = dataRes.filter(item => item.parent === null); + SET_PROJECT_PER_DIVISION(filteredData); } SET_READY_PROJECT_PER_DIVISION(true); } @@ -311,7 +313,7 @@ const DashboardBOD = () => { planningProgress = item.scurve[0].data.percentagePlan[item.scurve[0].data.percentagePlan.length - 1] actualProgress = item.scurve[0].data.percentageReal[item.scurve[0].data.percentageReal.length - 1] } - + selisihProgress = planningProgress - actualProgress if (selisihProgress > 0 && selisihProgress <= 5) { diff --git a/src/views/Dashboard/DashboardProject.js b/src/views/Dashboard/DashboardProject.js index ac105d5..cabac62 100644 --- a/src/views/Dashboard/DashboardProject.js +++ b/src/views/Dashboard/DashboardProject.js @@ -268,7 +268,13 @@ const DashboardProject = () => { const getProjectDetail = async () => { setIsReadyProjectDetail(false); - const URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}`; + let URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}`; + if (GANTT_ID) { + URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}/${GANTT_ID}`; + } + if (SCURVE) { + URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}/${GANTT_ID}/${SCURVE}`; + } const result = await axios .get(URL, HEADER) .then((res) => res) @@ -298,10 +304,22 @@ const DashboardProject = () => { result.data.data.company ? result.data.data.company : "-" ); setPlannedStart( - result.data.data?.mulai_proyek ? result.data.data.mulai_proyek : null + SCURVE + ? result.data.data.mulai_proyek + ? result.data.data.mulai_proyek + : null + : result.data.data.header?.planned_start + ? result.data.data.header?.planned_start + : null ); setPlannedFinish( - result.data.data?.akhir_proyek ? result.data.data.akhir_proyek : null + SCURVE + ? result.data.data.akhir_proyek + ? result.data.data.akhir_proyek + : null + : result.data.data.header?.planned_end + ? result.data.data.header?.planned_end + : null ); setActualStart( result.data.data.header?.start_date diff --git a/src/views/Master/ConfigAlert/DialogForm.js b/src/views/Master/ConfigAlert/DialogForm.js index dfbd43b..d5d6081 100644 --- a/src/views/Master/ConfigAlert/DialogForm.js +++ b/src/views/Master/ConfigAlert/DialogForm.js @@ -1,99 +1,99 @@ -import React, { useEffect, useState } from 'react' -import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; -import { Button, Form, FormGroup, Label, Input, Col, Row } from 'reactstrap'; -import { Select } from 'antd'; -import moment from 'moment'; -import 'antd/dist/antd.css'; - -const { Option } = Select - -const DialogForm = ({openDialog, closeDialog, toggleDialog, typeDialog, dataEdit, dataMenu}) => { - const [id, setId] = useState(0) - const [name, setName] = useState('') - const [descripton, setDescription] = useState('') - const [status, setStatus] = useState('') - - - useEffect(()=> { - if(typeDialog==="Edit"){ - console.log("data edit", dataEdit) - setId(dataEdit.id) - setName(dataEdit.nama) - setDescription(dataEdit.keterangan) - setStatus(dataEdit.status) - }else{ - setId(0) - setName('') - setDescription('') - setStatus('') - } - },[dataEdit,openDialog]) - - const handleSave = () => { - let data = ''; - if(typeDialog==="Save"){ - data = { - nama:name, - keterangan:descripton, - status - } - - closeDialog('save', data); - }else{ - data = { - id, - nama:name, - keterangan:descripton, - status - } - - - closeDialog('edit', data); - } - } - - const handleCancel = () => { - closeDialog('cancel', 'none') - setId(0) - setName('') - setDescription('') - setStatus('') - } - - - const renderForm = () => { - return( -
- ) - } - - - return ( -{val.nama}
-{val.nama}
+{this.props.t('statusSend')} | -{this.props.t('dateSend')} | -{this.props.t('description')} | -{this.props.t('titleNotification')} | -{this.props.t('messageNotification')} | -
---|---|---|---|---|
{val.status_send === "" ? "-" : val.status_send} | -{val.created_at === "" ? "-" : moment(val.created_date).format("DD-MM-YYYY HH:mm:ss")} | -{val.description === "" ? "-" : val.description} | -{val.title_notif === "" ? "-" : val.title_notif} | -{val.message_notif === "" ? "-" : val.message_notif} | -
{this.props.t('statusSend')} | +{this.props.t('dateSend')} | +{this.props.t('description')} | +{this.props.t('receiver')} | +{this.props.t('titleNotification')} | +{this.props.t('messageNotification')} | +
---|---|---|---|---|---|
{val.status_send === "" ? "-" : val.status_send} | +{val.created_at === "" ? "-" : moment(val.created_date).format("DD-MM-YYYY HH:mm:ss")} | +{val.description === "" ? "-" : val.description} | +{ matchedUser ? matchedUser.name : "-" } | +{val.title_notif === "" ? "-" : val.title_notif} | +{val.message_notif === "" ? "-" : val.message_notif} | +
{i.name} | - ) - })} -
---|
{i.name} | + ) + })} +
---|
{t('action')} | - {column.map((i, index) => { - return ( -{i.name} | - ) - })} -|
---|---|---|
- |
- {n.name} | -{n.description} | -
{t('action')} | + {column.map((i, index) => { + return ( +{i.name} | + ) + })} +|
---|---|---|
+ |
+ {n.name} | +{n.description} | +
- Project name: - | -
- {proyekName}
- |
- |||
- Project description: - | -
- {description}
- |
- |||
- Project objectives: - | -
- {objectives}
- |
- |||
- Project is considered successful when: - | -
- {projectSuccess}
- |
- |||
- Project participants: - | -
-
|
- |||
- Budget: - | -
- {currency} {formatThousand(budget)}
- |
- |||
- Testing Environment: - | -- - | -|||
- Milestones: - | -
-
|
- |||
- Potential risks: - | -- - | -|||
- Approval: - | -
-
|
-
{ K3Number }
{val.checklist_k3_name ? val.checklist_k3_name : "-"}
{ ChecklistNumber }
{val.item ? val.item : "-"}
+ {val.status_exist === true ? "Tersedia" : "Tidak tersedia"} +
++ {val.level_issue ? val.level_issue : "-"} +
+{val.description ? val.description : "-"}
+ {val.level_risk ? val.level_risk : "-"} +
+{val.description ? val.description : "-"}
{val.preventive_risk ? val.preventive_risk : "-"}
{val.join_first_name ? val.join_first_name : val.join_first_name}
+{val.join_second_name ? val.join_second_name : val.join_second_name}
+{val.join_second_description ? val.join_second_description : val.join_second_description}
+{milestoneLetter}
+{val.status}
+{moment(val.deadline).format(formatDate)}
+
+ 1.0 Identifikasi PROYEK + |
+ ||
+ Nama Proyek + |
+
+ {proyekName ?? '-'} + |
+ |
+ Project description + |
+
+ {description ?? '-'} + |
+ |
+ Nomor Proyek + |
+
+ {shortname ?? '-'} + |
+ |
+ Lokasi Proyek + |
+
+ {lokasi ?? '-' } + |
+ |
+ Durasi Proyek + |
+
+ {durasi ?? '-'} + |
+ |
+ Tanggal Mulai Proyek + |
+
+ {moment(mulaiProyek).format(formatDate) ?? "-"} + |
+ |
+ Nilai Kontrak Proyek + |
+
+ {valueProyek ?? '-'} + |
+ |
+ Anggaran Proyek + |
+
+ {currency}. {formatThousand(budget)} + |
+ |
+ Sponsor Proyek + |
+
+ + {sponsorProyek ?? '-'} + + |
+
+ + |
+
+ Project Manager + |
+
+ {PM} + |
+ |
+ Sumber Daya Manusia Untuk Proyek + |
+
+ |
+
+
+ 2.0 OBJEKTIF PROYEK (TUJUAN) + |
+
+ {objectives ?? '-'} + |
+
+
+ 3.0 RUANG LINGKUP PROYEK + |
+
---|
+
|
+
+
+ 4.0 ANGGOTA PROYEK + |
+ ||
+ Nama + |
+
+ Posisi + |
+
+ Tugas dan Tanggung Jawab + |
+
+
+ 5.0 STRUKTUR ORGANISASI + |
+
---|
+ + {image ? ( + + ) : ( + '-' + )} + + |
+
+
+ 6.0 TARGET UTAMA & MILESTONE PENCAPAIAN + |
+ ||
---|---|---|
+ Item + |
+
+ Event Besar / Milestone + |
+
+ Tanggal + |
+
+
+ 7.0 ISU & HAMBATAN UTAMA + |
+ |
+ Tingkat Kepelikan Isu + |
+
+ Penjelasan + |
+
*Skala 1 ke 7 (1 = kecil, 7 = besar)
++
+ 8.0 RESIKO + |
+ ||
+ Tingkat Dampak Resiko + |
+
+ Penjelasan + |
+
+ Pencegahan + |
+
*Skala 1 ke 7 (1 = kecil, 7 = besar)
++
+ 9.0 KONSEKUENSI DARI KETERLAMBATAN + |
+
---|
+
+ 10.0 KRITERIA SUSKSES DARI PROYEK (HARUS TERUKUR) + |
+
---|
+ {projectSuccess ?? '-'} + |
+
+
+ 11.0 ASUMSI (SUMBERDAYA UTAMA) + |
+
---|
+ + | +
+
+ 12.0 CHECK LIST KESIAPAN PROYEK** item utama yang paling kritikal + |
+ ||
+ NO + |
+
+ ITEM + |
+
+ KETERSEDIAAN + |
+
+
+ 13.0 KESEHATAN & KESELAMATAN KERJA (K3) + |
+ ||
+ NO + |
+
+ ITEM + |
+
+
+ 13.0 KOMITMEN DISEPAKATI OLEH + |
+
---|
Aksi | - {column.map((i, index) => { - return ( -{i.name} | - ) - })} -|
---|---|---|
- |
- {n.name} | -{n.description} | -
Aksi | + {column.map((i, index) => { + return ( +{i.name} | + ) + })} +|
---|---|---|
+ |
+ {n.name} | +{n.description} | +
{i.name} | - ) - })} -
---|
{i.name} | + ) + })} +
---|