From 3f13eac471af7d21b890e6923652bbc85862e061 Mon Sep 17 00:00:00 2001 From: wahyun Date: Wed, 17 Jan 2024 13:10:37 +0700 Subject: [PATCH] add company in table --- src/views/Master/MasterRoles/index.js | 115 ++-- src/views/Master/RoleProject/index.js | 147 +++-- src/views/SimproV2/Presence/index.js | 688 +++++++++++---------- src/views/SimproV2/ResourceWorker/index.js | 45 +- 4 files changed, 551 insertions(+), 444 deletions(-) diff --git a/src/views/Master/MasterRoles/index.js b/src/views/Master/MasterRoles/index.js index c6fec9d..6ea08a6 100644 --- a/src/views/Master/MasterRoles/index.js +++ b/src/views/Master/MasterRoles/index.js @@ -16,26 +16,7 @@ const LENGTH_DATA = 10 class index extends Component { constructor(props) { - let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name='', hierarchy=[], user_name=''; - if (props && props.role_id && props.user_id) { - role_id = props.role_id; - user_id = props.user_id; - token = props.token; - isLogin = props.isLogin; - company_id = props.company_id; - all_project = props.all_project; - role_name = props.role_name; - isLogin = props.isLogin; - hierarchy = props.hierarchy; - user_name = props.user_name; - } super(props) - this.config = { - headers: { - Authorization: `Bearer ${token}`, - "Content-type": "application/json" - } - }; this.state = { alertDelete: false, alertNotDelete: false, @@ -61,8 +42,21 @@ class index extends Component { tooltipTambah: false, totalPage: 0, typeDialog: 'Save', - company_id: company_id, - role_name: role_name + company_id: props.company_id || 0, + role_name: props.role_name || '', + role_id: props.role_id || 0, + user_id: props.user_id || 0, + isLogin: props.isLogin || false, + token: props.token || '', + all_project: props.all_project || null, + hierarchy: props.hierarchy || [], + user_name: props.user_name || '', + config: { + headers: { + Authorization: `Bearer ${props.token || ''}`, + "Content-type": "application/json", + } + } } this.columns = [ { @@ -84,6 +78,16 @@ class index extends Component { , }, + { + title: this.state.role_name === 'Super Admin' ? "Company Name" : null, + dataIndex: "join_first_company_name", + key: "join_first_company_name", + render: (text, record) => { + return this.state.role_name === 'Super Admin' ? ( + {record.join_first_company_name} + ) : null; + } + }, { title: this.props.t('nameRole'), dataIndex: 'name', key: 'name', className: "nowrap" }, { title: this.props.t('description'), dataIndex: 'description', key: 'description' }, ] @@ -114,9 +118,18 @@ class index extends Component { const formData = { "paging": { "start": start, "length": this.state.rowsPerPage }, - "columns": [ - { "name": "name", "logic_operator": "ilike", "value": this.state.search, "operator": "AND" }, - ], + "columns": [], + group_column: { + "operator": "AND", + "group_operator": "OR", + "where": [ + { + "name": "name", + "logic_operator": "~*", + "value": this.state.search, + } + ] + }, "joins": [], "orders": { "columns": ["id"], "ascending": false } } @@ -128,9 +141,15 @@ class index extends Component { formData.columns.push( { "name": "company_id", "logic_operator": "is null", "value": "", "operator": "AND" }, ) + formData.joins.push( + { "name": "m_company", "column_join": "company_id", "column_results": ["company_name"] } + ) + formData.group_column.where.push( + { name: "company_name", logic_operator: "~*", value: this.state.search, table_name: "m_company" } + ) } const result = await axios - .post(ROLE_SEARCH, formData, this.config) + .post(ROLE_SEARCH, formData, this.state.config) .then(res => res) .catch((error) => error.response); @@ -347,18 +366,42 @@ class index extends Component { handleExportExcel = async () => { let start = 0; - let end = "ALL"; const formData = { "paging": { "start": start, "length": this.state.rowsPerPage }, - "columns": [ - { "name": "name", "logic_operator": "ilike", "value": this.state.search, "operator": "AND" } - ], + "columns": [], + "group_column": { + "operator": "AND", + "group_operator": "OR", + "where": [ + { + "name": "name", + "logic_operator": "~*", + "value": this.state.search, + } + ] + }, "joins": [], "orders": { "columns": ["id"], "ascending": false } } + if (this.state.role_name !== "Super Admin") { + formData.columns.push( + { "name": "company_id", "logic_operator": "=", "value": this.state.company_id, "operator": "AND" }, + ) + } else { + formData.columns.push( + { "name": "company_id", "logic_operator": "is null", "value": "", "operator": "AND" }, + ) + formData.joins.push( + { "name": "m_company", "column_join": "company_id", "column_results": ["company_name"] } + ) + formData.group_column.where.push( + { name: "company_name", logic_operator: "~*", value: this.state.search, table_name: "m_company" } + ) + } + const result = await axios - .post(ROLE_SEARCH, formData, this.config) + .post(ROLE_SEARCH, formData, this.state.config) .then(res => res) .catch((error) => error.response); @@ -366,10 +409,12 @@ class index extends Component { const dataRes = result.data.data || []; const dataExport = []; dataRes.map((val, index) => { - let row = { - Nama: val.name, - Deskripsi: val.description - } + let row = {}; + if (this.state.role_name === 'Super Admin') { + row.Company = val.join_first_company_name; + } + row.Nama = val.name; + row.Deskripsi = val.description; dataExport.push(row); }) this.setState({ dataExport: dataExport }, () => { @@ -445,7 +490,7 @@ class index extends Component {

{this.props.params.name}

- + diff --git a/src/views/Master/RoleProject/index.js b/src/views/Master/RoleProject/index.js index 89d7312..c7773e3 100644 --- a/src/views/Master/RoleProject/index.js +++ b/src/views/Master/RoleProject/index.js @@ -9,46 +9,10 @@ import { NotificationContainer, NotificationManager } from 'react-notifications' import { PROJECT_ROLE_ADD, PROJECT_ROLE_SEARCH, PROJECT_ROLE_EDIT, PROJECT_ROLE_DELETE, ROLEMENU_ADD, ROLEMENU_SEARCH, ROLEMENU_DELETE_ROLE } from '../../../const/ApiConst.js'; import { Pagination, Tooltip, Table } from 'antd'; import { withTranslation } from 'react-i18next'; -const token = window.localStorage.getItem('token'); -const company_id = localStorage.getItem("company_id") -const role_name = window.localStorage.getItem('role_name'); -const BASE_URL = "http://siopas.co.id/custom-php/api/geohr/"; - -const config = { - headers: - { - Authorization: `Bearer ${token}`, - "Content-type": `application/json` - } -}; - - - -const momentFormat = 'HH:mm'; - -const column = [ - { name: "Nama" }, - { name: "Deskripsi" }, -] - const LENGTH_DATA = 10 - class index extends Component { constructor(props) { - let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name='', hierarchy=[], user_name=''; - if (props && props.role_id && props.user_id) { - role_id = props.role_id; - user_id = props.user_id; - token = props.token; - isLogin = props.isLogin; - company_id = props.company_id; - all_project = props.all_project; - role_name = props.role_name; - isLogin = props.isLogin; - hierarchy = props.hierarchy; - user_name = props.user_name; - } - super(props) + super(props); this.state = { alertDelete: false, alertNotDelete: false, @@ -74,9 +38,23 @@ class index extends Component { tooltipTambah: false, totalPage: 0, typeDialog: 'Save', - company_id: company_id, - role_name: role_name - } + company_id: props.company_id || 0, + role_name: props.role_name || '', + role_id: props.role_id || 0, + user_id: props.user_id || 0, + isLogin: props.isLogin || false, + token: props.token || '', + all_project: props.all_project || null, + hierarchy: props.hierarchy || [], + user_name: props.user_name || '', + config: { + headers: { + Authorization: `Bearer ${props.token || ''}`, + "Content-type": "application/json", + } + } + }; + this.columns = [ { title: this.props.t('action'), @@ -86,21 +64,27 @@ class index extends Component { render: (text, record) => <> this.handleDelete(text.id)}> - - this.handleEdit(text)}> , }, + { + title: this.state.role_name === 'Super Admin' ? "Company Name" : null, + dataIndex: "join_first_company_name", + key: "join_first_company_name", + render: (text, record) => { + return this.state.role_name === 'Super Admin' ? ( + {record.join_first_company_name} + ) : null; + } + }, { title: this.props.t('name'), dataIndex: 'name', key: 'name', className: "nowrap" }, { title: this.props.t('description'), dataIndex: 'description', key: 'description' }, ]; } - - async componentDidMount() { this.getDataRoles(); } @@ -123,9 +107,18 @@ class index extends Component { const formData = { "paging": { "start": start, "length": this.state.rowsPerPage }, - "columns": [ - { "name": "name", "logic_operator": "ilike", "value": this.state.search, "operator": "AND" }, - ], + "columns": [], + group_column: { + "operator": "AND", + "group_operator": "OR", + "where": [ + { + "name": "name", + "logic_operator": "~*", + "value": this.state.search, + } + ] + }, "joins": [], "orders": { "columns": ["id"], "ascending": false } } @@ -137,9 +130,15 @@ class index extends Component { formData.columns.push( { "name": "company_id", "logic_operator": "is null", "value": "", "operator": "AND" }, ) + formData.joins.push( + { "name": "m_company", "column_join": "company_id", "column_results": ["company_name"] } + ) + formData.group_column.where.push( + { name: "company_name", logic_operator: "~*", value: this.state.search, table_name: "m_company" } + ) } const result = await axios - .post(PROJECT_ROLE_SEARCH, formData, config) + .post(PROJECT_ROLE_SEARCH, formData, this.state.config) .then(res => res) .catch((error) => error.response); @@ -184,7 +183,7 @@ class index extends Component { const { idDelete } = this.state const url = PROJECT_ROLE_DELETE(idDelete) - const result = await axios.delete(url, config) + const result = await axios.delete(url, this.state.config) .then(res => res) .catch((error) => error.response); @@ -203,10 +202,10 @@ class index extends Component { const formData = { name: data.name, description: data.description, - company_id + company_id: this.state.company_id } - const result = await axios.post(PROJECT_ROLE_ADD, formData, config) + const result = await axios.post(PROJECT_ROLE_ADD, formData, this.state.config) .then(res => res) .catch((error) => error.response); @@ -224,10 +223,10 @@ class index extends Component { const formData = { name: data.name, description: data.description, - company_id + company_id : this.state.company_id } const url = PROJECT_ROLE_EDIT(data.id) - const result = await axios.put(url, formData, config) + const result = await axios.put(url, formData, this.state.config) .then(res => res) .catch((error) => error.response); @@ -290,24 +289,50 @@ class index extends Component { handleExportExcel = async () => { const payload = { "paging": { "start": 0, "length": -1 }, - "columns": [ - { "name": "name", "logic_operator": "ilike", "value": this.state.search, "operator": "AND" } - ], + "columns": [], + "group_column": { + "operator": "AND", + "group_operator": "OR", + "where": [ + { + "name": "name", + "logic_operator": "~*", + "value": this.state.search, + } + ] + }, "joins": [], "orders": { "columns": ["id"], "ascending": false } } + if (this.state.role_name !== "Super Admin") { + payload.columns.push( + { "name": "company_id", "logic_operator": "=", "value": this.state.company_id, "operator": "AND" }, + ) + } else { + payload.columns.push( + { "name": "company_id", "logic_operator": "is null", "value": "", "operator": "AND" }, + ) + payload.joins.push( + { "name": "m_company", "column_join": "company_id", "column_results": ["company_name"] } + ) + payload.group_column.where.push( + { name: "company_name", logic_operator: "~*", value: this.state.search, table_name: "m_company" } + ) + } const result = await axios - .post(PROJECT_ROLE_SEARCH, payload, config) + .post(PROJECT_ROLE_SEARCH, payload, this.state.config) .then(res => res) .catch((error) => error.response); if (result && result.data && result.statusText == "OK") { const dataRes = result.data.data || []; const dataExport = []; dataRes.map((val, index) => { - let row = { - Nama: val.name, - Deskripsi: val.description + let row = {}; + if (this.state.role_name === 'Super Admin') { + row.Company = val.join_first_company_name; } + row.Nama = val.name; + row.Deskripsi = val.description; dataExport.push(row); }) this.setState({ dataExport: dataExport }, () => { @@ -371,7 +396,7 @@ class index extends Component {

{this.props.params.name}

- + diff --git a/src/views/SimproV2/Presence/index.js b/src/views/SimproV2/Presence/index.js index 2791d6f..3b4c1d4 100644 --- a/src/views/SimproV2/Presence/index.js +++ b/src/views/SimproV2/Presence/index.js @@ -1,339 +1,349 @@ -import React, { useState, useEffect, useMemo } from 'react'; -import { Card, CardBody, CardHeader, Col, Row, Input } from 'reactstrap'; -import { Button } from 'reactstrap'; -import axios from 'axios'; -import * as XLSX from 'xlsx'; -import { NotificationContainer, NotificationManager } from 'react-notifications'; -import { Pagination, Tooltip, Table, DatePicker } from 'antd'; -import moment from 'moment'; -import { PRESENCE_SEARCH, IMAGE_GET_BY_ID } from '../../../const/ApiConst.js'; -import DialogFoto from './DialogFoto'; -import { useTranslation } from 'react-i18next'; -const { RangePicker } = DatePicker; -const token = window.localStorage.getItem('token'); - - -const Index = ({ params }) => { - const [dataTable, setDatatable] = useState([]) - const [search, setSearch] = useState('') - const [currentPage, setCurrentPage] = useState(1) - const [totalPage, setTotalPage] = useState(0) - const [rowsPerPage, setRowsPerPage] = useState(10) - const [dataExport, setDataExport] = useState([]) - const [startDate, setStartDate] = useState(moment(moment().format("YYYY-M-D"))) - const [endDate, setEndDate] = useState(moment(moment().format("YYYY-M-D"))) - const [currentDay, setCurrentDay] = useState("today") - const [dataImage, setDataImage] = useState(null) - const [openImage, setOpenImage] = useState(false) - const { t } = useTranslation() - const pageName = params.name; - - const config = { - headers: - { - Authorization: `Bearer ${token}`, - "Content-type": `application/json` - } - }; - - useEffect(() => { - getDataPresence(); - }, [search, currentPage, rowsPerPage, startDate, endDate]) - - useEffect(() => { - const cekData = dataExport || [] - if (cekData.length > 0) { - exportExcel() - } - }, [dataExport]) - - const handleSearch = e => { - const value = e.target.value - setSearch(value); - setCurrentPage(1) - }; - - const getDataPresence = async () => { - - - let start = 0; - - if (currentPage !== 1 && currentPage > 1) { - start = (currentPage * rowsPerPage) - rowsPerPage - } - - let dateStart = moment(startDate).format("YYYY-MM-DD 00:00:00"); - let dateEnd = moment(endDate).format("YYYY-MM-DD 23:59:59"); - - const payload = { - "paging": { "start": start, "length": rowsPerPage }, - "columns": [ - { "name": "name", "logic_operator": "ilike", "value": search, "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 result = await axios - .post(PRESENCE_SEARCH, payload, config) - .then(res => res) - .catch((error) => error.response); - - - if (result && result.data && result.data.code == 200) { - setDatatable(result.data.data); - setTotalPage(result.data.totalRecord); - } else { - NotificationManager.error('Gagal Mengambil Data!!', 'Failed'); - } - } - - const handleImage = async (id, name) => { - - let url = IMAGE_GET_BY_ID(id, "presensi"); - - const result = await axios - .get(url, config) - .then(res => res) - .catch((error) => error.response); - if (result && result.data.code == 200) { - let dataRes = result.data.data - let dataImage = { - name, - url: dataRes.image - } - await setDataImage(dataImage) - setOpenImage(true) - } else { - NotificationManager.error('Data image tidak ditemukan!', 'Failed'); - } - } - - const closeDialogImage = () => { - setOpenImage(false) - setDataImage(null) - } - - const toggleDialogImage = () => { - if (openImage) { - setDataImage(null) - } - setOpenImage(!openImage) - } - - const onShowSizeChange = (current, pageSize) => { - setRowsPerPage(pageSize) - } - - const onPagination = (current, pageSize) => { - setCurrentPage(current) - } - - const renderDurasiKerja = (jamMasuk, jamKeluar) => { - if (jamMasuk && jamKeluar) { - let start = moment(jamMasuk), - end = moment(jamKeluar); - - let diff = end.diff(start); - let result = moment.utc(diff).format('HH:mm:ss'); - - if (result) { - return result; - } else { - return "-" - } - - } else { - return "-" - } - } - - const handleExportExcel = async () => { - - let dateStart = moment(startDate).format("YYYY-MM-DD 00:00:00"); - let dateEnd = moment(endDate).format("YYYY-MM-DD 23:59:59"); - - const payload = { - "paging": { "start": 0, "length": -1 }, - "columns": [ - { "name": "name", "logic_operator": "ilike", "value": search, "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 result = await axios - .post(PRESENCE_SEARCH, payload, config) - .then(res => res) - .catch((error) => error.response); - - - if (result && result.data && result.data.code == 200) { - let resData = result.data.data; - const excelData = []; - resData.map((val, index) => { - let dataRow = { - "NIK/ID Card": val.join_first_ktp_number ? val.join_first_ktp_number : '-', - "Nama Human Resource": val.join_first_name ? val.join_first_name : '', - "Jam Masuk": val.clock_in ? moment(val.clock_in).format("D-M-YYYY HH:mm:ss") : '-', - "Jam Keluar": val.clock_out ? moment(val.clock_out).format("D-M-YYYY HH:mm:ss") : '-', - "Durasi Kerja": renderDurasiKerja(val.clock_in, val.clock_out), - "Lokasi Masuk": val.clock_in_loc && val.clock_in_loc !== '' ? val.clock_in_loc : '-', - "Lokasi Pulang": val.clock_out_loc && val.clock_out_loc !== '' ? val.clock_out_loc : '-', - "Area Kerja In": val.clock_in_boundary ? "Sesuai" : "Tidak Sesuai", - "Area Kerja Out": val.clock_out_boundary == null ? "-" : val.clock_out_boundary ? "Sesuai" : "Tidak Sesuai", - } - excelData.push(dataRow) - }) - await setDataExport(excelData); - } else { - NotificationManager.error('Gagal Export Data!!', 'Failed'); - } - } - - - const exportExcel = () => { - const dataExcel = dataExport || []; - const fileName = `Data ${pageName}.xlsx`; - const ws = XLSX.utils.json_to_sheet(dataExcel); - const wb = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(wb, ws, `Data ${pageName}`); - - XLSX.writeFile(wb, fileName); - setDataExport([]) - } - const renderTable = useMemo(() => { - const columns = [ - { - title: 'Action', - dataIndex: '', - key: 'x', - render: (text, record) => <> - - handleImage(text.id, text.join_first_name)}> - - , - }, - { title: t('nik'), dataIndex: 'join_first_ktp_number', key: 'join_first_ktp_number' }, - { title: t('nameHR'), dataIndex: 'join_first_name', key: 'join_first_name' }, - { title: t('presenceIn'), dataIndex: 'clock_in', key: 'clock_in', render: (text, record) => (
{text ? moment(text).format("D-M-YYYY HH:mm:ss") : "-"}
) }, - { title: t('presenceOut'), dataIndex: 'clock_out', key: 'clock_out', render: (text, record) => (
{text ? moment(text).format("D-M-YYYY HH:mm:ss") : "-"}
) }, - { title: t('workDuration'), render: (text, record) => (
{renderDurasiKerja(record.clock_in, record.clock_out)}
) }, - { title: t('locIn'), dataIndex: 'clock_in_loc', key: 'clock_in_loc', render: (text, record) => <>{text && text !== '' ? text : '-'} }, - { title: t('locOut'), dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => <>{text && text !== '' ? text : '-'} }, - { title: t('workAreaIn'), dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => (
{record.clock_in_boundary ? : }
) }, - { title: t('workAreaOut'), dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => (
{record.clock_out_boundary == null ? : record.clock_out_boundary ? : }
) }, - ]; - return ( - - ) - }, [dataTable]) - - const handleDatePicker = (date, dateString) => { - setStartDate(date[0]) - setEndDate(date[1]) - } - - const handleChangeDay = (e) => { - const val = e.target.value; - setCurrentDay(val) - if (val === "today") { - setStartDate(moment(moment().format("YYYY-M-D"))) - setEndDate(moment(moment().format("YYYY-M-D"))) - setCurrentPage(1) - } else if (val === "3 day") { - setStartDate(moment(moment().subtract(3, "days").format("YYYY-M-D"))) - setEndDate(moment(moment().format("YYYY-M-D"))) - setCurrentPage(1) - } else if (val === "7 day") { - setStartDate(moment(moment().subtract(7, "days").format("YYYY-M-D"))) - setEndDate(moment(moment().format("YYYY-M-D"))) - setCurrentPage(1) - } else { - setStartDate(moment(moment().format("YYYY-M-D"))) - setEndDate(moment(moment().format("YYYY-M-D"))) - setCurrentPage(1) - } - } - - return ( -
- - - - -

{pageName}

- -
- - - - - - - -
-
-
- handleChangeDay(e)} defaultValue={currentDay}> - - - - -
-
- {' '} - -
-
- -
- {renderTable} - -
- - - ) -} - -export default Index; +import React, { useState, useEffect, useMemo } from 'react'; +import { Card, CardBody, CardHeader, Col, Row, Input } from 'reactstrap'; +import { Button } from 'reactstrap'; +import axios from 'axios'; +import * as XLSX from 'xlsx'; +import { NotificationContainer, NotificationManager } from 'react-notifications'; +import { Pagination, Tooltip, Table, DatePicker } from 'antd'; +import moment from 'moment'; +import { PRESENCE_SEARCH, IMAGE_GET_BY_ID } from '../../../const/ApiConst.js'; +import DialogFoto from './DialogFoto'; +import { useTranslation } from 'react-i18next'; +const { RangePicker } = DatePicker; + +const Index = ({ params,...props }) => { + let role_id = 0, user_id = 0, isLogin = false, token = '', company_id = 0, all_project = null, role_name='', hierarchy=[], user_name=''; + if (props && props.role_id && props.user_id) { + role_id = props.role_id; + user_id = props.user_id; + token = props.token; + isLogin = props.isLogin; + company_id = props.company_id; + all_project = props.all_project; + role_name = props.role_name; + isLogin = props.isLogin; + hierarchy = props.hierarchy; + user_name = props.user_name; + } + + const [dataTable, setDatatable] = useState([]) + const [search, setSearch] = useState('') + const [currentPage, setCurrentPage] = useState(1) + const [totalPage, setTotalPage] = useState(0) + const [rowsPerPage, setRowsPerPage] = useState(10) + const [dataExport, setDataExport] = useState([]) + const [startDate, setStartDate] = useState(moment(moment().format("YYYY-M-D"))) + const [endDate, setEndDate] = useState(moment(moment().format("YYYY-M-D"))) + const [currentDay, setCurrentDay] = useState("today") + const [dataImage, setDataImage] = useState(null) + const [openImage, setOpenImage] = useState(false) + const { t } = useTranslation() + const pageName = params.name; + + const config = { + headers: + { + Authorization: `Bearer ${token}`, + "Content-type": `application/json` + } + }; + + useEffect(() => { + getDataPresence(); + }, [search, currentPage, rowsPerPage, startDate, endDate]) + + useEffect(() => { + const cekData = dataExport || [] + if (cekData.length > 0) { + exportExcel() + } + }, [dataExport]) + + const handleSearch = e => { + const value = e.target.value + setSearch(value); + setCurrentPage(1) + }; + + const getDataPresence = async () => { + let start = 0; + + if (currentPage !== 1 && currentPage > 1) { + start = (currentPage * rowsPerPage) - rowsPerPage + } + + let dateStart = moment(startDate).format("YYYY-MM-DD 00:00:00"); + let dateEnd = moment(endDate).format("YYYY-MM-DD 23:59:59"); + + const payload = { + "paging": { "start": start, "length": rowsPerPage }, + "columns": [ + { "name": "name", "logic_operator": "ilike", "value": search, "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 result = await axios + .post(PRESENCE_SEARCH, payload, config) + .then(res => res) + .catch((error) => error.response); + + + if (result && result.data && result.data.code == 200) { + setDatatable(result.data.data); + setTotalPage(result.data.totalRecord); + } else { + NotificationManager.error('Gagal Mengambil Data!!', 'Failed'); + } + } + + const handleImage = async (id, name) => { + + let url = IMAGE_GET_BY_ID(id, "presensi"); + + const result = await axios + .get(url, config) + .then(res => res) + .catch((error) => error.response); + if (result && result.data.code == 200) { + let dataRes = result.data.data + let dataImage = { + name, + url: dataRes.image + } + await setDataImage(dataImage) + setOpenImage(true) + } else { + NotificationManager.error('Data image tidak ditemukan!', 'Failed'); + } + } + + const closeDialogImage = () => { + setOpenImage(false) + setDataImage(null) + } + + const toggleDialogImage = () => { + if (openImage) { + setDataImage(null) + } + setOpenImage(!openImage) + } + + const onShowSizeChange = (current, pageSize) => { + setRowsPerPage(pageSize) + } + + const onPagination = (current, pageSize) => { + setCurrentPage(current) + } + + const renderDurasiKerja = (jamMasuk, jamKeluar) => { + if (jamMasuk && jamKeluar) { + let start = moment(jamMasuk), + end = moment(jamKeluar); + + let diff = end.diff(start); + let result = moment.utc(diff).format('HH:mm:ss'); + + if (result) { + return result; + } else { + return "-" + } + + } else { + return "-" + } + } + + const handleExportExcel = async () => { + + let dateStart = moment(startDate).format("YYYY-MM-DD 00:00:00"); + let dateEnd = moment(endDate).format("YYYY-MM-DD 23:59:59"); + + const payload = { + "paging": { "start": 0, "length": -1 }, + "columns": [ + { "name": "name", "logic_operator": "ilike", "value": search, "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 result = await axios + .post(PRESENCE_SEARCH, payload, config) + .then(res => res) + .catch((error) => error.response); + + + if (result && result.data && result.data.code == 200) { + let resData = result.data.data; + const excelData = []; + resData.map((val, index) => { + let dataRow = { + "NIK/ID Card": val.join_first_ktp_number ? val.join_first_ktp_number : '-', + "Nama Human Resource": val.join_first_name ? val.join_first_name : '', + "Jam Masuk": val.clock_in ? moment(val.clock_in).format("D-M-YYYY HH:mm:ss") : '-', + "Jam Keluar": val.clock_out ? moment(val.clock_out).format("D-M-YYYY HH:mm:ss") : '-', + "Durasi Kerja": renderDurasiKerja(val.clock_in, val.clock_out), + "Lokasi Masuk": val.clock_in_loc && val.clock_in_loc !== '' ? val.clock_in_loc : '-', + "Lokasi Pulang": val.clock_out_loc && val.clock_out_loc !== '' ? val.clock_out_loc : '-', + "Area Kerja In": val.clock_in_boundary ? "Sesuai" : "Tidak Sesuai", + "Area Kerja Out": val.clock_out_boundary == null ? "-" : val.clock_out_boundary ? "Sesuai" : "Tidak Sesuai", + } + excelData.push(dataRow) + }) + await setDataExport(excelData); + } else { + NotificationManager.error('Gagal Export Data!!', 'Failed'); + } + } + + + const exportExcel = () => { + const dataExcel = dataExport || []; + const fileName = `Data ${pageName}.xlsx`; + const ws = XLSX.utils.json_to_sheet(dataExcel); + const wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, `Data ${pageName}`); + + XLSX.writeFile(wb, fileName); + setDataExport([]) + } + const renderTable = useMemo(() => { + const columns = [ + { + title: 'Action', + dataIndex: '', + key: 'x', + render: (text, record) => <> + + handleImage(text.id, text.join_first_name)}> + + , + }, + { title: t('nik'), dataIndex: 'join_first_ktp_number', key: 'join_first_ktp_number' }, + { title: t('nameHR'), dataIndex: 'join_first_name', key: 'join_first_name' }, + { title: t('presenceIn'), dataIndex: 'clock_in', key: 'clock_in', render: (text, record) => (
{text ? moment(text).format("D-M-YYYY HH:mm:ss") : "-"}
) }, + { title: t('presenceOut'), dataIndex: 'clock_out', key: 'clock_out', render: (text, record) => (
{text ? moment(text).format("D-M-YYYY HH:mm:ss") : "-"}
) }, + { title: t('workDuration'), render: (text, record) => (
{renderDurasiKerja(record.clock_in, record.clock_out)}
) }, + { title: t('locIn'), dataIndex: 'clock_in_loc', key: 'clock_in_loc', render: (text, record) => <>{text && text !== '' ? text : '-'} }, + { title: t('locOut'), dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => <>{text && text !== '' ? text : '-'} }, + { title: t('workAreaIn'), dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => (
{record.clock_in_boundary ? : }
) }, + { title: t('workAreaOut'), dataIndex: 'clock_out_loc', key: 'clock_out_loc', render: (text, record) => (
{record.clock_out_boundary == null ? : record.clock_out_boundary ? : }
) }, + ]; + return ( +
+ ) + }, [dataTable]) + + const handleDatePicker = (date, dateString) => { + setStartDate(date[0]) + setEndDate(date[1]) + } + + const handleChangeDay = (e) => { + const val = e.target.value; + setCurrentDay(val) + if (val === "today") { + setStartDate(moment(moment().format("YYYY-M-D"))) + setEndDate(moment(moment().format("YYYY-M-D"))) + setCurrentPage(1) + } else if (val === "3 day") { + setStartDate(moment(moment().subtract(3, "days").format("YYYY-M-D"))) + setEndDate(moment(moment().format("YYYY-M-D"))) + setCurrentPage(1) + } else if (val === "7 day") { + setStartDate(moment(moment().subtract(7, "days").format("YYYY-M-D"))) + setEndDate(moment(moment().format("YYYY-M-D"))) + setCurrentPage(1) + } else { + setStartDate(moment(moment().format("YYYY-M-D"))) + setEndDate(moment(moment().format("YYYY-M-D"))) + setCurrentPage(1) + } + } + + return ( +
+ + + + +

{pageName}

+ +
+ + + + + + + +
+
+
+ handleChangeDay(e)} defaultValue={currentDay}> + + + + +
+
+ {' '} + +
+
+ +
+ {renderTable} + +
+ + + ) +} + +export default Index; diff --git a/src/views/SimproV2/ResourceWorker/index.js b/src/views/SimproV2/ResourceWorker/index.js index cbc0185..fb07ef8 100644 --- a/src/views/SimproV2/ResourceWorker/index.js +++ b/src/views/SimproV2/ResourceWorker/index.js @@ -230,7 +230,10 @@ const ResourceWorker = ({ params, ...props }) => { } else { payload.group_column.where.push( { "name": "company_id", "logic_operator": "is null", "value": "", "operator": "AND" }, - ) + ); + payload.joins.push( + { name: "m_company", column_join: "company_id", column_results: ["company_name"] } + ); } const result = await axios @@ -352,6 +355,19 @@ const ResourceWorker = ({ params, ...props }) => { "ascending": false } } + + if (role_name !== "Super Admin") { + payload.group_column.where.push( + { "name": "company_id", "logic_operator": "=", "value": company_id, "operator": "AND" }, + ) + } else { + payload.group_column.where.push( + { "name": "company_id", "logic_operator": "is null", "value": "", "operator": "AND" }, + ); + payload.joins.push( + { name: "m_company", column_join: "company_id", column_results: ["company_name"] } + ); + } const result = await axios .post(USER_SEARCH, payload, HEADER) .then(res => res) @@ -361,14 +377,16 @@ const ResourceWorker = ({ params, ...props }) => { let resData = result.data.data; const excelData = []; resData.map((n, index) => { - let dataRow = { - "NIK (Nomor Induk Karyawan)": n.ktp_number, - "Employee Name": n.name, - "Divisi": n.join_second_name, - "Employee Type": n.employee_type, - "Role": n.join_first_name, - "Phone No": n.phone_number, + let dataRow = {}; + if (role_name === 'Super Admin') { + dataRow.Company = n.join_third_company_name; } + dataRow["NIK (Nomor Induk Karyawan)"] = n.ktp_number; + dataRow["Employee Name"] = n.name; + dataRow["Divisi"] = n.join_second_name; + dataRow["Employee Type"] = n.employee_type; + dataRow.Role = n.join_first_name; + dataRow["Phone No"] = n.phone_number; excelData.push(dataRow) }) await setDataExport(excelData); @@ -521,7 +539,16 @@ const ResourceWorker = ({ params, ...props }) => { , }, - + { + title: role_name === 'Super Admin' ? "Company Name" : null, + dataIndex: "join_third_company_name", + key: "join_third_company_name", + render: (text, record) => { + return role_name === 'Super Admin' ? ( + {record.join_third_company_name} + ) : null; + } + }, { title: t('nik'), dataIndex: 'ktp_number', key: 'ktp_number' }, { title: t('nameHR'), dataIndex: 'name', key: 'name' }, { title: t('division'), dataIndex: 'join_second_name', key: 'join_second_name' },