sanksi.controller.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. const auth = require('../../middleware/verifyToken')
  2. const forRole = require('../../middleware/role')
  3. const {
  4. PTB_DIKTI,
  5. PTB_LLDIKTI,
  6. PENJADWALAN,
  7. SELESAI,
  8. CREATE_SANKSI,
  9. PTB_PT,
  10. PTB_ADMIN,
  11. PTB_READ, TRUE, KEBERATAN, BANDING, CABUT_SANKSI, PERBAIKAN, LLDIKTI, DIKTI, FALSE, UPDATE_LAPORAN, UPDATE_SANKSI
  12. } = require('../../utils/constanta')
  13. const checkData = require('../../middleware/checkData')
  14. const laporanModel = require('../../model/laporan.model')
  15. const sanksiModel = require('../../model/sanksi.model')
  16. const uploadFile = require('../../middleware/uploadFile')
  17. const { validation } = require('../../middleware/validation')
  18. const pelanggaranModel = require('../../model/pelanggaran.model')
  19. const response = require('../../utils/responseHandler')
  20. const { addManyDokumen } = require('../../utils/dokumenFunction')
  21. const isUnique = require('../../middleware/isUnique')
  22. const autoSaveModel = require('../../model/autoSave.model')
  23. const { hariKerja } = require('../../utils/hariKerja')
  24. const pemantauanModel = require('../../model/pemantauan.model')
  25. const { SANKSI } = require('../../utils/constanta')
  26. const axios = require('../../utils/axios')
  27. const logModel = require('../../model/log.model')
  28. const handleError = require('../../utils/v1/handleError')
  29. const { validate } = require('../../utils/v1/validation')
  30. const { cekSatuDataSanksi } = require('../../utils/v1/cekData')
  31. exports.create = [
  32. auth,
  33. forRole([PTB_DIKTI, PTB_LLDIKTI]),
  34. checkData((req) => req.params.laporan_id, async (id) => laporanModel.findByIdAndUpdate(id), 'laporan'),
  35. uploadFile.fields([{ name: 'dokumen' }, { name: 'dokumen_berita_acara' }]),
  36. validation((req) => req.body, {
  37. no_sanksi: 'string',
  38. keterangan: 'string',
  39. pelanggaran_id: 'string',
  40. tanggal_terima_sanksi: { type: 'date', convert: true },
  41. tanggal_akhir_keberatan: { type: 'date', convert: true },
  42. dokumen: {
  43. type: 'array',
  44. items: {
  45. type: 'object',
  46. buffer: { type: 'class', instanceOf: Buffer }
  47. }
  48. }
  49. }),
  50. checkData((req) => req.body.pelanggaran_id, (data) => {
  51. const pelanggaran_id = data.split(',')
  52. return pelanggaranModel.find({
  53. _id: {
  54. $in: pelanggaran_id
  55. }
  56. })
  57. },
  58. 'pelanggaran'
  59. ),
  60. isUnique((req) => req.params.laporan_id, (id) => sanksiModel.findOne({ laporan: id })),
  61. async (req, res) => {
  62. const {
  63. no_sanksi,
  64. keterangan,
  65. from_date,
  66. to_date,
  67. tanggal_terima_sanksi,
  68. tanggal_akhir_keberatan,
  69. dokumen_terima_sanksi,
  70. dokumen
  71. } = req.body
  72. const { laporan, pelanggaran } = req.data
  73. const user = req.user
  74. const dokumen_id = (await addManyDokumen(dokumen)).map((e) => e._id)
  75. let dokumenTerimaSanksi_id = []
  76. if (dokumen_terima_sanksi) dokumenTerimaSanksi_id = (await addManyDokumen(dokumen_terima_sanksi)).map((e) => e._id)
  77. const data = await sanksiModel.create({
  78. no_sanksi,
  79. laporan: laporan._id,
  80. user: user._id,
  81. pelanggaran: pelanggaran.map(e => e._id),
  82. keterangan,
  83. dokumen: dokumen_id,
  84. sanksi: pelanggaran.map(e => ({ label: e.label_sanksi, value: e.sanksi, level: e.level_sanksi })),
  85. tanggal_terima_sanksi,
  86. dokumen_terima_sanksi: dokumenTerimaSanksi_id,
  87. tanggal_akhir_keberatan,
  88. masa_berlaku: from_date && to_date ? { from_date, to_date } : null,
  89. batas_waktu: from_date ? { keberatan: hariKerja(10, from_date) } : null,
  90. aktif: from_date ? true : false
  91. })
  92. const autoSave = await autoSaveModel.findOne({ laporan_id: laporan._id }).populate('laporan')
  93. await laporanModel.findByIdAndUpdate(laporan._id, {
  94. sanksi: data._id,
  95. berita_acara: autoSave?.laporan?.PenetapanSanksi,
  96. flag: from_date ? SANKSI : SELESAI,
  97. $push: {
  98. step: from_date ? SANKSI : SELESAI
  99. }
  100. })
  101. await pemantauanModel.create({
  102. laporan: laporan._id,
  103. sanksi: data._id,
  104. action: CREATE_SANKSI,
  105. pt_id: laporan.pt.id,
  106. user: user._id,
  107. keterangan: 'Melakukan penetapan Sanksi',
  108. dokumen: dokumen_id
  109. })
  110. return response.success(res, {
  111. message: 'Berhasil menambahkan sanksi',
  112. code: 201
  113. })
  114. }
  115. ]
  116. exports.updatePDDIKTI = [
  117. auth,
  118. forRole([PTB_DIKTI, PTB_LLDIKTI]),
  119. checkData((req) => req.params.laporan_id, async (id) => sanksiModel.findOne({ _id: sanksi_id }).populate('pelanggaran').populate('laporan'), 'sanksi'),
  120. async (req, res) => {
  121. const { sanksi } = req.data
  122. const user = req.user
  123. try {
  124. await axios.post(
  125. `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${sanksi.laporan.pt.kode}/sanksi`,
  126. {
  127. noSanksi: sanksi.no_sanksi,
  128. tmtBerlaku: sanksi.masa_berlaku.from_date,
  129. tstBerlaku: sanksi.tanggal_terima_sanksi,
  130. idJenisSanksi: Math.max(...sanksi.pelanggaran.map(e => e.level_sanksi)),
  131. alasan: 'Penetapan sanksi'
  132. }, {
  133. 'Content-Type': 'application/json'
  134. })
  135. await logModel.create({
  136. user: user._id,
  137. aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}`
  138. })
  139. } catch (e) {
  140. await Promise.all([
  141. laporanModel.updateOne({
  142. _id: laporan._id
  143. }, {
  144. sanksi: null
  145. }), sanksiModel.deleteOne({
  146. _id: data._id
  147. }), logModel.create({
  148. user: user._id,
  149. aktivitas: `Server gagal mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}, dengan error ${e.message}`
  150. }), pemantauanModel.deleteOne({
  151. laporan: sanksi.laporan._id,
  152. sanksi: sanksi._id,
  153. action: CREATE_SANKSI
  154. })
  155. ])
  156. return response.error(res, {
  157. message: 'Gagal Membuat Sanksi',
  158. error: e.message
  159. })
  160. }
  161. return response.success(res, {
  162. message: 'Berhasil mengirim data ke PDDIKTI'
  163. })
  164. }
  165. ]
  166. exports.getAll = [
  167. auth,
  168. forRole([PTB_DIKTI, PTB_LLDIKTI, PTB_PT, PTB_ADMIN, PTB_READ]),
  169. async (req, res) => {
  170. const user = req.user
  171. const {
  172. keberatan,
  173. jawaban,
  174. banding,
  175. cabutSanksi,
  176. perbaikan,
  177. aktif,
  178. delegasi,
  179. naikSanksi,
  180. turunSanksi,
  181. pengajuan_keberatan,
  182. bypassCabutSanksi
  183. } = req.query
  184. const query = {}
  185. const query2 = {}
  186. switch (user.role.id) {
  187. case PTB_DIKTI:
  188. query2.role_data = DIKTI
  189. break
  190. case PTB_LLDIKTI:
  191. query2['pt.pembina.id'] = user.lembaga.id
  192. query2.role_data = LLDIKTI
  193. break
  194. case PTB_PT:
  195. query['masa_berlaku.from_date'] = {
  196. $exists: true,
  197. $ne: null,
  198. $lt: new Date()
  199. }
  200. query['masa_berlaku.to_date'] = {
  201. $exists: true,
  202. $ne: null,
  203. $gte: new Date()
  204. }
  205. query2['pt.id'] = user.lembaga.id
  206. query2.step = { $in: [SANKSI] }
  207. break
  208. }
  209. if (keberatan === TRUE) {
  210. query2.step = { $in: [KEBERATAN] }
  211. if (jawaban === TRUE) {
  212. query.pengajuan = {
  213. keberatan: {
  214. $exists: true,
  215. $ne: null
  216. }
  217. }
  218. }
  219. }
  220. if (banding === TRUE) {
  221. query2.step = { $in: [BANDING] }
  222. if (jawaban === TRUE) {
  223. query.pengajuan = {
  224. banding: {
  225. $exists: true,
  226. $ne: null
  227. }
  228. }
  229. }
  230. }
  231. if (perbaikan === TRUE) query2.step = { $in: [PERBAIKAN] }
  232. if (cabutSanksi === TRUE) {
  233. query2.step = { $in: [CABUT_SANKSI] }
  234. if (jawaban === TRUE) {
  235. query.pengajuan = {
  236. cabut_sanksi: {
  237. $exists: true,
  238. $ne: null
  239. }
  240. }
  241. }
  242. }
  243. const data = (await sanksiModel.find(query).populate({
  244. path: 'laporan',
  245. match: query2
  246. })).filter(e => e.laporan !== null)
  247. return response.success(res, {
  248. message: 'Berhasil mendapatkan data',
  249. data
  250. })
  251. }
  252. ]
  253. exports.getOne = [
  254. auth,
  255. forRole([PTB_DIKTI, PTB_LLDIKTI, PTB_PT]),
  256. checkData((req) => req.params.sanksi_id, async (id) => sanksiModel.findById(id).populate('laporan').populate('pelanggaran'), 'sanksi'),
  257. async (req, res) => {
  258. const { sanksi } = req.data
  259. return response.success(res, {
  260. message: 'Berhasil mendapatkan data',
  261. data: sanksi
  262. })
  263. }
  264. ]
  265. exports.updatePt = [
  266. checkData(req => req.params.sanksi_id, (sanksi_id) => sanksiModel.findById(id), 'sanksi'),
  267. validation((req) => req.body, {
  268. is_pengajuan_keberatan: { type: 'string', optional: true },
  269. is_pengajuan_banding: { type: 'string', optional: true },
  270. is_dokumen_perbaikan: { type: 'string', optional: true }
  271. }),
  272. async (req, res) => {
  273. const { is_pengajuan_keberatan, is_pengajuan_banding, is_dokumen_perbaikan } = req.body
  274. const user = req.user
  275. const { sanksi } = req.data
  276. let data = {}
  277. let data2 = {}
  278. let keterangan = ''
  279. let last_step = ''
  280. let flag
  281. if (is_pengajuan_keberatan) {
  282. if (is_pengajuan_keberatan === TRUE) {
  283. last_step = 'Permohonan Keberatan'
  284. keterangan = 'Menerima Pengajuan Keberatan'
  285. } else if (is_pengajuan_keberatan === FALSE) {
  286. keterangan = 'Membatalkan Pengajuan Keberatan'
  287. last_step = 'Dokumen Perbaikan'
  288. }
  289. data = { is_pengajuan_keberatan: is_pengajuan_keberatan === TRUE }
  290. flag = is_pengajuan_keberatan === TRUE ? KEBERATAN : PERBAIKAN
  291. }
  292. if (is_pengajuan_banding) {
  293. if (is_pengajuan_banding === TRUE) {
  294. last_step = 'Permohonan Banding'
  295. keterangan = 'Menerima Pengajuan Banding'
  296. } else if (is_pengajuan_banding === FALSE) {
  297. keterangan = 'Membatalkan Pengajuan Banding'
  298. last_step = 'Dokumen Perbaikan'
  299. }
  300. data = { is_pengajuan_banding: is_pengajuan_banding === TRUE }
  301. flag = is_pengajuan_banding === TRUE ? BANDING : PERBAIKAN
  302. }
  303. if (is_dokumen_perbaikan === TRUE) {
  304. last_step = 'Dokumen Perbaikan'
  305. flag = PERBAIKAN
  306. }
  307. if (!last_step) {
  308. return response.error(res, {
  309. message: 'Gagal merubah Sanksi'
  310. })
  311. }
  312. await pemantauanModel.create({
  313. laporan: sanksi.laporan._id,
  314. sanksi: sanksi._id,
  315. action: UPDATE_SANKSI,
  316. pt_id: sanksi.laporan.pt.id,
  317. user: user._id,
  318. keterangan
  319. })
  320. data.last_step = last_step
  321. data2.flag = flag
  322. const checkStep = await laporanModel.findOne({ sanksi: sanksi._id, step: flag})
  323. if (!checkStep) data2.$push = { step: flag }
  324. await laporanModel.findOneAndUpdate({ sanksi: sanksi._id }, data2)
  325. await sanksiModel.updateOne(
  326. { _id: sanksi._id },
  327. data
  328. )
  329. return response.success(res, {
  330. message: 'Berhasil merubah Sanksi'
  331. })
  332. }
  333. ]