From d0b796df7748d0fa7cfe17d5092873b5ad9f4c19 Mon Sep 17 00:00:00 2001 From: wahyuun Date: Fri, 1 Sep 2023 04:53:37 +0700 Subject: [PATCH] add AsignCustProject & DialogAssignCust --- .../CreatedProyek/AsignCustProject.js | 294 ++++++++++++++++++ .../CreatedProyek/DialogAssignCust.js | 173 +++++++++++ 2 files changed, 467 insertions(+) create mode 100644 src/views/SimproV2/CreatedProyek/AsignCustProject.js create mode 100644 src/views/SimproV2/CreatedProyek/DialogAssignCust.js diff --git a/src/views/SimproV2/CreatedProyek/AsignCustProject.js b/src/views/SimproV2/CreatedProyek/AsignCustProject.js new file mode 100644 index 0000000..d845546 --- /dev/null +++ b/src/views/SimproV2/CreatedProyek/AsignCustProject.js @@ -0,0 +1,294 @@ +import React, { useEffect, useState, useMemo } from 'react' +import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; +import { Button, Form } from 'reactstrap'; +import { Table, Tooltip } from 'antd'; +import 'antd/dist/antd.css'; +import moment from 'moment'; +import { API_ADW, TOKEN_ADW, ASSIGN_HR_PROJECT_SEARCH, ASSIGN_HR_PROJECT_DELETE, USER_LIST, PROJECT_ROLE_SEARCH, ASSIGN_HR_PROJECT_ADD, ASSIGN_HR_PROJECT_EDIT } from '../../../const/ApiConst'; +import axios from "../../../const/interceptorApi" +import { NotificationContainer, NotificationManager } from 'react-notifications'; +import SweetAlert from 'react-bootstrap-sweetalert'; +import FormAsignCust from './DialogAssignCust'; +import { formatThousand } from '../../../const/CustomFunc'; + +const AssignHrProject = ({ openDialog, closeDialog, toggleDialog, idTask, toolsResource, proyekName }) => { + const token = localStorage.getItem("token") + const HEADER = { + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${token}` + } + } + const [dataUserToProject, setdataUserToProject] = useState([]) + const [alertDelete, setAlertDelete] = useState(false) + const [idDelete, setIdDelete] = useState(0) + const [openDialogFormTools, setOpenDialogFormTools] = useState(false) + const [dataEdit, setDataEdit] = useState(null) + const [listUser, setListUser] = useState([]) + const [listRole, setListRole] = useState([]) + + useEffect(() => { + if (idTask > 0) { + getDataAssignHr(); + } + }, [openDialog]); + + useEffect(() => { + if (openDialog) { + getDataProjectRole(); + getDataUser(); + } + }, [dataUserToProject]) + + const getDataAssignHr = async () => { + const payload = { + "paging": { + "start": 0, + "length": -1 + }, + "columns": [ + { "name": "name", "logic_operator": "ilike", "value": "", "table_name": "m_users" }, + { "name": "proyek_id", "logic_operator": "=", "value": idTask } + ], + "joins": [ + { "name": "m_users", "column_join": "user_id", "column_results": ["name"] }, + { "name": "m_role_proyek", "column_join": "project_role", "column_results": ["name"] }, + ], + "orders": { + "columns": [ + "id" + ], + "ascending": false + } + } + const URL = ASSIGN_HR_PROJECT_SEARCH + const result = await axios + .post(URL, payload, HEADER) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + let dataRes = result.data.data || [] + const filteredData = dataRes.filter(item => item.is_customer === true); + setdataUserToProject(filteredData); + } else { + NotificationManager.error('Gagal Mengambil Data!!', 'Failed'); + } + } + + const getDataUser = async () => { + const HEADER_ADW = { + headers: { + "Authorization": `${TOKEN_ADW}` + } + } + const result = await axios + .get(USER_LIST, HEADER) + .then(res => res) + .catch((error) => error.response); + if (result && result.data && result.data.data.length != 0) { + let dataRes = result.data.data + setListUser(dataRes) + } + } + + const getDataProjectRole = async () => { + const payload = { + "paging": { + "start": 0, + "length": -1 + }, + "columns": [ + { "name": "created_by", "logic_operator": "ilike", "value": "" }, + ], + "joins": [], + "orders": { + "columns": [ + "id" + ], + "ascending": false + } + } + + const result = await axios + .post(PROJECT_ROLE_SEARCH, payload, HEADER) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + let dataRes = result.data.data || [] + setListRole(dataRes); + } else { + } + } + + const handleDelete = (id) => { + setIdDelete(id) + setAlertDelete(true) + } + + const cancelDelete = () => { + setAlertDelete(false) + setIdDelete(0) + } + + const onConfirmDelete = async () => { + let urlDel = ASSIGN_HR_PROJECT_DELETE(idDelete) + const result = await axios.delete(urlDel, HEADER) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code === 200) { + getDataAssignHr() + setIdDelete(0) + setAlertDelete(false) + NotificationManager.success(`Data assign human resource berhasil dihapus`, 'Success!!'); + } else { + setIdDelete(0) + setAlertDelete(false) + NotificationManager.error(`Data assign human resource gagal dihapus`, 'Failed!!'); + } + } + + + const handleOpenDialogFormTools = () => { + setOpenDialogFormTools(true) + } + + const handleCancel = () => { + closeDialog('cancel', 'none') + } + + + const RenderTable = useMemo(() => { + const columns = [ + { + title: 'Action', + dataIndex: '', + key: 'x', + className: "nowrap", + render: (text, record) => <> + + {" "}, + }, + { title: 'Name Human Resource', dataIndex: 'join_first_name', key: 'join_first_name', className: "nowrap" }, + { title: 'Role Human Resource', dataIndex: 'join_second_name', key: 'join_second_name', className: "nowrap" }, + { title: 'Percentage Available User', dataIndex: 'max_used', key: 'max_used', className: "nowrap", render: (text, record) => record.max_used ? formatThousand(record.max_used) : '-' }, + { title: 'Standard Rate', dataIndex: 'standart_rate', key: 'standart_rate', className: "nowrap", render: (text, record) => record.standart_rate ? formatThousand(record.standart_rate) : '-' }, + { title: 'UOM Standard Rate', dataIndex: 'uom_standart_rate', key: 'uom_standart_rate', className: "nowrap" }, + { title: 'Overtime Rate', dataIndex: 'overtime_rate', key: 'overtime_rate', className: "nowrap", render: (text, record) => record.overtime_rate ? formatThousand(record.overtime_rate) : '-' }, + { title: 'UOM Overtime Rate', dataIndex: 'uom_overtime_rate', key: 'uom_overtime_rate', className: "nowrap" }, + + ]; + + return ( + + ) + }, [dataUserToProject]) + + const renderForm = () => { + return ( +
+ {RenderTable} +
+ ) + } + + const handleCloseDialogFormTools = (type, data) => { + if(type=="add"){ + addDataAssignHr(data); + }else if(type=="edit"){ + editDataAssignHr(data); + }else{ + setDataEdit(null) + setOpenDialogFormTools(false) + } + } + + const addDataAssignHr = async (payload) => { + const result = await axios + .post(ASSIGN_HR_PROJECT_ADD, payload, HEADER) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + getDataAssignHr(); + NotificationManager.success('assign human resource berhasil!!', 'Success'); + setDataEdit(null) + setOpenDialogFormTools(false) + } else { + NotificationManager.error('assign human resource gagal!!', 'Failed'); + } + } + + const editDataAssignHr = async (payload) => { + let url = ASSIGN_HR_PROJECT_EDIT(payload.id) + const result = await axios + .put(url, payload, HEADER) + .then(res => res) + .catch((error) => error.response); + + if (result && result.data && result.data.code == 200) { + getDataAssignHr(); + NotificationManager.success('assign human resource berhasil diedit!!', 'Success'); + setDataEdit(null) + setOpenDialogFormTools(false) + } else { + NotificationManager.error('assign human resource gagal diedit!!', 'Failed'); + } + } + + const toogleDialogFormTools = () => { + if (openDialogFormTools) { + setDataEdit(null) + } + setOpenDialogFormTools(!openDialogFormTools) + } + + + return ( + <> + + cancelDelete()} + focusCancelBtn + > + Delete this data + + + + +
Assign Customer - {proyekName}
+
+ + {renderForm()} + +
+ + + ) + +} + +export default AssignHrProject; diff --git a/src/views/SimproV2/CreatedProyek/DialogAssignCust.js b/src/views/SimproV2/CreatedProyek/DialogAssignCust.js new file mode 100644 index 0000000..1bc885b --- /dev/null +++ b/src/views/SimproV2/CreatedProyek/DialogAssignCust.js @@ -0,0 +1,173 @@ +import React, { useEffect, useState } from 'react' +import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; +import { Button, Form } from 'reactstrap'; +import axios from "../../../const/interceptorApi"; +import { USER_VERSION_GANTT_ADDS, USER_VERSION_GANTT_SEARCH, USER_LIST} from '../../../const/ApiConst'; +import { Transfer } from 'antd'; +import 'antd/dist/antd.css'; + +const role_id = localStorage.getItem('role_id'); +const DialogAssignCust = ({ openDialog, closeDialog, toggleDialog, idGantt}) => { + const token = localStorage.getItem("token") + const HEADER = { + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${token}` + } + } + const [id, setId] = useState(0) + const [targetKeys, setTargetKeys] = useState([]) + const [assignCustomer, setAssignCustomer] = useState([]) + + + const handleCLearData = () => { + setId(0) + setTargetKeys([]) + } + + useEffect(() => { + if(!openDialog){ + handleCLearData() + } else { + getDataAssignCustomer(); + } + }, [openDialog]) + + useEffect(() => { + if(idGantt && idGantt > 0){ + getUserGantt() + } + }, [idGantt]) + + const getDataAssignCustomer = async () => { + const result = await axios + .get(USER_LIST, HEADER) + .then(res => res) + .catch((error) => error.response); + + if (result && result.status == 200) { + let dataRes = result.data.data; + const filteredData = dataRes.filter(item => item.role_id === 44); + setTransferUser(filteredData); + } else { + + } + } + + const setTransferUser = (data) => { + const finalData = [] + data.map((val, index) => { + let data = { + key: val.id, + title: val.name + } + finalData.push(data) + }); + setAssignCustomer(finalData) + } + + const getUserGantt = async () => { + const payload = { + "columns": [ + { "name": "version_gantt_id", "logic_operator": "=", "value": idGantt, "operator": "AND" } + ] + } + const result = await axios + .post(USER_VERSION_GANTT_SEARCH, payload, HEADER) + .then(res => res) + .catch((error) => error.response); + + if(result && result.status==200){ + console.log("cek resource get user gantt",result.data.data) + setUserGantt(result.data.data); + }else{ + + } + } + + const setUserGantt = (data) => { + let newTargetKeys = [] + data.map((val,index)=> { + newTargetKeys.push(val.user_id) + }); + setTargetKeys(newTargetKeys) + } + + const handleSave = async () => { + await saveVersionGantt() + handleCLearData() + } + + const saveVersionGantt= async () => { + + const formData = { + user_id:targetKeys, + version_gantt_id:idGantt + } + + const result = await axios + .post(USER_VERSION_GANTT_ADDS, formData, HEADER) + .then(res => res) + .catch((error) => error.response); + + + if(result && result.status==200){ + closeDialog('success') + }else{ + closeDialog('failed') + } + } + + const handleCancel = () => { + closeDialog('cancel') + handleCLearData() + } + + const handleChange = targetKeys => { + setTargetKeys(targetKeys) + }; + + const renderForm = () => { + return ( +
+ item.title} + listStyle={{ + width: 250, + height: 300, + }} + /> +
+ ) + } + + + return ( + <> + + Add Customer + + {renderForm()} + + + {' '} + + + + + ) + +} + +export default DialogAssignCust;