|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
import React, {useState, useEffect} from 'react' |
|
|
|
|
import React, { useState, useEffect } from 'react' |
|
|
|
|
import { |
|
|
|
|
Modal, |
|
|
|
|
ModalHeader, |
|
|
|
@ -73,67 +73,76 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const columns = [ |
|
|
|
|
{title: "Gantt", dataIndex: "name_version", key: "name_version"}, |
|
|
|
|
{title: "Baseline Start", dataIndex: "planned_start", key: "planned_start", |
|
|
|
|
{ title: "Gantt", dataIndex: "name_version", key: "name_version" }, |
|
|
|
|
{ |
|
|
|
|
title: "Baseline Start", dataIndex: "planned_start", key: "planned_start", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{record.planned_start ? moment(record.planned_start).format("DD-MM-YY") : ''} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{record.planned_start ? moment(record.planned_start).format("DD-MM-YY") : ''} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Baseline Finish", dataIndex: "planned_end", key: "planned_end", |
|
|
|
|
{ |
|
|
|
|
title: "Baseline Finish", dataIndex: "planned_end", key: "planned_end", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{record.planned_end ? moment(record.planned_end).format("DD-MM-YY") : ''} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{record.planned_end ? moment(record.planned_end).format("DD-MM-YY") : ''} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Early Start", dataIndex: "start_date", key: "start_date", |
|
|
|
|
{ |
|
|
|
|
title: "Early Start", dataIndex: "start_date", key: "start_date", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{moment(record.start_date).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{moment(record.start_date).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Early Finish", dataIndex: "end_date", key: "end_date", |
|
|
|
|
{ |
|
|
|
|
title: "Early Finish", dataIndex: "end_date", key: "end_date", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{moment(record.end_date).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{moment(record.end_date).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Actual Start", dataIndex: "actual_start", key: "actual_start", |
|
|
|
|
{ |
|
|
|
|
title: "Actual Start", dataIndex: "actual_start", key: "actual_start", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{record.actual_start ? moment(record.actual_start).format("DD-MM-YY") : ""} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{record.actual_start ? moment(record.actual_start).format("DD-MM-YY") : ""} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Actual Finish", dataIndex: "actual_end", key: "actual_end", |
|
|
|
|
{ |
|
|
|
|
title: "Actual Finish", dataIndex: "actual_end", key: "actual_end", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{record.actual_end ? moment(record.actual_end).format("DD-MM-YY") : ""} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{record.actual_end ? moment(record.actual_end).format("DD-MM-YY") : ""} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Assign HR", dataIndex: "user_name", key: "user_name", width: "8%", |
|
|
|
|
ellipsis:{ |
|
|
|
|
showTitle: true |
|
|
|
|
}, |
|
|
|
|
render: (text) => |
|
|
|
|
<Tooltip placement="topLeft" title={text}> |
|
|
|
|
{text} |
|
|
|
|
</Tooltip> |
|
|
|
|
{ |
|
|
|
|
title: "Assign HR", dataIndex: "user_name", key: "user_name", width: "8%", |
|
|
|
|
ellipsis: { |
|
|
|
|
showTitle: true |
|
|
|
|
}, |
|
|
|
|
render: (text) => |
|
|
|
|
<Tooltip placement="topLeft" title={text}> |
|
|
|
|
{text} |
|
|
|
|
</Tooltip> |
|
|
|
|
}, |
|
|
|
|
{title: "Volume Plan", dataIndex: "qty_planning", key: "qty_planning", |
|
|
|
|
render: (text, record) => |
|
|
|
|
<> |
|
|
|
|
{text ? text : 0} |
|
|
|
|
</> |
|
|
|
|
{ |
|
|
|
|
title: "Volume Plan", dataIndex: "qty_planning", key: "qty_planning", |
|
|
|
|
render: (text, record) => |
|
|
|
|
<> |
|
|
|
|
{text ? text : 0} |
|
|
|
|
</> |
|
|
|
|
}, |
|
|
|
|
{title: "Volume Actual", dataIndex: "qty", key: "qty"}, |
|
|
|
|
{title: "Progress Plan (%)", dataIndex: "persentase_progress", key: "persentase_progress", |
|
|
|
|
render: (text, record) => { |
|
|
|
|
{ title: "Volume Actual", dataIndex: "qty", key: "qty" }, |
|
|
|
|
{ |
|
|
|
|
title: "Progress Plan (%)", dataIndex: "persentase_progress", key: "persentase_progress", |
|
|
|
|
render: (text, record) => { |
|
|
|
|
const startDate = moment(record.start_date); |
|
|
|
|
const duration = record.duration; |
|
|
|
|
|
|
|
|
@ -148,7 +157,7 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
); |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{title: "Progress Actual (%)", dataIndex: "persentase_progress", key: "persentase_progress", width: "8%"}, |
|
|
|
|
{ title: "Progress Actual (%)", dataIndex: "persentase_progress", key: "persentase_progress", width: "8%" }, |
|
|
|
|
{ |
|
|
|
|
title: 'Action', |
|
|
|
|
dataIndex: '', |
|
|
|
@ -165,59 +174,67 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
const columnActivityToHr = [ |
|
|
|
|
{title: "Activity", dataIndex: "join_second_name", key: "join_second_name"}, |
|
|
|
|
{title: "Gantt", dataIndex: "join_fourth_name_version", key: "join_fourth_name_version"}, |
|
|
|
|
{title: "Baseline Start", dataIndex: "join_second_planned_start", key: "join_second_planned_start", |
|
|
|
|
{ title: "Activity", dataIndex: "join_second_name", key: "join_second_name" }, |
|
|
|
|
{ title: "Gantt", dataIndex: "join_fourth_name_version", key: "join_fourth_name_version" }, |
|
|
|
|
{ |
|
|
|
|
title: "Baseline Start", dataIndex: "join_second_planned_start", key: "join_second_planned_start", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{moment(record.join_second_planned_start).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{moment(record.join_second_planned_start).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Baseline Finish", dataIndex: "join_second_planned_end", key: "join_second_planned_end", |
|
|
|
|
{ |
|
|
|
|
title: "Baseline Finish", dataIndex: "join_second_planned_end", key: "join_second_planned_end", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{moment(record.join_second_planned_end).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{moment(record.join_second_planned_end).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Early Start", dataIndex: "join_second_start_date", key: "join_second_start_date", |
|
|
|
|
{ |
|
|
|
|
title: "Early Start", dataIndex: "join_second_start_date", key: "join_second_start_date", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{moment(record.join_second_start_date).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{moment(record.join_second_start_date).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Early Finish", dataIndex: "join_second_end_date", key: "join_second_end_date", |
|
|
|
|
{ |
|
|
|
|
title: "Early Finish", dataIndex: "join_second_end_date", key: "join_second_end_date", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{moment(record.join_second_end_date).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{moment(record.join_second_end_date).format("DD-MM-YY")} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Actual Start", dataIndex: "join_second_actual_start", key: "join_second_actual_start", |
|
|
|
|
{ |
|
|
|
|
title: "Actual Start", dataIndex: "join_second_actual_start", key: "join_second_actual_start", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{record.join_second_actual_start ? moment(record.join_second_actual_start).format("DD-MM-YY") : ""} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{record.join_second_actual_start ? moment(record.join_second_actual_start).format("DD-MM-YY") : ""} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Actual Finish", dataIndex: "join_second_actual_end", key: "join_second_actual_end", |
|
|
|
|
{ |
|
|
|
|
title: "Actual Finish", dataIndex: "join_second_actual_end", key: "join_second_actual_end", |
|
|
|
|
render: (text, record) => ( |
|
|
|
|
<> |
|
|
|
|
{record.join_second_actual_end ? moment(record.join_second_actual_end).format("DD-MM-YY") : ""} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
<> |
|
|
|
|
{record.join_second_actual_end ? moment(record.join_second_actual_end).format("DD-MM-YY") : ""} |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
}, |
|
|
|
|
{title: "Volume Plan", dataIndex: "join_third_qty_planning", key: "join_third_qty_planning", |
|
|
|
|
render: (text, record) => |
|
|
|
|
<> |
|
|
|
|
{text ? text : 0} |
|
|
|
|
</> |
|
|
|
|
{ |
|
|
|
|
title: "Volume Plan", dataIndex: "join_third_qty_planning", key: "join_third_qty_planning", |
|
|
|
|
render: (text, record) => |
|
|
|
|
<> |
|
|
|
|
{text ? text : 0} |
|
|
|
|
</> |
|
|
|
|
}, |
|
|
|
|
{title: "Volume Actual", dataIndex: "volume_actual", key: "volume_actual"}, |
|
|
|
|
{title: "Progress Plan (%)", dataIndex: "join_second_persentase_progress", key: "persentase_progress", |
|
|
|
|
render: (text, record) => { |
|
|
|
|
{ title: "Volume Actual", dataIndex: "volume_actual", key: "volume_actual" }, |
|
|
|
|
{ |
|
|
|
|
title: "Progress Plan (%)", dataIndex: "join_second_persentase_progress", key: "persentase_progress", |
|
|
|
|
render: (text, record) => { |
|
|
|
|
const startDate = moment(record.join_second_start_date); |
|
|
|
|
const duration = record.join_second_duration; |
|
|
|
|
|
|
|
|
@ -232,20 +249,20 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
); |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{title: "Progress Actual (%)", dataIndex: "join_second_persentase_progress", key: "persentase_progress"}, |
|
|
|
|
{ title: "Progress Actual (%)", dataIndex: "join_second_persentase_progress", key: "persentase_progress" }, |
|
|
|
|
{ |
|
|
|
|
title: 'Action', |
|
|
|
|
dataIndex: '', |
|
|
|
|
key: 'id', |
|
|
|
|
className: "nowrap", |
|
|
|
|
render: (text, record) => |
|
|
|
|
<> |
|
|
|
|
<Tooltip title="Detail Activity"> |
|
|
|
|
<Button size={"sm"} color='primary' onClick={() => handleDetail(text)}><i className="fa fa-eye"></i></Button> |
|
|
|
|
</Tooltip>{" "} |
|
|
|
|
</> |
|
|
|
|
, |
|
|
|
|
}, |
|
|
|
|
title: 'Action', |
|
|
|
|
dataIndex: '', |
|
|
|
|
key: 'id', |
|
|
|
|
className: "nowrap", |
|
|
|
|
render: (text, record) => |
|
|
|
|
<> |
|
|
|
|
<Tooltip title="Detail Activity"> |
|
|
|
|
<Button size={"sm"} color='primary' onClick={() => handleDetail(text)}><i className="fa fa-eye"></i></Button> |
|
|
|
|
</Tooltip>{" "} |
|
|
|
|
</> |
|
|
|
|
, |
|
|
|
|
}, |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
@ -297,10 +314,10 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
if (status == "Save") { |
|
|
|
|
// getdataGantt()
|
|
|
|
|
NotificationManager.success(`Gantt berhasil dibuat!`, 'Success!!'); |
|
|
|
|
}else if (status == "Edit") { |
|
|
|
|
} else if (status == "Edit") { |
|
|
|
|
// getdataGantt()
|
|
|
|
|
NotificationManager.success(`Gantt berhasil dibubah!`, 'Failed!!'); |
|
|
|
|
}else if (status == "failed") { |
|
|
|
|
} else if (status == "failed") { |
|
|
|
|
NotificationManager.error(`Gantt gagal dibuat!`, 'Failed!!'); |
|
|
|
|
} |
|
|
|
|
setDataDetail(null) |
|
|
|
@ -338,7 +355,21 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
|
|
|
|
|
if (result && result.data && result.data.code == 200) { |
|
|
|
|
let dataRes = result.data.data || []; |
|
|
|
|
setHrList(dataRes); |
|
|
|
|
let groupedData = {}; |
|
|
|
|
|
|
|
|
|
dataRes.forEach(data => { |
|
|
|
|
if (groupedData[data.join_first_name]) { |
|
|
|
|
groupedData[data.join_first_name].join_first_id = Math.min(groupedData[data.join_first_name].join_first_id, data.join_first_id); |
|
|
|
|
} else { |
|
|
|
|
groupedData[data.join_first_name] = { |
|
|
|
|
join_first_id: data.join_first_id, |
|
|
|
|
join_first_name: data.join_first_name |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
let dataFiltered = Object.values(groupedData); |
|
|
|
|
|
|
|
|
|
setHrList(dataFiltered); |
|
|
|
|
} else { |
|
|
|
|
NotificationManager.error("Gagal Mengambil Data!!", "Failed"); |
|
|
|
|
} |
|
|
|
@ -382,21 +413,21 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
name1: "m_activity", |
|
|
|
|
name: "assign_material_to_activity", |
|
|
|
|
column_join: "id", |
|
|
|
|
column_self:"activity_id", |
|
|
|
|
column_results: ["id", "qty_planning"] |
|
|
|
|
column_self: "activity_id", |
|
|
|
|
column_results: ["qty_planning"] |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name1: "m_activity", |
|
|
|
|
name: "m_version_gantt", |
|
|
|
|
column_join: "version_gantt_id", |
|
|
|
|
column_self:"id", |
|
|
|
|
column_self: "id", |
|
|
|
|
column_results: ["name_version"] |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name1: "m_activity", |
|
|
|
|
name: "report_activity_material", |
|
|
|
|
column_join: "id", |
|
|
|
|
column_self:"activity_id", |
|
|
|
|
column_self: "activity_id", |
|
|
|
|
}, |
|
|
|
|
], |
|
|
|
|
orders: { columns: ["id"], ascending: false }, |
|
|
|
@ -411,7 +442,7 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
if (result && result.data && result.data.code == 200) { |
|
|
|
|
let dataRes = result.data.data || []; |
|
|
|
|
dataRes.forEach(element => { |
|
|
|
|
element.join_third_persentase_progress ? sum += parseInt(element.join_third_persentase_progress) : sum += 0; |
|
|
|
|
element.join_third_persentase_progress ? sum += parseInt(element.join_third_persentase_progress) : sum += 0; |
|
|
|
|
}); |
|
|
|
|
setAvgActivityHr(sum / dataRes.length); |
|
|
|
|
setDataTableActivityToHr(dataRes); |
|
|
|
@ -485,9 +516,9 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
let dataRes = result.data.data || []; |
|
|
|
|
|
|
|
|
|
dataRes.forEach(element => { |
|
|
|
|
element.persentase_progress ? sum += parseInt(element.persentase_progress) : sum += 0; |
|
|
|
|
element.qty_planning ? sumPlan += parseInt(element.qty_planning) : sumPlan += 0; |
|
|
|
|
element.qty ? sumAct += parseInt(element.qty) : sumAct += 0; |
|
|
|
|
element.persentase_progress ? sum += parseInt(element.persentase_progress) : sum += 0; |
|
|
|
|
element.qty_planning ? sumPlan += parseInt(element.qty_planning) : sumPlan += 0; |
|
|
|
|
element.qty ? sumAct += parseInt(element.qty) : sumAct += 0; |
|
|
|
|
}); |
|
|
|
|
setAvgActivity(sum / dataRes.length); |
|
|
|
|
setSumVolPlan(sumPlan); |
|
|
|
@ -536,9 +567,9 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
<Select showSearch value={search} onChange={(val) => setSearch(val)} placeholder="Select Activity" filterOption={(input, option) => |
|
|
|
|
option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 |
|
|
|
|
} style={{ width: 200 }}> |
|
|
|
|
{groupedActivity && groupedActivity.map((res, index) => ( |
|
|
|
|
{groupedActivity && groupedActivity.map((res, index) => ( |
|
|
|
|
<Option key={index} value={res.name}>{`${res.name}`}</Option> |
|
|
|
|
))} |
|
|
|
|
))} |
|
|
|
|
</Select> |
|
|
|
|
</Col> |
|
|
|
|
</Row> |
|
|
|
@ -573,9 +604,9 @@ const ReportAnalysis = ({ openDialog, closeDialog, toggleDialog, projectId }) =>
|
|
|
|
|
<Select showSearch value={selectedHr} onChange={(val) => setSelectedHr(val)} placeholder="Select Human Resource" filterOption={(input, option) => |
|
|
|
|
option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 |
|
|
|
|
} style={{ width: 200 }}> |
|
|
|
|
{hrList && hrList.map(res => ( |
|
|
|
|
{hrList && hrList.map(res => ( |
|
|
|
|
<Option key={res.join_first_id} value={res.join_first_id}>{`${res.join_first_name}`}</Option> |
|
|
|
|
))} |
|
|
|
|
))} |
|
|
|
|
</Select> |
|
|
|
|
</Col> |
|
|
|
|
</Row> |
|
|
|
|