sanksi.controller.js 15 KB

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