Browse Source

menu sanksi di pt

andi 2 years ago
parent
commit
49bdf4e73f

+ 7 - 1
actions/sanksi.js

@@ -12,7 +12,7 @@ export const getSanksi = async (token, query = {}) => {
 	try {
 	try {
 		let url = "/sanksi";
 		let url = "/sanksi";
 		if (query != {}) {
 		if (query != {}) {
-			const { keberatan, jawaban, banding, cabutSanksi, perbaikan, aktif, delegasi, turunSanksi, naikSanksi } = query;
+			const { keberatan, jawaban, banding, cabutSanksi, perbaikan, aktif, delegasi, turunSanksi, naikSanksi, pengajuan_keberatan } = query;
 			url += "?";
 			url += "?";
 			const parseURL = [];
 			const parseURL = [];
 			if (keberatan) parseURL.push(`keberatan=true`);
 			if (keberatan) parseURL.push(`keberatan=true`);
@@ -24,6 +24,7 @@ export const getSanksi = async (token, query = {}) => {
 			if (turunSanksi) parseURL.push(`turunSanksi=true`);
 			if (turunSanksi) parseURL.push(`turunSanksi=true`);
 			if (naikSanksi) parseURL.push(`naikSanksi=true`);
 			if (naikSanksi) parseURL.push(`naikSanksi=true`);
 			if (aktif === false) parseURL.push(`aktif=false`);
 			if (aktif === false) parseURL.push(`aktif=false`);
+			if (pengajuan_keberatan) parseURL.push(`pengajuan_keberatan=true`);
 			url += parseURL.join("&");
 			url += parseURL.join("&");
 		}
 		}
 
 
@@ -76,3 +77,8 @@ export const update = async (token, id, data) => {
 	await createLog(token, { aktivitas: `Berhasil Merubah Sanksi, id: ${id}` });
 	await createLog(token, { aktivitas: `Berhasil Merubah Sanksi, id: ${id}` });
 	return res.data;
 	return res.data;
 };
 };
+export const updatePT = async (token, id, data) => {
+	const res = await axiosAPI.put(`/sanksi/update-pt/${id}`, data, { headers: { Authorization: token } });
+	await createLog(token, { aktivitas: `Berhasil mengubah status sanksi, id: ${id}` });
+	return res.data;
+};

+ 7 - 0
components/Layout/MenuPT.js

@@ -9,6 +9,13 @@ const MenuPT = [
 		icon: "icon-speedometer",
 		icon: "icon-speedometer",
 		translate: "sidebar.nav.PT_PEMANTAUAN",
 		translate: "sidebar.nav.PT_PEMANTAUAN",
 	},
 	},
+	{
+		name: "Sanksi",
+		path: "/pt/sanksi",
+		icon: "icon-speedometer",
+		translate: "sidebar.nav.PT_PEMANTAUAN",
+	},
+
 	{
 	{
 		name: "Pengajuan Keberatan",
 		name: "Pengajuan Keberatan",
 		icon: "icon-hourglass",
 		icon: "icon-hourglass",

+ 66 - 0
components/PT/Sanksi/TableSanksi.js

@@ -0,0 +1,66 @@
+import moment from "moment";
+import { Button, Table } from "reactstrap";
+import Link from "next/link";
+
+function TableSanksi({ listData, to, linkName }) {
+	return (
+		<div className="card b">
+			<div className="card-body card-over">
+				<Table className="table w-100">
+					<thead>
+						<tr>
+							<th>Nomor Sanksi</th>
+							<th>Keterangan Sanksi</th>
+							{/* <th>Created</th> */}
+							<th>Status</th>
+						</tr>
+					</thead>
+					<tbody>
+						{listData.map((data) => {
+							return (
+								<tr key={data._id}>
+									{/* <td>{data.no_sanksi}</td> */}
+									<td>
+										<div className="media align-items-center">
+											<div className="media-body d-flex">
+												<div>
+													<h4>{data.no_sanksi}</h4>
+													<p>{moment(data.createdAt).format("DD-MM-YYYY")}</p>
+												</div>
+											</div>
+										</div>
+									</td>
+									<td>
+										<div className="table-desc">
+											<div className="media align-items-center">
+												<div className="media-body d-flex">
+													<div>
+														<h4 className="m-0">{data.laporan.pt.nama.length > 64 ? data.laporan.pt.nama.substring(0, 64) + "..." : data.laporan.pt.nama}</h4>
+														<p className="w-105">{data.keterangan}</p>
+													</div>
+												</div>
+											</div>
+										</div>
+									</td>
+									{/* <td>{moment(data.createdAt).format("DD MMMM YYYY")}</td> */}
+									<td>{data.is_read ? <div className="badge badge-green">Sudah DiLihat</div> : <div className="badge badge-red">Belum Dilihat</div>}</td>
+									<td>
+										<Link href={{ pathname: to, query: { id: data._id } }}>
+											<Button className="btn-login" color >
+												<span className="font-color-white">
+													{linkName}
+												</span>
+											</Button>
+										</Link>
+									</td>
+								</tr>
+							);
+						})}
+					</tbody>
+				</Table>
+			</div>
+		</div>
+	);
+}
+
+export default TableSanksi;

+ 1 - 1
pages/pt/jawaban-keberatan/index.js

@@ -30,7 +30,7 @@ class JawabanKeberatan extends Component {
 					</span>
 					</span>
 				</div>
 				</div>
 				<Row>
 				<Row>
-					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/jawaban-keberatan/detail" linkName="Detail" /> : sanksi.data ? "" : <Loader />} </Col>
+					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/jawaban-keberatan/detail" linkName="Detail" /> : sanksi.data ? "Tidak Ada Sanksi" : <Loader />} </Col>
 				</Row>
 				</Row>
 			</ContentWrapper>
 			</ContentWrapper>
 		);
 		);

+ 1 - 1
pages/pt/jawaban-pencabutan-sanksi/index.js

@@ -28,7 +28,7 @@ class JawabanCabutSanksi extends Component {
 					<span className="font-color-white">Jawaban Permohonan Pencabutan Sanksi</span>
 					<span className="font-color-white">Jawaban Permohonan Pencabutan Sanksi</span>
 				</div>
 				</div>
 				<Row>
 				<Row>
-					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/jawaban-pencabutan-sanksi/detail" linkName="Detail" /> : sanksi.data ? "" : <Loader />}</Col>
+					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/jawaban-pencabutan-sanksi/detail" linkName="Detail" /> : sanksi.data ? "Tidak Ada Sanksi" : <Loader />}</Col>
 				</Row>
 				</Row>
 			</ContentWrapper>
 			</ContentWrapper>
 		);
 		);

+ 1 - 1
pages/pt/keberatan/index.js

@@ -15,7 +15,7 @@ class Keberatan extends Component {
 
 
 	componentDidMount = async () => {
 	componentDidMount = async () => {
 		const { token } = this.props;
 		const { token } = this.props;
-		const sanksi = await getSanksi(token);
+		const sanksi = await getSanksi(token, { pengajuan_keberatan: true });
 		this.setState({ sanksi });
 		this.setState({ sanksi });
 	};
 	};
 
 

+ 134 - 0
pages/pt/sanksi/detail.js

@@ -0,0 +1,134 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import { getOneSanksi, updatePT } from "@/actions/sanksi";
+import Header from "@/components/Main/Header";
+import DetailPT from "@/components/Main/DetailPT";
+import DetailSanksi from "@/components/Main/DetailSanksi";
+import Riwayat from "@/components/PT/Keberatan/Riwayat";
+import ModalPermohonan from "@/components/PT/Keberatan/ModalPermohonan";
+import Link from "next/link";
+import moment from "moment";
+import { Row, Col, Card, CardBody, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Router from "next/router";;
+import Loader from "@/components/Common/Loader";
+import { ToastContainer, toast } from "react-toastify";
+
+class Sanksi extends Component {
+	state = {
+		modal: false,
+		sanksi: {},
+		pt: null,
+	};
+
+	static getInitialProps = ({ query }) => ({ query });
+
+	componentDidMount = async () => {
+		const { token, query } = this.props;
+		const sanksi = await getOneSanksi(token, query.id);
+		updatePT(token, query.id, { is_read: true })
+		this.setState({ sanksi, pt: sanksi.data.laporan.pt });
+	};
+
+	render() {
+		const { sanksi, pt } = this.state;
+		return (
+			<ContentWrapper unwrap>
+				{pt && <Header data={pt} />}
+				<div className="p-3">
+					<div className="content-heading">
+						<span className="font-color-white">
+							Sanksi
+						</span>
+						<div className="ml-auto">
+							<Link href="/pt/keberatan">
+								<Button className="color-3e3a8e" color>
+									<span className="font-color-white">
+										&lt; Kembali
+									</span>
+								</Button>
+							</Link>
+						</div>
+					</div>
+					<Row>
+						{sanksi.data ? (
+							<Col xl="9">
+								<Card className="card-default">
+									<CardBody>
+										<Row>
+											<Col lg={12}>
+												<DetailSanksi data={sanksi.data} />
+												{new Date(sanksi.data.batas_waktu.keberatan).getTime() > Date.now() ? (
+													<>
+														<p style={{ fontSize: '1vw' }}>
+															<strong>
+																Setelah membaca surat keputusan sanksi tersebut, Apakah Perguruan Tinggi bermaksud menajukan keberatan?
+															</strong>
+														</p>
+														<p>
+															Pengajuan dilakukan paling lambat tanggal {moment(sanksi.data.batas_waktu.keberatan).locale("id").format("DD MMMM YYYY")}
+														</p>
+														<p className="lead">
+															<span className="btn-radius">
+																<Button color="" disabled={sanksi.data.is_pengajuan} className="btn-labeled" onClick={async () => {
+																	const toastid = toast.loading("Please wait...");
+																	try {
+																		const { token, query } = this.props;
+																		await updatePT(token, query.id, { is_pengajuan: true })
+																		toast.update(toastid, { render: "All is good", type: "success", isLoading: false, autoClose: true, closeButton: true });
+																		Router.push("/pt/keberatan");
+																	} catch (error) {
+																		toast.update(toastid, { render: "All is not good", type: "error", isLoading: false, autoClose: true, closeButton: true });
+																	}
+																}
+
+																}>
+																	<h4 className="p-0 mt-2 font-color-white pl-3 pr-3">Ya</h4>
+																</Button>
+															</span>
+															<span className="btn-radius">
+																<Button disabled={sanksi.data.is_pengajuan} color className="btn-labeled-3" onClick={async () => {
+																	const toastid = toast.loading("Please wait...");
+																	try {
+																		const { token, query } = this.props;
+																		await updatePT(token, query.id, { is_pengajuan: false })
+																		toast.update(toastid, { render: "All is good", type: "success", isLoading: false, autoClose: true, closeButton: true });
+																		Router.push("/pt/dokumen-perbaikan");
+																	} catch (error) {
+																		toast.update(toastid, { render: "All is not good", type: "error", isLoading: false, autoClose: true, closeButton: true });
+																	}
+																}
+																}>
+																	<h4 className="p-0 mt-2">Tidak</h4>
+																</Button>
+															</span>
+														</p>
+													</>
+												) : (
+													<p>Pengajuan ditutup</p>
+												)}
+											</Col>
+										</Row>
+									</CardBody>
+								</Card>
+							</Col>
+						) : (
+							<Loader />
+						)}
+						<Col xl="3">{pt && <DetailPT data={pt} />}</Col>
+					</Row>
+					{sanksi.data && (
+						<Row>
+							<Col>
+								<Riwayat data={sanksi.data?.pengajuan?.keberatan ? sanksi.data.pengajuan.keberatan : null} />
+							</Col>
+						</Row>
+					)}
+				</div>
+			</ContentWrapper >
+		);
+	}
+}
+
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Sanksi);

+ 39 - 0
pages/pt/sanksi/index.js

@@ -0,0 +1,39 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import { Row, Col } from "reactstrap";
+import { getSanksi } from "@/actions/sanksi";
+import TableSanksi from "@/components/PT/Sanksi/TableSanksi";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+class Sanksi extends Component {
+	constructor(props) {
+		super(props);
+		this.state = {
+			sanksi: {},
+		};
+	}
+
+	componentDidMount = async () => {
+		const { token } = this.props;
+		const sanksi = await getSanksi(token);
+		this.setState({ sanksi });
+	};
+
+	render() {
+		const { sanksi } = this.state;
+		return (
+			<ContentWrapper>
+				<div className="content-heading">
+					<span className="font-color-white">
+						Sanksi
+					</span></div>
+				<Row>
+					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/sanksi/detail" linkName="Detail" /> : sanksi.data ? "Tidak ada Sanksi" : <Loader />}</Col>
+				</Row>
+			</ContentWrapper>
+		);
+	}
+}
+
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Sanksi);