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': tanggal_akhir_banding, } 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, }) })