diff --git a/public/OSPRO.ico b/public/OSPRO.ico new file mode 100644 index 0000000..1135207 Binary files /dev/null and b/public/OSPRO.ico differ diff --git a/public/index.html b/public/index.html index ee2b6ef..0529c99 100644 --- a/public/index.html +++ b/public/index.html @@ -8,13 +8,13 @@ - + OSPRO - + import('./views/Layers/Layer')); const Layers = React.lazy(() => import('./views/Layers/Layers')); const Lembur = React.lazy(() => import('./views/Master/MasterLembur')); const MapConfig = React.lazy(() => import('./views/MapConfig')); -const Menu = React.lazy(() => import('./views/Master/MasterMenu')); +const Menu = React.lazy(() => import('./views/Master/MenuCompany')); const OfficeHours = React.lazy(() => import('./views/Master/MasterOfficeHours')); const Organization = React.lazy(() => import('./views/Master/MasterOrganization')); const PanicButton = React.lazy(() => import('./views/SimproV2/PanicButton')); diff --git a/src/views/Dashboard/DashboardBOD.js b/src/views/Dashboard/DashboardBOD.js index 64084b4..a63d260 100644 --- a/src/views/Dashboard/DashboardBOD.js +++ b/src/views/Dashboard/DashboardBOD.js @@ -15,19 +15,19 @@ import { HealthByBudget, HealthBySchedule } from './Components'; import { Link } from 'react-router-dom'; import { Card, CardBody, CardHeader, Input } from "reactstrap"; const DashboardBOD = (props) => { - let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name='', hierarchy=[], user_name=''; - if (props && props.role_id && props.user_id) { - role_id = props.role_id; - user_id = props.user_id; - token = props.token; - isLogin = props.isLogin; - company_id = props.company_id; - all_project = props.all_project; - role_name = props.role_name; - isLogin = props.isLogin; - hierarchy = props.hierarchy; - user_name = props.user_name; - } + let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name = '', hierarchy = [], user_name = ''; + if (props && props.role_id && props.user_id) { + role_id = props.role_id; + user_id = props.user_id; + token = props.token; + isLogin = props.isLogin; + company_id = props.company_id; + all_project = props.all_project; + role_name = props.role_name; + isLogin = props.isLogin; + hierarchy = props.hierarchy; + user_name = props.user_name; + } const HEADER = { headers: { "Content-Type": "application/json", @@ -61,13 +61,6 @@ const DashboardBOD = (props) => { const [READY_TABLE_DETAIL_EXPENDITURE, SET_READY_TABLE_DETAIL_EXPENDITURE] = useState(false); const [DATA_DETAIL_EXPENDITURE, SET_DATA_DETAIL_EXPENDITURE] = useState([]); - const currentYear = new Date().getFullYear(); - const years = Array.from({ length: 6 }, (_, index) => currentYear - index); - const storedYear = localStorage.getItem('selectedYear'); - const initialYear = storedYear ? storedYear : currentYear.toString(); - - const [searchColumn, setSearchColumn] = useState(initialYear); - useEffect(() => { getCompanyCashFlow(); // expenditure getCompanyExpenditureColor(); // expenditure Color @@ -82,14 +75,13 @@ const DashboardBOD = (props) => { getProjectScheduleHealthPerDivision(); // project by schedule health per division getTotalProjectPerDivision(); // project by division getTotalProjectValuePerDivision(); // project value by division - localStorage.setItem('selectedYear', searchColumn); - }, [searchColumn]) + }, []) // project expenditure const getCompanyCashFlow = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-company-cashflow/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-company-cashflow/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project Expenditure."; @@ -115,31 +107,31 @@ const DashboardBOD = (props) => { // Project Expenditure Color const getCompanyExpenditureColor = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-detail-expenditure-color/${company_id}` + const URL = `${BASE_OSPRO}/api/dashboard/get-detail-expenditure-color/${company_id}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) SET_PROJECT_EXPENDITURE_COLOR(result.data.data) } const getCompanyFinancialHealthColor = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-detail-financial-health-color/${company_id}` + const URL = `${BASE_OSPRO}/api/dashboard/get-detail-financial-health-color/${company_id}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) SET_PROJECT_FINANCIAL_HEALTH_COLOR(result.data.data) } const getCompanyScheduleHealthColor = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-detail-schedule-health-color/${company_id}` + const URL = `${BASE_OSPRO}/api/dashboard/get-detail-schedule-health-color/${company_id}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) SET_PROJECT_SCHEDULE_HEALTH_COLOR(result.data.data) } const getCompanyInvoiceColor = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-detail-invoice-color/${company_id}` + const URL = `${BASE_OSPRO}/api/dashboard/get-detail-invoice-color/${company_id}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) SET_PROJECT_INVOICE_COLOR(result.data.data) } const getInvoiceOutstanding = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-invoice-outstanding/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-invoice-outstanding/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project Invoice vs Cash In."; @@ -162,7 +154,7 @@ const DashboardBOD = (props) => { } const getProjectPerScheduleHealth = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-schedule-health/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-schedule-health/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Schedule Health."; @@ -186,7 +178,7 @@ const DashboardBOD = (props) => { } const getProjectPerBudgetHealth = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-budget-health/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-budget-health/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Budget Health."; @@ -209,7 +201,7 @@ const DashboardBOD = (props) => { } const getProjectBudgetHealthPerDivision = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-budget-health-per-division/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-budget-health-per-division/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Schedule Health per Division."; @@ -233,7 +225,7 @@ const DashboardBOD = (props) => { } const getProjectScheduleHealthPerDivision = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-schedule-health-per-division/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-schedule-health-per-division/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Schedule Health."; @@ -256,7 +248,7 @@ const DashboardBOD = (props) => { } const getProjectPerPhase = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-phase/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-phase/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Phase."; @@ -281,7 +273,7 @@ const DashboardBOD = (props) => { } const getTotalProjectPerDivision = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-division/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-per-division/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project by Division."; @@ -306,7 +298,7 @@ const DashboardBOD = (props) => { } const getTotalProjectValuePerDivision = async () => { - const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-value-per-division/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-total-project-value-per-division/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Project Value by Division"; @@ -335,7 +327,7 @@ const DashboardBOD = (props) => { return; } setOpenDetailedView(true); - const URL = `${BASE_OSPRO}/api/dashboard/get-detail-expenditure/${searchColumn}/${company_id}/${all_project}/${hierarchy}` + const URL = `${BASE_OSPRO}/api/dashboard/get-detail-expenditure/${company_id}/${all_project}/${hierarchy}/${role_name}` const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const content = "Get Detail Expenditure"; @@ -454,33 +446,6 @@ const DashboardBOD = (props) => {
{/* */} - - -
-

Dashboard

-
-
-
-

Search by Years

-
-
- setSearchColumn(e.target.value)} - name="select" - > - {years.map((year) => ( - - ))} - -
-
- -
diff --git a/src/views/Dashboard/DashboardProject.js b/src/views/Dashboard/DashboardProject.js index 376bada..7ec0cbe 100644 --- a/src/views/Dashboard/DashboardProject.js +++ b/src/views/Dashboard/DashboardProject.js @@ -30,7 +30,9 @@ import { } from "./Components"; import { Fab, Action } from "react-tiny-fab"; import "react-tiny-fab/dist/styles.css"; -import { useHistory, useLocation, useParams } from "react-router-dom"; +import { useHistory, useParams } from "react-router-dom"; +import { Icon } from '@iconify/react'; +import arrowLeft from '@iconify/icons-ion/ios-arrow-back'; const { TextArea } = Input; @@ -64,8 +66,7 @@ const center = { }; const DashboardProject = (props) => { - - let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name='', hierarchy=[], user_name=''; + let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name = '', hierarchy = [], user_name = ''; if (props && props.role_id && props.user_id) { role_id = props.role_id; user_id = props.user_id; @@ -78,7 +79,6 @@ const DashboardProject = (props) => { hierarchy = props.hierarchy; user_name = props.user_name; } - const HEADER = { headers: { "Content-Type": "application/json", @@ -87,7 +87,7 @@ const DashboardProject = (props) => { }; const { PROJECT_ID, GANTT_ID, SCURVE } = useParams(); const URL_GANTT = `https://project-gantt.ospro.id/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1&role_name=${role_name}&company_id=${company_id}`; - // const URL_GANTT = `http://localhost:8444/generic-ospro-gantt/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1&role_name=${role_name}&company_id=${company_id}`; + // const URL_GANTT = `http://localhost:8444/generic-ospro-gantt/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1&role_name=${role_name}&company_id=${company_id}`; const mapRef = useRef(); const [projectName, setProjectName] = useState(""); const [projectManagerName, setProjectManagerName] = useState(""); @@ -140,6 +140,8 @@ const DashboardProject = (props) => { const [isReadyGanttParents, setIsReadyGanttParents] = useState(false); const [calculationStatus, setCalculationStatus] = useState(false); const [isHierarchy, setIsHierarchy] = useState(null); + const [dataOverdue, setDataOverdue] = useState(null); + const [projectType, setProjectType] = useState(null); let history = useHistory(); useEffect(() => { @@ -150,6 +152,7 @@ const DashboardProject = (props) => { getGantt(); getGanttParents(); return () => { + console.log("unmount RenderMap"); }; }, []); @@ -158,9 +161,10 @@ const DashboardProject = (props) => { getSCurve(); } window.addEventListener("message", handleIframeMessage); - + window.addEventListener('message', handleGetOverdue); return () => { window.removeEventListener("message", handleIframeMessage); + window.removeEventListener("message", handleGetOverdue); }; }, [isHierarchy]); @@ -183,8 +187,13 @@ const DashboardProject = (props) => { useEffect(() => { let deviation = 0; - if (plannedCost && totalCost) { - deviation = plannedCost - totalCost; + // Convert plannedCost and totalCost to numbers + const plannedCostNumber = parseFloat(plannedCost); + const totalCostNumber = parseFloat(totalCost); + + // Check if conversion is successful + if (!isNaN(plannedCostNumber) && !isNaN(totalCostNumber)) { + deviation = plannedCostNumber - totalCostNumber; } setRemToComplete(deviation.toString()); }, [plannedCost, totalCost]); @@ -199,6 +208,7 @@ const DashboardProject = (props) => { const response = await axios.get(url, HEADER); setManPower(response.data.totalRecord); } catch (error) { + console.error("Failed to get manpower:", error); } }; @@ -215,6 +225,7 @@ const DashboardProject = (props) => { } setIsReadyGantt(true); } catch (error) { + console.error("Failed to get gantt data:", error); setIsReadyGantt(true); } }; @@ -227,6 +238,7 @@ const DashboardProject = (props) => { setDataGanttParents(response); setIsReadyGanttParents(true); } catch (error) { + console.error("Failed to get gantt data:", error); setIsReadyGanttParents(true); } }; @@ -244,6 +256,7 @@ const DashboardProject = (props) => { setAssignedHrCount(assignedList.length); setAssignedHr(assignedList); } catch (error) { + console.error("Failed to get assigned HR:", error); } }; @@ -300,6 +313,7 @@ const DashboardProject = (props) => { .get(URL, HEADER) .then((res) => res) .catch((err) => err.response); + console.log("getProjectDetail", result); if (!result) { NotificationManager.error(`Could not connect to internet.`, "Failed"); setIsReadyProjectDetail(true); @@ -314,6 +328,8 @@ const DashboardProject = (props) => { setIsReadyProjectDetail(true); return; } else if (result.status == 200 && result.data.data) { + console.log(result.data.data); + // setComments(result.data.data); setProjectName(result.data.data.nama ? result.data.data.nama : "-"); setProjectManagerName( result.data.data.projectManager ? result.data.data.projectManager : "-" @@ -341,6 +357,7 @@ const DashboardProject = (props) => { ? result.data.data.header?.planned_end : null ); + setProjectType(result.data.data.type_proyek_id); setActualStart( result.data.data.header?.start_date ? result.data.data.header.start_date @@ -408,6 +425,7 @@ const DashboardProject = (props) => { let selisihProgress = 0; let planningProgress = 0; let actualProgress = 0; + console.log("test flow ", result.data.data); let statusHealthBySchedule = "on-schedule"; if ( result.data.data.length > 0 && @@ -431,21 +449,13 @@ const DashboardProject = (props) => { result.data.data[0].data.budget_control.cost_deviation?.toString() ); } - let now = new Date().toISOString().slice(0, 10); - let dates = result.data.data[0].data?.date; - let n = dates.findIndex( - (element) => new Date(now) < new Date(element[0]) - ); - if (n < 0) { - n = dates.length - 1; - } if ( result.data.data.length > 0 && result.data.data[0].data?.percentagePlan && result.data.data[0].data?.percentagePlan.length > 0 ) { - planningProgress = result.data.data[0].data?.percentagePlan[n]; - setPlanningProgress(planningProgress); + planningProgress = result.data.data[0].data?.percentagePlan[result.data.data[0].data?.percentagePlan.length - 1]; + setPlanningProgress(Math.ceil(planningProgress)); } if ( result.data.data.length > 0 && @@ -484,6 +494,7 @@ const DashboardProject = (props) => { .post(URL, payload, HEADER) .then((res) => res) .catch((err) => err.response); + console.log("getOverdueActivities", result); if (!result) { NotificationManager.error(`Could not connect to internet.`, "Failed"); setIsReadyOverdueActivities(true); @@ -520,6 +531,7 @@ const DashboardProject = (props) => { .post(URL, payload, HEADER) .then((res) => res) .catch((err) => err.response); + console.log("getIntegrationInvoice", result); if (!result) { NotificationManager.error(`Could not connect to internet.`, "Failed"); setIsReadyIntegrationInvoice(true); @@ -566,6 +578,7 @@ const DashboardProject = (props) => { .post(URL, payload, HEADER) .then((res) => res) .catch((err) => err.response); + console.log("getReportDistribution", result); if (!result) { NotificationManager.error(`Could not connect to internet.`, "Failed"); setIsReadyReportDistribution(true); @@ -618,6 +631,7 @@ const DashboardProject = (props) => { .post(URL, payload, HEADER) .then((res) => res) .catch((err) => err.response); + console.log("getComments", result); if (!result) { NotificationManager.error(`Could not connect to internet.`, "Failed"); setIsReadyComments(true); @@ -638,6 +652,7 @@ const DashboardProject = (props) => { }; const handleSendComment = async () => { + // console.log('handleSendComment', comment); setIsSendingComment(true); if (comment === "") { NotificationManager.error( @@ -684,6 +699,10 @@ const DashboardProject = (props) => { setIsSendingComment(false); }; + const handleBack = async () => { + window.parent.location.reload(); + }; + const initMap = () => { let mymap = L.map("map-area", { center: center, @@ -731,6 +750,12 @@ const DashboardProject = (props) => { } }; + const handleGetOverdue = (event) => { + if (event.data.type === 'dataOverdueUpdate') { + setDataOverdue(event.data.dataOverdue); + } + } + const RenderGantt = useMemo( () => (