laporan.controller.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. const axios = require('../utils/axios')
  2. const handleError = require('../utils/handleError')
  3. const response = require('../utils/responseHandler')
  4. const laporanModel = require('../model/laporan.model')
  5. const pelanggaranModel = require('../model/pelanggaran.model')
  6. const pemantauanModel = require('../model/pemantauan.model')
  7. const { validate } = require('../utils/validation')
  8. const { addDokumen, addManyDokumen } = require('../utils/dokumenFunction')
  9. const userModel = require('../model/user.model')
  10. const { cekSatuDataLaporan, cekBanyakDataLaporan } = require('../utils/cekData')
  11. exports.create = handleError(async (req, res) => {
  12. const isValid = validate(res, req.body, {
  13. no_laporan: 'string',
  14. pt_id: 'string',
  15. pelanggaran_id: 'string',
  16. keterangan: 'string',
  17. })
  18. if (!isValid) return
  19. const { no_laporan, pt_id, keterangan } = req.body
  20. let { pelanggaran_id } = req.body
  21. const pt = await axios.get(
  22. `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`
  23. )
  24. if (!pt)
  25. return response.error(res, {
  26. message: 'pt_id tidak ditemukan',
  27. })
  28. const files = req.files
  29. let dokumen_id = []
  30. if (files.length) {
  31. const dokumen = await addManyDokumen(files)
  32. dokumen_id = dokumen.map((e) => e._id)
  33. }
  34. pelanggaran_id = pelanggaran_id.split(',')
  35. const pelanggaran = await pelanggaranModel.find({
  36. _id: {
  37. $in: pelanggaran_id,
  38. },
  39. })
  40. if (!pelanggaran.length)
  41. return response.error(res, { message: 'pelanggaran_id tidak ada' })
  42. const user = req.user
  43. let data = {
  44. no_laporan,
  45. user: user._id,
  46. dokumen: dokumen_id,
  47. pt: pt[0],
  48. pelanggaran: pelanggaran_id,
  49. keterangan,
  50. role_data: user.role.id === 2020 ? 'dikti' : 'lldikti',
  51. }
  52. data = await laporanModel.create(data)
  53. await pemantauanModel.create({
  54. laporan: data._id,
  55. pt_id: pt[0].id,
  56. user: user._id,
  57. keterangan: 'Membuat Laporan',
  58. dokumen: dokumen_id,
  59. for_pt: false,
  60. })
  61. return response.success(res, {
  62. message: 'Berhasil menambah laporan',
  63. data,
  64. })
  65. })
  66. exports.public = handleError(async (req, res) => {
  67. const isValid = validate(res, req.body, {
  68. nama: 'string',
  69. email: 'email',
  70. alamat: 'string',
  71. no_hp: 'string',
  72. no_laporan: 'string',
  73. pt_id: 'string',
  74. pelanggaran_id: 'string',
  75. keterangan: 'string',
  76. is_private: { type: 'string', enum: ['true', 'false'] },
  77. })
  78. if (!isValid) return
  79. const {
  80. no_laporan,
  81. pt_id,
  82. keterangan,
  83. nama,
  84. email,
  85. alamat,
  86. no_hp,
  87. is_private,
  88. } = req.body
  89. let { pelanggaran_id } = req.body
  90. const pt = await axios.get(
  91. `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`
  92. )
  93. if (!pt) {
  94. return response.error(res, {
  95. message: 'pt_id tidak ditemukan',
  96. })
  97. }
  98. const { dokumen, foto } = req.files
  99. if (!foto.length) {
  100. return response.error(res, {
  101. message: 'foto harus ada',
  102. })
  103. }
  104. const foto_id = await addDokumen(foto[0])
  105. const user = await userModel.create({
  106. nama,
  107. email,
  108. no_hp,
  109. alamat,
  110. isPublic: true,
  111. isPrivate: is_private === 'true',
  112. foto: foto_id,
  113. })
  114. let dokumen_id = []
  115. if (dokumen?.length) {
  116. const dataDokumen = await addManyDokumen(dokumen)
  117. dokumen_id = dataDokumen.map((e) => e._id)
  118. }
  119. pelanggaran_id = pelanggaran_id.split(',')
  120. const pelanggaran = await pelanggaranModel.find({
  121. _id: {
  122. $in: pelanggaran_id,
  123. },
  124. })
  125. if (!pelanggaran.length)
  126. return response.error(res, { message: 'pelanggaran_id tidak ada' })
  127. let data = {
  128. no_laporan,
  129. user: user._id,
  130. dokumen: dokumen_id,
  131. pt: pt[0],
  132. pelanggaran: pelanggaran_id,
  133. keterangan,
  134. role_data: 'dikti',
  135. }
  136. data = await laporanModel.create(data)
  137. await pemantauanModel.create({
  138. laporan: data._id,
  139. pt_id: pt[0].id,
  140. user: user._id,
  141. keterangan: 'Mengajukan Laporan',
  142. dokumen: dokumen_id,
  143. for_pt: false,
  144. })
  145. return response.success(res, {
  146. message: 'Berhasil menambah laporan',
  147. data,
  148. })
  149. })
  150. exports.getAll = handleError(async (req, res) => {
  151. const user = req.user
  152. const where = {}
  153. const { no_laporan, pt_id, jadwal, evaluasi, aktif } = req.query
  154. if (no_laporan) where.no_laporan = no_laporan
  155. if (pt_id) where.pt.id = pt_id
  156. if (aktif) where.aktif = aktif === 'true'
  157. if (jadwal === 'true') {
  158. where.jadwal = {
  159. $exists: true,
  160. $ne: null,
  161. }
  162. } else if (evaluasi === 'true') {
  163. where.evaluasi = {
  164. $exists: true,
  165. $ne: null,
  166. $not: {
  167. $size: 0,
  168. },
  169. }
  170. }
  171. let data = await cekBanyakDataLaporan(user, where)
  172. return response.success(res, {
  173. message: 'Berhasil ambil data laporan',
  174. data,
  175. })
  176. })
  177. exports.getOne = handleError(async (req, res) => {
  178. const { id } = req.params
  179. const user = req.user
  180. const { aktif } = req.query
  181. const where = { }
  182. if (aktif) where.aktif = aktif === 'true'
  183. const data = await cekSatuDataLaporan(res, user, id, where)
  184. if (!data) return
  185. return response.success(res, {
  186. message: 'Berhasil ambil data Laporan',
  187. data,
  188. })
  189. })
  190. exports.update = handleError(async (req, res) => {
  191. const { id } = req.params
  192. const user = req.user
  193. const laporan = await cekSatuDataLaporan(res, user, id)
  194. if (!laporan) return
  195. const isValid = validate(res, req.body, {
  196. change_role: { type: 'string', optional: true, enum: ['true', 'false'] },
  197. aktif: { type: 'string', optional: true, enum: ['true', 'false'] },
  198. })
  199. if (!isValid) return
  200. const data = {}
  201. let keterangan = ''
  202. const { change_role, aktif } = req.body
  203. if (change_role === 'true') {
  204. data.role_data = user.role.id === 2020 ? 'lldikti' : 'dikti'
  205. keterangan = `Delegasi ke ${user.role.id === 2020 ? 'LLDIKTI' : 'DIKTI'}`
  206. if (laporan.jadwal) {
  207. await laporanModel.findByIdAndUpdate(laporan._id, {
  208. $unset: { jadwal: 1 },
  209. })
  210. }
  211. }
  212. if (aktif) {
  213. data.aktif = aktif === 'true'
  214. if (aktif === 'true') {
  215. keterangan = 'Laporan dibuka'
  216. } else {
  217. keterangan = 'Laporan ditutup'
  218. }
  219. }
  220. const update = await laporanModel.findByIdAndUpdate(laporan._id, data)
  221. if (change_role || aktif) {
  222. await pemantauanModel.create({
  223. laporan: laporan._id,
  224. pt_id: laporan.pt.id,
  225. user: user._id,
  226. keterangan,
  227. for_pt: false,
  228. })
  229. }
  230. return response.success(res, {
  231. message: 'Berhasil update laporan',
  232. data: update,
  233. })
  234. })