const sanksiModel = require('../../model/sanksi.model') const dokumenModel = require('../../model/dokumen.model') const laporanModel = require('../../model/laporan.model') const handleError = require('../../utils/v1/handleError') const response = require('../../utils/responseHandler') const coba = require('../../utils/coba') const migrateDokumenInBackground = async () => { const dokumen = await dokumenModel.find() const BATCH_SIZE = 10 // Proses 10 dokumen per batch const DELAY_MS = 100 // Delay 100ms antar batch if (dokumen?.length) { for (let i = 0; i < dokumen.length; i += BATCH_SIZE) { const batch = dokumen.slice(i, i + BATCH_SIZE) await Promise.all( batch.map(async (e) => { const path = `${coba.decrypt(process.env.W8A1C)}/dokumen/${e.chunk}/${e.judul}` await dokumenModel.findOneAndUpdate( { _id: e._id, }, { path, } ) }) ) // Delay antar batch untuk avoid rate limit if (i + BATCH_SIZE < dokumen.length) { await new Promise((resolve) => setTimeout(resolve, DELAY_MS)) } } } } exports.pengajuan = handleError(async (req, res) => { const [keberatan, banding] = await Promise.all([ (() => sanksiModel.find({ ['pengajuan.keberatan']: { $ne: null, $exists: true }, is_pengajuan_keberatan: { $eq: null, $exists: false }, }))(), (() => sanksiModel.find({ ['jawaban.keberatan']: { $ne: null, $exists: true }, ['pengajuan.banding']: { $ne: null, $exists: true }, is_pengajuan_banding: { $eq: null, $exists: false }, }))(), ]) await Promise.all([ ...keberatan.map(async (e) => { await sanksiModel.findOneAndUpdate( { _id: e._id }, { is_pengajuan_keberatan: true } ) }), ...banding.map(async (e) => { await sanksiModel.findOneAndUpdate( { _id: e._id }, { is_pengajuan_banding: true } ) }), ]) return response.success(res, { message: 'Berhasil migrasi pengajuan', }) }) exports.dokumen = handleError(async (req, res) => { setImmediate(() => { migrateDokumenInBackground().catch((error) => { console.error('Gagal migrasi dokumen di background:', error) }) }) return response.success(res, { message: 'Migrasi dokumen dijalankan di background', }) }) exports.pelanggaranSanksi = handleError(async (req, res) => { const sanksi = await sanksiModel .find({ sanksi: { $eq: [], }, }) .populate('pelanggaran') if (sanksi?.length) await Promise.all( sanksi.map(async (e) => { await sanksiModel.findOneAndUpdate( { _id: e._id, }, { sanksi: e.pelanggaran.map((e2) => ({ label: e2.label_sanksi, description: e2.sanksi, level: e2.level_sanksi, })), } ) }) ) return response.success(res, { message: 'Berhasil migrasi pelanggaran sanksi', }) }) exports.tambahStep = handleError(async (req, res) => { const laporan = await laporanModel.find() await Promise.all( laporan.map((e) => { let step = ['pelaporan'] if (e.jadwal) step.push('penjadwalan') if (e.evaluasi.length) step.push('pemeriksaan') if (e.sanksi) step.push('sanksi') return laporanModel.updateOne({ _id: e._id }, { step }) }) ) const sanksi = await sanksiModel.find() await Promise.all( sanksi.map((e) => { let step = [] if (e.pengajuan?.keberatan) step.push('keberatan') if (e.pengajuan?.banding) step.push('banding') if (e.perbaikan.length) step.push('dokumen_perbaikan') if (e.pengajuan?.cabut_sanksi) step.push('cabut_sanksi') return sanksiModel.updateOne({ _id: e._id }, { step }) }) ) return laporan }) exports.backToSanksi = handleError(async (req, res) => { const sanksi = await sanksiModel.find({ 'masa_berlaku.to_date': { $lte: new Date().toISOString(), }, aktif: false, }) await Promise.all( sanksi.map((e) => sanksiModel.findOneAndUpdate( { _id: e._id }, { aktif: true, 'masa_berlaku.berakhir': true } ) ) ) return sanksi })