sanksi.controller.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. const sanksiModel = require('../model/sanksi.model')
  2. const handleError = require('../utils/handleError')
  3. const response = require('../utils/responseHandler')
  4. const { addManyDokumen, addDokumen } = require('../utils/dokumenFunction')
  5. const { validate } = require('../utils/validation')
  6. const pemantauanModel = require('../model/pemantauan.model')
  7. const pelanggaranModel = require('../model/pelanggaran.model')
  8. const logModel = require('../model/log.model')
  9. const { hariKerja } = require('../utils/hariKerja')
  10. const axios = require('../utils/axios')
  11. const {
  12. cekSatuDataSanksi,
  13. cekSatuDataLaporan,
  14. cekBanyakDataPelanggaran,
  15. cekBanyakDataSanksi
  16. } = require('../utils/cekData')
  17. const laporanModel = require('../model/laporan.model')
  18. exports.create = handleError(async (req, res) => {
  19. const { no_sanksi, keterangan, from_date, to_date, tanggal_terima_sanksi, tanggal_akhir_keberatan } = req.body
  20. let { pelanggaran_id } = req.body
  21. const { laporan_id } = req.params
  22. const { dokumen: files, berita_acara, dokumen_terima_sanksi } = req.files
  23. const user = req.user
  24. const isValid = validate(res, req.body, {
  25. no_sanksi: 'string',
  26. keterangan: 'string',
  27. pelanggaran_id: 'string',
  28. from_date: 'string',
  29. to_date: 'string',
  30. tanggal_terima_sanksi: 'string',
  31. tanggal_akhir_keberatan: 'string'
  32. })
  33. if (!isValid) return
  34. const laporan = await cekSatuDataLaporan(res, user, laporan_id, {
  35. evaluasi: { $exists: true, $ne: [] }
  36. })
  37. if (!laporan) return
  38. const id_pelanggaran = pelanggaran_id.split(',')
  39. const pelanggaran = await pelanggaranModel.find({
  40. _id: {
  41. $in: id_pelanggaran
  42. }
  43. })
  44. if (!pelanggaran.length) {
  45. return response.error(res, { message: 'pelanggaran_id tidak ada' })
  46. }
  47. pelanggaran_id = pelanggaran.map((e) => e._id)
  48. const sanksi = await sanksiModel.findOne({ laporan: laporan_id })
  49. if (sanksi) {
  50. return response.error(res, {
  51. message: 'Sanksi sudah ada'
  52. })
  53. }
  54. if (!files) {
  55. return response.error(res, {
  56. message: 'dokumen harus ada'
  57. })
  58. }
  59. let dokumenBeritaAcara_id = null
  60. if (berita_acara) {
  61. const dokumenBeritaAcara = await addManyDokumen(berita_acara)
  62. dokumenBeritaAcara_id = dokumenBeritaAcara[0]
  63. }
  64. let dokumenTerimaSanksi_id = []
  65. if (dokumen_terima_sanksi) {
  66. const dokumenTerimaSanksi = await addManyDokumen(dokumen_terima_sanksi)
  67. dokumenTerimaSanksi_id = dokumenTerimaSanksi.map((e) => e._id)
  68. }
  69. const dokumen = await addManyDokumen(files)
  70. const dokumen_id = dokumen.map((e) => e._id)
  71. const data = await sanksiModel.create({
  72. no_sanksi,
  73. laporan: laporan._id,
  74. user: user._id,
  75. pelanggaran: pelanggaran_id,
  76. keterangan,
  77. dokumen: dokumen_id,
  78. sanksi: pelanggaran.map(e => ({ label: e.label_sanksi, value: e.sanksi, level: e.level_sanksi })),
  79. berita_acara: dokumenBeritaAcara_id,
  80. tanggal_terima_sanksi,
  81. dokumen_terima_sanksi: dokumenTerimaSanksi_id,
  82. tanggal_akhir_keberatan,
  83. masa_berlaku: {
  84. from_date,
  85. to_date
  86. },
  87. batas_waktu: {
  88. keberatan: hariKerja(10)
  89. }
  90. })
  91. // if (data) {
  92. // await axios.post(
  93. // `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${laporan.pt.kode}/sanksi`,
  94. // JSON.stringify({
  95. // noSanksi: no_sanksi,
  96. // tmtBerlaku: from_date,
  97. // tstBerlaku: tanggal_terima_sanksi,
  98. // idJenisSanksi: Math.max(...pelanggaran.map(e => e.level_sanksi)),
  99. // alasan: 'Penetapan sanksi'
  100. // }), {
  101. // 'Content-Type': 'application/json'
  102. // }
  103. // ).then(async (data) => {
  104. // await logModel.create({
  105. // user: user._id,
  106. // aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${laporan.pt.nama}`
  107. // })
  108. // }).catch(async e => {
  109. // await Promise.all([
  110. // laporanModel.updateOne({
  111. // _id: laporan._id
  112. // }, {
  113. // sanksi: null
  114. // }), sanksiModel.deleteOne({
  115. // _id: data._id
  116. // }), logModel.create({
  117. // user: user._id,
  118. // aktivitas: `Server gagal mengirimkan data Ke API PDDIKTI untuk update Status PT ${laporan.pt.nama}`
  119. // })
  120. // ])
  121. // return response.error(res, {
  122. // message: 'Gagal Membuat Sanksi',
  123. // error: e.message
  124. // })
  125. // })
  126. // }
  127. await laporanModel.findByIdAndUpdate(laporan._id, {
  128. sanksi: data._id
  129. // aktif: false,
  130. })
  131. await pemantauanModel.create({
  132. laporan: laporan._id,
  133. sanksi: data._id,
  134. action: 'CREATE SANKSI',
  135. pt_id: laporan.pt.id,
  136. user: user._id,
  137. keterangan: 'Melakukan penetapan Sanksi',
  138. dokumen: dokumen_id,
  139. berita_acara: dokumenBeritaAcara_id,
  140. })
  141. return response.success(res, {
  142. message: 'Berhasil membuat Sanksi',
  143. data
  144. })
  145. })
  146. exports.update = handleError(async (req, res) => {
  147. const { no_sanksi, keterangan, from_date, to_date } = req.body
  148. let sanksiBody = req.body.sanksi
  149. const { sanksi_id } = req.params
  150. const files = req.files
  151. const user = req.user
  152. const isValid = validate(res, req.body, {
  153. no_sanksi: 'string',
  154. keterangan: 'string',
  155. sanksi: 'string',
  156. from_date: 'string',
  157. to_date: 'string'
  158. })
  159. if (!isValid) return
  160. const sanksi = await cekSatuDataSanksi(res, user, sanksi_id, { all: true })
  161. if (!sanksi) return
  162. // pelanggaran_id = await cekBanyakDataPelanggaran(res, pelanggaran_id)
  163. // if (!pelanggaran_id) return
  164. sanksiBody = JSON.parse(sanksiBody)
  165. // const sanksi = await sanksiModel.findOne({ laporan: laporan_id })
  166. // if (sanksi) {
  167. // return response.error(res, {
  168. // message: 'Sanksi sudah ada',
  169. // })
  170. // }
  171. if (!files.length) {
  172. return response.error(res, {
  173. message: 'Dokumen Harus Ada!'
  174. })
  175. }
  176. const dokumen = await addManyDokumen(files)
  177. const dokumen_id = dokumen.map((e) => e._id)
  178. const data = await sanksiModel.updateOne(
  179. { _id: sanksi._id },
  180. {
  181. no_sanksi,
  182. // pelanggaran: pelanggaran_id,
  183. sanksi: sanksiBody,
  184. keterangan,
  185. dokumen: dokumen_id,
  186. masa_berlaku: {
  187. from_date,
  188. to_date
  189. },
  190. $push: {
  191. riwayat_sanksi: sanksi
  192. }
  193. }
  194. )
  195. // await laporanModel.findByIdAndUpdate(laporan._id, {
  196. // sanksi: data._id,
  197. // // aktif: false,
  198. // })
  199. await pemantauanModel.create({
  200. laporan: sanksi.laporan._id,
  201. sanksi: sanksi._id,
  202. action: 'UPDATE SANKSI',
  203. pt_id: sanksi.laporan.pt.id,
  204. user: user._id,
  205. keterangan: 'Melakukan Perubahan Sanksi',
  206. dokumen: dokumen_id,
  207. data: {
  208. no_sanksi,
  209. // pelanggaran: pelanggaran_id,
  210. sanksi: sanksiBody,
  211. keterangan,
  212. masa_berlaku: {
  213. from_date,
  214. to_date
  215. }
  216. }
  217. })
  218. return response.success(res, {
  219. message: 'Berhasil merubah Sanksi',
  220. data
  221. })
  222. })
  223. exports.updatePt = handleError(async (req, res) => {
  224. const { is_pengajuan_keberatan, is_pengajuan_banding, is_dokumen_perbaikan } = req.body
  225. const { sanksi_id } = req.params
  226. const user = req.user
  227. const isValid = validate(res, req.body, {
  228. is_pengajuan_keberatan: { type: 'boolean', optional: true },
  229. is_pengajuan_banding: { type: 'boolean', optional: true },
  230. is_dokumen_perbaikan: { type: 'boolean', optional: true }
  231. })
  232. if (!isValid) return
  233. const sanksi = await cekSatuDataSanksi(res, user, sanksi_id)
  234. if (!sanksi) return
  235. let keterangan = ''
  236. let last_step = ''
  237. if (is_pengajuan_keberatan == true) {
  238. last_step = 'Permohonan Keberatan'
  239. keterangan = 'Menerima Pengajuan Keberatan'
  240. } else if (is_pengajuan_keberatan == false) {
  241. keterangan = 'Membatalkan Pengajuan Keberatan'
  242. last_step = 'Dokumen Perbaikan'
  243. }
  244. if (is_pengajuan_banding == true) {
  245. last_step = 'Permohonan Banding'
  246. keterangan = 'Menerima Pengajuan Banding'
  247. } else if (is_pengajuan_banding == false) {
  248. keterangan = 'Membatalkan Pengajuan Banding'
  249. last_step = 'Dokumen Perbaikan'
  250. }
  251. await pemantauanModel.create({
  252. laporan: sanksi.laporan._id,
  253. sanksi: sanksi._id,
  254. action: 'UPDATE SANKSI',
  255. pt_id: sanksi.laporan.pt.id,
  256. user: user._id,
  257. keterangan
  258. })
  259. if (is_dokumen_perbaikan == true) {
  260. last_step = 'Dokumen Perbaikan'
  261. }
  262. await sanksiModel.updateOne(
  263. { _id: sanksi._id },
  264. { is_pengajuan_keberatan, is_pengajuan_banding, last_step }
  265. )
  266. return response.success(res, {
  267. message: 'Berhasil merubah Sanksi'
  268. })
  269. })
  270. exports.getAll = handleError(async (req, res) => {
  271. const user = req.user
  272. const {
  273. keberatan,
  274. jawaban,
  275. banding,
  276. cabutSanksi,
  277. perbaikan,
  278. aktif,
  279. delegasi,
  280. naikSanksi,
  281. turunSanksi,
  282. pengajuan_keberatan,
  283. bypassCabutSanksi
  284. } = req.query
  285. const where = {}
  286. const q = {}
  287. if (aktif && aktif === 'false') {
  288. where.aktif = false
  289. }
  290. if (pengajuan_keberatan === 'true') {
  291. where.is_pengajuan_keberatan = true
  292. }
  293. if (keberatan === 'true') {
  294. where['pengajuan.keberatan'] = { $exists: true, $ne: null }
  295. where.is_pengajuan_keberatan = true
  296. if (jawaban === 'true') {
  297. where['jawaban.keberatan'] = { $exists: true, $ne: null }
  298. }
  299. }
  300. if (banding === 'true') {
  301. where.banding = true
  302. where.is_pengajuan_banding = true
  303. where['pengajuan.keberatan'] = { $exists: true, $ne: null }
  304. where['jawaban.keberatan'] = { $exists: true, $ne: null }
  305. where['pengajuan.banding'] = { $exists: true, $ne: null }
  306. if (jawaban === 'true') {
  307. where['jawaban.banding'] = { $exists: true, $ne: null }
  308. }
  309. }
  310. if (cabutSanksi === 'true') {
  311. where.$or = [
  312. { perbaikan: { $exists: true, $ne: [] } },
  313. { bypass_cabut_sanksi: { $eq: true } }
  314. ]
  315. // where.perbaikan = { $exists: true, $ne: [] }
  316. if (jawaban === 'true') {
  317. where.$or = [
  318. {
  319. perbaikan: { $exists: true, $ne: [] },
  320. 'jawaban.cabut_sanksi': { $exists: true, $ne: null }
  321. },
  322. {
  323. bypass_cabut_sanksi: { $eq: true }
  324. }
  325. ]
  326. // where.$or = where.$or.map(e => ({ ...e, ['pengajuan.cabut_sanksi']: { $exists: true, $ne: null } }))
  327. // where['jawaban.cabut_sanksi'] = { $exists: true, $ne: null }
  328. }
  329. }
  330. if (perbaikan === 'true') {
  331. where.$or = [{
  332. 'jawaban.banding': {
  333. $exists: true,
  334. $ne: null
  335. }
  336. }, { is_pengajuan_keberatan: false }, { is_pengajuan_banding: false }]
  337. }
  338. if (delegasi === 'true') {
  339. where.delegasi = true
  340. }
  341. if (naikSanksi === 'true') {
  342. where['sanksi.level'] = { $in: [1, 2] }
  343. }
  344. if (turunSanksi === 'true') {
  345. where['sanksi.level'] = { $in: [2, 3] }
  346. }
  347. if (bypassCabutSanksi === 'true') {
  348. where.bypass_cabut_sanksi = {
  349. $exists: false,
  350. $eq: null
  351. }
  352. }
  353. const data = await cekBanyakDataSanksi(user, where, q)
  354. return response.success(res, {
  355. message: 'Berhasil ambil data Sanksi',
  356. data
  357. })
  358. })
  359. exports.getOne = handleError(async (req, res) => {
  360. const user = req.user
  361. const { sanksi_id } = req.params
  362. const w = {}
  363. const { banding, aktif, delegasi, all } = req.query
  364. if (banding === 'true') {
  365. w.banding = true
  366. w['pengajuan.keberatan'] = { $exists: true, $ne: null }
  367. w['jawaban.keberatan'] = { $exists: true, $ne: null }
  368. w['pengajuan.banding'] = { $exists: true, $ne: null }
  369. }
  370. if (delegasi === 'true') {
  371. w.delegasi = true
  372. }
  373. if (all === 'true') {
  374. w.all = true
  375. }
  376. if (aktif && aktif === 'false') {
  377. w.aktif = false
  378. }
  379. const sanksi = await cekSatuDataSanksi(res, user, sanksi_id, w)
  380. if (!sanksi) return
  381. return response.success(res, {
  382. message: 'Berhasil ambil satu data Sanksi',
  383. data: sanksi
  384. })
  385. })
  386. exports.editTmt = handleError(async (req, res) => {
  387. const user = req.user
  388. const { id } = req.params
  389. const { from_date, to_date, no_surat } = req.body
  390. const files = req.files
  391. const sanksi = await cekSatuDataSanksi(res, user, id)
  392. if (!sanksi) return
  393. const isValid = validate(res, req.body, {
  394. from_date: { type: 'date', convert: true },
  395. to_date: { type: 'date', convert: true },
  396. no_surat: 'string'
  397. })
  398. if (!isValid) return
  399. if (!files.length) {
  400. return response.error(res, {
  401. message: 'dokumen harus ada'
  402. })
  403. }
  404. const dokumen = await addManyDokumen(files)
  405. const dokumen_id = dokumen.map((e) => e._id)
  406. const data = await sanksiModel.findByIdAndUpdate(sanksi._id, {
  407. masa_berlaku: {
  408. from_date,
  409. to_date
  410. },
  411. 'pengajuan.update_tmt': { no_surat, dokumen: dokumen_id }
  412. })
  413. await pemantauanModel.create({
  414. laporan: sanksi.laporan._id,
  415. user: user._id,
  416. action: 'EDIT TMT',
  417. pt_id: sanksi.laporan.pt.id,
  418. keterangan: 'Mengubah masa berlaku sanksi',
  419. for_public: true
  420. })
  421. return response.success(res, {
  422. message: 'Berhasil update tmt',
  423. data
  424. })
  425. })
  426. exports.addPesertaPleno = handleError(async (req, res) => {
  427. const isValid = validate(res, req.body, {
  428. laporan_id: 'string',
  429. nama: 'string'
  430. })
  431. if (!isValid) return
  432. const { laporan_id, nama } = req.body
  433. const laporan = await laporanModel.findOne({
  434. _id: laporan_id
  435. // sanksi: {
  436. // $eq: null,
  437. // $exists: false
  438. // }
  439. })
  440. if (!laporan) return response.error(res, {
  441. code: 404,
  442. message: 'laporan_id tidak ada'
  443. })
  444. const file = req.file
  445. if (!file) {
  446. return response.error(res, {
  447. message: 'ttd harus ada'
  448. })
  449. }
  450. const dokumen = await addDokumen(file)
  451. await laporanModel.findOneAndUpdate(
  452. { _id: laporan._id },
  453. {
  454. $push: {
  455. peserta_penetapan_sanksi: {
  456. nama,
  457. ttd: dokumen.id
  458. }
  459. }
  460. }
  461. )
  462. return response.success(res, {
  463. message: 'Berhasil tambah peserta pleno'
  464. })
  465. })
  466. exports.removePesertaPleno = handleError(async (req, res) => {
  467. const isValid = validate(res, req.body, {
  468. peserta_id: 'string',
  469. laporan_id: 'string'
  470. })
  471. if (!isValid) return
  472. const user = req.user
  473. const { laporan_id, peserta_id } = req.body
  474. const laporan = await cekSatuDataLaporan(res, user, laporan_id, {
  475. evaluasi: { $exists: true, $ne: [] }
  476. })
  477. if (!laporan) return
  478. await laporanModel.findOneAndUpdate(
  479. { _id: laporan._id },
  480. {
  481. $pull: {
  482. peserta_penetapan_sanksi: {
  483. _id: peserta_id
  484. }
  485. }
  486. }
  487. )
  488. return response.success(res, {
  489. message: 'Berhasil menghapus peserta pleno'
  490. })
  491. })
  492. exports.updateToDokumenPerbaikan = handleError(async (req, res) => {
  493. const isValid = validate(res, req.body, {
  494. sanksi_id: 'string'
  495. })
  496. if (!isValid) return
  497. const { sanksi_id } = req.body
  498. const user = req.user
  499. const sanksi = await cekSatuDataSanksi(res, user, sanksi_id)
  500. await sanksiModel.updateOne({
  501. _id: sanksi._id
  502. }, {
  503. is_pengajuan_keberatan: false,
  504. 'pengajuan.cabut_sanksi': null
  505. })
  506. return response.success(res, {
  507. message: 'Berhasil update data Sanksi ke Dokumen Perbaikan'
  508. })
  509. })