cekData.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. const laporanModel = require('../../model/laporan.model')
  2. const pelanggaranModel = require('../../model/pelanggaran.model')
  3. const sanksiModel = require('../../model/sanksi.model')
  4. const response = require('../responseHandler')
  5. const { DIKTI, LLDIKTI, PTB_DIKTI, PTB_LLDIKTI, PTB_PT } = require('../constanta')
  6. exports.cekSatuDataLaporan = async (
  7. res,
  8. user,
  9. laporan_id,
  10. where = { delegasi: false, aktif: true }
  11. ) => {
  12. let w = { _id: laporan_id, ...where }
  13. switch (user.role.id) {
  14. case PTB_DIKTI:
  15. if (where.all) {
  16. break
  17. } else if (!where.delegasi) {
  18. w.role_data = DIKTI
  19. } else {
  20. w.role_data = LLDIKTI
  21. w.role_asal = DIKTI
  22. }
  23. break
  24. case PTB_LLDIKTI:
  25. if (where.all) {
  26. w.role_asal = LLDIKTI
  27. w['pt.pembina.id'] = user.lembaga.id
  28. } else if (!where.delegasi) {
  29. w.role_data = LLDIKTI
  30. w['pt.pembina.id'] = user.lembaga.id
  31. } else {
  32. w.role_asal = LLDIKTI
  33. w.role_data = DIKTI
  34. w['pt.pembina.id'] = user.lembaga.id
  35. }
  36. break
  37. case PTB_PT:
  38. w['pt.id'] = user.lembaga.id
  39. break
  40. }
  41. if (where.normal) w = { _id: laporan_id }
  42. const laporan = await laporanModel
  43. .findOne(w)
  44. .populate({ path: 'user', populate: 'foto' })
  45. .populate({ path: 'pelanggaran', select: 'pelanggaran' })
  46. .populate({ path: 'sanksi', populate: ['pelanggaran'] })
  47. .populate('dokumen')
  48. .populate('peserta_penetapan_sanksi.ttd')
  49. .populate({ path: 'evaluasi', populate: ['user', 'dokumen'] })
  50. .populate('tuntas.dokumen')
  51. if (!laporan) {
  52. response.error(res, {
  53. message: 'laporan_id tidak ada',
  54. code: 404,
  55. })
  56. return false
  57. }
  58. return laporan
  59. }
  60. exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }, options = {}) => {
  61. const w = { ...where }
  62. if (where.aktif !== 'empty') w.aktif = where.aktif || true
  63. else delete w.aktif
  64. switch (user.role.id) {
  65. case PTB_DIKTI:
  66. if (where.all) break
  67. else if (where.delegasi) {
  68. w.role_data = LLDIKTI
  69. w.role_asal = DIKTI
  70. }
  71. else w.role_data = DIKTI
  72. break
  73. case PTB_LLDIKTI:
  74. if (where.all) {
  75. w.role_asal = LLDIKTI
  76. w['pt.pembina.id'] = user.lembaga.id
  77. } else if (!where.delegasi) {
  78. w.role_data = LLDIKTI
  79. w['pt.pembina.id'] = user.lembaga.id
  80. } else {
  81. w.role_asal = LLDIKTI
  82. w.role_data = DIKTI
  83. w['pt.pembina.id'] = user.lembaga.id
  84. }
  85. break
  86. case PTB_PT:
  87. w['pt.id'] = user.lembaga.id
  88. break
  89. }
  90. let laporan = laporanModel
  91. .find(w)
  92. .populate('user')
  93. .populate({ path: 'sanksi', populate: ['pelanggaran'] })
  94. .select(w.select || ' -pelanggaran -dokumen')
  95. .limit(w.limit)
  96. .sort({
  97. createdAt: -1,
  98. })
  99. if (options.lean) laporan = laporan.lean()
  100. return laporan
  101. }
  102. exports.cekSatuDataSanksi = async (
  103. res,
  104. user,
  105. sanksi_id,
  106. where = { banding: false }
  107. ) => {
  108. let w = {}
  109. switch (user.role.id) {
  110. case PTB_DIKTI:
  111. if (where.all) break
  112. else if (where.delegasi) {
  113. w.role_data = LLDIKTI
  114. w.role_asal = DIKTI
  115. } else if (!where.banding) w.role_data = DIKTI
  116. break
  117. case PTB_LLDIKTI:
  118. w['pt.pembina.id'] = user.lembaga.id
  119. if (!where.banding) w.role_data = LLDIKTI
  120. break
  121. case PTB_PT:
  122. w['pt.id'] = user.lembaga.id
  123. break
  124. }
  125. if (where.normal) w = { _id: sanksi_id }
  126. let sanksi = await sanksiModel
  127. .findOne({ _id: sanksi_id, ...where })
  128. .populate({
  129. path: 'laporan',
  130. select: w.select,
  131. match: w,
  132. })
  133. .populate('dokumen')
  134. .populate('berita_acara')
  135. .populate('pelanggaran')
  136. .populate('user')
  137. .populate('dokumen_terima_sanksi')
  138. .populate('pengajuan.keberatan.dokumen')
  139. .populate('jawaban.keberatan.dokumen')
  140. .populate('jawaban.keberatan.dokumen_terima_keberatan')
  141. .populate('pengajuan.banding.dokumen')
  142. .populate('pengajuan.update_tmt.dokumen')
  143. .populate('jawaban.banding.dokumen')
  144. .populate('jawaban.banding.dokumen_terima_banding')
  145. .populate('pengajuan.cabut_sanksi.dokumen')
  146. .populate('pengajuan.cabut_sanksi.dokumen_rekomendasi')
  147. .populate('jawaban.cabut_sanksi.dokumen')
  148. .populate('rekomendasi.dokumen')
  149. .populate('perbaikan.dokumen')
  150. .populate('riwayat_sanksi.dokumen')
  151. .populate('riwayat_sanksi.perbaikan.dokumen')
  152. .populate('riwayat_pengajuan_cabut_sanksi.dokumen')
  153. .populate('riwayat_jawaban_cabut_sanksi.dokumen')
  154. if (!sanksi?.laporan) {
  155. response.error(res, {
  156. message: 'sanksi_id tidak ada',
  157. code: 404,
  158. })
  159. return false
  160. }
  161. return sanksi
  162. }
  163. exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => {
  164. const w = { ...q }
  165. switch (user.role.id) {
  166. case 2020:
  167. if (where.all) break
  168. else if (where.delegasi) {
  169. w.role_data = LLDIKTI
  170. w.role_asal = DIKTI
  171. } else if (where.banding)
  172. w.level_sanksi = {
  173. $in: [2, 3],
  174. }
  175. else w.role_data = DIKTI
  176. break
  177. case 2021:
  178. w['pt.pembina.id'] = user.lembaga.id
  179. if (where.banding) w.level_sanksi = 1
  180. else w.role_data = LLDIKTI
  181. break
  182. case 2022:
  183. w['pt.id'] = user.lembaga.id
  184. where['masa_berlaku.from_date'] = {
  185. $exists: true,
  186. $ne: null,
  187. $lte: new Date()
  188. }
  189. break
  190. }
  191. let data = await sanksiModel
  192. .find({ ...where })
  193. .populate({
  194. path: 'laporan',
  195. select: w.select || '-sanksi',
  196. match: w,
  197. populate: ['pelanggaran'],
  198. })
  199. .populate('user')
  200. .populate('pelanggaran')
  201. .populate('riwayat_sanksi.dokumen')
  202. .select('-dokumen')
  203. .sort({
  204. createdAt: -1,
  205. })
  206. data = data.filter((e) => {
  207. if (where.banding) {
  208. switch (user.role.id) {
  209. case PTB_DIKTI:
  210. return e.pelanggaran.some(e2 => e2.level_sanksi !== 1) && e.laporan !== null
  211. case PTB_LLDIKTI:
  212. return e.pelanggaran.filter(e2 => e2.level_sanksi === 1).length === e.pelanggaran.length && e.laporan !== null
  213. default:
  214. return true
  215. }
  216. }
  217. return e.laporan !== null
  218. })
  219. return data
  220. }
  221. exports.cekBanyakDataDokumen = async (res, files) => {
  222. if (!files.length) {
  223. response.error(res, {
  224. message: 'dokumen harus ada',
  225. })
  226. return false
  227. }
  228. const dokumen = await addManyDokumen(files)
  229. return dokumen.map((e) => e._id)
  230. }
  231. exports.cekBanyakDataPelanggaran = async (res, pelanggaran_id) => {
  232. id_pelanggaran = pelanggaran_id.split(',')
  233. const pelanggaran = await pelanggaranModel.find({
  234. _id: {
  235. $in: id_pelanggaran,
  236. },
  237. })
  238. if (!pelanggaran.length) {
  239. response.error(res, { message: 'pelanggaran_id tidak ada' })
  240. return false
  241. }
  242. return pelanggaran.map((e) => e._id)
  243. }
  244. exports.dataLaporanAggregate = (user, where, aggregate) => {
  245. const w = { ...where }
  246. switch (user.role.id) {
  247. case PTB_DIKTI:
  248. w.$or = [{ role_asal: DIKTI }, { role_data: DIKTI }]
  249. break
  250. case PTB_LLDIKTI:
  251. w.$or = [{ role_asal: LLDIKTI }, { role_data: LLDIKTI }]
  252. w['pt.pembina.id'] = user.lembaga.id
  253. break
  254. }
  255. return laporanModel.aggregate([
  256. { $match: w },
  257. { $group: aggregate },
  258. {
  259. $sort: {
  260. '_id.bulan': 1,
  261. },
  262. },
  263. ])
  264. }