sanksi.controller.js 10 KB

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