+
{{
isNumber(data.text)
? data.column.caption == '%'
@@ -522,13 +549,17 @@ const reportMeta = ref({
posko: { id: 0, name: 'Semua Posko' },
periode: ''
})
+const poskoSelected = ref('')
+const setPoskoSelected = (value: string) => {
+ poskoSelected.value = value
+}
const getDetail = async () => {
loadingSubData.value = true
const dateValue = filters.value.periode.split(' s/d ')
const ref = dataSelected.value
- const query = {
+ var query: any = {
dateFrom: dateValue[0]
? dateValue[0].split('-').reverse().join('-')
: new Date().toISOString().slice(0, 10),
@@ -537,8 +568,8 @@ const getDetail = async () => {
: new Date().toISOString().slice(0, 10),
idUid: ref.id_uid,
idUp3: ref.id_up3,
- idPoskoLama: ref.id_posko_lama,
- idPoskoBaru: ref.id_posko_baru
+ idPoskoLama: poskoSelected.value == 'baru' ? 0 : ref.id_posko_baru,
+ idPoskoBaru: poskoSelected.value == 'lama' ? 0 : ref.id_posko_lama
}
await requestGraphQl(queries.gangguan.rekap.gangguanAlihPoskoDetail, query)
@@ -567,8 +598,9 @@ const showDetail = () => {
clearSelection()
dataSub.value = []
dataSubSelected.value = null
- // dialogDetail.value = true
- getDetail()
+ if (poskoSelected.value != '') {
+ getDetail()
+ }
}
const closeDialog = () => {
diff --git a/src/utils/api/api.graphql.ts b/src/utils/api/api.graphql.ts
index b3ba376..98427af 100755
--- a/src/utils/api/api.graphql.ts
+++ b/src/utils/api/api.graphql.ts
@@ -1661,16 +1661,16 @@ export const queries = {
$dateTo: Date!
$idUid: Int!
$idUp3: Int!
- $idPoskoLama: Int!
$idPoskoBaru: Int!
+ $idPoskoLama: Int!
) {
detailGangguanAlihPosko(
dateFrom: $dateFrom
dateTo: $dateTo
idUid: $idUid
idUp3: $idUp3
- idPoskoLama: $idPoskoLama
idPoskoBaru: $idPoskoBaru
+ idPoskoLama: $idPoskoLama
) {
id
nama_regional
From a260bc6cbbc211fac551633e618009264ba7b856 Mon Sep 17 00:00:00 2001
From: kur0nek-o
Date: Tue, 2 Apr 2024 16:22:43 +0700
Subject: [PATCH 08/29] feat: create export pdf and xlsx in rekapitulasi
keluhan per kelompok keluhan
---
.../Rekap/RKeluhan_PerKelompokKeluhan.vue | 65 +-
.../Rekap/RKeluhan_PerKelompokKeluhan.ts | 757 ++++++++++++++++++
2 files changed, 792 insertions(+), 30 deletions(-)
create mode 100644 src/report/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.ts
diff --git a/src/components/Pages/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.vue b/src/components/Pages/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.vue
index a1fad5a..24644c1 100755
--- a/src/components/Pages/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.vue
+++ b/src/components/Pages/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -457,7 +458,7 @@
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
- @exporting="onExporting"
+ @exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -778,7 +779,7 @@ import DetailDialog from '@/components/Dialogs/DetailDialog.vue'
import InputText from '@/components/InputText.vue'
import Filters from '@/components/Form/Filters.vue'
import Type13 from '@/components/Form/FiltersType/Type13.vue'
-import { ref, onMounted, watch } from 'vue'
+import { ref, onMounted } from 'vue'
import { DxDataGrid } from 'devextreme-vue'
import {
DxColumn,
@@ -794,18 +795,18 @@ import {
DxSelection,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { formatWaktu } from '@/components/Form/FiltersType/reference'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX,
+ exportDetailToPDF,
+ exportDetailToXLSX
+} from '@/report/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan'
const client = apolloClient()
provideApolloClient(client)
@@ -824,6 +825,13 @@ const loadingSubData = ref(false)
const agreeToShowDialog = ref(false)
const progressSelected = ref(0)
const isGroupBy = ref(false)
+const reportMeta = ref({
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ periode: '',
+ groupBy: false
+})
const setAgreementDialog = (status: boolean, progress: number) => {
agreeToShowDialog.value = status
@@ -868,6 +876,14 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ uid: uid ? uid : { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: up3 ? up3 : { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: ulp ? ulp : { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ periode: params.periode,
+ groupBy: params.groupBy
+ }
})
.catch((err) => {
console.error(err)
@@ -932,30 +948,19 @@ const showDetail = () => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
+ }
+}
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
+const onExportingDetail = (e: any) => {
+ if (e.format === 'pdf') {
+ exportDetailToPDF(reportMeta.value, dataSub.value)
+ } else if (e.format === 'xlsx') {
+ exportDetailToXLSX(reportMeta.value, e)
+ } else {
}
}
diff --git a/src/report/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.ts b/src/report/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.ts
new file mode 100644
index 0000000..5579129
--- /dev/null
+++ b/src/report/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.ts
@@ -0,0 +1,757 @@
+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 Keluhan Per Kelompok Keluhan'
+const fontSize = 5
+const detailFontSize = 3
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_uid } = item
+
+ if (!groupedData[nama_uid]) {
+ groupedData[nama_uid] = []
+ }
+
+ groupedData[nama_uid].push(item)
+ })
+
+ return groupedData
+}
+
+const formatData = (rawData: any, groupBy: boolean) => {
+ 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
+ }
+
+ if (groupBy) {
+ const data = groupingData(rawData)
+
+ for (const nama_uid in 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: nama_uid, colSpan: 19, styles: { fontStyle: 'bold' } }])
+
+ for (let i = 0; i < data[nama_uid].length; i++) {
+ formattedData.push([
+ { content: i + 1, styles: { halign: 'right' } },
+ data[nama_uid][i].kelompok,
+ formatNumber(data[nama_uid][i].total),
+ formatNumber(data[nama_uid][i].total_selesai),
+ formatPercentage(
+ !data[nama_uid][i].total || !data[nama_uid][i].total_selesai
+ ? '0%'
+ : (data[nama_uid][i].total_selesai / data[nama_uid][i].total) * 100
+ ),
+ formatNumber(data[nama_uid][i].total_inproses),
+ formatPercentage(
+ !data[nama_uid][i].total_inproses || !data[nama_uid][i].total
+ ? '0%'
+ : (data[nama_uid][i].total_inproses / data[nama_uid][i].total) * 100
+ ),
+ formatNumber(data[nama_uid][i].total_durasi_response),
+ formatNumber(data[nama_uid][i].avg_durasi_response),
+ formatWaktu(data[nama_uid][i].max_durasi_response),
+ formatWaktu(data[nama_uid][i].min_durasi_response),
+ formatNumber(data[nama_uid][i].total_diatas_sla_response),
+ formatNumber(data[nama_uid][i].total_dibawah_sla_response),
+ formatNumber(data[nama_uid][i].total_durasi_recovery),
+ formatNumber(data[nama_uid][i].avg_durasi_recovery),
+ formatWaktu(data[nama_uid][i].max_durasi_recovery),
+ formatWaktu(data[nama_uid][i].min_durasi_recovery),
+ formatNumber(data[nama_uid][i].total_diatas_sla_recovery),
+ formatNumber(data[nama_uid][i].total_dibawah_sla_recovery)
+ ])
+
+ total.total_laporan += data[nama_uid][i].total
+ total.total_laporan_sudah_selesai += data[nama_uid][i].total_selesai
+ total.total_laporan_belum_selesai += data[nama_uid][i].total_inproses
+ total.total_response_time_total += data[nama_uid][i].total_durasi_response
+ total.total_response_time_rata_rata.push(data[nama_uid][i].avg_durasi_response)
+ total.total_response_time_max.push(data[nama_uid][i].max_durasi_response)
+ total.total_response_time_min.push(data[nama_uid][i].min_durasi_response)
+ total.total_response_time_lebih_sla += data[nama_uid][i].total_diatas_sla_response
+ total.total_response_time_kurang_sla += data[nama_uid][i].total_dibawah_sla_response
+ total.total_recovery_time_total += data[nama_uid][i].total_durasi_recovery
+ total.total_recovery_time_rata_rata.push(data[nama_uid][i].avg_durasi_recovery)
+ total.total_recovery_time_max.push(data[nama_uid][i].max_durasi_recovery)
+ total.total_recovery_time_min.push(data[nama_uid][i].min_durasi_recovery)
+ total.total_recovery_time_lebih_sla += data[nama_uid][i].total_diatas_sla_recovery
+ total.total_recovery_time_kurang_sla += data[nama_uid][i].total_dibawah_sla_recovery
+
+ grandTotal.total_laporan += data[nama_uid][i].total
+ grandTotal.total_laporan_sudah_selesai += data[nama_uid][i].total_selesai
+ grandTotal.total_laporan_belum_selesai += data[nama_uid][i].total_inproses
+ grandTotal.total_response_time_total += data[nama_uid][i].total_durasi_response
+ grandTotal.total_response_time_rata_rata.push(data[nama_uid][i].avg_durasi_response)
+ grandTotal.total_response_time_max.push(data[nama_uid][i].max_durasi_response)
+ grandTotal.total_response_time_min.push(data[nama_uid][i].min_durasi_response)
+ grandTotal.total_response_time_lebih_sla += data[nama_uid][i].total_diatas_sla_response
+ grandTotal.total_response_time_kurang_sla += data[nama_uid][i].total_dibawah_sla_response
+ grandTotal.total_recovery_time_total += data[nama_uid][i].total_durasi_recovery
+ grandTotal.total_recovery_time_rata_rata.push(data[nama_uid][i].avg_durasi_recovery)
+ grandTotal.total_recovery_time_max.push(data[nama_uid][i].max_durasi_recovery)
+ grandTotal.total_recovery_time_min.push(data[nama_uid][i].min_durasi_recovery)
+ grandTotal.total_recovery_time_lebih_sla += data[nama_uid][i].total_diatas_sla_recovery
+ grandTotal.total_recovery_time_kurang_sla += data[nama_uid][i].total_dibawah_sla_recovery
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(total.total_laporan),
+ formatNumber(total.total_laporan_sudah_selesai),
+ formatPercentage(
+ !total.total_laporan || !total.total_laporan_sudah_selesai
+ ? '0%'
+ : (total.total_laporan_sudah_selesai / total.total_laporan) * 100
+ ),
+ formatNumber(total.total_laporan_belum_selesai),
+ formatPercentage(
+ !total.total_laporan || !total.total_laporan_belum_selesai
+ ? '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)
+ ])
+ }
+ } else {
+ for (let i = 0; i < rawData.length; i++) {
+ formattedData.push([
+ { content: i + 1, styles: { halign: 'right' } },
+ rawData[i].kelompok,
+ formatNumber(rawData[i].total),
+ formatNumber(rawData[i].total_selesai),
+ formatPercentage(
+ !rawData[i].total || !rawData[i].total_selesai
+ ? '0%'
+ : (rawData[i].total_selesai / rawData[i].total) * 100
+ ),
+ formatNumber(rawData[i].total_inproses),
+ formatPercentage(
+ !rawData[i].total_inproses || !rawData[i].total
+ ? '0%'
+ : (rawData[i].total_inproses / rawData[i].total) * 100
+ ),
+ formatNumber(rawData[i].total_durasi_response),
+ formatNumber(rawData[i].avg_durasi_response),
+ formatWaktu(rawData[i].max_durasi_response),
+ formatWaktu(rawData[i].min_durasi_response),
+ formatNumber(rawData[i].total_diatas_sla_response),
+ formatNumber(rawData[i].total_dibawah_sla_response),
+ formatNumber(rawData[i].total_durasi_recovery),
+ formatNumber(rawData[i].avg_durasi_recovery),
+ formatWaktu(rawData[i].max_durasi_recovery),
+ formatWaktu(rawData[i].min_durasi_recovery),
+ formatNumber(rawData[i].total_diatas_sla_recovery),
+ formatNumber(rawData[i].total_dibawah_sla_recovery)
+ ])
+
+ grandTotal.total_laporan += rawData[i].total
+ grandTotal.total_laporan_sudah_selesai += rawData[i].total_selesai
+ grandTotal.total_laporan_belum_selesai += rawData[i].total_inproses
+ grandTotal.total_response_time_total += rawData[i].total_durasi_response
+ grandTotal.total_response_time_rata_rata.push(rawData[i].avg_durasi_response)
+ grandTotal.total_response_time_max.push(rawData[i].max_durasi_response)
+ grandTotal.total_response_time_min.push(rawData[i].min_durasi_response)
+ grandTotal.total_response_time_lebih_sla += rawData[i].total_diatas_sla_response
+ grandTotal.total_response_time_kurang_sla += rawData[i].total_dibawah_sla_response
+ grandTotal.total_recovery_time_total += rawData[i].total
+ grandTotal.total_recovery_time_rata_rata.push(rawData[i].avg_durasi_recovery)
+ grandTotal.total_recovery_time_max.push(rawData[i].max_durasi_recovery)
+ grandTotal.total_recovery_time_min.push(rawData[i].min_durasi_recovery)
+ grandTotal.total_recovery_time_lebih_sla += rawData[i].total_diatas_sla_recovery
+ grandTotal.total_recovery_time_kurang_sla += rawData[i].total_dibawah_sla_recovery
+ }
+ }
+
+ formattedData.push([
+ { content: 'GRAND TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(grandTotal.total_laporan),
+ formatNumber(grandTotal.total_laporan_sudah_selesai),
+ formatPercentage(
+ !grandTotal.total_laporan || !grandTotal.total_laporan_sudah_selesai
+ ? '0%'
+ : (grandTotal.total_laporan_sudah_selesai / grandTotal.total_laporan) * 100
+ ),
+ formatNumber(grandTotal.total_laporan_belum_selesai),
+ formatPercentage(
+ !grandTotal.total_laporan || !grandTotal.total_laporan_belum_selesai
+ ? '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, reportMeta.groupBy)
+ const meta = formatMetaData(reportMeta)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.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: 'Kelompok Keluhan',
+ rowSpan: 3
+ },
+ {
+ content: 'Laporan',
+ colSpan: 5
+ },
+ {
+ content: 'Response Time',
+ colSpan: 6
+ },
+ {
+ content: 'Penyelesaian',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'Total',
+ rowSpan: 2
+ },
+ {
+ content: 'Sudah Selesai',
+ colSpan: 2
+ },
+ {
+ content: 'Belum Selesai',
+ colSpan: 2
+ },
+ {
+ content: 'Hari',
+ colSpan: 4
+ },
+ {
+ content: 'Laporan',
+ colSpan: 2
+ },
+ {
+ content: 'Hari',
+ colSpan: 4
+ },
+ {
+ content: 'Laporan',
+ colSpan: 2
+ }
+ ],
+ [
+ 'Jml',
+ '%',
+ 'Jml',
+ '%',
+ 'Total',
+ 'Rata-Rata',
+ 'Max',
+ 'Min',
+ '>Sla',
+ 'Sla',
+ ' {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportDetailToPDF = (reportMeta: any, rawData: any) => {
+ const meta = formatMetaData(reportMeta)
+ 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: [
+ [
+ 'No',
+ 'No Laporan',
+ 'Tgl Lapor',
+ 'Dalam Proses Bidang',
+ 'Selesai Bidang Unit',
+ 'Durasi Response Time',
+ 'Durasi Recovery Time',
+ 'Status',
+ 'IDPEL/NO METER',
+ 'Nama Pelapor',
+ 'Alamat Pelapor',
+ 'No Telp Pelapor',
+ 'Keterangan Pelapor',
+ 'Rayon',
+ 'Uraian',
+ 'Response Pelanggan'
+ ]
+ ],
+ body: rawData.map((item: any, i: any) => [
+ { content: i + 1, styles: { halign: 'right' } },
+ item.no_laporan,
+ item.waktu_lapor,
+ item.waktu_response,
+ item.waktu_recovery,
+ item.durasi_response_time,
+ item.durasi_recovery_time,
+ item.status_akhir,
+ item.idpel_nometer,
+ item.nama_pelapor,
+ item.alamat_pelapor,
+ item.no_telp_pelapor,
+ item.keterangan_pelapor,
+ item.nama_ulp,
+ item.uraian,
+ item.respon_pelanggan
+ ]),
+ 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',
+ cellWidth: 'wrap',
+ 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: [
+ [`${meta.dayTo}, ${meta.dateToFormat}`],
+ [
+ {
+ 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()
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 6, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(
+ worksheet,
+ 7,
+ 1,
+ `PERIODE TANGGAL : ${meta.dateFromFormat} SD TGL ${meta.dateToFormat}`,
+ true
+ )
+
+ worksheet.mergeCells('A1:S1')
+ worksheet.mergeCells('A2:S2')
+ worksheet.mergeCells('A3:S3')
+ worksheet.mergeCells('A4:S4')
+ worksheet.mergeCells('A6:S6')
+ worksheet.mergeCells('A7:S7')
+
+ exportToExcel({
+ component: e.component,
+ worksheet,
+ autoFilterEnabled: true,
+ topLeftCell: { row: 9, 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
+}
+
+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:P1')
+ worksheet.mergeCells('A3:P3')
+ worksheet.mergeCells('A4:P4')
+
+ 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
+}
+
+export { exportToPDF, exportDetailToPDF, exportToXLSX, exportDetailToXLSX }
From 3aa2540de47d63d6d73f70a41a55037267273059 Mon Sep 17 00:00:00 2001
From: Dede Fuji Abdul
Date: Tue, 2 Apr 2024 16:35:07 +0700
Subject: [PATCH 09/29] Add new fields and update GraphQL queries for
MonalisaKR_KeluhanBelumSelesai.vue
---
.../Rekap/MonalisaKR_KeluhanBelumSelesai.vue | 9 ++--
src/utils/api/api.graphql.ts | 41 +++++++++++++++++++
2 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue
index 05fda30..0ce1eaa 100755
--- a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue
+++ b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue
@@ -286,14 +286,17 @@ const getDetail = async () => {
: new Date().toISOString().slice(0, 10),
idUlp: selected?.id_ulp ? selected?.id_ulp : 0,
idUid: selected?.id_uid ? selected?.id_uid : 0,
- idUp3: selected?.id_up3 ? selected?.id_up3 : 0
+ idUp3: selected?.id_up3 ? selected?.id_up3 : 0,
+ namaRegional: selected?.nama_regional ? selected?.nama_regional : '',
+ bulan: currentMonth.value,
+ tahun: currentYear.value
}
loadingSubData.value = true
- await requestGraphQl(queries.keluhan.rekap.rekapKeluhanAllDetail, query)
+ await requestGraphQl(queries.monalisa.keluhan.rekap.keluhanBelumSelesaiDetail, query)
.then((result) => {
if (result.data.data != undefined) {
- dataSub.value = result.data.data.detailKeluhanAll
+ dataSub.value = result.data.data.detailMonalisaKeluhanBelumSelesai
} else {
dataSub.value = []
}
diff --git a/src/utils/api/api.graphql.ts b/src/utils/api/api.graphql.ts
index 98427af..ee3314e 100755
--- a/src/utils/api/api.graphql.ts
+++ b/src/utils/api/api.graphql.ts
@@ -2505,6 +2505,47 @@ export const queries = {
}
}
`,
+ keluhanBelumSelesaiDetail: gql`
+ query detailMonalisaKeluhanBelumSelesai(
+ $bulan: Int!
+ $tahun: Int!
+ $namaRegional: String!
+ $idUlp: Int!
+ $idUid: Int!
+ $idUp3: Int!
+ ) {
+ detailMonalisaKeluhanBelumSelesai(
+ bulan: $bulan
+ tahun: $tahun
+ namaRegional: $namaRegional
+ idUlp: $idUlp
+ idUid: $idUid
+ idUp3: $idUp3
+ ) {
+ id
+ nama_regional
+ id_uid
+ nama_uid
+ id_up3
+ nama_up3
+ id_ulp
+ nama_ulp
+ id_pelanggan
+ nama_pelanggan
+ nama_pelapor
+ alamat_pelapor
+ no_telp_pelapor
+ keterangan_pelapor
+ penyebab
+ kode_gangguan
+ nama_subissuetype
+ durasi_response_time
+ durasi_recovery_time
+ no_laporan
+ waktu_lapor
+ }
+ }
+ `,
keluhanBelumSelesai: gql`
query monalisaRekapitulasiKeluhanBelumSelesai(
$bulan: Int!
From dc91eb9322f56622e514fd98f8cd2f934e0d37b2 Mon Sep 17 00:00:00 2001
From: kur0nek-o
Date: Tue, 2 Apr 2024 16:38:52 +0700
Subject: [PATCH 10/29] feat: create export pdf and xlsx in rekapitulasi
keluhan per tanggal
---
.../Keluhan/Rekap/RKeluhan_PerTanggal.vue | 65 +-
.../Keluhan/Rekap/RKeluhan_PerTanggal.ts | 757 ++++++++++++++++++
2 files changed, 792 insertions(+), 30 deletions(-)
create mode 100644 src/report/Keluhan/Rekap/RKeluhan_PerTanggal.ts
diff --git a/src/components/Pages/Keluhan/Rekap/RKeluhan_PerTanggal.vue b/src/components/Pages/Keluhan/Rekap/RKeluhan_PerTanggal.vue
index 09b1945..0becdc4 100755
--- a/src/components/Pages/Keluhan/Rekap/RKeluhan_PerTanggal.vue
+++ b/src/components/Pages/Keluhan/Rekap/RKeluhan_PerTanggal.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -459,7 +460,7 @@
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
- @exporting="onExporting"
+ @exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -780,7 +781,7 @@ import DetailDialog from '@/components/Dialogs/DetailDialog.vue'
import InputText from '@/components/InputText.vue'
import Filters from '@/components/Form/Filters.vue'
import Type13 from '@/components/Form/FiltersType/Type13.vue'
-import { ref, onMounted, watch } from 'vue'
+import { ref, onMounted } from 'vue'
import { DxDataGrid } from 'devextreme-vue'
import {
DxColumn,
@@ -796,12 +797,6 @@ import {
DxSelection,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { formatWaktu } from '@/components/Form/FiltersType/reference'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
@@ -809,6 +804,12 @@ import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import { reformatDate } from '@/utils/texts'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX,
+ exportDetailToPDF,
+ exportDetailToXLSX
+} from '@/report/Keluhan/Rekap/RKeluhan_PerTanggal'
const client = apolloClient()
provideApolloClient(client)
@@ -827,6 +828,13 @@ const loadingSubData = ref(false)
const agreeToShowDialog = ref(false)
const progressSelected = ref(0)
const isGroupBy = ref(false)
+const reportMeta = ref({
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ periode: '',
+ groupBy: false
+})
const setAgreementDialog = (status: boolean, progress: number) => {
agreeToShowDialog.value = status
@@ -864,6 +872,14 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ uid: uid ? uid : { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: up3 ? up3 : { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: ulp ? ulp : { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ periode: params.periode,
+ groupBy: params.groupBy
+ }
})
.catch((err) => {
console.error(err)
@@ -930,30 +946,19 @@ const showDetail = () => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
+ }
+}
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
+const onExportingDetail = (e: any) => {
+ if (e.format === 'pdf') {
+ exportDetailToPDF(reportMeta.value, dataSub.value)
+ } else if (e.format === 'xlsx') {
+ exportDetailToXLSX(reportMeta.value, e)
+ } else {
}
}
diff --git a/src/report/Keluhan/Rekap/RKeluhan_PerTanggal.ts b/src/report/Keluhan/Rekap/RKeluhan_PerTanggal.ts
new file mode 100644
index 0000000..10c583d
--- /dev/null
+++ b/src/report/Keluhan/Rekap/RKeluhan_PerTanggal.ts
@@ -0,0 +1,757 @@
+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 Keluhan Per Tanggal'
+const fontSize = 5
+const detailFontSize = 3
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_uid } = item
+
+ if (!groupedData[nama_uid]) {
+ groupedData[nama_uid] = []
+ }
+
+ groupedData[nama_uid].push(item)
+ })
+
+ return groupedData
+}
+
+const formatData = (rawData: any, groupBy: boolean) => {
+ 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
+ }
+
+ if (groupBy) {
+ const data = groupingData(rawData)
+
+ for (const nama_uid in 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: nama_uid, colSpan: 19, styles: { fontStyle: 'bold' } }])
+
+ for (let i = 0; i < data[nama_uid].length; i++) {
+ formattedData.push([
+ { content: i + 1, styles: { halign: 'right' } },
+ data[nama_uid][i].tanggal_lapor,
+ formatNumber(data[nama_uid][i].total),
+ formatNumber(data[nama_uid][i].total_selesai),
+ formatPercentage(
+ !data[nama_uid][i].total || !data[nama_uid][i].total_selesai
+ ? '0%'
+ : (data[nama_uid][i].total_selesai / data[nama_uid][i].total) * 100
+ ),
+ formatNumber(data[nama_uid][i].total_inproses),
+ formatPercentage(
+ !data[nama_uid][i].total_inproses || !data[nama_uid][i].total
+ ? '0%'
+ : (data[nama_uid][i].total_inproses / data[nama_uid][i].total) * 100
+ ),
+ formatNumber(data[nama_uid][i].total_durasi_response),
+ formatNumber(data[nama_uid][i].avg_durasi_response),
+ formatWaktu(data[nama_uid][i].max_durasi_response),
+ formatWaktu(data[nama_uid][i].min_durasi_response),
+ formatNumber(data[nama_uid][i].total_diatas_sla_response),
+ formatNumber(data[nama_uid][i].total_dibawah_sla_response),
+ formatNumber(data[nama_uid][i].total_durasi_recovery),
+ formatNumber(data[nama_uid][i].avg_durasi_recovery),
+ formatWaktu(data[nama_uid][i].max_durasi_recovery),
+ formatWaktu(data[nama_uid][i].min_durasi_recovery),
+ formatNumber(data[nama_uid][i].total_diatas_sla_recovery),
+ formatNumber(data[nama_uid][i].total_dibawah_sla_recovery)
+ ])
+
+ total.total_laporan += data[nama_uid][i].total
+ total.total_laporan_sudah_selesai += data[nama_uid][i].total_selesai
+ total.total_laporan_belum_selesai += data[nama_uid][i].total_inproses
+ total.total_response_time_total += data[nama_uid][i].total_durasi_response
+ total.total_response_time_rata_rata.push(data[nama_uid][i].avg_durasi_response)
+ total.total_response_time_max.push(data[nama_uid][i].max_durasi_response)
+ total.total_response_time_min.push(data[nama_uid][i].min_durasi_response)
+ total.total_response_time_lebih_sla += data[nama_uid][i].total_diatas_sla_response
+ total.total_response_time_kurang_sla += data[nama_uid][i].total_dibawah_sla_response
+ total.total_recovery_time_total += data[nama_uid][i].total_durasi_recovery
+ total.total_recovery_time_rata_rata.push(data[nama_uid][i].avg_durasi_recovery)
+ total.total_recovery_time_max.push(data[nama_uid][i].max_durasi_recovery)
+ total.total_recovery_time_min.push(data[nama_uid][i].min_durasi_recovery)
+ total.total_recovery_time_lebih_sla += data[nama_uid][i].total_diatas_sla_recovery
+ total.total_recovery_time_kurang_sla += data[nama_uid][i].total_dibawah_sla_recovery
+
+ grandTotal.total_laporan += data[nama_uid][i].total
+ grandTotal.total_laporan_sudah_selesai += data[nama_uid][i].total_selesai
+ grandTotal.total_laporan_belum_selesai += data[nama_uid][i].total_inproses
+ grandTotal.total_response_time_total += data[nama_uid][i].total_durasi_response
+ grandTotal.total_response_time_rata_rata.push(data[nama_uid][i].avg_durasi_response)
+ grandTotal.total_response_time_max.push(data[nama_uid][i].max_durasi_response)
+ grandTotal.total_response_time_min.push(data[nama_uid][i].min_durasi_response)
+ grandTotal.total_response_time_lebih_sla += data[nama_uid][i].total_diatas_sla_response
+ grandTotal.total_response_time_kurang_sla += data[nama_uid][i].total_dibawah_sla_response
+ grandTotal.total_recovery_time_total += data[nama_uid][i].total_durasi_recovery
+ grandTotal.total_recovery_time_rata_rata.push(data[nama_uid][i].avg_durasi_recovery)
+ grandTotal.total_recovery_time_max.push(data[nama_uid][i].max_durasi_recovery)
+ grandTotal.total_recovery_time_min.push(data[nama_uid][i].min_durasi_recovery)
+ grandTotal.total_recovery_time_lebih_sla += data[nama_uid][i].total_diatas_sla_recovery
+ grandTotal.total_recovery_time_kurang_sla += data[nama_uid][i].total_dibawah_sla_recovery
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(total.total_laporan),
+ formatNumber(total.total_laporan_sudah_selesai),
+ formatPercentage(
+ !total.total_laporan || !total.total_laporan_sudah_selesai
+ ? '0%'
+ : (total.total_laporan_sudah_selesai / total.total_laporan) * 100
+ ),
+ formatNumber(total.total_laporan_belum_selesai),
+ formatPercentage(
+ !total.total_laporan || !total.total_laporan_belum_selesai
+ ? '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)
+ ])
+ }
+ } else {
+ for (let i = 0; i < rawData.length; i++) {
+ formattedData.push([
+ { content: i + 1, styles: { halign: 'right' } },
+ rawData[i].tanggal_lapor,
+ formatNumber(rawData[i].total),
+ formatNumber(rawData[i].total_selesai),
+ formatPercentage(
+ !rawData[i].total || !rawData[i].total_selesai
+ ? '0%'
+ : (rawData[i].total_selesai / rawData[i].total) * 100
+ ),
+ formatNumber(rawData[i].total_inproses),
+ formatPercentage(
+ !rawData[i].total_inproses || !rawData[i].total
+ ? '0%'
+ : (rawData[i].total_inproses / rawData[i].total) * 100
+ ),
+ formatNumber(rawData[i].total_durasi_response),
+ formatNumber(rawData[i].avg_durasi_response),
+ formatWaktu(rawData[i].max_durasi_response),
+ formatWaktu(rawData[i].min_durasi_response),
+ formatNumber(rawData[i].total_diatas_sla_response),
+ formatNumber(rawData[i].total_dibawah_sla_response),
+ formatNumber(rawData[i].total_durasi_recovery),
+ formatNumber(rawData[i].avg_durasi_recovery),
+ formatWaktu(rawData[i].max_durasi_recovery),
+ formatWaktu(rawData[i].min_durasi_recovery),
+ formatNumber(rawData[i].total_diatas_sla_recovery),
+ formatNumber(rawData[i].total_dibawah_sla_recovery)
+ ])
+
+ grandTotal.total_laporan += rawData[i].total
+ grandTotal.total_laporan_sudah_selesai += rawData[i].total_selesai
+ grandTotal.total_laporan_belum_selesai += rawData[i].total_inproses
+ grandTotal.total_response_time_total += rawData[i].total_durasi_response
+ grandTotal.total_response_time_rata_rata.push(rawData[i].avg_durasi_response)
+ grandTotal.total_response_time_max.push(rawData[i].max_durasi_response)
+ grandTotal.total_response_time_min.push(rawData[i].min_durasi_response)
+ grandTotal.total_response_time_lebih_sla += rawData[i].total_diatas_sla_response
+ grandTotal.total_response_time_kurang_sla += rawData[i].total_dibawah_sla_response
+ grandTotal.total_recovery_time_total += rawData[i].total
+ grandTotal.total_recovery_time_rata_rata.push(rawData[i].avg_durasi_recovery)
+ grandTotal.total_recovery_time_max.push(rawData[i].max_durasi_recovery)
+ grandTotal.total_recovery_time_min.push(rawData[i].min_durasi_recovery)
+ grandTotal.total_recovery_time_lebih_sla += rawData[i].total_diatas_sla_recovery
+ grandTotal.total_recovery_time_kurang_sla += rawData[i].total_dibawah_sla_recovery
+ }
+ }
+
+ formattedData.push([
+ { content: 'GRAND TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(grandTotal.total_laporan),
+ formatNumber(grandTotal.total_laporan_sudah_selesai),
+ formatPercentage(
+ !grandTotal.total_laporan || !grandTotal.total_laporan_sudah_selesai
+ ? '0%'
+ : (grandTotal.total_laporan_sudah_selesai / grandTotal.total_laporan) * 100
+ ),
+ formatNumber(grandTotal.total_laporan_belum_selesai),
+ formatPercentage(
+ !grandTotal.total_laporan || !grandTotal.total_laporan_belum_selesai
+ ? '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, reportMeta.groupBy)
+ const meta = formatMetaData(reportMeta)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.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: 'Tanggal Lapor',
+ rowSpan: 3
+ },
+ {
+ content: 'Laporan',
+ colSpan: 5
+ },
+ {
+ content: 'Response Time',
+ colSpan: 6
+ },
+ {
+ content: 'Penyelesaian',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'Total',
+ rowSpan: 2
+ },
+ {
+ content: 'Sudah Selesai',
+ colSpan: 2
+ },
+ {
+ content: 'Belum Selesai',
+ colSpan: 2
+ },
+ {
+ content: 'Hari',
+ colSpan: 4
+ },
+ {
+ content: 'Laporan',
+ colSpan: 2
+ },
+ {
+ content: 'Hari',
+ colSpan: 4
+ },
+ {
+ content: 'Laporan',
+ colSpan: 2
+ }
+ ],
+ [
+ 'Jml',
+ '%',
+ 'Jml',
+ '%',
+ 'Total',
+ 'Rata-Rata',
+ 'Max',
+ 'Min',
+ '>Sla',
+ 'Sla',
+ ' {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportDetailToPDF = (reportMeta: any, rawData: any) => {
+ const meta = formatMetaData(reportMeta)
+ 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: [
+ [
+ 'No',
+ 'No Laporan',
+ 'Tgl Lapor',
+ 'Dalam Proses Bidang',
+ 'Selesai Bidang Unit',
+ 'Durasi Response Time',
+ 'Durasi Recovery Time',
+ 'Status',
+ 'IDPEL/NO METER',
+ 'Nama Pelapor',
+ 'Alamat Pelapor',
+ 'No Telp Pelapor',
+ 'Keterangan Pelapor',
+ 'Rayon',
+ 'Uraian',
+ 'Response Pelanggan'
+ ]
+ ],
+ body: rawData.map((item: any, i: any) => [
+ { content: i + 1, styles: { halign: 'right' } },
+ item.no_laporan,
+ item.waktu_lapor,
+ item.waktu_response,
+ item.waktu_recovery,
+ item.durasi_response_time,
+ item.durasi_recovery_time,
+ item.status_akhir,
+ item.idpel_nometer,
+ item.nama_pelapor,
+ item.alamat_pelapor,
+ item.no_telp_pelapor,
+ item.keterangan_pelapor,
+ item.nama_ulp,
+ item.uraian,
+ item.respon_pelanggan
+ ]),
+ 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',
+ cellWidth: 'wrap',
+ 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: [
+ [`${meta.dayTo}, ${meta.dateToFormat}`],
+ [
+ {
+ 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()
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 6, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(
+ worksheet,
+ 7,
+ 1,
+ `PERIODE TANGGAL : ${meta.dateFromFormat} SD TGL ${meta.dateToFormat}`,
+ true
+ )
+
+ worksheet.mergeCells('A1:S1')
+ worksheet.mergeCells('A2:S2')
+ worksheet.mergeCells('A3:S3')
+ worksheet.mergeCells('A4:S4')
+ worksheet.mergeCells('A6:S6')
+ worksheet.mergeCells('A7:S7')
+
+ exportToExcel({
+ component: e.component,
+ worksheet,
+ autoFilterEnabled: true,
+ topLeftCell: { row: 9, 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
+}
+
+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:P1')
+ worksheet.mergeCells('A3:P3')
+ worksheet.mergeCells('A4:P4')
+
+ 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
+}
+
+export { exportToPDF, exportDetailToPDF, exportToXLSX, exportDetailToXLSX }
From b3c07d957d70fcfc626191227f63fb5a39d6d420 Mon Sep 17 00:00:00 2001
From: kur0nek-o
Date: Tue, 2 Apr 2024 21:04:25 +0700
Subject: [PATCH 11/29] feat: create export pdf and xlsx in rekapitulasi
keluhan
---
.../Keluhan/Rekap/RKeluhan_BerdasarMedia.vue | 56 +-
.../Pages/Keluhan/Rekap/RKeluhan_PerUnit.vue | 59 +-
.../Keluhan/Rekap/RKeluhan_BerdasarMedia.ts | 529 +++++++++++++
src/report/Keluhan/Rekap/RKeluhan_PerUnit.ts | 696 ++++++++++++++++++
4 files changed, 1282 insertions(+), 58 deletions(-)
create mode 100644 src/report/Keluhan/Rekap/RKeluhan_BerdasarMedia.ts
create mode 100644 src/report/Keluhan/Rekap/RKeluhan_PerUnit.ts
diff --git a/src/components/Pages/Keluhan/Rekap/RKeluhan_BerdasarMedia.vue b/src/components/Pages/Keluhan/Rekap/RKeluhan_BerdasarMedia.vue
index f95fb11..f85c5c4 100755
--- a/src/components/Pages/Keluhan/Rekap/RKeluhan_BerdasarMedia.vue
+++ b/src/components/Pages/Keluhan/Rekap/RKeluhan_BerdasarMedia.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -132,7 +133,7 @@
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
- @exporting="onExporting"
+ @exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -467,18 +468,18 @@ import {
DxSearchPanel,
DxSelection
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { formatWaktu } from '@/components/Form/FiltersType/reference'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX,
+ exportDetailToPDF,
+ exportDetailToXLSX
+} from '@/report/Keluhan/Rekap/RKeluhan_BerdasarMedia'
const client = apolloClient()
provideApolloClient(client)
@@ -495,6 +496,12 @@ const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
const date = ref('2023-02-04')
+const reportMeta = ref({
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ periode: ''
+})
const setDate = (value: any) => {
if (isNumber(value)) {
@@ -539,6 +546,8 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = filters.value
})
.catch((err) => {
console.error(err)
@@ -602,30 +611,19 @@ const showDetail = () => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
+ }
+}
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
+const onExportingDetail = (e: any) => {
+ if (e.format === 'pdf') {
+ exportDetailToPDF(reportMeta.value, dataSub.value)
+ } else if (e.format === 'xlsx') {
+ exportDetailToXLSX(reportMeta.value, e)
+ } else {
}
}
diff --git a/src/components/Pages/Keluhan/Rekap/RKeluhan_PerUnit.vue b/src/components/Pages/Keluhan/Rekap/RKeluhan_PerUnit.vue
index ea90ff1..4f7ae3b 100755
--- a/src/components/Pages/Keluhan/Rekap/RKeluhan_PerUnit.vue
+++ b/src/components/Pages/Keluhan/Rekap/RKeluhan_PerUnit.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -590,7 +591,7 @@
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
- @exporting="onExporting"
+ @exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -927,18 +928,18 @@ import {
DxGroupItem,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { formatWaktu } from '@/components/Form/FiltersType/reference'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX,
+ exportDetailToPDF,
+ exportDetailToXLSX
+} from '@/report/Keluhan/Rekap/RKeluhan_PerUnit'
const client = apolloClient()
provideApolloClient(client)
@@ -956,6 +957,11 @@ const loadingData = ref(false)
const loadingSubData = ref(false)
const agreeToShowDialog = ref(false)
const progressSelected = ref(0)
+const reportMeta = ref({
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ periode: ''
+})
const setAgreementDialog = (status: boolean, progress: number) => {
agreeToShowDialog.value = status
@@ -998,6 +1004,12 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ uid: uid ? uid : { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: up3 ? up3 : { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ periode: params.periode
+ }
})
.catch((err) => {
console.error(err)
@@ -1062,30 +1074,19 @@ const showDetail = () => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
+ }
+}
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
+const onExportingDetail = (e: any) => {
+ if (e.format === 'pdf') {
+ exportDetailToPDF(reportMeta.value, dataSub.value)
+ } else if (e.format === 'xlsx') {
+ exportDetailToXLSX(reportMeta.value, e)
+ } else {
}
}
diff --git a/src/report/Keluhan/Rekap/RKeluhan_BerdasarMedia.ts b/src/report/Keluhan/Rekap/RKeluhan_BerdasarMedia.ts
new file mode 100644
index 0000000..53c9307
--- /dev/null
+++ b/src/report/Keluhan/Rekap/RKeluhan_BerdasarMedia.ts
@@ -0,0 +1,529 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber } from '@/utils/numbers'
+
+const reportName = 'Rekapitulasi Keluhan Berdasarkan Media'
+const fontSize = 5
+const detailFontSize = 5
+
+const formatData = (rawData: any) => {
+ const formattedData: any = []
+ const total: any = {
+ tgl1: 0,
+ tgl2: 0,
+ tgl3: 0,
+ tgl4: 0,
+ tgl5: 0,
+ tgl6: 0,
+ tgl7: 0,
+ tgl8: 0,
+ tgl9: 1,
+ tgl10: 0,
+ tgl11: 0,
+ tgl12: 0,
+ tgl13: 0,
+ tgl14: 0,
+ tgl15: 2,
+ tgl16: 0,
+ tgl17: 0,
+ tgl18: 0,
+ tgl19: 0,
+ tgl20: 0,
+ tgl21: 0,
+ tgl22: 0,
+ tgl23: 0,
+ tgl24: 0,
+ tgl25: 0,
+ tgl26: 0,
+ tgl27: 0,
+ tgl28: 0,
+ tgl29: 0,
+ tgl30: 0,
+ tgl31: 0
+ }
+
+ formattedData.push(
+ ...rawData.map((item: any, i: any) => {
+ for (const key in total) {
+ if (key !== 'total') {
+ total[key] += item[key]
+ }
+ }
+
+ return [
+ { content: ++i, styles: { halign: 'right' } },
+ item.media,
+ formatNumber(item.tgl1),
+ formatNumber(item.tgl2),
+ formatNumber(item.tgl3),
+ formatNumber(item.tgl4),
+ formatNumber(item.tgl5),
+ formatNumber(item.tgl6),
+ formatNumber(item.tgl7),
+ formatNumber(item.tgl8),
+ formatNumber(item.tgl9),
+ formatNumber(item.tgl10),
+ formatNumber(item.tgl11),
+ formatNumber(item.tgl12),
+ formatNumber(item.tgl13),
+ formatNumber(item.tgl14),
+ formatNumber(item.tgl15),
+ formatNumber(item.tgl16),
+ formatNumber(item.tgl17),
+ formatNumber(item.tgl18),
+ formatNumber(item.tgl19),
+ formatNumber(item.tgl20),
+ formatNumber(item.tgl21),
+ formatNumber(item.tgl22),
+ formatNumber(item.tgl23),
+ formatNumber(item.tgl24),
+ formatNumber(item.tgl25),
+ formatNumber(item.tgl26),
+ formatNumber(item.tgl27),
+ formatNumber(item.tgl28),
+ formatNumber(item.tgl29),
+ formatNumber(item.tgl30),
+ formatNumber(item.tgl31)
+ ]
+ })
+ )
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ ...Array.from({ length: 31 }, (_, i) => formatNumber(total[`tgl${i + 1}`]))
+ ])
+
+ 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)
+ const meta = formatMetaData(reportMeta)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.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: 2
+ },
+ {
+ content: 'Nama Media',
+ rowSpan: 2
+ },
+ {
+ content: 'Tanggal',
+ colSpan: 31
+ }
+ ],
+ [...Array.from({ length: 31 }, (_, i) => (i + 1).toString())]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${meta.dayTo}, ${meta.dateToFormat}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportDetailToPDF = (reportMeta: any, rawData: any) => {
+ const meta = formatMetaData(reportMeta)
+ 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: [
+ [
+ 'No',
+ 'No Laporan',
+ 'Tgl Lapor',
+ 'Dalam Proses Bidang',
+ 'Selesai Bidang Unit',
+ 'Durasi Response Time',
+ 'Durasi Recovery Time',
+ 'Status',
+ 'IDPEL/NO METER',
+ 'Nama Pelapor',
+ 'Alamat Pelapor',
+ 'No Telp Pelapor',
+ 'Keterangan Pelapor',
+ 'Rayon',
+ 'Uraian',
+ 'Response Pelanggan'
+ ]
+ ],
+ body: rawData.map((item: any, i: any) => [
+ { content: i + 1, styles: { halign: 'right' } },
+ item.no_laporan,
+ item.waktu_lapor,
+ item.waktu_response,
+ item.waktu_recovery,
+ item.durasi_response_time,
+ item.durasi_recovery_time,
+ item.status_akhir,
+ item.idpel_nometer,
+ item.nama_pelapor,
+ item.alamat_pelapor,
+ item.no_telp_pelapor,
+ item.keterangan_pelapor,
+ item.nama_ulp,
+ item.uraian,
+ item.respon_pelanggan
+ ]),
+ 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',
+ cellWidth: 'wrap',
+ 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: [
+ [`${meta.dayTo}, ${meta.dateToFormat}`],
+ [
+ {
+ 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()
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 6, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(
+ worksheet,
+ 7,
+ 1,
+ `PERIODE TANGGAL : ${meta.dateFromFormat} SD TGL ${meta.dateToFormat}`,
+ true
+ )
+
+ worksheet.mergeCells('A1:AG1')
+ worksheet.mergeCells('A2:AG2')
+ worksheet.mergeCells('A3:AG3')
+ worksheet.mergeCells('A4:AG4')
+ worksheet.mergeCells('A6:AG6')
+ worksheet.mergeCells('A7:AG7')
+
+ exportToExcel({
+ component: e.component,
+ worksheet,
+ autoFilterEnabled: true,
+ topLeftCell: { row: 9, 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
+}
+
+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:P1')
+ worksheet.mergeCells('A3:P3')
+ worksheet.mergeCells('A4:P4')
+
+ 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
+}
+
+export { exportToPDF, exportToXLSX, exportDetailToPDF, exportDetailToXLSX }
diff --git a/src/report/Keluhan/Rekap/RKeluhan_PerUnit.ts b/src/report/Keluhan/Rekap/RKeluhan_PerUnit.ts
new file mode 100644
index 0000000..53e78bc
--- /dev/null
+++ b/src/report/Keluhan/Rekap/RKeluhan_PerUnit.ts
@@ -0,0 +1,696 @@
+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 Keluhan Per Unit'
+const fontSize = 5
+const detailFontSize = 3
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_up3 } = item
+
+ if (!groupedData[nama_up3]) {
+ groupedData[nama_up3] = []
+ }
+
+ groupedData[nama_up3].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 key of Object.keys(data)) {
+ const nama_up3 = key
+
+ 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: nama_up3,
+ colSpan: 19,
+ styles: { fontStyle: 'bold' }
+ }
+ ])
+
+ for (let i = 0; i < data[nama_up3].length; i++) {
+ formattedData.push([
+ { content: i + 1, styles: { halign: 'right' } },
+ data[nama_up3][i].nama_ulp,
+ formatNumber(data[nama_up3][i].total),
+ formatNumber(data[nama_up3][i].total_selesai),
+ formatPercentage(
+ !data[nama_up3][i].total || !data[nama_up3][i].total_selesai
+ ? '0%'
+ : (data[nama_up3][i].total_selesai / data[nama_up3][i].total) * 100
+ ),
+ formatNumber(data[nama_up3][i].total_inproses),
+ formatPercentage(
+ !data[nama_up3][i].total_inproses || !data[nama_up3][i].total
+ ? '0%'
+ : (data[nama_up3][i].total_inproses / data[nama_up3][i].total) * 100
+ ),
+ formatNumber(data[nama_up3][i].total_durasi_response),
+ formatNumber(data[nama_up3][i].avg_durasi_response),
+ formatWaktu(data[nama_up3][i].max_durasi_response),
+ formatWaktu(data[nama_up3][i].min_durasi_response),
+ formatNumber(data[nama_up3][i].total_diatas_sla_response),
+ formatNumber(data[nama_up3][i].total_dibawah_sla_response),
+ formatNumber(data[nama_up3][i].total_durasi_recovery),
+ formatNumber(data[nama_up3][i].avg_durasi_recovery),
+ formatWaktu(data[nama_up3][i].max_durasi_recovery),
+ formatWaktu(data[nama_up3][i].min_durasi_recovery),
+ formatNumber(data[nama_up3][i].total_diatas_sla_recovery),
+ formatNumber(data[nama_up3][i].total_dibawah_sla_recovery)
+ ])
+
+ total.total_laporan += data[nama_up3][i].total
+ total.total_laporan_sudah_selesai += data[nama_up3][i].total_selesai
+ total.total_laporan_belum_selesai += data[nama_up3][i].total_inproses
+ total.total_response_time_total += data[nama_up3][i].total_durasi_response
+ total.total_response_time_rata_rata.push(data[nama_up3][i].avg_durasi_response)
+ total.total_response_time_max.push(data[nama_up3][i].max_durasi_response)
+ total.total_response_time_min.push(data[nama_up3][i].min_durasi_response)
+ total.total_response_time_lebih_sla += data[nama_up3][i].total_diatas_sla_response
+ total.total_response_time_kurang_sla += data[nama_up3][i].total_dibawah_sla_response
+ total.total_recovery_time_total += data[nama_up3][i].total_durasi_recovery
+ total.total_recovery_time_rata_rata.push(data[nama_up3][i].avg_durasi_recovery)
+ total.total_recovery_time_max.push(data[nama_up3][i].max_durasi_recovery)
+ total.total_recovery_time_min.push(data[nama_up3][i].min_durasi_recovery)
+ total.total_recovery_time_lebih_sla += data[nama_up3][i].total_diatas_sla_recovery
+ total.total_recovery_time_kurang_sla += data[nama_up3][i].total_dibawah_sla_recovery
+
+ grandTotal.total_laporan += data[nama_up3][i].total
+ grandTotal.total_laporan_sudah_selesai += data[nama_up3][i].total_selesai
+ grandTotal.total_laporan_belum_selesai += data[nama_up3][i].total_inproses
+ grandTotal.total_response_time_total += data[nama_up3][i].total_durasi_response
+ grandTotal.total_response_time_rata_rata.push(data[nama_up3][i].avg_durasi_response)
+ grandTotal.total_response_time_max.push(data[nama_up3][i].max_durasi_response)
+ grandTotal.total_response_time_min.push(data[nama_up3][i].min_durasi_response)
+ grandTotal.total_response_time_lebih_sla += data[nama_up3][i].total_diatas_sla_response
+ grandTotal.total_response_time_kurang_sla += data[nama_up3][i].total_dibawah_sla_response
+ grandTotal.total_recovery_time_total += data[nama_up3][i].total_durasi_recovery
+ grandTotal.total_recovery_time_rata_rata.push(data[nama_up3][i].avg_durasi_recovery)
+ grandTotal.total_recovery_time_max.push(data[nama_up3][i].max_durasi_recovery)
+ grandTotal.total_recovery_time_min.push(data[nama_up3][i].min_durasi_recovery)
+ grandTotal.total_recovery_time_lebih_sla += data[nama_up3][i].total_diatas_sla_recovery
+ grandTotal.total_recovery_time_kurang_sla += data[nama_up3][i].total_dibawah_sla_recovery
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, 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: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(grandTotal.total_laporan),
+ formatNumber(grandTotal.total_laporan_sudah_selesai),
+ formatPercentage(
+ !grandTotal.total_laporan || !grandTotal.total_laporan_sudah_selesai
+ ? '0%'
+ : (grandTotal.total_laporan_sudah_selesai / grandTotal.total_laporan) * 100
+ ),
+ formatNumber(grandTotal.total_laporan_belum_selesai),
+ formatPercentage(
+ !grandTotal.total_laporan || !grandTotal.total_laporan_belum_selesai
+ ? '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)
+ const meta = formatMetaData(reportMeta)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ]
+ ],
+ 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: 'Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Laporan',
+ colSpan: 5
+ },
+ {
+ content: 'Response Time',
+ colSpan: 6
+ },
+ {
+ content: 'Penyelesaian',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'Total',
+ rowSpan: 2
+ },
+ {
+ content: 'Sudah Selesai',
+ colSpan: 2
+ },
+ {
+ content: 'Belum Selesai',
+ colSpan: 2
+ },
+ {
+ content: 'Hari',
+ colSpan: 4
+ },
+ {
+ content: 'Laporan',
+ colSpan: 2
+ },
+ {
+ content: 'Hari',
+ colSpan: 4
+ },
+ {
+ content: 'Laporan',
+ colSpan: 2
+ }
+ ],
+ [
+ 'Jml',
+ '%',
+ 'Jml',
+ '%',
+ 'Total',
+ 'Rata-Rata',
+ 'Max',
+ 'Min',
+ '>Sla',
+ 'Sla',
+ ' {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportDetailToPDF = (reportMeta: any, rawData: any) => {
+ const meta = formatMetaData(reportMeta)
+ 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: [
+ [
+ 'No',
+ 'No Laporan',
+ 'Tgl Lapor',
+ 'Dalam Proses Bidang',
+ 'Selesai Bidang Unit',
+ 'Durasi Response Time',
+ 'Durasi Recovery Time',
+ 'Status',
+ 'IDPEL/NO METER',
+ 'Nama Pelapor',
+ 'Alamat Pelapor',
+ 'No Telp Pelapor',
+ 'Keterangan Pelapor',
+ 'Rayon',
+ 'Uraian',
+ 'Response Pelanggan'
+ ]
+ ],
+ body: rawData.map((item: any, i: any) => [
+ { content: i + 1, styles: { halign: 'right' } },
+ item.no_laporan,
+ item.waktu_lapor,
+ item.waktu_response,
+ item.waktu_recovery,
+ item.durasi_response_time,
+ item.durasi_recovery_time,
+ item.status_akhir,
+ item.idpel_nometer,
+ item.nama_pelapor,
+ item.alamat_pelapor,
+ item.no_telp_pelapor,
+ item.keterangan_pelapor,
+ item.nama_ulp,
+ item.uraian,
+ item.respon_pelanggan
+ ]),
+ 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',
+ cellWidth: 'wrap',
+ 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: [
+ [`${meta.dayTo}, ${meta.dateToFormat}`],
+ [
+ {
+ 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()
+ 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, 5, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(
+ worksheet,
+ 6,
+ 1,
+ `PERIODE TANGGAL : ${meta.dateFromFormat} SD TGL ${meta.dateToFormat}`,
+ true
+ )
+
+ worksheet.mergeCells('A1:S1')
+ worksheet.mergeCells('A2:S2')
+ worksheet.mergeCells('A3:S3')
+ worksheet.mergeCells('A5:S5')
+ worksheet.mergeCells('A6:S6')
+
+ exportToExcel({
+ component: e.component,
+ worksheet,
+ autoFilterEnabled: true,
+ topLeftCell: { row: 8, 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
+}
+
+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:P1')
+ worksheet.mergeCells('A3:P3')
+ worksheet.mergeCells('A4:P4')
+
+ 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
+}
+
+export { exportToPDF, exportToXLSX, exportDetailToPDF, exportDetailToXLSX }
From ef7feaa17ed22047a24ad5bbf43c60b9c849a60b Mon Sep 17 00:00:00 2001
From: Dede Fuji Abdul
Date: Tue, 2 Apr 2024 22:40:06 +0700
Subject: [PATCH 12/29] Update package.json and component files
---
package.json | 3 +-
src/components/Form/FiltersType/Type7.vue | 40 +++++++++++++------
.../Daftar/DGangguan_RecoveryTime.vue | 2 +-
.../Keluhan/Daftar/DKeluhan_RecoveryTime.vue | 6 +--
.../Keluhan/Daftar/DKeluhan_ResponseTime.vue | 6 +--
src/utils/api/api.graphql.ts | 3 ++
6 files changed, 40 insertions(+), 20 deletions(-)
diff --git a/package.json b/package.json
index 9d833a8..72be3b0 100755
--- a/package.json
+++ b/package.json
@@ -3,7 +3,8 @@
"version": "0.0.1",
"private": true,
"scripts": {
- "dev": "vite --host",
+ "dev": "vite",
+ "host": "vite --host",
"tailwind": "tailwindcss -i ./src/assets/css/tailwind.css -o ./src/assets/css/style.css --watch",
"build": "run-p type-check build-only",
"preview": "vite preview --host",
diff --git a/src/components/Form/FiltersType/Type7.vue b/src/components/Form/FiltersType/Type7.vue
index ad0f5f6..e32f770 100755
--- a/src/components/Form/FiltersType/Type7.vue
+++ b/src/components/Form/FiltersType/Type7.vue
@@ -6,9 +6,9 @@ interface SlaOption {
max: string
}
-import Select from '@/components/Select.vue';
-import DatePicker from '@/components/DatePicker.vue';
-import InputWithSuffix from '../InputWithSuffix.vue';
+import Select from '@/components/Select.vue'
+import DatePicker from '@/components/DatePicker.vue'
+import InputWithSuffix from '../InputWithSuffix.vue'
import {
selectedUid,
selectedUp3Posko,
@@ -17,8 +17,8 @@ import {
itemsUid,
itemsUp3,
itemsPosko
-} from './reference';
-import { onMounted, ref, watch } from 'vue';
+} from './reference'
+import { onMounted, ref, watch } from 'vue'
const props = defineProps({
slaOptions: {
@@ -27,7 +27,7 @@ const props = defineProps({
{
id: 1,
name: 'Dibawah / Sesuai SLA (<= 45 menit)',
- min: '1',
+ min: '0',
max: '45'
},
{
@@ -143,14 +143,23 @@ onMounted(() => {
-
+
-
+
@@ -166,12 +175,19 @@ onMounted(() => {
-
+
s/d
-
+
-
diff --git a/src/components/Pages/Gangguan/Daftar/DGangguan_RecoveryTime.vue b/src/components/Pages/Gangguan/Daftar/DGangguan_RecoveryTime.vue
index ea8aff1..1afcd81 100755
--- a/src/components/Pages/Gangguan/Daftar/DGangguan_RecoveryTime.vue
+++ b/src/components/Pages/Gangguan/Daftar/DGangguan_RecoveryTime.vue
@@ -6,7 +6,7 @@
{
id: 1,
name: 'Dibawah / Sesuai SLA (<= 3 Jam)',
- min: '1',
+ min: '0',
max: '180'
},
{
diff --git a/src/components/Pages/Keluhan/Daftar/DKeluhan_RecoveryTime.vue b/src/components/Pages/Keluhan/Daftar/DKeluhan_RecoveryTime.vue
index 1ed7a16..8150799 100755
--- a/src/components/Pages/Keluhan/Daftar/DKeluhan_RecoveryTime.vue
+++ b/src/components/Pages/Keluhan/Daftar/DKeluhan_RecoveryTime.vue
@@ -6,13 +6,13 @@
{
id: 1,
name: 'Dibawah / Sesuai SLA (<= 3 hari)',
- min: '1',
- max: '4381'
+ min: '0',
+ max: '4320'
},
{
id: 2,
name: 'Melebihi SLA (> 3 hari)',
- min: '4382',
+ min: '4321',
max: `${99999 * 60 * 24}`
}
]"
diff --git a/src/components/Pages/Keluhan/Daftar/DKeluhan_ResponseTime.vue b/src/components/Pages/Keluhan/Daftar/DKeluhan_ResponseTime.vue
index 6c50125..e7513d0 100755
--- a/src/components/Pages/Keluhan/Daftar/DKeluhan_ResponseTime.vue
+++ b/src/components/Pages/Keluhan/Daftar/DKeluhan_ResponseTime.vue
@@ -6,13 +6,13 @@
{
id: 1,
name: 'Dibawah / Sesuai SLA (<= 1 hari)',
- min: '1',
- max: '1501'
+ min: '0',
+ max: '1440'
},
{
id: 2,
name: 'Melebihi SLA (> 1 hari)',
- min: '1502',
+ min: '1441',
max: `${99999 * 60 * 24}`
}
]"
diff --git a/src/utils/api/api.graphql.ts b/src/utils/api/api.graphql.ts
index ee3314e..890b7b9 100755
--- a/src/utils/api/api.graphql.ts
+++ b/src/utils/api/api.graphql.ts
@@ -1558,6 +1558,9 @@ export const queries = {
max_durasi_recovery
total_dibawah_sla_recovery
total_diatas_sla_recovery
+ count_durasi_dispatch
+ count_durasi_response
+ count_durasi_recovery
}
}
`,
From a3fe3a418bd4df137f09f6d5eba2181e1b966793 Mon Sep 17 00:00:00 2001
From: kur0nek-o
Date: Tue, 2 Apr 2024 23:54:18 +0700
Subject: [PATCH 13/29] feat: create export pdf and xlsx in monalisa jumlah
kali gangguan and dispatching time
---
.../MonalisaGR_DispatchingTimeGangguan.vue | 77 ++-
.../Rekap/MonalisaGR_JumlahKaliGangguan.vue | 66 +-
src/report/Gangguan/Daftar/DGangguan_BM.ts | 6 +-
src/report/Gangguan/Daftar/DGangguan_DKPL.ts | 6 +-
.../Gangguan/Daftar/DGangguan_DMAPKT.ts | 6 +-
src/report/Gangguan/Daftar/DGangguan_MLD1K.ts | 6 +-
.../Gangguan/Daftar/DGangguan_RecoveryTime.ts | 6 +-
.../Gangguan/Daftar/DGangguan_ResponseTime.ts | 6 +-
src/report/Gangguan/Daftar/DGangguan_STIDP.ts | 6 +-
src/report/Gangguan/Rekap/RGangguan_ALL.ts | 6 +-
.../Gangguan/Rekap/RGangguan_AlihPosko.ts | 6 +-
.../Gangguan/Rekap/RGangguan_BerdasarMedia.ts | 6 +-
src/report/Gangguan/Rekap/RGangguan_CTTM.ts | 6 +-
src/report/Gangguan/Rekap/RGangguan_DMAPKT.ts | 6 +-
.../Gangguan/Rekap/RGangguan_JenisGangguan.ts | 6 +-
.../Rekap/RGangguan_JenisGangguanSE.ts | 6 +-
src/report/Gangguan/Rekap/RGangguan_KTI.ts | 6 +-
.../Gangguan/Rekap/RGangguan_PerPosko.ts | 6 +-
.../Gangguan/Rekap/RGangguan_PerRegu.ts | 6 +-
.../Gangguan/Rekap/RGangguan_PerTanggal.ts | 6 +-
.../Rekap/RGangguan_RatingPerPosko.ts | 6 +-
.../Gangguan/Rekap/RGangguan_RatingPerRegu.ts | 6 +-
.../Keluhan/Daftar/DKeluhan_BerdasarMedia.ts | 6 +-
src/report/Keluhan/Daftar/DKeluhan_DKUL.ts | 6 +-
src/report/Keluhan/Daftar/DKeluhan_PLD1K.ts | 6 +-
.../Keluhan/Daftar/DKeluhan_RecoveryTime.ts | 6 +-
.../Keluhan/Daftar/DKeluhan_ResponseTime.ts | 6 +-
src/report/Keluhan/Daftar/DKeluhan_STIDP.ts | 6 +-
.../Keluhan/Daftar/DKeluhan_SelesaiCC.ts | 6 +-
src/report/Keluhan/Rekap/RKeluhan_ALL.ts | 6 +-
.../Keluhan/Rekap/RKeluhan_BerdasarMedia.ts | 6 +-
.../Keluhan/Rekap/RKeluhan_PerFungsiBidang.ts | 6 +-
.../Keluhan/Rekap/RKeluhan_PerJenisKeluhan.ts | 6 +-
.../Rekap/RKeluhan_PerKelompokKeluhan.ts | 6 +-
.../Keluhan/Rekap/RKeluhan_PerTanggal.ts | 6 +-
src/report/Keluhan/Rekap/RKeluhan_PerUnit.ts | 6 +-
.../MonalisaGR_DispatchingTimeGangguan.ts | 563 ++++++++++++++++++
.../Rekap/MonalisaGR_JumlahKaliGangguan.ts | 374 ++++++++++++
38 files changed, 1123 insertions(+), 161 deletions(-)
create mode 100644 src/report/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.ts
create mode 100644 src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.ts
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue
index 6e6955d..03c8127 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
:report-button="true"
@run-search="() => filterData(filters)"
@@ -710,12 +711,6 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { getMonthName } from '@/utils/texts'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
@@ -725,6 +720,12 @@ import DetailDialog from '@/components/Dialogs/DetailDialog.vue'
import { formatWaktu } from '@/components/Form/FiltersType/reference'
import InputText from '@/components/InputText.vue'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX,
+ exportDetailToPDF,
+ exportDetailToXLSX
+} from '@/report/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan'
const client = apolloClient()
provideApolloClient(client)
@@ -747,33 +748,36 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1,
+ lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(),
+ currentMonth: new Date().getMonth(),
+ currentYear: new Date().getFullYear(),
+ lastYear: new Date().getFullYear() - 1
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
+ }
+}
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
+const onExportingDetail = (e: any) => {
+ if (e.format === 'pdf') {
+ exportDetailToPDF(reportMeta.value, dataSub.value)
+ } else if (e.format === 'xlsx') {
+ exportDetailToXLSX(reportMeta.value, e)
+ } else {
}
}
@@ -801,6 +805,21 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ lastMonth: lastMonth.value,
+ lastYearMoM: lastYearMoM.value,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
@@ -877,8 +896,6 @@ const onDataSubSelectionChanged = ({ selectedRowsData }: any) => {
dataSubSelected.value = data
}
-const onExportingDetail = (e: any) => {}
-
const filters = ref()
onMounted(() => {
if (import.meta.env.DEV) {
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.vue
index 7ac0339..68c3849 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
:report-button="true"
@reset-form="data = []"
@run-search="filterData(filters)"
@@ -287,17 +288,15 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan'
const client = apolloClient()
provideApolloClient(client)
@@ -313,33 +312,27 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1,
+ lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(),
+ currentMonth: new Date().getMonth(),
+ currentYear: new Date().getFullYear(),
+ lastYear: new Date().getFullYear() - 1
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const lastMonth = ref(new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1)
@@ -381,6 +374,21 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ lastMonth: lastMonth.value,
+ lastYearMoM: lastYearMoM.value,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/report/Gangguan/Daftar/DGangguan_BM.ts b/src/report/Gangguan/Daftar/DGangguan_BM.ts
index fc0ae4f..2824dee 100644
--- a/src/report/Gangguan/Daftar/DGangguan_BM.ts
+++ b/src/report/Gangguan/Daftar/DGangguan_BM.ts
@@ -32,15 +32,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Daftar/DGangguan_DKPL.ts b/src/report/Gangguan/Daftar/DGangguan_DKPL.ts
index 8dcbd48..b7035bd 100644
--- a/src/report/Gangguan/Daftar/DGangguan_DKPL.ts
+++ b/src/report/Gangguan/Daftar/DGangguan_DKPL.ts
@@ -34,15 +34,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Daftar/DGangguan_DMAPKT.ts b/src/report/Gangguan/Daftar/DGangguan_DMAPKT.ts
index 60ec1bb..786c10e 100644
--- a/src/report/Gangguan/Daftar/DGangguan_DMAPKT.ts
+++ b/src/report/Gangguan/Daftar/DGangguan_DMAPKT.ts
@@ -32,15 +32,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Daftar/DGangguan_MLD1K.ts b/src/report/Gangguan/Daftar/DGangguan_MLD1K.ts
index 194429a..8e2c96c 100644
--- a/src/report/Gangguan/Daftar/DGangguan_MLD1K.ts
+++ b/src/report/Gangguan/Daftar/DGangguan_MLD1K.ts
@@ -32,15 +32,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Daftar/DGangguan_RecoveryTime.ts b/src/report/Gangguan/Daftar/DGangguan_RecoveryTime.ts
index 62be1a3..ff817f7 100644
--- a/src/report/Gangguan/Daftar/DGangguan_RecoveryTime.ts
+++ b/src/report/Gangguan/Daftar/DGangguan_RecoveryTime.ts
@@ -43,15 +43,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return {
diff --git a/src/report/Gangguan/Daftar/DGangguan_ResponseTime.ts b/src/report/Gangguan/Daftar/DGangguan_ResponseTime.ts
index f427ff7..9b55b9b 100644
--- a/src/report/Gangguan/Daftar/DGangguan_ResponseTime.ts
+++ b/src/report/Gangguan/Daftar/DGangguan_ResponseTime.ts
@@ -43,15 +43,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return {
diff --git a/src/report/Gangguan/Daftar/DGangguan_STIDP.ts b/src/report/Gangguan/Daftar/DGangguan_STIDP.ts
index 1290145..a1dd587 100644
--- a/src/report/Gangguan/Daftar/DGangguan_STIDP.ts
+++ b/src/report/Gangguan/Daftar/DGangguan_STIDP.ts
@@ -32,15 +32,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_ALL.ts b/src/report/Gangguan/Rekap/RGangguan_ALL.ts
index 7295879..e91d037 100644
--- a/src/report/Gangguan/Rekap/RGangguan_ALL.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_ALL.ts
@@ -279,15 +279,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_AlihPosko.ts b/src/report/Gangguan/Rekap/RGangguan_AlihPosko.ts
index cd24071..2a98dd4 100644
--- a/src/report/Gangguan/Rekap/RGangguan_AlihPosko.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_AlihPosko.ts
@@ -101,15 +101,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_BerdasarMedia.ts b/src/report/Gangguan/Rekap/RGangguan_BerdasarMedia.ts
index 4bb6f11..56575fa 100644
--- a/src/report/Gangguan/Rekap/RGangguan_BerdasarMedia.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_BerdasarMedia.ts
@@ -78,15 +78,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_CTTM.ts b/src/report/Gangguan/Rekap/RGangguan_CTTM.ts
index 313cf40..c6afc4e 100644
--- a/src/report/Gangguan/Rekap/RGangguan_CTTM.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_CTTM.ts
@@ -107,15 +107,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_DMAPKT.ts b/src/report/Gangguan/Rekap/RGangguan_DMAPKT.ts
index e233b7a..f9391ee 100644
--- a/src/report/Gangguan/Rekap/RGangguan_DMAPKT.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_DMAPKT.ts
@@ -109,15 +109,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_JenisGangguan.ts b/src/report/Gangguan/Rekap/RGangguan_JenisGangguan.ts
index 85e814e..93e6cad 100644
--- a/src/report/Gangguan/Rekap/RGangguan_JenisGangguan.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_JenisGangguan.ts
@@ -256,15 +256,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_JenisGangguanSE.ts b/src/report/Gangguan/Rekap/RGangguan_JenisGangguanSE.ts
index 1e1e63e..e05b752 100644
--- a/src/report/Gangguan/Rekap/RGangguan_JenisGangguanSE.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_JenisGangguanSE.ts
@@ -240,15 +240,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_KTI.ts b/src/report/Gangguan/Rekap/RGangguan_KTI.ts
index 70be78a..7dd9baf 100644
--- a/src/report/Gangguan/Rekap/RGangguan_KTI.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_KTI.ts
@@ -107,15 +107,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_PerPosko.ts b/src/report/Gangguan/Rekap/RGangguan_PerPosko.ts
index 695a363..cd4dc03 100644
--- a/src/report/Gangguan/Rekap/RGangguan_PerPosko.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_PerPosko.ts
@@ -239,15 +239,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_PerRegu.ts b/src/report/Gangguan/Rekap/RGangguan_PerRegu.ts
index d378cdc..a9370c2 100644
--- a/src/report/Gangguan/Rekap/RGangguan_PerRegu.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_PerRegu.ts
@@ -292,15 +292,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_PerTanggal.ts b/src/report/Gangguan/Rekap/RGangguan_PerTanggal.ts
index 937205a..c2d411d 100644
--- a/src/report/Gangguan/Rekap/RGangguan_PerTanggal.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_PerTanggal.ts
@@ -290,15 +290,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_RatingPerPosko.ts b/src/report/Gangguan/Rekap/RGangguan_RatingPerPosko.ts
index fb6b4bf..41f9fdf 100644
--- a/src/report/Gangguan/Rekap/RGangguan_RatingPerPosko.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_RatingPerPosko.ts
@@ -84,15 +84,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Gangguan/Rekap/RGangguan_RatingPerRegu.ts b/src/report/Gangguan/Rekap/RGangguan_RatingPerRegu.ts
index 7a6a9df..0cc6fe3 100644
--- a/src/report/Gangguan/Rekap/RGangguan_RatingPerRegu.ts
+++ b/src/report/Gangguan/Rekap/RGangguan_RatingPerRegu.ts
@@ -59,15 +59,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Daftar/DKeluhan_BerdasarMedia.ts b/src/report/Keluhan/Daftar/DKeluhan_BerdasarMedia.ts
index c7756f4..06cc51c 100644
--- a/src/report/Keluhan/Daftar/DKeluhan_BerdasarMedia.ts
+++ b/src/report/Keluhan/Daftar/DKeluhan_BerdasarMedia.ts
@@ -34,15 +34,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Daftar/DKeluhan_DKUL.ts b/src/report/Keluhan/Daftar/DKeluhan_DKUL.ts
index 57591b5..af2c07f 100644
--- a/src/report/Keluhan/Daftar/DKeluhan_DKUL.ts
+++ b/src/report/Keluhan/Daftar/DKeluhan_DKUL.ts
@@ -34,15 +34,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Daftar/DKeluhan_PLD1K.ts b/src/report/Keluhan/Daftar/DKeluhan_PLD1K.ts
index 4b135c1..f96b76e 100644
--- a/src/report/Keluhan/Daftar/DKeluhan_PLD1K.ts
+++ b/src/report/Keluhan/Daftar/DKeluhan_PLD1K.ts
@@ -34,15 +34,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Daftar/DKeluhan_RecoveryTime.ts b/src/report/Keluhan/Daftar/DKeluhan_RecoveryTime.ts
index dc20fe4..2bdfbff 100644
--- a/src/report/Keluhan/Daftar/DKeluhan_RecoveryTime.ts
+++ b/src/report/Keluhan/Daftar/DKeluhan_RecoveryTime.ts
@@ -45,15 +45,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo, durasi, minTime, maxTime }
diff --git a/src/report/Keluhan/Daftar/DKeluhan_ResponseTime.ts b/src/report/Keluhan/Daftar/DKeluhan_ResponseTime.ts
index 5fecc58..50c74d6 100644
--- a/src/report/Keluhan/Daftar/DKeluhan_ResponseTime.ts
+++ b/src/report/Keluhan/Daftar/DKeluhan_ResponseTime.ts
@@ -45,15 +45,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo, durasi, minTime, maxTime }
diff --git a/src/report/Keluhan/Daftar/DKeluhan_STIDP.ts b/src/report/Keluhan/Daftar/DKeluhan_STIDP.ts
index d0e8777..d3d4bcf 100644
--- a/src/report/Keluhan/Daftar/DKeluhan_STIDP.ts
+++ b/src/report/Keluhan/Daftar/DKeluhan_STIDP.ts
@@ -34,15 +34,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Daftar/DKeluhan_SelesaiCC.ts b/src/report/Keluhan/Daftar/DKeluhan_SelesaiCC.ts
index b03bc42..53ff08e 100644
--- a/src/report/Keluhan/Daftar/DKeluhan_SelesaiCC.ts
+++ b/src/report/Keluhan/Daftar/DKeluhan_SelesaiCC.ts
@@ -34,15 +34,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Rekap/RKeluhan_ALL.ts b/src/report/Keluhan/Rekap/RKeluhan_ALL.ts
index f322b2f..5975f41 100644
--- a/src/report/Keluhan/Rekap/RKeluhan_ALL.ts
+++ b/src/report/Keluhan/Rekap/RKeluhan_ALL.ts
@@ -224,15 +224,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Rekap/RKeluhan_BerdasarMedia.ts b/src/report/Keluhan/Rekap/RKeluhan_BerdasarMedia.ts
index 53c9307..2654886 100644
--- a/src/report/Keluhan/Rekap/RKeluhan_BerdasarMedia.ts
+++ b/src/report/Keluhan/Rekap/RKeluhan_BerdasarMedia.ts
@@ -124,15 +124,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Rekap/RKeluhan_PerFungsiBidang.ts b/src/report/Keluhan/Rekap/RKeluhan_PerFungsiBidang.ts
index 5b1b4f8..b82669d 100644
--- a/src/report/Keluhan/Rekap/RKeluhan_PerFungsiBidang.ts
+++ b/src/report/Keluhan/Rekap/RKeluhan_PerFungsiBidang.ts
@@ -290,15 +290,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Rekap/RKeluhan_PerJenisKeluhan.ts b/src/report/Keluhan/Rekap/RKeluhan_PerJenisKeluhan.ts
index 51d701d..000d401 100644
--- a/src/report/Keluhan/Rekap/RKeluhan_PerJenisKeluhan.ts
+++ b/src/report/Keluhan/Rekap/RKeluhan_PerJenisKeluhan.ts
@@ -263,15 +263,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.ts b/src/report/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.ts
index 5579129..169c4e2 100644
--- a/src/report/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.ts
+++ b/src/report/Keluhan/Rekap/RKeluhan_PerKelompokKeluhan.ts
@@ -290,15 +290,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Rekap/RKeluhan_PerTanggal.ts b/src/report/Keluhan/Rekap/RKeluhan_PerTanggal.ts
index 10c583d..6149313 100644
--- a/src/report/Keluhan/Rekap/RKeluhan_PerTanggal.ts
+++ b/src/report/Keluhan/Rekap/RKeluhan_PerTanggal.ts
@@ -290,15 +290,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Keluhan/Rekap/RKeluhan_PerUnit.ts b/src/report/Keluhan/Rekap/RKeluhan_PerUnit.ts
index 53e78bc..d7ce089 100644
--- a/src/report/Keluhan/Rekap/RKeluhan_PerUnit.ts
+++ b/src/report/Keluhan/Rekap/RKeluhan_PerUnit.ts
@@ -247,15 +247,15 @@ const formatMetaData = (reportMeta: any) => {
const dateFrom = new Date(periode[0].split('-').reverse().join('-'))
const dateTo = new Date(periode[1].split('-').reverse().join('-'))
- dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('default', {
+ dateFromFormat = `${dateFrom.getDate()}-${dateFrom.toLocaleString('id-ID', {
month: 'long'
})}-${dateFrom.getFullYear()}`
- dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('default', {
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
month: 'long'
})}-${dateTo.getFullYear()}`
- dayTo = dateTo.toLocaleString('default', { weekday: 'long' })
+ dayTo = dateTo.toLocaleString('id-ID', { weekday: 'long' })
}
return { dateFromFormat, dateToFormat, dayTo }
diff --git a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.ts b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.ts
new file mode 100644
index 0000000..b077e0d
--- /dev/null
+++ b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.ts
@@ -0,0 +1,563 @@
+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'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Dispacthing Time (DT) Gangguan'
+const fontSize = 5
+const detailFontSize = 3
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ persen_mom: [],
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0,
+ persen_yoy: []
+ }
+ }
+
+ groupedData[regional].summary.mom_bulan_kemarin += item.mom_bulan_kemarin
+ groupedData[regional].summary.mom_bulan_ini += item.mom_bulan_ini
+ groupedData[regional].summary.persen_mom.push(item.persen_mom)
+ groupedData[regional].summary.yoy_tahun_kemarin += item.yoy_tahun_kemarin
+ groupedData[regional].summary.yoy_tahun_ini += item.yoy_tahun_ini
+ groupedData[regional].summary.persen_yoy.push(item.persen_yoy)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ mom_bulan_kemarin: [],
+ mom_bulan_ini: [],
+ yoy_tahun_kemarin: [],
+ yoy_tahun_ini: []
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 7, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.mom_bulan_kemarin),
+ formatNumber(summary.mom_bulan_ini),
+ formatPercentage(
+ !summary.mom_bulan_ini || !summary.mom_bulan_kemarin
+ ? '0%'
+ : ((summary.mom_bulan_kemarin - summary.mom_bulan_ini) / summary.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(summary.yoy_tahun_kemarin),
+ formatNumber(summary.yoy_tahun_ini),
+ formatPercentage(
+ !summary.yoy_tahun_ini || !summary.yoy_tahun_kemarin
+ ? '0%'
+ : ((summary.yoy_tahun_kemarin - summary.yoy_tahun_ini) / summary.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ total.mom_bulan_kemarin.push(summary.mom_bulan_kemarin)
+ total.mom_bulan_ini.push(summary.mom_bulan_ini)
+ total.yoy_tahun_kemarin.push(summary.yoy_tahun_kemarin)
+ total.yoy_tahun_ini.push(summary.yoy_tahun_ini)
+ }
+
+ const totalMoMBulanKemarin =
+ total.mom_bulan_kemarin.reduce((a: number, b: number) => a + b, 0) /
+ total.mom_bulan_kemarin.length
+ const totalMoMBulanIni =
+ total.mom_bulan_ini.reduce((a: number, b: number) => a + b, 0) / total.mom_bulan_ini.length
+ const totalYoYTahunKemarin =
+ total.yoy_tahun_kemarin.reduce((a: number, b: number) => a + b, 0) /
+ total.yoy_tahun_kemarin.length
+ const totalYoYTahunIni =
+ total.yoy_tahun_ini.reduce((a: number, b: number) => a + b, 0) / total.yoy_tahun_ini.length
+
+ formattedData.push([
+ { content: 'TOTAL RATA-RATA', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(totalMoMBulanKemarin),
+ formatNumber(totalMoMBulanIni),
+ formatPercentage(
+ !totalMoMBulanIni || !totalMoMBulanKemarin
+ ? '0%'
+ : ((totalMoMBulanKemarin - totalMoMBulanIni) / totalMoMBulanKemarin) * 100
+ ),
+ formatNumber(totalYoYTahunKemarin),
+ formatNumber(totalYoYTahunIni),
+ formatPercentage(
+ !totalYoYTahunIni || !totalYoYTahunKemarin
+ ? '0%'
+ : ((totalYoYTahunKemarin - totalYoYTahunIni) / totalYoYTahunKemarin) * 100
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ 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: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Jumlah Dispacthing Time Gangguan',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'MOM',
+ colSpan: 3
+ },
+ {
+ content: 'YOY',
+ colSpan: 3
+ }
+ ],
+ [
+ `${getMonthName(reportMeta.lastMonth)} ${reportMeta.lastYearMoM}`,
+ `${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%',
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.lastYear}`,
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL RATA-RATA') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+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 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()], [reportMeta.periode]],
+ styles: {
+ fontSize: detailFontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 18,
+ margin: 5
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ 'No',
+ 'ULP',
+ 'No Laporan',
+ 'Tgl/ Jam Lapor',
+ 'Tgl/ Jam Datang',
+ 'Tgl/ Jam Nyala',
+ 'Durasi Response Time',
+ 'Durasi Recovery Time',
+ 'Durasi Penugasan Regu',
+ 'Durasi Perjalanan Regu',
+ 'Dispatch Oleh',
+ 'IDPEL/NO METER',
+ 'Nama Pelapor',
+ 'Alamat Pelapor',
+ 'No Telp Pelapor',
+ 'Keterangan Pelapor',
+ 'Sumber Lapor',
+ 'Diselesaikan Oleh',
+ 'Status',
+ 'Referensi Marking',
+ 'Kode Gangguan',
+ 'Jenis Gangguan',
+ 'Tindakan'
+ ]
+ ],
+ body: rawData.map((item: any, i: any) => [
+ { content: i + 1, styles: { halign: 'right' } },
+ item.nama_ulp,
+ item.no_laporan,
+ 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.idpel_nometer,
+ item.nama_pelapor,
+ item.alamat_pelapor,
+ item.no_telp_pelapor,
+ item.keterangan_pelapor,
+ '',
+ '',
+ item.status_akhir,
+ '',
+ '',
+ '',
+ ''
+ ]),
+ 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',
+ cellWidth: 'wrap',
+ 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 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:G1')
+ worksheet.mergeCells('A2:G2')
+ worksheet.mergeCells('A3:G3')
+ worksheet.mergeCells('A4:G4')
+ worksheet.mergeCells('A5:G5')
+ worksheet.mergeCells('A7:G7')
+ worksheet.mergeCells('A8:G8')
+
+ 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
+}
+
+const exportDetailToXLSX = (reportMeta: any, e: any) => {
+ 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, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:W1')
+ worksheet.mergeCells('A3:W3')
+ worksheet.mergeCells('A4:W4')
+
+ 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
+}
+
+export { exportToPDF, exportToXLSX, exportDetailToPDF, exportDetailToXLSX }
diff --git a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.ts b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.ts
new file mode 100644
index 0000000..44016da
--- /dev/null
+++ b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.ts
@@ -0,0 +1,374 @@
+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'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Rekapitulasi Gangguan All'
+const fontSize = 5
+const detailFontSize = 3
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ persen_mom: [],
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0,
+ persen_yoy: []
+ }
+ }
+
+ groupedData[regional].summary.mom_bulan_kemarin += item.mom_bulan_kemarin
+ groupedData[regional].summary.mom_bulan_ini += item.mom_bulan_ini
+ groupedData[regional].summary.persen_mom.push(item.persen_mom)
+ groupedData[regional].summary.yoy_tahun_kemarin += item.yoy_tahun_kemarin
+ groupedData[regional].summary.yoy_tahun_ini += item.yoy_tahun_ini
+ groupedData[regional].summary.persen_yoy.push(item.persen_yoy)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 7, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.mom_bulan_kemarin),
+ formatNumber(summary.mom_bulan_ini),
+ formatPercentage(
+ !summary.mom_bulan_ini || !summary.mom_bulan_kemarin
+ ? '0%'
+ : ((summary.mom_bulan_kemarin - summary.mom_bulan_ini) / summary.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(summary.yoy_tahun_kemarin),
+ formatNumber(summary.yoy_tahun_ini),
+ formatPercentage(
+ !summary.yoy_tahun_ini || !summary.yoy_tahun_kemarin
+ ? '0%'
+ : ((summary.yoy_tahun_kemarin - summary.yoy_tahun_ini) / summary.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ total.mom_bulan_kemarin += summary.mom_bulan_kemarin
+ total.mom_bulan_ini += summary.mom_bulan_ini
+ total.yoy_tahun_kemarin += summary.yoy_tahun_kemarin
+ total.yoy_tahun_ini += summary.yoy_tahun_ini
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(total.mom_bulan_kemarin),
+ formatNumber(total.mom_bulan_ini),
+ formatPercentage(
+ !total.mom_bulan_ini || !total.mom_bulan_kemarin
+ ? '0%'
+ : ((total.mom_bulan_kemarin - total.mom_bulan_ini) / total.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(total.yoy_tahun_kemarin),
+ formatNumber(total.yoy_tahun_ini),
+ formatPercentage(
+ !total.yoy_tahun_ini || !total.yoy_tahun_kemarin
+ ? '0%'
+ : ((total.yoy_tahun_kemarin - total.yoy_tahun_ini) / total.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ 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: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Jumlah Kali Gangguan',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'MOM',
+ colSpan: 3
+ },
+ {
+ content: 'YOY',
+ colSpan: 3
+ }
+ ],
+ [
+ `${getMonthName(reportMeta.lastMonth)} ${reportMeta.lastYearMoM}`,
+ `${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%',
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.lastYear}`,
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:G1')
+ worksheet.mergeCells('A2:G2')
+ worksheet.mergeCells('A3:G3')
+ worksheet.mergeCells('A4:G4')
+ worksheet.mergeCells('A5:G5')
+ worksheet.mergeCells('A7:G7')
+ worksheet.mergeCells('A8:G8')
+
+ 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 }
From e9eca5c93ea76da6090e86b6bfb34b44de9ae398 Mon Sep 17 00:00:00 2001
From: Dede Fuji Abdul
Date: Tue, 2 Apr 2024 23:58:31 +0700
Subject: [PATCH 14/29] feat: update avg calculate mthod in summery grouping
RGangguanAll
---
.../Pages/Gangguan/Rekap/RGangguan_ALL.vue | 713 ++++++++++++++----
1 file changed, 575 insertions(+), 138 deletions(-)
diff --git a/src/components/Pages/Gangguan/Rekap/RGangguan_ALL.vue b/src/components/Pages/Gangguan/Rekap/RGangguan_ALL.vue
index b0066ab..59e8dbd 100755
--- a/src/components/Pages/Gangguan/Rekap/RGangguan_ALL.vue
+++ b/src/components/Pages/Gangguan/Rekap/RGangguan_ALL.vue
@@ -160,6 +160,36 @@
css-class="custom-table-column"
cell-template="formatDPT"
/>
+
+
+
+
+
+
@@ -319,7 +410,8 @@
:show-in-group-footer="false"
:align-by-column="true"
column="total_selesai"
- summary-type="sum"
+ name="total_selesai"
+ summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
@@ -327,23 +419,17 @@
:show-in-group-footer="false"
:align-by-column="true"
column="persen_selesai"
- summary-type="avg"
+ name="persen_selesai"
+ summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatPercentage(e.value)"
/>
-
@@ -351,7 +437,8 @@
:show-in-group-footer="false"
:align-by-column="true"
column="persen_inproses"
- summary-type="avg"
+ name="persen_inproses"
+ summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatPercentage(e.value)"
/>
@@ -359,7 +446,26 @@
:show-in-group-footer="false"
:align-by-column="true"
column="avg_durasi_dispatch"
- summary-type="avg"
+ name="avg_durasi_dispatch"
+ summary-type="custom"
+ css-class="!text-right"
+ :customize-text="(e: any) => formatNumber(e.value)"
+ />
+
+
@@ -400,7 +506,26 @@
:show-in-group-footer="false"
:align-by-column="true"
column="avg_durasi_response"
- summary-type="avg"
+ name="avg_durasi_response"
+ summary-type="custom"
+ css-class="!text-right"
+ :customize-text="(e: any) => formatNumber(e.value)"
+ />
+
+
@@ -440,7 +565,26 @@
:show-in-group-footer="false"
:align-by-column="true"
column="avg_durasi_recovery"
- summary-type="avg"
+ name="avg_durasi_recovery"
+ summary-type="custom"
+ css-class="!text-right"
+ :customize-text="(e: any) => formatNumber(e.value)"
+ />
+
+
@@ -1150,21 +1294,139 @@ const setAgreementDialog = (column: string) => {
}
}
+let total = 0
+let total_selesai = 0
+let total_inproses = 0
+let count_durasi_dispatch = 0
+let total_durasi_dispatch = 0
+let count_durasi_response = 0
+let total_durasi_response = 0
+let count_durasi_recovery = 0
+let total_durasi_recovery = 0
const calculateCustomSummary = (options: any) => {
- if (options.name == 'persenSelesai') {
- console.log(options.component.persen_selesai)
+ if (options.name === 'total') {
+ if (options.summaryProcess === 'calculate') {
+ total += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total
+ }
+ }
- switch (options.summaryProcess) {
- case 'start':
- // Initializing "totalValue" here
- options.totalValue = 1
- break
- case 'calculate':
- // Modifying "totalValue" here
- break
- case 'finalize':
- // Assigning the final value to "totalValue" here
- break
+ if (options.name === 'total_selesai') {
+ if (options.summaryProcess === 'calculate') {
+ total_selesai += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total_selesai
+ }
+ }
+
+ if (options.name === 'total_inproses') {
+ if (options.summaryProcess === 'calculate') {
+ total_inproses += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total_inproses
+ }
+ }
+
+ if (options.name === 'persen_selesai') {
+ if (options.summaryProcess === 'start') {
+ total = 0
+ total_selesai = 0
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = (total_selesai / total) * 100
+ }
+ }
+
+ if (options.name === 'persen_inproses') {
+ if (options.summaryProcess === 'start') {
+ total = 0
+ total_inproses = 0
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = (total_inproses / total) * 100
+ }
+ }
+
+ if (options.name === 'persen_selesai') {
+ if (options.summaryProcess === 'start') {
+ total = 0
+ total_selesai = 0
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = (total_selesai / total) * 100
+ }
+ }
+
+ if (options.name === 'count_durasi_dispatch') {
+ if (options.summaryProcess === 'calculate') {
+ count_durasi_dispatch += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = count_durasi_dispatch
+ }
+ }
+
+ if (options.name === 'total_durasi_dispatch') {
+ if (options.summaryProcess === 'calculate') {
+ total_durasi_dispatch += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total_durasi_dispatch
+ }
+ }
+
+ if (options.name === 'avg_durasi_dispatch') {
+ if (options.summaryProcess === 'start') {
+ count_durasi_dispatch = 0
+ total_durasi_dispatch = 0
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total_durasi_dispatch / count_durasi_dispatch
+ }
+ }
+
+ if (options.name === 'count_durasi_response') {
+ if (options.summaryProcess === 'calculate') {
+ count_durasi_response += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = count_durasi_response
+ }
+ }
+
+ if (options.name === 'total_durasi_response') {
+ if (options.summaryProcess === 'calculate') {
+ total_durasi_response += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total_durasi_response
+ }
+ }
+
+ if (options.name === 'avg_durasi_response') {
+ if (options.summaryProcess === 'start') {
+ count_durasi_response = 0
+ total_durasi_response = 0
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total_durasi_response / count_durasi_response
+ }
+ }
+
+ if (options.name === 'count_durasi_recovery') {
+ if (options.summaryProcess === 'calculate') {
+ count_durasi_recovery += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = count_durasi_recovery
+ }
+ }
+
+ if (options.name === 'total_durasi_recovery') {
+ if (options.summaryProcess === 'calculate') {
+ total_durasi_recovery += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total_durasi_recovery
+ }
+ }
+
+ if (options.name === 'avg_durasi_recovery') {
+ if (options.summaryProcess === 'start') {
+ count_durasi_recovery = 0
+ total_durasi_recovery = 0
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total_durasi_recovery / count_durasi_recovery
}
}
}
@@ -1375,29 +1637,29 @@ onMounted(() => {
nama_ulp: 'ULP DOMPU',
id_posko: 443201,
nama_posko: 'POSKO ULP DOMPU',
- total: 34,
- total_selesai: 34,
- persen_selesai: 100,
- total_inproses: 0,
- persen_inproses: 0,
- avg_durasi_dispatch: 4.735294117647059,
- min_durasi_dispatch: 11,
- max_durasi_dispatch: 2562,
- total_dibawah_sla_dispatch: 19,
- total_diatas_sla_dispatch: 15,
- avg_durasi_response: 29.848484848484848,
- min_durasi_response: 625,
- max_durasi_response: 4202,
- total_dibawah_sla_response: 27,
- total_diatas_sla_response: 6,
- avg_durasi_recovery: 50.53125,
- min_durasi_recovery: 1282,
- max_durasi_recovery: 5794,
- total_dibawah_sla_recovery: 32,
+ total: 426,
+ total_selesai: 374,
+ persen_selesai: 87.79342723004694,
+ total_inproses: 52,
+ persen_inproses: 12.206572769953052,
+ avg_durasi_dispatch: 2.4715447154471546,
+ min_durasi_dispatch: 0,
+ max_durasi_dispatch: 723,
+ total_dibawah_sla_dispatch: 331,
+ total_diatas_sla_dispatch: 38,
+ avg_durasi_response: 12.729411764705882,
+ min_durasi_response: 160,
+ max_durasi_response: 2004,
+ total_dibawah_sla_response: 340,
+ total_diatas_sla_response: 0,
+ avg_durasi_recovery: 21.4070796460177,
+ min_durasi_recovery: 160,
+ max_durasi_recovery: 2619,
+ total_dibawah_sla_recovery: 339,
total_diatas_sla_recovery: 0,
- total_dispatch: 34,
- total_response: 33,
- total_recovery: 32
+ count_durasi_dispatch: 394,
+ count_durasi_response: 365,
+ count_durasi_recovery: 364
},
{
id: 316201,
@@ -1410,29 +1672,64 @@ onMounted(() => {
nama_ulp: 'ULP MARISA',
id_posko: 316201,
nama_posko: 'POSKO ULP MARISA',
- total: 19,
- total_selesai: 19,
- persen_selesai: 100,
- total_inproses: 0,
- persen_inproses: 0,
- avg_durasi_dispatch: 1.6111111111111112,
- min_durasi_dispatch: 12,
- max_durasi_dispatch: 437,
- total_dibawah_sla_dispatch: 16,
- total_diatas_sla_dispatch: 2,
- avg_durasi_response: 17.22222222222222,
- min_durasi_response: 483,
- max_durasi_response: 2541,
- total_dibawah_sla_response: 18,
+ total: 152,
+ total_selesai: 121,
+ persen_selesai: 79.60526315789474,
+ total_inproses: 31,
+ persen_inproses: 20.394736842105264,
+ avg_durasi_dispatch: 1.5221238938053097,
+ min_durasi_dispatch: 1,
+ max_durasi_dispatch: 1748,
+ total_dibawah_sla_dispatch: 101,
+ total_diatas_sla_dispatch: 12,
+ avg_durasi_response: 10.786516853932584,
+ min_durasi_response: 54,
+ max_durasi_response: 2349,
+ total_dibawah_sla_response: 89,
total_diatas_sla_response: 0,
- avg_durasi_recovery: 31.38888888888889,
- min_durasi_recovery: 1183,
- max_durasi_recovery: 3216,
- total_dibawah_sla_recovery: 18,
+ avg_durasi_recovery: 19.32183908045977,
+ min_durasi_recovery: 54,
+ max_durasi_recovery: 3723,
+ total_dibawah_sla_recovery: 87,
total_diatas_sla_recovery: 0,
- total_dispatch: 18,
- total_response: 18,
- total_recovery: 18
+ count_durasi_dispatch: 118,
+ count_durasi_response: 94,
+ count_durasi_recovery: 92
+ },
+ {
+ id: 422401,
+ nama_regional: 'REGIONAL SULMAPANA',
+ id_uid: 42,
+ nama_uid: 'WILAYAH PAPUA DAN PAPUA BARAT',
+ id_up3: 422,
+ nama_up3: 'UP3 BIAK',
+ id_ulp: 42240,
+ nama_ulp: 'ULP WAROPEN',
+ id_posko: 422401,
+ nama_posko: 'POSKO ULP WAROPEN',
+ total: 15,
+ total_selesai: 13,
+ persen_selesai: 86.66666666666667,
+ total_inproses: 2,
+ persen_inproses: 13.333333333333334,
+ avg_durasi_dispatch: 1.0769230769230769,
+ min_durasi_dispatch: 0,
+ max_durasi_dispatch: 218,
+ total_dibawah_sla_dispatch: 13,
+ total_diatas_sla_dispatch: 0,
+ avg_durasi_response: 11.833333333333334,
+ min_durasi_response: 119,
+ max_durasi_response: 1756,
+ total_dibawah_sla_response: 12,
+ total_diatas_sla_response: 0,
+ avg_durasi_recovery: 20.545454545454547,
+ min_durasi_recovery: 119,
+ max_durasi_recovery: 1908,
+ total_dibawah_sla_recovery: 11,
+ total_diatas_sla_recovery: 0,
+ count_durasi_dispatch: 15,
+ count_durasi_response: 14,
+ count_durasi_recovery: 13
},
{
id: 433801,
@@ -1445,29 +1742,29 @@ onMounted(() => {
nama_ulp: 'ULP SUMBA BARAT DAYA',
id_posko: 433801,
nama_posko: 'POSKO ULP SUMBA BARAT DAYA',
- total: 34,
- total_selesai: 34,
- persen_selesai: 100,
- total_inproses: 0,
- persen_inproses: 0,
- avg_durasi_dispatch: 2.5185185185185186,
- min_durasi_dispatch: 17,
- max_durasi_dispatch: 473,
- total_dibawah_sla_dispatch: 23,
- total_diatas_sla_dispatch: 4,
- avg_durasi_response: 35.34615384615385,
- min_durasi_response: 768,
- max_durasi_response: 5726,
- total_dibawah_sla_response: 19,
- total_diatas_sla_response: 7,
- avg_durasi_recovery: 57.34615384615385,
- min_durasi_recovery: 1571,
- max_durasi_recovery: 7213,
- total_dibawah_sla_recovery: 26,
+ total: 188,
+ total_selesai: 162,
+ persen_selesai: 86.17021276595744,
+ total_inproses: 26,
+ persen_inproses: 13.829787234042554,
+ avg_durasi_dispatch: 1.4675324675324675,
+ min_durasi_dispatch: 2,
+ max_durasi_dispatch: 567,
+ total_dibawah_sla_dispatch: 147,
+ total_diatas_sla_dispatch: 7,
+ avg_durasi_response: 12.777777777777779,
+ min_durasi_response: 241,
+ max_durasi_response: 2772,
+ total_dibawah_sla_response: 134,
+ total_diatas_sla_response: 1,
+ avg_durasi_recovery: 26.119402985074625,
+ min_durasi_recovery: 453,
+ max_durasi_recovery: 3755,
+ total_dibawah_sla_recovery: 134,
total_diatas_sla_recovery: 0,
- total_dispatch: 27,
- total_response: 26,
- total_recovery: 26
+ count_durasi_dispatch: 158,
+ count_durasi_response: 139,
+ count_durasi_recovery: 138
},
{
id: 514603,
@@ -1480,29 +1777,29 @@ onMounted(() => {
nama_ulp: 'ULP NGANJUK',
id_posko: 514603,
nama_posko: 'POSKO ULP NGANJUK',
- total: 183,
- total_selesai: 183,
- persen_selesai: 100,
- total_inproses: 0,
- persen_inproses: 0,
- avg_durasi_dispatch: 11.38888888888889,
- min_durasi_dispatch: 12,
- max_durasi_dispatch: 4932,
- total_dibawah_sla_dispatch: 53,
- total_diatas_sla_dispatch: 37,
- avg_durasi_response: 14.10204081632653,
- min_durasi_response: 315,
- max_durasi_response: 2385,
- total_dibawah_sla_response: 49,
- total_diatas_sla_response: 0,
- avg_durasi_recovery: 21.73469387755102,
- min_durasi_recovery: 424,
- max_durasi_recovery: 3989,
- total_dibawah_sla_recovery: 49,
+ total: 1436,
+ total_selesai: 1238,
+ persen_selesai: 86.2116991643454,
+ total_inproses: 198,
+ persen_inproses: 13.788300835654596,
+ avg_durasi_dispatch: 7.207339449541284,
+ min_durasi_dispatch: 4,
+ max_durasi_dispatch: 2760,
+ total_dibawah_sla_dispatch: 508,
+ total_diatas_sla_dispatch: 582,
+ avg_durasi_response: 21.72106824925816,
+ min_durasi_response: 130,
+ max_durasi_response: 5415,
+ total_dibawah_sla_response: 945,
+ total_diatas_sla_response: 66,
+ avg_durasi_recovery: 27.93168316831683,
+ min_durasi_recovery: 130,
+ max_durasi_recovery: 5978,
+ total_dibawah_sla_recovery: 1010,
total_diatas_sla_recovery: 0,
- total_dispatch: 90,
- total_response: 49,
- total_recovery: 49
+ count_durasi_dispatch: 1180,
+ count_durasi_response: 1101,
+ count_durasi_recovery: 1100
},
{
id: 532931,
@@ -1515,29 +1812,169 @@ onMounted(() => {
nama_ulp: 'ULP LELES',
id_posko: 532931,
nama_posko: 'POSKO ULP LELES',
- total: 36,
- total_selesai: 36,
- persen_selesai: 100,
- total_inproses: 0,
- persen_inproses: 0,
- avg_durasi_dispatch: 0.6388888888888888,
- min_durasi_dispatch: 5,
- max_durasi_dispatch: 271,
- total_dibawah_sla_dispatch: 36,
- total_diatas_sla_dispatch: 0,
- avg_durasi_response: 10.38888888888889,
- min_durasi_response: 295,
- max_durasi_response: 1270,
- total_dibawah_sla_response: 36,
- total_diatas_sla_response: 0,
- avg_durasi_recovery: 21.63888888888889,
- min_durasi_recovery: 926,
- max_durasi_recovery: 1886,
- total_dibawah_sla_recovery: 36,
+ total: 370,
+ total_selesai: 324,
+ persen_selesai: 87.56756756756758,
+ total_inproses: 46,
+ persen_inproses: 12.432432432432433,
+ avg_durasi_dispatch: 0.9965635738831615,
+ min_durasi_dispatch: 3,
+ max_durasi_dispatch: 1495,
+ total_dibawah_sla_dispatch: 285,
+ total_diatas_sla_dispatch: 6,
+ avg_durasi_response: 16.597173144876326,
+ min_durasi_response: 247,
+ max_durasi_response: 5372,
+ total_dibawah_sla_response: 261,
+ total_diatas_sla_response: 22,
+ avg_durasi_recovery: 25.93594306049822,
+ min_durasi_recovery: 475,
+ max_durasi_recovery: 7354,
+ total_dibawah_sla_recovery: 281,
total_diatas_sla_recovery: 0,
- total_dispatch: 36,
- total_response: 36,
- total_recovery: 36
+ count_durasi_dispatch: 295,
+ count_durasi_response: 287,
+ count_durasi_recovery: 285
+ },
+ {
+ id: 543601,
+ nama_regional: 'REGIONAL JMB',
+ id_uid: 2,
+ nama_uid: 'DISTRIBUSI JAKARTA RAYA',
+ id_up3: 9,
+ nama_up3: 'UP3 CIPUTAT',
+ id_ulp: 54360,
+ nama_ulp: 'UP3 CIPUTAT',
+ id_posko: 543601,
+ nama_posko: 'POSKO CIPUTAT',
+ total: 3446,
+ total_selesai: 2826,
+ persen_selesai: 82.0081253627394,
+ total_inproses: 620,
+ persen_inproses: 17.99187463726059,
+ avg_durasi_dispatch: 3.46793930494371,
+ min_durasi_dispatch: 1,
+ max_durasi_dispatch: 2761,
+ total_dibawah_sla_dispatch: 1740,
+ total_diatas_sla_dispatch: 303,
+ avg_durasi_response: 30.737704918032787,
+ min_durasi_response: 29,
+ max_durasi_response: 8303,
+ total_dibawah_sla_response: 1465,
+ total_diatas_sla_response: 243,
+ avg_durasi_recovery: 49.72835112692764,
+ min_durasi_recovery: 29,
+ max_durasi_recovery: 10280,
+ total_dibawah_sla_recovery: 1686,
+ total_diatas_sla_recovery: 0,
+ count_durasi_dispatch: 2123,
+ count_durasi_response: 1789,
+ count_durasi_recovery: 1768
+ },
+ {
+ id: 327601,
+ nama_regional: 'REGIONAL SULMAPANA',
+ id_uid: 32,
+ nama_uid: 'WILAYAH SULAWESI SELATAN, TENGGARA DAN BARAT',
+ id_up3: 32700,
+ nama_up3: 'UP3 BULUKUMBA',
+ id_ulp: 32760,
+ nama_ulp: 'ULP SINJAI',
+ id_posko: 327601,
+ nama_posko: 'POSKO ULP SINJAI',
+ total: 401,
+ total_selesai: 344,
+ persen_selesai: 85.785536159601,
+ total_inproses: 57,
+ persen_inproses: 14.214463840399002,
+ avg_durasi_dispatch: 1.3757396449704142,
+ min_durasi_dispatch: 1,
+ max_durasi_dispatch: 2875,
+ total_dibawah_sla_dispatch: 319,
+ total_diatas_sla_dispatch: 19,
+ avg_durasi_response: 17.36760124610592,
+ min_durasi_response: 615,
+ max_durasi_response: 3359,
+ total_dibawah_sla_response: 318,
+ total_diatas_sla_response: 3,
+ avg_durasi_recovery: 31.22429906542056,
+ min_durasi_recovery: 994,
+ max_durasi_recovery: 3849,
+ total_dibawah_sla_recovery: 321,
+ total_diatas_sla_recovery: 0,
+ count_durasi_dispatch: 340,
+ count_durasi_response: 323,
+ count_durasi_recovery: 323
+ },
+ {
+ id: 146301,
+ nama_regional: 'REGIONAL SUMKAL',
+ id_uid: 140,
+ nama_uid: 'WILAYAH SUMATERA SELATAN, JAMBI & BENGKULU (S2JB)',
+ id_up3: 1403,
+ nama_up3: 'UP3 BENGKULU',
+ id_ulp: 14630,
+ nama_ulp: 'ULP MUARA AMAN',
+ id_posko: 146301,
+ nama_posko: 'POSKO ULP MUARA AMAN',
+ total: 16,
+ total_selesai: 14,
+ persen_selesai: 87.5,
+ total_inproses: 2,
+ persen_inproses: 12.5,
+ avg_durasi_dispatch: 3.8,
+ min_durasi_dispatch: 91,
+ max_durasi_dispatch: 991,
+ total_dibawah_sla_dispatch: 9,
+ total_diatas_sla_dispatch: 1,
+ avg_durasi_response: 13.555555555555555,
+ min_durasi_response: 625,
+ max_durasi_response: 1117,
+ total_dibawah_sla_response: 9,
+ total_diatas_sla_response: 0,
+ avg_durasi_recovery: 24.444444444444443,
+ min_durasi_recovery: 1305,
+ max_durasi_recovery: 1825,
+ total_dibawah_sla_recovery: 9,
+ total_diatas_sla_recovery: 0,
+ count_durasi_dispatch: 10,
+ count_durasi_response: 9,
+ count_durasi_recovery: 9
+ },
+ {
+ id: 561201,
+ nama_regional: 'REGIONAL JMB',
+ id_uid: 56,
+ nama_uid: 'DISTRIBUSI BANTEN',
+ id_up3: 534,
+ nama_up3: 'UP3 BANTEN UTARA',
+ id_ulp: 56120,
+ nama_ulp: 'ULP CILEGON',
+ id_posko: 561201,
+ nama_posko: 'POSKO ULP CILEGON',
+ total: 1177,
+ total_selesai: 1057,
+ persen_selesai: 89.80458793542905,
+ total_inproses: 120,
+ persen_inproses: 10.195412064570943,
+ avg_durasi_dispatch: 2.6475972540045767,
+ min_durasi_dispatch: 2,
+ max_durasi_dispatch: 2544,
+ total_dibawah_sla_dispatch: 796,
+ total_diatas_sla_dispatch: 78,
+ avg_durasi_response: 19.35131396957123,
+ min_durasi_response: 90,
+ max_durasi_response: 4412,
+ total_dibawah_sla_response: 713,
+ total_diatas_sla_response: 10,
+ avg_durasi_recovery: 32.180281690140845,
+ min_durasi_recovery: 90,
+ max_durasi_recovery: 4951,
+ total_dibawah_sla_recovery: 710,
+ total_diatas_sla_recovery: 0,
+ count_durasi_dispatch: 894,
+ count_durasi_response: 743,
+ count_durasi_recovery: 730
}
]
dataSub.value = []
From e25bf9612e0078aad2811ddeed087f42f5ff48d0 Mon Sep 17 00:00:00 2001
From: Dede Fuji Abdul
Date: Wed, 3 Apr 2024 04:50:38 +0700
Subject: [PATCH 15/29] Refactor gangguan rekap components
---
.../Gangguan/Rekap/RGangguan_AlihPosko.vue | 12 +-
.../MonalisaGR_DispatchingTimeGangguan.vue | 12 +-
.../Rekap/MonalisaKR_KeluhanBelumSelesai.vue | 327 +++++++++++++++++-
3 files changed, 333 insertions(+), 18 deletions(-)
diff --git a/src/components/Pages/Gangguan/Rekap/RGangguan_AlihPosko.vue b/src/components/Pages/Gangguan/Rekap/RGangguan_AlihPosko.vue
index ecde4da..bd68796 100755
--- a/src/components/Pages/Gangguan/Rekap/RGangguan_AlihPosko.vue
+++ b/src/components/Pages/Gangguan/Rekap/RGangguan_AlihPosko.vue
@@ -135,7 +135,7 @@
-
+
{{
isNumber(data.text)
? data.column.caption == '%'
@@ -147,7 +147,7 @@
-
+
{{
isNumber(data.text)
? data.column.caption == '%'
@@ -566,10 +566,10 @@ const getDetail = async () => {
dateTo: dateValue[1]
? dateValue[1].split('-').reverse().join('-')
: new Date().toISOString().slice(0, 10),
- idUid: ref.id_uid,
- idUp3: ref.id_up3,
- idPoskoLama: poskoSelected.value == 'baru' ? 0 : ref.id_posko_baru,
- idPoskoBaru: poskoSelected.value == 'lama' ? 0 : ref.id_posko_lama
+ idUid: 0,
+ idUp3: 0,
+ idPoskoLama: poskoSelected.value == 'out' ? ref.id_posko_lama : 0,
+ idPoskoBaru: poskoSelected.value == 'in' ? ref.id_posko_baru : 0
}
await requestGraphQl(queries.gangguan.rekap.gangguanAlihPoskoDetail, query)
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue
index 6e6955d..79ab271 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue
@@ -826,22 +826,22 @@ const getDetail = async () => {
dateTo: dateValue[1]
? dateValue[1].split('-').reverse().join('-')
: new Date().toISOString().slice(0, 10),
- idUlp: selected?.id_ulp ? selected?.id_ulp : 0,
+ posko: selected?.id_ulp ? selected?.id_ulp : 0,
idUid: selected?.id_uid ? selected?.id_uid : 0,
idUp3: selected?.id_up3 ? selected?.id_up3 : 0,
+ idRegu: selected?.id_regu ? selected?.id_regu : 0,
+ idUlp: selected?.id_ulp ? selected?.id_ulp : 0,
namaRegional: selected?.nama_regional ? selected?.nama_regional : '',
media: selected?.media ? selected?.media : '',
isSelesai: 0,
- tanggal: '',
- namaIssuetype: '',
- namaSubissuetype: ''
+ tanggal: ''
}
loadingSubData.value = true
- await requestGraphQl(queries.keluhan.rekap.rekapKeluhanAllDetail, query)
+ await requestGraphQl(queries.gangguan.rekap.gangguanAllDetail, query)
.then((result) => {
if (result.data.data != undefined) {
- dataSub.value = result.data.data.detailKeluhanAll
+ dataSub.value = result.data.data.detailGangguan
} else {
dataSub.value = []
}
diff --git a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue
index 0ce1eaa..020a774 100755
--- a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue
+++ b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue
@@ -193,6 +193,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ data.text }}
+
+
+
+
+
+ {{ data.text }}
+
+
+
+
+
+ {{ parseInt(data.text) ? formatWaktu(data.text) : '-' }}
+
+
+
+
+
+
+
+
+
+
No Laporan:
+
+
+
+
+
UID/UIW:
+
+
+
+
+
UP3:
+
+
+
+
+
ULP:
+
+
+
+
+
ID Pelanggan:
+
+
+
+
+
Nama Pelapor:
+
+
+
+
+
Alamat Pelapor:
+
+
+
+
+
No Telp Pelapor:
+
+
+
+
+
Keterangan Pelapor:
+
+
+
+
+
Penyebab:
+
+
+
+
+
Kode Gangguan:
+
+
+
+
+
Jenis Gangguan:
+
+
+
+
+
Durasi Response Time:
+
+
+
+
+
Durasi Recoery Time:
+
+
+
+
+
Tgl Lapor:
+
+
+
+
+
@@ -208,6 +525,7 @@ import {
DxGroupItem,
DxGrouping,
DxLoadPanel,
+ DxPager,
DxPaging,
DxScrolling,
DxSearchPanel,
@@ -225,6 +543,9 @@ import { useQuery } from '@vue/apollo-composable'
import { apolloClient, queries, requestGraphQl } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import DetailDialog from '@/components/Dialogs/DetailDialog.vue'
+import { formatWaktu } from '@/components/Form/FiltersType/reference'
+import InputText from '@/components/InputText.vue'
const client = apolloClient()
provideApolloClient(client)
@@ -278,12 +599,6 @@ const getDetail = async () => {
const selected = dataSelected.value
const query = {
- dateFrom: dateValue[0]
- ? dateValue[0].split('-').reverse().join('-')
- : new Date().toISOString().slice(0, 10),
- dateTo: dateValue[1]
- ? dateValue[1].split('-').reverse().join('-')
- : new Date().toISOString().slice(0, 10),
idUlp: selected?.id_ulp ? selected?.id_ulp : 0,
idUid: selected?.id_uid ? selected?.id_uid : 0,
idUp3: selected?.id_up3 ? selected?.id_up3 : 0,
From 9528a9400e0f53421564ce9d8e7ccf05e8eeb131 Mon Sep 17 00:00:00 2001
From: Dede Fuji Abdul
Date: Wed, 3 Apr 2024 05:04:24 +0700
Subject: [PATCH 16/29] Update DatePicker and DGangguan_DKPL components
---
src/components/DatePicker.vue | 46 ++++++++++++++++++-
.../Pages/Gangguan/Daftar/DGangguan_DKPL.vue | 14 +++---
2 files changed, 51 insertions(+), 9 deletions(-)
diff --git a/src/components/DatePicker.vue b/src/components/DatePicker.vue
index 31bb88e..3a7bb7b 100755
--- a/src/components/DatePicker.vue
+++ b/src/components/DatePicker.vue
@@ -15,14 +15,56 @@ const emit = defineEmits(['update:dateValue'])
const customShortcuts = () => {
return [
{
- label: 'Last 15 Days',
+ label: 'Hari Ini',
+ atClick: () => {
+ const date = new Date()
+ return [new Date(date.setHours(0, 0, 0, 0)), new Date()]
+ }
+ },
+ {
+ label: 'Kemarin',
+ atClick: () => {
+ const date = new Date()
+ return [new Date(date.setDate(date.getDate() - 1)), new Date(date.setHours(0, 0, 0, 0))]
+ }
+ },
+ {
+ label: '7 Hari Terakhir',
+ atClick: () => {
+ const date = new Date()
+ return [new Date(date.setDate(date.getDate() - 7)), new Date()]
+ }
+ },
+ {
+ label: '15 Hari Terakhir',
atClick: () => {
const date = new Date()
return [new Date(date.setDate(date.getDate() - 15)), new Date()]
}
},
{
- label: 'Last Years',
+ label: '30 Hari Terakhir',
+ atClick: () => {
+ const date = new Date()
+ return [new Date(date.setDate(date.getDate() - 30)), new Date()]
+ }
+ },
+ {
+ label: '3 Bulan Terakhir',
+ atClick: () => {
+ const date = new Date()
+ return [new Date(date.setMonth(date.getMonth() - 3)), new Date()]
+ }
+ },
+ {
+ label: '6 Bulan Terakhir',
+ atClick: () => {
+ const date = new Date()
+ return [new Date(date.setMonth(date.getMonth() - 6)), new Date()]
+ }
+ },
+ {
+ label: '1 Tahun Terakhir',
atClick: () => {
const date = new Date()
return [new Date(date.setFullYear(date.getFullYear() - 1)), new Date()]
diff --git a/src/components/Pages/Gangguan/Daftar/DGangguan_DKPL.vue b/src/components/Pages/Gangguan/Daftar/DGangguan_DKPL.vue
index a347997..3697a7c 100755
--- a/src/components/Pages/Gangguan/Daftar/DGangguan_DKPL.vue
+++ b/src/components/Pages/Gangguan/Daftar/DGangguan_DKPL.vue
@@ -122,7 +122,7 @@
/>
Date: Wed, 3 Apr 2024 10:51:10 +0700
Subject: [PATCH 17/29] feat: create export pdf, xlsx in monalisa rekapitulasi
gangguan
---
src/assets/css/style.css | 4 -
.../Gangguan/Rekap/MonalisaGR_ENSGangguan.vue | 63 +--
.../Rekap/MonalisaGR_GangguanBelumSelesai.vue | 70 +--
.../MonalisaGR_GangguanPerJenisGangguan.vue | 57 +-
.../MonalisaGR_JumlahDDRPTRCTGangguan.vue | 61 +--
.../Gangguan/Rekap/MonalisaGR_LaporUlang.vue | 63 +--
.../Rekap/MonalisaGR_RecoveryTimeGangguan.vue | 67 +--
.../Rekap/MonalisaGR_ResponseTimeGangguan.vue | 67 +--
.../Gangguan/Rekap/MonalisaGR_ENSGangguan.ts | 372 +++++++++++++
.../Rekap/MonalisaGR_GangguanBelumSelesai.ts | 493 ++++++++++++++++++
.../MonalisaGR_GangguanPerJenisGangguan.ts | 286 ++++++++++
.../MonalisaGR_JumlahDDRPTRCTGangguan.ts | 325 ++++++++++++
.../Rekap/MonalisaGR_JumlahKaliGangguan.ts | 2 +-
.../Gangguan/Rekap/MonalisaGR_LaporUlang.ts | 372 +++++++++++++
.../Rekap/MonalisaGR_RecoveryTimeGangguan.ts | 384 ++++++++++++++
.../Rekap/MonalisaGR_ResponseTimeGangguan.ts | 384 ++++++++++++++
16 files changed, 2861 insertions(+), 209 deletions(-)
create mode 100644 src/report/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.ts
create mode 100644 src/report/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanBelumSelesai.ts
create mode 100644 src/report/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanPerJenisGangguan.ts
create mode 100644 src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahDDRPTRCTGangguan.ts
create mode 100644 src/report/Monalisa/Gangguan/Rekap/MonalisaGR_LaporUlang.ts
create mode 100644 src/report/Monalisa/Gangguan/Rekap/MonalisaGR_RecoveryTimeGangguan.ts
create mode 100644 src/report/Monalisa/Gangguan/Rekap/MonalisaGR_ResponseTimeGangguan.ts
diff --git a/src/assets/css/style.css b/src/assets/css/style.css
index 7e3d44c..bd90444 100755
--- a/src/assets/css/style.css
+++ b/src/assets/css/style.css
@@ -5545,10 +5545,6 @@ body {
grid-column-start: 2;
}
- .sm\:m-8 {
- margin: 2rem;
- }
-
.sm\:mx-0 {
margin-left: 0px;
margin-right: 0px;
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.vue
index 49e996e..3e8d408 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -285,18 +286,13 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { getMonthName } from '@/utils/texts'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import { exportToPDF, exportToXLSX } from '@/report/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan'
const client = apolloClient()
provideApolloClient(client)
@@ -319,6 +315,20 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1,
+ lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(),
+ currentMonth: new Date().getMonth(),
+ currentYear: new Date().getFullYear(),
+ lastYear: new Date().getFullYear() - 1
+})
const resetData = () => {
data.value = []
@@ -351,6 +361,21 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ lastMonth: lastMonth.value,
+ lastYearMoM: lastYearMoM.value,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
@@ -362,30 +387,10 @@ const filterData = async (params: any) => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanBelumSelesai.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanBelumSelesai.vue
index 7cb5bc7..021b1c9 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanBelumSelesai.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanBelumSelesai.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -203,7 +204,7 @@
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
- @exporting="onExporting"
+ @exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -500,6 +501,7 @@
+
@@ -523,12 +525,6 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import DetailDialog from '@/components/Dialogs/DetailDialog.vue'
@@ -537,6 +533,13 @@ import { formatWaktu } from '@/components/Form/FiltersType/reference'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import { getMonthName } from '@/utils/texts'
+import {
+ exportToPDF,
+ exportToXLSX,
+ exportDetailToPDF,
+ exportDetailToXLSX
+} from '@/report/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanBelumSelesai'
const client = apolloClient()
provideApolloClient(client)
@@ -555,6 +558,15 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: ''
+})
const closeDialog = () => {
dialogDetail.value = false
@@ -589,6 +601,16 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`
+ }
})
.catch((err) => {
console.error(err)
@@ -600,33 +622,21 @@ const filterData = async (params: any) => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
+const onExportingDetail = (e: any) => {
+ if (e.format === 'pdf') {
+ exportDetailToPDF(reportMeta.value, dataSub.value)
+ } else if (e.format === 'xlsx') {
+ exportDetailToXLSX(reportMeta.value, e)
+ } else {
+ }
+}
const getDetail = async () => {
const dateValue = filters.value.periode.split(' s/d ')
const selected = dataSelected.value
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanPerJenisGangguan.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanPerJenisGangguan.vue
index bf90517..5dfc426 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanPerJenisGangguan.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanPerJenisGangguan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -152,17 +153,16 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import { getMonthName } from '@/utils/texts'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanPerJenisGangguan'
const client = apolloClient()
provideApolloClient(client)
@@ -181,6 +181,15 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: ''
+})
const resetData = () => {
data.value = []
@@ -207,6 +216,16 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`
+ }
})
.catch((err) => {
console.error(err)
@@ -218,30 +237,10 @@ const filterData = async (params: any) => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahDDRPTRCTGangguan.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahDDRPTRCTGangguan.vue
index 1c881b6..0d92d1b 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahDDRPTRCTGangguan.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahDDRPTRCTGangguan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -7,6 +8,7 @@
>
(filters = value)" />
+
(dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value
+})
const resetData = () => {
data.value = []
@@ -433,6 +444,18 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ currentMonth: bulan.id,
+ currentYear: tahun.id
+ }
})
.catch((err) => {
console.error(err)
@@ -447,30 +470,10 @@ const filterData = async (params: any) => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_LaporUlang.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_LaporUlang.vue
index c24dcd5..d9142a5 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_LaporUlang.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_LaporUlang.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -287,18 +288,13 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { getMonthName } from '@/utils/texts'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import { exportToPDF, exportToXLSX } from '@/report/Monalisa/Gangguan/Rekap/MonalisaGR_LaporUlang'
const client = apolloClient()
provideApolloClient(client)
@@ -321,6 +317,20 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1,
+ lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(),
+ currentMonth: new Date().getMonth(),
+ currentYear: new Date().getFullYear(),
+ lastYear: new Date().getFullYear() - 1
+})
const resetData = () => {
data.value = []
@@ -353,6 +363,21 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ lastMonth: lastMonth.value,
+ lastYearMoM: lastYearMoM.value,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
@@ -363,30 +388,10 @@ const filterData = async (params: any) => {
}
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_RecoveryTimeGangguan.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_RecoveryTimeGangguan.vue
index 76ae1e0..24a0b1f 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_RecoveryTimeGangguan.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_RecoveryTimeGangguan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
:report-button="true"
@reset-form="data = []"
@run-search="() => filterData(filters)"
@@ -270,6 +271,7 @@
+
@@ -292,18 +294,16 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { getMonthName } from '@/utils/texts'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Gangguan/Rekap/MonalisaGR_RecoveryTimeGangguan'
const client = apolloClient()
provideApolloClient(client)
@@ -326,6 +326,20 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1,
+ lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(),
+ currentMonth: new Date().getMonth(),
+ currentYear: new Date().getFullYear(),
+ lastYear: new Date().getFullYear() - 1
+})
const resetData = () => {
data.value = []
@@ -358,6 +372,21 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ lastMonth: lastMonth.value,
+ lastYearMoM: lastYearMoM.value,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
@@ -369,30 +398,10 @@ const filterData = async (params: any) => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ResponseTimeGangguan.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ResponseTimeGangguan.vue
index f841121..10cf2ef 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ResponseTimeGangguan.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_ResponseTimeGangguan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
:report-button="true"
@run-search="() => filterData(filters)"
@@ -270,6 +271,7 @@
+
@@ -292,18 +294,16 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { getMonthName } from '@/utils/texts'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Gangguan/Rekap/MonalisaGR_ResponseTimeGangguan'
const client = apolloClient()
provideApolloClient(client)
@@ -326,6 +326,20 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1,
+ lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(),
+ currentMonth: new Date().getMonth(),
+ currentYear: new Date().getFullYear(),
+ lastYear: new Date().getFullYear() - 1
+})
const resetData = () => {
data.value = []
@@ -358,6 +372,21 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ lastMonth: lastMonth.value,
+ lastYearMoM: lastYearMoM.value,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
@@ -369,30 +398,10 @@ const filterData = async (params: any) => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
diff --git a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.ts b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.ts
new file mode 100644
index 0000000..fceccf7
--- /dev/null
+++ b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_ENSGangguan.ts
@@ -0,0 +1,372 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Rekapitulasi ENS Gangguan'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ persen_mom: [],
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0,
+ persen_yoy: []
+ }
+ }
+
+ groupedData[regional].summary.mom_bulan_kemarin += item.mom_bulan_kemarin
+ groupedData[regional].summary.mom_bulan_ini += item.mom_bulan_ini
+ groupedData[regional].summary.persen_mom.push(item.persen_mom)
+ groupedData[regional].summary.yoy_tahun_kemarin += item.yoy_tahun_kemarin
+ groupedData[regional].summary.yoy_tahun_ini += item.yoy_tahun_ini
+ groupedData[regional].summary.persen_yoy.push(item.persen_yoy)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 7, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.mom_bulan_kemarin),
+ formatNumber(summary.mom_bulan_ini),
+ formatPercentage(
+ !summary.mom_bulan_ini || !summary.mom_bulan_kemarin
+ ? '0%'
+ : ((summary.mom_bulan_kemarin - summary.mom_bulan_ini) / summary.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(summary.yoy_tahun_kemarin),
+ formatNumber(summary.yoy_tahun_ini),
+ formatPercentage(
+ !summary.yoy_tahun_ini || !summary.yoy_tahun_kemarin
+ ? '0%'
+ : ((summary.yoy_tahun_kemarin - summary.yoy_tahun_ini) / summary.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ total.mom_bulan_kemarin += summary.mom_bulan_kemarin
+ total.mom_bulan_ini += summary.mom_bulan_ini
+ total.yoy_tahun_kemarin += summary.yoy_tahun_kemarin
+ total.yoy_tahun_ini += summary.yoy_tahun_ini
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(total.mom_bulan_kemarin),
+ formatNumber(total.mom_bulan_ini),
+ formatPercentage(
+ !total.mom_bulan_ini || !total.mom_bulan_kemarin
+ ? '0%'
+ : ((total.mom_bulan_kemarin - total.mom_bulan_ini) / total.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(total.yoy_tahun_kemarin),
+ formatNumber(total.yoy_tahun_ini),
+ formatPercentage(
+ !total.yoy_tahun_ini || !total.yoy_tahun_kemarin
+ ? '0%'
+ : ((total.yoy_tahun_kemarin - total.yoy_tahun_ini) / total.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ 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: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'ENS Gangguan',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'MOM',
+ colSpan: 3
+ },
+ {
+ content: 'YOY',
+ colSpan: 3
+ }
+ ],
+ [
+ `${getMonthName(reportMeta.lastMonth)} ${reportMeta.lastYearMoM}`,
+ `${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%',
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.lastYear}`,
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:G1')
+ worksheet.mergeCells('A2:G2')
+ worksheet.mergeCells('A3:G3')
+ worksheet.mergeCells('A4:G4')
+ worksheet.mergeCells('A5:G5')
+ worksheet.mergeCells('A7:G7')
+ worksheet.mergeCells('A8:G8')
+
+ 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 }
diff --git a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanBelumSelesai.ts b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanBelumSelesai.ts
new file mode 100644
index 0000000..9c513f7
--- /dev/null
+++ b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanBelumSelesai.ts
@@ -0,0 +1,493 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber } from '@/utils/numbers'
+import { formatWaktu } from '@/components/Form/FiltersType/reference'
+
+const reportName = 'Rekapitulasi Gangguan Belum Selesai'
+const fontSize = 5
+const detailFontSize = 3
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ jumlah_gangguan: 0,
+ jumlah_informasi: 0,
+ total: 0
+ }
+ }
+
+ groupedData[regional].summary.jumlah_gangguan += item.jumlah_gangguan
+ groupedData[regional].summary.jumlah_informasi += item.jumlah_informasi
+ groupedData[regional].summary.total += item.total
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ jumlah_gangguan: 0,
+ jumlah_informasi: 0,
+ total: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 5, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.jumlah_gangguan),
+ formatNumber(summary.jumlah_informasi),
+ formatNumber(summary.total)
+ ])
+
+ total.jumlah_gangguan += summary.jumlah_gangguan
+ total.jumlah_informasi += summary.jumlah_informasi
+ total.total += summary.total
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(total.jumlah_gangguan),
+ formatNumber(total.jumlah_informasi),
+ formatNumber(total.total)
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'No',
+ rowSpan: 2
+ },
+ {
+ content: 'Nama Unit',
+ rowSpan: 2
+ },
+ {
+ content: 'Tahun',
+ colSpan: 3
+ }
+ ],
+ ['Gangguan', 'Informasi', 'Total']
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+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 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()], [reportMeta.periode]],
+ styles: {
+ fontSize: detailFontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 18,
+ margin: 5
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ 'No',
+ 'No Laporan',
+ 'UID/UIW',
+ 'UP3',
+ 'ULP',
+ 'ID Pelanggan',
+ 'Nama Pelapor',
+ 'Alamat Pelapor',
+ 'No Telp Pelapor',
+ 'Keterangan Pelapor',
+ 'Penyebab',
+ 'Kode Gangguan',
+ 'Jenis Gangguan',
+ 'Durasi Response Time',
+ 'Durasi Recovery Time',
+ 'Tgl Lapor'
+ ]
+ ],
+ body: rawData.map((item: any, i: any) => [
+ { content: i + 1, styles: { halign: 'right' } },
+ item.no_laporan,
+ item.nama_uid,
+ item.nama_ulp,
+ item.id_pelanggan,
+ item.nama_pelapor,
+ item.alamat_pelapor,
+ item.no_telp_pelapor,
+ item.keterangan_pelapor,
+ item.penyebab,
+ item.kode_gangguan,
+ item.jenis_gangguan,
+ item.durasi_response_time ? formatWaktu(item.durasi_response_time) : '-',
+ item.durasi_recovery_time ? formatWaktu(item.durasi_recovery_time) : '-',
+ item.waktu_lapor
+ ]),
+ 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',
+ cellWidth: 'wrap',
+ 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 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:E1')
+ worksheet.mergeCells('A2:E2')
+ worksheet.mergeCells('A3:E3')
+ worksheet.mergeCells('A4:E4')
+ worksheet.mergeCells('A5:E5')
+ worksheet.mergeCells('A7:E7')
+ worksheet.mergeCells('A8:E8')
+
+ 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
+}
+
+const exportDetailToXLSX = (reportMeta: any, e: 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 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, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:P1')
+ worksheet.mergeCells('A3:P3')
+ worksheet.mergeCells('A4:P4')
+
+ 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
+}
+
+export { exportToPDF, exportToXLSX, exportDetailToPDF, exportDetailToXLSX }
diff --git a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanPerJenisGangguan.ts b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanPerJenisGangguan.ts
new file mode 100644
index 0000000..e2f7db6
--- /dev/null
+++ b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_GangguanPerJenisGangguan.ts
@@ -0,0 +1,286 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+
+const reportName = 'Rekapitulasi Gangguan Per Jenis Gangguan'
+const fontSize = 5
+
+const formatData = (rawData: any) => {
+ const formattedData: any = []
+
+ const total: any = {
+ jumlah: 0,
+ persen: []
+ }
+
+ rawData.forEach((data: any, index: any) => {
+ formattedData.push([
+ { content: ++index, styles: { halign: 'right' } },
+ data.id_jenis_gangguan,
+ data.nama_jenis_gangguan,
+ formatNumber(data.jumlah),
+ formatPercentage(data.persen)
+ ])
+
+ total.jumlah += data.jumlah
+ total.persen.push(data.persen)
+ })
+
+ formattedData.push([
+ {
+ content: 'TOTAL',
+ colSpan: 3
+ },
+ formatNumber(total.jumlah),
+ formatPercentage(total.persen.reduce((a: any, b: any) => a + b, 0) / total.persen.length)
+ ])
+
+ formattedData.push([
+ {
+ content: 'ENS',
+ colSpan: 3
+ },
+ {
+ content: '19.169.174,65',
+ colSpan: 2
+ }
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [['No', 'ID Gangguan', 'Jenis Gangguan', 'Jumlah', '%']],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+
+ if (data.cell.text[0] === 'ENS') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:E1')
+ worksheet.mergeCells('A2:E2')
+ worksheet.mergeCells('A3:E3')
+ worksheet.mergeCells('A4:E4')
+ worksheet.mergeCells('A5:E5')
+ worksheet.mergeCells('A7:E7')
+ worksheet.mergeCells('A8:E8')
+
+ 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 }
diff --git a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahDDRPTRCTGangguan.ts b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahDDRPTRCTGangguan.ts
new file mode 100644
index 0000000..98dd461
--- /dev/null
+++ b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahDDRPTRCTGangguan.ts
@@ -0,0 +1,325 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Jumlah dan Durasi RPT RCT Gangguan'
+const fontSize = 5
+
+const formatData = (rawData: any) => {
+ const formattedData: any = []
+
+ const total: any = {
+ total_durasi_response_time_bulan_ini: 0,
+ count_durasi_response_time_bulan_ini: 0,
+ total_durasi_recovery_time_bulan_ini: 0,
+ count_durasi_recovery_time_bulan_ini: 0,
+ total_durasi_response_time_tahun_ini: 0,
+ count_durasi_response_time_tahun_ini: 0,
+ total_durasi_recovery_time_tahun_ini: 0,
+ count_durasi_recovery_time_tahun_ini: 0
+ }
+
+ rawData.forEach((data: any) => {
+ total.total_durasi_response_time_bulan_ini += data.total_durasi_response_time_bulan_ini
+ total.count_durasi_response_time_bulan_ini += data.count_durasi_response_time_bulan_ini
+ total.total_durasi_recovery_time_bulan_ini += data.total_durasi_recovery_time_bulan_ini
+ total.count_durasi_recovery_time_bulan_ini += data.count_durasi_recovery_time_bulan_ini
+ total.total_durasi_response_time_tahun_ini += data.total_durasi_response_time_tahun_ini
+ total.count_durasi_response_time_tahun_ini += data.count_durasi_response_time_tahun_ini
+ total.total_durasi_recovery_time_tahun_ini += data.total_durasi_recovery_time_tahun_ini
+ total.count_durasi_recovery_time_tahun_ini += data.count_durasi_recovery_time_tahun_ini
+ })
+
+ formattedData.push([
+ 'NASIONAL',
+ formatNumber(total.total_durasi_response_time_bulan_ini),
+ formatNumber(total.count_durasi_response_time_bulan_ini),
+ formatNumber(
+ total.total_durasi_response_time_bulan_ini / total.count_durasi_response_time_bulan_ini
+ ),
+ formatNumber(total.total_durasi_recovery_time_bulan_ini),
+ formatNumber(total.count_durasi_recovery_time_bulan_ini),
+ formatPercentage(
+ total.total_durasi_recovery_time_bulan_ini / total.count_durasi_recovery_time_bulan_ini
+ ),
+ formatNumber(total.total_durasi_response_time_tahun_ini),
+ formatNumber(total.count_durasi_response_time_tahun_ini),
+ formatPercentage(
+ total.total_durasi_response_time_tahun_ini / total.count_durasi_response_time_tahun_ini
+ ),
+ formatNumber(total.total_durasi_recovery_time_tahun_ini),
+ formatNumber(total.count_durasi_recovery_time_tahun_ini),
+ formatPercentage(
+ total.total_durasi_recovery_time_tahun_ini / total.count_durasi_recovery_time_tahun_ini
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'Nama Unit',
+ rowSpan: 4
+ },
+ {
+ content: 'Jumlah dan Durasi RPT & RCT Gangguan',
+ colSpan: 12
+ }
+ ],
+ [
+ {
+ content: getMonthName(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ colSpan: 6
+ },
+ {
+ content:
+ 's.d' + ' ' + getMonthName(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ colSpan: 6
+ }
+ ],
+ [
+ 'Total RPT',
+ 'Jumlah Gangguan',
+ 'RPT Gangguan',
+ 'Total RCT',
+ 'Jumlah Gangguan',
+ 'RCT Gangguan',
+ 'Total RPT',
+ 'Jumlah Gangguan',
+ 'RPT Gangguan',
+ 'Total RCT',
+ 'Jumlah Gangguan',
+ 'RCT Gangguan'
+ ],
+ ['a', 'b', 'c=a/b', 'd', 'e', 'f=d/e', 'a', 'b', 'c=a/b', 'd', 'e', 'f=d/e']
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'RATA-RATA') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:M1')
+ worksheet.mergeCells('A2:M2')
+ worksheet.mergeCells('A3:M3')
+ worksheet.mergeCells('A4:M4')
+ worksheet.mergeCells('A5:M5')
+ worksheet.mergeCells('A7:M7')
+ worksheet.mergeCells('A8:M8')
+
+ 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 }
diff --git a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.ts b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.ts
index 44016da..14863a9 100644
--- a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.ts
+++ b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_JumlahKaliGangguan.ts
@@ -21,7 +21,7 @@ import { setHeaderStyle } from '@/report/utils/xlsx'
import { formatNumber, formatPercentage } from '@/utils/numbers'
import { getMonthName } from '@/utils/texts'
-const reportName = 'Rekapitulasi Gangguan All'
+const reportName = 'Jumlah Kali Gangguan'
const fontSize = 5
const detailFontSize = 3
diff --git a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_LaporUlang.ts b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_LaporUlang.ts
new file mode 100644
index 0000000..ef93902
--- /dev/null
+++ b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_LaporUlang.ts
@@ -0,0 +1,372 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Rekapitulasi Lapor Ulang Gangguan'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ persen_mom: [],
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0,
+ persen_yoy: []
+ }
+ }
+
+ groupedData[regional].summary.mom_bulan_kemarin += item.mom_bulan_kemarin
+ groupedData[regional].summary.mom_bulan_ini += item.mom_bulan_ini
+ groupedData[regional].summary.persen_mom.push(item.persen_mom)
+ groupedData[regional].summary.yoy_tahun_kemarin += item.yoy_tahun_kemarin
+ groupedData[regional].summary.yoy_tahun_ini += item.yoy_tahun_ini
+ groupedData[regional].summary.persen_yoy.push(item.persen_yoy)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 7, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.mom_bulan_kemarin),
+ formatNumber(summary.mom_bulan_ini),
+ formatPercentage(
+ !summary.mom_bulan_ini || !summary.mom_bulan_kemarin
+ ? '0%'
+ : ((summary.mom_bulan_kemarin - summary.mom_bulan_ini) / summary.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(summary.yoy_tahun_kemarin),
+ formatNumber(summary.yoy_tahun_ini),
+ formatPercentage(
+ !summary.yoy_tahun_ini || !summary.yoy_tahun_kemarin
+ ? '0%'
+ : ((summary.yoy_tahun_kemarin - summary.yoy_tahun_ini) / summary.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ total.mom_bulan_kemarin += summary.mom_bulan_kemarin
+ total.mom_bulan_ini += summary.mom_bulan_ini
+ total.yoy_tahun_kemarin += summary.yoy_tahun_kemarin
+ total.yoy_tahun_ini += summary.yoy_tahun_ini
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(total.mom_bulan_kemarin),
+ formatNumber(total.mom_bulan_ini),
+ formatPercentage(
+ !total.mom_bulan_ini || !total.mom_bulan_kemarin
+ ? '0%'
+ : ((total.mom_bulan_kemarin - total.mom_bulan_ini) / total.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(total.yoy_tahun_kemarin),
+ formatNumber(total.yoy_tahun_ini),
+ formatPercentage(
+ !total.yoy_tahun_ini || !total.yoy_tahun_kemarin
+ ? '0%'
+ : ((total.yoy_tahun_kemarin - total.yoy_tahun_ini) / total.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ 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: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Lapor Ulang Gangguan',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'MOM',
+ colSpan: 3
+ },
+ {
+ content: 'YOY',
+ colSpan: 3
+ }
+ ],
+ [
+ `${getMonthName(reportMeta.lastMonth)} ${reportMeta.lastYearMoM}`,
+ `${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%',
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.lastYear}`,
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:G1')
+ worksheet.mergeCells('A2:G2')
+ worksheet.mergeCells('A3:G3')
+ worksheet.mergeCells('A4:G4')
+ worksheet.mergeCells('A5:G5')
+ worksheet.mergeCells('A7:G7')
+ worksheet.mergeCells('A8:G8')
+
+ 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 }
diff --git a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_RecoveryTimeGangguan.ts b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_RecoveryTimeGangguan.ts
new file mode 100644
index 0000000..28c3aae
--- /dev/null
+++ b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_RecoveryTimeGangguan.ts
@@ -0,0 +1,384 @@
+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'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Recovery Time (RCT) Gangguan'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ persen_mom: [],
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0,
+ persen_yoy: []
+ }
+ }
+
+ groupedData[regional].summary.mom_bulan_kemarin += item.mom_bulan_kemarin
+ groupedData[regional].summary.mom_bulan_ini += item.mom_bulan_ini
+ groupedData[regional].summary.persen_mom.push(item.persen_mom)
+ groupedData[regional].summary.yoy_tahun_kemarin += item.yoy_tahun_kemarin
+ groupedData[regional].summary.yoy_tahun_ini += item.yoy_tahun_ini
+ groupedData[regional].summary.persen_yoy.push(item.persen_yoy)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ mom_bulan_kemarin: [],
+ mom_bulan_ini: [],
+ yoy_tahun_kemarin: [],
+ yoy_tahun_ini: []
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 7, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.mom_bulan_kemarin),
+ formatNumber(summary.mom_bulan_ini),
+ formatPercentage(
+ !summary.mom_bulan_ini || !summary.mom_bulan_kemarin
+ ? '0%'
+ : ((summary.mom_bulan_kemarin - summary.mom_bulan_ini) / summary.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(summary.yoy_tahun_kemarin),
+ formatNumber(summary.yoy_tahun_ini),
+ formatPercentage(
+ !summary.yoy_tahun_ini || !summary.yoy_tahun_kemarin
+ ? '0%'
+ : ((summary.yoy_tahun_kemarin - summary.yoy_tahun_ini) / summary.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ total.mom_bulan_kemarin.push(summary.mom_bulan_kemarin)
+ total.mom_bulan_ini.push(summary.mom_bulan_ini)
+ total.yoy_tahun_kemarin.push(summary.yoy_tahun_kemarin)
+ total.yoy_tahun_ini.push(summary.yoy_tahun_ini)
+ }
+
+ const totalMoMBulanKemarin =
+ total.mom_bulan_kemarin.reduce((a: number, b: number) => a + b, 0) /
+ total.mom_bulan_kemarin.length
+ const totalMoMBulanIni =
+ total.mom_bulan_ini.reduce((a: number, b: number) => a + b, 0) / total.mom_bulan_ini.length
+ const totalYoYTahunKemarin =
+ total.yoy_tahun_kemarin.reduce((a: number, b: number) => a + b, 0) /
+ total.yoy_tahun_kemarin.length
+ const totalYoYTahunIni =
+ total.yoy_tahun_ini.reduce((a: number, b: number) => a + b, 0) / total.yoy_tahun_ini.length
+
+ formattedData.push([
+ { content: 'RATA-RATA', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(totalMoMBulanKemarin),
+ formatNumber(totalMoMBulanIni),
+ formatPercentage(
+ !totalMoMBulanIni || !totalMoMBulanKemarin
+ ? '0%'
+ : ((totalMoMBulanKemarin - totalMoMBulanIni) / totalMoMBulanKemarin) * 100
+ ),
+ formatNumber(totalYoYTahunKemarin),
+ formatNumber(totalYoYTahunIni),
+ formatPercentage(
+ !totalYoYTahunIni || !totalYoYTahunKemarin
+ ? '0%'
+ : ((totalYoYTahunKemarin - totalYoYTahunIni) / totalYoYTahunKemarin) * 100
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ 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: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Jumlah RCT Kali Gangguan',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'MOM',
+ colSpan: 3
+ },
+ {
+ content: 'YOY',
+ colSpan: 3
+ }
+ ],
+ [
+ `${getMonthName(reportMeta.lastMonth)} ${reportMeta.lastYearMoM}`,
+ `${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%',
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.lastYear}`,
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'RATA-RATA') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:G1')
+ worksheet.mergeCells('A2:G2')
+ worksheet.mergeCells('A3:G3')
+ worksheet.mergeCells('A4:G4')
+ worksheet.mergeCells('A5:G5')
+ worksheet.mergeCells('A7:G7')
+ worksheet.mergeCells('A8:G8')
+
+ 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 }
diff --git a/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_ResponseTimeGangguan.ts b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_ResponseTimeGangguan.ts
new file mode 100644
index 0000000..8faf15a
--- /dev/null
+++ b/src/report/Monalisa/Gangguan/Rekap/MonalisaGR_ResponseTimeGangguan.ts
@@ -0,0 +1,384 @@
+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'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Response Time (RPT) Gangguan'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ persen_mom: [],
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0,
+ persen_yoy: []
+ }
+ }
+
+ groupedData[regional].summary.mom_bulan_kemarin += item.mom_bulan_kemarin
+ groupedData[regional].summary.mom_bulan_ini += item.mom_bulan_ini
+ groupedData[regional].summary.persen_mom.push(item.persen_mom)
+ groupedData[regional].summary.yoy_tahun_kemarin += item.yoy_tahun_kemarin
+ groupedData[regional].summary.yoy_tahun_ini += item.yoy_tahun_ini
+ groupedData[regional].summary.persen_yoy.push(item.persen_yoy)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ mom_bulan_kemarin: [],
+ mom_bulan_ini: [],
+ yoy_tahun_kemarin: [],
+ yoy_tahun_ini: []
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 7, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.mom_bulan_kemarin),
+ formatNumber(summary.mom_bulan_ini),
+ formatPercentage(
+ !summary.mom_bulan_ini || !summary.mom_bulan_kemarin
+ ? '0%'
+ : ((summary.mom_bulan_kemarin - summary.mom_bulan_ini) / summary.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(summary.yoy_tahun_kemarin),
+ formatNumber(summary.yoy_tahun_ini),
+ formatPercentage(
+ !summary.yoy_tahun_ini || !summary.yoy_tahun_kemarin
+ ? '0%'
+ : ((summary.yoy_tahun_kemarin - summary.yoy_tahun_ini) / summary.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ total.mom_bulan_kemarin.push(summary.mom_bulan_kemarin)
+ total.mom_bulan_ini.push(summary.mom_bulan_ini)
+ total.yoy_tahun_kemarin.push(summary.yoy_tahun_kemarin)
+ total.yoy_tahun_ini.push(summary.yoy_tahun_ini)
+ }
+
+ const totalMoMBulanKemarin =
+ total.mom_bulan_kemarin.reduce((a: number, b: number) => a + b, 0) /
+ total.mom_bulan_kemarin.length
+ const totalMoMBulanIni =
+ total.mom_bulan_ini.reduce((a: number, b: number) => a + b, 0) / total.mom_bulan_ini.length
+ const totalYoYTahunKemarin =
+ total.yoy_tahun_kemarin.reduce((a: number, b: number) => a + b, 0) /
+ total.yoy_tahun_kemarin.length
+ const totalYoYTahunIni =
+ total.yoy_tahun_ini.reduce((a: number, b: number) => a + b, 0) / total.yoy_tahun_ini.length
+
+ formattedData.push([
+ { content: 'RATA-RATA', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(totalMoMBulanKemarin),
+ formatNumber(totalMoMBulanIni),
+ formatPercentage(
+ !totalMoMBulanIni || !totalMoMBulanKemarin
+ ? '0%'
+ : ((totalMoMBulanKemarin - totalMoMBulanIni) / totalMoMBulanKemarin) * 100
+ ),
+ formatNumber(totalYoYTahunKemarin),
+ formatNumber(totalYoYTahunIni),
+ formatPercentage(
+ !totalYoYTahunIni || !totalYoYTahunKemarin
+ ? '0%'
+ : ((totalYoYTahunKemarin - totalYoYTahunIni) / totalYoYTahunKemarin) * 100
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ 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: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Jumlah RCT Kali Gangguan',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'MOM',
+ colSpan: 3
+ },
+ {
+ content: 'YOY',
+ colSpan: 3
+ }
+ ],
+ [
+ `${getMonthName(reportMeta.lastMonth)} ${reportMeta.lastYearMoM}`,
+ `${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%',
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.lastYear}`,
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'RATA-RATA') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:G1')
+ worksheet.mergeCells('A2:G2')
+ worksheet.mergeCells('A3:G3')
+ worksheet.mergeCells('A4:G4')
+ worksheet.mergeCells('A5:G5')
+ worksheet.mergeCells('A7:G7')
+ worksheet.mergeCells('A8:G8')
+
+ 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 }
From b88e38fbb7cdfad7bc5a72e850e7206985f23ae3 Mon Sep 17 00:00:00 2001
From: Dede Fuji Abdul
Date: Wed, 3 Apr 2024 11:21:43 +0700
Subject: [PATCH 18/29] Add Monalisa dispatching time gangguan queries
---
.../Rekap/RGangguan_JenisGangguan.vue | 160 +++++++++---------
.../MonalisaGR_DispatchingTimeGangguan.vue | 117 ++++++++++---
src/utils/api/api.graphql.ts | 110 ++++++++++++
3 files changed, 286 insertions(+), 101 deletions(-)
diff --git a/src/components/Pages/Gangguan/Rekap/RGangguan_JenisGangguan.vue b/src/components/Pages/Gangguan/Rekap/RGangguan_JenisGangguan.vue
index 1a2921f..8d14690 100755
--- a/src/components/Pages/Gangguan/Rekap/RGangguan_JenisGangguan.vue
+++ b/src/components/Pages/Gangguan/Rekap/RGangguan_JenisGangguan.vue
@@ -69,9 +69,9 @@
"
/>
-
+
{
data.value = [...result.data.data.rekapitulasiPerJenisGangguan].map(
(item: any, index: number) => {
return {
- no: ++index,
- sub_kelompok: item.sub_kelompok,
- nama_sub_kelompok: item.nama_sub_kelompok,
- kode: item.kode,
- jenisGangguan: item.tipe_permasalahan,
- laporan: {
- total: item.total,
- sudahSelesai: {
- jml: item.total_selesai,
- persen: item.persen_selesai
- },
- belumSelesai: {
- jml: item.total_inproses,
- persen: item.persen_inproses
- }
- },
- responseTime: {
- menit: {
- total: item.total_durasi_response,
- rataRata: item.avg_durasi_response,
- max: item.max_durasi_response,
- min: item.min_durasi_response
- },
- laporan: {
- lebihSla: item.total_diatas_sla_response,
- kurangSla: item.total_dibawah_sla_response
- }
- },
- recoveryTime: {
- menit: {
- total: item.total_durasi_recovery,
- rataRata: item.avg_durasi_recovery,
- max: item.max_durasi_recovery,
- min: item.min_durasi_recovery
- },
- laporan: {
- lebihSla: item.total_diatas_sla_recovery,
- kurangSla: item.total_dibawah_sla_recovery
- }
- }
+ ...item,
+ no: ++index
}
}
)
@@ -619,6 +581,50 @@ const filterData = async (params: any) => {
})
}
+let total = 0
+let total_selesai = 0
+let total_inproses = 0
+let count_durasi_dispatch = 0
+let total_durasi_dispatch = 0
+let count_durasi_response = 0
+let total_durasi_response = 0
+let count_durasi_recovery = 0
+let total_durasi_recovery = 0
+const calculateCustomSummary = (options: any) => {
+ if (options.name === 'total') {
+ if (options.summaryProcess === 'calculate') {
+ total += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total
+ }
+ }
+
+ if (options.name === 'total_selesai') {
+ if (options.summaryProcess === 'calculate') {
+ total_selesai += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total_selesai
+ }
+ }
+
+ if (options.name === 'total_inproses') {
+ if (options.summaryProcess === 'calculate') {
+ total_inproses += options.value
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = total_inproses
+ }
+ }
+
+ if (options.name === 'persen_selesai') {
+ if (options.summaryProcess === 'start') {
+ total = 0
+ total_selesai = 0
+ } else if (options.summaryProcess === 'finalize') {
+ options.totalValue = (total_selesai / total) * 100
+ }
+ }
+}
+
const filters = ref()
onMounted(() => {
if (import.meta.env.DEV) {
diff --git a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue
index 400996b..ab179c2 100755
--- a/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue
+++ b/src/components/Pages/Monalisa/Gangguan/Rekap/MonalisaGR_DispatchingTimeGangguan.vue
@@ -93,7 +93,7 @@
data-type="number"
:caption="`${getMonthName(lastMonth)} ${lastYearMoM}`"
css-class="custom-table-column"
- cell-template="formatNumber"
+ cell-template="formatNumberMomLastMonthLastYear"
/>
-
+
+ {{
+ isNumber(data.text)
+ ? data.column.caption == '%'
+ ? formatPercentage(data.text)
+ : formatNumber(data.text)
+ : data.text
+ }}
+
+
+
+
+
+ {{
+ isNumber(data.text)
+ ? data.column.caption == '%'
+ ? formatPercentage(data.text)
+ : formatNumber(data.text)
+ : data.text
+ }}
+
+
+
+
+
+ {{
+ isNumber(data.text)
+ ? data.column.caption == '%'
+ ? formatPercentage(data.text)
+ : formatNumber(data.text)
+ : data.text
+ }}
+
+
+
+
+
+ {{
+ isNumber(data.text)
+ ? data.column.caption == '%'
+ ? formatPercentage(data.text)
+ : formatNumber(data.text)
+ : data.text
+ }}
+
+
+
+
+
{{
isNumber(data.text)
? data.column.caption == '%'
@@ -265,7 +325,7 @@
-
+
{{ data.text }}
@@ -748,6 +808,9 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const dataType = ref('')
+const dataYear = ref(new Date().getFullYear())
+const dataMonth = ref(new Date().getMonth())
const reportMeta = ref({
regional: { id: 0, name: 'Semua Regional' },
uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
@@ -763,6 +826,12 @@ const reportMeta = ref({
lastYear: new Date().getFullYear() - 1
})
+const setRequirements = (type: string, month: number, year: number) => {
+ dataType.value = type
+ dataYear.value = year
+ dataMonth.value = month
+}
+
const onExporting = (e: any) => {
if (e.format === 'pdf') {
exportToPDF(reportMeta.value, data.value)
@@ -835,32 +904,30 @@ const filterData = async (params: any) => {
}
const getDetail = async () => {
- const dateValue = filters.value.periode.split(' s/d ')
const selected = dataSelected.value
const query = {
- dateFrom: dateValue[0]
- ? dateValue[0].split('-').reverse().join('-')
- : new Date().toISOString().slice(0, 10),
- dateTo: dateValue[1]
- ? dateValue[1].split('-').reverse().join('-')
- : new Date().toISOString().slice(0, 10),
- posko: selected?.id_ulp ? selected?.id_ulp : 0,
- idUid: selected?.id_uid ? selected?.id_uid : 0,
- idUp3: selected?.id_up3 ? selected?.id_up3 : 0,
- idRegu: selected?.id_regu ? selected?.id_regu : 0,
+ bulan: dataMonth.value,
+ tahun: dataYear.value,
idUlp: selected?.id_ulp ? selected?.id_ulp : 0,
- namaRegional: selected?.nama_regional ? selected?.nama_regional : '',
- media: selected?.media ? selected?.media : '',
- isSelesai: 0,
- tanggal: ''
+ idUid: selected?.id_uid ? selected?.id_uid : 0,
+ idUp3: selected?.id_up3 ? selected?.id_up3 : 0
}
loadingSubData.value = true
- await requestGraphQl(queries.gangguan.rekap.gangguanAllDetail, query)
+ await requestGraphQl(
+ dataType.value == 'yoy'
+ ? queries.monalisa.gangguan.rekap.dispatchingTimeGangguanDetailYoy
+ : queries.monalisa.gangguan.rekap.dispatchingTimeGangguanDetailMom,
+ query
+ )
.then((result) => {
if (result.data.data != undefined) {
- dataSub.value = result.data.data.detailGangguan
+ if (dataType.value == 'yoy') {
+ dataSub.value = result.data.data.detailMonalisaDispatchingTimeGangguanYoy
+ } else {
+ dataSub.value = result.data.data.detailMonalisaDispatchingTimeGangguanMoM
+ }
} else {
dataSub.value = []
}
@@ -882,7 +949,9 @@ const clearSelection = () => {
const showDetail = () => {
clearSelection()
dataSubSelected.value = null
- getDetail()
+ if (dataType.value == 'yoy' || dataType.value == 'mom') {
+ getDetail()
+ }
}
const onDataSelectionChanged = ({ selectedRowsData }: any) => {
if (selectedRowsData[0] != undefined) {
diff --git a/src/utils/api/api.graphql.ts b/src/utils/api/api.graphql.ts
index 890b7b9..208a86a 100755
--- a/src/utils/api/api.graphql.ts
+++ b/src/utils/api/api.graphql.ts
@@ -1972,6 +1972,116 @@ export const queries = {
monalisa: {
gangguan: {
rekap: {
+ dispatchingTimeGangguanDetailYoy: gql`
+ query detailMonalisaDispatchingTimeGangguanYoY(
+ $bulan: Int!
+ $tahun: Int!
+ $idUlp: Int!
+ $idUid: Int!
+ $idUp3: Int!
+ ) {
+ detailMonalisaDispatchingTimeGangguanYoY(
+ bulan: $bulan
+ tahun: $tahun
+ idUlp: $idUlp
+ idUid: $idUid
+ idUp3: $idUp3
+ ) {
+ id
+ id
+ nama_regional
+ id_uid
+ nama_uid
+ id_up3
+ nama_up3
+ id_ulp
+ nama_ulp
+ id_posko
+ nama_posko
+ no_laporan
+ pembuat_laporan
+ waktu_lapor
+ waktu_dispatch
+ waktu_response
+ waktu_recovery
+ durasi_dispatch_time
+ durasi_response_time
+ durasi_recovery_time
+ status_akhir
+ is_marking
+ referensi_marking
+ idpel_nometer
+ nama_pelapor
+ alamat_pelapor
+ no_telp_pelapor
+ keterangan_pelapor
+ media
+ jarak_closing
+ dispatch_oleh
+ diselesaikan_oleh
+ penyebab
+ tindakan
+ kode_gangguan
+ jenis_gangguan
+ nilai_rating
+ }
+ }
+ `,
+ dispatchingTimeGangguanDetailMom: gql`
+ query detailMonalisaDispatchingTimeGangguanMoM(
+ $bulan: Int!
+ $tahun: Int!
+ $idUlp: Int!
+ $idUid: Int!
+ $idUp3: Int!
+ ) {
+ detailMonalisaDispatchingTimeGangguanMoM(
+ bulan: $bulan
+ tahun: $tahun
+ idUlp: $idUlp
+ idUid: $idUid
+ idUp3: $idUp3
+ ) {
+ id
+ id
+ nama_regional
+ id_uid
+ nama_uid
+ id_up3
+ nama_up3
+ id_ulp
+ nama_ulp
+ id_posko
+ nama_posko
+ no_laporan
+ pembuat_laporan
+ waktu_lapor
+ waktu_dispatch
+ waktu_response
+ waktu_recovery
+ durasi_dispatch_time
+ durasi_response_time
+ durasi_recovery_time
+ status_akhir
+ is_marking
+ referensi_marking
+ idpel_nometer
+ nama_pelapor
+ alamat_pelapor
+ no_telp_pelapor
+ keterangan_pelapor
+ media
+ jarak_closing
+ dispatch_oleh
+ diselesaikan_oleh
+ penyebab
+ tindakan
+ kode_gangguan
+ jenis_gangguan
+ nilai_rating
+ }
+ }
+ `,
dispatchingTimeGangguan: gql`
query monalisaDispatchingTimeGangguan(
$namaRegional: String
From 948181e7267325bc6e89aa8e212db719142cfade Mon Sep 17 00:00:00 2001
From: Dede Fuji Abdul
Date: Wed, 3 Apr 2024 12:46:08 +0700
Subject: [PATCH 19/29] Fix data-field value in MonalisaLB_AgingComplaint.vue
---
.../Bulanan/MonalisaLB_AgingComplaint.vue | 21 +++++++++----------
.../Kumulatif/MonalisaLK_AgingComplaint.vue | 17 +++++++--------
2 files changed, 18 insertions(+), 20 deletions(-)
diff --git a/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.vue b/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.vue
index 2ea55e2..dc48aea 100755
--- a/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.vue
+++ b/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.vue
@@ -79,7 +79,7 @@
alignment="center"
:min-width="170"
data-type="text"
- data-field="na ma_ulp"
+ data-field="nama_ulp"
caption="Nama Unit"
css-class="custom-table-column"
name="namaULP"
@@ -168,35 +168,34 @@
@@ -239,7 +238,7 @@
:show-in-group-footer="false"
:align-by-column="true"
column="sla_gangguan"
- summary-type="sum"
+ summary-type="avg"
display-format="{0}"
:customize-text="(e: any) => formatNumber(e.value)"
/>
@@ -249,7 +248,7 @@
:show-in-group-footer="false"
:align-by-column="true"
column="avg_durasi_recovery_keluhan"
- summary-type="sum"
+ summary-type="avg"
display-format="{0}"
:customize-text="(e: any) => formatNumber(e.value)"
/>
@@ -259,7 +258,7 @@
:show-in-group-footer="false"
:align-by-column="true"
column="sla_keluhan"
- summary-type="sum"
+ summary-type="avg"
display-format="{0}"
:customize-text="(e: any) => formatNumber(e.value)"
/>
diff --git a/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.vue b/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.vue
index 1ce6717..0b0ba29 100755
--- a/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.vue
+++ b/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.vue
@@ -168,35 +168,34 @@
@@ -245,7 +244,7 @@
:show-in-group-footer="false"
:align-by-column="true"
column="sla_gangguan"
- summary-type="sum"
+ summary-type="avg"
display-format="{0}"
:customize-text="(e: any) => formatNumber(e.value)"
/>
@@ -255,7 +254,7 @@
:show-in-group-footer="false"
:align-by-column="true"
column="avg_durasi_recovery_keluhan"
- summary-type="sum"
+ summary-type="avg"
display-format="{0}"
:customize-text="(e: any) => formatNumber(e.value)"
/>
@@ -265,7 +264,7 @@
:show-in-group-footer="false"
:align-by-column="true"
column="sla_keluhan"
- summary-type="sum"
+ summary-type="avg"
display-format="{0}"
:customize-text="(e: any) => formatNumber(e.value)"
/>
From efd316d90e5516adc7695594220dc6e754761e47 Mon Sep 17 00:00:00 2001
From: kur0nek-o
Date: Wed, 3 Apr 2024 16:48:39 +0700
Subject: [PATCH 20/29] feat: create pdf, xlsx and lihat laporan in monalisa
rekapitulasi keluhan
---
.../MonalisaKR_GangguanPerJenisKeluhan.vue | 57 +-
.../MonalisaKR_JumlahDDRPTRCTKeluhan.vue | 68 +--
.../Rekap/MonalisaKR_JumlahKaliKeluhan.vue | 67 +--
.../Rekap/MonalisaKR_KeluhanBelumSelesai.vue | 68 +--
.../Rekap/MonalisaKR_LaporUlangKeluhan.vue | 67 +--
.../Rekap/MonalisaKR_RecoveryTimeKeluhan.vue | 67 +--
.../Rekap/MonalisaKR_ResponseTimeKeluhan.vue | 66 +--
.../MonalisaKR_GangguanPerJenisKeluhan.ts | 275 ++++++++++
.../Rekap/MonalisaKR_JumlahDDRPTRCTKeluhan.ts | 325 ++++++++++++
.../Rekap/MonalisaKR_JumlahKaliKeluhan.ts | 373 +++++++++++++
.../Rekap/MonalisaKR_KeluhanBelumSelesai.ts | 489 ++++++++++++++++++
.../Rekap/MonalisaKR_LaporUlangKeluhan.ts | 372 +++++++++++++
.../Rekap/MonalisaKR_RecoveryTimeKeluhan.ts | 383 ++++++++++++++
.../Rekap/MonalisaKR_ResponseTimeKeluhan.ts | 383 ++++++++++++++
14 files changed, 2855 insertions(+), 205 deletions(-)
create mode 100644 src/report/Monalisa/Keluhan/Rekap/MonalisaKR_GangguanPerJenisKeluhan.ts
create mode 100644 src/report/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahDDRPTRCTKeluhan.ts
create mode 100644 src/report/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahKaliKeluhan.ts
create mode 100644 src/report/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.ts
create mode 100644 src/report/Monalisa/Keluhan/Rekap/MonalisaKR_LaporUlangKeluhan.ts
create mode 100644 src/report/Monalisa/Keluhan/Rekap/MonalisaKR_RecoveryTimeKeluhan.ts
create mode 100644 src/report/Monalisa/Keluhan/Rekap/MonalisaKR_ResponseTimeKeluhan.ts
diff --git a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_GangguanPerJenisKeluhan.vue b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_GangguanPerJenisKeluhan.vue
index 7832c5c..a656c9c 100755
--- a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_GangguanPerJenisKeluhan.vue
+++ b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_GangguanPerJenisKeluhan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -138,17 +139,16 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import { getMonthName } from '@/utils/texts'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Keluhan/Rekap/MonalisaKR_GangguanPerJenisKeluhan'
const client = apolloClient()
provideApolloClient(client)
@@ -168,33 +168,22 @@ const filters = ref()
const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth() + 1)
const lastYear = ref(new Date().getFullYear() - 1)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: ''
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
@@ -284,6 +273,16 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahDDRPTRCTKeluhan.vue b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahDDRPTRCTKeluhan.vue
index d4275be..4f94d3f 100755
--- a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahDDRPTRCTKeluhan.vue
+++ b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahDDRPTRCTKeluhan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -47,6 +48,14 @@
css-class="custom-table-column"
cell-template="formatText"
/>
+
{
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
@@ -527,6 +525,18 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ currentMonth: bulan.id,
+ currentYear: tahun.id
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahKaliKeluhan.vue b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahKaliKeluhan.vue
index 5f1284d..4f44c05 100755
--- a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahKaliKeluhan.vue
+++ b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahKaliKeluhan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@run-search="() => filterData(filters)"
:report-button="true"
@reset-form="data = []"
@@ -260,6 +261,7 @@
+
@@ -283,17 +285,15 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahKaliKeluhan'
const client = apolloClient()
provideApolloClient(client)
@@ -316,33 +316,27 @@ const lastYearMoM = ref(
const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth())
const lastYear = ref(currentYear.value - 1)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1,
+ lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(),
+ currentMonth: new Date().getMonth(),
+ currentYear: new Date().getFullYear(),
+ lastYear: new Date().getFullYear() - 1
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
@@ -377,6 +371,21 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ lastMonth: lastMonth.value,
+ lastYearMoM: lastYearMoM.value,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue
index 020a774..5f5f8cc 100755
--- a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue
+++ b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -213,7 +214,7 @@
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
- @exporting="onExporting"
+ @exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -533,19 +534,20 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { apolloClient, queries, requestGraphQl } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
import DetailDialog from '@/components/Dialogs/DetailDialog.vue'
import { formatWaktu } from '@/components/Form/FiltersType/reference'
import InputText from '@/components/InputText.vue'
+import { getMonthName } from '@/utils/texts'
+import {
+ exportToPDF,
+ exportToXLSX,
+ exportDetailToPDF,
+ exportDetailToXLSX
+} from '@/report/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai'
const client = apolloClient()
provideApolloClient(client)
@@ -565,33 +567,31 @@ const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth())
const lastYear = ref(currentYear.value - 1)
const filters = ref()
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: ''
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
+ }
+}
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
+const onExportingDetail = (e: any) => {
+ if (e.format === 'pdf') {
+ exportDetailToPDF(reportMeta.value, dataSub.value)
+ } else if (e.format === 'xlsx') {
+ exportDetailToXLSX(reportMeta.value, e)
+ } else {
}
}
const getDetail = async () => {
@@ -678,6 +678,16 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_LaporUlangKeluhan.vue b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_LaporUlangKeluhan.vue
index 4b96dd2..fc46978 100755
--- a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_LaporUlangKeluhan.vue
+++ b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_LaporUlangKeluhan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -287,18 +288,15 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
-import gql from 'graphql-tag'
import { getMonthName } from '@/utils/texts'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient, queries, requestGraphQl } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Keluhan/Rekap/MonalisaKR_LaporUlangKeluhan'
const client = apolloClient()
provideApolloClient(client)
@@ -322,33 +320,27 @@ const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth())
const lastYear = ref(currentYear.value - 1)
const filters = ref()
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1,
+ lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(),
+ currentMonth: new Date().getMonth(),
+ currentYear: new Date().getFullYear(),
+ lastYear: new Date().getFullYear() - 1
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
@@ -439,6 +431,21 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ lastMonth: lastMonth.value,
+ lastYearMoM: lastYearMoM.value,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_RecoveryTimeKeluhan.vue b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_RecoveryTimeKeluhan.vue
index 0367891..fa08cd6 100755
--- a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_RecoveryTimeKeluhan.vue
+++ b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_RecoveryTimeKeluhan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -292,18 +293,16 @@ import {
DxTotalItem,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { getMonthName } from '@/utils/texts'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Keluhan/Rekap/MonalisaKR_RecoveryTimeKeluhan'
const client = apolloClient()
provideApolloClient(client)
@@ -326,36 +325,29 @@ const lastYearMoM = ref(
const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth())
const lastYear = ref(currentYear.value - 1)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1,
+ lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(),
+ currentMonth: new Date().getMonth(),
+ currentYear: new Date().getFullYear(),
+ lastYear: new Date().getFullYear() - 1
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
-
const resetData = () => {
data.value = []
dataSub.value = []
@@ -387,6 +379,21 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ lastMonth: lastMonth.value,
+ lastYearMoM: lastYearMoM.value,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_ResponseTimeKeluhan.vue b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_ResponseTimeKeluhan.vue
index fade4e5..5dc2260 100755
--- a/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_ResponseTimeKeluhan.vue
+++ b/src/components/Pages/Monalisa/Keluhan/Rekap/MonalisaKR_ResponseTimeKeluhan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -292,16 +293,14 @@ import {
DxTotalItem,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { getMonthName } from '@/utils/texts'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Keluhan/Rekap/MonalisaKR_ResponseTimeKeluhan'
const position = { of: '#data' }
const showIndicator = ref(true)
@@ -315,6 +314,20 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ lastMonth: new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1,
+ lastYearMoM: new Date().getMonth() == 1 ? new Date().getFullYear() - 1 : new Date().getFullYear(),
+ currentMonth: new Date().getMonth(),
+ currentYear: new Date().getFullYear(),
+ lastYear: new Date().getFullYear() - 1
+})
const lastMonth = ref(new Date().getMonth() == 1 ? 12 : new Date().getMonth() - 1)
const lastYearMoM = ref(
@@ -326,30 +339,10 @@ const lastYear = ref(currentYear.value - 1)
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
@@ -384,6 +377,21 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ lastMonth: lastMonth.value,
+ lastYearMoM: lastYearMoM.value,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_GangguanPerJenisKeluhan.ts b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_GangguanPerJenisKeluhan.ts
new file mode 100644
index 0000000..5ba4c74
--- /dev/null
+++ b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_GangguanPerJenisKeluhan.ts
@@ -0,0 +1,275 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+
+const reportName = '(Monalisa) Rekapitulasi Keluhan Per Jenis Keluhan'
+const fontSize = 5
+
+const formatData = (rawData: any) => {
+ const formattedData: any = []
+
+ const total: any = {
+ jumlah: 0,
+ persen: []
+ }
+
+ rawData.forEach((data: any, index: any) => {
+ formattedData.push([
+ { content: ++index, styles: { halign: 'right' } },
+ data.id_jenis_keluhan,
+ data.nama_jenis_keluhan,
+ formatNumber(data.jumlah),
+ formatPercentage(data.persen)
+ ])
+
+ total.jumlah += data.jumlah
+ total.persen.push(data.persen)
+ })
+
+ formattedData.push([
+ {
+ content: 'TOTAL',
+ colSpan: 3
+ },
+ formatNumber(total.jumlah),
+ formatPercentage(total.persen.reduce((a: any, b: any) => a + b, 0) / total.persen.length)
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [['No', 'ID Gangguan', 'Jenis Gangguan', 'Jumlah', '%']],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+
+ if (data.cell.text[0] === 'ENS') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:E1')
+ worksheet.mergeCells('A2:E2')
+ worksheet.mergeCells('A3:E3')
+ worksheet.mergeCells('A4:E4')
+ worksheet.mergeCells('A5:E5')
+ worksheet.mergeCells('A7:E7')
+ worksheet.mergeCells('A8:E8')
+
+ 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 }
diff --git a/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahDDRPTRCTKeluhan.ts b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahDDRPTRCTKeluhan.ts
new file mode 100644
index 0000000..0698704
--- /dev/null
+++ b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahDDRPTRCTKeluhan.ts
@@ -0,0 +1,325 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Jumlah dan Durasi RPT RCT Keluhan'
+const fontSize = 5
+
+const formatData = (rawData: any) => {
+ const formattedData: any = []
+
+ const total: any = {
+ total_durasi_response_time_bulan_ini: 0,
+ count_durasi_response_time_bulan_ini: 0,
+ total_durasi_recovery_time_bulan_ini: 0,
+ count_durasi_recovery_time_bulan_ini: 0,
+ total_durasi_response_time_tahun_ini: 0,
+ count_durasi_response_time_tahun_ini: 0,
+ total_durasi_recovery_time_tahun_ini: 0,
+ count_durasi_recovery_time_tahun_ini: 0
+ }
+
+ rawData.forEach((data: any) => {
+ total.total_durasi_response_time_bulan_ini += data.total_durasi_response_time_bulan_ini
+ total.count_durasi_response_time_bulan_ini += data.count_durasi_response_time_bulan_ini
+ total.total_durasi_recovery_time_bulan_ini += data.total_durasi_recovery_time_bulan_ini
+ total.count_durasi_recovery_time_bulan_ini += data.count_durasi_recovery_time_bulan_ini
+ total.total_durasi_response_time_tahun_ini += data.total_durasi_response_time_tahun_ini
+ total.count_durasi_response_time_tahun_ini += data.count_durasi_response_time_tahun_ini
+ total.total_durasi_recovery_time_tahun_ini += data.total_durasi_recovery_time_tahun_ini
+ total.count_durasi_recovery_time_tahun_ini += data.count_durasi_recovery_time_tahun_ini
+ })
+
+ formattedData.push([
+ 'NASIONAL',
+ formatNumber(total.total_durasi_response_time_bulan_ini),
+ formatNumber(total.count_durasi_response_time_bulan_ini),
+ formatNumber(
+ total.total_durasi_response_time_bulan_ini / total.count_durasi_response_time_bulan_ini
+ ),
+ formatNumber(total.total_durasi_recovery_time_bulan_ini),
+ formatNumber(total.count_durasi_recovery_time_bulan_ini),
+ formatPercentage(
+ total.total_durasi_recovery_time_bulan_ini / total.count_durasi_recovery_time_bulan_ini
+ ),
+ formatNumber(total.total_durasi_response_time_tahun_ini),
+ formatNumber(total.count_durasi_response_time_tahun_ini),
+ formatPercentage(
+ total.total_durasi_response_time_tahun_ini / total.count_durasi_response_time_tahun_ini
+ ),
+ formatNumber(total.total_durasi_recovery_time_tahun_ini),
+ formatNumber(total.count_durasi_recovery_time_tahun_ini),
+ formatPercentage(
+ total.total_durasi_recovery_time_tahun_ini / total.count_durasi_recovery_time_tahun_ini
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'Nama Unit',
+ rowSpan: 4
+ },
+ {
+ content: 'Jumlah dan Durasi RPT & RCT Keluhan',
+ colSpan: 12
+ }
+ ],
+ [
+ {
+ content: getMonthName(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ colSpan: 6
+ },
+ {
+ content:
+ 's.d' + ' ' + getMonthName(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ colSpan: 6
+ }
+ ],
+ [
+ 'Total RPT',
+ 'Jumlah Keluhan',
+ 'RPT Keluhan',
+ 'Total RCT',
+ 'Jumlah Keluhan',
+ 'RCT Keluhan',
+ 'Total RPT',
+ 'Jumlah Keluhan',
+ 'RPT Keluhan',
+ 'Total RCT',
+ 'Jumlah Keluhan',
+ 'RCT Keluhan'
+ ],
+ ['a', 'b', 'c=a/b', 'd', 'e', 'f=d/e', 'a', 'b', 'c=a/b', 'd', 'e', 'f=d/e']
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'RATA-RATA') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:M1')
+ worksheet.mergeCells('A2:M2')
+ worksheet.mergeCells('A3:M3')
+ worksheet.mergeCells('A4:M4')
+ worksheet.mergeCells('A5:M5')
+ worksheet.mergeCells('A7:M7')
+ worksheet.mergeCells('A8:M8')
+
+ 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 }
diff --git a/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahKaliKeluhan.ts b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahKaliKeluhan.ts
new file mode 100644
index 0000000..29834e8
--- /dev/null
+++ b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_JumlahKaliKeluhan.ts
@@ -0,0 +1,373 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Jumlah Kali Keluhan'
+const fontSize = 5
+const detailFontSize = 3
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ persen_mom: [],
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0,
+ persen_yoy: []
+ }
+ }
+
+ groupedData[regional].summary.mom_bulan_kemarin += item.mom_bulan_kemarin
+ groupedData[regional].summary.mom_bulan_ini += item.mom_bulan_ini
+ groupedData[regional].summary.persen_mom.push(item.persen_mom)
+ groupedData[regional].summary.yoy_tahun_kemarin += item.yoy_tahun_kemarin
+ groupedData[regional].summary.yoy_tahun_ini += item.yoy_tahun_ini
+ groupedData[regional].summary.persen_yoy.push(item.persen_yoy)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 7, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.mom_bulan_kemarin),
+ formatNumber(summary.mom_bulan_ini),
+ formatPercentage(
+ !summary.mom_bulan_ini || !summary.mom_bulan_kemarin
+ ? '0%'
+ : ((summary.mom_bulan_kemarin - summary.mom_bulan_ini) / summary.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(summary.yoy_tahun_kemarin),
+ formatNumber(summary.yoy_tahun_ini),
+ formatPercentage(
+ !summary.yoy_tahun_ini || !summary.yoy_tahun_kemarin
+ ? '0%'
+ : ((summary.yoy_tahun_kemarin - summary.yoy_tahun_ini) / summary.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ total.mom_bulan_kemarin += summary.mom_bulan_kemarin
+ total.mom_bulan_ini += summary.mom_bulan_ini
+ total.yoy_tahun_kemarin += summary.yoy_tahun_kemarin
+ total.yoy_tahun_ini += summary.yoy_tahun_ini
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(total.mom_bulan_kemarin),
+ formatNumber(total.mom_bulan_ini),
+ formatPercentage(
+ !total.mom_bulan_ini || !total.mom_bulan_kemarin
+ ? '0%'
+ : ((total.mom_bulan_kemarin - total.mom_bulan_ini) / total.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(total.yoy_tahun_kemarin),
+ formatNumber(total.yoy_tahun_ini),
+ formatPercentage(
+ !total.yoy_tahun_ini || !total.yoy_tahun_kemarin
+ ? '0%'
+ : ((total.yoy_tahun_kemarin - total.yoy_tahun_ini) / total.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ 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: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Jumlah Kali Gangguan',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'MOM',
+ colSpan: 3
+ },
+ {
+ content: 'YOY',
+ colSpan: 3
+ }
+ ],
+ [
+ `${getMonthName(reportMeta.lastMonth)} ${reportMeta.lastYearMoM}`,
+ `${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%',
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.lastYear}`,
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:G1')
+ worksheet.mergeCells('A2:G2')
+ worksheet.mergeCells('A3:G3')
+ worksheet.mergeCells('A4:G4')
+ worksheet.mergeCells('A5:G5')
+ worksheet.mergeCells('A7:G7')
+ worksheet.mergeCells('A8:G8')
+
+ 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 }
diff --git a/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.ts b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.ts
new file mode 100644
index 0000000..a6325b9
--- /dev/null
+++ b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_KeluhanBelumSelesai.ts
@@ -0,0 +1,489 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber } from '@/utils/numbers'
+import { formatWaktu } from '@/components/Form/FiltersType/reference'
+
+const reportName = 'Rekapitulasi Keluhan Belum Selesai'
+const fontSize = 5
+const detailFontSize = 3
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ jumlah_keluhan: 0,
+ jumlah_informasi: 0,
+ total: 0
+ }
+ }
+
+ groupedData[regional].summary.jumlah_keluhan += item.jumlah_keluhan
+ groupedData[regional].summary.jumlah_informasi += item.jumlah_informasi
+ groupedData[regional].summary.total += item.total
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ jumlah_keluhan: 0,
+ jumlah_informasi: 0,
+ total: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 5, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.jumlah_keluhan),
+ formatNumber(summary.jumlah_informasi),
+ formatNumber(summary.total)
+ ])
+
+ total.jumlah_keluhan += summary.jumlah_keluhan
+ total.jumlah_informasi += summary.jumlah_informasi
+ total.total += summary.total
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(total.jumlah_keluhan),
+ formatNumber(total.jumlah_informasi),
+ formatNumber(total.total)
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'No',
+ rowSpan: 2
+ },
+ {
+ content: 'Nama Unit',
+ rowSpan: 2
+ },
+ {
+ content: 'Tahun',
+ colSpan: 3
+ }
+ ],
+ ['Keluhan', 'Informasi', 'Total']
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+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 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()], [reportMeta.periode]],
+ styles: {
+ fontSize: detailFontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 18,
+ margin: 5
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ 'No',
+ 'No Laporan',
+ 'UID/UIW',
+ 'UP3',
+ 'ULP',
+ 'ID Pelanggan',
+ 'Nama Pelapor',
+ 'Alamat Pelapor',
+ 'No Telp Pelapor',
+ 'Keterangan Pelapor',
+ 'Penyebab',
+ 'Kode Gangguan',
+ 'Jenis Gangguan',
+ 'Durasi Response Time',
+ 'Durasi Recovery Time',
+ 'Tgl Lapor'
+ ]
+ ],
+ body: rawData.map((item: any, i: any) => [
+ { content: i + 1, styles: { halign: 'right' } },
+ item.no_laporan,
+ item.nama_uid,
+ item.nama_ulp,
+ item.id_pelanggan,
+ item.nama_pelapor,
+ item.alamat_pelapor,
+ item.no_telp_pelapor,
+ item.keterangan_pelapor,
+ item.penyebab,
+ item.kode_gangguan,
+ item.jenis_gangguan,
+ item.durasi_response_time ? formatWaktu(item.durasi_response_time) : '-',
+ item.durasi_recovery_time ? formatWaktu(item.durasi_recovery_time) : '-',
+ item.waktu_lapor
+ ]),
+ 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',
+ cellWidth: 'wrap',
+ 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 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:E1')
+ worksheet.mergeCells('A2:E2')
+ worksheet.mergeCells('A3:E3')
+ worksheet.mergeCells('A4:E4')
+ worksheet.mergeCells('A5:E5')
+ worksheet.mergeCells('A7:E7')
+ worksheet.mergeCells('A8:E8')
+
+ 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
+}
+
+const exportDetailToXLSX = (reportMeta: any, e: any) => {
+ 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, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:P1')
+ worksheet.mergeCells('A3:P3')
+ worksheet.mergeCells('A4:P4')
+
+ 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
+}
+
+export { exportToPDF, exportToXLSX, exportDetailToPDF, exportDetailToXLSX }
diff --git a/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_LaporUlangKeluhan.ts b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_LaporUlangKeluhan.ts
new file mode 100644
index 0000000..5fdd239
--- /dev/null
+++ b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_LaporUlangKeluhan.ts
@@ -0,0 +1,372 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Rekapitulasi Lapor Ulang Keluhan'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ persen_mom: [],
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0,
+ persen_yoy: []
+ }
+ }
+
+ groupedData[regional].summary.mom_bulan_kemarin += item.mom_bulan_kemarin
+ groupedData[regional].summary.mom_bulan_ini += item.mom_bulan_ini
+ groupedData[regional].summary.persen_mom.push(item.persen_mom)
+ groupedData[regional].summary.yoy_tahun_kemarin += item.yoy_tahun_kemarin
+ groupedData[regional].summary.yoy_tahun_ini += item.yoy_tahun_ini
+ groupedData[regional].summary.persen_yoy.push(item.persen_yoy)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 7, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.mom_bulan_kemarin),
+ formatNumber(summary.mom_bulan_ini),
+ formatPercentage(
+ !summary.mom_bulan_ini || !summary.mom_bulan_kemarin
+ ? '0%'
+ : ((summary.mom_bulan_kemarin - summary.mom_bulan_ini) / summary.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(summary.yoy_tahun_kemarin),
+ formatNumber(summary.yoy_tahun_ini),
+ formatPercentage(
+ !summary.yoy_tahun_ini || !summary.yoy_tahun_kemarin
+ ? '0%'
+ : ((summary.yoy_tahun_kemarin - summary.yoy_tahun_ini) / summary.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ total.mom_bulan_kemarin += summary.mom_bulan_kemarin
+ total.mom_bulan_ini += summary.mom_bulan_ini
+ total.yoy_tahun_kemarin += summary.yoy_tahun_kemarin
+ total.yoy_tahun_ini += summary.yoy_tahun_ini
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(total.mom_bulan_kemarin),
+ formatNumber(total.mom_bulan_ini),
+ formatPercentage(
+ !total.mom_bulan_ini || !total.mom_bulan_kemarin
+ ? '0%'
+ : ((total.mom_bulan_kemarin - total.mom_bulan_ini) / total.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(total.yoy_tahun_kemarin),
+ formatNumber(total.yoy_tahun_ini),
+ formatPercentage(
+ !total.yoy_tahun_ini || !total.yoy_tahun_kemarin
+ ? '0%'
+ : ((total.yoy_tahun_kemarin - total.yoy_tahun_ini) / total.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ 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: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Lapor Ulang Keluhan',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'MOM',
+ colSpan: 3
+ },
+ {
+ content: 'YOY',
+ colSpan: 3
+ }
+ ],
+ [
+ `${getMonthName(reportMeta.lastMonth)} ${reportMeta.lastYearMoM}`,
+ `${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%',
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.lastYear}`,
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:G1')
+ worksheet.mergeCells('A2:G2')
+ worksheet.mergeCells('A3:G3')
+ worksheet.mergeCells('A4:G4')
+ worksheet.mergeCells('A5:G5')
+ worksheet.mergeCells('A7:G7')
+ worksheet.mergeCells('A8:G8')
+
+ 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 }
diff --git a/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_RecoveryTimeKeluhan.ts b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_RecoveryTimeKeluhan.ts
new file mode 100644
index 0000000..5258b65
--- /dev/null
+++ b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_RecoveryTimeKeluhan.ts
@@ -0,0 +1,383 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Recovery Time (RCT) Keluhan'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ persen_mom: [],
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0,
+ persen_yoy: []
+ }
+ }
+
+ groupedData[regional].summary.mom_bulan_kemarin += item.mom_bulan_kemarin
+ groupedData[regional].summary.mom_bulan_ini += item.mom_bulan_ini
+ groupedData[regional].summary.persen_mom.push(item.persen_mom)
+ groupedData[regional].summary.yoy_tahun_kemarin += item.yoy_tahun_kemarin
+ groupedData[regional].summary.yoy_tahun_ini += item.yoy_tahun_ini
+ groupedData[regional].summary.persen_yoy.push(item.persen_yoy)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ mom_bulan_kemarin: [],
+ mom_bulan_ini: [],
+ yoy_tahun_kemarin: [],
+ yoy_tahun_ini: []
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 7, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.mom_bulan_kemarin),
+ formatNumber(summary.mom_bulan_ini),
+ formatPercentage(
+ !summary.mom_bulan_ini || !summary.mom_bulan_kemarin
+ ? '0%'
+ : ((summary.mom_bulan_kemarin - summary.mom_bulan_ini) / summary.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(summary.yoy_tahun_kemarin),
+ formatNumber(summary.yoy_tahun_ini),
+ formatPercentage(
+ !summary.yoy_tahun_ini || !summary.yoy_tahun_kemarin
+ ? '0%'
+ : ((summary.yoy_tahun_kemarin - summary.yoy_tahun_ini) / summary.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ total.mom_bulan_kemarin.push(summary.mom_bulan_kemarin)
+ total.mom_bulan_ini.push(summary.mom_bulan_ini)
+ total.yoy_tahun_kemarin.push(summary.yoy_tahun_kemarin)
+ total.yoy_tahun_ini.push(summary.yoy_tahun_ini)
+ }
+
+ const totalMoMBulanKemarin =
+ total.mom_bulan_kemarin.reduce((a: number, b: number) => a + b, 0) /
+ total.mom_bulan_kemarin.length
+ const totalMoMBulanIni =
+ total.mom_bulan_ini.reduce((a: number, b: number) => a + b, 0) / total.mom_bulan_ini.length
+ const totalYoYTahunKemarin =
+ total.yoy_tahun_kemarin.reduce((a: number, b: number) => a + b, 0) /
+ total.yoy_tahun_kemarin.length
+ const totalYoYTahunIni =
+ total.yoy_tahun_ini.reduce((a: number, b: number) => a + b, 0) / total.yoy_tahun_ini.length
+
+ formattedData.push([
+ { content: 'RATA-RATA', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(totalMoMBulanKemarin),
+ formatNumber(totalMoMBulanIni),
+ formatPercentage(
+ !totalMoMBulanIni || !totalMoMBulanKemarin
+ ? '0%'
+ : ((totalMoMBulanKemarin - totalMoMBulanIni) / totalMoMBulanKemarin) * 100
+ ),
+ formatNumber(totalYoYTahunKemarin),
+ formatNumber(totalYoYTahunIni),
+ formatPercentage(
+ !totalYoYTahunIni || !totalYoYTahunKemarin
+ ? '0%'
+ : ((totalYoYTahunKemarin - totalYoYTahunIni) / totalYoYTahunKemarin) * 100
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ 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: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Jumlah RCT Kali Keluhan',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'MOM',
+ colSpan: 3
+ },
+ {
+ content: 'YOY',
+ colSpan: 3
+ }
+ ],
+ [
+ `${getMonthName(reportMeta.lastMonth)} ${reportMeta.lastYearMoM}`,
+ `${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%',
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.lastYear}`,
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'RATA-RATA') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:G1')
+ worksheet.mergeCells('A2:G2')
+ worksheet.mergeCells('A3:G3')
+ worksheet.mergeCells('A4:G4')
+ worksheet.mergeCells('A5:G5')
+ worksheet.mergeCells('A7:G7')
+ worksheet.mergeCells('A8:G8')
+
+ 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 }
diff --git a/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_ResponseTimeKeluhan.ts b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_ResponseTimeKeluhan.ts
new file mode 100644
index 0000000..65044a8
--- /dev/null
+++ b/src/report/Monalisa/Keluhan/Rekap/MonalisaKR_ResponseTimeKeluhan.ts
@@ -0,0 +1,383 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthName } from '@/utils/texts'
+
+const reportName = 'Response Time (RPT) Keluhan'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ mom_bulan_kemarin: 0,
+ mom_bulan_ini: 0,
+ persen_mom: [],
+ yoy_tahun_kemarin: 0,
+ yoy_tahun_ini: 0,
+ persen_yoy: []
+ }
+ }
+
+ groupedData[regional].summary.mom_bulan_kemarin += item.mom_bulan_kemarin
+ groupedData[regional].summary.mom_bulan_ini += item.mom_bulan_ini
+ groupedData[regional].summary.persen_mom.push(item.persen_mom)
+ groupedData[regional].summary.yoy_tahun_kemarin += item.yoy_tahun_kemarin
+ groupedData[regional].summary.yoy_tahun_ini += item.yoy_tahun_ini
+ groupedData[regional].summary.persen_yoy.push(item.persen_yoy)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ mom_bulan_kemarin: [],
+ mom_bulan_ini: [],
+ yoy_tahun_kemarin: [],
+ yoy_tahun_ini: []
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 7, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ { content: no++, styles: { halign: 'right' } },
+ regional,
+ formatNumber(summary.mom_bulan_kemarin),
+ formatNumber(summary.mom_bulan_ini),
+ formatPercentage(
+ !summary.mom_bulan_ini || !summary.mom_bulan_kemarin
+ ? '0%'
+ : ((summary.mom_bulan_kemarin - summary.mom_bulan_ini) / summary.mom_bulan_kemarin) * 100
+ ),
+ formatNumber(summary.yoy_tahun_kemarin),
+ formatNumber(summary.yoy_tahun_ini),
+ formatPercentage(
+ !summary.yoy_tahun_ini || !summary.yoy_tahun_kemarin
+ ? '0%'
+ : ((summary.yoy_tahun_kemarin - summary.yoy_tahun_ini) / summary.yoy_tahun_kemarin) * 100
+ )
+ ])
+
+ total.mom_bulan_kemarin.push(summary.mom_bulan_kemarin)
+ total.mom_bulan_ini.push(summary.mom_bulan_ini)
+ total.yoy_tahun_kemarin.push(summary.yoy_tahun_kemarin)
+ total.yoy_tahun_ini.push(summary.yoy_tahun_ini)
+ }
+
+ const totalMoMBulanKemarin =
+ total.mom_bulan_kemarin.reduce((a: number, b: number) => a + b, 0) /
+ total.mom_bulan_kemarin.length
+ const totalMoMBulanIni =
+ total.mom_bulan_ini.reduce((a: number, b: number) => a + b, 0) / total.mom_bulan_ini.length
+ const totalYoYTahunKemarin =
+ total.yoy_tahun_kemarin.reduce((a: number, b: number) => a + b, 0) /
+ total.yoy_tahun_kemarin.length
+ const totalYoYTahunIni =
+ total.yoy_tahun_ini.reduce((a: number, b: number) => a + b, 0) / total.yoy_tahun_ini.length
+
+ formattedData.push([
+ { content: 'RATA-RATA', colSpan: 2, styles: { fontStyle: 'bold' } },
+ formatNumber(totalMoMBulanKemarin),
+ formatNumber(totalMoMBulanIni),
+ formatPercentage(
+ !totalMoMBulanIni || !totalMoMBulanKemarin
+ ? '0%'
+ : ((totalMoMBulanKemarin - totalMoMBulanIni) / totalMoMBulanKemarin) * 100
+ ),
+ formatNumber(totalYoYTahunKemarin),
+ formatNumber(totalYoYTahunIni),
+ formatPercentage(
+ !totalYoYTahunIni || !totalYoYTahunKemarin
+ ? '0%'
+ : ((totalYoYTahunKemarin - totalYoYTahunIni) / totalYoYTahunKemarin) * 100
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ 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: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Jumlah RPT Kali Keluhan',
+ colSpan: 6
+ }
+ ],
+ [
+ {
+ content: 'MOM',
+ colSpan: 3
+ },
+ {
+ content: 'YOY',
+ colSpan: 3
+ }
+ ],
+ [
+ `${getMonthName(reportMeta.lastMonth)} ${reportMeta.lastYearMoM}`,
+ `${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%',
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.lastYear}`,
+ `s.d ${getMonthName(reportMeta.currentMonth)} ${reportMeta.currentYear}`,
+ '%'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'RATA-RATA') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:G1')
+ worksheet.mergeCells('A2:G2')
+ worksheet.mergeCells('A3:G3')
+ worksheet.mergeCells('A4:G4')
+ worksheet.mergeCells('A5:G5')
+ worksheet.mergeCells('A7:G7')
+ worksheet.mergeCells('A8:G8')
+
+ 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 }
From 0114347427f1edaea446c438372e4d83cf38bc25 Mon Sep 17 00:00:00 2001
From: kur0nek-o
Date: Wed, 3 Apr 2024 21:02:54 +0700
Subject: [PATCH 21/29] feat: create export pdf, xlsx and lihat laporan in
monalisa laporan kpi
---
.../Bulanan/MonalisaLB_AgingComplaint.vue | 71 +-
.../Bulanan/MonalisaLB_EnergyNotSales.vue | 57 +-
.../Bulanan/MonalisaLB_KADDalamPelaporan.vue | 63 +-
.../MonalisaLB_PenurunanJumlahKomplain.vue | 75 +-
.../Kumulatif/MonalisaLK_AgingComplaint.vue | 60 +-
.../Kumulatif/MonalisaLK_EnergyNotSales.vue | 56 +-
.../Kumulatif/MonalisaLK_KDADPelaporan.vue | 62 +-
.../MonalisaLK_PenurunanJumlahKomplain.vue | 62 +-
.../Bulanan/MonalisaLB_AgingComplaint.ts | 585 ++++++++++++++
.../Bulanan/MonalisaLB_EnergyNotSales.ts | 331 ++++++++
.../Bulanan/MonalisaLB_KADDalamPelaporan.ts | 365 +++++++++
.../MonalisaLB_PenurunanJumlahKomplain.ts | 717 ++++++++++++++++++
.../Kumulatif/MonalisaLK_AgingComplaint.ts | 418 ++++++++++
.../Kumulatif/MonalisaLK_EnergyNotSales.ts | 331 ++++++++
.../Kumulatif/MonalisaLK_KDADPelaporan.ts | 365 +++++++++
.../MonalisaLK_PenurunanJumlahKomplain.ts | 551 ++++++++++++++
16 files changed, 3935 insertions(+), 234 deletions(-)
create mode 100644 src/report/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.ts
create mode 100644 src/report/Monalisa/Laporan/Bulanan/MonalisaLB_EnergyNotSales.ts
create mode 100644 src/report/Monalisa/Laporan/Bulanan/MonalisaLB_KADDalamPelaporan.ts
create mode 100644 src/report/Monalisa/Laporan/Bulanan/MonalisaLB_PenurunanJumlahKomplain.ts
create mode 100644 src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.ts
create mode 100644 src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_EnergyNotSales.ts
create mode 100644 src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_KDADPelaporan.ts
create mode 100644 src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_PenurunanJumlahKomplain.ts
diff --git a/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.vue b/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.vue
index dc48aea..721dc79 100755
--- a/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.vue
+++ b/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
:report-button="true"
@reset-form="data = []"
@run-search="() => filterData(filters)"
@@ -345,7 +346,7 @@
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
- @exporting="onExporting"
+ @exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -647,12 +648,6 @@ import {
DxGroupItem,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { getMonthName, getMonthNameShort } from '@/utils/texts'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
@@ -661,6 +656,12 @@ import InputText from '@/components/InputText.vue'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX,
+ exportDetailToPDF,
+ exportDetailToXLSX
+} from '@/report/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint'
const client = apolloClient()
provideApolloClient(client)
@@ -680,33 +681,33 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
+ }
+}
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
+const onExportingDetail = (e: any) => {
+ if (e.format === 'pdf') {
+ exportDetailToPDF(reportMeta.value, dataSub.value)
+ } else if (e.format === 'xlsx') {
+ exportDetailToXLSX(reportMeta.value, e)
+ } else {
}
}
@@ -797,6 +798,18 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_EnergyNotSales.vue b/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_EnergyNotSales.vue
index dd7d21d..a1fd584 100755
--- a/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_EnergyNotSales.vue
+++ b/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_EnergyNotSales.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
:report-button="true"
@reset-form="data = []"
@run-search="() => filterData(filters)"
@@ -270,18 +271,16 @@ import {
DxGroupItem,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { getMonthName } from '@/utils/texts'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Laporan/Bulanan/MonalisaLB_EnergyNotSales'
const client = apolloClient()
provideApolloClient(client)
@@ -301,35 +300,25 @@ const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth())
const lastYear = ref(currentYear.value - 1)
const filters = ref()
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: ''
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
+
const getDetail = async () => {
const dateValue = filters.value.periode.split(' s/d ')
const selected = dataSelected.value
@@ -416,6 +405,16 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_KADDalamPelaporan.vue b/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_KADDalamPelaporan.vue
index 2d3c898..7975c2c 100755
--- a/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_KADDalamPelaporan.vue
+++ b/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_KADDalamPelaporan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
:report-button="true"
@reset-form="data = []"
@run-search="() => filterData(filters)"
@@ -260,6 +261,7 @@
+
@@ -282,18 +284,16 @@ import {
DxGroupItem,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
-import { getMonthNameShort } from '@/utils/texts'
+import { getMonthNameShort, getMonthName } from '@/utils/texts'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Laporan/Bulanan/MonalisaLB_KADDalamPelaporan'
const client = apolloClient()
provideApolloClient(client)
@@ -313,33 +313,24 @@ const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth())
const lastYear = ref(currentYear.value - 1)
const filters = ref()
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const dataGridRef = ref(null)
@@ -384,6 +375,18 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_PenurunanJumlahKomplain.vue b/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_PenurunanJumlahKomplain.vue
index f3490d7..a7a4bae 100755
--- a/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_PenurunanJumlahKomplain.vue
+++ b/src/components/Pages/Monalisa/Laporan/Bulanan/MonalisaLB_PenurunanJumlahKomplain.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
:report-button="true"
@reset-form="data = []"
@run-search="() => filterData(filters)"
@@ -670,7 +671,7 @@
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
- @exporting="onExporting"
+ @exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -950,6 +951,7 @@
+
@@ -973,12 +975,6 @@ import {
DxGrouping,
DxPager
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { getMonthNameShort } from '@/utils/texts'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
@@ -987,6 +983,13 @@ import InputText from '@/components/InputText.vue'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import { getMonthName } from '@/utils/texts'
+import {
+ exportToPDF,
+ exportToXLSX,
+ exportDetailToPDF,
+ exportDetailToXLSX
+} from '@/report/Monalisa/Laporan/Bulanan/MonalisaLB_PenurunanJumlahKomplain'
const client = apolloClient()
provideApolloClient(client)
@@ -1006,33 +1009,34 @@ const dialogDetail = ref(false)
const closedialogDetail = () => (dialogDetail.value = false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
+ }
+}
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
+const onExportingDetail = (e: any) => {
+ if (e.format === 'pdf') {
+ exportDetailToPDF(reportMeta.value, dataSub.value)
+ } else if (e.format === 'xlsx') {
+ exportDetailToXLSX(reportMeta.value, e)
+ } else {
}
}
@@ -1123,6 +1127,19 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.vue b/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.vue
index 0b0ba29..08d4b24 100755
--- a/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.vue
+++ b/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -353,16 +354,14 @@ import {
DxGroupItem,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { getMonthName, getMonthNameShort } from '@/utils/texts'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint'
const position = { of: '#data' }
const showIndicator = ref(true)
@@ -378,33 +377,24 @@ const loadingData = ref(false)
const loadingSubData = ref(false)
const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth() + 1)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
@@ -491,6 +481,18 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_EnergyNotSales.vue b/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_EnergyNotSales.vue
index cfa4fb3..38f44ab 100755
--- a/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_EnergyNotSales.vue
+++ b/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_EnergyNotSales.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -270,18 +271,16 @@ import {
DxGroupItem,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { getMonthName } from '@/utils/texts'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Laporan/Kumulatif/MonalisaLK_EnergyNotSales'
const client = apolloClient()
provideApolloClient(client)
@@ -301,33 +300,22 @@ const filters = ref()
const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth())
const lastYear = ref(currentYear.value - 1)
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: ''
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
@@ -417,6 +405,16 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_KDADPelaporan.vue b/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_KDADPelaporan.vue
index 2805431..f223aa5 100755
--- a/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_KDADPelaporan.vue
+++ b/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_KDADPelaporan.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -282,18 +283,16 @@ import {
DxGroupItem,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
-import { getMonthNameShort } from '@/utils/texts'
+import { getMonthNameShort, getMonthName } from '@/utils/texts'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Laporan/Kumulatif/MonalisaLK_KDADPelaporan'
const client = apolloClient()
provideApolloClient(client)
@@ -313,33 +312,24 @@ const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth())
const lastYear = ref(currentYear.value - 1)
const filters = ref()
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
@@ -432,6 +422,18 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_PenurunanJumlahKomplain.vue b/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_PenurunanJumlahKomplain.vue
index 9a78c86..b13dc83 100755
--- a/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_PenurunanJumlahKomplain.vue
+++ b/src/components/Pages/Monalisa/Laporan/Kumulatif/MonalisaLK_PenurunanJumlahKomplain.vue
@@ -1,5 +1,6 @@
exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
@@ -729,18 +730,16 @@ import {
DxGroupItem,
DxGrouping
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
-import { useQuery } from '@vue/apollo-composable'
import { getMonthName } from '@/utils/texts'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX
+} from '@/report/Monalisa/Laporan/Kumulatif/MonalisaLK_PenurunanJumlahKomplain'
const client = apolloClient()
provideApolloClient(client)
@@ -760,33 +759,25 @@ const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth())
const lastYear = ref(currentYear.value - 1)
const filters = ref()
+const reportMeta = ref({
+ regional: { id: 0, name: 'Semua Regional' },
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
+ bulan: { id: new Date().getMonth(), name: getMonthName(new Date().getMonth()) },
+ tahun: { id: new Date().getFullYear(), name: new Date().getFullYear().toString() },
+ periode: '',
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+})
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
-
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
}
}
const getDetail = async () => {
@@ -876,6 +867,19 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = {
+ regional: regional,
+ uid: uid,
+ up3: up3,
+ ulp: ulp,
+ bulan: bulan,
+ tahun: tahun,
+ periode: `${bulan.name} ${tahun.name}`,
+ currentMonth: currentMonth.value,
+ currentYear: currentYear.value,
+ lastYear: lastYear.value
+ }
})
.catch((err) => {
console.error(err)
diff --git a/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.ts b/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.ts
new file mode 100644
index 0000000..71d0246
--- /dev/null
+++ b/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_AgingComplaint.ts
@@ -0,0 +1,585 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { formatWaktu } from '@/components/Form/FiltersType/reference'
+import { getMonthNameShort } from '@/utils/texts'
+
+const reportName = '(Monalisa) Aging Complaint'
+const fontSize = 5
+const detailFontSize = 3
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ avg_durasi_recovery_gangguan: [],
+ sla_gangguan: [],
+ avg_durasi_recovery_keluhan: [],
+ sla_keluhan: [],
+ aging_complaint_gangguan: [],
+ aging_complaint_keluhan: [],
+ avg_aging_complaint: []
+ }
+ }
+
+ groupedData[regional].summary.avg_durasi_recovery_gangguan.push(
+ item.avg_durasi_recovery_gangguan
+ )
+ groupedData[regional].summary.sla_gangguan.push(item.sla_gangguan)
+ groupedData[regional].summary.avg_durasi_recovery_keluhan.push(
+ item.avg_durasi_recovery_keluhan
+ )
+ groupedData[regional].summary.sla_keluhan.push(item.sla_keluhan)
+ groupedData[regional].summary.aging_complaint_gangguan.push(item.aging_complaint_gangguan)
+ groupedData[regional].summary.aging_complaint_keluhan.push(item.aging_complaint_keluhan)
+ groupedData[regional].summary.avg_aging_complaint.push(item.avg_aging_complaint)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ avg_durasi_recovery_gangguan: [],
+ sla_gangguan: [],
+ avg_durasi_recovery_keluhan: [],
+ sla_keluhan: [],
+ aging_complaint_gangguan: [],
+ aging_complaint_keluhan: [],
+ avg_aging_complaint: []
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 8, styles: { fontStyle: 'bold' } }])
+
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ const avg_durasi_recovery_gangguan =
+ summary.avg_durasi_recovery_gangguan.reduce((a: number, b: number) => a + b, 0) /
+ summary.avg_durasi_recovery_gangguan.length
+ const sla_gangguan =
+ summary.sla_gangguan.reduce((a: number, b: number) => a + b, 0) / summary.sla_gangguan.length
+ const avg_durasi_recovery_keluhan =
+ summary.avg_durasi_recovery_keluhan.reduce((a: number, b: number) => a + b, 0) /
+ summary.avg_durasi_recovery_keluhan.length
+ const sla_keluhan =
+ summary.sla_keluhan.reduce((a: number, b: number) => a + b, 0) / summary.sla_keluhan.length
+ const aging_complaint_gangguan =
+ summary.aging_complaint_gangguan.reduce((a: number, b: number) => a + b, 0) /
+ summary.aging_complaint_gangguan.length
+ const aging_complaint_keluhan =
+ summary.aging_complaint_keluhan.reduce((a: number, b: number) => a + b, 0) /
+ summary.aging_complaint_keluhan.length
+ const avg_aging_complaint =
+ summary.avg_aging_complaint.reduce((a: number, b: number) => a + b, 0) /
+ summary.avg_aging_complaint.length
+
+ formattedData.push([
+ regional,
+ formatNumber(avg_durasi_recovery_gangguan),
+ formatNumber(sla_gangguan),
+ formatNumber(avg_durasi_recovery_keluhan),
+ formatNumber(sla_keluhan),
+ formatPercentage(aging_complaint_gangguan),
+ formatPercentage(aging_complaint_keluhan),
+ formatPercentage(avg_aging_complaint)
+ ])
+
+ total.avg_durasi_recovery_gangguan.push(avg_durasi_recovery_gangguan)
+ total.sla_gangguan.push(sla_gangguan)
+ total.avg_durasi_recovery_keluhan.push(avg_durasi_recovery_keluhan)
+ total.sla_keluhan.push(sla_keluhan)
+ total.aging_complaint_gangguan.push(aging_complaint_gangguan)
+ total.aging_complaint_keluhan.push(aging_complaint_keluhan)
+ total.avg_aging_complaint.push(avg_aging_complaint)
+ }
+
+ formattedData.push([
+ { content: 'RATA-RATA', styles: { fontStyle: 'bold' } },
+ formatNumber(
+ total.avg_durasi_recovery_gangguan.reduce((a: number, b: number) => a + b, 0) /
+ total.avg_durasi_recovery_gangguan.length
+ ),
+ formatNumber(
+ total.sla_gangguan.reduce((a: number, b: number) => a + b, 0) / total.sla_gangguan.length
+ ),
+ formatNumber(
+ total.avg_durasi_recovery_keluhan.reduce((a: number, b: number) => a + b, 0) /
+ total.avg_durasi_recovery_keluhan.length
+ ),
+ formatNumber(
+ total.sla_keluhan.reduce((a: number, b: number) => a + b, 0) / total.sla_keluhan.length
+ ),
+ formatPercentage(
+ total.aging_complaint_gangguan.reduce((a: number, b: number) => a + b, 0) /
+ total.aging_complaint_gangguan.length
+ ),
+ formatPercentage(
+ total.aging_complaint_keluhan.reduce((a: number, b: number) => a + b, 0) /
+ total.aging_complaint_keluhan.length
+ ),
+ formatPercentage(
+ total.avg_aging_complaint.reduce((a: number, b: number) => a + b, 0) /
+ total.avg_aging_complaint.length
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Aging Complains',
+ colSpan: 4
+ },
+ {
+ content: '% Aging Complains',
+ colSpan: 2
+ },
+ {
+ content: '% Rata2 Aging Complains',
+ rowSpan: 3
+ }
+ ],
+ [
+ {
+ content: 'Rata2 RCT Gangguan',
+ colSpan: 2
+ },
+ {
+ content: 'Rata2 RCT Keluhan',
+ colSpan: 2
+ },
+ {
+ content: 'G',
+ rowSpan: 2
+ },
+ {
+ content: 'K',
+ rowSpan: 2
+ }
+ ],
+ [
+ getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ 'SLA (Menit)',
+ getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ 'SLA (Jam)'
+ ],
+ ['1', '2', '3', '4', '5', '6 = 1-((2-3)/3))*100)', '7 = 1-((4-5)/5))*100)', '8 = (6+7)/2']
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'RATA-RATA') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+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 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()], [reportMeta.periode]],
+ styles: {
+ fontSize: detailFontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 18,
+ margin: 5
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ 'No',
+ 'No Laporan',
+ 'UID/UIW',
+ 'UP3',
+ 'ULP',
+ 'ID Pelanggan',
+ 'Nama Pelanggan',
+ 'Nama Pelaopr',
+ 'Alamat Pelapor',
+ 'No Telp Pelapor',
+ 'Keterangan Pelapor',
+ 'Penyebab',
+ 'Kode Gangguan',
+ 'Jenis Gangguan',
+ 'Durasi Response Time',
+ 'Durasi Recovery Time',
+ 'Tgl Lapor'
+ ]
+ ],
+ body: rawData.map((item: any, i: any) => [
+ { content: i + 1, styles: { halign: 'right' } },
+ item.no_laporan,
+ item.nama_uid,
+ item.nama_ulp,
+ item.id_pelanggan,
+ item.nama_pelanggan,
+ item.nama_pelapor,
+ item.alamat_pelapor,
+ item.no_telp_pelapor,
+ item.keterangan_pelapor,
+ item.penyebab,
+ item.kode_gangguan,
+ item.jenis_gangguan,
+ item.durasi_response_time ? formatWaktu(item.durasi_response_time) : '-',
+ item.durasi_recovery_time ? formatWaktu(item.durasi_recovery_time) : '-',
+ item.waktu_lapor
+ ]),
+ 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',
+ cellWidth: 'wrap',
+ 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 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:H1')
+ worksheet.mergeCells('A2:H2')
+ worksheet.mergeCells('A3:H3')
+ worksheet.mergeCells('A4:H4')
+ worksheet.mergeCells('A5:H5')
+ worksheet.mergeCells('A7:H7')
+ worksheet.mergeCells('A8:H8')
+
+ 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
+}
+
+const exportDetailToXLSX = (reportMeta: any, e: any) => {
+ 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, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:Q1')
+ worksheet.mergeCells('A3:Q3')
+ worksheet.mergeCells('A4:Q4')
+
+ 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
+}
+
+export { exportToPDF, exportToXLSX, exportDetailToPDF, exportDetailToXLSX }
diff --git a/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_EnergyNotSales.ts b/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_EnergyNotSales.ts
new file mode 100644
index 0000000..ad15528
--- /dev/null
+++ b/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_EnergyNotSales.ts
@@ -0,0 +1,331 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber } from '@/utils/numbers'
+
+const reportName = '(Monalisa) Energy Not Sales (ENS)'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ terencana: 0,
+ tidak_terencana: 0,
+ bencana_alam: 0
+ }
+ }
+
+ groupedData[regional].summary.terencana += item.terencana
+ groupedData[regional].summary.tidak_terencana += item.tidak_terencana
+ groupedData[regional].summary.bencana_alam += item.bencana_alam
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ terencana: 0,
+ tidak_terencana: 0,
+ bencana_alam: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 6, styles: { fontStyle: 'bold' } }])
+
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ regional,
+ formatNumber(summary.terencana),
+ formatNumber(summary.tidak_terencana),
+ formatNumber(summary.bencana_alam),
+ formatNumber(summary.terencana + summary.tidak_terencana + summary.bencana_alam),
+ formatNumber(summary.terencana + summary.tidak_terencana)
+ ])
+
+ total.terencana += summary.terencana
+ total.tidak_terencana += summary.tidak_terencana
+ total.bencana_alam += summary.bencana_alam
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', styles: { fontStyle: 'bold' } },
+ formatNumber(total.terencana),
+ formatNumber(total.tidak_terencana),
+ formatNumber(total.bencana_alam),
+ formatNumber(total.terencana + total.tidak_terencana + total.bencana_alam),
+ formatNumber(total.terencana + total.tidak_terencana)
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'Nama Unit',
+ rowSpan: 2
+ },
+ {
+ content: 'ENS (Distribusi)',
+ colSpan: 3
+ },
+ {
+ content: 'Total',
+ rowSpan: 2
+ },
+ {
+ content: 'KPI ENS',
+ rowSpan: 2
+ }
+ ],
+ ['Terencana', 'Tidak Terencana', 'Bencana Alam'],
+ ['1', '2', '3', '4', '5 = 2+3+4', '6 = 2+3']
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:F1')
+ worksheet.mergeCells('A2:F2')
+ worksheet.mergeCells('A3:F3')
+ worksheet.mergeCells('A4:F4')
+ worksheet.mergeCells('A5:F5')
+ worksheet.mergeCells('A7:F7')
+ worksheet.mergeCells('A8:F8')
+
+ 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 }
diff --git a/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_KADDalamPelaporan.ts b/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_KADDalamPelaporan.ts
new file mode 100644
index 0000000..5336c2a
--- /dev/null
+++ b/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_KADDalamPelaporan.ts
@@ -0,0 +1,365 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthNameShort } from '@/utils/texts'
+
+const reportName = '(Monalisa) Kepatuhan dan Akurasi Dalam Pelaporan'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ gangguan_berulang: 0,
+ gangguan_total: 0,
+ keluhan_berulang: 0,
+ keluhan_total: 0
+ }
+ }
+
+ groupedData[regional].summary.gangguan_berulang += item.gangguan_berulang
+ groupedData[regional].summary.gangguan_total += item.gangguan_total
+ groupedData[regional].summary.keluhan_berulang += item.keluhan_berulang
+ groupedData[regional].summary.keluhan_total += item.keluhan_total
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ gangguan_berulang: 0,
+ gangguan_total: 0,
+ keluhan_berulang: 0,
+ keluhan_total: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 6, styles: { fontStyle: 'bold' } }])
+
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ const komplain_pelanggan =
+ ((summary.gangguan_berulang / summary.gangguan_total +
+ summary.keluhan_berulang / summary.keluhan_total) /
+ 2) *
+ 100
+
+ formattedData.push([
+ regional,
+ formatNumber(summary.gangguan_berulang),
+ formatNumber(summary.gangguan_total),
+ formatNumber(summary.keluhan_berulang),
+ formatNumber(summary.keluhan_total),
+ formatPercentage(
+ !komplain_pelanggan || !isFinite(komplain_pelanggan) ? 0 : komplain_pelanggan
+ )
+ ])
+
+ total.gangguan_berulang += summary.gangguan_berulang
+ total.gangguan_total += summary.gangguan_total
+ total.keluhan_berulang += summary.keluhan_berulang
+ total.keluhan_total += summary.keluhan_total
+ }
+
+ const total_komplain_pelanggan =
+ ((total.gangguan_berulang / total.gangguan_total +
+ total.keluhan_berulang / total.keluhan_total) /
+ 2) *
+ 100
+
+ formattedData.push([
+ { content: 'TOTAL', styles: { fontStyle: 'bold' } },
+ formatNumber(total.gangguan_berulang),
+ formatNumber(total.gangguan_total),
+ formatNumber(total.keluhan_berulang),
+ formatNumber(total.keluhan_total),
+ formatPercentage(
+ !total_komplain_pelanggan || !isFinite(total_komplain_pelanggan)
+ ? 0
+ : total_komplain_pelanggan
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Kepatuhan dan Akurasi APKT',
+ colSpan: 4
+ },
+ {
+ content: 'Komplain Pelanggan (%)',
+ rowSpan: 3
+ }
+ ],
+ [
+ {
+ content: 'Gangguan Berulang',
+ colSpan: 2
+ },
+ {
+ content: 'Keluhan Berulang',
+ colSpan: 2
+ }
+ ],
+ [
+ getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ 'Total Gangguan',
+ getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ 'Total Keluhan'
+ ],
+ ['1', '2', '3', '4', '5', '6 = ((2/3)+(4/5))/2)*100']
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:F1')
+ worksheet.mergeCells('A2:F2')
+ worksheet.mergeCells('A3:F3')
+ worksheet.mergeCells('A4:F4')
+ worksheet.mergeCells('A5:F5')
+ worksheet.mergeCells('A7:F7')
+ worksheet.mergeCells('A8:F8')
+
+ 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 }
diff --git a/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_PenurunanJumlahKomplain.ts b/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_PenurunanJumlahKomplain.ts
new file mode 100644
index 0000000..8243d98
--- /dev/null
+++ b/src/report/Monalisa/Laporan/Bulanan/MonalisaLB_PenurunanJumlahKomplain.ts
@@ -0,0 +1,717 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { formatWaktu } from '@/components/Form/FiltersType/reference'
+import { getMonthNameShort } from '@/utils/texts'
+
+const reportName = '(Monalisa) Penurunan Jumlah Komplain'
+const fontSize = 5
+const detailFontSize = 3
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ total_keluhan_tahun_sebelumnya: 0,
+ total_gangguan_tahun_sebelumnya: 0,
+ total_keluhan_informasi_tahun_sebelumnya: 0,
+ total_gangguan_informasi_tahun_sebelumnya: 0,
+ // total_informasi_tahun_sebelumnya
+ // total_tahun_sebelumnya
+ total_keluhan_tahun_ini: 0,
+ total_gangguan_tahun_ini: 0,
+ total_keluhan_informasi_tahun_ini: 0,
+ total_gangguan_informasi_tahun_ini: 0
+ // total_informasi_tahun_ini
+ // total_tahun_ini
+ // delta_keluhan
+ // delta_gangguan
+ // delta_informasi
+ // persen_delta_keluhan
+ // persen_delta_gangguan
+ // persen_delta_informasi
+ // persen_delta_total
+ }
+ }
+
+ groupedData[regional].summary.total_keluhan_tahun_sebelumnya +=
+ item.total_keluhan_tahun_sebelumnya
+ groupedData[regional].summary.total_gangguan_tahun_sebelumnya +=
+ item.total_gangguan_tahun_sebelumnya
+ groupedData[regional].summary.total_keluhan_informasi_tahun_sebelumnya +=
+ item.total_keluhan_informasi_tahun_sebelumnya
+ groupedData[regional].summary.total_gangguan_informasi_tahun_sebelumnya +=
+ item.total_gangguan_informasi_tahun_sebelumnya
+ groupedData[regional].summary.total_keluhan_tahun_ini += item.total_keluhan_tahun_ini
+ groupedData[regional].summary.total_gangguan_tahun_ini += item.total_gangguan_tahun_ini
+ groupedData[regional].summary.total_keluhan_informasi_tahun_ini +=
+ item.total_keluhan_informasi_tahun_ini
+ groupedData[regional].summary.total_gangguan_informasi_tahun_ini +=
+ item.total_gangguan_informasi_tahun_ini
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ total_keluhan_tahun_sebelumnya: 0,
+ total_gangguan_tahun_sebelumnya: 0,
+ total_keluhan_informasi_tahun_sebelumnya: 0,
+ total_gangguan_informasi_tahun_sebelumnya: 0,
+ // total_informasi_tahun_sebelumnya
+ // total_tahun_sebelumnya
+ total_keluhan_tahun_ini: 0,
+ total_gangguan_tahun_ini: 0,
+ total_keluhan_informasi_tahun_ini: 0,
+ total_gangguan_informasi_tahun_ini: 0
+ // total_informasi_tahun_ini
+ // total_tahun_ini
+ // delta_keluhan
+ // delta_gangguan
+ // delta_informasi
+ // persen_delta_keluhan
+ // persen_delta_gangguan
+ // persen_delta_informasi
+ // persen_delta_total
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 20, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ const total_informasi_tahun_sebelumnya =
+ summary.total_keluhan_informasi_tahun_sebelumnya +
+ summary.total_gangguan_informasi_tahun_sebelumnya
+ const total_tahun_sebelumnya =
+ summary.total_keluhan_tahun_sebelumnya +
+ summary.total_gangguan_tahun_sebelumnya +
+ total_informasi_tahun_sebelumnya
+ const total_informasi_tahun_ini =
+ summary.total_keluhan_informasi_tahun_ini + summary.total_gangguan_informasi_tahun_ini
+ const total_tahun_ini =
+ summary.total_keluhan_tahun_ini + summary.total_gangguan_tahun_ini + total_informasi_tahun_ini
+ const delta_keluhan = summary.total_keluhan_tahun_sebelumnya - summary.total_keluhan_tahun_ini
+ const delta_gangguan =
+ summary.total_gangguan_tahun_sebelumnya - summary.total_gangguan_tahun_ini
+ const delta_informasi = total_informasi_tahun_sebelumnya - total_informasi_tahun_ini
+ const persen_delta_keluhan = 40 * (delta_keluhan / summary.total_keluhan_tahun_sebelumnya)
+ const persen_delta_gangguan = 40 * (delta_gangguan / summary.total_gangguan_tahun_sebelumnya)
+ const persen_delta_informasi = 20 * (delta_informasi / total_informasi_tahun_sebelumnya)
+ const persen_delta_total = persen_delta_keluhan + persen_delta_gangguan + persen_delta_informasi
+
+ formattedData.push([
+ regional,
+ formatNumber(summary.total_keluhan_tahun_sebelumnya),
+ formatNumber(summary.total_gangguan_tahun_sebelumnya),
+ formatNumber(summary.total_keluhan_informasi_tahun_sebelumnya),
+ formatNumber(summary.total_gangguan_informasi_tahun_sebelumnya),
+ formatNumber(total_informasi_tahun_sebelumnya),
+ formatNumber(total_tahun_sebelumnya),
+ formatNumber(summary.total_keluhan_tahun_ini),
+ formatNumber(summary.total_gangguan_tahun_ini),
+ formatNumber(summary.total_keluhan_informasi_tahun_ini),
+ formatNumber(summary.total_gangguan_informasi_tahun_ini),
+ formatNumber(total_informasi_tahun_ini),
+ formatNumber(total_tahun_ini),
+ formatNumber(delta_keluhan),
+ formatNumber(delta_gangguan),
+ formatNumber(delta_informasi),
+ formatPercentage(
+ !persen_delta_keluhan || !isFinite(persen_delta_keluhan) ? 0 : persen_delta_keluhan
+ ),
+ formatPercentage(
+ !persen_delta_gangguan || !isFinite(persen_delta_gangguan) ? 0 : persen_delta_gangguan
+ ),
+ formatPercentage(
+ !persen_delta_informasi || !isFinite(persen_delta_informasi) ? 0 : persen_delta_informasi
+ ),
+ formatPercentage(
+ !persen_delta_total || !isFinite(persen_delta_total) ? 0 : persen_delta_total
+ )
+ ])
+
+ total.total_keluhan_tahun_sebelumnya += summary.total_keluhan_tahun_sebelumnya
+ total.total_gangguan_tahun_sebelumnya += summary.total_gangguan_tahun_sebelumnya
+ total.total_keluhan_informasi_tahun_sebelumnya +=
+ summary.total_keluhan_informasi_tahun_sebelumnya
+ total.total_gangguan_informasi_tahun_sebelumnya +=
+ summary.total_gangguan_informasi_tahun_sebelumnya
+ total.total_keluhan_tahun_ini += summary.total_keluhan_tahun_ini
+ total.total_gangguan_tahun_ini += summary.total_gangguan_tahun_ini
+ total.total_keluhan_informasi_tahun_ini += summary.total_keluhan_informasi_tahun_ini
+ total.total_gangguan_informasi_tahun_ini += summary.total_gangguan_informasi_tahun_ini
+ }
+
+ const total_informasi_tahun_sebelumnya =
+ total.total_keluhan_informasi_tahun_sebelumnya + total.total_gangguan_informasi_tahun_sebelumnya
+ const total_tahun_sebelumnya =
+ total.total_keluhan_tahun_sebelumnya +
+ total.total_gangguan_tahun_sebelumnya +
+ total_informasi_tahun_sebelumnya
+ const total_informasi_tahun_ini =
+ total.total_keluhan_informasi_tahun_ini + total.total_gangguan_informasi_tahun_ini
+ const total_tahun_ini =
+ total.total_keluhan_tahun_ini + total.total_gangguan_tahun_ini + total_informasi_tahun_ini
+ const delta_keluhan = total.total_keluhan_tahun_sebelumnya - total.total_keluhan_tahun_ini
+ const delta_gangguan = total.total_gangguan_tahun_sebelumnya - total.total_gangguan_tahun_ini
+ const delta_informasi = total_informasi_tahun_sebelumnya - total_informasi_tahun_ini
+ const persen_delta_keluhan = 40 * (delta_keluhan / total.total_keluhan_tahun_sebelumnya)
+ const persen_delta_gangguan = 40 * (delta_gangguan / total.total_gangguan_tahun_sebelumnya)
+ const persen_delta_informasi = 20 * (delta_informasi / total_informasi_tahun_sebelumnya)
+ const persen_delta_total = persen_delta_keluhan + persen_delta_gangguan + persen_delta_informasi
+
+ formattedData.push([
+ { content: 'TOTAL', styles: { fontStyle: 'bold' } },
+ formatNumber(total.total_keluhan_tahun_sebelumnya),
+ formatNumber(total.total_gangguan_tahun_sebelumnya),
+ formatNumber(total.total_keluhan_informasi_tahun_sebelumnya),
+ formatNumber(total.total_gangguan_informasi_tahun_sebelumnya),
+ formatNumber(total_informasi_tahun_sebelumnya),
+ formatNumber(total_tahun_sebelumnya),
+ formatNumber(total.total_keluhan_tahun_ini),
+ formatNumber(total.total_gangguan_tahun_ini),
+ formatNumber(total.total_keluhan_informasi_tahun_ini),
+ formatNumber(total.total_gangguan_informasi_tahun_ini),
+ formatNumber(total_informasi_tahun_ini),
+ formatNumber(total_tahun_ini),
+ formatNumber(delta_keluhan),
+ formatNumber(delta_gangguan),
+ formatNumber(delta_informasi),
+ formatPercentage(
+ !persen_delta_keluhan || !isFinite(persen_delta_keluhan) ? 0 : persen_delta_keluhan
+ ),
+ formatPercentage(
+ !persen_delta_gangguan || !isFinite(persen_delta_gangguan) ? 0 : persen_delta_gangguan
+ ),
+ formatPercentage(
+ !persen_delta_informasi || !isFinite(persen_delta_informasi) ? 0 : persen_delta_informasi
+ ),
+ formatPercentage(!persen_delta_total || !isFinite(persen_delta_total) ? 0 : persen_delta_total)
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], [reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.lastYear,
+ colSpan: 6
+ },
+ {
+ content: getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ colSpan: 6
+ },
+ {
+ content: 'Delta Penurunan',
+ colSpan: 3
+ },
+ {
+ content: '% Penurunan YoY',
+ colSpan: 4
+ }
+ ],
+ [
+ {
+ content: 'Keluhan',
+ rowSpan: 2
+ },
+ {
+ content: 'Gangguan',
+ rowSpan: 2
+ },
+ {
+ content: 'Informasi',
+ colSpan: 3
+ },
+ {
+ content: 'Total Komplain',
+ rowSpan: 2
+ },
+ {
+ content: 'Keluhan',
+ rowSpan: 2
+ },
+ {
+ content: 'Gangguan',
+ rowSpan: 2
+ },
+ {
+ content: 'Informasi',
+ colSpan: 3
+ },
+ {
+ content: 'Total Komplain',
+ rowSpan: 2
+ },
+ {
+ content: 'Keluhan',
+ rowSpan: 2
+ },
+ {
+ content: 'Gangguan',
+ rowSpan: 2
+ },
+ {
+ content: 'Informasi',
+ rowSpan: 2
+ },
+ {
+ content: 'Keluhan',
+ rowSpan: 2
+ },
+ {
+ content: 'Gangguan',
+ rowSpan: 2
+ },
+ {
+ content: 'Informasi',
+ rowSpan: 2
+ },
+ {
+ content: '% Total',
+ rowSpan: 2
+ }
+ ],
+ ['Keluhan', 'Gangguan', 'Total', 'Keluhan', 'Gangguan', 'Total'],
+ [
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6=4+5',
+ '7=2+3+6',
+ '8',
+ '9',
+ '10',
+ '11',
+ '12=10+11',
+ '13=8+9+12',
+ '14=2-8',
+ '15=3-9',
+ '16=6-12',
+ '17=40%*(14/2)',
+ '18=40%*(15/3)',
+ '19=20%*(16/6)',
+ '20=17+18+19'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+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 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()], [reportMeta.periode]],
+ styles: {
+ fontSize: detailFontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 18,
+ margin: 5
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ 'No',
+ 'No Laporan',
+ 'UID/UIW',
+ 'UP3',
+ 'ULP',
+ 'ID Pelanggan',
+ 'Nama Pelanggan',
+ 'Nama Pelaopr',
+ 'Alamat Pelapor',
+ 'No Telp Pelapor',
+ 'Keterangan Pelapor',
+ 'Penyebab',
+ 'Kode Gangguan',
+ 'Jenis Gangguan',
+ 'Durasi Response Time',
+ 'Durasi Recovery Time',
+ 'Tgl Lapor'
+ ]
+ ],
+ body: rawData.map((item: any, i: any) => [
+ { content: i + 1, styles: { halign: 'right' } },
+ item.no_laporan,
+ item.nama_uid,
+ item.nama_ulp,
+ item.id_pelanggan,
+ item.nama_pelanggan,
+ item.nama_pelapor,
+ item.alamat_pelapor,
+ item.no_telp_pelapor,
+ item.keterangan_pelapor,
+ item.penyebab,
+ item.kode_gangguan,
+ item.jenis_gangguan,
+ item.durasi_response_time ? formatWaktu(item.durasi_response_time) : '-',
+ item.durasi_recovery_time ? formatWaktu(item.durasi_recovery_time) : '-',
+ item.waktu_lapor
+ ]),
+ 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',
+ cellWidth: 'wrap',
+ 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 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:T1')
+ worksheet.mergeCells('A2:T2')
+ worksheet.mergeCells('A3:T3')
+ worksheet.mergeCells('A4:T4')
+ worksheet.mergeCells('A5:T5')
+ worksheet.mergeCells('A7:T7')
+ worksheet.mergeCells('A8:T8')
+
+ 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
+}
+
+const exportDetailToXLSX = (reportMeta: any, e: any) => {
+ 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, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:Q1')
+ worksheet.mergeCells('A3:Q3')
+ worksheet.mergeCells('A4:Q4')
+
+ 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
+}
+
+export { exportToPDF, exportToXLSX, exportDetailToPDF, exportDetailToXLSX }
diff --git a/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.ts b/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.ts
new file mode 100644
index 0000000..306dfdb
--- /dev/null
+++ b/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_AgingComplaint.ts
@@ -0,0 +1,418 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthNameShort } from '@/utils/texts'
+
+const reportName = 'Aging Complaint'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ avg_durasi_recovery_gangguan: [],
+ sla_gangguan: [],
+ avg_durasi_recovery_keluhan: [],
+ sla_keluhan: [],
+ aging_complaint_gangguan: [],
+ aging_complaint_keluhan: [],
+ avg_aging_complaint: []
+ }
+ }
+
+ groupedData[regional].summary.avg_durasi_recovery_gangguan.push(
+ item.avg_durasi_recovery_gangguan
+ )
+ groupedData[regional].summary.sla_gangguan.push(item.sla_gangguan)
+ groupedData[regional].summary.avg_durasi_recovery_keluhan.push(
+ item.avg_durasi_recovery_keluhan
+ )
+ groupedData[regional].summary.sla_keluhan.push(item.sla_keluhan)
+ groupedData[regional].summary.aging_complaint_gangguan.push(item.aging_complaint_gangguan)
+ groupedData[regional].summary.aging_complaint_keluhan.push(item.aging_complaint_keluhan)
+ groupedData[regional].summary.avg_aging_complaint.push(item.avg_aging_complaint)
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ avg_durasi_recovery_gangguan: [],
+ sla_gangguan: [],
+ avg_durasi_recovery_keluhan: [],
+ sla_keluhan: [],
+ aging_complaint_gangguan: [],
+ aging_complaint_keluhan: [],
+ avg_aging_complaint: []
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 8, styles: { fontStyle: 'bold' } }])
+
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ const avg_durasi_recovery_gangguan =
+ summary.avg_durasi_recovery_gangguan.reduce((a: number, b: number) => a + b, 0) /
+ summary.avg_durasi_recovery_gangguan.length
+ const sla_gangguan =
+ summary.sla_gangguan.reduce((a: number, b: number) => a + b, 0) / summary.sla_gangguan.length
+ const avg_durasi_recovery_keluhan =
+ summary.avg_durasi_recovery_keluhan.reduce((a: number, b: number) => a + b, 0) /
+ summary.avg_durasi_recovery_keluhan.length
+ const sla_keluhan =
+ summary.sla_keluhan.reduce((a: number, b: number) => a + b, 0) / summary.sla_keluhan.length
+ const aging_complaint_gangguan =
+ summary.aging_complaint_gangguan.reduce((a: number, b: number) => a + b, 0) /
+ summary.aging_complaint_gangguan.length
+ const aging_complaint_keluhan =
+ summary.aging_complaint_keluhan.reduce((a: number, b: number) => a + b, 0) /
+ summary.aging_complaint_keluhan.length
+ const avg_aging_complaint =
+ summary.avg_aging_complaint.reduce((a: number, b: number) => a + b, 0) /
+ summary.avg_aging_complaint.length
+
+ formattedData.push([
+ regional,
+ formatNumber(avg_durasi_recovery_gangguan),
+ formatNumber(sla_gangguan),
+ formatNumber(avg_durasi_recovery_keluhan),
+ formatNumber(sla_keluhan),
+ formatPercentage(aging_complaint_gangguan),
+ formatPercentage(aging_complaint_keluhan),
+ formatPercentage(avg_aging_complaint)
+ ])
+
+ total.avg_durasi_recovery_gangguan.push(avg_durasi_recovery_gangguan)
+ total.sla_gangguan.push(sla_gangguan)
+ total.avg_durasi_recovery_keluhan.push(avg_durasi_recovery_keluhan)
+ total.sla_keluhan.push(sla_keluhan)
+ total.aging_complaint_gangguan.push(aging_complaint_gangguan)
+ total.aging_complaint_keluhan.push(aging_complaint_keluhan)
+ total.avg_aging_complaint.push(avg_aging_complaint)
+ }
+
+ formattedData.push([
+ { content: 'RATA-RATA', styles: { fontStyle: 'bold' } },
+ formatNumber(
+ total.avg_durasi_recovery_gangguan.reduce((a: number, b: number) => a + b, 0) /
+ total.avg_durasi_recovery_gangguan.length
+ ),
+ formatNumber(
+ total.sla_gangguan.reduce((a: number, b: number) => a + b, 0) / total.sla_gangguan.length
+ ),
+ formatNumber(
+ total.avg_durasi_recovery_keluhan.reduce((a: number, b: number) => a + b, 0) /
+ total.avg_durasi_recovery_keluhan.length
+ ),
+ formatNumber(
+ total.sla_keluhan.reduce((a: number, b: number) => a + b, 0) / total.sla_keluhan.length
+ ),
+ formatPercentage(
+ total.aging_complaint_gangguan.reduce((a: number, b: number) => a + b, 0) /
+ total.aging_complaint_gangguan.length
+ ),
+ formatPercentage(
+ total.aging_complaint_keluhan.reduce((a: number, b: number) => a + b, 0) /
+ total.aging_complaint_keluhan.length
+ ),
+ formatPercentage(
+ total.avg_aging_complaint.reduce((a: number, b: number) => a + b, 0) /
+ total.avg_aging_complaint.length
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], ['s.d. ' + reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Aging Complains',
+ colSpan: 4
+ },
+ {
+ content: '% Aging Complains',
+ colSpan: 2
+ },
+ {
+ content: '% Rata2 Aging Complains',
+ rowSpan: 3
+ }
+ ],
+ [
+ {
+ content: 'Rata2 RCT Gangguan',
+ colSpan: 2
+ },
+ {
+ content: 'Rata2 RCT Keluhan',
+ colSpan: 2
+ },
+ {
+ content: 'G',
+ rowSpan: 2
+ },
+ {
+ content: 'K',
+ rowSpan: 2
+ }
+ ],
+ [
+ 's.d. ' + getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ 'SLA (Menit)',
+ 's.d. ' + getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ 'SLA (Jam)'
+ ],
+ ['1', '2', '3', '4', '5', '6 = 1-((2-3)/3))*100)', '7 = 1-((4-5)/5))*100)', '8 = (6+7)/2']
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'RATA-RATA') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:H1')
+ worksheet.mergeCells('A2:H2')
+ worksheet.mergeCells('A3:H3')
+ worksheet.mergeCells('A4:H4')
+ worksheet.mergeCells('A5:H5')
+ worksheet.mergeCells('A7:H7')
+ worksheet.mergeCells('A8:H8')
+
+ 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 }
diff --git a/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_EnergyNotSales.ts b/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_EnergyNotSales.ts
new file mode 100644
index 0000000..d8c8e3a
--- /dev/null
+++ b/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_EnergyNotSales.ts
@@ -0,0 +1,331 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber } from '@/utils/numbers'
+
+const reportName = 'Energy Not Sales (ENS)'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ terencana: 0,
+ tidak_terencana: 0,
+ bencana_alam: 0
+ }
+ }
+
+ groupedData[regional].summary.terencana += item.terencana
+ groupedData[regional].summary.tidak_terencana += item.tidak_terencana
+ groupedData[regional].summary.bencana_alam += item.bencana_alam
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ terencana: 0,
+ tidak_terencana: 0,
+ bencana_alam: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 6, styles: { fontStyle: 'bold' } }])
+
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ formattedData.push([
+ regional,
+ formatNumber(summary.terencana),
+ formatNumber(summary.tidak_terencana),
+ formatNumber(summary.bencana_alam),
+ formatNumber(summary.terencana + summary.tidak_terencana + summary.bencana_alam),
+ formatNumber(summary.terencana + summary.tidak_terencana)
+ ])
+
+ total.terencana += summary.terencana
+ total.tidak_terencana += summary.tidak_terencana
+ total.bencana_alam += summary.bencana_alam
+ }
+
+ formattedData.push([
+ { content: 'TOTAL', styles: { fontStyle: 'bold' } },
+ formatNumber(total.terencana),
+ formatNumber(total.tidak_terencana),
+ formatNumber(total.bencana_alam),
+ formatNumber(total.terencana + total.tidak_terencana + total.bencana_alam),
+ formatNumber(total.terencana + total.tidak_terencana)
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], ['s.d ' + reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'Nama Unit',
+ rowSpan: 2
+ },
+ {
+ content: 'ENS (Distribusi)',
+ colSpan: 3
+ },
+ {
+ content: 'Total',
+ rowSpan: 2
+ },
+ {
+ content: 'KPI ENS',
+ rowSpan: 2
+ }
+ ],
+ ['Terencana', 'Tidak Terencana', 'Bencana Alam'],
+ ['1', '2', '3', '4', '5 = 2+3+4', '6 = 2+3']
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:F1')
+ worksheet.mergeCells('A2:F2')
+ worksheet.mergeCells('A3:F3')
+ worksheet.mergeCells('A4:F4')
+ worksheet.mergeCells('A5:F5')
+ worksheet.mergeCells('A7:F7')
+ worksheet.mergeCells('A8:F8')
+
+ 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 }
diff --git a/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_KDADPelaporan.ts b/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_KDADPelaporan.ts
new file mode 100644
index 0000000..b77acc9
--- /dev/null
+++ b/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_KDADPelaporan.ts
@@ -0,0 +1,365 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthNameShort } from '@/utils/texts'
+
+const reportName = 'Kepatuhan dan Akurasi Dalam Pelaporan'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ gangguan_berulang: 0,
+ gangguan_total: 0,
+ keluhan_berulang: 0,
+ keluhan_total: 0
+ }
+ }
+
+ groupedData[regional].summary.gangguan_berulang += item.gangguan_berulang
+ groupedData[regional].summary.gangguan_total += item.gangguan_total
+ groupedData[regional].summary.keluhan_berulang += item.keluhan_berulang
+ groupedData[regional].summary.keluhan_total += item.keluhan_total
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ gangguan_berulang: 0,
+ gangguan_total: 0,
+ keluhan_berulang: 0,
+ keluhan_total: 0
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 6, styles: { fontStyle: 'bold' } }])
+
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ const komplain_pelanggan =
+ ((summary.gangguan_berulang / summary.gangguan_total +
+ summary.keluhan_berulang / summary.keluhan_total) /
+ 2) *
+ 100
+
+ formattedData.push([
+ regional,
+ formatNumber(summary.gangguan_berulang),
+ formatNumber(summary.gangguan_total),
+ formatNumber(summary.keluhan_berulang),
+ formatNumber(summary.keluhan_total),
+ formatPercentage(
+ !komplain_pelanggan || !isFinite(komplain_pelanggan) ? 0 : komplain_pelanggan
+ )
+ ])
+
+ total.gangguan_berulang += summary.gangguan_berulang
+ total.gangguan_total += summary.gangguan_total
+ total.keluhan_berulang += summary.keluhan_berulang
+ total.keluhan_total += summary.keluhan_total
+ }
+
+ const total_komplain_pelanggan =
+ ((total.gangguan_berulang / total.gangguan_total +
+ total.keluhan_berulang / total.keluhan_total) /
+ 2) *
+ 100
+
+ formattedData.push([
+ { content: 'TOTAL', styles: { fontStyle: 'bold' } },
+ formatNumber(total.gangguan_berulang),
+ formatNumber(total.gangguan_total),
+ formatNumber(total.keluhan_berulang),
+ formatNumber(total.keluhan_total),
+ formatPercentage(
+ !total_komplain_pelanggan || !isFinite(total_komplain_pelanggan)
+ ? 0
+ : total_komplain_pelanggan
+ )
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], ['s.d. ' + reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 'Kepatuhan dan Akurasi APKT',
+ colSpan: 4
+ },
+ {
+ content: 'Komplain Pelanggan (%)',
+ rowSpan: 3
+ }
+ ],
+ [
+ {
+ content: 'Gangguan Berulang',
+ colSpan: 2
+ },
+ {
+ content: 'Keluhan Berulang',
+ colSpan: 2
+ }
+ ],
+ [
+ 's.d. ' + getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ 'Total Gangguan',
+ 's.d. ' + getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ 'Total Keluhan'
+ ],
+ ['1', '2', '3', '4', '5', '6 = ((2/3)+(4/5))/2)*100']
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:F1')
+ worksheet.mergeCells('A2:F2')
+ worksheet.mergeCells('A3:F3')
+ worksheet.mergeCells('A4:F4')
+ worksheet.mergeCells('A5:F5')
+ worksheet.mergeCells('A7:F7')
+ worksheet.mergeCells('A8:F8')
+
+ 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 }
diff --git a/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_PenurunanJumlahKomplain.ts b/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_PenurunanJumlahKomplain.ts
new file mode 100644
index 0000000..0a8a7d2
--- /dev/null
+++ b/src/report/Monalisa/Laporan/Kumulatif/MonalisaLK_PenurunanJumlahKomplain.ts
@@ -0,0 +1,551 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+import { getMonthNameShort } from '@/utils/texts'
+
+const reportName = 'Penurunan Jumlah Komplain'
+const fontSize = 5
+
+const groupingData = (data: any) => {
+ const groupedData: any = {}
+
+ data.forEach((item: any) => {
+ const { nama_regional } = item
+
+ if (!groupedData[nama_regional]) {
+ groupedData[nama_regional] = { data: [] }
+ }
+
+ groupedData[nama_regional].data.push(item)
+ })
+
+ for (const regional in groupedData) {
+ const data = groupedData[regional].data
+
+ data.forEach((item: any) => {
+ if (!groupedData[regional].summary) {
+ groupedData[regional].summary = {
+ total_keluhan_tahun_sebelumnya: 0,
+ total_gangguan_tahun_sebelumnya: 0,
+ total_keluhan_informasi_tahun_sebelumnya: 0,
+ total_gangguan_informasi_tahun_sebelumnya: 0,
+ // total_informasi_tahun_sebelumnya
+ // total_tahun_sebelumnya
+ total_keluhan_tahun_ini: 0,
+ total_gangguan_tahun_ini: 0,
+ total_keluhan_informasi_tahun_ini: 0,
+ total_gangguan_informasi_tahun_ini: 0
+ // total_informasi_tahun_ini
+ // total_tahun_ini
+ // delta_keluhan
+ // delta_gangguan
+ // delta_informasi
+ // persen_delta_keluhan
+ // persen_delta_gangguan
+ // persen_delta_informasi
+ // persen_delta_total
+ }
+ }
+
+ groupedData[regional].summary.total_keluhan_tahun_sebelumnya +=
+ item.total_keluhan_tahun_sebelumnya
+ groupedData[regional].summary.total_gangguan_tahun_sebelumnya +=
+ item.total_gangguan_tahun_sebelumnya
+ groupedData[regional].summary.total_keluhan_informasi_tahun_sebelumnya +=
+ item.total_keluhan_informasi_tahun_sebelumnya
+ groupedData[regional].summary.total_gangguan_informasi_tahun_sebelumnya +=
+ item.total_gangguan_informasi_tahun_sebelumnya
+ groupedData[regional].summary.total_keluhan_tahun_ini += item.total_keluhan_tahun_ini
+ groupedData[regional].summary.total_gangguan_tahun_ini += item.total_gangguan_tahun_ini
+ groupedData[regional].summary.total_keluhan_informasi_tahun_ini +=
+ item.total_keluhan_informasi_tahun_ini
+ groupedData[regional].summary.total_gangguan_informasi_tahun_ini +=
+ item.total_gangguan_informasi_tahun_ini
+ })
+ }
+
+ return groupedData
+}
+
+const formatData = (rawData: any) => {
+ const data = groupingData(rawData)
+ const formattedData: any = []
+
+ const total: any = {
+ total_keluhan_tahun_sebelumnya: 0,
+ total_gangguan_tahun_sebelumnya: 0,
+ total_keluhan_informasi_tahun_sebelumnya: 0,
+ total_gangguan_informasi_tahun_sebelumnya: 0,
+ // total_informasi_tahun_sebelumnya
+ // total_tahun_sebelumnya
+ total_keluhan_tahun_ini: 0,
+ total_gangguan_tahun_ini: 0,
+ total_keluhan_informasi_tahun_ini: 0,
+ total_gangguan_informasi_tahun_ini: 0
+ // total_informasi_tahun_ini
+ // total_tahun_ini
+ // delta_keluhan
+ // delta_gangguan
+ // delta_informasi
+ // persen_delta_keluhan
+ // persen_delta_gangguan
+ // persen_delta_informasi
+ // persen_delta_total
+ }
+
+ formattedData.push([{ content: 'NASIONAL', colSpan: 20, styles: { fontStyle: 'bold' } }])
+
+ let no = 1
+ for (const regional in data) {
+ const summary = data[regional].summary
+
+ const total_informasi_tahun_sebelumnya =
+ summary.total_keluhan_informasi_tahun_sebelumnya +
+ summary.total_gangguan_informasi_tahun_sebelumnya
+ const total_tahun_sebelumnya =
+ summary.total_keluhan_tahun_sebelumnya +
+ summary.total_gangguan_tahun_sebelumnya +
+ total_informasi_tahun_sebelumnya
+ const total_informasi_tahun_ini =
+ summary.total_keluhan_informasi_tahun_ini + summary.total_gangguan_informasi_tahun_ini
+ const total_tahun_ini =
+ summary.total_keluhan_tahun_ini + summary.total_gangguan_tahun_ini + total_informasi_tahun_ini
+ const delta_keluhan = summary.total_keluhan_tahun_sebelumnya - summary.total_keluhan_tahun_ini
+ const delta_gangguan =
+ summary.total_gangguan_tahun_sebelumnya - summary.total_gangguan_tahun_ini
+ const delta_informasi = total_informasi_tahun_sebelumnya - total_informasi_tahun_ini
+ const persen_delta_keluhan = 40 * (delta_keluhan / summary.total_keluhan_tahun_sebelumnya)
+ const persen_delta_gangguan = 40 * (delta_gangguan / summary.total_gangguan_tahun_sebelumnya)
+ const persen_delta_informasi = 20 * (delta_informasi / total_informasi_tahun_sebelumnya)
+ const persen_delta_total = persen_delta_keluhan + persen_delta_gangguan + persen_delta_informasi
+
+ formattedData.push([
+ regional,
+ formatNumber(summary.total_keluhan_tahun_sebelumnya),
+ formatNumber(summary.total_gangguan_tahun_sebelumnya),
+ formatNumber(summary.total_keluhan_informasi_tahun_sebelumnya),
+ formatNumber(summary.total_gangguan_informasi_tahun_sebelumnya),
+ formatNumber(total_informasi_tahun_sebelumnya),
+ formatNumber(total_tahun_sebelumnya),
+ formatNumber(summary.total_keluhan_tahun_ini),
+ formatNumber(summary.total_gangguan_tahun_ini),
+ formatNumber(summary.total_keluhan_informasi_tahun_ini),
+ formatNumber(summary.total_gangguan_informasi_tahun_ini),
+ formatNumber(total_informasi_tahun_ini),
+ formatNumber(total_tahun_ini),
+ formatNumber(delta_keluhan),
+ formatNumber(delta_gangguan),
+ formatNumber(delta_informasi),
+ formatPercentage(
+ !persen_delta_keluhan || !isFinite(persen_delta_keluhan) ? 0 : persen_delta_keluhan
+ ),
+ formatPercentage(
+ !persen_delta_gangguan || !isFinite(persen_delta_gangguan) ? 0 : persen_delta_gangguan
+ ),
+ formatPercentage(
+ !persen_delta_informasi || !isFinite(persen_delta_informasi) ? 0 : persen_delta_informasi
+ ),
+ formatPercentage(
+ !persen_delta_total || !isFinite(persen_delta_total) ? 0 : persen_delta_total
+ )
+ ])
+
+ total.total_keluhan_tahun_sebelumnya += summary.total_keluhan_tahun_sebelumnya
+ total.total_gangguan_tahun_sebelumnya += summary.total_gangguan_tahun_sebelumnya
+ total.total_keluhan_informasi_tahun_sebelumnya +=
+ summary.total_keluhan_informasi_tahun_sebelumnya
+ total.total_gangguan_informasi_tahun_sebelumnya +=
+ summary.total_gangguan_informasi_tahun_sebelumnya
+ total.total_keluhan_tahun_ini += summary.total_keluhan_tahun_ini
+ total.total_gangguan_tahun_ini += summary.total_gangguan_tahun_ini
+ total.total_keluhan_informasi_tahun_ini += summary.total_keluhan_informasi_tahun_ini
+ total.total_gangguan_informasi_tahun_ini += summary.total_gangguan_informasi_tahun_ini
+ }
+
+ const total_informasi_tahun_sebelumnya =
+ total.total_keluhan_informasi_tahun_sebelumnya + total.total_gangguan_informasi_tahun_sebelumnya
+ const total_tahun_sebelumnya =
+ total.total_keluhan_tahun_sebelumnya +
+ total.total_gangguan_tahun_sebelumnya +
+ total_informasi_tahun_sebelumnya
+ const total_informasi_tahun_ini =
+ total.total_keluhan_informasi_tahun_ini + total.total_gangguan_informasi_tahun_ini
+ const total_tahun_ini =
+ total.total_keluhan_tahun_ini + total.total_gangguan_tahun_ini + total_informasi_tahun_ini
+ const delta_keluhan = total.total_keluhan_tahun_sebelumnya - total.total_keluhan_tahun_ini
+ const delta_gangguan = total.total_gangguan_tahun_sebelumnya - total.total_gangguan_tahun_ini
+ const delta_informasi = total_informasi_tahun_sebelumnya - total_informasi_tahun_ini
+ const persen_delta_keluhan = 40 * (delta_keluhan / total.total_keluhan_tahun_sebelumnya)
+ const persen_delta_gangguan = 40 * (delta_gangguan / total.total_gangguan_tahun_sebelumnya)
+ const persen_delta_informasi = 20 * (delta_informasi / total_informasi_tahun_sebelumnya)
+ const persen_delta_total = persen_delta_keluhan + persen_delta_gangguan + persen_delta_informasi
+
+ formattedData.push([
+ { content: 'TOTAL', styles: { fontStyle: 'bold' } },
+ formatNumber(total.total_keluhan_tahun_sebelumnya),
+ formatNumber(total.total_gangguan_tahun_sebelumnya),
+ formatNumber(total.total_keluhan_informasi_tahun_sebelumnya),
+ formatNumber(total.total_gangguan_informasi_tahun_sebelumnya),
+ formatNumber(total_informasi_tahun_sebelumnya),
+ formatNumber(total_tahun_sebelumnya),
+ formatNumber(total.total_keluhan_tahun_ini),
+ formatNumber(total.total_gangguan_tahun_ini),
+ formatNumber(total.total_keluhan_informasi_tahun_ini),
+ formatNumber(total.total_gangguan_informasi_tahun_ini),
+ formatNumber(total_informasi_tahun_ini),
+ formatNumber(total_tahun_ini),
+ formatNumber(delta_keluhan),
+ formatNumber(delta_gangguan),
+ formatNumber(delta_informasi),
+ formatPercentage(
+ !persen_delta_keluhan || !isFinite(persen_delta_keluhan) ? 0 : persen_delta_keluhan
+ ),
+ formatPercentage(
+ !persen_delta_gangguan || !isFinite(persen_delta_gangguan) ? 0 : persen_delta_gangguan
+ ),
+ formatPercentage(
+ !persen_delta_informasi || !isFinite(persen_delta_informasi) ? 0 : persen_delta_informasi
+ ),
+ formatPercentage(!persen_delta_total || !isFinite(persen_delta_total) ? 0 : persen_delta_total)
+ ])
+
+ return formattedData
+}
+
+const exportToPDF = (reportMeta: any, rawData: any, preview: boolean = false) => {
+ 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 data = formatData(rawData)
+ const doc = new jsPDF({
+ orientation: 'landscape'
+ })
+
+ 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()
+ ],
+ [
+ 'UNIT LAYANAN PELANGGAN',
+ ':',
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ ],
+ [
+ 'REGIONAL',
+ ':',
+ reportMeta.regional
+ ? reportMeta.regional.name.toUpperCase()
+ : 'Semua Regional'.toUpperCase()
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold'
+ },
+ theme: 'plain',
+ startY: 10
+ })
+
+ autoTable(doc, {
+ head: [[`${reportName}`.toUpperCase()], ['s.d. ' + reportMeta.periode]],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ startY: 23
+ })
+
+ autoTable(doc, {
+ head: [
+ [
+ {
+ content: 'Nama Unit',
+ rowSpan: 3
+ },
+ {
+ content: 's.d. ' + getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.lastYear,
+ colSpan: 6
+ },
+ {
+ content:
+ 's.d. ' + getMonthNameShort(reportMeta.currentMonth) + ' ' + reportMeta.currentYear,
+ colSpan: 6
+ },
+ {
+ content: 'Delta Penurunan',
+ colSpan: 3
+ },
+ {
+ content: '% Penurunan YoY',
+ colSpan: 4
+ }
+ ],
+ [
+ {
+ content: 'Keluhan',
+ rowSpan: 2
+ },
+ {
+ content: 'Gangguan',
+ rowSpan: 2
+ },
+ {
+ content: 'Informasi',
+ colSpan: 3
+ },
+ {
+ content: 'Total Komplain',
+ rowSpan: 2
+ },
+ {
+ content: 'Keluhan',
+ rowSpan: 2
+ },
+ {
+ content: 'Gangguan',
+ rowSpan: 2
+ },
+ {
+ content: 'Informasi',
+ colSpan: 3
+ },
+ {
+ content: 'Total Komplain',
+ rowSpan: 2
+ },
+ {
+ content: 'Keluhan',
+ rowSpan: 2
+ },
+ {
+ content: 'Gangguan',
+ rowSpan: 2
+ },
+ {
+ content: 'Informasi',
+ rowSpan: 2
+ },
+ {
+ content: 'Keluhan',
+ rowSpan: 2
+ },
+ {
+ content: 'Gangguan',
+ rowSpan: 2
+ },
+ {
+ content: 'Informasi',
+ rowSpan: 2
+ },
+ {
+ content: '% Total',
+ rowSpan: 2
+ }
+ ],
+ ['Keluhan', 'Gangguan', 'Total', 'Keluhan', 'Gangguan', 'Total'],
+ [
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6=4+5',
+ '7=2+3+6',
+ '8',
+ '9',
+ '10',
+ '11',
+ '12=10+11',
+ '13=8+9+12',
+ '14=2-8',
+ '15=3-9',
+ '16=6-12',
+ '17=40%*(14/2)',
+ '18=40%*(15/3)',
+ '19=20%*(16/6)',
+ '20=17+18+19'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${day}, ${date}-${month}-${year}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportToXLSX = (reportMeta: any, e: any) => {
+ 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,
+ `UNIT LAYANAN PELANGGAN : ${
+ reportMeta.ulp
+ ? reportMeta.ulp.name.toUpperCase()
+ : 'Semua Unit Layanan Pelanggan'.toUpperCase()
+ }`
+ )
+ setHeaderStyle(
+ worksheet,
+ 5,
+ 1,
+ `REGIONAL : ${
+ reportMeta.regional ? reportMeta.regional.name.toUpperCase() : 'Semua Regional'.toUpperCase()
+ }`
+ )
+
+ setHeaderStyle(worksheet, 7, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(worksheet, 8, 1, reportMeta.periode, true)
+
+ worksheet.mergeCells('A1:T1')
+ worksheet.mergeCells('A2:T2')
+ worksheet.mergeCells('A3:T3')
+ worksheet.mergeCells('A4:T4')
+ worksheet.mergeCells('A5:T5')
+ worksheet.mergeCells('A7:T7')
+ worksheet.mergeCells('A8:T8')
+
+ 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 }
From f2259e7f2c18fd2c8b30f93d18f3cf8ac8b735f3 Mon Sep 17 00:00:00 2001
From: kur0nek-o
Date: Thu, 4 Apr 2024 00:11:19 +0700
Subject: [PATCH 22/29] feat: create export laporan cico
---
src/components/Pages/Cico/LaporanCICO.vue | 63 +--
src/report/Cico/LaporanCICO.ts | 540 ++++++++++++++++++++++
2 files changed, 573 insertions(+), 30 deletions(-)
create mode 100644 src/report/Cico/LaporanCICO.ts
diff --git a/src/components/Pages/Cico/LaporanCICO.vue b/src/components/Pages/Cico/LaporanCICO.vue
index 05a9f22..b3f3b01 100755
--- a/src/components/Pages/Cico/LaporanCICO.vue
+++ b/src/components/Pages/Cico/LaporanCICO.vue
@@ -1,5 +1,11 @@
- filterData(filters)" :report-button="true" class="mb-4">
+ exportToPDF(reportMeta, data, true)"
+ @reset-form="data = []"
+ @run-search="() => filterData(filters)"
+ :report-button="true"
+ class="mb-4"
+ >
(filters = value)" />
@@ -193,7 +199,7 @@
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
- @exporting="onExporting"
+ @exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -868,14 +874,8 @@ import {
DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid'
-import { jsPDF } from 'jspdf'
-import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
-import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
-import { saveAs } from 'file-saver'
-import { Workbook } from 'exceljs'
import Filters from '@/components/Form/Filters.vue'
import { Type1 } from '@/components/Form/FiltersType'
-import { useQuery } from '@vue/apollo-composable'
import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import DetailDialog from '@/components/Dialogs/DetailDialog.vue'
@@ -884,6 +884,12 @@ import { formatWaktu } from '@/components/Form/FiltersType/reference'
import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
+import {
+ exportToPDF,
+ exportToXLSX,
+ exportDetailToPDF,
+ exportDetailToXLSX
+} from '@/report/Cico/LaporanCICO'
const client = apolloClient()
provideApolloClient(client)
@@ -899,6 +905,12 @@ const dataSub = ref([])
const dialogDetail = ref(false)
const loadingData = ref(false)
const loadingSubData = ref(false)
+const reportMeta = ref({
+ uid: { id: 0, name: 'Semua Unit Induk Distribusi/Wilayah' },
+ up3: { id: 0, name: 'Semua Unit Pelaksanaan Pelayanan Pelanggan' },
+ posko: { id: 0, name: 'Semua Posko' },
+ periode: ''
+})
const closedialogDetail = () => (dialogDetail.value = false)
@@ -951,30 +963,19 @@ const showDetail = () => {
const onExporting = (e: any) => {
if (e.format === 'pdf') {
- const doc = new jsPDF()
-
- exportToPdf({
- jsPDFDocument: doc,
- component: e.component,
- indent: 5
- }).then(() => {
- doc.save(`.pdf`)
- })
+ exportToPDF(reportMeta.value, data.value)
+ } else if (e.format === 'xlsx') {
+ exportToXLSX(reportMeta.value, e)
} else {
- const workbook = new Workbook()
- const worksheet = workbook.addWorksheet('Employees')
+ }
+}
- exportToExcel({
- component: e.component,
- worksheet,
- autoFilterEnabled: true
- }).then(() => {
- workbook.xlsx.writeBuffer().then((buffer: any) => {
- saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx')
- })
- })
-
- e.cancel = true
+const onExportingDetail = (e: any) => {
+ if (e.format === 'pdf') {
+ exportDetailToPDF(reportMeta.value, dataSub.value)
+ } else if (e.format === 'xlsx') {
+ exportDetailToXLSX(reportMeta.value, e)
+ } else {
}
}
@@ -1021,6 +1022,8 @@ const filterData = async (params: any) => {
} else {
data.value = []
}
+
+ reportMeta.value = filters.value
})
.catch((err) => {
console.error(err)
diff --git a/src/report/Cico/LaporanCICO.ts b/src/report/Cico/LaporanCICO.ts
new file mode 100644
index 0000000..319615d
--- /dev/null
+++ b/src/report/Cico/LaporanCICO.ts
@@ -0,0 +1,540 @@
+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 { setHeaderStyle } from '@/report/utils/xlsx'
+import { formatNumber, formatPercentage } from '@/utils/numbers'
+
+const reportName = 'Laporan Check In Check Out (CICO)'
+const fontSize = 5
+const detailFontSize = 3
+
+const formatData = (rawData: any) => {
+ const formattedData: any = []
+
+ const total: any = {
+ jumlah_wo_gangguan_individual: 0,
+ avg_durasi_wo_gangguan_individual: [],
+ avg_rpt_wo_gangguan_individual: [],
+ avg_rct_wo_gangguan_individual: [],
+ jumlah_wo_penugasan_khusus: 0,
+ avg_wo_penugasan_khusus: []
+ }
+
+ rawData.forEach((data: any) => {
+ formattedData.push([
+ data.user_regu,
+ data.personil_yantek,
+ data.jumlah_wo_gangguan_individual,
+ data.avg_durasi_wo_gangguan_individual,
+ data.avg_rpt_wo_gangguan_individual,
+ data.avg_rct_wo_gangguan_individual,
+ data.jumlah_wo_penugasan_khusus,
+ data.avg_wo_penugasan_khusus
+ ])
+
+ total.jumlah_wo_gangguan_individual += data.jumlah_wo_gangguan_individual
+ total.avg_durasi_wo_gangguan_individual.push(data.avg_durasi_wo_gangguan_individual)
+ total.avg_rpt_wo_gangguan_individual.push(data.avg_rpt_wo_gangguan_individual)
+ total.avg_rct_wo_gangguan_individual.push(data.avg_rct_wo_gangguan_individual)
+ total.jumlah_wo_penugasan_khusus += data.jumlah_wo_penugasan_khusus
+ total.avg_wo_penugasan_khusus.push(data.avg_wo_penugasan_khusus)
+ })
+
+ formattedData.push([
+ {
+ content: 'TOTAL',
+ colSpan: 2
+ },
+ formatNumber(total.jumlah_wo_gangguan_individual),
+ formatNumber(
+ total.avg_durasi_wo_gangguan_individual.reduce((a: any, b: any) => a + b, 0) /
+ total.avg_durasi_wo_gangguan_individual.length
+ ),
+ formatNumber(
+ total.avg_rpt_wo_gangguan_individual.reduce((a: any, b: any) => a + b, 0) /
+ total.avg_rpt_wo_gangguan_individual.length
+ ),
+ formatNumber(
+ total.avg_rct_wo_gangguan_individual.reduce((a: any, b: any) => a + b, 0) /
+ total.avg_rct_wo_gangguan_individual.length
+ ),
+ formatNumber(total.jumlah_wo_penugasan_khusus),
+ formatNumber(
+ total.avg_wo_penugasan_khusus.reduce((a: any, b: any) => a + b, 0) /
+ total.avg_wo_penugasan_khusus.length
+ )
+ ])
+
+ 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('id-ID', {
+ month: 'long'
+ })}-${dateFrom.getFullYear()}`
+
+ dateToFormat = `${dateTo.getDate()}-${dateTo.toLocaleString('id-ID', {
+ month: 'long'
+ })}-${dateTo.getFullYear()}`
+
+ dayTo = dateTo.toLocaleString('id-ID', { 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'
+ })
+
+ 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: [
+ [
+ 'User Regu',
+ 'Personil Yantek',
+ 'Jumlah WO Gangguan Individual',
+ 'Rata-rata Durasi WO Gangguan',
+ 'Rata-rata RPT WO Gangguan',
+ 'Rata-rata RCT WO Gangguan',
+ 'Jumlah WO Penugasan Khusus',
+ 'Rata-rata WO Penugasan Khusus'
+ ]
+ ],
+ body: data,
+ styles: {
+ fontSize,
+ cellPadding: 1,
+ lineColor: [0, 0, 0],
+ lineWidth: 0.1,
+ cellWidth: 'auto'
+ },
+ rowPageBreak: 'auto',
+ headStyles: {
+ fillColor: [192, 192, 192],
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ cellWidth: 'wrap',
+ 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()
+ })
+ }
+
+ if (data.cell.text[0] === 'TOTAL') {
+ for (const key in data.row.cells) {
+ data.row.cells[key].styles.fillColor = [192, 192, 192]
+ data.row.cells[key].styles.fontStyle = 'bold'
+ }
+ }
+ },
+ startY: 30
+ })
+
+ autoTable(doc, {
+ head: [
+ [`${meta.dayTo}, ${meta.dateToFormat}`],
+ [
+ {
+ content: '(.........................................)',
+ styles: { minCellHeight: 8, valign: 'bottom' }
+ }
+ ]
+ ],
+ styles: {
+ fontSize,
+ cellPadding: 0.1,
+ textColor: [0, 0, 0],
+ fontStyle: 'bold',
+ halign: 'center'
+ },
+ theme: 'plain',
+ tableWidth: 50,
+ margin: { left: 230 }
+ })
+
+ if (preview) {
+ doc.setProperties({
+ title: `${reportName}`
+ })
+ window.open(doc.output('bloburl'))
+ } else {
+ doc.save(`Laporan ${reportName}.pdf`, { returnPromise: true }).then(() => {
+ console.log('pdf berhasil disimpan')
+ })
+ }
+}
+
+const exportDetailToPDF = (reportMeta: any, rawData: any) => {
+ const meta = formatMetaData(reportMeta)
+ 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: [
+ [
+ 'No',
+ 'UID/UIW',
+ 'UP3',
+ 'Posko',
+ 'Sumber Lapor',
+ 'Create By',
+ 'Dispacth By',
+ 'User Regu',
+ 'Nama Regu',
+ 'Nama Petugas',
+ 'Shift',
+ 'Check In Petugas',
+ 'No Laporan',
+ 'Tgl Lapor',
+ 'Tgl Penugasan Baru',
+ 'Tgl Dalam Perjalanan',
+ 'Tgl Pengerjaan',
+ 'Tgl Nyala Sementara',
+ 'Tgl Nyala',
+ 'Tgl Selesai',
+ 'Durasi Perjalanan',
+ 'Durasi WO',
+ 'Check Out Petugas',
+ 'RPT',
+ 'RCT',
+ 'Rating',
+ 'Jml Pelanggan Padam',
+ 'Fasilitas',
+ 'Sub Fasilitas',
+ 'Peralatan',
+ 'Dampak Kerusakan',
+ 'Penyebab',
+ 'Kelompok Penyebab',
+ 'Cuaca',
+ 'Keterangan Pelapor',
+ 'Keterangan',
+ 'Penyebab Padam',
+ 'Tindakan',
+ 'APKT Status',
+ 'Referensi Marking',
+ 'BLTH'
+ ]
+ ],
+ body: rawData.map((item: any, i: any) => [
+ { content: i + 1, styles: { halign: 'right' } },
+ item.nama_uid,
+ item.nama_up3,
+ item.nama_posko,
+ item.media,
+ item.pembuat_laporan,
+ item.dispacth_by,
+ item.waktu_dispacth,
+ item.user_regu,
+ item.nama_regu,
+ item.personil_yantek,
+ item.shift,
+ item.check_in_petugas,
+ item.no_laporan,
+ item.waktu_lapor,
+ item.waktu_dispacth,
+ item.waktu_perjalanan,
+ item.waktu_response,
+ item.waktu_nyala_sementara,
+ item.waktu_nyala,
+ item.waktu_selesai,
+ item.durasi_waktu_response,
+ item.durasi_wo,
+ item.check_out_petugas,
+ item.durasi_menit_response,
+ item.durasi_menit_recovery,
+ item.rating,
+ item.jml_pelanggan_padam,
+ item.fasilitas,
+ item.sub_fasilitas,
+ item.peralatan,
+ item.dampak_kerusakan,
+ item.penyebab,
+ item.kelompok_penyebab,
+ item.cuaca,
+ item.keterangan_pelapor,
+ item.keterangan,
+ item.penyebab_padam,
+ item.tindakan,
+ item.status_akhir,
+ item.referensi_marking,
+ item.blth
+ ]),
+ 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: [
+ [`${meta.dayTo}, ${meta.dateToFormat}`],
+ [
+ {
+ 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()
+ 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, 6, 1, `${reportName}`.toUpperCase(), true)
+ setHeaderStyle(
+ worksheet,
+ 7,
+ 1,
+ `PERIODE TANGGAL : ${meta.dateFromFormat} SD TGL ${meta.dateToFormat}`,
+ true
+ )
+
+ worksheet.mergeCells('A1:H1')
+ worksheet.mergeCells('A2:H2')
+ worksheet.mergeCells('A3:H3')
+ worksheet.mergeCells('A4:H4')
+ worksheet.mergeCells('A6:H6')
+ worksheet.mergeCells('A7:H7')
+
+ exportToExcel({
+ component: e.component,
+ worksheet,
+ autoFilterEnabled: true,
+ topLeftCell: { row: 9, 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
+}
+
+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('A3:AP3')
+ worksheet.mergeCells('A4:AP4')
+
+ 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
+}
+
+export { exportToPDF, exportToXLSX, exportDetailToPDF, exportDetailToXLSX }
From 44c17241531f5dbb383b38f8a9558f164258d8bf Mon Sep 17 00:00:00 2001
From: Dede Fuji Abdul
Date: Thu, 4 Apr 2024 03:49:26 +0700
Subject: [PATCH 23/29] Tabel Material
---
.../Pages/Material/Daftar/Material_DGMYG.vue | 161 +++++++++++++++---
.../Pages/Material/Rekap/Material_RPM.vue | 118 ++++++++++++-
src/utils/api/api.graphql.ts | 105 ++++++++++--
3 files changed, 340 insertions(+), 44 deletions(-)
diff --git a/src/components/Pages/Material/Daftar/Material_DGMYG.vue b/src/components/Pages/Material/Daftar/Material_DGMYG.vue
index 39042a3..8b65304 100755
--- a/src/components/Pages/Material/Daftar/Material_DGMYG.vue
+++ b/src/components/Pages/Material/Daftar/Material_DGMYG.vue
@@ -7,14 +7,15 @@
ref="dataGridRef"
:allow-column-reordering="true"
class="max-h-[calc(100vh-140px)] mb-10"
+ :data-source="data"
:show-column-lines="true"
:show-row-lines="false"
:show-borders="true"
:row-alternation-enabled="true"
:hover-state-enabled="true"
- @selection-changed=""
+ @selection-changed="onSelectionChanged"
:column-width="100"
- @exporting=""
+ @exporting="onExporting"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -41,49 +42,56 @@
:calculate-display-value="(item: any) => data.findIndex((i) => i == item) + 1"
data-type="number"
caption="No"
+ cell-template="formatNumber"
/>
+
+
+
+ {{ data.text }}
+
+
+
+
+
+ {{
+ isNumber(data.text)
+ ? data.column.caption == '%'
+ ? formatPercentage(data.text)
+ : formatNumber(data.text)
+ : data.text
+ }}
+
+
-
+
+
+
+
+
No Gangguan:
+
+
+
+
+
Nama Pelapor:
+
+
+
+
+
Isi Laporan:
+
+
+
+
+
Penyebab Gangguan:
+
+
+
+
+
Tgl Padam:
+
+
+
+
+
Tgl Nyala:
+
+
+
+
+
Regu:
+
+
+
+
+
Sumber:
+
+
+
+
+
Nama:
+
+
+
+
+
Satuan:
+
+
+
+
+
Vol:
+
+
+
+
+
+
diff --git a/src/components/Pages/Material/Rekap/Material_RPM.vue b/src/components/Pages/Material/Rekap/Material_RPM.vue
index 56ecc2d..e8a42f7 100755
--- a/src/components/Pages/Material/Rekap/Material_RPM.vue
+++ b/src/components/Pages/Material/Rekap/Material_RPM.vue
@@ -7,14 +7,15 @@
ref="dataGridRef"
:allow-column-reordering="true"
class="max-h-[calc(100vh-140px)] mb-10"
+ :data-source="data"
:show-column-lines="true"
:show-row-lines="false"
:show-borders="true"
:row-alternation-enabled="true"
:hover-state-enabled="true"
- @selection-changed=""
+ @selection-changed="onSelectionChanged"
:column-width="100"
- @exporting=""
+ @exporting="onExporting"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
@@ -41,14 +42,16 @@
:calculate-display-value="(item: any) => data.findIndex((i) => i == item) + 1"
data-type="number"
caption="No"
+ cell-template="formatNumber"
/>
+
+
+
+
+ {{ data.text }}
+
+
+
+
+
+ {{
+ isNumber(data.text)
+ ? data.column.caption == '%'
+ ? formatPercentage(data.text)
+ : formatNumber(data.text)
+ : data.text
+ }}
+
+
-
+
+
+
+
+
Kode Material:
+
+
+
+
+
Nama Material:
+
+
+
+
+
Satuan:
+
+
+
+
+
Sumber Material:
+
+
+
+
+
Tgl {{ i }}:
+
+
+
+
+
Jumlah:
+
+
+
+
+
+
diff --git a/src/utils/api/api.graphql.ts b/src/utils/api/api.graphql.ts
index 208a86a..c55d180 100755
--- a/src/utils/api/api.graphql.ts
+++ b/src/utils/api/api.graphql.ts
@@ -862,6 +862,71 @@ export const queries = {
}
}
`,
+ gangguanRatingDetail: gql`
+ query detailRekapitulasiGangguanBerdasarkanRating(
+ $dateFrom: Date!
+ $dateTo: Date!
+ $posko: Int!
+ $idUid: Int!
+ $idUp3: Int!
+ $idRegu: Int!
+ $namaRegional: String!
+ $isSelesai: Int
+ $isNonRating: Int
+ $nilaiRating: Int
+ ) {
+ detailRekapitulasiGangguanBerdasarkanRating(
+ dateFrom: $dateFrom
+ dateTo: $dateTo
+ posko: $posko
+ idUid: $idUid
+ idUp3: $idUp3
+ idRegu: $idRegu
+ namaRegional: $namaRegional
+ isSelesai: $isSelesai
+ isNonRating: $isNonRating
+ nilaiRating: $nilaiRating
+ ) {
+ alamat_pelapor
+ diselesaikan_oleh
+ dispatch_oleh
+ durasi_dispatch_time
+ durasi_recovery_time
+ durasi_response_time
+ id
+ idpel_nometer
+ id_posko
+ id_uid
+ id_ulp
+ id_up3
+ is_marking
+ is_non_rating
+ is_selesai
+ jarak_closing
+ jenis_gangguan
+ keterangan_pelapor
+ kode_gangguan
+ media
+ nama_pelapor
+ nama_posko
+ nama_regional
+ nama_uid
+ nama_ulp
+ nama_up3
+ nilai_rating
+ no_laporan
+ no_telp_pelapor
+ pembuat_laporan
+ penyebab
+ referensi_marking
+ status_akhir
+ tindakan
+ waktu_lapor
+ waktu_recovery
+ waktu_response
+ }
+ }
+ `,
gangguanRatingPerPosko: gql`
query rekapitulasiGangguanRatingPerPosko(
$dateFrom: Date!
@@ -4042,27 +4107,29 @@ export const queries = {
query DaftardaftarGangguanDanMaterialDipakai(
$dateFrom: Date!
$dateTo: Date!
- $posko: String
+ $idPosko: Int
$idUid: Int
$idUp3: Int
) {
daftarGangguanDanMaterialDipakai(
dateFrom: $dateFrom
dateTo: $dateTo
- distribusi: $idUid
- area: $idUp3
- posko: $posko
+ idUid: $idUid
+ idUp3: $idUp3
+ idPosko: $idPosko
) {
- isi_laporan
- nama_material
- nama_pelanggan
- nomor_gangguan
- penyebab_gangguan
+ id
+ no_laporan
+ nama_pelapor
+ keterangan_pelapor
+ penyebab
+ waktu_lapor
+ waktu_recovery
regu
- satuan
- sumber
- volume
- waktu_padam
+ media
+ nama_material
+ satuan_material
+ volume_material
}
}
`
@@ -4072,18 +4139,19 @@ export const queries = {
query DaftarrekapitulasiPemakaianMaterial(
$dateFrom: Date!
$dateTo: Date!
- $posko: String
+ $idPosko: Int
$idUid: Int
$idUp3: Int
) {
rekapitulasiPemakaianMaterial(
dateFrom: $dateFrom
dateTo: $dateTo
- distribusi: $idUid
- area: $idUp3
- posko: $posko
+ idUid: $idUid
+ idUp3: $idUp3
+ idPosko: $idPosko
) {
- kode_material
+ id
+ kode
nama_material
satuan
sumber_material
@@ -4118,6 +4186,7 @@ export const queries = {
tgl7
tgl8
tgl9
+ total
}
}
`
From 1e6513cbe2115635e1c82e0e8fbd0a424422e125 Mon Sep 17 00:00:00 2001
From: Dede Fuji Abdul
Date: Thu, 4 Apr 2024 12:44:05 +0700
Subject: [PATCH 24/29] CTT KWH Periksa Detail
---
.../Pages/Ctt/CTT_LaporanCttKwhPeriksa.vue | 402 ++++++++++++++----
src/utils/api/api.graphql.ts | 246 +++++++----
2 files changed, 472 insertions(+), 176 deletions(-)
diff --git a/src/components/Pages/Ctt/CTT_LaporanCttKwhPeriksa.vue b/src/components/Pages/Ctt/CTT_LaporanCttKwhPeriksa.vue
index 700f12b..c5f6199 100755
--- a/src/components/Pages/Ctt/CTT_LaporanCttKwhPeriksa.vue
+++ b/src/components/Pages/Ctt/CTT_LaporanCttKwhPeriksa.vue
@@ -73,7 +73,7 @@
data-type="number"
caption="a"
css-class="custom-table-column"
- cell-template="formatNumber"
+ cell-template="formatNumberWoCC"
/>
@@ -84,7 +84,7 @@
data-type="number"
caption="b"
css-class="custom-table-column"
- cell-template="formatNumber"
+ cell-template="formatNumberWoPLMMobile"
/>
@@ -95,7 +95,7 @@
data-type="number"
caption="c"
css-class="custom-table-column"
- cell-template="formatNumber"
+ cell-template="formatNumberWoComcen"
/>
@@ -106,7 +106,7 @@
data-type="number"
caption="d=a+b+c"
css-class="custom-table-column"
- cell-template="formatNumber"
+ cell-template="formatNumberWoTotal"
/>
@@ -119,7 +119,7 @@
data-type="number"
caption="e"
css-class="custom-table-column"
- cell-template="formatNumber"
+ cell-template="formatNumberRekomendasi1"
/>