Compare commits

..

No commits in common. 'master' and 'Dev-Fuad' have entirely different histories.

  1. 26
      src/containers/DefaultLayout/DefaultLayout.js
  2. 2
      src/routes.js
  3. 85
      src/views/Dashboard/DashboardBOD.js
  4. 133
      src/views/Dashboard/DashboardProject.js
  5. 8
      src/views/Master/MasterCompany/index.js
  6. 4
      src/views/SimproV2/CreatedProyek/DialogFormProyek.js
  7. 11
      src/views/SimproV2/CreatedProyek/ViewProject.js
  8. 25
      src/views/SimproV2/CreatedProyek/index.js

26
src/containers/DefaultLayout/DefaultLayout.js

@ -67,7 +67,6 @@ class DefaultLayout extends Component {
if (!localStorage.getItem("token")) { if (!localStorage.getItem("token")) {
this.signOut(); this.signOut();
} }
this.getQueryParams();
window.myData = "Data dari komponen React"; window.myData = "Data dari komponen React";
try { try {
const storedData = localStorage.getItem('configApp'); const storedData = localStorage.getItem('configApp');
@ -134,12 +133,6 @@ class DefaultLayout extends Component {
LayoutHelper.sidebarToggle(!this.state.minimized); LayoutHelper.sidebarToggle(!this.state.minimized);
}; };
getQueryParams() {
const searchParams = new URLSearchParams(this.props.location.search);
const dashboardGantt = searchParams.get('dashboardGantt');
this.setState({ dashboardGantt });
}
setFinalRoutes = () => { setFinalRoutes = () => {
const { routes2 } = this.state; const { routes2 } = this.state;
if (routes2) { if (routes2) {
@ -270,7 +263,7 @@ class DefaultLayout extends Component {
} }
getAppBreadcrumb = () => { getAppBreadcrumb = () => {
const { u_group, dashboardGantt } = this.state; const { u_group } = this.state;
if (u_group == 'kominfo') { if (u_group == 'kominfo') {
routes.map((route, idx) => { routes.map((route, idx) => {
if (route.path == '/dashboard-kominfo') { if (route.path == '/dashboard-kominfo') {
@ -282,7 +275,7 @@ class DefaultLayout extends Component {
}); });
} }
else { else {
if (!window.location.href.includes("dashboard") || window.location.href.includes("dashboard-project") && !dashboardGantt) { if (!window.location.href.includes("dashboard")) {
return <AppBreadcrumb appRoutes={this.state.finalRoutes} router={router} /> return <AppBreadcrumb appRoutes={this.state.finalRoutes} router={router} />
} }
} }
@ -302,10 +295,11 @@ class DefaultLayout extends Component {
const { location } = this.props; const { location } = this.props;
const { pathname } = location; const { pathname } = location;
let renderSidebar = false let renderSidebar = false
const isDashboardProject = this.props.location.pathname.startsWith('/dashboard-project/');
if (pathname.includes("/dashboard-project")) { if (pathname.includes("/dashboard-project")) {
// Remove the base URL and hash // Remove the base URL and hash
const path = pathname.replace("/dashboard-project/", ""); const path = pathname.replace("/dashboard-project/", "");
// Split the remaining path by "/" // Split the remaining path by "/"
const parts = path.split("/"); const parts = path.split("/");
if (parts[2] == "1") { if (parts[2] == "1") {
@ -315,11 +309,16 @@ class DefaultLayout extends Component {
return ( return (
<div className="app"> <div className="app">
{!window.location.href.includes("false-header") && (
<AppHeader fixed>
<DefaultHeader />
</AppHeader>
)
}
<div className="app-body"> <div className="app-body">
{(isDashboardProject ? true : !window.location.href.includes("dashboard-project")) || renderSidebar ? ( {!window.location.href.includes("dashboard-project") || renderSidebar ? (
(!this.state.dashboardGantt ? (
<AppSidebar minimized={this.state.minimized} fixed display="lg"> <AppSidebar minimized={this.state.minimized} fixed display="lg">
<hr />
<AppSidebarHeader /> <AppSidebarHeader />
<AppSidebarForm /> <AppSidebarForm />
<Suspense> <Suspense>
@ -341,7 +340,6 @@ class DefaultLayout extends Component {
<button className='sidebar-minimizer mt-auto' type='button' onClick={this.toggleMinimized}> <button className='sidebar-minimizer mt-auto' type='button' onClick={this.toggleMinimized}>
</button> </button>
</AppSidebar> </AppSidebar>
) : null)
) : null} ) : null}
<main className="main"> <main className="main">
{this.state.breadrCrumbReady ? this.getAppBreadcrumb() : null} {this.state.breadrCrumbReady ? this.getAppBreadcrumb() : null}

2
src/routes.js

@ -68,7 +68,7 @@ const routes = [
{ path: '/dashboard', name: 'DashboardBOD', component: DashboardBOD }, { path: '/dashboard', name: 'DashboardBOD', component: DashboardBOD },
{ path: '/dashboard-dyna', name: 'DashboardBOD', component: DashboardDyna }, { path: '/dashboard-dyna', name: 'DashboardBOD', component: DashboardDyna },
{ path: '/dashboard-customer/:PROJECT_ID/:GANTT_ID/:SCURVE', name: 'DashboardCustomer', component: DashboardCustomer }, { path: '/dashboard-customer/:PROJECT_ID/:GANTT_ID/:SCURVE', name: 'DashboardCustomer', component: DashboardCustomer },
{ path: '/dashboard-project/:PROJECT_ID/:GANTT_ID', exact: true, name: 'Dashboard Project', component: DashboardProject }, { path: '/dashboard-project/:PROJECT_ID/:GANTT_ID/:Header', exact: true, name: 'Dashboard Project', component: DashboardProject },
{ path: '/dashboard-perproject', exact: true, name: 'Dashboard Project Carousell', component: DashboardProjectCarousell }, { path: '/dashboard-perproject', exact: true, name: 'Dashboard Project Carousell', component: DashboardProjectCarousell },
{ path: '/dashboard-project/:PROJECT_ID/:GANTT_ID/:SCURVE', exact: true, name: 'Dashboard Project', component: DashboardProject }, { path: '/dashboard-project/:PROJECT_ID/:GANTT_ID/:SCURVE', exact: true, name: 'Dashboard Project', component: DashboardProject },
{ path: '/projects', exact: true, name: 'Projects', component: CreatedProyek }, { path: '/projects', exact: true, name: 'Projects', component: CreatedProyek },

85
src/views/Dashboard/DashboardBOD.js

@ -61,7 +61,6 @@ const DashboardBOD = (props) => {
const [READY_TABLE_DETAIL_EXPENDITURE, SET_READY_TABLE_DETAIL_EXPENDITURE] = useState(false); const [READY_TABLE_DETAIL_EXPENDITURE, SET_READY_TABLE_DETAIL_EXPENDITURE] = useState(false);
const [DATA_DETAIL_EXPENDITURE, SET_DATA_DETAIL_EXPENDITURE] = useState([]); const [DATA_DETAIL_EXPENDITURE, SET_DATA_DETAIL_EXPENDITURE] = useState([]);
useEffect(() => { useEffect(() => {
// actualProgressProject();
getCompanyCashFlow(); // expenditure getCompanyCashFlow(); // expenditure
getCompanyExpenditureColor(); // expenditure Color getCompanyExpenditureColor(); // expenditure Color
getCompanyFinancialHealthColor(); // financial health Color getCompanyFinancialHealthColor(); // financial health Color
@ -112,11 +111,6 @@ const DashboardBOD = (props) => {
SET_PROJECT_EXPENDITURE_COLOR(result.data.data) SET_PROJECT_EXPENDITURE_COLOR(result.data.data)
} }
const actualProgressProject = async () => {
const URL = `${BASE_OSPRO}/api/project/actual-progress-project-command`;
const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response)
}
const getCompanyFinancialHealthColor = async () => { const getCompanyFinancialHealthColor = async () => {
const URL = `${BASE_OSPRO}/api/dashboard/get-detail-financial-health-color/${role_name}` const URL = `${BASE_OSPRO}/api/dashboard/get-detail-financial-health-color/${role_name}`
const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response) const result = await axios.get(URL, HEADER).then(res => res).catch(err => err.response)
@ -443,11 +437,20 @@ const DashboardBOD = (props) => {
<div style={{ color: '#888888', fontSize: 12 }}>Total Project Expenditure from on-going project.</div> <div style={{ color: '#888888', fontSize: 12 }}>Total Project Expenditure from on-going project.</div>
</div> </div>
{PROJECT_EXPENDITURE ? {PROJECT_EXPENDITURE ?
<>
<div style={{ flex: 6, display: 'flex', justifyContent: 'center', alignItems: 'center' }} onClick={handleGetDetailExpenditure}> <div style={{ flex: 6, display: 'flex', justifyContent: 'center', alignItems: 'center' }} onClick={handleGetDetailExpenditure}>
<div style={{ backgroundColor: '#DDDDDD', color: '#4C4747', borderRadius: 5, padding: 4, fontWeight: 500, cursor: 'pointer', fontSize: 12, textAlign: 'center', lineHeight: 'normal' }}> <div style={{ backgroundColor: '#DDDDDD', color: '#4C4747', borderRadius: 5, padding: 4, fontWeight: 500, cursor: 'pointer', fontSize: 12, textAlign: 'center', lineHeight: 'normal' }}>
Detailed View Detailed View
</div> </div>
</div> </div>
{/* <div style={{ flex: 6, display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
<Link to="/dashboard-perproject" style={{ textDecoration: 'none' }}>
<div style={{ backgroundColor: '#DDDDDD', color: '#4C4747', borderRadius: 5, padding: 4, fontWeight: 500, cursor: 'pointer', fontSize: 12, textAlign: 'center', lineHeight: 'normal' }}>
All Dashboard
</div>
</Link>
</div> */}
</>
: :
<div style={{ flex: 6, display: 'flex', justifyContent: 'center', alignItems: 'center' }}> <div style={{ flex: 6, display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
<div style={{ backgroundColor: '#DDDDDD', color: '#4C4747', borderRadius: 5, padding: 4, fontWeight: 500, fontSize: 12, textAlign: 'center', lineHeight: 'normal' }}>Detailed View</div> <div style={{ backgroundColor: '#DDDDDD', color: '#4C4747', borderRadius: 5, padding: 4, fontWeight: 500, fontSize: 12, textAlign: 'center', lineHeight: 'normal' }}>Detailed View</div>
@ -473,33 +476,11 @@ const DashboardBOD = (props) => {
ticks: { ticks: {
autoSkip: false, autoSkip: false,
stepSize: 2, stepSize: 2,
maxRotation: 0, // callback: function (value) {
minRotation: 0, // if (value === 0 || value === null || value === undefined) {
callback: function (value) { // return '';
const label = this.getLabelForValue(value); // }
const maxLength = 30; // }
const splitLabel = (label) => {
if (label.length <= maxLength) {
return [label];
}
const words = label.split(' ');
let lines = [];
let currentLine = '';
words.forEach((word) => {
if (currentLine.length + word.length + 1 <= maxLength) {
currentLine += word + ' ';
} else {
lines.push(currentLine.trim());
currentLine = word + ' ';
}
});
if (currentLine.length > 0) {
lines.push(currentLine.trim());
}
return lines;
};
return splitLabel(label);
},
} }
} }
}, },
@ -520,41 +501,38 @@ const DashboardBOD = (props) => {
data={{ data={{
labels: [ labels: [
`Target Pendapatan ${moment().format('YYYY')}`, `Target Pendapatan ${moment().format('YYYY')}`,
'Total Nilai Kontrak Yang Sedang Berjalan', 'Realisasi Pendapatan',
'Target Pendapatan Berdasarkan Kontrak 2024' 'Realisasi Cash In',
// 'Anggaran Biaya', 'Anggaran Biaya',
// 'Realisasi Anggaran Biaya', 'Realisasi Anggaran Biaya',
// 'Laba' 'Laba'
], ],
datasets: [ datasets: [
{ {
label: '', label: '',
data: [ data: [
// PROJECT_EXPENDITURE?.total_budget || 0, PROJECT_EXPENDITURE?.total_budget || 0,
// PROJECT_EXPENDITURE?.total_expenditure || 0, PROJECT_EXPENDITURE?.total_expenditure || 0,
// PROJECT_EXPENDITURE?.total_invoice ? Math.floor(PROJECT_EXPENDITURE.total_invoice) : 0, PROJECT_EXPENDITURE?.total_invoice ? Math.floor(PROJECT_EXPENDITURE.total_invoice) : 0,
// PROJECT_EXPENDITURE?.total_paid_invoice || 0, PROJECT_EXPENDITURE?.total_paid_invoice || 0,
// PROJECT_EXPENDITURE?.total_paid_invoice || 0, PROJECT_EXPENDITURE?.total_paid_invoice || 0,
// PROJECT_EXPENDITURE?.total_paid_invoice || 0 PROJECT_EXPENDITURE?.total_paid_invoice || 0
98000000000,
PROJECT_EXPENDITURE?.total_value_proyek || 0,
PROJECT_EXPENDITURE?.total_income_year || 0
], ],
borderColor: [ borderColor: [
PROJECT_EXPENDITURE_COLOR?.total_budget || '#480ca8', PROJECT_EXPENDITURE_COLOR?.total_budget || '#480ca8',
PROJECT_EXPENDITURE_COLOR?.total_expenditure || '#b5179e', PROJECT_EXPENDITURE_COLOR?.total_expenditure || '#b5179e',
PROJECT_EXPENDITURE_COLOR?.total_invoice || '#a26a16', PROJECT_EXPENDITURE_COLOR?.total_invoice || '#a26a16',
// PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#4c4747', PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#4c4747',
// PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#e00000', PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#e00000',
// PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#033a37' PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#033a37'
], ],
backgroundColor: [ backgroundColor: [
PROJECT_EXPENDITURE_COLOR?.total_budget || '#480ca8', PROJECT_EXPENDITURE_COLOR?.total_budget || '#480ca8',
PROJECT_EXPENDITURE_COLOR?.total_expenditure || '#b5179e', PROJECT_EXPENDITURE_COLOR?.total_expenditure || '#b5179e',
PROJECT_EXPENDITURE_COLOR?.total_invoice || '#a26a16', PROJECT_EXPENDITURE_COLOR?.total_invoice || '#a26a16',
// PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#4c4747', PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#4c4747',
// PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#e00000', PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#e00000',
// PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#033a37' PROJECT_EXPENDITURE_COLOR?.total_paid_invoice || '#033a37'
], ],
borderRadius: 5, borderRadius: 5,
borderSkipped: false borderSkipped: false
@ -562,6 +540,7 @@ const DashboardBOD = (props) => {
], ],
}} }}
/> />
: :
<NoDataChart /> <NoDataChart />
: :

133
src/views/Dashboard/DashboardProject.js

@ -31,15 +31,34 @@ import {
import { Fab, Action } from "react-tiny-fab"; import { Fab, Action } from "react-tiny-fab";
import "react-tiny-fab/dist/styles.css"; import "react-tiny-fab/dist/styles.css";
import { useHistory, useLocation, useParams } from "react-router-dom"; import { useHistory, useLocation, useParams } from "react-router-dom";
import { Icon } from '@iconify/react';
import arrowLeft from '@iconify/icons-ion/ios-arrow-back';
const { TextArea } = Input; 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 = { const center = {
lat: -6.2, lat: -6.2,
lng: 106.816666, lng: 106.816666,
}; };
const DashboardProject = (props) => { const DashboardProject = (props) => {
let role_id = 0, user_id = 0, isLogin = false, token = '', all_project = null, role_name = '', hierarchy = [], user_name = ''; let role_id = 0, user_id = 0, isLogin = false, token = '', all_project = null, role_name = '', hierarchy = [], user_name = '';
if (props && props.role_id && props.user_id) { if (props && props.role_id && props.user_id) {
@ -53,14 +72,12 @@ const DashboardProject = (props) => {
hierarchy = props.hierarchy; hierarchy = props.hierarchy;
user_name = props.user_name; user_name = props.user_name;
} }
const HEADER = { const HEADER = {
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
Authorization: `Bearer ${token}`, Authorization: `Bearer ${token}`,
}, },
}; };
const { PROJECT_ID, GANTT_ID, SCURVE } = useParams(); 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}`; 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}`;
// 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}`; // 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}`;
@ -80,7 +97,6 @@ const DashboardProject = (props) => {
const [activeTabIdx, setActiveTabIdx] = useState(0); const [activeTabIdx, setActiveTabIdx] = useState(0);
const [activeTabCommentIdx, setActiveTabCommentIdx] = useState(0); const [activeTabCommentIdx, setActiveTabCommentIdx] = useState(0);
const [planningProgress, setPlanningProgress] = useState(0); const [planningProgress, setPlanningProgress] = useState(0);
const [planningProgressToDay, setPlanningProgressToDay] = useState(0);
const [actualProgress, setActualProgress] = useState(0); const [actualProgress, setActualProgress] = useState(0);
const [currentBudget, setCurrentBudget] = useState(null); const [currentBudget, setCurrentBudget] = useState(null);
const [addCostToComplete, setAddCostToComplete] = useState(null); const [addCostToComplete, setAddCostToComplete] = useState(null);
@ -118,7 +134,6 @@ const DashboardProject = (props) => {
const [isReadyGanttParents, setIsReadyGanttParents] = useState(false); const [isReadyGanttParents, setIsReadyGanttParents] = useState(false);
const [calculationStatus, setCalculationStatus] = useState(false); const [calculationStatus, setCalculationStatus] = useState(false);
const [isHierarchy, setIsHierarchy] = useState(null); const [isHierarchy, setIsHierarchy] = useState(null);
const [dashboardGantt, setDashboardStatus] = useState(false);
let history = useHistory(); let history = useHistory();
useEffect(() => { useEffect(() => {
getProjectDetail(); getProjectDetail();
@ -127,11 +142,9 @@ const DashboardProject = (props) => {
getComments(); getComments();
getGantt(); getGantt();
getGanttParents(); getGanttParents();
getQueryParams();
return () => { return () => {
}; };
}, []); }, []);
useEffect(() => { useEffect(() => {
if (isHierarchy != null) { if (isHierarchy != null) {
getSCurve(); getSCurve();
@ -141,23 +154,21 @@ const DashboardProject = (props) => {
window.removeEventListener("message", handleIframeMessage); window.removeEventListener("message", handleIframeMessage);
}; };
}, [isHierarchy]); }, [isHierarchy]);
useEffect(() => { useEffect(() => {
if (activeTabIdx === 1) { if (activeTabIdx === 1) {
initMap(); initMap();
} }
}, [activeTabIdx]); }, [activeTabIdx]);
useEffect(() => { useEffect(() => {
async function fetchData() { async function fetchData() {
await Promise.all([ await Promise.all([
getManpower(), getManpower(),
getAssignedHR() getAssignedHR(),
...(assignedHr.length > 0 ? [getActualHR()] : []),
]); ]);
} }
fetchData(); fetchData();
}, []); }, []);
useEffect(() => { useEffect(() => {
let deviation = 0; let deviation = 0;
if (plannedCost && totalCost) { if (plannedCost && totalCost) {
@ -165,11 +176,9 @@ const DashboardProject = (props) => {
} }
setRemToComplete(deviation.toString()); setRemToComplete(deviation.toString());
}, [plannedCost, totalCost]); }, [plannedCost, totalCost]);
const handleRedirect = () => { const handleRedirect = () => {
history.push("/projects/" + GANTT_ID + "/" + PROJECT_ID + "/gantt"); history.push("/projects/" + GANTT_ID + "/" + PROJECT_ID + "/gantt");
}; };
const getManpower = async () => { const getManpower = async () => {
const url = `${BASE_OSPRO}/api/project/manpower/${PROJECT_ID}`; const url = `${BASE_OSPRO}/api/project/manpower/${PROJECT_ID}`;
try { try {
@ -178,7 +187,6 @@ const DashboardProject = (props) => {
} catch (error) { } catch (error) {
} }
}; };
const getGantt = async () => { const getGantt = async () => {
setIsReadyGantt(false); setIsReadyGantt(false);
const url = `${BASE_OSPRO}/api/version-gantt/edit/${GANTT_ID}`; const url = `${BASE_OSPRO}/api/version-gantt/edit/${GANTT_ID}`;
@ -195,7 +203,6 @@ const DashboardProject = (props) => {
setIsReadyGantt(true); setIsReadyGantt(true);
} }
}; };
const getGanttParents = async () => { const getGanttParents = async () => {
setIsReadyGanttParents(false); setIsReadyGanttParents(false);
const url = `${BASE_OSPRO}/api/hierarchy-ftths/tree-gantt/${GANTT_ID}`; const url = `${BASE_OSPRO}/api/hierarchy-ftths/tree-gantt/${GANTT_ID}`;
@ -207,7 +214,6 @@ const DashboardProject = (props) => {
setIsReadyGanttParents(true); setIsReadyGanttParents(true);
} }
}; };
const getAssignedHR = async () => { const getAssignedHR = async () => {
const url = `${BASE_OSPRO}/api/project/manpower/assigned/${GANTT_ID}`; const url = `${BASE_OSPRO}/api/project/manpower/assigned/${GANTT_ID}`;
try { try {
@ -218,16 +224,11 @@ const DashboardProject = (props) => {
today.isBetween(moment(item.start_date), moment(item.end_date)) today.isBetween(moment(item.start_date), moment(item.end_date))
) )
.map((item) => item.user_id); .map((item) => item.user_id);
const uniqueUserIds = new Set(assignedList); setAssignedHrCount(assignedList.length);
setAssignedHrCount(uniqueUserIds.size); setAssignedHr(assignedList);
if (assignedList.length > 0) {
getActualHR(assignedList)
}
} catch (error) { } catch (error) {
console.error("Failed to get assigned HR:", error);
} }
}; };
const getActualHR = async () => { const getActualHR = async () => {
const dateStart = moment().startOf("day").toDate(); const dateStart = moment().startOf("day").toDate();
const dateEnd = moment().endOf("day").toDate(); const dateEnd = moment().endOf("day").toDate();
@ -267,7 +268,6 @@ const DashboardProject = (props) => {
console.error("Failed to get actual HR:", error); console.error("Failed to get actual HR:", error);
} }
}; };
const getProjectDetail = async () => { const getProjectDetail = async () => {
setIsReadyProjectDetail(false); setIsReadyProjectDetail(false);
let URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}`; let URL = `${BASE_OSPRO}/api/project/detail/${PROJECT_ID}`;
@ -352,7 +352,6 @@ const DashboardProject = (props) => {
} }
} }
}; };
const getSCurve = async () => { const getSCurve = async () => {
setIsReadySCurve(false); setIsReadySCurve(false);
let URL = `${BASE_OSPRO}/api/project/get-s-curve`; let URL = `${BASE_OSPRO}/api/project/get-s-curve`;
@ -385,7 +384,6 @@ const DashboardProject = (props) => {
let selisihProgress = 0; let selisihProgress = 0;
let planningProgress = 0; let planningProgress = 0;
let actualProgress = 0; let actualProgress = 0;
let progressPlanToDay = 0;
let statusHealthBySchedule = "behind-schedule"; let statusHealthBySchedule = "behind-schedule";
if ( if (
result.data.data.length > 0 && result.data.data.length > 0 &&
@ -425,14 +423,6 @@ const DashboardProject = (props) => {
planningProgress = result.data.data[0].data?.percentagePlan[n]; planningProgress = result.data.data[0].data?.percentagePlan[n];
setPlanningProgress(planningProgress); setPlanningProgress(planningProgress);
} }
if (
result.data.data.length > 0 &&
result.data.data[0].data?.progressPlanToDay &&
result.data.data[0].data?.progressPlanToDay != null
) {
progressPlanToDay = result.data.data[0].data?.progressPlanToDay;
setPlanningProgressToDay(+(Math.round(progressPlanToDay + "e+2") + "e-2"));
}
if ( if (
result.data.data.length > 0 && result.data.data.length > 0 &&
result.data.data[0].data?.percentageReal && result.data.data[0].data?.percentageReal &&
@ -442,7 +432,7 @@ const DashboardProject = (props) => {
result.data.data[0].data?.percentageReal[ result.data.data[0].data?.percentageReal[
result.data.data[0].data?.percentageReal.length - 1 result.data.data[0].data?.percentageReal.length - 1
]; ];
setActualProgress(+(Math.round(actualProgress + "e+2") + "e-2")); setActualProgress(actualProgress);
} }
selisihProgress = planningProgress - actualProgress; selisihProgress = planningProgress - actualProgress;
if (selisihProgress > 0 && selisihProgress <= 20) { if (selisihProgress > 0 && selisihProgress <= 20) {
@ -454,7 +444,6 @@ const DashboardProject = (props) => {
setIsReadySCurve(true); setIsReadySCurve(true);
} }
}; };
const getOverdueActivities = async () => { const getOverdueActivities = async () => {
setIsReadyOverdueActivities(false); setIsReadyOverdueActivities(false);
const URL = `${BASE_OSPRO}/api/project/get-overdue-activities`; const URL = `${BASE_OSPRO}/api/project/get-overdue-activities`;
@ -488,7 +477,6 @@ const DashboardProject = (props) => {
setIsReadyOverdueActivities(true); setIsReadyOverdueActivities(true);
} }
}; };
const getIntegrationInvoice = async (kode_sortname, id, gantt_id = null) => { const getIntegrationInvoice = async (kode_sortname, id, gantt_id = null) => {
setIsReadyIntegrationInvoice(false); setIsReadyIntegrationInvoice(false);
const URL = `${BASE_OSPRO}/api/project/get-integration-invoice`; const URL = `${BASE_OSPRO}/api/project/get-integration-invoice`;
@ -509,10 +497,10 @@ const DashboardProject = (props) => {
return; return;
} }
if (result.status !== 200) { if (result.status !== 200) {
// NotificationManager.error( NotificationManager.error(
// `Get integration invoice failed, ${result.data.message}`, `Get integration invoice failed, ${result.data.message}`,
// "Failed" "Failed"
// ); );
setIsReadyIntegrationInvoice(true); setIsReadyIntegrationInvoice(true);
return; return;
} else if (result.status == 200 && result.data.data) { } else if (result.status == 200 && result.data.data) {
@ -532,7 +520,6 @@ const DashboardProject = (props) => {
setIsReadyIntegrationInvoice(true); setIsReadyIntegrationInvoice(true);
} }
}; };
const getReportDistribution = async () => { const getReportDistribution = async () => {
setIsReadyReportDistribution(false); setIsReadyReportDistribution(false);
const URL = `${BASE_OSPRO}/api/project/get-report-distribution`; const URL = `${BASE_OSPRO}/api/project/get-report-distribution`;
@ -565,7 +552,6 @@ const DashboardProject = (props) => {
setIsReadyReportDistribution(true); setIsReadyReportDistribution(true);
} }
}; };
const getComments = async () => { const getComments = async () => {
setIsReadyComments(false); setIsReadyComments(false);
const URL = `${BASE_OSPRO}/api/project-comment/search`; const URL = `${BASE_OSPRO}/api/project-comment/search`;
@ -594,7 +580,6 @@ const DashboardProject = (props) => {
orders: { columns: ["created_at"], ascending: false }, orders: { columns: ["created_at"], ascending: false },
paging: { start: 0, length: -1 }, paging: { start: 0, length: -1 },
}; };
const result = await axios const result = await axios
.post(URL, payload, HEADER) .post(URL, payload, HEADER)
.then((res) => res) .then((res) => res)
@ -616,7 +601,6 @@ const DashboardProject = (props) => {
setIsReadyComments(true); setIsReadyComments(true);
} }
}; };
const handleSendComment = async () => { const handleSendComment = async () => {
setIsSendingComment(true); setIsSendingComment(true);
if (comment === "") { if (comment === "") {
@ -656,23 +640,10 @@ const DashboardProject = (props) => {
getComments(); getComments();
} }
}; };
const resetInputComment = () => { const resetInputComment = () => {
setComment(""); setComment("");
setIsSendingComment(false); setIsSendingComment(false);
}; };
const getQueryParams = () => {
const searchParams = new URLSearchParams(props.location.search);
const dashboardGantt = searchParams.get('dashboardGantt');
setDashboardStatus(dashboardGantt);
}
const handleBack = async () => {
const domainUrl = window.location.origin;
!SCURVE ? (dashboardGantt ? window.parent.location.reload() : window.location.replace(`${domainUrl}/#/projects/${GANTT_ID}/${PROJECT_ID}/gantt`)) : window.history.go(-1);
};
const initMap = () => { const initMap = () => {
let mymap = L.map("map-area", { let mymap = L.map("map-area", {
center: center, center: center,
@ -684,7 +655,6 @@ const DashboardProject = (props) => {
'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
}).addTo(mymap); }).addTo(mymap);
}; };
useEffect(() => { useEffect(() => {
if (mymap) { if (mymap) {
if (reportDistribution.length > 0) { if (reportDistribution.length > 0) {
@ -696,7 +666,6 @@ const DashboardProject = (props) => {
} }
} }
}, [mymap, reportDistribution]); }, [mymap, reportDistribution]);
useEffect(() => { useEffect(() => {
// Add event listener for receiving messages from the iframe // Add event listener for receiving messages from the iframe
window.addEventListener("message", handleIframeMessage); window.addEventListener("message", handleIframeMessage);
@ -705,7 +674,6 @@ const DashboardProject = (props) => {
window.removeEventListener("message", handleIframeMessage); window.removeEventListener("message", handleIframeMessage);
}; };
}, []); }, []);
const handleIframeMessage = (event) => { const handleIframeMessage = (event) => {
if (event.data && event.data.action === "getUrl") { if (event.data && event.data.action === "getUrl") {
const childUrl = window.location.href; const childUrl = window.location.href;
@ -716,7 +684,6 @@ const DashboardProject = (props) => {
); );
} }
}; };
const RenderGantt = useMemo( const RenderGantt = useMemo(
() => ( () => (
<iframe <iframe
@ -733,7 +700,6 @@ const DashboardProject = (props) => {
), ),
[activeTabIdx] [activeTabIdx]
); );
const RenderComments = useMemo(() => { const RenderComments = useMemo(() => {
return ( return (
<> <>
@ -837,25 +803,12 @@ const DashboardProject = (props) => {
); );
}, [overdueActivities, isReadyOverdueActivities]); }, [overdueActivities, isReadyOverdueActivities]);
return ( return (
<div style={{ marginLeft: dashboardGantt ? -80 : -25, marginRight: -25 }}> <div style={{ marginLeft: -25, marginRight: -25 }}>
<NotificationContainer /> <NotificationContainer />
<Row> <Row>
<Col span={18}> <Col span={18}>
<Row> <Row>
<Col span={2}> <Col span={8}>
<Button
style={{
height: "100%",
width: "100%",
fontSize: "18px"
}}
onClick={handleBack}
type="primary"
>
<Icon icon={arrowLeft} style={{ fontSize: "20px" }} /> Back
</Button>
</Col>
<Col span={6}>
<div <div
style={{ style={{
border: "solid", border: "solid",
@ -904,14 +857,14 @@ const DashboardProject = (props) => {
} }
return SCURVE && SCURVE == "1" return SCURVE && SCURVE == "1"
? projectName ? projectName
// ? calculationStatus ? calculationStatus
// ? projectName + " - S-Curve Ready" ? projectName + " - S-Curve Ready"
// : projectName + " - S-Curve Loading" : projectName + " - S-Curve Loading"
// : null : null
: projectName : projectName +
// + parentNames + parentNames +
// " - " + " - " +
// dataGantt.data.data.name_version; dataGantt.data.data.name_version;
})() })()
) : ( ) : (
<SingleTextLoader /> <SingleTextLoader />
@ -1462,7 +1415,7 @@ const DashboardProject = (props) => {
</div> </div>
{isReadySCurve ? ( {isReadySCurve ? (
<ProgressPlanningBar <ProgressPlanningBar
progress={planningProgressToDay > 100 ? 100 : planningProgressToDay} progress={planningProgress > 100 ? 100 : planningProgress}
/> />
) : ( ) : (
<SingleTextLoader width={"100%"} height={30} /> <SingleTextLoader width={"100%"} height={30} />

8
src/views/Master/MasterCompany/index.js

@ -443,7 +443,7 @@ const MasterCompany = ({ params }) => {
// Delete Image Function // Delete Image Function
const deleteImageHeader = async (id) => { const deleteImageHeader = async (id) => {
const URL = IMAGE_DELETE(id, 'company_logo_header'); const URL = IMAGE_DELETE(id, 'company_logo_header', companyID != '' ? companyID : 'undifined');
await axios await axios
.delete(URL, HEADER) .delete(URL, HEADER)
.then(res => res) .then(res => res)
@ -452,7 +452,7 @@ const MasterCompany = ({ params }) => {
}; };
const deleteImageLogin = async (id) => { const deleteImageLogin = async (id) => {
const URL = IMAGE_DELETE(id, 'company_logo_login'); const URL = IMAGE_DELETE(id, 'company_logo_login', companyID != '' ? companyID : 'undifined');
await axios await axios
.delete(URL, HEADER) .delete(URL, HEADER)
.then(res => res) .then(res => res)
@ -461,7 +461,7 @@ const MasterCompany = ({ params }) => {
}; };
const deleteImageFavicon = async (id) => { const deleteImageFavicon = async (id) => {
const URL = IMAGE_DELETE(id, 'company_favicon'); const URL = IMAGE_DELETE(id, 'company_favicon', companyID != '' ? companyID : 'undifined');
await axios await axios
.delete(URL, HEADER) .delete(URL, HEADER)
.then(res => res) .then(res => res)
@ -470,7 +470,7 @@ const MasterCompany = ({ params }) => {
}; };
const deleteImageSlider = async (id) => { const deleteImageSlider = async (id) => {
const URL = IMAGE_MULTIPLE_DELETE(id, 'company_slider_login'); const URL = IMAGE_MULTIPLE_DELETE(id, 'company_slider_login', companyID != '' ? companyID : 'undifined');
await axios await axios
.delete(URL, HEADER) .delete(URL, HEADER)
.then(res => res) .then(res => res)

4
src/views/SimproV2/CreatedProyek/DialogFormProyek.js

@ -765,7 +765,7 @@ const DialogFormProyek = ({
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize" style={{ fontWeight: "bold" }}> <Label className="capitalize" style={{ fontWeight: "bold" }}>
Anggaran Biaya<span style={{ color: "red" }}>*</span> Nilai Kontrak<span style={{ color: "red" }}>*</span>
</Label> </Label>
<Row> <Row>
<Col md={4}> <Col md={4}>
@ -807,7 +807,7 @@ const DialogFormProyek = ({
<Col md={6}> <Col md={6}>
<FormGroup> <FormGroup>
<Label className="capitalize" style={{ fontWeight: "bold" }}> <Label className="capitalize" style={{ fontWeight: "bold" }}>
Nilai Kontrak<span style={{ color: "red" }}>*</span> Anggaran Biaya<span style={{ color: "red" }}>*</span>
</Label> </Label>
<Input <Input

11
src/views/SimproV2/CreatedProyek/ViewProject.js

@ -25,7 +25,6 @@ const ViewProject = ({ idTask, openDialog, closeDialog, toggleDialog, projectCha
const [durasi, setDurasiProyek] = useState("") const [durasi, setDurasiProyek] = useState("")
const [mulaiProyek, setMulaiProyek] = useState("") const [mulaiProyek, setMulaiProyek] = useState("")
const [valueProyek, setValueProyek] = useState("") const [valueProyek, setValueProyek] = useState("")
const [incomeYearly, setIncomeYearly] = useState("")
const [scoupeProyek, setScoupeProyek] = useState("") const [scoupeProyek, setScoupeProyek] = useState("")
const [sponsorProyek, setSponsorProyek] = useState("") const [sponsorProyek, setSponsorProyek] = useState("")
const [lateProyek, setLateConsequenceProyek] = useState("") const [lateProyek, setLateConsequenceProyek] = useState("")
@ -68,7 +67,6 @@ const ViewProject = ({ idTask, openDialog, closeDialog, toggleDialog, projectCha
setDurasiProyek("") setDurasiProyek("")
setMulaiProyek("") setMulaiProyek("")
setValueProyek("") setValueProyek("")
setIncomeYearly("")
setScoupeProyek("") setScoupeProyek("")
setSponsorProyek("") setSponsorProyek("")
setLateConsequenceProyek("") setLateConsequenceProyek("")
@ -101,7 +99,6 @@ const ViewProject = ({ idTask, openDialog, closeDialog, toggleDialog, projectCha
setDurasiProyek(projectCharter.durasi_proyek); setDurasiProyek(projectCharter.durasi_proyek);
setMulaiProyek(projectCharter.mulai_proyek); setMulaiProyek(projectCharter.mulai_proyek);
setValueProyek(projectCharter.value_proyek); setValueProyek(projectCharter.value_proyek);
setIncomeYearly(projectCharter.income_year);
setScoupeProyek(projectCharter.scoupe_of_work); setScoupeProyek(projectCharter.scoupe_of_work);
setSponsorProyek(projectCharter.nama_divisi); setSponsorProyek(projectCharter.nama_divisi);
setLateConsequenceProyek(projectCharter.late_consequence); setLateConsequenceProyek(projectCharter.late_consequence);
@ -436,7 +433,7 @@ const ViewProject = ({ idTask, openDialog, closeDialog, toggleDialog, projectCha
const renderForm = () => { const renderForm = () => {
return ( return (
<div id="pdf-content" style={paddingTable}> <div id="pdf-content" style={paddingTable}>
<h3>Identitas Proyek</h3> <h3>Indentitas Proyek</h3>
<table style={tableStyle} className="a"> <table style={tableStyle} className="a">
<tbody> <tbody>
<tr> <tr>
@ -497,7 +494,7 @@ const ViewProject = ({ idTask, openDialog, closeDialog, toggleDialog, projectCha
<p style={pStyle}>Nilai Kontrak</p> <p style={pStyle}>Nilai Kontrak</p>
</td> </td>
<td colSpan="2" style={tdStyle}> <td colSpan="2" style={tdStyle}>
<p>&nbsp;{currency}. {formatThousand(budget)}</p> <p>&nbsp;{valueProyek ?? '-'}</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -505,7 +502,7 @@ const ViewProject = ({ idTask, openDialog, closeDialog, toggleDialog, projectCha
<p style={pStyle}>Pendapatan Pertahun</p> <p style={pStyle}>Pendapatan Pertahun</p>
</td> </td>
<td colSpan="2" style={tdStyle}> <td colSpan="2" style={tdStyle}>
<p>&nbsp;{currency}. {formatThousand(incomeYearly) ?? '-'}</p> <p>&nbsp;{valueProyek ?? '-'}</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -513,7 +510,7 @@ const ViewProject = ({ idTask, openDialog, closeDialog, toggleDialog, projectCha
<p style={pStyle}>Anggaran Biaya</p> <p style={pStyle}>Anggaran Biaya</p>
</td> </td>
<td colSpan="2" style={tdStyle}> <td colSpan="2" style={tdStyle}>
<p>&nbsp;{currency}. {formatThousand(valueProyek) ?? '-'}</p> <p style={{ ...pStyle, fontWeight: 'normal' }}>{currency}. {formatThousand(budget)}</p>
</td> </td>
</tr> </tr>
<tr> <tr>

25
src/views/SimproV2/CreatedProyek/index.js

@ -378,7 +378,6 @@ const CreatedProyek = ({ params, ...props }) => {
"value_proyek", "value_proyek",
"income_year", "income_year",
"deleted_at", "deleted_at",
"persentase_progress",
"deleted_by_id" "deleted_by_id"
], ],
joins: [ joins: [
@ -396,11 +395,10 @@ const CreatedProyek = ({ params, ...props }) => {
orders: { columns: ["nama"], ascending: true }, orders: { columns: ["nama"], ascending: true },
paging: { start: start, length: rowsPerPage }, paging: { start: start, length: rowsPerPage },
}; };
if (all_project === 'false' || all_project === 'null') {
payload.columns.push( payload.columns.push(
{ name: "created_by_id", logic_operator: "IN", value: [JSON.parse(hierarchy)], operator: "AND" } { name: "created_by_id", logic_operator: "IN", value: [JSON.parse(hierarchy)], operator: "AND" }
); );
}
const result = await axios const result = await axios
.post(PROYEK_SEARCH, payload, HEADER) .post(PROYEK_SEARCH, payload, HEADER)
@ -671,8 +669,8 @@ const CreatedProyek = ({ params, ...props }) => {
.catch((error) => error.response); .catch((error) => error.response);
if (result && result.data && result.data.code == 200) { if (result && result.data && result.data.code == 200) {
const { value_proyek, area_kerja, scoupe_of_work, kode_sortname, nama, mulai_proyek, rencana_biaya, keterangan, durasi_proyek, project_objectives, potential_risk, currency_symbol, nama_divisi, late_consequence, assumtion, considered_success_when, income_year } = result.data.data; const { value_proyek, area_kerja, scoupe_of_work, kode_sortname, nama, mulai_proyek, rencana_biaya, keterangan, durasi_proyek, project_objectives, potential_risk, currency_symbol, nama_divisi, late_consequence, assumtion, considered_success_when } = result.data.data;
const dataToSend = { value_proyek, area_kerja, scoupe_of_work, kode_sortname, nama, mulai_proyek, rencana_biaya, keterangan, durasi_proyek, project_objectives, potential_risk, currency_symbol, nama_divisi, late_consequence, assumtion, considered_success_when, income_year }; const dataToSend = { value_proyek, area_kerja, scoupe_of_work, kode_sortname, nama, mulai_proyek, rencana_biaya, keterangan, durasi_proyek, project_objectives, potential_risk, currency_symbol, nama_divisi, late_consequence, assumtion, considered_success_when };
setProjectCharter(dataToSend); setProjectCharter(dataToSend);
} else { } else {
NotificationManager.error("Gagal Mengambil Data!!", "Failed"); NotificationManager.error("Gagal Mengambil Data!!", "Failed");
@ -1476,11 +1474,11 @@ const CreatedProyek = ({ params, ...props }) => {
const data = resData.map((elt) => [ const data = resData.map((elt) => [
elt.nama, elt.nama,
`Rp. ${formatThousand(elt.rencana_biaya)}`, `Rp. ${formatThousand(elt.rencana_biaya)}`,
`Rp. ${formatThousand(elt.income_year)}`,
`Rp. ${formatThousand(elt.value_proyek)}`,
elt.join_second_name, elt.join_second_name,
elt.join_first_name, elt.join_first_name,
`${moment(elt.mulai_proyek).format(format)} - ${moment(elt.akhir_proyek).format(format)}`, `${moment(elt.mulai_proyek).format(format)} - ${moment(
elt.akhir_proyek
).format(format)}`,
]); ]);
// Or use javascript directly: // Or use javascript directly:
doc.text(4, 15, "Project Charter"); doc.text(4, 15, "Project Charter");
@ -1528,7 +1526,7 @@ const CreatedProyek = ({ params, ...props }) => {
<span className="menu-icon"> <span className="menu-icon">
<i className="fa fa-eye"></i> <i className="fa fa-eye"></i>
</span> </span>
<span className="menu-text">Identitas Proyek</span> <span className="menu-text">Indentitas Proyek</span>
</div> </div>
<div className="menu-list" onClick={() => handleOpenDokumen(text)}> <div className="menu-list" onClick={() => handleOpenDokumen(text)}>
<span className="menu-icon"> <span className="menu-icon">
@ -1743,7 +1741,7 @@ const CreatedProyek = ({ params, ...props }) => {
}, },
}, },
{ {
title: "Anggaran Biaya", dataIndex: "value_proyek", title: "Nilai Kontrak", dataIndex: "value_proyek",
key: "value_proyek", key: "value_proyek",
render: (text, record) => { render: (text, record) => {
const valueProyek = text ?? '-'; const valueProyek = text ?? '-';
@ -1753,7 +1751,7 @@ const CreatedProyek = ({ params, ...props }) => {
}, },
}, },
{ {
title: "Nilai Kontrak", title: "Anggaran Biaya",
dataIndex: "rencana_biaya", dataIndex: "rencana_biaya",
key: "rencana_biaya", key: "rencana_biaya",
render: (text, record) => { render: (text, record) => {
@ -1762,11 +1760,6 @@ const CreatedProyek = ({ params, ...props }) => {
: `${formatThousand(text)}`; : `${formatThousand(text)}`;
}, },
}, },
{
title: "Total Progress (%)", dataIndex: "persentase_progress", key: "persentase_progress", render: (text, record) => {
return text ? +(Math.round(text + "e+2") + "e-2") + '%' : 0 + '%'
}
},
{ {
title: "Project Type", title: "Project Type",
dataIndex: "color_progress", dataIndex: "color_progress",

Loading…
Cancel
Save