import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter' import { Document, AlignmentType, Packer, Paragraph, Table, TableCell, TableRow, VerticalAlign, TextRun, WidthType, PageOrientation } from 'docx' import { saveAs } from 'file-saver' import { jsPDF } from 'jspdf' import autoTable from 'jspdf-autotable' import { Workbook } from 'exceljs' import { formatWaktu } from '@/components/Form/FiltersType/reference' import { setHeaderStyle } from '@/report/utils/xlsx' import { formatNumber, formatPercentage } from '@/utils/numbers' const reportName = 'Rekapitulasi Gangguan Jenis Gangguan' const groupingData = (data: any) => { const groupedData: any = {} data.forEach((item: any) => { const { sub_kelompok } = item if (!groupedData[sub_kelompok]) { groupedData[sub_kelompok] = [] } groupedData[sub_kelompok].push(item) }) return groupedData } const formatData = (rawData: any) => { const data = groupingData(rawData) const formattedData: any = [] const grandTotal: any = { total_laporan: 0, total_laporan_sudah_selesai: 0, total_laporan_belum_selesai: 0, total_response_time_total: 0, total_response_time_rata_rata: [], total_response_time_max: [], total_response_time_min: [], total_response_time_lebih_sla: 0, total_response_time_kurang_sla: 0, total_recovery_time_total: 0, total_recovery_time_rata_rata: [], total_recovery_time_max: [], total_recovery_time_min: [], total_recovery_time_lebih_sla: 0, total_recovery_time_kurang_sla: 0 } for (const sub_kelompok of data) { const total: any = { total_laporan: 0, total_laporan_sudah_selesai: 0, total_laporan_belum_selesai: 0, total_response_time_total: 0, total_response_time_rata_rata: [], total_response_time_max: [], total_response_time_min: [], total_response_time_lebih_sla: 0, total_response_time_kurang_sla: 0, total_recovery_time_total: 0, total_recovery_time_rata_rata: [], total_recovery_time_max: [], total_recovery_time_min: [], total_recovery_time_lebih_sla: 0, total_recovery_time_kurang_sla: 0 } formattedData.push([ { content: `${sub_kelompok} (${data[sub_kelompok][0].nama_sub_kelompok})`, colSpan: 20, styles: { fontStyle: 'bold' } } ]) for (let i = 0; i < data[sub_kelompok].length; i++) { formattedData.push([ { content: i + 1, styles: { halign: 'right' } }, data[sub_kelompok][i].kode, data[sub_kelompok][i].jenisGangguan, formatNumber(data[sub_kelompok][i].laporan.total), formatNumber(data[sub_kelompok][i].laporan.sudahSelesai.jml), formatPercentage( !data[sub_kelompok][i].laporan.sudahSelesai.jml || !data[sub_kelompok][i].laporan.total ? '0%' : (data[sub_kelompok][i].laporan.sudahSelesai.jml / data[sub_kelompok][i].laporan.total) * 100 ), formatNumber(data[sub_kelompok][i].laporan.belumSelesai.jml), formatPercentage( !data[sub_kelompok][i].laporan.belumSelesai.jml || !data[sub_kelompok][i].laporan.total ? '0%' : (data[sub_kelompok][i].laporan.belumSelesai.jml / data[sub_kelompok][i].laporan.total) * 100 ), formatNumber(data[sub_kelompok][i].responseTime.menit.total), formatNumber(data[sub_kelompok][i].responseTime.menit.rataRata), formatWaktu(data[sub_kelompok][i].responseTime.menit.max), formatWaktu(data[sub_kelompok][i].responseTime.menit.min), formatNumber(data[sub_kelompok][i].responseTime.laporan.lebihSla), formatNumber(data[sub_kelompok][i].responseTime.laporan.kurangSla), formatNumber(data[sub_kelompok][i].recoveryTime.menit.total), formatNumber(data[sub_kelompok][i].recoveryTime.menit.rataRata), formatWaktu(data[sub_kelompok][i].recoveryTime.menit.max), formatWaktu(data[sub_kelompok][i].recoveryTime.menit.min), formatNumber(data[sub_kelompok][i].recoveryTime.laporan.lebihSla), formatNumber(data[sub_kelompok][i].recoveryTime.laporan.kurangSla) ]) total.total_laporan += data[sub_kelompok][i].laporan.total total.total_laporan_sudah_selesai += data[sub_kelompok][i].laporan.sudahSelesai.jml total.total_laporan_belum_selesai += data[sub_kelompok][i].laporan.belumSelesai.jml total.total_response_time_total += data[sub_kelompok][i].responseTime.menit.total total.total_response_time_rata_rata.push(data[sub_kelompok][i].responseTime.menit.rataRata) total.total_response_time_max.push(data[sub_kelompok][i].responseTime.menit.max) total.total_response_time_min.push(data[sub_kelompok][i].responseTime.menit.min) total.total_response_time_lebih_sla += data[sub_kelompok][i].responseTime.laporan.lebihSla total.total_response_time_kurang_sla += data[sub_kelompok][i].responseTime.laporan.kurangSla total.total_recovery_time_total += data[sub_kelompok][i].recoveryTime.menit.total total.total_recovery_time_rata_rata.push(data[sub_kelompok][i].recoveryTime.menit.rataRata) total.total_recovery_time_max.push(data[sub_kelompok][i].recoveryTime.menit.max) total.total_recovery_time_min.push(data[sub_kelompok][i].recoveryTime.menit.min) total.total_recovery_time_lebih_sla += data[sub_kelompok][i].recoveryTime.laporan.lebihSla total.total_recovery_time_kurang_sla += data[sub_kelompok][i].recoveryTime.laporan.kurangSla grandTotal.total_laporan_sudah_selesai += data[sub_kelompok][i].laporan.sudahSelesai.jml grandTotal.total_laporan += data[sub_kelompok][i].laporan.total grandTotal.total_laporan_belum_selesai += data[sub_kelompok][i].laporan.belumSelesai.jml grandTotal.total_response_time_total += data[sub_kelompok][i].responseTime.menit.total grandTotal.total_response_time_rata_rata.push( data[sub_kelompok][i].responseTime.menit.rataRata ) grandTotal.total_response_time_max.push(data[sub_kelompok][i].responseTime.menit.max) grandTotal.total_response_time_min.push(data[sub_kelompok][i].responseTime.menit.min) grandTotal.total_response_time_lebih_sla += data[sub_kelompok][i].responseTime.laporan.lebihSla grandTotal.total_response_time_kurang_sla += data[sub_kelompok][i].responseTime.laporan.kurangSla grandTotal.total_recovery_time_total += data[sub_kelompok][i].recoveryTime.menit.total grandTotal.total_recovery_time_rata_rata.push( data[sub_kelompok][i].recoveryTime.menit.rataRata ) grandTotal.total_recovery_time_max.push(data[sub_kelompok][i].recoveryTime.menit.max) grandTotal.total_recovery_time_min.push(data[sub_kelompok][i].recoveryTime.menit.min) grandTotal.total_recovery_time_lebih_sla += data[sub_kelompok][i].recoveryTime.laporan.lebihSla grandTotal.total_recovery_time_kurang_sla += data[sub_kelompok][i].recoveryTime.laporan.kurangSla } formattedData.push([ { content: 'TOTAL', colSpan: 3, styles: { fontStyle: 'bold' } }, formatNumber(total.total_laporan), formatNumber(total.total_laporan_sudah_selesai), formatPercentage( !total.total_laporan_sudah_selesai || !total.total_laporan ? '0%' : (total.total_laporan_sudah_selesai / total.total_laporan) * 100 ), formatNumber(total.total_laporan_belum_selesai), formatPercentage( !total.total_laporan_belum_selesai || !total.total_laporan ? '0%' : (total.total_laporan_belum_selesai / total.total_laporan) * 100 ), formatNumber(total.total_response_time_total), formatNumber( total.total_response_time_rata_rata.length ? total.total_response_time_rata_rata.reduce((a: any, b: any) => a + b) / total.total_response_time_rata_rata.length : 0 ), formatWaktu(Math.max(...total.total_response_time_max)), formatWaktu(Math.min(...total.total_response_time_min)), formatNumber(total.total_response_time_lebih_sla), formatNumber(total.total_response_time_kurang_sla), formatNumber(total.total_recovery_time_total), formatNumber( total.total_recovery_time_rata_rata.length ? total.total_recovery_time_rata_rata.reduce((a: any, b: any) => a + b) / total.total_recovery_time_rata_rata.length : 0 ), formatWaktu(Math.max(...total.total_recovery_time_max)), formatWaktu(Math.min(...total.total_recovery_time_min)), formatNumber(total.total_recovery_time_lebih_sla), formatNumber(total.total_recovery_time_kurang_sla) ]) } formattedData.push([ { content: 'GRAND TOTAL', colSpan: 3, styles: { fontStyle: 'bold' } }, formatNumber(grandTotal.total_laporan), formatNumber(grandTotal.total_laporan_sudah_selesai), formatPercentage( !grandTotal.total_laporan_sudah_selesai || !grandTotal.total_laporan ? '0%' : (grandTotal.total_laporan_sudah_selesai / grandTotal.total_laporan) * 100 ), formatNumber(grandTotal.total_laporan_belum_selesai), formatPercentage( !grandTotal.total_laporan_belum_selesai || !grandTotal.total_laporan ? '0%' : (grandTotal.total_laporan_belum_selesai / grandTotal.total_laporan) * 100 ), formatNumber(grandTotal.total_response_time_total), formatNumber( grandTotal.total_response_time_rata_rata.length ? grandTotal.total_response_time_rata_rata.reduce((a: any, b: any) => a + b) / grandTotal.total_response_time_rata_rata.length : 0 ), formatWaktu(Math.max(...grandTotal.total_response_time_max)), formatWaktu(Math.min(...grandTotal.total_response_time_min)), formatNumber(grandTotal.total_response_time_lebih_sla), formatNumber(grandTotal.total_response_time_kurang_sla), formatNumber(grandTotal.total_recovery_time_total), formatNumber( grandTotal.total_recovery_time_rata_rata.length ? grandTotal.total_recovery_time_rata_rata.reduce((a: any, b: any) => a + b) / grandTotal.total_recovery_time_rata_rata.length : 0 ), formatWaktu(Math.max(...grandTotal.total_recovery_time_max)), formatWaktu(Math.min(...grandTotal.total_recovery_time_min)), formatNumber(grandTotal.total_recovery_time_lebih_sla), formatNumber(grandTotal.total_recovery_time_kurang_sla) ]) return formattedData } const formatMetaData = (reportMeta: any) => { const periode = reportMeta.periode ? reportMeta.periode.split(' s/d ') : '' let dateFromFormat = '' let dateToFormat = '' let dayTo = '' if (periode != '') { const dateFrom = new Date(periode[0].split('-').reverse().join('-')) const dateTo = new Date(periode[1].split('-').reverse().join('-')) dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', { month: 'long' })}-${dateFrom.getFullYear()}` dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', { month: 'long' })}-${dateTo.getFullYear()}` dayTo = dateTo.toLocaleString('default', { weekday: 'long' }) } return { dateFromFormat, dateToFormat, dayTo } } const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => { const data = formatData(rawData) console.log(data) const meta = formatMetaData(reportMeta) const doc = new jsPDF({ orientation: 'landscape' }) const fontSize = 5 autoTable(doc, { head: [ ['PT. PLN(Persero)', '', ''], [ { content: 'UNIT INDUK', styles: { cellWidth: 40 } }, { content: ':', styles: { cellWidth: 1 } }, reportMeta.uid ? reportMeta.uid.name.toUpperCase() : 'Semua Unit Induk Distribusi/Wilayah'.toUpperCase() ], [ 'UNIT PELAKSANA PELAYANAN PELANGGAN', ':', reportMeta.up3 ? reportMeta.up3.name.toUpperCase() : 'Semua Unit Pelaksanaan Pelayanan Pelanggan'.toUpperCase() ], [ 'POSKO', ':', reportMeta.posko ? reportMeta.posko.name.toUpperCase() : 'Semua Posko'.toUpperCase() ] ], styles: { fontSize, cellPadding: 0.1, textColor: [0, 0, 0], fontStyle: 'bold' }, theme: 'plain', startY: 10 }) autoTable(doc, { head: [ [`${reportName}`.toUpperCase()], [`PERIODE TANGGAL : ${meta.dateFromFormat} SD TGL ${meta.dateToFormat}`] ], styles: { fontSize, cellPadding: 0.1, textColor: [0, 0, 0], fontStyle: 'bold', halign: 'center' }, theme: 'plain', startY: 23 }) autoTable(doc, { head: [ [ { content: 'No', rowSpan: 3 }, { content: 'Kode', rowSpan: 3 }, { content: 'Jenis Gangguan', rowSpan: 3 }, { content: 'Laporan', colSpan: 5 }, { content: 'Response Time', colSpan: 6 }, { content: 'Recovery Time', colSpan: 6 } ], [ { content: 'Total', rowSpan: 2 }, { content: 'Sudah Selesai', colSpan: 2 }, { content: 'Belum Selesai', colSpan: 2 }, { content: 'Menit', colSpan: 4 }, { content: 'Laporan', colSpan: 2 }, { content: 'Menit', colSpan: 4 }, { content: 'Laporan', colSpan: 2 } ], [ 'Jml', '%', 'Jml', '%', 'Total', 'Rata-Rata', 'Max', 'Min', '>Sla', 'Sla', ' { console.log('pdf berhasil disimpan') }) } } const exportToXLSX = (reportMeta: any, e: any) => { const meta = formatMetaData(reportMeta) const workbook = new Workbook() const worksheet = workbook.addWorksheet(`${reportName}`) setHeaderStyle(worksheet, 1, 1, 'PT. PLN(Persero)') setHeaderStyle( worksheet, 2, 1, `UNIT INDUK : ${ reportMeta.uid ? reportMeta.uid.name.toUpperCase() : 'Semua Unit Induk Distribusi/Wilayah'.toUpperCase() }` ) setHeaderStyle( worksheet, 3, 1, `UNIT PELAKSANA PELAYANAN PELANGGAN : ${ reportMeta.up3 ? reportMeta.up3.name.toUpperCase() : 'Semua Unit Pelaksanaan Pelayanan Pelanggan'.toUpperCase() }` ) setHeaderStyle( worksheet, 4, 1, `POSKO : ${ reportMeta.posko ? reportMeta.posko.name.toUpperCase() : 'Semua Posko'.toUpperCase() }` ) setHeaderStyle(worksheet, 7, 8, `${reportName}`.toUpperCase(), true) setHeaderStyle( worksheet, 8, 8, `PERIODE TANGGAL : ${meta.dateFromFormat} SD TGL ${meta.dateToFormat}`, true ) worksheet.mergeCells('A1:F1') worksheet.mergeCells('A2:F2') worksheet.mergeCells('A3:F3') worksheet.mergeCells('A4:F4') worksheet.mergeCells('H7:J7') worksheet.mergeCells('H8:J8') exportToExcel({ component: e.component, worksheet, autoFilterEnabled: true, topLeftCell: { row: 10, column: 1 }, loadPanel: { enabled: false } }).then(() => { workbook.xlsx.writeBuffer().then((buffer: any) => { saveAs(new Blob([buffer], { type: 'application/octet-stream' }), `Laporan ${reportName}.xlsx`) }) }) e.cancel = true } export { exportToPDF, exportToXLSX }