cekData.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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('jawaban.cabut_sanksi.dokumen')
  147. .populate('rekomendasi.dokumen')
  148. .populate('perbaikan.dokumen')
  149. .populate('riwayat_sanksi.dokumen')
  150. .populate('riwayat_sanksi.perbaikan.dokumen')
  151. if (!sanksi?.laporan) {
  152. response.error(res, {
  153. message: 'sanksi_id tidak ada',
  154. code: 404,
  155. })
  156. return false
  157. }
  158. return sanksi
  159. }
  160. exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => {
  161. const w = { ...q }
  162. switch (user.role.id) {
  163. case 2020:
  164. if (where.all) break
  165. else if (where.delegasi) {
  166. w.role_data = LLDIKTI
  167. w.role_asal = DIKTI
  168. } else if (where.banding)
  169. w.level_sanksi = {
  170. $in: [2, 3],
  171. }
  172. else w.role_data = DIKTI
  173. break
  174. case 2021:
  175. w['pt.pembina.id'] = user.lembaga.id
  176. if (where.banding) w.level_sanksi = 1
  177. else w.role_data = LLDIKTI
  178. break
  179. case 2022:
  180. w['pt.id'] = user.lembaga.id
  181. where['masa_berlaku.from_date'] = {
  182. $exists: true,
  183. $ne: null,
  184. $lte: new Date()
  185. }
  186. break
  187. }
  188. let data = await sanksiModel
  189. .find({ ...where })
  190. .populate({
  191. path: 'laporan',
  192. select: w.select || '-sanksi',
  193. match: w,
  194. populate: ['pelanggaran'],
  195. })
  196. .populate('user')
  197. .populate('pelanggaran')
  198. .populate('riwayat_sanksi.dokumen')
  199. .select('-dokumen')
  200. .sort({
  201. createdAt: -1,
  202. })
  203. data = data.filter((e) => {
  204. if (where.banding) {
  205. switch (user.role.id) {
  206. case PTB_DIKTI:
  207. return e.pelanggaran.some(e2 => e2.level_sanksi !== 1) && e.laporan !== null
  208. case PTB_LLDIKTI:
  209. return e.pelanggaran.filter(e2 => e2.level_sanksi === 1).length === e.pelanggaran.length && e.laporan !== null
  210. default:
  211. return true
  212. }
  213. }
  214. return e.laporan !== null
  215. })
  216. return data
  217. }
  218. exports.cekBanyakDataDokumen = async (res, files) => {
  219. if (!files.length) {
  220. response.error(res, {
  221. message: 'dokumen harus ada',
  222. })
  223. return false
  224. }
  225. const dokumen = await addManyDokumen(files)
  226. return dokumen.map((e) => e._id)
  227. }
  228. exports.cekBanyakDataPelanggaran = async (res, pelanggaran_id) => {
  229. id_pelanggaran = pelanggaran_id.split(',')
  230. const pelanggaran = await pelanggaranModel.find({
  231. _id: {
  232. $in: id_pelanggaran,
  233. },
  234. })
  235. if (!pelanggaran.length) {
  236. response.error(res, { message: 'pelanggaran_id tidak ada' })
  237. return false
  238. }
  239. return pelanggaran.map((e) => e._id)
  240. }
  241. exports.dataLaporanAggregate = (user, where, aggregate) => {
  242. const w = { ...where }
  243. switch (user.role.id) {
  244. case PTB_DIKTI:
  245. w.$or = [{ role_asal: DIKTI }, { role_data: DIKTI }]
  246. break
  247. case PTB_LLDIKTI:
  248. w.$or = [{ role_asal: LLDIKTI }, { role_data: LLDIKTI }]
  249. w['pt.pembina.id'] = user.lembaga.id
  250. break
  251. }
  252. return laporanModel.aggregate([
  253. { $match: w },
  254. { $group: aggregate },
  255. {
  256. $sort: {
  257. '_id.bulan': 1,
  258. },
  259. },
  260. ])
  261. }