Add total_durasi_response and total_durasi_recovery fields to api.graphql.ts

This commit is contained in:
Dede Fuji Abdul 2024-04-08 15:30:34 +07:00
parent 4943cbec09
commit a2cd210269
17 changed files with 7101 additions and 1529 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,31 @@
<template> <template>
<Filters @reset-form="data = []" :report-button="true" @run-search="() => filterData(filters)" <Filters
@run-report="() => exportToPDF(reportMeta, data, true)" class="mb-4"> @reset-form="data = []"
:report-button="true"
@run-search="() => filterData(filters)"
@run-report="() => exportToPDF(reportMeta, data, true)"
class="mb-4"
>
<Type1 @update:filters="(value) => (filters = value)" /> <Type1 @update:filters="(value) => (filters = value)" />
</Filters> </Filters>
<div id="data"> <div id="data">
<DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" <DxDataGrid
:data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" ref="dataGridRef"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onDataSelectionChanged" :allow-column-reordering="true"
@exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="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="onDataSelectionChanged"
@exporting="onExporting"
:allow-column-resizing="true"
column-resizing-mode="widget"
:word-wrap-enabled="true"
>
<DxGrouping expand-mode="rowClick" /> <DxGrouping expand-mode="rowClick" />
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
@ -16,30 +33,86 @@
<!-- --> <!-- -->
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxColumn css-class="custom-table-column" :width="50" alignment="center" data-field="number" caption="No" <DxColumn
cell-template="formatNumber" /> css-class="custom-table-column"
<DxColumn alignment="center" :min-width="180" data-field="nama_up3" caption="Nama UP3" :width="50"
css-class="custom-table-column" cell-template="formatText" /> alignment="center"
<DxColumn alignment="center" :min-width="180" data-field="nama_uid" caption="Nama UID" data-field="number"
css-class="custom-table-column" :group-index="0" /> caption="No"
cell-template="formatNumber"
/>
<DxColumn
alignment="center"
:min-width="180"
data-field="nama_up3"
caption="Nama UP3"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
alignment="center"
:min-width="180"
data-field="nama_uid"
caption="Nama UID"
css-class="custom-table-column"
:group-index="0"
/>
<DxColumn alignment="center" :min-width="180" data-field="nama_posko" caption="Nama Posko" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> alignment="center"
<DxColumn :width="180" alignment="center" data-field="posko_in" caption="Posko IN" css-class="custom-table-column" :min-width="180"
cell-template="formatNumberPoskoIn" /> data-field="nama_posko"
<DxColumn :width="180" alignment="center" data-field="posko_out" caption="Posko OUT" caption="Nama Posko"
css-class="custom-table-column" cell-template="formatNumberPoskoOut" /> css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="180"
alignment="center"
data-field="posko_in"
caption="Posko IN"
css-class="custom-table-column"
cell-template="formatNumberPoskoIn"
/>
<DxColumn
:width="180"
alignment="center"
data-field="posko_out"
caption="Posko OUT"
css-class="custom-table-column"
cell-template="formatNumberPoskoOut"
/>
<DxSummary> <DxSummary>
<DxGroupItem :show-in-group-footer="true" column="number" display-format="Total" css-class="!text-left" <DxGroupItem
:customize-text="(e: any) => formatNumber(e.value)" /> :show-in-group-footer="true"
<DxGroupItem :show-in-group-footer="true" column="posko_in" summary-type="sum" display-format="{0}" column="nama_up3"
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> display-format="Total"
<DxGroupItem :show-in-group-footer="true" column="posko_out" summary-type="sum" display-format="{0}" css-class="!text-left"
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> />
<DxGroupItem
:show-in-group-footer="true"
column="posko_in"
summary-type="sum"
display-format="{0}"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="posko_out"
summary-type="sum"
display-format="{0}"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
</DxSummary> </DxSummary>
<template #formatText="{ data }"> <template #formatText="{ data }">
@ -51,94 +124,227 @@
<template #formatNumber="{ data }"> <template #formatNumber="{ data }">
<p class="text-right cursor-pointer" @click="setPoskoSelected('')"> <p class="text-right cursor-pointer" @click="setPoskoSelected('')">
{{ {{
isNumber(data.text) isNumber(data.text)
? data.column.caption == '%' ? data.column.caption == '%'
? formatPercentage(data.text) ? formatPercentage(data.text)
: formatNumber(data.text) : formatNumber(data.text)
: data.text : data.text
}} }}
</p> </p>
</template> </template>
<template #formatNumberPoskoIn="{ data }"> <template #formatNumberPoskoIn="{ data }">
<p class="text-right cursor-pointer" @click="setPoskoSelected('in')"> <p class="text-right cursor-pointer" @click="setPoskoSelected('in')">
{{ {{
isNumber(data.text) isNumber(data.text)
? data.column.caption == '%' ? data.column.caption == '%'
? formatPercentage(data.text) ? formatPercentage(data.text)
: formatNumber(data.text) : formatNumber(data.text)
: data.text : data.text
}} }}
</p> </p>
</template> </template>
<template #formatNumberPoskoOut="{ data }"> <template #formatNumberPoskoOut="{ data }">
<p class="text-right cursor-pointer" @click="setPoskoSelected('out')"> <p class="text-right cursor-pointer" @click="setPoskoSelected('out')">
{{ {{
isNumber(data.text) isNumber(data.text)
? data.column.caption == '%' ? data.column.caption == '%'
? formatPercentage(data.text) ? formatPercentage(data.text)
: formatNumber(data.text) : formatNumber(data.text)
: data.text : data.text
}} }}
</p> </p>
</template> </template>
</DxDataGrid> </DxDataGrid>
</div> </div>
<DetailDialog :open="dialogDetail" title="Detail Rekapitulasi Gangguan Alih Posko" @on-close="closeDialog" <DetailDialog
:full-width="true"> :open="dialogDetail"
title="Detail Rekapitulasi Gangguan Alih Posko"
@on-close="closeDialog"
:full-width="true"
>
<div class="w-full mb-4 lg:w-[70%] lg:float-left"> <div class="w-full mb-4 lg:w-[70%] lg:float-left">
<div class="p-4 bg-white rounded-xl lg:mr-4"> <div class="p-4 bg-white rounded-xl lg:mr-4">
<DxDataGrid :allow-column-reordering="true" class="max-h-[calc(100vh-140px)]" :data-source="dataSub" <DxDataGrid
:show-column-lines="true" :show-row-lines="false" :show-borders="true" :row-alternation-enabled="true" :allow-column-reordering="true"
:hover-state-enabled="true" @selection-changed="onDataSubSelectionChanged" :column-width="100" class="max-h-[calc(100vh-140px)]"
@exporting="onExportingDetail" :allow-column-resizing="true" column-resizing-mode="widget"> :data-source="dataSub"
:show-column-lines="true"
:show-row-lines="false"
:show-borders="true"
:row-alternation-enabled="true"
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
@exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="20" :enabled="true" /> <DxPaging :page-size="20" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[20, 50, 100]" display-mode="full" <DxPager
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :visible="true"
:allowed-page-sizes="[20, 50, 100]"
display-mode="full"
:show-page-size-selector="true"
:show-info="true"
:show-navigation-buttons="true"
/>
<!-- --> <!-- -->
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumn css-class="custom-table-column" :width="50" alignment="center" <DxColumn
:calculate-display-value="(item: any) => dataSub.findIndex((i) => i == item) + 1" data-type="number" css-class="custom-table-column"
caption="No" cell-template="formatNumber" /> :width="50"
<DxColumn :width="150" alignment="center" data-field="no_laporan" caption="No Laporan" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> :calculate-display-value="(item: any) => dataSub.findIndex((i) => i == item) + 1"
<DxColumn :width="150" alignment="center" data-field="waktu_lapor" caption="Tgl Lapor" data-type="number"
css-class="custom-table-column" cell-template="formatText" /> caption="No"
<DxColumn :width="150" alignment="center" data-field="waktu_response" caption="Tgl Datang" cell-template="formatNumber"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="waktu_recovery" caption="Tgl Nyala" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="durasi_response_time" caption="Durasi Response Time" alignment="center"
css-class="custom-table-column" cell-template="formatTime" /> data-field="no_laporan"
<DxColumn :width="150" alignment="center" data-field="durasi_recovery_time" caption="Durasi Recovery Time" caption="No Laporan"
css-class="custom-table-column" cell-template="formatTime" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="status_akhir" caption="Status" cell-template="formatText"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="idpel_nometer" caption="IDPEL/NO METER" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="nama_pelapor" caption="Nama Pelapor" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> data-field="waktu_lapor"
<DxColumn :width="150" alignment="center" data-field="alamat_pelapor" caption="Alamat Pelapor" caption="Tgl Lapor"
css-class="custom-table-column" cell-template="formatText" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="no_telp_pelapor" caption="No Telp Pelapor" cell-template="formatText"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="200" alignment="center" data-field="keterangan_pelapor" caption="Keterangan Pelapor" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="nama_posko" caption="Posko" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> data-field="waktu_response"
<DxColumn :width="150" alignment="center" data-field="media" caption="Sumber Lapor" caption="Tgl Datang"
css-class="custom-table-column" cell-template="formatText" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="" caption="Nama Petugas" css-class="custom-table-column" cell-template="formatText"
cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="" caption="Posko Asal" css-class="custom-table-column" <DxColumn
cell-template="formatText" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="" caption="Posko Tujuan" css-class="custom-table-column" alignment="center"
cell-template="formatText" /> data-field="waktu_recovery"
caption="Tgl Nyala"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="durasi_response_time"
caption="Durasi Response Time"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="durasi_recovery_time"
caption="Durasi Recovery Time"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="status_akhir"
caption="Status"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="idpel_nometer"
caption="IDPEL/NO METER"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="nama_pelapor"
caption="Nama Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="alamat_pelapor"
caption="Alamat Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="no_telp_pelapor"
caption="No Telp Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="200"
alignment="center"
data-field="keterangan_pelapor"
caption="Keterangan Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="nama_posko"
caption="Posko"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="media"
caption="Sumber Lapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field=""
caption="Nama Petugas"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field=""
caption="Posko Asal"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field=""
caption="Posko Tujuan"
css-class="custom-table-column"
cell-template="formatText"
/>
<template #formatText="{ data }"> <template #formatText="{ data }">
<p class="text-left cursor-pointer"> <p class="text-left cursor-pointer">
@ -174,28 +380,46 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Datang:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Datang:</h3>
<InputText :readonly="true" :value="dataSubSelected?.waktu_response" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.waktu_response"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Nyala:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Nyala:</h3>
<InputText :readonly="true" :value="dataSubSelected?.waktu_recovery" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.waktu_recovery"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Response Time:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Response Time:</h3>
<InputText :readonly="true" :value="parseInt(dataSubSelected?.durasi_response_time) <InputText
? formatWaktu(dataSubSelected?.durasi_response_time) :readonly="true"
: '-' :value="
" class-name="flex-1" /> parseInt(dataSubSelected?.durasi_response_time)
? formatWaktu(dataSubSelected?.durasi_response_time)
: '-'
"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Recovery Time:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Recovery Time:</h3>
<InputText :readonly="true" :value="parseInt(dataSubSelected?.durasi_recovery_time) <InputText
? formatWaktu(dataSubSelected?.durasi_recovery_time) :readonly="true"
: '-' :value="
" class-name="flex-1" /> parseInt(dataSubSelected?.durasi_recovery_time)
? formatWaktu(dataSubSelected?.durasi_recovery_time)
: '-'
"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -215,17 +439,29 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Alamat Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Alamat Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.alamat_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.alamat_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">No Telp Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">No Telp Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.no_telp_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.no_telp_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Keterangan Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Keterangan Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.keterangan_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.keterangan_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -268,7 +504,6 @@ import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxLoadPanel,
DxPaging, DxPaging,
DxScrolling, DxScrolling,
DxSearchPanel, DxSearchPanel,

View File

@ -1,50 +1,162 @@
<template> <template>
<Filters @run-report="() => exportToPDF(reportMeta, data, true)" @reset-form="data = []" <Filters
@run-search="() => filterData(filters)" :report-button="true" class="mb-4"> @run-report="() => exportToPDF(reportMeta, data, true)"
@reset-form="data = []"
@run-search="() => filterData(filters)"
:report-button="true"
class="mb-4"
>
<Type1 @update:filters="(value) => (filters = value)" /> <Type1 @update:filters="(value) => (filters = value)" />
</Filters> </Filters>
<div id="data"> <div id="data">
<DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" <DxDataGrid
:data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" ref="dataGridRef"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onDataSelectionChanged" :allow-column-reordering="true"
@exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="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="onDataSelectionChanged"
@exporting="onExporting"
:allow-column-resizing="true"
column-resizing-mode="widget"
:word-wrap-enabled="true"
>
<DxGrouping :auto-expand-all="false" expand-mode="rowClick" />
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
<!-- --> <!-- -->
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxColumn width="200" alignment="center" data-field="nama_ulp" caption="Nama Unit" css-class="custom-table-column" <DxColumn
cell-template="formatText" /> v-if="grouping.length > 0"
v-for="(group, index) in grouping"
:width="150"
alignment="center"
:data-field="group.data"
:caption="group.caption"
css-class="custom-table-column"
cell-template="formatText"
:group-index="index"
/>
<DxColumn
width="200"
alignment="center"
data-field="nama_ulp"
caption="Nama Unit"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn alignment="center" caption="Bulan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Bulan" css-class="custom-table-column">
<DxColumn alignment="center" data-field="month1" data-type="number" caption="Januari" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> alignment="center"
<DxColumn alignment="center" data-field="month2" data-type="number" caption="Februari" data-field="month1"
css-class="custom-table-column" cell-template="formatNumber" /> data-type="number"
<DxColumn alignment="center" data-field="month3" data-type="number" caption="Maret" caption="Januari"
css-class="custom-table-column" cell-template="formatNumber" /> css-class="custom-table-column"
<DxColumn alignment="center" data-field="month4" data-type="number" caption="April" cell-template="formatNumber"
css-class="custom-table-column" cell-template="formatNumber" /> />
<DxColumn alignment="center" data-field="month5" data-type="number" caption="Mei" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> alignment="center"
<DxColumn alignment="center" data-field="month6" data-type="number" caption="Juni" data-field="month2"
css-class="custom-table-column" cell-template="formatNumber" /> data-type="number"
<DxColumn alignment="center" data-field="month7" data-type="number" caption="Juli" caption="Februari"
css-class="custom-table-column" cell-template="formatNumber" /> css-class="custom-table-column"
<DxColumn alignment="center" data-field="month8" data-type="number" caption="Agustus" cell-template="formatNumber"
css-class="custom-table-column" cell-template="formatNumber" /> />
<DxColumn alignment="center" data-field="month9" data-type="number" caption="September" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> alignment="center"
<DxColumn alignment="center" data-field="month10" data-type="number" caption="Oktober" data-field="month3"
css-class="custom-table-column" cell-template="formatNumber" /> data-type="number"
<DxColumn alignment="center" data-field="month11" data-type="number" caption="November" caption="Maret"
css-class="custom-table-column" cell-template="formatNumber" /> css-class="custom-table-column"
<DxColumn alignment="center" data-field="month12" data-type="number" caption="Desember" cell-template="formatNumber"
css-class="custom-table-column" cell-template="formatNumber" /> />
<DxColumn
alignment="center"
data-field="month4"
data-type="number"
caption="April"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
alignment="center"
data-field="month5"
data-type="number"
caption="Mei"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
alignment="center"
data-field="month6"
data-type="number"
caption="Juni"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
alignment="center"
data-field="month7"
data-type="number"
caption="Juli"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
alignment="center"
data-field="month8"
data-type="number"
caption="Agustus"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
alignment="center"
data-field="month9"
data-type="number"
caption="September"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
alignment="center"
data-field="month10"
data-type="number"
caption="Oktober"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
alignment="center"
data-field="month11"
data-type="number"
caption="November"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
alignment="center"
data-field="month12"
data-type="number"
caption="Desember"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<template #formatText="{ data }"> <template #formatText="{ data }">
@ -56,56 +168,165 @@
<template #formatNumber="{ data }"> <template #formatNumber="{ data }">
<p class="text-right cursor-pointer" @click="setMonth(data.column.caption)"> <p class="text-right cursor-pointer" @click="setMonth(data.column.caption)">
{{ {{
isNumber(data.text) isNumber(data.text)
? data.column.caption == '%' ? data.column.caption == '%'
? formatPercentage(data.text) ? formatPercentage(data.text)
: formatNumber(data.text) : formatNumber(data.text)
: data.text : data.text
}} }}
</p> </p>
</template> </template>
<DxSummary>
<DxGroupItem
v-for="i in 12"
:show-in-group-footer="false"
:align-by-column="true"
:column="`month${i}`"
summary-type="sum"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
</DxSummary>
</DxDataGrid> </DxDataGrid>
</div> </div>
<DetailDialog :open="dialogDetail" title="Data Detail Cleansing Transaksi TM" @on-close="closedialogDetail" <DetailDialog
:full-width="true"> :open="dialogDetail"
title="Data Detail Cleansing Transaksi TM"
@on-close="closedialogDetail"
:full-width="true"
>
<div class="w-full mb-4 lg:w-[70%] lg:float-left"> <div class="w-full mb-4 lg:w-[70%] lg:float-left">
<div class="p-4 bg-white rounded-xl lg:mr-4"> <div class="p-4 bg-white rounded-xl lg:mr-4">
<DxDataGrid :allow-column-reordering="true" class="max-h-[calc(100vh-140px)]" :data-source="dataSub" <DxDataGrid
:show-column-lines="true" :show-row-lines="false" :show-borders="true" :row-alternation-enabled="true" :allow-column-reordering="true"
:hover-state-enabled="true" @selection-changed="onDataSubSelectionChanged" :column-width="100" class="max-h-[calc(100vh-140px)]"
@exporting="onExportingDetail" :allow-column-resizing="true" column-resizing-mode="widget"> :data-source="dataSub"
:show-column-lines="true"
:show-row-lines="false"
:show-borders="true"
:row-alternation-enabled="true"
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
@exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="20" :enabled="true" /> <DxPaging :page-size="20" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[20, 50, 100]" display-mode="full" <DxPager
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :visible="true"
:allowed-page-sizes="[20, 50, 100]"
display-mode="full"
:show-page-size-selector="true"
:show-info="true"
:show-navigation-buttons="true"
/>
<!-- --> <!-- -->
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumn css-class="custom-table-column" :width="50" alignment="center" <DxColumn
:calculate-display-value="(item: any) => dataSub.findIndex((i) => i == item) + 1" data-type="number" css-class="custom-table-column"
caption="No" cell-template="formatNumber" /> :width="50"
<DxColumn :width="150" alignment="center" data-field="no_laporan" caption="No Laporan" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> :calculate-display-value="(item: any) => dataSub.findIndex((i) => i == item) + 1"
<DxColumn :width="150" alignment="center" data-field="tgl_catat" caption="Tgl Catat" data-type="number"
css-class="custom-table-column" cell-template="formatText" /> caption="No"
<DxColumn :width="150" alignment="center" data-field="tgl_pekerjaan" caption="Tgl Pekerjaan" cell-template="formatNumber"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="tgl_nyala" caption="Tgl Nyala" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="durasi_pencatatan" caption="Durasi Pencatatan" alignment="center"
:allow-resizing="false" css-class="custom-table-column" cell-template="formatTime" /> data-field="no_laporan"
<DxColumn :width="150" alignment="center" data-field="durasi_recovery_time" caption="Durasi Recovery Time" caption="No Laporan"
:allow-resizing="false" css-class="custom-table-column" cell-template="formatTime" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="keterangan_cleansing" caption="Keterangan Cleansing" cell-template="formatText"
:allow-resizing="false" css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="nama_posko" caption="Posko" :allow-resizing="false" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="tindakan" caption="Tindakan" :allow-resizing="false" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> data-field="tgl_catat"
<DxColumn :width="150" alignment="center" data-field="penyebab" caption="Penyebab" :allow-resizing="false" caption="Tgl Catat"
css-class="custom-table-column" cell-template="formatText" /> css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="tgl_pekerjaan"
caption="Tgl Pekerjaan"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="tgl_nyala"
caption="Tgl Nyala"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="durasi_pencatatan"
caption="Durasi Pencatatan"
:allow-resizing="false"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="durasi_recovery_time"
caption="Durasi Recovery Time"
:allow-resizing="false"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="keterangan_cleansing"
caption="Keterangan Cleansing"
:allow-resizing="false"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="nama_posko"
caption="Posko"
:allow-resizing="false"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="tindakan"
caption="Tindakan"
:allow-resizing="false"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="penyebab"
caption="Penyebab"
:allow-resizing="false"
css-class="custom-table-column"
cell-template="formatText"
/>
<template #formatText="{ data }"> <template #formatText="{ data }">
<p class="text-left cursor-pointer"> <p class="text-left cursor-pointer">
@ -152,23 +373,37 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Pencatatan:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Pencatatan:</h3>
<InputText :readonly="true" :value="parseInt(dataSubSelected?.durasi_pencatatan) <InputText
? formatWaktu(dataSubSelected?.durasi_pencatatan) :readonly="true"
: '-' :value="
" class-name="flex-1" /> parseInt(dataSubSelected?.durasi_pencatatan)
? formatWaktu(dataSubSelected?.durasi_pencatatan)
: '-'
"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Recovery Time:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Recovery Time:</h3>
<InputText :readonly="true" :value="parseInt(dataSubSelected?.durasi_recovery_time) <InputText
? formatWaktu(dataSubSelected?.durasi_recovery_time) :readonly="true"
: '-' :value="
" class-name="flex-1" /> parseInt(dataSubSelected?.durasi_recovery_time)
? formatWaktu(dataSubSelected?.durasi_recovery_time)
: '-'
"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Keterangan CLeansing:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Keterangan CLeansing:</h3>
<InputText :readonly="true" :value="dataSubSelected?.keterangan_cleansing" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.keterangan_cleansing"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -203,15 +438,17 @@ import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxLoadPanel, DxGroupItem,
DxGrouping,
DxPaging, DxPaging,
DxScrolling, DxScrolling,
DxSearchPanel, DxSearchPanel,
DxSelection DxSelection,
DxSummary
} from 'devextreme-vue/data-grid' } from 'devextreme-vue/data-grid'
import { queries, requestGraphQl } from '@/utils/api/api.graphql' import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers' import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { formatWaktu, years } from '@/components/Form/FiltersType/reference' import { formatWaktu } from '@/components/Form/FiltersType/reference'
import { apolloClient } from '@/utils/api/api.graphql' import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable' import { provideApolloClient } from '@vue/apollo-composable'
import { getMonthNumber } from '@/utils/texts' import { getMonthNumber } from '@/utils/texts'
@ -247,6 +484,24 @@ const reportMeta = ref({
posko: { id: 0, name: 'Semua Posko' }, posko: { id: 0, name: 'Semua Posko' },
periode: '' periode: ''
}) })
const grouping = ref<any[]>([
{
data: '',
caption: 'Semua Unit'
},
{
data: 'nama_regional',
caption: 'Regional'
},
{
data: 'nama_uid',
caption: 'UID'
},
{
data: 'nama_up3',
caption: 'UP3'
}
])
const setMonth = (month: any) => { const setMonth = (month: any) => {
if (month != '') { if (month != '') {
@ -266,6 +521,50 @@ const filterData = async (params: any) => {
const dateValue = params.periode.split(' s/d ') const dateValue = params.periode.split(' s/d ')
const { posko, uid, up3 } = params const { posko, uid, up3 } = params
var groupList: any[] = [
{
data: '',
caption: 'Semua Unit'
},
{
data: 'nama_regional',
caption: 'Regional'
},
{
data: 'nama_uid',
caption: 'UID'
},
{
data: 'nama_up3',
caption: 'UP3'
}
]
if (uid?.id != 0) {
groupList.forEach((item, index) => {
if (item.caption == 'Semua Unit' || item.caption == 'Regional') {
groupList.splice(index, 1)
}
})
if (up3?.id != 0) {
groupList.forEach((item, index) => {
if (item.caption == 'UID') {
groupList.splice(index, 1)
}
})
if (posko?.id != 0) {
groupList.forEach((item, index) => {
if (item.caption == 'UP3') {
groupList.splice(index, 1)
}
})
}
}
}
grouping.value = groupList
const query = { const query = {
dateFrom: dateValue[0] dateFrom: dateValue[0]
? dateValue[0].split('-').reverse().join('-') ? dateValue[0].split('-').reverse().join('-')

View File

@ -1,60 +1,135 @@
<template> <template>
<Filters @reset-form="data = []" @run-report="() => exportToPDF(reportMeta, data, true)" <Filters
@run-search="() => filterData(filters)" :report-button="true" class="mb-4"> @reset-form="data = []"
@run-report="() => exportToPDF(reportMeta, data, true)"
@run-search="() => filterData(filters)"
:report-button="true"
class="mb-4"
>
<Type1 @update:filters="(value) => (filters = value)" /> <Type1 @update:filters="(value) => (filters = value)" />
</Filters> </Filters>
<div id="data"> <div id="data">
<DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" <DxDataGrid
:data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" ref="dataGridRef"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onDataSelectionChanged" :allow-column-reordering="true"
@exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="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="onDataSelectionChanged"
@exporting="onExporting"
:allow-column-resizing="true"
column-resizing-mode="widget"
:word-wrap-enabled="true"
>
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
<!-- --> <!-- -->
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxColumn :width="50" alignment="center" caption="NO" css-class="custom-table-column" rowspan="4" colspan="2"> <DxColumn
<DxColumn :width="50" alignment="center" :width="50"
:calculate-display-value="(item: any) => data.findIndex((i) => i == item) + 1" caption="a" alignment="center"
css-class="custom-table-column" cell-template="formatNumber" /> caption="NO"
css-class="custom-table-column"
rowspan="4"
colspan="2"
>
<DxColumn
:width="50"
alignment="center"
:calculate-display-value="(item: any) => data.findIndex((i) => i == item) + 1"
caption="a"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn :width="150" alignment="center" caption="Nama Regu" css-class="custom-table-column"> <DxColumn :width="150" alignment="center" caption="Nama Regu" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="nama_regu" caption="b" css-class="custom-table-column" <DxColumn
cell-template="formatText" /> :width="150"
alignment="center"
data-field="nama_regu"
caption="b"
css-class="custom-table-column"
cell-template="formatText"
/>
</DxColumn> </DxColumn>
<DxColumn :width="150" alignment="center" caption="Kode Regu" css-class="custom-table-column"> <DxColumn :width="150" alignment="center" caption="Kode Regu" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="kode_regu" caption="c" css-class="custom-table-column" <DxColumn
cell-template="formatText" /> :width="150"
alignment="center"
data-field="kode_regu"
caption="c"
css-class="custom-table-column"
cell-template="formatText"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn alignment="center" caption="Total" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="total" caption="d=(e+g)" css-class="custom-table-column" <DxColumn
cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="total"
caption="d=(e+g)"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Sudah Selesai" css-class="custom-table-column"> <DxColumn alignment="center" caption="Sudah Selesai" css-class="custom-table-column">
<DxColumn alignment="center" caption="Jml" css-class="custom-table-column"> <DxColumn alignment="center" caption="Jml" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="total_selesai" caption="e" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="total_selesai"
caption="e"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="%" css-class="custom-table-column"> <DxColumn alignment="center" caption="%" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="persen_selesai" caption="f=(e/d)*100" <DxColumn
css-class="custom-table-column" cell-template="formatPercentage" /> :width="150"
alignment="center"
data-field="persen_selesai"
caption="f=(e/d)*100"
css-class="custom-table-column"
cell-template="formatPercentage"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Belum Selesai" css-class="custom-table-column"> <DxColumn alignment="center" caption="Belum Selesai" css-class="custom-table-column">
<DxColumn alignment="center" caption="Jml" css-class="custom-table-column"> <DxColumn alignment="center" caption="Jml" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="total_inproses" caption="g" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="total_inproses"
caption="g"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="%" css-class="custom-table-column"> <DxColumn alignment="center" caption="%" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="persen_inproses" caption="h=(g/d)*100" <DxColumn
css-class="custom-table-column" cell-template="formatPercentage" /> :width="150"
alignment="center"
data-field="persen_inproses"
caption="h=(g/d)*100"
css-class="custom-table-column"
cell-template="formatPercentage"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
@ -64,23 +139,47 @@
<DxColumn alignment="center" caption="Non Marking" css-class="custom-table-column"> <DxColumn alignment="center" caption="Non Marking" css-class="custom-table-column">
<DxColumn alignment="center" caption="Total" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total" css-class="custom-table-column">
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="total_mobile_nonmarking" caption="i" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="total_mobile_nonmarking"
caption="i"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="%" css-class="custom-table-column"> <DxColumn alignment="center" caption="%" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" caption="j=(i/d)*100" <DxColumn
css-class="custom-table-column" cell-template="formatPercentage" /> :width="150"
alignment="center"
data-field=""
caption="j=(i/d)*100"
css-class="custom-table-column"
cell-template="formatPercentage"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Waktu Rata-Rata" css-class="custom-table-column"> <DxColumn alignment="center" caption="Waktu Rata-Rata" css-class="custom-table-column">
<DxColumn alignment="center" caption="Response" css-class="custom-table-column"> <DxColumn alignment="center" caption="Response" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="avg_durasi_response_time_mobile_nonmarking" <DxColumn
caption="k" css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="avg_durasi_response_time_mobile_nonmarking"
caption="k"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Recovery" css-class="custom-table-column"> <DxColumn alignment="center" caption="Recovery" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="avg_durasi_recovery_time_mobile_nonmarking" <DxColumn
caption="l" css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="avg_durasi_recovery_time_mobile_nonmarking"
caption="l"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
@ -88,23 +187,47 @@
<DxColumn alignment="center" caption="Marking" css-class="custom-table-column"> <DxColumn alignment="center" caption="Marking" css-class="custom-table-column">
<DxColumn alignment="center" caption="Total" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total" css-class="custom-table-column">
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="total_mobile_marking" caption="m" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="total_mobile_marking"
caption="m"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="%" css-class="custom-table-column"> <DxColumn alignment="center" caption="%" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" caption="n=(m/d)*100" <DxColumn
css-class="custom-table-column" cell-template="formatPercentage" /> :width="150"
alignment="center"
data-field=""
caption="n=(m/d)*100"
css-class="custom-table-column"
cell-template="formatPercentage"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Waktu Rata-Rata" css-class="custom-table-column"> <DxColumn alignment="center" caption="Waktu Rata-Rata" css-class="custom-table-column">
<DxColumn alignment="center" caption="Response" css-class="custom-table-column"> <DxColumn alignment="center" caption="Response" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="avg_durasi_response_time_mobile_marking" <DxColumn
caption="o" css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="avg_durasi_response_time_mobile_marking"
caption="o"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Recovery" css-class="custom-table-column"> <DxColumn alignment="center" caption="Recovery" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="avg_durasi_recovery_time_mobile_marking" <DxColumn
caption="p" css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="avg_durasi_recovery_time_mobile_marking"
caption="p"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
@ -114,23 +237,47 @@
<DxColumn alignment="center" caption="Non Marking" css-class="custom-table-column"> <DxColumn alignment="center" caption="Non Marking" css-class="custom-table-column">
<DxColumn alignment="center" caption="Total" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total" css-class="custom-table-column">
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="total_nonmobile_nonmarking" caption="q" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="total_nonmobile_nonmarking"
caption="q"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="%" css-class="custom-table-column"> <DxColumn alignment="center" caption="%" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" caption="r=(q/d)*100" <DxColumn
css-class="custom-table-column" cell-template="formatPercentage" /> :width="150"
alignment="center"
data-field=""
caption="r=(q/d)*100"
css-class="custom-table-column"
cell-template="formatPercentage"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Waktu Rata-Rata" css-class="custom-table-column"> <DxColumn alignment="center" caption="Waktu Rata-Rata" css-class="custom-table-column">
<DxColumn alignment="center" caption="Response" css-class="custom-table-column"> <DxColumn alignment="center" caption="Response" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="avg_durasi_response_time_nonmobile_nonmarking" <DxColumn
caption="s" css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="avg_durasi_response_time_nonmobile_nonmarking"
caption="s"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Recovery" css-class="custom-table-column"> <DxColumn alignment="center" caption="Recovery" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="avg_durasi_recovery_time_nonmobile_nonmarking" <DxColumn
caption="t" css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="avg_durasi_recovery_time_nonmobile_nonmarking"
caption="t"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
@ -138,23 +285,47 @@
<DxColumn alignment="center" caption="Marking" css-class="custom-table-column"> <DxColumn alignment="center" caption="Marking" css-class="custom-table-column">
<DxColumn alignment="center" caption="Total" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total" css-class="custom-table-column">
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="total_nonmobile_marking" caption="u" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="total_nonmobile_marking"
caption="u"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="%" css-class="custom-table-column"> <DxColumn alignment="center" caption="%" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" caption="v=(u/d)*100" <DxColumn
css-class="custom-table-column" cell-template="formatPercentage" /> :width="150"
alignment="center"
data-field=""
caption="v=(u/d)*100"
css-class="custom-table-column"
cell-template="formatPercentage"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Waktu Rata-Rata" css-class="custom-table-column"> <DxColumn alignment="center" caption="Waktu Rata-Rata" css-class="custom-table-column">
<DxColumn alignment="center" caption="Response" css-class="custom-table-column"> <DxColumn alignment="center" caption="Response" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="avg_durasi_response_time_nonmobile_marking" <DxColumn
caption="w" css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="avg_durasi_response_time_nonmobile_marking"
caption="w"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Recovery" css-class="custom-table-column"> <DxColumn alignment="center" caption="Recovery" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="avg_durasi_recovery_time_nonmobile_marking" <DxColumn
caption="x" css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
alignment="center"
data-field="avg_durasi_recovery_time_nonmobile_marking"
caption="x"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
@ -170,12 +341,12 @@
<template #formatNumber="{ data }"> <template #formatNumber="{ data }">
<p class="text-right cursor-pointer"> <p class="text-right cursor-pointer">
{{ {{
isNumber(data.text) isNumber(data.text)
? data.column.caption == '%' ? data.column.caption == '%'
? formatPercentage(data.text) ? formatPercentage(data.text)
: formatNumber(data.text) : formatNumber(data.text)
: data.text : data.text
}} }}
</p> </p>
</template> </template>
@ -192,74 +363,242 @@
</template> </template>
<DxSummary> <DxSummary>
<DxTotalItem display-format="TOTAL" show-in-column="nama_regu" css-class="text-white !text-right" /> <DxTotalItem
<DxTotalItem column="total" summary-type="sum" display-format="{0}" css-class="text-white !text-right" display-format="TOTAL"
:customize-text="(e: any) => formatNumber(e.value)" /> show-in-column="nama_regu"
<DxTotalItem column="total_selesai" summary-type="sum" display-format="{0}" css-class="text-white !text-right" css-class="text-white !text-left"
:customize-text="(e: any) => formatNumber(e.value)" /> />
<DxTotalItem column="total_mobile_marking" summary-type="sum" display-format="{0}" <DxTotalItem
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> column="total"
<DxTotalItem column="total_mobile_nonmarking" summary-type="sum" display-format="{0}" summary-type="sum"
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> display-format="{0}"
<DxTotalItem column="total_nonmobile_marking" summary-type="sum" display-format="{0}" css-class="text-white !text-right"
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> :customize-text="(e: any) => formatNumber(e.value)"
<DxTotalItem column="total_nonmobile_nonmarking" summary-type="sum" display-format="{0}" />
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> <DxTotalItem
column="total_selesai"
summary-type="sum"
display-format="{0}"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_inproses"
summary-type="sum"
display-format="{0}"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_mobile_marking"
summary-type="sum"
display-format="{0}"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_mobile_nonmarking"
summary-type="sum"
display-format="{0}"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_nonmobile_marking"
summary-type="sum"
display-format="{0}"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_nonmobile_nonmarking"
summary-type="sum"
display-format="{0}"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
</DxSummary> </DxSummary>
</DxDataGrid> </DxDataGrid>
</div> </div>
<DetailDialog :open="dialogDetail" title="Detail Rekapitulasi Gangguan Diselesaikan Mobile APKT" <DetailDialog
@on-close="closeDialog" :full-width="true"> :open="dialogDetail"
title="Detail Rekapitulasi Gangguan Diselesaikan Mobile APKT"
@on-close="closeDialog"
:full-width="true"
>
<div class="w-full mb-4 lg:w-[70%] lg:float-left"> <div class="w-full mb-4 lg:w-[70%] lg:float-left">
<div class="p-4 bg-white rounded-xl lg:mr-4"> <div class="p-4 bg-white rounded-xl lg:mr-4">
<DxDataGrid :allow-column-reordering="true" class="max-h-[calc(100vh-140px)]" :data-source="dataSub" <DxDataGrid
:show-column-lines="true" :show-row-lines="false" :show-borders="true" :row-alternation-enabled="true" :allow-column-reordering="true"
:hover-state-enabled="true" @selection-changed="onDataSubSelectionChanged" :column-width="100" class="max-h-[calc(100vh-140px)]"
@exporting="onExportingDetail" :allow-column-resizing="true" column-resizing-mode="widget"> :data-source="dataSub"
:show-column-lines="true"
:show-row-lines="false"
:show-borders="true"
:row-alternation-enabled="true"
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
@exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="20" :enabled="true" /> <DxPaging :page-size="20" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[20, 50, 100]" display-mode="full" <DxPager
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :visible="true"
:allowed-page-sizes="[20, 50, 100]"
display-mode="full"
:show-page-size-selector="true"
:show-info="true"
:show-navigation-buttons="true"
/>
<!-- --> <!-- -->
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumn css-class="custom-table-column" :width="50" alignment="center" <DxColumn
:calculate-display-value="(item: any) => dataSub.findIndex((i) => i == item) + 1" data-type="number" css-class="custom-table-column"
caption="No" cell-template="formatNumber" /> :width="50"
<DxColumn :width="150" alignment="center" data-field="no_laporan" caption="No Laporan" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> :calculate-display-value="(item: any) => dataSub.findIndex((i) => i == item) + 1"
<DxColumn :width="150" alignment="center" data-field="waktu_lapor" caption="Tgl Lapor" data-type="number"
css-class="custom-table-column" cell-template="formatText" /> caption="No"
<DxColumn :width="150" alignment="center" data-field="waktu_response" caption="Tgl Datang" cell-template="formatNumber"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="waktu_recovery" caption="Tgl Nyala" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="durasi_response_time" caption="Durasi Response Time" alignment="center"
css-class="custom-table-column" cell-template="formatTime" /> data-field="no_laporan"
<DxColumn :width="150" alignment="center" data-field="durasi_recovery_time" caption="Durasi Recovery Time" caption="No Laporan"
css-class="custom-table-column" cell-template="formatTime" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="status_akhir" caption="Status" cell-template="formatText"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="referensi_marking" caption="Referensi Marking" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="idpel_nometer" caption="IDPEL/NO METER" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> data-field="waktu_lapor"
<DxColumn :width="150" alignment="center" data-field="nama_pelapor" caption="Nama Pelapor" caption="Tgl Lapor"
css-class="custom-table-column" cell-template="formatText" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="alamat_pelapor" caption="Alamat Pelapor" cell-template="formatText"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="no_telp_pelapor" caption="No Telp Pelapor" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="200" alignment="center" data-field="keterangan_pelapor" caption="Keterangan Pelapor" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> data-field="waktu_response"
<DxColumn :width="150" alignment="center" data-field="nama_posko" caption="Posko" caption="Tgl Datang"
css-class="custom-table-column" cell-template="formatText" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="tindakan" caption="Tidakan" cell-template="formatText"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="penyebab" caption="Penyebab" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
alignment="center"
data-field="waktu_recovery"
caption="Tgl Nyala"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="durasi_response_time"
caption="Durasi Response Time"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="durasi_recovery_time"
caption="Durasi Recovery Time"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="status_akhir"
caption="Status"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="referensi_marking"
caption="Referensi Marking"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="idpel_nometer"
caption="IDPEL/NO METER"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="nama_pelapor"
caption="Nama Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="alamat_pelapor"
caption="Alamat Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="no_telp_pelapor"
caption="No Telp Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="200"
alignment="center"
data-field="keterangan_pelapor"
caption="Keterangan Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="nama_posko"
caption="Posko"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="tindakan"
caption="Tidakan"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="penyebab"
caption="Penyebab"
css-class="custom-table-column"
cell-template="formatText"
/>
<template #formatText="{ data }"> <template #formatText="{ data }">
<p class="text-left cursor-pointer"> <p class="text-left cursor-pointer">
@ -295,28 +634,46 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Datang:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Datang:</h3>
<InputText :readonly="true" :value="dataSubSelected?.waktu_response" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.waktu_response"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Nyala:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Nyala:</h3>
<InputText :readonly="true" :value="dataSubSelected?.waktu_recovery" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.waktu_recovery"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Response Time:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Response Time:</h3>
<InputText :readonly="true" :value="parseInt(dataSubSelected?.durasi_response_time) <InputText
? formatWaktu(dataSubSelected?.durasi_response_time) :readonly="true"
: '-' :value="
" class-name="flex-1" /> parseInt(dataSubSelected?.durasi_response_time)
? formatWaktu(dataSubSelected?.durasi_response_time)
: '-'
"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Recovery Time:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Recovery Time:</h3>
<InputText :readonly="true" :value="parseInt(dataSubSelected?.durasi_recovery_time) <InputText
? formatWaktu(dataSubSelected?.durasi_recovery_time) :readonly="true"
: '-' :value="
" class-name="flex-1" /> parseInt(dataSubSelected?.durasi_recovery_time)
? formatWaktu(dataSubSelected?.durasi_recovery_time)
: '-'
"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -326,7 +683,11 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Referensi Marking:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Referensi Marking:</h3>
<InputText :readonly="true" :value="dataSubSelected?.referensi_marking" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.referensi_marking"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -341,17 +702,29 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Alamat Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Alamat Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.alamat_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.alamat_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">No Telp Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">No Telp Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.no_telp_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.no_telp_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Keterangan Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Keterangan Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.keterangan_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.keterangan_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -384,7 +757,6 @@ import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxLoadPanel,
DxPager, DxPager,
DxPaging, DxPaging,
DxScrolling, DxScrolling,

View File

@ -1,123 +1,558 @@
<!-- Rekapitulasi Gangguan/Jenis Gangguan --> <!-- Rekapitulasi Gangguan/Jenis Gangguan -->
<template> <template>
<Filters :report-button="true" @reset-form="data = []" @run-search="() => filterData(filters)" <Filters
@run-report="() => exportToPDF(reportMeta, data, true)" class="mb-4"> :report-button="true"
@reset-form="data = []"
@run-search="() => filterData(filters)"
@run-report="() => exportToPDF(reportMeta, data, true)"
class="mb-4"
>
<Type1 @update:filters="(value) => (filters = value)" /> <Type1 @update:filters="(value) => (filters = value)" />
</Filters> </Filters>
<div id="data"> <div id="data">
<DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" <DxDataGrid
:data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" ref="dataGridRef"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onDataSelectionChanged" :allow-column-reordering="true"
@exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget"> 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="onDataSelectionChanged"
@exporting="onExporting"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
<!-- --> <!-- -->
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxGrouping :auto-expand-all="true" :context-menu-enabled="true" expand-mode="rowClick" /> <DxGrouping :auto-expand-all="true" :context-menu-enabled="true" expand-mode="rowClick" />
<DxColumn :width="60" alignment="center" data-field="no" caption="NO" css-class="custom-table-column" <DxColumn
cell-template="formatNumber" /> :width="60"
<DxColumn :width="120" alignment="center" data-field="kode" caption="Kode" css-class="custom-table-column" alignment="center"
cell-template="formatText" /> data-field="no"
<DxColumn :width="120" alignment="center" data-field="sub_kelompok" css-class="custom-table-column" caption="NO"
:group-index="0" caption="" cell-template="formatText" :calculate-group-value="(rowData: any) => `${rowData.sub_kelompok} (${rowData.nama_sub_kelompok})` css-class="custom-table-column"
" /> cell-template="formatNumber"
<DxColumn :width="250" alignment="center" data-field="tipe_permasalahan" caption="Jenis Gangguan" />
css-class="custom-table-column" cell-template="formatText" /> <DxColumn
:width="120"
alignment="center"
data-field="kode"
caption="Kode"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="120"
alignment="center"
data-field="sub_kelompok"
css-class="custom-table-column"
:group-index="0"
caption=""
cell-template="formatText"
:calculate-group-value="
(rowData: any) => `${rowData.sub_kelompok} (${rowData.nama_sub_kelompok})`
"
/>
<DxColumn
:width="250"
alignment="center"
data-field="tipe_permasalahan"
caption="Jenis Gangguan"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total" data-type="number" caption="Total" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
alignment="center"
data-field="total"
data-type="number"
caption="Total"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn alignment="center" caption="Sudah Selesai" css-class="custom-table-column"> <DxColumn alignment="center" caption="Sudah Selesai" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_selesai" data-type="number" caption="Jml" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
<DxColumn :width="70" alignment="center" data-field="persen_selesai" data-type="number" caption="%" alignment="center"
css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_selesai"
data-type="number"
caption="Jml"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="70"
alignment="center"
data-field="persen_selesai"
data-type="number"
caption="%"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Belum Selesai" css-class="custom-table-column"> <DxColumn alignment="center" caption="Belum Selesai" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_inproses" data-type="number" caption="Jml" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
<DxColumn :width="70" alignment="center" data-field="persen_inproses" data-type="number" caption="%" alignment="center"
css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_inproses"
data-type="number"
caption="Jml"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="70"
alignment="center"
data-field="persen_inproses"
data-type="number"
caption="%"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Response Time" css-class="custom-table-column"> <DxColumn alignment="center" caption="Response Time" css-class="custom-table-column">
<DxColumn alignment="center" caption="Menit" css-class="custom-table-column"> <DxColumn alignment="center" caption="Menit" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_durasi_response" data-type="number" <DxColumn
caption="Total" css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
<DxColumn :width="120" alignment="center" data-field="avg_durasi_response" data-type="number" alignment="center"
caption="Rata-Rata" css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_durasi_response"
<DxColumn :width="120" alignment="center" data-field="max_durasi_response" data-type="number" caption="Max" data-type="number"
css-class="custom-table-column" cell-template="formatTime" /> caption="Total"
<DxColumn :width="120" alignment="center" data-field="min_durasi_response" data-type="number" caption="Min" css-class="custom-table-column"
css-class="custom-table-column" cell-template="formatTime" /> cell-template="formatNumber"
/>
<DxColumn
:visible="false"
:width="120"
alignment="center"
data-field="count_durasi_response"
data-type="number"
caption="Total"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_response * rowData.avg_durasi_response
"
/>
<DxColumn
:width="120"
alignment="center"
data-field="avg_durasi_response"
data-type="number"
caption="Rata-Rata"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="120"
alignment="center"
data-field="max_durasi_response"
data-type="number"
caption="Max"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="120"
alignment="center"
data-field="min_durasi_response"
data-type="number"
caption="Min"
css-class="custom-table-column"
cell-template="formatTime"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_diatas_sla_response" data-type="number" <DxColumn
caption=">SLA" css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
<DxColumn :width="120" alignment="center" data-field="total_dibawah_sla_response" data-type="number" alignment="center"
caption="≤SLA" css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_diatas_sla_response"
data-type="number"
caption=">SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="120"
alignment="center"
data-field="total_dibawah_sla_response"
data-type="number"
caption="≤SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Recovery Time" css-class="custom-table-column"> <DxColumn alignment="center" caption="Recovery Time" css-class="custom-table-column">
<DxColumn alignment="center" caption="Menit" css-class="custom-table-column"> <DxColumn alignment="center" caption="Menit" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_durasi_recovery" data-type="number" <DxColumn
caption="Total" css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
<DxColumn :width="120" alignment="center" data-field="avg_durasi_recovery" data-type="number" alignment="center"
caption="Rata-Rata" css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_durasi_recovery"
<DxColumn :width="120" alignment="center" data-field="max_durasi_recovery" data-type="number" caption="Max" data-type="number"
css-class="custom-table-column" cell-template="formatTime" /> caption="Total"
<DxColumn :width="120" alignment="center" data-field="min_durasi_recovery" data-type="number" caption="Min" css-class="custom-table-column"
css-class="custom-table-column" cell-template="formatTime" /> cell-template="formatNumber"
/>
<DxColumn
:visible="false"
:width="120"
alignment="center"
data-field="count_durasi_recovery"
data-type="number"
caption="Total"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_recovery * rowData.avg_durasi_recovery
"
/>
<DxColumn
:width="120"
alignment="center"
data-field="avg_durasi_recovery"
data-type="number"
caption="Rata-Rata"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="120"
alignment="center"
data-field="max_durasi_recovery"
data-type="number"
caption="Max"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="120"
alignment="center"
data-field="min_durasi_recovery"
data-type="number"
caption="Min"
css-class="custom-table-column"
cell-template="formatTime"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_diatas_sla_recovery" data-type="number" <DxColumn
caption=">SLA" css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
<DxColumn :width="120" alignment="center" data-field="total_dibawah_sla_recovery" data-type="number" alignment="center"
caption="≤SLA" css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_diatas_sla_recovery"
data-type="number"
caption=">SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="120"
alignment="center"
data-field="total_dibawah_sla_recovery"
data-type="number"
caption="≤SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxSummary :calculate-custom-summary="calculateCustomSummary"> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxGroupItem :show-in-group-footer="true" column="no" display-format="Total" css-class="!text-left" /> <DxGroupItem
<DxGroupItem :show-in-group-footer="true" column="total" summary-type="sum" display-format="{0}" :show-in-group-footer="true"
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> column="kode"
<DxGroupItem :show-in-group-footer="true" column="total_selesai" summary-type="sum" display-format="{0}" display-format="Total"
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> css-class="!text-left"
<DxGroupItem :show-in-group-footer="true" column="persen_selesai" summary-type="avg" display-format="{0}" />
css-class="!text-right" :customize-text="(e: any) => formatPercentage(e.value)" /> <DxTotalItem column="kode" display-format="Total" css-class="!text-left text-white" />
<DxGroupItem :show-in-group-footer="true" column="total_inproses" summary-type="sum" display-format="{0}" <DxGroupItem
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> :show-in-group-footer="true"
<DxGroupItem :show-in-group-footer="true" column="persen_inproses" summary-type="avg" display-format="{0}" column="total"
css-class="!text-right" :customize-text="(e: any) => formatPercentage(e.value)" /> name="total"
<DxGroupItem :show-in-group-footer="true" column="total_durasi_response" summary-type="sum" display-format="{0}" summary-type="custom"
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> css-class="!text-right"
<DxGroupItem :show-in-group-footer="true" column="avg_durasi_response" summary-type="avg" display-format="{0}" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> />
<DxGroupItem :show-in-group-footer="true" column="max_durasi_response" summary-type="max" display-format="{0}" <DxGroupItem
css-class="!text-right" :customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')" /> :show-in-group-footer="true"
<DxGroupItem :show-in-group-footer="true" column="min_durasi_response" summary-type="min" display-format="{0}" column="total_selesai"
css-class="!text-right" :customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')" /> name="total_selesai"
<DxGroupItem :show-in-group-footer="true" column="total_diatas_sla_response" summary-type="sum" summary-type="custom"
display-format="{0}" css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> css-class="!text-right"
<DxGroupItem :show-in-group-footer="true" column="total_dibawah_sla_response" summary-type="sum" :customize-text="(e: any) => formatNumber(e.value)"
display-format="{0}" css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> />
<DxGroupItem :show-in-group-footer="true" column="total_durasi_recovery" summary-type="sum" display-format="{0}" <DxGroupItem
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> :show-in-group-footer="true"
<DxGroupItem :show-in-group-footer="true" column="avg_durasi_recovery" summary-type="avg" display-format="{0}" column="persen_selesai"
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> name="persen_selesai"
<DxGroupItem :show-in-group-footer="true" column="max_durasi_recovery" summary-type="max" display-format="{0}" summary-type="custom"
css-class="!text-right" :customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')" /> css-class="!text-right"
<DxGroupItem :show-in-group-footer="true" column="min_durasi_recovery" summary-type="min" display-format="{0}" :customize-text="(e: any) => formatPercentage(e.value)"
css-class="!text-right" :customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')" /> />
<DxGroupItem :show-in-group-footer="true" column="total_diatas_sla_recovery" summary-type="sum" <DxGroupItem
display-format="{0}" css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> :show-in-group-footer="true"
<DxGroupItem :show-in-group-footer="true" column="total_dibawah_sla_recovery" summary-type="sum" column="total_inproses"
display-format="{0}" css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" /> name="total_inproses"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="persen_inproses"
name="persen_inproses"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatPercentage(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="total_durasi_response"
name="total_durasi_response"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="count_durasi_response"
name="count_durasi_response"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="avg_durasi_response"
name="avg_durasi_response"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="max_durasi_response"
summary-type="max"
css-class="!text-right"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')"
/>
<DxGroupItem
:show-in-group-footer="true"
column="min_durasi_response"
summary-type="min"
css-class="!text-right"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')"
/>
<DxGroupItem
:show-in-group-footer="true"
column="total_diatas_sla_response"
summary-type="sum"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="total_dibawah_sla_response"
summary-type="sum"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="total_durasi_recovery"
name="total_durasi_recovery"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="count_durasi_recovery"
name="count_durasi_recovery"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="avg_durasi_recovery"
name="avg_durasi_recovery"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="max_durasi_recovery"
summary-type="max"
css-class="!text-right"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')"
/>
<DxGroupItem
:show-in-group-footer="true"
column="min_durasi_recovery"
summary-type="min"
css-class="!text-right"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')"
/>
<DxGroupItem
:show-in-group-footer="true"
column="total_diatas_sla_recovery"
summary-type="sum"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="true"
column="total_dibawah_sla_recovery"
summary-type="sum"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total"
name="total"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_selesai"
name="total_selesai"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="persen_selesai"
name="persen_selesai"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatPercentage(e.value)"
/>
<DxTotalItem
column="total_inproses"
name="total_inproses"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="persen_inproses"
name="persen_inproses"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatPercentage(e.value)"
/>
<DxTotalItem
column="total_durasi_response"
name="total_durasi_response"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="count_durasi_response"
name="count_durasi_response"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="avg_durasi_response"
name="avg_durasi_response"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="max_durasi_response"
summary-type="max"
css-class="!text-right text-white"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')"
/>
<DxTotalItem
column="min_durasi_response"
summary-type="min"
css-class="!text-right text-white"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')"
/>
<DxTotalItem
column="total_diatas_sla_response"
summary-type="sum"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_dibawah_sla_response"
summary-type="sum"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_durasi_recovery"
name="total_durasi_recovery"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="count_durasi_recovery"
name="count_durasi_recovery"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="avg_durasi_recovery"
name="avg_durasi_recovery"
summary-type="custom"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="max_durasi_recovery"
summary-type="max"
css-class="!text-right text-white"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')"
/>
<DxTotalItem
column="min_durasi_recovery"
summary-type="min"
css-class="!text-right text-white"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')"
/>
<DxTotalItem
column="total_diatas_sla_recovery"
summary-type="sum"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_dibawah_sla_recovery"
summary-type="sum"
css-class="!text-right text-white"
:customize-text="(e: any) => formatNumber(e.value)"
/>
</DxSummary> </DxSummary>
<template #formatText="{ data }"> <template #formatText="{ data }">
@ -129,12 +564,12 @@
<template #formatNumber="{ data }"> <template #formatNumber="{ data }">
<p class="text-right cursor-pointer"> <p class="text-right cursor-pointer">
{{ {{
isNumber(data.text) isNumber(data.text)
? data.column.caption == '%' ? data.column.caption == '%'
? formatPercentage(data.text) ? formatPercentage(data.text)
: formatNumber(data.text) : formatNumber(data.text)
: data.text : data.text
}} }}
</p> </p>
</template> </template>
@ -153,25 +588,28 @@
import Filters from '@/components/Form/Filters.vue' import Filters from '@/components/Form/Filters.vue'
import Type1 from '@/components/Form/FiltersType/Type1.vue' import Type1 from '@/components/Form/FiltersType/Type1.vue'
import { formatWaktu } from '@/components/Form/FiltersType/reference' import { formatWaktu } from '@/components/Form/FiltersType/reference'
import { onMounted, ref, watch } from 'vue' import { onMounted, ref } from 'vue'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
import { import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxGroupItem, DxGroupItem,
DxGroupPanel,
DxGrouping, DxGrouping,
DxLoadPanel,
DxPaging, DxPaging,
DxScrolling, DxScrolling,
DxSearchPanel, DxSearchPanel,
DxSelection, DxSelection,
DxSummary DxSummary,
DxTotalItem
} from 'devextreme-vue/data-grid' } from 'devextreme-vue/data-grid'
import { queries, requestGraphQl } from '@/utils/api/api.graphql' import { queries, requestGraphQl } from '@/utils/api/api.graphql'
import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers' import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers'
import { exportToPDF, exportToXLSX, exportToDOCX } from '@/report/Gangguan/Rekap/RGangguan_JenisGangguan' import {
exportToPDF,
exportToXLSX,
exportToDOCX
} from '@/report/Gangguan/Rekap/RGangguan_JenisGangguan'
import { apolloClient } from '@/utils/api/api.graphql' import { apolloClient } from '@/utils/api/api.graphql'
import { provideApolloClient } from '@vue/apollo-composable' import { provideApolloClient } from '@vue/apollo-composable'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue' import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
@ -312,12 +750,10 @@ const filterData = async (params: any) => {
let total = 0 let total = 0
let total_selesai = 0 let total_selesai = 0
let total_inproses = 0 let total_inproses = 0
let count_durasi_dispatch = 0
let total_durasi_dispatch = 0
let count_durasi_response = 0 let count_durasi_response = 0
let total_durasi_response = 0 let total_durasi_response = 0
let count_durasi_recovery = 0
let total_durasi_recovery = 0 let total_durasi_recovery = 0
let count_durasi_recovery = 0
const calculateCustomSummary = (options: any) => { const calculateCustomSummary = (options: any) => {
if (options.name === 'total') { if (options.name === 'total') {
if (options.summaryProcess === 'calculate') { if (options.summaryProcess === 'calculate') {
@ -351,6 +787,74 @@ const calculateCustomSummary = (options: any) => {
options.totalValue = (total_selesai / total) * 100 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 === '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 === '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 === 'avg_durasi_response') {
if (options.summaryProcess === 'start') {
total_durasi_response = 0
count_durasi_response = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = count_durasi_response / total_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 = count_durasi_recovery / total_durasi_recovery
}
}
} }
const filters = ref() const filters = ref()

File diff suppressed because it is too large Load Diff

View File

@ -131,6 +131,20 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_response"
data-type="number"
caption="Jumlah Response"
:allow-resizing="false"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.avg_durasi_response * rowData.total_durasi_response
"
/>
<DxColumn <DxColumn
:width="120" :width="120"
alignment="center" alignment="center"
@ -191,6 +205,20 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_recovery"
data-type="number"
caption="Jumlah Recovery"
:allow-resizing="false"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.avg_durasi_recovery * rowData.total_durasi_recovery
"
/>
<DxColumn <DxColumn
:width="120" :width="120"
alignment="center" alignment="center"
@ -241,59 +269,74 @@
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxSummary> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="no" column="nama_posko"
display-format="Total" display-format="Total"
css-class="!text-left" css-class="!text-left"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="total" column="total"
summary-type="sum" name="total"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="total_selesai" column="total_selesai"
summary-type="sum" name="total_selesai"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="persen_selesai" column="persen_selesai"
summary-type="avg" name="persen_selesai"
summary-type="custom"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="total_inproses" column="total_inproses"
summary-type="sum" name="total_inproses"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="persen_inproses" column="persen_inproses"
summary-type="avg" name="persen_inproses"
summary-type="custom"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="total_durasi_response" column="total_durasi_response"
summary-type="sum" name="total_durasi_response"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right"
/>
<DxGroupItem
:show-in-group-footer="true"
column="count_durasi_response"
name="count_durasi_response"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="avg_durasi_response" column="avg_durasi_response"
summary-type="avg" name="avg_durasi_response"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
@ -328,14 +371,24 @@
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="total_durasi_recovery" column="total_durasi_recovery"
summary-type="sum" name="total_durasi_recovery"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right"
/>
<DxGroupItem
:show-in-group-footer="true"
column="count_durasi_recovery"
name="count_durasi_recovery"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="avg_durasi_recovery" column="avg_durasi_recovery"
summary-type="avg" name="avg_durasi_recovery"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
@ -371,49 +424,63 @@
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="sum"
display-format="Total" display-format="Total"
show-in-column="no" show-in-column="nama_posko"
css-class="text-white !text-right" css-class="text-white !text-left"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
show-in-column="total" show-in-column="total"
name="total"
column="total" column="total"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="total_selesai" column="total_selesai"
summary-type="sum" name="total_selesai"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="persen_selesai" column="persen_selesai"
summary-type="avg" name="persen_selesai"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="total_inproses" column="total_inproses"
summary-type="sum" name="total_inproses"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="persen_inproses" column="persen_inproses"
summary-type="avg" name="persen_inproses"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="total_durasi_response" column="total_durasi_response"
summary-type="sum" name="total_durasi_response"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="count_durasi_response"
name="count_durasi_response"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="avg_durasi_response" column="avg_durasi_response"
summary-type="avg" name="avg_durasi_response"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -443,13 +510,22 @@
/> />
<DxTotalItem <DxTotalItem
column="total_durasi_recovery" column="total_durasi_recovery"
summary-type="sum" name="total_durasi_recovery"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="count_durasi_recovery"
name="count_durasi_recovery"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="avg_durasi_recovery" column="avg_durasi_recovery"
summary-type="avg" name="avg_durasi_recovery"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -872,7 +948,7 @@
import Filters from '@/components/Form/Filters.vue' import Filters from '@/components/Form/Filters.vue'
import { formatWaktu } from '@/components/Form/FiltersType/reference' import { formatWaktu } from '@/components/Form/FiltersType/reference'
import Type8 from '@/components/Form/FiltersType/Type8.vue' import Type8 from '@/components/Form/FiltersType/Type8.vue'
import { onMounted, ref, watch } from 'vue' import { onMounted, ref } from 'vue'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
import { import {
DxColumn, DxColumn,
@ -880,7 +956,6 @@ import {
DxExport, DxExport,
DxGroupItem, DxGroupItem,
DxGrouping, DxGrouping,
DxLoadPanel,
DxPager, DxPager,
DxPaging, DxPaging,
DxScrolling, DxScrolling,
@ -926,6 +1001,116 @@ const reportMeta = ref({
const agreeToShowDialog = ref(false) const agreeToShowDialog = ref(false)
const progressSelected = ref(0) const progressSelected = ref(0)
let total = 0
let total_selesai = 0
let total_inproses = 0
let count_durasi_response = 0
let total_durasi_response = 0
let total_durasi_recovery = 0
let count_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
}
}
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 === '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 === '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 === 'avg_durasi_response') {
if (options.summaryProcess === 'start') {
total_durasi_response = 0
count_durasi_response = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = count_durasi_response / total_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 = count_durasi_recovery / total_durasi_recovery
}
}
}
const setAgreementDialog = (status: boolean, progress: number) => { const setAgreementDialog = (status: boolean, progress: number) => {
agreeToShowDialog.value = status agreeToShowDialog.value = status
progressSelected.value = progress progressSelected.value = progress

View File

@ -135,6 +135,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="120"
alignment="center"
data-field="count_durasi_response"
data-type="number"
caption="Jumlah Durasi"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_response * rowData.avg_durasi_response
"
/>
<DxColumn <DxColumn
:width="120" :width="120"
alignment="center" alignment="center"
@ -195,6 +208,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="120"
alignment="center"
data-field="count_durasi_recovery"
data-type="number"
caption="Jumlah Durasi"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_recovery * rowData.avg_durasi_recovery
"
/>
<DxColumn <DxColumn
:width="120" :width="120"
alignment="center" alignment="center"
@ -245,59 +271,74 @@
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxSummary> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="no" column="kode_regu"
display-format="Total" display-format="Total"
css-class="!text-left" css-class="!text-left"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="total" column="total"
summary-type="sum" name="total"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="total_selesai" column="total_selesai"
summary-type="sum" name="total_selesai"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="persen_selesai" column="persen_selesai"
summary-type="avg" name="persen_selesai"
summary-type="custom"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="total_inproses" column="total_inproses"
summary-type="sum" name="total_inproses"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="persen_inproses" column="persen_inproses"
summary-type="avg" name="persen_inproses"
summary-type="custom"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="total_durasi_response" column="total_durasi_response"
summary-type="sum" name="total_durasi_response"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right"
/>
<DxGroupItem
:show-in-group-footer="true"
column="count_durasi_response"
name="count_durasi_response"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="avg_durasi_response" column="avg_durasi_response"
summary-type="avg" name="avg_durasi_response"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
@ -332,14 +373,24 @@
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="total_durasi_recovery" column="total_durasi_recovery"
summary-type="sum" name="total_durasi_recovery"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right"
/>
<DxGroupItem
:show-in-group-footer="true"
column="count_durasi_recovery"
name="count_durasi_recovery"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="true" :show-in-group-footer="true"
column="avg_durasi_recovery" column="avg_durasi_recovery"
summary-type="avg" name="avg_durasi_recovery"
summary-type="custom"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
css-class="!text-right" css-class="!text-right"
/> />
@ -375,49 +426,63 @@
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="sum"
display-format="Total" display-format="Total"
show-in-column="no" show-in-column="kode_regu"
css-class="text-white !text-right" css-class="text-white !text-left"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
show-in-column="total" show-in-column="total"
column="total" column="total"
name="total"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="total_selesai" column="total_selesai"
summary-type="sum" name="total_selesai"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="persen_selesai" column="persen_selesai"
summary-type="avg" name="persen_selesai"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="total_inproses" column="total_inproses"
summary-type="sum" name="total_inproses"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="persen_inproses" column="persen_inproses"
summary-type="avg" name="persen_inproses"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="total_durasi_response" column="total_durasi_response"
summary-type="sum" name="total_durasi_response"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="count_durasi_response"
name="count_durasi_response"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="avg_durasi_response" column="avg_durasi_response"
summary-type="avg" name="avg_durasi_response"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -447,13 +512,22 @@
/> />
<DxTotalItem <DxTotalItem
column="total_durasi_recovery" column="total_durasi_recovery"
summary-type="sum" name="total_durasi_recovery"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="count_durasi_recovery"
name="count_durasi_recovery"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
column="avg_durasi_recovery" column="avg_durasi_recovery"
summary-type="avg" name="avg_durasi_recovery"
summary-type="custom"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -888,7 +962,6 @@ import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxLoadPanel,
DxPager, DxPager,
DxPaging, DxPaging,
DxScrolling, DxScrolling,
@ -910,7 +983,6 @@ import {
exportDetailToXLSX, exportDetailToXLSX,
exportToDOCX, exportToDOCX,
exportDetailToDOCX exportDetailToDOCX
} from '@/report/Gangguan/Rekap/RGangguan_PerRegu' } from '@/report/Gangguan/Rekap/RGangguan_PerRegu'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue' import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
@ -938,6 +1010,116 @@ const agreeToShowDialog = ref(false)
const progressSelected = ref(0) const progressSelected = ref(0)
const isGroupBy = ref(false) const isGroupBy = ref(false)
let total = 0
let total_selesai = 0
let total_inproses = 0
let count_durasi_response = 0
let total_durasi_response = 0
let total_durasi_recovery = 0
let count_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
}
}
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 === '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 === '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 === 'avg_durasi_response') {
if (options.summaryProcess === 'start') {
total_durasi_response = 0
count_durasi_response = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = count_durasi_response / total_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 = count_durasi_recovery / total_durasi_recovery
}
}
}
const setAgreementDialog = (status: boolean, progress: number) => { const setAgreementDialog = (status: boolean, progress: number) => {
agreeToShowDialog.value = status agreeToShowDialog.value = status
progressSelected.value = progress progressSelected.value = progress
@ -1008,7 +1190,6 @@ const onExporting = (e: any) => {
exportToXLSX(reportMeta.value, e) exportToXLSX(reportMeta.value, e)
} else { } else {
exportToDOCX(reportMeta.value, data.value) exportToDOCX(reportMeta.value, data.value)
} }
} }
@ -1019,7 +1200,6 @@ const onExportingDetail = (e: any) => {
exportDetailToXLSX(reportMeta.value, e) exportDetailToXLSX(reportMeta.value, e)
} else { } else {
exportDetailToDOCX(reportMeta.value, dataSub.value) exportDetailToDOCX(reportMeta.value, dataSub.value)
} }
} }

View File

@ -1,81 +1,265 @@
<template> <template>
<Filters @reset-form="data = []" @run-search="() => filterData(filters)" <Filters
@run-report="() => exportToPDF(reportMeta, data, true)" :report-button="true" class="mb-4"> @reset-form="data = []"
@run-search="() => filterData(filters)"
@run-report="() => exportToPDF(reportMeta, data, true)"
:report-button="true"
class="mb-4"
>
<Type9 @update:filters="(value) => (filters = value)" /> <Type9 @update:filters="(value) => (filters = value)" />
</Filters> </Filters>
<div id="data"> <div id="data">
<DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" <DxDataGrid
:data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" ref="dataGridRef"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onDataSelectionChanged" :allow-column-reordering="true"
:column-width="100" @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" class="max-h-[calc(100vh-140px)] mb-10"
:word-wrap-enabled="true"> :data-source="data"
:show-column-lines="true"
:show-row-lines="false"
:show-borders="true"
:row-alternation-enabled="true"
:hover-state-enabled="true"
@selection-changed="onDataSelectionChanged"
:column-width="100"
@exporting="onExporting"
:allow-column-resizing="true"
column-resizing-mode="widget"
:word-wrap-enabled="true"
>
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
<!-- --> <!-- -->
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxColumn css-class="custom-table-column" :width="50" alignment="center" <DxColumn
:calculate-display-value="(item: any) => data.findIndex((i) => i == item) + 1" data-type="number" caption="No" css-class="custom-table-column"
cell-template="formatNumber" /> :width="50"
<DxColumn :width="120" alignment="center" data-field="nama_uid" caption="UID" css-class="custom-table-column" alignment="center"
group-index="0" v-if="isGroupBy" /> :calculate-display-value="(item: any) => data.findIndex((i) => i == item) + 1"
<DxColumn :width="170" alignment="center" data-field="tanggal" caption="Tanggal Lapor" data-type="number"
css-class="custom-table-column" /> caption="No"
cell-template="formatNumber"
/>
<DxColumn
:width="120"
alignment="center"
data-field="nama_uid"
caption="UID"
css-class="custom-table-column"
group-index="0"
v-if="isGroupBy"
/>
<DxColumn
:width="170"
alignment="center"
data-field="tanggal"
caption="Tanggal Lapor"
css-class="custom-table-column"
/>
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total" data-type="number" caption="Total" <DxColumn
css-class="custom-table-column" cell-template="formatNumberLaporanTotal" /> :width="120"
alignment="center"
data-field="total"
data-type="number"
caption="Total"
css-class="custom-table-column"
cell-template="formatNumberLaporanTotal"
/>
<DxColumn alignment="center" caption="Sudah Selesai" css-class="custom-table-column"> <DxColumn alignment="center" caption="Sudah Selesai" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_selesai" data-type="number" caption="Jml" <DxColumn
css-class="custom-table-column" cell-template="formatNumberLaporanJmlSelesai" /> :width="120"
<DxColumn :width="70" alignment="center" data-field="persen_selesai" data-type="number" caption="%" alignment="center"
css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_selesai"
data-type="number"
caption="Jml"
css-class="custom-table-column"
cell-template="formatNumberLaporanJmlSelesai"
/>
<DxColumn
:width="70"
alignment="center"
data-field="persen_selesai"
data-type="number"
caption="%"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Belum Selesai" css-class="custom-table-column"> <DxColumn alignment="center" caption="Belum Selesai" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_inproses" data-type="number" caption="Jml" <DxColumn
css-class="custom-table-column" cell-template="formatNumberLaporanJmlBelumSelesai" /> :width="120"
<DxColumn :width="70" alignment="center" data-field="persen_inproses" data-type="number" caption="%" alignment="center"
css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_inproses"
data-type="number"
caption="Jml"
css-class="custom-table-column"
cell-template="formatNumberLaporanJmlBelumSelesai"
/>
<DxColumn
:width="70"
alignment="center"
data-field="persen_inproses"
data-type="number"
caption="%"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Response Time" css-class="custom-table-column"> <DxColumn alignment="center" caption="Response Time" css-class="custom-table-column">
<DxColumn alignment="center" caption="Menit" css-class="custom-table-column"> <DxColumn alignment="center" caption="Menit" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_durasi_response" data-type="number" <DxColumn
caption="Total" css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
<DxColumn :width="120" alignment="center" data-field="avg_durasi_response" data-type="number" alignment="center"
caption="Rata-Rata" css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_durasi_response"
<DxColumn :width="120" alignment="center" data-field="max_durasi_response" data-type="number" caption="Max" data-type="number"
css-class="custom-table-column" cell-template="formatTime" /> caption="Total"
<DxColumn :width="120" alignment="center" data-field="min_durasi_response" data-type="number" caption="Min" css-class="custom-table-column"
css-class="custom-table-column" cell-template="formatTime" /> cell-template="formatNumber"
/>
<DxColumn
:visible="false"
:width="120"
alignment="center"
data-field="count_durasi_response"
data-type="number"
caption="Jumlah Response"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_response * rowData.avg_durasi_response
"
/>
<DxColumn
:width="120"
alignment="center"
data-field="avg_durasi_response"
data-type="number"
caption="Rata-Rata"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="120"
alignment="center"
data-field="max_durasi_response"
data-type="number"
caption="Max"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="120"
alignment="center"
data-field="min_durasi_response"
data-type="number"
caption="Min"
css-class="custom-table-column"
cell-template="formatTime"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_diatas_sla_response" data-type="number" <DxColumn
caption=">SLA" css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
<DxColumn :width="120" alignment="center" data-field="total_dibawah_sla_response" data-type="number" alignment="center"
caption="≤SLA" css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_diatas_sla_response"
data-type="number"
caption=">SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="120"
alignment="center"
data-field="total_dibawah_sla_response"
data-type="number"
caption="≤SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Recovery Time" css-class="custom-table-column"> <DxColumn alignment="center" caption="Recovery Time" css-class="custom-table-column">
<DxColumn alignment="center" caption="Menit" css-class="custom-table-column"> <DxColumn alignment="center" caption="Menit" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_durasi_recovery" data-type="number" <DxColumn
caption="Total" css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
<DxColumn :width="120" alignment="center" data-field="avg_durasi_recovery" data-type="number" alignment="center"
caption="Rata-Rata" css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_durasi_recovery"
<DxColumn :width="120" alignment="center" data-field="max_durasi_recovery" data-type="number" caption="Max" data-type="number"
css-class="custom-table-column" cell-template="formatTime" /> caption="Total"
<DxColumn :width="120" alignment="center" data-field="min_durasi_recovery" data-type="number" caption="Min" css-class="custom-table-column"
css-class="custom-table-column" cell-template="formatTime" /> cell-template="formatNumber"
/>
<DxColumn
:visible="false"
:width="120"
alignment="center"
data-field="count_durasi_recovery"
data-type="number"
caption="Jumlah Response"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_recovery * rowData.avg_durasi_recovery
"
/>
<DxColumn
:width="120"
alignment="center"
data-field="avg_durasi_recovery"
data-type="number"
caption="Rata-Rata"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="120"
alignment="center"
data-field="max_durasi_recovery"
data-type="number"
caption="Max"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="120"
alignment="center"
data-field="min_durasi_recovery"
data-type="number"
caption="Min"
css-class="custom-table-column"
cell-template="formatTime"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Laporan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Laporan" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="total_diatas_sla_recovery" data-type="number" <DxColumn
caption=">SLA" css-class="custom-table-column" cell-template="formatNumber" /> :width="120"
<DxColumn :width="120" alignment="center" data-field="total_dibawah_sla_recovery" data-type="number" alignment="center"
caption="≤SLA" css-class="custom-table-column" cell-template="formatNumber" /> data-field="total_diatas_sla_recovery"
data-type="number"
caption=">SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="120"
alignment="center"
data-field="total_dibawah_sla_recovery"
data-type="number"
caption="≤SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
@ -88,48 +272,48 @@
<template #formatNumber="{ data }"> <template #formatNumber="{ data }">
<p class="text-right cursor-pointer" @click="setAgreementDialog(false, 0)"> <p class="text-right cursor-pointer" @click="setAgreementDialog(false, 0)">
{{ {{
isNumber(data.text) isNumber(data.text)
? data.column.caption == '%' ? data.column.caption == '%'
? formatPercentage(data.text) ? formatPercentage(data.text)
: formatNumber(data.text) : formatNumber(data.text)
: data.text : data.text
}} }}
</p> </p>
</template> </template>
<template #formatNumberLaporanTotal="{ data }"> <template #formatNumberLaporanTotal="{ data }">
<p class="text-right cursor-pointer" @click="setAgreementDialog(true, 0)"> <p class="text-right cursor-pointer" @click="setAgreementDialog(true, 0)">
{{ {{
isNumber(data.text) isNumber(data.text)
? data.column.caption == '%' ? data.column.caption == '%'
? formatPercentage(data.text) ? formatPercentage(data.text)
: formatNumber(data.text) : formatNumber(data.text)
: data.text : data.text
}} }}
</p> </p>
</template> </template>
<template #formatNumberLaporanJmlSelesai="{ data }"> <template #formatNumberLaporanJmlSelesai="{ data }">
<p class="text-right cursor-pointer" @click="setAgreementDialog(true, 1)"> <p class="text-right cursor-pointer" @click="setAgreementDialog(true, 1)">
{{ {{
isNumber(data.text) isNumber(data.text)
? data.column.caption == '%' ? data.column.caption == '%'
? formatPercentage(data.text) ? formatPercentage(data.text)
: formatNumber(data.text) : formatNumber(data.text)
: data.text : data.text
}} }}
</p> </p>
</template> </template>
<template #formatNumberLaporanJmlBelumSelesai="{ data }"> <template #formatNumberLaporanJmlBelumSelesai="{ data }">
<p class="text-right cursor-pointer" @click="setAgreementDialog(true, 2)"> <p class="text-right cursor-pointer" @click="setAgreementDialog(true, 2)">
{{ {{
isNumber(data.text) isNumber(data.text)
? data.column.caption == '%' ? data.column.caption == '%'
? formatPercentage(data.text) ? formatPercentage(data.text)
: formatNumber(data.text) : formatNumber(data.text)
: data.text : data.text
}} }}
</p> </p>
</template> </template>
@ -140,101 +324,323 @@
</template> </template>
<DxSummary :calculate-custom-summary="calculateCustomSummary"> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxTotalItem display-format="TOTAL" show-in-column="tanggal" css-class="text-white !text-left" /> <DxTotalItem
<DxTotalItem column="total" name="total" summary-type="custom" display-format="{0}" display-format="TOTAL"
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> show-in-column="tanggal"
<DxTotalItem column="total_selesai" name="total_selesai" summary-type="custom" display-format="{0}" css-class="text-white !text-left"
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> />
<DxTotalItem column="persen_selesai" name="persen_selesai" summary-type="custom" display-format="{0}" <DxTotalItem
css-class="text-white !text-right" :customize-text="(e: any) => formatPercentage(e.value)" /> column="total"
name="total"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_selesai"
name="total_selesai"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="persen_selesai"
name="persen_selesai"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)"
/>
<DxTotalItem column="total_inproses" name="total_inproses" summary-type="custom" display-format="{0}" <DxTotalItem
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> column="total_inproses"
<DxTotalItem column="persen_inproses" name="persen_inproses" summary-type="custom" display-format="{0}" name="total_inproses"
css-class="text-white !text-right" :customize-text="(e: any) => formatPercentage(e.value)" /> summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="persen_inproses"
name="persen_inproses"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)"
/>
<DxTotalItem column="total_durasi_response" name="total_durasi_response" summary-type="sum" display-format="{0}" <DxTotalItem
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> column="total_durasi_response"
<DxTotalItem column="avg_durasi_response" name="avg_durasi_response" summary-type="avg" display-format="{0}" name="total_durasi_response"
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> summary-type="custom"
<DxTotalItem column="max_durasi_response" name="max_durasi_response" summary-type="max" display-format="{0}" css-class="text-white !text-right"
css-class="text-white !text-right" :customize-text="(e: any) => formatWaktu(e.value)" /> :customize-text="(e: any) => formatNumber(e.value)"
<DxTotalItem column="min_durasi_response" name="min_durasi_response" summary-type="min" display-format="{0}" />
css-class="text-white !text-right" :customize-text="(e: any) => formatWaktu(e.value)" /> <DxTotalItem
column="count_durasi_response"
name="count_durasi_response"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="avg_durasi_response"
name="avg_durasi_response"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="max_durasi_response"
summary-type="max"
css-class="text-white !text-right"
:customize-text="(e: any) => formatWaktu(e.value)"
/>
<DxTotalItem
column="min_durasi_response"
summary-type="min"
css-class="text-white !text-right"
:customize-text="(e: any) => formatWaktu(e.value)"
/>
<DxTotalItem column="total_diatas_sla_response" name="total_diatas_sla_response" summary-type="sum" <DxTotalItem
display-format="{0}" css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> column="total_diatas_sla_response"
<DxTotalItem column="total_dibawah_sla_response" name="total_dibawah_sla_response" summary-type="sum" summary-type="sum"
display-format="{0}" css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_dibawah_sla_response"
summary-type="sum"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem column="total_durasi_recovery" name="total_durasi_recovery" summary-type="sum" display-format="{0}" <DxTotalItem
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> column="total_durasi_recovery"
<DxTotalItem column="avg_durasi_recovery" name="avg_durasi_recovery" summary-type="avg" display-format="{0}" name="total_durasi_recovery"
css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> summary-type="custom"
<DxTotalItem column="max_durasi_recovery" name="max_durasi_recovery" summary-type="max" display-format="{0}" css-class="text-white !text-right"
css-class="text-white !text-right" :customize-text="(e: any) => formatWaktu(e.value)" /> :customize-text="(e: any) => formatNumber(e.value)"
<DxTotalItem column="min_durasi_recovery" name="min_durasi_recovery" summary-type="min" display-format="{0}" />
css-class="text-white !text-right" :customize-text="(e: any) => formatWaktu(e.value)" /> <DxTotalItem
column="count_durasi_recovery"
name="count_durasi_recovery"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="avg_durasi_recovery"
name="avg_durasi_recovery"
summary-type="custom"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="max_durasi_recovery"
summary-type="max"
css-class="text-white !text-right"
:customize-text="(e: any) => formatWaktu(e.value)"
/>
<DxTotalItem
column="min_durasi_recovery"
summary-type="min"
css-class="text-white !text-right"
:customize-text="(e: any) => formatWaktu(e.value)"
/>
<DxTotalItem column="total_diatas_sla_recovery" name="total_diatas_sla_recovery" summary-type="sum" <DxTotalItem
display-format="{0}" css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> column="total_diatas_sla_recovery"
<DxTotalItem column="total_dibawah_sla_recovery" name="total_dibawah_sla_recovery" summary-type="sum" summary-type="sum"
display-format="{0}" css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
column="total_dibawah_sla_recovery"
summary-type="sum"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
</DxSummary> </DxSummary>
</DxDataGrid> </DxDataGrid>
</div> </div>
<DetailDialog :open="dialogDetail" title="Detail Rekapitulasi Gangguan/Tanggal" @on-close="closeDialog" <DetailDialog
:full-width="true"> :open="dialogDetail"
title="Detail Rekapitulasi Gangguan/Tanggal"
@on-close="closeDialog"
:full-width="true"
>
<div class="w-full mb-4 lg:w-[70%] lg:float-left"> <div class="w-full mb-4 lg:w-[70%] lg:float-left">
<div class="p-4 bg-white rounded-xl lg:mr-4"> <div class="p-4 bg-white rounded-xl lg:mr-4">
<DxDataGrid :allow-column-reordering="true" class="max-h-[calc(100vh-140px)]" :data-source="dataSub" <DxDataGrid
:show-column-lines="true" :show-row-lines="false" :show-borders="true" :row-alternation-enabled="true" :allow-column-reordering="true"
:hover-state-enabled="true" @selection-changed="onDataSubSelectionChanged" :column-width="100" class="max-h-[calc(100vh-140px)]"
@exporting="onExportingDetail" :allow-column-resizing="true" column-resizing-mode="widget"> :data-source="dataSub"
:show-column-lines="true"
:show-row-lines="false"
:show-borders="true"
:row-alternation-enabled="true"
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
@exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="20" :enabled="true" /> <DxPaging :page-size="20" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[20, 50, 100]" display-mode="full" <DxPager
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :visible="true"
:allowed-page-sizes="[20, 50, 100]"
display-mode="full"
:show-page-size-selector="true"
:show-info="true"
:show-navigation-buttons="true"
/>
<!-- --> <!-- -->
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumn css-class="custom-table-column" :width="50" alignment="center" <DxColumn
:calculate-display-value="(item: any) => dataSub.findIndex((i) => i == item) + 1" data-type="number" css-class="custom-table-column"
caption="No" cell-template="formatNumber" /> :width="50"
<DxColumn :width="150" alignment="center" data-field="no_laporan" caption="No Laporan" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> :calculate-display-value="(item: any) => dataSub.findIndex((i) => i == item) + 1"
<DxColumn :width="150" alignment="center" data-field="waktu_lapor" caption="Tgl Lapor" data-type="number"
css-class="custom-table-column" cell-template="formatText" /> caption="No"
<DxColumn :width="150" alignment="center" data-field="waktu_response" caption="Tgl Datang" cell-template="formatNumber"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="waktu_recovery" caption="Tgl Nyala" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="durasi_response_time" caption="Durasi Response Time" alignment="center"
css-class="custom-table-column" cell-template="formatTime" /> data-field="no_laporan"
<DxColumn :width="150" alignment="center" data-field="durasi_recovery_time" caption="Durasi Recovery Time" caption="No Laporan"
css-class="custom-table-column" cell-template="formatTime" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="status_akhir" caption="Status" cell-template="formatText"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="referensi_marking" caption="Referensi Marking" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="id_pelnomormeter" caption="IDPEL/NO METER" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> data-field="waktu_lapor"
<DxColumn :width="150" alignment="center" data-field="nama_pelapor" caption="Nama Pelapor" caption="Tgl Lapor"
css-class="custom-table-column" cell-template="formatText" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="alamat_pelapor" caption="Alamat Pelapor" cell-template="formatText"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="no_telp_pelapor" caption="No Telp Pelapor" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
<DxColumn :width="200" alignment="center" data-field="keterangan_pelapor" caption="Keterangan Pelapor" alignment="center"
css-class="custom-table-column" cell-template="formatText" /> data-field="waktu_response"
<DxColumn :width="150" alignment="center" data-field="nama_posko" caption="Posko" caption="Tgl Datang"
css-class="custom-table-column" cell-template="formatText" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="tindakan" caption="Tidakan" cell-template="formatText"
css-class="custom-table-column" cell-template="formatText" /> />
<DxColumn :width="150" alignment="center" data-field="penyebab" caption="Penyebab" <DxColumn
css-class="custom-table-column" cell-template="formatText" /> :width="150"
alignment="center"
data-field="waktu_recovery"
caption="Tgl Nyala"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="durasi_response_time"
caption="Durasi Response Time"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="durasi_recovery_time"
caption="Durasi Recovery Time"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="status_akhir"
caption="Status"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="referensi_marking"
caption="Referensi Marking"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="id_pelnomormeter"
caption="IDPEL/NO METER"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="nama_pelapor"
caption="Nama Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="alamat_pelapor"
caption="Alamat Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="no_telp_pelapor"
caption="No Telp Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="200"
alignment="center"
data-field="keterangan_pelapor"
caption="Keterangan Pelapor"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="nama_posko"
caption="Posko"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="tindakan"
caption="Tidakan"
css-class="custom-table-column"
cell-template="formatText"
/>
<DxColumn
:width="150"
alignment="center"
data-field="penyebab"
caption="Penyebab"
css-class="custom-table-column"
cell-template="formatText"
/>
<template #formatText="{ data }"> <template #formatText="{ data }">
<p class="text-left cursor-pointer"> <p class="text-left cursor-pointer">
@ -270,28 +676,46 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Datang:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Datang:</h3>
<InputText :readonly="true" :value="dataSubSelected?.waktu_response" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.waktu_response"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Nyala:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Tgl Nyala:</h3>
<InputText :readonly="true" :value="dataSubSelected?.waktu_recovery" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.waktu_recovery"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Response Time:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Response Time:</h3>
<InputText :readonly="true" :value="parseInt(dataSubSelected?.durasi_response_time) <InputText
? formatWaktu(dataSubSelected?.durasi_response_time) :readonly="true"
: '-' :value="
" class-name="flex-1" /> parseInt(dataSubSelected?.durasi_response_time)
? formatWaktu(dataSubSelected?.durasi_response_time)
: '-'
"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Recovery Time:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Durasi Recovery Time:</h3>
<InputText :readonly="true" :value="parseInt(dataSubSelected?.durasi_recovery_time) <InputText
? formatWaktu(dataSubSelected?.durasi_recovery_time) :readonly="true"
: '-' :value="
" class-name="flex-1" /> parseInt(dataSubSelected?.durasi_recovery_time)
? formatWaktu(dataSubSelected?.durasi_recovery_time)
: '-'
"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -301,12 +725,20 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Referensi Marking:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Referensi Marking:</h3>
<InputText :readonly="true" :value="dataSubSelected?.referensi_marking" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.referensi_marking"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">IDPEL/NO METER:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">IDPEL/NO METER:</h3>
<InputText :readonly="true" :value="dataSubSelected?.id_pelnomormeter" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.id_pelnomormeter"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -316,17 +748,29 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Alamat Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Alamat Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.alamat_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.alamat_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">No Telp Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">No Telp Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.no_telp_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.no_telp_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Keterangan Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Keterangan Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.keterangan_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.keterangan_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -354,13 +798,12 @@
import Filters from '@/components/Form/Filters.vue' import Filters from '@/components/Form/Filters.vue'
import Type9 from '@/components/Form/FiltersType/Type9.vue' import Type9 from '@/components/Form/FiltersType/Type9.vue'
import { formatWaktu } from '@/components/Form/FiltersType/reference' import { formatWaktu } from '@/components/Form/FiltersType/reference'
import { onMounted, ref, watch } from 'vue' import { onMounted, ref } from 'vue'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
import { import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxLoadPanel,
DxPager, DxPager,
DxPaging, DxPaging,
DxScrolling, DxScrolling,
@ -558,9 +1001,11 @@ const filterData = async (params: any) => {
let total = 0 let total = 0
let total_selesai = 0 let total_selesai = 0
let persen_selesai = 0
let total_inproses = 0 let total_inproses = 0
let persen_inproses = 0 let count_durasi_response = 0
let total_durasi_response = 0
let total_durasi_recovery = 0
let count_durasi_recovery = 0
const calculateCustomSummary = (options: any) => { const calculateCustomSummary = (options: any) => {
if (options.name === 'total') { if (options.name === 'total') {
if (options.summaryProcess === 'calculate') { if (options.summaryProcess === 'calculate') {
@ -603,6 +1048,65 @@ const calculateCustomSummary = (options: any) => {
options.totalValue = (total_inproses / total) * 100 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 === '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 === '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 === 'avg_durasi_response') {
if (options.summaryProcess === 'start') {
total_durasi_response = 0
count_durasi_response = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = count_durasi_response / total_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 = count_durasi_recovery / total_durasi_recovery
}
}
} }
onMounted(() => { onMounted(() => {

View File

@ -11,7 +11,7 @@
<div> <div>
<DxDataGrid <DxDataGrid
@cell-click="onCellClicked" @cell-click=""
ref="dataGridRef" ref="dataGridRef"
:allow-column-reordering="true" :allow-column-reordering="true"
class="max-h-[calc(100vh-140px)] mb-10" class="max-h-[calc(100vh-140px)] mb-10"
@ -27,97 +27,296 @@
column-resizing-mode="widget" column-resizing-mode="widget"
> >
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxGrouping :auto-expand-all="false" :context-menu-enabled="true" /> <DxGrouping :auto-expand-all="false" :context-menu-enabled="true" expand-mode="rowClick" />
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumn alignment="center" :width="200" data-field="nama_ulp" caption="Nama Unit" <DxColumn
css-class="custom-table-column" /> alignment="center"
:width="200"
data-field="nama_ulp"
caption="Nama Unit"
css-class="custom-table-column"
/>
<DxColumn :width="150" alignment="center" data-field="" caption="Semua Unit" css-class="custom-table-column" <DxColumn
:group-index="0" /> v-if="grouping.length > 0"
<DxColumn :width="150" alignment="center" data-field="nama_regional" caption="Regional" v-for="(group, index) in grouping"
css-class="custom-table-column" :group-index="1" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="nama_uid" caption="UID" css-class="custom-table-column" alignment="center"
:group-index="2" /> :data-field="group.data"
<DxColumn :width="150" alignment="center" data-field="nama_up3" caption="UP3" css-class="custom-table-column" :caption="group.caption"
:group-index="3" /> css-class="custom-table-column"
cell-template="formatText"
:group-index="index"
/>
<DxColumn alignment="center" caption="Response Time" css-class="custom-table-column"> <DxColumn alignment="center" caption="Response Time" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="total" data-type="number" caption="Total" <DxColumn
css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="total_selesai" data-type="number" caption="Selesai" alignment="center"
css-class="custom-table-column" cell-template="formatNumber" /> data-field="total"
<DxColumn :width="70" alignment="center" data-field="persen_selesai" data-type="number" caption="%" data-type="number"
css-class="custom-table-column" cell-template="formatNumber" /> caption="Total"
<DxColumn :width="150" alignment="center" data-field="total_inproses" data-type="number" caption="InProgress" css-class="custom-table-column"
css-class="custom-table-column" cell-template="formatNumber" /> cell-template="formatNumber"
<DxColumn :width="70" alignment="center" data-field="persen_inproses" data-type="number" caption="%" />
css-class="custom-table-column" cell-template="formatNumber" /> <DxColumn
<DxColumn :width="150" alignment="center" data-field="avg_durasi_response" data-type="number" :width="150"
caption="Rata-Rata" css-class="custom-table-column" cell-template="formatNumber" /> alignment="center"
<DxColumn :width="150" alignment="center" data-field="max_durasi_response" data-type="number" caption="Max" data-field="total_selesai"
css-class="custom-table-column" cell-template="formatTime" /> data-type="number"
<DxColumn :width="150" alignment="center" data-field="min_durasi_response" data-type="number" caption="Min" caption="Selesai"
css-class="custom-table-column" cell-template="formatTime" /> css-class="custom-table-column"
<DxColumn :width="150" alignment="center" data-field="total_diatas_sla_response" data-type="number" cell-template="formatNumber"
caption="> SLA" css-class="custom-table-column" cell-template="formatNumber" /> />
<DxColumn :width="150" alignment="center" data-field="total_dibawah_sla_response" data-type="number" <DxColumn
caption="≤ SLA" css-class="custom-table-column" cell-template="formatNumber" /> :width="70"
alignment="center"
data-field="persen_selesai"
data-type="number"
caption="%"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="150"
alignment="center"
data-field="total_inproses"
data-type="number"
caption="InProgress"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="70"
alignment="center"
data-field="persen_inproses"
data-type="number"
caption="%"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="150"
alignment="center"
data-field="avg_durasi_response"
data-type="number"
caption="Rata-Rata"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="total_durasi_response"
data-type="number"
caption="Total Durasi"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_response"
data-type="number"
caption="Jumlah Durasi"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.avg_durasi_response * rowData.total_durasi_response
"
/>
<DxColumn
:width="150"
alignment="center"
data-field="max_durasi_response"
data-type="number"
caption="Max"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="min_durasi_response"
data-type="number"
caption="Min"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="total_diatas_sla_response"
data-type="number"
caption="> SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="150"
alignment="center"
data-field="total_dibawah_sla_response"
data-type="number"
caption="≤ SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Penyelesaian" css-class="custom-table-column"> <DxColumn alignment="center" caption="Penyelesaian" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="avg_durasi_recovery" data-type="number" <DxColumn
caption="Rata-Rata" css-class="custom-table-column" cell-template="formatNumber" /> :width="150"
<DxColumn :width="150" alignment="center" data-field="max_durasi_recovery" data-type="number" caption="Max" alignment="center"
css-class="custom-table-column" cell-template="formatTime" /> data-field="avg_durasi_recovery"
<DxColumn :width="150" alignment="center" data-field="min_durasi_recovery" data-type="number" caption="Min" data-type="number"
css-class="custom-table-column" cell-template="formatTime" /> caption="Rata-Rata"
<DxColumn :width="150" alignment="center" data-field="total_diatas_sla_recovery" data-type="number" css-class="custom-table-column"
caption="> SLA" css-class="custom-table-column" cell-template="formatNumber" /> cell-template="formatNumber"
<DxColumn :width="150" alignment="center" data-field="total_dibawah_sla_recovery" data-type="number" />
caption="≤ SLA" css-class="custom-table-column" cell-template="formatNumber" /> <DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="total_durasi_recovery"
data-type="number"
caption="Total Durasi"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_recovery"
data-type="number"
caption="Jumlah Durasi"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.avg_durasi_recovery * rowData.total_durasi_recovery
"
/>
<DxColumn
:width="150"
alignment="center"
data-field="max_durasi_recovery"
data-type="number"
caption="Max"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="min_durasi_recovery"
data-type="number"
caption="Min"
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="150"
alignment="center"
data-field="total_diatas_sla_recovery"
data-type="number"
caption="> SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="150"
alignment="center"
data-field="total_dibawah_sla_recovery"
data-type="number"
caption="≤ SLA"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn> </DxColumn>
<DxSummary> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxGroupItem :show-in-group-footer="false" :align-by-column="true" column="total" summary-type="sum"
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" />
<DxGroupItem :show-in-group-footer="false" :align-by-column="true" column="total_selesai" summary-type="sum"
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" />
<DxGroupItem :show-in-group-footer="false" :align-by-column="true" column="persen_selesai" summary-type="avg"
css-class="!text-right" :customize-text="(e: any) => formatPercentage(e.value)" />
<DxGroupItem :show-in-group-footer="false" :align-by-column="true" column="total_inproses" summary-type="sum"
css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" />
<DxGroupItem :show-in-group-footer="false" :align-by-column="true" column="persen_inproses" summary-type="avg"
css-class="!text-right" :customize-text="(e: any) => formatPercentage(e.value)" />
<DxGroupItem :show-in-group-footer="false" :align-by-column="true" column="avg_durasi_dispatch"
summary-type="avg" css-class="!text-right" :customize-text="(e: any) => formatNumber(e.value)" />
<DxGroupItem <DxGroupItem
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="max_durasi_dispatch" column="total"
summary-type="max" name="total"
summary-type="custom"
css-class="!text-right" css-class="!text-right"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="min_durasi_dispatch" column="total_selesai"
summary-type="min" name="total_selesai"
summary-type="custom"
css-class="!text-right" css-class="!text-right"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')" :customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="false"
:align-by-column="true"
column="persen_selesai"
name="persen_selesai"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatPercentage(e.value)"
/>
<DxGroupItem
:show-in-group-footer="false"
:align-by-column="true"
column="total_inproses"
name="total_inproses"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="false"
:align-by-column="true"
column="persen_inproses"
name="persen_inproses"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="avg_durasi_response" column="avg_durasi_response"
summary-type="avg" name="avg_durasi_response"
summary-type="custom"
css-class="!text-right" css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem
:show-in-group-footer="false"
:align-by-column="true"
column="total_durasi_response"
name="total_durasi_response"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="false"
:align-by-column="true"
column="count_durasi_response"
name="count_durasi_response"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem <DxGroupItem
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
@ -154,7 +353,26 @@
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="avg_durasi_recovery" 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)"
/>
<DxGroupItem
:show-in-group-footer="false"
:align-by-column="true"
column="total_durasi_recovery"
name="total_durasi_recovery"
summary-type="custom"
css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
:show-in-group-footer="false"
:align-by-column="true"
column="count_durasi_recovery"
name="count_durasi_recovery"
summary-type="custom"
css-class="!text-right" css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -218,14 +436,29 @@
</DxDataGrid> </DxDataGrid>
</div> </div>
<DetailDialog :open="dialogDetail" title="Detail Rekapitulasi Keluhan All" @on-close="closedialogDetail" <DetailDialog
:full-width="true"> :open="dialogDetail"
title="Detail Rekapitulasi Keluhan All"
@on-close="closedialogDetail"
:full-width="true"
>
<div class="w-full mb-4 lg:w-[70%] lg:float-left"> <div class="w-full mb-4 lg:w-[70%] lg:float-left">
<div class="p-4 bg-white rounded-xl lg:mr-4"> <div class="p-4 bg-white rounded-xl lg:mr-4">
<DxDataGrid :allow-column-reordering="true" class="max-h-[calc(100vh-140px)]" :data-source="dataSub" <DxDataGrid
:show-column-lines="true" :show-row-lines="false" :show-borders="true" :row-alternation-enabled="true" :allow-column-reordering="true"
:hover-state-enabled="true" @selection-changed="onDataSubSelectionChanged" :column-width="100" class="max-h-[calc(100vh-140px)]"
@exporting="onExportingDetail" :allow-column-resizing="true" column-resizing-mode="widget"> :data-source="dataSub"
:show-column-lines="true"
:show-row-lines="false"
:show-borders="true"
:row-alternation-enabled="true"
:hover-state-enabled="true"
@selection-changed="onDataSubSelectionChanged"
:column-width="100"
@exporting="onExportingDetail"
:allow-column-resizing="true"
column-resizing-mode="widget"
>
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="20" :enabled="true" /> <DxPaging :page-size="20" :enabled="true" />
<DxPager <DxPager
@ -238,7 +471,11 @@
/> />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport
:enabled="true"
:formats="['pdf', 'xlsx', 'document']"
:allow-export-selected-data="false"
/>
<DxColumn <DxColumn
css-class="custom-table-column" css-class="custom-table-column"
@ -418,12 +655,20 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Dalam Proses Bidang:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Dalam Proses Bidang:</h3>
<InputText :readonly="true" :value="dataSubSelected?.waktu_response" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.waktu_response"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Selesai Bidang Unit:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Selesai Bidang Unit:</h3>
<InputText :readonly="true" :value="dataSubSelected?.waktu_recovery" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.waktu_recovery"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -469,17 +714,30 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Alamat Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Alamat Pelapor:</h3>
<InputText :readonly="true" type="textarea" :value="dataSubSelected?.alamat_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
type="textarea"
:value="dataSubSelected?.alamat_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">NO Telp Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">NO Telp Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.no_telp_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.no_telp_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Keterangan Pelapor:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Keterangan Pelapor:</h3>
<InputText :readonly="true" :value="dataSubSelected?.keterangan_pelapor" class-name="flex-1" /> <InputText
:readonly="true"
:value="dataSubSelected?.keterangan_pelapor"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -489,7 +747,12 @@
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[135px] text-gray-800">Uraian:</h3> <h3 class="text-sm font-medium w-[135px] text-gray-800">Uraian:</h3>
<InputText :readonly="true" type="textarea" :value="dataSubSelected?.uraian" class-name="flex-1" /> <InputText
:readonly="true"
type="textarea"
:value="dataSubSelected?.uraian"
class-name="flex-1"
/>
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -517,12 +780,9 @@ import { ref, onMounted } from 'vue'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
import { import {
DxColumn, DxColumn,
DxColumnFixing,
DxExport, DxExport,
DxLoadPanel,
DxPaging, DxPaging,
DxPager, DxPager,
DxScrolling,
DxSearchPanel, DxSearchPanel,
DxSelection, DxSelection,
DxSummary, DxSummary,
@ -569,6 +829,134 @@ const reportMeta = ref({
ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' }, ulp: { id: 0, name: 'Semua Unit Layanan Pelanggan' },
periode: '' periode: ''
}) })
const grouping = ref<any[]>([
{
data: '',
caption: 'Semua Unit'
},
{
data: 'nama_regional',
caption: 'Regional'
},
{
data: 'nama_uid',
caption: 'UID'
},
{
data: 'nama_up3',
caption: 'UP3'
}
])
let total = 0
let total_selesai = 0
let total_inproses = 0
let count_durasi_response = 0
let total_durasi_response = 0
let total_durasi_recovery = 0
let count_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
}
}
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 === '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 === '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 === 'avg_durasi_response') {
if (options.summaryProcess === 'start') {
total_durasi_response = 0
count_durasi_response = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = count_durasi_response / total_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 = count_durasi_recovery / total_durasi_recovery
}
}
}
const onCellClicked = (e: any) => { const onCellClicked = (e: any) => {
console.log('cell clicked', e) console.log('cell clicked', e)
@ -638,6 +1026,50 @@ const filterData = async (params: any) => {
const { ulp, uid, up3 } = params const { ulp, uid, up3 } = params
const dateValue = params.periode.split(' s/d ') const dateValue = params.periode.split(' s/d ')
var groupList: any[] = [
{
data: '',
caption: 'Semua Unit'
},
{
data: 'nama_regional',
caption: 'Regional'
},
{
data: 'nama_uid',
caption: 'UID'
},
{
data: 'nama_up3',
caption: 'UP3'
}
]
if (uid?.id != 0) {
groupList.forEach((item, index) => {
if (item.caption == 'Semua Unit' || item.caption == 'Regional') {
groupList.splice(index, 1)
}
})
if (up3?.id != 0) {
groupList.forEach((item, index) => {
if (item.caption == 'UID') {
groupList.splice(index, 1)
}
})
if (ulp?.id != 0) {
groupList.forEach((item, index) => {
if (item.caption == 'UP3') {
groupList.splice(index, 1)
}
})
}
}
}
grouping.value = groupList
const query = { const query = {
dateFrom: dateValue[0] dateFrom: dateValue[0]
? dateValue[0].split('-').reverse().join('-') ? dateValue[0].split('-').reverse().join('-')

View File

@ -45,7 +45,6 @@
:width="50" :width="50"
alignment="center" alignment="center"
data-type="number" data-type="number"
data-field="number"
caption="No" caption="No"
cell-template="formatNumber" cell-template="formatNumber"
/> />
@ -139,6 +138,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_response"
data-type="number"
caption="Jumlah Respon"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_response * rowData.avg_durasi_response
"
/>
<DxColumn <DxColumn
:width="150" :width="150"
alignment="center" alignment="center"
@ -199,6 +211,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_recovery"
data-type="number"
caption="Jumlah Respon"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_recovery * rowData.avg_durasi_recovery
"
/>
<DxColumn <DxColumn
:width="150" :width="150"
alignment="center" alignment="center"
@ -249,59 +274,70 @@
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxSummary> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxTotalItem <DxTotalItem
summary-type="sum"
display-format="Total" display-format="Total"
show-in-column="Fungsi Bidang" show-in-column="Fungsi Bidang"
css-class="text-white !text-left" css-class="text-white !text-left"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total"
column="total" column="total"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_selesai"
column="total_selesai" column="total_selesai"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}%" name="persen_selesai"
column="persen_selesai" column="persen_selesai"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_inproses"
column="total_inproses" column="total_inproses"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}%" name="persen_inproses"
column="persen_inproses" column="persen_inproses"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_response"
column="total_durasi_response" column="total_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="count_durasi_response"
column="count_durasi_response"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
summary-type="custom"
name="avg_durasi_response"
column="avg_durasi_response" column="avg_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="sum"
display-format="{0}"
column="min_durasi_response" column="min_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')" :customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')"
@ -318,35 +354,45 @@
display-format="{0}" display-format="{0}"
column="total_diatas_sla_response" column="total_diatas_sla_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="sum"
display-format="{0}" display-format="{0}"
column="total_dibawah_sla_response" column="total_dibawah_sla_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_recovery"
column="total_durasi_recovery" column="total_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="count_durasi_recovery"
column="count_durasi_recovery"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
summary-type="custom"
name="avg_durasi_recovery"
column="avg_durasi_recovery" column="avg_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="min"
display-format="{0}" display-format="{0}"
column="min_durasi_recovery" column="min_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')" :customize-text="(e: any) => (parseInt(e.value) ? formatWaktu(e.value) : '-')"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="max"
display-format="{0}" display-format="{0}"
column="max_durasi_recovery" column="max_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
@ -357,12 +403,14 @@
display-format="{0}" display-format="{0}"
column="total_diatas_sla_recovery" column="total_diatas_sla_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="sum"
display-format="{0}" display-format="{0}"
column="total_dibawah_sla_recovery" column="total_dibawah_sla_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/> />
</DxSummary> </DxSummary>
@ -779,7 +827,6 @@ import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxLoadPanel,
DxPaging, DxPaging,
DxPager, DxPager,
DxSummary, DxSummary,
@ -829,6 +876,116 @@ const reportMeta = ref({
groupBy: false groupBy: false
}) })
let total = 0
let total_selesai = 0
let total_inproses = 0
let count_durasi_response = 0
let total_durasi_response = 0
let total_durasi_recovery = 0
let count_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
}
}
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 === '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 === '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 === 'avg_durasi_response') {
if (options.summaryProcess === 'start') {
total_durasi_response = 0
count_durasi_response = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = count_durasi_response / total_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 = count_durasi_recovery / total_durasi_recovery
}
}
}
const setAgreementDialog = (status: boolean, progress: number) => { const setAgreementDialog = (status: boolean, progress: number) => {
agreeToShowDialog.value = status agreeToShowDialog.value = status
progressSelected.value = progress progressSelected.value = progress

View File

@ -128,6 +128,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_response"
data-type="number"
caption="Jumlah Response"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_response * rowData.avg_durasi_response
"
/>
<DxColumn <DxColumn
:width="150" :width="150"
alignment="center" alignment="center"
@ -188,6 +201,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_recovery"
data-type="number"
caption="Jumlah Recovery"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_recovery * rowData.avg_durasi_recovery
"
/>
<DxColumn <DxColumn
:width="150" :width="150"
alignment="center" alignment="center"
@ -238,7 +264,7 @@
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxSummary> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxGroupItem <DxGroupItem
display-format="Total" display-format="Total"
show-in-column="Jenis Keluhan" show-in-column="Jenis Keluhan"
@ -246,56 +272,64 @@
:show-in-group-footer="true" :show-in-group-footer="true"
/> />
<DxGroupItem <DxGroupItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total"
column="total" column="total"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_selesai"
column="total_selesai" column="total_selesai"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="avg" summary-type="custom"
display-format="{0}%" name="persen_selesai"
column="persen_selesai" column="persen_selesai"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_inproses"
column="total_inproses" column="total_inproses"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="avg" summary-type="custom"
display-format="{0}%" name="persen_inproses"
column="persen_inproses" column="persen_inproses"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_response"
column="total_durasi_response" column="total_durasi_response"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_response"
column="count_durasi_response"
css-class="!text-right"
:show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
summary-type="custom"
name="avg_durasi_response"
column="avg_durasi_response" column="avg_durasi_response"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
@ -334,16 +368,24 @@
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_recovery"
column="total_durasi_recovery" column="total_durasi_recovery"
css-class="text-right" css-class="text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_recovery"
column="count_durasi_recovery"
css-class="text-right"
:show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
summary-type="custom"
name="avg_durasi_recovery"
column="avg_durasi_recovery" column="avg_durasi_recovery"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
@ -388,50 +430,57 @@
css-class="text-white !text-left" css-class="text-white !text-left"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total"
column="total" column="total"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_selesai"
column="total_selesai" column="total_selesai"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}%" name="persen_selesai"
column="persen_selesai" column="persen_selesai"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_inproses"
column="total_inproses" column="total_inproses"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}%" name="persen_inproses"
column="persen_inproses" column="persen_inproses"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_response"
column="total_durasi_response" column="total_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_response"
column="count_durasi_response"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
summary-type="custom"
name="avg_durasi_response"
column="avg_durasi_response" column="avg_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
@ -465,15 +514,22 @@
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_recovery"
column="total_durasi_recovery" column="total_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_recovery"
column="count_durasi_recovery"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
summary-type="custom"
name="avg_durasi_recovery"
column="avg_durasi_recovery" column="avg_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
@ -922,7 +978,6 @@ import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxLoadPanel,
DxPaging, DxPaging,
DxPager, DxPager,
DxSummary, DxSummary,
@ -971,6 +1026,116 @@ const reportMeta = ref({
periode: '' periode: ''
}) })
let total = 0
let total_selesai = 0
let total_inproses = 0
let count_durasi_response = 0
let total_durasi_response = 0
let total_durasi_recovery = 0
let count_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
}
}
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 === '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 === '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 === 'avg_durasi_response') {
if (options.summaryProcess === 'start') {
total_durasi_response = 0
count_durasi_response = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = count_durasi_response / total_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 = count_durasi_recovery / total_durasi_recovery
}
}
}
const setAgreementDialog = (status: boolean, progress: number) => { const setAgreementDialog = (status: boolean, progress: number) => {
agreeToShowDialog.value = status agreeToShowDialog.value = status
progressSelected.value = progress progressSelected.value = progress

View File

@ -139,6 +139,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_response"
data-type="number"
caption="Total"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_response * rowData.avg_durasi_response
"
/>
<DxColumn <DxColumn
:width="150" :width="150"
alignment="center" alignment="center"
@ -199,6 +212,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_recovery"
data-type="number"
caption="Total"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_recovery * rowData.avg_durasi_recovery
"
/>
<DxColumn <DxColumn
:width="150" :width="150"
alignment="center" alignment="center"
@ -249,58 +275,64 @@
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxSummary> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxTotalItem <DxTotalItem
summary-type="sum"
display-format="Total" display-format="Total"
show-in-column="kelompok" show-in-column="kelompok"
css-class="text-white !text-left" css-class="text-white !text-left"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total"
column="total" column="total"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_selesai"
column="total_selesai" column="total_selesai"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="persen_selesai"
column="persen_selesai" column="persen_selesai"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_inproses"
column="total_inproses" column="total_inproses"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="persen_inproses"
column="persen_inproses" column="persen_inproses"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_response"
column="total_durasi_response" column="total_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_response"
column="count_durasi_response"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
summary-type="custom"
name="avg_durasi_response"
column="avg_durasi_response" column="avg_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
@ -334,15 +366,22 @@
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_recovery"
column="total_durasi_recovery" column="total_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_recovery"
column="count_durasi_recovery"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
summary-type="custom"
name="avg_durasi_recovery"
column="avg_durasi_recovery" column="avg_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
@ -785,7 +824,6 @@ import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxLoadPanel,
DxPaging, DxPaging,
DxPager, DxPager,
DxSummary, DxSummary,
@ -835,6 +873,116 @@ const reportMeta = ref({
groupBy: false groupBy: false
}) })
let total = 0
let total_selesai = 0
let total_inproses = 0
let count_durasi_response = 0
let total_durasi_response = 0
let total_durasi_recovery = 0
let count_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
}
}
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 === '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 === '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 === 'avg_durasi_response') {
if (options.summaryProcess === 'start') {
total_durasi_response = 0
count_durasi_response = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = count_durasi_response / total_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 = count_durasi_recovery / total_durasi_recovery
}
}
}
const setAgreementDialog = (status: boolean, progress: number) => { const setAgreementDialog = (status: boolean, progress: number) => {
agreeToShowDialog.value = status agreeToShowDialog.value = status
progressSelected.value = progress progressSelected.value = progress

View File

@ -137,6 +137,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_response"
data-type="number"
caption="Total"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_response * rowData.avg_durasi_response
"
/>
<DxColumn <DxColumn
:width="150" :width="150"
alignment="center" alignment="center"
@ -197,6 +210,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_recovery"
data-type="number"
caption="Jumlah Durasi Recovery"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_recovery * rowData.avg_durasi_recovery
"
/>
<DxColumn <DxColumn
:width="150" :width="150"
alignment="center" alignment="center"
@ -247,58 +273,64 @@
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxSummary> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxTotalItem <DxTotalItem
summary-type="sum"
display-format="Total" display-format="Total"
show-in-column="tanggal_lapor" show-in-column="tanggal_lapor"
css-class="text-white !text-left" css-class="text-white !text-left"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total"
column="total" column="total"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_selesai"
column="total_selesai" column="total_selesai"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="persen_selesai"
column="persen_selesai" column="persen_selesai"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_inproses"
column="total_inproses" column="total_inproses"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="persen_inproses"
column="persen_inproses" column="persen_inproses"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_response"
column="total_durasi_response" column="total_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_response"
column="count_durasi_response"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
summary-type="custom"
name="avg_durasi_response"
column="avg_durasi_response" column="avg_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
@ -332,15 +364,22 @@
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_recovery"
column="total_durasi_recovery" column="total_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_recovery"
column="count_durasi_recovery"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
summary-type="custom"
name="avg_durasi_recovery"
column="avg_durasi_recovery" column="avg_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
@ -787,7 +826,6 @@ import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxLoadPanel,
DxPaging, DxPaging,
DxPager, DxPager,
DxSummary, DxSummary,
@ -838,6 +876,116 @@ const reportMeta = ref({
groupBy: false groupBy: false
}) })
let total = 0
let total_selesai = 0
let total_inproses = 0
let count_durasi_response = 0
let total_durasi_response = 0
let total_durasi_recovery = 0
let count_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
}
}
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 === '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 === '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 === 'avg_durasi_response') {
if (options.summaryProcess === 'start') {
total_durasi_response = 0
count_durasi_response = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = count_durasi_response / total_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 = count_durasi_recovery / total_durasi_recovery
}
}
}
const setAgreementDialog = (status: boolean, progress: number) => { const setAgreementDialog = (status: boolean, progress: number) => {
agreeToShowDialog.value = status agreeToShowDialog.value = status
progressSelected.value = progress progressSelected.value = progress

View File

@ -128,6 +128,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_response"
data-type="number"
caption="Total"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_response * rowData.avg_durasi_response
"
/>
<DxColumn <DxColumn
:width="150" :width="150"
alignment="center" alignment="center"
@ -188,6 +201,19 @@
css-class="custom-table-column" css-class="custom-table-column"
cell-template="formatNumber" cell-template="formatNumber"
/> />
<DxColumn
:visible="false"
:width="150"
alignment="center"
data-field="count_durasi_recovery"
data-type="number"
caption="Total"
css-class="custom-table-column"
cell-template="formatNumber"
:calculate-cell-value="
(rowData: any) => rowData.total_durasi_recovery * rowData.avg_durasi_recovery
"
/>
<DxColumn <DxColumn
:width="150" :width="150"
alignment="center" alignment="center"
@ -238,65 +264,72 @@
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxSummary> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxGroupItem <DxGroupItem
summary-type="sum"
display-format="Total" display-format="Total"
show-in-column="nama_ulp" show-in-column="nama_ulp"
css-class="!text-left" css-class="!text-left"
:show-in-group-footer="true" :show-in-group-footer="true"
/> />
<DxGroupItem <DxGroupItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total"
column="total" column="total"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_selesai"
column="total_selesai" column="total_selesai"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="persen_selesai"
column="persen_selesai" column="persen_selesai"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_inproses"
column="total_inproses" column="total_inproses"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="persen_inproses"
column="persen_inproses" column="persen_inproses"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_response"
column="total_durasi_response" column="total_durasi_response"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_response"
column="count_durasi_response"
css-class="!text-right"
:show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
summary-type="custom"
name="avg_durasi_response"
column="avg_durasi_response" column="avg_durasi_response"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
@ -335,16 +368,24 @@
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_recovery"
column="total_durasi_recovery" column="total_durasi_recovery"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_recovery"
column="count_durasi_recovery"
css-class="!text-right"
:show-in-group-footer="true"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxGroupItem
summary-type="custom"
name="avg_durasi_recovery"
column="avg_durasi_recovery" column="avg_durasi_recovery"
css-class="!text-right" css-class="!text-right"
:show-in-group-footer="true" :show-in-group-footer="true"
@ -384,56 +425,62 @@
/> />
<DxTotalItem <DxTotalItem
summary-type="sum"
display-format="Total" display-format="Total"
show-in-column="nama_ulp" show-in-column="nama_ulp"
css-class="text-white !text-left" css-class="text-white !text-left"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total"
column="total" column="total"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_selesai"
column="total_selesai" column="total_selesai"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="persen_selesai"
column="persen_selesai" column="persen_selesai"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_inproses"
column="total_inproses" column="total_inproses"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="persen_inproses"
column="persen_inproses" column="persen_inproses"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_response"
column="total_durasi_response" column="total_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_response"
column="count_durasi_response"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
summary-type="custom"
name="avg_durasi_response"
column="avg_durasi_response" column="avg_durasi_response"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
@ -467,15 +514,22 @@
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="sum" summary-type="custom"
display-format="{0}" name="total_durasi_recovery"
column="total_durasi_recovery" column="total_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxTotalItem <DxTotalItem
summary-type="avg" summary-type="custom"
display-format="{0}" name="count_durasi_recovery"
column="count_durasi_recovery"
css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)"
/>
<DxTotalItem
summary-type="custom"
name="avg_durasi_recovery"
column="avg_durasi_recovery" column="avg_durasi_recovery"
css-class="text-white !text-right" css-class="text-white !text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
@ -911,13 +965,12 @@ import DetailDialog from '@/components/Dialogs/DetailDialog.vue'
import InputText from '@/components/InputText.vue' import InputText from '@/components/InputText.vue'
import Filters from '@/components/Form/Filters.vue' import Filters from '@/components/Form/Filters.vue'
import Type8 from '@/components/Form/FiltersType/Type8.vue' import Type8 from '@/components/Form/FiltersType/Type8.vue'
import { ref, onMounted, watch } from 'vue' import { ref, onMounted } from 'vue'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
import { import {
DxColumn, DxColumn,
DxColumnFixing, DxColumnFixing,
DxExport, DxExport,
DxLoadPanel,
DxPaging, DxPaging,
DxPager, DxPager,
DxSummary, DxSummary,
@ -965,6 +1018,116 @@ const reportMeta = ref({
periode: '' periode: ''
}) })
let total = 0
let total_selesai = 0
let total_inproses = 0
let count_durasi_response = 0
let total_durasi_response = 0
let total_durasi_recovery = 0
let count_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
}
}
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 === '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 === '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 === 'avg_durasi_response') {
if (options.summaryProcess === 'start') {
total_durasi_response = 0
count_durasi_response = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = count_durasi_response / total_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 = count_durasi_recovery / total_durasi_recovery
}
}
}
const setAgreementDialog = (status: boolean, progress: number) => { const setAgreementDialog = (status: boolean, progress: number) => {
agreeToShowDialog.value = status agreeToShowDialog.value = status
progressSelected.value = progress progressSelected.value = progress

View File

@ -584,11 +584,13 @@ export const queries = {
persen_selesai persen_selesai
total_inproses total_inproses
persen_inproses persen_inproses
total_durasi_response
avg_durasi_response avg_durasi_response
min_durasi_response min_durasi_response
max_durasi_response max_durasi_response
total_dibawah_sla_response total_dibawah_sla_response
total_diatas_sla_response total_diatas_sla_response
total_durasi_recovery
avg_durasi_recovery avg_durasi_recovery
min_durasi_recovery min_durasi_recovery
max_durasi_recovery max_durasi_recovery