From 73f855587f9a93efc495c7777330a1ca1b824274 Mon Sep 17 00:00:00 2001 From: kur0nek-o Date: Sun, 5 May 2024 16:49:46 +0700 Subject: [PATCH] feat: create export detail in anomali gangguan petugas --- .../Anomali/Gangguan/Anomali_LAPPGP_LPP.vue | 15 +- .../Anomali/Gangguan/Anomali_LAPPGP_LPP.ts | 261 +++++++++++++++++- .../Gangguan/doc/Anomali_LAPPGP_LPP.ts | 99 ++++++- .../Gangguan/doc/Anomali_LAPPGP_LPT.ts | 4 +- .../Gangguan/doc/Anomali_LAPPGU_LPT.ts | 4 +- 5 files changed, 374 insertions(+), 9 deletions(-) diff --git a/src/components/Pages/Anomali/Gangguan/Anomali_LAPPGP_LPP.vue b/src/components/Pages/Anomali/Gangguan/Anomali_LAPPGP_LPP.vue index 738e967..79e803e 100755 --- a/src/components/Pages/Anomali/Gangguan/Anomali_LAPPGP_LPP.vue +++ b/src/components/Pages/Anomali/Gangguan/Anomali_LAPPGP_LPP.vue @@ -950,7 +950,10 @@ import { formatWaktu } from '@/components/Form/FiltersType/reference' import { exportToPDF, exportToXLSX, - exportToDOCX + exportToDOCX, + exportDetailToPDF, + exportDetailToXLSX, + exportDetailToDOCX } from '@/report/Anomali/Gangguan/Anomali_LAPPGP_LPP' import { queries, requestGraphQl } from '@/utils/api/api.graphql' import DetailDialog from '@/components/Dialogs/DetailDialog.vue' @@ -1115,7 +1118,15 @@ const onDataSelectionChanged = ({ selectedRowsData }: any) => { } } -const onExportingDetail = (e: any) => {} +const onExportingDetail = (e: any) => { + if (e.format === 'pdf') { + exportDetailToPDF(reportMeta.value, dataSub.value) + } else if (e.format === 'xlsx') { + exportDetailToXLSX(reportMeta.value, e) + } else { + exportDetailToDOCX(reportMeta.value, dataSub.value) + } +} const onDataSubSelectionChanged = ({ selectedRowsData }: any) => { const data = selectedRowsData[0] diff --git a/src/report/Anomali/Gangguan/Anomali_LAPPGP_LPP.ts b/src/report/Anomali/Gangguan/Anomali_LAPPGP_LPP.ts index 2be9f01..4243186 100644 --- a/src/report/Anomali/Gangguan/Anomali_LAPPGP_LPP.ts +++ b/src/report/Anomali/Gangguan/Anomali_LAPPGP_LPP.ts @@ -3,12 +3,14 @@ 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' -import { exportToWord } from './doc/Anomali_LAPPGP_LPP' +import { exportToWord, exportDetailToWord } from './doc/Anomali_LAPPGP_LPP' const reportName = 'Anomali Penanganan Pengaduan Gangguan Petugas' const fontSize = 5 +const detailFontSize = 3 const formatData = (rawData: any) => { const formattedData: any = [] @@ -242,6 +244,210 @@ const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => } } +const createDetailTableField = (reportMeta: any, rawData: any) => { + const field = ['No', 'UIW/D', 'UP3', 'Rayon', 'Nama Petugas'] + + if (reportMeta.jenisLaporan.name === 'Laporan Berulang Unit') { + field.push( + ...[ + 'No Laporan', + 'No Laporan Lapor Ulang', + 'No Laporan Referensi', + 'Status Induk', + 'Referensi Marking Induk' + ] + ) + } + + if (reportMeta.jenisLaporan.name === 'Laporan Rating Negatif') { + field.push(...['Rating', 'Feedback', 'Ulasan']) + } + + field.push( + ...[ + 'Tgl/Jam Lapor', + 'Tgl/Jam Datang', + 'Tgl/Jam Nyala', + 'Durasi Response Time', + 'Durasi Recovery Time', + 'Durasi Penugasan Regu', + 'Durasi Perjalanan Regu', + 'Jarak Closing', + 'Dispacth Oleh', + 'IDPEL/NO METER', + 'Nama Pelapor', + 'Alamat Pelapor', + 'No Telp Pelapor', + 'Keterangan Pelapor', + 'Sumber Lapor', + 'Diselesaikan Oleh', + 'Status', + 'Referensi Marking', + 'Kode Gangguan', + 'Jenis Gangguan', + 'Penyebab', + 'Tindakan' + ] + ) + + const rows = rawData.map((item: any, i: any) => { + const data = [ + { content: i + 1, styles: { halign: 'right' } }, + item.nama_uid, + item.nama_up3, + item.nama_ulp, + item.nama_petugas + ] + + if (reportMeta.jenisLaporan.name === 'Laporan Berulang Unit') { + data.push( + ...[ + item.no_laporan, + item.no_laporan_laporulang, + item.no_laporan, + item.status_induk, + item.referensi_marking_induk + ] + ) + } + + if (reportMeta.jenisLaporan.name === 'Laporan Rating Negatif') { + data.push(...[item.rating, item.feedback, item.ulasan]) + } + + data.push( + ...[ + item.waktu_lapor, + item.waktu_response, + item.waktu_recovery, + item.durasi_response_time ? formatWaktu(item.durasi_response_time) : '-', + item.durasi_recovery_time ? formatWaktu(item.durasi_recovery_time) : '-', + item.durasi_dispatch_time ? formatWaktu(item.durasi_dispatch_time) : '-', + item.durasi_perjalanan ? formatWaktu(item.durasi_perjalanan) : '-', + item.distance, + item.dispatch_by, + item.idpel_nometer, + item.nama_pelapor, + item.alamat_pelapor, + item.no_telp_pelapor, + item.keterangan_pelapor, + item.media, + item.diselesaikan_oleh, + item.status_akhir, + item.marking, + item.kode_gangguan, + item.jenis_gangguan, + item.penyebab, + item.tindakan + ] + ) + + return data + }) + + return { field, rows } +} + +const exportDetailToPDF = (reportMeta: any, rawData: any) => { + const day = new Date().toLocaleString('id-ID', { weekday: 'long' }) + const date = new Date().getDate() + const month = new Date().toLocaleString('id-ID', { month: 'long' }) + const year = new Date().getFullYear() + const meta = formatMetaData(reportMeta) + const { field, rows } = createDetailTableField(reportMeta, rawData) + const doc = new jsPDF({ + orientation: 'landscape' + }) + + autoTable(doc, { + head: [['PT. PLN(Persero)']], + styles: { + fontSize: detailFontSize, + cellPadding: 0.1, + textColor: [0, 0, 0], + fontStyle: 'bold' + }, + theme: 'plain', + startY: 10, + margin: 5 + }) + + autoTable(doc, { + head: [ + [`Daftar Detail ${reportName}`.toUpperCase()], + [`PERIODE TANGGAL : ${meta.dateFromFormat} SD TGL ${meta.dateToFormat}`] + ], + styles: { + fontSize: detailFontSize, + cellPadding: 0.1, + textColor: [0, 0, 0], + fontStyle: 'bold', + halign: 'center' + }, + theme: 'plain', + startY: 18, + margin: 5 + }) + + autoTable(doc, { + head: [field], + body: rows, + styles: { + fontSize: detailFontSize, + cellPadding: 1, + lineColor: [0, 0, 0], + lineWidth: 0.1, + cellWidth: 'auto' + }, + rowPageBreak: 'auto', + headStyles: { + fillColor: [192, 192, 192], + textColor: [0, 0, 0], + fontStyle: 'bold', + halign: 'center', + valign: 'middle' + }, + bodyStyles: { + textColor: [0, 0, 0] + }, + didParseCell: function (data) { + if (data.row.section === 'head') { + data.cell.text = data.cell.text.map(function (word: any) { + return word.toUpperCase() + }) + } + }, + startY: 24, + margin: 5 + }) + + autoTable(doc, { + head: [ + [`${day}, ${date}-${month}-${year}`], + [ + { + content: '(.........................................)', + styles: { minCellHeight: 8, valign: 'bottom' } + } + ] + ], + styles: { + fontSize: detailFontSize, + cellPadding: 0.1, + textColor: [0, 0, 0], + fontStyle: 'bold', + halign: 'center' + }, + theme: 'plain', + tableWidth: 50, + margin: { left: 230 } + }) + + doc.save(`Laporan Detail ${reportName}.pdf`, { returnPromise: true }).then(() => { + console.log('pdf berhasil disimpan') + }) +} + const exportToXLSX = (reportMeta: any, e: any) => { const meta = formatMetaData(reportMeta) const workbook = new Workbook() @@ -314,9 +520,60 @@ const exportToXLSX = (reportMeta: any, e: any) => { e.cancel = true } +const exportDetailToXLSX = (reportMeta: any, e: any) => { + const meta = formatMetaData(reportMeta) + const workbook = new Workbook() + const worksheet = workbook.addWorksheet(`Detail ${reportName}`) + + setHeaderStyle(worksheet, 1, 1, 'PT. PLN(Persero)') + setHeaderStyle(worksheet, 3, 1, `Daftar Detail ${reportName}`.toUpperCase(), true) + setHeaderStyle( + worksheet, + 4, + 1, + `PERIODE TANGGAL : ${meta.dateFromFormat} SD TGL ${meta.dateToFormat}`, + true + ) + + worksheet.mergeCells('A1:AC1') + worksheet.mergeCells('A3:AC3') + worksheet.mergeCells('A4:AC4') + + exportToExcel({ + component: e.component, + worksheet, + autoFilterEnabled: true, + topLeftCell: { row: 6, column: 1 }, + loadPanel: { + enabled: false + } + }).then(() => { + workbook.xlsx.writeBuffer().then((buffer: any) => { + saveAs( + new Blob([buffer], { type: 'application/octet-stream' }), + `Laporan Detail ${reportName}.xlsx` + ) + }) + }) + + e.cancel = true +} + const exportToDOCX = (reportMeta: any, rawData: any) => { const meta = formatMetaData(reportMeta) exportToWord(reportMeta, meta, formatData(rawData), reportName) } -export { exportToPDF, exportToXLSX, exportToDOCX } +const exportDetailToDOCX = (reportMeta: any, rawData: any) => { + const meta = formatMetaData(reportMeta) + exportDetailToWord(meta, createDetailTableField(reportMeta, rawData), reportName) +} + +export { + exportToPDF, + exportToXLSX, + exportToDOCX, + exportDetailToPDF, + exportDetailToXLSX, + exportDetailToDOCX +} diff --git a/src/report/Anomali/Gangguan/doc/Anomali_LAPPGP_LPP.ts b/src/report/Anomali/Gangguan/doc/Anomali_LAPPGP_LPP.ts index d82986c..7c4d9fe 100644 --- a/src/report/Anomali/Gangguan/doc/Anomali_LAPPGP_LPP.ts +++ b/src/report/Anomali/Gangguan/doc/Anomali_LAPPGP_LPP.ts @@ -35,7 +35,7 @@ export const exportToWord = ( tbody += column } - let preHtml = ` + const preHtml = ` @@ -178,3 +178,100 @@ export const exportToWord = ( downloadLink.click() document.body.removeChild(downloadLink) } + +export const exportDetailToWord = (formattedMeta: any, rawData: any, reportName: String) => { + const day = new Date().toLocaleString('id-ID', { weekday: 'long' }) + const date = new Date().getDate() + const month = new Date().toLocaleString('id-ID', { month: 'long' }) + const year = new Date().getFullYear() + const filename = 'Laporan Detail ' + reportName + '.doc' + + const preHtml = ` + + + + Daftar Detail ${reportName} + + + + ` + + const body = ` +
+
+
PT. PLN(Persero)
+
+ + + + + + + +
${'DAFTAR DETAIL ' + reportName.toUpperCase()}
${`PERIODE TANGGAL : ${formattedMeta.dateFromFormat} SD TGL ${formattedMeta.dateToFormat}`}
+
+ +
+ + + + + ${rawData.field.map((item: any) => ``).join('')} + + + + ${rawData.rows + .map((row: any) => { + return `${row.map((item: any) => ``).join('')}` + }) + .join('')} + +
${item}
${item.content || item}
+
+
+

${day}, ${date}-${month}-${year}

+
+

(.........................................)

+
+
+ ` + + const postHtml = '' + const html = preHtml + body + postHtml + const url = 'data:application/vnd.ms-word;charset=utf-8,' + encodeURIComponent(html) + const downloadLink = document.createElement('a') + + document.body.appendChild(downloadLink) + downloadLink.href = url + downloadLink.download = filename + downloadLink.click() + document.body.removeChild(downloadLink) +} diff --git a/src/report/Anomali/Gangguan/doc/Anomali_LAPPGP_LPT.ts b/src/report/Anomali/Gangguan/doc/Anomali_LAPPGP_LPT.ts index 6029d9e..bbcecb6 100644 --- a/src/report/Anomali/Gangguan/doc/Anomali_LAPPGP_LPT.ts +++ b/src/report/Anomali/Gangguan/doc/Anomali_LAPPGP_LPT.ts @@ -27,7 +27,7 @@ export const exportToWord = ( } i === 0 - ? (column += `${content.content || content}`) + ? (column += `${content.content || content}`) : (column += `${content}`) } @@ -35,7 +35,7 @@ export const exportToWord = ( tbody += column } - let preHtml = ` + const preHtml = ` diff --git a/src/report/Anomali/Gangguan/doc/Anomali_LAPPGU_LPT.ts b/src/report/Anomali/Gangguan/doc/Anomali_LAPPGU_LPT.ts index 00639f7..95676dd 100644 --- a/src/report/Anomali/Gangguan/doc/Anomali_LAPPGU_LPT.ts +++ b/src/report/Anomali/Gangguan/doc/Anomali_LAPPGU_LPT.ts @@ -37,7 +37,7 @@ export const exportToWord = ( tbody += column } - let preHtml = ` + const preHtml = ` @@ -209,7 +209,7 @@ export const exportDetailToWord = (formattedMeta: any, rawData: any, reportName: const year = new Date().getFullYear() const filename = 'Laporan Detail ' + reportName + '.doc' - let preHtml = ` + const preHtml = `