| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 | const handleError = require('../../../utils/v1/handleError')const sanksiModel = require('../../../model/sanksi.model')const { addManyDokumen } = require('../../../utils/dokumenFunction')const { validate } = require('../../../utils/v1/validation')const { cekSatuDataSanksi } = require('../../../utils/v1/cekData')const response = require('../../../utils/responseHandler')const { hariKerja } = require('../../../utils/hariKerja')const pemantauanModel = require('../../../model/pemantauan.model')const { notifWA } = require('../../../utils/v1/notifFunction')const { TEMPLATE_KEBERATAN, KEBERATAN, SUCCESS, DITUTUP } = require('../../../utils/constanta')const kontakModel = require('../../../model/kontak.model')const logModel = require('../../../model/log.model')const laporanModel = require('../../../model/laporan.model')const { capitalize } = require('../../../utils/function')exports.create = handleError(async (req, res) => {  const user = req.user  const { sanksi_id } = req.params  if (!sanksi_id) {    return response.error(res, {      message: 'query sanksi_id harus ada',    })  }  const sanksi = await cekSatuDataSanksi(res, user, sanksi_id, {    is_pengajuan_keberatan: true,  })  if (!sanksi) return  const files = req.files  if (!files?.length) {    return response.error(res, {      message: 'dokumen harus ada',    })  }  const dokumen = await addManyDokumen(files)  const dokumen_id = dokumen.map((e) => e._id)  const data = await sanksiModel.findOneAndUpdate(    {      laporan: sanksi.laporan._id,      _id: sanksi._id,      'pengajuan.keberatan': { $exists: false, $eq: null },    },    {      'pengajuan.keberatan': {        dokumen: dokumen_id,      },      'batas_waktu.jawaban_keberatan': hariKerja(10),    }  )  if (!data) {    return response.error(res, {      message: 'Pengajuan Keberatan sudah ada',    })  }  await laporanModel.findOneAndUpdate({_id: sanksi.laporan._id},{    flag: KEBERATAN,    $push: {      step: KEBERATAN    },  })  await pemantauanModel.create({    laporan: sanksi.laporan._id,    sanksi: sanksi._id,    action: 'ADD KEBERATAN',    user: user._id,    pt_id: sanksi.laporan.pt.id,    keterangan: 'Mengajukan Keberatan',    dokumen: dokumen_id,  })  let contacts = await kontakModel.find()  contacts = contacts.map((e) => e.nama).join(', ')  try {    const notif = await notifWA(TEMPLATE_KEBERATAN, [      { key: '1', value: 'pt', value_text: sanksi.laporan.pt.nama },      {        key: '2',        value: 'pemberi_sanksi',        value_text: `${sanksi.user.nama} - ${sanksi.user.role.nama}`,      },      { key: '3', value: 'no_laporan', value_text: sanksi.laporan.no_laporan },    ])    if (notif[0].status === SUCCESS) {      await logModel.create({        aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Mengajukan Keberatan dari PT ${sanksi.laporan.pt.nama}`,      })    } else {      await logModel.create({        aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Mengajukan Keberatan dari PT ${sanksi.laporan.pt.nama}, Error: ${JSON.stringify(notif)}`,      })    }  } catch (error) {    await logModel.create({      aktivitas: `Server gagal mengirim notif wa kepada ${contacts} untuk Mengajukan Keberatan dari PT ${sanksi.laporan.pt.nama}, Error: ${error.message}`,    })  }  return response.success(res, {    data,    message: 'Berhasil menambah keberatan',  })})exports.createJawaban = handleError(async (req, res) => {  const user = req.user  const { sanksi_id } = req.params  if (!sanksi_id) {    return response.error(res, {      message: 'query sanksi_id harus ada',    })  }  const sanksi = await cekSatuDataSanksi(res, user, sanksi_id)  if (!sanksi) return  const isValid = validate(res, req.body, {    status: 'string',    keterangan: 'string',    no_keberatan: { type: 'string', optional: true },    tanggal_terima_keberatan: { type: 'string', optional: true },    tanggal_surat_keberatan: { type: 'string', optional: true },    tanggal_akhir_banding: { type: 'string', optional: true },  })  if (!isValid) return  const { dokumen: files, dokumen_terima_keberatan } = req.files  let dokumenTerimaKeberatan_id = []  if (dokumen_terima_keberatan?.length) {    const dokumenTerimaKeberatan = await addManyDokumen(dokumen_terima_keberatan)    dokumenTerimaKeberatan_id = dokumenTerimaKeberatan.map((e) => e._id)  }  let dokumen_id = []  if (files?.length) {    const dokumen = await addManyDokumen(files)    dokumen_id = dokumen.map((e) => e._id)  }  const { status, keterangan, tanggal_terima_keberatan, tanggal_surat_keberatan, no_keberatan, tanggal_akhir_banding } = req.body  let value = {    'jawaban.keberatan': {      dokumen_terima_keberatan: dokumenTerimaKeberatan_id,      no_keberatan,      tanggal_terima_keberatan,      tanggal_surat_keberatan,      tanggal_akhir_banding,      status,      keterangan,      dokumen: dokumen_id,    },    'batas_waktu.banding': hariKerja(21),  }  if (status !== capitalize(DITUTUP)) {    value.last_step = 'Jawaban Atas Permohonan Keberatan'  } else {    value.last_step = 'Dokumen Perbaikan'    value.is_pengajuan_banding = false  }  const data = await sanksiModel.findOneAndUpdate(    {      laporan: sanksi.laporan._id,      _id: sanksi._id,      'pengajuan.keberatan': { $exists: true, $ne: null },    },    value  )  if (!data) {    return response.error(res, {      message: 'keberatan tidak ada',    })  }  let message = 'Menjawab Pengajuan Keberatan'  let for_public = true  if (sanksi.jawaban?.keberatan) {    message = 'Mengubah jawaban Pengajuan Keberatan'    for_public = false  }  await pemantauanModel.create({    laporan: sanksi.laporan._id,    sanksi: sanksi._id,    user: user._id,    action: 'ADD KEBERATAN JAWABAN',    jawaban: status,    pt_id: sanksi.laporan.pt.id,    keterangan: message,    dokumen: dokumen_id,    for_public,  })  return response.success(res, {    data,  })})
 |