From b2808f531f2a2e95e8164d3201b3b3c30a35951f Mon Sep 17 00:00:00 2001 From: root Date: Thu, 19 Oct 2023 09:23:13 +0700 Subject: [PATCH] Update URL for Konstruksi --- Dockerfile | 30 +- docker-compose.yml | 10 +- nginx/nginx.conf | 17 + src/assets/img/OSPRO.png | Bin 0 -> 55507 bytes src/const/ApiConst.js | 4 +- src/views/Dashboard/DashboardCustomer.js | 2 +- src/views/Dashboard/DashboardProject.js | 2 +- src/views/Dashboard/DashboardProject.js.save | 1698 +++++++++++++++++ .../Dashboard/DashboardProject.js.save.1 | 1698 +++++++++++++++++ src/views/DashboardProject/ganttDashboard.js | 4 +- src/views/Pages/Login/Login.js | 2 +- src/views/Pages/Login/Login.js.save | 345 ++++ src/views/SimproV2/Gantt/GanttFrame.js | 2 +- 13 files changed, 3790 insertions(+), 24 deletions(-) create mode 100644 nginx/nginx.conf create mode 100644 src/assets/img/OSPRO.png create mode 100644 src/views/Dashboard/DashboardProject.js.save create mode 100644 src/views/Dashboard/DashboardProject.js.save.1 create mode 100644 src/views/Pages/Login/Login.js.save diff --git a/Dockerfile b/Dockerfile index f6b8ea0..6894b88 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,20 +1,22 @@ -FROM node:12 +# Stage 1 +FROM node:14 as build-stage + WORKDIR /react-docker -COPY ./package*.json ./ -ENV PATH /app/node_modules/.bin:$PATH +COPY package.json . RUN npm install -RUN npm i react@16.14.0 -RUN npm i react-scripts -RUN npm audit fix +COPY . . + +#ARG REACT_APP_API_BASE_URL +#ENV REACT_APP_API_BASE_URL=$REACT_APP_API_BASE_URL -EXPOSE 8445 +RUN npm run build -# Comment as needed (Production / Dev) -# [PROD] Use for Production -# COPY . . # uncomment prod +# Stage 2 +#FROM nginx:1.17.0-alpine +FROM nginx:alpine -# [DEV] Live Reload -RUN mkdir -p /react-docker/src # comment for prod -RUN mkdir -p /react-docker/public # comment for prod +COPY --from=build-stage /react-docker/build /usr/share/nginx/html +COPY nginx/nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 -CMD PORT=8445 npm start #--host 0.0.0.0 --port 3000 --disableHostCheck true +CMD nginx -g 'daemon off;' diff --git a/docker-compose.yml b/docker-compose.yml index b5ad061..b95feba 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: "3.3" services: frontend: - container_name: ADW-Frontend + container_name: ct-frontend tty: true build: context: . @@ -11,6 +11,12 @@ services: - ./src:/react-docker/src - ./public:/react-docker/public ports: - - 8445:8445 + - 8455:80 + networks: + - ospro_ct environment: - CHOKIDAR_USEPOLLING=true + +networks: + ospro_ct: + driver: bridge diff --git a/nginx/nginx.conf b/nginx/nginx.conf new file mode 100644 index 0000000..40a878b --- /dev/null +++ b/nginx/nginx.conf @@ -0,0 +1,17 @@ +server { + + listen 80; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + error_page 500 502 503 504 /50x.html; + + location = /50x.html { + root /usr/share/nginx/html; + } + +} diff --git a/src/assets/img/OSPRO.png b/src/assets/img/OSPRO.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7361978b07a387436df35f1dcbebc005409292 GIT binary patch literal 55507 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 U;9d;G5(LrJG(7!8-R|c914ELv?*IS* literal 0 HcmV?d00001 diff --git a/src/const/ApiConst.js b/src/const/ApiConst.js index 4241749..c5ba5c3 100644 --- a/src/const/ApiConst.js +++ b/src/const/ApiConst.js @@ -107,7 +107,7 @@ export const API_DAILY_INFO = `${BASE_URL_GEOHR_API2}/employee.php?act=get_daily export const API_DAILY_INFO_DETAIL = (start, length) => `${BASE_URL_GEOHR_API2}/employee.php?act=get_daily_detail&start=${start}&length=${length}&role_name=${roleName}`; -export const APP_MODE = "ADW"; // KIT / ADW / NAWAKARA / IU +export const APP_MODE = "ADW"; // ADW == Konstruksi export const BASE_SIMPRO = "https://oslog.id/simpro-api/v1"; export const BASE_SIMPRO_V2 = "https://oslog.id/simpro-api/v2"; export const BASE_SIMPRO_LUMENNIAGA = "https://ospro-api.odm-iu.com/api"; @@ -116,7 +116,7 @@ export const TOKEN_ADW = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIxMjAyIiwiZXhwIjoxNjkxODMwNDkzfQ.DvBQIOZsdFndWsliPCZT65Y6G5Xx4vWBKz8Rhe7rvRA"; // export let BASE_OSPRO = "https://ospro-api.ospro.id"; -export let BASE_OSPRO = "https://adw-api.ospro.id"; +export let BASE_OSPRO = "https://konstruksi-api.ospro.id"; // 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`; diff --git a/src/views/Dashboard/DashboardCustomer.js b/src/views/Dashboard/DashboardCustomer.js index eef2fd6..10bed77 100644 --- a/src/views/Dashboard/DashboardCustomer.js +++ b/src/views/Dashboard/DashboardCustomer.js @@ -34,7 +34,7 @@ const DashboardCustomer = () => { } } const { PROJECT_ID, GANTT_ID, SCURVE } = useParams(); - const URL_GANTT = `https://adw-gantt.ospro.id/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1`; + const URL_GANTT = `https://konstruksi-gantt.ospro.id/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1`; const mapRef = useRef() const [projectName, setProjectName] = useState(""); const [projectManagerName, setProjectManagerName] = useState(''); diff --git a/src/views/Dashboard/DashboardProject.js b/src/views/Dashboard/DashboardProject.js index 4acf02a..79cb44d 100644 --- a/src/views/Dashboard/DashboardProject.js +++ b/src/views/Dashboard/DashboardProject.js @@ -73,7 +73,7 @@ const DashboardProject = () => { }, }; const { PROJECT_ID, GANTT_ID, SCURVE } = useParams(); - const URL_GANTT = `https://adw-gantt.ospro.id/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1`; + const URL_GANTT = `https://konstruksi-gantt.ospro.id/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1`; const mapRef = useRef(); const [projectName, setProjectName] = useState(""); const [projectManagerName, setProjectManagerName] = useState(""); diff --git a/src/views/Dashboard/DashboardProject.js.save b/src/views/Dashboard/DashboardProject.js.save new file mode 100644 index 0000000..f534d5f --- /dev/null +++ b/src/views/Dashboard/DashboardProject.js.save @@ -0,0 +1,1698 @@ +import React, { useEffect, useMemo, useRef, useState } from "react"; +import axios from "axios"; +import { Row, Col, Button, Input } from "antd"; +import { + CardDashboard, + CardExpenditure, + CardScheduleHealthPerDivision, +} from "../../components/CardDashboard/CardDashboard"; +import L from "leaflet"; +import { useParams } from "react-router-dom"; +import "../../assets/css/customscroll.css"; +import moment from "moment"; +import { renderFormatRupiah } from "../../const/CustomFunc"; +import { BASE_OSPRO } from "../../const/ApiConst"; +import { SendOutlined } from "@ant-design/icons"; +import { + NotificationContainer, + NotificationManager, +} from "react-notifications"; +import ContentLoader from "react-content-loader"; +import { + BehindTaskItem, + Comment, + HealthByBudget, + HealthBySchedule, + ListLoader, + PopupContent, + ProgressActualBar, + ProgressPlanningBar, + SingleTextLoader, +} from "./Components"; +import { Fab, Action } from "react-tiny-fab"; +import "react-tiny-fab/dist/styles.css"; +import { useHistory } from "react-router-dom"; + +const { TextArea } = Input; + +const styles = { + cardContainer: { + backgroundColor: "#F8F8F8", + margin: 2, + paddingLeft: 20, + paddingRight: 20, + paddingTop: 10, + }, + cardHeaderContainer: { + display: "flex", + flexDirection: "row", + marginBottom: 10, + }, + cardChartContainer: { + position: "relative", + height: "21vh", + margin: "auto", + paddingBottom: 10, + justifyContent: "center", + }, + cardTitle: { color: "#444444", fontSize: 16, fontWeight: "bold" }, + cardSubtitle: { color: "#888888", fontSize: 12 }, +}; + +const center = { + lat: -6.2, + lng: 106.816666, +}; + +const DashboardProject = () => { + const token = localStorage.getItem("token"); + const HEADER = { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + }; + const { PROJECT_ID, GANTT_ID, SCURVE } = useParams(); + const URL_GANTT = `https://konstruksi-gantt.ospro.id17/04/2024/view-mode/index.html?base_url=${BASE_OSPRO}/api&gantt_id=${GANTT_ID}&proyek_id=${PROJECT_ID}&token=${token}&ro=1`; + const mapRef = useRef(); + const [projectName, setProjectName] = useState(""); + const [projectManagerName, setProjectManagerName] = useState(""); + const [customerName, setCustomerName] = useState(""); + const [plannedStart, setPlannedStart] = useState(null); + const [plannedFinish, setPlannedFinish] = useState(null); + const [plannedCost, setPlannedCost] = useState(null); + const [totalCost, setTotalCost] = useState(null); + const [actualStart, setActualStart] = useState(null); + const [actualFinish, setActualFinish] = useState(null); + const [estimatedFinish, setEstimatedFinish] = useState(null); + const [mymap, setMymap] = useState(null); + const [activeTabIdx, setActiveTabIdx] = useState(0); + const [activeTabCommentIdx, setActiveTabCommentIdx] = useState(0); + const [planningProgress, setPlanningProgress] = useState(0); + const [actualProgress, setActualProgress] = useState(0); + const [currentBudget, setCurrentBudget] = useState(null); + const [addCostToComplete, setAddCostToComplete] = useState(null); + const [actualToDate, setActualToDate] = useState(null); + const [estAtCompletion, setEstAtCompletion] = useState(null); + const [bcwp, setBcwp] = useState(null); + const [costDeviation, setCostDeviation] = useState(null); + const [remToComplete, setRemToComplete] = useState(0); + const [totalInvoice, setTotalInvoice] = useState(null); + const [cashIn, setCashIn] = useState(null); + const [outstandingBalance, setOutstandingBalance] = useState(null); + const [comment, setComment] = useState(""); + const [comments, setComments] = useState([]); + const [isReadyComments, setIsReadyComments] = useState(false); + const [isSendingComment, setIsSendingComment] = useState(false); + const [isReadyProjectDetail, setIsReadyProjectDetail] = useState(false); + const [isReadySCurve, setIsReadySCurve] = useState(false); + const [isReadyGantt, setIsReadyGantt] = useState(false); + const [isReadyOverdueActivities, setIsReadyOverdueActivities] = + useState(false); + const [isReadyIntegrationInvoice, setIsReadyIntegrationInvoice] = + useState(false); + const [isReadyReportDistribution, setIsReadyReportDistribution] = + useState(false); + const [overdueActivities, setOverdueActivities] = useState([]); + const [healthBySchedule, setHealthBySchedule] = useState("-"); + const [healthByBudget, setHealthByBudget] = useState("-"); + const [reportDistribution, setReportDistribution] = useState([]); + const [manPower, setManPower] = useState(0); + const [assignedHr, setAssignedHr] = useState([]); + const [assignedHrCount, setAssignedHrCount] = useState(0); + const [actualHrCount, setActualHrCount] = useState(0); + const [dataGantt, setDataGantt] = useState({}); + const [dataGanttParents, setDataGanttParents] = useState({}); + const [isReadyGanttParents, setIsReadyGanttParents] = useState(false); + const [calculationStatus, setCalculationStatus] = useState(false); + const [isHierarchy, setIsHierarchy] = useState(false); + let history = useHistory(); + + useEffect(() => { + getProjectDetail(); + getSCurve(); + getOverdueActivities(); + getReportDistribution(); + getComments(); + getGantt(); + getGanttParents(); + return () => { + console.log("unmount RenderMap"); + }; + }, []); + + useEffect(() => { + if (activeTabIdx === 1) { + initMap(); + } + }, [activeTabIdx]); + + useEffect(() => { + async function fetchData() { + await Promise.all([ + getManpower(), + getAssignedHR(), + ...(assignedHr.length > 0 ? [getActualHR()] : []), + ]); + } + fetchData(); + }, []); + + useEffect(() => { + let deviation = 0; + if (plannedCost && totalCost) { + deviation = plannedCost - totalCost; + } + setRemToComplete(deviation.toString()); + }, [plannedCost, totalCost]); + + const handleRedirect = () => { + history.push("/projects/" + GANTT_ID + "/" + PROJECT_ID + "/gantt"); + }; + + const getManpower = async () => { + const url = `${BASE_OSPRO}/api/project/manpower/${PROJECT_ID}`; + try { + const response = await axios.get(url, HEADER); + setManPower(response.data.totalRecord); + } catch (error) { + console.error("Failed to get manpower:", error); + } + }; + + const getGantt = async () => { + setIsReadyGantt(false); + const url = `${BASE_OSPRO}/api/version-gantt/edit/${GANTT_ID}`; + try { + const response = await axios.get(url, HEADER); + setDataGantt(response); + if (response.data.data.hierarchy_ftth_id) { + setIsHierarchy(true); + } + setIsReadyGantt(true); + } catch (error) { + console.error("Failed to get gantt data:", error); + setIsReadyGantt(true); + } + }; + + const getGanttParents = async () => { + setIsReadyGanttParents(false); + const url = `${BASE_OSPRO}/api/hierarchy-ftths/tree-gantt/${GANTT_ID}`; + try { + const response = await axios.get(url, HEADER); + setDataGanttParents(response); + setIsReadyGanttParents(true); + } catch (error) { + console.error("Failed to get gantt data:", error); + setIsReadyGanttParents(true); + } + }; + + const getAssignedHR = async () => { + const url = `${BASE_OSPRO}/api/project/manpower/assigned/${GANTT_ID}`; + try { + const response = await axios.get(url, HEADER); + const today = moment(); + const assignedList = response.data.data + .filter((item) => + today.isBetween(moment(item.start_date), moment(item.end_date)) + ) + .map((item) => item.user_id); + setAssignedHrCount(assignedList.length); + setAssignedHr(assignedList); + } catch (error) { + console.error("Failed to get assigned HR:", error); + } + }; + + const getActualHR = async () => { + const dateStart = moment().startOf("day").toDate(); + const dateEnd = moment().endOf("day").toDate(); + try { + const payload = { + paging: { start: 0, length: -1 }, + columns: [ + { + name: "name", + logic_operator: "ilike", + value: "", + table_name: "m_users", + }, + { + name: "clock_in", + logic_operator: "range", + value: dateStart, + value1: dateEnd, + }, + ], + joins: [ + { + name: "m_users", + column_join: "user_id", + column_results: ["name", "ktp_number"], + }, + ], + orders: { columns: ["id"], ascending: false }, + }; + const url = `${BASE_OSPRO}/api/presence/search`; + const response = await axios.post(url, payload, HEADER); + const actualHrCount = response.data.data.filter((item) => + assignedHr.includes(item.user_id) + ).length; + setActualHrCount(actualHrCount); + } catch (error) { + console.error("Failed to get actual HR:", error); + } + }; + + const getProjectDetail = async () => { + setIsReadyProjectDetail(false); + 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) + .catch((err) => err.response); + console.log("getProjectDetail", result); + if (!result) { + NotificationManager.error(`Could not connect to internet.`, "Failed"); + setIsReadyProjectDetail(true); + return; + } + + if (result.status !== 200) { + NotificationManager.error( + `Get project detail failed, ${result.data.message}`, + "Failed" + ); + 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 : "-" + ); + setCustomerName( + result.data.data.company ? result.data.data.company : "-" + ); + setPlannedStart( + 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( + 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 + ? result.data.data.header.start_date + : null + ); + setEstimatedFinish( + result.data.data.header?.end_date + ? result.data.data.header.end_date + : null + ); + setPlannedCost( + result.data.data.rencana_biaya ? result.data.data.rencana_biaya : null + ); + setIsReadyProjectDetail(true); + setCalculationStatus( + result.data.data.calculation_status + ? result.data.data.calculation_status + : false + ); + + if ( + result.data.data.kode_sortname && + result.data.data.kode_sortname !== "" + ) { + if (SCURVE) { + getIntegrationInvoice(result.data.data.kode_sortname, result.data.data.id); + } else { + getIntegrationInvoice(result.data.data.kode_sortname, result.data.data.id, GANTT_ID); + } + } + } + }; + + const getSCurve = async () => { + setIsReadySCurve(false); + let URL = `${BASE_OSPRO}/api/project/get-s-curve`; + if (SCURVE && SCURVE == "1" && isHierarchy) { + URL = `${BASE_OSPRO}/api/project/calculate-s-curve`; + } + + const payload = { + project_id: PROJECT_ID.toString(), + gantt_id: GANTT_ID.toString(), + period: "week", + // "end_date": moment(new Date()).format('YYYY-MM-DD') + }; + const result = await axios + .post(URL, payload, HEADER) + .then((res) => res) + .catch((err) => err.response); + if (!result) { + NotificationManager.error(`Could not connect to internet.`, "Failed"); + setIsReadySCurve(true); + return; + } + + if (result.status !== 200) { + NotificationManager.error( + `Get S Curve failed, ${result.data.message}`, + "Failed" + ); + setIsReadySCurve(true); + return; + } else if (result.status == 200 && result.data.data) { + let selisihProgress = 0; + let planningProgress = 0; + let actualProgress = 0; + let statusHealthBySchedule = "on-schedule"; + if ( + result.data.data.length > 0 && + result.data.data[0].data?.budget_control + ) { + setCurrentBudget( + result.data.data[0].data.budget_control.current_budget?.toString() + ); + setActualToDate( + result.data.data[0].data.budget_control.acwp?.toString() + ); + setBcwp(result.data.data[0].data.budget_control.bcwp?.toString()); + // setRemToComplete(result.data.data[0].data.budget_control.rem_to_complete?.toString()) + setAddCostToComplete( + result.data.data[0].data.budget_control.add_cost_to_complete?.toString() + ); + setEstAtCompletion( + result.data.data[0].data.budget_control.estimated_at_completion?.toString() + ); + setCostDeviation( + 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 + ) { + if (SCURVE && SCURVE == "1") { + planningProgress = + result.data.data[0].data?.percentagePlan[ + result.data.data[0].data?.percentagePlan.length - 1 + ]; + } else { + planningProgress = result.data.data[0].data?.percentagePlan[n]; + } + setPlanningProgress(planningProgress); + } + if ( + result.data.data.length > 0 && + result.data.data[0].data?.percentageReal && + result.data.data[0].data?.percentageReal.length > 0 + ) { + actualProgress = + result.data.data[0].data?.percentageReal[ + result.data.data[0].data?.percentageReal.length - 1 + ]; + setActualProgress(actualProgress); + } + + selisihProgress = planningProgress - actualProgress; + if (selisihProgress > 0 && selisihProgress <= 5) { + statusHealthBySchedule = "warning"; + } else if (selisihProgress > 5) { + statusHealthBySchedule = "danger"; + } + + setHealthBySchedule(statusHealthBySchedule); + setIsReadySCurve(true); + } + }; + + const getOverdueActivities = async () => { + setIsReadyOverdueActivities(false); + const URL = `${BASE_OSPRO}/api/project/get-overdue-activities`; + const payload = { + id: PROJECT_ID.toString(), + gantt: GANTT_ID.toString(), + scurve: SCURVE ? SCURVE.toString() : null, + till_date: moment(new Date()).format("YYYY-MM-DD"), + }; + const result = await axios + .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); + return; + } + + if (result.status !== 200) { + NotificationManager.error( + `Get Overdue Activities failed, ${result.data.message}`, + "Failed" + ); + setIsReadyOverdueActivities(true); + return; + } else if (result.status == 200 && result.data.data) { + if (result.data.data.overdueActivities) { + setOverdueActivities(result.data.data.overdueActivities); + } + setHealthByBudget(result.data.data.budget_health); + setIsReadyOverdueActivities(true); + } + }; + + const getIntegrationInvoice = async (kode_sortname, id, gantt_id = null) => { + setIsReadyIntegrationInvoice(false); + const URL = `${BASE_OSPRO}/api/project/get-integration-invoice`; + let payload = { + search: kode_sortname, + id: id + }; + if (gantt_id) { + payload.gantt_id = gantt_id; + } + const result = await axios + .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); + return; + } + + if (result.status !== 200) { + NotificationManager.error( + `Get integration invoice failed, ${result.data.message}`, + "Failed" + ); + setIsReadyIntegrationInvoice(true); + return; + } else if (result.status == 200 && result.data.data) { + if (result.data.data.data) { + let total_invoice = result.data.data.data.total_invoice_amount; + let cash_in = result.data.data.data.total_invoice_paid_amount; + let total_cost = result.data.data.data.total_cost; + let outstanding_balance = total_invoice - cash_in; + setTotalInvoice(total_invoice ? total_invoice.toString() : null); + setCashIn(cash_in ? cash_in.toString() : null); + total_cost = total_cost.toString().split(".")[0]; + setTotalCost(total_cost ? total_cost.toString() : null); + setOutstandingBalance( + outstanding_balance ? outstanding_balance.toString() : null + ); + } + setIsReadyIntegrationInvoice(true); + } + }; + + const getReportDistribution = async () => { + setIsReadyReportDistribution(false); + const URL = `${BASE_OSPRO}/api/project/get-report-distribution`; + const payload = { + project_id: PROJECT_ID, + start_date: moment() + .startOf("month") + .subtract(1, "years") + .format("YYYY-MM-DD"), + end_date: moment(new Date()).subtract(1, "years").format("YYYY-MM-DD"), + }; + const result = await axios + .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); + return; + } + + if (result.status !== 200) { + NotificationManager.error( + `Get report distribution failed, ${result.data.message}`, + "Failed" + ); + setIsReadyReportDistribution(true); + return; + } else if (result.status == 200 && result.data.data) { + setReportDistribution(result.data.data); + setIsReadyReportDistribution(true); + } + }; + + const getComments = async () => { + setIsReadyComments(false); + const URL = `${BASE_OSPRO}/api/project-comment/search`; + const payload = { + columns: [ + { + name: "project_id", + logic_operator: "=", + value: PROJECT_ID.toString(), + operator: "AND", + }, + { + name: "gantt_id", + logic_operator: "=", + value: GANTT_ID.toString(), + operator: "AND", + }, + ], + joins: [ + { + name: "m_users", + column_join: "sender_id", + column_results: ["name", "username"], + }, + ], + orders: { columns: ["created_at"], ascending: false }, + paging: { start: 0, length: -1 }, + }; + + const result = await axios + .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); + return; + } + + if (result.status !== 200) { + NotificationManager.error( + `Get comments failed, ${result.data.message}`, + "Failed" + ); + setIsReadyComments(true); + return; + } else if (result.status == 200 && result.data.data) { + setComments(result.data.data); + setIsReadyComments(true); + } + }; + + const handleSendComment = async () => { + // console.log('handleSendComment', comment); + setIsSendingComment(true); + if (comment === "") { + NotificationManager.error( + "Please leave a comment before you send it.", + "Failed" + ); + setIsSendingComment(false); + return; + } + const URL = `${BASE_OSPRO}/api/project-comment/add`; + const payload = { + sender_id: localStorage.getItem("user_id"), + project_id: PROJECT_ID, + gantt_id: GANTT_ID, + comment: comment, + }; + const result = await axios + .post(URL, payload, HEADER) + .then((res) => res) + .catch((err) => err.response); + + if (!result) { + NotificationManager.error(`Could not connect to internet.`, "Failed"); + setIsSendingComment(false); + return; + } + + if (result.status !== 200) { + NotificationManager.error( + `Post comment failed, ${result.data.message}`, + "Failed" + ); + setIsSendingComment(false); + return; + } else if (result.status === 200) { + NotificationManager.success(`Post comment success`, "Success"); + resetInputComment(); + getComments(); + } + }; + + const resetInputComment = () => { + setComment(""); + setIsSendingComment(false); + }; + + const initMap = () => { + let mymap = L.map("map-area", { + center: center, + zoom: 13, + }); + + setMymap(mymap); + L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { + attribution: + '© OpenStreetMap contributors', + }).addTo(mymap); + }; + + useEffect(() => { + if (mymap) { + if (reportDistribution.length > 0) { + reportDistribution.map((item, idx) => { + L.marker([item.lat, item.lon]) + .addTo(mymap) + .bindPopup(PopupContent(item)); + }); + } + } + }, [mymap, reportDistribution]); + + useEffect(() => { + // Add event listener for receiving messages from the iframe + window.addEventListener("message", handleIframeMessage); + + // Clean up the event listener on component unmount + return () => { + window.removeEventListener("message", handleIframeMessage); + }; + }, []); + + const handleIframeMessage = (event) => { + if (event.data && event.data.action === "getUrl") { + const childUrl = window.location.href; + + // Send the URL back to the iframe + event.source.postMessage( + { action: "sendUrl", url: childUrl }, + event.origin + ); + } + }; + + const RenderGantt = useMemo( + () => ( + + ), + [activeTabIdx] + ); + + const RenderComments = useMemo(() => { + return ( + <> +
+